Commit 555d0e48 authored by jlopez's avatar jlopez
Browse files

Merge

parent 303c0a41
......@@ -38,3 +38,5 @@ RUN Rscript -e 'install.packages("shinydashboard",Ncpus=8,repos="https://cloud.r
RUN Rscript -e 'install.packages("shinyjs",Ncpus=8,repos="https://cloud.r-project.org/");library("shinyjs")'
RUN Rscript -e 'install.packages("shinyFiles",Ncpus=8,repos="https://cloud.r-project.org/");library("shinyFiles")'
RUN Rscript -e 'install.packages("BiocManager",Ncpus=8,repos="https://cloud.r-project.org/");library("BiocManager")'
RUN pip3 install cerberus
\ No newline at end of file
#!/bin/bash
# This script will take a tool yaml and check its validity
# Needs 2 arguments: tool_yaml reference_yaml
# Usage: ./check_tool_yaml.sh mytool_yaml tools/tool.schema.yaml
python -c 'from tools import *; validate_yaml("'$1'","'$2'")'
if [[ $? == 0 ]];
then
echo $1 "is valid"
fi
\ No newline at end of file
#!/bin/bash
# This script will take a tool yaml and check its validity
# Needs 2 arguments: workflow_yaml reference_yaml
# Usage: ./check_workflow_yaml.sh myworkflow_yaml workflows/workflow.schema.yaml
python -c 'from tools import *; validate_yaml("'$1'","'$2'")'
if [[ $? == 0 ]];
then
echo $1 "is valid"
fi
\ No newline at end of file
Ce workflow peut être lancé de manière autonome sur :
* des machines de type BigMem
* sur un Cloud type IFB <https://biosphere.france-bioinformatique.fr/>
* sur le cluster MBB (non détaillée)
* En pouvant les modifier en y apporter de légères adaptations
* Dans ce qui suit nous allons voir comment déployer un workflow sur une machine autonome, de lancer ce workflow en mode Web, de le modifier puis de le lancer en mode ligne de commande.
* Remarquer la présence des fichiers suivants :
* install.sh permet d'installer les logiciels pré-requis (à faire une seule fois si nécessaire!)
* deployBigMem.sh : permet de déployer un conteneur en mode web sur une machine de type bigmem
* deployIFB.sh : permet de deployer en mode web sur le cloud IFB (<https://biosphere.france-bioinformatique.fr/cloudweb/login/)>
* deployLocalHost.sh : permet de deployer sur votre machine
* waw_workflow.qsub : script de soumission d'un workflow sur le cluster MBB
* RunCmdLine.sh : permet de déployer et executer un workflow en ligne de commande (Nous verrons cela dans une prochaine partie)
## Déploiement en mode application web :
* Lancer ***bash deployLocalHost.sh*** pour voir les paramètres dont il a besoin :
* dataDir : dossier de la machine Bigmem hôte contenant les données
* resultsDir : dossier de la machine hôte qui va contenir les résultats de l'analyse
* le dernier paramètre (optionnel) indique la source de l'image Docker à utiliser
* dockerHub : l'image sera téléchargée depuis le dépôt Docker Hub (cette option n'est valide que pour les workflows développés par MBB)
* local : l'image sera construite en local à partir des fichiers sources issus du dépôt Git (il faut choisir cette option pour les workflows non disponibles sur gitHub)
* Assurez vous que les données soient disponibles dans un dossier ex. : /home/$USER/datasets/rnaseq/
les fichiers de reads doivent être de la forme : <sample_name><pair><extension>
pair = _R1 _R2 ou _1 _2 ou vide en single end
extension libre (fastq, fastq.gz, fq, fq.gz, ...)
ex paired end : sample1_R1.fastq.gz sample1_R2.fastq.gz
ex single end : sample1.fastq.gz
* Créer un dossier pour les résultas ex. : *** mkdir -p /home/$USER/result1 ***
* lancer :
*** deployLocalHost.sh /home/$USER/datasets/rnaseq/ /home/$USER/result1 local ***
* Voir plus bas pour la correspondance entre chemins sur le système hôte et chemins du conteneur
* Consulter la sortie écran pour voir comment :
* Accéder au workflow par navigateur web
* Accéder en *ssh* à l'intérieur du système du conteneur
* Noter quel est l'identifiant de votre conteneur !!!
* Pour arrêter le conteneur :
* *** docker ps *** pour lister les conteneurs
* *** docker kill ID ***
* Modifications du workflow
### A/ Ajouter un paramètre à un outil
Les règles des différentes étapes du workflow sont assemblées dans le fichier files/Snakefile. Elles sont écrites selon la syntaxe du gestionnaire de workflow Snakemake (<https://github.com/deto/Snakemake_Tutorial)> (<https://www.youtube.com/watch?v=UOKxta3061g&feature=youtu.be)>
* Ajout du paramètre --gcBias pour corriger les biais de GC des reads à l'outil de quantification SALMON :
* Ouvrir le fichier Snakemake et aller au rule salmon_quant_PE
* Repérer la partie shell qui indique comment sera lancé l'outil SALMON
* Insérer le paramètre --gcBias
* Relancer le conteneur avec l'option 'local' pour reconstruire l'image avec vos modifs
***deployLocalHost.sh /home/$USER/datasets/rnaseq/ /home/$USER/result1 local***
### B/ Changer la version d’un outil
Les procédures d'installation des différente outils nécessaires au bon fonctionnement du workflow sont rassemblées dans un fichier de recette nommé Dockerfile.
* Ouvrir ce fichier et repérer la partie concernant l'installation de kallisto
* Liste des versions de kallisto : <https://github.com/pachterlab/kallisto/releases>
* Modifier le n° de version pour une version de kallisto plus récente
* Relancer le conteneur avec l'option 'local' pour reconstruire l'image avec vos modifs
***deployLocalHost.sh /home/$USER/datasets/rnaseq/ /home/$USER/result1 local***
### C/ Ajouter une étape
* Deux possibilités :
* recharger le fichier .json sur l'interface subwaw (http://web.mbb.univ-montp2.fr/subwaw/workflowmanager.php) puis insérer l'étape souhaitée puis télécharger la nouvelle version du workflow
* Faire une demande via le système de tickets : <https://kimura.univ-montp2.fr/calcul/helpdesk_NewTicket.html>
## Utilisation en mode ligne de commande
Pour ré-utiliser un workflow sur différents fichiers ou avec différents paramètres, il est bon de pouvoir le lancer en ligne de commande.
Il faut pour cela avoir un fichier texte contenant tous les paramètres du workflow.
Ce fichier peur être :
* Récupéré depuis l'interface Web d'un déploiement comme en [Déploiement en mode application web] puis modifié à vos besoins
* Récupéré depuis le dossier de résultats d'une analyse effectuée avec ce workflow
* Directement à partir du modèle par défaut disponible dans files/params.total.yml
* Modifier un ou plusieurs paramètres parmi les suivants :
* results_dir:
* sample_dir:
* group_file:
* kallisto_index_input:
ou
* salmon_index_input:
* edger_annotations:
* Enregistrer vos modifs dans maconfig.yaml dans par ex. /home/$USER/results1/version2/ et sera visible dans le conteneur sous /Result/maconfig.yaml
* lancer depuis une console la ligne de commande (ici la paramètre 10 pour utiliser 10 coeurs) :
***bash RunCmdLine.sh /home/$USER/datasets/rnaseq/ /home/$USER/results1/version2/ /Results/maconfig.yaml 10***
* Suivre la progression du workflow
* A la fin vérifier le contenu de /home/$USER/results1/version2/
## Correspondance entre dossiers de votre machine et dossiers du conteneur
ex 1 deploiement : ***bash deployBigMem.sh /home/votrelogin/data1/ /home/votrelogin/results1/***
A l’intérieur du conteneur :
* /home/votrelogin/data1/ -> /Data/
* /home/votrelogin/results1/ -> /Results/
ex 2 deploiement : ***bash deployBigMem.sh /share/bio/datasets/rnaseq/ /home/votrelogin/results1/version1/***
A l'interieur du conteneur :
* /share/bio/datasets/rnaseq/ -> /Data/
* /share/bio/datasets/rnaseq/fastqs/ -> /Data/fastqs/
* /share/bio/datasets/rnaseq/reference/ -> /Data/reference/
* /share/bio/datasets/rnaseq/conditions/groups.tsv -> /Results/conditions/groups.tsv
* /home/votrelogin/results1/version1/ -> /Results/
## 6/ Liens utiles
* commandes docker : <https://devhints.io/docker>
* commandes bash : <https://devhints.io/bash>
* système de tickets MBB : <https://kimura.univ-montp2.fr/calcul/helpdesk_NewTicket.html>
* système de réservation de Bigmem : <https://mbb.univ-montp2.fr/grr/login.php>
* cloud IFB : <https://biosphere.france-bioinformatique.fr/>
* cluster mbb : ssh login@cluster-mbb.mbb.univ-montp2.fr
* depôts Git des MBBworkflows : <https://gitlab.mbb.univ-montp2.fr/mmassaviol/wapps>
* dépôt Git du framework de conception MBBworkflows : <https://gitlab.mbb.univ-montp2.fr/mmassaviol/waw>
* les conteneurs docker des MBBworkflows : <https://hub.docker.com/search?q=mbbteam&type=image>
......@@ -291,11 +291,11 @@ def generate_snakefile(workflow_yaml, waw_dir = "./"):
return SNAKEFILE
# Generate Dockerfile
def generate_dockerfile(workflow_name, output_dir, local_config, input_file = "./", local=""):
def generate_dockerfile(output_dir, local_config, waw_dir = "./"):
workflow_name = WORKFLOW_YAML["name"]
DOCKERFILE = ""
# Open template
with open(input_file+"Dockerfile.template", "r") as template:
with open(waw_dir+"/Dockerfile.template", "r") as template:
DOCKERFILE = template.read()
DOCKERFILE += "\n"
......@@ -303,8 +303,8 @@ def generate_dockerfile(workflow_name, output_dir, local_config, input_file = ".
files = ""
if "data" in WORKFLOW_YAML.keys():
for data in WORKFLOW_YAML["data"]:
file = input_file + "workflows/" + workflow_name + "/data/" + data["name"]
files += "COPY " + output_dir +"/files/data/" + data["name"] + " /" + data["name"] + "\n"
file = os.path.normpath(waw_dir + "/workflows/" + workflow_name + "/data/" + data["name"])
files += "COPY ./files/data/" + data["name"] + " /" + data["name"] + "\n"
# Copy files
copy_dir(file,output_dir+'/files/data/'+data["name"])
......@@ -315,8 +315,8 @@ def generate_dockerfile(workflow_name, output_dir, local_config, input_file = ".
tools_installs.update(tool_yaml["install"])
if "data" in tool_yaml.keys():
for data in tool_yaml["data"]:
file = input_file + "tools/" + tool_name + "/data/" + data["name"]
files += "COPY " + output_dir+workflow_name + "/files/data/" + data["name"] + " /" + data["name"] + "\n"
file = os.path.normpath(waw_dir + "/tools/" + tool_name + "/data/" + data["name"])
files += "COPY ./files/data/" + data["name"] + " /" + data["name"] + "\n"
# Copy files
shutil.copytree(file, output_dir+workflow_name + '/files/data/' + data["name"])
......@@ -397,7 +397,7 @@ def generate_pipeline_files(workflow_yaml, output_dir, waw_dir, local_config="de
out.write(generate_snakefile(workflow_yaml, waw_dir))
with open(output_dir + "/Dockerfile", "w") as out:
out.write(generate_dockerfile(workflow_yaml, output_dir, local_config, waw_dir))
out.write(generate_dockerfile(output_dir, local_config, waw_dir))
write_yaml(output_dir + "/files/params.total.yml", generate_params_yaml(workflow_name, get_params_to_remove(), waw_dir))
###1
......@@ -449,7 +449,7 @@ def generate_pipeline_files(workflow_yaml, output_dir, waw_dir, local_config="de
###
def main():
print(len(sys.argv))
#print(len(sys.argv))
if len(sys.argv) == 5:
generate_pipeline_files(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
elif len(sys.argv) == 4:
......
......@@ -54,17 +54,55 @@ def generate(name, path_yaml = "", path_input = DEFAULT_PATH_INPUT, path_output
for step in yaml["steps_in"]:
TOOL_YAML = read_yaml(path_input+"/tools/"+step["tool_name"]+"/"+step["tool_name"]+".yaml")
if "rule_name" in step:
# get rule yaml
RULE_YAML = dict()
for command in TOOL_YAML["commands"]:
if command["name"] == step["rule_name"]:
RULE_YAML = command
inputs_list_from_command = [inputt["name"] for inputt in RULE_YAML["inputs"]] # Liste des inputs dans la commande du yaml de l'outil
inputs_list_from_yaml = list() # Liste des inputs dans le steps_in du yaml du workflow
result += "def " + step["step_name"] + "__" + step["rule_name"] + "_inputs():\n"
result += "\tinputs = dict()\n"
# Parcourir le yaml du tool, les commandes et leurs inputs
# Traiter les inputs de type liste
# Gérer les "from params" (ex: fasta genomes)
if "params" in step:
for param in step["params"]:
if "raw_" in param["origin_command"] :
result += "\tinputs[\"" + param["input_name"] + "\"] = " + param["origin_command"]+"[\""+param["origin_name"]+"\"]\n"
# get input yaml
INPUT_YAML = dict()
for inputt in RULE_YAML["inputs"]:
if inputt["name"] == param["input_name"]:
INPUT_YAML = inputt
# Inputs de type liste
if ("list" in INPUT_YAML and INPUT_YAML["list"]):
if param["input_name"] not in inputs_list_from_yaml:
result += "\tinputs[\"" + param["input_name"] + "\"] = list()\n"
if "raw_" in param["origin_command"] :
result += "\tinputs[\"" + param["input_name"] + "\"].append(" + param["origin_command"]+"[\""+param["origin_name"]+"\"])\n"
else:
result += "\tinputs[\"" + param["input_name"] + "\"].append(rules." + param["origin_step"] + "__" + param["origin_command"] + ".output." + param["origin_name"] + ")\n"
# inputs classiques
else:
result += "\tinputs[\"" + param["input_name"] + "\"] = rules." + param["origin_step"] + "__" + param["origin_command"] + ".output." + param["origin_name"] + "\n"
if "raw_" in param["origin_command"] :
result += "\tinputs[\"" + param["input_name"] + "\"] = " + param["origin_command"]+"[\""+param["origin_name"]+"\"]\n"
else:
result += "\tinputs[\"" + param["input_name"] + "\"] = rules." + param["origin_step"] + "__" + param["origin_command"] + ".output." + param["origin_name"] + "\n"
inputs_list_from_yaml.append(param["input_name"]) # input traités (ou vu une fois si de type liste)
# Pour tous les inputs d'une commande qui ne sont pas liés dans le steps_in
for inputt in RULE_YAML["inputs"]:
if inputt["name"] not in inputs_list_from_yaml and "from" in inputt and inputt["from"] == "parameter":
result += "\tinputs[\"" + inputt["name"] + "\"] = config[\""+ step["step_name"] + "__" + step["rule_name"] + "_" + inputt["name"] +"\"]\n"
result += "\treturn inputs\n"
result += "\n"
......
......@@ -18,7 +18,7 @@ rule <step_name>__Picard_MarkDuplicates:
config["<step_name>__Picard_MarkDuplicates_threads"]
shell:
"{params.command} "
"I={input.bam} "
"I={input.bam_in} "
"O={output.bam} "
"M={output.metric} "
"REMOVE_DUPLICATES={params.remove_all_duplicates} "
......
{
id: Picard_MarkDuplicates,
name: Picard Mark Duplicates,
tool_step: "BAM_correction",
article: ~,
website: "https://broadinstitute.github.io/picard/",
git: "https://github.com/broadinstitute/picard",
......@@ -17,7 +16,7 @@
command: java -jar /opt/biotools/bin/picard.jar MarkDuplicates,
category: "bam_correction",
output_dir: Picard_MarkDuplicates,
inputs: [{name: "reads", type: ["bam", "sam"]}],
inputs: [ {name: "bam_in", type: ["bam", "sam"]} ],
outputs: [
{ name: "bam", type: "bam", file: "{sample}.mapped.dedup.bam", description: "Output bam" },
{ name: "sorted_bam", type: "bam", file: "{sample}.mapped.dedup.sorted.bam", description: "Sorted bam" },
......
{
id: blast_refseq,
name: blast refseq,
tool_step: "Blast",
article: 10.1186/1471-2105-10-421,
website: "https://www.ncbi.nlm.nih.gov/genome/viruses/",
git: "",
......
rule <step_name>__bowtie_index:
input:
genome_fasta = config["<step_name>__bowtie_index_genome_fasta"]
output:
index = (
expand(config["<step_name>__bowtie_index_path"]+"/index.{num}.ebwt",num=[1,2,3,4]),
expand(config["<step_name>__bowtie_index_path"]+"/index.rev.{num}.ebwt",num=[1,2]),
)
log:
config["results_dir"]+"/logs/" + config["<step_name>__bowtie_index_output_dir"] + "/index.log"
threads:
config["<step_name>__bowtie_index_threads"]
params:
command = config["<step_name>__bowtie_index_command"],
output_prefix = config["<step_name>__bowtie_index_path"]+"/index"
shell:
"{params.command} "
"{input.genome_fasta} "
"{params.output_prefix} "
"--threads {threads} "
"|& tee {log}"
if config["SeOrPe"] == "PE":
rule <step_name>__bowtie_PE:
input:
**<step_name>__bowtie_inputs(),
index = (
expand(config["<step_name>__bowtie_index_path"]+"/index.{num}.ebwt",num=[1,2,3,4]),
expand(config["<step_name>__bowtie_index_path"]+"/index.rev.{num}.ebwt",num=[1,2]),
)
**<step_name>__bowtie_PE_inputs()
output:
bam = config["results_dir"]+"/"+config["<step_name>__bowtie_PE_output_dir"]+"/{sample}.bam"
log:
......@@ -37,7 +11,8 @@ if config["SeOrPe"] == "PE":
config["<step_name>__bowtie_threads"]
params:
command = config["<step_name>__bowtie_PE_command"],
indexPrefix = config["<step_name>__bowtie_index_path"]+"/index",
#indexPrefix = config["<step_name>__bowtie_index_output_dir"]+"/index",
indexPrefix = lambda w, input: input.index[0].split(".")[0],
minins = config["<step_name>__bowtie_minins_PE"],
maxins = config["<step_name>__bowtie_maxins_PE"],
orientation = config["<step_name>__bowtie_orientation_PE"],
......@@ -61,15 +36,11 @@ if config["SeOrPe"] == "PE":
"| samtools sort -@ {threads} > {output.bam} 2>> {log} &&"
"samtools index -@ {threads} {output.bam} 2>> {log}"
elif config["SeOrPe"] == "PE":
elif config["SeOrPe"] == "SE":
rule <step_name>__bowtie_SE:
input:
**<step_name>__bowtie_inputs(),
index = (
expand(config["<step_name>__bowtie_index_path"]+"/index.{num}.ebwt",num=[1,2,3,4]),
expand(config["<step_name>__bowtie_index_path"]+"/index.rev.{num}.ebwt",num=[1,2]),
)
**<step_name>__bowtie_SE_inputs()
output:
bam = config["results_dir"]+"/"+config["<step_name>__bowtie_SE_output_dir"]+"/{sample}.bam"
log:
......@@ -78,10 +49,11 @@ elif config["SeOrPe"] == "PE":
config["<step_name>__bowtie_threads"]
params:
command = config["<step_name>__bowtie_SE_command"],
indexPrefix = config["<step_name>__bowtie_index_path"]+"/index",
#indexPrefix = config["<step_name>__bowtie_index_output_dir"]+"/index",
indexPrefix = lambda w, input: input.index[0].split(".")[0],
mult_align_limit = config["<step_name>__bowtie_mult_align_limit"],
best = config["<step_name>__bowtie_best"],
strata = config["<step_name>__bowtie_strata"]
best = "--best" if (config["<step_name>__bowtie_best"]) else "",
strata = "--strata" if (config["<step_name>__bowtie_strata"]) else ""
shell:
"{params.command} "
"--threads {threads} "
......
{
id: bowtie,
name: Bowtie,
tool_step: "Mapping",
article: 10.1002/0471250953.bi1107s32,
website: "http://bowtie-bio.sourceforge.net",
git: "https://github.com/BenLangmead/bowtie",
......@@ -11,47 +10,13 @@
multiqc: "bowtie1",
commands:
[
{
name: bowtie_index,
cname: "Bowtie index",
command: bowtie-build,
category: "indexing",
output_dir: bowtie/index,
inputs: [{ name: genome_fasta, type: "fasta" }],
outputs: [{ name: index, type: "bowtie.idx", file: index, description: "Index files for bowtie alignment" }],
options:
[
{
name: bowtie_index_path,
type: input_dir,
value: "",
label: "Path to an existing bowtie index (or where to save a new one)",
},
{
name: bowtie_index_genome_fasta,
type: input_file,
value: "",
label: "Path to reference genome fasta file",
},
{
name: bowtie_index_threads,
prefix: --threads,
type: numeric,
value: 4,
min: 1,
max: NA,
step: 1,
label: "Number of threads to use to index genome",
}
]
},
{
name: bowtie_PE,
cname: "Bowtie PE",
command: bowtie,
category: "mapping",
output_dir: bowtie/PE,
inputs: [{ name: read, type: reads }, { name: read2, type: reads }, { name: reference, type: "fasta", description: "reference", from: "parameter" }],
inputs: [{ name: read, type: reads }, { name: read2, type: reads }, { name: index, type: "bowtie_index", file: index, description: "Index files for bowtie alignment" }],
outputs: [{ name: bam, type: bam, file: "{sample}.bam", description: "Alignment files" }],
options:
[
......@@ -130,7 +95,7 @@
command: bowtie,
category: "mapping",
output_dir: bowtie/SE,
inputs: [{ name: read, type: "reads" }, { name: reference, type: "fasta", description: "reference", from: "parameter" }],
inputs: [{ name: read, type: "reads" }, { name: index, type: "bowtie_index", file: index, description: "Index files for bowtie alignment" }],
outputs: [{ name: bam, type: "bam", file: "{sample}.bam", description: "Alignment files" }],
options:
[
......
rule <step_name>__bowtie2_index:
input:
genome_fasta = config["<step_name>__bowtie2_index_genome_fasta"]
output:
index = (
expand(config["<step_name>__bowtie2_index_path"]+"/index.{num}.ebwt",num=[1,2,3,4]),
expand(config["<step_name>__bowtie2_index_path"]+"/index.rev.{num}.ebwt",num=[1,2]),
)
log:
config["results_dir"]+"/logs/" + config["<step_name>__bowtie2_index_output_dir"] + "/index.log"
threads:
config["<step_name>__bowtie2_index_threads"]
params:
command = config["<step_name>__bowtie2_index_command"],
output_prefix = config["<step_name>__bowtie2_index_path"]+"/index"
shell:
"{params.command} "
"{input.genome_fasta} "
"{params.output_prefix} "
"--threads {threads} "
"|& tee {log}"
if config["SeOrPe"] == "PE":
rule <step_name>__bowtie2_PE:
input:
**<step_name>__bowtie2_inputs(),
index = (
expand(config["<step_name>__bowtie2_index_path"]+"/index.{num}.ebwt",num=[1,2,3,4]),
expand(config["<step_name>__bowtie2_index_path"]+"/index.rev.{num}.ebwt",num=[1,2]),
)
**<step_name>__bowtie2_PE_inputs()
output:
bam = config["results_dir"]+"/"+config["<step_name>__bowtie2_PE_output_dir"]+"/{sample}.bam"
log:
......@@ -37,7 +11,8 @@ if config["SeOrPe"] == "PE":
config["<step_name>__bowtie2_threads"]
params:
command = config["<step_name>__bowtie2_PE_command"],
indexPrefix = config["<step_name>__bowtie2_index_path"]+"/index",
#indexPrefix = config["<step_name>__bowtie2_index_output_dir"]+"/index",
indexPrefix = lambda w, input: input.index[0].split(".")[0],
minins = config["<step_name>__bowtie2_minins_PE"],
maxins = config["<step_name>__bowtie2_maxins_PE"],
orientation = config["<step_name>__bowtie2_orientation_PE"],
......@@ -59,11 +34,7 @@ elif config["SeOrPe"] == "SE":
rule <step_name>__bowtie2_SE:
input:
**<step_name>__bowtie2_inputs(),
index = (
expand(config["<step_name>__bowtie2_index_path"]+"/index.{num}.ebwt",num=[1,2,3,4]),
expand(config["<step_name>__bowtie2_index_path"]+"/index.rev.{num}.ebwt",num=[1,2]),
)
**<step_name>__bowtie2_SE_inputs()
output:
bam = config["results_dir"]+"/"+config["<step_name>__bowtie2_SE_output_dir"]+"/{sample}.bam"
log:
......@@ -72,7 +43,8 @@ elif config["SeOrPe"] == "SE":
config["<step_name>__bowtie2_threads"]
params:
command = config["<step_name>__bowtie2_SE_command"],
indexPrefix = config["<step_name>__bowtie2_index_path"]+"/index",
#indexPrefix = config["<step_name>__bowtie2_index_output_dir"]+"/index",
indexPrefix = lambda w, input: input.index[0].split(".")[0]
shell:
"{params.command} "
"--threads {threads} "
......
{
id: bowtie2,
name: Bowtie2,
tool_step: "Mapping",
article: 10.1038/nmeth.1923,
website: "http://bowtie-bio.sourceforge.net/bowtie2/index.shtml",
git: "https://github.com/BenLangmead/bowtie2",
......@@ -11,50 +10,22 @@
multiqc: "bowtie2",
commands:
[
{
name: bowtie2_index,
cname: "Bowtie index",
command: bowtie2-build,
category: "indexing",
output_dir: bowtie2/index,
inputs: [{ name: genome_fasta, type: "fasta" }],
outputs: [{ name: index, type: "bowtie.idx", file: index, description: "Index files for bowtie2 alignment" }],
options:
[
{
name: bowtie2_index_path,
type: input_dir,
value: "",
label: "Path to an existing bowtie2 index (or where to save a new one)",
},
{
name: bowtie2_index_genome_fasta,
type: input_file,
value: "",
label: "Path to reference genome fasta file",
},
{
name: bowtie2_index_threads,
prefix: --threads,
type: numeric,
value: 4,
min: 1,
max: NA,
step: 1,
label: "Number of threads to use to index genome",
}
]
},
{
name: bowtie2_PE,
cname: "Bowtie2 PE",
command: bowtie2,
category: "mapping",
output_dir: bowtie2/PE,
inputs: [{ name: read, type: "reads" }, { name: read2, type: "reads" }, { name: reference, type: "fasta", description: "reference", from: "parameter" }],
inputs: [{ name: read, type: "reads" }, { name: read2, type: "reads" }, { name: index, type: "bowtie2_index", file: index, description: "Index files for bowtie2 alignment" }],
outputs: [{ name: bam, type: "bam", file: "{sample}.bam", description: "Alignment files" }],
options:
[
{
name: bowtie2_PE_index,
type: input_dir,
value: "",
label: "Path to an existing bowtie2 index",
},
{
name: bowtie2_threads,