changeset 0:8dd8e89c0603 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/extract_genomic_dna commit b'67cff25a50ba173b0468819204d0999496f68ea9'
author iuc
date Tue, 19 Jan 2016 09:34:23 -0500
parents
children 9af3f57e50b9
files extract_genomic_dna.py extract_genomic_dna.xml extract_genomic_dna_utils.py test-data/1.bed test-data/cufflinks_out1.gtf test-data/droPer1.bed test-data/extract_genomic_dna_out1.fasta test-data/extract_genomic_dna_out2.fasta test-data/extract_genomic_dna_out3.interval test-data/extract_genomic_dna_out4.gff test-data/extract_genomic_dna_out5.fasta test-data/extract_genomic_dna_out6.fasta test-data/extract_genomic_dna_out7.fasta test-data/gff_filter_by_attribute_out1.gff test-data/tophat_in1.fasta tool_data_table_conf.xml.sample tool_dependencies.xml twobit.loc.sample
diffstat 18 files changed, 1128 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extract_genomic_dna.py	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+import argparse
+import os
+
+import extract_genomic_dna_utils as egdu
+import bx.seq.nib
+import bx.seq.twobit
+from bx.intervals.io import Header, Comment
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument('--input_format', dest='input_format', help="Input dataset format")
+parser.add_argument('--input', dest='input', help="Input dataset")
+parser.add_argument('--genome', dest='genome', help="Input dataset genome build")
+parser.add_argument('--interpret_features', dest='interpret_features', default=None, help="Interpret features if input format is gff")
+parser.add_argument('--columns', dest='columns', help="Columns to use in input file")
+parser.add_argument('--reference_genome_source', dest='reference_genome_source', help="Source of reference genome file")
+parser.add_argument('--reference_genome', dest='reference_genome', help="Reference genome file")
+parser.add_argument('--output_format', dest='output_format', help="Output format")
+parser.add_argument('--output', dest='output', help="Output dataset")
+args = parser.parse_args()
+
+input_is_gff = args.input_format == 'gff'
+interpret_features = input_is_gff and args.interpret_features == "yes"
+if len(args.columns.split(',')) == 5:
+    # Bed file.
+    chrom_col, start_col, end_col, strand_col, name_col = egdu.parse_cols_arg(args.columns)
+else:
+    # Gff file.
+    chrom_col, start_col, end_col, strand_col = egdu.parse_cols_arg(args.columns)
+    name_col = False
+
+if args.reference_genome_source == "history":
+    seq_path = egdu.convert_to_twobit(args.reference_genome)
+else:
+    seq_path = args.reference_genome
+seq_dir = os.path.split(seq_path)[0]
+
+includes_strand_col = strand_col >= 0
+strand = None
+nibs = {}
+skipped_lines = 0
+first_invalid_line = 0
+invalid_lines = []
+warnings = []
+warning = ''
+twobitfile = None
+line_count = 1
+file_iterator = open(args.input)
+if interpret_features:
+    file_iterator = egdu.GFFReaderWrapper(file_iterator, fix_strand=False)
+out = open(args.output, 'wt')
+
+for feature in file_iterator:
+    # Ignore comments, headers.
+    if isinstance(feature, (Header, Comment)):
+        line_count += 1
+        continue
+    name = ""
+    if interpret_features:
+        # Processing features.
+        egdu.convert_gff_coords_to_bed(feature)
+        chrom = feature.chrom
+        start = feature.start
+        end = feature.end
+        strand = feature.strand
+    else:
+        # Processing lines, either interval or GFF format.
+        line = feature.rstrip('\r\n')
+        if line and not line.startswith("#"):
+            fields = line.split('\t')
+            try:
+                chrom = fields[chrom_col]
+                start = int(fields[start_col])
+                end = int(fields[end_col])
+                if name_col:
+                    name = fields[name_col]
+                if input_is_gff:
+                    start, end = egdu.convert_gff_coords_to_bed([start, end])
+                if includes_strand_col:
+                    strand = fields[strand_col]
+            except:
+                warning = "Invalid chrom, start or end column values. "
+                warnings.append(warning)
+                if not invalid_lines:
+                    invalid_lines = egdu.get_lines(feature)
+                    first_invalid_line = line_count
+                skipped_lines += len(invalid_lines)
+                continue
+            if start > end:
+                warning = "Invalid interval, start '%d' > end '%d'.  " % (start, end)
+                warnings.append(warning)
+                if not invalid_lines:
+                    invalid_lines = egdu.get_lines(feature)
+                    first_invalid_line = line_count
+                skipped_lines += len(invalid_lines)
+                continue
+            if strand not in ['+', '-']:
+                strand = '+'
+            sequence = ''
+        else:
+            continue
+    # Open sequence file and get sequence for feature/interval.
+    if os.path.exists("%s/%s.nib" % (seq_dir, chrom)):
+        if chrom in nibs:
+            nib = nibs[chrom]
+        else:
+            nibs[chrom] = nib = bx.seq.nib.NibFile(open("%s/%s.nib" % (seq_path, chrom)))
+        try:
+            sequence = nib.get(start, end - start)
+        except Exception, e:
+            warning = "Unable to fetch the sequence from '%d' to '%d' for build '%s'. " % (start, end - start, args.genome)
+            warnings.append(warning)
+            if not invalid_lines:
+                invalid_lines = egdu.get_lines(feature)
+                first_invalid_line = line_count
+            skipped_lines += len(invalid_lines)
+            continue
+    elif os.path.isfile(seq_path):
+        if not(twobitfile):
+            twobitfile = bx.seq.twobit.TwoBitFile(open(seq_path))
+        try:
+            if interpret_features:
+                # Create sequence from intervals within a feature.
+                sequence = ''
+                for interval in feature.intervals:
+                    sequence += twobitfile[interval.chrom][interval.start:interval.end]
+            else:
+                sequence = twobitfile[chrom][start:end]
+        except:
+            warning = "Unable to fetch the sequence from '%d' to '%d' for chrom '%s'. " % (start, end - start, chrom)
+            warnings.append(warning)
+            if not invalid_lines:
+                invalid_lines = egdu.get_lines(feature)
+                first_invalid_line = line_count
+            skipped_lines += len(invalid_lines)
+            continue
+    else:
+        warning = "Chromosome by name '%s' was not found for build '%s'. " % (chrom, args.genome)
+        warnings.append(warning)
+        if not invalid_lines:
+            invalid_lines = egdu.get_lines(feature)
+            first_invalid_line = line_count
+        skipped_lines += len(invalid_lines)
+        continue
+    if sequence == '':
+        warning = "Chrom: '%s', start: '%d', end: '%d' is either invalid or not present in build '%s'. " % (chrom, start, end, args.genome)
+        warnings.append(warning)
+        if not invalid_lines:
+            invalid_lines = egdu.get_lines(feature)
+            first_invalid_line = line_count
+        skipped_lines += len(invalid_lines)
+        continue
+    if includes_strand_col and strand == "-":
+        sequence = egdu.reverse_complement(sequence)
+    if args.output_format == "fasta":
+        l = len(sequence)
+        c = 0
+        if input_is_gff:
+            start, end = egdu.convert_bed_coords_to_gff([start, end])
+        fields = [args.genome, str(chrom), str(start), str(end), strand]
+        meta_data = "_".join(fields)
+        if name.strip():
+            out.write(">%s %s\n" % (meta_data, name))
+        else:
+            out.write(">%s\n" % meta_data)
+        while c < l:
+            b = min(c + 50, l)
+            out.write("%s\n" % str(sequence[c:b]))
+            c = b
+    else:
+        # output_format == "interval".
+        if interpret_features:
+            meta_data = "\t".join([feature.chrom,
+                                   "galaxy_extract_genomic_dna",
+                                   "interval",
+                                   str(feature.start),
+                                   str(feature.end),
+                                   feature.score,
+                                   feature.strand,
+                                   ".",
+                                   egdu.gff_attributes_to_str(feature.attributes, "GTF")])
+        else:
+            # Where is fields being set here?
+            meta_data = "\t".join(fields)
+        if input_is_gff:
+            format_str = "%s seq \"%s\";\n"
+        else:
+            format_str = "%s\t%s\n"
+        out.write(format_str % (meta_data, str(sequence)))
+    # Update line count.
+    if isinstance(feature, egdu.GFFFeature):
+        line_count += len(feature.intervals)
+    else:
+        line_count += 1
+out.close()
+
+if warnings:
+    warn_msg = "%d warnings, 1st is: " % len(warnings)
+    warn_msg += warnings[0]
+    print warn_msg
+if skipped_lines:
+    # Error message includes up to the first 10 skipped lines.
+    print 'Skipped %d invalid lines, 1st is #%d, "%s"' % (skipped_lines, first_invalid_line, '\n'.join(invalid_lines[:10]))
+
+if args.reference_genome_source == "history":
+    os.remove(seq_path)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extract_genomic_dna.xml	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,202 @@
+<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="3.0.0">
+    <description>using coordinates from assembled/unassembled genomes</description>
+    <requirements>
+        <requirement type="package" version="0.7.1">bx-python</requirement>
+        <requirement type="package" version="35x1">faToTwoBit</requirement>
+    </requirements>
+    <command>
+        <![CDATA[
+            #set genome = $input.metadata.dbkey
+            #set datatype = $input.datatype
+            mkdir -p output_dir &&
+            python $__tool_directory__/extract_genomic_dna.py
+            --input "$input"
+            --genome "$genome"
+            #if $input.is_of_type("gff"):
+                --input_format "gff"
+                --columns "1,4,5,7"
+                --interpret_features $interpret_features
+            #else:
+                --input_format "interval"
+                --columns "${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol},${input.metadata.nameCol}"
+            #end if
+            --reference_genome_source $reference_genome_cond.reference_genome_source
+            #if str($reference_genome_cond.reference_genome_source) == "cached"
+                --reference_genome $reference_genome_cond.reference_genome.fields.path
+            #else:
+                --reference_genome $reference_genome_cond.reference_genome
+            #end if
+            --output_format $output_format
+            --output $output
+        ]]>
+    </command>
+    <inputs>
+        <param name="input" type="data" format="gff,interval" label="Fetch sequences for intervals in">
+            <validator type="unspecified_build" />
+        </param>
+        <param name="interpret_features" type="select" label="Interpret features when possible" help="Applicable only when input dataset format is in the gff family">
+            <option value="yes">Yes</option>
+            <option value="no">No</option>
+        </param>
+        <conditional name="reference_genome_cond">
+            <param name="reference_genome_source" type="select" label="Choose the source for the reference genome">
+                <option value="cached">locally cached</option>
+                <option value="history">from history</option>
+            </param>
+            <when value="cached">
+                <param name="reference_genome" type="select" label="Using reference genome">
+                    <options from_data_table="twobit">
+                        <filter type="data_meta" key="dbkey" ref="input" column="0"/>
+                    </options>
+                    <validator type="no_options" message="A built-in reference genome is not available for the build associated with the selected input file"/>
+                </param>
+            </when>
+            <when value="history">
+                <param name="reference_genome" type="data" format="fasta" label="Using reference genome">
+                    <options>
+                        <filter type="data_meta" key="dbkey" ref="input"/>
+                    </options>
+                    <validator type="no_options" message="The current history does not include a fasta dataset with the build associated with the selected input file"/>
+                </param>
+            </when>
+        </conditional>
+        <param name="output_format" type="select" label="Select output format">
+            <option value="fasta" selected="True">fasta</option>
+            <option value="interval">interval</option>
+        </param>
+    </inputs>
+    <outputs>
+        <data name="output" format="gff">
+            <change_format>
+                <when output_format="interval" format="interval" />
+            </change_format>
+        </data>
+    </outputs>
+    <tests>
+        <test>
+            <param name="input" value="1.bed" dbkey="hg17" ftype="bed" />
+            <param name="interpret_features" value="yes"/>
+            <param name="index_source" value="cached"/>
+            <param name="out_format" value="fasta"/>
+            <output name="out_file1" file="extract_genomic_dna_out1.fasta" compare="contains" />
+        </test>
+        <test>
+            <param name="input" value="droPer1.bed" dbkey="droPer1" ftype="bed" />
+            <param name="interpret_features" value="yes"/>
+            <param name="index_source" value="cached"/>
+            <param name="out_format" value="fasta"/>
+            <output name="out_file1" file="extract_genomic_dna_out2.fasta" compare="contains" />
+        </test>
+        <test>
+            <param name="input" value="1.bed" dbkey="hg17" ftype="bed" />
+            <param name="interpret_features" value="yes"/>
+            <param name="index_source" value="cached"/>
+            <param name="out_format" value="interval"/>
+            <output name="out_file1" file="extract_genomic_dna_out3.interval" compare="contains" />
+        </test>
+        <!-- Test GFF file support. -->
+        <test>
+            <param name="input" value="gff_filter_by_attribute_out1.gff" dbkey="mm9" ftype="gff" />
+            <param name="interpret_features" value="no"/>
+            <param name="index_source" value="cached"/>
+            <param name="out_format" value="interval"/>
+            <output name="out_file1" file="extract_genomic_dna_out4.gff" compare="contains" />
+        </test>
+        <test>
+            <param name="input" value="gff_filter_by_attribute_out1.gff" dbkey="mm9" ftype="gff" />
+            <param name="interpret_features" value="no"/>
+            <param name="out_format" value="fasta"/>
+            <param name="index_source" value="cached"/>
+            <output name="out_file1" file="extract_genomic_dna_out5.fasta" compare="contains" />
+        </test>
+        <!-- Test custom sequences support and GFF feature interpretation. -->
+        <test>
+            <param name="input" value="cufflinks_out1.gtf" dbkey="mm9" ftype="gff" />
+            <param name="interpret_features" value="no"/>
+            <param name="index_source" value="history"/>
+            <param name="ref_file" value="tophat_in1.fasta"/>
+            <param name="out_format" value="fasta"/>
+            <output name="out_file1" file="extract_genomic_dna_out6.fasta" compare="contains" />
+        </test>
+        <test>
+            <param name="input" value="cufflinks_out1.gtf" dbkey="mm9" ftype="gff" />
+            <param name="interpret_features" value="yes"/>
+            <param name="index_source" value="history"/>
+            <param name="ref_file" value="tophat_in1.fasta"/>
+            <param name="out_format" value="fasta"/>
+            <output name="out_file1" file="extract_genomic_dna_out7.fasta" compare="contains" />
+        </test>
+    </tests>
+    <help>
+
+.. class:: warningmark
+
+This tool requires interval or gff (special tabular formatted data).  If your data is not TAB delimited, first use *Text Manipulation-&gt;Convert*.
+
+.. class:: warningmark
+
+Make sure that the genome build is specified for the dataset from which you are extracting sequences (click the pencil icon in the history item if it is not specified). 
+
+.. class:: warningmark
+
+All of the following will cause a line from the input dataset to be skipped and a warning generated.  The number of warnings and skipped lines is documented in the resulting history item.
+ - Any lines that do not contain at least 3 columns, a chromosome and numerical start and end coordinates.
+ - Sequences that fall outside of the range of a line's start and end coordinates. 
+ - Chromosome, start or end coordinates that are invalid for the specified build.
+ - Any lines whose data columns are not separated by a **TAB** character ( other white-space characters are invalid ).
+
+.. class:: infomark
+
+ **Extract genomic DNA using coordinates from ASSEMBLED genomes and UNassembled genomes** previously were achieved by two separate tools. 
+
+-----
+
+**What it does**
+
+This tool uses coordinate, strand, and build information to fetch genomic DNAs in FASTA or interval format.
+
+If strand is not defined, the default value is "+".
+
+-----
+
+**Example**
+
+If the input dataset is::
+
+    chr7  127475281  127475310  NM_000230  0  +
+    chr7  127485994  127486166  NM_000230  0  +
+    chr7  127486011  127486166  D49487     0  +
+
+Extracting sequences with **FASTA** output data type returns::
+
+    &gt;hg17_chr7_127475281_127475310_+ NM_000230
+    GTAGGAATCGCAGCGCCAGCGGTTGCAAG
+    &gt;hg17_chr7_127485994_127486166_+ NM_000230
+    GCCCAAGAAGCCCATCCTGGGAAGGAAAATGCATTGGGGAACCCTGTGCG
+    GATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATC
+    CAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAG
+    GATCAATGACATTTCACACACG
+    &gt;hg17_chr7_127486011_127486166_+ D49487
+    TGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGG
+    CCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGA
+    CACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCAC
+    ACACG
+
+Extracting sequences with **Interval** output data type returns::
+
+    chr7    127475281       127475310       NM_000230       0       +       GTAGGAATCGCAGCGCCAGCGGTTGCAAG
+    chr7    127485994       127486166       NM_000230       0       +       GCCCAAGAAGCCCATCCTGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCACACACG
+    chr7    127486011       127486166       D49487  0       +       TGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCACACACG
+
+    </help>
+    <citations>
+        <citation type="bibtex">
+            @unpublished{None,
+            author = {Guru Ananda,Greg Von Kuster},
+            title = {None},
+            year = {None},
+            eprint = {None},
+            url = {http://www.bx.psu.edu/~anton/labSite/}
+        }</citation>
+    </citations>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/extract_genomic_dna_utils.py	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,391 @@
+import copy
+import os
+import subprocess
+import sys
+import tempfile
+
+from bx.intervals.io import Comment, Header, GenomicInterval
+from bx.intervals.io import GenomicIntervalReader, NiceReaderWrapper, ParseError
+
+# Default chrom, start, end, strand cols for a bed file
+BED_DEFAULT_COLS = 0, 1, 2, 5
+
+
+class GFFInterval(GenomicInterval):
+    """
+    A GFF interval, including attributes. If file is strictly a GFF file,
+    only attribute is 'group.'
+    """
+
+    def __init__(self, reader, fields, chrom_col=0, feature_col=2, start_col=3, end_col=4,
+                 strand_col=6, score_col=5, default_strand='.', fix_strand=False):
+        # GFF format allows '.' for strand but GenomicInterval does not. To get around this,
+        # temporarily set strand and then unset after initing GenomicInterval.
+        unknown_strand = False
+        if not fix_strand and fields[strand_col] == '.':
+            unknown_strand = True
+            fields[strand_col] = '+'
+        GenomicInterval.__init__(self, reader, fields, chrom_col, start_col, end_col,
+                                 strand_col, default_strand, fix_strand=fix_strand)
+        if unknown_strand:
+            self.strand = '.'
+            self.fields[strand_col] = '.'
+        # Handle feature, score column.
+        self.feature_col = feature_col
+        if self.feature_col >= self.nfields:
+            stop_err("No field for feature_col (%d)" % feature_col)
+        self.feature = self.fields[self.feature_col]
+        self.score_col = score_col
+        if self.score_col >= self.nfields:
+            stop_err("No field for score_col (%d)" % score_col)
+        self.score = self.fields[self.score_col]
+        # GFF attributes.
+        self.attributes = parse_gff_attributes(fields[8])
+
+    def copy(self):
+        return GFFInterval(self.reader, list(self.fields), self.chrom_col, self.feature_col,
+                           self.start_col, self.end_col, self.strand_col, self.score_col, self.strand)
+
+
+class GFFFeature(GFFInterval):
+    """
+    A GFF feature, which can include multiple intervals.
+    """
+
+    def __init__(self, reader, chrom_col=0, feature_col=2, start_col=3, end_col=4, strand_col=6,
+                 score_col=5, default_strand='.', fix_strand=False, intervals=[], raw_size=0):
+        # Use copy so that first interval and feature do not share fields.
+        GFFInterval.__init__(self, reader, copy.deepcopy(intervals[0].fields), chrom_col, feature_col,
+                             start_col, end_col, strand_col, score_col, default_strand, fix_strand=fix_strand)
+        self.intervals = intervals
+        self.raw_size = raw_size
+        # Use intervals to set feature attributes.
+        for interval in self.intervals:
+            # Error checking. NOTE: intervals need not share the same strand.
+            if interval.chrom != self.chrom:
+                stop_err("interval chrom does not match self chrom: %s != %s" % (interval.chrom, self.chrom))
+            # Set start, end of interval.
+            if interval.start < self.start:
+                self.start = interval.start
+            if interval.end > self.end:
+                self.end = interval.end
+
+    def name(self):
+        """
+        Returns feature's name.
+        """
+        name = None
+        # Preference for name:
+        # GTF: 'gene_id', 'transcript_id'
+        # GFF3: 'ID', 'id'
+        # GFF: 'group'
+        for attr_name in ['gene_id', 'transcript_id', 'ID', 'id', 'group']:
+            name = self.attributes.get(attr_name, None)
+            if name is not None:
+                break
+        return name
+
+    def copy(self):
+        intervals_copy = []
+        for interval in self.intervals:
+            intervals_copy.append(interval.copy())
+        return GFFFeature(self.reader, self.chrom_col, self.feature_col, self.start_col, self.end_col,
+                          self.strand_col, self.score_col, self.strand, intervals=intervals_copy)
+
+    def lines(self):
+        lines = []
+        for interval in self.intervals:
+            lines.append('\t'.join(interval.fields))
+        return lines
+
+
+class GFFReaderWrapper(NiceReaderWrapper):
+    """
+    Reader wrapper for GFF files which has two major functions:
+    1. group entries for GFF file (via group column), GFF3 (via id attribute),
+       or GTF (via gene_id/transcript id);
+    2. convert coordinates from GFF format--starting and ending coordinates
+       are 1-based, closed--to the 'traditional'/BED interval format--0 based,
+       half-open. This is useful when using GFF files as inputs to tools that
+       expect traditional interval format.
+    """
+
+    def __init__(self, reader, chrom_col=0, feature_col=2, start_col=3, end_col=4, strand_col=6,
+                 score_col=5, fix_strand=False, convert_to_bed_coord=False, **kwargs):
+        NiceReaderWrapper.__init__(self, reader, chrom_col=chrom_col, start_col=start_col, end_col=end_col,
+                                   strand_col=strand_col, fix_strand=fix_strand, **kwargs)
+        self.feature_col = feature_col
+        self.score_col = score_col
+        self.convert_to_bed_coord = convert_to_bed_coord
+        self.last_line = None
+        self.cur_offset = 0
+        self.seed_interval = None
+        self.seed_interval_line_len = 0
+
+    def parse_row(self, line):
+        interval = GFFInterval(self, line.split("\t"), self.chrom_col, self.feature_col, self.start_col,
+                               self.end_col, self.strand_col, self.score_col, self.default_strand,
+                               fix_strand=self.fix_strand)
+        return interval
+
+    def next(self):
+        """
+        Returns next GFFFeature.
+        """
+
+        def handle_parse_error(parse_error):
+            """
+            Actions to take when ParseError found.
+            """
+            if self.outstream:
+                if self.print_delegate and hasattr(self.print_delegate, "__call__"):
+                    self.print_delegate(self.outstream, e, self)
+            self.skipped += 1
+            # No reason to stuff an entire bad file into memory.
+            if self.skipped < 10:
+                self.skipped_lines.append((self.linenum, self.current_line, str(e)))
+        # Get next GFFFeature
+        raw_size = self.seed_interval_line_len
+        # If there is no seed interval, set one. Also, if there are no more
+        # intervals to read, this is where iterator dies.
+        if not self.seed_interval:
+            while not self.seed_interval:
+                try:
+                    self.seed_interval = GenomicIntervalReader.next(self)
+                except ParseError as e:
+                    handle_parse_error(e)
+                finally:
+                    raw_size += len(self.current_line)
+        # If header or comment, clear seed interval and return it with its size.
+        if isinstance(self.seed_interval, (Header, Comment)):
+            return_val = self.seed_interval
+            return_val.raw_size = len(self.current_line)
+            self.seed_interval = None
+            self.seed_interval_line_len = 0
+            return return_val
+        # Initialize feature identifier from seed.
+        # For GFF.
+        feature_group = self.seed_interval.attributes.get('group', None)
+        # For GFF3
+        feature_id = self.seed_interval.attributes.get('ID', None)
+        # For GTF.
+        feature_transcript_id = self.seed_interval.attributes.get('transcript_id', None)
+        # Read all intervals associated with seed.
+        feature_intervals = []
+        feature_intervals.append(self.seed_interval)
+        while True:
+            try:
+                interval = GenomicIntervalReader.next(self)
+                raw_size += len(self.current_line)
+            except StopIteration as e:
+                # No more intervals to read, but last feature needs to be
+                # returned.
+                interval = None
+                raw_size += len(self.current_line)
+                break
+            except ParseError as e:
+                handle_parse_error(e)
+                raw_size += len(self.current_line)
+                continue
+            # Ignore comments.
+            if isinstance(interval, Comment):
+                continue
+            # Determine if interval is part of feature.
+            part_of = False
+            group = interval.attributes.get('group', None)
+            # GFF test:
+            if group and feature_group == group:
+                part_of = True
+            # GFF3 test:
+            parent_id = interval.attributes.get('Parent', None)
+            cur_id = interval.attributes.get('ID', None)
+            if (cur_id and cur_id == feature_id) or (parent_id and parent_id == feature_id):
+                part_of = True
+            # GTF test:
+            transcript_id = interval.attributes.get('transcript_id', None)
+            if transcript_id and transcript_id == feature_transcript_id:
+                part_of = True
+            # If interval is not part of feature, clean up and break.
+            if not part_of:
+                # Adjust raw size because current line is not part of feature.
+                raw_size -= len(self.current_line)
+                break
+            # Interval associated with feature.
+            feature_intervals.append(interval)
+        # Last interval read is the seed for the next interval.
+        self.seed_interval = interval
+        self.seed_interval_line_len = len(self.current_line)
+        # Return feature.
+        feature = GFFFeature(self, self.chrom_col, self.feature_col, self.start_col,
+                             self.end_col, self.strand_col, self.score_col,
+                             self.default_strand, fix_strand=self.fix_strand,
+                             intervals=feature_intervals, raw_size=raw_size)
+        # Convert to BED coords?
+        if self.convert_to_bed_coord:
+            convert_gff_coords_to_bed(feature)
+        return feature
+
+
+def convert_bed_coords_to_gff(interval):
+    """
+    Converts an interval object's coordinates from BED format to GFF format.
+    Accepted object types include GenomicInterval and list (where the first
+    element in the list is the interval's start, and the second element is
+    the interval's end).
+    """
+    if isinstance(interval, GenomicInterval):
+        interval.start += 1
+        if isinstance(interval, GFFFeature):
+            for subinterval in interval.intervals:
+                convert_bed_coords_to_gff(subinterval)
+    elif isinstance(interval, list):
+        interval[0] += 1
+    return interval
+
+
+def convert_gff_coords_to_bed(interval):
+    """
+    Converts an interval object's coordinates from GFF format to BED format.
+    Accepted object types include GFFFeature, GenomicInterval, and list (where
+    the first element in the list is the interval's start, and the second
+    element is the interval's end).
+    """
+    if isinstance(interval, GenomicInterval):
+        interval.start -= 1
+        if isinstance(interval, GFFFeature):
+            for subinterval in interval.intervals:
+                convert_gff_coords_to_bed(subinterval)
+    elif isinstance(interval, list):
+        interval[0] -= 1
+    return interval
+
+
+def convert_to_twobit(reference_genome):
+    """
+    Create 2bit file history fasta dataset.
+    """
+    try:
+        seq_path = tempfile.NamedTemporaryFile(dir=".").name
+        cmd = "faToTwoBit %s %s" % (reference_genome, seq_path)
+        tmp_name = tempfile.NamedTemporaryFile(dir=".").name
+        tmp_stderr = open(tmp_name, 'wb')
+        proc = subprocess.Popen(args=cmd, shell=True, stderr=tmp_stderr.fileno())
+        returncode = proc.wait()
+        tmp_stderr.close()
+        if returncode != 0:
+            # Get stderr, allowing for case where it's very large.
+            tmp_stderr = open(tmp_name, 'rb')
+            stderr = ''
+            buffsize = 1048576
+            try:
+                while True:
+                    stderr += tmp_stderr.read(buffsize)
+                    if not stderr or len(stderr) % buffsize != 0:
+                        break
+            except OverflowError:
+                pass
+            tmp_stderr.close()
+            os.remove(tmp_name)
+            stop_err(stderr)
+        return seq_path
+    except Exception, e:
+        stop_err('Error running faToTwoBit. ' + str(e))
+
+
+def get_lines(feature):
+    # Get feature's line(s).
+    if isinstance(feature, GFFFeature):
+        return feature.lines()
+    else:
+        return [feature.rstrip('\r\n')]
+
+
+def gff_attributes_to_str(attrs, gff_format):
+    """
+    Convert GFF attributes to string. Supported formats are GFF3, GTF.
+    """
+    if gff_format == 'GTF':
+        format_string = '%s "%s"'
+        # Convert group (GFF) and ID, parent (GFF3) attributes to
+        # transcript_id, gene_id.
+        id_attr = None
+        if 'group' in attrs:
+            id_attr = 'group'
+        elif 'ID' in attrs:
+            id_attr = 'ID'
+        elif 'Parent' in attrs:
+            id_attr = 'Parent'
+        if id_attr:
+            attrs['transcript_id'] = attrs['gene_id'] = attrs[id_attr]
+    elif gff_format == 'GFF3':
+        format_string = '%s=%s'
+    attrs_strs = []
+    for name, value in attrs.items():
+        attrs_strs.append(format_string % (name, value))
+    return " ; ".join(attrs_strs)
+
+
+def parse_cols_arg(cols):
+    """
+    Parse a columns command line argument into a four-tuple.
+    """
+    if cols:
+        # Handle case where no strand column included - in this case, cols
+        # looks something like 1,2,3,
+        if cols.endswith(','):
+            cols += '0'
+        col_list = map(lambda x: int(x) - 1, cols.split(","))
+        return col_list
+    else:
+        return BED_DEFAULT_COLS
+
+
+def parse_gff_attributes(attr_str):
+    """
+    Parses a GFF/GTF attribute string and returns a dictionary of name-value
+    pairs. The general format for a GFF3 attributes string is
+        name1=value1;name2=value2
+    The general format for a GTF attribute string is
+        name1 "value1" ; name2 "value2"
+    The general format for a GFF attribute string is a single string that
+    denotes the interval's group; in this case, method returns a dictionary
+    with a single key-value pair, and key name is 'group'.
+    """
+    attributes_list = attr_str.split(";")
+    attributes = {}
+    for name_value_pair in attributes_list:
+        # Try splitting by '=' (GFF3) first because spaces are allowed in GFF3
+        # attribute; next, try double quotes for GTF.
+        pair = name_value_pair.strip().split("=")
+        if len(pair) == 1:
+            pair = name_value_pair.strip().split("\"")
+        if len(pair) == 1:
+            # Could not split for some reason.
+            continue
+        if pair == '':
+            continue
+        name = pair[0].strip()
+        if name == '':
+            continue
+        # Need to strip double quote from values
+        value = pair[1].strip(" \"")
+        attributes[name] = value
+    if len(attributes) == 0:
+        # Could not split attributes string, so entire string must be
+        # 'group' attribute. This is the case for strictly GFF files.
+        attributes['group'] = attr_str
+    return attributes
+
+
+def reverse_complement(s):
+    complement_dna = {"A": "T", "T": "A", "C": "G", "G": "C", "a": "t", "t": "a", "c": "g", "g": "c", "N": "N", "n": "n"}
+    reversed_s = []
+    for i in s:
+        reversed_s.append(complement_dna[i])
+    reversed_s.reverse()
+    return "".join(reversed_s)
+
+
+def stop_err(msg):
+    sys.stderr.write(msg)
+    sys.exit(1)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/1.bed	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,65 @@
+chr1	147962192	147962580	CCDS989.1_cds_0_0_chr1_147962193_r	0	-
+chr1	147984545	147984630	CCDS990.1_cds_0_0_chr1_147984546_f	0	+
+chr1	148078400	148078582	CCDS993.1_cds_0_0_chr1_148078401_r	0	-
+chr1	148185136	148185276	CCDS996.1_cds_0_0_chr1_148185137_f	0	+
+chr10	55251623	55253124	CCDS7248.1_cds_0_0_chr10_55251624_r	0	-
+chr11	116124407	116124501	CCDS8374.1_cds_0_0_chr11_116124408_r	0	-
+chr11	116206508	116206563	CCDS8377.1_cds_0_0_chr11_116206509_f	0	+
+chr11	116211733	116212337	CCDS8378.1_cds_0_0_chr11_116211734_r	0	-
+chr11	1812377	1812407	CCDS7726.1_cds_0_0_chr11_1812378_f	0	+
+chr12	38440094	38440321	CCDS8736.1_cds_0_0_chr12_38440095_r	0	-
+chr13	112381694	112381953	CCDS9526.1_cds_0_0_chr13_112381695_f	0	+
+chr14	98710240	98712285	CCDS9949.1_cds_0_0_chr14_98710241_r	0	-
+chr15	41486872	41487060	CCDS10096.1_cds_0_0_chr15_41486873_r	0	-
+chr15	41673708	41673857	CCDS10097.1_cds_0_0_chr15_41673709_f	0	+
+chr15	41679161	41679250	CCDS10098.1_cds_0_0_chr15_41679162_r	0	-
+chr15	41826029	41826196	CCDS10101.1_cds_0_0_chr15_41826030_f	0	+
+chr16	142908	143003	CCDS10397.1_cds_0_0_chr16_142909_f	0	+
+chr16	179963	180135	CCDS10401.1_cds_0_0_chr16_179964_r	0	-
+chr16	244413	244681	CCDS10402.1_cds_0_0_chr16_244414_f	0	+
+chr16	259268	259383	CCDS10403.1_cds_0_0_chr16_259269_r	0	-
+chr18	23786114	23786321	CCDS11891.1_cds_0_0_chr18_23786115_r	0	-
+chr18	59406881	59407046	CCDS11985.1_cds_0_0_chr18_59406882_f	0	+
+chr18	59455932	59456337	CCDS11986.1_cds_0_0_chr18_59455933_r	0	-
+chr18	59600586	59600754	CCDS11988.1_cds_0_0_chr18_59600587_f	0	+
+chr19	59068595	59069564	CCDS12866.1_cds_0_0_chr19_59068596_f	0	+
+chr19	59236026	59236146	CCDS12872.1_cds_0_0_chr19_59236027_r	0	-
+chr19	59297998	59298008	CCDS12877.1_cds_0_0_chr19_59297999_f	0	+
+chr19	59302168	59302288	CCDS12878.1_cds_0_0_chr19_59302169_r	0	-
+chr2	118288583	118288668	CCDS2120.1_cds_0_0_chr2_118288584_f	0	+
+chr2	118394148	118394202	CCDS2121.1_cds_0_0_chr2_118394149_r	0	-
+chr2	220190202	220190242	CCDS2441.1_cds_0_0_chr2_220190203_f	0	+
+chr2	220229609	220230869	CCDS2443.1_cds_0_0_chr2_220229610_r	0	-
+chr20	33330413	33330423	CCDS13249.1_cds_0_0_chr20_33330414_r	0	-
+chr20	33513606	33513792	CCDS13255.1_cds_0_0_chr20_33513607_f	0	+
+chr20	33579500	33579527	CCDS13256.1_cds_0_0_chr20_33579501_r	0	-
+chr20	33593260	33593348	CCDS13257.1_cds_0_0_chr20_33593261_f	0	+
+chr21	32707032	32707192	CCDS13614.1_cds_0_0_chr21_32707033_f	0	+
+chr21	32869641	32870022	CCDS13615.1_cds_0_0_chr21_32869642_r	0	-
+chr21	33321040	33322012	CCDS13620.1_cds_0_0_chr21_33321041_f	0	+
+chr21	33744994	33745040	CCDS13625.1_cds_0_0_chr21_33744995_r	0	-
+chr22	30120223	30120265	CCDS13897.1_cds_0_0_chr22_30120224_f	0	+
+chr22	30160419	30160661	CCDS13898.1_cds_0_0_chr22_30160420_r	0	-
+chr22	30665273	30665360	CCDS13901.1_cds_0_0_chr22_30665274_f	0	+
+chr22	30939054	30939266	CCDS13903.1_cds_0_0_chr22_30939055_r	0	-
+chr5	131424298	131424460	CCDS4149.1_cds_0_0_chr5_131424299_f	0	+
+chr5	131556601	131556672	CCDS4151.1_cds_0_0_chr5_131556602_r	0	-
+chr5	131621326	131621419	CCDS4152.1_cds_0_0_chr5_131621327_f	0	+
+chr5	131847541	131847666	CCDS4155.1_cds_0_0_chr5_131847542_r	0	-
+chr6	108299600	108299744	CCDS5061.1_cds_0_0_chr6_108299601_r	0	-
+chr6	108594662	108594687	CCDS5063.1_cds_0_0_chr6_108594663_f	0	+
+chr6	108640045	108640151	CCDS5064.1_cds_0_0_chr6_108640046_r	0	-
+chr6	108722976	108723115	CCDS5067.1_cds_0_0_chr6_108722977_f	0	+
+chr7	113660517	113660685	CCDS5760.1_cds_0_0_chr7_113660518_f	0	+
+chr7	116512159	116512389	CCDS5771.1_cds_0_0_chr7_116512160_r	0	-
+chr7	116714099	116714152	CCDS5773.1_cds_0_0_chr7_116714100_f	0	+
+chr7	116945541	116945787	CCDS5774.1_cds_0_0_chr7_116945542_r	0	-
+chr8	118881131	118881317	CCDS6324.1_cds_0_0_chr8_118881132_r	0	-
+chr9	128764156	128764189	CCDS6914.1_cds_0_0_chr9_128764157_f	0	+
+chr9	128787519	128789136	CCDS6915.1_cds_0_0_chr9_128787520_r	0	-
+chr9	128882427	128882523	CCDS6917.1_cds_0_0_chr9_128882428_f	0	+
+chr9	128937229	128937445	CCDS6919.1_cds_0_0_chr9_128937230_r	0	-
+chrX	122745047	122745924	CCDS14606.1_cds_0_0_chrX_122745048_f	0	+
+chrX	152648964	152649196	CCDS14733.1_cds_0_0_chrX_152648965_r	0	-
+chrX	152691446	152691471	CCDS14735.1_cds_0_0_chrX_152691447_f	0	+
+chrX	152694029	152694263	CCDS14736.1_cds_0_0_chrX_152694030_r	0	-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/cufflinks_out1.gtf	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,4 @@
+test_chromosome	Cufflinks	transcript	53	550	1000	+	.	gene_id "CUFF.1"; transcript_id "CUFF.1.1"; FPKM "10679134.4063403048"; frac "1.000000"; conf_lo "8543307.525072"; conf_hi "12814961.287608"; cov "145.770185";
+test_chromosome	Cufflinks	exon	53	250	1000	+	.	gene_id "CUFF.1"; transcript_id "CUFF.1.1"; exon_number "1"; FPKM "10679134.4063403048"; frac "1.000000"; conf_lo "8543307.525072"; conf_hi "12814961.287608"; cov "145.770185";
+test_chromosome	Cufflinks	exon	351	400	1000	+	.	gene_id "CUFF.1"; transcript_id "CUFF.1.1"; exon_number "2"; FPKM "10679134.4063403048"; frac "1.000000"; conf_lo "8543307.525072"; conf_hi "12814961.287608"; cov "145.770185";
+test_chromosome	Cufflinks	exon	501	550	1000	+	.	gene_id "CUFF.1"; transcript_id "CUFF.1.1"; exon_number "3"; FPKM "10679134.4063403048"; frac "1.000000"; conf_lo "8543307.525072"; conf_hi "12814961.287608"; cov "145.770185";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/droPer1.bed	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,2 @@
+super_1	139823	139913	AK028861	0	-	139823	139913	0	1	90,	0,
+super_1	156750	156844	BC126698	0	-	156750	156844	0	1	94,	0,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out1.fasta	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,88 @@
+>hg17_chr1_147962192_147962580_-
+ACTTGATCCTGCTCCCTCGGTGTCTGCATTGACTCCTCATGCTGGGACTG
+GACCCGTCAACCCCCCTGCTCGCTGCTCACGTACCTTCATCACTTTTAGT
+GATGATGCAACTTTCGAGGAATGGTTCCCCCAAGGGCGGCCCCCAAAAGT
+CCCTGTTCGTGAGGTCTGTCCAGTGACCCATCGTCCAGCCCTATACCGGG
+ACCCTGTTACAGACATACCCTATGCCACTGCTCGAGCCTTCAAGATCATT
+CGTGAGGCTTACAAGAAGTACATTACTGCCCATGGACTGCCGCCCACTGC
+CTCAGCCCTGGGCCCCGGCCCGCCACCTCCTGAGCCCCTCCCTGGCTCTG
+GGCCCCGAGCCTTGCGCCAGAAAATTGTCATTAAATGA
+>hg17_chr1_147984545_147984630_+
+ATGGCGTCGGCCTCCTCCGGGCCGTCGTCTTCGGTCGGTTTTTCATCCTT
+TGATCCCGCGGTCCCTTCCTGTACCTTGTCCTCAG
+>hg17_chr1_148078400_148078582_-
+GTTCTCAGCTTCCTTGCTTCCATGGCTCCAGCACCATTCGAAACCTCAAA
+GAGAGGTTCCACATGAGCATGACTGAGGAGCAGCTGCAGCTGCTGGTGGA
+GCAGATGGTGGATGGCAGTATGCGGTCTATCACCACCAAACTCTATGACG
+GCTTCCAGTACCTCACCAACGGCATCATGTGA
+>hg17_chr1_148185136_148185276_+
+ATGGAAGCGTTTTTGGGGTCGCGGTCCGGACTTTGGGCGGGGGGTCCGGC
+CCCAGGACAGTTTTACCGCATTCCGTCCACTCCCGATTCCTTCATGGATC
+CGGCGTCTGCACTTTACAGAGGTCCAATCACGCGGACCCA
+>hg17_chr10_55251623_55253124_-
+TCTTTTCCTTCTCTACCATTTTCAACAAAGCAGGGGAAATAACTCAGTCT
+CAGAAGACAGGAAACATCAACAAGTTGTGATGCCCTTTTCTTCCAATACT
+ATTGAGGCTCACAAGTCAGCTCATGTAGACGGATCACTTAAGAGCAACAA
+ACTGAAGTCTGCAAGAAAATTCACATTTCTATCTGATGAGGATGACTTAA
+GTGCCCATAATCCCCTTTATAAGGAAAACATAAGTCAAGTATCAACAAAT
+TCAGACATTTCACAGAGAACAGATTTTGTAGACCCATTTTCACCCAAAAT
+ACAAGCCAAGAGTAAGTCTCTGAGGGGCCCAAGAGAAAAGATTCAGAGGC
+TGTGGAGTCAGTCAGTCAGCTTACCCAGGAGGCTGATGAGGAAAGTTCCA
+AATAGACCAGAGATCATAGATCTGCAGCAGTGGCAAGGCACCAGGCAGAA
+AGCTGAAAATGAAAACACTGGAATCTGTACAAACAAAAGAGGTAGCAGCA
+ATCCATTGCTTACAACTGAAGAGGCAAATTTGACAGAGAAAGAGGAAATA
+AGGCAAGGTGAAACACTGATGATAGAAGGAACAGAACAGTTGAAATCTCT
+CTCTTCAGACTCTTCATTTTGCTTTCCCAGGCCTCACTTCTCATTCTCCA
+CTTTGCCAACTGTTTCAAGAACTGTGGAACTCAAATCAGAACCTAATGTC
+ATCAGTTCTCCTGCTGAGTGTTCCTTGGAACTTTCTCCTTCAAGGCCTTG
+TGTTTTACATTCTTCACTCTCTAGGAGAGAGACACCTATTTGTATGTTAC
+CTATTGAAACCGAAAGAAATATTTTTGAAAATTTTGCCCATCCACCAAAC
+ATCTCTCCTTCTGCCTGtccccttccccctcctcctcctatttctcctcc
+ttctcctcctcctgctcctgctcctcttgctcctcctcctgacatttctc
+ctttttctcttttttgtcctcctccctctcctccttctatccctcttcct
+cttcctcctcctACATTTTTTCCACTTTCCGTTTCAACGTCTGGTCCCCC
+AACAccacctcttctacctccatttccaactcctcttcctccaccacctc
+cttctattccttgccctccacctccttcAGCTTCATTTCTGTCCACAGAG
+TGTGTCTGTATAACAGGTGTTAAATGCACGACCAACTTGATGCCTGCCGA
+GAAAATTAAGTCCTCTATGACACAGCTATCAACAACGACAGTGTGTAAAA
+CAGACCCTCAGAGAGAACCAAAAGGCATCCTCAGACACGTTAAAAACTTA
+GCAGAACTTGAAAAATCAGTAGCTAACATGTACAGTCAAATAGAAAAAAA
+CTATCTACGCACAAATGTTTCAGAACTTCAAACTATGTGCCCTTCAGAAG
+TAACAAATATGGAAATCACATCTGAACAAAACAAGGGGAGTTTGAACAAT
+ATTGTCGAGGGAACTGAAAAACAATCTCACAGTCAATCTACTTCACTGTA
+A
+>hg17_chr11_116124407_116124501_-
+ATCCAATGGATTTGAACAGAAGCGCTTTGCCAGGCTTGCCAGCAAGAAGG
+CAGTGGAGGAACTTGCCTACAAATGGAGTGTTGAGGATATGTAA
+>hg17_chr11_116206508_116206563_+
+ATGCAGCCCCGGGTACTCCTTGTTGTTGCCCTCCTGGCGCTCCTGGCCTC
+TGCCC
+>hg17_chr11_116211733_116212337_-
+CCTAAAGCTCCTTGACAACTGGGACAGCGTGACCTCCACCTTCAGCAAGC
+TGCGCGAACAGCTCGGCCCTGTGACCCAGGAGTTCTGGGATAACCTGGAA
+AAGGAGACAGAGGGCCTGAGGCAGGAGATGAGCAAGGATCTGGAGGAGGT
+GAAGGCCAAGGTGCAGCCCTACCTGGACGACTTCCAGAAGAAGTGGCAGG
+AGGAGATGGAGCTCTACCGCCAGAAGGTGGAGCCGCTGCGCGCAGAGCTC
+CAAGAGGGCGCGCGCCAGAAGCTGCACGAGCTGCAAGAGAAGCTGAGCCC
+ACTGGGCGAGGAGATGCGCGACCGCGCGCGCGCCCATGTGGACGCGCTGC
+GCACGCATCTGGCCCCCTACAGCGACGAGCTGCGCCAGCGCTTGGCCGCG
+CGCCTTGAGGCTCTCAAGGAGAACGGCGGCGCCAGACTGGCCGAGTACCA
+CGCCAAGGCCACCGAGCATCTGAGCACGCTCAGCGAGAAGGCCAAGCCCG
+CGCTCGAGGACCTCCGCCAAGGCCTGCTGCCCGTGCTGGAGAGCTTCAAG
+GTCAGCTTCCTGAGCGCTCTCGAGGAGTACACTAAGAAGCTCAACACCCA
+GTGA
+>hg17_chr11_1812377_1812407_+
+ATGCTCCACCTGCATGGCTGGCAAACCATG
+>hg17_chr12_38440094_38440321_-
+GAGCTTTCTTCCTCTATGCTGGATTTGCTGCTGTGGGACTCCTTTTCATC
+TATGGCTGTCTTCCTGAGACCAAAGGCAAAAAATTAGAGGAAATTGAATC
+ACTCTTTGACAACAGGCTATGTACATGTGGCACTTCAGATTCTGATGAAG
+GGAGATATATTGAATATATTCGGGTAAAGGGAAGTAACTATCATCTTTCT
+GACAATGATGCTTCTGATGTGGAATAA
+>hg17_chr13_112381694_112381953_+
+ATGAACTCACCAGAGGCGAGGCTCTGCGTTGCTCAATGCAGAGACTCTTA
+CCCAGGGTGTCAGCCTCTGAAAGATACACGTGCCTGGGCCTCTTCCCTGA
+AGATGGACCCGGCAGGTCTGGAGGGAGGCCCCCGTGATGAATCCCGTGAT
+GAGCCGCCGATCCGAGCTCAGGCTGCGTCATGGGACCAGCCACAAGGTTG
+CCTGACCTATAAAGGTCGCAGGAGTGCCTCAGGGACACAGAAGCAGTTAC
+AGCTGCCAG
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out2.fasta	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,6 @@
+>droPer1_super_1_139823_139913_- AK028861
+CGTCGGCTTCTGCTTCTGCTGATGATGGTCGTTCTTCTTCCTTTACTTCT
+TCCTATTTTTCTTCCTTCCCTTACACTATATCTTCCTTTA
+>droPer1_super_1_156750_156844_- BC126698
+CCGGGCTGCGGCAAGGGATTCACCTGCTCCAAACAGCTCAAGGTGCACTC
+CCGCACGCACACGGGCGAGAAGCCCTATCACTGCGACATCTGCT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out3.interval	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,10 @@
+chr1	147962192	147962580	CCDS989.1_cds_0_0_chr1_147962193_r	0	-	ACTTGATCCTGCTCCCTCGGTGTCTGCATTGACTCCTCATGCTGGGACTGGACCCGTCAACCCCCCTGCTCGCTGCTCACGTACCTTCATCACTTTTAGTGATGATGCAACTTTCGAGGAATGGTTCCCCCAAGGGCGGCCCCCAAAAGTCCCTGTTCGTGAGGTCTGTCCAGTGACCCATCGTCCAGCCCTATACCGGGACCCTGTTACAGACATACCCTATGCCACTGCTCGAGCCTTCAAGATCATTCGTGAGGCTTACAAGAAGTACATTACTGCCCATGGACTGCCGCCCACTGCCTCAGCCCTGGGCCCCGGCCCGCCACCTCCTGAGCCCCTCCCTGGCTCTGGGCCCCGAGCCTTGCGCCAGAAAATTGTCATTAAATGA
+chr1	147984545	147984630	CCDS990.1_cds_0_0_chr1_147984546_f	0	+	ATGGCGTCGGCCTCCTCCGGGCCGTCGTCTTCGGTCGGTTTTTCATCCTTTGATCCCGCGGTCCCTTCCTGTACCTTGTCCTCAG
+chr1	148078400	148078582	CCDS993.1_cds_0_0_chr1_148078401_r	0	-	GTTCTCAGCTTCCTTGCTTCCATGGCTCCAGCACCATTCGAAACCTCAAAGAGAGGTTCCACATGAGCATGACTGAGGAGCAGCTGCAGCTGCTGGTGGAGCAGATGGTGGATGGCAGTATGCGGTCTATCACCACCAAACTCTATGACGGCTTCCAGTACCTCACCAACGGCATCATGTGA
+chr1	148185136	148185276	CCDS996.1_cds_0_0_chr1_148185137_f	0	+	ATGGAAGCGTTTTTGGGGTCGCGGTCCGGACTTTGGGCGGGGGGTCCGGCCCCAGGACAGTTTTACCGCATTCCGTCCACTCCCGATTCCTTCATGGATCCGGCGTCTGCACTTTACAGAGGTCCAATCACGCGGACCCA
+chr10	55251623	55253124	CCDS7248.1_cds_0_0_chr10_55251624_r	0	-	TCTTTTCCTTCTCTACCATTTTCAACAAAGCAGGGGAAATAACTCAGTCTCAGAAGACAGGAAACATCAACAAGTTGTGATGCCCTTTTCTTCCAATACTATTGAGGCTCACAAGTCAGCTCATGTAGACGGATCACTTAAGAGCAACAAACTGAAGTCTGCAAGAAAATTCACATTTCTATCTGATGAGGATGACTTAAGTGCCCATAATCCCCTTTATAAGGAAAACATAAGTCAAGTATCAACAAATTCAGACATTTCACAGAGAACAGATTTTGTAGACCCATTTTCACCCAAAATACAAGCCAAGAGTAAGTCTCTGAGGGGCCCAAGAGAAAAGATTCAGAGGCTGTGGAGTCAGTCAGTCAGCTTACCCAGGAGGCTGATGAGGAAAGTTCCAAATAGACCAGAGATCATAGATCTGCAGCAGTGGCAAGGCACCAGGCAGAAAGCTGAAAATGAAAACACTGGAATCTGTACAAACAAAAGAGGTAGCAGCAATCCATTGCTTACAACTGAAGAGGCAAATTTGACAGAGAAAGAGGAAATAAGGCAAGGTGAAACACTGATGATAGAAGGAACAGAACAGTTGAAATCTCTCTCTTCAGACTCTTCATTTTGCTTTCCCAGGCCTCACTTCTCATTCTCCACTTTGCCAACTGTTTCAAGAACTGTGGAACTCAAATCAGAACCTAATGTCATCAGTTCTCCTGCTGAGTGTTCCTTGGAACTTTCTCCTTCAAGGCCTTGTGTTTTACATTCTTCACTCTCTAGGAGAGAGACACCTATTTGTATGTTACCTATTGAAACCGAAAGAAATATTTTTGAAAATTTTGCCCATCCACCAAACATCTCTCCTTCTGCCTGtccccttccccctcctcctcctatttctcctccttctcctcctcctgctcctgctcctcttgctcctcctcctgacatttctcctttttctcttttttgtcctcctccctctcctccttctatccctcttcctcttcctcctcctACATTTTTTCCACTTTCCGTTTCAACGTCTGGTCCCCCAACAccacctcttctacctccatttccaactcctcttcctccaccacctccttctattccttgccctccacctccttcAGCTTCATTTCTGTCCACAGAGTGTGTCTGTATAACAGGTGTTAAATGCACGACCAACTTGATGCCTGCCGAGAAAATTAAGTCCTCTATGACACAGCTATCAACAACGACAGTGTGTAAAACAGACCCTCAGAGAGAACCAAAAGGCATCCTCAGACACGTTAAAAACTTAGCAGAACTTGAAAAATCAGTAGCTAACATGTACAGTCAAATAGAAAAAAACTATCTACGCACAAATGTTTCAGAACTTCAAACTATGTGCCCTTCAGAAGTAACAAATATGGAAATCACATCTGAACAAAACAAGGGGAGTTTGAACAATATTGTCGAGGGAACTGAAAAACAATCTCACAGTCAATCTACTTCACTGTAA
+chr11	116124407	116124501	CCDS8374.1_cds_0_0_chr11_116124408_r	0	-	ATCCAATGGATTTGAACAGAAGCGCTTTGCCAGGCTTGCCAGCAAGAAGGCAGTGGAGGAACTTGCCTACAAATGGAGTGTTGAGGATATGTAA
+chr11	116206508	116206563	CCDS8377.1_cds_0_0_chr11_116206509_f	0	+	ATGCAGCCCCGGGTACTCCTTGTTGTTGCCCTCCTGGCGCTCCTGGCCTCTGCCC
+chr11	116211733	116212337	CCDS8378.1_cds_0_0_chr11_116211734_r	0	-	CCTAAAGCTCCTTGACAACTGGGACAGCGTGACCTCCACCTTCAGCAAGCTGCGCGAACAGCTCGGCCCTGTGACCCAGGAGTTCTGGGATAACCTGGAAAAGGAGACAGAGGGCCTGAGGCAGGAGATGAGCAAGGATCTGGAGGAGGTGAAGGCCAAGGTGCAGCCCTACCTGGACGACTTCCAGAAGAAGTGGCAGGAGGAGATGGAGCTCTACCGCCAGAAGGTGGAGCCGCTGCGCGCAGAGCTCCAAGAGGGCGCGCGCCAGAAGCTGCACGAGCTGCAAGAGAAGCTGAGCCCACTGGGCGAGGAGATGCGCGACCGCGCGCGCGCCCATGTGGACGCGCTGCGCACGCATCTGGCCCCCTACAGCGACGAGCTGCGCCAGCGCTTGGCCGCGCGCCTTGAGGCTCTCAAGGAGAACGGCGGCGCCAGACTGGCCGAGTACCACGCCAAGGCCACCGAGCATCTGAGCACGCTCAGCGAGAAGGCCAAGCCCGCGCTCGAGGACCTCCGCCAAGGCCTGCTGCCCGTGCTGGAGAGCTTCAAGGTCAGCTTCCTGAGCGCTCTCGAGGAGTACACTAAGAAGCTCAACACCCAGTGA
+chr11	1812377	1812407	CCDS7726.1_cds_0_0_chr11_1812378_f	0	+	ATGCTCCACCTGCATGGCTGGCAAACCATG
+chr12	38440094	38440321	CCDS8736.1_cds_0_0_chr12_38440095_r	0	-	GAGCTTTCTTCCTCTATGCTGGATTTGCTGCTGTGGGACTCCTTTTCATCTATGGCTGTCTTCCTGAGACCAAAGGCAAAAAATTAGAGGAAATTGAATCACTCTTTGACAACAGGCTATGTACATGTGGCACTTCAGATTCTGATGAAGGGAGATATATTGAATATATTCGGGTAAAGGGAAGTAACTATCATCTTTCTGACAATGATGCTTCTGATGTGGAATAA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out4.gff	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,10 @@
+chr10	Cufflinks	transcript	62044837	62045189	1000	.	.	gene_id "CUFF.23531"; transcript_id "CUFF.23531.1"; FPKM "19.5178121606"; frac "1.000000"; conf_lo "9.264456"; conf_hi "29.771168"; cov "1.108611"; seq "AATTACAAGATCGACACACCAAGATAGGCAGATCCATGGTTGGTTTTACTTTGTAAATCTAAAAGTATGTTGGAAAACGATGCAATGAATTCTTATCCTTTTTCAAAATGAAGAATTTGTGATGGTTAGTGGACAGTTCAGAAGCCTCTCTGCAAGAAAGGGGGCGCTGAGAAGTGGTAAAAAAAGGAAGGAAGCACTCGGGCTTTGTCAGCAGGGTGGACCCTGGGGTCCACAGTGGGAACAGTCCCTTCTGGCCTCTACTCACTGACCAAACGCTTTACTAAAACTCCGCTTCTGGCCTCTGTTGCCACCTCCTGGTCGCTGTCCTCGGAAGTTTCTACTTCCTCCTCGCT";
+chr10	Cufflinks	transcript	75372919	75373002	1000	.	.	gene_id "CUFF.24985"; transcript_id "CUFF.24985.1"; FPKM "124.4970510798"; frac "1.000000"; conf_lo "71.411330"; conf_hi "177.582772"; cov "7.071429"; seq "GCGTCTCGCAGCTTCTGCCCGTCGATCTCCATGTCGAGCCGGATGGGCACCAGCACCTCAGGCTGTGACGCATTCTCATGGATC";
+chr10	Cufflinks	transcript	80362428	80363292	1000	-	.	gene_id "CUFF.26065"; transcript_id "CUFF.26065.1"; FPKM "43.6170921216"; frac "1.000000"; conf_lo "32.260169"; conf_hi "54.974016"; cov "2.477449"; seq "ATGACGGACAAGTGTTTCCGGAAGTGCATCGGGAAGCCCGGGGGCTCCTTGGATAACTCGGAGCAGGTGAGACATCTCGGGAACCCGGGGTGGTGAGGGGCGCGGGGTCAGGAGCGTCTAGGAGGTTGAGAGATGTGCGCGTGCGCGGCCTCTAGCCTTAGCTACTGAGGAAGTTGTGCGCGTGCGCGGGGTGAGGACCCGGCTTCTGTGCCTAGATCGGTGCAGCCTTCATGGGTGATCCTCGGGTCGTGTGACCGTCAGTCAGGGATCCCCCTCCACGCTTTGCAGAAATGCATCGCCATGTGCATGGACCGCTACATGGACGCCTGGAATACCGTGTCCCGCGCCTACAACTCTCGACTGCAGCGGGAACGAGCCAACATGTGACCGGGACCTGTGCCTCGGGACACCGTGCTTATGGTCTGAACTGTTTTCCCTGCCAGTTAGGGTGTCTCCTCCTAGCCGCCCTGAAGTCTGGCAGCATGGAGGGCTTGGGGATCGAGGCCTCTCCCCTGGGTTGCTGCGTCCAGCTCAATCTCAGAAGAGAGTGAGGACCCGACAGAGCACAGGGATCTGGCTGGCCCCACTGACCTGTGACCTCAGGAGAGCAGGCCAATAAATCGCTGCTGGGGCAGTAAAGCAGGCGTGTCACCTCACTGCTTCAGGTCCCTTCCCCTGAGTAGGCCCAGACCTCCCAGGGTATCTTTCCCCTTGGGGTCAGTGGGCTGCTGGCTCTCAGGGAATTCGGAGCATGATCTCAGGTGTTTGGTCATCCCGGGGAGACCAGCCGAGGTTAAGAAGCAAGGCTTCATGTagccttcacctatcatgcatgaggcccagggtgctgaccttaactctgaat";
+chr11	Cufflinks	transcript	7904565	7904642	1000	.	.	gene_id "CUFF.33508"; transcript_id "CUFF.33508.1"; FPKM "61.6484988869"; frac "1.000000"; conf_lo "22.882428"; conf_hi "100.414569"; cov "3.501633"; seq "CATCTTCTATTTGAGCCTCCATCCAGGCACCTCTGAAACAAAGGTGCACTCACTGCATGTCCACTTGTCACAGGAGCC";
+chr11	Cufflinks	exon	78140156	78140259	1000	.	.	gene_id "CUFF.43148"; transcript_id "CUFF.43148.1"; exon_number "1"; FPKM "54.8483511750"; frac "1.000000"; conf_lo "23.181641"; conf_hi "86.515061"; cov "3.115385"; seq "CTGCTTGCTAATTTTCTCTCTTGGGATCAGGGGGACGTGAACTCCAGCCCTGACTCGTGCTCCTTATGCTCTGAGTACATAGCAAATAAATGAGAGCAAAACAC";
+chr11	Cufflinks	exon	105616462	105616737	1000	.	.	gene_id "CUFF.48385"; transcript_id "CUFF.48385.1"; exon_number "1"; FPKM "18.9452034252"; frac "1.000000"; conf_lo "7.520816"; conf_hi "30.369591"; cov "1.076087"; seq "TAGGTGTAATAGTGGAAAACAATAGTTTTTAAACTTCAGAGTCCAGGGCTGTAACTCAGTAGTAACAGTGTTCTCTAAGTATGTTATTCTTCCTCTACATGCTGAAATTTTTCATATTTGGAGCATTCACTGTTCCATGTATCAGTAAATTATATTGTGAGCTGTCATCATATCTAAGCACCATATTGAATATTTTTCATGATTAAAATTTGTTGAAACAACAATTCTATGACCGAAAAAAGCAAGGCTTTGTAAATAACATGTTTGTTACTAGTA";
+chr12	Cufflinks	exon	30701762	30702509	1000	.	.	gene_id "CUFF.53897"; transcript_id "CUFF.53897.1"; exon_number "1"; FPKM "48.9333329111"; frac "1.000000"; conf_lo "37.780391"; conf_hi "60.086275"; cov "2.779412"; seq "TGTGGAGTGTACTTATATGATCCCTATGCTGATAGGATTACCTTCCTAGACATAGCTAGACGCAAAGCCACATGTGTAAGGCTGCTGAGCAAAGACAGCATCCCAGCATGGGTGTGTTCACGGTGGATTCACCACGTTGCATATGTAAAGTGGTCCCCTTGGCTTACCCTTCACTTTGCTCATGAGATTCAGAAGCTGGTGGTCCAGCAGGGGTGAGCATTTGTGAAATAGTAAGCTGAACTTAGTGGTGAGATTTCAGAACAGACTTCTGTGAAGTAAGAGATGTAACCATGCATCTAAAATCAGATGGCCGTGTAACTGCTCGGGCATAGAAATGGTGGGAGAACCTGTCCTGGGTACCTGGCATTTCACATGAGCCCAGGGATATGTCTTGTGCCAAGGCACACAAGTGTCCATGGACTTGGACAGGTGCCAAGGGTTTTTGTCTCTGTTCCTATGTGGGAGGCTGGCTGTGATTTACATTAATTTCTGTATTTCAAACGAAGATGTCTGCAGATCTCCATTTTGATGTTACAGCCTCATTGCCCAGGCAGTGGGCAGTGCCCAGACACCCTTTCTGACTAGCCACTGCATTGGGCTTCTGTGATTCAAAGTAGTGTATATATTTATTTACTTCTCTGACTGTGGCCAACAGCCAAATGCCATTTTATGTTCCTTGTATTCAGTCCATTACCAAAGAGGTGTTTGCACTTTGTAATGATACCTTTCAGTTCAAATAAAAGGACCA";
+chr13	Cufflinks	exon	49159496	49159569	1000	.	.	gene_id "CUFF.67788"; transcript_id "CUFF.67788.1"; exon_number "1"; FPKM "44.9657653777"; frac "1.000000"; conf_lo "10.974842"; conf_hi "78.956689"; cov "2.554054"; seq "ttttcttttggattacttgatttttttttatttgatcttatttatgatgattttgagtacatttttgaacagtt";
+chr13	Cufflinks	transcript	100200304	100200330	1000	.	.	gene_id "CUFF.73108"; transcript_id "CUFF.73108.1"; FPKM "123.2395051093"; frac "1.000000"; conf_lo "30.079196"; conf_hi "216.399814"; cov "7.000000"; seq "TCTCATATGAATAGCCACCCTCTTCTG";
+chr14	Cufflinks	transcript	31949103	31949152	1000	.	.	gene_id "CUFF.77316"; transcript_id "CUFF.77316.1"; FPKM "85.5634278330"; frac "1.000000"; conf_lo "28.521143"; conf_hi "142.605713"; cov "4.860000"; seq "GGATGCTATCCGCGATGTGCATGTAAAGGGCCTCATGTACCAGTGGATCG";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out5.fasta	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,31 @@
+>mm9_chr10_62044837_62045189_+
+AATTACAAGATCGACACACCAAGATAGGCAGATCCATGGTTGGTTTTACT
+TTGTAAATCTAAAAGTATGTTGGAAAACGATGCAATGAATTCTTATCCTT
+TTTCAAAATGAAGAATTTGTGATGGTTAGTGGACAGTTCAGAAGCCTCTC
+TGCAAGAAAGGGGGCGCTGAGAAGTGGTAAAAAAAGGAAGGAAGCACTCG
+GGCTTTGTCAGCAGGGTGGACCCTGGGGTCCACAGTGGGAACAGTCCCTT
+CTGGCCTCTACTCACTGACCAAACGCTTTACTAAAACTCCGCTTCTGGCC
+TCTGTTGCCACCTCCTGGTCGCTGTCCTCGGAAGTTTCTACTTCCTCCTC
+GCT
+>mm9_chr10_75372919_75373002_+
+GCGTCTCGCAGCTTCTGCCCGTCGATCTCCATGTCGAGCCGGATGGGCAC
+CAGCACCTCAGGCTGTGACGCATTCTCATGGATC
+>mm9_chr10_80362428_80363292_-
+ATGACGGACAAGTGTTTCCGGAAGTGCATCGGGAAGCCCGGGGGCTCCTT
+GGATAACTCGGAGCAGGTGAGACATCTCGGGAACCCGGGGTGGTGAGGGG
+CGCGGGGTCAGGAGCGTCTAGGAGGTTGAGAGATGTGCGCGTGCGCGGCC
+TCTAGCCTTAGCTACTGAGGAAGTTGTGCGCGTGCGCGGGGTGAGGACCC
+GGCTTCTGTGCCTAGATCGGTGCAGCCTTCATGGGTGATCCTCGGGTCGT
+GTGACCGTCAGTCAGGGATCCCCCTCCACGCTTTGCAGAAATGCATCGCC
+ATGTGCATGGACCGCTACATGGACGCCTGGAATACCGTGTCCCGCGCCTA
+CAACTCTCGACTGCAGCGGGAACGAGCCAACATGTGACCGGGACCTGTGC
+CTCGGGACACCGTGCTTATGGTCTGAACTGTTTTCCCTGCCAGTTAGGGT
+GTCTCCTCCTAGCCGCCCTGAAGTCTGGCAGCATGGAGGGCTTGGGGATC
+GAGGCCTCTCCCCTGGGTTGCTGCGTCCAGCTCAATCTCAGAAGAGAGTG
+AGGACCCGACAGAGCACAGGGATCTGGCTGGCCCCACTGACCTGTGACCT
+CAGGAGAGCAGGCCAATAAATCGCTGCTGGGGCAGTAAAGCAGGCGTGTC
+ACCTCACTGCTTCAGGTCCCTTCCCCTGAGTAGGCCCAGACCTCCCAGGG
+TATCTTTCCCCTTGGGGTCAGTGGGCTGCTGGCTCTCAGGGAATTCGGAG
+CATGATCTCAGGTGTTTGGTCATCCCGGGGAGACCAGCCGAGGTTAAGAA
+GCAAGGCTTCATGTagccttcacctatcatgcatgaggcccagggtgctg
+accttaactctgaat
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out6.fasta	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,20 @@
+>mm9_test_chromosome_53_550_+
+TACTATCTGACTAGACTGGAGGCGCTTGCGACTGAGCTAGGACGTGCCAC
+TACGGGGATGACGACTAGGACTACGGACGGACTTAGAGCGTCAGATGCAG
+CGACTGGACTATTTAGGACGATCGGACTGAGGAGGGCAGTAGGACGCTAC
+GTATTTGGCGCGCGGCGCTACGGCTGAGCGTCGAGCTTGCGATACGCCGT
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAC
+TATTACTTTATTATCTTACTCGGACGTAGACGGATCGGCAACGGGACTGT
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGTT
+TTCTACTTGAGACTGGGATCGAGGCGGACTTTTTAGGACGGGACTTGC
+>mm9_test_chromosome_53_250_+
+TACTATCTGACTAGACTGGAGGCGCTTGCGACTGAGCTAGGACGTGCCAC
+TACGGGGATGACGACTAGGACTACGGACGGACTTAGAGCGTCAGATGCAG
+CGACTGGACTATTTAGGACGATCGGACTGAGGAGGGCAGTAGGACGCTAC
+GTATTTGGCGCGCGGCGCTACGGCTGAGCGTCGAGCTTGCGATACGCC
+>mm9_test_chromosome_351_400_+
+ACTATTACTTTATTATCTTACTCGGACGTAGACGGATCGGCAACGGGACT
+>mm9_test_chromosome_501_550_+
+TTTTCTACTTGAGACTGGGATCGAGGCGGACTTTTTAGGACGGGACTTGC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/extract_genomic_dna_out7.fasta	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,17 @@
+>mm9_test_chromosome_53_550_+
+TACTATCTGACTAGACTGGAGGCGCTTGCGACTGAGCTAGGACGTGCCAC
+TACGGGGATGACGACTAGGACTACGGACGGACTTAGAGCGTCAGATGCAG
+CGACTGGACTATTTAGGACGATCGGACTGAGGAGGGCAGTAGGACGCTAC
+GTATTTGGCGCGCGGCGCTACGGCTGAGCGTCGAGCTTGCGATACGCCGT
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAC
+TATTACTTTATTATCTTACTCGGACGTAGACGGATCGGCAACGGGACTGT
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGTT
+TTCTACTTGAGACTGGGATCGAGGCGGACTTTTTAGGACGGGACTTGCTA
+CTATCTGACTAGACTGGAGGCGCTTGCGACTGAGCTAGGACGTGCCACTA
+CGGGGATGACGACTAGGACTACGGACGGACTTAGAGCGTCAGATGCAGCG
+ACTGGACTATTTAGGACGATCGGACTGAGGAGGGCAGTAGGACGCTACGT
+ATTTGGCGCGCGGCGCTACGGCTGAGCGTCGAGCTTGCGATACGCCACTA
+TTACTTTATTATCTTACTCGGACGTAGACGGATCGGCAACGGGACTTTTT
+CTACTTGAGACTGGGATCGAGGCGGACTTTTTAGGACGGGACTTGC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff_filter_by_attribute_out1.gff	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,20 @@
+chr10	Cufflinks	transcript	62044837	62045189	1000	.	.	gene_id "CUFF.23531"; transcript_id "CUFF.23531.1"; FPKM "19.5178121606"; frac "1.000000"; conf_lo "9.264456"; conf_hi "29.771168"; cov "1.108611";
+chr10	Cufflinks	transcript	75372919	75373002	1000	.	.	gene_id "CUFF.24985"; transcript_id "CUFF.24985.1"; FPKM "124.4970510798"; frac "1.000000"; conf_lo "71.411330"; conf_hi "177.582772"; cov "7.071429";
+chr10	Cufflinks	transcript	80362428	80363292	1000	-	.	gene_id "CUFF.26065"; transcript_id "CUFF.26065.1"; FPKM "43.6170921216"; frac "1.000000"; conf_lo "32.260169"; conf_hi "54.974016"; cov "2.477449";
+chr11	Cufflinks	transcript	7904565	7904642	1000	.	.	gene_id "CUFF.33508"; transcript_id "CUFF.33508.1"; FPKM "61.6484988869"; frac "1.000000"; conf_lo "22.882428"; conf_hi "100.414569"; cov "3.501633";
+chr11	Cufflinks	exon	78140156	78140259	1000	.	.	gene_id "CUFF.43148"; transcript_id "CUFF.43148.1"; exon_number "1"; FPKM "54.8483511750"; frac "1.000000"; conf_lo "23.181641"; conf_hi "86.515061"; cov "3.115385";
+chr11	Cufflinks	exon	105616462	105616737	1000	.	.	gene_id "CUFF.48385"; transcript_id "CUFF.48385.1"; exon_number "1"; FPKM "18.9452034252"; frac "1.000000"; conf_lo "7.520816"; conf_hi "30.369591"; cov "1.076087";
+chr12	Cufflinks	exon	30701762	30702509	1000	.	.	gene_id "CUFF.53897"; transcript_id "CUFF.53897.1"; exon_number "1"; FPKM "48.9333329111"; frac "1.000000"; conf_lo "37.780391"; conf_hi "60.086275"; cov "2.779412";
+chr13	Cufflinks	exon	49159496	49159569	1000	.	.	gene_id "CUFF.67788"; transcript_id "CUFF.67788.1"; exon_number "1"; FPKM "44.9657653777"; frac "1.000000"; conf_lo "10.974842"; conf_hi "78.956689"; cov "2.554054";
+chr13	Cufflinks	transcript	100200304	100200330	1000	.	.	gene_id "CUFF.73108"; transcript_id "CUFF.73108.1"; FPKM "123.2395051093"; frac "1.000000"; conf_lo "30.079196"; conf_hi "216.399814"; cov "7.000000";
+chr14	Cufflinks	transcript	31949103	31949152	1000	.	.	gene_id "CUFF.77316"; transcript_id "CUFF.77316.1"; FPKM "85.5634278330"; frac "1.000000"; conf_lo "28.521143"; conf_hi "142.605713"; cov "4.860000";
+chr14	Cufflinks	exon	67604227	67604668	1000	.	.	gene_id "CUFF.81446"; transcript_id "CUFF.81446.1"; exon_number "1"; FPKM "123.6776546104"; frac "1.000000"; conf_lo "100.611653"; conf_hi "146.743656"; cov "7.024887";
+chr14	Cufflinks	exon	75165582	75165744	1000	.	.	gene_id "CUFF.82088"; transcript_id "CUFF.82088.1"; exon_number "1"; FPKM "20.4139057543"; frac "1.000000"; conf_lo "4.982443"; conf_hi "35.845368"; cov "1.159509";
+chr16	Cufflinks	transcript	57154027	57154067	1000	.	.	gene_id "CUFF.103364"; transcript_id "CUFF.103364.1"; FPKM "162.3154457537"; frac "1.000000"; conf_lo "75.554191"; conf_hi "249.076701"; cov "9.219512";
+chr16	Cufflinks	exon	74862302	74862560	1000	.	.	gene_id "CUFF.105450"; transcript_id "CUFF.105450.1"; exon_number "1"; FPKM "11.0120241741"; frac "1.000000"; conf_lo "2.020744"; conf_hi "20.003304"; cov "0.625483";
+chr16	Cufflinks	transcript	98168779	98168914	1000	.	.	gene_id "CUFF.107834"; transcript_id "CUFF.107834.1"; FPKM "24.4666664555"; frac "1.000000"; conf_lo "5.971605"; conf_hi "42.961728"; cov "1.389706";
+chr17	Cufflinks	exon	8483212	8483268	1000	.	.	gene_id "CUFF.108498"; transcript_id "CUFF.108498.1"; exon_number "1"; FPKM "50.0370923000"; frac "1.000000"; conf_lo "9.181978"; conf_hi "90.892207"; cov "2.842105";
+chr17	Cufflinks	exon	30355791	30355913	1000	.	.	gene_id "CUFF.111759"; transcript_id "CUFF.111759.1"; exon_number "1"; FPKM "19.3232673516"; frac "1.000000"; conf_lo "2.040012"; conf_hi "36.606523"; cov "1.097561";
+chr18	Cufflinks	transcript	39571718	39571880	1000	.	.	gene_id "CUFF.123569"; transcript_id "CUFF.123569.1"; FPKM "20.4139057543"; frac "1.000000"; conf_lo "4.982443"; conf_hi "35.845368"; cov "1.159509";
+chr19	Cufflinks	exon	17633088	17633203	1000	.	.	gene_id "CUFF.131333"; transcript_id "CUFF.131333.1"; exon_number "1"; FPKM "20.4893265884"; frac "1.000000"; conf_lo "2.163116"; conf_hi "38.815537"; cov "1.163793";
+chr19	Cufflinks	transcript	41997624	41997859	1000	.	.	gene_id "CUFF.133569"; transcript_id "CUFF.133569.1"; FPKM "28.1988698132"; frac "1.000000"; conf_lo "13.125940"; conf_hi "43.271800"; cov "1.601695";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/tophat_in1.fasta	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,14 @@
+>test_chromosome
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ACTACTATCTGACTAGACTGGAGGCGCTTGCGACTGAGCTAGGACGTGCC
+ACTACGGGGATGACGACTAGGACTACGGACGGACTTAGAGCGTCAGATGC
+AGCGACTGGACTATTTAGGACGATCGGACTGAGGAGGGCAGTAGGACGCT
+ACGTATTTGGCGCGCGGCGCTACGGCTGAGCGTCGAGCTTGCGATACGCC
+GTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG
+ACTATTACTTTATTATCTTACTCGGACGTAGACGGATCGGCAACGGGACT
+GTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG
+TTTTCTACTTGAGACTGGGATCGAGGCGGACTTTTTAGGACGGGACTTGC
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.sample	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,6 @@
+<tables>
+    <table name="twobit" comment_char="#">
+        <columns>dbkey, value</columns>
+        <file path="tool-data/twobit.loc" />
+    </table>
+</tables>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_dependencies.xml	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<tool_dependency>
+    <package name="bx-python" version="0.7.1">
+        <repository changeset_revision="7ce9cf37130f" name="package_bx_python_0_7" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+    </package>
+    <package name="faToTwoBit" version="35x1">
+        <repository changeset_revision="46615329ea72" name="package_fatotwobit_35x1" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+    </package>
+</tool_dependency>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/twobit.loc.sample	Tue Jan 19 09:34:23 2016 -0500
@@ -0,0 +1,26 @@
+#This is a sample file distributed with Galaxy that is used by some
+#tools.  The twobit.loc file has this format (white space characters 
+#are TAB characters):
+#
+#<Build>    <FullPathToFile>
+#
+#So, for example, if you had droPer1 twobit files stored in 
+#/depot/data2/galaxy/droPer1/, then the twobit.loc entry 
+#would look like this:
+#
+#droPer1    /depot/data2/galaxy/droPer1/droPer1.2bit
+#
+#and your /depot/data2/galaxy/droPer1/ directory would 
+#contain all of your twobit files (e.g.):
+#
+#-rw-rw-r--   1 nate   galaxy 48972650 2007-05-04 11:27 droPer1.2bit
+#...etc...
+#
+#Your twobit.loc file should include an entry per line for each twobit 
+#file you have stored.  For example:
+#
+#droPer1    /depot/data2/galaxy/droPer1/droPer1.2bit
+#apiMel2    /depot/data2/galaxy/apiMel2/apiMel2.2bit
+#droAna1    /depot/data2/galaxy/droAna1/droAna1.2bit
+#droAna2    /depot/data2/galaxy/droAna2/droAna2.2bit
+#...etc...