changeset 25:1cfc579079a6 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse commit b6f9a87b6091cc881a49e0b6acfadc5e7786967f
author iuc
date Tue, 29 Jan 2019 05:34:16 -0500
parents fa30df9b79c2
children 08776ba76cf5
files jbrowse-fromdir.xml jbrowse.py jbrowse.xml macros.xml readme.rst test-data/bam/test.xml test-data/endpoints/test.xml test-data/gencode/test-1.xml test-data/gencode/test-data_table.xml test-data/gencode/test.xml test-data/gff3/test.xml test-data/menus/test.xml test-data/track_config/test.xml
diffstat 13 files changed, 760 insertions(+), 396 deletions(-) [+]
line wrap: on
line diff
--- a/jbrowse-fromdir.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/jbrowse-fromdir.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -4,8 +4,7 @@
     <import>macros.xml</import>
   </macros>
   <expand macro="requirements"/>
-  <expand macro="stdio"/>
-  <command><![CDATA[
+  <command detect_errors="exit_code"><![CDATA[
 ## Create output directory
 mkdir -p $output.files_path &&
 ## Copy in jbrowse
--- a/jbrowse.py	Wed Jan 16 03:28:29 2019 -0500
+++ b/jbrowse.py	Tue Jan 29 05:34:16 2019 -0500
@@ -263,6 +263,9 @@
 
 
 def etree_to_dict(t):
+    if t is None:
+        return {}
+
     d = {t.tag: {} if t.attrib else None}
     children = list(t)
     if children:
@@ -381,15 +384,40 @@
         log.debug('cd %s && %s', self.outdir, ' '.join(command))
         subprocess.check_call(command, cwd=self.outdir)
 
+    def subprocess_popen(self, command):
+        log.debug('cd %s && %s', self.outdir, command)
+        p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        output, err = p.communicate()
+        retcode = p.returncode
+        if retcode != 0:
+            log.error('cd %s && %s', self.outdir, command)
+            log.error(output)
+            log.error(err)
+            raise RuntimeError("Command failed with exit code %s" % (retcode))
+
     def _jbrowse_bin(self, command):
         return os.path.realpath(os.path.join(self.jbrowse, 'bin', command))
 
     def process_genomes(self):
         for genome_node in self.genome_paths:
-            # TODO: Waiting on https://github.com/GMOD/jbrowse/pull/884
+            # We only expect one input genome per run. This for loop is just
+            # easier to write than the alternative / catches any possible
+            # issues.
+
+            # Copy the file in workdir, prepare-refseqs.pl will copy it to jbrowse's data dir
+            local_genome = os.path.realpath('./genome.fasta')
+            shutil.copy(genome_node['path'], local_genome)
+
+            cmd = ['samtools', 'faidx', local_genome]
+            self.subprocess_check_call(cmd)
+
             self.subprocess_check_call([
                 'perl', self._jbrowse_bin('prepare-refseqs.pl'),
-                '--fasta', genome_node['path']])
+                '--trackConfig', json.dumps({'metadata': genome_node['meta']}),
+                '--indexed_fasta', os.path.realpath(local_genome)])
+
+            os.unlink(local_genome)
+            os.unlink(local_genome + '.fai')
 
     def generate_names(self):
         # Generate names
@@ -420,7 +448,7 @@
             return
 
         tmp = tempfile.NamedTemporaryFile(delete=False)
-        tmp.write(json.dumps(json_data))
+        json.dump(json_data, tmp)
         tmp.close()
         cmd = ['perl', self._jbrowse_bin('add-track-json.pl'), tmp.name,
                os.path.join('data', 'trackList.json')]
@@ -430,7 +458,7 @@
     def _blastxml_to_gff3(self, xml, min_gap=10):
         gff3_unrebased = tempfile.NamedTemporaryFile(delete=False)
         cmd = ['python', os.path.join(INSTALLED_TO, 'blastxml_to_gapped_gff3.py'),
-               '--trim', '--trim_end', '--min_gap', str(min_gap), xml]
+               '--trim', '--trim_end', '--include_seq', '--min_gap', str(min_gap), xml]
         log.debug('cd %s && %s > %s', self.outdir, ' '.join(cmd), gff3_unrebased.name)
         subprocess.check_call(cmd, cwd=self.outdir, stdout=gff3_unrebased)
         gff3_unrebased.close()
@@ -453,27 +481,23 @@
             shutil.copy(gff3_rebased.name, gff3)
             os.unlink(gff3_rebased.name)
 
-        config = {
-            'glyph': 'JBrowse/View/FeatureGlyph/Segments',
-            "category": trackData['category'],
-        }
+        dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.gff')
 
-        clientConfig = trackData['style']
+        self._sort_gff(gff3, dest)
 
-        cmd = ['perl', self._jbrowse_bin('flatfile-to-json.pl'),
-               '--gff', gff3,
-               '--trackLabel', trackData['label'],
-               '--key', trackData['key'],
-               '--clientConfig', json.dumps(clientConfig),
-               '--config', json.dumps(config),
-               '--trackType', 'BlastView/View/Track/CanvasFeatures'
-               ]
+        url = os.path.join('raw', trackData['label'] + '.gff.gz')
+        trackData.update({
+            "urlTemplate": url,
+            "storeClass": "JBrowse/Store/SeqFeature/GFF3Tabix",
+        })
 
-        # className in --clientConfig is ignored, it needs to be set with --className
-        if 'className' in trackData['style']:
-            cmd += ['--className', trackData['style']['className']]
+        trackData['glyph'] = 'JBrowse/View/FeatureGlyph/Segments'
 
-        self.subprocess_check_call(cmd)
+        trackData['trackType'] = 'BlastView/View/Track/CanvasFeatures'
+        trackData['type'] = 'BlastView/View/Track/CanvasFeatures'
+
+        self._add_track_json(trackData)
+
         os.unlink(gff3)
 
         if blastOpts.get('index', 'false') == 'true':
@@ -504,6 +528,37 @@
 
         self._add_track_json(trackData)
 
+    def add_bigwig_multiple(self, data, trackData, wiggleOpts, **kwargs):
+
+        urls = []
+        for idx, bw in enumerate(data):
+            dest = os.path.join('data', 'raw', trackData['label'] + '_' + str(idx) + '.bw')
+            cmd = ['ln', '-s', bw[1], dest]
+            self.subprocess_check_call(cmd)
+
+            urls.append({"url": os.path.join('raw', trackData['label'] + '_' + str(idx) + '.bw'), "name": str(idx + 1) + ' - ' + bw[0]})
+
+        trackData.update({
+            "urlTemplates": urls,
+            "showTooltips": "true",
+            "storeClass": "MultiBigWig/Store/SeqFeature/MultiBigWig",
+            "type": "MultiBigWig/View/Track/MultiWiggle/MultiDensity",
+        })
+        if 'XYPlot' in wiggleOpts['type']:
+            trackData['type'] = "MultiBigWig/View/Track/MultiWiggle/MultiXYPlot"
+
+        trackData['variance_band'] = True if wiggleOpts['variance_band'] == 'true' else False
+
+        if 'min' in wiggleOpts and 'max' in wiggleOpts:
+            trackData['min_score'] = wiggleOpts['min']
+            trackData['max_score'] = wiggleOpts['max']
+        else:
+            trackData['autoscale'] = wiggleOpts.get('autoscale', 'local')
+
+        trackData['scale'] = wiggleOpts['scale']
+
+        self._add_track_json(trackData)
+
     def add_bam(self, data, trackData, bamOpts, bam_index=None, **kwargs):
         dest = os.path.join('data', 'raw', trackData['label'] + '.bam')
         cmd = ['ln', '-s', os.path.realpath(data), dest]
@@ -517,6 +572,7 @@
             "urlTemplate": url,
             "type": "JBrowse/View/Track/Alignments2",
             "storeClass": "JBrowse/Store/SeqFeature/BAM",
+            "chunkSizeLimit": bamOpts.get('chunkSizeLimit', '5000000')
         })
 
         # Apollo will only switch to the (prettier) 'bam-read' className if it's not set explicitly in the track config
@@ -532,6 +588,7 @@
                 "type": "JBrowse/View/Track/SNPCoverage",
                 "key": trackData['key'] + " - SNPs/Coverage",
                 "label": trackData['label'] + "_autosnp",
+                "chunkSizeLimit": bamOpts.get('chunkSizeLimit', '5000000')
             })
             self._add_track_json(trackData2)
 
@@ -545,7 +602,7 @@
         cmd = ['tabix', '-p', 'vcf', dest + '.gz']
         self.subprocess_check_call(cmd)
 
-        url = os.path.join('raw', trackData['label'] + '.vcf')
+        url = os.path.join('raw', trackData['label'] + '.vcf.gz')
         trackData.update({
             "urlTemplate": url,
             "type": "JBrowse/View/Track/HTMLVariants",
@@ -553,56 +610,50 @@
         })
         self._add_track_json(trackData)
 
-    def add_features(self, data, format, trackData, gffOpts, metadata=None, **kwargs):
-        cmd = [
-            'perl', self._jbrowse_bin('flatfile-to-json.pl'),
-            self.TN_TABLE.get(format, 'gff'),
-            data,
-            '--trackLabel', trackData['label'],
-            '--key', trackData['key']
-        ]
+    def _sort_gff(self, data, dest):
+
+        if not os.path.exists(dest):
+            # Only index if not already done
+            cmd = "grep ^\"#\" '%s' > '%s'" % (data, dest)
+            self.subprocess_popen(cmd)
+
+            cmd = "grep -v ^\"#\" '%s' | grep -v \"^$\" | grep \"\t\" | sort -k1,1 -k4,4n >> '%s'" % (data, dest)
+            self.subprocess_popen(cmd)
 
-        # className in --clientConfig is ignored, it needs to be set with --className
-        if 'className' in trackData['style']:
-            cmd += ['--className', trackData['style']['className']]
+            cmd = ['bgzip', '-f', dest]
+            self.subprocess_popen(' '.join(cmd))
+            cmd = ['tabix', '-f', '-p', 'gff', dest + '.gz']
+            self.subprocess_popen(' '.join(cmd))
+
+    def add_features(self, data, format, trackData, gffOpts, **kwargs):
 
-        config = copy.copy(trackData)
-        clientConfig = trackData['style']
-        del config['style']
+        dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.gff')
+
+        self._sort_gff(data, dest)
+
+        url = os.path.join('raw', trackData['label'] + '.gff.gz')
+        trackData.update({
+            "urlTemplate": url,
+            "storeClass": "JBrowse/Store/SeqFeature/GFF3Tabix",
+        })
 
         if 'match' in gffOpts:
-            config['glyph'] = 'JBrowse/View/FeatureGlyph/Segments'
-            if bool(gffOpts['match']):
-                # Can be empty for CanvasFeatures = will take all by default
-                cmd += ['--type', gffOpts['match']]
-
-        cmd += ['--clientConfig', json.dumps(clientConfig),
-                ]
+            trackData['glyph'] = 'JBrowse/View/FeatureGlyph/Segments'
 
         trackType = 'JBrowse/View/Track/CanvasFeatures'
         if 'trackType' in gffOpts:
             trackType = gffOpts['trackType']
+        trackData['trackType'] = trackType
 
         if trackType == 'JBrowse/View/Track/CanvasFeatures':
             if 'transcriptType' in gffOpts and gffOpts['transcriptType']:
-                config['transcriptType'] = gffOpts['transcriptType']
+                trackData['transcriptType'] = gffOpts['transcriptType']
             if 'subParts' in gffOpts and gffOpts['subParts']:
-                config['subParts'] = gffOpts['subParts']
+                trackData['subParts'] = gffOpts['subParts']
             if 'impliedUTRs' in gffOpts and gffOpts['impliedUTRs']:
-                config['impliedUTRs'] = gffOpts['impliedUTRs']
-        elif trackType == 'JBrowse/View/Track/HTMLFeatures':
-            if 'transcriptType' in gffOpts and gffOpts['transcriptType']:
-                cmd += ['--type', gffOpts['transcriptType']]
+                trackData['impliedUTRs'] = gffOpts['impliedUTRs']
 
-        cmd += [
-            '--trackType', gffOpts['trackType']
-        ]
-
-        if metadata:
-            config.update({'metadata': metadata})
-        cmd.extend(['--config', json.dumps(config)])
-
-        self.subprocess_check_call(cmd)
+        self._add_track_json(trackData)
 
         if gffOpts.get('index', 'false') == 'true':
             self.tracksToIndex.append("%s" % trackData['label'])
@@ -614,10 +665,19 @@
             "category": trackData['category'],
             "type": "JBrowse/View/Track/HTMLFeatures",
             "storeClass": "JBrowse/Store/SeqFeature/REST",
-            "baseUrl": url,
-            "query": {
-                "organism": "tyrannosaurus"
-            }
+            "baseUrl": url
+        }
+        self._add_track_json(data)
+
+    def add_sparql(self, url, query, trackData):
+        data = {
+            "label": trackData['label'],
+            "key": trackData['key'],
+            "category": trackData['category'],
+            "type": "JBrowse/View/Track/CanvasFeatures",
+            "storeClass": "JBrowse/Store/SeqFeature/SPARQL",
+            "urlTemplate": url,
+            "queryTemplate": query
         }
         self._add_track_json(data)
 
@@ -645,7 +705,8 @@
             '{': '__oc__',
             '}': '__cc__',
             '@': '__at__',
-            '#': '__pd__'
+            '#': '__pd__',
+            "": '__cn__'
         }
 
         for i, (dataset_path, dataset_ext, track_human_label, extra_metadata) in enumerate(track['trackfiles']):
@@ -656,18 +717,19 @@
             log.info('Processing %s / %s', category, track_human_label)
             outputTrackConfig['key'] = track_human_label
             # We add extra data to hash for the case of REST + SPARQL.
-            try:
+            if 'conf' in track and 'options' in track['conf'] and 'url' in track['conf']['options']:
                 rest_url = track['conf']['options']['url']
-            except KeyError:
+            else:
                 rest_url = ''
 
             # I chose to use track['category'] instead of 'category' here. This
             # is intentional. This way re-running the tool on a different date
             # will not generate different hashes and make comparison of outputs
             # much simpler.
-            hashData = [dataset_path, track_human_label, track['category'], rest_url]
+            hashData = [str(dataset_path), track_human_label, track['category'], rest_url]
             hashData = '|'.join(hashData).encode('utf-8')
             outputTrackConfig['label'] = hashlib.md5(hashData).hexdigest() + '_%s' % i
+            outputTrackConfig['metadata'] = extra_metadata
 
             # Colour parsing is complex due to different track types having
             # different colour options.
@@ -688,10 +750,13 @@
             # import sys; sys.exit()
             if dataset_ext in ('gff', 'gff3', 'bed'):
                 self.add_features(dataset_path, dataset_ext, outputTrackConfig,
-                                  track['conf']['options']['gff'], metadata=extra_metadata)
+                                  track['conf']['options']['gff'])
             elif dataset_ext == 'bigwig':
                 self.add_bigwig(dataset_path, outputTrackConfig,
-                                track['conf']['options']['wiggle'], metadata=extra_metadata)
+                                track['conf']['options']['wiggle'])
+            elif dataset_ext == 'bigwig_multiple':
+                self.add_bigwig_multiple(dataset_path, outputTrackConfig,
+                                         track['conf']['options']['wiggle'])
             elif dataset_ext == 'bam':
                 real_indexes = track['conf']['options']['pileup']['bam_indices']['bam_index']
                 if not isinstance(real_indexes, list):
@@ -706,13 +771,18 @@
 
                 self.add_bam(dataset_path, outputTrackConfig,
                              track['conf']['options']['pileup'],
-                             bam_index=real_indexes[i], metadata=extra_metadata)
+                             bam_index=real_indexes[i])
             elif dataset_ext == 'blastxml':
-                self.add_blastxml(dataset_path, outputTrackConfig, track['conf']['options']['blast'], metadata=extra_metadata)
+                self.add_blastxml(dataset_path, outputTrackConfig, track['conf']['options']['blast'])
             elif dataset_ext == 'vcf':
-                self.add_vcf(dataset_path, outputTrackConfig, metadata=extra_metadata)
+                self.add_vcf(dataset_path, outputTrackConfig)
             elif dataset_ext == 'rest':
-                self.add_rest(track['conf']['options']['url'], outputTrackConfig, metadata=extra_metadata)
+                self.add_rest(track['conf']['options']['rest']['url'], outputTrackConfig)
+            elif dataset_ext == 'sparql':
+                sparql_query = track['conf']['options']['sparql']['query']
+                for key, value in mapped_chars.items():
+                    sparql_query = sparql_query.replace(value, key)
+                self.add_sparql(track['conf']['options']['sparql']['url'], sparql_query, outputTrackConfig)
             else:
                 log.warn('Do not know how to handle %s', dataset_ext)
 
@@ -750,11 +820,43 @@
 
         if 'GCContent' in data['plugins_python']:
             self._add_track_json({
-                "storeClass": "JBrowse/Store/SeqFeature/SequenceChunks",
+                "storeClass": "JBrowse/Store/SeqFeature/IndexedFasta",
                 "type": "GCContent/View/Track/GCContentXY",
-                "label": "GCContentXY",
-                "urlTemplate": "seq/{refseq_dirpath}/{refseq}-",
-                "bicolor_pivot": 0.5
+                "label": "GC Content",
+                "key": "GCContentXY",
+                "urlTemplate": "seq/genome.fasta",
+                "bicolor_pivot": 0.5,
+                "category": "GC Content",
+                "metadata": {
+                    "tool_tool": '<a target="_blank" href="https://github.com/elsiklab/gccontent/commit/030180e75a19fad79478d43a67c566ec6">elsiklab/gccontent</a>',
+                    "tool_tool_version": "5c8b0582ecebf9edf684c76af8075fb3d30ec3fa",
+                    "dataset_edam_format": "",
+                    "dataset_size": "",
+                    "history_display_name": "",
+                    "history_user_email": "",
+                    "metadata_dbkey": "",
+                }
+                # TODO: Expose params for everyone.
+            })
+            self._add_track_json({
+                "storeClass": "JBrowse/Store/SeqFeature/IndexedFasta",
+                "type": "GCContent/View/Track/GCContentXY",
+                "label": "GC skew",
+                "key": "GCSkew",
+                "urlTemplate": "seq/genome.fasta",
+                "gcMode": "skew",
+                "min_score": -1,
+                "bicolor_pivot": 0,
+                "category": "GC Content",
+                "metadata": {
+                    "tool_tool": '<a target="_blank" href="https://github.com/elsiklab/gccontent/commit/030180e75a19fad79478d43a67c566ec6">elsiklab/gccontent</a>',
+                    "tool_tool_version": "5c8b0582ecebf9edf684c76af8075fb3d30ec3fa",
+                    "dataset_edam_format": "",
+                    "dataset_size": "",
+                    "history_display_name": "",
+                    "history_user_email": "",
+                    "metadata_dbkey": "",
+                }
                 # TODO: Expose params for everyone.
             })
 
@@ -785,6 +887,7 @@
                         ],
                         "type": "Faceted",
                         "title": ["Galaxy Metadata"],
+                        "icon": "https://galaxyproject.org/images/logos/galaxy-icon-square.png",
                         "escapeHTMLInData": False
                     },
                     "trackMetadata": {
@@ -833,12 +936,20 @@
     parser.add_argument('--jbrowse', help='Folder containing a jbrowse release')
     parser.add_argument('--outdir', help='Output directory', default='out')
     parser.add_argument('--standalone', help='Standalone mode includes a copy of JBrowse', action='store_true')
-    parser.add_argument('--version', '-V', action='version', version="%(prog)s 0.7.0")
+    parser.add_argument('--version', '-V', action='version', version="%(prog)s 0.8.0")
     args = parser.parse_args()
 
     tree = ET.parse(args.xml.name)
     root = tree.getroot()
 
+    # This should be done ASAP
+    GALAXY_INFRASTRUCTURE_URL = root.find('metadata/galaxyUrl').text
+    # Sometimes this comes as `localhost` without a protocol
+    if not GALAXY_INFRASTRUCTURE_URL.startswith('http'):
+        # so we'll prepend `http://` and hope for the best. Requests *should*
+        # be GET and not POST so it should redirect OK
+        GALAXY_INFRASTRUCTURE_URL = 'http://' + GALAXY_INFRASTRUCTURE_URL
+
     jc = JbrowseConnector(
         jbrowse=args.jbrowse,
         outdir=args.outdir,
@@ -871,11 +982,8 @@
             'show_menu': root.find('metadata/general/show_menu').text,
             'hideGenomeOptions': root.find('metadata/general/hideGenomeOptions').text,
         },
-        'plugins': [{
-            'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/blastview@97572a21b7f011c2b4d9a0b5af40e292d694cbef/',
-            'name': 'BlastView'
-        }],
-        'plugins_python': ['BlastView'],
+        'plugins': [],
+        'plugins_python': [],
     }
 
     plugins = root.find('plugins').attrib
@@ -886,19 +994,22 @@
             'name': 'GCContent'
         })
 
-    if plugins['Bookmarks'] == 'True':
-        extra_data['plugins'].append({
-            'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/bookmarks-jbrowse@5242694120274c86e1ccd5cb0e5e943e78f82393/',
-            'name': 'Bookmarks'
-        })
+    # Not needed in 1.16.1: it's built in the conda package now, and this plugin doesn't need to be enabled anywhere
+    # if plugins['Bookmarks'] == 'True':
+    #    extra_data['plugins'].append({
+    #        'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/bookmarks-jbrowse@5242694120274c86e1ccd5cb0e5e943e78f82393/',
+    #        'name': 'Bookmarks'
+    #    })
 
+    # Not needed in 1.16.1: it's built in the conda package now, and this plugin doesn't need to be enabled anywhere
     if plugins['ComboTrackSelector'] == 'True':
         extra_data['plugins_python'].append('ComboTrackSelector')
-        extra_data['plugins'].append({
-            'location': 'https://cdn.jsdelivr.net/gh/Arabidopsis-Information-Portal/ComboTrackSelector@52403928d5ccbe2e3a86b0fa5eb8e61c0f2e2f57',
-            'icon': 'https://galaxyproject.org/images/logos/galaxy-icon-square.png',
-            'name': 'ComboTrackSelector'
-        })
+        # Not needed in 1.16.1: it's built in the conda package now, and this plugin doesn't need to be enabled anywhere
+        # extra_data['plugins'].append({
+        #    'location': 'https://cdn.jsdelivr.net/gh/Arabidopsis-Information-Portal/ComboTrackSelector@52403928d5ccbe2e3a86b0fa5eb8e61c0f2e2f57/',
+        #    'icon': 'https://galaxyproject.org/images/logos/galaxy-icon-square.png',
+        #    'name': 'ComboTrackSelector'
+        # })
 
     if plugins['theme'] == 'Minimalist':
         extra_data['plugins'].append({
@@ -911,25 +1022,57 @@
             'name': 'DarkTheme'
         })
 
-    GALAXY_INFRASTRUCTURE_URL = root.find('metadata/galaxyUrl').text
-    # Sometimes this comes as `localhost` without a protocol
-    if not GALAXY_INFRASTRUCTURE_URL.startswith('http'):
-        # so we'll prepend `http://` and hope for the best. Requests *should*
-        # be GET and not POST so it should redirect OK
-        GALAXY_INFRASTRUCTURE_URL = 'http://' + GALAXY_INFRASTRUCTURE_URL
+    if plugins['BlastView'] == 'True':
+        extra_data['plugins_python'].append('BlastView')
+        extra_data['plugins'].append({
+            'location': 'https://cdn.jsdelivr.net/gh/TAMU-CPT/blastview@97572a21b7f011c2b4d9a0b5af40e292d694cbef/',
+            'name': 'BlastView'
+        })
 
     for track in root.findall('tracks/track'):
         track_conf = {}
         track_conf['trackfiles'] = []
 
-        for x in track.findall('files/trackFile'):
+        is_multi_bigwig = False
+        try:
+            if track.find('options/wiggle/multibigwig') and (track.find('options/wiggle/multibigwig').text == 'True'):
+                is_multi_bigwig = True
+                multi_bigwig_paths = []
+        except KeyError:
+            pass
+
+        trackfiles = track.findall('files/trackFile')
+        if trackfiles:
+            for x in track.findall('files/trackFile'):
+                if is_multi_bigwig:
+                    multi_bigwig_paths.append((x.attrib['label'], os.path.realpath(x.attrib['path'])))
+                else:
+                    if trackfiles:
+                        metadata = metadata_from_node(x.find('metadata'))
+
+                        track_conf['trackfiles'].append((
+                            os.path.realpath(x.attrib['path']),
+                            x.attrib['ext'],
+                            x.attrib['label'],
+                            metadata
+                        ))
+        else:
+            # For tracks without files (rest, sparql)
+            track_conf['trackfiles'].append((
+                '',  # N/A, no path for rest or sparql
+                track.attrib['format'],
+                track.find('options/label').text,
+                {}
+            ))
+
+        if is_multi_bigwig:
             metadata = metadata_from_node(x.find('metadata'))
 
             track_conf['trackfiles'].append((
-                os.path.realpath(x.attrib['path']),
-                x.attrib['ext'],
-                x.attrib['label'],
-                metadata
+                multi_bigwig_paths,  # Passing an array of paths to represent as one track
+                'bigwig_multiple',
+                'MultiBigWig',  # Giving an hardcoded name for now
+                {}  # No metadata for multiple bigwig
             ))
 
         track_conf['category'] = track.attrib['cat']
@@ -937,7 +1080,7 @@
         try:
             # Only pertains to gff3 + blastxml. TODO?
             track_conf['style'] = {t.tag: t.text for t in track.find('options/style')}
-        except TypeError as te:
+        except TypeError:
             track_conf['style'] = {}
             pass
         track_conf['conf'] = etree_to_dict(track.find('options'))
--- a/jbrowse.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/jbrowse.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -4,9 +4,8 @@
     <import>macros.xml</import>
   </macros>
   <expand macro="requirements"/>
-  <expand macro="stdio"/>
   <version_command>python '${__tool_directory__}/jbrowse.py' --version</version_command>
-  <command><![CDATA[
+  <command detect_errors="aggressive"><![CDATA[
 #if $action.action_select == "create":
     mkdir -p $output.files_path &&
 #else:
@@ -73,31 +72,29 @@
                   <metadata />
               </genome>s
             #else
-              #for $genome in $reference_genome.genomes:
-                  <genome path="$genome">
-                    <metadata>
-                      <dataset id="${__app__.security.encode_id($genome.id)}" hid="${genome.hid}"
-                          size="${genome.get_size(nice_size=True)}"
-                          edam_format="${genome.datatype.edam_format}"
-                          file_ext="${genome.ext}" />
-                      <history id="${__app__.security.encode_id($genome.history_id)}"
-                          user_email="${genome.history.user.email}"
-                          user_id="${genome.history.user_id}"
-                          display_name="${genome.history.get_display_name()}"/>
-                      <metadata
-                          #for (key, value) in $genome.get_metadata().items():
-                          #if "_types" not in $key:
-                          ${key}="${value}"
-                          #end if
-                          #end for
-                          />
-                      <tool
-                          tool_id="${genome.creating_job.tool_id}"
-                          tool_version="${genome.creating_job.tool_version}"
-                          />
-                    </metadata>
-                  </genome>
-              #end for
+              <genome path="$reference_genome.genome">
+                <metadata>
+                  <dataset id="${__app__.security.encode_id($reference_genome.genome.id)}" hid="${reference_genome.genome.hid}"
+                      size="${reference_genome.genome.get_size(nice_size=True)}"
+                      edam_format="${reference_genome.genome.datatype.edam_format}"
+                      file_ext="${reference_genome.genome.ext}" />
+                  <history id="${__app__.security.encode_id($reference_genome.genome.history_id)}"
+                      user_email="${reference_genome.genome.history.user.email}"
+                      user_id="${reference_genome.genome.history.user_id}"
+                      display_name="${reference_genome.genome.history.get_display_name()}"/>
+                  <metadata
+                      #for (key, value) in $reference_genome.genome.get_metadata().items():
+                      #if "_types" not in $key:
+                      ${key}="${value}"
+                      #end if
+                      #end for
+                      />
+                  <tool
+                      tool_id="${reference_genome.genome.creating_job.tool_id}"
+                      tool_version="${reference_genome.genome.creating_job.tool_version}"
+                      />
+                </metadata>
+              </genome>
             #end if
         </genomes>
         <general>
@@ -117,12 +114,8 @@
     <tracks>
         #for $tg in $track_groups:
         #for $track in $tg.data_tracks:
-        #if $track.data_format.data_format_select == "rest":
         <track cat="${tg.category}" format="${track.data_format.data_format_select}" visibility="${track.data_format.track_visibility}">
-            <url>${track.data_format.url}</url>
-        </track>
-        #else:
-        <track cat="${tg.category}" format="${track.data_format.data_format_select}" visibility="${track.data_format.track_visibility}">
+            #if $track.data_format.data_format_select != "rest" and $track.data_format.data_format_select != "sparql":
             <files>
               #for $dataset in $track.data_format.annotation:
               <trackFile path="${dataset}" ext="${dataset.ext}" label="${dataset.element_identifier}">
@@ -150,9 +143,10 @@
               </trackFile>
               #end for
             </files>
+            #end if
 
             <options>
-            #if str($track.data_format.data_format_select) == "gene_calls" or  str($track.data_format.data_format_select) == "blast":
+            #if str($track.data_format.data_format_select) == "gene_calls" or str($track.data_format.data_format_select) == "blast" or str($track.data_format.data_format_select) == "rest" or str($track.data_format.data_format_select) == "sparql":
                 <style>
                     <overridePlugins>${track.data_format.override_apollo_plugins}</overridePlugins>
                     <overrideDraggable>${track.data_format.override_apollo_drag}</overrideDraggable>
@@ -248,6 +242,7 @@
                   #else:
                     <bicolor_pivot>${track.data_format.jbcolor.bicolor_pivot.pivot_point}</bicolor_pivot>
                   #end if
+                  <multibigwig>${track.data_format.MultiBigWig}</multibigwig>
                 </wiggle>
             #else if str($track.data_format.data_format_select) == "pileup":
                 <pileup>
@@ -257,6 +252,7 @@
                         <bam_index>${dataset.metadata.bam_index}</bam_index>
                         #end for
                     </bam_indices>
+                    <chunkSizeLimit>${track.data_format.chunkSizeLimit}</chunkSizeLimit>
                 </pileup>
             #else if str($track.data_format.data_format_select) == "blast":
                 <blast>
@@ -290,25 +286,37 @@
                   #end if
                     <index>${track.data_format.index}</index>
                 </gff>
-##            #else if str($track.data_format.data_format_select) == "sparql":
-##                <sparql>
-##                    <url>${track.data_format.url}</url>
-##                    <label>${track.data_format.label}</label>
-##                    <!-- This is going to be an absolutey nightmare -->
-##                    <query>${track.data_format.query}</query>
-##                </sparql>
+            #else if str($track.data_format.data_format_select) == "rest":
+                <label>${track.data_format.label}</label>
+                <rest>
+                    <url>${track.data_format.url}</url>
+                </rest>
+            #else if str($track.data_format.data_format_select) == "sparql":
+                <label>${track.data_format.label}</label>
+                <sparql>
+                    <url>${track.data_format.url}</url>
+                    <query>${track.data_format.query}</query>
+                </sparql>
             #end if
             </options>
         </track>
-        #end if
         #end for
         #end for
     </tracks>
+    ## Disable plugins until https://github.com/GMOD/jbrowse/issues/1288 is fixed
+    ## <plugins
+    ##     ComboTrackSelector="${plugins.ComboTrackSelector}"
+    ##     Bookmarks="${plugins.Bookmarks}"
+    ##     GCContent="${plugins.GCContent}"
+    ##     BlastView="${plugins.BlastView}"
+    ##     theme="${plugins.theme}"
+    ##     />
     <plugins
         ComboTrackSelector="${plugins.ComboTrackSelector}"
-        Bookmarks="${plugins.Bookmarks}"
+        Bookmarks=""
         GCContent="${plugins.GCContent}"
-        theme="${plugins.theme}"
+        BlastView="${plugins.BlastView}"
+        theme=""
         />
 </root>]]></configfile>
   </configfiles>
@@ -335,9 +343,8 @@
             <param
               format="fasta"
               label="Select the reference genome"
-              name="genomes"
-              type="data"
-              multiple="True" />
+              name="genome"
+              type="data" />
         </when>
     </conditional>
 
@@ -390,7 +397,7 @@
                 <option value="wiggle">BigWig XY</option>
                 <option value="vcf">VCF SNPs</option>
                 <option value="rest">REST Endpoint</option>
-                <!--<option value="sparql">SPARQL</option>-->
+                <option value="sparql">SPARQL</option>
             </param>
             <when value="blast">
                 <expand macro="input_conditional" label="BlastXML Track Data" format="blastxml" />
@@ -456,7 +463,7 @@
                     <param type="select" label="JBrowse Track Type [Advanced]" name="track_class">
                         <option value="JBrowse/View/Track/HTMLFeatures">HTML Features</option>
                         <option value="JBrowse/View/Track/CanvasFeatures" selected="true">Canvas Features</option>
-                        <option value="BlastView/View/Track/CanvasFeatures">Blast Features</option>
+                        <option value="BlastView/View/Track/CanvasFeatures">Blast Features</option><!-- Disable plugins until https://github.com/GMOD/jbrowse/issues/1288 is fixed -->
                     </param>
                     <when value="JBrowse/View/Track/CanvasFeatures">
                         <section name="canvas_options" title="CanvasFeatures Options [Advanced]" expanded="false">
@@ -491,7 +498,7 @@
                                   optional="True"/>
                       </section>
                   </when>
-                  <when value="BlastView/View/Track/CanvasFeatures" />
+                  <!--when value="BlastView/View/Track/CanvasFeatures" /-->
                 </conditional>
                 <expand macro="track_styling" />
                 <expand macro="color_selection" />
@@ -506,6 +513,11 @@
                        name="auto_snp"
                        truevalue="true"
                        falsevalue="false" />
+                <param label="Maximum size of BAM chunks"
+                       name="chunkSizeLimit"
+                       type="integer"
+                       help="Maximum size in bytes of BAM chunks that the browser will try to deal with. When this is exceeded, most tracks will display 'Too much data' message."
+                       value="5000000" />
                 <expand macro="track_display" />
             </when>
             <when value="wiggle">
@@ -543,42 +555,93 @@
                     <option value="linear" selected="true">Linear</option>
                     <option value="log">Logarithmic (Dynamically Calculated)</option>
                 </param>
+
+                <param label="Use MultiBigWig Plugin" name="MultiBigWig" truevalue="True" falsevalue="" type="boolean"
+                    help="MultiBigWig is a plugin to group multiple big-wig tracks in a more aesthetically pleasing format and to show data in a higher density display." />
+
                 <expand macro="color_selection_minmax" />
                 <expand macro="track_display" />
             </when>
             <when value="rest">
                 <param type="text" label="REST Endpoint" name="url" />
+                <param type="text" label="Track Label" name="label" value="REST Genes" />
+                <expand macro="track_styling"
+                        classname="feature"
+                        label="description"
+                        description="Hit_titles"
+                        height="600px"/>
+                <expand macro="color_selection"
+                        token_scaling_lin_select="false"
+                        token_scaling_log_select="true" />
+                <expand macro="track_menu" />
+                <expand macro="track_display" />
             </when>
-            <!--
+
             <when value="sparql">
                 <param type="text" label="SPARQL Server URL" name="url" />
-                <param type="text" label="Track Label" name="key" value="SPARQL Genes" />
-                <param type="text" label="SPARQL Query" name="query" area="true" />
+                <param type="text" label="Track Label" name="label" value="SPARQL Genes" />
+                <param type="text" label="SPARQL Query" name="query" area="true">
+                    <sanitizer>
+                         <mapping initial="galaxy.util.mapped_chars">
+                           <add source="&#10;" target=" " />
+                           <add source="&gt;" target="__gt__" />
+                           <add source="&lt;" target="__lt__" />
+                         </mapping>
+                         <valid initial="default">
+                           <add value="|" />
+                           <add value="#" />
+                           <add value="{"/>
+                           <add value="}"/>
+                           <add value="!"/>
+                           <add value="?"/>
+                           <add value="&amp;"/>
+                           <add value="+"/>
+                           <add value="="/>
+                           <add value="'"/>
+                           <add value='"'/>
+                         </valid>
+                    </sanitizer>
+                </param>
+                <expand macro="track_styling"
+                        classname="feature"
+                        label="description"
+                        description="Hit_titles"
+                        height="600px"/>
+                <expand macro="color_selection"
+                        token_scaling_lin_select="false"
+                        token_scaling_log_select="true" />
+                <expand macro="track_menu" />
                 <expand macro="track_display" />
             </when>
-            -->
         </conditional>
     </repeat>
     </repeat>
 
     <expand macro="general_options" />
+    <!-- Disable plugins until https://github.com/GMOD/jbrowse/issues/1288 is fixed -->
     <section name="plugins" title="Plugins" expanded="false">
+
+        <param
+            label="BlastView" name="BlastView" truevalue="True" falsevalue="" type="boolean" checked="true"
+            help="A JBrowse plugin for viewing blast alignments. This plugin makes MANY assumptions about the format of your data, and may not work without those assumptions: 1) you use protein_match / match_part 2) your features have a Blast_qseq, Blast_mseq, and Blast_sseq attribute in their GFF3 representation." />
+
         <param
             label="Combo Track Selector" name="ComboTrackSelector" truevalue="True" falsevalue="" type="boolean"
             help="ComboTrackSelector is a plugin to allow the co-existence of the Hierarchical and Faceted Track selectors in JBrowse, built for/by the Arabidopsis Information Portal (Araport) project" />
-        <param
+        <!-- No way to disable now that it's built in jbrowse conda package -->
+        <!--param
             label="Bookmarks" name="Bookmarks" truevalue="True" falsevalue="" type="boolean"
-            help="JBrowse plugin allowing users to manage a persistent list of bookmarks kept in localstorage" />
+            help="JBrowse plugin allowing users to manage a persistent list of bookmarks kept in localstorage" /-->
 
         <param
             label="GC Content" name="GCContent" truevalue="True" falsevalue="" type="boolean"
             help="A JBrowse plugin for plotting GC Content and GC Skew. The plugin consists of a storeClass that automatically calculates the percentage of G/C bases in a region, a track type that derives from the Wiggle XY or density types, and a dialog box to adjust the sliding window size, window step size, and the calculation mode (content or skew)." />
 
-        <param type="select" label="JBrowse Theme" name="theme">
+        <!--param type="select" label="JBrowse Theme" name="theme">
             <option value="" selected="True">Default</option>
             <option value="Minimalist">Minimalist</option>
             <option value="Dark">Dark</option>
-        </param>
+        </param-->
     </section>
 
     <param type="hidden" name="uglyTestingHack" value="" />
@@ -590,7 +653,7 @@
     <test>
       <!-- gencode -->
       <param name="reference_genome|genome_type_select" value="history"/>
-      <param name="reference_genome|genomes" value="merlin.fa"/>
+      <param name="reference_genome|genome" value="merlin.fa"/>
       <param name="gencode" value="1" />
       <param name="standalone" value="Data Directory" />
       <param name="uglyTestingHack" value="enabled" />
@@ -598,7 +661,7 @@
     </test>
     <test>
       <param name="reference_genome|genome_type_select" value="history"/>
-      <param name="reference_genome|genomes" value="merlin.fa"/>
+      <param name="reference_genome|genome" value="merlin.fa"/>
       <param name="gencode" value="11" />
       <param name="standalone" value="Data Directory" />
       <param name="uglyTestingHack" value="enabled" />
@@ -606,7 +669,7 @@
     </test>
     <test>
       <param name="reference_genome|genome_type_select" value="history"/>
-      <param name="reference_genome|genomes" value="merlin.fa"/>
+      <param name="reference_genome|genome" value="merlin.fa"/>
       <param name="gencode" value="11" />
       <param name="standalone" value="Data Directory" />
       <repeat name="track_groups">
@@ -802,7 +865,7 @@
     </test>
     <test>
         <param name="reference_genome|genome_type_select" value="history"/>
-        <param name="reference_genome|genomes" value="merlin.fa"/>
+        <param name="reference_genome|genome" value="merlin.fa"/>
         <param name="gencode" value="11" />
         <param name="standalone" value="Data Directory" />
 
@@ -865,7 +928,7 @@
     </test>
     <test>
         <param name="reference_genome|genome_type_select" value="history"/>
-        <param name="reference_genome|genomes" value="merlin.fa"/>
+        <param name="reference_genome|genome" value="merlin.fa"/>
         <param name="gencode" value="11" />
         <param name="standalone" value="Data Directory" />
 
@@ -902,7 +965,7 @@
     </test>
     <test>
         <param name="reference_genome|genome_type_select" value="history"/>
-        <param name="reference_genome|genomes" value="merlin.fa"/>
+        <param name="reference_genome|genome" value="merlin.fa"/>
         <param name="gencode" value="11" />
         <param name="standalone" value="Data Directory" />
 
@@ -923,12 +986,59 @@
     <test>
         <!-- data_table -->
         <param name="reference_genome|genome_type_select" value="indexed"/>
-        <param name="reference_genome|genomes" value="merlin"/>
+        <param name="reference_genome|genome" value="merlin"/>
         <param name="gencode" value="1" />
         <param name="standalone" value="Data Directory" />
         <param name="uglyTestingHack" value="enabled" />
         <output name="output" file="gencode/test-data_table.xml" lines_diff="6" />
     </test>
+
+    <test>
+        <param name="reference_genome|genome_type_select" value="history"/>
+        <param name="reference_genome|genome" value="merlin.fa"/>
+        <param name="gencode" value="11" />
+        <param name="standalone" value="Data Directory" />
+
+        <repeat name="track_groups">
+            <param name="category" value="External endpoints" />
+            <repeat name="data_tracks">
+                <conditional name="data_format">
+                    <param name="data_format_select" value="rest"/>
+                    <param name="url" value="http://example.org.external/rest_api/"/>
+                    <param name="label" value="Rest api"/>
+                </conditional>
+            </repeat>
+            <repeat name="data_tracks">
+                <conditional name="data_format">
+                    <param name="data_format_select" value="sparql"/>
+                    <param name="url" value="http://example.org.external/sparql/"/>
+                    <param name="label" value="Sparql endpoint"/>
+                    <param name="query" value="  DEFINE sql:select-option 'order'
+  prefix rdf:    &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt;
+  select ?start,
+         ?end,
+         IF( ?faldo_type = faldo:ForwardStrandPosition,
+             1,
+             IF( ?faldo_type = faldo:ReverseStrandPosition,
+                 -1,
+                  0
+               )
+           ) as ?strand,
+         str(?obj_type_name) as ?type,
+         str(?label) as ?name,
+         str(?obj_name) as ?description,
+         ?obj as ?uniqueID,
+         ?parent as ?parentUniqueID
+  where {
+    values ?faldo_type { faldo:ForwardStrandPosition faldo:ReverseStrandPosition faldo:BothStrandsPosition }
+  }"/>
+                </conditional>
+            </repeat>
+        </repeat>
+
+        <param name="uglyTestingHack" value="enabled" />
+        <output name="output" file="endpoints/test.xml" lines_diff="48"/>
+    </test>
   </tests>
   <help><![CDATA[
 JBrowse-in-Galaxy
@@ -952,9 +1062,9 @@
 javascript functions to handle colouring of features which would be
 nearly impossible to write without the assistance of this tool.
 
-The JBrowse-in-Galaxy tool is maintained by `Eric
-Rasche <mailto:esr+jig@tamu.edu>`__, who you can contact if you
-encounter missing features or bugs.
+The JBrowse-in-Galaxy tool is maintained by `the Galaxy IUC
+<https://github.com/galaxyproject/tools-iuc/issues>`__, who you can help you
+with missing features or bugs in the tool.
 
 Options
 -------
@@ -966,11 +1076,12 @@
 will be shown from the dropdown selector within JBrowse, this is a known
 issue.
 
-**Standalone Instances** are a somewhat in-development feature.
+**Standalone Instances** enable you to have either a complete JBrowse instance
+in a dataset, or just the data directory without JBrowse (e.g. for Apollo).
 Currently Galaxy copies the entire JBrowse directory in order to have a
 complete, downloadable file that contains a ready-to-go JBrowse
 instance. This is obviously an anti-feature because users don't want a
-complete copy of JBrowse (6-20Mb) that's duplicated for every JBrowse
+complete copy of JBrowse (12Mb) that's duplicated for every JBrowse
 dataset in their history, and admins don't want useless copies of
 JBrowse on disk. Unfortunately we have not come up with the perfect
 solution just yet, but we're working on it! In the meantime, users have
@@ -981,10 +1092,7 @@
 
 **Genetic Code** is a new feature in v0.4 of JiG / v1.12.0 of JBrowse,
 which allows users to specify a non standard genetic code, and have
-JBrowse highlight the correct start and stop codons. If you would like
-to use a coding table not provided by this list, please let
-`me <mailto:esr+jig@tamu.edu>`__ know so that I may add support for
-this.
+JBrowse highlight the correct start and stop codons.
 
 **Track Groups** represent a set of tracks in a single category. These
 can be used to let your users understand relationships between large
@@ -1086,8 +1194,7 @@
 
 This is *strongly discouraged* for high coverage density datasets.
 Unfortunately there are no other configuration options exposed for bam
-files. If you find JBrowse options you wish to see exposed, please let
-`me <mailto:esr+jig@tamu.edu>`__ know.
+files.
 
 BlastXML
 ~~~~~~~~
--- a/macros.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/macros.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -1,27 +1,20 @@
 <?xml version="1.0"?>
 <macros>
-  <token name="@TOOL_VERSION@">1.12.5</token>
+  <token name="@TOOL_VERSION@">1.16.1</token>
   <xml name="requirements">
     <requirements>
       <requirement type="package" version="@TOOL_VERSION@">jbrowse</requirement>
       <requirement type="package" version="2.7">python</requirement>
-      <requirement type="package" version="1.66">biopython</requirement>
-      <requirement type="package" version="0.6.2">bcbiogff</requirement>
-      <requirement type="package" version="1.2">samtools</requirement>
-      <requirement type="package" version="3.11">pyyaml</requirement>
+      <requirement type="package" version="1.72">biopython</requirement>
+      <requirement type="package" version="0.6.4">bcbiogff</requirement>
+      <requirement type="package" version="1.9">samtools</requirement>
+      <requirement type="package" version="3.13">pyyaml</requirement>
+      <requirement type="package" version="0.2.6">tabix</requirement>
       <yield/>
     </requirements>
   </xml>
   <token name="@DATA_DIR@">\$GALAXY_JBROWSE_SHARED_DIR</token>
-  <token name="@WRAPPER_VERSION@">galaxy3</token>
-  <xml name="stdio">
-    <stdio>
-      <exit_code range="1:"/>
-      <exit_code range=":-1"/>
-      <regex match="Error:"/>
-      <regex match="Exception:"/>
-    </stdio>
-  </xml>
+  <token name="@WRAPPER_VERSION@">galaxy0</token>
   <token name="@ATTRIBUTION@"><![CDATA[
 **Attribution**
 
--- a/readme.rst	Wed Jan 16 03:28:29 2019 -0500
+++ b/readme.rst	Tue Jan 29 05:34:16 2019 -0500
@@ -25,18 +25,31 @@
 History
 =======
 
--  0.7 Support for plugins (currently GC Content, Bookmarks, ComboTrackSelector),
-   track metadata
--  0.5.2 Support for CanvasFeatures options.
--  0.5.1 Support for contextual menus. Conda tests.
--  0.5 Update existing instances on disk. Index names. Support HTML tracks
-   instead of Canvas. Support default tracks. General JBrowse optinos
--  0.4 Support for dataset collections and customisation of tracks including
-   labelling, colours, styling. Added support for genetic code selection.
-   Fixed package installation recipe issues.
--  0.3 Added support for BigWig, etc.
--  0.2 Added support for BAM, Blast, VCF.
--  0.1 Initial public release.
+- 1.16.1+galaxy0
+
+    - UPDATED to JBrowse 1.16.1
+    - ADDED support for MultiBigWig plugin
+    - ADDED support for tabix indexing of fasta and gff
+    - ADDED support for REST and SPARQL endpoints
+    - ADDED option to change chunk size for BAM tracks
+    - FIXED loading of VCF files. They were gzipped and the URLs were incorrect
+    - FIXED metadata on tracks types other than GFF+HTML
+    - FIXED infrastructure URL parsing (and embedding in links) for some tracks
+    - REMOVED support for selecting multiple genomes as input due to tracking of track metadata
+    - REMOVED support for themes as JBrowse no longer allow runtime loading of plugins
+
+- 0.7 Support for plugins (currently GC Content, Bookmarks, ComboTrackSelector),
+  track metadata
+- 0.5.2 Support for CanvasFeatures options.
+- 0.5.1 Support for contextual menus. Conda tests.
+- 0.5 Update existing instances on disk. Index names. Support HTML tracks
+  instead of Canvas. Support default tracks. General JBrowse optinos
+- 0.4 Support for dataset collections and customisation of tracks including
+  labelling, colours, styling. Added support for genetic code selection.
+  Fixed package installation recipe issues.
+- 0.3 Added support for BigWig, etc.
+- 0.2 Added support for BAM, Blast, VCF.
+- 0.1 Initial public release.
 
 Wrapper License (MIT/BSD Style)
 ===============================
--- a/test-data/bam/test.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/bam/test.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -3,27 +3,27 @@
     <metadata>
         <gencode>11</gencode>
         <genomes>
-                  <genome path="/tmp/tmpfqQZDj/files/000/dataset_2.dat">
-                    <metadata>
-                      <dataset id="9a22496ee796fbfc" hid="1"
-                          size="171.6 KB"
-                          edam_format="format_1929"
-                          file_ext="fasta" />
-                      <history id="fa6d20d0fb68383f"
-                          user_email="test@bx.psu.edu"
-                          user_id="2"
-                          display_name="test_history"/>
-                      <metadata
-                          dbkey="hg17"
-                          data_lines="2881"
-                          sequences="1"
-                          />
-                      <tool
-                          tool_id="upload1"
-                          tool_version="1.1.4"
-                          />
-                    </metadata>
-                  </genome>
+              <genome path="/tmp/tmpWtvfKr/files/000/dataset_20.dat">
+                <metadata>
+                  <dataset id="b28067233c6d9fa0" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="fa6d20d0fb68383f"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
         </genomes>
         <general>
             <defaultLocation></defaultLocation>
@@ -40,33 +40,33 @@
         <galaxyUrl>http://localhost</galaxyUrl>
     </metadata>
     <tracks>
-        <track cat="Aligned reads" format="pileup" visibility="default_off">
+        <track cat="Auto Coloured" format="pileup" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpfqQZDj/files/000/dataset_1.dat" ext="bam" label="merlin-sample.bam">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_21.dat" ext="bam" label="merlin-sample.bam">
                 <metadata>
-                  <dataset id="2891970512fa2d5a" hid="1"
+                  <dataset id="c18708cec3343c17" hid="2"
                       size="12.9 KB"
                       edam_format="format_2572"
                       file_ext="bam" />
-                  <history id="2891970512fa2d5a"
-                      user_email="planemo@galaxyproject.org"
-                      user_id="1"
-                      display_name="Unnamed history"/>
+                  <history id="fa6d20d0fb68383f"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
-                      bam_index="__lt__galaxy.model.MetadataFile object at 0x7fc42c1d18d0__gt__"
+                      dbkey="?"
+                      bam_index="__lt__galaxy.model.MetadataFile object at 0x7f6200f6d1d0__gt__"
                       bam_version="1.3"
                       sort_order="coordinate"
                       read_groups=""
-                      reference_names="[SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc4484b3170 on: u__sq__Merlin__sq__]"
+                      reference_names="[SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f62008d8a70 on: u__sq__Merlin__sq__]"
                       reference_lengths="[172788]"
-                      bam_header="{SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857fb90 on: u__sq__SQ__sq__: [{SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857fe90 on: u__sq__LN__sq__: 172788, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f7d0 on: u__sq__SN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f9b0 on: u__sq__Merlin__sq__}], SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857fef0 on: u__sq__PG__sq__: [{SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f0b0 on: u__sq__PN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f1d0 on: u__sq__minimap2__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f3b0 on: u__sq__ID__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f830 on: u__sq__minimap2__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f2f0 on: u__sq__VN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f170 on: u__sq__2.5-r572__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857fb30 on: u__sq__CL__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f950 on: u__sq__minimap2 -a -x sr -t 1 reference.fa /net/datasrv3hs.sanbi.ac.za/datastore/cip0/software/galaxy/galaxy-ctb/galaxy/database/files/004/dataset_4697.dat__sq__}], SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f230 on: u__sq__HD__sq__: {SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f110 on: u__sq__SO__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f410 on: u__sq__coordinate__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f470 on: u__sq__VN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc44857f290 on: u__sq__1.3__sq__}}"
+                      bam_header="{SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f62006f0a10 on: u__sq__SQ__sq__: [{SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f62006f0d70 on: u__sq__LN__sq__: 172788, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f62006f0f50 on: u__sq__SN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0470 on: u__sq__Merlin__sq__}], SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0b90 on: u__sq__PG__sq__: [{SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe07d0 on: u__sq__PN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0d10 on: u__sq__minimap2__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0590 on: u__sq__ID__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0cb0 on: u__sq__minimap2__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe03b0 on: u__sq__VN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0ad0 on: u__sq__2.5-r572__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0e90 on: u__sq__CL__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe00b0 on: u__sq__minimap2 -a -x sr -t 1 reference.fa /net/datasrv3hs.sanbi.ac.za/datastore/cip0/software/galaxy/galaxy-ctb/galaxy/database/files/004/dataset_4697.dat__sq__}], SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0a10 on: u__sq__HD__sq__: {SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0830 on: u__sq__SO__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0350 on: u__sq__coordinate__sq__, SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200fe0e30 on: u__sq__VN__sq__: SafeStringWrapper(unicode:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f62008d10b0 on: u__sq__1.3__sq__}}"
                       columns="12"
-                      column_names="[SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448337b50 on: __sq__QNAME__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448337838 on: __sq__FLAG__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448337578 on: __sq__RNAME__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc4483377e0 on: __sq__POS__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc4483373c0 on: __sq__MAPQ__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448337470 on: __sq__CIGAR__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448256260 on: __sq__MRNM__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc4482560a8 on: __sq__MPOS__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448256470 on: __sq__ISIZE__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448256628 on: __sq__SEQ__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448256158 on: __sq__QUAL__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7fc448256730 on: __sq__OPT__sq__]"
+                      column_names="[SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95f18 on: __sq__QNAME__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e958e8 on: __sq__FLAG__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e957e0 on: __sq__RNAME__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95b50 on: __sq__POS__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95788 on: __sq__MAPQ__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95730 on: __sq__CIGAR__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95d60 on: __sq__MRNM__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95d08 on: __sq__MPOS__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95c58 on: __sq__ISIZE__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e952b8 on: __sq__SEQ__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95418 on: __sq__QUAL__sq__, SafeStringWrapper(str:__lt__class __sq__galaxy.tools.wrappers.ToolParameterValueWrapper__sq____gt__,__lt__class __sq__galaxy.util.object_wrapper.SafeStringWrapper__sq____gt__,__lt__class __sq__numbers.Number__sq____gt__,__lt__type __sq__NoneType__sq____gt__,__lt__type __sq__NotImplementedType__sq____gt__,__lt__type __sq__bool__sq____gt__,__lt__type __sq__bytearray__sq____gt__,__lt__type __sq__ellipsis__sq____gt__) object at 7f6200e95998 on: __sq__OPT__sq__]"
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -77,7 +77,7 @@
                 <pileup>
                     <auto_snp>false</auto_snp>
                     <bam_indices>
-                        <bam_index>/tmp/tmpfqQZDj/files/_metadata_files/000/metadata_1.dat</bam_index>
+                        <bam_index>/tmp/tmpWtvfKr/files/_metadata_files/000/metadata_1.dat</bam_index>
                     </bam_indices>
                 </pileup>
             </options>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/endpoints/test.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+              <genome path="/tmp/tmpdcb31B/files/000/dataset_24.dat">
+                <metadata>
+                  <dataset id="a1e670e1ea0da54b" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="a90a30fafe298e1e"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
+        </genomes>
+        <general>
+            <defaultLocation></defaultLocation>
+            <trackPadding>20</trackPadding>
+
+            <shareLink>true</shareLink>
+            <aboutDescription></aboutDescription>
+            <show_tracklist>true</show_tracklist>
+            <show_nav>true</show_nav>
+            <show_overview>true</show_overview>
+            <show_menu>true</show_menu>
+            <hideGenomeOptions>false</hideGenomeOptions>
+        </general>
+        <galaxyUrl>http://localhost</galaxyUrl>
+    </metadata>
+    <tracks>
+        <track cat="External endpoints" format="rest" visibility="default_off">
+
+            <options>
+                <style>
+                    <overridePlugins>False</overridePlugins>
+                    <overrideDraggable>False</overrideDraggable>
+                    <className>feature</className>
+                    <description>Hit_titles</description>
+                    <label>description</label>
+                    <height>600px</height>
+                    <maxHeight>600</maxHeight>
+                </style>
+                <scaling>
+                        <method>ignore</method>
+                        <scheme>
+                            <color>__auto__</color>
+                        </scheme>
+                </scaling>
+                <menus>
+                </menus>
+
+                <label>Rest api</label>
+                <rest>
+                    <url>http://example.org.external/rest_api/</url>
+                </rest>
+            </options>
+        </track>
+        <track cat="External endpoints" format="sparql" visibility="default_off">
+
+            <options>
+                <style>
+                    <overridePlugins>False</overridePlugins>
+                    <overrideDraggable>False</overrideDraggable>
+                    <className>feature</className>
+                    <description>Hit_titles</description>
+                    <label>description</label>
+                    <height>600px</height>
+                    <maxHeight>600</maxHeight>
+                </style>
+                <scaling>
+                        <method>ignore</method>
+                        <scheme>
+                            <color>__auto__</color>
+                        </scheme>
+                </scaling>
+                <menus>
+                </menus>
+
+                <label>Sparql endpoint</label>
+                <sparql>
+                    <url>http://example.org.external/sparql/</url>
+                    <query>  DEFINE sql:select-option 'order'   prefix rdf:    __lt__http://www.w3.org/1999/02/22-rdf-syntax-ns#__gt__   select ?start,          ?end,          IF( ?faldo_type = faldo:ForwardStrandPosition,              1,              IF( ?faldo_type = faldo:ReverseStrandPosition,                  -1,                   0                )            ) as ?strand,          str(?obj_type_name) as ?type,          str(?label) as ?name,          str(?obj_name) as ?description,          ?obj as ?uniqueID,          ?parent as ?parentUniqueID   where {     values ?faldo_type { faldo:ForwardStrandPosition faldo:ReverseStrandPosition faldo:BothStrandsPosition }   }</query>
+                </sparql>
+            </options>
+        </track>
+    </tracks>
+    <plugins
+        ComboTrackSelector=""
+        Bookmarks=""
+        GCContent=""
+        BlastView="True"
+        theme=""
+        />
+</root>
--- a/test-data/gencode/test-1.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/gencode/test-1.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -3,27 +3,27 @@
     <metadata>
         <gencode>1</gencode>
         <genomes>
-                  <genome path="/tmp/tmpnh6QWY/files/000/dataset_1.dat">
-                    <metadata>
-                      <dataset id="2891970512fa2d5a" hid="1"
-                          size="171.6 KB"
-                          edam_format="format_1929"
-                          file_ext="fasta" />
-                      <history id="2891970512fa2d5a"
-                          user_email="test@bx.psu.edu"
-                          user_id="2"
-                          display_name="test_history"/>
-                      <metadata
-                          dbkey="hg17"
-                          data_lines="2881"
-                          sequences="1"
-                          />
-                      <tool
-                          tool_id="upload1"
-                          tool_version="1.1.4"
-                          />
-                    </metadata>
-                  </genome>
+              <genome path="/tmp/tmpZA6JJa/files/000/dataset_1.dat">
+                <metadata>
+                  <dataset id="2891970512fa2d5a" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="2891970512fa2d5a"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
         </genomes>
         <general>
             <defaultLocation></defaultLocation>
@@ -37,7 +37,7 @@
             <show_menu>true</show_menu>
             <hideGenomeOptions>false</hideGenomeOptions>
         </general>
-        <galaxyUrl>http://localhost:8080</galaxyUrl>
+        <galaxyUrl>http://localhost</galaxyUrl>
     </metadata>
     <tracks>
     </tracks>
@@ -45,6 +45,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
 </root>
--- a/test-data/gencode/test-data_table.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/gencode/test-data_table.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -27,6 +27,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
 </root>
--- a/test-data/gencode/test.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/gencode/test.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -3,27 +3,27 @@
     <metadata>
         <gencode>11</gencode>
         <genomes>
-                  <genome path="/tmp/tmpnh6QWY/files/000/dataset_3.dat">
-                    <metadata>
-                      <dataset id="54f2a3a23292eb07" hid="1"
-                          size="171.6 KB"
-                          edam_format="format_1929"
-                          file_ext="fasta" />
-                      <history id="5729865256bc2525"
-                          user_email="test@bx.psu.edu"
-                          user_id="2"
-                          display_name="test_history"/>
-                      <metadata
-                          dbkey="hg17"
-                          data_lines="2881"
-                          sequences="1"
-                          />
-                      <tool
-                          tool_id="upload1"
-                          tool_version="1.1.4"
-                          />
-                    </metadata>
-                  </genome>
+              <genome path="/tmp/tmpZA6JJa/files/000/dataset_3.dat">
+                <metadata>
+                  <dataset id="54f2a3a23292eb07" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="5729865256bc2525"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
         </genomes>
         <general>
             <defaultLocation></defaultLocation>
@@ -37,7 +37,7 @@
             <show_menu>true</show_menu>
             <hideGenomeOptions>false</hideGenomeOptions>
         </general>
-        <galaxyUrl>http://localhost:8080</galaxyUrl>
+        <galaxyUrl>http://localhost</galaxyUrl>
     </metadata>
     <tracks>
     </tracks>
--- a/test-data/gff3/test.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/gff3/test.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -3,27 +3,27 @@
     <metadata>
         <gencode>11</gencode>
         <genomes>
-                  <genome path="/tmp/tmpnh6QWY/files/000/dataset_5.dat">
-                    <metadata>
-                      <dataset id="7b55dbb89df8f4e5" hid="1"
-                          size="171.6 KB"
-                          edam_format="format_1929"
-                          file_ext="fasta" />
-                      <history id="54f2a3a23292eb07"
-                          user_email="test@bx.psu.edu"
-                          user_id="2"
-                          display_name="test_history"/>
-                      <metadata
-                          dbkey="hg17"
-                          data_lines="2881"
-                          sequences="1"
-                          />
-                      <tool
-                          tool_id="upload1"
-                          tool_version="1.1.4"
-                          />
-                    </metadata>
-                  </genome>
+              <genome path="/tmp/tmpWtvfKr/files/000/dataset_5.dat">
+                <metadata>
+                  <dataset id="7b55dbb89df8f4e5" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="54f2a3a23292eb07"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
         </genomes>
         <general>
             <defaultLocation></defaultLocation>
@@ -37,12 +37,12 @@
             <show_menu>true</show_menu>
             <hideGenomeOptions>false</hideGenomeOptions>
         </general>
-        <galaxyUrl>http://localhost:8080</galaxyUrl>
+        <galaxyUrl>http://localhost</galaxyUrl>
     </metadata>
     <tracks>
         <track cat="Auto Coloured" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_6.dat" ext="gff3" label="A.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_6.dat" ext="gff3" label="A.gff">
                 <metadata>
                   <dataset id="fa6d20d0fb68383f" hid="2"
                       size="2.3 KB"
@@ -53,7 +53,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -63,11 +63,11 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_7.dat" ext="gff3" label="B.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_7.dat" ext="gff3" label="B.gff">
                 <metadata>
                   <dataset id="683bc220e21425bb" hid="3"
                       size="2.3 KB"
@@ -78,7 +78,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -88,11 +88,11 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_8.dat" ext="gff3" label="C.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_8.dat" ext="gff3" label="C.gff">
                 <metadata>
                   <dataset id="a90a30fafe298e1e" hid="4"
                       size="2.3 KB"
@@ -103,7 +103,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -113,11 +113,11 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_9.dat" ext="gff3" label="D.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_9.dat" ext="gff3" label="D.gff">
                 <metadata>
                   <dataset id="b842d972534ccb3e" hid="5"
                       size="2.3 KB"
@@ -128,7 +128,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -138,7 +138,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -171,7 +171,7 @@
         </track>
         <track cat="Ignore Scale" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_10.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_10.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="5449172d6ff5669b" hid="6"
                       size="2.3 KB"
@@ -182,7 +182,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -192,7 +192,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -225,7 +225,7 @@
         </track>
         <track cat="Scaled Colour" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_10.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_10.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="5449172d6ff5669b" hid="6"
                       size="2.3 KB"
@@ -236,7 +236,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -246,7 +246,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -285,7 +285,7 @@
         </track>
         <track cat="Scaled Colour" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_10.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_10.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="5449172d6ff5669b" hid="6"
                       size="2.3 KB"
@@ -296,7 +296,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -306,7 +306,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -345,7 +345,7 @@
         </track>
         <track cat="Scaled Colour" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_10.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_10.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="5449172d6ff5669b" hid="6"
                       size="2.3 KB"
@@ -356,7 +356,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -366,7 +366,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -407,7 +407,7 @@
         </track>
         <track cat="Scaled Colour" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_10.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_10.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="5449172d6ff5669b" hid="6"
                       size="2.3 KB"
@@ -418,7 +418,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -428,7 +428,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -469,7 +469,7 @@
         </track>
         <track cat="Realistic" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_11.dat" ext="gff3" label="interpro.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_11.dat" ext="gff3" label="interpro.gff">
                 <metadata>
                   <dataset id="9ce08b2254e4d5ed" hid="7"
                       size="103.3 KB"
@@ -480,7 +480,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="556"
                       comment_lines="2"
                       columns="9"
@@ -490,7 +490,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -523,7 +523,7 @@
         </track>
         <track cat="Realistic" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_12.dat" ext="gff3" label="2.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_12.dat" ext="gff3" label="2.gff">
                 <metadata>
                   <dataset id="80b8022ff3f677b7" hid="8"
                       size="326 bytes"
@@ -534,7 +534,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="3"
                       comment_lines="3"
                       columns="9"
@@ -544,7 +544,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -581,6 +581,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
 </root>
--- a/test-data/menus/test.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/menus/test.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -3,27 +3,27 @@
     <metadata>
         <gencode>11</gencode>
         <genomes>
-                  <genome path="/tmp/tmpnh6QWY/files/000/dataset_14.dat">
-                    <metadata>
-                      <dataset id="1ae74d26531588b0" hid="1"
-                          size="171.6 KB"
-                          edam_format="format_1929"
-                          file_ext="fasta" />
-                      <history id="8155e4b4bf1581ff"
-                          user_email="test@bx.psu.edu"
-                          user_id="2"
-                          display_name="test_history"/>
-                      <metadata
-                          dbkey="hg17"
-                          data_lines="2881"
-                          sequences="1"
-                          />
-                      <tool
-                          tool_id="upload1"
-                          tool_version="1.1.4"
-                          />
-                    </metadata>
-                  </genome>
+              <genome path="/tmp/tmpWtvfKr/files/000/dataset_14.dat">
+                <metadata>
+                  <dataset id="1ae74d26531588b0" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="8155e4b4bf1581ff"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
         </genomes>
         <general>
             <defaultLocation></defaultLocation>
@@ -37,12 +37,12 @@
             <show_menu>true</show_menu>
             <hideGenomeOptions>false</hideGenomeOptions>
         </general>
-        <galaxyUrl>http://localhost:8080</galaxyUrl>
+        <galaxyUrl>http://localhost</galaxyUrl>
     </metadata>
     <tracks>
         <track cat="With menu or index" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_15.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_15.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="440a6c2b5d9efe20" hid="2"
                       size="2.3 KB"
@@ -53,7 +53,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -63,7 +63,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -110,7 +110,7 @@
         </track>
         <track cat="With menu or index" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_15.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_15.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="440a6c2b5d9efe20" hid="2"
                       size="2.3 KB"
@@ -121,7 +121,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -131,7 +131,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -169,4 +169,4 @@
         GCContent=""
         theme=""
         />
-</root>
+</root>
\ No newline at end of file
--- a/test-data/track_config/test.xml	Wed Jan 16 03:28:29 2019 -0500
+++ b/test-data/track_config/test.xml	Tue Jan 29 05:34:16 2019 -0500
@@ -3,27 +3,27 @@
     <metadata>
         <gencode>11</gencode>
         <genomes>
-                  <genome path="/tmp/tmpnh6QWY/files/000/dataset_17.dat">
-                    <metadata>
-                      <dataset id="27ee89e2e3d631e0" hid="1"
-                          size="171.6 KB"
-                          edam_format="format_1929"
-                          file_ext="fasta" />
-                      <history id="7b55dbb89df8f4e5"
-                          user_email="test@bx.psu.edu"
-                          user_id="2"
-                          display_name="test_history"/>
-                      <metadata
-                          dbkey="hg17"
-                          data_lines="2881"
-                          sequences="1"
-                          />
-                      <tool
-                          tool_id="upload1"
-                          tool_version="1.1.4"
-                          />
-                    </metadata>
-                  </genome>
+              <genome path="/tmp/tmpWtvfKr/files/000/dataset_17.dat">
+                <metadata>
+                  <dataset id="27ee89e2e3d631e0" hid="1"
+                      size="171.6 KB"
+                      edam_format="format_1929"
+                      file_ext="fasta" />
+                  <history id="7b55dbb89df8f4e5"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="2881"
+                      sequences="1"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </genome>
         </genomes>
         <general>
             <defaultLocation></defaultLocation>
@@ -37,12 +37,12 @@
             <show_menu>true</show_menu>
             <hideGenomeOptions>false</hideGenomeOptions>
         </general>
-        <galaxyUrl>http://localhost:8080</galaxyUrl>
+        <galaxyUrl>http://localhost</galaxyUrl>
     </metadata>
     <tracks>
         <track cat="With canvas config" format="gene_calls" visibility="default_off">
             <files>
-              <trackFile path="/tmp/tmpnh6QWY/files/000/dataset_18.dat" ext="gff3" label="1.gff">
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_18.dat" ext="gff3" label="1.gff">
                 <metadata>
                   <dataset id="61f03d5eef6f1538" hid="2"
                       size="2.3 KB"
@@ -53,7 +53,7 @@
                       user_id="2"
                       display_name="test_history"/>
                   <metadata
-                      dbkey="hg17"
+                      dbkey="?"
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
@@ -63,7 +63,7 @@
                       />
                   <tool
                       tool_id="upload1"
-                      tool_version="1.1.4"
+                      tool_version="1.1.6"
                       />
                 </metadata>
               </trackFile>
@@ -101,4 +101,4 @@
         GCContent=""
         theme=""
         />
-</root>
+</root>
\ No newline at end of file