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

Changeset 71:e26a8a6d2d2e (2024-03-30)
Previous changeset 70:5f0ee87daef4 (2024-03-29) Next changeset 72:2bdb748df098 (2024-03-30)
Commit message:
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit cf208cecf0140ff43d145a44713ab7108057fb8b
modified:
autogenJB2.py
jbrowse2.py
macros.xml
removed:
autogenJB2.xml
maf2bed.pl
test-data/blastxml/blastn-gene1.xml
test-data/blastxml/merlin.gff
test-data/index.html
test-data/vcf/test.vcf
test-data/vcf/test.xml
test-data/xmfa.gff
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e autogenJB2.py
--- a/autogenJB2.py Fri Mar 29 09:35:57 2024 +0000
+++ b/autogenJB2.py Sat Mar 30 07:15:04 2024 +0000
[
@@ -76,7 +76,7 @@
                     for i, x in enumerate(genome_paths)
                 ],
             )
-            logging.warn("#!!! paths=%s, genomes=%s" % (genome_paths, genomes))
+            logging.debug("#!!! paths=%s, genomes=%s" % (genome_paths, genomes))
             assref_name = jc.process_genomes(genomes[0])
             default_session_data = {
                 "visibility": {
@@ -203,14 +203,14 @@
             trackconf = jc.config_json.get("tracks", [])
             for gnome in jc.genome_names:
                 trackconf += jc.tracksToAdd[gnome]
-            logging.warn(
+            logging.debug(
                 "++++ adding trackconf=%s for gnome %s" % (trackconf, gnome)
             )
             jc.config_json["tracks"] = trackconf
             assconf = jc.config_json.get("assemblies", [])
             assconf += jc.assemblies
             jc.config_json["assemblies"] = assconf
-            logging.warn("+++assemblies=%s, gnames=%s" % (assconf, jc.genome_names))
+            logging.debug("+++assemblies=%s, gnames=%s" % (assconf, jc.genome_names))
             jc.write_config()
             default_session_data.update({"session_name": sessName})
             track_conf.update(default_session_data)
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e autogenJB2.xml
--- a/autogenJB2.xml Fri Mar 29 09:35:57 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,179 +0,0 @@
- <tool id="autogenjb2" name="autogenjb2" version="2.10.2.0" profile="22.05">
-    <description>Track collection to JBrowse2</description>
-    <macros>
-        <import>macros.xml</import>
-    </macros>
-    <expand macro="edamInc"/>
-    <xrefs>
-        <xref type="bio.tools">jbrowse2</xref>
-    </xrefs>
-    <expand macro="requirements"/>
-    <version_command>python '${__tool_directory__}/autogenJB2.py' --version</version_command>
-    <command detect_errors="aggressive"><![CDATA[
-export JBROWSE2_PATH=\$(dirname \$(which jbrowse))/../opt/jbrowse2  &&
-python '$__tool_directory__/autogenJB2.py'
-#for $key in $autoCollection.keys():
-    #if $autoCollection[$key].is_collection:
-        #set subCol=$autoCollection[$key]
-        #set pafs=[($subCol[x],$subcol[x].ext,x) for x in $subCol.keys() if $subCol[x].ext == 'paf']
-        #if len($pafs) > 0:
-             --pafmeta '$pafs[0]'
-            #set refs = [($pafs[0][2],$subCol[x],x) for x in $subCol.keys() if $subCol[x].ext == 'fasta']
-            #for $ref in $refs:
-             --pafreferencemeta '$ref'
-            #end for
-        #end if
-    #else if $autoCollection[$key].ext == 'fasta':
-      --referencemeta '$autoCollection[$key],$autoCollection[$key].ext,$key'
-    #else if $autoCollection[$key].ext in ['bed', 'bigwig', 'cool', 'gff', 'gff3', 'hic', 'maf', 'mcool', 'scool', 'vcf']
-      --trackmeta '$autoCollection[$key],$autoCollection[$key].ext,$key'
-    #else if $autoCollection[$key].ext in ['bam',]
-      --trackmeta '$autoCollection[$key],$autoCollection[$key].ext,$key,$autoCollection[$key].metadata.bam_index'
-     #else if $autoCollection[$key].ext in ['cram',]
-      --trackmeta '$autoCollection[$key],$autoCollection[$key].ext,$key,$autoCollection[$key].metadata.cram_index'
-    #end if
-#end for
---outdir '$output.files_path'
---jbrowse2path \${JBROWSE2_PATH}
---sessName "Autogen JBrowse" &&
-
-  cp '$output.files_path/index.html' '$output'
-## Ugly testing hack since I cannot get <extra_files> to test the files I want to test. Hmph.
-#if str($uglyTestingHack) == "enabled":
- &&   cp '$output.files_path/config.json' '$output'
-#end if
-  ]]></command>
-    <inputs>
-        <param
-                    label="Collection of files to become tracks - they must have short, informative names"
-                    name="autoCollection"
-                    type="data_collection">
-        </param>
-   <param type="hidden" name="uglyTestingHack" value="" />
-    </inputs>
-    <outputs>
-        <data format="html" name="output" label="AutoJBrowse2"/>
-    </outputs>
-<tests>
-   <test>
-      <param name="uglyTestingHack" value="enabled" />
-      <param name="autoCollection">
-        <collection type="list">
-          <element name="Merlin" value="merlin.fa" ftype="fasta"/>
-          <element name="test-6.bed" value="bed/test-6.bed" ftype="bed"/>
-        </collection>
-      </param>
-      <output name="output">
-            <assert_contents>
-                <has_text text='"name": "Merlin",'/>
-                <has_text text='"name": "test-6.bed",'/>
-                <has_text text='"uri": "Merlin.fa.gz.fai"'/>
-            </assert_contents>
-      </output>
-    </test>
-</tests>
-    <help><![CDATA[
-
-Autogenerated JBrowse2
-======================
-
-Given a collection of datatypes suited for making JB2 tracks, this tool will create a working JBrowse2 configuration.
-A paf track requires a nested collection with the paf file and all the genomes used in creating it.
-
-
-Use and local viewing
-=====================
-
-
-A JBrowse2 history item can be opened by viewing it (the "eye" icon).
-
-The same browser data and setup can also be downloaded as a compressed zip archive by clicking the download ("floppy disk") icon in the history.
-This can be shared and viewed without Galaxy.
-
-A replacement application to serve the browser is required without Galaxy. A local python web server can be started using a script included in each archive,
-assuming that Python3 is already working on your desktop - if not you will have to install it first. Unzip the archive (*unzip [filename].zip*) and change
-directory to the first level in that zip archive. It contains a file named *jb2_webserver.py*
-
-With python3 installed,
-
-*python3 jb2_webserver.py*
-
-will serve the unarchived JBrowse2 configuration from the same directory as the python script automatically. If a new browser window does not open,
-but the script appears to be running, try pointing your web browser to the default of *localhost:8080*
-
-Overview
---------
-
-JBrowse is a fast, embeddable genome browser built completely with
-JavaScript and HTML5.
-
-The JBrowse-in-Galaxy (JiG) tool was written to help build complex
-JBrowse installations straight from Galaxy. It allows you to build up a JBrowse instance without worrying
-about how to run the command line tools to format your data, and which
-options need to be supplied and where.
-
-The JBrowse-in-Galaxy tool has been rejected by `a Galaxy IUC
-<https://github.com/galaxyproject/tools-iuc/issues>`__, reviewer.
-
-Options
--------
-
-**Reference or Assembly**
-
-Choose either a built-in or select one from your history.
-
-Track coordinates and contig names *must* match this reference precisely
-or they will not display.
-
-**Track Groups** represent a set of tracks in a single category.
-
-Annotation Tracks
------------------
-
-GFF3/BED
-~~~~~~~~
-
-Standard feature tracks. They usually highlight genes, mRNAs and other features of interest along a genomic region.
-
-When these contain tens of millions of features, such as repeat regions from a VGP assembly, displaying one at a time leads
-to extremely slow loading times when a large region is in view, unless the "LinearPileupDisplay" display option is
-selected for that track in the styling options section. The default is LinearBasicDisplay, which shows all details and works
-well for relatively sparse bed files. A better option is to make a bigwig track using a set of windows based on the
-lengths of each assembly or reference contig.
-
-BAM Pileups
-~~~~~~~~~~~
-
-We support BAM files and can automatically generate SNP tracks based on
-that bam data.
-
-
-BlastXML
-~~~~~~~~
-
-JiG now supports both blastn and blastp datasets. JiG internally uses a
-blastXML to gapped GFF3 tool to convert your blastxml datasets into a
-format amenable to visualization in JBrowse. This tool is also
-available separately from the IUC on the toolshed.
-
-**Minimum Gap Size** reflects how long a gap must be before it becomes a
-real gap in the processed gff3 file. In the picture above, various sizes
-of gaps can be seen. If the minimum gap size was set much higher, say
-100nt, many of the smaller gaps would disappear, and the features on
-both sides would be merged into one, longer feature. This setting is
-inversely proportional to runtime and output file size. *Do not set this
-to a low value for large datasets*. By setting this number lower, you
-will have extremely large outputs and extremely long runtimes. The
-default was configured based off of the author's experience, but the
-author only works on small viruses. It is *strongly* recommended that
-you filter your blast results before display, e.g. picking out the top
-10 hits or so.
-
-**Protein blast search** option merely informs underlying tools that
-they should adjust feature locations by 3x.
-
-
-@ATTRIBUTION@
-]]></help>
-    <expand macro="citations"/>
-</tool>
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e jbrowse2.py
--- a/jbrowse2.py Fri Mar 29 09:35:57 2024 +0000
+++ b/jbrowse2.py Sat Mar 30 07:15:04 2024 +0000
[
@@ -378,7 +378,6 @@
         self.assmeta = {}
         self.giURL = GALAXY_INFRASTRUCTURE_URL
         self.outdir = outdir
-        self.genome_firstcontig = None
         self.jbrowse2path = jbrowse2path
         os.makedirs(self.outdir, exist_ok=True)
         self.genome_names = []
@@ -1125,21 +1124,22 @@
                 gname = gname.split()[0]
             passnames.append(gname)
             # trouble from spacey names in command lines avoidance
+            useuri = pgpaths[i].startswith("http://") or pgpaths[i].startswith(
+                "https://"
+            )
+            if not useuri:
+                url = "%s.paf" % (lab)
+            else:
+                url = data
             if gname not in self.genome_names:
                 # ignore if already there - eg for duplicates among pafs.
-                useuri = pgpaths[i].startswith("http://") or pgpaths[i].startswith(
-                    "https://"
-                )
                 asstrack = self.make_assembly(pgpaths[i], gname, useuri)
                 self.genome_names.append(gname)
                 self.tracksToAdd[gname] = []
                 self.assemblies.append(asstrack)
                 if not useuri:
-                    url = "%s.paf" % (lab)
                     dest = "%s/%s" % (self.outdir, url)
                     self.symlink_or_copy(os.path.realpath(data), dest)
-                else:
-                    url = data
         trackDict = {
             "type": "SyntenyTrack",
             "trackId": tId,
@@ -1582,7 +1582,7 @@
                     }
                 else:
                     default_session_data["style"][key] = {}
-                    logging.warn("@@@@ no options/style found for %s" % (key))
+                    logging.debug("@@@@ no options/style found for %s" % (key))
 
                 if track.find("options/style_labels"):
                     default_session_data["style_labels"][key] = {
@@ -1607,14 +1607,13 @@
     }
     jc.add_general_configuration(general_data)
     trackconf = jc.config_json.get("tracks", [])
-    logging.warn("++++++++++++ genome_names=%s" % jc.genome_names)
     for gnome in jc.genome_names:
         trackconf += jc.tracksToAdd[gnome]
     jc.config_json["tracks"] = trackconf
     assconf = jc.config_json.get("assemblies", [])
     assconf += jc.assemblies
     jc.config_json["assemblies"] = assconf
-    logging.warn("&&&assemblies=%s, gnames=%s" % (assconf, jc.genome_names))
+    logging.debug("&&&assemblies=%s, gnames=%s" % (assconf, jc.genome_names))
     jc.write_config()
     jc.add_default_session(default_session_data)
     # jc.text_index() not sure what broke here.
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e macros.xml
--- a/macros.xml Fri Mar 29 09:35:57 2024 +0000
+++ b/macros.xml Sat Mar 30 07:15:04 2024 +0000
[
@@ -438,7 +438,6 @@
         </section>
     </xml>
 
-    <!-- TODO use this -->
     <xml name="track_menu">
         <section name="jbmenu" title="JBrowse Contextual Menu options [Advanced]" expanded="false">
             <repeat name="track_menu" title="Track Menu">
@@ -556,7 +555,7 @@
                     <option value="uri">PAF reference comparison genome tabix .gz URI with index files at the corresponding URIs</option>
                 </param>
                 <when value="history">
-                    <repeat name="refgenomes" title="PAF reference comparison genome used to make the PAF">
+                    <repeat name="refgenomes" title="PAF reference comparison genome used to make the PAF" min="1">
                        <param label="@LABEL@" format="@FORMAT@" name="annotation" multiple="True" optional="true" type="data" />
                        <param label="Short name for track display" name="annoname" type="text" help="No spaces allowed here">
                              <sanitizer invalid_char="_">
@@ -568,9 +567,9 @@
                     </repeat>
                 </when>
                 <when value="uri">
-                    <repeat name="refgenomes" title="PAF reference comparison genome URI">
+                    <repeat name="refgenomes" title="PAF reference comparison genome URI" min="1">
                        <param label="@LABEL@" name="annotation"  type="text" />
-                       <param label="Short name for track display" name="annoname" 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="'" />
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e maf2bed.pl
--- a/maf2bed.pl Fri Mar 29 09:35:57 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,48 +0,0 @@
-#!/usr/bin/env perl
-# https://unpkg.com/browse/jbrowse-plugin-mafviewer@1.0.6/dist/
-# license is Apache2_license.txt included here
-use warnings;
-use strict;
-
-$, = ' ';
-$\ = "\n";
-$, = "\t";
-
-my $id = 0;
-my $buffer = '';
-my $start = 0;
-my $end = 0;
-my $score = 0;
-my $chrom = '';
-
-while (<STDIN>) {
-    chomp;
-    next if /^$/;
-    my @line = split('\s+');
-    if (/^s\s+$ARGV[0]/) {
-        $chrom = $line[1];
-        $chrom =~ s/$ARGV[0]\.//;
-        $start = $line[2];
-        $end = $line[2] + $line[3];
-        s/^s //;
-        s/ +/:/g;
-        my $temp = $_;
-        $buffer = $buffer eq '' ? $temp : "$buffer;$temp";
-    }
-    elsif (/^a/) {
-        $score = +(s/^a score=//);
-        if($id > 0) {
-            print $chrom, $start, $end, "$ARGV[0]_$id", $score, $buffer;
-        }
-        $id += 1;
-        $buffer = '';
-    }
-
-    elsif (/^s/) {
-        s/^s //;
-        s/ +/:/g;
-        my $temp = $_;
-        $buffer = $buffer eq '' ? $temp : "$buffer,$temp";
-    }
-}
-print $chrom, $start, $end, "$ARGV[0]_$id", $score, $buffer;
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e test-data/blastxml/blastn-gene1.xml
--- a/test-data/blastxml/blastn-gene1.xml Fri Mar 29 09:35:57 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 5f0ee87daef4 -r e26a8a6d2d2e test-data/blastxml/merlin.gff
--- a/test-data/blastxml/merlin.gff Fri Mar 29 09:35:57 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 5f0ee87daef4 -r e26a8a6d2d2e test-data/index.html
--- a/test-data/index.html Fri Mar 29 09:35:57 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <title>JBrowse</title>
-    <link rel="stylesheet" type="text/css" href="css/genome.css">
-</head>
-<body>
-
-    <script type="text/javascript">
-            // jshint unused: false
-            var dojoConfig = {
-                async: true,
-                baseUrl: './src',
-                has: {
-                    'host-node': false // Prevent dojo from being fooled by Electron
-                }
-            };
-            // Move Electron's require out before loading Dojo
-            if(window.process&&process.versions&&process.versions.electron) {
-                window.electronRequire = require;
-                delete window.require;
-            }
-    </script>
-    <script type="text/javascript" src="src/dojo/dojo.js"></script>
-    <script type="text/javascript" src="src/JBrowse/init.js"></script>
-    <script type="text/javascript">
-        window.onerror=function(msg){
-            if( document.body )
-                document.body.setAttribute("JSError",msg);
-        }
-
-        // puts the main Browser object in this for convenience.  feel
-        // free to move it into function scope if you want to keep it
-        // out of the global namespace
-        var JBrowse;
-        require(['JBrowse/Browser', 'dojo/io-query', 'dojo/json' ],
-             function (Browser,ioQuery,JSON) {
-                   // the initial configuration of this JBrowse
-                   // instance
-
-                   // NOTE: this initial config is the same as any
-                   // other JBrowse config in any other file.  this
-                   // one just sets defaults from URL query params.
-                   // If you are embedding JBrowse in some other app,
-                   // you might as well just set this initial config
-                   // to something like { include: '../my/dynamic/conf.json' },
-                   // or you could put the entire
-                   // dynamically-generated JBrowse config here.
-
-                   // parse the query vars in the page URL
-                   var queryParams = ioQuery.queryToObject( window.location.search.slice(1) );
-
-                   var config = {
-                       containerID: "GenomeBrowser",
-
-                       dataRoot: queryParams.data,
-                       queryParams: queryParams,
-                       location: queryParams.loc,
-                       forceTracks: queryParams.tracks,
-                       initialHighlight: queryParams.highlight,
-                       show_nav: queryParams.nav,
-                       show_tracklist: queryParams.tracklist,
-                       show_overview: queryParams.overview,
-                       show_menu: queryParams.menu,
-                       show_tracklabels: queryParams.tracklabels,
-                       highResolutionMode: queryParams.highres,
-                       stores: { url: { type: "JBrowse/Store/SeqFeature/FromConfig", features: [] } },
-                       makeFullViewURL: function( browser ) {
-
-                           // the URL for the 'Full view' link
-                           // in embedded mode should be the current
-                           // view URL, except with 'nav', 'tracklist',
-                           // and 'overview' parameters forced to 1.
-
-                           return browser.makeCurrentViewURL({ nav: 1, tracklist: 1, overview: 1 });
-                       },
-                       updateBrowserURL: true
-                   };
-
-                   //if there is ?addFeatures in the query params,
-                   //define a store for data from the URL
-                   if( queryParams.addFeatures ) {
-                       config.stores.url.features = JSON.parse( queryParams.addFeatures );
-                   }
-
-                   // if there is ?addTracks in the query params, add
-                   // those track configurations to our initial
-                   // configuration
-                   if( queryParams.addTracks ) {
-                       config.tracks = JSON.parse( queryParams.addTracks );
-                   }
-
-                   // if there is ?addStores in the query params, add
-                   // those store configurations to our initial
-                   // configuration
-                   if( queryParams.addStores ) {
-                       config.stores = JSON.parse( queryParams.addStores );
-                   }
-
-                   // create a JBrowse global variable holding the JBrowse instance
-                   JBrowse = new Browser( config );
-        });
-    </script>
-
-  </head>
-
-  <body>
-    <div id="GenomeBrowser" style="height: 100%; width: 100%; padding: 0; border: 0;"></div>
-    <div style="display: none">JBrowseDefaultMainPage</div>
-  </body>
-</html>
b
diff -r 5f0ee87daef4 -r e26a8a6d2d2e test-data/vcf/test.vcf
--- a/test-data/vcf/test.vcf Fri Mar 29 09:35:57 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 5f0ee87daef4 -r e26a8a6d2d2e test-data/vcf/test.xml
--- a/test-data/vcf/test.xml Fri Mar 29 09:35:57 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 5f0ee87daef4 -r e26a8a6d2d2e test-data/xmfa.gff
--- a/test-data/xmfa.gff Fri Mar 29 09:35:57 2024 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,5918 +0,0 @@\n-##gff-version 3\n-##sequence-region Merlin 1 172788\n-Merlin\tprogressiveMauve\tmatch\t123963\t171642\t.\t-\t.\tID=HM137666;Target=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t123963\t123982\t80\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t123983\t124032\t62\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124033\t124082\t86\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124083\t124132\t72\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124133\t124182\t78\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124183\t124232\t70\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124233\t124282\t48\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124283\t124329\t42.5531914894\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124469\t124494\t73.0769230769\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124495\t124544\t56\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124601\t124650\t56\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124651\t124700\t54\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124701\t124750\t56\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124751\t124796\t56.5217391304\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124797\t124846\t14\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124847\t124868\t27.2727272727\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124869\t124918\t68\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124919\t124964\t45.652173913\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t124965\t125009\t55.5555555556\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125010\t125059\t58\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125060\t125077\t33.3333333333\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125078\t125127\t64\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125128\t125177\t26\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125744\t125793\t66\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125794\t125843\t70\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125844\t125893\t64\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125894\t125943\t50\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125944\t125993\t54\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t125994\t126043\t52\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126044\t126093\t74\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126094\t126143\t48\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126144\t126193\t56\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126194\t126240\t57.4468085106\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126241\t126290\t64\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126291\t126333\t58.1395348837\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126334\t126378\t71.1111111111\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126379\t126425\t63.829787234\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126426\t126468\t67.4418604651\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126469\t126515\t74.4680851064\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126516\t126565\t60\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126566\t126603\t60.5263157895\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126604\t126653\t50\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126654\t126703\t66\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126704\t126753\t74\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126754\t126803\t70\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126804\t126853\t78\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126854\t126903\t78\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126904\t126953\t66\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t126954\t127003\t78\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t127004\t127053\t72\t+\t.\tParent=HM137666\n-Merlin\tprogressiveMauve\tmatch_part\t127054\t1271'..b'ogressiveMauve\tmatch_part\t168325\t168374\t84\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168375\t168424\t84\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168425\t168474\t78\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168475\t168524\t82\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168525\t168574\t68\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168575\t168624\t70\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168625\t168674\t66\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t168675\t168724\t40\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169065\t169092\t60.7142857143\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169093\t169142\t74\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169143\t169192\t58\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169193\t169242\t60\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169243\t169292\t62\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169293\t169342\t68\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169343\t169374\t59.375\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169375\t169423\t63.2653061224\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169424\t169473\t70\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169474\t169523\t70\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169524\t169573\t54\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169574\t169623\t54\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t169624\t169673\t40\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170000\t170040\t68.2926829268\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170041\t170082\t76.1904761905\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170083\t170132\t70\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170133\t170182\t56\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170183\t170232\t68\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170233\t170282\t72\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170283\t170332\t68\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170333\t170382\t72\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170383\t170431\t61.2244897959\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170432\t170473\t52.380952381\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170474\t170523\t58\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170524\t170573\t64\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170574\t170623\t42\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170824\t170849\t38.4615384615\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170850\t170898\t63.2653061224\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170899\t170948\t56\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170949\t170991\t67.4418604651\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t170992\t171040\t46.9387755102\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171041\t171090\t52\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171091\t171123\t69.696969697\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171124\t171167\t79.5454545455\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171168\t171217\t78\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171218\t171264\t57.4468085106\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171265\t171314\t68\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171315\t171364\t68\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171365\t171414\t64\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171415\t171464\t76\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171465\t171514\t76\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171515\t171564\t80\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171565\t171614\t66\t+\t.\tParent=NC_000866\n-Merlin\tprogressiveMauve\tmatch_part\t171615\t171642\t53.5714285714\t+\t.\tParent=NC_000866\n-###\n'