Repository 'jbrowse2'
hg clone https://toolshed.g2.bx.psu.edu/repos/fubar/jbrowse2

Changeset 62:ab0d6782a95f (2024-03-28)
Previous changeset 61:e7a6f7a7148d (2024-03-26) Next changeset 63:ac00dcfb5d1d (2024-03-28)
Commit message:
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 2b6d4a24585beb1ba5055e5d34aacb3b299b1943-dirty
modified:
autogenJB2.py
jbrowse2.py
jbrowse2.xml
macros.xml
added:
Galaxy-Workflow-_jb2testWF_mar26.ga
test-data/blastxml/blast-gene1.xml
test-data/blastxml/blast.xml
test-data/blastxml/blastn-gene1.xml
test-data/blastxml/merlin.gff
test-data/bw/data.bw
test-data/cram/merlin-sample.cram
test-data/gff3/merlin.gff
test-data/vcf/test.vcf
test-data/xmfa.gff
tool_data_table_conf.xml.test
removed:
__pycache__/jbrowse2.cpython-310.pyc
jbrowse2broken.py
jbrowse2broken.xml
macrosbroken.xml
b
diff -r e7a6f7a7148d -r ab0d6782a95f Galaxy-Workflow-_jb2testWF_mar26.ga
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Galaxy-Workflow-_jb2testWF_mar26.ga Thu Mar 28 04:51:06 2024 +0000
[
b'@@ -0,0 +1,331 @@\n+{\n+    "a_galaxy_workflow": "true",\n+    "annotation": "",\n+    "comments": [],\n+    "format-version": "0.1",\n+    "name": "\'jb2testWF_mar26",\n+    "steps": {\n+        "0": {\n+            "annotation": "",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 0,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "",\n+                    "name": "Merlin"\n+                }\n+            ],\n+            "label": "Merlin",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+                "left": 0,\n+                "top": 0\n+            },\n+            "tool_id": null,\n+            "tool_state": "{\\"optional\\": false, \\"tag\\": null}",\n+            "tool_version": null,\n+            "type": "data_input",\n+            "uuid": "60c939a2-b9c9-47cd-9ef4-6415e87a1680",\n+            "when": null,\n+            "workflow_outputs": []\n+        },\n+        "1": {\n+            "annotation": "",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 1,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "",\n+                    "name": "merlin.bw"\n+                }\n+            ],\n+            "label": "merlin.bw",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+                "left": 0,\n+                "top": 102\n+            },\n+            "tool_id": null,\n+            "tool_state": "{\\"optional\\": false, \\"tag\\": null}",\n+            "tool_version": null,\n+            "type": "data_input",\n+            "uuid": "97251b21-c6c4-4ef9-b985-0cf90f1d2f75",\n+            "when": null,\n+            "workflow_outputs": []\n+        },\n+        "2": {\n+            "annotation": "",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 2,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "",\n+                    "name": "merlinlastz.maf"\n+                }\n+            ],\n+            "label": "merlinlastz.maf",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+                "left": 0,\n+                "top": 204\n+            },\n+            "tool_id": null,\n+            "tool_state": "{\\"optional\\": false, \\"tag\\": null}",\n+            "tool_version": null,\n+            "type": "data_input",\n+            "uuid": "41961b03-3ea3-4fe4-a45e-85e2f74b8a48",\n+            "when": null,\n+            "workflow_outputs": []\n+        },\n+        "3": {\n+            "annotation": "",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 3,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "",\n+                    "name": "merlinblast.xml"\n+                }\n+            ],\n+            "label": "merlinblast.xml",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+                "left": 0,\n+                "top": 327\n+            },\n+            "tool_id": null,\n+            "tool_state": "{\\"optional\\": false, \\"tag\\": null}",\n+            "tool_version": null,\n+            "type": "data_input",\n+            "uuid": "544106a0-44ea-40c9-8c55-ff5100110ae2",\n+            "when": null,\n+            "workflow_outputs": []\n+        },\n+        "4": {\n+            "annotation": "",\n+            "content_id": null,\n+            "errors": null,\n+            "id": 4,\n+            "input_connections": {},\n+            "inputs": [\n+                {\n+                    "description": "",\n+                    "name": "merlin-sample.bam"\n+                }\n+            ],\n+            "label": "merlin-sample.bam",\n+            "name": "Input dataset",\n+            "outputs": [],\n+            "position": {\n+   '..b'f\\", \\"__current_case__\\": 6, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"jbstyle\\": {\\"track_style\\": {\\"display\\": \\"LinearBasicDisplay\\", \\"__current_case__\\": 1, \\"show_labels\\": false, \\"show_descriptions\\": false, \\"display_mode\\": \\"normal\\", \\"max_height\\": \\"600\\", \\"label\\": \\"jexl:get(feature,\'name\') || get(feature,\'id\')\\", \\"description\\": \\"jexl:get(feature,\'note\') || get(feature,\'description\')\\"}}, \\"track_visibility\\": \\"default_on\\"}}, {\\"__index__\\": 2, \\"data_format\\": {\\"data_format_select\\": \\"blastxml\\", \\"__current_case__\\": 0, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"blast_parent\\": null, \\"min_gap\\": \\"10\\", \\"is_protein\\": false, \\"jbstyle\\": {\\"track_style\\": {\\"display\\": \\"LinearBasicDisplay\\", \\"__current_case__\\": 1, \\"show_labels\\": false, \\"show_descriptions\\": false, \\"display_mode\\": \\"normal\\", \\"max_height\\": \\"600\\", \\"label\\": \\"jexl:get(feature,\'name\') || get(feature,\'id\')\\", \\"description\\": \\"jexl:get(feature,\'note\') || get(feature,\'description\')\\"}}, \\"track_visibility\\": \\"default_on\\"}}]}, {\\"__index__\\": 1, \\"category\\": \\"two\\", \\"data_tracks\\": [{\\"__index__\\": 0, \\"data_format\\": {\\"data_format_select\\": \\"bam\\", \\"__current_case__\\": 3, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"track_visibility\\": \\"default_on\\"}}, {\\"__index__\\": 1, \\"data_format\\": {\\"data_format_select\\": \\"cram\\", \\"__current_case__\\": 5, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"track_visibility\\": \\"default_on\\"}}]}, {\\"__index__\\": 2, \\"category\\": \\"three\\", \\"data_tracks\\": [{\\"__index__\\": 0, \\"data_format\\": {\\"data_format_select\\": \\"gff\\", \\"__current_case__\\": 2, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"match_part\\": {\\"match_part_select\\": \\"false\\", \\"__current_case__\\": 1}, \\"jbstyle\\": {\\"track_style\\": {\\"display\\": \\"LinearBasicDisplay\\", \\"__current_case__\\": 1, \\"show_labels\\": false, \\"show_descriptions\\": false, \\"display_mode\\": \\"normal\\", \\"max_height\\": \\"600\\", \\"label\\": \\"jexl:get(feature,\'name\') || get(feature,\'id\')\\", \\"description\\": \\"jexl:get(feature,\'note\') || get(feature,\'description\')\\"}}, \\"track_visibility\\": \\"default_on\\"}}, {\\"__index__\\": 1, \\"data_format\\": {\\"data_format_select\\": \\"bed\\", \\"__current_case__\\": 4, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"jbstyle\\": {\\"track_style\\": {\\"display\\": \\"LinearBasicDisplay\\", \\"__current_case__\\": 1, \\"show_labels\\": false, \\"show_descriptions\\": false, \\"display_mode\\": \\"normal\\", \\"max_height\\": \\"600\\", \\"label\\": \\"jexl:get(feature,\'name\') || get(feature,\'id\')\\", \\"description\\": \\"jexl:get(feature,\'note\') || get(feature,\'description\')\\"}}, \\"track_visibility\\": \\"default_on\\"}}, {\\"__index__\\": 2, \\"data_format\\": {\\"data_format_select\\": \\"vcf\\", \\"__current_case__\\": 1, \\"useuri\\": {\\"insource\\": \\"history\\", \\"__current_case__\\": 0, \\"annotation\\": {\\"__class__\\": \\"ConnectedValue\\"}}, \\"jbstyle\\": {\\"track_style\\": {\\"display\\": \\"LinearVariantDisplay\\", \\"__current_case__\\": 0, \\"show_labels\\": false, \\"show_descriptions\\": false, \\"display_mode\\": \\"normal\\", \\"max_height\\": \\"600\\"}}, \\"track_visibility\\": \\"default_on\\"}}]}], \\"uglyTestingHack\\": \\"\\", \\"__page__\\": null, \\"__rerun_remap_job_id__\\": null}",\n+            "tool_version": "2.10.1+galaxy2_7",\n+            "type": "tool",\n+            "uuid": "ab05b81c-a0a2-4dcc-b76a-e47b15ebcdb9",\n+            "when": null,\n+            "workflow_outputs": []\n+        }\n+    },\n+    "tags": [],\n+    "uuid": "ea921c36-b1bb-4d82-9d35-5965daa3d3b2",\n+    "version": 1\n+}\n\\ No newline at end of file\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f __pycache__/jbrowse2.cpython-310.pyc
b
Binary file __pycache__/jbrowse2.cpython-310.pyc has changed
b
diff -r e7a6f7a7148d -r ab0d6782a95f autogenJB2.py
--- a/autogenJB2.py Tue Mar 26 00:52:34 2024 +0000
+++ b/autogenJB2.py Thu Mar 28 04:51:06 2024 +0000
[
@@ -68,7 +68,8 @@
             jc = jbC(
                 outdir=args.outdir,
                 jbrowse2path=args.jbrowse2path,
-                genomes=[
+            )
+            genomes=[
                     {
                         "path": x,
                         "label": genome_names[i],
@@ -80,9 +81,8 @@
                     }
                     for i, x in enumerate(genome_paths)
                 ],
-            )
-
-            jc.process_genomes()
+            logging.warn("#!!! paths=%s, genomes=%s" % (genome_paths, genomes))
+            assref_name = jc.process_genomes(genomes[0])
             default_session_data = {
                 "visibility": {
                     "default_on": [],
@@ -96,7 +96,7 @@
             tnames = [x[2] for x in listtracks]
             texts = [x[1] for x in listtracks]
             for i, track in enumerate(listtracks):
-                track_conf = {"trackfiles": [], "category": "autogenerated"}
+                track_conf = {"trackfiles": [], "category": "autogenerated", "assemblyNames": assref_name}
                 tpath, trext, trackname = track[:3]
                 track_conf["dataset_id"] = trackname
                 useuri = "no"
b
diff -r e7a6f7a7148d -r ab0d6782a95f jbrowse2.py
--- a/jbrowse2.py Tue Mar 26 00:52:34 2024 +0000
+++ b/jbrowse2.py Thu Mar 28 04:51:06 2024 +0000
[
b'@@ -1,4 +1,4 @@\n- #!/usr/bin/env python\n+#!/usr/bin/env python\n \n import argparse\n import binascii\n@@ -15,15 +15,15 @@\n import xml.etree.ElementTree as ET\n from collections import defaultdict\n \n-logging.basicConfig(level=logging.INFO)\n+logging.basicConfig(level=logging.DEBUG)\n log = logging.getLogger("jbrowse")\n \n JB2VER = "v2.10.3"\n # version pinned for cloning\n \n TODAY = datetime.datetime.now().strftime("%Y-%m-%d")\n+SELF_LOCATION = os.path.dirname(os.path.realpath(__file__))\n GALAXY_INFRASTRUCTURE_URL = None\n-\n mapped_chars = {\n     ">": "__gt__",\n     "<": "__lt__",\n@@ -341,23 +341,23 @@\n     if node.findall("metadata"):\n         for (key, value) in node.findall("metadata")[0].attrib.items():\n             metadata["metadata_%s" % key] = value\n-            # Additional Mappings applied:\n-            metadata[\n-                "dataset_edam_format"\n-            ] = \'<a target="_blank" href="http://edamontology.org/{0}">{1}</a>\'.format(\n-                metadata["dataset_edam_format"], metadata["dataset_file_ext"]\n-            )\n-            metadata["history_user_email"] = \'<a href="mailto:{0}">{0}</a>\'.format(\n-                metadata["history_user_email"]\n-            )\n-            metadata["hist_name"] = metadata["history_display_name"]\n-            metadata[\n-                "history_display_name"\n-            ] = \'<a target="_blank" href="{galaxy}/history/view/{encoded_hist_id}">{hist_name}</a>\'.format(\n-                galaxy=GALAXY_INFRASTRUCTURE_URL,\n-                encoded_hist_id=metadata["history_id"],\n-                hist_name=metadata["history_display_name"],\n-            )\n+        # Additional Mappings applied:\n+        metadata[\n+            "dataset_edam_format"\n+        ] = \'<a target="_blank" href="http://edamontology.org/{0}">{1}</a>\'.format(\n+            metadata["dataset_edam_format"], metadata["dataset_file_ext"]\n+        )\n+        metadata["history_user_email"] = \'<a href="mailto:{0}">{0}</a>\'.format(\n+            metadata["history_user_email"]\n+        )\n+        metadata["hist_name"] = metadata["history_display_name"]\n+        metadata[\n+            "history_display_name"\n+        ] = \'<a target="_blank" href="{galaxy}/history/view/{encoded_hist_id}">{hist_name}</a>\'.format(\n+            galaxy=GALAXY_INFRASTRUCTURE_URL,\n+            encoded_hist_id=metadata.get("history_id", "not available"),\n+            hist_name=metadata.get("history_display_name", "not available"),\n+        )\n     if node.findall("tool"):\n         for (key, value) in node.findall("tool")[0].attrib.items():\n             metadata["tool_%s" % key] = value\n@@ -373,33 +373,41 @@\n \n \n class JbrowseConnector(object):\n-    def __init__(self, outdir, jbrowse2path, genomes):\n+    def __init__(self, outdir, jbrowse2path):\n+        self.assemblies = []  # these require more than a few line diff.\n+        self.assmeta = {}\n         self.giURL = GALAXY_INFRASTRUCTURE_URL\n         self.outdir = outdir\n+        self.genome_firstcontig = None\n         self.jbrowse2path = jbrowse2path\n         os.makedirs(self.outdir, exist_ok=True)\n-        self.genome_paths = genomes\n-        self.genome_name = None\n         self.genome_names = []\n         self.trackIdlist = []\n-        self.tracksToAdd = []\n+        self.tracksToAdd = {}\n         self.config_json = {}\n         self.config_json_file = os.path.join(outdir, "config.json")\n         self.clone_jbrowse()\n \n-    def subprocess_check_call(self, command, output=None):\n-        if output:\n-            log.debug("cd %s && %s >  %s", self.outdir, " ".join(command), output)\n-            subprocess.check_call(command, cwd=self.outdir, stdout=output)\n+    def get_cwd(self, cwd):\n+        if cwd:\n+            return self.outdir\n         else:\n-            log.debug("cd %s && %s", self.outdir, " ".join(command))\n-            subprocess.check_call(command, cwd=self.outdir)\n+            return subprocess.check_output(["pwd"]).decode("utf-8").strip()\n+            # return None\n \n-    def subprocess_popen(se'..b'"]),\n-                                x.attrib["ext"],\n-                                x.attrib["useuri"],\n-                                x.attrib["label"],\n-                                metadata,\n-                            )\n-                        track_conf["trackfiles"].append(tfa)\n \n-        if is_multi_bigwig:\n-            metadata = metadata_from_node(x.find("metadata"))\n+            track_conf["category"] = track.attrib["cat"]\n+            track_conf["format"] = track.attrib["format"]\n+            track_conf["conf"] = etree_to_dict(track.find("options"))\n+            track_conf["category"] = track.attrib["cat"]\n+            track_conf["format"] = track.attrib["format"]\n+            keys = jc.process_annotations(track_conf)\n \n-            track_conf["trackfiles"].append(\n-                (\n-                    multi_bigwig_paths,  # Passing an array of paths to represent as one track\n-                    "bigwig_multiple",\n-                    "MultiBigWig",  # Giving an hardcoded name for now\n-                    {},  # No metadata for multiple bigwig\n-                )\n-            )\n-        track_conf["category"] = track.attrib["cat"]\n-        track_conf["format"] = track.attrib["format"]\n-        track_conf["conf"] = etree_to_dict(track.find("options"))\n-        track_conf["category"] = track.attrib["cat"]\n-        track_conf["format"] = track.attrib["format"]\n-        keys = jc.process_annotations(track_conf)\n+            if keys:\n+                for key in keys:\n+                    vis = track.attrib.get("visibility", "default_off")\n+                    if not vis:\n+                        vis = "default_off"\n+                    default_session_data["visibility"][vis].append(key)\n+                if track.find("options/style"):\n+                    default_session_data["style"][key] = {\n+                        item.tag: parse_style_conf(item)\n+                        for item in track.find("options/style")\n+                    }\n+                else:\n+                    default_session_data["style"][key] = {}\n+                    logging.warn("@@@@ no options/style found for %s" % (key))\n \n-        if keys:\n-            for key in keys:\n-                default_session_data["visibility"][\n-                    track.attrib.get("visibility", "default_off")\n-                ].append(key)\n-            if track.find("options/style"):\n-                default_session_data["style"][key] = {\n-                    item.tag: parse_style_conf(item) for item in track.find("options/style")\n-                }\n-            else:\n-                default_session_data["style"][key] = {}\n-                logging.warn("@@@@ no options/style found for %s" % (key))\n-\n-            if track.find("options/style_labels"):\n-                default_session_data["style_labels"][key] = {\n-                    item.tag: parse_style_conf(item)\n-                    for item in track.find("options/style_labels")\n-                }\n+                if track.find("options/style_labels"):\n+                    default_session_data["style_labels"][key] = {\n+                        item.tag: parse_style_conf(item)\n+                        for item in track.find("options/style_labels")\n+                    }\n     default_session_data["defaultLocation"] = root.find(\n         "metadata/general/defaultLocation"\n     ).text\n@@ -1571,11 +1599,10 @@\n         "font_size": root.find("metadata/general/font_size").text,\n     }\n     jc.add_general_configuration(general_data)\n-    trackconf = jc.config_json.get("tracks", None)\n-    if trackconf:\n-        jc.config_json["tracks"].update(jc.tracksToAdd)\n-    else:\n-        jc.config_json["tracks"] = jc.tracksToAdd\n+    trackconf = jc.config_json.get("tracks", [])\n+    for gnome in jc.genome_names:\n+        trackconf += jc.tracksToAdd[gnome]\n+    jc.config_json["tracks"] = trackconf\n     jc.write_config()\n     jc.add_default_session(default_session_data)\n     # jc.text_index() not sure what broke here.\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f jbrowse2.xml
--- a/jbrowse2.xml Tue Mar 26 00:52:34 2024 +0000
+++ b/jbrowse2.xml Thu Mar 28 04:51:06 2024 +0000
[
b'@@ -1,4 +1,4 @@\n- <tool id="jbrowse2" name="jbrowse2" version="@TOOL_VERSION@+@WRAPPER_VERSION@_7" profile="22.05">\n+ <tool id="jbrowse2auto" name="JBrowse2auto" version="@TOOL_VERSION@+@WRAPPER_VERSION@_8" profile="22.05">\n     <description>genome browser</description>\n     <macros>\n         <import>macros.xml</import>\n@@ -62,62 +62,8 @@\n   ]]></command>\n <configfiles>\n         <configfile name="trackxml"><![CDATA[<?xml version="1.0"?>\n-#if $jbgen.ucol.formcoll=="form":\n <root>\n     <metadata>\n-        <genomes>\n-            #if str($reference_genome.genome_type_select) == "uri":\n-              <genome path="${reference_genome.uri}" label="${reference_genome.refname}" useuri="yes">\n-                  <metadata>\n-                     <dataset\n-                      dname = "${reference_genome.refname}" />\n-              </metadata>\n-              </genome>\n-            #else if str($reference_genome.genome_type_select) == "indexed":\n-              <genome path="${reference_genome.genome.fields.path}" label="${reference_genome.genome.fields.name}" useuri="no">\n-                  <metadata>\n-                     <dataset\n-                      dname = "${reference_genome.genome.fields.name}" />\n-                  </metadata>\n-              </genome>\n-            #else\n-              <genome path="$reference_genome.genome" label="${reference_genome.genome.name}" useuri="no">\n-                <metadata>\n-                  <dataset id="${__app__.security.encode_id($reference_genome.genome.id)}" hid="${reference_genome.genome.hid}"\n-                      size="${reference_genome.genome.get_size(nice_size=True)}"\n-                      edam_format="${reference_genome.genome.datatype.edam_format}"\n-                      file_ext="${reference_genome.genome.ext}"\n-                      dname = "${reference_genome.genome.name}" />\n-                  <history id="${__app__.security.encode_id($reference_genome.genome.history_id)}"\n-                      #if $reference_genome.genome.history.user:\n-                      user_email="${reference_genome.genome.history.user.email}"\n-                      user_id="${reference_genome.genome.history.user_id}"\n-                      display_name="${reference_genome.genome.history.get_display_name()}"/>\n-                      #else\n-                      user_email="anonymous"\n-                      user_id="-1"\n-                      display_name="Unnamed History"/>\n-                      #end if\n-                  <metadata\n-                      #for (key, value) in $reference_genome.genome.get_metadata().items():\n-                      #if "_types" not in $key:\n-                        #if isinstance($value, list):\n-                          #set value_str = "[%s]" % \',\'.join([str(val) for val in value])\n-                          ${key}="$value_str"\n-                        #else\n-                          ${key}="${value}"\n-                        #end if\n-                      #end if\n-                      #end for\n-                      />\n-                  <tool\n-                      tool_id="${reference_genome.genome.creating_job.tool_id}"\n-                      tool_version="${reference_genome.genome.creating_job.tool_version}"\n-                      />\n-                </metadata>\n-              </genome>\n-            #end if\n-        </genomes>\n         <general>\n             <defaultLocation>${jbgen.defaultLocation}</defaultLocation>\n             <zipOut>${jbgen.zipOut}</zipOut>\n@@ -131,8 +77,73 @@\n         </general>\n         <galaxyUrl>${__app__.config.galaxy_infrastructure_url}</galaxyUrl>\n     </metadata>\n+#if $jbgen.ucol.formcoll=="form":\n+    #for $assembly in $assemblies:\n+    <assembly>\n+        <metadata>\n+            <genomes>\n+                #if str($assembly.reference_genome.genome_type_select) == "uri":\n+                  <genome path="${assembly.reference_genome.uri}" label="${assembly.reference_genome.refname}" useuri="yes">\n+                      <metadata>\n+       '..b'itional name="color">\n+                                    <param name="color_select" value="automatic"/>\n+                                </conditional>\n+                            </section>\n+                            <section name="jbmenu">\n+                                <repeat name="track_menu">\n+                                    <param name="menu_action" value="iframeDialog"/>\n+                                    <param name="menu_label" value="Some menu item"/>\n+                                    <param name="menu_title" value="Frame title"/>\n+                                    <param name="menu_url" value="https://example.com/#!/?id={name}&amp;q={type}&amp;z=&quot;{end}&quot;"/>\n+                                    <param name="menu_icon" value="dijitIconNewTask"/>\n+                                </repeat>\n+                                <repeat name="track_menu">\n+                                    <param name="menu_action" value="newWindow"/>\n+                                    <param name="menu_label" value="Another menu item"/>\n+                                    <param name="menu_title" value="Frame title 2"/>\n+                                    <param name="menu_url" value="https://example.com/#!/?id={name}&amp;q={type}&amp;z=&quot;{end}&quot;"/>\n+                                </repeat>\n+                            </section>\n+                        </conditional>\n+                     </repeat>\n+                    <repeat name="data_tracks">\n+                        <conditional name="data_format">\n                         <param name="data_format_select" value="gff"/>\n-                         <conditional name="useuri">\n-                            <param name="annotation" value="gff3/1.gff"/>\n-                            <param name="insource" value= "history"/>\n-                        </conditional>\n-                        <param name="insource" value= "history"/>\n-                        <conditional name="match_part">\n-                            <param name="match_part_select" value="false"/>\n+                            <conditional name="useuri">\n+                             <param name="annotation" value="gff3/1.gff"/>\n+                             <param name="insource" value= "history"/>\n+                            </conditional>\n+                            <conditional name="match_part">\n+                                <param name="match_part_select" value="false"/>\n+                            </conditional>\n+                            <section name="jbcolor_scale">\n+                                <conditional name="color_score">\n+                                    <param name="color_score_select" value="none"/>\n+                                </conditional>\n+                                <conditional name="color">\n+                                    <param name="color_select" value="automatic"/>\n+                                </conditional>\n+                            </section>\n                         </conditional>\n-                        <section name="jbcolor_scale">\n-                            <conditional name="color_score">\n-                                <param name="color_score_select" value="none"/>\n-                            </conditional>\n-                            <conditional name="color">\n-                                <param name="color_select" value="automatic"/>\n-                            </conditional>\n-                        </section>\n-                    </conditional>\n-                </repeat>\n+                    </repeat>\n             </repeat>\n-\n+            </repeat>\n             <param name="uglyTestingHack" value="enabled" />\n             <output name="output">\n                 <assert_contents>\n@@ -841,6 +890,7 @@\n                 </assert_contents>\n             </output>\n         </test>\n+\n         <!-- TODO add a synteny test -->\n         <!-- TODO add a bam and a cram test -->\n         <!-- TODO add an hic test -->\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f jbrowse2broken.py
--- a/jbrowse2broken.py Tue Mar 26 00:52:34 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,1656 +0,0 @@\n-#!/usr/bin/env python\n-# change to accumulating all configuration for config.json based on the default from the clone\n-import argparse\n-import binascii\n-import datetime\n-import json\n-import logging\n-import os\n-import re\n-import shutil\n-import struct\n-import subprocess\n-import tempfile\n-import urllib.request\n-import xml.etree.ElementTree as ET\n-from collections import defaultdict\n-\n-logging.basicConfig(level=logging.INFO)\n-log = logging.getLogger("jbrowse")\n-\n-JB2VER = "v2.10.3"\n-# version pinned for cloning\n-\n-TODAY = datetime.datetime.now().strftime("%Y-%m-%d")\n-GALAXY_INFRASTRUCTURE_URL = None\n-\n-# version pinned for cloning\n-\n-mapped_chars = {\n-    ">": "__gt__",\n-    "<": "__lt__",\n-    "\'": "__sq__",\n-    \'"\': "__dq__",\n-    "[": "__ob__",\n-    "]": "__cb__",\n-    "{": "__oc__",\n-    "}": "__cc__",\n-    "@": "__at__",\n-    "#": "__pd__",\n-    "": "__cn__",\n-}\n-\n-\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 = r"""\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-        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-        if(score === undefined){{ opacity = 1; }}\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-    OPACITY_MATH = {\n-        "linear": """\n-            var opacity = (score - ({min})) / (({max}) - ({min}));\n-        """,\n-        "logarithmic": """\n-            var opacity = Math.log10(score - ({min})) / Math.log10(({max}) - ({min}));\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-    BREWER_COLOUR_IDX = 0\n-    BREWER_COLOUR_SCHEMES = [\n-        (166, 206, 227),\n-        (31, 120, 180),\n-        (178, 223, 138),\n-        (51, 160, 44),\n-        (251, 154, 153),\n-        (227, 26, 28),\n-        (253, 191, 111),\n-        (255, 127, 0),\n-        (202, 178, 214),\n-        (106, 61, 154),\n-        (255, 255, 153),\n-        (177, 89, 40),\n-        (228, 26, 28),\n-        (55, 126, 184),\n-        (77, 175, 74),\n-        (152, 78, 163),\n-        (255, 127, 0),\n-    ]\n-\n-    BREWER_DIVERGING_PALLETES = {\n-        "BrBg": ("#543005", "#003c30"),\n-        "PiYg": ("#8e0152", "#276419"),\n-        "PRGn": ("#40004b", "#00441b"),\n-        "PuOr": ("#7f3b08", "#2d004b'..b'"],\n-                                x.attrib["useuri"],\n-                                x.attrib["label"],\n-                                metadata,\n-                            )\n-                        else:\n-                            tfa = (\n-                                os.path.realpath(x.attrib["path"]),\n-                                x.attrib["ext"],\n-                                x.attrib["useuri"],\n-                                x.attrib["label"],\n-                                metadata,\n-                            )\n-                        track_conf["trackfiles"].append(tfa)\n-\n-        if is_multi_bigwig:\n-            metadata = metadata_from_node(x.find("metadata"))\n-\n-            track_conf["trackfiles"].append(\n-                (\n-                    multi_bigwig_paths,  # Passing an array of paths to represent as one track\n-                    "bigwig_multiple",\n-                    "MultiBigWig",  # Giving an hardcoded name for now\n-                    {},  # No metadata for multiple bigwig\n-                )\n-            )\n-        track_conf["category"] = track.attrib["cat"]\n-        track_conf["format"] = track.attrib["format"]\n-        if track.find("options/style"):\n-            track_conf["style"] = {\n-                item.tag: parse_style_conf(item) for item in track.find("options/style")\n-            }\n-        else:\n-            track_conf["style"] = {}\n-        tst = track_conf["style"].get("type", None)\n-        if tst:\n-            track_conf["style"]["configuration"] = "%s-%s" % (track_conf["label"], tst)\n-        logging.warn("### got %s for track style" % track_conf["style"])\n-        if track.find("options/style_labels"):\n-            track_conf["style_labels"] = {\n-                item.tag: parse_style_conf(item)\n-                for item in track.find("options/style_labels")\n-            }\n-        track_conf["conf"] = etree_to_dict(track.find("options"))\n-        track_conf["category"] = track.attrib["cat"]\n-        track_conf["format"] = track.attrib["format"]\n-        keys = jc.process_annotations(track_conf)\n-\n-        if keys:\n-            for key in keys:\n-                default_session_data["visibility"][\n-                    track.attrib.get("visibility", "default_off")\n-                ].append(key)\n-                if track_conf.get("style", None):\n-                    default_session_data["style"][key] = track_conf["style"]\n-                if track_conf.get("style_labels", None):\n-                    default_session_data["style_labels"][key] = track_conf.get(\n-                        "style_labels", None\n-                    )\n-        logging.warn(\n-            "# after process, key=%s def session style = %s"\n-            % (key, default_session_data["style"][key])\n-        )\n-    default_session_data["defaultLocation"] = root.find(\n-        "metadata/general/defaultLocation"\n-    ).text\n-    default_session_data["session_name"] = root.find(\n-        "metadata/general/session_name"\n-    ).text\n-    jc.zipOut = root.find("metadata/general/zipOut").text == "true"\n-    general_data = {\n-        "analytics": root.find("metadata/general/analytics").text,\n-        "primary_color": root.find("metadata/general/primary_color").text,\n-        "secondary_color": root.find("metadata/general/secondary_color").text,\n-        "tertiary_color": root.find("metadata/general/tertiary_color").text,\n-        "quaternary_color": root.find("metadata/general/quaternary_color").text,\n-        "font_size": root.find("metadata/general/font_size").text,\n-    }\n-    jc.add_general_configuration(general_data)\n-    trackconf = jc.config_json.get("tracks", None)\n-    if trackconf:\n-        jc.config_json["tracks"].update(jc.tracksToAdd)\n-    else:\n-        jc.config_json["tracks"] = jc.tracksToAdd\n-    jc.write_config()\n-    jc.add_default_session(default_session_data)\n-    logging.warn("### got default_session_data=%s" % default_session_data)\n-    # jc.text_index() not sure what broke here.\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f jbrowse2broken.xml
--- a/jbrowse2broken.xml Tue Mar 26 00:52:34 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,961 +0,0 @@\n- <tool id="jbrowse2" name="jbrowse2" version="@TOOL_VERSION@+@WRAPPER_VERSION@_7" profile="22.05">\n-    <description>genome browser</description>\n-    <macros>\n-        <import>macros.xml</import>\n-    </macros>\n-    <expand macro="edamInc"/>\n-    <xrefs>\n-        <xref type="bio.tools">jbrowse2</xref>\n-    </xrefs>\n-    <expand macro="requirements"/>\n-    <version_command>python \'${__tool_directory__}/jbrowse2.py\' --version</version_command>\n-    <command detect_errors="aggressive"><![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-export JBROWSE2_PATH=\\$(dirname \\$(which jbrowse))/../opt/jbrowse2  &&\n-\n-#if $jbgen.ucol.formcoll=="collect":\n-    python \'$__tool_directory__/autogenJB2.py\'\n-    #for $key in $autoCollection.keys():\n-        #if $autoCollection[$key].is_collection:\n-            #set subCol=$autoCollection[$key]\n-            #set pafs=[($subCol[x],$subcol[x].ext,x) for x in $subCol.keys() if $subCol[x].ext == \'paf\']\n-            #if len($pafs) > 0:\n-                 --pafmeta \'$pafs[0]\'\n-                #set refs = [($pafs[0][2],$subCol[x],x) for x in $subCol.keys() if $subCol[x].ext == \'fasta\']\n-                #for $ref in $refs:\n-                 --pafreferencemeta \'$ref\'\n-                #end for\n-            #end if\n-        #else if $autoCollection[$key].ext == \'fasta\':\n-          --referencemeta \'$autoCollection[$key],$autoCollection[$key].ext,$key\'\n-        #else if $autoCollection[$key].ext in [\'bed\', \'bigwig\', \'cool\', \'gff\', \'gff3\', \'hic\', \'maf\', \'mcool\', \'scool\', \'vcf\']\n-          --trackmeta \'$autoCollection[$key],$autoCollection[$key].ext,$key\'\n-        #else if $autoCollection[$key].ext in [\'bam\',]\n-          --trackmeta \'$autoCollection[$key],$autoCollection[$key].ext,$key,$autoCollection[$key].metadata.bam_index\'\n-         #else if $autoCollection[$key].ext in [\'cram\',]\n-          --trackmeta \'$autoCollection[$key],$autoCollection[$key].ext,$key,$autoCollection[$key].metadata.cram_index\'\n-        #end if\n-    #end for\n-    --outdir \'$output.files_path\'\n-    --jbrowse2path \\${JBROWSE2_PATH}\n-    --sessName "Autogen JBrowse" &&\n-    #if $jbgen.zipOut == "true":\n-        (cd \'$output.files_path\' && zip -r - . ) > \'$output\'\n-    #else\n-      cp \'$output.files_path/index.html\' \'$output\'\n-    #end if\n-#else:\n-    python \'$__tool_directory__/jbrowse2.py\'\n-    --jbrowse2path \\${JBROWSE2_PATH}\n-    --outdir \'$output.files_path\'\n-    --xml \'$trackxml\' &&\n-    #if $jbgen.zipOut == "true":\n-        (cd \'$output.files_path\' && zip -r - . ) > \'$output\'\n-    #else\n-      cp \'$output.files_path/index.html\' \'$output\'\n-    #end if\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-       &&   cp \'$trackxml\' \'$output\'\n-    #end if\n-#end if\n-  ]]></command>\n-<configfiles>\n-        <configfile name="trackxml"><![CDATA[<?xml version="1.0"?>\n-#if $jbgen.ucol.formcoll=="form":\n-<root>\n-    <metadata>\n-        <genomes>\n-            #if str($reference_genome.genome_type_select) == "uri":\n-              <genome path="${reference_genome.uri}" label="${reference_genome.refname}" useuri="yes">\n-                  <metadata>\n-                     <dataset\n-                      dname = "${reference_genome.refname}" />\n-              </metadata>\n-              </genome>\n-            #else if str($reference_genome.genome_type_select) == "indexed":\n-              <genome path="${reference_genome.genome.fields.path}" label="${reference_genome.genome.fields.name}" useuri="no">\n-                  <metadata>\n-                     <dataset\n-                      dname = "${reference_genome.genome.fields.name}" />\n-                  </metadata>\n-              </genome>\n-            #else\n-              <genome path="$reference_genome.genome" label="${reference_genome.gen'..b'ternative codons for unusual genomes,\n-and detailed track styling is not yet implemented. Send code.\n-JBrowse1 development has now ceased in favour of JBrowse2.\n-\n-Use and local viewing\n-=====================\n-\n-\n-A JBrowse2 history item can be opened by viewing it (the "eye" icon).\n-\n-The same browser data and setup can also be downloaded as a compressed zip archive by clicking the download ("floppy disk") icon in the history.\n-This can be shared and viewed without Galaxy.\n-\n-A replacement application to serve the browser is required without Galaxy. A local python web server can be started using a script included in each archive,\n-assuming that Python3 is already working on your desktop - if not you will have to install it first. Unzip the archive (*unzip [filename].zip*) and change\n-directory to the first level in that zip archive. It contains a file named *jb2_webserver.py*\n-\n-With python3 installed,\n-\n-*python3 jb2_webserver.py*\n-\n-will serve the unarchived JBrowse2 configuration from the same directory as the python script automatically. If a new browser window does not open,\n-but the script appears to be running, try pointing your web browser to the default of *localhost:8080*\n-\n-Overview\n---------\n-\n-JBrowse is a fast, embeddable genome browser built completely with\n-JavaScript and HTML5.\n-\n-The JBrowse-in-Galaxy (JiG) tool was written to help build complex\n-JBrowse installations straight from Galaxy. It allows you to build up a JBrowse instance without worrying\n-about how to run the command line tools to format your data, and which\n-options need to be supplied and where.\n-\n-Options\n--------\n-\n-**Reference or Assembly**\n-\n-Choose either a built-in or select one from your history.\n-\n-Track coordinates and contig names *must* match this reference precisely\n-or they will not display.\n-\n-**Track Groups** represent a set of tracks in a single category.\n-\n-Annotation Tracks\n------------------\n-\n-GFF3/BED\n-~~~~~~~~\n-\n-Standard feature tracks. They usually highlight genes, mRNAs and other features of interest along a genomic region.\n-\n-When these contain tens of millions of features, such as repeat regions from a VGP assembly, displaying one at a time leads\n-to extremely slow loading times when a large region is in view, unless the "LinearPileupDisplay" display option is\n-selected for that track in the styling options section. The default is LinearBasicDisplay, which shows all details and works\n-well for relatively sparse bed files. A better option is to make a bigwig track using a set of windows based on the\n-lengths of each assembly or reference contig.\n-\n-BAM Pileups\n-~~~~~~~~~~~\n-\n-We support BAM files and can automatically generate SNP tracks based on\n-that bam data.\n-\n-\n-BlastXML\n-~~~~~~~~\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-\n-@ATTRIBUTION@\n-]]></help>\n-    <expand macro="citations"/>\n-</tool>\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f macros.xml
--- a/macros.xml Tue Mar 26 00:52:34 2024 +0000
+++ b/macros.xml Thu Mar 28 04:51:06 2024 +0000
[
@@ -138,6 +138,7 @@
         </param>
     </xml>
 
+
     <xml name="general_options">
         <section name="jbgen" title="General JBrowse Options [Advanced]" expanded="false">
             <conditional name="ucol">
@@ -372,7 +373,10 @@
                     <option value="LinearAlignmentsDisplay" selected="true">LinearAlignmentsDisplay</option>
                     <option value="LinearPileupDisplay">LinearPileupDisplay</option>
                     <option value="LinearSNPCoverageDisplay">LinearSNPCoverageDisplay</option>
+                    <option value="LinearReadArcsDisplay">LinearReadArcsDisplay</option>
+                    <option value="LinearReadCloudDisplay">LinearReadCloudDisplay</option>
                 </param>
+                <!-- TODO check if possible to handle more options than just the display style-->
                 <when value="LinearAlignmentsDisplay"/>
                 <when value="LinearPileupDisplay"/>
                 <when value="LinearSNPCoverageDisplay">
@@ -380,6 +384,8 @@
                     <param name="minScore" label="Min score" type="integer" value="" optional="true"/>
                     <param name="maxScore" label="Max score" type="integer" value="" optional="true"/>
                 </when>
+                <when value="LinearReadArcsDisplay"/>
+                <when value="LinearReadCloudDisplay"/>
             </conditional>
         </section>
     </xml>
@@ -389,10 +395,12 @@
             <conditional name="track_style">
                 <param name="display" type="select" label="Display style" help="How the track will be displayed by default">
                     <option value="LinearVariantDisplay" selected="true">LinearVariantDisplay</option>
+                    <option value="LinearPairedArcDisplay">LinearPairedArcDisplay</option>
                 </param>
                 <when value="LinearVariantDisplay">
                     <expand macro="track_styling_linear"/>
                 </when>
+                <when value="LinearPairedArcDisplay"/>
             </conditional>
         </section>
     </xml>
@@ -430,6 +438,7 @@
         </section>
     </xml>
 
+    <!-- TODO use this -->
     <xml name="track_menu">
         <section name="jbmenu" title="JBrowse Contextual Menu options [Advanced]" expanded="false">
             <repeat name="track_menu" title="Track Menu">
b
diff -r e7a6f7a7148d -r ab0d6782a95f macrosbroken.xml
--- a/macrosbroken.xml Tue Mar 26 00:52:34 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,548 +0,0 @@\n-<?xml version="1.0"?>\n-<macros>\n-    <token name="@TOOL_VERSION@">2.10.1</token>\n-    <xml name = "edamInc">\n-        <edam_topics>\n-            <edam_topic>topic_3307</edam_topic>\n-            <edam_topic>topic_0092</edam_topic>\n-        </edam_topics>\n-        <edam_operations>\n-            <edam_operation>operation_0573</edam_operation>\n-            <edam_operation>operation_0564</edam_operation>\n-        </edam_operations>\n-    </xml>\n-    <xml name="requirements">\n-        <requirements>\n-            <requirement type="package" version="@TOOL_VERSION@">jbrowse2</requirement>\n-            <requirement type="package" version="1.81">biopython</requirement>\n-            <requirement type="package" version="0.7.1">bcbio-gff</requirement>\n-            <requirement type="package" version="1.19">samtools</requirement>\n-            <requirement type="package" version="6.0.1">pyyaml</requirement>\n-            <requirement type="package" version="1.11">tabix</requirement>\n-            <requirement type="package" version="4.6.0">findutils</requirement>\n-            <requirement type="package" version="0.0.8">hictk</requirement>\n-            <yield/>\n-        </requirements>\n-    </xml>\n-    <token name="@DATA_DIR@">\\$GALAXY_JBROWSE_SHARED_DIR</token>\n-    <token name="@WRAPPER_VERSION@">galaxy2</token>\n-    <token name="@ATTRIBUTION@"><![CDATA[\n-**Attribution**\n-This Galaxy tool relies on the JBrowse2, maintained by the GMOD Community. The Galaxy wrapper is maintained by Ross Lazarus\n-until the IUC complete their own.\n-]]>\n-    </token>\n-    <xml name="genome_selector"\n-        token_help=""\n-        token_label="Fasta sequences"\n-        token_optional="False" >\n-        <conditional name="reference_genome">\n-            <param help="Built-in references" label="Reference genome to display" name="genome_type_select" type="select">\n-                <option selected="True" value="indexed">Use a built-in genome</option>\n-                <option value="history">Use a genome from history</option>\n-            </param>\n-            <when value="indexed">\n-                <param\n-                help="@HELP@"\n-                label="@LABEL@"\n-                name="genomes"\n-                type="select"\n-                optional="@OPTIONAL@"\n-                >\n-                    <options from_data_table="all_fasta">\n-                        <filter column="2" type="sort_by" />\n-                        <validator message="No genomes are available for the selected input dataset" type="no_options" />\n-                    </options>\n-                </param>\n-            </when>\n-            <when value="history">\n-                <param\n-                format="fasta"\n-                label="@LABEL@"\n-                help="@HELP@"\n-                name="genomes"\n-                type="data"\n-                optional="@OPTIONAL@"\n-                multiple="True" />\n-            </when>\n-        </conditional>\n-    </xml>\n-\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 col'..b'>\n-                    <option value="dijitIconUndo">Undo</option>\n-                    <option value="dijitIconEdit">Edit</option>\n-                    <option value="dijitIconNewTask">New Task</option>\n-                    <option value="dijitIconEditTask">Edit Task</option>\n-                    <option value="dijitIconEditProperty">Edit Property</option>\n-                    <option value="dijitIconTask">Task</option>\n-                    <option value="dijitIconFilter">Filter</option>\n-                    <option value="dijitIconConfigure">Configure</option>\n-                    <option value="dijitIconSearch">Search</option>\n-                    <option value="dijitIconApplication">Application</option>\n-                    <option value="dijitIconChart">Chart</option>\n-                    <option value="dijitIconConnector">Connector</option>\n-                    <option value="dijitIconDatabase">Database</option>\n-                    <option value="dijitIconDocuments">Documents</option>\n-                    <option value="dijitIconMail">Mail</option>\n-                    <option value="dijitLeaf">Leaf</option>\n-                    <option value="dijitIconFile">File</option>\n-                    <option value="dijitIconFunction">Function</option>\n-                    <option value="dijitIconKey">Key</option>\n-                    <option value="dijitIconPackage">Package</option>\n-                    <option value="dijitIconSample">Sample</option>\n-                    <option value="dijitIconTable">Table</option>\n-                    <option value="dijitIconUsers">Users</option>\n-                    <option value="dijitIconFolderClosed">Folder Closed</option>\n-                    <option value="dijitIconFolderOpen">Folder Open</option>\n-                    <option value="dijitIconError">Error</option>\n-                </param>\n-            </repeat>\n-        </section>\n-    </xml>\n-\n-    <xml name="menu_sanitize">\n-        <sanitizer>\n-            <valid>\n-                <add value="{"/>\n-                <add value="}"/>\n-                <add value="!"/>\n-                <add value="?"/>\n-                <add value="&amp;"/>\n-                <add value="+"/>\n-                <add value="="/>\n-                <add value="\'"/>\n-                <add value=\'"\'/>\n-            </valid>\n-        </sanitizer>\n-    </xml>\n-\n-    <xml name="input_conditional" token_label="Track Data" token_format="data">\n-        <conditional name="useuri">\n-                <param name="insource" type="select" label="Define track data as a history file or an internet URI"\n-                    help="A public URI implies that all the associated tabix files are also in place. They are created for history files">\n-                    <option value="history" selected="true">Track data from a history file</option>\n-                    <option value="uri" selected="true">Tabix data URI - index files must be available at corresponding URI</option>\n-                </param>\n-                <when value="history">\n-                       <param label="@LABEL@" format="@FORMAT@" name="annotation" multiple="True" optional="true" type="data" />\n-                </when>\n-                <when value="uri">\n-                       <param label="@LABEL@" name="annouri"  type="text" />\n-                       <param label="Short name for track display" name="annoname" type="text" >\n-                             <sanitizer invalid_char="_">\n-                                <valid initial="string.printable" >\n-                                    <remove value="\'" />\n-                                </valid>\n-                              </sanitizer>\n-                        </param>\n-                </when>\n-            </conditional>\n-     </xml>\n-    <xml name="citations">\n-        <citations>\n-        <citation type="doi">10.1186/s13059-016-0924-1</citation>\n-        <citation type="doi">10.1101/gr.094607.109</citation>\n-        </citations>\n-    </xml>\n-</macros>\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f test-data/blastxml/blast-gene1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blast-gene1.xml Thu Mar 28 04:51:06 2024 +0000
[
@@ -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 e7a6f7a7148d -r ab0d6782a95f test-data/blastxml/blast.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blast.xml Thu Mar 28 04:51:06 2024 +0000
[
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 e7a6f7a7148d -r ab0d6782a95f test-data/blastxml/blastn-gene1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blastn-gene1.xml Thu Mar 28 04:51:06 2024 +0000
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 e7a6f7a7148d -r ab0d6782a95f test-data/blastxml/merlin.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/merlin.gff Thu Mar 28 04:51:06 2024 +0000
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 e7a6f7a7148d -r ab0d6782a95f test-data/bw/data.bw
b
Binary file test-data/bw/data.bw has changed
b
diff -r e7a6f7a7148d -r ab0d6782a95f test-data/cram/merlin-sample.cram
b
Binary file test-data/cram/merlin-sample.cram has changed
b
diff -r e7a6f7a7148d -r ab0d6782a95f test-data/gff3/merlin.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gff3/merlin.gff Thu Mar 28 04:51:06 2024 +0000
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 e7a6f7a7148d -r ab0d6782a95f test-data/vcf/test.vcf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/vcf/test.vcf Thu Mar 28 04:51:06 2024 +0000
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 e7a6f7a7148d -r ab0d6782a95f test-data/xmfa.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/xmfa.gff Thu Mar 28 04:51:06 2024 +0000
b
b'@@ -0,0 +1,5918 @@\n+##gff-version 3\n+##sequence-region Merlin 1 172788\n+Merlin\tprogressiveMauve\tmatch\t123963\t171642\t.\t-\t.\tID=HM137666;Target=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t123963\t123982\t80\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t123983\t124032\t62\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124033\t124082\t86\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124083\t124132\t72\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124133\t124182\t78\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124183\t124232\t70\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124233\t124282\t48\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124283\t124329\t42.5531914894\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124469\t124494\t73.0769230769\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124495\t124544\t56\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124601\t124650\t56\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124651\t124700\t54\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124701\t124750\t56\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124751\t124796\t56.5217391304\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124797\t124846\t14\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124847\t124868\t27.2727272727\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124869\t124918\t68\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124919\t124964\t45.652173913\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t124965\t125009\t55.5555555556\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125010\t125059\t58\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125060\t125077\t33.3333333333\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125078\t125127\t64\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125128\t125177\t26\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125744\t125793\t66\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125794\t125843\t70\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125844\t125893\t64\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125894\t125943\t50\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125944\t125993\t54\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t125994\t126043\t52\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126044\t126093\t74\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126094\t126143\t48\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126144\t126193\t56\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126194\t126240\t57.4468085106\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126241\t126290\t64\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126291\t126333\t58.1395348837\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126334\t126378\t71.1111111111\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126379\t126425\t63.829787234\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126426\t126468\t67.4418604651\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126469\t126515\t74.4680851064\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126516\t126565\t60\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126566\t126603\t60.5263157895\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126604\t126653\t50\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126654\t126703\t66\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126704\t126753\t74\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126754\t126803\t70\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126804\t126853\t78\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126854\t126903\t78\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126904\t126953\t66\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t126954\t127003\t78\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t127004\t127053\t72\t+\t.\tParent=HM137666\n+Merlin\tprogressiveMauve\tmatch_part\t127054\t1271'..b'ogressiveMauve\tmatch_part\t168325\t168374\t84\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168375\t168424\t84\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168425\t168474\t78\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168475\t168524\t82\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168525\t168574\t68\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168575\t168624\t70\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168625\t168674\t66\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t168675\t168724\t40\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169065\t169092\t60.7142857143\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169093\t169142\t74\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169143\t169192\t58\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169193\t169242\t60\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169243\t169292\t62\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169293\t169342\t68\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169343\t169374\t59.375\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169375\t169423\t63.2653061224\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169424\t169473\t70\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169474\t169523\t70\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169524\t169573\t54\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169574\t169623\t54\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t169624\t169673\t40\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170000\t170040\t68.2926829268\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170041\t170082\t76.1904761905\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170083\t170132\t70\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170133\t170182\t56\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170183\t170232\t68\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170233\t170282\t72\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170283\t170332\t68\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170333\t170382\t72\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170383\t170431\t61.2244897959\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170432\t170473\t52.380952381\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170474\t170523\t58\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170524\t170573\t64\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170574\t170623\t42\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170824\t170849\t38.4615384615\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170850\t170898\t63.2653061224\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170899\t170948\t56\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170949\t170991\t67.4418604651\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t170992\t171040\t46.9387755102\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171041\t171090\t52\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171091\t171123\t69.696969697\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171124\t171167\t79.5454545455\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171168\t171217\t78\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171218\t171264\t57.4468085106\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171265\t171314\t68\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171315\t171364\t68\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171365\t171414\t64\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171415\t171464\t76\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171465\t171514\t76\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171515\t171564\t80\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171565\t171614\t66\t+\t.\tParent=NC_000866\n+Merlin\tprogressiveMauve\tmatch_part\t171615\t171642\t53.5714285714\t+\t.\tParent=NC_000866\n+###\n'
b
diff -r e7a6f7a7148d -r ab0d6782a95f tool_data_table_conf.xml.test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.test Thu Mar 28 04:51:06 2024 +0000
b
@@ -0,0 +1,7 @@
+<tables>
+    <!-- Locations of all fasta files under genome directory -->
+    <table name="all_fasta" comment_char="#">
+        <columns>value, dbkey, name, path</columns>
+        <file path="${__HERE__}/test-data/all_fasta.loc" />
+    </table>
+</tables>