diff --git a/lib/galaxy/web/controllers/tracks.py b/lib/galaxy/web/controllers/tracks.py
index a4a66fe92e0..8555fd8c962 100644
--- a/lib/galaxy/web/controllers/tracks.py
+++ b/lib/galaxy/web/controllers/tracks.py
@@ -13,9 +13,10 @@ Problems
need to support that, but need to make user defined build support better)
"""
-import math, re, logging, glob
-log = logging.getLogger(__name__)
+import math, re, logging, glob, pkg_resources
+pkg_resources.require( "bx-python" )
+from bx.seq.twobit import TwoBitFile
from galaxy import model
from galaxy.util.json import to_json_string, from_json_string
from galaxy.web.base.controller import *
@@ -71,11 +72,9 @@ class DatasetSelectionGrid( grids.Grid ):
DbKeyColumn( "Dbkey", key="dbkey", model_class=model.HistoryDatasetAssociation, visible=False )
]
columns.append(
- grids.MulticolFilterColumn(
- "Search",
- cols_to_filter=[ columns[0], columns[1] ],
+ grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0], columns[1] ],
key="free-text-search", visible=False, filterable="standard" )
- )
+ )
def build_initial_query( self, trans, **kwargs ):
return trans.sa_session.query( self.model_class ).join( model.History.table).join( model.Dataset.table )
@@ -96,6 +95,15 @@ class TracksController( BaseController, UsesVisualization ):
"""
available_tracks = None
+ available_genomes = None
+
+ def _init_references(self, trans):
+ avail_genomes = {}
+ for line in open( os.path.join( trans.app.config.tool_data_path, "twobit.loc" ) ):
+ if line.startswith("#"): continue
+ key, path = line.split()
+ avail_genomes[key] = path
+ self.available_genomes = avail_genomes
@web.expose
@web.require_login()
@@ -170,12 +178,16 @@ class TracksController( BaseController, UsesVisualization ):
# No vis_id, so visualization is new. User is current user, dbkey must be given.
vis_user = trans.user
vis_dbkey = dbkey
-
+
# Get chroms data.
chroms = self._chroms( trans, vis_user, vis_dbkey )
+
+ # Check for reference chrom
+ if self.available_genomes is None: self._init_references(trans)
+
to_sort = [{ 'chrom': chrom, 'len': length } for chrom, length in chroms.iteritems()]
to_sort.sort(lambda a,b: cmp( split_by_number(a['chrom']), split_by_number(b['chrom']) ))
- return to_sort
+ return { 'reference': vis_dbkey in self.available_genomes, 'chrom_info': to_sort }
def _chroms( self, trans, user, dbkey ):
"""
@@ -204,7 +216,24 @@ class TracksController( BaseController, UsesVisualization ):
fields = line.split("\t")
manifest[fields[0]] = int(fields[1])
return manifest
+
+ @web.json
+ def reference( self, trans, dbkey, chrom, low, high, **kwargs ):
+ if self.available_genomes is None: self._init_references(trans)
+ if dbkey not in self.available_genomes:
+ return None
+
+ try:
+ twobit = TwoBitFile( open(self.available_genomes[dbkey]) )
+ except IOError:
+ return None
+
+ if chrom in twobit:
+ return twobit[chrom].get(int(low), int(high))
+
+ return None
+
@web.json
def data( self, trans, dataset_id, chrom, low, high, **kwargs ):
"""
diff --git a/static/scripts/packed/trackster.js b/static/scripts/packed/trackster.js
index c118de4ce82..2def4ec05b9 100644
--- a/static/scripts/packed/trackster.js
+++ b/static/scripts/packed/trackster.js
@@ -1 +1 @@
-var DENSITY=200,FEATURE_LEVELS=10,DATA_ERROR="There was an error in indexing this dataset. ",DATA_NOCONVERTER="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",DATA_NONE="No data for this chrom/contig.",DATA_PENDING="Currently indexing... please wait",DATA_LOADING="Loading data...",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=30,CACHED_DATA=5,CONTEXT=$("").get(0).getContext("2d"),RIGHT_STRAND,LEFT_STRAND;var right_img=new Image();right_img.src="/static/images/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src="/static/images/visualization/strand_left.png";left_img.onload=function(){LEFT_STRAND=CONTEXT.createPattern(left_img,"repeat")};var right_img_inv=new Image();right_img_inv.src="/static/images/visualization/strand_right_inv.png";right_img_inv.onload=function(){RIGHT_STRAND_INV=CONTEXT.createPattern(right_img_inv,"repeat")};var left_img_inv=new Image();left_img_inv.src="/static/images/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};var Cache=function(a){this.num_elements=a;this.clear()};$.extend(Cache.prototype,{get:function(b){var a=this.key_ary.indexOf(b);if(a!=-1){this.key_ary.splice(a,1);this.key_ary.push(b)}return this.obj_cache[b]},set:function(b,c){if(!this.obj_cache[b]){if(this.key_ary.length>=this.num_elements){var a=this.key_ary.shift();delete this.obj_cache[a]}this.key_ary.push(b)}this.obj_cache[b]=c;return c},clear:function(){this.obj_cache={};this.key_ary=[]}});var View=function(b,d,c,a){this.vis_id=c;this.dbkey=a;this.title=d;this.chrom=b;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.reset()};$.extend(View.prototype,{add_track:function(a){a.view=this;a.track_id=this.track_id_counter;this.tracks.push(a);if(a.init){a.init()}a.container_div.attr("id","track_"+a.track_id);this.track_id_counter+=1},add_label_track:function(a){a.view=this;this.label_tracks.push(a)},remove_track:function(a){this.has_changes=true;a.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(a)]},update_options:function(){this.has_changes=true;var b=$("ul#sortable-ul").sortable("toArray");for(var c in b){var e=b[c].split("_li")[0].split("track_")[1];$("#viewport").append($("#track_"+e))}for(var d in view.tracks){var a=view.tracks[d];if(a&&a.update_options){a.update_options(d)}}},reset:function(){this.low=this.max_low;this.high=this.max_high;$(".yaxislabel").remove()},redraw:function(f){var d=this.high-this.low,b=this.low,e=this.high;if(bthis.max_high){e=this.max_high}if(d