User Tools

Site Tools


galaxy

Galaxy

Installation de tools en python

Attention, les programmes pyhton qui tournent sous galaxy n'utilisent pas le meme environnement que le python classique. Les packages se trouvent sur /www-galaxy_dev/lib/python2.7/site-packages/

Au moment de l'installation d'un nouveau package sur le serveur, il faut donc faire :

python setup.py install --prefix /www-galaxy_dev/
python setup.py install --prefix /www-galaxy

ou

PYTHONPATH=/www-galaxy_dev//lib/python2.7/site-packages
easy_install scipy --prefix /www-galaxy_dev/ 
PYTHONPATH=/www-galaxy/lib/python2.7/site-packages
easy_install scipy --prefix /www-galaxy

Quelques liens vers la documentation:

Paramètres conditionnels

Dans notre exemple la condition porte sur le type de librairie (pair-end ou single-end) donnant des options differentes. Le choix de la librairie se fait sur un menu de type select mais on aurait pu choisir une checkbox indiquant pair-end ou non.

Le choix de la librairie va modifier l'affichage du formulaire:

  • avec les pair-end on attend 2 fichiers de reads et une distance entre les paires
  • avec les single-end on attend 1 fichier

Affichage / Formulaire

<inputs>
    ...
    <conditional name="library">
        <param help="Library type (Single end, Pair-end)" label="Library type" name="libtype" type="select" value="se">
            <option selected="true" value="se">Single end</option>
            <option value="pe">Pair-end</option>
        </param>
        <when value="pe">
            <param format="fastq" help="Reads file 1" label="Input reads file 1" name="readfile1" type="data" />
            <param format="fastq" help="Reads file 1" label="Input reads file 1" name="readfile1" type="data" />
            <param help="Maximal distance between paired reads" label="Maximal distance between paired reads" min="0" value="150" name="mate_dist" type="integer" />
        </when>
        <when value="se">
            <param format="fastq" help="Reads file 1" label="Input reads file 1" name="readfile1" type="data" />
        </when>      
    </conditional>
    ...
</inputs>

Cette balise <conditional> encadre l'ensemble des options soumises à la valeur d'un champs du formulaire. La première balise <param> correspond au champ du formulaire dont la valeur conditionne l'affichage des autres options.

Ensuite on peut mettre autant de balide <when> qu'on a de valeur possible pour le parametre libtype.

Ligne de commande

Au niveau des parametres de la ligne de commande il faut tenir compte des différentes possibilités en utilisant #if / #else / #end if.

2 conditions

On a que 2 conditions exclusives donc on peut utiliser #if et #else.

    <command>
monScript.pl
#if str($library.libtype) == "pe":
--input1 $library.readfile1 --input2 $library.readfile2 --mate-dist $library.mate_dist
#else:
--input1 $library.readfile1
#end if
    </command>

On retrouve bien les 2 possibilités avec le #if str($library.libtype) == “pe”: qui traite le cas pair-end et le #else: qui traite le cas single-end.

N conditions

Si on a plus de 2 choix, il suffit d'enchainner les conditions #if / #end if.

    <command>
monScript.pl
#if str($library.libtype) == "pe":
--input1 $library.readfile1 --input2 $library.readfile2 --mate-dist $library.mate_dist
#end if

#if str($library.libtype) == "se":
--input1 $library.readfile1
#end if

...

    </command>

Factoriser les parametres

On peut simplifier en le code en factorisant les parametres communs.

    <command>
monScript.pl --input1 $library.readfile1
#if str($library.libtype) == "pe":
--input2 $library.readfile2 --mate-dist $library.mate_dist
#end if
    </command>

Ici on a toujours un parametre –input1 donc on le sort du if et on garde que le cas du pair-end qui ajoute de nouveaux parametres.

Appel système

# single-end
$ monScript.pl --input1 /galaxy/fichier1.dat
 
# pair-end
$ monScript.pl --input1 /galaxy/fichier1.dat --input2 /galaxy/fichier2.dat --mate-dist 300

Input multiples

Dans certain cas la liste des fichiers en entrée n'est pas statique. On peut utiliser la balise <repeat> pour permettre d'ajouter autant de fichier que necessaire.

Affichage / Formulaire

    <inputs>
        <repeat name="readfiles" title="Reads file(s)" min="1" default="1">
            <param format="fastq" help="Reads file pair 1" label="Input reads file 1" name="file1" type="data" />
            <param format="fastq" help="Reads file pair 2" label="Input reads file 1" name="file2" type="data" />
        </repeat>
    </inputs>

Dans cette exemple on attend systématiquement les fichiers par 2 donc on retrouve 2 balises <param> a l'interieur de la balise <repeat>.

Au niveau de <repeat> on peut fixer des limites avec les attributs min et max ainsi qu'une valeur par défaut avec default. Dans le cas présent on attend toujours 1 couple de fichiers mais il peut y en avoir plus.

Ligne de commande

Au niveau de la ligne de command on gère les balises repeat avec #for / #end for.

Concaténation

    <command>
--readfiles="
#for $input_files in $readfiles:
${input_files.file1},${input_files.file2},
#end for
"
    </command>

On récupère une liste des valeurs des parametres dans <repeat> avec la variable $readfiles. La variable $input_files contient les valeurs des parametres file1 et file2 qu'on peut utiliser en appelant $input_files.file1 et $input_files.file2.

Dans notre cas on concatène les fichiers avec comme séparateur ','.

Appel système

$ monScript.pl --readfiles="/galaxy/file1.dat,/galaxy/file2.dat,/galaxy/file3.dat,/galaxy/file4.dat,"

On obtient un chaîne de caractère qu'il faut splitter sur ','.

Option avec valeurs multiples

Si on utilise GetOpts.

    <command>
#for $input_files in $readfiles:
--input1 ${input_files.file1} --input2 ${input_files.file2},
#end for
    </command>

Appel système

$ monScript.pl --input1 /galaxy/file1.dat --input2 /galaxy/file2.dat --input1 /galaxy/file3.dat --input2 /galaxy/file4.dat

On obtient un tableau de valeurs pour input1 et input2

Validation des paramètres dans le XML

Afin d'éviter d'attendre que le wrapper ne lève l'exception et polluer l'historique, on peut valider les paramètres dès la soumission du formulaire avec cette balise :

    <validator>

Doc : https://wiki.galaxyproject.org/Admin/Tools/ToolConfigSyntax#A.3Cvalidator.3E_tag_set

Parmi les types de validation, on retrouve les plus importants range et regex.

Exemple:

<param help="Organism scientific name" label="organism_name" name="organism_name" optional="false" type="text" value="">
	<validator type="regex"   message="Scientific name should be in the form 'Gender species'">^\w+\s+\w+</validator>
</param>

Et dans un test conditionnel:

<conditional name="repository_spec">
	<param help="Choose the public repository you aim at deposit your data" label="repository" name="repository" optional="false" type="select" value="">
		<option selected="true" value="">choose ...</option>
		<option value="NCBI">toNcbi</option>
		<option value="EMBL">toEBI</option>
	</param>
	<when value="NCBI">
		<param format="text" help="NCBI Submission template file (http://www.ncbi.nlm.nih.gov/WebSub/template.cgi)" label="ncbi_template_file" name="ncbi_template_file" optional="false" type="data" />
		<param help="BioProject accession" label="bioproject" name="bioproject" optional="false" type="text" value="">
			<validator type="regex"   message="NCBI BioProJect must start with PRJN">^PRJN[A-Z]\d+$</validator>
		</param>
	</when>
	<when value="EMBL">
		<param help="BioProject accession" label="bioproject" name="bioproject" optional="false" type="text" value="">
			<validator type="regex" message="NCBI BioProJect must start with PRJE">^PRJE[A-Z]\d+$</validator>
		</param>
	</when>
</conditional>

Comment faire des tests sous Galaxy ?

(LC fevrier 2015)

Je vais prendre l'exemple du test d'Inparanoid.

Où placer les données test ?

D'abord, je place les données tests et les résultats des tests dans galaxy-dist/test-data. Comme toutes les données de test sont dans ce répertoire, je leur donne un nom reconnaissable.

Ici, j'ai trois fichiers fasta en entrée et un fichier de résultats tabulé.

Où déclarer les tests ?

Maintenant, je complète le xml qui décrit mon wrapper avec une section test où je définis les paramètres et les inputs de mon test et le fichier que j'aimerais obtenir.

Les noms de fichiers correspondent à ceux dans le répertoire test-data.

Comment lancer les tests ?

On peut lancer les test grâce au shell run_tests.sh ou run_functional_tests.html (je n'ai pas bien compris la différence. Pour lancer un seul test, on spécifie son id

sh run_tests.sh -id Inparanoid >& logTest

Ce script va générer aussi un fichier appelé run_functional_tests.html qui ressemble à ça quand le test a foiré :

et qui ressemble à ça quand le test est un succès:

Le script est très long à se lancer (il recrée une table sqlite à chaque fois) et les sorties sont énormes. Pour savoir très vite si le test a fonctionné ou non sans lancer le html, vous pouvez utiliser ce script perl :

#!/usr/bin/perl

# parse la sortie de run-tests.sh -id idoutil 
# pour connaitre le resultat du test
# usage : 
# sh run_tests.sh -id Inparanoid >& logTest
# cat logTest | perl qd_parseTestGalaxy.pl

use strict;

foreach my $line ( <STDIN> ) {
	
	chomp($line);
	
    if(($line =~ /^Ran\s.*test.*in.*$/) || ($line =~ /^OK$/) || ($line =~ /^FAILED\s\(errors=.*$/) )
    {
		print "$line\n";
	}
}
cat logTest | ~/Scripts/qd_parseTestGalaxy.pl 
Ran 1 test in 230.651s
FAILED (errors=1)

Comment faire des tests plus compliqués ?

Par exemple, vérifier que le fichier contienne une string donnée…

Tout est expliqué ici : https://wiki.galaxyproject.org/Admin/Tools/ToolConfigSyntax#A.3Ctest.3E_tag_set

Limitations

Bon courage pour deviner d'où vient l'erreur dans certains cas quand le test foire !

galaxy.txt · Last modified: 2016/05/25 09:15 by lcottret