[hg] galaxy 3109: revert to sqlite default in universe.sample
details: http://www.bx.psu.edu/hg/galaxy/rev/c507bad7e373 changeset: 3109:c507bad7e373 user: Kanwei Li <kanwei@gmail.com> date: Wed Nov 18 13:45:53 2009 -0500 description: revert to sqlite default in universe.sample diffstat: lib/galaxy/datatypes/converters/wiggle_to_array_tree_converter.py | 6 +- lib/galaxy/visualization/tracks/data/array_tree.py | 30 +- lib/galaxy/visualization/tracks/data/interval_index.py | 26 +- static/scripts/trackster.js | 116 +++++++++-- universe_wsgi.ini.sample | 12 +- 5 files changed, 131 insertions(+), 59 deletions(-) diffs (352 lines): diff -r bcb3c0eeb72f -r c507bad7e373 lib/galaxy/datatypes/converters/wiggle_to_array_tree_converter.py --- a/lib/galaxy/datatypes/converters/wiggle_to_array_tree_converter.py Wed Nov 18 13:37:41 2009 -0500 +++ b/lib/galaxy/datatypes/converters/wiggle_to_array_tree_converter.py Wed Nov 18 13:45:53 2009 -0500 @@ -8,7 +8,7 @@ from bx.arrays.array_tree import * from bx.arrays.wiggle import IntervalReader -BLOCK_SIZE = 1000 +BLOCK_SIZE = 100 def main(): @@ -20,8 +20,8 @@ # Fill array from wiggle d = array_tree_dict_from_wiggle_reader( reader, {}, block_size = BLOCK_SIZE ) - for value in d.itervalues(): - value.root.build_summary() + for array_tree in d.itervalues(): + array_tree.root.build_summary() f = open( out_fname, "w" ) FileArrayTreeDict.dict_to_file( d, f ) diff -r bcb3c0eeb72f -r c507bad7e373 lib/galaxy/visualization/tracks/data/array_tree.py --- a/lib/galaxy/visualization/tracks/data/array_tree.py Wed Nov 18 13:37:41 2009 -0500 +++ b/lib/galaxy/visualization/tracks/data/array_tree.py Wed Nov 18 13:45:53 2009 -0500 @@ -12,9 +12,6 @@ # Maybe this should be included in the datatype itself, so users can add their # own types to the browser as long as they return the right format of data? -# FIXME: Assuming block size is always 1000 for the moment -BLOCK_SIZE = 1000 - class ArrayTreeDataProvider( object ): def __init__( self, dataset, original_dataset ): self.dataset = dataset @@ -32,32 +29,33 @@ return { 'max': float( max(root_summary.maxs) ), 'min': float( min(root_summary.mins) ) } def get_data( self, chrom, start, end, **kwargs ): - start = int( start ) - end = int( end ) - resolution = max(1, ceil(float(kwargs['resolution']))) - - level = int( floor( log( resolution, BLOCK_SIZE ) ) ) - level = max( level, 0 ) - stepsize = BLOCK_SIZE ** level - step1 = stepsize * BLOCK_SIZE - - # Open the file f = open( self.dataset.file_name ) d = FileArrayTreeDict( f ) + # Get the right chromosome try: chrom_array_tree = d[chrom] except KeyError: return None + + block_size = chrom_array_tree.block_size + start = int( start ) + end = int( end ) + resolution = max(1, ceil(float(kwargs['resolution']))) + + level = int( floor( log( resolution, block_size ) ) ) + level = max( level, 0 ) + stepsize = block_size ** level + step1 = stepsize * block_size + # Is the requested level valid? assert 0 <= level <= chrom_array_tree.levels - # Calculate the actual start/range/step of the block we're getting results = [] - for block_start in range( start, end, stepsize * BLOCK_SIZE ): + for block_start in range( start, end, stepsize * block_size ): # print block_start # Return either data point or a summary depending on the level - indexes = range( block_start, block_start + stepsize * BLOCK_SIZE, stepsize ) + indexes = range( block_start, block_start + stepsize * block_size, stepsize ) if level > 0: s = chrom_array_tree.get_summary( block_start, level ) if s is not None: diff -r bcb3c0eeb72f -r c507bad7e373 lib/galaxy/visualization/tracks/data/interval_index.py --- a/lib/galaxy/visualization/tracks/data/interval_index.py Wed Nov 18 13:37:41 2009 -0500 +++ b/lib/galaxy/visualization/tracks/data/interval_index.py Wed Nov 18 13:45:53 2009 -0500 @@ -27,19 +27,21 @@ payload['strand'] = feature[5] except IndexError: pass - try: - block_sizes = [ int(n) for n in feature[10].split(',') if n != ''] - block_starts = [ int(n) for n in feature[11].split(',') if n != '' ] - blocks = zip(block_sizes, block_starts) - payload['blocks'] = [ (start + block[1], start + block[1] + block[0]) for block in blocks] - except IndexError: - pass + + if 'include_blocks' in kwargs: + try: + block_sizes = [ int(n) for n in feature[10].split(',') if n != ''] + block_starts = [ int(n) for n in feature[11].split(',') if n != '' ] + blocks = zip(block_sizes, block_starts) + payload['blocks'] = [ (start + block[1], start + block[1] + block[0]) for block in blocks] + except IndexError: + pass - try: - payload['thick_start'] = int(feature[6]) - payload['thick_end'] = int(feature[7]) - except IndexError: - pass + try: + payload['thick_start'] = int(feature[6]) + payload['thick_end'] = int(feature[7]) + except IndexError: + pass results.append(payload) uid += 1 diff -r bcb3c0eeb72f -r c507bad7e373 static/scripts/trackster.js --- a/static/scripts/trackster.js Wed Nov 18 13:37:41 2009 -0500 +++ b/static/scripts/trackster.js Wed Nov 18 13:45:53 2009 -0500 @@ -1,9 +1,10 @@ /* Trackster 2009, James Taylor, Kanwei Li */ -var DEBUG = false; +var DEBUG = true; var DENSITY = 1000, + FEATURE_LEVELS = 100, DATA_ERROR = "There was an error in indexing this dataset.", DATA_NONE = "No data for this chrom/contig.", DATA_PENDING = "Currently indexing... please wait", @@ -108,6 +109,7 @@ // 10^log10(range / DENSITY) Close approximation for browser window, assuming DENSITY = window width this.resolution = Math.pow( 10, Math.ceil( Math.log( (this.high - this.low) / DENSITY ) / Math.LN10 ) ); + this.zoom_res = Math.max(1,Math.ceil( Math.log( (this.high - this.low) / FEATURE_LEVELS ) / Math.log(FEATURE_LEVELS) )); // Overview $("#overview-box").css( { @@ -171,7 +173,7 @@ resolution = this.view.resolution; - if (DEBUG) { $("#debug").text(resolution); } + if (DEBUG) { $("#debug").text(resolution + " " + this.view.zoom_res); } var parent_element = $("<div style='position: relative;'></div>"); this.content_div.children( ":first" ).remove(); @@ -279,7 +281,7 @@ max_label.css({ position: "relative", top: "35px" }); max_label.prependTo(track.container_div) - min_label.css({ position: "relative", top: track.height_px + 32 + "px", }); + min_label.css({ position: "relative", top: track.height_px + 32 + "px" }); min_label.prependTo(track.container_div); track.draw(); @@ -297,7 +299,7 @@ $.getJSON( data_url, { track_type: this.track_type, chrom: this.view.chrom, low: low, high: high, dataset_id: this.dataset_id, resolution: this.view.resolution }, function ( data ) { - track.cache[key] = data; + track.cache.set(key, data); delete track.data_queue[key]; track.draw(); }); @@ -313,12 +315,12 @@ canvas = $("<canvas class='tile'></canvas>"), key = resolution + "_" + tile_index; - if (!this.cache[key]) { + if (!this.cache.get(key)) { this.get_data( resolution, tile_index ); return; } - var data = this.cache[key]; + var data = this.cache.get(key); canvas.css( { position: "absolute", top: 0, @@ -368,7 +370,11 @@ this.showing_labels = false; this.vertical_gap = 10; this.base_color = "#2C3143"; + this.default_font = "9px Monaco, Lucida Console, monospace"; this.left_offset = 200; + this.inc_slots = {}; + this.data_queue = {}; + this.data_cache = new Cache(20); }; $.extend( FeatureTrack.prototype, TiledTrack.prototype, { init: function() { @@ -397,6 +403,23 @@ } }); }, + get_data: function( low, high ) { + console.log("getting: ", low, high); + var track = this, + key = low + '_' + high; + + if (!track.data_queue[key]) { + track.data_queue[key] = true; + $.getJSON( data_url, { track_type: track.track_type, chrom: track.view.chrom, + low: low, high: high, dataset_id: track.dataset_id, + include_blocks: true }, function ( data ) { + track.data_cache.set(key, data); + // console.log("datacache", track.data_cache.get(key)); + delete track.data_queue[key]; + track.draw(); + }); + } + }, calc_slots: function( include_labels ) { // console.log("num vals: " + this.values.length); var end_ary = [], @@ -438,27 +461,76 @@ this.height_px = end_ary.length * this.vertical_gap + 15; this.content_div.css( "height", this.height_px + "px" ); }, + incremental_slots: function( level, features ) { + if (!this.inc_slots[level]) { + this.inc_slots[level] = {}; + this.inc_slots[level].w_scale = 1000 / Math.pow(FEATURE_LEVELS, level); + } + var slots = this.inc_slots[level]; + if (slots[uid]) { + return slots[uid]; + } + var end_ary = [], + undone = [], + max_high = this.view.max_high, + max_low = this.view.max_low; + + for (var i = 0, len = features.length; i < len; i++) { + var feature = features[i]; + if (slots[feature.uid]) { + end_ary[ slots[feature.uid] ] = Math.ceil( (feature.end - max_low) * slots.w_scale ); + } else { + undone.push(feature); + } + } + for (var i = 0, len = undone.length; i < len; i++) { + var feature = undone[i]; + f_start = Math.floor( (feature.start - max_low) * slots.w_scale ); + f_start -= dummy_canvas.measureText(feature.name).width; + f_end = Math.ceil( (feature.end - max_low) * slots.w_scale ); + + }, draw_tile: function( resolution, tile_index, parent_element, w_scale ) { - if (!this.values) { // Still loading - return null; + if (!this.values) { + return; } + var tile_low = tile_index * DENSITY * resolution, + tile_high = ( tile_index + 1 ) * DENSITY * resolution, + tile_span = DENSITY * resolution; // console.log("drawing " + tile_index); // Once we zoom in enough, show name labels - if (w_scale > this.show_labels_scale && !this.showing_labels) { - this.showing_labels = true; - if (!this.zi_slots) { - this.calc_slots(true); + var data; + if (w_scale > this.show_labels_scale) { + if (!this.showing_labels) { + this.showing_labels = true; + if (!this.zi_slots) { + this.calc_slots(true); + } + this.slots = this.zi_slots; } - this.slots = this.zi_slots; - } else if (w_scale <= this.show_labels_scale && this.showing_labels) { - this.showing_labels = false; - this.slots = this.zo_slots; + for (var k in this.data_cache.obj_cache) { + var k_split = k.split("_"), k_low = k_split[0], k_high = k_split[1]; + if (k_low <= tile_low && k_high >= tile_high) { + data = this.data_cache.get(k); + break; + } + } + if (!data) { + this.data_queue[ [tile_low, tile_high] ] = true; + this.get_data(tile_low, tile_high); + return; + } + + } else { + if (this.showing_labels) { + this.showing_labels = false; + this.slots = this.zo_slots; + } + data = this.values; } // console.log(this.slots); - var tile_low = tile_index * DENSITY * resolution, - tile_high = ( tile_index + 1 ) * DENSITY * resolution, - tile_span = DENSITY * resolution; + // console.log(tile_low, tile_high, tile_length, w_scale); var width = Math.ceil( tile_span * w_scale ), height = this.height_px, @@ -474,12 +546,12 @@ // console.log(( tile_low - this.view.low ) * w_scale, tile_index, w_scale); var ctx = new_canvas.get(0).getContext("2d"); ctx.fillStyle = this.base_color; - ctx.font = "10px monospace"; + ctx.font = this.default_font; ctx.textAlign = "right"; var j = 0; - for (var i = 0, len = this.values.length; i < len; i++) { - var feature = this.values[i]; + for (var i = 0, len = data.length; i < len; i++) { + var feature = data[i]; if (feature.start <= tile_high && feature.end >= tile_low) { var f_start = Math.floor( Math.max(0, (feature.start - tile_low) * w_scale) ), f_end = Math.ceil( Math.min(width, (feature.end - tile_low) * w_scale) ), diff -r bcb3c0eeb72f -r c507bad7e373 universe_wsgi.ini.sample --- a/universe_wsgi.ini.sample Wed Nov 18 13:37:41 2009 -0500 +++ b/universe_wsgi.ini.sample Wed Nov 18 13:45:53 2009 -0500 @@ -31,15 +31,15 @@ paste.app_factory = galaxy.web.buildapp:app_factory # By default, Galaxy uses a SQLite database found here -#database_file = database/universe.sqlite +database_file = database/universe.sqlite # You may use a SQLAlchemy connection string to specify an external database # instead. PostgreSQL and MySQL are supported. -database_connection = postgres:///galaxy -database_engine_option_echo = true -database_engine_option_echo_pool = true -database_engine_option_pool_size = 10 -database_engine_option_max_overflow = 20 +#database_connection = postgres:///galaxy +#database_engine_option_echo = true +#database_engine_option_echo_pool = true +#database_engine_option_pool_size = 10 +#database_engine_option_max_overflow = 20 # If using MySQL, see: # http://rapd.wordpress.com/2008/03/02/sqlalchemy-sqlerror-operationalerror-20...
participants (1)
-
Greg Von Kuster