diff bowtie_transcriptomic_wrapper/bowtie_transcriptomic_wrapper.xml @ 0:ef95034b4806 draft default tip

Uploaded
author triasteran
date Wed, 02 Mar 2022 12:54:25 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bowtie_transcriptomic_wrapper/bowtie_transcriptomic_wrapper.xml	Wed Mar 02 12:54:25 2022 +0000
@@ -0,0 +1,519 @@
+<tool id="bowtie_transcriptomic_wrapper" name="map reads on transcriptome using bowtie" version="2.0">
+    <requirements>
+	    <container type="docker">triasteran/bowite0127:latest</container>
+    </requirements>
+    <command detect_errors="exit_code"><![CDATA[
+        python2 '$__tool_directory__/bowtie_wrapper.py'
+      ## Set number of threads
+      --threads="\${GALAXY_SLOTS:-4}"
+      ## Outputs
+      --output="${output}"
+      #if str( $singlePaired.sPaired ) == "single"
+        #if $output_unmapped_reads_l
+          --output_unmapped_reads="${output_unmapped_reads_l}"
+        #end if
+        #if $output_suppressed_reads_l
+          --output_suppressed_reads="${output_suppressed_reads_l}"
+        #end if
+        --galaxy_input_format="${singlePaired.sInput1.ext}"
+      #else
+        #if $output_unmapped_reads_l and $output_unmapped_reads_r
+          --output_unmapped_reads_l="${output_unmapped_reads_l}"
+          --output_unmapped_reads_r="${output_unmapped_reads_r}"
+        #end if
+        #if $output_suppressed_reads_l and $output_suppressed_reads_l
+          --output_suppressed_reads_l="${output_suppressed_reads_l}"
+          --output_suppressed_reads_r="${output_suppressed_reads_r}"
+        #end if
+        --galaxy_input_format="${singlePaired.pInput1.ext}"
+      #end if
+      ## Inputs
+      --dataType="solexa" ##this indicates that nucleotide base space is used in the wrapper
+      --suppressHeader="${suppressHeader}"
+      --genomeSource="${refGenomeSource.genomeSource}"
+      #if $refGenomeSource.genomeSource == "history":
+        ##index already exists
+        #if $refGenomeSource.ownFile.extension.startswith( 'bowtie_' ):
+          ##user previously built
+          --ref="${refGenomeSource.ownFile.extra_files_path}/${refGenomeSource.ownFile.metadata.base_name}"
+          --do_not_build_index
+        #else:
+          ##build index on the fly
+          --ref="${refGenomeSource.ownFile}"
+          --indexSettings="${refGenomeSource.indexParams.indexSettings}"
+          #if $refGenomeSource.indexParams.indexSettings == "indexFull":
+            --iautoB="${refGenomeSource.indexParams.autoBehavior.autoB}"
+            #if $refGenomeSource.indexParams.autoBehavior.autoB == "set":
+              --ipacked="${refGenomeSource.indexParams.autoBehavior.packed}"
+              --ibmax="${refGenomeSource.indexParams.autoBehavior.bmax}"
+              --ibmaxdivn="${refGenomeSource.indexParams.autoBehavior.bmaxdivn}"
+              --idcv="${refGenomeSource.indexParams.autoBehavior.dcv}"
+            #end if
+            --inodc="${refGenomeSource.indexParams.nodc}"
+            --inoref="${refGenomeSource.indexParams.noref}"
+            --ioffrate="${refGenomeSource.indexParams.offrate}"
+            --iftab="${refGenomeSource.indexParams.ftab}"
+            --intoa="${refGenomeSource.indexParams.ntoa}"
+            --iendian="${refGenomeSource.indexParams.endian}"
+            --iseed="${refGenomeSource.indexParams.seed}"
+            --icutoff="${refGenomeSource.indexParams.cutoff}"
+          #end if
+        #end if
+      #else
+        ##use pre-built index
+        --ref="${refGenomeSource.index.fields.path}"
+      #end if
+      --paired="${singlePaired.sPaired}"
+      #if $singlePaired.sPaired == "single":
+        --input1="${singlePaired.sInput1}"
+        --params="${singlePaired.sParams.sSettingsType}"
+        #if $singlePaired.sParams.sSettingsType == "full":
+          --skip="${singlePaired.sParams.sSkip}"
+          --alignLimit="${singlePaired.sParams.sAlignLimit}"
+          --trimH="${singlePaired.sParams.sTrimH}"
+          --trimL="${singlePaired.sParams.sTrimL}"
+          --mismatchSeed="${singlePaired.sParams.sMismatchSeed}"
+          --mismatchQual="${singlePaired.sParams.sMismatchQual}"
+          --seedLen="${singlePaired.sParams.sSeedLen}"
+          --rounding="${singlePaired.sParams.sRounding}"
+          --maqSoapAlign="${singlePaired.sParams.sMaqSoapAlign}"
+          --reverseAlign="${singlePaired.sParams.sReverseAlign}"
+          --tryHard="${singlePaired.sParams.sTryHard}"
+          --valAlign="${singlePaired.sParams.sValAlign}"
+          --allValAligns="${singlePaired.sParams.sAllValAligns}"
+          --suppressAlign="${singlePaired.sParams.sSuppressAlign}"
+          --best="${singlePaired.sParams.sBestOption.sBest}"
+          #if $singlePaired.sParams.sBestOption.sBest == "doBest":
+            --maxBacktracks="${singlePaired.sParams.sBestOption.sdMaxBacktracks}"
+            --strata="${singlePaired.sParams.sBestOption.sdStrata}"
+          #else:
+            --maxBacktracks="${singlePaired.sParams.sBestOption.snMaxBacktracks}"
+          #end if
+          --offrate="${singlePaired.sParams.sOffrate}"
+          --seed="${singlePaired.sParams.sSeed}"
+        #end if
+      #else:
+        --input1="${singlePaired.pInput1}"
+        --input2="${singlePaired.pInput2}"
+        --maxInsert="${singlePaired.pMaxInsert}"
+        --mateOrient="${singlePaired.pMateOrient}"
+        --params="${singlePaired.pParams.pSettingsType}"
+        #if $singlePaired.pParams.pSettingsType == "full":
+          --skip="${singlePaired.pParams.pSkip}"
+          --alignLimit="${singlePaired.pParams.pAlignLimit}"
+          --trimH="${singlePaired.pParams.pTrimH}"
+          --trimL="${singlePaired.pParams.pTrimL}"
+          --mismatchSeed="${singlePaired.pParams.pMismatchSeed}"
+          --mismatchQual="${singlePaired.pParams.pMismatchQual}"
+          --seedLen="${singlePaired.pParams.pSeedLen}"
+          --rounding="${singlePaired.pParams.pRounding}"
+          --maqSoapAlign="${singlePaired.pParams.pMaqSoapAlign}"
+          --minInsert="${singlePaired.pParams.pMinInsert}"
+          --maxAlignAttempt="${singlePaired.pParams.pMaxAlignAttempt}"
+          --forwardAlign="${singlePaired.pParams.pForwardAlign}"
+          --reverseAlign="${singlePaired.pParams.pReverseAlign}"
+          --tryHard="${singlePaired.pParams.pTryHard}"
+          --valAlign="${singlePaired.pParams.pValAlign}"
+          --allValAligns="${singlePaired.pParams.pAllValAligns}"
+          --suppressAlign="${singlePaired.pParams.pSuppressAlign}"
+          --best="${singlePaired.pParams.pBestOption.pBest}"
+          #if $singlePaired.pParams.pBestOption.pBest == "doBest":
+            --maxBacktracks="${singlePaired.pParams.pBestOption.pdMaxBacktracks}"
+            --strata="${singlePaired.pParams.pBestOption.pdStrata}"
+          #else:
+            --maxBacktracks="${singlePaired.pParams.pBestOption.pnMaxBacktracks}"
+          #end if
+          --offrate="${singlePaired.pParams.pOffrate}"
+          --seed="${singlePaired.pParams.pSeed}"
+        #end if
+      #end if
+    ]]></command>
+     <inputs>
+    <conditional name="refGenomeSource">
+      <param name="genomeSource" type="select" label="Source of the reference transcriptome" help="">
+        <!--<option value="indexed">Use a built-in index</option>-->
+        <option value="history">Use one from the history</option>
+      </param>
+      <!--<when value="indexed">-->
+        <!--<param name="index" type="select" label="Select a reference transcriptome" help="if your transcriptome of interest is not listed, you will need to upload a fasta file of the genome.">-->
+          <!--<options from_data_table="bowtie_transcriptomic_indexes">-->
+            <!--<filter type="sort_by" column="2" />-->
+            <!--<validator type="no_options" message="No indexes are available"/>-->
+          <!--</options>-->
+        <!--</param>-->
+      <!--</when>-->
+      <when value="history">
+        <param name="ownFile" type="data" format="bowtie_base_index,fasta" label="Select the reference transcriptome" help="if your transcriptome of interest is not listed, you will need to upload a fasta file of the transcriptome." />
+        <conditional name="indexParams">
+          <param name="indexSettings" type="select" label="Choose whether to use Default options for building indices or to Set your own" help="These settings are ignored when using a prebuilt index">
+            <option value="indexPreSet">Default</option>
+            <option value="indexFull">Set your own</option>
+          </param> 
+          <when value="indexPreSet" />
+          <when value="indexFull">
+            <conditional name="autoBehavior">
+              <param name="autoB" type="select" label="Choose to use automatic or specified behavior for some parameters (-a)" help="Allows you to set --packed, --bmax, --bmaxdivn, and --dcv">
+                <option value="auto">Automatic behavior</option>
+                <option value="set">Set values (sets --noauto and allows others to be set)</option>
+              </param>
+              <when value="auto" />
+              <when value="set">
+                <param name="packed" type="select" label="Whether or not to use a packed representation for DNA strings (--packed)">
+                  <option value="unpacked">Use regular representation</option>
+                  <option value="packed">Use packed representation</option>
+                </param>
+                <param name="bmax" type="integer" value="-1" label="Maximum number of suffixes allowed in a block (--bmax)" help="-1 for not specified. Must be at least 1" />
+                <param name="bmaxdivn" type="integer" value="4" label="Maximum number of suffixes allowed in a block as a fraction of the length of the reference (--bmaxdivn)" />
+                <param name="dcv" type="integer" value="1024" label="The period for the difference-cover sample (--dcv)" />
+              </when>
+            </conditional>
+            <param name="nodc" type="select" label="Whether or not to disable the use of the difference-cover sample (--nodc)" help="Suffix sorting becomes quadratic-time in the worst case (with a very repetitive reference)">
+              <option value="dc">Use difference-cover sample</option>
+              <option value="nodc">Disable difference-cover sample</option>
+            </param>
+            <param name="noref" type="select" label="Whether or not to build the part of the reference index used only in paired-end alignment (-r)">
+              <option value="ref">Build all index files</option>
+              <option value="noref">Do not build paired-end alignment index files</option>
+            </param>
+            <param name="offrate" type="integer" value="5" label="How many rows get marked during annotation of some or all of the Burrows-Wheeler rows (-o)" />
+            <param name="ftab" type="integer" value="10" label="The size of the lookup table used to calculate an initial Burrows-Wheeler range with respect to the first n characters of the query (-t)" help="ftab is 4^(n+1) bytes" />
+            <param name="ntoa" type="select" label="Whether or not to convert Ns in the reference sequence to As (--ntoa)">
+              <option value="no">Do not convert Ns</option>
+              <option value="yes">Convert Ns to As</option>
+            </param>
+            <param name="endian" type="select" label="Endianness to use when serializing integers to the index file (--big/--little)" help="Little is most appropriate for Intel- and AMD-based architecture">
+              <option value="little">Little</option>
+              <option value="big">Big</option>
+            </param> 
+            <param name="seed" type="integer" value="-1" label="Seed for the pseudorandom number generator (--seed)" help="Use -1 to use default" />
+            <param name="cutoff" type="integer" value="-1" label="Number of first bases of the reference sequence to index (--cutoff)" help="Use -1 to use default" />
+          </when>  <!-- indexFull -->
+        </conditional>  <!-- indexParams -->
+      </when>  <!-- history -->
+    </conditional>  <!-- refGenomeSource -->
+    <conditional name="singlePaired">
+      <param name="sPaired" type="select" label="Is this library mate-paired?">
+        <option value="single">Single-end</option>
+        <option value="paired">Paired-end</option>
+      </param>
+      <when value="single">
+        <param name="sInput1" type="data" format="fastqsanger,fastqillumina,fastqsolexa" label="FASTQ file" help="Must have ASCII encoded quality scores"/>
+        <conditional name="sParams">
+          <param name="sSettingsType" type="select" label="Bowtie settings to use" help="For most mapping needs use Commonly used settings. If you want full control use Full parameter list">
+            <option value="preSet">Commonly used</option>
+            <option value="full" selected="true">Full parameter list</option>
+            </param>
+          <when value="preSet" />
+          <when value="full">
+            <param name="sSkip" type="integer" value="0" label="Skip the first n reads (-s)" />  
+            <param name="sAlignLimit" type="integer" value="-1" label="Only align the first n reads (-u)" help="-1 for off" />  
+            <param name="sTrimH" type="integer" value="0" label="Trim n bases from high-quality (left) end of each read before alignment (-5)" />
+            <param name="sTrimL" type="integer" value="0" label="Trim n bases from low-quality (right) end of each read before alignment (-3)" />
+            <param name="sMismatchSeed" type="integer" value="2" label="Maximum number of mismatches permitted in the seed (-n)" help="May be 0, 1, 2, or 3" />
+            <param name="sMismatchQual" type="integer" value="70" label="Maximum permitted total of quality values at mismatched read positions (-e)" />
+            <param name="sSeedLen" type="integer" value="25" label="Seed length (-l)" help="Minimum value is 5" />
+            <param name="sRounding" type="select" label="Whether or not to round to the nearest 10 and saturating at 30 (--nomaqround)">
+              <option value="round">Round to nearest 10</option>
+              <option value="noRound">Do not round to nearest 10</option>
+            </param>
+            <param name="sMaqSoapAlign" type="integer" value="-1" label="Number of mismatches for SOAP-like alignment policy (-v)" help="-1 for default MAQ-like alignment policy" />
+            <param name="sReverseAlign" type="select" label="Choose whether or not to align against the reverse-complement reference strand (--norc)">
+              <option value="noReverse">Do not align against the reverse-complement reference strand</option>
+              <option value="reverse">Align against the reverse-complement reference strand</option>
+            </param>
+            <param name="sTryHard" type="select" label="Whether or not to try as hard as possible to find valid alignments when they exist (-y)" help="Tryhard mode is much slower than regular mode">
+              <option value="noTryHard">Do not try hard</option>
+              <option value="doTryHard">Try hard</option>
+            </param>
+            <param name="sValAlign" type="integer" value="1" label="Report up to n valid alignments per read (-k)" />
+            <param name="sAllValAligns" type="select" label="Whether or not to report all valid alignments per read (-a)">
+              <option value="doAllValAligns">Report all valid alignments</option>
+              <option value="noAllValAligns">Do not report all valid alignments</option>
+            </param>
+            <param name="sSuppressAlign" type="integer" value="100" label="Suppress all alignments for a read if more than n reportable alignments exist (-m)" help="-1 for no limit. 
+                1 for uniquely mapping reads" />
+            <param name="sMaxFile" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write all reads with a number of valid alignments exceeding the limit set with the -m option to a file (--max)" />
+            <param name="sUnmappedFile" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write all reads that could not be aligned to a file (--un)" />
+            <conditional name="sBestOption">
+              <param name="sBest" type="select" label="Whether or not to make Bowtie guarantee that reported singleton alignments are 'best' in terms of stratum and in terms of the quality values at the mismatched positions (--best)" help="Removes all strand bias. Only affects which alignments are reported by Bowtie. Runs slower with best option">
+                <option value="noBest">Do not use best</option>
+                <option value="doBest">Use best</option>
+              </param>
+              <when value="noBest">
+                <param name="snMaxBacktracks" type="integer" value="125" label="Maximum number of backtracks permitted when aligning a read (--maxbts)" />
+              </when>
+              <when value="doBest">
+                <param name="sdMaxBacktracks" type="integer" value="800" label="Maximum number of backtracks permitted when aligning a read (--maxbts)" />
+                <param name="sdStrata" type="select" label="Whether or not to report only those alignments that fall in the best stratum if many valid alignments exist and are reportable (--strata)">
+                  <option value="noStrata">Do not use strata option</option>
+                  <option value="doStrata">Use strata option</option>
+                </param>
+              </when>
+            </conditional> <!-- bestOption -->
+            <param name="sOffrate" type="integer" value="-1" label="Override the offrate of the index to n (-o)" help="-1 for default" />
+            <param name="sSeed" type="integer" value="-1" label="Seed for pseudo-random number generator (--seed)" help="-1 for default" />
+          </when> <!-- full -->
+        </conditional> <!-- sParams -->
+      </when> <!-- single -->
+      <when value="paired">
+        <param name="pInput1" type="data" format="fastqsanger,fastqillumina,fastqsolexa" label="Forward FASTQ file" help="Must have ASCII encoded quality scores"/>
+        <param name="pInput2" type="data" format="fastqsanger,fastqillumina,fastqsolexa" label="Reverse FASTQ file" help="File format must match the Forward FASTQ file">
+            <options options_filter_attribute="ext" from_parameter="tool.app.datatypes_registry.datatypes_by_extension" transform_lines="obj.keys()">
+               <column name="name" index="0"/>
+               <column name="value" index="0"/>
+               <filter type="param_value" ref="pInput1" ref_attribute="ext" column="0"/> 
+           </options>
+        </param>
+        <param name="pMaxInsert" type="integer" value="1000" label="Maximum insert size for valid paired-end alignments (-X)" />
+        <param name="pMateOrient" type="select" label="The upstream/downstream mate orientation for valid paired-end alignment against the forward reference strand (--fr/--rf/--ff)">
+          <option value="fr">FR (for Illumina)</option>
+          <option value="rf">RF</option>
+          <option value="ff">FF (for SOLiD)</option>
+        </param>
+        <conditional name="pParams">
+          <param name="pSettingsType" type="select" label="Bowtie settings to use" help="For most mapping needs use Commonly used settings. If you want full control use Full parameter list">
+            <option value="preSet">Commonly used</option>
+            <option value="full">Full parameter list</option>
+          </param>
+          <when value="preSet" />
+          <when value="full">
+            <param name="pSkip" type="integer" value="0" label="Skip the first n pairs (-s)" />  
+            <param name="pAlignLimit" type="integer" value="-1" label="Only align the first n pairs (-u)" help="-1 for off" />  
+            <param name="pTrimH" type="integer" value="0" label="Trim n bases from high-quality (left) end of each read before alignment (-5)" />
+            <param name="pTrimL" type="integer" value="0" label="Trim n bases from low-quality (right) end of each read before alignment (-3)" />
+            <param name="pMismatchSeed" type="integer" value="2" label="Maximum number of mismatches permitted in the seed (-n)" help="May be 0, 1, 2, or 3" />
+            <param name="pMismatchQual" type="integer" value="70" label="Maximum permitted total of quality values at mismatched read positions (-e)" />
+            <param name="pSeedLen" type="integer" value="28" label="Seed length (-l)" help="Minimum value is 5" />
+            <param name="pRounding" type="select" label="Whether or not to round to the nearest 10 and saturating at 30 (--nomaqround)">
+              <option value="round">Round to nearest 10</option>
+              <option value="noRound">Do not round to nearest 10</option>
+            </param>
+            <param name="pMaqSoapAlign" type="integer" value="-1" label="Number of mismatches for SOAP-like alignment policy (-v)" help="-1 for default MAQ-like alignment policy" />
+            <param name="pMinInsert" type="integer" value="0" label="Minimum insert size for valid paired-end alignments (-I)" />
+            <param name="pMaxAlignAttempt" type="integer" value="100" label="Maximum number of attempts Bowtie will make to match an alignment for one mate with an alignment for the opposite mate (--pairtries)" />
+            <param name="pForwardAlign" type="select" label="Choose whether or not to attempt to align the forward reference strand (--nofw)">
+              <option value="forward">Align against the forward reference strand</option>
+              <option value="noForward">Do not align against the forward reference strand</option>
+            </param>
+            <param name="pReverseAlign" type="select" label="Choose whether or not to align against the reverse-complement reference strand (--norc)">
+              <option value="noReverse">Do not align against the reverse-complement reference strand</option>
+              <option value="reverse">Align against the reverse-complement reference strand</option>
+            </param>
+            <param name="pTryHard" type="select" label="Whether or not to try as hard as possible to find valid alignments when they exist (-y)" help="Tryhard mode is much slower than regular mode">
+              <option value="noTryHard">Do not try hard</option>
+              <option value="doTryHard">Try hard</option>
+            </param>
+            <param name="pValAlign" type="integer" value="1" label="Report up to n valid arguments per pair (-k)" />
+            <param name="pAllValAligns" type="select" label="Whether or not to report all valid alignments per pair (-a)">
+              <option value="noAllValAligns">Do not report all valid alignments</option>
+              <option value="doAllValAligns">Report all valid alignments</option>
+            </param>
+            <param name="pSuppressAlign" type="integer" value="-1" label="Suppress all alignments for a pair if more than n reportable alignments exist (-m)" help="-1 for no limit" />
+            <param name="pMaxFile" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write all reads with a number of valid alignments exceeding the limit set with the -m option to a file (--max)" />
+            <param name="pUnmappedFile" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write all reads that could not be aligned to a file (--un)" />
+            <conditional name="pBestOption">
+              <param name="pBest" type="select" label="Whether or not to make Bowtie guarantee that reported singleton alignments are 'best' in terms of stratum and in terms of the quality values at the mismatched positions (--best)" help="Removes all strand bias. Only affects which alignments are reported by Bowtie. Runs slower with best option">
+                <option value="noBest">Do not use best</option>
+                <option value="doBest">Use best</option>
+              </param>
+              <when value="noBest">
+                <param name="pnMaxBacktracks" type="integer" value="125" label="Maximum number of backtracks permitted when aligning a read (--maxbts)" />
+              </when>
+              <when value="doBest">
+                <param name="pdMaxBacktracks" type="integer" value="800" label="Maximum number of backtracks permitted when aligning a read (--maxbts)" />
+                <param name="pdStrata" type="select" label="Whether or not to report only those alignments that fall in the best stratum if many valid alignments exist and are reportable (--strata)">
+                  <option value="noStrata">Do not use strata option</option>
+                  <option value="doStrata">Use strata option</option>
+                </param>
+              </when>
+            </conditional>
+            <param name="pOffrate" type="integer" value="-1" label="Override the offrate of the index to n (-o)" help="-1 for default" />
+            <param name="pSeed" type="integer" value="-1" label="Seed for pseudo-random number generator (--seed)" help="-1 for default" />
+          </when> <!-- full -->
+        </conditional> <!-- pParams -->
+      </when> <!-- paired -->
+    </conditional> <!-- singlePaired -->
+    <param name="suppressHeader" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Suppress the header in the output SAM file" help="Bowtie produces SAM with several lines of header information by default" />
+  </inputs>
+    <outputs>
+        <data format="sam" name="output" label="${tool.name} on ${on_string}: mapped reads">
+      <actions>
+        <conditional name="refGenomeSource.genomeSource">
+          <when value="indexed">
+            <action type="metadata" name="dbkey">
+              <option type="from_data_table" name="bowtie_genomic_indexes" column="1" offset="0">
+                <filter type="param_value" column="0" value="#" compare="startswith" keep="False"/>
+                <filter type="param_value" ref="refGenomeSource.index" column="0"/>
+              </option>
+            </action>
+          </when>
+          <when value="history">
+            <action type="metadata" name="dbkey">
+              <option type="from_param" name="refGenomeSource.ownFile" param_attribute="dbkey" />
+            </action>
+          </when>
+        </conditional>
+      </actions>
+    </data>  
+    <data format="fastq" name="output_suppressed_reads_l" label="${tool.name} on ${on_string}: suppressed reads (L)">
+      <filter>((
+          singlePaired['sPaired'] == "single" and
+          singlePaired['sParams']['sSettingsType'] == "full" and
+          singlePaired['sParams']['sMaxFile'] is True
+        ) or (
+          singlePaired['sPaired'] == "paired" and
+          singlePaired['pParams']['pSettingsType'] == "full" and
+          singlePaired['pParams']['pMaxFile'] is True
+        ))
+      </filter>
+      <actions>
+        <conditional name="singlePaired.sPaired">
+          <when value="single">
+            <action type="format">
+              <option type="from_param" name="singlePaired.sInput1" param_attribute="ext" />
+            </action>
+          </when>
+          <when value="paired">
+            <action type="format">
+              <option type="from_param" name="singlePaired.pInput1" param_attribute="ext" />
+            </action>
+          </when>
+        </conditional>
+      </actions>
+    </data>
+    <data format="fastq" name="output_suppressed_reads_r" label="${tool.name} on ${on_string}: suppressed reads (R)">
+      <filter>singlePaired['sPaired'] == "paired"</filter>
+      <filter>singlePaired['pParams']['pSettingsType'] == "full"</filter>
+      <filter>singlePaired['pParams']['pMaxFile'] is True</filter>
+      <actions>
+        <conditional name="singlePaired.sPaired">
+          <when value="single">
+            <action type="format">
+              <option type="from_param" name="singlePaired.sInput1" param_attribute="ext" />
+            </action>
+          </when>
+          <when value="paired">
+            <action type="format">
+              <option type="from_param" name="singlePaired.pInput1" param_attribute="ext" />
+            </action>
+          </when>
+        </conditional>
+      </actions>
+    </data>
+    <data format="fastq" name="output_unmapped_reads_l" label="${tool.name} on ${on_string}: unmapped reads (L)">
+      <filter>
+        ((
+          singlePaired['sPaired'] == "single" and
+          singlePaired['sParams']['sSettingsType'] == "full" and
+          singlePaired['sParams']['sUnmappedFile'] is True
+        ) or (
+          singlePaired['sPaired'] == "paired" and
+          singlePaired['pParams']['pSettingsType'] == "full" and
+          singlePaired['pParams']['pUnmappedFile'] is True
+        ))
+      </filter>
+      <actions>
+        <conditional name="singlePaired.sPaired">
+          <when value="single">
+            <action type="format">
+              <option type="from_param" name="singlePaired.sInput1" param_attribute="ext" />
+            </action>
+          </when>
+          <when value="paired">
+            <action type="format">
+              <option type="from_param" name="singlePaired.pInput1" param_attribute="ext" />
+            </action>
+          </when>
+        </conditional>
+      </actions>
+    </data>
+    <data format="fastq" name="output_unmapped_reads_r" label="${tool.name} on ${on_string}: unmapped reads (R)">
+      <filter>singlePaired['sPaired'] == "paired"</filter>
+      <filter>singlePaired['pParams']['pSettingsType'] == "full"</filter>
+      <filter>singlePaired['pParams']['pUnmappedFile'] is True</filter>
+      <actions>
+        <conditional name="singlePaired.sPaired">
+          <when value="single">
+            <action type="format">
+              <option type="from_param" name="singlePaired.sInput1" param_attribute="ext" />
+            </action>
+          </when>
+          <when value="paired">
+            <action type="format">
+              <option type="from_param" name="singlePaired.pInput1" param_attribute="ext" />
+            </action>
+          </when>
+        </conditional>
+      </actions>
+    </data>
+    </outputs>
+    <tests>
+        <test>
+            <!--
+      Bowtie command:
+      bowtie-build -f test-data/phiX.fasta phiX_base
+      bowtie -q -X 1000 +ff -p 4 -S +sam-nohead -n 2 -e 70 -l 28 +pairtries 100 +maxbts 800 +best +un bowtie_out8_u.fastq phiX_base -1 test-data/bowtie_in5.fastqsanger -2 test-data/bowtie_in6.fastqsanger > bowtie_out7_u.sam
+      sort bowtie_out7_u.sam > bowtie_out7.sam
+      sort bowtie_out8_u_1.sam > bowtie_out8_1.sam
+      sort bowtie_out8_u_2.sam > bowtie_out8_2.sam
+      Then also need to modify bowtie_out8_1.sam and bowtie_out8_2.sam so that all @ lines come before sequence lines.
+      -p is the number of threads. You need to replace the + with 2 dashes.
+      The two unmapped output files will be named bowtie_out8_1.fastq and bowtie_out8_2.fastq.
+      chrM_base is the index files' location/base name. 
+      -->
+      <param name="genomeSource" value="history" />
+      <param name="ownFile" value="phiX.fasta" />
+      <param name="indexSettings" value="indexPreSet" />
+      <param name="sPaired" value="paired" />
+      <param name="pInput1" ftype="fastqsanger" value="bowtie_in5.fastqsanger" />
+      <param name="pInput2" ftype="fastqsanger" value="bowtie_in6.fastqsanger" />
+      <param name="pMaxInsert" value="1000" />
+      <param name="pMateOrient" value="ff" />
+      <param name="pSettingsType" value="full" />
+      <param name="pSkip" value="0" />
+      <param name="pAlignLimit" value="-1" />
+      <param name="pTrimH" value="0" />
+      <param name="pTrimL" value="0" />
+      <param name="pMismatchSeed" value="2" />
+      <param name="pMismatchQual" value="70" />
+      <param name="pSeedLen" value="28" />
+      <param name="pRounding" value="round" />
+      <param name="pMaqSoapAlign" value="-1" />
+      <param name="pMinInsert" value="0" />
+      <param name="pMaxAlignAttempt" value="100" />
+      <param name="pForwardAlign" value="forward" />
+      <param name="pReverseAlign" value="reverse" />
+      <param name="pTryHard" value="noTryHard" />
+      <param name="pValAlign" value="1" />
+      <param name="pAllValAligns" value="noAllValAligns" />
+      <param name="pSuppressAlign" value="-1" />
+      <param name="pUnmappedFile" value="true" />
+      <param name="pMaxFile" value="false" />
+      <param name="pBest" value="doBest" />
+      <param name="pdMaxBacktracks" value="800" />
+      <param name="pdStrata" value="noStrata" />
+      <param name="pOffrate" value="-1" />
+      <param name="pSeed" value="-1" />
+      <param name="suppressHeader" value="true" />
+      <output name="output" ftype="sam" file="bowtie_out7.sam" sort="True" />
+      <output name="output_unmapped_reads_l" ftype="fastqsanger" file="bowtie_out8_1.fastq" sort="True" />
+      <output name="output_unmapped_reads_r" ftype="fastqsanger" file="bowtie_out8_2.fastq" sort="True" />
+    </test>
+    </tests>
+    <help><![CDATA[
+        Bowtie is a short read aligner designed to be ultrafast and memory-efficient. It is developed by 
+		Ben Langmead and Cole Trapnell. Please cite: Langmead B, Trapnell C, Pop M, Salzberg SL. 
+		Ultrafast and memory-efficient alignment of short DNA sequences to the human genome. Genome Biology 10:R25.
+    ]]></help>
+    <citations>
+        <citation type="bibtex">
+@misc{githubbowtie,
+  author = {LastTODO, FirstTODO},
+  year = {TODO},
+  title = {bowtie},
+  publisher = {GitHub},
+  journal = {GitHub repository},
+  url = {https://github.com/BenLangmead/bowtie},
+}</citation>
+    </citations>
+</tool>