Repository 'jbrowse'
hg clone https://toolshed.g2.bx.psu.edu/repos/iuc/jbrowse

Changeset 3:7342f467507b (2015-12-31)
Previous changeset 2:b6a0e126dbee (2015-06-23) Next changeset 4:d022577ff9cf (2016-01-29)
Commit message:
Uploaded v0.4 of JBrowse
modified:
blastxml_to_gapped_gff3.py
gff3_rebase.py
jbrowse.py
jbrowse.xml
macros.xml
readme.rst
tool_dependencies.xml
added:
jbrowse-fromdir.xml
static/images/bam.png
static/images/bigwig.png
static/images/blast.png
static/images/opacity.png
static/images/sections.png
static/images/styling.png
test-data/bam/154.bam
test-data/bam/154.bam.bai
test-data/bam/test.xml
test-data/blastxml/blast-gene1.xml
test-data/blastxml/blast.xml
test-data/blastxml/blastn-gene1.xml
test-data/blastxml/merlin.gff
test-data/blastxml/test.xml
test-data/bw/data.bw
test-data/bw/test.xml
test-data/gencode/test-1.xml
test-data/gencode/test.xml
test-data/gff3/1.gff
test-data/gff3/2.gff
test-data/gff3/A.gff
test-data/gff3/B.gff
test-data/gff3/C.gff
test-data/gff3/D.gff
test-data/gff3/interpro.gff
test-data/gff3/merlin.gff
test-data/gff3/test.xml
test-data/index.html
test-data/vcf/test.vcf
test-data/vcf/test.xml
removed:
test-data/154.bam
test-data/154.bam.bai
test-data/154.bw
test-data/blast.xml
test-data/interpro.gff
test-data/merlin.gff
test-data/test.vcf
test.yml
b
diff -r b6a0e126dbee -r 7342f467507b blastxml_to_gapped_gff3.py
--- a/blastxml_to_gapped_gff3.py Tue Jun 23 12:10:15 2015 -0400
+++ b/blastxml_to_gapped_gff3.py Thu Dec 31 13:58:43 2015 -0500
[
@@ -28,6 +28,12 @@
     blast_records = NCBIXML.parse(blastxml)
     records = []
     for record in blast_records:
+        # http://www.sequenceontology.org/browser/release_2.4/term/SO:0000343
+        match_type = {  # Currently we can only handle BLASTN, BLASTP
+            'BLASTN': 'nucleotide_match',
+            'BLASTP': 'protein_match',
+        }.get(record.application, 'match')
+
         rec = SeqRecord(Seq("ACTG"), id=record.query)
         for hit in record.alignments:
             for hsp in hit.hsps:
@@ -67,10 +73,10 @@
                     if parent_match_end > hsp.query_end:
                         parent_match_end = hsp.query_end + 1
 
-                # The ``protein_match`` feature will hold one or more ``match_part``s
+                # The ``match`` feature will hold one or more ``match_part``s
                 top_feature = SeqFeature(
                     FeatureLocation(parent_match_start, parent_match_end),
-                    type="protein_match", strand=0,
+                    type=match_type, strand=0,
                     qualifiers=qualifiers
                 )
 
@@ -87,7 +93,7 @@
 
                     if trim:
                         # If trimming, then we start relative to the
-                        # protein_match's start
+                        # match's start
                         match_part_start = parent_match_start + start
                     else:
                         # Otherwise, we have to account for the subject start's location
@@ -108,6 +114,7 @@
                     )
 
                 rec.features.append(top_feature)
+        rec.annotations = {}
         records.append(rec)
     return records
 
@@ -252,5 +259,4 @@
     args = parser.parse_args()
 
     result = blastxml2gff3(**vars(args))
-
     GFF.write(result, sys.stdout)
b
diff -r b6a0e126dbee -r 7342f467507b gff3_rebase.py
--- a/gff3_rebase.py Tue Jun 23 12:10:15 2015 -0400
+++ b/gff3_rebase.py Thu Dec 31 13:58:43 2015 -0500
[
@@ -3,6 +3,7 @@
 import logging
 logging.basicConfig(level=logging.INFO)
 import argparse
+import copy
 from BCBio import GFF
 from Bio.SeqFeature import FeatureLocation
 log = logging.getLogger(__name__)
@@ -13,6 +14,70 @@
 __email__ = "esr@tamu.edu"
 
 
+def feature_lambda(feature_list, test, test_kwargs, subfeatures=True):
+    """Recursively search through features, testing each with a test function, yielding matches.
+
+    GFF3 is a hierachical data structure, so we need to be able to recursively
+    search through features. E.g. if you're looking for a feature with
+    ID='bob.42', you can't just do a simple list comprehension with a test
+    case. You don't know how deeply burried bob.42 will be in the feature tree. This is where feature_lambda steps in.
+
+    :type feature_list: list
+    :param feature_list: an iterable of features
+
+    :type test: function reference
+    :param test: a closure with the method signature (feature, **kwargs) where
+                 the kwargs are those passed in the next argument. This
+                 function should return True or False, True if the feature is
+                 to be yielded as part of the main feature_lambda function, or
+                 False if it is to be ignored. This function CAN mutate the
+                 features passed to it (think "apply").
+
+    :type test_kwargs: dictionary
+    :param test_kwargs: kwargs to pass to your closure when it is called.
+
+    :type subfeatures: boolean
+    :param subfeatures: when a feature is matched, should just that feature be
+                        yielded to the caller, or should the entire sub_feature
+                        tree for that feature be included? subfeatures=True is
+                        useful in cases such as searching for a gene feature,
+                        and wanting to know what RBS/Shine_Dalgarno_sequences
+                        are in the sub_feature tree (which can be accomplished
+                        with two feature_lambda calls). subfeatures=False is
+                        useful in cases when you want to process (and possibly
+                        return) the entire feature tree, such as applying a
+                        qualifier to every single feature.
+
+    :rtype: yielded list
+    :return: Yields a list of matching features.
+    """
+    # Either the top level set of [features] or the subfeature attribute
+    for feature in feature_list:
+        if test(feature, **test_kwargs):
+            if not subfeatures:
+                feature_copy = copy.deepcopy(feature)
+                feature_copy.sub_features = []
+                yield feature_copy
+            else:
+                yield feature
+
+        if hasattr(feature, 'sub_features'):
+            for x in feature_lambda(feature.sub_features, test, test_kwargs, subfeatures=subfeatures):
+                yield x
+
+
+def feature_test_qual_value(feature, **kwargs):
+    """Test qualifier values.
+
+    For every feature, check that at least one value in
+    feature.quailfiers(kwargs['qualifier']) is in kwargs['attribute_list']
+    """
+    for attribute_value in feature.qualifiers.get(kwargs['qualifier'], []):
+        if attribute_value in kwargs['attribute_list']:
+            return True
+    return False
+
+
 def __get_features(child, interpro=False):
     child_features = {}
     for rec in GFF.parse(child):
@@ -69,30 +134,35 @@
     child_features = __get_features(child, interpro=interpro)
 
     for rec in GFF.parse(parent):
-        # TODO, replace with recursion in case it's matched against a
-        # non-parent feature. We're cheating a bit here right now...
         replacement_features = []
-        for feature in rec.features:
-            if feature.id in child_features:
-                new_subfeatures = child_features[feature.id]
-                # TODO: update starts
-                fixed_subfeatures = []
-                for x in new_subfeatures:
-                    # Then update the location of the actual feature
-                    __update_feature_location(x, feature, protein2dna)
+        for feature in feature_lambda(
+                rec.features,
+                feature_test_qual_value,
+                {
+                    'qualifier': 'ID',
+                    'attribute_list': child_features.keys(),
+                },
+                subfeatures=False):
 
-                    if interpro:
-                        for y in ('status', 'Target'):
-                            try:
-                                del x.qualifiers[y]
-                            except:
-                                pass
+            new_subfeatures = child_features[feature.id]
+            fixed_subfeatures = []
+            for x in new_subfeatures:
+                # Then update the location of the actual feature
+                __update_feature_location(x, feature, protein2dna)
 
-                    fixed_subfeatures.append(x)
-                replacement_features.extend(fixed_subfeatures)
+                if interpro:
+                    for y in ('status', 'Target'):
+                        try:
+                            del x.qualifiers[y]
+                        except:
+                            pass
+
+                fixed_subfeatures.append(x)
+            replacement_features.extend(fixed_subfeatures)
         # We do this so we don't include the original set of features that we
         # were rebasing against in our result.
         rec.features = replacement_features
+        rec.annotations = {}
         GFF.write([rec], sys.stdout)
 
 
b
diff -r b6a0e126dbee -r 7342f467507b jbrowse-fromdir.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jbrowse-fromdir.xml Thu Dec 31 13:58:43 2015 -0500
[
@@ -0,0 +1,40 @@
+<tool id="jbrowse_to_standalone" name="JBrowse - Data Directory to Standalone" version="0.4">
+  <description>upgrades the bare data directory to a full JBrowse instance</description>
+  <macros>
+    <import>macros.xml</import>
+  </macros>
+  <expand macro="requirements"/>
+  <expand macro="stdio"/>
+  <version_command>python jbrowse.py --version</version_command>
+  <command><![CDATA[
+## Create output directory
+mkdir -p $output.files_path &&
+## Copy in jbrowse
+cp -R \${JBROWSE_SOURCE_DIR}/* $output.files_path/ &&
+
+## Copy in data directory
+cp -R $input.dataset.extra_files_path/data/ $output.files_path/ &&
+mv $output.files_path/index.html $output
+]]></command>
+  <inputs>
+    <param label="JBrowse Data Directory"
+           name="input"
+           type="data"
+           help="Look for datasets with 'JBrowse ... Data Directory' in the name"
+           format="html" />
+  </inputs>
+  <outputs>
+      <data format="html" name="output" label="#set $name = $input.name.replace('Data Directory', 'Standalone')# $name"/>
+  </outputs>
+  <help><![CDATA[
+Upgrades an existing bare JBrowse "data" directory into a full-fledged JBrowse instance.
+
+@ATTRIBUTION@
+]]></help>
+  <tests>
+  </tests>
+  <citations>
+    <citation type="doi">10.1101/gr.094607.109</citation>
+  </citations>
+</tool>
+
b
diff -r b6a0e126dbee -r 7342f467507b jbrowse.py
--- a/jbrowse.py Tue Jun 23 12:10:15 2015 -0400
+++ b/jbrowse.py Thu Dec 31 13:58:43 2015 -0500
[
b'@@ -1,142 +1,133 @@\n #!/usr/bin/env python\n-from string import Template\n import os\n+import copy\n import argparse\n import subprocess\n import hashlib\n+import struct\n import tempfile\n+import shutil\n import json\n-import yaml\n+from Bio.Data import CodonTable\n+import xml.etree.ElementTree as ET\n import logging\n-logging.basicConfig()\n-log = logging.getLogger(__name__)\n-\n-COLOR_FUNCTION_TEMPLATE = Template("""\n-function(feature, variableName, glyphObject, track) {\n-    var score = ${score};\n-    ${opacity}\n-    return \'rgba(${red}, ${green}, ${blue}, \' + opacity + \')\';\n-}\n-""")\n-\n-BLAST_OPACITY_MATH = """\n-var opacity = 0;\n-if(score == 0.0) {\n-    opacity = 1;\n-} else{\n-    opacity = (20 - Math.log10(score)) / 180;\n-}\n-"""\n-\n-BREWER_COLOUR_IDX = 0\n-BREWER_COLOUR_SCHEMES = [\n-    (228, 26, 28),\n-    (55, 126, 184),\n-    (77, 175, 74),\n-    (152, 78, 163),\n-    (255, 127, 0),\n-]\n+from collections import defaultdict\n+logging.basicConfig(level=logging.INFO)\n+log = logging.getLogger(\'jbrowse\')\n \n \n-# score comes from feature._parent.get(\'score\') or feature.get(\'score\')\n-# Opacity math\n+class ColorScaling(object):\n+\n+    COLOR_FUNCTION_TEMPLATE = """\n+    function(feature, variableName, glyphObject, track) {{\n+        var score = {score};\n+        {opacity}\n+        return \'rgba({red}, {green}, {blue}, \' + opacity + \')\';\n+    }}\n+    """\n+\n+    COLOR_FUNCTION_TEMPLATE_QUAL = """\n+    function(feature, variableName, glyphObject, track) {{\n+        var search_up = function self(sf, attr){{\n+            if(sf.get(attr) !== undefined){{\n+                return sf.get(attr);\n+            }}\n+            if(sf.parent() === undefined) {{\n+                return;\n+            }}else{{\n+                return self(sf.parent(), attr);\n+            }}\n+        }};\n \n-TN_TABLE = {\n-    \'gff3\': \'--gff\',\n-    \'gff\': \'--gff\',\n-    \'bed\': \'--bed\',\n-    # \'genbank\': \'--gbk\',\n-}\n+        var search_down = function self(sf, attr){{\n+            if(sf.get(attr) !== undefined){{\n+                return sf.get(attr);\n+            }}\n+            if(sf.children() === undefined) {{\n+                return;\n+            }}else{{\n+                var kids = sf.children();\n+                for(var child_idx in kids){{\n+                    var x = self(kids[child_idx], attr);\n+                    if(x !== undefined){{\n+                        return x;\n+                    }}\n+                }}\n+                return;\n+            }}\n+        }};\n+\n+        var color = ({user_spec_color} || search_up(feature, \'color\') || search_down(feature, \'color\') || {auto_gen_color});\n+        var score = (search_up(feature, \'score\') || search_down(feature, \'score\'));\n+        {opacity}\n+        var result = /^#?([a-f\\d]{{2}})([a-f\\d]{{2}})([a-f\\d]{{2}})$/i.exec(color);\n+        var red = parseInt(result[1], 16);\n+        var green = parseInt(result[2], 16);\n+        var blue = parseInt(result[3], 16);\n+        if(isNaN(opacity) || opacity < 0){{ opacity = 0; }}\n+        return \'rgba(\' + red + \',\' + green + \',\' + blue + \',\' + opacity + \')\';\n+    }}\n+    """\n \n-INSTALLED_TO = os.path.dirname(os.path.realpath(__file__))\n-\n-\n-class JbrowseConnector(object):\n+    OPACITY_MATH = {\n+        \'linear\': """\n+            var opacity = (score - ({min})) / (({max}) - ({min}));\n+        """,\n+        \'logarithmic\': """\n+            var opacity = (score - ({min})) / (({max}) - ({min}));\n+            opacity = Math.log10(opacity) + Math.log10({max});\n+        """,\n+        \'blast\': """\n+            var opacity = 0;\n+            if(score == 0.0) {\n+                opacity = 1;\n+            } else{\n+                opacity = (20 - Math.log10(score)) / 180;\n+            }\n+        """\n+    }\n \n-    def __init__(self, jbrowse, jbrowse_dir, outdir, genome):\n-        self.jbrowse = jbrowse\n-        self.jbrowse_dir = jbrowse_dir\n-        self.outdir = outdir\n-        self.genome_path = genome\n+    BREWER_COLOUR_IDX = 0\n+    BREWER_COLOUR_SCHEMES = [\n+        (166, 206, 227),\n+        (31, 120, 180)'..b'tputTrackConfig)\n \n     def clone_jbrowse(self, jbrowse_dir, destination):\n+        """Clone a JBrowse directory into a destination directory.\n+        """\n         # JBrowse seems to have included some bad symlinks, cp ignores bad symlinks\n         # unlike copytree\n-        cmd = [\'mkdir\', \'-p\', destination]\n+        cmd = [\'cp\', \'-r\', os.path.join(jbrowse_dir, \'.\'), destination]\n+        log.debug(\' \'.join(cmd))\n         subprocess.check_call(cmd)\n-        cmd = [\'cp\', \'-r\', jbrowse_dir, destination]\n-        subprocess.check_call(cmd)\n-        cmd = [\'mkdir\', \'-p\', os.path.join(destination, \'JBrowse-1.11.6\',\n-                                           \'data\', \'raw\')]\n+        cmd = [\'mkdir\', \'-p\', os.path.join(destination, \'data\', \'raw\')]\n+        log.debug(\' \'.join(cmd))\n         subprocess.check_call(cmd)\n \n         # http://unix.stackexchange.com/a/38691/22785\n         # JBrowse releases come with some broken symlinks\n         cmd = [\'find\', destination, \'-type\', \'l\', \'-xtype\', \'l\', \'-exec\', \'rm\', "\'{}\'", \'+\']\n+        log.debug(\' \'.join(cmd))\n         subprocess.check_call(cmd)\n \n \n if __name__ == \'__main__\':\n     parser = argparse.ArgumentParser(description="", epilog="")\n-    parser.add_argument(\'genome\', type=file, help=\'Input genome file\')\n-    parser.add_argument(\'yaml\', type=file, help=\'Track Configuration\')\n+    parser.add_argument(\'xml\', type=file, help=\'Track Configuration\')\n \n     parser.add_argument(\'--jbrowse\', help=\'Folder containing a jbrowse release\')\n     parser.add_argument(\'--outdir\', help=\'Output directory\', default=\'out\')\n+    parser.add_argument(\'--standalone\', help=\'Standalone mode includes a copy of JBrowse\', action=\'store_true\')\n     args = parser.parse_args()\n \n+    tree = ET.parse(args.xml.name)\n+    root = tree.getroot()\n+\n     jc = JbrowseConnector(\n         jbrowse=args.jbrowse,\n-        jbrowse_dir=os.path.join(args.outdir, \'JBrowse-1.11.6\'),\n         outdir=args.outdir,\n-        genome=os.path.realpath(args.genome.name),\n+        genomes=[os.path.realpath(x.text) for x in root.findall(\'metadata/genomes/genome\')],\n+        standalone=args.standalone,\n+        gencode=root.find(\'metadata/gencode\').text\n     )\n \n-    track_data = yaml.load(args.yaml)\n-    for track in track_data:\n-        path = os.path.realpath(track[\'file\'])\n-        extra = track.get(\'options\', {})\n-        if \'__unused__\' in extra:\n-            del extra[\'__unused__\']\n-\n-        for possible_partial_path in (\'bam_index\', \'parent\'):\n-            if possible_partial_path in extra:\n-                extra[possible_partial_path] = os.path.realpath(\n-                    extra[possible_partial_path])\n-        extra[\'category\'] = track.get(\'category\', \'Default\')\n+    for track in root.findall(\'tracks/track\'):\n+        track_conf = {}\n+        track_conf[\'trackfiles\'] = [\n+            (os.path.realpath(x.attrib[\'path\']), x.attrib[\'ext\'], x.attrib[\'label\'])\n+            for x in track.findall(\'files/trackFile\')\n+        ]\n \n-        jc.process_annotations(path, track[\'label\'], track[\'ext\'], **extra)\n-\n-    print """\n-    <html>\n-        <body>\n-        <script type="text/javascript">\n-            window.location=JBrowse-1.11.6/index.html\n-        </script>\n-        <a href="JBrowse-1.11.6/index.html">Go to JBrowse</a>\n-        <p>Please note that JBrowse functions best on production Galaxy\n-        instances. The paste server used in development instances has issues\n-        serving the volumes of data regularly involved in JBrowse</p>\n-        </body>\n-    </html>\n-    """\n+        track_conf[\'category\'] = track.attrib[\'cat\']\n+        track_conf[\'format\'] = track.attrib[\'format\']\n+        try:\n+            # Only pertains to gff3 + blastxml. TODO?\n+            track_conf[\'style\'] = {t.tag: t.text for t in track.find(\'options/style\')}\n+        except TypeError, te:\n+            track_conf[\'style\'] = {}\n+            pass\n+        track_conf[\'conf\'] = etree_to_dict(track.find(\'options\'))\n+        jc.process_annotations(track_conf)\n'
b
diff -r b6a0e126dbee -r 7342f467507b jbrowse.xml
--- a/jbrowse.xml Tue Jun 23 12:10:15 2015 -0400
+++ b/jbrowse.xml Thu Dec 31 13:58:43 2015 -0500
[
b'@@ -1,4 +1,4 @@\n-<tool id="jbrowse" name="JBrowse" version="0.3">\n+<tool id="jbrowse" name="JBrowse" version="0.4">\n   <description>genome browser</description>\n   <macros>\n     <import>macros.xml</import>\n@@ -6,106 +6,317 @@\n   <expand macro="requirements"/>\n   <expand macro="stdio"/>\n   <version_command>python jbrowse.py --version</version_command>\n-  <command interpreter="python"><![CDATA[jbrowse.py\n-$positional_1\n-$trackYaml\n+  <command><![CDATA[\n+mkdir -p $output.files_path &&\n+## Copy the XML file into the directory, mostly for debugging\n+## but nice if users want to reproduce locally\n+cp $trackxml $output.files_path/galaxy.xml &&\n+\n+## Once that\'s done, we run the python script to handle the real work\n+python $__tool_directory__/jbrowse.py\n+$trackxml\n \n --jbrowse \\${JBROWSE_SOURCE_DIR}\n---outdir $default.files_path\n-> $default]]></command>\n+#if str($standalone) == "Complete":\n+    --standalone\n+#end if\n+--outdir $output.files_path;\n+\n+#if str($standalone) == "Complete":\n+    mv $output.files_path/index.html $output;\n+#else:\n+    mv $dummyIndex $output;\n+#end if\n+\n+\n+## Ugly testing hack since I cannot get <extra_files> to test the files I want to test. Hmph.\n+#if str($uglyTestingHack) == "enabled":\n+    mv $trackxml $output\n+#end if\n+]]></command>\n   <configfiles>\n-      <configfile name="trackYaml">\n----\n-#for $track in $data_tracks:\n-  -\n-    file: ${track.data_format.annotation}\n-    ext: ${track.data_format.annotation.ext}\n-    label: "${track.annotation_label}"\n-    category: "${track.category}"\n-    options:\n-        __unused__: "Not used...just to ensure options has at least one key"\n-    #if str($track.data_format.data_format_select) == "wiggle":\n-        type: ${track.data_format.xyplot}\n-        variance_band: ${track.data_format.var_band}\n-      #if str($track.data_format.scaling.scale_select) == "auto_local":\n-        autoscale: local\n-      #else if str($track.data_format.scaling.scale_select) == "auto_global":\n-        autoscale: global\n-      #else:\n-        min: ${track.data_format.scaling.minimum}\n-        max: ${track.data_format.scaling.maximum}\n-      #end if\n-    #else if str($track.data_format.data_format_select) == "pileup":\n-        auto_snp: ${track.data_format.auto_snp}\n-        bam_index: ${track.data_format.annotation.metadata.bam_index}\n-    #else if str($track.data_format.data_format_select) == "blast":\n-        parent: ${track.data_format.blast_parent}\n-        protein: ${track.data_format.is_protein}\n-        min_gap: ${track.data_format.min_gap}\n-        match: true\n-    #else if str($track.data_format.data_format_select) == "gene_calls":\n-        match: ${track.data_format.match_part}\n-    #end if\n-#end for\n+      <configfile name="dummyIndex">\n+      <![CDATA[\n+      <html>\n+          <head>\n+          </head>\n+          <body>\n+              <h1>JBrowse Data Directory</h1>\n+              <p>\n+                Hi! This is not a full JBrowse instance. JBrowse v0.4(+?)\n+                started shipping with the ability to produce just the\n+                "data" directory from a JBrowse instance, rather than a\n+                complete, standalone instance. This was intended to be used\n+                with the in-development Apollo integration, but may have other\n+                uses as well.\n+              </p>\n+              <p>\n+                <u>This is not usable on its own</u>. The output dataset may be\n+                used with Apollo, or may be passed through the "JBrowse -\n+                Convert to Standalone" tool in Galaxy to "upgrade" to a full\n+                JBrowse instance.\n+              </p>\n+          </body>\n+      </html>\n+          ]]>\n+      </configfile>\n+      <configfile name="trackxml"><![CDATA[<?xml version="1.0"?>\n+<root>\n+    <metadata>\n+        <gencode>$gencode</gencode>\n+        <genomes>\n+            #for $genome in $genomes:\n+                <genome>$genome</genome>\n+            #end for\n+        </genomes>\n+    </metadata>\n+    <tracks>\n+       '..b'here are no other configuration options exposed for bam\n+files. If you find JBrowse options you wish to see exposed, please let\n+`me <mailto:esr+jig@tamu.edu>`__ know.\n+\n+BlastXML\n+~~~~~~~~\n+\n+.. image:: blast.png\n+\n+JiG now supports both blastn and blastp datasets. JiG internally uses a\n+blastXML to gapped GFF3 tool to convert your blastxml datasets into a\n+format amenable to visualization in JBrowse. This tool is also\n+available separately from the IUC on the toolshed.\n+\n+**Minimum Gap Size** reflects how long a gap must be before it becomes a\n+real gap in the processed gff3 file. In the picture above, various sizes\n+of gaps can be seen. If the minimum gap size was set much higher, say\n+100nt, many of the smaller gaps would disappear, and the features on\n+both sides would be merged into one, longer feature. This setting is\n+inversely proportional to runtime and output file size. *Do not set this\n+to a low value for large datasets*. By setting this number lower, you\n+will have extremely large outputs and extremely long runtimes. The\n+default was configured based off of the author\'s experience, but the\n+author only works on small viruses. It is *strongly* recommended that\n+you filter your blast results before display, e.g. picking out the top\n+10 hits or so.\n+\n+**Protein blast search** option merely informs underlying tools that\n+they should adjust feature locations by 3x.\n+\n+Styling Options\n+^^^^^^^^^^^^^^^\n+\n+Please see the styling options for GFF3 datasets, they are identical.\n+\n+Feature Score Scaling & Coloring Options\n+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n+\n+Please see the score scaling and colouring options for GFF3 datasets,\n+they are identical. Remember to set your score scaling to "blast" method\n+if you do use it.\n+\n+Bigwig XY\n+~~~~~~~~~\n+\n+.. image:: bigwig.png\n+\n+**XYPlot**\n+\n+BigWig tracks can be displayed as a "density" plot which is continuous\n+line which varies in colour, or as an "XYplot." XYplots are preferable\n+for users to visually identify specific features in a bigwig track,\n+however density tracks are more visually compact.\n+\n+**Variance Band** is an option available to XYPlots, and can be seen in\n+the third and fourth tracks in the above picture. This overlays a mean\n+line, and 1 and 2 standard deviation areas.\n+\n+**Track Scaling** is different from colour scaling, instead it\n+configures how the track behaves inside of JBrowse. **Autoscaling\n+globally** means that JBrowse will determine the minimum and maximum for\n+the track, and fix the bounds of the viewport to that. E.g. if your\n+track ranges from 1-1000, and the region you\'re currently zoomed to only\n+goes from 0-50, then the viewport range will still show 1-1000. This is\n+good for global genomic context. However you may wish to consider\n+**autoscaling locally** instead. In the example of a region which varies\n+from 0-50, autoscaling locally would cause the individual track\'s\n+viewport to re-adjust and show just the 0-50 region. If neither of these\n+options are palatable, you may manually hardcode the minimum and\n+maximums for the track to scale to.\n+\n+Colour Options\n+^^^^^^^^^^^^^^\n+\n+BigWig tracks have two colours in JBrowse, a positive and a negative\n+colour.\n+\n+As always you may manually choose a colour, or let JiG choose for you.\n+\n+One of the more interesting options is the **Bicolor pivot**. This\n+option allows you to control the point at which JBrowse switches from\n+the positive colour to the negative. In the above graphic, you can see\n+this has been configured to "mean" for the first two (orange and blue)\n+tracks.\n+\n+VCFs/SNPs\n+~~~~~~~~~\n+\n+These tracks do not support any special configuration.\n+\n+Known Issues\n+------------\n+\n+-  More than 30 landmark features cannot be listed in the manual\n+   selector.\n+-  Non GFF3 likely has issue with automatically determined min/max\n+   scores. Manually specify minimum and maximum score attributes, or do\n+   not use varied colours based on scores to avoid this issue.\n+\n \n @ATTRIBUTION@\n ]]></help>\n'
b
diff -r b6a0e126dbee -r 7342f467507b macros.xml
--- a/macros.xml Tue Jun 23 12:10:15 2015 -0400
+++ b/macros.xml Thu Dec 31 13:58:43 2015 -0500
[
b'@@ -2,11 +2,13 @@\n <macros>\n   <xml name="requirements">\n     <requirements>\n-      <requirement type="package" version="1.11.6">jbrowse</requirement>\n+      <requirement type="package" version="1.12.0">jbrowse</requirement>\n+      <requirement type="package" version="1.12.0">bundle_jbrowse</requirement>\n       <requirement type="package" version="2.7">python</requirement>\n-      <requirement type="package" version="5.18">perl</requirement>\n+      <requirement type="package" version="5.18.1">perl</requirement>\n+      <requirement type="package" version="1.66">biopython</requirement>\n+      <requirement type="package" version="0.6.2">bcbiogff</requirement>\n       <requirement type="package" version="1.2">samtools</requirement>\n-      <requirement type="package" version="1.0">bundle_jbrowse</requirement>\n       <requirement type="package" version="3.11">pyyaml</requirement>\n       <yield/>\n     </requirements>\n@@ -23,7 +25,203 @@\n   <token name="@ATTRIBUTION@"><![CDATA[\n **Attribution**\n \n-This Galaxy tool relies on the JBrowse, maintained by the GMOD Community\n+This Galaxy tool relies on the JBrowse, maintained by the GMOD Community. The Galaxy wrapper is developed by Eric Rasche\n ]]>\n   </token>\n+  <xml name="auto_manual_tk"\n+      token_cond_label="Color"\n+      token_cond_name="color"\n+      token_select_label="Color Specification"\n+      token_select_name="color_select"\n+      token_automatic_label="Automatically selected"\n+      token_manual_label="Manual Color Selection">\n+    <conditional name="@COND_NAME@" label="@COND_LABEL@">\n+      <param type="select" label="@SELECT_LABEL@" name="@SELECT_NAME@">\n+        <option value="automatic" selected="true">@AUTOMATIC_LABEL@</option>\n+        <option value="manual">@MANUAL_LABEL@</option>\n+      </param>\n+      <when value="automatic">\n+      </when>\n+      <when value="manual">\n+        <yield />\n+      </when>\n+    </conditional>\n+  </xml>\n+\n+  <xml name="jb_color"\n+      token_label="JBrowse style.color"\n+      token_name="style_color"\n+      token_value="goldenrod"\n+      token_help="Basic color of features. Most glyphs interpret this as the fill color of the rectangle they draw. Color syntax is the same as that used for CSS"\n+      >\n+    <param label="@LABEL@" type="color" name="@NAME@" value="@VALUE@" help="@HELP@">\n+      <sanitizer>\n+        <valid initial="string.letters,string.digits">\n+          <add value="#" />\n+        </valid>\n+      </sanitizer>\n+    </param>\n+  </xml>\n+\n+  <xml name="auto_color"\n+       token_cond_label="Color"\n+       token_cond_name="color"\n+       token_select_label="Color Selection"\n+       token_select_name="color_select"\n+       token_automatic_label="Automatically selected"\n+       token_manual_label="Manual Color Selection">\n+    <expand macro="auto_manual_tk"\n+            cond_label="@COND_LABEL@"\n+            cond_name="@COND_NAME@"\n+            select_label="@SELECT_LABEL@"\n+            select_name="@SELECT_NAME@"\n+            automatic_label="@AUTOMATIC_LABEL@"\n+            manual_label="@MANUAL_LABEL@">\n+      <expand macro="jb_color" />\n+        <yield />\n+    </expand>\n+  </xml>\n+\n+\n+\n+  <xml name="brewer_scheme">\n+    <param type="select" label="Brewer color Scheme" name="brewer_scheme">\n+        <option value="BrBg">BrBg: Brown - Blue Green</option>\n+        <option value="PiYg">PiYg: Pink - Yellow Green</option>\n+        <option value="PRGn">PRGn: Purple Red - Green</option>\n+        <option value="PuOr">PuOr: Purple - Orange</option>\n+        <option value="RdBu" selected="true">RdBu: Red - Blue</option>\n+        <option value="RdGy">RdGy: Red - Gray</option>\n+        <option value="RdYlBu">RdYlBu: Red - Yellow - Blue</option>\n+        <option value="RdYlGn">RdYlBu: Red - Yellow - Green</option>\n+        <option value="Spectral">Spectral</option>\n+    </param>\n+  </xml>\n+  <xml name="color_selection_minmax">\n+    <section name="jbcolor" title="JBrowse Color Options [Advanced]" expanded="false">\n+      <!-- Abuse auto/manual'..b's sense to request a logarithmic scaling of the color values. Logarithmic is indeed the default for blast. However other analysis methods may produce scores on ranges such as [0, 100] where a linear scale would be more appropriate for color distribution.">\n+              <option value="linear"      selected="@SCALING_LIN_SELECT@" >Linear scaling</option>\n+              <option value="logarithmic" selected=""                     >Logarithmic scaling</option>\n+              <option value="blast"       selected="@SCALING_LOG_SELECT@" >Blast scaling</option>\n+            </param>\n+\n+            <!-- Scaling Bounds -->\n+            <conditional name="score_scales" label="Minimum/Maximum values for track scores">\n+              <param type="select" label="How should minimum and maximum values be determined for the scores of the features" name="scale_select">\n+                <option value="automatic" selected="true">Automatically determined</option>\n+                <option value="manual">Manually specify minimum and maximum expected scores for the feature track</option>\n+              </param>\n+              <when value="automatic">\n+              </when>\n+              <when value="manual">\n+                <param label="Minimum expected score" name="minimum" type="integer" value="0" />\n+                <param label="Maximum expected score" name="maximum" type="integer" value="100" />\n+              </when>\n+            </conditional>\n+\n+            <!-- Scale color -->\n+            <conditional name="color_scheme" label="Color Scheme for scored features">\n+              <param type="select" label="JBrowse style.color function\'s color scheme for scored values" name="score_scheme">\n+                <option value="opacity">Opacity (high scores = 1.0 opacity)</option>\n+                <!--<option value="brewer">Brewer Color Schemes</option>-->\n+              </param>\n+              <when value="opacity">\n+                <!-- Single color selection mode -->\n+                <expand macro="auto_color" />\n+              </when>\n+              <!--<when value="brewer">-->\n+                <!--[> Brewer continuum selection <]-->\n+                <!--<expand macro="brewer_scheme" />-->\n+              <!--</when>-->\n+            </conditional>\n+        </when>\n+      </conditional>\n+    </section>\n+  </xml>\n+  <xml name="track_styling"\n+       token_classname="feature"\n+       token_label="name,id"\n+       token_description="note,description"\n+       token_height="100px">\n+    <section name="jbstyle" title="JBrowse Styling Options [Advanced]" expanded="false">\n+        <param label="JBrowse style.className" type="text"\n+               name="style_classname"\n+               value="@CLASSNAME@"\n+               help="Set CSS style.className property"/>\n+        <param label="JBrowse style.label"\n+               type="text"\n+               name="style_label"\n+               value="@LABEL@"\n+               help="Comma-separated list of case-insensitive feature tags to use for showing the feature\'s label. The first one found will be used. Default \'name,id\'" />\n+        <param label="JBrowse style.description"\n+               type="text"\n+               name="style_description"\n+               value="@DESCRIPTION@"\n+               help="Comma-separated list of case-insensitive feature tags to check for the feature\'s long description. The first one found will be used."/>\n+        <param label="JBrowse style.height"\n+               type="text"\n+               name="style_height"\n+               value="@HEIGHT@"\n+               help="Height in pixels of glyphs. Default value varies from glyph to glyph. Note that the \'compact\' displayMode uses style->height * 0.35 so changing style height can adjust the compact visualization."/>\n+    </section>\n+  </xml>\n+\n+  <xml name="input_conditional" token_label="Track Data" token_format="data">\n+      <param label="@LABEL@" format="@FORMAT@" name="annotation" type="data" multiple="True"/>\n+  </xml>\n </macros>\n'
b
diff -r b6a0e126dbee -r 7342f467507b readme.rst
--- a/readme.rst Tue Jun 23 12:10:15 2015 -0400
+++ b/readme.rst Thu Dec 31 13:58:43 2015 -0500
b
@@ -6,26 +6,31 @@
 
 Thus, it makes an ideal fit with Galaxy, especially for use as a
 workflow summary. E.g. annotate a genome, then visualise all of the
-associated datasets as an interactive HTML page.
+associated datasets as an interactive HTML page. This tool MUST be whitelisted
+(or ``sanitize_all_html=False``) to function correctly.
 
 Installation
 ============
 
-It is recommended to install this wrapper via the Galaxy Tool Shed
+It is recommended to install this wrapper via the Galaxy Tool Shed.
 
 Running Locally
 ===============
 
 The Galaxy tool interface writes out a yaml file which is then used to generate
 the visualizations. An example used during development/testing can be seen in
-`test.yml`. The format is in no way rigorously defined and is likely to change
-at any time.
+`test-data/*/test.xml`. The format is in no way rigorously defined and is
+likely to change at any time! Beware. ;)
 
 History
 =======
 
--  0.1 Initial public release
--  0.2 Added support for BAM, Blast, VCF
+-  0.4 Support for dataset collections and customisation of tracks including
+   labelling, colours, styling. Added support for genetic code selection.
+   Fixed package installation recipe issues.
+-  0.3 Added support for BigWig, etc.
+-  0.2 Added support for BAM, Blast, VCF.
+-  0.1 Initial public release.
 
 Wrapper License (MIT/BSD Style)
 ===============================
b
diff -r b6a0e126dbee -r 7342f467507b static/images/bam.png
b
Binary file static/images/bam.png has changed
b
diff -r b6a0e126dbee -r 7342f467507b static/images/bigwig.png
b
Binary file static/images/bigwig.png has changed
b
diff -r b6a0e126dbee -r 7342f467507b static/images/blast.png
b
Binary file static/images/blast.png has changed
b
diff -r b6a0e126dbee -r 7342f467507b static/images/opacity.png
b
Binary file static/images/opacity.png has changed
b
diff -r b6a0e126dbee -r 7342f467507b static/images/sections.png
b
Binary file static/images/sections.png has changed
b
diff -r b6a0e126dbee -r 7342f467507b static/images/styling.png
b
Binary file static/images/styling.png has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/154.bam
b
Binary file test-data/154.bam has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/154.bam.bai
b
Binary file test-data/154.bam.bai has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/154.bw
b
Binary file test-data/154.bw has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/bam/154.bam
b
Binary file test-data/bam/154.bam has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/bam/154.bam.bai
b
Binary file test-data/bam/154.bam.bai has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/bam/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/bam/test.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+        <track cat="Default" format="pileup">
+            <files>
+                <trackFile path="test-data/bam/154.bam" ext="bam" label="Basic"/>
+            </files>
+            <options>
+                <pileup>
+                    <auto_snp>false</auto_snp>
+                    <bam_indices>
+                        <bam_index>test-data/bam/154.bam.bai</bam_index>
+                    </bam_indices>
+                </pileup>
+            </options>
+        </track>
+        <track cat="Default" format="pileup">
+            <files>
+                <trackFile path="test-data/bam/154.bam" ext="bam" label="Auto-SNP"/>
+            </files>
+            <options>
+                <pileup>
+                    <auto_snp>true</auto_snp>
+                    <bam_indices>
+                        <bam_index>test-data/bam/154.bam.bai</bam_index>
+                    </bam_indices>
+                </pileup>
+            </options>
+        </track>
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/blast.xml
--- a/test-data/blast.xml Tue Jun 23 12:10:15 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,4514 +0,0 @@\n-<?xml version="1.0"?>\n-<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">\n-<BlastOutput>\n-  <BlastOutput_program>blastp</BlastOutput_program>\n-  <BlastOutput_version>BLASTP 2.2.28+</BlastOutput_version>\n-  <BlastOutput_reference>Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&amp;auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), &quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search programs&quot;, Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>\n-  <BlastOutput_db>/usr/local/syncdb/community/nr/nr</BlastOutput_db>\n-  <BlastOutput_query-ID>Query_1</BlastOutput_query-ID>\n-  <BlastOutput_query-def>Merlin_1</BlastOutput_query-def>\n-  <BlastOutput_query-len>229</BlastOutput_query-len>\n-  <BlastOutput_param>\n-    <Parameters>\n-      <Parameters_matrix>BLOSUM62</Parameters_matrix>\n-      <Parameters_expect>0.001</Parameters_expect>\n-      <Parameters_gap-open>11</Parameters_gap-open>\n-      <Parameters_gap-extend>1</Parameters_gap-extend>\n-      <Parameters_filter>F</Parameters_filter>\n-    </Parameters>\n-  </BlastOutput_param>\n-<BlastOutput_iterations>\n-<Iteration>\n-  <Iteration_iter-num>1</Iteration_iter-num>\n-  <Iteration_query-ID>Query_1</Iteration_query-ID>\n-  <Iteration_query-def>Merlin_1</Iteration_query-def>\n-  <Iteration_query-len>229</Iteration_query-len>\n-<Iteration_hits>\n-<Hit>\n-  <Hit_num>1</Hit_num>\n-  <Hit_id>gi|422934611|ref|YP_007004572.1|</Hit_id>\n-  <Hit_def>hypothetical protein [Enterobacteria phage ime09] &gt;gi|339791394|gb|AEK12451.1| hypothetical protein [Enterobacteria phage ime09]</Hit_def>\n-  <Hit_accession>YP_007004572</Hit_accession>\n-  <Hit_len>685</Hit_len>\n-  <Hit_hsps>\n-    <Hsp>\n-      <Hsp_num>1</Hsp_num>\n-      <Hsp_bit-score>197.593</Hsp_bit-score>\n-      <Hsp_score>501</Hsp_score>\n-      <Hsp_evalue>3.74548e-55</Hsp_evalue>\n-      <Hsp_query-from>2</Hsp_query-from>\n-      <Hsp_query-to>229</Hsp_query-to>\n-      <Hsp_hit-from>474</Hsp_hit-from>\n-      <Hsp_hit-to>684</Hsp_hit-to>\n-      <Hsp_query-frame>0</Hsp_query-frame>\n-      <Hsp_hit-frame>0</Hsp_hit-frame>\n-      <Hsp_identity>106</Hsp_identity>\n-      <Hsp_positive>154</Hsp_positive>\n-      <Hsp_gaps>21</Hsp_gaps>\n-      <Hsp_align-len>230</Hsp_align-len>\n-      <Hsp_qseq>LDKGTLLYRGQKLDLPTFEHNAENKLFYFRNYVSTSLKPLIFGEFGRMFMALDDDTTIYTAETPDDYNRFANPEDIIDIGATQKDSFDDNNNDGTSINIGKQVNLGFVISGAENVRVIVPGSLTEYPEEAEVILPRGTLLKINKITTQVDKRS--NKFMVEGSIVPPSEQIDESVEIYDGDLFMETGEVVKLSGFMQFVNESAYDEEQNQMAAEILSGFLDIDDMPRKFR</Hsp_qseq>\n-      <Hsp_hseq>LPPGTTLYRGQEVTFKTLRHNIENKMFYFKNFVSTSLKPNIFGEHGKNYMALDDSGAVFSGEGEGS----VDAEDLMHMGSHSAYANED-----------AETSVGMVIKGAERIKVIVPGHLSGFPSEAEVILPRGILLKINKVSTYMMKETAYNKYLIEGTIVPPSEQLEESV--YDGDHLMETGEVRPMAGFNQFLVEES--KEEENEVSQILASLVNINGMSKKFK</Hsp_hseq>\n-      <Hsp_midline>L  GT LYRGQ++   T  HN ENK+FYF+N+VSTSLKP IFGE G+ +MALDD   +++ E         + ED++ +G+    + +D            + ++G VI GAE ++VIVPG L+ +P EAEVILPRG LLKINK++T + K +  NK+++EG+IVPPSEQ++ESV  YDGD  METGEV  ++GF QF+ E +  +E+    ++IL+  ++I+ M +KF+</Hsp_midline>\n-    </Hsp>\n-  </Hit_hsps>\n-</Hit>\n-<Hit>\n-  <Hit_num>2</Hit_num>\n-  <Hit_id>gi|330858714|ref|YP_004415089.1|</Hit_id>\n-  <Hit_def>hypothetical protein Shfl2p198 [Shigella phage Shfl2] &gt;gi|327397648|gb|AEA73150.1| hypothetical protein Shfl2p198 [Shigella phage Shfl2]</Hit_def>\n-  <Hit_accession>YP_004415089</Hit_accession>\n-  <Hit_len>685</Hit_len>\n-  <Hit_hsps>\n-    <Hsp>\n-      <Hsp_num>1</Hsp_num>\n-      <Hsp_bit-score>197.593</Hsp_bit-score>\n-      <Hsp_score>501</Hsp_score>\n-      <Hsp_evalue>4.31042e-55</Hsp_evalue>\n-      <Hsp_query-from>2</Hsp_query-from>\n-      <Hsp_query-to>229</Hsp_query-to>\n-      <Hsp_hit-from>474</Hsp_hit-from>\n-      <Hsp_hit-to>684</Hsp_hit-to>\n-      <Hsp_query-frame>0</Hsp_query-frame>\n-      <Hsp_hit-frame>0</Hsp_hit-frame>\n-      <Hsp_identity>106</Hsp_identity>\n-      <Hsp_positive>154</Hsp_positive>\n-      <Hsp_gaps>21</Hsp_gap'..b'e>0</Hsp_hit-frame>\n-      <Hsp_identity>150</Hsp_identity>\n-      <Hsp_positive>268</Hsp_positive>\n-      <Hsp_gaps>53</Hsp_gaps>\n-      <Hsp_align-len>553</Hsp_align-len>\n-      <Hsp_qseq>DVQSANELVAEVIEEKGNNL------IDSVDNVAEGTELAAEASERTTESIKTLTGVASTISDKLSKLASMLESKVQA--VEQKVQESGASASTGLSVIEDKLPDPDEPESPGLPERILPPLDDNNNLPDEDFFPPVPQEPENNKKDQKKDDKKPTDMLGD-LLKTTKGGFKATISITDKISSMLFKYTVTALAEAAKMAAMLFALVLGIDLLRIHFKYWTDKFMSNFDEFSAEAGEWGGLLQSIFGMLGDIKKFWEAGDWSGLAVAIVKGLADVIYNLSEIMSLGISKISASILDALGFENAATTIRGSALEGFQERTGNSLSEDDQKALAKYQSKRIEEGPGIIDKAGEFKTRAFDWVLGRENKIDSTQASDRDQETQNLKAMAPEKR---EETLIKQNEARAAVQRLEKYIGDVDPENPTNMQSLEKAYNSAKKSISDSAISDQPA---------TKKELDKRFQRVESKYQKLKEDNTPKPAA---PATSEDNQRVQNIQKAENAKE--QSKKSTGDMNVANTQVNNV-NNSKTIHQVQTVTATPAPGV</Hsp_qseq>\n-      <Hsp_hseq>DSLAAQELIAETVEQGNNELRQIKANTASLHDTAAATELGAESTEMSNTILREISETGKQTFSKLSEFAERLKGSFSADDVEQTPIRAASSSDQAIQIINEENPEPENPLVG-----YLRTISEDIKFLRENKNEPSDPKDPDVVPDDKDDLKTMIDRIGDQIVKSVDSGFKRTVNIADSISSTLFKYTITAALNFAKMAALVLSLIIAFDVLSRHFSHWTQMFQEQYAEFKETLGSFGTPFENLTGIVTDLVNYFKSDEYLKMFVRLAEGAADQMIYIVNMMMVGLAKLGAAILRALGADDKADTLEASAISVATKTVGYTPSEEEEATIGRVRKRQAQE---------EAEQSEASWWEKKKREWDG-----KPIETDEEKAVRERKKSIAENTTAEQFGKHDALSQKIQHVGVTAEKNETSNELLGKHRELLEKRASDVEQAKQSGEITTESYKQLKVEIEKQREFLDAHEQKL-----LKPKASIKPAPEPEIGVVGSIAKEEKRVEASQTAKQEAASNY-NTNANIVKNNNQTLVQAPR-TSSPGPGI</Hsp_hseq>\n-      <Hsp_midline>D  +A EL+AE +E+  N L        S+ + A  TEL AE++E +   ++ ++        KLS+ A  L+    A  VEQ    + +S+   + +I ++ P+P+ P         L  + ++     E+   P   +  +   D K D K   D +GD ++K+   GFK T++I D ISS LFKYT+TA    AKMAA++ +L++  D+L  HF +WT  F   + EF    G +G   +++ G++ D+  ++++ ++  + V + +G AD +  +  +M +G++K+ A+IL ALG ++ A T+  SA+    +  G + SE+++  + + + ++ +E         E +     W   ++ + D      +  ET   KA+   K+   E T  +Q     A+ +  +++G    +N T+ + L K     +K  SD   + Q            K E++K+ + +++  QKL      KP A   PA   +   V +I K E   E  Q+ K     N  NT  N V NN++T+ Q    T++P PG+</Hsp_midline>\n-    </Hsp>\n-  </Hit_hsps>\n-</Hit>\n-<Hit>\n-  <Hit_num>43</Hit_num>\n-  <Hit_id>gi|398313739|emb|CCI89086.1|</Hit_id>\n-  <Hit_def>phage baseplate hub [Yersinia phage phiD1]</Hit_def>\n-  <Hit_accession>CCI89086</Hit_accession>\n-  <Hit_len>191</Hit_len>\n-  <Hit_hsps>\n-    <Hsp>\n-      <Hsp_num>1</Hsp_num>\n-      <Hsp_bit-score>79.7221</Hsp_bit-score>\n-      <Hsp_score>195</Hsp_score>\n-      <Hsp_evalue>1.49556e-13</Hsp_evalue>\n-      <Hsp_query-from>2</Hsp_query-from>\n-      <Hsp_query-to>189</Hsp_query-to>\n-      <Hsp_hit-from>3</Hsp_hit-from>\n-      <Hsp_hit-to>187</Hsp_hit-to>\n-      <Hsp_query-frame>0</Hsp_query-frame>\n-      <Hsp_hit-frame>0</Hsp_hit-frame>\n-      <Hsp_identity>69</Hsp_identity>\n-      <Hsp_positive>102</Hsp_positive>\n-      <Hsp_gaps>17</Hsp_gaps>\n-      <Hsp_align-len>195</Hsp_align-len>\n-      <Hsp_qseq>KSENMSTMRRRKVIADSKGERDAASTASDQVDSLELIGLKLDDVQSANELVAEVIEEKGNNLIDSVDNV-------AEGTELAAEASERTTESIKTLTGVASTISDKLSKLASMLESKVQAVEQKVQESGASASTGLSVIEDKLPDPDEPESPGLPERILPPLDDNNNLPDEDFFPPVPQEPENNKKDQKKDDKK</Hsp_qseq>\n-      <Hsp_hseq>KPQEMQTMRR-KVISDNKPTQEAAKSASNTLSGLNDISTKLDDTQAASELIAQTVEEKSNEIVGAIGNVESAVSDTTAGSELIAETVEIGNNINKE---IGESLGSKLDKLTSLLEQKIQTA--GIQQTGTXLATVESAIPVKVVEDDTDRXXVLXYRXLKQLIMILTLI---FSLPLSQLSQ-SKNHQKKNRKK</Hsp_hseq>\n-      <Hsp_midline>K + M TMRR KVI+D+K  ++AA +AS+ +  L  I  KLDD Q+A+EL+A+ +EEK N ++ ++ NV         G+EL AE  E      K    +  ++  KL KL S+LE K+Q     +Q++G   +T  S I  K+ + D      L  R L  L     L    F  P+ Q  + +K  QKK+ KK</Hsp_midline>\n-    </Hsp>\n-  </Hit_hsps>\n-</Hit>\n-</Iteration_hits>\n-  <Iteration_stat>\n-    <Statistics>\n-      <Statistics_db-num>48094830</Statistics_db-num>\n-      <Statistics_db-len>17186091396</Statistics_db-len>\n-      <Statistics_hsp-len>153</Statistics_hsp-len>\n-      <Statistics_eff-space>4157067357738</Statistics_eff-space>\n-      <Statistics_kappa>0.041</Statistics_kappa>\n-      <Statistics_lambda>0.267</Statistics_lambda>\n-      <Statistics_entropy>0.14</Statistics_entropy>\n-    </Statistics>\n-  </Iteration_stat>\n-</Iteration>\n-</BlastOutput_iterations>\n-</BlastOutput>\n-\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/blastxml/blast-gene1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blast-gene1.xml Thu Dec 31 13:58:43 2015 -0500
[
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">
+<BlastOutput>
+  <BlastOutput_program>blastp</BlastOutput_program>
+  <BlastOutput_version>BLASTP 2.2.28+</BlastOutput_version>
+  <BlastOutput_reference>Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&amp;auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), &quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search programs&quot;, Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>
+  <BlastOutput_db>/usr/local/syncdb/community/nr/nr</BlastOutput_db>
+  <BlastOutput_query-ID>Query_1</BlastOutput_query-ID>
+  <BlastOutput_query-def>Merlin_1</BlastOutput_query-def>
+  <BlastOutput_query-len>229</BlastOutput_query-len>
+  <BlastOutput_param>
+    <Parameters>
+      <Parameters_matrix>BLOSUM62</Parameters_matrix>
+      <Parameters_expect>0.001</Parameters_expect>
+      <Parameters_gap-open>11</Parameters_gap-open>
+      <Parameters_gap-extend>1</Parameters_gap-extend>
+      <Parameters_filter>F</Parameters_filter>
+    </Parameters>
+  </BlastOutput_param>
+<BlastOutput_iterations>
+<Iteration>
+  <Iteration_iter-num>1</Iteration_iter-num>
+  <Iteration_query-ID>Query_1</Iteration_query-ID>
+  <Iteration_query-def>Merlin_1</Iteration_query-def>
+  <Iteration_query-len>229</Iteration_query-len>
+<Iteration_hits>
+<Hit>
+  <Hit_num>1</Hit_num>
+  <Hit_id>gi|422934611|ref|YP_007004572.1|</Hit_id>
+  <Hit_def>hypothetical protein [Enterobacteria phage ime09] &gt;gi|339791394|gb|AEK12451.1| hypothetical protein [Enterobacteria phage ime09]</Hit_def>
+  <Hit_accession>YP_007004572</Hit_accession>
+  <Hit_len>685</Hit_len>
+  <Hit_hsps>
+    <Hsp>
+      <Hsp_num>1</Hsp_num>
+      <Hsp_bit-score>197.593</Hsp_bit-score>
+      <Hsp_score>501</Hsp_score>
+      <Hsp_evalue>3.74548e-55</Hsp_evalue>
+      <Hsp_query-from>2</Hsp_query-from>
+      <Hsp_query-to>229</Hsp_query-to>
+      <Hsp_hit-from>474</Hsp_hit-from>
+      <Hsp_hit-to>684</Hsp_hit-to>
+      <Hsp_query-frame>0</Hsp_query-frame>
+      <Hsp_hit-frame>0</Hsp_hit-frame>
+      <Hsp_identity>106</Hsp_identity>
+      <Hsp_positive>154</Hsp_positive>
+      <Hsp_gaps>21</Hsp_gaps>
+      <Hsp_align-len>230</Hsp_align-len>
+      <Hsp_qseq>LDKGTLLYRGQKLDLPTFEHNAENKLFYFRNYVSTSLKPLIFGEFGRMFMALDDDTTIYTAETPDDYNRFANPEDIIDIGATQKDSFDDNNNDGTSINIGKQVNLGFVISGAENVRVIVPGSLTEYPEEAEVILPRGTLLKINKITTQVDKRS--NKFMVEGSIVPPSEQIDESVEIYDGDLFMETGEVVKLSGFMQFVNESAYDEEQNQMAAEILSGFLDIDDMPRKFR</Hsp_qseq>
+      <Hsp_hseq>LPPGTTLYRGQEVTFKTLRHNIENKMFYFKNFVSTSLKPNIFGEHGKNYMALDDSGAVFSGEGEGS----VDAEDLMHMGSHSAYANED-----------AETSVGMVIKGAERIKVIVPGHLSGFPSEAEVILPRGILLKINKVSTYMMKETAYNKYLIEGTIVPPSEQLEESV--YDGDHLMETGEVRPMAGFNQFLVEES--KEEENEVSQILASLVNINGMSKKFK</Hsp_hseq>
+      <Hsp_midline>L  GT LYRGQ++   T  HN ENK+FYF+N+VSTSLKP IFGE G+ +MALDD   +++ E         + ED++ +G+    + +D            + ++G VI GAE ++VIVPG L+ +P EAEVILPRG LLKINK++T + K +  NK+++EG+IVPPSEQ++ESV  YDGD  METGEV  ++GF QF+ E +  +E+    ++IL+  ++I+ M +KF+</Hsp_midline>
+    </Hsp>
+  </Hit_hsps>
+</Hit>
+<Hit>
+  <Hit_num>2</Hit_num>
+  <Hit_id>gi|330858714|ref|YP_004415089.1|</Hit_id>
+  <Hit_def>hypothetical protein Shfl2p198 [Shigella phage Shfl2] &gt;gi|327397648|gb|AEA73150.1| hypothetical protein Shfl2p198 [Shigella phage Shfl2]</Hit_def>
+  <Hit_accession>YP_004415089</Hit_accession>
+  <Hit_len>685</Hit_len>
+  <Hit_hsps>
+    <Hsp>
+      <Hsp_num>1</Hsp_num>
+      <Hsp_bit-score>197.593</Hsp_bit-score>
+      <Hsp_score>501</Hsp_score>
+      <Hsp_evalue>4.31042e-55</Hsp_evalue>
+      <Hsp_query-from>2</Hsp_query-from>
+      <Hsp_query-to>229</Hsp_query-to>
+      <Hsp_hit-from>474</Hsp_hit-from>
+      <Hsp_hit-to>684</Hsp_hit-to>
+      <Hsp_query-frame>0</Hsp_query-frame>
+      <Hsp_hit-frame>0</Hsp_hit-frame>
+      <Hsp_identity>106</Hsp_identity>
+      <Hsp_positive>154</Hsp_positive>
+      <Hsp_gaps>21</Hsp_gaps>
+      <Hsp_align-len>230</Hsp_align-len>
+      <Hsp_qseq>LDKGTLLYRGQKLDLPTFEHNAENKLFYFRNYVSTSLKPLIFGEFGRMFMALDDDTTIYTAETPDDYNRFANPEDIIDIGATQKDSFDDNNNDGTSINIGKQVNLGFVISGAENVRVIVPGSLTEYPEEAEVILPRGTLLKINKITTQVDKRS--NKFMVEGSIVPPSEQIDESVEIYDGDLFMETGEVVKLSGFMQFVNESAYDEEQNQMAAEILSGFLDIDDMPRKFR</Hsp_qseq>
+      <Hsp_hseq>LPPGTTLYRGQEVTFKTLRHNIENKMFYFKNFVSTSLKPNIFGEHGKNYMALDDSGAVFSGEGEGS----VDAEDLMHMGSHSAYANED-----------AETSVGMVIKGAERIKVIVPGHLSGFPSEAEVILPRGILLKINKVSTYMMKETAYNKYLIEGTIVPPSEQLEESV--YDGDHLMETGEVRPMAGFNQFLVEES--KEEENEVSQILASLVNINGMSKKFK</Hsp_hseq>
+      <Hsp_midline>L  GT LYRGQ++   T  HN ENK+FYF+N+VSTSLKP IFGE G+ +MALDD   +++ E         + ED++ +G+    + +D            + ++G VI GAE ++VIVPG L+ +P EAEVILPRG LLKINK++T + K +  NK+++EG+IVPPSEQ++ESV  YDGD  METGEV  ++GF QF+ E +  +E+    ++IL+  ++I+ M +KF+</Hsp_midline>
+    </Hsp>
+  </Hit_hsps>
+</Hit>
+<Hit>
+  <Hit_num>3</Hit_num>
+  <Hit_id>gi|228861509|ref|YP_002854530.1|</Hit_id>
+  <Hit_def>alt.-2 hypothetical protein [Enterobacteria phage RB14] &gt;gi|227438525|gb|ACP30838.1| alt.-2 hypothetical protein [Enterobacteria phage RB14]</Hit_def>
+  <Hit_accession>YP_002854530</Hit_accession>
+  <Hit_len>685</Hit_len>
+  <Hit_hsps>
+    <Hsp>
+      <Hsp_num>1</Hsp_num>
+      <Hsp_bit-score>197.593</Hsp_bit-score>
+      <Hsp_score>501</Hsp_score>
+      <Hsp_evalue>4.35388e-55</Hsp_evalue>
+      <Hsp_query-from>2</Hsp_query-from>
+      <Hsp_query-to>229</Hsp_query-to>
+      <Hsp_hit-from>474</Hsp_hit-from>
+      <Hsp_hit-to>684</Hsp_hit-to>
+      <Hsp_query-frame>0</Hsp_query-frame>
+      <Hsp_hit-frame>0</Hsp_hit-frame>
+      <Hsp_identity>108</Hsp_identity>
+      <Hsp_positive>152</Hsp_positive>
+      <Hsp_gaps>21</Hsp_gaps>
+      <Hsp_align-len>230</Hsp_align-len>
+      <Hsp_qseq>LDKGTLLYRGQKLDLPTFEHNAENKLFYFRNYVSTSLKPLIFGEFGRMFMALDDDTTIYTAETPDDYNRFANPEDIIDIGATQKDSFDDNNNDGTSINIGKQVNLGFVISGAENVRVIVPGSLTEYPEEAEVILPRGTLLKINKITTQVDKRS--NKFMVEGSIVPPSEQIDESVEIYDGDLFMETGEVVKLSGFMQFVNESAYDEEQNQMAAEILSGFLDIDDMPRKFR</Hsp_qseq>
+      <Hsp_hseq>LPPGTTLYRGQEVTFKTLRHNIENKMFYFKNFVSTSLKPNIFGEHGKNYMALDDSGAVFSGEGEGS----VDAEDLMHMGS-----------HSTYANEDAETSVGMVIKGAERVKVIVPGHLSGFPSEAEVILPRGILLKINKVSTYFMKETAYNKYLIEGTIVPPSEQLEESV--YDGDHLMETGEVRPMAGFNQFLVEES--KEEENEVSQILASLVNINGMSKKFK</Hsp_hseq>
+      <Hsp_midline>L  GT LYRGQ++   T  HN ENK+FYF+N+VSTSLKP IFGE G+ +MALDD   +++ E         + ED++ +G+             T  N   + ++G VI GAE V+VIVPG L+ +P EAEVILPRG LLKINK++T   K +  NK+++EG+IVPPSEQ++ESV  YDGD  METGEV  ++GF QF+ E +  +E+    ++IL+  ++I+ M +KF+</Hsp_midline>
+    </Hsp>
+  </Hit_hsps>
+</Hit>
+</Iteration_hits>
+  <Iteration_stat>
+    <Statistics>
+      <Statistics_db-num>48094830</Statistics_db-num>
+      <Statistics_db-len>17186091396</Statistics_db-len>
+      <Statistics_hsp-len>143</Statistics_hsp-len>
+      <Statistics_eff-space>886533640716</Statistics_eff-space>
+      <Statistics_kappa>0.041</Statistics_kappa>
+      <Statistics_lambda>0.267</Statistics_lambda>
+      <Statistics_entropy>0.14</Statistics_entropy>
+    </Statistics>
+  </Iteration_stat>
+</Iteration>
+</BlastOutput_iterations>
+</BlastOutput>
+
b
diff -r b6a0e126dbee -r 7342f467507b test-data/blastxml/blast.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blast.xml Thu Dec 31 13:58:43 2015 -0500
[
b'@@ -0,0 +1,2862 @@\n+<?xml version="1.0"?>\n+<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">\n+<BlastOutput>\n+  <BlastOutput_program>blastp</BlastOutput_program>\n+  <BlastOutput_version>BLASTP 2.2.28+</BlastOutput_version>\n+  <BlastOutput_reference>Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&amp;auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), &quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search programs&quot;, Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>\n+  <BlastOutput_db>/usr/local/syncdb/community/nr/nr</BlastOutput_db>\n+  <BlastOutput_query-ID>Query_1</BlastOutput_query-ID>\n+  <BlastOutput_query-def>Merlin_1</BlastOutput_query-def>\n+  <BlastOutput_query-len>229</BlastOutput_query-len>\n+  <BlastOutput_param>\n+    <Parameters>\n+      <Parameters_matrix>BLOSUM62</Parameters_matrix>\n+      <Parameters_expect>0.001</Parameters_expect>\n+      <Parameters_gap-open>11</Parameters_gap-open>\n+      <Parameters_gap-extend>1</Parameters_gap-extend>\n+      <Parameters_filter>F</Parameters_filter>\n+    </Parameters>\n+  </BlastOutput_param>\n+<BlastOutput_iterations>\n+<Iteration>\n+  <Iteration_iter-num>1</Iteration_iter-num>\n+  <Iteration_query-ID>Query_1</Iteration_query-ID>\n+  <Iteration_query-def>Merlin_1</Iteration_query-def>\n+  <Iteration_query-len>229</Iteration_query-len>\n+<Iteration_hits>\n+<Hit>\n+  <Hit_num>1</Hit_num>\n+  <Hit_id>gi|422934611|ref|YP_007004572.1|</Hit_id>\n+  <Hit_def>hypothetical protein [Enterobacteria phage ime09] &gt;gi|339791394|gb|AEK12451.1| hypothetical protein [Enterobacteria phage ime09]</Hit_def>\n+  <Hit_accession>YP_007004572</Hit_accession>\n+  <Hit_len>685</Hit_len>\n+  <Hit_hsps>\n+    <Hsp>\n+      <Hsp_num>1</Hsp_num>\n+      <Hsp_bit-score>197.593</Hsp_bit-score>\n+      <Hsp_score>501</Hsp_score>\n+      <Hsp_evalue>3.74548e-55</Hsp_evalue>\n+      <Hsp_query-from>2</Hsp_query-from>\n+      <Hsp_query-to>229</Hsp_query-to>\n+      <Hsp_hit-from>474</Hsp_hit-from>\n+      <Hsp_hit-to>684</Hsp_hit-to>\n+      <Hsp_query-frame>0</Hsp_query-frame>\n+      <Hsp_hit-frame>0</Hsp_hit-frame>\n+      <Hsp_identity>106</Hsp_identity>\n+      <Hsp_positive>154</Hsp_positive>\n+      <Hsp_gaps>21</Hsp_gaps>\n+      <Hsp_align-len>230</Hsp_align-len>\n+      <Hsp_qseq>LDKGTLLYRGQKLDLPTFEHNAENKLFYFRNYVSTSLKPLIFGEFGRMFMALDDDTTIYTAETPDDYNRFANPEDIIDIGATQKDSFDDNNNDGTSINIGKQVNLGFVISGAENVRVIVPGSLTEYPEEAEVILPRGTLLKINKITTQVDKRS--NKFMVEGSIVPPSEQIDESVEIYDGDLFMETGEVVKLSGFMQFVNESAYDEEQNQMAAEILSGFLDIDDMPRKFR</Hsp_qseq>\n+      <Hsp_hseq>LPPGTTLYRGQEVTFKTLRHNIENKMFYFKNFVSTSLKPNIFGEHGKNYMALDDSGAVFSGEGEGS----VDAEDLMHMGSHSAYANED-----------AETSVGMVIKGAERIKVIVPGHLSGFPSEAEVILPRGILLKINKVSTYMMKETAYNKYLIEGTIVPPSEQLEESV--YDGDHLMETGEVRPMAGFNQFLVEES--KEEENEVSQILASLVNINGMSKKFK</Hsp_hseq>\n+      <Hsp_midline>L  GT LYRGQ++   T  HN ENK+FYF+N+VSTSLKP IFGE G+ +MALDD   +++ E         + ED++ +G+    + +D            + ++G VI GAE ++VIVPG L+ +P EAEVILPRG LLKINK++T + K +  NK+++EG+IVPPSEQ++ESV  YDGD  METGEV  ++GF QF+ E +  +E+    ++IL+  ++I+ M +KF+</Hsp_midline>\n+    </Hsp>\n+  </Hit_hsps>\n+</Hit>\n+<Hit>\n+  <Hit_num>2</Hit_num>\n+  <Hit_id>gi|330858714|ref|YP_004415089.1|</Hit_id>\n+  <Hit_def>hypothetical protein Shfl2p198 [Shigella phage Shfl2] &gt;gi|327397648|gb|AEA73150.1| hypothetical protein Shfl2p198 [Shigella phage Shfl2]</Hit_def>\n+  <Hit_accession>YP_004415089</Hit_accession>\n+  <Hit_len>685</Hit_len>\n+  <Hit_hsps>\n+    <Hsp>\n+      <Hsp_num>1</Hsp_num>\n+      <Hsp_bit-score>197.593</Hsp_bit-score>\n+      <Hsp_score>501</Hsp_score>\n+      <Hsp_evalue>4.31042e-55</Hsp_evalue>\n+      <Hsp_query-from>2</Hsp_query-from>\n+      <Hsp_query-to>229</Hsp_query-to>\n+      <Hsp_hit-from>474</Hsp_hit-from>\n+      <Hsp_hit-to>684</Hsp_hit-to>\n+      <Hsp_query-frame>0</Hsp_query-frame>\n+      <Hsp_hit-frame>0</Hsp_hit-frame>\n+      <Hsp_identity>106</Hsp_identity>\n+      <Hsp_positive>154</Hsp_positive>\n+      <Hsp_gaps>21</Hsp_gap'..b'e>0</Hsp_hit-frame>\n+      <Hsp_identity>150</Hsp_identity>\n+      <Hsp_positive>268</Hsp_positive>\n+      <Hsp_gaps>53</Hsp_gaps>\n+      <Hsp_align-len>553</Hsp_align-len>\n+      <Hsp_qseq>DVQSANELVAEVIEEKGNNL------IDSVDNVAEGTELAAEASERTTESIKTLTGVASTISDKLSKLASMLESKVQA--VEQKVQESGASASTGLSVIEDKLPDPDEPESPGLPERILPPLDDNNNLPDEDFFPPVPQEPENNKKDQKKDDKKPTDMLGD-LLKTTKGGFKATISITDKISSMLFKYTVTALAEAAKMAAMLFALVLGIDLLRIHFKYWTDKFMSNFDEFSAEAGEWGGLLQSIFGMLGDIKKFWEAGDWSGLAVAIVKGLADVIYNLSEIMSLGISKISASILDALGFENAATTIRGSALEGFQERTGNSLSEDDQKALAKYQSKRIEEGPGIIDKAGEFKTRAFDWVLGRENKIDSTQASDRDQETQNLKAMAPEKR---EETLIKQNEARAAVQRLEKYIGDVDPENPTNMQSLEKAYNSAKKSISDSAISDQPA---------TKKELDKRFQRVESKYQKLKEDNTPKPAA---PATSEDNQRVQNIQKAENAKE--QSKKSTGDMNVANTQVNNV-NNSKTIHQVQTVTATPAPGV</Hsp_qseq>\n+      <Hsp_hseq>DSLAAQELIAETVEQGNNELRQIKANTASLHDTAAATELGAESTEMSNTILREISETGKQTFSKLSEFAERLKGSFSADDVEQTPIRAASSSDQAIQIINEENPEPENPLVG-----YLRTISEDIKFLRENKNEPSDPKDPDVVPDDKDDLKTMIDRIGDQIVKSVDSGFKRTVNIADSISSTLFKYTITAALNFAKMAALVLSLIIAFDVLSRHFSHWTQMFQEQYAEFKETLGSFGTPFENLTGIVTDLVNYFKSDEYLKMFVRLAEGAADQMIYIVNMMMVGLAKLGAAILRALGADDKADTLEASAISVATKTVGYTPSEEEEATIGRVRKRQAQE---------EAEQSEASWWEKKKREWDG-----KPIETDEEKAVRERKKSIAENTTAEQFGKHDALSQKIQHVGVTAEKNETSNELLGKHRELLEKRASDVEQAKQSGEITTESYKQLKVEIEKQREFLDAHEQKL-----LKPKASIKPAPEPEIGVVGSIAKEEKRVEASQTAKQEAASNY-NTNANIVKNNNQTLVQAPR-TSSPGPGI</Hsp_hseq>\n+      <Hsp_midline>D  +A EL+AE +E+  N L        S+ + A  TEL AE++E +   ++ ++        KLS+ A  L+    A  VEQ    + +S+   + +I ++ P+P+ P         L  + ++     E+   P   +  +   D K D K   D +GD ++K+   GFK T++I D ISS LFKYT+TA    AKMAA++ +L++  D+L  HF +WT  F   + EF    G +G   +++ G++ D+  ++++ ++  + V + +G AD +  +  +M +G++K+ A+IL ALG ++ A T+  SA+    +  G + SE+++  + + + ++ +E         E +     W   ++ + D      +  ET   KA+   K+   E T  +Q     A+ +  +++G    +N T+ + L K     +K  SD   + Q            K E++K+ + +++  QKL      KP A   PA   +   V +I K E   E  Q+ K     N  NT  N V NN++T+ Q    T++P PG+</Hsp_midline>\n+    </Hsp>\n+  </Hit_hsps>\n+</Hit>\n+<Hit>\n+  <Hit_num>43</Hit_num>\n+  <Hit_id>gi|398313739|emb|CCI89086.1|</Hit_id>\n+  <Hit_def>phage baseplate hub [Yersinia phage phiD1]</Hit_def>\n+  <Hit_accession>CCI89086</Hit_accession>\n+  <Hit_len>191</Hit_len>\n+  <Hit_hsps>\n+    <Hsp>\n+      <Hsp_num>1</Hsp_num>\n+      <Hsp_bit-score>79.7221</Hsp_bit-score>\n+      <Hsp_score>195</Hsp_score>\n+      <Hsp_evalue>1.49556e-13</Hsp_evalue>\n+      <Hsp_query-from>2</Hsp_query-from>\n+      <Hsp_query-to>189</Hsp_query-to>\n+      <Hsp_hit-from>3</Hsp_hit-from>\n+      <Hsp_hit-to>187</Hsp_hit-to>\n+      <Hsp_query-frame>0</Hsp_query-frame>\n+      <Hsp_hit-frame>0</Hsp_hit-frame>\n+      <Hsp_identity>69</Hsp_identity>\n+      <Hsp_positive>102</Hsp_positive>\n+      <Hsp_gaps>17</Hsp_gaps>\n+      <Hsp_align-len>195</Hsp_align-len>\n+      <Hsp_qseq>KSENMSTMRRRKVIADSKGERDAASTASDQVDSLELIGLKLDDVQSANELVAEVIEEKGNNLIDSVDNV-------AEGTELAAEASERTTESIKTLTGVASTISDKLSKLASMLESKVQAVEQKVQESGASASTGLSVIEDKLPDPDEPESPGLPERILPPLDDNNNLPDEDFFPPVPQEPENNKKDQKKDDKK</Hsp_qseq>\n+      <Hsp_hseq>KPQEMQTMRR-KVISDNKPTQEAAKSASNTLSGLNDISTKLDDTQAASELIAQTVEEKSNEIVGAIGNVESAVSDTTAGSELIAETVEIGNNINKE---IGESLGSKLDKLTSLLEQKIQTA--GIQQTGTXLATVESAIPVKVVEDDTDRXXVLXYRXLKQLIMILTLI---FSLPLSQLSQ-SKNHQKKNRKK</Hsp_hseq>\n+      <Hsp_midline>K + M TMRR KVI+D+K  ++AA +AS+ +  L  I  KLDD Q+A+EL+A+ +EEK N ++ ++ NV         G+EL AE  E      K    +  ++  KL KL S+LE K+Q     +Q++G   +T  S I  K+ + D      L  R L  L     L    F  P+ Q  + +K  QKK+ KK</Hsp_midline>\n+    </Hsp>\n+  </Hit_hsps>\n+</Hit>\n+</Iteration_hits>\n+  <Iteration_stat>\n+    <Statistics>\n+      <Statistics_db-num>48094830</Statistics_db-num>\n+      <Statistics_db-len>17186091396</Statistics_db-len>\n+      <Statistics_hsp-len>153</Statistics_hsp-len>\n+      <Statistics_eff-space>4157067357738</Statistics_eff-space>\n+      <Statistics_kappa>0.041</Statistics_kappa>\n+      <Statistics_lambda>0.267</Statistics_lambda>\n+      <Statistics_entropy>0.14</Statistics_entropy>\n+    </Statistics>\n+  </Iteration_stat>\n+</Iteration>\n+</BlastOutput_iterations>\n+</BlastOutput>\n+\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/blastxml/blastn-gene1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blastn-gene1.xml Thu Dec 31 13:58:43 2015 -0500
b
b'@@ -0,0 +1,128 @@\n+<?xml version="1.0"?>\n+<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">\n+<BlastOutput>\n+  <BlastOutput_program>blastn</BlastOutput_program>\n+  <BlastOutput_version>BLASTN 2.2.28+</BlastOutput_version>\n+  <BlastOutput_reference>Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&amp;auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), &quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search programs&quot;, Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>\n+  <BlastOutput_db>/opt/db/nt_aug2015/nt</BlastOutput_db>\n+  <BlastOutput_query-ID>Query_1</BlastOutput_query-ID>\n+  <BlastOutput_query-def>Merlin</BlastOutput_query-def>\n+  <BlastOutput_query-len>58313</BlastOutput_query-len>\n+  <BlastOutput_param>\n+    <Parameters>\n+      <Parameters_expect>0.001</Parameters_expect>\n+      <Parameters_sc-match>2</Parameters_sc-match>\n+      <Parameters_sc-mismatch>-3</Parameters_sc-mismatch>\n+      <Parameters_gap-open>5</Parameters_gap-open>\n+      <Parameters_gap-extend>2</Parameters_gap-extend>\n+      <Parameters_filter>L;m;</Parameters_filter>\n+    </Parameters>\n+  </BlastOutput_param>\n+<BlastOutput_iterations>\n+<Iteration>\n+  <Iteration_iter-num>1</Iteration_iter-num>\n+  <Iteration_query-ID>Query_1</Iteration_query-ID>\n+  <Iteration_query-def>Merlin</Iteration_query-def>\n+  <Iteration_query-len>58313</Iteration_query-len>\n+<Iteration_hits>\n+<Hit>\n+  <Hit_num>1</Hit_num>\n+  <Hit_id>gi|451937967|gb|KC139519.1|</Hit_id>\n+  <Hit_def>Salmonella phage FSL SP-030, complete genome</Hit_def>\n+  <Hit_accession>KC139519</Hit_accession>\n+  <Hit_len>59746</Hit_len>\n+  <Hit_hsps>\n+    <Hsp>\n+      <Hsp_num>1</Hsp_num>\n+      <Hsp_bit-score>9779.15</Hsp_bit-score>\n+      <Hsp_score>10844</Hsp_score>\n+      <Hsp_evalue>0</Hsp_evalue>\n+      <Hsp_query-from>35381</Hsp_query-from>\n+      <Hsp_query-to>53427</Hsp_query-to>\n+      <Hsp_hit-from>22789</Hsp_hit-from>\n+      <Hsp_hit-to>4832</Hsp_hit-to>\n+      <Hsp_query-frame>1</Hsp_query-frame>\n+      <Hsp_hit-frame>-1</Hsp_hit-frame>\n+      <Hsp_identity>13209</Hsp_identity>\n+      <Hsp_positive>13209</Hsp_positive>\n+      <Hsp_gaps>547</Hsp_gaps>\n+      <Hsp_align-len>18276</Hsp_align-len>\n+      <Hsp_qseq>GCCACCTGCTGACGGTACTGGTCGATTTGCTGCGCCAGTCCGGCAGCCGCACGGTTCGCCTCGTTCAGCAT-CTTCGTCTTCTGCGCCAGGTCCTTGATGGCGTTGCCGCTGGTCGACACTTCGGATGCGAGGGTGTGGACTTGCTGCTGCAGGCCAGATAGCGTCCGGCGCGCAGCGTCTGACGGACTTATGATTTGCTGGATTTTCGACGCCAGTGGCCCCATCTGCGACGTGGTGGTCTGCACGACCCGGCCCAGGGTTGAATACCCTTTTACCGCCGCCAGTGCCTGCTGCGCTTGCTGCTGCAGACCCTGTATGACTTTATTTTGGGCGGCCGCCGCAGGCGCGGTGGCGATGATGTTTTCCTGCTGCTGCAGTACCTTGTTAACGCTCGCCACGCTGTTAACGATACTGGACTGCGCGGCACCGAGCGTTTTTGTCTCAATGCCATATCGTTGCAGCTCTTTCGTTGTACGGCTCACCTGCGCCGCCCGCGACGCCTCGGTGCGCTCTGCACGCTCTACCTGCCGGTTAACACGGGCGAGTTCGGCTTCCTGTTTTTTCGTTACCTTCGCGGCAGAGTCATACGCTTGCTGCAGCTGGGCTTGCTTGGCCCGTAAGTCTTCCGTCTTTTGCGCCGCTTCAACCATCGTGGCGT---TCTGACGTTTATACAGCTCCACAAGGGCATTCAGCTTTAACAGCTGCTGCCCGGCCTGCTCAAGTTTTTTGTACGAGGCTTCCAGCTGACGCGTCGAGACTTCGCCCCGTTCTGCCGCTTTACGCTGGTCGTCCTGCGCCTTCGCCAT-TGCTTCAATCGCGGAGGCCACGGCTTTAAGGGGTTTCTGGCTGAAATCCCTCGCCCGGATCCTTAGTTCGACGTCTTTGCTGTTAGCCATCGCTCAAGCCCTTAATCAGTTTTTTGTAGTGCGGGCCACCTTTCTTCCCGTTCATGACGGAGGC----CAGTAGCGCCTGCAGTAACGTGCTTTCCGTCACCATGTGCATATTCACGCGGCGCCGGGCAATCTTGATTTCAGACCACAGGTACCCCAGCGGGTACCGGCGTGCGTCTGGGTGTCCCTGAGACATCAGGAAGGACACGCCTTCCCGCAGCTCATTGTGAAACCGTATTACTTTTTCCCTTTTGCTGTAGACTCGGGTGTCAGGCCGGCCTTTGTGTCCCTCATCAGG---------TCCATGGCCTTCCGTAGCATCTTTTTTATATCTTCAACGTCCGAGAAGGTCAGGCGGCCAATGGCTTTCAGCGCGTCAATCTGGGCGGTCAGCGGGAGGCG-CTGGGCTTTCTCCAGGTTGGCTTCGTCGTCCGCTGCCAGCGCGATGATATGGGCTACCAGGCCGGGCGCATCGTTAATAAGGCCCATGGCGAATTTGCCCATGGCCACGTAGGAAAGGTCGCTGCCGCCGTGGGTTTC--GTAAATATCAAACAGCCCTTCCAGGTCGTCATAGTGAACGCGGACGATCTTCGAAATGTCCTGGAATGACAGGCCGCGGACCTCGAATGCAACGTCGCCTTTTTTA-GCG-CG---CTTAATGATGATCTCTTCGGTATCCGGGGTGAAATCTGACAGTGACATGGG--GTTTATCCTCTTCGTTGGTTGACGTCGTTAATGTAGCACGTCG--GCAGAAAAGCATAAAAGAAAAGCGC'..b'sp_query-from>\n+      <Hsp_query-to>8129</Hsp_query-to>\n+      <Hsp_hit-from>52248</Hsp_hit-from>\n+      <Hsp_hit-to>51278</Hsp_hit-to>\n+      <Hsp_query-frame>1</Hsp_query-frame>\n+      <Hsp_hit-frame>-1</Hsp_hit-frame>\n+      <Hsp_identity>719</Hsp_identity>\n+      <Hsp_positive>719</Hsp_positive>\n+      <Hsp_gaps>24</Hsp_gaps>\n+      <Hsp_align-len>983</Hsp_align-len>\n+      <Hsp_qseq>ATGAAAGTTAAAGGTTTTGAGAAAGTCATCATACTGCATCTCGGCGCGCTCTTTGGCGCCGCAAACGCTGG---CGAGAAGTCTGTAAAGAGTTTCCACCGCACGCTGCTGAACACGCCGAACATGGACGAAATGAGCGTCCATGAATTCGCCGCCGGC-CGTGTGAGCGACCGACTGGCGAAGCACGAAGTGAAAGACCCGATCG--GC----TATAAGACGATTGGCTTTGCGCCTTACGCGGACTACGTGGGCGGCAAGTTCGCCATGGGCATCCCGGGTACTAACGCCATCGTGCTGCAGGCCGAAAAGCGTGAACGCGTGCTGCCCGGGGTCAGCGTGCGCAACGAAGTGACGAAGCGCATGGACGCCTGGCGCGAGAAAGAGATCGAAGGCTGGGAGCCGACCCGGAAAGACTGGGCGCAGCTGAAAGACGATGTCGAAGCCGAAATGCTGAAAACCGCGCCTATCCGCCCGACCCGCTACAATGTGATCATCGCCGTCCCGTACGTCTACGTGTTCACCACCAGCGCCAAGACCGCCGAAGAGGTTAACGCCCTGCTGCGTGCCGCGTTCGGTACCTGGCCAGTGGAACACCTGCTGATCAATGACTTCGTGCTGCGTCAGTCAATGGAGAAGGTCGTACGCGG-CAGCATCGAGGGTATCACTGGCGACGACTTCATCCACATCAAGCACGATGACGGCGATGACGTGAAGTTCAAGGACATTGACATCCATAAGGACGAAGTGGTCCTCGACTACCTGGCGCGGCATTACACGGTTCGGGCGCTGAACATGCGAA-TCGACGAACGCGAGATGCGACCTGGCGTGGGCAACGTGTTCTTCCGCCTGACCGACAAGGCGATCATCTCCGGGATCCACATCGGCGAGGCGGACGTTGACGCCAACTATGAAGCCACCCTGGAGCGCTACAACAATGACAGCGGTACGTTCCTGACCTACATGGCCAACCTGTTCCA</Hsp_qseq>\n+      <Hsp_hseq>ATGAAAATCAAGAGTTATGAGAAAGCCATTATCTTGCACCTCGGCGCGCTGTATGACGCGGCCAACGACGGTAACGAGAAG---GTCAAGCCGCTGCACCGCCTGATCCTGAACCTGCCGAACGTTGACGAAGAGGCCGTAACGGCTTTCGCGAAAGGAGCGTTT-AGCGATGCACTCGAAAAGCATGAAGTGTCAGATCCGCCGGAGGCGTCTTACAAGACAATGGGCTTTGCAGCGTACGGCGAAGAGGTTGACAGCAAGTTTGCGCTCGCCATCCCCGGAACAAACGCCATCGTCTTCCAGATCGAAAAGCGCGAGCGAGTGCTGCCCGGCGTTAGCGTACGAAACGAAGTCGTGAAGCGCATGGCCGCGTTGCGCGAGAAAGAGATCGAGGGTTGGGAGCCGAACCGCAAGGATTGGGCGCAGATGAAGGACGACGTGGAAGCGGAAATGCTGAAACACGCGCCTATCCGCCCGTCCCGCGTCAACGTCATCCTGTCCGCCCCGTTCGTGTACGTGTTCACGTCGAGCGCGAAGACGGCAGAAGAGTGCAGCGCGCTGATCCGTACCGCGCTCGGCACATGGCCCGTTGAACACCTCCTGCCGAGCGAGTATGAGCTGCGCCAGTTAATGCAGCGCGCGGTTCTCGGCCAGCA-GGACGGCATCAAGGGCGATGCATTTATCCACCTGAAACACGATGACGGCGACGACGTCAAGATGAAGGACACGGACATCTTCAAAGACGAGGCGGTGGTTGACCTGCTGTCCCGCCACTGGACTGTCCGCGCACTGGATCT-CGAAGTCGA--TACGC--AATGC--CCGGGCATCGACACCGTGTACTTCCGCCTGTCCGACAAAGCCATCCTGTCCGGTATCCACATCGGCGAGGCCGACGTTGATGCGAACTACGACGCCACGCTCGAACGCTACGGCACCGACGGCGGCCAGTTCCTGACCATGATGGCGAACCTGTTCCA</Hsp_hseq>\n+      <Hsp_midline>|||||| | ||  ||| |||||||| ||| ||  |||| ||||||||||| | || ||| || ||||  ||   |||||||   || |||    | ||||||  | | ||||||  ||||||| | ||||||  |  |||    |  |||||    ||  ||| | |||||   ||| |  ||||| ||||||  ||| |||   |  ||    || ||||| || ||||||||  | ||||  ||  | || | | ||||||| ||  | | |||||| || || |||||||||||  | |||  ||||||||| || || ||||||||||| || ||||| || ||||||||   ||||||||||| ||| | |||||||||||||||||| || |||||||||| ||| || || ||||||||| |||| ||||| || ||||| ||||||||||||  |||||||||||||||| |||||  ||| || ||| |  ||| ||||| ||| |||||||||||  | ||||| ||||| || ||||||   | ||| ||| | ||| ||||| |||| || ||||| || |||||||| |||   |  || |  | |||||| |||| |||| ||   |  || | ||| |||||  || || ||||  ||||| |  || |||||| | || |||||||||||||| ||||| ||| | |||||||  ||||||   || ||||| | |||  | |||   ||| | || || |  || || || || ||| |  | |||| ||||   ||||   ||||  || ||| | | || ||||| |||||||||| ||||||| || ||| | ||||| ||||||||||||||||| |||||||| || ||||| || ||||| || || ||||||  ||  ||| ||||   ||||||||||   ||||| |||||||||||</Hsp_midline>\n+    </Hsp>\n+  </Hit_hsps>\n+</Hit>\n+</Iteration_hits>\n+  <Iteration_stat>\n+    <Statistics>\n+      <Statistics_db-num>31902778</Statistics_db-num>\n+      <Statistics_db-len>102365819095</Statistics_db-len>\n+      <Statistics_hsp-len>43</Statistics_hsp-len>\n+      <Statistics_eff-space>5.88492035908107e+15</Statistics_eff-space>\n+      <Statistics_kappa>0.41</Statistics_kappa>\n+      <Statistics_lambda>0.625</Statistics_lambda>\n+      <Statistics_entropy>0.78</Statistics_entropy>\n+    </Statistics>\n+  </Iteration_stat>\n+</Iteration>\n+</BlastOutput_iterations>\n+</BlastOutput>\n+\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/blastxml/merlin.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/merlin.gff Thu Dec 31 13:58:43 2015 -0500
b
b'@@ -0,0 +1,1230 @@\n+##gff-version 3\n+##sequence-region Merlin 1 172788\n+Merlin\tGeneMark.hmm\tgene\t2\t691\t-856.563659\t+\t.\tID=Merlin_1;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t2\t691\t.\t+\t.\tID=Merlin_1_mRNA;Parent=Merlin_1;seqid=Merlin;color=#00ff00\n+Merlin\tGeneMark.hmm\texon\t2\t691\t.\t+\t.\tID=Merlin_1_exon;Parent=Merlin_1_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t2\t691\t.\t+\t0\tID=Merlin_1_CDS;Parent=Merlin_1_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t752\t1039\t-339.046618\t+\t.\tID=Merlin_2;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t752\t1039\t.\t+\t.\tID=Merlin_2_mRNA;Parent=Merlin_2;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t752\t1039\t.\t+\t.\tID=Merlin_2_exon;Parent=Merlin_2_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t752\t1039\t.\t+\t0\tID=Merlin_2_CDS;Parent=Merlin_2_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t1067\t2011\t-1229.683915\t-\t.\tID=Merlin_3;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t1067\t2011\t.\t-\t.\tID=Merlin_3_mRNA;Parent=Merlin_3;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t1067\t2011\t.\t-\t.\tID=Merlin_3_exon;Parent=Merlin_3_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t1067\t2011\t.\t-\t0\tID=Merlin_3_CDS;Parent=Merlin_3_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t2011\t3066\t-1335.034872\t-\t.\tID=Merlin_4;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t2011\t3066\t.\t-\t.\tID=Merlin_4_mRNA;Parent=Merlin_4;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t2011\t3066\t.\t-\t.\tID=Merlin_4_exon;Parent=Merlin_4_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t2011\t3066\t.\t-\t0\tID=Merlin_4_CDS;Parent=Merlin_4_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t3066\t4796\t-2177.374893\t-\t.\tID=Merlin_5;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t3066\t4796\t.\t-\t.\tID=Merlin_5_mRNA;Parent=Merlin_5;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t3066\t4796\t.\t-\t.\tID=Merlin_5_exon;Parent=Merlin_5_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t3066\t4796\t.\t-\t0\tID=Merlin_5_CDS;Parent=Merlin_5_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t4793\t5317\t-682.565030\t-\t.\tID=Merlin_6;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t4793\t5317\t.\t-\t.\tID=Merlin_6_mRNA;Parent=Merlin_6;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t4793\t5317\t.\t-\t.\tID=Merlin_6_exon;Parent=Merlin_6_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t4793\t5317\t.\t-\t0\tID=Merlin_6_CDS;Parent=Merlin_6_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t5289\t6431\t-1457.525863\t-\t.\tID=Merlin_7;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t5289\t6431\t.\t-\t.\tID=Merlin_7_mRNA;Parent=Merlin_7;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t5289\t6431\t.\t-\t.\tID=Merlin_7_exon;Parent=Merlin_7_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t5289\t6431\t.\t-\t0\tID=Merlin_7_CDS;Parent=Merlin_7_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t6428\t7180\t-968.015933\t-\t.\tID=Merlin_8;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t6428\t7180\t.\t-\t.\tID=Merlin_8_mRNA;Parent=Merlin_8;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t6428\t7180\t.\t-\t.\tID=Merlin_8_exon;Parent=Merlin_8_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t6428\t7180\t.\t-\t0\tID=Merlin_8_CDS;Parent=Merlin_8_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t7228\t7857\t-809.330137\t+\t.\tID=Merlin_9;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t7228\t7857\t.\t+\t.\tID=Merlin_9_mRNA;Parent=Merlin_9;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t7228\t7857\t.\t+\t.\tID=Merlin_9_exon;Parent=Merlin_9_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t7228\t7857\t.\t+\t0\tID=Merlin_9_CDS;Parent=Merlin_9_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t7857\t8252\t-515.006678\t+\t.\tID=Merlin_10;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t7857\t8252\t.\t+\t.\tID=Merlin_10_mRNA;Parent=Merlin_10;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t7857\t8252\t.\t+\t.\tID=Merlin_10_exon;Parent=Merlin_10_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t7857\t8252\t.\t+\t0\tID=Merlin_10_CDS;Parent=Merlin_10_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t8340\t8753\t-522.529341\t+\t.\tID=Merlin_11;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t8340\t8753\t.\t+\t.\tID=Merlin_11_mRNA;Parent=Merlin_11;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t8340\t8753\t.\t+\t.\tID=Merlin_11_exon;Parent=Merlin_11_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t8340\t8753\t.\t+\t0\tID=Merlin_11_CDS;Parent=Merlin_11_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t8787\t8951\t-212.019038\t+\t.\tID=Merlin_12;seqid=Merlin'..b'rlin\n+Merlin\tGeneMark.hmm\texon\t164715\t165071\t.\t+\t.\tID=Merlin_297_exon;Parent=Merlin_297_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t164715\t165071\t.\t+\t0\tID=Merlin_297_CDS;Parent=Merlin_297_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165107\t165601\t-618.360781\t+\t.\tID=Merlin_298;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165107\t165601\t.\t+\t.\tID=Merlin_298_mRNA;Parent=Merlin_298;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165107\t165601\t.\t+\t.\tID=Merlin_298_exon;Parent=Merlin_298_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165107\t165601\t.\t+\t0\tID=Merlin_298_CDS;Parent=Merlin_298_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165612\t165773\t-191.091430\t+\t.\tID=Merlin_299;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165612\t165773\t.\t+\t.\tID=Merlin_299_mRNA;Parent=Merlin_299;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165612\t165773\t.\t+\t.\tID=Merlin_299_exon;Parent=Merlin_299_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165612\t165773\t.\t+\t0\tID=Merlin_299_CDS;Parent=Merlin_299_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165770\t166000\t-285.030914\t+\t.\tID=Merlin_300;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165770\t166000\t.\t+\t.\tID=Merlin_300_mRNA;Parent=Merlin_300;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165770\t166000\t.\t+\t.\tID=Merlin_300_exon;Parent=Merlin_300_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165770\t166000\t.\t+\t0\tID=Merlin_300_CDS;Parent=Merlin_300_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165997\t166191\t-241.609251\t+\t.\tID=Merlin_301;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165997\t166191\t.\t+\t.\tID=Merlin_301_mRNA;Parent=Merlin_301;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165997\t166191\t.\t+\t.\tID=Merlin_301_exon;Parent=Merlin_301_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165997\t166191\t.\t+\t0\tID=Merlin_301_CDS;Parent=Merlin_301_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t166352\t167200\t-1091.167753\t+\t.\tID=Merlin_302;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t166352\t167200\t.\t+\t.\tID=Merlin_302_mRNA;Parent=Merlin_302;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t166352\t167200\t.\t+\t.\tID=Merlin_302_exon;Parent=Merlin_302_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t166352\t167200\t.\t+\t0\tID=Merlin_302_CDS;Parent=Merlin_302_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t167197\t167433\t-294.645060\t+\t.\tID=Merlin_303;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t167197\t167433\t.\t+\t.\tID=Merlin_303_mRNA;Parent=Merlin_303;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t167197\t167433\t.\t+\t.\tID=Merlin_303_exon;Parent=Merlin_303_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t167197\t167433\t.\t+\t0\tID=Merlin_303_CDS;Parent=Merlin_303_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t167487\t168944\t-1811.170385\t+\t.\tID=Merlin_304;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t167487\t168944\t.\t+\t.\tID=Merlin_304_mRNA;Parent=Merlin_304;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t167487\t168944\t.\t+\t.\tID=Merlin_304_exon;Parent=Merlin_304_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t167487\t168944\t.\t+\t0\tID=Merlin_304_CDS;Parent=Merlin_304_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t168941\t169120\t-220.159549\t+\t.\tID=Merlin_305;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t168941\t169120\t.\t+\t.\tID=Merlin_305_mRNA;Parent=Merlin_305;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t168941\t169120\t.\t+\t.\tID=Merlin_305_exon;Parent=Merlin_305_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t168941\t169120\t.\t+\t0\tID=Merlin_305_CDS;Parent=Merlin_305_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t169175\t171265\t-2617.092758\t+\t.\tID=Merlin_306;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t169175\t171265\t.\t+\t.\tID=Merlin_306_mRNA;Parent=Merlin_306;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t169175\t171265\t.\t+\t.\tID=Merlin_306_exon;Parent=Merlin_306_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t169175\t171265\t.\t+\t0\tID=Merlin_306_CDS;Parent=Merlin_306_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t171301\t172788\t-1876.322043\t+\t.\tID=Merlin_307;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t171301\t172788\t.\t+\t.\tID=Merlin_307_mRNA;Parent=Merlin_307;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t171301\t172788\t.\t+\t.\tID=Merlin_307_exon;Parent=Merlin_307_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t171301\t172788\t.\t+\t0\tID=Merlin_307_CDS;Parent=Merlin_307_exon;seqid=Merlin\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/blastxml/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/test.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,128 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+        <track cat="Blah" format="blast">
+            <files>
+                <trackFile path="test-data/blastxml/blast.xml" ext="blastxml" label="BlastP"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description></description>
+                    <label>Description</label>
+                    <height>400px</height>
+                </style>
+                <blast>
+                    <parent>test-data/blastxml/merlin.gff</parent>
+                    <protein>true</protein>
+                    <min_gap>10</min_gap>
+                </blast>
+                <scaling>
+                    <method>score</method>
+                    <algo>blast</algo>
+                    <scales>
+                        <type>__auto__</type>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Blah" format="blast">
+            <files>
+                <trackFile path="test-data/blastxml/blast.xml" ext="blastxml" label="BlastP, min_gap=3"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description></description>
+                    <label>Description</label>
+                    <height>400px</height>
+                </style>
+                <blast>
+                    <parent>test-data/blastxml/merlin.gff</parent>
+                    <protein>true</protein>
+                    <min_gap>3</min_gap>
+                </blast>
+                <scaling>
+                    <method>score</method>
+                    <algo>blast</algo>
+                    <scales>
+                        <type>__auto__</type>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+
+        <track cat="Blah" format="blast">
+            <files>
+                <trackFile path="test-data/blastxml/blast-gene1.xml" ext="blastxml" label="Non protein match/matchpart"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description></description>
+                    <label>Description</label>
+                    <height>400px</height>
+                </style>
+                <blast>
+                    <parent>test-data/blastxml/merlin.gff</parent>
+                    <min_gap>3</min_gap>
+                </blast>
+                <scaling>
+                    <method>ignore</method>
+                    <algo>linear</algo>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+
+        <track cat="Blah" format="blast">
+            <files>
+                <trackFile path="test-data/blastxml/blastn-gene1.xml" ext="blastxml" label="Non protein match/matchpart, no parent"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description></description>
+                    <label>Description</label>
+                    <height>400px</height>
+                </style>
+                <blast>
+                    <min_gap>40</min_gap>
+                </blast>
+                <scaling>
+                    <method>score</method>
+                    <algo>blast</algo>
+                    <scales>
+                        <type>__auto__</type>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/bw/data.bw
b
Binary file test-data/bw/data.bw has changed
b
diff -r b6a0e126dbee -r 7342f467507b test-data/bw/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/bw/test.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+        <track cat="Scaling" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Auto Global"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>true</variance_band>
+                    <autoscale>global</autoscale>
+                    <color_pos>__auto__</color_pos>
+                    <color_neg>__auto__</color_neg>
+                    <bicolor_pivot>zero</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+        <track cat="Scaling" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Auto Local"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>true</variance_band>
+                    <autoscale>local</autoscale>
+                    <color_pos>__auto__</color_pos>
+                    <color_neg>__auto__</color_neg>
+                    <bicolor_pivot>zero</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+        <track cat="Scaling" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Manual"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>false</variance_band>
+                    <autoscale>fixed</autoscale>
+                    <min>20</min>
+                    <max>60</max>
+                    <color_pos>__auto__</color_pos>
+                    <color_neg>__auto__</color_neg>
+                    <bicolor_pivot>zero</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+
+
+        <track cat="Colouring" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Auto A"/>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Auto B"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>false</variance_band>
+                    <autoscale>local</autoscale>
+
+                    <color_pos>__auto__</color_pos>
+                    <color_neg>__auto__</color_neg>
+                    <bicolor_pivot>mean</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+        <track cat="Colouring" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Manual"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>false</variance_band>
+                    <autoscale>local</autoscale>
+
+                    <color_pos>#0000ff</color_pos>
+                    <color_neg>#ff0000</color_neg>
+                    <bicolor_pivot>mean</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+        <track cat="Colouring" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Manual - Inverted"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>false</variance_band>
+                    <autoscale>local</autoscale>
+
+                    <color_pos>#ff0000</color_pos>
+                    <color_neg>#0000ff</color_neg>
+                    <bicolor_pivot>mean</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+        <track cat="Colouring" format="wiggle">
+            <files>
+                <trackFile path="test-data/bw/data.bw" ext="bigwig" label="Nonstandard Pivot"/>
+            </files>
+
+            <options>
+                <wiggle>
+                    <type>JBrowse/View/Track/Wiggle/XYPlot</type>
+                    <variance_band>false</variance_band>
+                    <autoscale>local</autoscale>
+
+                    <color_pos>#0000ff</color_pos>
+                    <color_neg>#ff0000</color_neg>
+                    <bicolor_pivot>100</bicolor_pivot>
+                </wiggle>
+            </options>
+        </track>
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gencode/test-1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gencode/test-1.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>1</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gencode/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gencode/test.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/1.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/1.gff Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,46 @@
+##gff-version 3
+##sequence-region Merlin 1 172788
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_1;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_1_mRNA;Parent=Merlin_1
+Merlin GeneMark.hmm CDS 14 20 1000 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+Merlin GeneMark.hmm CDS 24 30 500 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+
+Merlin GeneMark.hmm gene 14 30 . + . ID=Merlin_2;seqid=Merlin;color=#00ff00
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_2_mRNA;seqid=Merlin;color=#00ff00;Parent=Merlin_2
+Merlin GeneMark.hmm CDS 14 20 500 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 750 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#00ff00
+
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_3;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3A_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 18 1000 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 20 30 800 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3B_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 22 400 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 1000 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+
+
+
+Merlin exonerate gene 1740 2300 . + . Name=Apple3;Note=Gene with two splicing models;ID=1
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-a;Note=mRNA A with both CDSs and UTRs;ID=1A;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1A
+Merlin exonerate CDS 1900 2080 . + 0 Parent=1A
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1A
+Merlin exonerate UTR 2120 2300 . + . Parent=1A
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-b;Note=mRNA B with both CDSs and UTRs;ID=1B;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1B
+Merlin exonerate CDS 1800 1880 . + 0 Parent=1B
+Merlin exonerate CDS 1900 1950 . + 1 Parent=1B
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1B
+Merlin exonerate UTR 2120 2300 . + . Parent=1B
+
+
+
+#    {
+#    "baseUrl": "http://localhost:8000/out/data/"
+#    "compress": 0,
+#    "label": "Transcript",
+#    "storeClass": "JBrowse/Store/SeqFeature/NCList",
+#    "trackType": "JBrowse/View/Track/CanvasFeatures",
+#    "type": "JBrowse/View/Track/CanvasFeatures",
+#    "urlTemplate": "tracks/42ff9cb16c0509f0abb4a76ce14077bc_0/{refseq}/trackData.json",
+#    }
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/2.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/2.gff Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,6 @@
+##gff-version 3
+##sequence-region Merlin 1 172788
+
+Merlin . cDNA_match 1200 9000 . . . ID=cDNA00001
+Merlin . match_part 1200 3200 2.2e-30 + . ID=match00002;Parent=cDNA00001;Target=Merlin 5 506;Gap=M301 D1499 M201
+Merlin . match_part 7000 9000 7.4e-32 - . ID=match00003;Parent=cDNA00001;Target=Merlin 1 502;Gap=M101 D1499 M401
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/A.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/A.gff Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,46 @@
+##gff-version 3
+##sequence-region Merlin 1 172788
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_1;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_1_mRNA;Parent=Merlin_1
+Merlin GeneMark.hmm CDS 14 20 1000 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+Merlin GeneMark.hmm CDS 24 30 500 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+
+Merlin GeneMark.hmm gene 14 30 . + . ID=Merlin_2;seqid=Merlin;color=#00ff00
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_2_mRNA;seqid=Merlin;color=#00ff00;Parent=Merlin_2
+Merlin GeneMark.hmm CDS 14 20 500 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 750 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#00ff00
+
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_3;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3A_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 18 1000 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 20 30 800 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3B_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 22 400 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 1000 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+
+
+
+Merlin exonerate gene 1740 2300 . + . Name=Apple3;Note=Gene with two splicing models;ID=1
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-a;Note=mRNA A with both CDSs and UTRs;ID=1A;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1A
+Merlin exonerate CDS 1900 2080 . + 0 Parent=1A
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1A
+Merlin exonerate UTR 2120 2300 . + . Parent=1A
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-b;Note=mRNA B with both CDSs and UTRs;ID=1B;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1B
+Merlin exonerate CDS 1800 1880 . + 0 Parent=1B
+Merlin exonerate CDS 1900 1950 . + 1 Parent=1B
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1B
+Merlin exonerate UTR 2120 2300 . + . Parent=1B
+
+
+
+#    {
+#    "baseUrl": "http://localhost:8000/out/data/"
+#    "compress": 0,
+#    "label": "Transcript",
+#    "storeClass": "JBrowse/Store/SeqFeature/NCList",
+#    "trackType": "JBrowse/View/Track/CanvasFeatures",
+#    "type": "JBrowse/View/Track/CanvasFeatures",
+#    "urlTemplate": "tracks/42ff9cb16c0509f0abb4a76ce14077bc_0/{refseq}/trackData.json",
+#    }
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/B.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/B.gff Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,46 @@
+##gff-version 3
+##sequence-region Merlin 1 172788
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_1;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_1_mRNA;Parent=Merlin_1
+Merlin GeneMark.hmm CDS 14 20 1000 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+Merlin GeneMark.hmm CDS 24 30 500 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+
+Merlin GeneMark.hmm gene 14 30 . + . ID=Merlin_2;seqid=Merlin;color=#00ff00
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_2_mRNA;seqid=Merlin;color=#00ff00;Parent=Merlin_2
+Merlin GeneMark.hmm CDS 14 20 500 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 750 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#00ff00
+
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_3;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3A_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 18 1000 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 20 30 800 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3B_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 22 400 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 1000 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+
+
+
+Merlin exonerate gene 1740 2300 . + . Name=Apple3;Note=Gene with two splicing models;ID=1
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-a;Note=mRNA A with both CDSs and UTRs;ID=1A;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1A
+Merlin exonerate CDS 1900 2080 . + 0 Parent=1A
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1A
+Merlin exonerate UTR 2120 2300 . + . Parent=1A
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-b;Note=mRNA B with both CDSs and UTRs;ID=1B;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1B
+Merlin exonerate CDS 1800 1880 . + 0 Parent=1B
+Merlin exonerate CDS 1900 1950 . + 1 Parent=1B
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1B
+Merlin exonerate UTR 2120 2300 . + . Parent=1B
+
+
+
+#    {
+#    "baseUrl": "http://localhost:8000/out/data/"
+#    "compress": 0,
+#    "label": "Transcript",
+#    "storeClass": "JBrowse/Store/SeqFeature/NCList",
+#    "trackType": "JBrowse/View/Track/CanvasFeatures",
+#    "type": "JBrowse/View/Track/CanvasFeatures",
+#    "urlTemplate": "tracks/42ff9cb16c0509f0abb4a76ce14077bc_0/{refseq}/trackData.json",
+#    }
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/C.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/C.gff Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,46 @@
+##gff-version 3
+##sequence-region Merlin 1 172788
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_1;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_1_mRNA;Parent=Merlin_1
+Merlin GeneMark.hmm CDS 14 20 1000 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+Merlin GeneMark.hmm CDS 24 30 500 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+
+Merlin GeneMark.hmm gene 14 30 . + . ID=Merlin_2;seqid=Merlin;color=#00ff00
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_2_mRNA;seqid=Merlin;color=#00ff00;Parent=Merlin_2
+Merlin GeneMark.hmm CDS 14 20 500 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 750 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#00ff00
+
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_3;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3A_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 18 1000 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 20 30 800 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3B_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 22 400 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 1000 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+
+
+
+Merlin exonerate gene 1740 2300 . + . Name=Apple3;Note=Gene with two splicing models;ID=1
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-a;Note=mRNA A with both CDSs and UTRs;ID=1A;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1A
+Merlin exonerate CDS 1900 2080 . + 0 Parent=1A
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1A
+Merlin exonerate UTR 2120 2300 . + . Parent=1A
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-b;Note=mRNA B with both CDSs and UTRs;ID=1B;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1B
+Merlin exonerate CDS 1800 1880 . + 0 Parent=1B
+Merlin exonerate CDS 1900 1950 . + 1 Parent=1B
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1B
+Merlin exonerate UTR 2120 2300 . + . Parent=1B
+
+
+
+#    {
+#    "baseUrl": "http://localhost:8000/out/data/"
+#    "compress": 0,
+#    "label": "Transcript",
+#    "storeClass": "JBrowse/Store/SeqFeature/NCList",
+#    "trackType": "JBrowse/View/Track/CanvasFeatures",
+#    "type": "JBrowse/View/Track/CanvasFeatures",
+#    "urlTemplate": "tracks/42ff9cb16c0509f0abb4a76ce14077bc_0/{refseq}/trackData.json",
+#    }
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/D.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/D.gff Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,46 @@
+##gff-version 3
+##sequence-region Merlin 1 172788
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_1;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_1_mRNA;Parent=Merlin_1
+Merlin GeneMark.hmm CDS 14 20 1000 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+Merlin GeneMark.hmm CDS 24 30 500 + 0 ID=Merlin_1_CDS ;Parent=Merlin_1_mRNA
+
+Merlin GeneMark.hmm gene 14 30 . + . ID=Merlin_2;seqid=Merlin;color=#00ff00
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_2_mRNA;seqid=Merlin;color=#00ff00;Parent=Merlin_2
+Merlin GeneMark.hmm CDS 14 20 500 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 750 + 0 ID=Merlin_2_CDS ;Parent=Merlin_2_mRNA;color=#00ff00
+
+Merlin GeneMark.hmm gene 10 30 . + . ID=Merlin_3;seqid=Merlin
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3A_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 18 1000 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 20 30 800 + 0 ID=Merlin_3A_CDS ;Parent=Merlin_3A_mRNA;color=#0000ff
+Merlin GeneMark.hmm mRNA 14 30 . + . ID=Merlin_3B_mRNA;Parent=Merlin_3;color=#0000ff
+Merlin GeneMark.hmm CDS 14 22 400 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+Merlin GeneMark.hmm CDS 24 30 1000 + 0 ID=Merlin_3B_CDS ;Parent=Merlin_3B_mRNA;color=#0000ff
+
+
+
+Merlin exonerate gene 1740 2300 . + . Name=Apple3;Note=Gene with two splicing models;ID=1
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-a;Note=mRNA A with both CDSs and UTRs;ID=1A;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1A
+Merlin exonerate CDS 1900 2080 . + 0 Parent=1A
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1A
+Merlin exonerate UTR 2120 2300 . + . Parent=1A
+Merlin exonerate mRNA 1740 2300 . + . Name=Apple3-b;Note=mRNA B with both CDSs and UTRs;ID=1B;Parent=1;
+Merlin exonerate UTR 1740 1799 . + . Parent=1B
+Merlin exonerate CDS 1800 1880 . + 0 Parent=1B
+Merlin exonerate CDS 1900 1950 . + 1 Parent=1B
+Merlin exonerate CDS 2100 2120 . + 2 Parent=1B
+Merlin exonerate UTR 2120 2300 . + . Parent=1B
+
+
+
+#    {
+#    "baseUrl": "http://localhost:8000/out/data/"
+#    "compress": 0,
+#    "label": "Transcript",
+#    "storeClass": "JBrowse/Store/SeqFeature/NCList",
+#    "trackType": "JBrowse/View/Track/CanvasFeatures",
+#    "type": "JBrowse/View/Track/CanvasFeatures",
+#    "urlTemplate": "tracks/42ff9cb16c0509f0abb4a76ce14077bc_0/{refseq}/trackData.json",
+#    }
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/interpro.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/interpro.gff Thu Dec 31 13:58:43 2015 -0500
b
b'@@ -0,0 +1,558 @@\n+##gff-version 3\n+##sequence-region Merlin 1 172788\n+Merlin\tannotation\tremark\t1\t172788\t.\t.\t.\tgff-version=3;sequence-region=%28%27Merlin%27%2C 0%2C 172788%29\n+Merlin\tfeature\tpolypeptide\t1\t229\t.\t+\t.\tID=Merlin_1;md5=4d58b2b569c2fe52e2945e3f6e380c48\n+Merlin\tGene3D\tprotein_match\t2\t50\t2.9E-21\t+\t.\tID=match%2477_2_50;Name=G3DSA:3.90.176.10;Target=Merlin_1 2 50;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t106\t165\t2.9E-21\t+\t.\tID=match%2477_106_165;Name=G3DSA:3.90.176.10;Target=Merlin_1 106 165;date=23-02-2015;status=T\n+Merlin\tPfam\tprotein_match\t7\t162\t1.9E-12\t+\t.\tDbxref=InterPro:IPR003540;ID=match%2478_7_162;Name=PF03496;Ontology_term=GO:0005576%22%2C%22GO:0009405;Target=Merlin_1 7 162;date=23-02-2015;signature_desc=ADP-ribosyltransferase exoenzyme;status=T\n+Merlin\tSUPERFAMILY\tprotein_match\t2\t48\t.\t+\t.\tID=match%2479_2_48;Name=SSF56399;Target=Merlin_1 2 48;date=23-02-2015;status=T\n+Merlin\tSUPERFAMILY\tprotein_match\t104\t164\t.\t+\t.\tID=match%2479_104_164;Name=SSF56399;Target=Merlin_1 104 164;date=23-02-2015;status=T\n+Merlin\tfeature\tpolypeptide\t1698\t2011\t.\t-\t.\tID=Merlin_3;md5=6b220b99a5d2dd40f55bb664a8dbdfb3\n+Merlin\tPfam\tprotein_match\t1912\t2011\t1.5E-8\t-\t.\tDbxref=InterPro:IPR010667;ID=match%24113_149_248;Name=PF06841;Ontology_term=GO:0005198;Target=Merlin_3 149 248;date=23-02-2015;signature_desc=T4-like virus tail tube protein gp19;status=T\n+Merlin\tfeature\tpolypeptide\t2716\t3066\t.\t-\t.\tID=Merlin_4;md5=bdb226d471fe35e28ce6a9ed4649a1f8\n+Merlin\tPfam\tprotein_match\t2725\t3066\t1.6E-150\t-\t.\tDbxref=InterPro:IPR024389;ID=match%24361_4_345;Name=PF11091;Target=Merlin_4 4 345;date=23-02-2015;signature_desc=Tail-tube assembly protein;status=T\n+Merlin\tfeature\tpolypeptide\t5144\t5317\t.\t-\t.\tID=Merlin_6;md5=c61e0e2dba259054b9c93fd931056fdd\n+Merlin\tPfam\tprotein_match\t5166\t5317\t1.5E-59\t-\t.\tDbxref=InterPro:IPR024342;ID=match%24360_21_172;Name=PF11110;Target=Merlin_6 21 172;date=23-02-2015;signature_desc=Baseplate hub distal subunit;status=T\n+Merlin\tfeature\tpolypeptide\t6052\t6431\t.\t-\t.\tID=Merlin_7;md5=b51a60ffef9f07b672e0d12d26d27bbc\n+Merlin\tSUPERFAMILY\tprotein_match\t6256\t6431\t.\t-\t.\tID=match%24227_199_374;Name=SSF69279;Target=Merlin_7 199 374;date=23-02-2015;status=T\n+Merlin\tSUPERFAMILY\tprotein_match\t6238\t6431\t.\t-\t.\tID=match%24228_5_198;Name=SSF69279;Target=Merlin_7 5 198;date=23-02-2015;status=T\n+Merlin\tPfam\tprotein_match\t6237\t6431\t4.3E-96\t-\t.\tDbxref=InterPro:IPR015181;ID=match%24229_4_198;Name=PF09097;Target=Merlin_7 4 198;date=23-02-2015;signature_desc=Baseplate structural protein,domain 1;status=T\n+Merlin\tGene3D\tprotein_match\t6320\t6431\t1.4E-54\t-\t.\tID=match%24230_3_114;Name=G3DSA:2.40.10.10;Target=Merlin_7 3 114;date=23-02-2015;status=T\n+Merlin\tPfam\tprotein_match\t6263\t6431\t3.9E-83\t-\t.\tDbxref=InterPro:IPR015180;ID=match%24231_201_369;Name=PF09096;Target=Merlin_7 201 369;date=23-02-2015;signature_desc=Baseplate structural protein,domain 2;status=T\n+Merlin\tfeature\tpolypeptide\t6931\t7180\t.\t-\t.\tID=Merlin_8;md5=78306f53371e5e47b051cad8a16b86e5\n+Merlin\tPfam\tprotein_match\t6985\t7180\t9.8E-56\t-\t.\tDbxref=InterPro:IPR024364;ID=match%24348_5_200;Name=PF12322;Target=Merlin_8 5 200;date=23-02-2015;signature_desc=T4 bacteriophage base plate protein;status=T\n+Merlin\tfeature\tpolypeptide\t7227\t7435\t.\t+\t.\tID=Merlin_9;md5=5ced4f78a57bd34e165ccf7b43ed3ef1\n+Merlin\tPfam\tprotein_match\t7231\t7433\t6.3E-63\t+\t.\tDbxref=InterPro:IPR024364;ID=match%24164_5_207;Name=PF12322;Target=Merlin_9 5 207;date=23-02-2015;signature_desc=T4 bacteriophage base plate protein;status=T\n+Merlin\tfeature\tpolypeptide\t7856\t7970\t.\t+\t.\tID=Merlin_10;md5=b0c491c633f373b9340ede7359636469\n+Merlin\tPfam\tprotein_match\t7863\t7956\t1.6E-17\t+\t.\tDbxref=InterPro:IPR007048;ID=match%2416_8_101;Name=PF04965;Target=Merlin_10 8 101;date=23-02-2015;signature_desc=Gene 25-like lysozyme;status=T\n+Merlin\tSUPERFAMILY\tprotein_match\t7862\t7957\t.\t+\t.\tID=match%2417_7_102;Name=SSF160719;Target=Merlin_10 7 102;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t7857\t7959\t9.3E-27\t+\t.\tDbxref=InterPro:IPR015801;ID=match%2418_2_104;N'..b'Pro:IPR023214;ID=match%24167_7_211;Name=SSF56784;Target=Merlin_302 7 211;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t166428\t166561\t5.5E-6\t+\t.\tDbxref=InterPro:IPR023214;ID=match%24168_78_211;Name=G3DSA:3.40.50.1000;Target=Merlin_302 78 211;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t166359\t166371\t5.5E-6\t+\t.\tDbxref=InterPro:IPR023214;ID=match%24168_9_21;Name=G3DSA:3.40.50.1000;Target=Merlin_302 9 21;date=23-02-2015;status=T\n+Merlin\tfeature\tpolypeptide\t167486\t167970\t.\t+\t.\tID=Merlin_304;md5=283a418fea20ac001bffdcbf72299ca8\n+Merlin\tSUPERFAMILY\tprotein_match\t167619\t167850\t.\t+\t.\tID=match%24122_134_365;Name=SSF56091;Target=Merlin_304 134 365;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t167834\t167952\t5.9E-8\t+\t.\tDbxref=InterPro:IPR012340;ID=match%24123_349_467;Name=G3DSA:2.40.50.140;Target=Merlin_304 349 467;date=23-02-2015;status=T\n+Merlin\tProSitePatterns\tprotein_match\t167827\t167850\t.\t+\t.\tDbxref=InterPro:IPR016059%22%2C%22Reactome:REACT_216;ID=match%24124_342_365;Name=PS00333;Ontology_term=GO:0003909%22%2C%22GO:0051103;Target=Merlin_304 342 365;date=23-02-2015;signature_desc=ATP-dependent DNA ligase signature 2.;status=T\n+Merlin\tPfam\tprotein_match\t167620\t167850\t9.0E-28\t+\t.\tDbxref=InterPro:IPR012310%22%2C%22Reactome:REACT_216;ID=match%24125_135_365;Name=PF01068;Ontology_term=GO:0003910%22%2C%22GO:0005524%22%2C%22GO:0006281%22%2C%22GO:0006310;Target=Merlin_304 135 365;date=23-02-2015;signature_desc=ATP dependent DNA ligase domain;status=T\n+Merlin\tProSitePatterns\tprotein_match\t167642\t167650\t.\t+\t.\tDbxref=InterPro:IPR016059%22%2C%22Reactome:REACT_216;ID=match%24126_157_165;Name=PS00697;Ontology_term=GO:0003909%22%2C%22GO:0051103;Target=Merlin_304 157 165;date=23-02-2015;signature_desc=ATP-dependent DNA ligase AMP-binding site.;status=T\n+Merlin\tGene3D\tprotein_match\t167803\t167833\t8.5E-8\t+\t.\tID=match%24127_318_348;Name=G3DSA:3.30.1490.70;Target=Merlin_304 318 348;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t167621\t167646\t8.5E-8\t+\t.\tID=match%24127_136_161;Name=G3DSA:3.30.1490.70;Target=Merlin_304 136 161;date=23-02-2015;status=T\n+Merlin\tSUPERFAMILY\tprotein_match\t167823\t167930\t.\t+\t.\tDbxref=InterPro:IPR012340;ID=match%24128_338_445;Name=SSF50249;Target=Merlin_304 338 445;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t167661\t167794\t1.2E-4\t+\t.\tID=match%24129_176_309;Name=G3DSA:3.30.470.30;Target=Merlin_304 176 309;date=23-02-2015;status=T\n+Merlin\tfeature\tpolypeptide\t169174\t169869\t.\t+\t.\tID=Merlin_306;md5=3f61e1cb18fb135a3dc061968bcd879c\n+Merlin\tSUPERFAMILY\tprotein_match\t169736\t169781\t.\t+\t.\tID=match%24253_563_608;Name=SSF56399;Target=Merlin_306 563 608;date=23-02-2015;status=T\n+Merlin\tSUPERFAMILY\tprotein_match\t169590\t169696\t.\t+\t.\tID=match%24253_417_523;Name=SSF56399;Target=Merlin_306 417 523;date=23-02-2015;status=T\n+Merlin\tPfam\tprotein_match\t169589\t169781\t1.6E-22\t+\t.\tDbxref=InterPro:IPR003540;ID=match%24254_416_608;Name=PF03496;Ontology_term=GO:0005576%22%2C%22GO:0009405;Target=Merlin_306 416 608;date=23-02-2015;signature_desc=ADP-ribosyltransferase exoenzyme;status=T\n+Merlin\tGene3D\tprotein_match\t169597\t169698\t2.1E-28\t+\t.\tID=match%24255_424_525;Name=G3DSA:3.90.176.10;Target=Merlin_306 424 525;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t169738\t169784\t2.1E-28\t+\t.\tID=match%24255_565_611;Name=G3DSA:3.90.176.10;Target=Merlin_306 565 611;date=23-02-2015;status=T\n+Merlin\tfeature\tpolypeptide\t171300\t171794\t.\t+\t.\tID=Merlin_307;md5=0f4b8b0843334ccf18e5a4a7cbdf67b2\n+Merlin\tSUPERFAMILY\tprotein_match\t171723\t171792\t.\t+\t.\tID=match%24339_424_493;Name=SSF56399;Target=Merlin_307 424 493;date=23-02-2015;status=T\n+Merlin\tGene3D\tprotein_match\t171722\t171791\t5.2E-11\t+\t.\tID=match%24340_423_492;Name=G3DSA:3.90.176.10;Target=Merlin_307 423 492;date=23-02-2015;status=T\n+Merlin\tPfam\tprotein_match\t171723\t171791\t2.0E-9\t+\t.\tDbxref=InterPro:IPR003540;ID=match%24341_424_492;Name=PF03496;Ontology_term=GO:0005576%22%2C%22GO:0009405;Target=Merlin_307 424 492;date=23-02-2015;signature_desc=ADP-ribosyltransferase exoenzyme;status=T\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/merlin.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/merlin.gff Thu Dec 31 13:58:43 2015 -0500
b
b'@@ -0,0 +1,1230 @@\n+##gff-version 3\n+##sequence-region Merlin 1 172788\n+Merlin\tGeneMark.hmm\tgene\t2\t691\t-856.563659\t+\t.\tID=Merlin_1;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t2\t691\t.\t+\t.\tID=Merlin_1_mRNA;Parent=Merlin_1;seqid=Merlin;color=#00ff00\n+Merlin\tGeneMark.hmm\texon\t2\t691\t.\t+\t.\tID=Merlin_1_exon;Parent=Merlin_1_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t2\t691\t.\t+\t0\tID=Merlin_1_CDS;Parent=Merlin_1_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t752\t1039\t-339.046618\t+\t.\tID=Merlin_2;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t752\t1039\t.\t+\t.\tID=Merlin_2_mRNA;Parent=Merlin_2;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t752\t1039\t.\t+\t.\tID=Merlin_2_exon;Parent=Merlin_2_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t752\t1039\t.\t+\t0\tID=Merlin_2_CDS;Parent=Merlin_2_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t1067\t2011\t-1229.683915\t-\t.\tID=Merlin_3;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t1067\t2011\t.\t-\t.\tID=Merlin_3_mRNA;Parent=Merlin_3;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t1067\t2011\t.\t-\t.\tID=Merlin_3_exon;Parent=Merlin_3_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t1067\t2011\t.\t-\t0\tID=Merlin_3_CDS;Parent=Merlin_3_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t2011\t3066\t-1335.034872\t-\t.\tID=Merlin_4;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t2011\t3066\t.\t-\t.\tID=Merlin_4_mRNA;Parent=Merlin_4;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t2011\t3066\t.\t-\t.\tID=Merlin_4_exon;Parent=Merlin_4_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t2011\t3066\t.\t-\t0\tID=Merlin_4_CDS;Parent=Merlin_4_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t3066\t4796\t-2177.374893\t-\t.\tID=Merlin_5;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t3066\t4796\t.\t-\t.\tID=Merlin_5_mRNA;Parent=Merlin_5;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t3066\t4796\t.\t-\t.\tID=Merlin_5_exon;Parent=Merlin_5_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t3066\t4796\t.\t-\t0\tID=Merlin_5_CDS;Parent=Merlin_5_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t4793\t5317\t-682.565030\t-\t.\tID=Merlin_6;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t4793\t5317\t.\t-\t.\tID=Merlin_6_mRNA;Parent=Merlin_6;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t4793\t5317\t.\t-\t.\tID=Merlin_6_exon;Parent=Merlin_6_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t4793\t5317\t.\t-\t0\tID=Merlin_6_CDS;Parent=Merlin_6_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t5289\t6431\t-1457.525863\t-\t.\tID=Merlin_7;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t5289\t6431\t.\t-\t.\tID=Merlin_7_mRNA;Parent=Merlin_7;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t5289\t6431\t.\t-\t.\tID=Merlin_7_exon;Parent=Merlin_7_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t5289\t6431\t.\t-\t0\tID=Merlin_7_CDS;Parent=Merlin_7_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t6428\t7180\t-968.015933\t-\t.\tID=Merlin_8;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t6428\t7180\t.\t-\t.\tID=Merlin_8_mRNA;Parent=Merlin_8;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t6428\t7180\t.\t-\t.\tID=Merlin_8_exon;Parent=Merlin_8_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t6428\t7180\t.\t-\t0\tID=Merlin_8_CDS;Parent=Merlin_8_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t7228\t7857\t-809.330137\t+\t.\tID=Merlin_9;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t7228\t7857\t.\t+\t.\tID=Merlin_9_mRNA;Parent=Merlin_9;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t7228\t7857\t.\t+\t.\tID=Merlin_9_exon;Parent=Merlin_9_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t7228\t7857\t.\t+\t0\tID=Merlin_9_CDS;Parent=Merlin_9_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t7857\t8252\t-515.006678\t+\t.\tID=Merlin_10;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t7857\t8252\t.\t+\t.\tID=Merlin_10_mRNA;Parent=Merlin_10;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t7857\t8252\t.\t+\t.\tID=Merlin_10_exon;Parent=Merlin_10_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t7857\t8252\t.\t+\t0\tID=Merlin_10_CDS;Parent=Merlin_10_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t8340\t8753\t-522.529341\t+\t.\tID=Merlin_11;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t8340\t8753\t.\t+\t.\tID=Merlin_11_mRNA;Parent=Merlin_11;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t8340\t8753\t.\t+\t.\tID=Merlin_11_exon;Parent=Merlin_11_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t8340\t8753\t.\t+\t0\tID=Merlin_11_CDS;Parent=Merlin_11_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t8787\t8951\t-212.019038\t+\t.\tID=Merlin_12;seqid=Merlin'..b'rlin\n+Merlin\tGeneMark.hmm\texon\t164715\t165071\t.\t+\t.\tID=Merlin_297_exon;Parent=Merlin_297_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t164715\t165071\t.\t+\t0\tID=Merlin_297_CDS;Parent=Merlin_297_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165107\t165601\t-618.360781\t+\t.\tID=Merlin_298;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165107\t165601\t.\t+\t.\tID=Merlin_298_mRNA;Parent=Merlin_298;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165107\t165601\t.\t+\t.\tID=Merlin_298_exon;Parent=Merlin_298_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165107\t165601\t.\t+\t0\tID=Merlin_298_CDS;Parent=Merlin_298_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165612\t165773\t-191.091430\t+\t.\tID=Merlin_299;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165612\t165773\t.\t+\t.\tID=Merlin_299_mRNA;Parent=Merlin_299;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165612\t165773\t.\t+\t.\tID=Merlin_299_exon;Parent=Merlin_299_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165612\t165773\t.\t+\t0\tID=Merlin_299_CDS;Parent=Merlin_299_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165770\t166000\t-285.030914\t+\t.\tID=Merlin_300;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165770\t166000\t.\t+\t.\tID=Merlin_300_mRNA;Parent=Merlin_300;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165770\t166000\t.\t+\t.\tID=Merlin_300_exon;Parent=Merlin_300_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165770\t166000\t.\t+\t0\tID=Merlin_300_CDS;Parent=Merlin_300_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t165997\t166191\t-241.609251\t+\t.\tID=Merlin_301;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t165997\t166191\t.\t+\t.\tID=Merlin_301_mRNA;Parent=Merlin_301;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t165997\t166191\t.\t+\t.\tID=Merlin_301_exon;Parent=Merlin_301_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t165997\t166191\t.\t+\t0\tID=Merlin_301_CDS;Parent=Merlin_301_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t166352\t167200\t-1091.167753\t+\t.\tID=Merlin_302;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t166352\t167200\t.\t+\t.\tID=Merlin_302_mRNA;Parent=Merlin_302;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t166352\t167200\t.\t+\t.\tID=Merlin_302_exon;Parent=Merlin_302_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t166352\t167200\t.\t+\t0\tID=Merlin_302_CDS;Parent=Merlin_302_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t167197\t167433\t-294.645060\t+\t.\tID=Merlin_303;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t167197\t167433\t.\t+\t.\tID=Merlin_303_mRNA;Parent=Merlin_303;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t167197\t167433\t.\t+\t.\tID=Merlin_303_exon;Parent=Merlin_303_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t167197\t167433\t.\t+\t0\tID=Merlin_303_CDS;Parent=Merlin_303_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t167487\t168944\t-1811.170385\t+\t.\tID=Merlin_304;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t167487\t168944\t.\t+\t.\tID=Merlin_304_mRNA;Parent=Merlin_304;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t167487\t168944\t.\t+\t.\tID=Merlin_304_exon;Parent=Merlin_304_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t167487\t168944\t.\t+\t0\tID=Merlin_304_CDS;Parent=Merlin_304_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t168941\t169120\t-220.159549\t+\t.\tID=Merlin_305;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t168941\t169120\t.\t+\t.\tID=Merlin_305_mRNA;Parent=Merlin_305;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t168941\t169120\t.\t+\t.\tID=Merlin_305_exon;Parent=Merlin_305_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t168941\t169120\t.\t+\t0\tID=Merlin_305_CDS;Parent=Merlin_305_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t169175\t171265\t-2617.092758\t+\t.\tID=Merlin_306;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t169175\t171265\t.\t+\t.\tID=Merlin_306_mRNA;Parent=Merlin_306;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t169175\t171265\t.\t+\t.\tID=Merlin_306_exon;Parent=Merlin_306_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t169175\t171265\t.\t+\t0\tID=Merlin_306_CDS;Parent=Merlin_306_exon;seqid=Merlin\n+Merlin\tGeneMark.hmm\tgene\t171301\t172788\t-1876.322043\t+\t.\tID=Merlin_307;seqid=Merlin\n+Merlin\tGeneMark.hmm\tmRNA\t171301\t172788\t.\t+\t.\tID=Merlin_307_mRNA;Parent=Merlin_307;seqid=Merlin\n+Merlin\tGeneMark.hmm\texon\t171301\t172788\t.\t+\t.\tID=Merlin_307_exon;Parent=Merlin_307_mRNA;seqid=Merlin\n+Merlin\tGeneMark.hmm\tCDS\t171301\t172788\t.\t+\t0\tID=Merlin_307_CDS;Parent=Merlin_307_exon;seqid=Merlin\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/gff3/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/test.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,218 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+        <track cat="Auto Coloured" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="A"/>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="B"/>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="C"/>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="D"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>ignore</method>
+                    <scheme>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Ignore Scale" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="Fixed Colour"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>ignore</method>
+                    <scheme>
+                        <color>#ff00ff</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Scaled Colour" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="Linear, Auto-bounds"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>score</method>
+                    <algo>linear</algo>
+                    <scales>
+                        <type>__auto__</type>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Scaled Colour" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="Linear, Auto-bounds, Fixed Color"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>score</method>
+                    <algo>linear</algo>
+                    <scales>
+                        <type>__auto__</type>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>#0000ff</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Scaled Colour" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="Linear, Manual Bounds"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>score</method>
+                    <algo>linear</algo>
+                    <scales>
+                        <type>manual</type>
+                        <min>0</min>
+                        <max>1000</max>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Scaled Colour" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/1.gff" ext="gff3" label="Linear, Manual Bounds, Fixed Color"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>score</method>
+                    <algo>linear</algo>
+                    <scales>
+                        <type>manual</type>
+                        <min>0</min>
+                        <max>1000</max>
+                    </scales>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>#ff0000</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+
+
+        <track cat="Realistic" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/interpro.gff" ext="gff3" label="Interpro data"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                </gff>
+                <scaling>
+                    <method>ignore</method>
+                    <scheme>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+        <track cat="Realistic" format="gene_calls">
+            <files>
+                <trackFile path="test-data/gff3/2.gff" ext="gff3" label="Match/Match Part"/>
+            </files>
+
+            <options>
+                <style>
+                    <className>feature</className>
+                    <description>feature</description>
+                    <label>name,id</label>
+                    <height>100px</height>
+                </style>
+                <gff>
+                    <match>cDNA_match</match>
+                </gff>
+                <scaling>
+                    <method>ignore</method>
+                    <scheme>
+                        <type>opacity</type>
+                        <color>__auto__</color>
+                    </scheme>
+                </scaling>
+            </options>
+        </track>
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/index.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/index.html Thu Dec 31 13:58:43 2015 -0500
[
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>JBrowse</title>
+    <link rel="stylesheet" type="text/css" href="css/genome.css">
+</head>
+<body>
+
+    <script type="text/javascript">
+            // jshint unused: false
+            var dojoConfig = {
+                async: true,
+                baseUrl: './src',
+                has: {
+                    'host-node': false // Prevent dojo from being fooled by Electron
+                }
+            };
+            // Move Electron's require out before loading Dojo
+            if(window.process&&process.versions&&process.versions.electron) {
+                window.electronRequire = require;
+                delete window.require;
+            }
+    </script>
+    <script type="text/javascript" src="src/dojo/dojo.js"></script>
+    <script type="text/javascript" src="src/JBrowse/init.js"></script>
+    <script type="text/javascript">
+        window.onerror=function(msg){
+            if( document.body )
+                document.body.setAttribute("JSError",msg);
+        }
+
+        // puts the main Browser object in this for convenience.  feel
+        // free to move it into function scope if you want to keep it
+        // out of the global namespace
+        var JBrowse;
+        require(['JBrowse/Browser', 'dojo/io-query', 'dojo/json' ],
+             function (Browser,ioQuery,JSON) {
+                   // the initial configuration of this JBrowse
+                   // instance
+
+                   // NOTE: this initial config is the same as any
+                   // other JBrowse config in any other file.  this
+                   // one just sets defaults from URL query params.
+                   // If you are embedding JBrowse in some other app,
+                   // you might as well just set this initial config
+                   // to something like { include: '../my/dynamic/conf.json' },
+                   // or you could put the entire
+                   // dynamically-generated JBrowse config here.
+
+                   // parse the query vars in the page URL
+                   var queryParams = ioQuery.queryToObject( window.location.search.slice(1) );
+
+                   var config = {
+                       containerID: "GenomeBrowser",
+
+                       dataRoot: queryParams.data,
+                       queryParams: queryParams,
+                       location: queryParams.loc,
+                       forceTracks: queryParams.tracks,
+                       initialHighlight: queryParams.highlight,
+                       show_nav: queryParams.nav,
+                       show_tracklist: queryParams.tracklist,
+                       show_overview: queryParams.overview,
+                       show_menu: queryParams.menu,
+                       show_tracklabels: queryParams.tracklabels,
+                       highResolutionMode: queryParams.highres,
+                       stores: { url: { type: "JBrowse/Store/SeqFeature/FromConfig", features: [] } },
+                       makeFullViewURL: function( browser ) {
+
+                           // the URL for the 'Full view' link
+                           // in embedded mode should be the current
+                           // view URL, except with 'nav', 'tracklist',
+                           // and 'overview' parameters forced to 1.
+
+                           return browser.makeCurrentViewURL({ nav: 1, tracklist: 1, overview: 1 });
+                       },
+                       updateBrowserURL: true
+                   };
+
+                   //if there is ?addFeatures in the query params,
+                   //define a store for data from the URL
+                   if( queryParams.addFeatures ) {
+                       config.stores.url.features = JSON.parse( queryParams.addFeatures );
+                   }
+
+                   // if there is ?addTracks in the query params, add
+                   // those track configurations to our initial
+                   // configuration
+                   if( queryParams.addTracks ) {
+                       config.tracks = JSON.parse( queryParams.addTracks );
+                   }
+
+                   // if there is ?addStores in the query params, add
+                   // those store configurations to our initial
+                   // configuration
+                   if( queryParams.addStores ) {
+                       config.stores = JSON.parse( queryParams.addStores );
+                   }
+
+                   // create a JBrowse global variable holding the JBrowse instance
+                   JBrowse = new Browser( config );
+        });
+    </script>
+
+  </head>
+
+  <body>
+    <div id="GenomeBrowser" style="height: 100%; width: 100%; padding: 0; border: 0;"></div>
+    <div style="display: none">JBrowseDefaultMainPage</div>
+  </body>
+</html>
b
diff -r b6a0e126dbee -r 7342f467507b test-data/interpro.gff
--- a/test-data/interpro.gff Tue Jun 23 12:10:15 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,558 +0,0 @@\n-##gff-version 3\n-##sequence-region Merlin 1 172788\n-Merlin\tannotation\tremark\t1\t172788\t.\t.\t.\tgff-version=3;sequence-region=%28%27Merlin%27%2C 0%2C 172788%29\n-Merlin\tfeature\tpolypeptide\t1\t229\t.\t+\t.\tID=Merlin_1;md5=4d58b2b569c2fe52e2945e3f6e380c48\n-Merlin\tGene3D\tprotein_match\t2\t50\t2.9E-21\t+\t.\tID=match%2477_2_50;Name=G3DSA:3.90.176.10;Target=Merlin_1 2 50;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t106\t165\t2.9E-21\t+\t.\tID=match%2477_106_165;Name=G3DSA:3.90.176.10;Target=Merlin_1 106 165;date=23-02-2015;status=T\n-Merlin\tPfam\tprotein_match\t7\t162\t1.9E-12\t+\t.\tDbxref=InterPro:IPR003540;ID=match%2478_7_162;Name=PF03496;Ontology_term=GO:0005576%22%2C%22GO:0009405;Target=Merlin_1 7 162;date=23-02-2015;signature_desc=ADP-ribosyltransferase exoenzyme;status=T\n-Merlin\tSUPERFAMILY\tprotein_match\t2\t48\t.\t+\t.\tID=match%2479_2_48;Name=SSF56399;Target=Merlin_1 2 48;date=23-02-2015;status=T\n-Merlin\tSUPERFAMILY\tprotein_match\t104\t164\t.\t+\t.\tID=match%2479_104_164;Name=SSF56399;Target=Merlin_1 104 164;date=23-02-2015;status=T\n-Merlin\tfeature\tpolypeptide\t1698\t2011\t.\t-\t.\tID=Merlin_3;md5=6b220b99a5d2dd40f55bb664a8dbdfb3\n-Merlin\tPfam\tprotein_match\t1912\t2011\t1.5E-8\t-\t.\tDbxref=InterPro:IPR010667;ID=match%24113_149_248;Name=PF06841;Ontology_term=GO:0005198;Target=Merlin_3 149 248;date=23-02-2015;signature_desc=T4-like virus tail tube protein gp19;status=T\n-Merlin\tfeature\tpolypeptide\t2716\t3066\t.\t-\t.\tID=Merlin_4;md5=bdb226d471fe35e28ce6a9ed4649a1f8\n-Merlin\tPfam\tprotein_match\t2725\t3066\t1.6E-150\t-\t.\tDbxref=InterPro:IPR024389;ID=match%24361_4_345;Name=PF11091;Target=Merlin_4 4 345;date=23-02-2015;signature_desc=Tail-tube assembly protein;status=T\n-Merlin\tfeature\tpolypeptide\t5144\t5317\t.\t-\t.\tID=Merlin_6;md5=c61e0e2dba259054b9c93fd931056fdd\n-Merlin\tPfam\tprotein_match\t5166\t5317\t1.5E-59\t-\t.\tDbxref=InterPro:IPR024342;ID=match%24360_21_172;Name=PF11110;Target=Merlin_6 21 172;date=23-02-2015;signature_desc=Baseplate hub distal subunit;status=T\n-Merlin\tfeature\tpolypeptide\t6052\t6431\t.\t-\t.\tID=Merlin_7;md5=b51a60ffef9f07b672e0d12d26d27bbc\n-Merlin\tSUPERFAMILY\tprotein_match\t6256\t6431\t.\t-\t.\tID=match%24227_199_374;Name=SSF69279;Target=Merlin_7 199 374;date=23-02-2015;status=T\n-Merlin\tSUPERFAMILY\tprotein_match\t6238\t6431\t.\t-\t.\tID=match%24228_5_198;Name=SSF69279;Target=Merlin_7 5 198;date=23-02-2015;status=T\n-Merlin\tPfam\tprotein_match\t6237\t6431\t4.3E-96\t-\t.\tDbxref=InterPro:IPR015181;ID=match%24229_4_198;Name=PF09097;Target=Merlin_7 4 198;date=23-02-2015;signature_desc=Baseplate structural protein,domain 1;status=T\n-Merlin\tGene3D\tprotein_match\t6320\t6431\t1.4E-54\t-\t.\tID=match%24230_3_114;Name=G3DSA:2.40.10.10;Target=Merlin_7 3 114;date=23-02-2015;status=T\n-Merlin\tPfam\tprotein_match\t6263\t6431\t3.9E-83\t-\t.\tDbxref=InterPro:IPR015180;ID=match%24231_201_369;Name=PF09096;Target=Merlin_7 201 369;date=23-02-2015;signature_desc=Baseplate structural protein,domain 2;status=T\n-Merlin\tfeature\tpolypeptide\t6931\t7180\t.\t-\t.\tID=Merlin_8;md5=78306f53371e5e47b051cad8a16b86e5\n-Merlin\tPfam\tprotein_match\t6985\t7180\t9.8E-56\t-\t.\tDbxref=InterPro:IPR024364;ID=match%24348_5_200;Name=PF12322;Target=Merlin_8 5 200;date=23-02-2015;signature_desc=T4 bacteriophage base plate protein;status=T\n-Merlin\tfeature\tpolypeptide\t7227\t7435\t.\t+\t.\tID=Merlin_9;md5=5ced4f78a57bd34e165ccf7b43ed3ef1\n-Merlin\tPfam\tprotein_match\t7231\t7433\t6.3E-63\t+\t.\tDbxref=InterPro:IPR024364;ID=match%24164_5_207;Name=PF12322;Target=Merlin_9 5 207;date=23-02-2015;signature_desc=T4 bacteriophage base plate protein;status=T\n-Merlin\tfeature\tpolypeptide\t7856\t7970\t.\t+\t.\tID=Merlin_10;md5=b0c491c633f373b9340ede7359636469\n-Merlin\tPfam\tprotein_match\t7863\t7956\t1.6E-17\t+\t.\tDbxref=InterPro:IPR007048;ID=match%2416_8_101;Name=PF04965;Target=Merlin_10 8 101;date=23-02-2015;signature_desc=Gene 25-like lysozyme;status=T\n-Merlin\tSUPERFAMILY\tprotein_match\t7862\t7957\t.\t+\t.\tID=match%2417_7_102;Name=SSF160719;Target=Merlin_10 7 102;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t7857\t7959\t9.3E-27\t+\t.\tDbxref=InterPro:IPR015801;ID=match%2418_2_104;N'..b'Pro:IPR023214;ID=match%24167_7_211;Name=SSF56784;Target=Merlin_302 7 211;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t166428\t166561\t5.5E-6\t+\t.\tDbxref=InterPro:IPR023214;ID=match%24168_78_211;Name=G3DSA:3.40.50.1000;Target=Merlin_302 78 211;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t166359\t166371\t5.5E-6\t+\t.\tDbxref=InterPro:IPR023214;ID=match%24168_9_21;Name=G3DSA:3.40.50.1000;Target=Merlin_302 9 21;date=23-02-2015;status=T\n-Merlin\tfeature\tpolypeptide\t167486\t167970\t.\t+\t.\tID=Merlin_304;md5=283a418fea20ac001bffdcbf72299ca8\n-Merlin\tSUPERFAMILY\tprotein_match\t167619\t167850\t.\t+\t.\tID=match%24122_134_365;Name=SSF56091;Target=Merlin_304 134 365;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t167834\t167952\t5.9E-8\t+\t.\tDbxref=InterPro:IPR012340;ID=match%24123_349_467;Name=G3DSA:2.40.50.140;Target=Merlin_304 349 467;date=23-02-2015;status=T\n-Merlin\tProSitePatterns\tprotein_match\t167827\t167850\t.\t+\t.\tDbxref=InterPro:IPR016059%22%2C%22Reactome:REACT_216;ID=match%24124_342_365;Name=PS00333;Ontology_term=GO:0003909%22%2C%22GO:0051103;Target=Merlin_304 342 365;date=23-02-2015;signature_desc=ATP-dependent DNA ligase signature 2.;status=T\n-Merlin\tPfam\tprotein_match\t167620\t167850\t9.0E-28\t+\t.\tDbxref=InterPro:IPR012310%22%2C%22Reactome:REACT_216;ID=match%24125_135_365;Name=PF01068;Ontology_term=GO:0003910%22%2C%22GO:0005524%22%2C%22GO:0006281%22%2C%22GO:0006310;Target=Merlin_304 135 365;date=23-02-2015;signature_desc=ATP dependent DNA ligase domain;status=T\n-Merlin\tProSitePatterns\tprotein_match\t167642\t167650\t.\t+\t.\tDbxref=InterPro:IPR016059%22%2C%22Reactome:REACT_216;ID=match%24126_157_165;Name=PS00697;Ontology_term=GO:0003909%22%2C%22GO:0051103;Target=Merlin_304 157 165;date=23-02-2015;signature_desc=ATP-dependent DNA ligase AMP-binding site.;status=T\n-Merlin\tGene3D\tprotein_match\t167803\t167833\t8.5E-8\t+\t.\tID=match%24127_318_348;Name=G3DSA:3.30.1490.70;Target=Merlin_304 318 348;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t167621\t167646\t8.5E-8\t+\t.\tID=match%24127_136_161;Name=G3DSA:3.30.1490.70;Target=Merlin_304 136 161;date=23-02-2015;status=T\n-Merlin\tSUPERFAMILY\tprotein_match\t167823\t167930\t.\t+\t.\tDbxref=InterPro:IPR012340;ID=match%24128_338_445;Name=SSF50249;Target=Merlin_304 338 445;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t167661\t167794\t1.2E-4\t+\t.\tID=match%24129_176_309;Name=G3DSA:3.30.470.30;Target=Merlin_304 176 309;date=23-02-2015;status=T\n-Merlin\tfeature\tpolypeptide\t169174\t169869\t.\t+\t.\tID=Merlin_306;md5=3f61e1cb18fb135a3dc061968bcd879c\n-Merlin\tSUPERFAMILY\tprotein_match\t169736\t169781\t.\t+\t.\tID=match%24253_563_608;Name=SSF56399;Target=Merlin_306 563 608;date=23-02-2015;status=T\n-Merlin\tSUPERFAMILY\tprotein_match\t169590\t169696\t.\t+\t.\tID=match%24253_417_523;Name=SSF56399;Target=Merlin_306 417 523;date=23-02-2015;status=T\n-Merlin\tPfam\tprotein_match\t169589\t169781\t1.6E-22\t+\t.\tDbxref=InterPro:IPR003540;ID=match%24254_416_608;Name=PF03496;Ontology_term=GO:0005576%22%2C%22GO:0009405;Target=Merlin_306 416 608;date=23-02-2015;signature_desc=ADP-ribosyltransferase exoenzyme;status=T\n-Merlin\tGene3D\tprotein_match\t169597\t169698\t2.1E-28\t+\t.\tID=match%24255_424_525;Name=G3DSA:3.90.176.10;Target=Merlin_306 424 525;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t169738\t169784\t2.1E-28\t+\t.\tID=match%24255_565_611;Name=G3DSA:3.90.176.10;Target=Merlin_306 565 611;date=23-02-2015;status=T\n-Merlin\tfeature\tpolypeptide\t171300\t171794\t.\t+\t.\tID=Merlin_307;md5=0f4b8b0843334ccf18e5a4a7cbdf67b2\n-Merlin\tSUPERFAMILY\tprotein_match\t171723\t171792\t.\t+\t.\tID=match%24339_424_493;Name=SSF56399;Target=Merlin_307 424 493;date=23-02-2015;status=T\n-Merlin\tGene3D\tprotein_match\t171722\t171791\t5.2E-11\t+\t.\tID=match%24340_423_492;Name=G3DSA:3.90.176.10;Target=Merlin_307 423 492;date=23-02-2015;status=T\n-Merlin\tPfam\tprotein_match\t171723\t171791\t2.0E-9\t+\t.\tDbxref=InterPro:IPR003540;ID=match%24341_424_492;Name=PF03496;Ontology_term=GO:0005576%22%2C%22GO:0009405;Target=Merlin_307 424 492;date=23-02-2015;signature_desc=ADP-ribosyltransferase exoenzyme;status=T\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/merlin.gff
--- a/test-data/merlin.gff Tue Jun 23 12:10:15 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,1231 +0,0 @@\n-##gff-version 3\n-##sequence-region Merlin 1 172788\n-Merlin\tannotation\tremark\t1\t172788\t.\t.\t.\tgff-version=3;sequence-region=%28%27Merlin%27%2C 0%2C 172788%29\n-Merlin\tGeneMark.hmm\tgene\t2\t691\t-856.563659\t+\t.\tID=Merlin_1;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t2\t691\t.\t+\t.\tID=Merlin_1_mRNA;Parent=Merlin_1;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t2\t691\t.\t+\t.\tID=Merlin_1_exon;Parent=Merlin_1_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t2\t691\t.\t+\t0\tID=Merlin_1_CDS;Parent=Merlin_1_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t752\t1039\t-339.046618\t+\t.\tID=Merlin_2;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t752\t1039\t.\t+\t.\tID=Merlin_2_mRNA;Parent=Merlin_2;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t752\t1039\t.\t+\t.\tID=Merlin_2_exon;Parent=Merlin_2_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t752\t1039\t.\t+\t0\tID=Merlin_2_CDS;Parent=Merlin_2_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t1067\t2011\t-1229.683915\t-\t.\tID=Merlin_3;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t1067\t2011\t.\t-\t.\tID=Merlin_3_mRNA;Parent=Merlin_3;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t1067\t2011\t.\t-\t.\tID=Merlin_3_exon;Parent=Merlin_3_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t1067\t2011\t.\t-\t0\tID=Merlin_3_CDS;Parent=Merlin_3_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t2011\t3066\t-1335.034872\t-\t.\tID=Merlin_4;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t2011\t3066\t.\t-\t.\tID=Merlin_4_mRNA;Parent=Merlin_4;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t2011\t3066\t.\t-\t.\tID=Merlin_4_exon;Parent=Merlin_4_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t2011\t3066\t.\t-\t0\tID=Merlin_4_CDS;Parent=Merlin_4_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t3066\t4796\t-2177.374893\t-\t.\tID=Merlin_5;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t3066\t4796\t.\t-\t.\tID=Merlin_5_mRNA;Parent=Merlin_5;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t3066\t4796\t.\t-\t.\tID=Merlin_5_exon;Parent=Merlin_5_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t3066\t4796\t.\t-\t0\tID=Merlin_5_CDS;Parent=Merlin_5_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t4793\t5317\t-682.565030\t-\t.\tID=Merlin_6;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t4793\t5317\t.\t-\t.\tID=Merlin_6_mRNA;Parent=Merlin_6;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t4793\t5317\t.\t-\t.\tID=Merlin_6_exon;Parent=Merlin_6_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t4793\t5317\t.\t-\t0\tID=Merlin_6_CDS;Parent=Merlin_6_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t5289\t6431\t-1457.525863\t-\t.\tID=Merlin_7;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t5289\t6431\t.\t-\t.\tID=Merlin_7_mRNA;Parent=Merlin_7;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t5289\t6431\t.\t-\t.\tID=Merlin_7_exon;Parent=Merlin_7_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t5289\t6431\t.\t-\t0\tID=Merlin_7_CDS;Parent=Merlin_7_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t6428\t7180\t-968.015933\t-\t.\tID=Merlin_8;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t6428\t7180\t.\t-\t.\tID=Merlin_8_mRNA;Parent=Merlin_8;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t6428\t7180\t.\t-\t.\tID=Merlin_8_exon;Parent=Merlin_8_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t6428\t7180\t.\t-\t0\tID=Merlin_8_CDS;Parent=Merlin_8_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t7228\t7857\t-809.330137\t+\t.\tID=Merlin_9;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t7228\t7857\t.\t+\t.\tID=Merlin_9_mRNA;Parent=Merlin_9;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t7228\t7857\t.\t+\t.\tID=Merlin_9_exon;Parent=Merlin_9_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t7228\t7857\t.\t+\t0\tID=Merlin_9_CDS;Parent=Merlin_9_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t7857\t8252\t-515.006678\t+\t.\tID=Merlin_10;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t7857\t8252\t.\t+\t.\tID=Merlin_10_mRNA;Parent=Merlin_10;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t7857\t8252\t.\t+\t.\tID=Merlin_10_exon;Parent=Merlin_10_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t7857\t8252\t.\t+\t0\tID=Merlin_10_CDS;Parent=Merlin_10_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t8340\t8753\t-522.529341\t+\t.\tID=Merlin_11;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t8340\t8753\t.\t+\t.\tID=Merlin_11_mRNA;Parent=Merlin_11;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t8340\t8753\t.\t+\t.\tID=Merlin_11_exon;Parent=Merlin_11_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t8340\t8753\t.\t+\t0\tID=Merlin_11_CDS;Parent=Merlin_11_exon'..b'rlin\n-Merlin\tGeneMark.hmm\texon\t164715\t165071\t.\t+\t.\tID=Merlin_297_exon;Parent=Merlin_297_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t164715\t165071\t.\t+\t0\tID=Merlin_297_CDS;Parent=Merlin_297_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t165107\t165601\t-618.360781\t+\t.\tID=Merlin_298;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t165107\t165601\t.\t+\t.\tID=Merlin_298_mRNA;Parent=Merlin_298;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t165107\t165601\t.\t+\t.\tID=Merlin_298_exon;Parent=Merlin_298_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t165107\t165601\t.\t+\t0\tID=Merlin_298_CDS;Parent=Merlin_298_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t165612\t165773\t-191.091430\t+\t.\tID=Merlin_299;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t165612\t165773\t.\t+\t.\tID=Merlin_299_mRNA;Parent=Merlin_299;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t165612\t165773\t.\t+\t.\tID=Merlin_299_exon;Parent=Merlin_299_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t165612\t165773\t.\t+\t0\tID=Merlin_299_CDS;Parent=Merlin_299_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t165770\t166000\t-285.030914\t+\t.\tID=Merlin_300;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t165770\t166000\t.\t+\t.\tID=Merlin_300_mRNA;Parent=Merlin_300;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t165770\t166000\t.\t+\t.\tID=Merlin_300_exon;Parent=Merlin_300_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t165770\t166000\t.\t+\t0\tID=Merlin_300_CDS;Parent=Merlin_300_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t165997\t166191\t-241.609251\t+\t.\tID=Merlin_301;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t165997\t166191\t.\t+\t.\tID=Merlin_301_mRNA;Parent=Merlin_301;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t165997\t166191\t.\t+\t.\tID=Merlin_301_exon;Parent=Merlin_301_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t165997\t166191\t.\t+\t0\tID=Merlin_301_CDS;Parent=Merlin_301_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t166352\t167200\t-1091.167753\t+\t.\tID=Merlin_302;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t166352\t167200\t.\t+\t.\tID=Merlin_302_mRNA;Parent=Merlin_302;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t166352\t167200\t.\t+\t.\tID=Merlin_302_exon;Parent=Merlin_302_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t166352\t167200\t.\t+\t0\tID=Merlin_302_CDS;Parent=Merlin_302_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t167197\t167433\t-294.645060\t+\t.\tID=Merlin_303;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t167197\t167433\t.\t+\t.\tID=Merlin_303_mRNA;Parent=Merlin_303;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t167197\t167433\t.\t+\t.\tID=Merlin_303_exon;Parent=Merlin_303_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t167197\t167433\t.\t+\t0\tID=Merlin_303_CDS;Parent=Merlin_303_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t167487\t168944\t-1811.170385\t+\t.\tID=Merlin_304;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t167487\t168944\t.\t+\t.\tID=Merlin_304_mRNA;Parent=Merlin_304;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t167487\t168944\t.\t+\t.\tID=Merlin_304_exon;Parent=Merlin_304_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t167487\t168944\t.\t+\t0\tID=Merlin_304_CDS;Parent=Merlin_304_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t168941\t169120\t-220.159549\t+\t.\tID=Merlin_305;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t168941\t169120\t.\t+\t.\tID=Merlin_305_mRNA;Parent=Merlin_305;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t168941\t169120\t.\t+\t.\tID=Merlin_305_exon;Parent=Merlin_305_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t168941\t169120\t.\t+\t0\tID=Merlin_305_CDS;Parent=Merlin_305_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t169175\t171265\t-2617.092758\t+\t.\tID=Merlin_306;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t169175\t171265\t.\t+\t.\tID=Merlin_306_mRNA;Parent=Merlin_306;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t169175\t171265\t.\t+\t.\tID=Merlin_306_exon;Parent=Merlin_306_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t169175\t171265\t.\t+\t0\tID=Merlin_306_CDS;Parent=Merlin_306_exon;seqid=Merlin\n-Merlin\tGeneMark.hmm\tgene\t171301\t172788\t-1876.322043\t+\t.\tID=Merlin_307;seqid=Merlin\n-Merlin\tGeneMark.hmm\tmRNA\t171301\t172788\t.\t+\t.\tID=Merlin_307_mRNA;Parent=Merlin_307;seqid=Merlin\n-Merlin\tGeneMark.hmm\texon\t171301\t172788\t.\t+\t.\tID=Merlin_307_exon;Parent=Merlin_307_mRNA;seqid=Merlin\n-Merlin\tGeneMark.hmm\tCDS\t171301\t172788\t.\t+\t0\tID=Merlin_307_CDS;Parent=Merlin_307_exon;seqid=Merlin\n'
b
diff -r b6a0e126dbee -r 7342f467507b test-data/test.vcf
--- a/test-data/test.vcf Tue Jun 23 12:10:15 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,23 +0,0 @@
-##fileformat=VCFv4.0
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=1000GenomesPilot-NCBI36
-##phasing=partial
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-#CHROM POS     ID        REF ALT    QUAL FILTER INFO                              FORMAT      NA00001        NA00002        NA00003
-Merlin 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
-Merlin 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
-Merlin 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
-Merlin 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
-Merlin 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3
b
diff -r b6a0e126dbee -r 7342f467507b test-data/vcf/test.vcf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/vcf/test.vcf Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,23 @@
+##fileformat=VCFv4.0
+##fileDate=20090805
+##source=myImputationProgramV3.1
+##reference=1000GenomesPilot-NCBI36
+##phasing=partial
+##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
+##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
+##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency">
+##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
+##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
+##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
+##FILTER=<ID=q10,Description="Quality below 10">
+##FILTER=<ID=s50,Description="Less than 50% of samples have data">
+##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
+##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
+##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
+##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
+#CHROM POS     ID        REF ALT    QUAL FILTER INFO                              FORMAT      NA00001        NA00002        NA00003
+Merlin 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
+Merlin 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
+Merlin 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
+Merlin 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
+Merlin 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3
b
diff -r b6a0e126dbee -r 7342f467507b test-data/vcf/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/vcf/test.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+    </metadata>
+    <tracks>
+        <track cat="Default" format="vcf">
+            <files>
+                <trackFile path="test-data/vcf/test.vcf" ext="vcf" label="Basic"/>
+            </files>
+            <options>
+            </options>
+        </track>
+    </tracks>
+</root>
b
diff -r b6a0e126dbee -r 7342f467507b test.yml
--- a/test.yml Tue Jun 23 12:10:15 2015 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,54 +0,0 @@
----
-  -
-    file: test-data/154.bam
-    ext: bam
-    label: Sequencing Data
-    category: "Sequencing Data"
-    options:
-        __unused__: "Not used...just to ensure options has at least one key"
-        auto_snp: true
-        bam_index: test-data/154.bam.bai
-  -
-    file: test-data/merlin.gff
-    ext: gff3
-    label: "Gene Calls"
-    category: "Default"
-    options:
-        __unused__: "Not used...just to ensure options has at least one key"
-        match: false
-  -
-    file: test-data/154.bw
-    ext: bigwig
-    label: "Bigwig Test"
-    category: "Sequencing Data"
-    options:
-        __unused__: "Not used...just to ensure options has at least one key"
-        type: JBrowse/View/Track/Wiggle/XYPlot
-        variance_band: true
-        autoscale: local
-  -
-    file: test-data/test.vcf
-    ext: vcf
-    label: "Variant Test"
-    category: "Sequencing Data"
-    options:
-        __unused__: "Not used...just to ensure options has at least one key"
-  -
-    file: test-data/blast.xml
-    ext: blastxml
-    label: "BlastP Hits"
-    category: "Comparative Genomics"
-    options:
-        __unused__: "Not used...just to ensure options has at least one key"
-        parent: test-data/merlin.gff
-        protein: true
-        min_gap: 10
-        match: true
-  -
-    file: test-data/xmfa.gff
-    ext: gff3
-    label: "Progressive Mauve comparison"
-    category: "Comparative Genomics"
-    options:
-        __unused__: "Not used...just to ensure options has at least one key"
-        match: true
b
diff -r b6a0e126dbee -r 7342f467507b tool_dependencies.xml
--- a/tool_dependencies.xml Tue Jun 23 12:10:15 2015 -0400
+++ b/tool_dependencies.xml Thu Dec 31 13:58:43 2015 -0500
b
@@ -1,21 +1,27 @@
 <?xml version="1.0"?>
 <tool_dependency>
-  <package name="jbrowse" version="1.11.6">
-    <repository changeset_revision="d5ab749c9e97" name="package_jbrowse_1_11_6" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+  <package name="jbrowse" version="1.12.0">
+    <repository changeset_revision="22be3ae5599d" name="package_jbrowse_1_12_0" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+  </package>
+  <package name="bundle_jbrowse" version="1.12.0">
+    <repository changeset_revision="52153ec17769" name="package_perl_bundle_jbrowse_1_12_0" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
   </package>
   <package name="python" version="2.7">
-    <repository changeset_revision="44bb4258922f" name="package_python_2_7" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+    <repository changeset_revision="8b09fe018cac" name="package_python_2_7" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+  </package>
+  <package name="biopython" version="1.66">
+    <repository changeset_revision="8433ee4531ff" name="package_biopython_1_66" owner="biopython" toolshed="https://toolshed.g2.bx.psu.edu" />
   </package>
-  <package name="perl" version="5.18">
-    <repository changeset_revision="114b6af405fa" name="package_perl_5_18" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+  <package name="bcbiogff" version="0.6.2">
+    <repository changeset_revision="b584674413b1" name="package_python_2_7_bcbiogff_0_6_2" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+  </package>
+  <package name="perl" version="5.18.1">
+    <repository changeset_revision="8b3509930a44" name="package_perl_5_18" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
   </package>
   <package name="samtools" version="1.2">
-    <repository changeset_revision="6eea04363026" name="package_samtools_1_2" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
-  </package>
-  <package name="bundle_jbrowse" version="1.0">
-    <repository changeset_revision="361f7cf7a442" name="package_perl_bundle_jbrowse_1_0" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+    <repository changeset_revision="f6ae3ba3f3c1" name="package_samtools_1_2" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
   </package>
   <package name="pyyaml" version="3.11">
-    <repository changeset_revision="195682051d7c" name="package_python_2_7_pyyaml_3_11" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
+    <repository changeset_revision="99267d131c05" name="package_python_2_7_pyyaml_3_11" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
   </package>
 </tool_dependency>