diff stacks_gstacks.xml @ 4:285e1f85c11a draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/stacks2 commit 4e87a14a5479800df9675c1cbcdbe1b11f63653b-dirty
author matthias
date Wed, 27 Feb 2019 09:56:44 -0500
parents 4301ded2ea50
children aa645d419016
line wrap: on
line diff
--- a/stacks_gstacks.xml	Fri Jan 04 03:34:46 2019 -0500
+++ b/stacks_gstacks.xml	Wed Feb 27 09:56:44 2019 -0500
@@ -1,12 +1,14 @@
-<tool id="stacks2_gstacks" name="Stacks2: gstacks" version="@STACKS_VERSION@+galaxy@WRAPPER_VERSION@">
-    <description>match stacks to a catalog</description>
+<tool id="stacks2_gstacks" name="Stacks2: gstacks" profile="@PROFILE@" version="@STACKS_VERSION@+galaxy@WRAPPER_VERSION@">
+    <description>Call variants, genotypes and haplotype</description>
     <macros>
         <import>macros.xml</import>
     </macros>
-    <expand macro="requirements"/>
-    <expand macro="stdio"/>
-    <command><![CDATA[
-@CLEAN_EXT@
+    <expand macro="requirements">
+        <requirement type="package" version="1.9">samtools</requirement>
+    </expand>
+    <expand macro="version_cmd"/>
+    <command detect_errors="aggressive"><![CDATA[
+@FASTQ_INPUT_FUNCTIONS@
 
 mkdir bam_inputs stacks_outputs &&
 #if $mode_cond.mode_select == "denovo" and not $popmap:
@@ -18,7 +20,7 @@
     #end try
     #if count == 1:
         #for $bam in $input_bam:
-            ln -s '$bam' bam_inputs/catalog.bam && 
+            ln -s '$bam' bam_inputs/catalog.bam &&
         #end for
     #else
         >&2 echo "exactly one (merged) bam file is needed in denovo mode if no population map is given" &&
@@ -37,6 +39,7 @@
         --kmer-length $mode_cond.advanced_cond.kmer_length
         --max-debruijn-reads $mode_cond.advanced_cond.max_debruijn_reads
         --min-kmer-cov $mode_cond.advanced_cond.min_kmer_cov
+        $mode_cond.advanced_cond.write_alignments
     #end if
 #else:
     #if $popmap
@@ -66,26 +69,38 @@
 -t \${GALAXY_SLOTS:-1}
 
 ##Model options:
---model $model_cond.model 
-#if $model_cond.model != "snp":
-    --var-alpha $model_cond.var_alpha
-#end if
+--model $model_cond.model
+--var-alpha $model_cond.var_alpha
 --gt-alpha $model_cond.gt_alpha
 
-## annoyingly gstacks creates stacks_output/population.log
+
+## the bam files generated by gstacks (--write-alignments) are seemingly buggy
+## (https://groups.google.com/d/msg/stacks-users/CazwJY1DPGA/7vuahiB2GgAJ)
+## so we fix them temporarily by piping them through samtools view (disabling all
+## exit codes and stderr output) this adds the samtools requirement
+## for later versions where this is fixed the output bam files could just be moved
+## to stacks_outputs if this is still necessary
+#if $mode_cond.mode_select == "denovo" and $mode_cond.advanced_cond.advanced_select == "yes" and $mode_cond.advanced_cond.write_alignments != ""
+    #if $popmap:
+        && for b in bam_inputs/*alns.bam; do (samtools view -b "\$b" || true) 2> /dev/null > stacks_outputs/\$(basename "\$b"); done
+    #else
+        && (samtools view -b bam_inputs/alignments.bam || true) 2> /dev/null > stacks_outputs/alignments.bam
+    #end if
+#end if
+
+
+## annoyingly gstacks creates stacks_output/gstacks.log
 ## instead of just writing to stderr as the other tools
 ## hence we do not use the tokens and return populations.log as log file and take the stderr
-&& mv stacks_outputs/gstacks.log $output_log
+#if $output_log
+    && mv stacks_outputs/gstacks.log $output_log
+#end if
 
-## the catalog.calls output is a gzip-ed vcf extract it
-## to make it usable in Galaxy (with the downside that we 
-## need to gzip it again for downstream calls like populations)
-&& gunzip -c stacks_outputs/catalog.calls > stacks_outputs/catalog.calls.vcf
-
+@EXTRACT_VCF@
 
 ## TODO extract individual distributions from stacks_outputs/gstacks.log.distribs
 ## alternative extra tool
-## for i in \$(stacks-dist-extract stacks_outputs/gstacks.log.distribs) 
+## for i in \$(stacks-dist-extract stacks_outputs/gstacks.log.distribs)
 ## do
 ##     stacks-dist-extract stacks_outputs/gstacks.log.distribs $i > stacks_outputs/gstacks.log.\$i.tsv
 ## done
@@ -102,30 +117,31 @@
                 <option value="refbased">Reference-based</option>
             </param>
             <when value="denovo">
-                <param argument="--ignore-pe-reads" name="ignore_pe_reads" type="boolean" checked="false" truevalue="--ignore-pe-reads" falsevalue="" label="ignore paired-end reads" help="ignore paired-end reads even if present in the input" />
+                <param argument="--ignore-pe-reads" name="ignore_pe_reads" type="boolean" checked="false" truevalue="--ignore-pe-reads" falsevalue="" label="Ignore paired-end reads" help="ignore paired-end reads even if present in the input" />
                 <conditional name="advanced_cond">
                     <param name="advanced_select" type="select" label="Advanced options">
                         <option value="no">No</option>
                         <option value="yes">Yes</option>
                     </param>
                     <when value="yes">
-                        <param argument="--kmer-length" name="kmer_length" type="integer" value="31" min="2" max="31" label="kmer length for the de Bruijn graph" />
-                        <param argument="--max-debruijn-reads" name="max_debruijn_reads" type="integer" value="1000" min="1" label="maximum number of reads to use in the de Bruijn graph" />
-                        <param argument="--min-kmer-cov" name="min_kmer_cov" type="integer" value="2" label="minimum coverage to consider a kmer" />
+                        <param argument="--kmer-length" name="kmer_length" type="integer" value="31" min="2" max="31" label="K-mer length for the de Bruijn graph" />
+                        <param argument="--max-debruijn-reads" name="max_debruijn_reads" type="integer" value="1000" min="1" label="Maximum number of reads to use in the de Bruijn graph" />
+                        <param argument="--min-kmer-cov" name="min_kmer_cov" type="integer" value="2" label="Minimum coverage to consider a kmer" />
+                        <param argument="--write-alignments" name="write_alignments" type="boolean" checked="false" truevalue="--write-alignments" falsevalue="" label="save read alignments" help="heavy BAM files"/>
                     </when>
                     <when value="no"/>
                 </conditional>
             </when>
             <when value="refbased">
                 <conditional name="paired_cond">
-                    <param name="paired_select" type="select" label="paired end options" help="select single/paired for single end data or to select advanced paired end options, --unpaired: treat reverse reads as if they were forward reads; --ignore-pe-reads: ignore paired-end reads even if present in the input">
+                    <param name="paired_select" type="select" label="Paired end options" help="select single/paired for single end data or to select advanced paired end options, --unpaired: treat reverse reads as if they were forward reads; --ignore-pe-reads: ignore paired-end reads even if present in the input">
                         <option value="" selected="true">single/paired</option>
                         <option value="--unpaired" selected="true">ignore read pairing (--unpaired)</option>
                         <option value="--ignore-pe-reads" selected="true">ignore paired-end reads (--ignore-pe-reads)</option>
                     </param>
                     <when value="">
-                        <param argument="--rm-unpaired-reads" name="rm_unpaired_reads" type="boolean" checked="false" truevalue="--rm-unpaired-reads" falsevalue="" label="discard unpaired reads" />
-                        <param argument="--rm-pcr-duplicates" name="rm_pcr_duplicates" type="boolean" checked="false" truevalue="--rm-pcr-duplicates" falsevalue="" label="remove read pairs of the same sample that have the same insert length" help="implies --rm-unpaired-reads" />
+                        <param argument="--rm-unpaired-reads" name="rm_unpaired_reads" type="boolean" checked="false" truevalue="--rm-unpaired-reads" falsevalue="" label="Discard unpaired reads" />
+                        <param argument="--rm-pcr-duplicates" name="rm_pcr_duplicates" type="boolean" checked="false" truevalue="--rm-pcr-duplicates" falsevalue="" label="Remove read pairs of the same sample that have the same insert length" help="implies --rm-unpaired-reads" />
                     </when>
                     <when value="--unpaired"/>
                     <when value="--ignore-pe-reads"/>
@@ -136,13 +152,13 @@
                         <option value="yes">Yes</option>
                     </param>
                     <when value="yes">
-                        <param argument="--min-mapq" name="min_mapq" type="integer" value="10" min="0" max="255" label="minimum PHRED-scaled mapping quality to consider a read" />
-                        <param argument="--max-clipped" name="max_clipped" type="float" value="0.2" min="0.0" max="1.1" label="maximum soft-clipping level" help="in fraction of read length" />
-                        <param argument="--max-insert-len" name="max_insert_len" type="integer" value="1000" min="0" label="maximum allowed sequencing insert length" />
-                        <param argument="--details" type="boolean" checked="false" truevalue="--details" falsevalue="" label="write a heaview output" />
-                        <param name="phasing_cooccurrences_thr_min" type="integer" value="1" min="0" label="edge coverage min" help="(--phasing-cooccurrences-thr-range)" />
-                        <param name="phasing_cooccurrences_thr_max" type="integer" value="2" min="0" label="edge coverage max" help="range of edge coverage thresholds to iterate over when building the graph of allele cooccurrences for SNP phasing (--phasing-cooccurrences-thr-range)"/>
-                        <param argument="--phasing-dont-prune-hets" name="phasing_dont_prune_hets" type="boolean" checked="false" truevalue="--phasing-dont-prune-hets" falsevalue="" label="don't try to ignore dubious heterozygote genotypes during phasing" />
+                        <param argument="--min-mapq" name="min_mapq" type="integer" value="10" min="0" max="255" label="Minimum PHRED-scaled mapping quality to consider a read" />
+                        <param argument="--max-clipped" name="max_clipped" type="float" value="0.2" min="0.0" max="1.1" label="Maximum soft-clipping level" help="in fraction of read length" />
+                        <param argument="--max-insert-len" name="max_insert_len" type="integer" value="1000" min="0" label="Maximum allowed sequencing insert length" />
+                        <param argument="--details" type="boolean" checked="false" truevalue="--details" falsevalue="" label="Write a heaview output" />
+                        <param name="phasing_cooccurrences_thr_min" type="integer" value="1" min="0" label="Edge coverage min" help="(--phasing-cooccurrences-thr-range)" />
+                        <param name="phasing_cooccurrences_thr_max" type="integer" value="2" min="0" label="Edge coverage max" help="range of edge coverage thresholds to iterate over when building the graph of allele cooccurrences for SNP phasing (--phasing-cooccurrences-thr-range)"/>
+                        <param argument="--phasing-dont-prune-hets" name="phasing_dont_prune_hets" type="boolean" checked="false" truevalue="--phasing-dont-prune-hets" falsevalue="" label="Don't try to ignore dubious heterozygote genotypes during phasing" />
                     </when>
                     <when value="no"/>
                 </conditional>
@@ -150,7 +166,7 @@
         </conditional>
 
         <conditional name="model_cond">
-            <param argument="--model" type="select" label="model to use to call variants and genotypes">
+            <param argument="--model" type="select" label="Model to use to call variants and genotypes">
                 <option value="marukilow" selected="true">marukilow</option>
                 <option value="marukihigh">marukihigh</option>
                 <option value="snp">snp</option>
@@ -162,35 +178,58 @@
                 <expand macro="variant_calling_options_vg"/>
             </when>
             <when value="snp">
-                <expand macro="variant_calling_options_g"/>
+                <expand macro="variant_calling_options_vg"/>
             </when>
         </conditional>
-
+        <param name="add_log_distribs" type="boolean" checked="false" truevalue="yes" falsevalue="no" label="Add log distribs output as dataset" />
         <expand macro="in_log"/>
     </inputs>
     <outputs>
         <expand macro="out_log"/>
-        <data format="txt" name="distribs" label="${tool.name} on ${on_string} distribs" from_work_dir="gstacks.log.distribs" />
-        <expand macro="gstacks_outputs_macro"/>
+        <expand macro="gstacks_outputs_full_macro"/>
     </outputs>
 
     <tests>
         <!-- denovomode, w popmap -->
-        <test>
+        <test expect_num_outputs="3">
             <param name="input_bam" ftype="bam" value="tsv2bam/PopA_01.matches.bam,tsv2bam/PopA_02.matches.bam"/>
             <param name="popmap" ftype="tabular" value="denovo_map/popmap_cstacks.tsv" />
             <conditional name="mode_cond">
                 <param name="mode_select" value="denovo"/>
             </conditional>
             <param name="add_log" value="yes" />
-            <output name="output_log" ftype="txt" file="gstacks/gstacks.log" lines_diff="8"/>
+            <param name="add_log_distribs" value="yes" />
+            <output name="output_log" ftype="txt" file="gstacks/gstacks.log" lines_diff="6"/>
+            <output name="distribs" ftype="txt" file="gstacks/gstacks.log.distribs" compare="sim_size"/>
             <output_collection name="gstacks_out" type="list" count="2">
-                <element name="catalog.calls.vcf" file="gstacks/catalog.calls.tsv" ftype="vcf" lines_diff="2"/>
-                <element name="catalog.fa.gz" file="gstacks/catalog.fa.gz" ftype="fasta.gz" compare="sim_size"/>
+                <element name="catalog.calls.vcf" file="gstacks/catalog.calls.vcf" ftype="vcf" lines_diff="2"/>
+                <element name="catalog.fa.gz" file="gstacks/catalog.fa.gz" ftype="fasta.gz"/>
+            </output_collection>
+        </test>
+        <!-- denovomode, w popmap, write alignments -->
+        <test expect_num_outputs="3">
+            <param name="input_bam" ftype="bam" value="tsv2bam/PopA_01.matches.bam,tsv2bam/PopA_02.matches.bam"/>
+            <param name="popmap" ftype="tabular" value="denovo_map/popmap_cstacks.tsv" />
+            <conditional name="mode_cond">
+                <param name="mode_select" value="denovo"/>
+                <conditional name="advanced_cond">
+                    <param name="advanced_select" value="yes"/>
+                    <param name="write_alignments" value="--write-alignments" />
+                </conditional>
+            </conditional>
+            <param name="add_log" value="yes" />
+            <assert_command>
+                <has_text text="--write-alignments" />
+            </assert_command>
+            <output name="output_log" ftype="txt"><assert_contents><has_text text="done." /></assert_contents></output>
+            <output_collection name="gstacks_out" type="list" count="2"/>
+            <output_collection name="gstacks_alns_out" type="list" count="2">
+                <element name="PopA_01" file="gstacks/PopA_01.alns.bam" ftype="bam" />
+                <element name="PopA_02" file="gstacks/PopA_02.alns.bam" ftype="bam" />
             </output_collection>
         </test>
         <!-- denovomode, wo popmap (allows for only one input), ignore PE, advanced, alt model -->
-        <test>
+        <test expect_num_outputs="3">
             <param name="input_bam" value="tsv2bam/PopA_01.matches.bam" ftype="bam"/>
             <conditional name="mode_cond">
                 <param name="mode_select" value="denovo" />
@@ -200,6 +239,7 @@
                     <param name="kmer_length" value="23" />
                     <param name="max_debruijn_reads" value="666"/>
                     <param name="min_kmer_cov" value="3" />
+                    <param name="write_alignments" value="--write-alignments" />
                 </conditional>
             </conditional>
             <conditional name="model_cond">
@@ -214,16 +254,18 @@
                 <has_text text="--kmer-length 23" />
                 <has_text text="--max-debruijn-reads 666" />
                 <has_text text="--min-kmer-cov 3" />
+                <has_text text="--write-alignments" />
                 <has_text text="--model marukihigh" />
                 <has_text text="--var-alpha 0.1" />
                 <has_text text="--gt-alpha 0.1" />
             </assert_command>
-            <output name="output_log"><assert_contents><has_text text="gstacks is done." /></assert_contents></output>
+            <output name="output_log" ftype="txt"><assert_contents><has_text text="done." /></assert_contents></output>
             <output_collection name="gstacks_out" type="list" count="2"/>
+            <output name="gstacks_aln_out" ftype="bam" file="gstacks/alignments.bam" />
         </test>
         <!-- refbased wo popmap, paired options, removing all unpaired reads results in an error -->
         <test expect_failure="true" expect_exit_code="1">
-            <param name="input_bam" value="tsv2bam/PopA_01.matches.bam,tsv2bam/PopA_02.matches.bam"/>
+            <param name="input_bam" value="tsv2bam/PopA_01.bam,tsv2bam/PopA_02.bam"/>
             <conditional name="mode_cond">
                 <param name="mode_select" value="refbased"/>
                 <conditional name="paired_cond">
@@ -241,8 +283,8 @@
             </assert_command>
         </test>
         <!-- refbased w popmap (here bam names need to be equal to sample names in popmap), \-\-unpaired, advanced, snp model -->
-        <test>
-		<param name="input_bam" ftype="bam" value="refmap/PopA_01.bam,refmap/PopA_02.bam"/>
+        <test expect_num_outputs="2">
+            <param name="input_bam" ftype="bam" value="tsv2bam/PopA_01.bam,tsv2bam/PopA_02.bam"/>
             <param name="popmap" ftype="tabular" value="denovo_map/popmap_cstacks.tsv" />
             <conditional name="mode_cond">
                 <param name="mode_select" value="refbased"/>
@@ -276,12 +318,12 @@
                 <has_text text="--model snp" />
                 <has_text text="--gt-alpha 0.1" />
             </assert_command>
-            <output name="output_log"><assert_contents><has_text text="gstacks is done." /></assert_contents></output>
+            <output name="output_log" ftype="txt"><assert_contents><has_text text="done." /></assert_contents></output>
             <output_collection name="gstacks_out" type="list" count="2"/>
         </test>
         <!-- refbased wo popmap (here bam names don't matter), \-\-ignorepe -->
-        <test>
-            <param name="input_bam" ftype="bam" value="tsv2bam/PopA_01.matches.bam,tsv2bam/PopA_02.matches.bam"/>
+        <test expect_num_outputs="2">
+            <param name="input_bam" ftype="bam" value="tsv2bam/PopA_01.bam,tsv2bam/PopA_02.bam"/>
             <conditional name="mode_cond">
                 <param name="mode_select" value="refbased"/>
                 <conditional name="paired_cond">
@@ -295,10 +337,7 @@
                 <has_text text="--ignore-pe-reads" />
             </assert_command>
             <output name="output_log"><assert_contents><has_text text="gstacks is done." /></assert_contents></output>
-            <output_collection name="gstacks_out" type="list" count="2">
-                <element name="catalog.calls.vcf" file="gstacks/catalog.calls.tsv" ftype="vcf" lines_diff="2"/>
-                <element name="catalog.fa.gz" file="gstacks/catalog.fa.gz" ftype="fasta.gz" compare="sim_size"/>
-            </output_collection>
+            <output_collection name="gstacks_out" type="list" count="2"/>
         </test>
     </tests>
 
@@ -318,7 +357,7 @@
 reads must be sorted. The gstacks program will detect if single- or paired-end
 reads are present.
 
-In either mode, gstacks is able to remove PCR duplicates if requested. 
+In either mode, gstacks is able to remove PCR duplicates if requested.
 
 --------