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

Changeset 93:4c517a0041a8 (2024-04-24)
Previous changeset 92:3c4db8203fad (2024-04-21) Next changeset 94:acbacaf0efe3 (2024-04-24)
Commit message:
planemo upload for repository https://github.com/usegalaxy-eu/temporary-tools/tree/master/jbrowse2 commit aeef2fbc0f90a9366851941ff51baeba410c56e4
modified:
autogenJB2.py
jbrowse2.py
jbrowse2.xml
macros.xml
test-data/jbrowse2_result02.zip
added:
__pycache__/jbrowse2.cpython-310.pyc
jbrowse2.py.apr17
test-data/Merlin
test-data/blastxml/blastn-gene1.xml
test-data/blastxml/merlin.gff
test-data/jbrowse2_result01.zip
test-data/vcf/test.vcf
test-data/vcf/test.xml
removed:
Galaxy-History-jb2testout.tar.gz
Galaxy-Workflow-_jb2testWF_mar26.ga
all_fasta.loc.sample
config.json
jb210demotracks.jpg
jb210demotracks.png
jbrowse8.png
tool_data_table_conf.xml.sample
tool_data_table_conf.xml.test
b
diff -r 3c4db8203fad -r 4c517a0041a8 Galaxy-History-jb2testout.tar.gz
b
Binary file Galaxy-History-jb2testout.tar.gz has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 Galaxy-Workflow-_jb2testWF_mar26.ga
--- a/Galaxy-Workflow-_jb2testWF_mar26.ga Sun Apr 21 04:42:29 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,331 +0,0 @@\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 3c4db8203fad -r 4c517a0041a8 __pycache__/jbrowse2.cpython-310.pyc
b
Binary file __pycache__/jbrowse2.cpython-310.pyc has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 all_fasta.loc.sample
--- a/all_fasta.loc.sample Sun Apr 21 04:42:29 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,18 +0,0 @@
-#This file lists the locations and dbkeys of all the fasta files
-#under the "genome" directory (a directory that contains a directory
-#for each build). The script extract_fasta.py will generate the file
-#all_fasta.loc. This file has the format (white space characters are
-#TAB characters):
-#
-#<unique_build_id> <dbkey> <display_name> <file_path>
-#
-#So, all_fasta.loc could look something like this:
-#
-#apiMel3 apiMel3 Honeybee (Apis mellifera): apiMel3 /path/to/genome/apiMel3/apiMel3.fa
-#hg19canon hg19 Human (Homo sapiens): hg19 Canonical /path/to/genome/hg19/hg19canon.fa
-#hg19full hg19 Human (Homo sapiens): hg19 Full /path/to/genome/hg19/hg19full.fa
-#
-#Your all_fasta.loc file should contain an entry for each individual
-#fasta file. So there will be multiple fasta files for each build,
-#such as with hg19 above.
-#
b
diff -r 3c4db8203fad -r 4c517a0041a8 autogenJB2.py
--- a/autogenJB2.py Sun Apr 21 04:42:29 2024 +0000
+++ b/autogenJB2.py Wed Apr 24 02:29:32 2024 +0000
[
@@ -143,7 +143,7 @@
                         sys.stdout.write("#### calling %s" % " ".join(cmd))
                         jc.subprocess_check_call(cmd)
                     track_conf.update(
-                        {"conf": {"options": {"bam": {"bam_index": " %s:%s," % (tpath,ipath)}}}}
+                        {"conf": {"options": {"bam": {"bam_index": " %s ~ %s," % (tpath,ipath)}}}}
                     )
                 elif trext == "cram":
                     ipath = track[3]
@@ -161,7 +161,7 @@
                         ]
                         jc.subprocess_check_call(cmd)
                     track_conf.update(
-                        {"conf": {"options": {"cram": {"cram_index": "%s:%s," % (tpath, ipath)}}}}
+                        {"conf": {"options": {"cram": {"cram_index": "%s ~ %s," % (tpath, ipath)}}}}
                     )
                 track_conf["path"] = tpath
                 track_conf["format"] = trext
b
diff -r 3c4db8203fad -r 4c517a0041a8 config.json
--- a/config.json Sun Apr 21 04:42:29 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,9 +0,0 @@
-{
-  "assemblies": [],
-  "configuration": {},
-  "connections": [],
-  "defaultSession": {
-    "name": "New Session"
-  },
-  "tracks": []
-}
\ No newline at end of file
b
diff -r 3c4db8203fad -r 4c517a0041a8 jb210demotracks.jpg
b
Binary file jb210demotracks.jpg has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 jb210demotracks.png
b
Binary file jb210demotracks.png has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 jbrowse2.py
--- a/jbrowse2.py Sun Apr 21 04:42:29 2024 +0000
+++ b/jbrowse2.py Wed Apr 24 02:29:32 2024 +0000
[
@@ -19,7 +19,7 @@
 logging.basicConfig(level=logging.DEBUG)
 log = logging.getLogger("jbrowse")
 
-JB2VER = "v2.10.3"
+JB2VER = "v2.11.0"
 # version pinned if cloning - but not cloning now
 logCommands = True
 # useful for seeing what's being written but not for production setups
@@ -531,32 +531,7 @@
                     this_genome["genome_sequence_adapter"] = assem["sequence"][
                         "adapter"
                     ]
-                    this_genome["genome_firstcontig"] = None
-                    if not useuri:
-                        fl = open(fapath, "r").readline()
-                        fls = fl.strip().split(">")
-                        if len(fls) > 1:
-                            fl = fls[1]
-                            if len(fl.split()) > 1:
-                                this_genome["genome_firstcontig"] = fl.split()[
-                                    0
-                                ].strip()
-                            else:
-                                this_genome["genome_firstcontig"] = fl
-                    else:
-                        try:
-                            scontext = ssl.SSLContext(ssl.PROTOCOL_TLS)
-                            scontext.verify_mode = ssl.VerifyMode.CERT_NONE
-                            with urllib.request.urlopen(
-                                url=fapath + ".fai", context=scontext
-                            ) as f:
-                                fl = f.readline()
-                        except Exception:
-                            fl = None
-                        if fl:  # is first row of the text fai so the first contig name
-                            this_genome["genome_firstcontig"] = (
-                                fl.decode("utf8").strip().split()[0]
-                            )
+                    this_genome["genome_firstcontig"] = first_contig
                 assmeta.append(this_genome)
         self.assemblies += assembly
         self.assmeta[primaryGenome] = assmeta
@@ -569,12 +544,6 @@
         """
         if useuri:
             faname = fapath
-            adapter = {
-                "type": "BgzipFastaAdapter",
-                "fastaLocation": {"uri": faname, "locationType": "UriLocation"},
-                "faiLocation": {"uri": faname + ".fai", "locationType": "UriLocation"},
-                "gziLocation": {"uri": faname + ".gzi", "locationType": "UriLocation"},
-            }
             scontext = ssl.SSLContext(ssl.PROTOCOL_TLS)
             scontext.verify_mode = ssl.VerifyMode.CERT_NONE
             with urllib.request.urlopen(url=faname + ".fai", context=scontext) as f:
@@ -591,20 +560,19 @@
                 fadest,
             )
             self.subprocess_popen(cmd)
-
-            adapter = {
-                "type": "BgzipFastaAdapter",
-                "fastaLocation": {
-                    "uri": faname,
-                },
-                "faiLocation": {
-                    "uri": faname + ".fai",
-                },
-                "gziLocation": {
-                    "uri": faname + ".gzi",
-                },
-            }
             contig = open(fadest + ".fai", "r").readline().strip()
+        adapter = {
+            "type": "BgzipFastaAdapter",
+            "fastaLocation": {
+                "uri": faname,
+            },
+            "faiLocation": {
+                "uri": faname + ".fai",
+            },
+            "gziLocation": {
+                "uri": faname + ".gzi",
+            },
+        }
         first_contig = contig.split()[:2]
         first_contig.insert(0, gname)
         trackDict = {
@@ -877,9 +845,9 @@
             bindex = fname + ".bai"
             bi = bam_indexes.split(",")
             bam_index = [
-                x.split(":")[1].strip()
+                x.split(" ~ ")[1].strip()
                 for x in bi
-                if ":" in x and x.split(":")[0].strip() == realFName
+                if " ~ " in x and x.split(" ~ ")[0].strip() == realFName
             ]
             logging.debug(
                 "===realFName=%s got %s as bam_indexes %s as bi, %s for bam_index"
@@ -939,9 +907,9 @@
             self.subprocess_check_call(["cp", data, dest])
             ci = cram_indexes.split(",")
             cram_index = [
-                x.split(":")[1].strip()
+                x.split(" ~ ")[1].strip()
                 for x in ci
-                if ":" in x and x.split(":")[0].strip() == realFName
+                if " ~ " in x and x.split(" ~ ")[0].strip() == realFName
             ]
             logging.debug(
                 "===realFName=%s got %s as cram_indexes %s as ci, %s for cram_index"
@@ -1166,7 +1134,8 @@
         categ = trackData["category"]
         pg = pafOpts["genome"].split(",")
         pgc = [x.strip() for x in pg if x.strip() > ""]
-        gnomes = [x.split(":") for x in pgc]
+        gnomes = [x.split(" ~ ") for x in pgc]
+        logging.debug("pg=%s, gnomes=%s" % (pg, gnomes))
         passnames = [trackData["assemblyNames"]]  # always first
         for i, (gpath, gname) in enumerate(gnomes):
             # may have been forgotten by user for uri
@@ -1178,7 +1147,7 @@
                 gname = gname.split()[0]
             if gname not in passnames:
                 passnames.append(gname)
-            useuri = gpath.startswith("http://") or gpath.startswith("https://")
+            useuri = pafOpts["useuri"] == "true"
             if gname not in self.genome_names:
                 # ignore if already there - eg for duplicates among pafs.
                 asstrack, first_contig = self.make_assembly(gpath, gname, useuri)
@@ -1616,7 +1585,7 @@
         genomes = [
             {
                 "path": x.attrib["path"],
-                "label": x.attrib["label"],
+                "label": x.attrib["label"].split(" ")[0].replace(",", ""),
                 "useuri": x.attrib["useuri"],
                 "meta": metadata_from_node(x.find("metadata")),
             }
@@ -1650,7 +1619,10 @@
             trackfiles = track.findall("files/trackFile")
             if trackfiles:
                 for x in trackfiles:
-                    track_conf["label"] = "%s_%d" % (x.attrib["label"], trackI)
+                    track_conf["label"] = "%s_%d" % (
+                        x.attrib["label"].replace(" ", "_").replace(",", ""),
+                        trackI,
+                    )
                     trackI += 1
                     track_conf["useuri"] = x.attrib["useuri"]
                     if is_multi_bigwig:
b
diff -r 3c4db8203fad -r 4c517a0041a8 jbrowse2.py.apr17
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jbrowse2.py.apr17 Wed Apr 24 02:29:32 2024 +0000
[
b'@@ -0,0 +1,1772 @@\n+#!/usr/bin/env python\n+\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 ssl\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.DEBUG)\n+log = logging.getLogger("jbrowse")\n+\n+JB2VER = "v2.10.3"\n+# version pinned if cloning - but not cloning now\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+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+INDEX_TEMPLATE = """<!doctype html>\n+<html lang="en" style="height:100%">\n+<head>\n+<meta charset="utf-8"/>\n+<link rel="shortcut icon" href="./favicon.ico"/>\n+<meta name="viewport" content="width=device-width,initial-scale=1"/>\n+<meta name="theme-color" content="#000000"/>\n+<meta name="description" content="A fast and flexible genome browser"/>\n+<link rel="manifest" href="./manifest.json"/>\n+<title>JBrowse</title>\n+</script>\n+</head>\n+<body style="overscroll-behavior:none; height:100%; margin: 0;">\n+<iframe\n+  id="jbframe"\n+  title="JBrowse2"\n+  frameborder="0"\n+  width="100%"\n+  height="100%"\n+  src=\'index_noview.html?config=config.json__SESSION_SPEC__\'>\n+</iframe>\n+</body>\n+</html>\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_COLOU'..b'                       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+\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+            keys = jc.process_annotations(track_conf)\n+\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[assref_name]["visibility"][vis].append(key)\n+                    trakdat = jc.tracksToAdd[assref_name]\n+                    stile = {}\n+                    for trak in trakdat:\n+                        if trak["trackId"] == key:\n+                            stile = trak.get("style", {})\n+                    if track.find("options/style"):\n+                        supdate = {\n+                            item.tag: parse_style_conf(item)\n+                            for item in track.find("options/style")\n+                        }\n+                        stile.update(supdate)\n+                    default_session_data[assref_name]["style"][key] = stile\n+                    logging.debug("@@@ for %s got style=%s" % (key, stile))\n+                    if track.find("options/style_labels"):\n+                        default_session_data[assref_name]["style_labels"][key] = {\n+                            item.tag: parse_style_conf(item)\n+                            for item in track.find("options/style_labels")\n+                        }\n+                default_session_data[assref_name]["tracks"].append(key)\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+    logging.debug("default_session=%s" % (default_session_data))\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", [])\n+    for gnome in jc.genome_names:\n+        trackconf += jc.tracksToAdd[gnome]\n+    jc.config_json["tracks"] = trackconf\n+    assconf = jc.config_json.get("assemblies", [])\n+    assconf += jc.assemblies\n+    jc.config_json["assemblies"] = assconf\n+    logging.debug("assemblies=%s, gnames=%s" % (assconf, jc.genome_names))\n+    jc.write_config()\n+    jc.add_default_session(default_session_data)\n+    # note that this can be left in the config.json but has NO EFFECT if add_defsess_to_index is called.\n+    # jc.add_defsess_to_index(default_session_data)\n+    # jc.text_index() not sure what broke here.\n'
b
diff -r 3c4db8203fad -r 4c517a0041a8 jbrowse2.xml
--- a/jbrowse2.xml Sun Apr 21 04:42:29 2024 +0000
+++ b/jbrowse2.xml Wed Apr 24 02:29:32 2024 +0000
[
b'@@ -1,13 +1,13 @@\n- <tool id="jbrowse2" name="JBrowse2" version="@TOOL_VERSION@+@WRAPPER_VERSION@_15" profile="22.05">\n+<tool id="jbrowse2" name="JBrowse2" version="@TOOL_VERSION@+@WRAPPER_VERSION@_17" profile="22.05">\n     <description>genome browser</description>\n     <macros>\n         <import>macros.xml</import>\n     </macros>\n-    <expand macro="edamInc"/>\n+    <expand macro="edamInc" />\n     <xrefs>\n         <xref type="bio.tools">jbrowse2</xref>\n     </xrefs>\n-    <expand macro="requirements"/>\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@@ -60,7 +60,7 @@\n     #end if\n #end if\n   ]]></command>\n-<configfiles>\n+    <configfiles>\n         <configfile name="trackxml"><![CDATA[<?xml version="1.0"?>\n <root>\n     <metadata>\n@@ -232,7 +232,7 @@\n                             <bam>\n                             <bam_index>\n                                 #for $dataset in $track.data_format.useuri.annotation:\n-                                    ${dataset}:${dataset.metadata.bam_index},\n+                                    ${dataset} ~ ${dataset.metadata.bam_index},\n                                 #end for\n                             </bam_index>\n                             </bam>\n@@ -240,7 +240,7 @@\n                             <cram>\n                             <cram_index>\n                                 #for $dataset in $track.data_format.useuri.annotation:\n-                                    ${dataset}:${dataset.metadata.cram_index},\n+                                    ${dataset} ~ ${dataset.metadata.cram_index},\n                                 #end for\n                             </cram_index>\n                             </cram>\n@@ -260,18 +260,24 @@\n                             </gff>\n                         #else if str($track.data_format.data_format_select) == "paf":\n                             <paf>\n-                                #if $track.data_format.pafuseuri.insource == "history":\n+                                #if str($track.data_format.pafuseuri.insource) == "history":\n                                 <genome>\n                                     #for $anno in $track.data_format.pafuseuri.annotation:\n-                                        ${anno}:${anno.name},\n+                                        ${anno} ~ ${anno.name},\n                                     #end for\n                                 </genome>\n+                                <useuri>\n+                                    false\n+                                </useuri>\n                                 #else:\n                                 <genome>\n                                     #for $refgenome in $track.data_format.pafuseuri.refuri:\n-                                        ${refgenome.annotation}:${refgenome.annoname},\n+                                        ${refgenome.annotation} ~ ${refgenome.annoname},\n                                     #end for\n                                 </genome>\n+                                <useuri>\n+                                    true\n+                                </useuri>\n                                 #end if\n                             </paf>\n                         #else if str($track.data_format.data_format_select) == "hic":\n@@ -304,165 +310,186 @@\n ]]></configfile>\n     </configfiles>\n     <inputs>\n-        <repeat name="assemblies" min="1" title="Genome reference to provide display coordinates for this set of tracks"\n-           help="JBrowse2 can show a set of tracks for each of multiple genome reference fasta files">\n-        <conditional name="reference_genome">\n-            <param help="Select a built in, history or remote tabix URI for the reference track"\n-                 label="Reference genome source" name="genome_type_select" type="select">\n-                <option selected="True" value="'..b'  </conditional>\n                                 <conditional name="color">\n-                                    <param name="color_select" value="automatic"/>\n+                                    <param name="color_select" value="automatic" />\n                                 </conditional>\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/2.gff"/>\n-                            <param name="insource" value= "history"/>\n-                        </conditional>\n-                        <conditional name="match_part">\n-                            <param name="match_part_select" value="true"/>\n-                            <param name="name" value="cDNA_match"/>\n+                        <conditional name="data_format">\n+                            <param name="data_format_select" value="gff" />\n+                            <conditional name="useuri">\n+                                <param name="annotation" value="gff3/2.gff" />\n+                                <param name="insource" value="history" />\n+                            </conditional>\n+                            <conditional name="match_part">\n+                                <param name="match_part_select" value="true" />\n+                                <param name="name" value="cDNA_match" />\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@@ -1036,14 +1145,14 @@\n             <param name="uglyTestingHack" value="enabled" />\n             <output name="output">\n                 <assert_contents>\n-                        <has_text text="Ignore Scale"/>\n-                        <has_text text="A.gff"/>\n-                        <has_text text="B.gff"/>\n-                        <has_text text="C.gff"/>\n-                        <has_text text="interpro.gff"/>\n-                        <has_text text="Scaled Colour"/>\n-                        <has_text text="1.gff"/>\n-                        <has_text text="2.gff"/>\n+                    <has_text text="Ignore Scale" />\n+                    <has_text text="A.gff" />\n+                    <has_text text="B.gff" />\n+                    <has_text text="C.gff" />\n+                    <has_text text="interpro.gff" />\n+                    <has_text text="Scaled Colour" />\n+                    <has_text text="1.gff" />\n+                    <has_text text="2.gff" />\n                 </assert_contents>\n             </output>\n         </test>\n@@ -1168,5 +1277,5 @@\n \n @ATTRIBUTION@\n ]]></help>\n-    <expand macro="citations"/>\n-</tool>\n+    <expand macro="citations" />\n+</tool>\n\\ No newline at end of file\n'
b
diff -r 3c4db8203fad -r 4c517a0041a8 jbrowse8.png
b
Binary file jbrowse8.png has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 macros.xml
--- a/macros.xml Sun Apr 21 04:42:29 2024 +0000
+++ b/macros.xml Wed Apr 24 02:29:32 2024 +0000
b
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <macros>
-    <token name="@TOOL_VERSION@">2.10.1</token>
+    <token name="@TOOL_VERSION@">2.11.0</token>
     <xml name = "edamInc">
         <edam_topics>
             <edam_topic>topic_3307</edam_topic>
@@ -20,7 +20,8 @@
             <requirement type="package" version="6.0.1">pyyaml</requirement>
             <requirement type="package" version="1.11">tabix</requirement>
             <requirement type="package" version="4.6.0">findutils</requirement>
-            <requirement type="package" version="0.0.8">hictk</requirement>
+            <requirement type="package" version="0.0.12-0">hictk</requirement>
+            <requirement type="package" version="3.0">zip</requirement>
             <yield/>
         </requirements>
     </xml>
@@ -539,51 +540,51 @@
 
     <xml name="input_conditional" token_label="Track Data" token_format="data">
         <conditional name="useuri">
-                <param name="insource" type="select" label="Define track data as a history file or an internet URI"
-                    help="A public URI implies that all the associated tabix files are also in place. They are created for history files">
-                    <option value="history" selected="true">Track data from a history file</option>
-                    <option value="uri" >Tabix data URI - index files must be available at corresponding URI</option>
+            <param name="insource" type="select" label="Define track data as a history file or an internet URI"
+                help="A public URI implies that all the associated tabix files are also in place. They are created for history files">
+                <option value="history" selected="true">Track data from a history file</option>
+                <option value="uri" >Tabix data URI - index files must be available at corresponding URI</option>
+            </param>
+            <when value="history">
+                <param label="@LABEL@" format="@FORMAT@" name="annotation" multiple="True" optional="true" type="data" />
+            </when>
+            <when value="uri">
+                <param label="@LABEL@" name="annouri"  type="text" />
+                <param label="Short name for track display" name="annoname" type="text" >
+                    <sanitizer invalid_char="_">
+                    <valid initial="string.printable" >
+                        <remove value="'" />
+                    </valid>
+                    </sanitizer>
                 </param>
-                <when value="history">
-                       <param label="@LABEL@" format="@FORMAT@" name="annotation" multiple="True" optional="true" type="data" />
-                </when>
-                <when value="uri">
-                       <param label="@LABEL@" name="annouri"  type="text" />
-                       <param label="Short name for track display" name="annoname" type="text" >
-                             <sanitizer invalid_char="_">
+            </when>
+        </conditional>
+    </xml>
+    <xml name="pafref_conditional" token_label="Track Data" token_format="data">
+        <conditional name="pafuseuri">
+            <param name="insource" type="select" label="PAF reference data from a history file or an internet URI?"
+                help="Multiple references can be used for mashmap PAF. A URI source requires all the associated tabix index files to be in place.">
+                <option value="history" selected="true">PAF reference comparison genome from a history file</option>
+                <option value="uri">PAF reference comparison genome tabix .gz URI with index files at the corresponding URIs</option>
+            </param>
+            <when value="history">
+                    <param label="@LABEL@" format="@FORMAT@" name="annotation"  type="data"
+                        help="Add all PAF reference comparison genomes used to make the PAF" multiple="true" />
+            </when>
+            <when value="uri">
+                <repeat name="refuri" title="PAF reference comparison genome URI" min="1">
+                    <param label="@LABEL@" name="annotation"  type="text" />
+                    <param label="Short name for this reference" name="annoname" type="text" help="Short names take less track space">
+                            <sanitizer invalid_char="_">
                                 <valid initial="string.printable" >
                                     <remove value="'" />
                                 </valid>
-                              </sanitizer>
-                        </param>
-                </when>
-            </conditional>
-     </xml>
-    <xml name="pafref_conditional" token_label="Track Data" token_format="data">
-        <conditional name="pafuseuri">
-                <param name="insource" type="select" label="PAF reference data from a history file or an internet URI?"
-                    help="Multiple references can be used for mashmap PAF. A URI source requires all the associated tabix index files to be in place.">
-                    <option value="history" selected="true">PAF reference comparison genome from a history file</option>
-                    <option value="uri">PAF reference comparison genome tabix .gz URI with index files at the corresponding URIs</option>
-                </param>
-                <when value="history">
-                       <param label="@LABEL@" format="@FORMAT@" name="annotation"  type="data"
-                          help="Add all PAF reference comparison genomes used to make the PAF" multiple="true" />
-                </when>
-                <when value="uri">
-                    <repeat name="refuri" title="PAF reference comparison genome URI" min="1">
-                       <param label="@LABEL@" name="annotation"  type="text" />
-                       <param label="Short name for this reference" name="annoname" type="text" help="Short names take less track space">
-                             <sanitizer invalid_char="_">
-                                <valid initial="string.printable" >
-                                    <remove value="'" />
-                                </valid>
-                              </sanitizer>
-                        </param>
-                    </repeat>
-                </when>
-            </conditional>
-     </xml>
+                            </sanitizer>
+                    </param>
+                </repeat>
+            </when>
+        </conditional>
+    </xml>
     <xml name="citations">
         <citations>
         <citation type="doi">10.1186/s13059-016-0924-1</citation>
b
diff -r 3c4db8203fad -r 4c517a0041a8 test-data/Merlin
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Merlin Wed Apr 24 02:29:32 2024 +0000
b
b'@@ -0,0 +1,2881 @@\n+>Merlin\n+TCGTTTAGACAAAGGTACATTATTGTATCGTGGCCAAAAATTAGACCTTCCTACATTCGA\n+GCATAACGCAGAGAATAAGTTGTTCTATTTCAGAAACTACGTTTCAACTTCATTAAAGCC\n+TCTGATCTTTGGTGAATTTGGTCGTATGTTTATGGCACTAGATGACGATACTACAATTTA\n+TACTGCTGAGACGCCTGATGATTATAATCGTTTCGCAAACCCAGAAGATATAATTGATAT\n+TGGCGCTACTCAAAAAGACTCATTTGACGATAACAATAATGATGGAACATCTATTAATAT\n+CGGCAAACAAGTTAATTTAGGATTCGTTATTTCCGGTGCTGAAAATGTTCGAGTTATTGT\n+TCCAGGTTCTTTAACTGAATATCCAGAAGAAGCGGAAGTTATTCTGCCTCGTGGTACTCT\n+TTTGAAGATCAATAAAATCACTACTCAAGTAGATAAACGCTCGAATAAGTTCATGGTTGA\n+AGGTTCAATCGTTCCGCCTTCTGAGCAAATTGATGAATCTGTTGAGATTTATGACGGTGA\n+TCTGTTCATGGAAACAGGTGAAGTAGTAAAACTGTCCGGATTCATGCAGTTCGTCAACGA\n+ATCTGCATACGATGAAGAGCAAAACCAGATGGCTGCTGAGATTCTGTCTGGATTCTTGGA\n+CATTGATGACATGCCACGTAAGTTCCGCTAGCCGTTTACATCCACATGGAAGTGGATTAT\n+AATGGCTCTACGTTAACAAGAGGAAAACAACATGAAATCAATTTTTCGTATCAACGGTGT\n+AGAAATTGTAGTTGAAGATGTAGTTCCTATGTCTTATGAATTCAATGAAGTTGTTTTCAA\n+AGAGCTTAAGAAAATTTTAGGCGATAAGAAGCTTCAAAGTACTCCAATTGGACGTTTTGG\n+AATGAAAGAAAACGTTGATACTTATATTGAAAGTGTAGTGACAGGGCAGTTAGAAGGTGA\n+ATTTTCTGTAGCAGTTCAAACTGTAGAAAATGATGAAGTTATTTTAACTTTACCAGCTTT\n+CGTAATTTTCCGCAAATAAAACAATGGGGAGCTATGCTCCCCATTTTTACAATCCAAGTA\n+TTTTCGAAGTAGAGTTTCGGGTCGAATTAATGACGTGAGACAACCCTCCAGCAGCTCCTC\n+CAAGTCTAGATAATCTACTTAAACTTCCATTAAGAGACATTTCACTATTAATTCCAGTTA\n+TAGAATTAACAGCTCTATCTTCAATCCAATCAAGAGCAGCTTGACGTCCAACAGCACCCG\n+TTTGCATTACTCTGTAAGCAAATGTAACATCGAAAACCGCAATTTGGTTATCTCCTTCAT\n+ATGTAAGCTCAGGAGCTCCACACGCAACAGGAACACAACCTGTGAACATTATCACAGTAT\n+GAGGTAATCCATTTCGAGCATGAAGGTTAACCTGAATGTCAGCTTCGACGTCAGTTGGTA\n+ATGCTCGCAATCCAGTAACCGGGTCTTGAACGGAGTTCACCCAATCTTGCATTGCACGAT\n+AGTTACTTGCTTCGGGATCCATTCTGAATGATATAGTTAACGGATCGAGTTCACGTCCAG\n+TTATTCTAATATTCGGTGAGTTATGGTTGAAATCCATTTCATGAGACAATCTGTTCTCTG\n+GAATTTTGACCGAATAAATCATCAATCCAGATTGCGGATAAGCCATGTTAAAGAAGTCTA\n+ACAAATAAGTTCCGACTTCAAATTCACCTAATAAAGACTGAACAACACGATTGCTCATTG\n+CTCCAATAAGATATTTCGATACACCAGACTTTCTTACCAGCTGTTGAGTACCGGCAGTGA\n+TAATTGAGGTGAGTCCTGATGTGAACTCACCTTGTGTTAATCCAAGCCAGTCATTATTCA\n+ACGGAAGGTTATTAAAGAGCATACCGCCAAATTGATCGAGTAATTGTTGAGACTTTGCTG\n+ACGGAGTAGTTGCAAATACACAACTAAACATATTAGTACGCTGAAAGTCTATATTACCCG\n+CTTGGTTTTTAAATTCATCTAAAGTTAGCATCAGAATCCTTCCGCATATACTGAAGCTCG\n+GTTCAATGTCAAGATTTCACGCATAGTAATTTCTAATGTGAATGTACTTGGCAGGTTTGG\n+AGCTATAGCTAAACCGTTAAAGTTTCCATTTGGAGTTTTATCAAAACGGATACTCTGAAT\n+TTGACATGGACCGAATACTTCAGCACGTCCATCGAATTTACTTGTGGTTCCAAAGTTTCT\n+GACGAACCACACAGTAGGGTTACTTACAACAATAACATTACTTAAGAATGAAGTTATTTT\n+CTCAAAAACAGTGTCATTTTTATTAGCTTCATCTGGAGTTAATGTATCAAGGAAAGTTGA\n+TTTATACCATTCATCTAATTGAGACTTAACTTCTTTTGCATAAGTAGACGTTCCCGTTTC\n+GCCATAACTATAGTAGTTAAAGTATTCATAGATCTCGATAATAGCAATAAGATCTTGTAC\n+TGATCGAGGAGTTAAATCCCACGTGAATACCTTCGTACGGTTATCTGCGCCGCCATACAT\n+TGATCGAGCAGTGTTATAGATCTGCTCGTTATGGTCAGCCATTAATCCTTGAGTCAATGA\n+CTCTAATCCGCCAAAGACAGCAGTAGATGCAACGTTACTTAATACCCCTGTAGCAGTACC\n+GCCGCCACGAGAAATAAGTGAATCTCCAACGTCATTAAATTTATGAGAAACTGATTCAAC\n+ATCTGATTTCGAGCGTGGAAGTAAAATATTCACTACTGGAATTTTATCAACTTTATTAGT\n+ATTTGTTCCAGTGATTGATTTCACTACACTATTTGCAGTACGTTTCATTTCACCTAAACG\n+CATGCTACGCATATCACCGGTTGTACGAGAATTCATATCATACGCAGTGAACAACAACCC\n+GTTCTTATAAAGATCATGAACTCGTAAAGAACCAGATGTGTCATTACCAGCTGAACGTTC\n+AGACGGATATTGCGCAGTTATAGTGGATTTTATTTTTGCTGATTGTGAACTTTGACCAGC\n+GGAGGTTTTAACTCCGCTAATTAAAGCATCAGTCTTATCATCTAATTCTCTGACTTTAAT\n+GCTCATTAATTAACTCCTGTTGCCCCGAATACTCCAGGAGCTGGAGTAGCCGTGACTGTT\n+TGAACCTGGTGAATAGTCTTACTATTATTTACGTTATTAACCTGAGTGTTAGCAACATTC\n+ATATCACCGGTTGATTTTTTAGATTGCTCTTTAGCATTTTCAGCTTTTTGAATATTTTGA\n+ACTCGTTGATTATCTTCCGAAGTAGCTGGAGCCGCAGGCTTCGGAGTGTTATCTTCTTTG\n+AGCTTCTGATACTTGGATTCTACTCGTTGGAATCTTTTATCGAGTTCCTTTTTAGTAGCT\n+GGTTGATCACTTATAGCAGAATCACTAATAGACTTTTTGGCACTGTTATATGCCTTCTCT\n+AAAGATTGCATATTAGTTGGATTCTCTGGATCAACATCACCAATATATTTTTCTAAACGC\n+TGAACAGCTGCACGAGCTTCGTTTTGTTTGATCAGTGTTTCTTCGCGTTTTTCAGGAGCC\n+ATTGCTTTAAGATTCTGAGTCTCTTGATCACGGTCAGATGCTTGTGTAGAATCGATTTTA\n+TTCTCTCTTCCTAGTACCCAATCAAATGCACGAGTTTTAAATTCGCCAGCTTTATCAATA\n+ATTCCAGGACCTTCTTCAATACGCTTACTCTGATATTTAGCCAAAGCTTTTTGATCATCT\n+TCAGACAATGAATTACCAGTGCGTTCCTGGAATCCTTCTAGTGCTGAACCACGAATAGTA\n+GTTGCTGCATTTTCAAAGCCAAGTGCATCGAGTATAGAAGCAGATATCTTTGAAATTCCC\n+AA'..b'ATTTCCATGAGGTTACTGGGTTATGAGTTATAAAATTCTTTT\n+AGAAGTTACCGTGATGTCTTCGACTGGACATGTGGCGGTTAGTACTGAACAGCTGGATTT\n+TTATAGCTGGGATAATGCTAATATGTATTATGAAGCAGTAGAAGTTTATGAAGAAACGCC\n+AGATATTAAAGTATGGCGTCAAGTAACAAAACTTTATTAAAGCCCTTCGGGGCTTTTGTT\n+GTCTATAAATATAGTAAACTATAGAGGACTTTTTATGATCGAATTAAATGAAGTCTTCGA\n+TGAAGGGAAAGAACGTCTAGCAGTTACGAACCTTTATCCGAAGCTCAAGATTCCACAAAT\n+TTTTGCAATAGACAACACTAAAGTAGCTTATCGTATGTGCTCATATACTGGTGGTGGAGA\n+TGCAAATAAAAACATCAAACCCGGTGATAAAATGATGCATGTCATTGCATTAGGAGTTAC\n+TGATAAAGGCCTTGGTCAACTTAAGACCTTAGGTGATAATCCAATTGCTGTTATTGATAC\n+AATCTTTAACCACGTAATGGGTATCATGAAGTTTTATCGTTTTGACGCTGCTTTATTTCG\n+TGTTAAAAAGAATAAAACTGGTGGAGCAGGTCGCCAGATGCAAGTTATTGTTGATCGTCT\n+AATCAAGAAGAAAGGCGGTGGCAAATTCGTTATGCTTAAAGAGTTGTATGATTTTGATAA\n+GAAATACAACTACATTTTAGTATACAAGAAGAATGCTGATCTTGTCAATATCCCTGGAAT\n+GACTGAGATCATGGACTCAATTTATAAGAAAGTAGACACTGATGTAGGTGATGCTTATAT\n+CAACGTTGAGACCGGCAAACAAGTATCTAAGCTTGAAGCTATCGCGGGTTCAATCGCAGC\n+AGAAAATGATAAACGCTCAGACCAGGCGGTTGCGTCTCGAGCTAAAATATCTCGTCGTGC\n+TTTAATGGCTTCTCAATATTCAATCCAAGTGGGATTTGATACTCGTAAAGATGCGGTAGA\n+ACATGATAAGCGATTAGATGTAATTAACTCTAAACCTCCGGTTTATTTGACAGATAAGTC\n+TTCTGACCAAGTATCGAATATTCAAATGGCTATTGATAATTTCAGAAATGATTCTCAATC\n+AATTGCTAAAACCGGCGAAGCGTTTAAGACATTTGACCCGTCATGGAAAATGGATGATGA\n+TCGTCATTCTACTGGTACAATGAAAGCCCAAGAACTTGTTCTAAGGCTCACTAATATATT\n+AACCAGTGGAACAGTAGACGATTTCAGTCAACATCCTACTGATAGAAGAGAAGCATTTAA\n+AACATTAGCGGTCAGAGACATTTATCGTATTGGTGAAGCCTGGTCTAAATTAGAGCCTAA\n+TGACTATTATGGTGCTATTAAAGAACTTACTCGAGTCGCAATGGAAGACAAAGAATGGTC\n+TTCTGATGCAAATCGTGAATACGCAGTAAAAGAGATTGTAGAATTAATTTCTAAACAGTT\n+CTCTGATTTAGCAGCTAGCATGTACAAAAATACATCAGATGTGGATCGTTATACTCCGGT\n+ACAATTGTCAGGTTTACATGCTTACGTCGGTTCATCTTATAAGTACATCAACGACTATCT\n+TTTAGGCCTTGATGATTATGGCAAAGAAACTGTTGAAAAATGGATTGAGTCTATCGATTC\n+TGCGTTTGAAAATGGTGTTCGTCTTCCGAAGGGAACTAAGCTATTTCGAGGTCAACATAC\n+TAAGCGCGAAGCTATTGAAGTTAGTTTAGAAAACAAGCACTTCTATTTCAAGAATTATGT\n+GTCAACTTCAATGGCTCCTATTATCTTTGGTGGATATGGACGAGCATATGATGCAATGGA\n+CCCCGCTGCATTGAACACAGATACATCGACTCCTAAAGAAGTGCTTGACTCTGTTTCAAC\n+TGTTCGGCCTGATAGTATTACTAACTCTGAAATGGGTGAATTGCGTTTAGCGTTCGTTAT\n+TTCTGGCGCAGAGAAAATAAAGACTATCGTAACCAATGCTGGAATCTCAGGATTGTCATT\n+TGAAGCTGAAGTTATTCTTCCTCGTGGTACTGTTCTTAGAATTGATAAAATGTATGGAAC\n+AGCTCAGAAACTTCAAGCTAATGACTACACAGCATCAAAGAGTGTTCTTATGGAATGCAC\n+TGTAGTATCTCCAGAACAATTATCTGAAACTACAATTTATGATGGCGATAAATTGTTAGA\n+AGGTGAATTGGTTGAATCTGATTATTCGTTCAGTTCTTTTATTGGTCAATTAAATGAAGC\n+TAAAGTTGAAACACCAGATTGGTTAGGTGAAGCTCTAGCATCATTTGTTGACATAAATAA\n+TTTACCAGAACGATTCATAAATTAATATTTTCACATGGACGTGAATTCAGAGAGGGCTTT\n+ATGGAAATTTTAAACGAAGTACTAGACGAAAGTAAACTGGATTTACCAGTTACGAACCTT\n+TATCCAAAGACGAAAATTCCACAAATTTTTGCTATTCAAACTAACTCCGAGGGTTCACTG\n+CCAGCATTCAGGATGTGTTCATATACATCTGGCGGTGATACCAATAAGAACGTTAAACCT\n+GGCGACAAAATGATTCATGTTGTTATGCTATCATTGAGCGAAAAAGGATCATTAGTTAAG\n+CTTAAAAACTTAGGCGGCGATCCAATTGGTGTTATCTCTACTACGTTCAATATCGTTTAT\n+TCAACGATGAAGCAGTATAAAATGGACGCATGCTTGTTCCGAATGGCCAAAAGCAAAATC\n+GGTGGACAAGCTCGTCAGATGCAGGTTATTATGGACCGACTCGTACGTTCTCGTACTGGT\n+GGTAAATTTGTTATCCTGAAAGAACTCTGGGATTATGATAAGAAGTACGCATATATTCTT\n+ATTCATCGTAAAAATGTTGATCTCTCAACCATCCCTGGCGTCCCAGAGATTGATACTGGA\n+CTGTTCACTGCAGTTGAAACTAAAGTTGGTGAAGTTTATGTTGAAAAGAAATCAGGTCAA\n+CAAGTAACTAAAGCCCAAGCCGTTGCTGCTTCTATTGCAGTCGAAAACGATAAGCGTTCA\n+GATCAAAACGTTATTTCTCGTGCTAAGATAAATCGTCGTCAAGCTATTGCTGCTCAGTAT\n+TCTGTTGATGCATCTAGCATCCAAGGCGATGATCGTGCTGCTGAAGAATTTAAACGCTTA\n+GAAGCTAAAGTTCCAGTTAAAAGCTCTAAAGGCGCTGAGTCATCAGACATGGTAGCAAAA\n+GTTAATACCATCGCTGACCGTCAAGGAAATGAGTATATCGGCAAAGTACTAAACTTCATC\n+ACTAATCCTGAAACATCTCAGGACACAGATGGTAAAGCATTGACTGCACGAATAGGTCAA\n+TTGCGCCAGTTATCTAAAATGCCTAAAGGTGCCATGTTATCAGGTGGATTTGAAACTGGT\n+GGTATGAAGTACTACATGGAAAACCAAAAAGAAATGTACAATGAAGTTCGTTCATTTGCT\n+CGATTGATAGCTGGGGTGAATACAACTAACTCCTTTCAGACGATGAAAGATTTAGTTAAA\n+ATGGCTTCAGCTGGAACTAGACCTGAAGATCGTGAACAGTTAATTGCAAATTTAATTGGA\n+TTAGCTTATAAAGAAATAAGTGCAATCATCAGAGATTCATACCAAACTGCAGCAAGTTTA\n+TCTAAAGAGAATGATCATTATTCTAAAGATGAAAAACAAGCTATCAGTGAATACTGCGCA\n+AACGCTTTCGAATACGTGAATATGTTCTTAATCGGTAAGCCGGAAGAAGGGTATTCAACT\n+TCTGATTCTCTCGAGATCATCGATAATATGGACTCTGCGTTTGAAAAAGGAACTCGTTTA\n+GACAAAGGTACATTATTGTATCGTGGCCAAAAATTAGACCTTCCTACA\n'
b
diff -r 3c4db8203fad -r 4c517a0041a8 test-data/blastxml/blastn-gene1.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/blastn-gene1.xml Wed Apr 24 02:29:32 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 3c4db8203fad -r 4c517a0041a8 test-data/blastxml/merlin.gff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/blastxml/merlin.gff Wed Apr 24 02:29:32 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 3c4db8203fad -r 4c517a0041a8 test-data/jbrowse2_result01.zip
b
Binary file test-data/jbrowse2_result01.zip has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 test-data/jbrowse2_result02.zip
b
Binary file test-data/jbrowse2_result02.zip has changed
b
diff -r 3c4db8203fad -r 4c517a0041a8 test-data/vcf/test.vcf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/vcf/test.vcf Wed Apr 24 02:29:32 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 3c4db8203fad -r 4c517a0041a8 test-data/vcf/test.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/vcf/test.xml Wed Apr 24 02:29:32 2024 +0000
b
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <genomes>
+            <genome>test-data/merlin.fa</genome>
+        </genomes>
+        <general>
+            <defaultLocation></defaultLocation>
+            <trackPadding>40</trackPadding>
+            <shareLink>true</shareLink>
+            <aboutDescription></aboutDescription>
+            <show_tracklist>true</show_tracklist>
+            <show_nav>true</show_nav>
+            <show_overview>false</show_overview>
+            <show_menu>true</show_menu>
+            <hideGenomeOptions>false</hideGenomeOptions>
+        </general>
+    </metadata>
+    <tracks>
+        <track cat="Default" format="vcf">
+            <files>
+                <trackFile path="test-data/vcf/test.vcf" ext="vcf" label="Basic"/>
+            </files>
+            <options>
+            </options>
+        </track>
+    </tracks>
+</root>
b
diff -r 3c4db8203fad -r 4c517a0041a8 tool_data_table_conf.xml.sample
--- a/tool_data_table_conf.xml.sample Sun Apr 21 04:42:29 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,7 +0,0 @@
-<tables>
-    <!-- Locations of all fasta files under genome directory -->
-    <table name="all_fasta" comment_char="#">
-        <columns>value, dbkey, name, path</columns>
-        <file path="tool-data/all_fasta.loc" />
-    </table>
-</tables>
b
diff -r 3c4db8203fad -r 4c517a0041a8 tool_data_table_conf.xml.test
--- a/tool_data_table_conf.xml.test Sun Apr 21 04:42:29 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,7 +0,0 @@
-<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>