Skip to content

Commit

Permalink
progress on default track display
Browse files Browse the repository at this point in the history
  • Loading branch information
abretaud authored and fubar2 committed Jan 9, 2024
1 parent e6ebb03 commit 279ca44
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 35 deletions.
93 changes: 66 additions & 27 deletions tools/jbrowse2/jbrowse2.py
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,22 @@ def _blastxml_to_gff3(self, xml, min_gap=10):
gff3_unrebased.close()
return gff3_unrebased.name

def _prepare_track_style(self, xml_conf):

style_data = {
"type": "LinearBasicDisplay"
}

if 'display' in xml_conf['style']:
style_data['type'] = xml_conf['style']['display']
del xml_conf['style']['display']

style_data['displayId'] = "%s_%s" % (xml_conf['label'], style_data['type'])

style_data.update(xml_conf['style'])

return {'displays': [style_data]}

def add_blastxml(self, data, trackData, blastOpts, **kwargs):
gff3 = self._blastxml_to_gff3(data, min_gap=blastOpts['min_gap'])

Expand All @@ -498,15 +514,19 @@ def add_blastxml(self, data, trackData, blastOpts, **kwargs):
self._sort_gff(gff3, dest)
os.unlink(gff3)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest + '.gz')
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest + '.gz', config=style_json)

def add_bigwig(self, data, trackData, wiggleOpts, **kwargs):

rel_dest = os.path.join('data', trackData['label'] + '.bw')
dest = os.path.join(self.outdir, rel_dest)
self.symlink_or_copy(os.path.realpath(data), dest)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest)
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest, config=style_json)

# Anything ending in "am" (Bam or Cram)
def add_xam(self, data, trackData, xamOpts, index=None, ext="bam", **kwargs):
Expand All @@ -533,7 +553,9 @@ def add_xam(self, data, trackData, xamOpts, index=None, ext="bam", **kwargs):
else:
log.warn('Could not find a bam index (.%s file) for %s', (index_ext, data))

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest)
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest, config=style_json)

def add_vcf(self, data, trackData, vcfOpts={}, zipped=False, **kwargs):

Expand All @@ -553,23 +575,29 @@ def add_vcf(self, data, trackData, vcfOpts={}, zipped=False, **kwargs):

rel_dest = os.path.join('data', trackData['label'] + '.vcf.gz')

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest)
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest, config=style_json)

def add_gff(self, data, format, trackData, gffOpts, **kwargs):
rel_dest = os.path.join('data', trackData['label'] + '.gff')
dest = os.path.join(self.outdir, rel_dest)

self._sort_gff(data, dest)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest + '.gz')
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest + '.gz', config=style_json)

def add_bed(self, data, format, trackData, gffOpts, **kwargs):
rel_dest = os.path.join('data', trackData['label'] + '.bed')
dest = os.path.join(self.outdir, rel_dest)

self._sort_bed(data, dest)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest + '.gz')
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest + '.gz', config=style_json)

def add_paf(self, data, trackData, pafOpts, **kwargs):
rel_dest = os.path.join('data', trackData['label'] + '.paf')
Expand All @@ -579,15 +607,19 @@ def add_paf(self, data, trackData, pafOpts, **kwargs):

added_assembly = self.add_assembly(pafOpts['genome'], pafOpts['genome_label'], default=False)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest, assemblies=[self.current_assembly_id, added_assembly])
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest, assemblies=[self.current_assembly_id, added_assembly], config=style_json)

def add_hic(self, data, trackData, hicOpts, **kwargs):
rel_dest = os.path.join('data', trackData['label'] + '.hic')
dest = os.path.join(self.outdir, rel_dest)

self.symlink_or_copy(os.path.realpath(data), dest)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest)
style_json = self._prepare_track_style(trackData)

self._add_track(trackData['label'], trackData['key'], trackData['category'], rel_dest, config=style_json)

def add_sparql(self, url, query, query_refnames, trackData):

Expand Down Expand Up @@ -630,21 +662,29 @@ def add_sparql(self, url, query, query_refnames, trackData):
# '--config', '{"queryTemplate": "%s"}' % query,
# url])

def _add_track(self, id, label, category, path, assemblies=[]):
def _add_track(self, id, label, category, path, assemblies=[], config=None):

assemblies_opt = self.current_assembly_id
if assemblies:
assemblies_opt = ','.join(assemblies)

self.subprocess_check_call([
cmd = [
'jbrowse', 'add-track',
'--load', 'inPlace',
'--name', label,
'--category', category,
'--target', os.path.join(self.outdir, 'data'),
'--trackId', id,
'--assemblyNames', assemblies_opt,
path])
'--assemblyNames', assemblies_opt
]

if config:
cmd.append('--config')
cmd.append(json.dumps(config))

cmd.append(path)

self.subprocess_check_call(cmd)

def _sort_gff(self, data, dest):
# Only index if not already done
Expand Down Expand Up @@ -708,6 +748,8 @@ def process_annotations(self, track):
outputTrackConfig['label'] = hashlib.md5(hashData).hexdigest() + '_%s' % i
outputTrackConfig['metadata'] = extra_metadata

outputTrackConfig['style'] = track['style']

if 'menus' in track['conf']['options']:
menus = self.cs.parse_menus(track['conf']['options'])
outputTrackConfig.update(menus)
Expand Down Expand Up @@ -796,10 +838,11 @@ def add_default_session(self, data):
for track_conf in config_json['tracks']:
track_types[track_conf['trackId']] = track_conf['type']

# TODO Getting an error when refreshing the page, waiting for https://github.com/GMOD/jbrowse-components/issues/2708
for on_track in data['visibility']['default_on']:
# TODO Make it possible to specify display settings on default_off tracks too
# see https://github.com/GMOD/jbrowse-components/issues/2708#issuecomment-1047554606
# TODO several problems with this currently
# - we are forced to copy the same kind of style config as the per track config from _prepare_track_style (not exactly the same though)
# - we get an error when refreshing the page
# - this could be solved by session specs, see https://github.com/GMOD/jbrowse-components/issues/2708
style_data = {
"type": "LinearBasicDisplay",
"height": 100
Expand All @@ -813,7 +856,8 @@ def add_default_session(self, data):
style_data.update(data['style'][on_track])

if on_track in data['style_labels']:
# TODO fix this: it shoul probably go in a renderer block (SvgFeatureRenderer) but still does not work
# TODO fix this: it should probably go in a renderer block (SvgFeatureRenderer) but still does not work
# TODO move this to per track displays?
style_data['labels'] = data['style_labels'][on_track]

tracks_data.append({
Expand Down Expand Up @@ -1020,24 +1064,19 @@ def parse_style_conf(item):

track_conf['category'] = track.attrib['cat']
track_conf['format'] = track.attrib['format']
try:
track_conf['style'] = {item.tag: parse_style_conf(item) for item in track.find('options/style')}
except TypeError:
track_conf['style'] = {}
pass
track_conf['style'] = {item.tag: parse_style_conf(item) for item in track.find('options/style')}

track_conf['style'] = {item.tag: parse_style_conf(item) for item in track.find('options/style')}

track_conf['style_labels'] = {item.tag: parse_style_conf(item) for item in track.find('options/style_labels')}

try:
track_conf['style_labels'] = {item.tag: parse_style_conf(item) for item in track.find('options/style_labels')}
except TypeError:
track_conf['style_labels'] = {}
pass
track_conf['conf'] = etree_to_dict(track.find('options'))
keys = jc.process_annotations(track_conf)

for key in keys:
default_session_data['visibility'][track.attrib.get('visibility', 'default_off')].append(key)

default_session_data['style'][key] = track_conf['style']
default_session_data['style'][key] = track_conf['style'] # TODO do we need this anymore?
default_session_data['style_labels'][key] = track_conf['style_labels']

default_session_data['defaultLocation'] = root.find('metadata/general/defaultLocation').text
Expand Down
4 changes: 2 additions & 2 deletions tools/jbrowse2/jbrowse2.xml
Original file line number Diff line number Diff line change
Expand Up @@ -180,10 +180,10 @@ cp $output.files_path/index.html $output;
#if 'displayCrossHatches' in $track.data_format.jbstyle.track_style
<displayCrossHatches type="boolean">${track.data_format.jbstyle.track_style.displayCrossHatches}</displayCrossHatches>
#end if
#if 'minScore' in $track.data_format.jbstyle.track_style
#if 'minScore' in $track.data_format.jbstyle.track_style and $track.data_format.jbstyle.track_style.minScore
<minScore type="integer">${track.data_format.jbstyle.track_style.minScore}</minScore>
#end if
#if 'maxScore' in $track.data_format.jbstyle.track_style
#if 'maxScore' in $track.data_format.jbstyle.track_style and $track.data_format.jbstyle.track_style.maxScore
<maxScore type="integer">${track.data_format.jbstyle.track_style.maxScore}</maxScore>
#end if
## TODO other coloring/etc options in each renderer (e.g https://github.com/GMOD/jbrowse-components/blob/main/plugins/svg/src/SvgFeatureRenderer/configSchema.ts)
Expand Down
15 changes: 9 additions & 6 deletions tools/jbrowse2/macros.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<macros>
<token name="@TOOL_VERSION@">1.6.6</token>
<token name="@TOOL_VERSION@">1.6.7</token>
<xml name="requirements">
<requirements>
<requirement type="package" version="@TOOL_VERSION@">jbrowse2</requirement>
Expand Down Expand Up @@ -335,14 +335,17 @@ This Galaxy tool relies on the JBrowse, maintained by the GMOD Community. The Ga
<section name="jbstyle" title="JBrowse Styling Options [Advanced]" expanded="false">
<conditional name="track_style">
<param name="display" type="select" label="Display style" help="How the track will be displayed by default">
<option value="LinearAlignmentsDisplay" selected="true">LinearAlignmentsDisplay</option>
<option value="LinearPileupDisplay">LinearPileupDisplay</option>
<option value="LinearSNPCoverageDisplay">LinearSNPCoverageDisplay</option>
<option value="LinearAlignmentsDisplay" selected="true">LinearAlignmentsDisplay</option>
<option value="LinearPileupDisplay">LinearPileupDisplay</option>
<option value="LinearSNPCoverageDisplay">LinearSNPCoverageDisplay</option>
</param>
<when value="LinearAlignmentsDisplay"/>
<when value="LinearPileupDisplay">
</when>
<when value="LinearSNPCoverageDisplay">
<param name="displayCrossHatches" label="Draw cross hatches" type="boolean" checked="true" truevalue="true" falsevalue="false" />
<param name="minScore" label="Min score" type="integer" value="" optional="true"/>
<param name="maxScore" label="Max score" type="integer" value="" optional="true"/>
</when>
</conditional>
</section>
Expand Down Expand Up @@ -387,8 +390,8 @@ This Galaxy tool relies on the JBrowse, maintained by the GMOD Community. The Ga
<option value="log">Log</option>
</param>
<param name="displayCrossHatches" label="Draw cross hatches" type="boolean" checked="true" truevalue="true" falsevalue="false" />
<param name="minScore" label="Min score" type="integer" value="" optional="true"/> <!-- TODO don't set the value if empty -->
<param name="maxScore" label="Max score" type="integer" value="" optional="true"/> <!-- TODO don't set the value if empty -->
<param name="minScore" label="Min score" type="integer" value="" optional="true"/>
<param name="maxScore" label="Max score" type="integer" value="" optional="true"/>
</when>
</conditional>
</section>
Expand Down

0 comments on commit 279ca44

Please sign in to comment.