changeset 31:2bb2e07a7a21 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse commit 12dff0abf006f6c81f6462cdf4ea9c0c740d1e9c
author iuc
date Mon, 15 Apr 2019 10:31:26 -0400
parents ca2def38369c
children 6b774e9d6387
files jbrowse.py jbrowse.xml macros.xml test-data/bam/test.xml test-data/custom_config/test.xml test-data/gencode/test.xml test-data/gff3/test.xml test-data/menus/test.xml test-data/track_config/test.xml
diffstat 9 files changed, 313 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/jbrowse.py	Thu Apr 11 09:35:00 2019 -0400
+++ b/jbrowse.py	Mon Apr 15 10:31:26 2019 -0400
@@ -80,8 +80,7 @@
             var opacity = (score - ({min})) / (({max}) - ({min}));
         """,
         'logarithmic': """
-            var opacity = (score - ({min})) / (({max}) - ({min}));
-            opacity = Math.log10(opacity) + Math.log10({max});
+            var opacity = Math.log10(score - ({min})) / Math.log10(({max}) - ({min}));
         """,
         'blast': """
             var opacity = 0;
@@ -682,6 +681,36 @@
         }
         self._add_track_json(data)
 
+    def traverse_to_option_parent(self, splitKey, outputTrackConfig):
+        trackConfigSubDict = outputTrackConfig
+        for part in splitKey[:-1]:
+            if trackConfigSubDict.get(part) is None:
+                trackConfigSubDict[part] = dict()
+            trackConfigSubDict = trackConfigSubDict[part]
+        assert isinstance(trackConfigSubDict, dict), 'Config element {} is not a dict'.format(trackConfigSubDict)
+        return trackConfigSubDict
+
+    def get_formatted_option(self, valType2ValDict, mapped_chars):
+        assert isinstance(valType2ValDict, dict) and len(valType2ValDict.items()) == 1
+        for valType, value in valType2ValDict.items():
+            if valType == "text":
+                for char, mapped_char in mapped_chars.items():
+                    value = value.replace(mapped_char, char)
+            elif valType == "integer":
+                value = int(value)
+            elif valType == "float":
+                value = float(value)
+            else:  # boolean
+                value = {'true': True, 'false': False}[value]
+            return value
+
+    def set_custom_track_options(self, customTrackConfig, outputTrackConfig, mapped_chars):
+        for optKey, optType2ValDict in customTrackConfig.items():
+            splitKey = optKey.split('.')
+            trackConfigOptionParent = self.traverse_to_option_parent(splitKey, outputTrackConfig)
+            optVal = self.get_formatted_option(optType2ValDict, mapped_chars)
+            trackConfigOptionParent[splitKey[-1]] = optVal
+
     def process_annotations(self, track):
         category = track['category'].replace('__pd__date__pd__', TODAY)
         outputTrackConfig = {
@@ -747,6 +776,10 @@
                 menus = self.cs.parse_menus(track['conf']['options'])
                 outputTrackConfig.update(menus)
 
+            customTrackConfig = track['conf']['options'].get('custom_config', {})
+            if customTrackConfig:
+                self.set_custom_track_options(customTrackConfig, outputTrackConfig, mapped_chars)
+
             # import pprint; pprint.pprint(track)
             # import sys; sys.exit()
             if dataset_ext in ('gff', 'gff3', 'bed'):
--- a/jbrowse.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/jbrowse.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -210,6 +210,15 @@
                   #end for
                 </menus>
             #end if
+            #if str($track.data_format.data_format_select) in ["gene_calls", "pileup", "blast", "wiggle", "vcf"]:
+                <custom_config>
+                #for $custom_option in $track.data_format.jb_custom_config.option:
+                  <${custom_option.opt_key}>
+                    <${custom_option.opt_value.val_type}>${$custom_option.opt_value.val}</${custom_option.opt_value.val_type}>
+                  </${custom_option.opt_key}>
+                #end for
+                </custom_config>
+            #end if
 
             #if str($track.data_format.data_format_select) == "wiggle":
                 <wiggle>
@@ -318,7 +327,8 @@
         BlastView="${plugins.BlastView}"
         theme=""
         />
-</root>]]></configfile>
+</root>
+]]></configfile>
   </configfiles>
   <inputs>
     <conditional name="reference_genome">
@@ -431,11 +441,13 @@
                 <expand macro="color_selection"
                         token_scaling_lin_select="false"
                         token_scaling_log_select="true" />
+                <expand macro="track_custom_config" />
                 <expand macro="track_menu" />
                 <expand macro="track_display" />
             </when>
             <when value="vcf">
                 <expand macro="input_conditional" label="SNP Track Data" format="vcf" />
+                <expand macro="track_custom_config" />
                 <expand macro="track_display" />
             </when>
             <when value="gene_calls">
@@ -487,6 +499,7 @@
                         description="note,description"
                         height="10px"/>
                 <expand macro="color_selection" />
+                <expand macro="track_custom_config" />
                 <expand macro="track_menu" />
                 <expand macro="track_display" />
             </when>
@@ -503,6 +516,7 @@
                        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_custom_config" />
                 <expand macro="track_display" />
             </when>
             <when value="wiggle">
@@ -545,6 +559,7 @@
                     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_custom_config" />
                 <expand macro="track_display" />
             </when>
             <when value="rest">
@@ -642,7 +657,7 @@
       <param name="gencode" value="1" />
       <param name="standalone" value="Data Directory" />
       <param name="uglyTestingHack" value="enabled" />
-      <output name="output" file="gencode/test-1.xml" lines_diff="14"/>
+      <output name="output" file="gencode/test-1.xml" lines_diff="16"/>
     </test>
     <test>
       <param name="reference_genome|genome_type_select" value="history"/>
@@ -650,7 +665,7 @@
       <param name="gencode" value="11" />
       <param name="standalone" value="Data Directory" />
       <param name="uglyTestingHack" value="enabled" />
-      <output name="output" file="gencode/test.xml" lines_diff="14"/>
+      <output name="output" file="gencode/test.xml" lines_diff="16"/>
     </test>
     <test>
       <param name="reference_genome|genome_type_select" value="history"/>
@@ -846,7 +861,7 @@
       </repeat>
 
       <param name="uglyTestingHack" value="enabled" />
-      <output name="output" file="gff3/test.xml" lines_diff="256" />
+      <output name="output" file="gff3/test.xml" lines_diff="170" />
     </test>
     <test>
         <param name="reference_genome|genome_type_select" value="history"/>
@@ -909,7 +924,7 @@
         </repeat>
 
         <param name="uglyTestingHack" value="enabled" />
-        <output name="output" file="menus/test.xml" lines_diff="24"/>
+        <output name="output" file="menus/test.xml" lines_diff="44"/>
     </test>
     <test>
         <param name="reference_genome|genome_type_select" value="history"/>
@@ -927,6 +942,7 @@
                         <param name="match_part_select" value="false"/>
                     </conditional>
                     <conditional name="track_config">
+                        <param name="track_class" value="JBrowse/View/Track/CanvasFeatures"/>
                         <section name="canvas_options">
                             <param name="transcriptType" value="transcript"/>
                             <param name="subParts" value="exon"/>
@@ -946,7 +962,59 @@
         </repeat>
 
         <param name="uglyTestingHack" value="enabled" />
-        <output name="output" file="track_config/test.xml" lines_diff="26"/>
+        <output name="output" file="track_config/test.xml" lines_diff="30"/>
+    </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="With custom track config" />
+            <repeat name="data_tracks">
+                <conditional name="data_format">
+                    <param name="data_format_select" value="gene_calls"/>
+                    <param name="annotation" value="gff3/1.gff"/>
+                    <conditional name="match_part">
+                        <param name="match_part_select" value="false"/>
+                    </conditional>
+                    <section name="jb_custom_config">
+                        <repeat name="option">
+                            <param name="opt_key" value="displayMode"/>
+                            <conditional name="opt_value">
+                                <param name="val_type" value="text"/>
+                                <param name="val" value="collapsed"/>
+                            </conditional>
+                        </repeat>
+                        <repeat name="option">
+                            <param name="opt_key" value="histograms.height"/>
+                            <conditional name="opt_value">
+                                <param name="val_type" value="integer"/>
+                                <param name="val" value="150"/>
+                            </conditional>
+                        </repeat>
+                        <repeat name="option">
+                            <param name="opt_key" value="maxFeatureScreenDensity"/>
+                            <conditional name="opt_value">
+                                <param name="val_type" value="float"/>
+                                <param name="val" value="0.1"/>
+                            </conditional>
+                        </repeat>
+                        <repeat name="option">
+                            <param name="opt_key" value="style.strandArrow"/>
+                            <conditional name="opt_value">
+                                <param name="val_type" value="boolean"/>
+                                <param name="val" value="false"/>
+                            </conditional>
+                        </repeat>
+                    </section>
+                </conditional>
+            </repeat>
+        </repeat>
+
+        <param name="uglyTestingHack" value="enabled" />
+        <output name="output" file="custom_config/test.xml" lines_diff="30"/>
     </test>
     <test>
         <param name="reference_genome|genome_type_select" value="history"/>
@@ -965,7 +1033,7 @@
         </repeat>
 
         <param name="uglyTestingHack" value="enabled" />
-        <output name="output" file="bam/test.xml" lines_diff="48"/>
+        <output name="output" file="bam/test.xml" lines_diff="42"/>
     </test>
 
     <test>
@@ -975,7 +1043,7 @@
         <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" />
+        <output name="output" file="gencode/test-data_table.xml" lines_diff="4" />
     </test>
 
     <test>
@@ -1022,7 +1090,7 @@
         </repeat>
 
         <param name="uglyTestingHack" value="enabled" />
-        <output name="output" file="endpoints/test.xml" lines_diff="48"/>
+        <output name="output" file="endpoints/test.xml" lines_diff="16"/>
     </test>
   </tests>
   <help><![CDATA[
--- a/macros.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/macros.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -14,7 +14,7 @@
     </requirements>
   </xml>
   <token name="@DATA_DIR@">\$GALAXY_JBROWSE_SHARED_DIR</token>
-  <token name="@WRAPPER_VERSION@">galaxy2</token>
+  <token name="@WRAPPER_VERSION@">galaxy3</token>
   <token name="@ATTRIBUTION@"><![CDATA[
 **Attribution**
 
@@ -290,6 +290,44 @@
     </section>
   </xml>
 
+  <xml name="track_custom_config">
+    <section name="jb_custom_config" title="JBrowse Custom Track Config [Advanced]" expanded="false">
+      <repeat name="option" title="Custom Track Config Option">
+        <param name="opt_key" type="text" label="Key for JBrowse track config option"
+               help="Multilevel keys (e.g., 'style.label') are delimited by a period character ('.').">
+          <validator type="regex" message="Key must consist of alphanumeric characters only, possibly separated by the period character ('.')">^[\w]+(\.\w+)*$</validator>
+        </param>
+        <conditional name="opt_value">
+          <param name="val_type" type="select" label="Choose the type of value for the option">
+            <option value="text" selected="true">Text</option>
+            <option value="integer">Integer number</option>
+            <option value="float">Floating point number</option>
+            <option value="boolean">Boolean</option>
+          </param>
+          <when value="text">
+            <param name="val" type="text" label="Value for custom track option."
+                   help="Will override other track options set elsewhere.">
+              <validator type="empty_field" />
+            </param>
+          </when>
+          <when value="integer">
+            <param name="val" type="integer" value="0" label="Value for custom track option."
+                   help="Will override other track options set elsewhere." />
+          </when>
+          <when value="float">
+            <param name="val" type="float" value="0" label="Value for custom track option."
+                   help="Will override other track options set elsewhere." />
+          </when>
+          <when value="boolean">
+            <param name="val" type="boolean" truevalue="true" falsevalue="false"
+                   label="Value for custom track option."
+                   help="Will override other track options set elsewhere." />
+          </when>
+        </conditional>
+      </repeat>
+    </section>
+  </xml>
+
   <xml name="track_menu">
     <section name="jbmenu" title="JBrowse Contextual Menu options [Advanced]" expanded="false">
       <repeat name="track_menu" title="Track Menu">
--- a/test-data/bam/test.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/test-data/bam/test.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -54,15 +54,14 @@
                       display_name="test_history"/>
                   <metadata
                       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 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 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 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__]"
+                      bam_index="__lt__galaxy.model.MetadataFile object at 0x7f6200f6d1d0__gt__"
                       />
                   <tool
                       tool_id="upload1"
@@ -73,12 +72,15 @@
             </files>
 
             <options>
+                <custom_config>
+                </custom_config>
 
                 <pileup>
                     <auto_snp>false</auto_snp>
                     <bam_indices>
                         <bam_index>/tmp/tmpWtvfKr/files/_metadata_files/000/metadata_1.dat</bam_index>
                     </bam_indices>
+                    <chunkSizeLimit>5000000</chunkSizeLimit>
                 </pileup>
             </options>
         </track>
@@ -87,6 +89,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
-</root>
\ No newline at end of file
+</root>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/custom_config/test.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -0,0 +1,119 @@
+<?xml version="1.0"?>
+<root>
+    <metadata>
+        <gencode>11</gencode>
+        <genomes>
+              <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>
+            <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="With custom track config" format="gene_calls" visibility="default_off">
+            <files>
+              <trackFile path="/tmp/tmpWtvfKr/files/000/dataset_18.dat" ext="gff3" label="1.gff">
+                <metadata>
+                  <dataset id="61f03d5eef6f1538" hid="2"
+                      size="2.3 KB"
+                      edam_format="format_1975"
+                      file_ext="gff3" />
+                  <history id="7b55dbb89df8f4e5"
+                      user_email="test@bx.psu.edu"
+                      user_id="2"
+                      display_name="test_history"/>
+                  <metadata
+                      dbkey="?"
+                      data_lines="27"
+                      comment_lines="19"
+                      columns="9"
+                      delimiter="__tc__"
+                      attributes="6"
+                      />
+                  <tool
+                      tool_id="upload1"
+                      tool_version="1.1.6"
+                      />
+                </metadata>
+              </trackFile>
+            </files>
+
+            <options>
+                <style>
+                    <overridePlugins>False</overridePlugins>
+                    <overrideDraggable>False</overrideDraggable>
+                    <className>feature2</className>
+                    <description>note,description</description>
+                    <label>product,name,id</label>
+                    <height>10px</height>
+                    <maxHeight>600</maxHeight>
+                </style>
+                <scaling>
+                        <method>ignore</method>
+                        <scheme>
+                            <color>__auto__</color>
+                        </scheme>
+                </scaling>
+                <menus>
+                </menus>
+                <custom_config>
+                  <displayMode>
+                    <text>collapsed</text>
+                  </displayMode>
+                  <histograms.height>
+                    <integer>150</integer>
+                  </histograms.height>
+                  <maxFeatureScreenDensity>
+                    <float>0.1</float>
+                  </maxFeatureScreenDensity>
+                  <style.strandArrow>
+                    <boolean>false</boolean>
+                  </style.strandArrow>
+                </custom_config>
+
+                <gff>
+                    <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
+                    <topLevelFeatures>mRNA</topLevelFeatures>
+                    <index>false</index>
+                </gff>
+            </options>
+        </track>
+    </tracks>
+    <plugins
+        ComboTrackSelector=""
+        Bookmarks=""
+        GCContent=""
+        BlastView="True"
+        theme=""
+        />
+</root>
--- a/test-data/gencode/test.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/test-data/gencode/test.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -45,6 +45,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
 </root>
--- a/test-data/gff3/test.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/test-data/gff3/test.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -158,6 +158,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -212,6 +214,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -272,6 +276,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -332,6 +338,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -394,6 +402,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -456,6 +466,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -510,6 +522,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
@@ -564,6 +578,8 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
--- a/test-data/menus/test.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/test-data/menus/test.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -57,7 +57,6 @@
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
-                      column_names=""
                       delimiter="__tc__"
                       attributes="6"
                       />
@@ -73,7 +72,7 @@
                 <style>
                     <overridePlugins>False</overridePlugins>
                     <overrideDraggable>False</overrideDraggable>
-                    <className>feature</className>
+                    <className>feature2</className>
                     <description>note,description</description>
                     <label>product,name,id</label>
                     <height>10px</height>
@@ -101,9 +100,12 @@
                       <iconClass>dijitIconBookmark</iconClass>
                   </menu>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
-                    <trackType>JBrowse/View/Track/CanvasFeatures</trackType>
+                    <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
+                    <topLevelFeatures>mRNA</topLevelFeatures>
                     <index>false</index>
                 </gff>
             </options>
@@ -125,7 +127,6 @@
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
-                      column_names=""
                       delimiter="__tc__"
                       attributes="6"
                       />
@@ -141,7 +142,7 @@
                 <style>
                     <overridePlugins>False</overridePlugins>
                     <overrideDraggable>False</overrideDraggable>
-                    <className>feature</className>
+                    <className>feature2</className>
                     <description>note,description</description>
                     <label>product,name,id</label>
                     <height>10px</height>
@@ -155,9 +156,12 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
-                    <trackType>JBrowse/View/Track/CanvasFeatures</trackType>
+                    <trackType>NeatHTMLFeatures/View/Track/NeatFeatures</trackType>
+                    <topLevelFeatures>mRNA</topLevelFeatures>
                     <index>true</index>
                 </gff>
             </options>
@@ -167,6 +171,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
-</root>
\ No newline at end of file
+</root>
--- a/test-data/track_config/test.xml	Thu Apr 11 09:35:00 2019 -0400
+++ b/test-data/track_config/test.xml	Mon Apr 15 10:31:26 2019 -0400
@@ -57,7 +57,6 @@
                       data_lines="27"
                       comment_lines="19"
                       columns="9"
-                      column_names=""
                       delimiter="__tc__"
                       attributes="6"
                       />
@@ -73,7 +72,7 @@
                 <style>
                     <overridePlugins>False</overridePlugins>
                     <overrideDraggable>False</overrideDraggable>
-                    <className>feature</className>
+                    <className>feature2</className>
                     <description>note,description</description>
                     <label>product,name,id</label>
                     <height>10px</height>
@@ -87,9 +86,14 @@
                 </scaling>
                 <menus>
                 </menus>
+                <custom_config>
+                </custom_config>
 
                 <gff>
                     <trackType>JBrowse/View/Track/CanvasFeatures</trackType>
+                    <transcriptType>transcript</transcriptType>
+                    <subParts>exon</subParts>
+                    <impliedUTRs>true</impliedUTRs>
                     <index>false</index>
                 </gff>
             </options>
@@ -99,6 +103,7 @@
         ComboTrackSelector=""
         Bookmarks=""
         GCContent=""
+        BlastView="True"
         theme=""
         />
-</root>
\ No newline at end of file
+</root>