From da7aa75ce3b94ac1a053ddf9a7217404b2b7ce02 Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Thu, 28 Jun 2007 20:05:11 +0000 Subject: [PATCH] Improved implementation for displaying Galaxy files at UCSC, GBrowse, and other future applications. Fixed a bug in the unit test for new gff version 3 format in sniff.py. Tweaked the biomart tool so that it will not display problm Info: text in history. This commit includes some stuff for future GBrowse integration, but nothing included should pose any problems with the current environment. --- lib/galaxy/config.py | 1 + lib/galaxy/datatypes/data.py | 23 +++- lib/galaxy/datatypes/interval.py | 157 ++++++++++++++++++++----- lib/galaxy/datatypes/sequence.py | 24 +++- lib/galaxy/datatypes/sniff.py | 4 +- lib/galaxy/interfaces/root.py | 32 ++--- lib/galaxy/model/__init__.py | 12 +- lib/galaxy/util/__init__.py | 18 ++- static/gbrowse/gbrowse_build_sites.txt | 7 ++ static/robots.txt | 2 +- templates/history.tmpl | 84 ++++++++++--- tools/data_source/biomart.xml | 2 +- universe_wsgi.ini.sample | 4 +- 13 files changed, 287 insertions(+), 83 deletions(-) create mode 100644 static/gbrowse/gbrowse_build_sites.txt diff --git a/lib/galaxy/config.py b/lib/galaxy/config.py index 13e1e48e467..ef30ddbc982 100644 --- a/lib/galaxy/config.py +++ b/lib/galaxy/config.py @@ -46,6 +46,7 @@ class Configuration( object ): self.pbs_dataset_path = kwargs.get('pbs_dataset_path', "" ) self.use_heartbeat = kwargs.get( 'use_heartbeat', False ) self.ucsc_display_sites = kwargs.get( 'ucsc_display_sites', "main,test,archaea" ).lower().split(",") + self.gbrowse_display_sites = kwargs.get( 'gbrowse_display_sites', "wormbase,flybase" ).lower().split(",") #Parse global_conf global_conf = kwargs.get( 'global_conf', None ) global_conf_parser = ConfigParser.ConfigParser() diff --git a/lib/galaxy/datatypes/data.py b/lib/galaxy/datatypes/data.py index c85af03b217..49d34ebb0e0 100644 --- a/lib/galaxy/datatypes/data.py +++ b/lib/galaxy/datatypes/data.py @@ -15,6 +15,9 @@ class DataMeta( type ): class Data( object ): __metaclass__ = DataMeta + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] def set_peek( self, dataset ): dataset.peek = '' @@ -23,10 +26,12 @@ class Data( object ): pass def missing_meta( self, dataset): return False - def bed_viewport( self, dataset ): - raise Exception( "'bed_viewport' not supported for this datatype" ) - def as_bedfile( self, dataset ): - raise Exception( "'as_bedfile' not supported for this datatype" ) + def get_estimated_display_viewport( self, dataset ): + raise Exception( "'get_estimated_display_viewport' must be overridden in subclass." ) + def as_ucsc_display_file( self, dataset ): + raise Exception( "'as_ucsc_display_file' not supported for this datatype" ) + def as_gbrowse_display_file( self, dataset ): + raise Exception( "'as_gbrowse_display_file' not supported for this datatype" ) def display_peek(self, dataset): try: return escape(dataset.peek) @@ -44,6 +49,8 @@ class Data( object ): return "info unavailable" def get_ucsc_sites(self, dataset): return util.get_ucsc_by_build(dataset.dbkey) + def get_gbrowse_sites(self, dataset): + return util.get_gbrowse_sites_by_build(dataset.dbkey) def validate(self, dataset): """Unimplemented validate, return no exceptions""" return list() @@ -56,6 +63,10 @@ class Data( object ): return cls._metadataspec class Text( Data ): + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] + def write_from_stream(self, stream): "Writes data from a stream" # write it twice for now @@ -107,6 +118,10 @@ class Text( Data ): class Binary( Data ): """Binary data""" + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] + def set_peek( self, dataset ): dataset.peek = 'binary data' dataset.blurb = 'data' diff --git a/lib/galaxy/datatypes/interval.py b/lib/galaxy/datatypes/interval.py index 6aa0781a993..d65dc5a5d15 100644 --- a/lib/galaxy/datatypes/interval.py +++ b/lib/galaxy/datatypes/interval.py @@ -33,6 +33,9 @@ for key, value in alias_spec.items(): class Tabular( data.Text ): """Tab delimited data""" + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] + def missing_meta( self, dataset ): """Checks for empty meta values""" for key, value in dataset.metadata.items(): @@ -77,14 +80,21 @@ class Tabular( data.Text ): except Exception, exc: out = "Can't create peek %s" % exc return out - + + def get_estimated_display_viewport( self, dataset ): + #TODO: fix me... + return ('', '', '') + def display_peek( self, dataset ): m_peek = self.make_html_table( dataset.peek ) return m_peek class Interval( Tabular ): """Tab delimited data containing interval information""" - + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = ['ucsc'] + def missing_meta( self, dataset ): """Checks for empty meta values""" for key, value in dataset.metadata.items(): @@ -125,13 +135,9 @@ class Interval( Tabular ): for lower in values[start:]: del valid[lower] # removes lower priority keys dataset.mark_metadata_changed() - - - def bed_viewport( self, dataset ): - """ - Return a start position for viewing a bed file. - """ + def get_estimated_display_viewport( self, dataset ): + """Return a chrom, start, stop tuple for viewing a file.""" if dataset.has_data() and dataset.state == dataset.states.OK: try: c, s, e, t = dataset.metadata.chromCol, dataset.metadata.startCol, dataset.metadata.endCol, dataset.metadata.strandCol @@ -152,13 +158,13 @@ class Interval( Tabular ): stop = max( stop, int( p[e] ) ) except Exception, exc: log.error( 'Viewport generation error -> %s ' % str(exc) ) - chr, start, stop = 'chr1', 1, 1000 - return "%s:%d-%d" % ( chr, start, stop ) + (chr, start, stop) = 'chr1', 1, 1000 + return (chr, str( start ), str( stop )) else: - return "" + return ('', '', '') - def as_bedfile( self, dataset ): - '''Returns a file that contains only the bed data''' + def as_ucsc_display_file( self, dataset ): + """Returns a file that contains only the bed data""" fd, temp_name = tempfile.mkstemp() c, s, e, t = dataset.metadata.chromCol, dataset.metadata.startCol, dataset.metadata.endCol, dataset.metadata.strandCol c, s, e, t = int(c)-1, int(s)-1, int(e)-1, int(t)-1 @@ -203,6 +209,10 @@ class Interval( Tabular ): class Bed( Interval ): """Tab delimited data in BED format""" + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = ['ucsc'] + def missing_meta( self, dataset ): """Checks for empty meta values""" return Tabular.missing_meta(self, dataset) @@ -237,8 +247,8 @@ class Bed( Interval ): dataset.metadata.strandCol = 0 dataset.mark_metadata_changed() - def as_bedfile( self, dataset ): - '''Returns a file that contains only the bed data. If bed 6+, treat as interval.''' + def as_ucsc_display_file( self, dataset ): + """Returns a file that contains only the bed data. If bed 6+, treat as interval.""" for line in open(dataset.file_name): line = line.strip() if line == "" or line.startswith("#"): @@ -247,14 +257,14 @@ class Bed( Interval ): #check to see if this file doesn't conform to strict genome browser accepted bed try: if len(fields) > 12: - return Interval.as_bedfile(self, dataset) #too many fields + return Interval.as_ucsc_display_file(self, dataset) #too many fields if len(fields) > 6: int(fields[6]) if len(fields) > 7: int(fields[7]) if len(fields) > 8: if int(fields[8]) != 0: - return Interval.as_bedfile(self, dataset) + return Interval.as_ucsc_display_file(self, dataset) if len(fields) > 9: int(fields[9]) if len(fields) > 10: @@ -265,57 +275,144 @@ class Bed( Interval ): fields2 = fields[11].rstrip(",").split(",") #remove trailing comma and split on comma for field in fields2: int(field) - except: return Interval.as_bedfile(self, dataset) + except: return Interval.as_ucsc_display_file(self, dataset) #only check first line for proper form break try: return dataset.file_name except: return "This item contains no content" + def get_estimated_display_viewport( self, dataset ): + #TODO: fix me... + return Interval.get_estimated_display_viewport( self, dataset ) + class Gff( Tabular ): """Tab delimited data in Gff format""" + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = ['gbrowse'] + + def __init__(self, id=None): + data.Text.__init__(self, id=id) + + def make_html_table(self, data): + return Tabular.make_html_table(self, data, skipchar='#') + + def as_gbrowse_display_file( self, dataset ): + '''Returns a file that can be displayed in GBrowse apps.''' + #TODO: fix me... + return dataset.file_name + + def get_estimated_display_viewport( self, dataset ): + """ + Return a chrom, start, stop tuple for viewing a file. There are slight differences between gff and gff version 3 + formats. This function should correctly handle both... + """ + if dataset.has_data() and dataset.state == dataset.states.OK: + try: + """ + TODO: the metadata stuff needs to work for this and other formats (besides bed and interval). + When this works, we should be able to have just 1 get_estimated_display_viewport() method at + possibly the Tabular level that should handle most tabular formats. + + c, s, e, t = dataset.metadata.chromCol, dataset.metadata.startCol, dataset.metadata.endCol, dataset.metadata.strandCol + c, s, e, t = int(c)-1, int(s)-1, int(e)-1, int(t)-1 + """ + seqid_col = 0 + start_col = 3 + stop_col = 4 + + peek = [] + for idx, line in enumerate(file(dataset.file_name)): + if line[0] != '#': + peek.append( line.split() ) + if idx > 10: + break + + seqid, start, stop = peek[0][seqid_col], int( peek[0][start_col] ), int( peek[0][stop_col] ) + + for p in peek[1:]: + if p[0] == seqid: + start = min( start, int( p[start_col] ) ) + stop = max( stop, int( p[stop_col] ) ) + except Exception, exc: + log.error( 'Viewport generation error -> %s ' % str(exc) ) + seqid, start, stop = ('', '', '') + return (seqid, str( start ), str( stop )) + else: + return ('', '', '') + +class Wiggle( Tabular ): + """Tab delimited data in wiggle format""" + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] + def __init__(self, id=None): data.Text.__init__(self, id=id) def make_html_table(self, data): return Tabular.make_html_table(self, data, skipchar='#') -class Wiggle( Tabular ): - """Tab delimited data in wiggle format""" - def __init__(self, id=None): - data.Text.__init__(self, id=id) - - def make_html_table(self, data): - return Tabular.make_html_table(self, data, skipchar='#') + def get_estimated_display_viewport( self, dataset ): + #TODO: fix me... + return ('', '', '') #Extend Tabular type, since interval tools will fail on track def line (we should fix this) #This is a skeleton class for now, allows viewing at ucsc and formatted peeking. class CustomTrack ( Tabular ): """UCSC CustomTrack""" + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = ['ucsc'] + def __init__(self, id=None): data.Text.__init__(self, id=id) def make_html_table(self, dataset): return Tabular.make_html_table(self, dataset, skipchar='track') - def bed_viewport( self, dataset ): + def get_estimated_display_viewport( self, dataset ): try: for line in open(dataset.file_name): if (line.startswith("chr") or line.startswith("scaffold")): start = line.split("\t")[1].replace(",","") end = line.split("\t")[2].replace(",","") + if int(start) < int(end): - value = line.split("\t")[0] + ":" + start + "-" + end + value = ( line.split("\t")[0], start, end ) else: - value = line.split("\t")[0] + ":" + end + "-" + start + value = ( line.split("\t")[0], end, start ) + break return value #returns the co-ordinates of the 1st track/dataset except: - return "." + #return "." + return ('', '', '') - def as_bedfile( self, dataset ): + def as_ucsc_display_file( self, dataset ): return dataset.file_name +#Extend Tabular type, since interval tools will fail on track def line (we should fix this) +#This is a skeleton class for now, allows viewing at ucsc and formatted peeking. +class GBrowseTrack ( Tabular ): + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = ['gbrowse'] + + def __init__(self, id=None): + data.Text.__init__(self, id=id) + + def make_html_table(self, dataset): + return Tabular.make_html_table(self, dataset, skipchar='track') + + def display_formats_supported( self, dataset ): + return set(['gbrowse track']) + + def get_estimated_display_viewport( self, dataset ): + #TODO: fix me... + return ('', '', '') + if __name__ == '__main__': import doctest, sys doctest.testmod(sys.modules[__name__]) diff --git a/lib/galaxy/datatypes/sequence.py b/lib/galaxy/datatypes/sequence.py index 977cfc18405..c0fed65b60a 100644 --- a/lib/galaxy/datatypes/sequence.py +++ b/lib/galaxy/datatypes/sequence.py @@ -9,10 +9,16 @@ log = logging.getLogger(__name__) class Sequence( data.Text ): """Class describing a sequence""" - pass + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] class Fasta( Sequence ): """Class representing a FASTA sequence""" + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] + def set_peek( self, dataset ): Sequence.set_peek( self, dataset ) count = size = 0 @@ -27,14 +33,24 @@ class Fasta( Sequence ): else: dataset.blurb = '%d sequences' % count + def get_estimated_display_viewport( self, dataset ): + #TODO: fix me... + return ('', '', '') + class Maf( Sequence ): """Class describing a Maf alignment""" - pass + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] class Axt( Sequence ): """Class describing an axt alignment""" - pass + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] class Lav( Sequence ): """Class describing a LAV alignment""" - pass \ No newline at end of file + + """Provide the set of display formats supported by this datatype """ + supported_display_apps = [] \ No newline at end of file diff --git a/lib/galaxy/datatypes/sniff.py b/lib/galaxy/datatypes/sniff.py index 8d6e244dbea..5b64f66c3fe 100644 --- a/lib/galaxy/datatypes/sniff.py +++ b/lib/galaxy/datatypes/sniff.py @@ -214,9 +214,9 @@ def is_gff3(headers): >>> headers = get_headers(__file__, sep=' ') >>> is_fasta(headers) False - >>> fname = get_test_fname('test.gff') + >>> fname = get_test_fname('gff_version_3.gff') >>> headers = get_headers(fname,sep='\\t') - >>> is_gff(headers) + >>> is_gff3(headers) True """ try: diff --git a/lib/galaxy/interfaces/root.py b/lib/galaxy/interfaces/root.py index 32494f228d3..01e59c6aac3 100644 --- a/lib/galaxy/interfaces/root.py +++ b/lib/galaxy/interfaces/root.py @@ -111,23 +111,29 @@ class Universe(common.Root): except: return "This item contains no content" else: - return "No data with id=%s" % id - + return "No data with id=%d" % id + @web.expose - def display_bed( self, trans, id=None ): - """Returns a bed file""" + def display_as( self, trans, id=None, display_app="ucsc" ): + """Returns a file in a format that can successfully be displayed in display_app""" data = self.app.model.Dataset.get( id ) if data: - if isinstance(data.datatype, datatypes.interval.Interval) or isinstance(data.datatype, datatypes.interval.CustomTrack): + if display_app == 'ucsc': mime = trans.app.datatypes_registry.get_mimetype_by_extension( data.extension.lower() ) trans.response.set_content_type(mime) - file_name = data.as_bedfile() - trans.log_event( "Display dataset id %s as BED" % str(id) ) + file_name = data.as_ucsc_display_file() + trans.log_event( "Formatted dataset id %s for display at UCSC" % str(id) ) + return open(file_name) + elif display_app == 'gbrowse': + mime = trans.app.datatypes_registry.get_mimetype_by_extension( data.extension.lower() ) + trans.response.set_content_type(mime) + file_name = data.as_gbrowse_display_file() + trans.log_event( "Formatted dataset id %s for display at GBrowse" % str(id) ) return open(file_name) else: - return 'This file cannot be displayed as bed' + return "Dataset '%s' cannot be displayed at %s." %(data.name, display_app) else: - return "No data with id=%s" % id + return "No data with id=%d" % id @web.expose def peek(self, trans, id=None): @@ -138,7 +144,7 @@ class Universe(common.Root): yield data.peek yield "" else: - yield "No data with is=%s" % id + yield "No data with id=%d" % id @web.expose def edit(self, trans, id=None, hid=None, **kwd): @@ -283,7 +289,7 @@ class Universe(common.Root): tool = toolbox.tools_by_id.get(id, '') yield "" if not tool: - yield "Unkown tool id '%s'" % id + yield "Unknown tool id '%d'" % id elif tool.help: yield tool.help else: @@ -335,10 +341,6 @@ class Universe(common.Root): new_history = self.copy_history(history, trans) new_history.name = history.name+" from "+user.email new_history.user_id = send_to_user.id - """ - gvk TODO: how should we handle galaxy_session_to_history association here? - I'll do the following for now, but not sure if this is what we want... - """ new_history.add_galaxy_session(trans.get_galaxy_session( create=True )) trans.log_event( "History share, id: %s, name: '%s': to new id: %s" % (str(history.id), history.name, str(new_history.id)) ) self.app.model.flush() diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 598b539de33..fbcf3441239 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -238,10 +238,12 @@ class Dataset( object ): return self.datatype.set_meta( self, first_line_is_header ) def missing_meta( self ): return self.datatype.missing_meta( self ) - def bed_viewport( self ): - return self.datatype.bed_viewport( self ) - def as_bedfile( self ): - return self.datatype.as_bedfile( self ) + def get_estimated_display_viewport( self ): + return self.datatype.get_estimated_display_viewport( self ) + def as_ucsc_display_file( self ): + return self.datatype.as_ucsc_display_file( self ) + def as_gbrowse_display_file( self ): + return self.datatype.as_gbrowse_display_file( self ) def display_peek( self ): return self.datatype.display_peek( self ) def display_name( self ): @@ -250,6 +252,8 @@ class Dataset( object ): return self.datatype.display_info( self ) def get_ucsc_sites( self ): return self.datatype.get_ucsc_sites( self ) + def get_gbrowse_sites( self ): + return self.datatype.get_gbrowse_sites( self ) def get_child_by_designation(self, designation): # if self.history: # for data in self.history.datasets: diff --git a/lib/galaxy/util/__init__.py b/lib/galaxy/util/__init__.py index 90baa5bac37..d7eeaa37f00 100644 --- a/lib/galaxy/util/__init__.py +++ b/lib/galaxy/util/__init__.py @@ -74,7 +74,8 @@ text_types = sets.Set([ 'regions', 'simple', 'score', 'text', 'msf', 'selex', 'tagseq', 'embl', 'srspair', 'staden', 'strider', 'xbed', 'markx10', 'pair', 'markx1', 'markx0', 'markx3', 'markx2', 'jackknifer', 'ncbi', 'mega', 'fa', 'feattable', 'phylip', 'diffseq', 'bed', 'srs', 'jackknifernon', 'swiss', - 'phylipnon', 'nexusnon', 'nametable', 'xml', 'interval', 'tabular', 'maf','axt', 'lav', 'laj', 'customtrack' + 'phylipnon', 'nexusnon', 'nametable', 'xml', 'interval', 'tabular', 'maf','axt', 'lav', 'laj', 'customtrack', + 'gbrowsetrack' ]) def parse_xml(fname): @@ -249,6 +250,13 @@ def get_ucsc_by_build(build): sites.append((site['name'],site['url'])) return sites +def get_gbrowse_sites_by_build(build): + sites = [] + for site in gbrowse_build_sites: + if build in site['builds']: + sites.append((site['name'],site['url'])) + return sites + def read_dbnames(filename): """ Read build names from file """ db_names = [] @@ -296,7 +304,7 @@ def read_dbnames(filename): db_names = [('?', 'unspecified (?)')] return db_names -def read_ucsc_build_sites(filename): +def read_build_sites(filename): """ read db names to ucsc mappings from file, this file should probably be merged with the one above """ build_sites = [] try: @@ -311,12 +319,12 @@ def read_ucsc_build_sites(filename): build_sites.append( site_dict ) except: continue except: - print "ERROR: Unable to read builds to ucsc site file" + print "ERROR: Unable to read builds for site file %s" %filename return build_sites dbnames = read_dbnames("static/ucsc/builds.txt") #this list is used in edit attributes and the upload tool -ucsc_build_sites = read_ucsc_build_sites("static/ucsc/ucsc_build_sites.txt") #this list is used in history.tmpl - +ucsc_build_sites = read_build_sites("static/ucsc/ucsc_build_sites.txt") #this list is used in history.tmpl +gbrowse_build_sites = read_build_sites("static/gbrowse/gbrowse_build_sites.txt") #this list is used in history.tmpl if __name__ == '__main__': import doctest, sys diff --git a/static/gbrowse/gbrowse_build_sites.txt b/static/gbrowse/gbrowse_build_sites.txt new file mode 100644 index 00000000000..e70e1812232 --- /dev/null +++ b/static/gbrowse/gbrowse_build_sites.txt @@ -0,0 +1,7 @@ +#Harvested from http://www.wormbase.org/db/seq/gbrowse/wormbase/ +# TODO: Uncomment the 1st lines and eliminate the 2nd test lines when the prototype is completed. +#wormbase http://gvk.bx.psu.edu/cgi-bin/gbrowse/volvox? briggsae,briggsae_cb25,brugia,elegans,elegans_gmap,elegans_pmap,fly,fly31,nGASP,nGASP_submissions,remanei,wormbase,ws77,yeast_chr1 +wormbase http://gvk.bx.psu.edu/cgi-bin/gbrowse/volvox? ctgA,tmpfiller1,tmpfiller2 +#Harvested from http://flybase.bio.indiana.edu/cgi-bin/gbrowse/dmel/ +#flybase http://flybase.bio.indiana.edu/cgi-bin/gbrowse/dmel/ dana,dere,dgri,dmel,dmoj,dper,dpse,dsec,dsim,dvir,dwil,dyak,dmelstocks +flybase http://flybase.bio.indiana.edu/cgi-bin/gbrowse/dmel/ tmpfiller1,tmpfiller2 \ No newline at end of file diff --git a/static/robots.txt b/static/robots.txt index 39ffbc9ca69..fc145db85dc 100644 --- a/static/robots.txt +++ b/static/robots.txt @@ -1,3 +1,3 @@ User-agent: * Disallow: /display? -Disallow: /display_bed? \ No newline at end of file +Disallow: /display_as? \ No newline at end of file diff --git a/templates/history.tmpl b/templates/history.tmpl index fed48c1aa2c..fea7eee0acb 100644 --- a/templates/history.tmpl +++ b/templates/history.tmpl @@ -220,15 +220,40 @@ main();"> #if $data.ext in [ "bed", "interval", "tabular", "txt", "text", "axt", "maf", "fasta", "gff", "gmaj.zip" ]: save #end if - #if $data.ext in ["bed", "interval", "customtrack" ]: - #set $value = $data.bed_viewport() - #if $value - | display at UCSC - #for $site_name,$site_url in $data.get_ucsc_sites: - #if $site_name in $app.config.ucsc_display_sites: - $site_name - #end if - #end for + #if "ucsc" in $data.datatype.supported_display_apps: + #set $viewport_tuple = $data.get_estimated_display_viewport() + #if $viewport_tuple + #set $chrom = $viewport_tuple[0] + #set $start = $viewport_tuple[1] + #set $stop = $viewport_tuple[2] + #set $displayed = "false" + #for $site_name,$site_url in $data.get_ucsc_sites: + #if $site_name in $app.config.ucsc_display_sites: + #if $displayed == "false": + | display at UCSC + #set $displayed = "true" + #end if + $site_name + #end if + #end for + #end if + #end if + #if "gbrowse" in $data.datatype.supported_display_apps: + #set $viewport_tuple = $data.get_estimated_display_viewport() + #if $viewport_tuple + #set $chrom = $viewport_tuple[0] + #set $start = $viewport_tuple[1] + #set $stop = $viewport_tuple[2] + #set $displayed = "false" + #for $site_name, $site_url in $data.get_gbrowse_sites: + #if $site_name in $app.config.gbrowse_display_sites: + #if $displayed == "false": + | display in GBrowse + #set $displayed = "true" + #end if + $site_name + #end if + #end for #end if #end if @@ -303,13 +328,40 @@ main();"> #if $child.ext in [ "bed", "interval", "tabular", "txt", "text", "axt", "maf", "fasta", "gff", "gmaj.zip" ]: save #end if - #if $child.ext in ["bed", "interval" ]: - #set $value = $child.bed_viewport() - #if $value - | display at UCSC - #for $site_name,$site_url in $child.get_ucsc_sites: - $site_name - #end for + #if "ucsc" in $child.datatype.supported_display_apps: + #set $viewport_tuple = $child.get_estimated_display_viewport() + #if $viewport_tuple + #set $chrom = $viewport_tuple[0] + #set $start = $viewport_tuple[1] + #set $stop = $viewport_tuple[2] + #set $displayed = "false" + #for $site_name,$site_url in $child.get_ucsc_sites: + #if $site_name in $app.config.ucsc_display_sites: + #if $displayed == "false": + | display at UCSC + #set $displayed = "true" + #end if + $site_name + #end if + #end for + #end if + #end if + #if "gbrowse" in $child.datatype.supported_display_apps: + #set $viewport_tuple = $child.get_estimated_display_viewport() + #if $viewport_tuple + #set $chrom = $viewport_tuple[0] + #set $start = $viewport_tuple[1] + #set $stop = $viewport_tuple[2] + #set $displayed = "false" + #for $site_name,$site_url in $child.get_gbrowse_sites: + #if $site_name in $app.config.ucsc_display_sites: + #if $displayed == "false": + | display in GBrowse + #set $displayed = "true" + #end if + $site_name + #end if + #end for #end if #end if diff --git a/tools/data_source/biomart.xml b/tools/data_source/biomart.xml index 2eba4f98255..2e397571f83 100644 --- a/tools/data_source/biomart.xml +++ b/tools/data_source/biomart.xml @@ -3,7 +3,7 @@ Central server - + noop go to BioMart Central $GALAXY_URL diff --git a/universe_wsgi.ini.sample b/universe_wsgi.ini.sample index 202f5693aa5..cf8ae3c6d57 100644 --- a/universe_wsgi.ini.sample +++ b/universe_wsgi.ini.sample @@ -87,6 +87,7 @@ mailing_join_addr = galaxy-user-join@bx.psu.edu use_heartbeat = True # Comma separated list of UCSC browsers to use for viewing ucsc_display_sites = main,test,archaea +gbrowse_display_sites = wormbase,flybase # Static files @@ -126,4 +127,5 @@ gmaj.zip = galaxy.datatypes.images:Gmaj,application/zip laj = galaxy.datatypes.images:Laj lav = galaxy.datatypes.sequence:Lav html = galaxy.datatypes.images:Html,text/html -customtrack = galaxy.datatypes.interval:CustomTrack \ No newline at end of file +customtrack = galaxy.datatypes.interval:CustomTrack +gbrowsetrack = galaxy.datatypes.interval:GBrowseTrack \ No newline at end of file