changeset 15:7e0b333f39e1 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/bowtie2 commit cf554b9b69c32acb484c34fdc60384fa49c7c482
author iuc
date Thu, 01 Jun 2017 06:46:49 -0400
parents 85f0e9edb32d
children def46fdb3909
files bowtie2_macros.xml bowtie2_wrapper.xml read_group_macros.xml test-data/bowtie2-fq_il.fq test-data/bowtie2-stats.out test-data/bowtie2-test1.bam test-data/bowtie2-test2.bam test-data/bowtie2-test_il.bam
diffstat 8 files changed, 481 insertions(+), 356 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bowtie2_macros.xml	Thu Jun 01 06:46:49 2017 -0400
@@ -0,0 +1,326 @@
+<macros>
+    <!-- Import this at the top of your command block and then
+         define rg_auto_name. -->
+    <token name="@define_read_group_helpers@">
+#def identifier_or_name($input1)
+    #if hasattr($input1, 'element_identifier')
+        #return $input1.element_identifier
+    #else
+        #return $input1.name.rstrip('.gz').rstrip('.fastq').rstrip('.fq').rstrip('bz2')
+    #end if
+#end def
+
+#def clean(name)
+    #import re
+    #set $name_clean = re.sub('[^\w\-_\.]', '_', $name)
+    #return $name_clean
+#end def
+
+#def read_group_name_default($input1, $input2=None)
+    #if $input2 is None
+        #return $clean($identifier_or_name($input1))
+    #else
+        #import itertools
+        #set $input_name1 = $clean($identifier_or_name($input1))
+        #set $input_name2 = $clean($identifier_or_name($input2))
+        #set $common_prefix = ''.join([c[0] for c in itertools.takewhile(lambda x: all(x[0] == y for y in x), itertools.izip(*[$input_name1, $input_name2]))])
+        #if len($common_prefix) > 3
+            #return $common_prefix
+        #else
+            #return $input_name1
+        #end if
+    #end if
+#end def
+
+#def format_read_group(prefix, value, quote='', arg='')
+    #if $value
+        #return $arg + $quote + $prefix + $value + $quote
+    #else
+        #return ''
+    #end if
+#end def
+
+#def rg_param(name)
+    #if $varExists("rg")
+        #return $rg.get($name, None)
+    #else
+        #return $getVar($name, None)
+    #end if
+#end def
+
+#set $use_rg = True
+    </token>
+    <!-- preconditions use_rg and rg_auto_name have been
+         defined.
+    -->
+    <token name="@set_read_group_vars@">
+#if $use_rg
+    #if $rg_param('read_group_id_conditional') is None
+        #set $rg_id = $rg_auto_name
+    #elif $rg_param('read_group_id_conditional').do_auto_name
+        #set $rg_id = $rg_auto_name
+    #else
+        #set $rg_id = str($rg_param('read_group_id_conditional').ID)
+    #end if
+
+    #if $rg_param('read_group_sm_conditional') is None
+        #set $rg_sm = ''
+    #elif $rg_param('read_group_sm_conditional').do_auto_name
+        #set $rg_sm = $rg_auto_name
+    #else
+        #set $rg_sm = str($rg_param('read_group_sm_conditional').SM)
+    #end if
+
+    #if $rg_param('PL')
+        #set $rg_pl = str($rg_param('PL'))
+    #else
+        #set $rg_pl = ''
+    #end if
+
+    #if $rg_param('read_group_lb_conditional') is None
+        #set $rg_lb = ''
+    #elif $rg_param('read_group_lb_conditional').do_auto_name
+        #set $rg_lb = $rg_auto_name
+    #else
+        #set $rg_lb = str($rg_param('read_group_lb_conditional').LB)
+    #end if
+
+    #if $rg_param('CN')
+        #set $rg_cn = str($rg_param('CN'))
+    #else
+        #set $rg_cn = ''
+    #end if
+
+    #if $rg_param("DS")
+        #set $rg_ds = str($rg_param("DS"))
+    #else
+        #set $rg_ds = ''
+    #end if
+
+    #if $rg_param("DT")
+        #set $rg_dt = str($rg_param("DT"))
+    #else
+        #set $rg_dt = ''
+    #end if
+
+    #if $rg_param("FO")
+        #set $rg_fo = str($rg_param("FO"))
+    #else
+        #set $rg_fo = ''
+    #end if
+
+    #if $rg_param("KS")
+        #set $rg_ks = str($rg_param("KS"))
+    #else
+        #set $rg_ks = ''
+    #end if
+
+    #if $rg_param("PG")
+        #set $rg_pg = str($rg_param("PG"))
+    #else
+        #set $rg_pg = ''
+    #end if
+
+    #if $rg_param("PI") != None
+        #set $rg_pi = str($rg_param("PI"))
+    #else
+        #set $rg_pi = ''
+    #end if
+
+    #if $rg_param("PU")
+        #set $rg_pu = str($rg_param("PU"))
+    #else
+        #set $rg_pu = ''
+    #end if
+#end if
+    </token>
+    <token name="@set_use_rg_var@">
+#set $use_rg = str($rg.rg_selector) != "do_not_set"
+    </token>
+    <xml name="read_group_auto_name_conditional">
+        <param name="do_auto_name" type="boolean" label="Auto-assign" help="Use dataset name or collection information to automatically assign this value" checked="false" />
+        <when value="true">
+        </when>
+        <when value="false">
+            <yield />
+        </when>
+    </xml>
+    <xml name="read_group_id_param">
+        <param name="ID" type="text" value="" label="Read group identifier (ID)" help="This value must be unique among multiple samples in your experiment" optional="false">
+            <validator type="empty_field" />
+        </param>
+    </xml>
+    <xml name="read_group_id_conditional">
+        <conditional name="read_group_id_conditional">
+            <expand macro="read_group_auto_name_conditional">
+                <expand macro="read_group_id_param" />
+            </expand>
+        </conditional>
+    </xml>
+    <xml name="read_group_sm_param">
+        <param name="SM" type="text" value="" label="Read group sample name (SM)" help="This value should be descriptive. Use pool name where a pool is being sequenced" />
+    </xml>
+    <xml name="read_group_sm_conditional">
+        <conditional name="read_group_sm_conditional">
+            <expand macro="read_group_auto_name_conditional">
+                <expand macro="read_group_sm_param" />
+            </expand>
+        </conditional>
+    </xml>
+    <!-- Above SM param is optional (for SAM/BAM spec, this is required
+         as per Picard.
+    -->
+    <xml name="read_group_sm_param_required">
+        <param name="SM" type="text" value="" label="Read group sample name (SM)" optional="false" help="This value should be descriptive. Use pool name where a pool is being sequenced">
+            <validator type="empty_field" />
+        </param>
+    </xml>
+    <xml name="read_group_sm_required_conditional">
+        <conditional name="read_group_sm_conditional">
+            <expand macro="read_group_auto_name_conditional">
+                <expand macro="read_group_sm_param" />
+            </expand>
+        </conditional>
+    </xml>
+    <xml name="read_group_pl_param">
+        <param name="PL" type="select" label="Platform/technology used to produce the reads (PL)">
+            <option value="CAPILLARY">CAPILLARY</option>
+            <option value="LS454">LS454</option>
+            <option selected="True" value="ILLUMINA">ILLUMINA</option>
+            <option value="SOLID">SOLID</option>
+            <option value="HELICOS">HELICOS</option>
+            <option value="IONTORRENT">IONTORRENT</option>
+            <option value="PACBIO">PACBIO</option>
+        </param>
+    </xml>
+    <xml name="read_group_lb_param">
+        <param name="LB" type="text" label="Library name (LB)" optional="true" />
+    </xml>
+    <xml name="read_group_lb_conditional">
+        <conditional name="read_group_lb_conditional">
+            <expand macro="read_group_auto_name_conditional">
+                <expand macro="read_group_lb_param" />
+            </expand>
+        </conditional>
+    </xml>
+    <xml name="read_group_lb_required_param">
+        <param name="LB" type="text" label="Library name (LB)" optional="false">
+            <validator type="empty_field" />
+        </param>
+    </xml>
+    <xml name="read_group_lb_required_conditional">
+        <conditional name="read_group_lb_conditional">
+            <expand macro="read_group_auto_name_conditional">
+                <expand macro="read_group_lb_required_param" />
+            </expand>
+        </conditional>
+    </xml>
+    <xml name="read_group_cn_param">
+        <param name="CN" type="text" label="Sequencing center that produced the read (CN)" />
+    </xml>
+    <xml name="read_group_ds_param">
+        <param name="DS" type="text" label="Description (DS)" />
+    </xml>
+    <xml name="read_group_dt_param">
+        <param name="DT" type="text" label="Date that run was produced (DT)" help="ISO8601 format date or date/time, like YYYY-MM-DD" />
+    </xml>
+    <xml name="read_group_fo_param">
+        <param name="FO" type="text" optional="true" label="Flow order (FO)" help="The array of nucleotide bases that correspond to the nucleotides used for each flow of each read. Multi-base flows are encoded in IUPAC format, and non-nucleotide flows by various other characters. Format: /\*|[ACMGRSVTWYHKDBN]+/">
+          <validator type="regex" message="Invalid flow order">\*|[ACMGRSVTWYHKDBN]+$</validator>
+        </param>
+    </xml>
+    <xml name="read_group_ks_param">
+        <param name="KS" type="text" label="The array of nucleotide bases that correspond to the key sequence of each read (KS)" />
+    </xml>
+    <xml name="read_group_pg_param">
+        <param name="PG" type="text" label="Programs used for processing the read group (PG)" />
+    </xml>
+    <xml name="read_group_pi_param">
+        <param name="PI" type="integer" optional="true" label="Predicted median insert size (PI)" />
+    </xml>
+    <xml name="read_group_pu_param">
+        <param name="PU" type="text" label="Platform unit (PU)" help="Unique identifier (e.g. flowcell-barcode.lane for Illumina or slide for SOLiD)" optional="True" />
+    </xml>
+    <xml name="read_group_pu_required_param">
+        <param name="PU" type="text" label="Platform unit (PU)" help="Unique identifier (e.g. flowcell-barcode.lane for Illumina or slide for SOLiD)" optional="False" />
+    </xml>
+    <!-- Only ID is required - all groups available -->
+    <xml name="read_group_inputs_spec">
+        <expand macro="read_group_id_conditional" />
+        <expand macro="read_group_sm_conditional" />
+        <expand macro="read_group_pl_param" />
+        <expand macro="read_group_lb_conditional" />
+        <expand macro="read_group_cn_param" />
+        <expand macro="read_group_ds_param" />
+        <expand macro="read_group_dt_param" />
+        <expand macro="read_group_fo_param" />
+        <expand macro="read_group_ks_param" />
+        <expand macro="read_group_pg_param" />
+        <expand macro="read_group_pi_param" />
+        <expand macro="read_group_pu_param" />
+    </xml>
+    <!-- ID, SM, LB, PU, PL all required - not ks, pg, or fo params. -->
+    <xml name="read_group_inputs_picard">
+        <expand macro="read_group_id_conditional" />
+        <expand macro="read_group_sm_required_conditional" />
+        <expand macro="read_group_lb_required_conditional" />
+        <expand macro="read_group_pl_param" />
+        <expand macro="read_group_pu_required_param" />
+        <expand macro="read_group_cn_param" />
+        <expand macro="read_group_ds_param" />
+        <expand macro="read_group_pi_param" />
+        <expand macro="read_group_dt_param" />
+    </xml>
+    <xml name="read_group_conditional">
+        <conditional name="rg">
+            <param name="rg_selector" type="select" label="Set read groups information?" help="Specifying read group information can greatly simplify your downstream analyses by allowing combining multiple datasets.">
+                <option value="set">Set read groups (SAM/BAM specification)</option>
+                <option value="set_picard">Set read groups (Picard style)</option>
+                <option value="set_id_auto">Automatically assign ID using name of history item(s)</option>
+                <option value="do_not_set" selected="True">Do not set</option>
+            </param>
+            <when value="set_picard">
+                <expand macro="read_group_inputs_picard" />
+            </when>
+            <when value="set">
+                <expand macro="read_group_inputs_spec" />
+            </when>
+            <when value="set_id_auto">
+            </when>
+            <when value="do_not_set">
+            </when>
+        </conditional>
+    </xml>
+    <xml name="paired_end_options">
+        <conditional name="paired_options">
+            <param name="paired_options_selector" type="select" label="Do you want to set paired-end options?" help="See &quot;Alignment Options&quot; section of Help below for information">
+                <option value="no" selected="True">No</option>
+                <option value="yes">Yes</option>
+            </param>
+            <when value="yes">
+                <param argument="-I" type="integer" value="0" min="0" label="Set the minimum fragment length for valid paired-end alignments"
+                       help="E.g. if `-I 60` is specified and a paired-end alignment consists of two 20-bp alignments in the appropriate orientation with a 20-bp gap between them, that alignment is considered valid (as long as `-X` is also satisfied).  A 19-bp gap would not be valid in that case.  If trimming options `-3` or `-5` are also used, the `-I` constraint is applied with respect to the untrimmed mates. The larger the difference between `-I` and `-X`, the slower Bowtie 2 will run.  This is because larger differences bewteen `-I` and `-X` require that Bowtie 2 scan a larger window to determine if a concordant alignment exists. For typical fragment length ranges (200 to 400 nucleotides), Bowtie 2 is very efficient. Default=0"/>
+                <param argument="-X" type="integer" value="500" min="0" label="Set the maximum fragment length for valid paired-end alignments"
+                       help="E.g. if `-X 100` is specified and a paired-end alignment consists of two 20-bp alignments in the proper orientation with a 60-bp gap between them, that alignment is considered valid (as long as `-I` is also satisfied).  A 61-bp gap would not be valid in that case.  If trimming options `-3` or `-5` are also used, the `-X` constraint is applied with respect to the untrimmed mates, not the trimmed mates; Default=500"/>
+                <param name="fr_rf_ff" type="select" display="radio" label="Select the upstream/downstream mate orientations for a valid paired-end alignment against the forward reference strand"
+                       help="--fr, --rf, or --ff; E.g., if `--fr` is specified and there is a candidate paired-end alignment where mate 1 appears upstream of the reverse complement of mate 2 and the fragment length constraints (`-I` and `-X`) are met, that alignment is valid.  Also, if mate 2 appears upstream of the reverse complement of mate 1 and all other constraints are met, that too is valid. `--rf` likewise requires that an upstream mate1 be reverse-complemented and a downstream mate2 be forward-oriented. `--ff` requires both an upstream mate 1 and a downstream mate 2 to be forward-oriented; Default=--fr (appropriate for Illumina's Paired-end Sequencing Assay)">
+                    <option value="--fr" selected="True">--fr</option>
+                    <option value="--rf">--rf</option>
+                    <option value="--ff">--ff</option>
+                </param>
+                <param argument="--no-mixed" name="no_mixed" type="boolean" truevalue="--no-mixed" falsevalue="" checked="False" label="Disable no-mixed behavior" help="--no-mixed; By default, when `bowtie2` cannot find a concordant or discordant alignment for a pair, it then tries to find alignments for the individual mates; default=False"/>
+                <param argument="--no-discordant" name="no_discordant" type="boolean" truevalue="--no-discordant" falsevalue="" checked="False" label="Disable no-discordant behavior" help="--no-discordant; By default, `bowtie2` looks for discordant alignments if it cannot find any concordant alignments. A discordant alignment is an alignment where both mates align uniquely, but that does not satisfy the paired-end constraints (`--fr`/`--rf`/`--ff`, `-I`, `-X`); default=False"/>
+                <param argument="--dovetail" name="dovetail" type="boolean" truevalue="--dovetail" falsevalue="" checked="False" label="Allow mate dovetailing" help="--dovetail; If the mates `dovetail`, that is if one mate alignment extends past the beginning of the other such that the wrong mate begins upstream, consider that to be concordant. Default=False"/>
+                <param argument="--no-contain" name="no_contain" type="boolean" truevalue="--no-contain" falsevalue="" checked="False" label="Disallow one mate alignment to contain another" help="--no-contain; If one mate alignment contains the other, consider that to be non-concordant. Default=False"/>
+                <param argument="--no-overlap" name="no_overlap" type="boolean" truevalue="--no-overlap" falsevalue="" checked="False" label="Disallow mate alignments to overlap" help="--no-overlap; If one mate alignment overlaps the other at all, consider that to be non-concordant. Default=False"/>
+            </when>
+            <when value="no">
+                <!-- do nothing -->
+            </when>
+        </conditional>
+    </xml>
+    <xml name="align_unalign">
+        <param name="unaligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write unaligned reads (in fastq format) to separate file(s)" help="--un/--un-conc (possibly with -gz or -bz2); This triggers --un parameter for single reads and --un-conc for paired reads" />
+        <param name="aligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write aligned reads (in fastq format) to separate file(s)" help="--al/--al-conc (possibly with -gz or -bz2); This triggers --al parameter for single reads and --al-conc for paired reads" />
+    </xml>
+</macros>
--- a/bowtie2_wrapper.xml	Wed Apr 12 17:09:24 2017 -0400
+++ b/bowtie2_wrapper.xml	Thu Jun 01 06:46:49 2017 -0400
@@ -1,10 +1,10 @@
-<tool id="bowtie2" name="Bowtie2" version="2.3.0.1" profile="17.01">
+<tool id="bowtie2" name="Bowtie2" version="2.3.2.1" profile="17.01">
     <description>- map reads against reference genome</description>
     <macros>
-        <import>read_group_macros.xml</import>
+        <import>bowtie2_macros.xml</import>
     </macros>
     <requirements>
-        <requirement type="package" version="2.3.0">bowtie2</requirement>
+        <requirement type="package" version="2.3.2">bowtie2</requirement>
         <requirement type="package" version="1.3.1">samtools</requirement>
     </requirements>
     <version_command>bowtie2 --version</version_command>
@@ -66,6 +66,18 @@
                 #set read2 = "input_r.fastq"
             #end if
             ln -s '${library.input_1.reverse}' ${read2} &&
+
+        #else if str($library.type) == 'paired_interleaved':
+            #if $library.input_1.is_of_type("fastq.gz", "fastqsanger.gz"):
+                #set read1 = "input_il.fastq.gz"
+                #set compressed = "GZ"
+            #else if $library.input_1.is_of_type("fastq.bz2", "fastqsanger.bz2"):
+                #set read1 = "input_il.fastq.bz2"
+                #set compressed = "BZ2"
+            #else:
+                #set read1 = "input_il.fastq"
+            #end if
+            ln -s '${library.input_1}' ${read1} &&
         #else:
             #if $library.input_1.is_of_type("fastq.gz", "fastqsanger.gz"):
                 #set read1 = "input_f.fastq.gz"
@@ -110,6 +122,27 @@
                     --al '${output_aligned_reads_l}'
                 #end if
             #end if
+
+        #elif str( $library.type ) == "paired_interleaved":
+            --interleaved '${read1}'
+            #if str( $library.unaligned_file ) == "true":
+                #if $compressed == "GZ":
+                    --un-gz '${output_unaligned_reads_l}'
+                #else if $compressed == "BZ2":
+                    --un-bz2 '${output_unaligned_reads_l}'
+                #else:
+                    --un '${output_unaligned_reads_l}'
+                #end if
+            #end if
+            #if str( $library.aligned_file ) == "true":
+                #if $compressed == "GZ":
+                    --al-gz '${output_aligned_reads_l}'
+                #else if $compressed == "BZ2":
+                    --al-bz2 '${output_aligned_reads_l}'
+                #else:
+                    --al '${output_aligned_reads_l}'
+                #end if
+            #end if
         #else:
             -1 '${read1}'
             -2 '${read2}'
@@ -273,69 +306,36 @@
               <option value="single">Single-end</option>
               <option value="paired">Paired-end</option>
               <option value="paired_collection">Paired-end Dataset Collection</option>
+              <option value="paired_interleaved">Paired-end data from single interleaved dataset</option>
             </param>
 
             <when value="single">
                 <param name="input_1" format="fastqsanger,fastqsanger.gz,fastqsanger.bz2" type="data" label="FASTQ file" help="Must be of datatype &quot;fastqsanger&quot;" />
-                <param name="unaligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write unaligned reads (in fastq format) to separate file(s)" help="--un/--un-conc (possibly with -gz or -bz2); This triggers --un parameter for single reads and --un-conc for paired reads" />
-                <param name="aligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write aligned reads (in fastq format) to separate file(s)" help="--al/--al-conc (possibly with -gz or -bz2); This triggers --al parameter for single reads and --al-conc for paired reads" />
+
+                <expand macro="align_unalign" />
+
             </when>
             <when value="paired">
                 <param name="input_1" format="fastqsanger,fastqsanger.gz,fastqsanger.bz2" type="data" label="FASTQ file #1" help="Must be of datatype &quot;fastqsanger&quot;" />
                 <param name="input_2" format="fastqsanger,fastqsanger.gz,fastqsanger.bz2" type="data" label="FASTQ file #2" help="Must be of datatype &quot;fastqsanger&quot;" />
-                <param name="unaligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write unaligned reads (in fastq format) to separate file(s)" help="--un/--un-conc (possibly with -gz or -bz2); This triggers --un parameter for single reads and --un-conc for paired reads" />
-                <param name="aligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write aligned reads (in fastq format) to separate file(s)" help="--al/--al-conc (possibly with -gz or -bz2); This triggers --al parameter for single reads and --al-conc for paired reads" />
-                <conditional name="paired_options">
-                    <param name="paired_options_selector" type="select" label="Do you want to set paired-end options?" help="See &quot;Alignment Options&quot; section of Help below for information">
-                        <option value="no" selected="True">No</option>
-                        <option value="yes">Yes</option>
-                    </param>
-                    <when value="yes">
-                        <param name="I" type="integer" value="0" min="0" label="Set the minimum fragment length for valid paired-end alignments" help="-I/--minins;  E.g. if `-I 60` is specified and a paired-end alignment consists of two 20-bp alignments in the appropriate orientation with a 20-bp gap between them, that alignment is considered valid (as long as `-X` is also satisfied).  A 19-bp gap would not be valid in that case.  If trimming options `-3` or `-5` are also used, the `-I` constraint is applied with respect to the untrimmed mates. The larger the difference between `-I` and `-X`, the slower Bowtie 2 will run.  This is because larger differences bewteen `-I` and `-X` require that Bowtie 2 scan a larger window to determine if a concordant alignment exists. For typical fragment length ranges (200 to 400 nucleotides), Bowtie 2 is very efficient. Default=0"/>
-                        <param name="X" type="integer" value="500" min="0" label="Set the maximum fragment length for valid paired-end alignments" help="-X/--maxins; E.g. if `-X 100` is specified and a paired-end alignment consists of two 20-bp alignments in the proper orientation with a 60-bp gap between them, that alignment is considered valid (as long as `-I` is also satisfied).  A 61-bp gap would not be valid in that case.  If trimming options `-3` or `-5` are also used, the `-X` constraint is applied with respect to the untrimmed mates, not the trimmed mates; Default=500"/>
-                        <param name="fr_rf_ff" type="select" display="radio" label="Select the upstream/downstream mate orientations for a valid paired-end alignment against the forward reference strand" help="--fr, --rf, or --ff; E.g., if `--fr` is specified and there is a candidate paired-end alignment where mate 1 appears upstream of the reverse complement of mate 2 and the fragment length constraints (`-I` and `-X`) are met, that alignment is valid.  Also, if mate 2 appears upstream of the reverse complement of mate 1 and all other constraints are met, that too is valid. `--rf` likewise requires that an upstream mate1 be reverse-complemented and a downstream mate2 be forward-oriented. `--ff` requires both an upstream mate 1 and a downstream mate 2 to be forward-oriented; Default=--fr (appropriate for Illumina's Paired-end Sequencing Assay)">
-                            <option value="--fr" selected="True">--fr</option>
-                            <option value="--rf">--rf</option>
-                            <option value="--ff">--ff</option>
-                        </param>
-                        <param name="no_mixed" type="boolean" truevalue="--no-mixed" falsevalue="" checked="False" label="Disable no-mixed behavior" help="--no-mixed; By default, when `bowtie2` cannot find a concordant or discordant alignment for a pair, it then tries to find alignments for the individual mates; default=False"/>
-                        <param name="no_discordant" type="boolean" truevalue="--no-discordant" falsevalue="" checked="False" label="Disable no-discordant behavior" help="--no-discordant; By default, `bowtie2` looks for discordant alignments if it cannot find any concordant alignments. A discordant alignment is an alignment where both mates align uniquely, but that does not satisfy the paired-end constraints (`--fr`/`--rf`/`--ff`, `-I`, `-X`); default=False"/>
-                        <param name="dovetail" type="boolean" truevalue="--dovetail" falsevalue="" checked="False" label="Allow mate dovetailing" help="--dovetail; If the mates `dovetail`, that is if one mate alignment extends past the beginning of the other such that the wrong mate begins upstream, consider that to be concordant. Default=False"/>
-                        <param name="no_contain" type="boolean" truevalue="--no-contain" falsevalue="" checked="False" label="Disallow one mate alignment to contain another" help="--no-contain; If one mate alignment contains the other, consider that to be non-concordant. Default=False"/>
-                        <param name="no_overlap" type="boolean" truevalue="--no-overlap" falsevalue="" checked="False" label="Disallow mate alignments to overlap" help="--no-overlap; If one mate alignment overlaps the other at all, consider that to be non-concordant. Default=False"/>
-                    </when>
-                    <when value="no">
-                        <!-- do nothing -->
-                    </when>
-                </conditional>
+
+                <expand macro="align_unalign" />
+                <expand macro="paired_end_options" />
+
             </when>
             <when value="paired_collection">
                 <param name="input_1" format="fastqsanger,fastqsanger.gz,fastqsanger.bz2" type="data_collection" collection_type="paired" label="FASTQ Paired Dataset" help="Must be of datatype &quot;fastqsanger&quot;" />
-                <param name="unaligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write unaligned reads (in fastq format) to separate file(s)" help="--un/--un-conc (possibly with -gz or -bz2); This triggers --un parameter for single reads and --un-conc for paired reads" />
-                <param name="aligned_file" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Write aligned reads (in fastq format) to separate file(s)" help="--al/--al-conc (possibly with -gz or -bz2); This triggers --al parameter for single reads and --al-conc for paired reads" />
-                <conditional name="paired_options">
-                    <param name="paired_options_selector" type="select" label="Do you want to set paired-end options?" help="See &quot;Alignment Options&quot; section of Help below for information">
-                        <option value="no" selected="True">No</option>
-                        <option value="yes">Yes</option>
-                    </param>
-                    <when value="yes">
-                        <param name="I" type="integer" value="0" min="0" label="Set the minimum fragment length for valid paired-end alignments" help="-I/--minins;  E.g. if `-I 60` is specified and a paired-end alignment consists of two 20-bp alignments in the appropriate orientation with a 20-bp gap between them, that alignment is considered valid (as long as `-X` is also satisfied).  A 19-bp gap would not be valid in that case.  If trimming options `-3` or `-5` are also used, the `-I` constraint is applied with respect to the untrimmed mates. The larger the difference between `-I` and `-X`, the slower Bowtie 2 will run.  This is because larger differences bewteen `-I` and `-X` require that Bowtie 2 scan a larger window to determine if a concordant alignment exists. For typical fragment length ranges (200 to 400 nucleotides), Bowtie 2 is very efficient. Default=0"/>
-                        <param name="X" type="integer" value="500" min="0" label="Set the maximum fragment length for valid paired-end alignments" help="-X/--maxins; E.g. if `-X 100` is specified and a paired-end alignment consists of two 20-bp alignments in the proper orientation with a 60-bp gap between them, that alignment is considered valid (as long as `-I` is also satisfied).  A 61-bp gap would not be valid in that case.  If trimming options `-3` or `-5` are also used, the `-X` constraint is applied with respect to the untrimmed mates, not the trimmed mates; Default=500"/>
-                        <param name="fr_rf_ff" type="select" display="radio" label="Select the upstream/downstream mate orientations for a valid paired-end alignment against the forward reference strand" help="--fr, --rf, or --ff; E.g., if `--fr` is specified and there is a candidate paired-end alignment where mate 1 appears upstream of the reverse complement of mate 2 and the fragment length constraints (`-I` and `-X`) are met, that alignment is valid.  Also, if mate 2 appears upstream of the reverse complement of mate 1 and all other constraints are met, that too is valid. `--rf` likewise requires that an upstream mate1 be reverse-complemented and a downstream mate2 be forward-oriented. `--ff` requires both an upstream mate 1 and a downstream mate 2 to be forward-oriented; Default=--fr (appropriate for Illumina's Paired-end Sequencing Assay)">
-                            <option value="--fr" selected="True">--fr</option>
-                            <option value="--rf">--rf</option>
-                            <option value="--ff">--ff</option>
-                        </param>
-                        <param name="no_mixed" type="boolean" truevalue="--no-mixed" falsevalue="" checked="False" label="Disable no-mixed behavior" help="--no-mixed; By default, when `bowtie2` cannot find a concordant or discordant alignment for a pair, it then tries to find alignments for the individual mates; default=False"/>
-                        <param name="no_discordant" type="boolean" truevalue="--no-discordant" falsevalue="" checked="False" label="Disable no-discordant behavior" help="--no-discordant; By default, `bowtie2` looks for discordant alignments if it cannot find any concordant alignments. A discordant alignment is an alignment where both mates align uniquely, but that does not satisfy the paired-end constraints (`--fr`/`--rf`/`--ff`, `-I`, `-X`); default=False"/>
-                        <param name="dovetail" type="boolean" truevalue="--dovetail" falsevalue="" checked="False" label="Allow mate dovetailing" help="--dovetail; If the mates `dovetail`, that is if one mate alignment extends past the beginning of the other such that the wrong mate begins upstream, consider that to be concordant. Default=False"/>
-                        <param name="no_contain" type="boolean" truevalue="--no-contain" falsevalue="" checked="False" label="Disallow one mate alignment to contain another" help="--no-contain; If one mate alignment contains the other, consider that to be non-concordant. Default=False"/>
-                        <param name="no_overlap" type="boolean" truevalue="--no-overlap" falsevalue="" checked="False" label="Disallow mate alignments to overlap" help="--no-overlap; If one mate alignment overlaps the other at all, consider that to be non-concordant. Default=False"/>
-                    </when>
-                    <when value="no">
-                        <!-- do nothing -->
-                    </when>
-                </conditional>
+
+                <expand macro="align_unalign" />
+                <expand macro="paired_end_options" />
+
+            </when>
+            <when value="paired_interleaved">
+                <param name="input_1" format="fastqsanger,fastqsanger.gz,fastqsanger.bz2" type="data" label="Interleaved FASTQ file" help="Must be of datatype &quot;fastqsanger&quot;. --interleaved"/>
+               
+                <expand macro="align_unalign" />
+                <expand macro="paired_end_options" />
+
             </when>
         </conditional>
 
@@ -648,7 +648,6 @@
         <test>
             <!-- basic test on single paired default run -->
             <param name="type" value="paired"/>
-            <param name="selection" value="no"/>
             <param name="paired_options_selector" value="no"/>
             <param name="unaligned_file" value="false"/>
             <param name="analysis_type_selector" value="simple"/>
@@ -661,7 +660,6 @@
         <test>
             <!-- basic test on single paired default run -->
             <param name="type" value="paired"/>
-            <param name="selection" value="no"/>
             <param name="paired_options_selector" value="no"/>
             <param name="unaligned_file" value="false"/>
             <param name="analysis_type_selector" value="simple"/>
@@ -677,7 +675,6 @@
         <test>
             <!-- basic test on single paired default run with stats-->
             <param name="type" value="paired"/>
-            <param name="selection" value="no"/>
             <param name="paired_options_selector" value="no"/>
             <param name="unaligned_file" value="false"/>
             <param name="analysis_type_selector" value="simple"/>
@@ -687,12 +684,29 @@
             <param name="own_file" value="bowtie2-ref.fasta" />
             <param name="save_mapping_stats" value="true" />
             <output name="output" file="bowtie2-test1.bam" ftype="bam" lines_diff="2"/>
-            <output name="mapping_stats" file="bowtie2-stats.out" ftype="txt"/>
+            <output name="mapping_stats">
+                <assert_contents>
+                    <has_text text="of these" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <!-- basic test on interleaved paired default run -->
+            <param name="type" value="paired_interleaved"/>
+            <!-- <param name="paired_options_selector" value="no"/> -->
+            <param name="unaligned_file" value="false"/>
+            <param name="analysis_type_selector" value="simple"/>
+            <param name="rg_selector" value="set"/>
+            <param name="ID" value="rg1"/>
+            <param name="PL" value="CAPILLARY"/>
+            <param name="source" value="history" />
+            <param name="input_1" value="bowtie2-fq_il.fq" ftype="fastqsanger"/>
+            <param name="own_file" value="bowtie2-ref.fasta" />
+            <output name="output" file="bowtie2-test_il.bam" ftype="bam" lines_diff="2"/>
         </test>
         <test>
             <!-- test fastqsanger.gz input -->
             <param name="type" value="paired"/>
-            <param name="selection" value="no"/>
             <param name="paired_options_selector" value="no"/>
             <param name="unaligned_file" value="false"/>
             <param name="analysis_type_selector" value="simple"/>
@@ -705,7 +719,6 @@
         <test>
             <!-- test fastqsanger.bz2 input -->
             <param name="type" value="paired"/>
-            <param name="selection" value="no"/>
             <param name="paired_options_selector" value="no"/>
             <param name="unaligned_file" value="false"/>
             <param name="analysis_type_selector" value="simple"/>
@@ -754,12 +767,15 @@
 
 **Inputs**
 
-Bowtie 2 accepts files in Sanger FASTQ format (single or pair-end). Use the FASTQ Groomer to prepare your files.
+Bowtie 2 accepts files in Sanger FASTQ format (single or paired-end). Paired-end data can represented as two individual (forward and reverse) datasets, as well as a single interleaved dataset (see an example at the end of the help section).
 
 ------
 
 **Input options**::
 
+    --interleaved
+            Reads interleaved FASTQ files where the first two records (8 lines) represent a mate pair.
+
     -s/--skip <int>
             Skip (i.e. do not align) the first `<int>` reads or pairs in the input.
 
@@ -1137,6 +1153,57 @@
             but might be more appropriate in situations where the input consists of many
             identical reads.
 
+-----
+
+
+**Paired-end (and mate-pair) data in fastq format**
+
+Paired end datasets can be represented as two individual datasets:
+
+First dataset::
+
+ @1/1
+ AGGGATGTGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTA
+ +
+ EGGEGGGDFGEEEAEECGDEGGFEEGEFGBEEDDECFEFDD@CDD<ED
+ @2/1
+ AGGGATGTGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTA
+ +
+ HHHHHHEGFHEEFEEHEEHHGGEGGGGEFGFGGGGHHHHFBEEEEEFG
+
+Second dataset::
+
+ @1/2
+ CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAAC
+ +
+ GHHHDFDFGFGEGFBGEGGEGEGGGHGFGHFHFHHHHHHHEF?EFEFF
+ @2/2
+ CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAAC
+ +
+ HHHHHHHHHHHHHGHHHHHHGHHHHHHHHHHHFHHHFHHHHHHHHHHH
+
+Or a single *interleaved* dataset::
+
+ @1/1
+ AGGGATGTGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTA
+ +
+ EGGEGGGDFGEEEAEECGDEGGFEEGEFGBEEDDECFEFDD@CDD<ED
+ @1/2
+ CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAAC
+ +
+ GHHHDFDFGFGEGFBGEGGEGEGGGHGFGHFHFHHHHHHHEF?EFEFF
+ @2/1
+ AGGGATGTGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTAGGGTTA
+ +
+ HHHHHHEGFHEEFEEHEEHHGGEGGGGEFGFGGGGHHHHFBEEEEEFG
+ @2/2
+ CCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAACCCTAAC
+ +
+ HHHHHHHHHHHHHGHHHHHHGHHHHHHHHHHHFHHHFHHHHHHHHHHH
+
+
+
+
     ]]></help>
     <citations>
     <citation type="doi">10.1186/gb-2009-10-3-r25</citation>
--- a/read_group_macros.xml	Wed Apr 12 17:09:24 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-<macros>
-    <!-- Import this at the top of your command block and then
-         define rg_auto_name. -->
-    <token name="@define_read_group_helpers@">
-#def identifier_or_name($input1)
-    #if hasattr($input1, 'element_identifier')
-        #return $input1.element_identifier
-    #else
-        #return $input1.name.rstrip('.gz').rstrip('.fastq').rstrip('.fq')
-    #end if
-#end def
-
-#def clean(name)
-    #import re
-    #set $name_clean = re.sub('[^\w\-_\.]', '_', $name)
-    #return $name_clean
-#end def
-
-#def read_group_name_default($input1, $input2=None)
-    #if $input2 is None
-        #return $clean($identifier_or_name($input1))
-    #else
-        #import itertools
-        #set $input_name1 = $clean($identifier_or_name($input1))
-        #set $input_name2 = $clean($identifier_or_name($input2))
-        #set $common_prefix = ''.join([c[0] for c in itertools.takewhile(lambda x: all(x[0] == y for y in x), itertools.izip(*[$input_name1, $input_name2]))])
-        #if len($common_prefix) > 3
-            #return $common_prefix
-        #else
-            #return $input_name1
-        #end if
-    #end if
-#end def
-
-#def format_read_group(prefix, value, quote='', arg='')
-    #if $value
-        #return $arg + $quote + $prefix + $value + $quote
-    #else
-        #return ''
-    #end if
-#end def
-
-#def rg_param(name)
-    #if $varExists("rg")
-        #return $rg.get($name, None)
-    #else
-        #return $getVar($name, None)
-    #end if
-#end def
-
-#set $use_rg = True
-    </token>
-    <!-- preconditions use_rg and rg_auto_name have been
-         defined.
-    -->
-    <token name="@set_read_group_vars@">
-#if $use_rg
-    #if $rg_param('read_group_id_conditional') is None
-        #set $rg_id = $rg_auto_name
-    #elif $rg_param('read_group_id_conditional').do_auto_name
-        #set $rg_id = $rg_auto_name
-    #else
-        #set $rg_id = str($rg_param('read_group_id_conditional').ID)
-    #end if
-
-    #if $rg_param('read_group_sm_conditional') is None
-        #set $rg_sm = ''
-    #elif $rg_param('read_group_sm_conditional').do_auto_name
-        #set $rg_sm = $rg_auto_name
-    #else
-        #set $rg_sm = str($rg_param('read_group_sm_conditional').SM)
-    #end if
-
-    #if $rg_param('PL')
-        #set $rg_pl = str($rg_param('PL'))
-    #else
-        #set $rg_pl = ''
-    #end if
-
-    #if $rg_param('read_group_lb_conditional') is None
-        #set $rg_lb = ''
-    #elif $rg_param('read_group_lb_conditional').do_auto_name
-        #set $rg_lb = $rg_auto_name
-    #else
-        #set $rg_lb = str($rg_param('read_group_lb_conditional').LB)
-    #end if
-
-    #if $rg_param('CN')
-        #set $rg_cn = str($rg_param('CN'))
-    #else
-        #set $rg_cn = ''
-    #end if
-
-    #if $rg_param("DS")
-        #set $rg_ds = str($rg_param("DS"))
-    #else
-        #set $rg_ds = ''
-    #end if
-
-    #if $rg_param("DT")
-        #set $rg_dt = str($rg_param("DT"))
-    #else
-        #set $rg_dt = ''
-    #end if
-
-    #if $rg_param("FO")
-        #set $rg_fo = str($rg_param("FO"))
-    #else
-        #set $rg_fo = ''
-    #end if
-
-    #if $rg_param("KS")
-        #set $rg_ks = str($rg_param("KS"))
-    #else
-        #set $rg_ks = ''
-    #end if
-
-    #if $rg_param("PG")
-        #set $rg_pg = str($rg_param("PG"))
-    #else
-        #set $rg_pg = ''
-    #end if
-
-    #if $rg_param("PI") != None
-        #set $rg_pi = str($rg_param("PI"))
-    #else
-        #set $rg_pi = ''
-    #end if
-
-    #if $rg_param("PU")
-        #set $rg_pu = str($rg_param("PU"))
-    #else
-        #set $rg_pu = ''
-    #end if
-#end if
-    </token>
-    <token name="@set_use_rg_var@">
-#set $use_rg = str($rg.rg_selector) != "do_not_set"
-    </token>
-    <xml name="read_group_auto_name_conditional">
-        <param name="do_auto_name" type="boolean" label="Auto-assign" help="Use dataset name or collection information to automatically assign this value" checked="no" />
-        <when value="true">
-        </when>
-        <when value="false">
-            <yield />
-        </when>
-    </xml>
-    <xml name="read_group_id_param">
-        <param name="ID" type="text" value="" label="Read group identifier (ID)" help="This value must be unique among multiple samples in your experiment" optional="false">
-            <validator type="empty_field" />
-        </param>
-    </xml>
-    <xml name="read_group_id_conditional">
-        <conditional name="read_group_id_conditional">
-            <expand macro="read_group_auto_name_conditional">
-                <expand macro="read_group_id_param" />
-            </expand>
-        </conditional>
-    </xml>
-    <xml name="read_group_sm_param">
-        <param name="SM" type="text" value="" label="Read group sample name (SM)" help="This value should be descriptive. Use pool name where a pool is being sequenced" />
-    </xml>
-    <xml name="read_group_sm_conditional">
-        <conditional name="read_group_sm_conditional">
-            <expand macro="read_group_auto_name_conditional">
-                <expand macro="read_group_sm_param" />
-            </expand>
-        </conditional>
-    </xml>
-    <!-- Above SM param is optional (for SAM/BAM spec, this is required
-         as per Picard.
-    -->
-    <xml name="read_group_sm_param_required">
-        <param name="SM" type="text" value="" label="Read group sample name (SM)" optional="false" help="This value should be descriptive. Use pool name where a pool is being sequenced">
-            <validator type="empty_field" />
-        </param>
-    </xml>
-    <xml name="read_group_sm_required_conditional">
-        <conditional name="read_group_sm_conditional">
-            <expand macro="read_group_auto_name_conditional">
-                <expand macro="read_group_sm_param" />
-            </expand>
-        </conditional>
-    </xml>
-    <xml name="read_group_pl_param">
-        <param name="PL" type="select" label="Platform/technology used to produce the reads (PL)">
-            <option value="CAPILLARY">CAPILLARY</option>
-            <option value="LS454">LS454</option>
-            <option selected="True" value="ILLUMINA">ILLUMINA</option>
-            <option value="SOLID">SOLID</option>
-            <option value="HELICOS">HELICOS</option>
-            <option value="IONTORRENT">IONTORRENT</option>
-            <option value="PACBIO">PACBIO</option>
-        </param>
-    </xml>
-    <xml name="read_group_lb_param">
-        <param name="LB" type="text" label="Library name (LB)" optional="true" />
-    </xml>
-    <xml name="read_group_lb_conditional">
-        <conditional name="read_group_lb_conditional">
-            <expand macro="read_group_auto_name_conditional">
-                <expand macro="read_group_lb_param" />
-            </expand>
-        </conditional>
-    </xml>
-    <xml name="read_group_lb_required_param">
-        <param name="LB" type="text" label="Library name (LB)" optional="false">
-            <validator type="empty_field" />
-        </param>
-    </xml>
-    <xml name="read_group_lb_required_conditional">
-        <conditional name="read_group_lb_conditional">
-            <expand macro="read_group_auto_name_conditional">
-                <expand macro="read_group_lb_required_param" />
-            </expand>
-        </conditional>
-    </xml>
-    <xml name="read_group_cn_param">
-        <param name="CN" type="text" label="Sequencing center that produced the read (CN)" />
-    </xml>
-    <xml name="read_group_ds_param">
-        <param name="DS" type="text" label="Description (DS)" />
-    </xml>
-    <xml name="read_group_dt_param">
-        <param name="DT" type="text" label="Date that run was produced (DT)" help="ISO8601 format date or date/time, like YYYY-MM-DD" />
-    </xml>
-    <xml name="read_group_fo_param">
-        <param name="FO" type="text" optional="true" label="Flow order (FO)" help="The array of nucleotide bases that correspond to the nucleotides used for each flow of each read. Multi-base flows are encoded in IUPAC format, and non-nucleotide flows by various other characters. Format: /\*|[ACMGRSVTWYHKDBN]+/">
-          <validator type="regex" message="Invalid flow order">\*|[ACMGRSVTWYHKDBN]+$</validator>
-        </param>
-    </xml>
-    <xml name="read_group_ks_param">
-        <param name="KS" type="text" label="The array of nucleotide bases that correspond to the key sequence of each read (KS)" />
-    </xml>
-    <xml name="read_group_pg_param">
-        <param name="PG" type="text" label="Programs used for processing the read group (PG)" />
-    </xml>
-    <xml name="read_group_pi_param">
-        <param name="PI" type="integer" optional="true" label="Predicted median insert size (PI)" />
-    </xml>
-    <xml name="read_group_pu_param">
-        <param name="PU" type="text" label="Platform unit (PU)" help="Unique identifier (e.g. flowcell-barcode.lane for Illumina or slide for SOLiD)" optional="True" />
-    </xml>
-    <xml name="read_group_pu_required_param">
-        <param name="PU" type="text" label="Platform unit (PU)" help="Unique identifier (e.g. flowcell-barcode.lane for Illumina or slide for SOLiD)" optional="False" />
-    </xml>
-    <!-- Only ID is required - all groups available -->
-    <xml name="read_group_inputs_spec">
-        <expand macro="read_group_id_conditional" />
-        <expand macro="read_group_sm_conditional" />
-        <expand macro="read_group_pl_param" />
-        <expand macro="read_group_lb_conditional" />
-        <expand macro="read_group_cn_param" />
-        <expand macro="read_group_ds_param" />
-        <expand macro="read_group_dt_param" />
-        <expand macro="read_group_fo_param" />
-        <expand macro="read_group_ks_param" />
-        <expand macro="read_group_pg_param" />
-        <expand macro="read_group_pi_param" />
-        <expand macro="read_group_pu_param" />
-    </xml>
-    <!-- ID, SM, LB, PU, PL all required - not ks, pg, or fo params. -->
-    <xml name="read_group_inputs_picard">
-        <expand macro="read_group_id_conditional" />
-        <expand macro="read_group_sm_required_conditional" />
-        <expand macro="read_group_lb_required_conditional" />
-        <expand macro="read_group_pl_param" />
-        <expand macro="read_group_pu_required_param" />
-        <expand macro="read_group_cn_param" />
-        <expand macro="read_group_ds_param" />
-        <expand macro="read_group_pi_param" />
-        <expand macro="read_group_dt_param" />
-    </xml>
-    <xml name="read_group_conditional">
-        <conditional name="rg">
-            <param name="rg_selector" type="select" label="Set read groups information?" help="Specifying read group information can greatly simplify your downstream analyses by allowing combining multiple datasets.">
-                <option value="set">Set read groups (SAM/BAM specification)</option>
-                <option value="set_picard">Set read groups (Picard style)</option>
-                <option value="set_id_auto">Automatically assign ID</option>
-                <option value="do_not_set" selected="True">Do not set</option>
-            </param>
-            <when value="set_picard">
-                <expand macro="read_group_inputs_picard" />
-            </when>
-            <when value="set">
-                <expand macro="read_group_inputs_spec" />
-            </when>
-            <when value="set_id_auto">
-            </when>
-            <when value="do_not_set">
-            </when>
-        </conditional>
-    </xml>
-</macros>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/bowtie2-fq_il.fq	Thu Jun 01 06:46:49 2017 -0400
@@ -0,0 +1,24 @@
+@M01368:8:000000000-A3GHV:1:1101:6911:8255/1
+ATCTGGTTCCTACTTCAGGGCCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATT
++
+BCCCCFFFFFFFGGGGGGGGGGGHHHHGHGHHHHHHHHHGGGGGGHHHHGHHHHHHHHHHGHHHHHHGGHGGHHHGHHHHFHHGHHHHHHHHHGHEHEFFGHHEGGCEFGGFHHHBGHHGHHHHGHFHHHGHGHGHGGCDFDDACGGGGGGGAAFFFFFFFFFBAFFFFFB;FFFFFFADDFFFFFFFFFFEFFFFFFFFFFBFFFFFFFFFFFFFFEFFFFFFFFBFEFFFFEFE;DFFFDFBFF/9BFB
+@M01368:8:000000000-A3GHV:1:1101:6911:8255/2
+TCGCCTTACCGCTACTCACCCACGGCGGCCATCAGCCGATACTAAGTTTGGGGTATGGTGGGGGGGATAATGAATTAGGTTGTGGGGGAGGGTTTGTGGTTGAGAGAAACACAAAAAACAATCTTATATATGGGTAGTCGTTTTGTATTGGTTTTTTGTTTTGTTTGTGTTTTGAGTGTCGGTTTAGTTCGGTGTACTAGGGGGGGTGGATGGGGTCGGCTGGTGAGGGGGTCTTAGTGTATTGAGTGTGG
++
+1>11111@11111A111A100000000////011110//>>/12@1@22B/////1@>21/>>/-----9/;////9////--;-;-;-----;--------9/-/-///9-;-------9//////9/////-//-/9-;-;9--/////99-;--9-:-;----/---/-----////---9-/////--;A-//////---------9/-----;-----/-/-----;--;//////////9;///-
+@M01368:8:000000000-A3GHV:1:1101:14518:9998/1
+GTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGAT
++
+AAAAAFFFFFFFGGGGGGGGGGHGGHHHHGHHHHHHHGCGHHHHHHHHHHHHHHHGGGGGHHHHHHHHHGHHGFHFE5BGEEHFGGGHHHHHHHHFBHHGGGGFHGHHFGHHHHGHHHHHHGEGGGGFHFHGEGHHGGCDGDGHGGGDGGHGGCGGGHGHHH/ACDG?.1FGCDCCGCA.CC@CDCHFHGFFGGGEBFGAB//CEFBFGG.:;D;;A0AFFFFFB..:@ABFF//;BFFFFFBF/9D:A//
+@M01368:8:000000000-A3GHV:1:1101:14518:9998/2
+CATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAA
++
+CCCCCFCCCCCFGGGGGGGGGGHHHHHHHHHHHHHHHHGFHHHHGGGGGHGFHHHHHHHHHHHHHHHHHHHGHGGEHGGGGCGGGHHGGCGGGGGHHGHHHGGGGGGGG.BFFFGAGADFGAFDGFGGCFFF;DDFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFF09FFFE00;BE@;DABBFFFFFBBFB00;F:9;FFBFFF9BFFFFFFFFFFFFF90/::BFFFBF0
+@M01368:8:000000000-A3GHV:1:1101:18422:19051/1
+GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
++
+CCCCCFDDDDDFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHFHHHHGGGGHHHHHHHHHGHHHHHHHHHHHHGGHGGHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHGCGGGHHHHHHHHHHHHHHHHHHHHHHGFDHGFHCFGGGGFGGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;FFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBFFFFFFFFFF:FFF.
+@M01368:8:000000000-A3GHV:1:1101:18422:19051/2
+CTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGG
++
+BCCCCFFCFFFFGGGGGGGGGGHHHGHHHHHHHHHHHHHHHHGGGGHHHHHHHHEHHHHHHHGGHHGGHGGHHHHHHHGHGGHHHGGGGGHGHHHHGGGHFHFHHHHHGGGGGHBFFCGDHHHGGGGGGHGGGGGGHHGCGGGFGHHBGGGGGFFFHEGGGGGCDCCE@EFGHHHHFHEGHGFFHHGB;ECBFGGGEFEFFGF0AFGFGFFG.;;DFFFFFFFFFF090BFFFE?FEFBBFBFFFB990BF
\ No newline at end of file
--- a/test-data/bowtie2-stats.out	Wed Apr 12 17:09:24 2017 -0400
+++ b/test-data/bowtie2-stats.out	Thu Jun 01 06:46:49 2017 -0400
@@ -1,3 +1,5 @@
+bowtie2-align-s(30685,0x7fffceb5b3c0) malloc: *** malloc_zone_unregister() failed for 0x7fffceb51000
+bowtie2-align-s(30686,0x7fffceb5b3c0) malloc: *** malloc_zone_unregister() failed for 0x7fffceb51000
 100 reads; of these:
   100 (100.00%) were paired; of these:
     97 (97.00%) aligned concordantly 0 times
Binary file test-data/bowtie2-test1.bam has changed
Binary file test-data/bowtie2-test2.bam has changed
Binary file test-data/bowtie2-test_il.bam has changed