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

Changeset 98:b1260bca5fdc (2024-06-05)
Previous changeset 97:74074746ccd8 (2024-06-01) Next changeset 99:990291e918c7 (2024-06-21)
Commit message:
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 44d8fc559ecf5463a8f753561976fa26686c96f6
modified:
autogenJB2.py
blastxml_to_gapped_gff3.py
gff3_rebase.py
jbrowse2.py
jbrowse2.xml
macros.xml
maf2bed.py
readme.rst
added:
all_fasta.loc.sample
tool_data_table_conf.xml.test
removed:
README.md
Screenshot at 2024-04-30 16-11-29.png
__pycache__/jbrowse2.cpython-310.pyc
dm4_in_jb2.png
jb210demotracks.png
jb2_urlconf.py
jbrowse2.py.apr17
jbrowse8.png
test-data/Merlin
test-data/bam/merlin-sample.bam.gz
test-data/blastxml/blastn-gene1.xml
test-data/blastxml/merlin.gff
test-data/dm3.cool
test-data/dm3.fasta
test-data/jbrowse2_result01.zip
test-data/jbrowse2_result02.zip
test-data/merlin_tab.maf
test-data/vcf/test.vcf
test-data/vcf/test.xml
b
diff -r 74074746ccd8 -r b1260bca5fdc Screenshot at 2024-04-30 16-11-29.png
b
Binary file Screenshot at 2024-04-30 16-11-29.png has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc __pycache__/jbrowse2.cpython-310.pyc
b
Binary file __pycache__/jbrowse2.cpython-310.pyc has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc all_fasta.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/all_fasta.loc.sample Wed Jun 05 10:00:07 2024 +0000
b
@@ -0,0 +1,18 @@
+#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 74074746ccd8 -r b1260bca5fdc autogenJB2.py
--- a/autogenJB2.py Sat Jun 01 05:37:13 2024 +0000
+++ b/autogenJB2.py Wed Jun 05 10:00:07 2024 +0000
[
@@ -77,7 +77,6 @@
                     for i, x in enumerate(genome_paths)
                 ],
             )
-            logging.debug("@@@autogenJB2 paths=%s, genomes=%s" % (genome_paths, genomes))
             assref_name = jc.process_genomes(genomes[0])
             if not default_session_data.get(assref_name, None):
                 default_session_data[assref_name] = {
@@ -90,6 +89,7 @@
                     },
                 }
             listtracks = trackList
+            # foo.paf must have a foo_paf.fasta or fasta.gz to match
             tnames = [x[2] for x in listtracks]
             texts = [x[1] for x in listtracks]
             for i, track in enumerate(listtracks):
@@ -104,20 +104,22 @@
                 if tpath.startswith("http://") or tpath.startswith("https://"):
                     useuri = "yes"
                 if trext == "paf":
-                    refdat = ["%s ~ %s" % (x[0],x[2]) for x in listtracks if x[1] in ["fasta", "fasta.gz"]]
-                    if len(refdat) == 0:
+                    refname = trackname + "_paf.fasta"
+                    refdat = [x[2] for x in listtracks if x[2] == refname]
+                    if not refdat:
                         jc.logging.warn(
-                            "!! No reference file for %s found. Using main reference"
-                            % (refname)
+                            "No reference file %s corresponding to paf file %s found. Not building - there must be a corresponding fasta for each paf"
+                            % (refname, trackname)
                         )
-                        refdat = ["%s ~ %s" % (genomes[0].path, assref_name),]
+                        sys.exit(3)
                     else:
                         track_conf.update(
                             {
                                 "conf": {
                                     "options": {
                                         "paf": {
-                                            "genome": ",".join(refdat)
+                                            "genome": refdat,
+                                            "genome_label": trackname,
                                         }
                                     }
                                 }
@@ -140,7 +142,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]
@@ -222,5 +224,5 @@
             # jc.text_index() not sure what broke here.
     else:
         sys.stderr.write(
-            "!!!! Collection has no suitable trackfiles for autogenJB2 - nothing to process"
+            "Collection has no suitable trackfiles for autogenJB2 - nothing to process"
         )
b
diff -r 74074746ccd8 -r b1260bca5fdc blastxml_to_gapped_gff3.py
--- a/blastxml_to_gapped_gff3.py Sat Jun 01 05:37:13 2024 +0000
+++ b/blastxml_to_gapped_gff3.py Wed Jun 05 10:00:07 2024 +0000
[
@@ -32,7 +32,7 @@
 
         recid = record.query
         if " " in recid:
-            recid = recid[0 : recid.index(" ")]
+            recid = recid[0: recid.index(" ")]
 
         rec = SeqRecord(Seq("ACTG"), id=recid)
         for idx_hit, hit in enumerate(record.alignments):
@@ -72,7 +72,7 @@
                     qualifiers["blast_" + prop] = getattr(hsp, prop, None)
 
                 desc = hit.title.split(" >")[0]
-                qualifiers["description"] = desc[desc.index(" ") :]
+                qualifiers["description"] = desc[desc.index(" "):]
 
                 # This required a fair bit of sketching out/match to figure out
                 # the first time.
@@ -161,9 +161,9 @@
     fm = ""
     fs = ""
     for position in re.finditer("-", query):
-        fq += query[prev : position.start()]
-        fm += match[prev : position.start()]
-        fs += subject[prev : position.start()]
+        fq += query[prev: position.start()]
+        fm += match[prev: position.start()]
+        fs += subject[prev: position.start()]
         prev = position.start() + 1
     fq += query[prev:]
     fm += match[prev:]
b
diff -r 74074746ccd8 -r b1260bca5fdc dm4_in_jb2.png
b
Binary file dm4_in_jb2.png has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc gff3_rebase.py
--- a/gff3_rebase.py Sat Jun 01 05:37:13 2024 +0000
+++ b/gff3_rebase.py Wed Jun 05 10:00:07 2024 +0000
[
@@ -63,13 +63,8 @@
             else:
                 yield feature
 
-        if hasattr(feature, "sub_features"):
-            for x in feature_lambda(
-                feature.sub_features,
-                test,
-                test_kwargs,
-                subfeatures=subfeatures,
-            ):
+        if hasattr(feature, 'sub_features'):
+            for x in feature_lambda(feature.sub_features, test, test_kwargs, subfeatures=subfeatures):
                 yield x
 
 
@@ -79,8 +74,8 @@
     For every feature, check that at least one value in
     feature.quailfiers(kwargs['qualifier']) is in kwargs['attribute_list']
     """
-    for attribute_value in feature.qualifiers.get(kwargs["qualifier"], []):
-        if attribute_value in kwargs["attribute_list"]:
+    for attribute_value in feature.qualifiers.get(kwargs['qualifier'], []):
+        if attribute_value in kwargs['attribute_list']:
             return True
     return False
 
@@ -95,12 +90,12 @@
             # If it's an interpro specific gff3 file
             if interpro:
                 # Then we ignore polypeptide features as they're useless
-                if feature.type == "polypeptide":
+                if feature.type == 'polypeptide':
                     continue
                 # If there's an underscore, we strip up to that underscore?
                 # I do not know the rationale for this, removing.
                 # if '_' in parent_feature_id:
-                # parent_feature_id = parent_feature_id[parent_feature_id.index('_') + 1:]
+                    # parent_feature_id = parent_feature_id[parent_feature_id.index('_') + 1:]
 
             try:
                 child_features[parent_feature_id].append(feature)
@@ -117,7 +112,7 @@
         start *= 3
         end *= 3
 
-    if parent.location.strand != None and parent.location.strand >= 0:
+    if parent.location.strand >= 0:
         ns = parent.location.start + start
         ne = parent.location.start + end
         st = +1
@@ -136,33 +131,31 @@
         ns %= 3
     if ne < 0:
         ne %= 3
-    if ns > ne:
-        ne, ns = ns, ne  # dunno why but sometimes happens
+
     feature.location = FeatureLocation(ns, ne, strand=st)
 
-    if hasattr(feature, "sub_features"):
+    if hasattr(feature, 'sub_features'):
         for subfeature in feature.sub_features:
             __update_feature_location(subfeature, parent, protein2dna)
 
 
-def rebase(parent, child, interpro=False, protein2dna=False, map_by="ID"):
+def rebase(parent, child, interpro=False, protein2dna=False, map_by='ID'):
     # get all of the features we will be re-mapping in a dictionary, keyed by parent feature ID
     child_features = __get_features(child, interpro=interpro)
 
     for rec in GFF.parse(parent):
         replacement_features = []
         for feature in feature_lambda(
-            rec.features,
-            # Filter features in the parent genome by those that are
-            # "interesting", i.e. have results in child_features array.
-            # Probably an unnecessary optimisation.
-            feature_test_qual_value,
-            {
-                "qualifier": map_by,
-                "attribute_list": child_features.keys(),
-            },
-            subfeatures=False,
-        ):
+                rec.features,
+                # Filter features in the parent genome by those that are
+                # "interesting", i.e. have results in child_features array.
+                # Probably an unnecessary optimisation.
+                feature_test_qual_value,
+                {
+                    'qualifier': map_by,
+                    'attribute_list': child_features.keys(),
+                },
+                subfeatures=False):
 
             # Features which will be re-mapped
             to_remap = child_features[feature.id]
@@ -173,7 +166,7 @@
                 __update_feature_location(x, feature, protein2dna)
 
                 if interpro:
-                    for y in ("status", "Target"):
+                    for y in ('status', 'Target'):
                         try:
                             del x.qualifiers[y]
                         except Exception:
@@ -188,28 +181,14 @@
         GFF.write([rec], sys.stdout)
 
 
-if __name__ == "__main__":
-    parser = argparse.ArgumentParser(
-        description="rebase gff3 features against parent locations", epilog=""
-    )
-    parser.add_argument(
-        "parent", type=argparse.FileType("r"), help="Parent GFF3 annotations"
-    )
-    parser.add_argument(
-        "child",
-        type=argparse.FileType("r"),
-        help="Child GFF3 annotations to rebase against parent",
-    )
-    parser.add_argument(
-        "--interpro",
-        action="store_true",
-        help="Interpro specific modifications",
-    )
-    parser.add_argument(
-        "--protein2dna",
-        action="store_true",
-        help="Map protein translated results to original DNA data",
-    )
-    parser.add_argument("--map_by", help="Map by key", default="ID")
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description='rebase gff3 features against parent locations', epilog="")
+    parser.add_argument('parent', type=argparse.FileType('r'), help='Parent GFF3 annotations')
+    parser.add_argument('child', type=argparse.FileType('r'), help='Child GFF3 annotations to rebase against parent')
+    parser.add_argument('--interpro', action='store_true',
+                        help='Interpro specific modifications')
+    parser.add_argument('--protein2dna', action='store_true',
+                        help='Map protein translated results to original DNA data')
+    parser.add_argument('--map_by', help='Map by key', default='ID')
     args = parser.parse_args()
     rebase(**vars(args))
b
diff -r 74074746ccd8 -r b1260bca5fdc jb210demotracks.png
b
Binary file jb210demotracks.png has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc jb2_urlconf.py
--- a/jb2_urlconf.py Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,13 +0,0 @@
-inconf = open("config.json", "r").readlines()
-with open("config.json.local", "w") as bak:
-    bak.write("".join(inconf))
-urlbase = "https://galaxy.genomicsvl-students.cloud.edu.au/jbrowse/hum/"
-utag = '"uri":'
-for i, row in enumerate(inconf):
-    ispath = False
-    if row.strip().startswith(utag):
-        ispath = True
-        parth = row.split(utag)[1].strip().replace('"', "").replace("'", "")
-        inconf[i] = '%s "%s%s"' % (utag, urlbase, parth)
-with open("config.json", "w") as outconf:
-    outconf.write("".join(inconf))
b
diff -r 74074746ccd8 -r b1260bca5fdc jbrowse2.py
--- a/jbrowse2.py Sat Jun 01 05:37:13 2024 +0000
+++ b/jbrowse2.py Wed Jun 05 10:00:07 2024 +0000
[
b'@@ -3,6 +3,7 @@\n import argparse\n import binascii\n import datetime\n+# import hashlib\n import json\n import logging\n import os\n@@ -20,9 +21,9 @@\n log = logging.getLogger("jbrowse")\n \n JB2VER = "v2.11.0"\n-# version pinned if cloning - but not cloning now\n+# version pinned if cloning - but not used until now\n logCommands = True\n-# useful for seeing what\'s being written but NOT for production setups\n+# useful for seeing what\'s being written but not for production setups\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@@ -41,6 +42,32 @@\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@@ -398,7 +425,6 @@\n             return self.outdir\n         else:\n             return subprocess.check_output(["pwd"]).decode("utf-8").strip()\n-            # return None\n \n     def subprocess_check_call(self, command, output=None, cwd=True):\n         if output:\n@@ -429,7 +455,7 @@\n             log.error(command)\n             log.error(output)\n             log.error(err)\n-            raise RuntimeError("Command failed with exit code %s" % (retcode))\n+            raise RuntimeError(f"Command ( {command} ) failed with exit code {retcode}")\n \n     def subprocess_check_output(self, command):\n         if logCommands:\n@@ -473,7 +499,7 @@\n                 nrow = len(fl)\n             except Exception:\n                 nrow = 0\n-        logging.debug("### getNrow %s returning %d" % (url, nrow))\n+        logging.debug("getNrow %s returning %d" % (url, nrow))\n         return nrow\n \n     def process_genomes(self, genomes):\n@@ -514,9 +540,6 @@\n         return primaryGenome\n \n     def make_assembly(self, fapath, gname, useuri):\n-        """added code to grab the first contig name and length for broken default session from Anthony and Helena\'s code\n-        that poor Bjoern is trying to figure out.\n-        """\n         if useuri:\n             faname = fapath\n             scontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n@@ -675,8 +698,8 @@\n             ]\n         }\n         categ = trackData["category"]\n-        fname = tId\n-        dest = "%s/%s" % (self.outdir, fname)\n+        fname = f"{tId}"\n+        dest = os.path.join(self.outdir, fname)\n         gname = trackData["assemblyNames"]\n \n         cmd = [\n@@ -931,10 +954,6 @@\n \n     def add_vcf(self, data, trackData):\n         tId = trackData["label"]\n-        # url = "%s/api/datasets/%s/display" % (\n-        # self.giURL,\n-        # trackData["metadata"]["dataset_id"],\n-        # )\n         categ = trackData["category"]\n         useuri = trackData["useuri"].lower() == "yes"\n         if useuri:\n@@ -1195,14 +1214,29 @@\n                 "category": category,\n                 "style": {},\n             }\n+\n+            # hashData = [\n+            #    str(dataset_path),\n+            #    track_human_label,\n+            #    track["category"],\n+            # ]\n+            # hashData = "|".join(hashData).encode("utf-8")\n+            # hash_string = hashlib.md5(hashData).hexdigest()\n+\n             outputTrackConfig["assemblyNames"] = track["assemblyNames"]\n             outputTrackConfig["key"] = track_human_label\n             outputTrackConfig["useuri"] = useuri\n             outputTrackConfig["path"] = datase'..b'               "offsetPx": 0,\n+                "minimized": False,\n+                "tracks": tracks_data,\n+            }\n             first = [x for x in self.ass_first_contigs if x[0] == gnome]\n-            drdict = {\n+            if len(first) > 0:\n+                [gnome, refName, end] = first[0]\n+                start = 0\n+                end = int(end)\n+                drdict = {\n+                    "refName": refName,\n+                    "start": start,\n+                    "end": end,\n                     "reversed": False,\n                     "assemblyName": gnome,\n                 }\n-            if len(first) > 0:\n-                [gnome, refName, end] = first[0]\n-                drdict["refName"] = refName\n-                drdict["start"] = 0\n-                end = int(end)\n-                drdict["end"] = end        \n             else:\n                 ddl = default_data.get("defaultLocation", None)\n                 if ddl:\n@@ -1370,13 +1404,6 @@\n                             "@@@ regexp could not match contig:start..end in the supplied location %s - please fix"\n                             % ddl\n                         )\n-            view_json = {\n-                "type": "LinearGenomeView",\n-                "offsetPx": 0,\n-                "bpPerPx" : bpPerPx,\n-                "minimized": False,\n-                "tracks": tracks_data\n-            }\n             if drdict.get("refName", None):\n                 # TODO displayedRegions is not just zooming to the region, it hides the rest of the chromosome\n                 view_json["displayedRegions"] = [\n@@ -1392,10 +1419,12 @@\n         for key, value in mapped_chars.items():\n             session_name = session_name.replace(value, key)\n         session_json["name"] = session_name\n+\n         if "views" not in session_json:\n             session_json["views"] = session_views\n         else:\n             session_json["views"] += session_views\n+\n         pp = json.dumps(session_views, indent=2)\n         config_json["defaultSession"] = session_json\n         self.config_json.update(config_json)\n@@ -1430,33 +1459,6 @@\n         https://github.com/GMOD/jbrowse-components/discussions/3568\n         https://github.com/GMOD/jbrowse-components/pull/4148\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         new_index = "Nothing written"\n         session_spec = {"views": []}\n         logging.debug("def ass_first=%s\\ndata=%s" % (self.ass_first_contigs, data))\n@@ -1522,8 +1524,13 @@\n             json.dump(self.config_json, config_file, indent=2)\n \n     def clone_jbrowse(self, realclone=False):\n-        """Clone a JBrowse directory into a destination directory. This also works in Biocontainer testing now\n-        Leave as True between version updates on temporary tools - requires manual conda trigger :(\n+        """\n+            Clone a JBrowse directory into a destination directory.\n+\n+            `realclone=true` will use the `jbrowse create` command.\n+            To allow running on internet-less compute and for reproducibility\n+            use frozen code with `realclone=false\n+\n         """\n         dest = self.outdir\n         if realclone:\n'
b
diff -r 74074746ccd8 -r b1260bca5fdc jbrowse2.py.apr17
--- a/jbrowse2.py.apr17 Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,1772 +0,0 @@\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 74074746ccd8 -r b1260bca5fdc jbrowse2.xml
--- a/jbrowse2.xml Sat Jun 01 05:37:13 2024 +0000
+++ b/jbrowse2.xml Wed Jun 05 10:00:07 2024 +0000
[
b'@@ -1,4 +1,4 @@\n-<tool id="jbrowse2" name="JBrowse2" version="@TOOL_VERSION@+@WRAPPER_VERSION@_17" profile="22.05">\n+<tool id="jbrowse2" name="JBrowse2" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="22.05">\n     <description>genome browser</description>\n     <macros>\n         <import>macros.xml</import>\n@@ -7,51 +7,50 @@\n     <xrefs>\n         <xref type="bio.tools">jbrowse2</xref>\n     </xrefs>\n-    <expand macro="requirements" />\n-    <expand macro="creators"/>\n-    <version_command>python \'${__tool_directory__}/jbrowse2.py\' --version</version_command>\n+    <expand macro="requirements"/>\n     <required_files>\n-        <include path="autogenJB2.py" />\n-        <include path="blastxml_to_gapped_gff3.py" />\n-        <include path="convertMAF.sh" />\n-        <include path="gff3_rebase.py" />\n-        <include path="jb2_urlconf.py" />\n-        <include path="jb2_webserver.py" />\n-        <include path="jbrowse2.py" />\n-        <include path="maf2bed.py" />\n+        <include path="autogenJB2.py"/>\n+        <include path="blastxml_to_gapped_gff3.py"/>\n+        <include path="convertMAF.sh"/>\n+        <include path="gff3_rebase.py"/>\n+        <include path="jb2_webserver.py"/>\n+        <include path="jbrowse2.py"/>\n+        <include path="maf2bed.py"/>\n     </required_files>\n+    <version_command>python \'${__tool_directory__}/jbrowse2.py\' --version</version_command>\n     <command detect_errors="aggressive"><![CDATA[\n mkdir -p \'$output.files_path\' &&\n cp \'$trackxml\' \'$output.files_path/galaxy.xml\' &&\n-export JBROWSE2_PATH=\\$(dirname \\$(which jbrowse))/../opt/jbrowse2  &&\n+export JBROWSE2_PATH=\\$(dirname \\$(which jbrowse))/../opt/jbrowse2 &&\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-            #set refs=[($subCol[x],$subcol[x].ext,x) for x in $subCol.keys() if $subCol[x].ext in [\'fasta.gz\',\'fasta\']]\n             #if len($pafs) > 0:\n-                 --pafmeta \'$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+                    --pafreferencemeta \'$ref\'\n                 #end for\n             #end if\n         #else if $autoCollection[$key].ext == \'fasta\':\n-          --referencemeta \'$autoCollection[$key],$autoCollection[$key].ext,$key\'\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+            --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+            --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+        cd \'$output.files_path\' &&\n+        zip -r - . > \'$output\'\n     #else\n   '..b'-                    <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_archive_member path="A.gff"/>\n+                    <has_archive_member path="B.gff"/>\n+                    <has_archive_member path="C.gff"/>\n+                    <has_archive_member path="interpro.gff"/>\n+                    <has_archive_member path="1.gff"/>\n+                    <has_archive_member path="2.gff"/>\n+                    <has_archive_member path="galaxy.xml">\n+                        <is_valid_xml/>\n+                        <has_n_elements_with_path path="./metadata/general/session_name" n="1"/>\n+                        <element_text_is path="./metadata/general/session_name" text="New JBrowse2 session"/>\n+                    </has_archive_member>\n                 </assert_contents>\n             </output>\n         </test>\n-        <!-- TODO add a synteny test -->\n-        <!-- TODO add a bam and a cram test -->\n-        <!-- TODO add an hic test -->\n-        <!-- TODO add a vcf_bgzip test -->\n+        <test>\n+            <repeat name="assemblies">\n+                <conditional name="reference_genome">\n+                    <param name="genome_type_select" value="history"/>\n+                    <param name="genome" value="merlin.fa"/>\n+                </conditional>\n+                <repeat name="track_groups">\n+                    <param name="category" value="Auto Coloured"/>\n+                    <repeat name="data_tracks">\n+                        <conditional name="data_format">\n+                            <param name="data_format_select" value="cram"/>\n+                            <param name="annotation" value="cram/merlin-sample.cram"/>\n+                        </conditional>\n+                    </repeat>\n+                </repeat>\n+            </repeat>\n+            <section name="jbgen">\n+                <param name="zipOut" value="true"/>\n+            </section>\n+            <output name="output" ftype="zip">\n+                <assert_contents>\n+                    <!-- roughly 590 files in an archive -->\n+                    <has_archive_member path=".*" n="608" delta="30"/>\n+                    <has_archive_member path="index.html"/>\n+                    <has_archive_member path="static/media/roboto-latin-400-normal.3f2b9a42f643e62a49b7.woff"/>\n+                    <has_archive_member path="manifest.json">\n+                        <has_text text="favicon.ico"/>\n+                        <has_text text="background_color"/>\n+                    </has_archive_member>\n+                    <has_archive_member path="merlin.fa.fa.gz.fai"/>\n+                    <has_archive_member path="galaxy.xml">\n+                        <is_valid_xml/>\n+                        <has_n_elements_with_path path="./metadata/general/session_name" n="1"/>\n+                        <element_text_is path="./metadata/general/session_name" text="New JBrowse2 session"/>\n+                    </has_archive_member>\n+                </assert_contents>\n+            </output>\n+        </test>\n     </tests>\n     <help><![CDATA[\n \n JBrowse2-in-Galaxy\n ==================\n \n-JBrowse2-in-Galaxy offers a highly configurable, workflow-compatible\n-alternative to JBrowse1-in-Galaxy and Trackster.\n+JBrowse2-in-Galaxy offers a highly configurable, workflow-compatible Genome viewer.\n \n Compared to JBrowse1-in-Galaxy, there is no support for alternative 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+and detailed track styling is not yet implemented. Please contact us if you are missing features.\n \n Use and local viewing\n =====================\n'
b
diff -r 74074746ccd8 -r b1260bca5fdc jbrowse8.png
b
Binary file jbrowse8.png has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc macros.xml
--- a/macros.xml Sat Jun 01 05:37:13 2024 +0000
+++ b/macros.xml Wed Jun 05 10:00:07 2024 +0000
[
@@ -1,5 +1,5 @@
 <macros>
-    <token name="@TOOL_VERSION@">2.11.0</token>
+    <token name="@TOOL_VERSION@">2.11.1</token>
     <xml name="edamInc">
         <edam_topics>
             <edam_topic>topic_3307</edam_topic>
@@ -13,7 +13,7 @@
     <xml name="requirements">
         <requirements>
             <requirement type="package" version="@TOOL_VERSION@">jbrowse2</requirement>
-            <requirement type="package" version="1.81">biopython</requirement>
+            <requirement type="package" version="1.82">biopython</requirement>
             <requirement type="package" version="0.7.1">bcbio-gff</requirement>
             <requirement type="package" version="1.19">samtools</requirement>
             <requirement type="package" version="6.0.1">pyyaml</requirement>
@@ -25,24 +25,15 @@
         </requirements>
     </xml>
     <token name="@DATA_DIR@">\$GALAXY_JBROWSE_SHARED_DIR</token>
-    <token name="@WRAPPER_VERSION@">galaxy2</token>
-    <token name="@ATTRIBUTION@"><![CDATA[
-**Attribution**
-This Galaxy tool relies on the JBrowse2, maintained by the GMOD Community. The Galaxy wrapper is 
-maintained by Ross Lazarus and Bjoern Gruening until the IUC complete their own.
-]]>
-    </token>
+    <token name="@VERSION_SUFFIX@">0</token>
     <xml name="creators">
         <creator>
-            <person givenName="Helena" familyName="Rasche" url="https://github.com/hexylena" />
-            <person givenName="Anthony" familyName="Bretaudeau" url="https://github.com/abretaud" />
-            <person givenName="Ross" familyName="Lazarus" url="https://github.com/fubar2/" />
+            <person givenName="Helena" familyName="Rasche" url="https://github.com/hexylena"/>
+            <person givenName="Anthony" familyName="Bretaudeau" url="https://github.com/abretaud"/>
+            <person givenName="Ross" familyName="Lazarus" url="https://github.com/fubar2/"/>
         </creator>
     </xml>
-    <xml name="genome_selector"
-        token_help=""
-        token_label="Fasta sequences"
-        token_optional="False" >
+    <xml name="genome_selector" token_help="" token_label="Fasta sequences" token_optional="False">
         <conditional name="reference_genome">
             <param name="genome_type_select" type="select" label="Reference genome to display" help="Built-in references">
                 <option selected="True" value="indexed">Use a built-in genome</option>
@@ -112,12 +103,11 @@
                 <when value="collect">
                     <param name="autoCollection" type="data_collection" label="Collection of bed, bam and other track files"/>
                 </when>
-                <when value="form">
-                </when>
+                <when value="form"/>
             </conditional>
-            <param name="zipOut" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Create a zip archive for downloading rather than viewing " help="Default is to make an interactive browser appear when the 'eye' icon is activated"/>
+            <param name="zipOut" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Create a zip archive for downloading rather than viewing" help="Default is to make an interactive browser appear when the 'eye' icon is activated"/>
             <param name="defaultLocation" type="text" value="" label="Subset to display to new users" help="Initial subset to be shown for users who have never visited the browser before. Example: 'ctgA:1234..5678"/>
-            <param name="session_name" type="text" value="New JB2 session" label="Session name" help="Displayed at the top of the window"/>
+            <param name="session_name" type="text" value="New JBrowse2 session" label="Session name" help="Displayed at the top of the window"/>
             <param name="enableAnalytics" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Enable analytics" help="Will send usage data to Google Analytics, see https://github.com/GMOD/jbrowse-components/issues/1166"/>
             <param name="primary_color" type="color" value="#0D233F" label="Primary color">
                 <sanitizer>
b
diff -r 74074746ccd8 -r b1260bca5fdc maf2bed.py
--- a/maf2bed.py Sat Jun 01 05:37:13 2024 +0000
+++ b/maf2bed.py Wed Jun 05 10:00:07 2024 +0000
[
@@ -32,7 +32,7 @@
     elif line[0] == 'a':
         score = int(line[1].split('=')[1])
         if id > 0:
-            sys.stdout.write('\t'.join([chrom, '%d' % start, '%d' % end, f"{sys.argv[1]}_{id}", '%d' % score, buffer])+ '\n')
+            sys.stdout.write('\t'.join([chrom, '%d' % start, '%d' % end, f"{sys.argv[1]}_{id}", '%d' % score, buffer]) + '\n')
         id += 1
         buffer = ''
     elif line[0] == 's':
b
diff -r 74074746ccd8 -r b1260bca5fdc readme.rst
--- a/readme.rst Sat Jun 01 05:37:13 2024 +0000
+++ b/readme.rst Wed Jun 05 10:00:07 2024 +0000
b
@@ -1,6 +1,8 @@
 JBrowse2 in Galaxy
 ==================
 
+    JBrowse2 is a fast, embeddable genome browser built completely with
+    JavaScript and HTML5
 
 Added April 2024:
 Multiple independent assembly/track sets in the same browser now working
@@ -15,7 +17,6 @@
 Testing history added with tests of the 8 simple formats
 hic and paf need small tests but work with big ones...
 
-
 Added Mar 8:
  - URI as data source for tracks
  - Autogenerate from a collection now builtin to advanced options - ignores form
@@ -40,7 +41,7 @@
 
 .. image:: dm4_in_jb2.png
 
-Other samples
+Other tracks
 
 .. image:: jb2_samplerMay5.png
 
@@ -80,17 +81,17 @@
 
 - 2.10.0+galaxy2
 
-- UPDATED existing JBrowse1.16.11 code to JBrowse 2.10.0
-- was working well enough for VGP when previous PR discovered
-   - too late to backport all the fixes
-   - working default session and some other ideas copied instead.
-- seems to work well with defaults.
-- need to document and implement track settings by running the browser locally.
-- works well enough to be useful in workflows such as TreeValGal.
-- JB2 seems to set defaults wisely.
-- not yet ideal for users who need fine grained track control.
-- synteny (paf + reference) now working
-- rehomed at https://github.com/usegalaxy-eu/temporary-tools/tree/master/jbrowse2 while IUC reviews are slowly sorted out.
+    - UPDATED existing JBrowse1.16.11 code to JBrowse 2.10.0
+    - was working well enough for VGP when previous PR discovered
+        - too late to backport all the fixes
+        - working default session and some other ideas copied instead.
+    - seems to work well with defaults.
+    - need to document and implement track settings by running the browser locally.
+    - works well enough to be useful in workflows such as TreeValGal.
+    - JB2 seems to set defaults wisely.
+    - not yet ideal for users who need fine grained track control.
+    - synteny (paf + reference) now working
+    - rehomed at https://github.com/usegalaxy-eu/temporary-tools/tree/master/jbrowse2 while IUC reviews are slowly sorted out.
 
 
 Wrapper License (MIT/BSD Style)
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/Merlin
--- a/test-data/Merlin Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,2881 +0,0 @@\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 74074746ccd8 -r b1260bca5fdc test-data/bam/merlin-sample.bam.gz
b
Binary file test-data/bam/merlin-sample.bam.gz has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/blastxml/blastn-gene1.xml
--- a/test-data/blastxml/blastn-gene1.xml Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,128 +0,0 @@\n-<?xml version="1.0"?>\n-<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">\n-<BlastOutput>\n-  <BlastOutput_program>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 74074746ccd8 -r b1260bca5fdc test-data/blastxml/merlin.gff
--- a/test-data/blastxml/merlin.gff Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,1230 +0,0 @@\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 74074746ccd8 -r b1260bca5fdc test-data/dm3.cool
b
Binary file test-data/dm3.cool has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/dm3.fasta
--- a/test-data/dm3.fasta Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,401577 +0,0 @@\n->NT_037436.4 Drosophila melanogaster chromosome 3L\n-TAGGGAGAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTCTTTGATTTTTTGGCAACCC\n-AAAATGGTGGCGGATGAACGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAATAAATTCATTGCAA\n-CGTTAAATACAGCACAATATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTAATGAGTGCCT\n-CTCGTTCTCTGTCTTATATTACCGCAAACCCAAAAAGACAATACACGACAGAGAGAGAGAGCAGCGGAGA\n-TATTTAGATTGCCTATTAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTCTGCTCTCTATATAA\n-TGACTGCCTCTCATTCTGTCTTATTTTACCGCAAACCCAAATCGACAATGCACGACAGAGGAAGCAGAAC\n-AGATATTTAGATTGCCTCTCATTTTCTCTCCCATATTATAGGGAGAAATATGATCGCGTATGCGAGAGTA\n-GTGCCAACATATTGTGCTCTTTGATTTTTTGGCAACCCAAAATGGTGGCGGATGAACGAGATGATAATAT\n-ATTCAAGTTGCCGCTAATCAGAAATAAATTCATTGCAACGTTAAATACAGCACAATATATGATCGCGTAT\n-GCGAGAGTAGTGCCAACATATTGTGCTAATGAGTGCCTCTCGTTCTCTGTCTTATATTACCGCAAACCCA\n-AAAAGACAATACACGACAGAGAGAGAGAGCAGCGGAGATATTTAGATTGCCTATTAAATATGATCGCGTA\n-TGCGAGAGTAGTGCCAACATATTCTGCTCTCTACATAATGACTGCCTCTCATTCTGTCTTATTTTACCGC\n-AAACCCAAATCGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTGCCTCTCATTTTCTCTCCC\n-ATATTATAGGGAGAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTCTTTGATTTTTTGG\n-CAACCCAAAATGGTGGCGGATGAACGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAATAAATTCA\n-TTGCAACGTTAAATACAGCACAATATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTAATGA\n-GTGCCTCTCGTTCTCTGTCTTATATTACCGCAAACCCAAAAAGACAATACACGACAGAGAGAGAGAGCAG\n-CGGAGATATTTAGATTGCCTATTAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTCTGCTCTCT\n-ATATAATGACTGCCTCTCATTCTGTCTTATTTTACCGCAAACCCAAATCGACAATGCACGACAGAGGAAG\n-CAGAACAGATATTTAGATTGCCTCTCATTTTCTCTCCCATATTATAGGGAGAAATATGATCGCGTATGCG\n-AGAGTAGTGCCAACATATTGTGCTCTTTGATTTTTTGGCAACCCAAAATGGTGGCGGATGAACGAGATGA\n-TAATATATTCAAGTTGCCGCTAATCAGAAATAAATTCATTGCAACGTTAAATACAGCACAATATATGATC\n-GCGTATGCGAGAGTAGTGCCAACATATTGTGCTAATGAGTGCCTCTCGTTCTCTGTCTTATATTACCGCA\n-AACCCAAAAAGACAATACACGACAGAGAGAGAGAGCAGCGGAGATATTTAGATTGCCTATTAAATATGAT\n-CGCGTATGCGAGAGTAGTGCCAACATATTCTGCTCTCTATATAATGACTGCCTCTCATTCTGTCTTATTT\n-TACCGCAAACCCAAATCGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTGCCTCTCATTTTC\n-TCTCCCATATTATAGGGAGAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTCTTTGATT\n-TTTTGGCAACCCAAAATGGTGGCGGATGAACGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAATA\n-AATTCATTGCAACGTTAAATACAGCACAATATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGC\n-TAATGAGTGCCTCTCGTTCTCTGTCTTATATTACCGCAAACCCAAAAAGACAATACACGACAGAGAGAGA\n-GAGCAGCGGAGATATTTAGATTGCCTATTAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTCTG\n-CTCTCTATATAATGACTGCCTCTCATTCTGTCTTATTTTACCGCAAACCCAAATCGACAATGCACGACAG\n-AGGAAGCAGAACAGATATTTAGATTGCCTCTCATTTTCTCTCCCATATTATAGGGAGAAATATGATCGCG\n-TATGCGAGAGTAGTGCCAACATATTGTGCTCTTTGATTTTTTGGCAACCCAAAATGGTGGCGGATGAACG\n-AGATGATAATATATTCAAGTTGCCGCTAATCAGAAATAAATTCATTGCAACGTTAAATACAGCACAATAT\n-ATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTAATGAGTGCCTCTCGTTCTCTGTCTTATATT\n-ACCGCAAACCCAAAAAGACAATACACGACAGAGAGAGCAGCGGAGATATTTAGATTGCCTATTAAATATG\n-ATCGCGTATGCGAGAGTAGTGCCAACATATTCTGCTCTCTATATAATGACTGCCTCTCATTCTGTCTTAT\n-TTTACCGCAAACCCAAATCGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTGCCTCTCATTT\n-TCTCTCCCATATTATAGGGAGAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTCTTTGA\n-TTTTTTGGCAACCCAAAATGGTGGCGGATGAACGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAA\n-TAAATTCATTGCAACGTTAAATACAGCACAATATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGT\n-GCTAATGAGTGCCTCTCGTTCTCTGTCTTATATTACCGCAAACCCAAAAAGACAATACACGACAGAGAGA\n-GAGAGCAGCGGAGATATTTAGATTGCCTATTAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTC\n-TGCTCTCTATATAATGACTGCCTCTCATTCTGTCTTATTTTACCGCAAACCCAAATCGACAATGCACGAC\n-AGAGGAAGCAGAACAGATATTTAGATTGCCTCTCATTTTCTCTCCCATATTATAGGGAGAAATATGATCG\n-CGTATGCGAGAGTAGTGCCAACATATTGTGCTCTTTGATTTTTTGGCAACCCAAAATGGTGGCGGATGAA\n-CGAGATGATAATATATTCAAGTTGCCGCTAATCAGAAATAAATTCATTGCAACGTTAAATACAGCACAAT\n-ATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCTAATGAGTGCCTCTCGTTCTCTGTCTTATA\n-TTACCGCAAACCCAAAAAGACAATACACGACAGAGAGAGAGAGCAGCGGAGATATTTAGATTGCCTATTA\n-AATATGATCGCGTATGCGAGAGTAGTGCCAACATATTCTGCTCTCTATATAATGACTGCCTCTCATTCTG\n-TCTTATTTTACCGCAAACCCAAATCGACAATGCACGACAGAGGAAGCAGAACAGATATTTAGATTGCCTC\n-TCATTTTCTCTCCCATATTATAGGGAGAAATATGATCGCGTATGCGAGAGTAGTGCCAACATATTGTGCT\n-CTTTGATTTTTTGGCAACCCAAAATGGTGGCGGATGAACGAGATGATAATATATTCAAGTTGCCGCTAAT\n-CAGAAATAAATTCATTGCAACGTTAAATACAGCACAA'..b'CTAATAAATTAATAACATTAATTTCCCCTGAATTGCAGAAAGTTGGATTCAACTTAAGG\n-AAATGGATTTCCAACAATTCCAAAATATTAACCACTGTGGAGGACACAGGGGACAATAAGGTTCTCAATA\n-TTATCGAAAATGAATGTGTTAAAACTTTAGGACTAAAATGGGAACATCAAAATGATTTATTTAAATTCAG\n-CGTAAATTGTAATGAATCAAAAAATATAAATAAGCGCGTTGTGTTATCAACGCTAGCAAAAATATATGAT\n-CCGTTAGGATGGTTGGCACCAGTCACCGTTTCAGGAAAACTTTTTATTCAAAAACTTTGGATAAATAAAA\n-GTGAATGGGATCAGGAATTATCCATAGAAGATAAAAATTATTGGGAAAAATATAAAGAAAATTTATTATT\n-GTTAAAAAATATTCGAATCCCAAGGTGGATTAATTCAAACAGTTCTTCAGTCATTCAGATTCACGGATTT\n-GCGGACGCCTCCGAAAAAGCATATGCTGCAGTAGTCTATGCTAAAGTAGGACCTCATGTTAATATAATAG\n-CTAGCAAAAGTAGAGTCAACCCTATAAAAAATAGGAAGACAATTCCCAAACTCGAGCTGTGTGCAGCTCA\n-CCTGCTTAGTGAATTAATCCAAAGACTAAAAGGATCAATTGACAATATAATGGAGATCTATGCTTGGAGT\n-GATTCCACGATTACCTTAGCATGGATTAACAGTGGTCAAAGTAAGATCAAATTTATAAGAAGAAGAACGG\n-ATGACATTCGGAAATTAAAAAATACTCAATGGAATCATGTTAAGTCAGAGGATAATCCAGCACATTTAGC\n-ATCCAGGGGAGTGGATTCTAACCAGTTGATCAACTGTGATTTTTGGTGGAAAGGTCCGAAATGGCTAGCC\n-GACCCAAAAGAACTTTGGCCTCGGCAGCAGTCTGTAGAAGAACCTGTCTTAATAAATACGGTATTACAAG\n-ACAAAATAGATGATCCTATTTACGAATTGATAGAAAGGTATTCCAGAAAAACTTATACGTATAATAGCAT\n-ACATAAATAGATTCGTGCAGATGAAAACAAATAATAAAGCCTATTCATCAATTATTTCAGTAAAGGAGAT\n-AAGAATAGCGGAAACAGTTGTTATTAAGAAACAACAAGAATACCAGTTTAGGCAAGAGATAAAGTGCCTT\n-AAAATCAAAAAGGAAATCAAGACAAATAATAAAATATTGTCATTGAATCCATTTTTGGACAAGGATGGGG\n-TTCTAAGAGTTGGAGGAAGATTGCAAAACTCCAATGCAGAATTTAATGTTAAACATCCAATCATTTTAGA\n-AAAATGCCACCTAACAAGCTTATTAATAAAAAATGCTCATAAGGAAACATTGCATGGAGGGATAAACCTT\n-ATGCGAAACTATATCCAAAGAAAGTATTGGATTTTCGGGTTGAAAAATTCGTTGAAAAAGTATTTAAGAG\n-AATGTGTAAAGTGTGCAAGGTATAAACAAAATACAGCTCAGCAAATAATGGGTAACTTGTCAAAATATAG\n-AGTGACGATGACATTCCCGTTTCTTAATACTGGAAGAGATTACGCAGGTCCTTATTATGTTAAATGTTCA\n-AAAAATCGTGGCCAAAAAACATTTAAAGGATACGTTGCCGTATTTGTTTGCATGGCCACCAAAGCCATAC\n-ACTTAGAAATGGTAAGCGATCTAACTTCTGACGCATTTTTAGCAGCACTCAGAAGATTTATTGCTAGACG\n-GGGAAAATGTTCCAATATCTATTCAAACAACGGAACAAATTTTGTAGGAGCTGCAAGAAAATTAGATCAA\n-GAGTTATTTAATGCAATACAAGAAAATATAACGATTGCAGCGCAGCTTGAAAAGGACAGGATTGATTGGC\n-ATTTTATTCCCCCGGCAGGACCTCACTTCGGAGGTATTTGGGAAGCTGGGGTTAAGTCAATGAAATACCA\n-TTTAAAGCGTATAATCGGCGACACAATTTTGACTTACGAAGAAATGTCAACTCTTTTATGTCAAATAAAA\n-GCATGCTTAAATTCAAGGCCATTATACACTATAGTTAGTGAGATGGACCAACAAGAGGTTTTAACACCAG\n-GTCATTTTTTAATTGGAAGACCACCTTTAGAAATAGTCGAACCAATGGAAGATGAAAAAATCGGAAATTT\n-GGATAGGTGGAGACTTATCCAAAAAATGAGGAAAGATATCTGGGTTAAGTGGAAAAGTGAATATTTGCAT\n-ACGCTCCAGCAAAGGAATAAATGGAAAAAGGAAATTCCTAATATAGAAGAAGGGCAAATAGTTTCATTAA\n-AGGATGAGAATTGTCATCCTGCAAGATGGCCTTTAGGAAAGGTGGAAAAGGTCCATAAGGGGAATGATGA\n-TAAGGTCCGGGTGGCTAAAGTAAAGATGCAGGAAGGATATATCACTAGACCCGTTACTAAAATTTGTCCC\n-TTGGAAGGAATAAAGTCTGTTGACAAAAATGAGGCTGACCAGGAGCCAAAAAGGCGAACTAGAGCGACAT\n-CGGGAATGTCCAAGATCGGAATCATCATGGCAATGTTGTTGTTTGTGTTAAGTTGTCAAGTTTCTAGCGC\n-ATTACCTAAAGATATAGCACCAAGATATTCTATAGACAAAATAAATAAAACCTCAGCAATATATCTAGAC\n-CCGCTAGGAGATGTTGAGATTGTGAGTACTTCTTGGAATTTGGAATATTATAAAATGGATCCATATTTTA\n-AAATGTTAACAAAGGGTAATGCGCTTATACAAAGTATGAGGAAAGTTTGCGAAAGACTTCATAGCTTTGA\n-AGAGCAATGTAGTCTAGTCTTAGATAATATGCAAAGGAAGTTGGCCCTGGAATTCTGCCAATGATAATGC\n-ATGATTCAGCCTCTAAAGCCAAAAAAAGTGGCGAACTGCATCTATAAAACAGTAGTCGACTCTAAAAGTT\n-ACTGGGTAGAGTTAGAAAAGAAAAGTAGTTGGTTGTTTAAGGTTCCTGTGAATTCAAAAGTCCGTCTGCA\n-ATGTACTGGCTCTCAAATTGAATTGTTTGATTTGCCTCAGCAAGGAGTTTTAAGCATTGCGCCATATTGT\n-ACGGCAAGAACCGACGATAAAATTATAGTTGCCCACCATAACATTCAGTCCGAAAGTGAAGAATTATTAT\n-CAACACCTTATATAGGAGAAGTTAGTGAAGTGCCGAAGATTATTTGGGATCCGCTGAAACTATCAATATT\n-AAATCATACTGAGGAATTTGAACGATTGAATAATGAAATTAAAAATTGAAAGATTTAGATTTCCATCATA\n-TTTCCGGACATGCTGGATTAATTATTGCTTTAATAATAATGGTAGTATTAATAATATATTTCATACGGAA\n-ATGTGCTGTGCAACAAAGAATGCAAGCCAATAACCTTTGCAGGTCCGTTGCCAGTACTATAAATATCAAT\n-AGTAAATAAAAAATAAAATTATATAACAAAAAAATATATACAGTCCACTATATCGTTGTTTAAGAGAAAA\n-TGTACTTCTACATAGAAAAAGCGAAATGTTTAAAATAAGTTAATTGAGTACAAATTGTTGAATTAAAAAT\n-AATATAAACCATAATTGTAATCCAATAAAATTAAAAGCCAGGAAAACTAGGGCCATTGAATTCTTAGTTG\n-CAAAATAAATGAACATATATCAAATAAATACAGTCCACTACTGTTATAAATGCAACTAATATACTAATGT\n-ACATCTATCTCAGCTTTTCTGGCCCTTTGGCAGAATGTTCACACATGAACACGAATATATTTAAAGACTT\n-ACAATTTTGGGCTCCGTTCATATCTTATGTAAATGAATCGAGAGCGATAAATTATATTTAGGATTTTGTA\n-AGAATAACATATTCTATGTTATTCTATGTTATTCCATGTTATTCTAT\n-\n'
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/jbrowse2_result01.zip
b
Binary file test-data/jbrowse2_result01.zip has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/jbrowse2_result02.zip
b
Binary file test-data/jbrowse2_result02.zip has changed
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/merlin_tab.maf
--- a/test-data/merlin_tab.maf Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,37 +0,0 @@
-##maf version=1 scoring=lastz.v1.04.22
-# lastz.v1.04.22 --strand=both --ambiguous=iupac --traceback=160M --format=maf --action:target=multiple
-#
-# hsp_threshold = 3000
-# gapped_threshold = 3000
-# x_drop = 910
-# y_drop = 9400
-# gap_open_penalty = 400
-# gap_extend_penalty = 30
-# A C G T
-# A 91 -114 -31 -123
-# C -114 100 -125 -31
-# G -31 -125 100 -114
-# T -123 -31 -114 91
-a score=5703
-s Merlin.Merlin 1320 60 + 172788 ATGTAAGCTCAGGAGCTCCACACGCAACAGGAACACAACCTGTGAACATTATCACAGTAT
-s Merlin1.Merlin 0 60 + 60 ATGTAAGCTCAGGAGCTCCACACGCAACAGGAACACAACCTGTGAACATTATCACAGTAT
-
-a score=5595
-s Merlin.Merlin 4020 60 + 172788 ATGAATTTATCAGTCCAATACTTAAAATGAATACGAAGTAAATCTATGCCTAATACTAAT
-s Merlin2.Merlin 0 60 + 60 ATGAATTTATCAGTCCAATACTTAAAATGAATACGAAGTAAATCTATGCCTAATACTAAT
-
-a score=5667
-s Merlin.Merlin 5220 60 + 172788 TAATCAACGTGTGATGCTTCAAGCCAAGCTTAGGAATAGAAATGGTTTTGCCATTGACTT
-s Merlin3.Merlin 0 60 + 60 TAATCAACGTGTGATGCTTCAAGCCAAGCTTAGGAATAGAAATGGTTTTGCCATTGACTT
-
-a score=5640
-s Merlin.Merlin 7740 60 + 172788 AAAAGCTTATTGCTTAAGCCTACAGTTAAACTCGCTATTCCAGTTAAATGCGATAAATGT
-s Merlin4.Merlin 0 60 + 60 AAAAGCTTATTGCTTAAGCCTACAGTTAAACTCGCTATTCCAGTTAAATGCGATAAATGT
-
-a score=5649
-s Merlin.Merlin 9720 60 + 172788 TTTTCTTTGCTAATTTAACACCAAGAGCTGCAATCCATTGGTTTCTTCGTTTATATCCTG
-s Merlin5.Merlin 0 60 + 60 TTTTCTTTGCTAATTTAACACCAAGAGCTGCAATCCATTGGTTTCTTCGTTTATATCCTG
-
-a score=5658
-s Merlin.Merlin 10380 60 + 172788 ATACTGCATCCTTTTGATACCAATGCGGTTCAATTTGAGTGTTACCAGAGTATATCTTGA
-s Merlin6.Merlin 0 60 + 60 ATACTGCATCCTTTTGATACCAATGCGGTTCAATTTGAGTGTTACCAGAGTATATCTTGA
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/vcf/test.vcf
--- a/test-data/vcf/test.vcf Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,23 +0,0 @@
-##fileformat=VCFv4.0
-##fileDate=20090805
-##source=myImputationProgramV3.1
-##reference=1000GenomesPilot-NCBI36
-##phasing=partial
-##INFO=<ID=NS,Number=1,Type=Integer,Description="Number of Samples With Data">
-##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
-##INFO=<ID=AF,Number=.,Type=Float,Description="Allele Frequency">
-##INFO=<ID=AA,Number=1,Type=String,Description="Ancestral Allele">
-##INFO=<ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129">
-##INFO=<ID=H2,Number=0,Type=Flag,Description="HapMap2 membership">
-##FILTER=<ID=q10,Description="Quality below 10">
-##FILTER=<ID=s50,Description="Less than 50% of samples have data">
-##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
-##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
-##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Read Depth">
-##FORMAT=<ID=HQ,Number=2,Type=Integer,Description="Haplotype Quality">
-#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003
-Merlin 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.
-Merlin 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3
-Merlin 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4
-Merlin 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2
-Merlin 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3
b
diff -r 74074746ccd8 -r b1260bca5fdc test-data/vcf/test.xml
--- a/test-data/vcf/test.xml Sat Jun 01 05:37:13 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,28 +0,0 @@
-<?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 74074746ccd8 -r b1260bca5fdc tool_data_table_conf.xml.test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool_data_table_conf.xml.test Wed Jun 05 10:00:07 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>