diff --git a/lib/galaxy/visualization/tracks/data/bam.py b/lib/galaxy/visualization/tracks/data/bam.py
index 1a6dc8fe484..90440d5988c 100644
--- a/lib/galaxy/visualization/tracks/data/bam.py
+++ b/lib/galaxy/visualization/tracks/data/bam.py
@@ -10,7 +10,7 @@ from math import floor, ceil, log
import logging
log = logging.getLogger(__name__)
-MAX_VALS = 50 # only display first MAX_VALS datapoints
+MAX_VALS = 5000 # only display first MAX_VALS datapoints
class BamDataProvider( object ):
"""
@@ -36,7 +36,7 @@ class BamDataProvider( object ):
if chrom.startswith( 'chr' ):
try:
data = bamfile.fetch( start=start, end=end, reference=chrom[3:] )
- except:
+ except ValueError:
return None
else:
return None
@@ -74,4 +74,4 @@ class BamDataProvider( object ):
results.append( [ qname, start, end, read['seq'], r1, r2 ] )
bamfile.close()
- return results
\ No newline at end of file
+ return { 'data': results, 'message': message }
diff --git a/lib/galaxy/web/controllers/tracks.py b/lib/galaxy/web/controllers/tracks.py
index 214b0e32ee9..3969e074ab6 100644
--- a/lib/galaxy/web/controllers/tracks.py
+++ b/lib/galaxy/web/controllers/tracks.py
@@ -99,7 +99,7 @@ class TracksController( BaseController, UsesVisualization ):
user = trans.get_user()
if 'dbkeys' in user.preferences:
user_keys = from_json_string( user.preferences['dbkeys'] )
-
+
dbkeys = [ (k, v) for k, v in trans.db_builds if k in self.len_files or k in user_keys ]
return trans.fill_template( "tracks/new_browser.mako", dbkeys=dbkeys )
@@ -197,21 +197,24 @@ class TracksController( BaseController, UsesVisualization ):
"""
Helper method that returns chrom lengths for a given user and dbkey.
"""
+ len_file = None
+ len_ds = None
# If there is any dataset in the history of extension `len`, this will use it
if 'dbkeys' in user.preferences:
user_keys = from_json_string( user.preferences['dbkeys'] )
if dbkey in user_keys:
- return user_keys[dbkey]['chroms']
+ len_file = trans.sa_session.query( trans.app.model.HistoryDatasetAssociation ).get( user_keys[dbkey]['len'] ).file_name
- db_manifest = trans.db_dataset_for( dbkey )
- if not db_manifest:
- db_manifest = os.path.join( trans.app.config.tool_data_path, 'shared','ucsc','chrom', "%s.len" % dbkey )
- else:
- db_manifest = db_manifest.file_name
+ if not len_file:
+ len_ds = trans.db_dataset_for( dbkey )
+ if not len_ds:
+ len_file = os.path.join( trans.app.config.tool_data_path, 'shared','ucsc','chrom', "%s.len" % dbkey )
+ else:
+ len_file = len_ds.file_name
manifest = {}
- if not os.path.exists( db_manifest ):
+ if not os.path.exists( len_file ):
return None
- for line in open( db_manifest ):
+ for line in open( len_file ):
if line.startswith("#"): continue
line = line.rstrip("\r\n")
fields = line.split("\t")
@@ -240,7 +243,9 @@ class TracksController( BaseController, UsesVisualization ):
# Need to check states again for the converted version
if converted_dataset and converted_dataset.state == model.Dataset.states.ERROR:
- return messages.ERROR
+ job_id = trans.sa_session.query( trans.app.model.JobToOutputDatasetAssociation ).filter_by( dataset_id=converted_dataset.id ).first().job_id
+ job = trans.sa_session.query( trans.app.model.Job ).get( job_id )
+ return { 'kind': messages.ERROR, 'message': job.stderr }
if not converted_dataset or converted_dataset.state != model.Dataset.states.OK:
return messages.PENDING
@@ -256,13 +261,17 @@ class TracksController( BaseController, UsesVisualization ):
extra_info = "no_detail"
else:
frequencies, max_v, avg_v, delta = summary
- return { "dataset_type": data_sources['index'], "data": frequencies, "max": max_v, "avg": avg_v, "delta": delta }
+ return { 'dataset_type': data_sources['index'], 'data': frequencies, 'max': max_v, 'avg': avg_v, 'delta': delta }
dataset_type = data_sources['data']
data_provider = dataset_type_to_data_provider[ dataset_type ]( dataset.get_converted_dataset(trans, dataset_type), dataset )
-
+
data = data_provider.get_data( chrom, low, high, **kwargs )
- return { "dataset_type": dataset_type, "extra_info": extra_info, "data": data }
+ message = None
+ if isinstance(data, dict) and 'message' in data:
+ message = data['message']
+ data = data['data']
+ return { 'dataset_type': dataset_type, 'extra_info': extra_info, 'data': data, 'message': message }
@web.expose
def list_tracks( self, trans, hid ):
diff --git a/lib/galaxy/web/controllers/user.py b/lib/galaxy/web/controllers/user.py
index 494d0ef9c5f..26ae19b0fd6 100644
--- a/lib/galaxy/web/controllers/user.py
+++ b/lib/galaxy/web/controllers/user.py
@@ -902,7 +902,18 @@ class User( BaseController ):
if not name or not key or not len_text:
message = "You must specify values for all the fields."
else:
- chrom_dict = {}
+ # Create new len file
+ new_len = trans.app.model.HistoryDatasetAssociation( extension="len", create_dataset=True, sa_session=trans.sa_session )
+ trans.sa_session.add( new_len )
+ new_len.name = name
+ new_len.visible = False
+ new_len.history_id = trans.get_history().id
+ new_len.state = trans.app.model.Job.states.OK
+ new_len.info = "custom build .len file"
+ trans.sa_session.flush()
+
+ counter = 0
+ f = open(new_len.file_name, "w")
for line in len_text.split("\n"):
lst = line.strip().split()
if not lst or len(lst) < 2:
@@ -914,8 +925,10 @@ class User( BaseController ):
except ValueError:
lines_skipped += 1
continue
- chrom_dict[chrom] = length
- dbkeys[key] = { "name": name, "chroms": chrom_dict }
+ counter += 1
+ f.write("%s\t%s\n" % (chrom, length))
+ f.close()
+ dbkeys[key] = { "name": name, "len": new_len.id, "count": counter }
user.preferences['dbkeys'] = to_json_string(dbkeys)
trans.sa_session.flush()
diff --git a/static/scripts/packed/trackster.js b/static/scripts/packed/trackster.js
index c4bc4dc05de..02671cf9105 100644
--- a/static/scripts/packed/trackster.js
+++ b/static/scripts/packed/trackster.js
@@ -1 +1 @@
-var DEBUG=false;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")};function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}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 Drawer=function(){};$.extend(Drawer.prototype,{intensity:function(b,a,c){},});drawer=new Drawer();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.center=(this.max_high-this.max_low)/2;this.zoom_factor=3;this.zoom_level=0;this.track_id_counter=0};$.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){a.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[a]},update_options:function(){var b=$("ul#sortable-ul").sortable("toArray");var d=[];var c=$("#viewport > div").sort(function(g,f){return b.indexOf($(g).attr("id"))>b.indexOf($(f).attr("id"))});$("#viewport > div").remove();$("#viewport").html(c);for(var e in view.tracks){var a=view.tracks[e];if(a.update_options){a.update_options(e)}}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.center=this.center=(this.max_high-this.max_low)/2;this.zoom_level=0;$(".yaxislabel").remove()},redraw:function(f){this.span=this.max_high-this.max_low;var d=this.span/Math.pow(this.zoom_factor,this.zoom_level),b=this.center-(d/2),e=b+d;if(b<0){b=0;e=b+d}else{if(e>this.max_high){e=this.max_high;b=e-d}}this.low=Math.floor(b);this.high=Math.ceil(e);this.center=Math.round(this.low+(this.high-this.low)/2);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/200)/Math.LN10));this.zoom_res=Math.pow(FEATURE_LEVELS,Math.max(0,Math.ceil(Math.log(this.resolution,FEATURE_LEVELS)/Math.log(FEATURE_LEVELS))));$("#overview-box").css({left:(this.low/this.span)*$("#overview-viewport").width(),width:Math.max(12,((this.high-this.low)/this.span)*$("#overview-viewport").width())}).show();$("#low").val(commatize(this.low));$("#high").val(commatize(this.high));if(!f){for(var c=0,a=this.tracks.length;c