galaxy-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions

14 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/425076fe5ea0/
changeset: r5220:425076fe5ea0
user: dan
date: 2011-03-15 04:01:11
summary: Allow upload to function on https URLs.
affected #: 2 files (142 bytes)
--- a/lib/galaxy/tools/parameters/grouping.py Fri Mar 11 17:54:06 2011 -0500
+++ b/lib/galaxy/tools/parameters/grouping.py Mon Mar 14 23:01:11 2011 -0400
@@ -218,12 +218,12 @@
url_paste_file = group_incoming.get( 'url_paste', None )
if url_paste_file is not None:
url_paste = open( url_paste_file, 'r' ).read( 1024 )
- if url_paste.lstrip().lower().startswith( 'http://' ) or url_paste.lstrip().lower().startswith( 'ftp://' ):
+ if url_paste.lstrip().lower().startswith( 'http://' ) or url_paste.lstrip().lower().startswith( 'ftp://' ) or url_paste.lstrip().lower().startswith( 'https://' ):
url_paste = url_paste.replace( '\r', '' ).split( '\n' )
for line in url_paste:
line = line.strip()
if line:
- if not line.lower().startswith( 'http://' ) and not line.lower().startswith( 'ftp://' ):
+ if not line.lower().startswith( 'http://' ) and not line.lower().startswith( 'ftp://' ) and not line.lower().startswith( 'https://' ):
continue # non-url line, ignore
precreated_name = line
dataset_name = override_name
--- a/lib/galaxy/web/controllers/tool_runner.py Fri Mar 11 17:54:06 2011 -0500
+++ b/lib/galaxy/web/controllers/tool_runner.py Mon Mar 14 23:01:11 2011 -0400
@@ -237,7 +237,7 @@
line = line.rstrip( '\r\n' ).strip()
if not line:
continue
- elif line.lower().startswith( 'http://' ) or line.lower().startswith( 'ftp://' ):
+ elif line.lower().startswith( 'http://' ) or line.lower().startswith( 'ftp://' ) or line.lower().startswith( 'https://' ):
url = True
datasets.append( create_dataset( line ) )
else:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: kanwei: trackster: Fix BAM reads without cigar string (assume all match); datasets added into a new track browser will now index immediately instead of after changing a chrom
by Bitbucket 11 Mar '11
by Bitbucket 11 Mar '11
11 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/98ce387e70ff/
changeset: r5219:98ce387e70ff
user: kanwei
date: 2011-03-11 23:54:06
summary: trackster: Fix BAM reads without cigar string (assume all match); datasets added into a new track browser will now index immediately instead of after changing a chrom
affected #: 4 files (281 bytes)
--- a/static/june_2007_style/blue/trackster.css Fri Mar 11 15:57:06 2011 -0500
+++ b/static/june_2007_style/blue/trackster.css Fri Mar 11 17:54:06 2011 -0500
@@ -28,6 +28,7 @@
.track-tile canvas{position:relative;z-index:100;border:solid white;border-width:2px 0px 0px 0px;}
.track.error .track-content{background-color:#ECB4AF;background-image:none;padding:2px 0;}
.track.nodata .track-content{background-color:#eee;background-image:none;padding:2px 0;}
+.track.pending .track-content{background-color:white;background-image:none;padding:2px 0;}
.loading{min-height:100px;}
.label-track{font-size:10px;border:none;padding:0;margin:0;height:1.5em;overflow:hidden;}
.label-track .label{border-left:solid #999 1px;padding:1px;padding-bottom:2px;display:inline-block;}
--- a/static/june_2007_style/trackster.css.tmpl Fri Mar 11 15:57:06 2011 -0500
+++ b/static/june_2007_style/trackster.css.tmpl Fri Mar 11 17:54:06 2011 -0500
@@ -177,6 +177,11 @@
background-image: none;
padding: 2px 0;
}
+.track.pending .track-content {
+ background-color: white;
+ background-image: none;
+ padding: 2px 0;
+}
.loading {
min-height: 100px;
--- a/static/scripts/packed/trackster.js Fri Mar 11 15:57:06 2011 -0500
+++ b/static/scripts/packed/trackster.js Fri Mar 11 17:54:06 2011 -0500
@@ -1,1 +1,1 @@
-CanvasRenderingContext2D.prototype.dashedLine=function(c,j,b,h,f){if(f===undefined){f=4}var e=b-c;var d=h-j;var g=Math.floor(Math.sqrt(e*e+d*d)/f);var l=e/g;var k=d/g;var a;for(a=0;a<g;a++,c+=l,j+=k){if(a%2!==0){continue}this.fillRect(c,j,f,1)}};CanvasRenderingContext2D.prototype.drawDownwardEquilateralTriangle=function(b,a,e){var d=b-e/2,c=b+e/2,f=a-Math.sqrt(e*3/2);this.beginPath();this.moveTo(d,f);this.lineTo(c,f);this.lineTo(b,a);this.lineTo(d,f);this.strokeStyle=this.fillStyle;this.fill();this.stroke();this.closePath()};function sortable(a,b){a.bind("drag",{handle:b,relative:true},function(h,j){var g=$(this).parent();var f=g.children();var c;for(c=0;c<f.length;c++){if(j.offsetY<$(f.get(c)).position().top){break}}if(c===f.length){if(this!==f.get(c-1)){g.append(this)}}else{if(this!==f.get(c)){$(this).insertBefore(f.get(c))}}})}var NO_OVERLAP=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005;function compute_overlap(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=NO_OVERLAP}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=NO_OVERLAP}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a}function is_overlap(b,a){return(compute_overlap(b,a)!==NO_OVERLAP)}var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=1,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,ERROR_PADDING=10,LABEL_SPACING=2,PACK_SPACING=5,MIN_SQUISH_VIEW_WIDTH=12000,DEFAULT_FONT="9px Monaco, Lucida Console, monospace",DENSITY=200,FEATURE_LEVELS=10,MAX_FEATURE_DEPTH=100,DEFAULT_DATA_QUERY_WAIT=5000,MAX_CHROMS_SELECTABLE=100,CONNECTOR_COLOR="#ccc",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_CANNOT_RUN_TOOL="Tool cannot be rerun: ",DATA_LOADING="Loading data...",DATA_OK="Ready for display",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=5,CACHED_DATA=5,DUMMY_CANVAS=document.createElement("canvas"),RIGHT_STRAND,LEFT_STRAND;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(DUMMY_CANVAS)}var CONTEXT=DUMMY_CANVAS.getContext("2d");CONTEXT.font=DEFAULT_FONT;var CHAR_WIDTH_PX=CONTEXT.measureText("A").width,CHAR_HEIGHT_PX=9;var right_img=new Image();right_img.src=image_path+"/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src=image_path+"/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=image_path+"/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=image_path+"/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function round_1000(a){return Math.round(a*1000)/1000}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.move_key_to_end(b,a)}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},move_key_to_end:function(b,a){this.key_ary.splice(a,1);this.key_ary.push(b)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var DataCache=function(a){Cache.call(this,a)};$.extend(DataCache.prototype,Cache.prototype,{get_data:function(g,b,e){var h=this.get(this.gen_key(g,b,e));if(h){return h}var j,f,a,d,e,h;for(var c=0;c<this.key_ary.length;c++){j=this.key_ary[c];f=this.split_key(j);a=f[0];d=f[1];if(g>=a&&b<=d){h=this.obj_cache[j];if(h.dataset_type!=="summary_tree"&&h.extra_info!=="no_detail"){this.move_key_to_end(j,c);return h}}}return undefined},set_data:function(b,c,d,a){return this.set(this.gen_key(b,c,d),a)},gen_key:function(a,c,d){var b=a+"_"+c+"_"+d;return b},split_key:function(a){return a.split("_")}});var View=function(a,d,c,b,e){this.container=a;this.chrom=null;this.vis_id=c;this.dbkey=b;this.title=d;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.num_tracks=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.init(e);this.reset()};$.extend(View.prototype,{init:function(d){var c=this.container,a=this;this.top_container=$("<div/>").addClass("top-container").appendTo(c);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(c);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(c);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").addClass("viewport-container").appendTo(this.content_div);this.intro_div=$("<div/>").addClass("intro").text("Select a chrom from the dropdown below").hide();this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a href='javascript:void(0);'>Close Overview</a>").addClass("overview-close").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var b=function(f){if(f.type==="focusout"||(f.keyCode||f.which)===13||(f.keyCode||f.which)===27){if((f.keyCode||f.which)!==27){a.go_to($(this).val())}$(this).hide();a.location_span.show();a.chrom_select.show();return false}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",b).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){a.location_span.hide();a.chrom_select.hide();a.nav_input.css("display","inline-block");a.nav_input.select();a.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){a.zoom_out();a.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){a.zoom_in();a.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},d);this.chrom_select.bind("change",function(){a.change_chrom(a.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(f){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(f){a.zoom_in(f.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(f,g){this.current_x=g.offsetX}).bind("drag",function(f,h){var j=h.offsetX-this.current_x;this.current_x=h.offsetX;var g=Math.round(j/a.viewport_container.width()*(a.max_high-a.max_low));a.move_delta(-g)});this.overview_close.bind("click",function(){for(var f=0,e=a.tracks.length;f<e;f++){a.tracks[f].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",a.overview_box.height());a.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(f,g){if(f.clientX>a.viewport_container.width()-16){return false}}).bind("dragstart",function(f,g){g.original_low=a.low;g.current_height=f.clientY;g.current_x=g.offsetX}).bind("drag",function(h,k){var f=$(this);var l=k.offsetX-k.current_x;var g=f.scrollTop()-(h.clientY-k.current_height);f.scrollTop(g);k.current_height=h.clientY;k.current_x=k.offsetX;var j=Math.round(l/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}).bind("mousewheel",function(h,k,g,f){if(g){var j=Math.round(-g/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}});this.top_labeltrack.bind("dragstart",function(f,g){return $("<div />").css({height:a.content_div.height()+a.top_labeltrack.height()+a.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(k,l){$(l.proxy).css({left:Math.min(k.pageX,l.startX),width:Math.abs(k.pageX-l.startX)});var g=Math.min(k.pageX,l.startX)-a.container.offset().left,f=Math.max(k.pageX,l.startX)-a.container.offset().left,j=(a.high-a.low),h=a.viewport_container.width();a.update_location(Math.round(g/h*j)+a.low,Math.round(f/h*j)+a.low)}).bind("dragend",function(l,m){var g=Math.min(l.pageX,m.startX),f=Math.max(l.pageX,m.startX),j=(a.high-a.low),h=a.viewport_container.width(),k=a.low;a.low=Math.round(g/h*j)+k;a.high=Math.round(f/h*j)+k;$(m.proxy).remove();a.redraw()});this.add_label_track(new LabelTrack(this,this.top_labeltrack));this.add_label_track(new LabelTrack(this,this.nav_labeltrack));$(window).bind("resize",function(){a.resize_window()});$(document).bind("redraw",function(){a.redraw()});this.reset();$(window).trigger("resize")},update_location:function(a,b){this.location_span.text(commatize(a)+" - "+commatize(b));this.nav_input.val(this.chrom+":"+commatize(a)+"-"+commatize(b))},load_chroms:function(b,c){b.num=MAX_CHROMS_SELECTABLE;$.extend(b,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var a=this;$.ajax({url:chrom_url,data:b,dataType:"json",success:function(e){if(e.reference){a.add_label_track(new ReferenceTrack(a))}a.chrom_data=e.chrom_info;var h='<option value="">Select Chrom/Contig</option>';for(var g=0,d=a.chrom_data.length;g<d;g++){var f=a.chrom_data[g].chrom;h+='<option value="'+f+'">'+f+"</option>"}if(e.prev_chroms){h+='<option value="previous">Previous '+MAX_CHROMS_SELECTABLE+"</option>"}if(e.next_chroms){h+='<option value="next">Next '+MAX_CHROMS_SELECTABLE+"</option>"}a.chrom_select.html(h);if(c){c()}a.chrom_start_index=e.start_index},error:function(){alert("Could not load chroms for this dbkey:",a.dbkey)}})},change_chrom:function(e,b,g){if(!e||e==="None"){return}var d=this;if(e==="previous"){d.load_chroms({low:this.chrom_start_index-MAX_CHROMS_SELECTABLE});return}if(e==="next"){d.load_chroms({low:this.chrom_start_index+MAX_CHROMS_SELECTABLE});return}var f=$.grep(d.chrom_data,function(j,k){return j.chrom===e})[0];if(f===undefined){d.load_chroms({chrom:e},function(){d.change_chrom(e,b,g)});return}else{if(e!==d.chrom){d.chrom=e;if(!d.chrom){d.intro_div.show()}else{d.intro_div.hide()}d.chrom_select.val(d.chrom);d.max_high=f.len-1;d.reset();d.redraw(true);for(var h=0,a=d.tracks.length;h<a;h++){var c=d.tracks[h];if(c.init){c.init()}}}if(b!==undefined&&g!==undefined){d.low=Math.max(b,0);d.high=Math.min(g,d.max_high)}d.reset_overview();d.redraw()}},go_to:function(f){var k=this,a,d,b=f.split(":"),h=b[0],j=b[1];if(j!==undefined){try{var g=j.split("-");a=parseInt(g[0].replace(/,/g,""),10);d=parseInt(g[1].replace(/,/g,""),10)}catch(c){return false}}k.change_chrom(h,a,d)},move_fraction:function(c){var a=this;var b=a.high-a.low;this.move_delta(c*b)},move_delta:function(c){var a=this;var b=a.high-a.low;if(a.low-c<a.max_low){a.low=a.max_low;a.high=a.max_low+b}else{if(a.high-c>a.max_high){a.high=a.max_high;a.low=a.max_high-b}else{a.high-=c;a.low-=c}}a.redraw()},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);sortable(a.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=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)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(h){var g=this.high-this.low,f=this.low,b=this.high;if(f<this.max_low){f=this.max_low}if(b>this.max_high){b=this.max_high}if(this.high!==0&&g<this.min_separation){b=f+this.min_separation}this.low=Math.floor(f);this.high=Math.ceil(b);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))));var a=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var e=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var j=13;this.overview_box.css({left:a,width:Math.max(j,e)}).show();if(e<j){this.overview_box.css("left",a-(j-e)/2)}if(this.overview_highlight){this.overview_highlight.css({left:a,width:e})}this.update_location(this.low,this.high);if(!h){for(var c=0,d=this.tracks.length;c<d;c++){if(this.tracks[c]&&this.tracks[c].enabled){this.tracks[c].draw()}}for(c=0,d=this.label_tracks.length;c<d;c++){this.label_tracks[c].draw()}}},zoom_in:function(b,c){if(this.max_high===0||this.high-this.low<this.min_separation){return}var d=this.high-this.low,e=d/2+this.low,a=(d/this.zoom_factor)/2;if(b){e=b/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(e-a);this.high=Math.round(e+a);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var b=this.high-this.low,c=b/2+this.low,a=(b*this.zoom_factor)/2;this.low=Math.round(c-a);this.high=Math.round(c+a);this.redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.nav_container.width(this.container.width());this.redraw()},reset_overview:function(){this.overview_viewport.find("canvas").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide()}});var Tool=function(a,b){this.name=a;this.params=b};$.extend(Tool.prototype,{get_param_values_dict:function(){var b={};for(var a=0;a<this.params.length;a++){var c=this.params[a];b[c.name]=c.value}return b},get_param_values:function(){var b=[];for(var a=0;a<this.params.length;a++){b[a]=this.params[a].value}return b}});var NumberToolParameter=function(c,b,e,a,d){this.name=c;this.label=b;this.min=e;this.max=a;this.value=d};var get_tool_from_dict=function(f){if(obj_length(f)===0){return undefined}var b=f.name;var l=f.params;var c=Array();for(var e=0;e<l.length;e++){var g=l[e];var a=g.name,k=g.label,h=g.type,d=g.min,j=g.max,m=g.value;c[c.length]=new NumberToolParameter(a,k,d,j,m)}return new Tool(b,c)};var Filter=function(b,a,c){this.name=b;this.index=a;this.value=c};var NumberFilter=function(b,a){this.name=b;this.index=a;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.slider_min=Number.MAX_VALUE;this.slider_max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};$.extend(NumberFilter.prototype,{applies_to:function(a){if(a.length>this.index){return true}return false},keep:function(a){if(!this.applies_to(a)){return true}return(a[this.index]>=this.low&&a[this.index]<=this.high)},update_attrs:function(b){var a=false;if(!this.applies_to(b)){return a}if(b[this.index]<this.slider_min){this.slider_min=b[this.index];a=true}if(b[this.index]>this.slider_max){this.slider_max=b[this.index];a=false}return a},update_ui_elt:function(){var b=this.slider.slider("option","min"),a=this.slider.slider("option","max");if(this.slider_min<b||this.slider_max>a){this.slider.slider("option","min",this.slider_min);this.slider.slider("option","max",this.slider_max);this.slider.slider("option","values",[this.slider_min,this.slider_max])}}});var get_filters_from_dict=function(a){var g=[];for(var d=0;d<a.length;d++){var f=a[d];var c=f.name,e=f.type,b=f.index;if(e==="int"||e==="float"){g[d]=new NumberFilter(c,b)}else{g[d]=new Filter(c,b,e)}}return g};var TrackConfig=function(a){this.track=a.track;this.params=a.params;this.values={};if(a.saved_values){this.restore_values(a.saved_values)}this.onchange=a.onchange};$.extend(TrackConfig.prototype,{restore_values:function(a){var b=this;$.each(this.params,function(c,d){if(a[d.key]!==undefined){b.values[d.key]=a[d.key]}else{b.values[d.key]=d.default_value}})},build_form:function(){var b=this;var a=$("<div />");$.each(this.params,function(f,d){if(!d.hidden){var c="param_"+f;var l=$("<div class='form-row' />").appendTo(a);l.append($("<label />").attr("for",c).text(d.label+":"));if(d.type==="bool"){l.append($('<input type="checkbox" />').attr("id",c).attr("name",c).attr("checked",b.values[d.key]))}else{if(d.type==="color"){var h=b.values[d.key];var g=$("<input />").attr("id",c).attr("name",c).val(h);var j=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var e=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(j);var k=$("<div/>").appendTo(e).farbtastic({width:100,height:100,callback:g,color:h});$("<div />").append(g).append(j).appendTo(l).bind("click",function(m){j.css({left:$(this).position().left+($(g).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){j.hide();$(document).unbind("click.color-picker")});m.stopPropagation()})}else{l.append($("<input />").attr("id",c).attr("name",c).val(b.values[d.key]))}}}});return a},update_from_form:function(a){var c=this;var b=false;$.each(this.params,function(d,f){if(!f.hidden){var g="param_"+d;var e=a.find("#"+g).val();if(f.type==="float"){e=parseFloat(e)}else{if(f.type==="int"){e=parseInt(e)}else{if(f.type==="bool"){e=a.find("#"+g).is(":checked")}}}if(e!==c.values[f.key]){c.values[f.key]=e;b=true}}});if(b){this.onchange()}}});var Track=function(b,a,e,c,d){this.name=b;this.view=a;this.parent_element=e;this.data_url=(c?c:default_data_url);this.data_query_wait=(d?d:DEFAULT_DATA_QUERY_WAIT);this.dataset_check_url=converted_datasets_state_url;this.container_div=$("<div />").addClass("track").css("position","relative");if(!this.hidden){this.header_div=$("<div class='track-header' />").appendTo(this.container_div);if(this.view.editor){this.drag_div=$("<div class='draghandle' />").appendTo(this.header_div)}this.name_div=$("<div class='menubutton popup' />").appendTo(this.header_div);this.name_div.text(this.name);this.name_div.attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase())}this.content_div=$("<div class='track-content'>").appendTo(this.container_div);this.parent_element.append(this.container_div)};$.extend(Track.prototype,{init:function(){var a=this;a.enabled=false;a.tile_cache.clear();a.data_cache.clear();a.initial_canvas=undefined;a.content_div.css("height","auto");a.container_div.removeClass("nodata error pending");if(!a.dataset_id){return}if(a.view.chrom!==null){$.getJSON(converted_datasets_state_url,{hda_ldda:a.hda_ldda,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(!b||b==="error"||b.kind==="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR);if(b.message){var d=a.view.tracks.indexOf(a);var c=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+b.message+"</pre>",{Close:hide_modal})});a.content_div.append(c)}}else{if(b==="no converter"){a.container_div.addClass("error");a.content_div.text(DATA_NOCONVERTER)}else{if(b==="no data"||(b.data!==undefined&&(b.data===null||b.data.length===0))){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b==="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},a.data_query_wait)}else{if(b.status==="data"){if(b.valid_chroms){a.valid_chroms=b.valid_chroms;a.make_name_popup_menu()}a.content_div.text(DATA_OK);if(a.view.chrom){a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.enabled=true;$.when(a.predraw_init()).done(function(){a.draw()})}}}}}}})}},predraw_init:function(){},update_name:function(a){this.old_name=this.name;this.name=a;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var TiledTrack=function(b,j,n){var c=this,o=c.view;this.filters=(b!==undefined?get_filters_from_dict(b):[]);this.filters_available=false;this.filters_visible=false;this.tool=(j!==undefined?get_tool_from_dict(j):undefined);this.parent_track=n;this.child_tracks=[];if(c.hidden){return}if(this.parent_track){this.header_div.find(".draghandle").removeClass("draghandle").addClass("child-track-icon").addClass("icon-button");this.parent_element.addClass("child-track");this.tool=undefined}this.filters_div=$("<div/>").addClass("filters").hide();this.header_div.after(this.filters_div);this.filters_div.bind("drag",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});$.each(this.filters,function(t,w){var u=$("<div/>").addClass("slider-row").appendTo(c.filters_div);var v=$("<div/>").addClass("slider-label").appendTo(u);var s=$("<span/>").addClass("name").appendTo(v);s.text(w.name+" ");var r=$("<span/>").addClass("values").appendTo(v);var q=$("<div/>").addClass("slider").appendTo(u);w.control_element=$("<div/>").attr("id",w.name+"-filter-control").appendTo(q);w.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(y,z){var x=z.values;r.text("["+x[0]+"-"+x[1]+"]");w.low=x[0];w.high=x[1];c.draw(true,true)},change:function(x,y){w.control_element.slider("option","slide").call(w.control_element,x,y)}});w.slider=w.control_element;w.slider_label=r;$("<div style='clear: both;'/>").appendTo(u)});if(this.tool){this.dynamic_tool_div=$("<div/>").addClass("dynamic-tool").hide();this.header_div.after(this.dynamic_tool_div);this.dynamic_tool_div.bind("drag",function(q){q.stopPropagation()}).bind("click",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});var m=$("<div class='tool-name'>").appendTo(this.dynamic_tool_div).text(this.tool.name);var l=this.tool.params;var c=this;$.each(this.tool.params,function(x,s){var v=$("<div>").addClass("slider-row").appendTo(c.dynamic_tool_div);var u=$("<div>").addClass("slider-label").appendTo(v);var z=$("<span class='param-name'>").text(s.label+" ").appendTo(u);var t=$("<span/>").text(s.value);var w=$("<span class='param-value'>").appendTo(u).append("[").append(t).append("]");var y=$("<div/>").addClass("slider").appendTo(v);var q=$("<div id='"+s.name+"-param-control'>").appendTo(y);var r=(s.max<=1?0.01:(s.max<=1000?1:5));q.slider({min:s.min,max:s.max,step:r,value:s.value,slide:function(A,C){var B=C.value;s.value=B;if(0<B&&B<1){B=parseFloat(B).toFixed(2)}t.text(B)},change:function(A,B){s.value=B.value}});w.click(function(){var C=t,B=C.text(),A=(s.max<=1?4:s.max.length);C.text("");$("<input type='text'/>").attr("size",A).attr("maxlength",A).attr("value",B).appendTo(C).focus().select().click(function(D){D.stopPropagation()}).blur(function(){$(this).remove();C.text(B)}).keyup(function(F){if(F.keyCode===27){$(this).trigger("blur")}else{if(F.keyCode===13){var D=$(this),E=parseFloat(D.val());if(isNaN(E)||E>s.max||E<s.min){alert("Parameter value must be in the range ["+s.min+"-"+s.max+"]");return $(this)}C.text(E);q.slider("value",E);s.value=E}}})});$("<div style='clear: both;'/>").appendTo(v)});var p=$("<div>").addClass("slider-row").appendTo(this.dynamic_tool_div);var k=$("<input type='submit'>").attr("value","Run").appendTo(p);var c=this;k.click(function(){c.run_tool()})}c.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();c.container_div.append(c.child_tracks_container);if(c.display_modes!==undefined){if(c.mode_div===undefined){c.mode_div=$("<div class='right-float menubutton popup' />").appendTo(c.header_div);var e=(c.track_config&&c.track_config.values.mode?c.track_config.values.mode:c.display_modes[0]);c.mode=e;c.mode_div.text(e);var d=function(q){c.mode_div.text(q);c.mode=q;c.track_config.values.mode=q;c.tile_cache.clear();c.draw()};var a={};for(var f=0,h=c.display_modes.length;f<h;f++){var g=c.display_modes[f];a[g]=function(q){return function(){d(q)}}(g)}make_popupmenu(c.mode_div,a)}else{c.mode_div.hide()}}this.make_name_popup_menu()};$.extend(TiledTrack.prototype,Track.prototype,{make_name_popup_menu:function(){var b=this;var a={};a["Edit configuration"]=function(){var h=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},f=function(){b.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},g=function(j){if((j.keyCode||j.which)===27){h()}else{if((j.keyCode||j.which)===13){f()}}};$(window).bind("keypress.check_enter_esc",g);show_modal("Configure Track",b.track_config.build_form(),{Cancel:h,OK:f})};if(b.filters_available>0){var e=(b.filters_div.is(":visible")?"Hide filters":"Show filters");a[e]=function(){b.filters_visible=(b.filters_div.is(":visible"));b.filters_div.toggle();b.make_name_popup_menu()}}if(b.tool){var e=(b.dynamic_tool_div.is(":visible")?"Hide Tool":"Show Tool");a[e]=function(){if(!b.dynamic_tool_div.is(":visible")){b.update_name(b.name+b.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";b.revert_name()}b.dynamic_tool_div.toggle();b.make_name_popup_menu()}}if(b.track_type=="ReadTrack"){var e=(b.show_insertions?"Hide Insertions":"Show Insertions");a[e]=function(){b.show_insertions=!b.show_insertions;b.draw(true);b.make_name_popup_menu()}}if(b.valid_chroms){a["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+b.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var c=view;var d=function(){$("#no-tracks").show()};if(this.parent_track){c=this.parent_track;d=function(){}}a.Remove=function(){c.remove_track(b);if(c.num_tracks===0){d()}};make_popupmenu(b.name_div,a)},tile_data:function(d,a,g,k,j){var b=this,h=a*DENSITY*d,f=(a+1)*DENSITY*d,e={chrom:this.view.chrom,low:h,high:f,dbkey:this.view.dbkey};if(j===undefined){j=d+"_"+a}var c=b.data_cache.get(j);if(c){return k(c)}$.extend(e,g);$.ajax({url:this.data_url,dataType:"json",data:e,success:function(l){b.data_cache.set(j,l);return k(l)},error:function(m,l,n){console.log(m,l,n)}})},draw:function(a,d){var s=this.view.low,g=this.view.high,j=g-s,l=this.view.container.width(),m=this.view.resolution;var e=$("<div style='position: relative;'></div>"),f=l/j;if(!d){this.content_div.children().remove()}this.content_div.append(e);this.max_height=0;var o=Math.floor(s/m/DENSITY);var c={};while((o*DENSITY*m)<g){var r=l+"_"+f+"_"+o;var h=this.tile_cache.get(r);var p=o*DENSITY*this.view.resolution;var b=p+DENSITY*this.view.resolution;if(!a&&h){this.show_tile(h,e,p,f)}else{this.delayed_draw(a,r,p,b,o,m,e,f,c)}o+=1}if(d){var k=this;var q=setInterval(function(){if(obj_length(c)===0){var v=k.content_div.children();var u=false;for(var w=v.length-1,t=0;w>=t;w--){var x=$(v[w]);if(u){x.remove()}else{if(x.children().length!==0){u=true}}}clearInterval(q)}},50)}for(var n=0;n<this.child_tracks.length;n++){this.child_tracks[n].draw(a,d)}},delayed_draw:function(b,j,h,l,c,e,k,m,f){var d=this;var g=function(n){d.tile_cache.set(j,n);d.show_tile(n,k,h,m)};var a=setTimeout(function(){if(h<=d.view.high&&l>=d.view.low){var n;if(!b){n=d.tile_cache.get(j)}if(!n){d.draw_tile(e,c,k,m,function(p){if(p){var o=$("<div class='track-tile'>").prepend(p);n=o}g(n)})}if(n){g(n)}}delete f[a]},50);f[a]=true},show_tile:function(h,j,e,k){var a=this;var c=this.view.high-this.view.low,b=(e-this.view.low)*k;if(this.left_offset){b-=this.left_offset}h.css({position:"absolute",top:0,left:b,height:""});j.append(h);a.max_height=Math.max(a.max_height,h.height());a.content_div.css("height",a.max_height+"px");j.children().css("height",a.max_height+"px");if(a.hidden){return}for(var g=0;g<a.filters.length;g++){a.filters[g].update_ui_elt()}var d=false;if(a.example_feature){for(var g=0;g<a.filters.length;g++){if(a.filters[g].applies_to(a.example_feature)){d=true;break}}}if(a.filters_available!==d){a.filters_available=d;if(!a.filters_available){a.filters_div.hide()}a.make_name_popup_menu()}},set_overview:function(){var a=this.view;if(this.initial_canvas&&this.is_overview){a.overview_close.show();a.overview_viewport.append(this.initial_canvas);a.overview_highlight.show().height(this.initial_canvas.height());a.overview_viewport.height(this.initial_canvas.height()+a.overview_box.height())}$(window).trigger("resize")},run_tool:function(){var b={dataset_id:this.original_dataset_id,chrom:this.view.chrom,low:this.view.low,high:this.view.high,tool_id:this.tool.name};$.extend(b,this.tool.get_param_values_dict());var d=this,c=b.tool_id+d.tool_region_and_parameters_str(b.chrom,b.low,b.high),e;if(d.track_type==="FeatureTrack"){e=new ToolDataFeatureTrack(c,view,d.hda_ldda,undefined,{},{},d)}this.add_track(e);e.content_div.text("Starting job.");view.has_changes=true;var a=function(){$.getJSON(run_tool_url,b,function(f){if(f==="no converter"){e.container_div.addClass("error");e.content_div.text(DATA_NOCONVERTER)}else{if(f.error){e.container_div.addClass("error");e.content_div.text(DATA_CANNOT_RUN_TOOL+f.message)}else{if(f==="pending"){e.container_div.addClass("pending");e.content_div.text("Converting input data so that it can be easily reused.");setTimeout(a,2000)}else{e.dataset_id=f.dataset_id;e.content_div.text("Running job.");e.init()}}}})};a()},tool_region_and_parameters_str:function(c,a,d){var b=this,e=(c!==undefined&&a!==undefined&&d!==undefined?c+":"+a+"-"+d:"all");return" - region=["+e+"], parameters=["+b.tool.get_param_values().join(", ")+"]"},add_track:function(a){a.track_id=this.track_id+"_"+this.child_tracks.length;a.container_div.attr("id","track_"+a.track_id);this.child_tracks_container.append(a.container_div);sortable(a.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(a)},remove_track:function(a){a.container_div.fadeOut("slow",function(){$(this).remove()})}});var LabelTrack=function(a,b){this.track_type="LabelTrack";this.hidden=true;Track.call(this,null,a,b);this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.view.container.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var ReferenceTrack=function(a){this.track_type="ReferenceTrack";this.hidden=true;Track.call(this,null,a,a.top_labeltrack);TiledTrack.call(this);a.reference_track=this;this.left_offset=200;this.height_px=12;this.font=DEFAULT_FONT;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_url=reference_url;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE)};$.extend(ReferenceTrack.prototype,TiledTrack.prototype,{draw_tile:function(c,b,e,g,f){var a=this,d=DENSITY*c;if(g>CHAR_WIDTH_PX){a.tile_data(c,b,{},function(j){if(j===null){a.content_div.css("height","0px");return}var k=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(k)}k=$(k);var h=k.get(0).getContext("2d");k.get(0).width=Math.ceil(d*g+a.left_offset);k.get(0).height=a.height_px;h.font=DEFAULT_FONT;h.textAlign="center";for(var n=0,l=j.length;n<l;n++){var m=Math.round(n*g);h.fillText(j[n],m+a.left_offset,10)}return f(k)})}this.content_div.css("height","0px")}});var LineTrack=function(e,c,f,a,d){var b=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";Track.call(this,e,c,c.viewport_container);TiledTrack.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=f;this.dataset_id=a;this.original_dataset_id=a;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE);this.track_config=new TrackConfig({track:this,params:[{key:"color",label:"Color",type:"color",default_value:"black"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.height_px,hidden:true}],saved_values:d,onchange:function(){b.vertical_range=b.prefs.max_value-b.prefs.min_value;$("#linetrack_"+b.track_id+"_minval").text(b.prefs.min_value);$("#linetrack_"+b.track_id+"_maxval").text(b.prefs.max_value);b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;this.height_px=this.track_config.values.height;this.vertical_range=this.track_config.values.max_value-this.track_config.values.min_value;(function(g){var k=false;var j=false;var h=$("<div class='track-resize'>");$(g.container_div).hover(function(){k=true;h.show()},function(){k=false;if(!j){h.hide()}});h.hide().bind("dragstart",function(l,m){j=true;m.original_height=$(g.content_div).height()}).bind("drag",function(m,n){var l=Math.min(Math.max(n.original_height+n.deltaY,g.min_height_px),g.max_height_px);$(g.content_div).css("height",l);g.height_px=l;g.draw(true)}).bind("dragend",function(l,m){g.tile_cache.clear();j=false;if(!k){h.hide()}g.track_config.values.height=g.height_px}).appendTo(g.container_div)})(this)};$.extend(LineTrack.prototype,TiledTrack.prototype,{predraw_init:function(){var a=this,b=a.view.tracks.indexOf(a);a.vertical_range=undefined;return $.getJSON(a.data_url,{stats:true,chrom:a.view.chrom,low:null,high:null,hda_ldda:a.hda_ldda,dataset_id:a.dataset_id},function(c){a.container_div.addClass("line-track");var e=c.data;if(isNaN(parseFloat(a.prefs.min_value))||isNaN(parseFloat(a.prefs.max_value))){a.prefs.min_value=e.min;a.prefs.max_value=e.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;a.total_frequency=e.total_frequency;a.container_div.find(".yaxislabel").remove();var f=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(round_1000(a.prefs.min_value));var d=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(round_1000(a.prefs.max_value));d.css({position:"absolute",top:"24px",left:"10px"});d.prependTo(a.container_div);f.css({position:"absolute",bottom:"2px",left:"10px"});f.prependTo(a.container_div)})},draw_tile:function(d,a,j,k,h){if(this.vertical_range===undefined){return}var c=this,f=a*DENSITY*d,b=DENSITY*d,g=d+"_"+a,e={hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,resolution:this.view.resolution};this.tile_data(d,a,e,function(C){var l=document.createElement("canvas"),q=C.data;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(l)}l=$(l);l.get(0).width=Math.ceil(b*k);l.get(0).height=c.height_px;var z=l.get(0).getContext("2d"),n=false,B=c.prefs.min_value,v=c.prefs.max_value,A=c.vertical_range,m=c.total_frequency,u=c.height_px,s=c.mode;var r=Math.round(u+B/A*u);z.beginPath();z.moveTo(0,r);z.lineTo(b*k,r);z.fillStyle="#aaa";z.stroke();z.beginPath();z.fillStyle=c.prefs.color;var p,w,x;if(q.length>1){x=Math.ceil((q[1][0]-q[0][0])*k)}else{x=10}for(var o=0,t=q.length;o<t;o++){p=Math.round((q[o][0]-f)*k);w=q[o][1];if(w===null){if(n&&s==="Filled"){z.lineTo(p,u)}n=false;continue}if(w<B){w=B}else{if(w>v){w=v}}if(s==="Histogram"){w=Math.round(w/A*u);z.fillRect(p,r,x,-w)}else{if(s==="Intensity"){w=255-Math.floor((w-B)/A*255);z.fillStyle="rgb("+w+","+w+","+w+")";z.fillRect(p,0,x,u)}else{w=Math.round(u-(w-B)/A*u);if(n){z.lineTo(p,w)}else{n=true;if(s==="Filled"){z.moveTo(p,u);z.lineTo(p,w)}else{z.moveTo(p,w)}}}}}if(s==="Filled"){if(n){z.lineTo(p,r);z.lineTo(0,r)}z.fill()}else{z.stroke()}h(l)})}});var FeatureTrack=function(a,f,e,j,h,c,d,g){var b=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new TrackConfig({track:this,params:[{key:"block_color",label:"Block color",type:"color",default_value:"#444"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:h,onchange:function(){b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;Track.call(this,a,f,f.viewport_container);TiledTrack.call(this,c,d,g);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=e;this.dataset_id=j;this.original_dataset_id=j;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.default_font=DEFAULT_FONT;this.inc_slots={};this.start_end_dct={};this.tile_cache=new Cache(CACHED_TILES_FEATURE);this.data_cache=new DataCache(20);this.left_offset=200};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{incremental_slots:function(a,h,p){var q=this.inc_slots[a];if(!q||(q.mode!==p)){q={};q.w_scale=a;q.mode=p;this.inc_slots[a]=q;this.start_end_dct[a]={}}var l=q.w_scale,w=[],x=[],j=0,n=this.view.max_low;for(var u=0,v=h.length;u<v;u++){var g=h[u],k=g[0];if(q[k]!==undefined){j=Math.max(j,q[k]);x.push(q[k])}else{w.push(u)}}var d=this.start_end_dct[a];var m=function(D,E){for(var C=0;C<=MAX_FEATURE_DEPTH;C++){var A=false,F=d[C];if(F!==undefined){for(var z=0,B=F.length;z<B;z++){var y=F[z];if(E>y[0]&&D<y[1]){A=true;break}}}if(!A){return C}}return -1};for(var u=0,v=w.length;u<v;u++){var g=h[w[u]],k=g[0],s=g[1],b=g[2],o=g[3],c=Math.floor((s-n)*l),f=Math.ceil((b-n)*l),t=CONTEXT.measureText(o).width,e;if(o!==undefined&&p==="Pack"){t+=(LABEL_SPACING+PACK_SPACING);if(c-t>=0){c-=t;e="left"}else{f+=t;e="right"}}var r=m(c,f);if(r>=0){if(d[r]===undefined){d[r]=[]}d[r].push([c,f]);q[k]=r;j=Math.max(j,r)}else{}}return j+1},draw_summary_tree:function(b,o,n,l,r,j,f,e){var c=j+LABEL_SPACING+CHAR_HEIGHT_PX;delta_x_px=Math.ceil(n*r);var h=$("<div />").addClass("yaxislabel");h.text(l);h.css({position:"absolute",top:"22px",left:"10px"});h.prependTo(this.container_div);var q=b.get(0).getContext("2d");for(var d=0,g=o.length;d<g;d++){var m=Math.floor((o[d][0]-f)*r);var k=o[d][1];if(!k){continue}var p=k/l*j;q.fillStyle="black";q.fillRect(m+e,c-p,delta_x_px,p);var a=4;if(this.prefs.show_counts&&(q.measureText(k).width+a)<delta_x_px){q.fillStyle="#666";q.textAlign="center";q.fillText(k,m+e+(delta_x_px/2),10)}}},draw_element:function(p,f,g,x,j,r,I,M,N,a,A){var u=x[0],K=x[1],C=x[2],s=x[3],D=Math.floor(Math.max(0,(K-r)*M)),q=Math.ceil(Math.min(a,Math.max(0,(C-r)*M))),B=ERROR_PADDING+(g==="Dense"?0:(0+j))*N,o,G,t=null,O=null,d=this.prefs.block_color,F=this.prefs.label_color;if(g==="Dense"){p.fillStyle=d;p.fillRect(D+A,B,q-D,DENSE_FEATURE_HEIGHT)}else{if(g==="no_detail"){p.fillStyle=d;p.fillRect(D+A,B+5,q-D,DENSE_FEATURE_HEIGHT)}else{var n=x[5],z=x[6],E=x[7],e=x[8];if(z&&E){t=Math.floor(Math.max(0,(z-r)*M));O=Math.ceil(Math.min(a,Math.max(0,(E-r)*M)))}var L,v;if(g==="Squish"){L=1;v=SQUISH_FEATURE_HEIGHT}else{L=5;v=PACK_FEATURE_HEIGHT}if(!e){if(x.strand){if(x.strand==="+"){p.fillStyle=RIGHT_STRAND_INV}else{if(x.strand==="-"){p.fillStyle=LEFT_STRAND_INV}}}else{p.fillStyle=d}p.fillRect(D+A,B,q-D,v)}else{var m,w;if(g==="Squish"){p.fillStyle=CONNECTOR_COLOR;m=B+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;w=1}else{if(n){var m=B;var w=v;if(n==="+"){p.fillStyle=RIGHT_STRAND}else{if(n==="-"){p.fillStyle=LEFT_STRAND}}}else{p.fillStyle=CONNECTOR_COLOR;m+=(SQUISH_FEATURE_HEIGHT/2)+1;w=1}}p.fillRect(D+A,m,q-D,w);for(var J=0,c=e.length;J<c;J++){var h=e[J],b=Math.floor(Math.max(0,(h[0]-r)*M)),y=Math.ceil(Math.min(a,Math.max((h[1]-r)*M)));if(b>y){continue}p.fillStyle=d;p.fillRect(b+A,B+(v-L)/2+1,y-b,L);if(t!==undefined&&!(b>O||y<t)){var H=Math.max(b,t),l=Math.min(y,O-1);p.fillRect(H+A,B+1,l-H,v)}}}if(g==="Pack"&&K>r){p.fillStyle=F;if(f===0&&D-p.measureText(s).width<0){p.textAlign="left";p.fillText(s,q+A+LABEL_SPACING,B+8)}else{p.textAlign="right";p.fillText(s,D+A-LABEL_SPACING,B+8)}p.fillStyle=d}}}},get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="no_detail"){a=NO_DETAIL_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT}}}return a},draw_tile:function(z,E,l,n,j,d,p){var v=this;if(v.view.reference_track&&n>CHAR_WIDTH_PX&&d===undefined){return v.view.reference_track.tile_data(z,E,{},function(f){v.draw_tile(z,E,l,n,j,f)})}var G=E*DENSITY*z,a=(E+1)*DENSITY*z,s=a-G,H={hda_ldda:v.hda_ldda,dataset_id:v.dataset_id,resolution:this.view.resolution,mode:this.mode};if(p===undefined){var q=this.data_cache.get_data(G,a,this.mode),J=z+"_"+E+"_"+this.mode;if(q===undefined){return v.tile_data(z,E,H,function(f){v.data_cache.set_data(G,a,this.mode,f);v.draw_tile(z,E,l,n,j,d,f)},J)}p=q}var x=Math.ceil(s*n),u=this.mode,K=25,g=this.left_offset,r,h;var c=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(c)}c=$(c);if(u==="Auto"){if(p.dataset_type==="summary_tree"){u=p.dataset_type}else{if(p.extra_info==="no_detail"){u="no_detail"}else{var I=p.data;if((I.length&&I.length<4)||(this.view.high-this.view.low>MIN_SQUISH_VIEW_WIDTH)){u="Squish"}else{u="Pack"}}}}var A=this.get_y_scale(u);if(u==="summary_tree"){h=this.summary_draw_height}if(u==="Dense"){h=K}else{if(u==="no_detail"||u==="Squish"||u==="Pack"){h=this.incremental_slots(n,p.data,u)*A+K;r=this.inc_slots[n]}}c.get(0).width=x+g;c.get(0).height=h;if(p.dataset_type==="summary_tree"){c.get(0).height+=LABEL_SPACING+CHAR_HEIGHT_PX}l.parent().css("height",Math.max(this.height_px,h)+"px");var y=c.get(0).getContext("2d");y.fillStyle=this.prefs.block_color;y.font=this.default_font;y.textAlign="right";this.container_div.find(".yaxislabel").remove();if(u==="summary_tree"){this.draw_summary_tree(c,p.data,p.delta,p.max,n,h,G,g);return j(c)}if(p.message){c.css({"border-top":"1px solid red"});y.fillStyle="red";y.textAlign="left";var t=y.textBaseline;y.textBaseline="top";y.fillText(p.message,g,0);y.textBaseline=t;if(!p.data){return j(c)}}this.example_feature=(p.data.length?p.data[0]:undefined);var I=p.data;for(var B=0,D=I.length;B<D;B++){var k=I[B],m=k[0],w=k[1],b=k[2],e=(r&&r[m]!==undefined?r[m]:null);var C=false;var o;for(var F=0;F<this.filters.length;F++){o=this.filters[F];o.update_attrs(k);if(!o.keep(k)){C=true;break}}if(C){continue}if(is_overlap([w,b],[G,a])&&(u=="Dense"||e!==null)){this.draw_element(y,E,u,k,e,G,a,n,A,x,g,d)}}j(c)}});var VcfTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="VcfTrack"};$.extend(VcfTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_element:function(u,p,j,e,x,c,m,v,s){var j=data[i],l=j[0],t=j[1],d=j[2]-1,o=j[3],g=Math.floor(Math.max(0,(t-x)*m)),k=Math.ceil(Math.min(s,Math.max(0,(d-x)*m))),f=ERROR_PADDING+(p==="Dense"?0:(0+e))*v,a,y,b=null,n=null;if(no_label){u.fillStyle=block_color;u.fillRect(g+left_offset,f+5,k-g,1)}else{var w=j[4],r=j[5],h=j[6];a=9;y=1;u.fillRect(g+left_offset,f,k-g,a);if(p!=="Dense"&&o!==undefined&&t>x){u.fillStyle=label_color;if(tile_index===0&&g-u.measureText(o).width<0){u.textAlign="left";u.fillText(o,k+2+left_offset,f+8)}else{u.textAlign="right";u.fillText(o,g-2+left_offset,f+8)}u.fillStyle=block_color}var q=w+" / "+r;if(t>x&&u.measureText(q).width<(k-g)){u.fillStyle="white";u.textAlign="center";u.fillText(q,left_offset+g+(k-g)/2,f+8);u.fillStyle=block_color}}}});var ReadTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="ReadTrack";this.difference_mode=true;this.show_insertions=false;this.make_name_popup_menu()};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT;if(this.show_insertions){a*=2}}}return a},draw_read:function(m,d,J,n,D,G,e,o,y,a){m.textAlign="center";var l=this,u=[n,D],C=0,z=0,f=0;var r=[];if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){f=Math.round(J/2)}for(var h=0,k=e.length;h<k;h++){var b=e[h],g="MIDNSHP=X"[b[0]],v=b[1];if(g==="H"||g==="S"){C-=v}var x=G+C,B=Math.floor(Math.max(0,(x-n)*J)),E=Math.floor(Math.max(0,(x+v-n)*J));switch(g){case"H":break;case"S":case"M":case"=":var p=compute_overlap([x,x+v],u);if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(f>0){m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset-f,y+1,E-B,9);m.fillStyle=CONNECTOR_COLOR;for(var I=0,j=q.length;I<j;I++){if(this.difference_mode&&a){var s=a[x-n+I];if(!s||s.toLowerCase()===q[I].toLowerCase()){continue}}if(x+I>=n&&x+I<=D){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset,y+9)}}}else{m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset,y+(this.mode!=="Dense"?4:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}z+=v;C+=v;break;case"N":m.fillStyle=CONNECTOR_COLOR;m.fillRect(B+this.left_offset-f,y+5,E-B,1);C+=v;break;case"D":m.fillStyle="red";m.fillRect(B+this.left_offset-f,y+4,E-B,3);C+=v;break;case"P":break;case"I":var p=compute_overlap([x,x+v],u),K=this.left_offset+B-f;if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(this.show_insertions){var w=this.left_offset+B-(E-B)/2;if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){m.fillStyle="yellow";m.fillRect(w-f,y-9,E-B,9);r[r.length]={type:"triangle",data:[K,y+4,5]};m.fillStyle=CONNECTOR_COLOR;switch(p){case (OVERLAP_START):q=q.slice(n-x);break;case (OVERLAP_END):q=q.slice(0,x-D);break;case (CONTAINED_BY):break;case (CONTAINS):q=q.slice(n-x,x-D);break}for(var I=0,j=q.length;I<j;I++){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset-(E-B)/2,y)}}else{m.fillStyle="yellow";m.fillRect(w,y+(this.mode!=="Dense"?2:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){r[r.length]={type:"text",data:[q.length,K,y+9]}}else{}}}z+=v;break;case"X":z+=v;break}}m.fillStyle="yellow";var t,L,H;for(var F=0;F<r.length;F++){t=r[F];L=t.type;H=t.data;if(L==="text"){m.font="bold "+DEFAULT_FONT;m.fillText(H[0],H[1],H[2]);m.font=DEFAULT_FONT}else{if(L=="triangle"){m.drawDownwardEquilateralTriangle(H[0],H[1],H[2])}}}},draw_element:function(w,y,r,k,e,A,b,n,x,u,f,c){var m=k[0],v=k[1],d=k[2],o=k[3],h=Math.floor(Math.max(0,(v-A)*n)),j=Math.ceil(Math.min(u,Math.max(0,(d-A)*n))),g=(r==="Dense"?1:(1+e))*x,z=this.prefs.block_color,l=this.prefs.label_color;t=0;w.fillStyle=z;if(k[5] instanceof Array){var s=Math.floor(Math.max(0,(k[4][0]-A)*n)),q=Math.ceil(Math.min(u,Math.max(0,(k[4][1]-A)*n))),p=Math.floor(Math.max(0,(k[5][0]-A)*n)),a=Math.ceil(Math.min(u,Math.max(0,(k[5][1]-A)*n)));if(k[4][1]>=A&&k[4][0]<=b&&k[4][2]){this.draw_read(w,r,n,A,b,k[4][0],k[4][2],k[4][3],g,c)}if(k[5][1]>=A&&k[5][0]<=b&&k[5][2]){this.draw_read(w,r,n,A,b,k[5][0],k[5][2],k[5][3],g,c)}if(p>q){w.fillStyle=CONNECTOR_COLOR;w.dashedLine(q+f,g+5,f+p,g+5)}}else{w.fillStyle=z;this.draw_read(w,r,n,A,b,v,k[4],k[5],g,c)}if(r==="Pack"&&v>A){w.fillStyle=this.prefs.label_color;if((r==="Pack"||this.mode==="Auto")&&n>CHAR_WIDTH_PX){var t=Math.round(n/2)}if(y===0&&h-w.measureText(o).width<0){w.textAlign="left";w.fillText(o,j+f+LABEL_SPACING-t,g+8)}else{w.textAlign="right";w.fillText(o,h+f-LABEL_SPACING-t,g+8)}w.fillStyle=z}}});var ToolDataFeatureTrack=function(e,c,g,a,d,f,b){FeatureTrack.call(this,e,c,g,a,d,f,{},b);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};$.extend(ToolDataFeatureTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{predraw_init:function(){var b=this;var a=function(){if(b.data_cache.size()===0){setTimeout(a,300)}else{b.data_url=default_data_url;b.data_query_wait=DEFAULT_DATA_QUERY_WAIT;b.dataset_state_url=converted_datasets_state_url;$.getJSON(b.dataset_state_url,{dataset_id:b.dataset_id,hda_ldda:b.hda_ldda},function(c){})}};a()}});
\ No newline at end of file
+CanvasRenderingContext2D.prototype.dashedLine=function(c,j,b,h,f){if(f===undefined){f=4}var e=b-c;var d=h-j;var g=Math.floor(Math.sqrt(e*e+d*d)/f);var l=e/g;var k=d/g;var a;for(a=0;a<g;a++,c+=l,j+=k){if(a%2!==0){continue}this.fillRect(c,j,f,1)}};CanvasRenderingContext2D.prototype.drawDownwardEquilateralTriangle=function(b,a,e){var d=b-e/2,c=b+e/2,f=a-Math.sqrt(e*3/2);this.beginPath();this.moveTo(d,f);this.lineTo(c,f);this.lineTo(b,a);this.lineTo(d,f);this.strokeStyle=this.fillStyle;this.fill();this.stroke();this.closePath()};function sortable(a,b){a.bind("drag",{handle:b,relative:true},function(h,j){var g=$(this).parent();var f=g.children();var c;for(c=0;c<f.length;c++){if(j.offsetY<$(f.get(c)).position().top){break}}if(c===f.length){if(this!==f.get(c-1)){g.append(this)}}else{if(this!==f.get(c)){$(this).insertBefore(f.get(c))}}})}var NO_OVERLAP=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005;function compute_overlap(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=NO_OVERLAP}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=NO_OVERLAP}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a}function is_overlap(b,a){return(compute_overlap(b,a)!==NO_OVERLAP)}var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=1,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,ERROR_PADDING=10,LABEL_SPACING=2,PACK_SPACING=5,MIN_SQUISH_VIEW_WIDTH=12000,DEFAULT_FONT="9px Monaco, Lucida Console, monospace",DENSITY=200,FEATURE_LEVELS=10,MAX_FEATURE_DEPTH=100,DEFAULT_DATA_QUERY_WAIT=5000,MAX_CHROMS_SELECTABLE=100,CONNECTOR_COLOR="#ccc",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_CANNOT_RUN_TOOL="Tool cannot be rerun: ",DATA_LOADING="Loading data...",DATA_OK="Ready for display",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=5,CACHED_DATA=5,DUMMY_CANVAS=document.createElement("canvas"),RIGHT_STRAND,LEFT_STRAND;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(DUMMY_CANVAS)}var CONTEXT=DUMMY_CANVAS.getContext("2d");CONTEXT.font=DEFAULT_FONT;var CHAR_WIDTH_PX=CONTEXT.measureText("A").width,CHAR_HEIGHT_PX=9;var right_img=new Image();right_img.src=image_path+"/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src=image_path+"/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=image_path+"/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=image_path+"/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function round_1000(a){return Math.round(a*1000)/1000}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.move_key_to_end(b,a)}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},move_key_to_end:function(b,a){this.key_ary.splice(a,1);this.key_ary.push(b)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var DataCache=function(a){Cache.call(this,a)};$.extend(DataCache.prototype,Cache.prototype,{get_data:function(g,b,e){var h=this.get(this.gen_key(g,b,e));if(h){return h}var j,f,a,d,e,h;for(var c=0;c<this.key_ary.length;c++){j=this.key_ary[c];f=this.split_key(j);a=f[0];d=f[1];if(g>=a&&b<=d){h=this.obj_cache[j];if(h.dataset_type!=="summary_tree"&&h.extra_info!=="no_detail"){this.move_key_to_end(j,c);return h}}}return undefined},set_data:function(b,c,d,a){return this.set(this.gen_key(b,c,d),a)},gen_key:function(a,c,d){var b=a+"_"+c+"_"+d;return b},split_key:function(a){return a.split("_")}});var View=function(a,d,c,b,e){this.container=a;this.chrom=null;this.vis_id=c;this.dbkey=b;this.title=d;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.num_tracks=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.init(e);this.reset()};$.extend(View.prototype,{init:function(d){var c=this.container,a=this;this.top_container=$("<div/>").addClass("top-container").appendTo(c);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(c);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(c);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").addClass("viewport-container").appendTo(this.content_div);this.intro_div=$("<div/>").addClass("intro").text("Select a chrom from the dropdown below").hide();this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a href='javascript:void(0);'>Close Overview</a>").addClass("overview-close").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var b=function(f){if(f.type==="focusout"||(f.keyCode||f.which)===13||(f.keyCode||f.which)===27){if((f.keyCode||f.which)!==27){a.go_to($(this).val())}$(this).hide();a.location_span.show();a.chrom_select.show();return false}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",b).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){a.location_span.hide();a.chrom_select.hide();a.nav_input.css("display","inline-block");a.nav_input.select();a.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){a.zoom_out();a.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){a.zoom_in();a.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},d);this.chrom_select.bind("change",function(){a.change_chrom(a.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(f){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(f){a.zoom_in(f.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(f,g){this.current_x=g.offsetX}).bind("drag",function(f,h){var j=h.offsetX-this.current_x;this.current_x=h.offsetX;var g=Math.round(j/a.viewport_container.width()*(a.max_high-a.max_low));a.move_delta(-g)});this.overview_close.bind("click",function(){for(var f=0,e=a.tracks.length;f<e;f++){a.tracks[f].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",a.overview_box.height());a.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(f,g){if(f.clientX>a.viewport_container.width()-16){return false}}).bind("dragstart",function(f,g){g.original_low=a.low;g.current_height=f.clientY;g.current_x=g.offsetX}).bind("drag",function(h,k){var f=$(this);var l=k.offsetX-k.current_x;var g=f.scrollTop()-(h.clientY-k.current_height);f.scrollTop(g);k.current_height=h.clientY;k.current_x=k.offsetX;var j=Math.round(l/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}).bind("mousewheel",function(h,k,g,f){if(g){var j=Math.round(-g/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}});this.top_labeltrack.bind("dragstart",function(f,g){return $("<div />").css({height:a.content_div.height()+a.top_labeltrack.height()+a.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(k,l){$(l.proxy).css({left:Math.min(k.pageX,l.startX),width:Math.abs(k.pageX-l.startX)});var g=Math.min(k.pageX,l.startX)-a.container.offset().left,f=Math.max(k.pageX,l.startX)-a.container.offset().left,j=(a.high-a.low),h=a.viewport_container.width();a.update_location(Math.round(g/h*j)+a.low,Math.round(f/h*j)+a.low)}).bind("dragend",function(l,m){var g=Math.min(l.pageX,m.startX),f=Math.max(l.pageX,m.startX),j=(a.high-a.low),h=a.viewport_container.width(),k=a.low;a.low=Math.round(g/h*j)+k;a.high=Math.round(f/h*j)+k;$(m.proxy).remove();a.redraw()});this.add_label_track(new LabelTrack(this,this.top_labeltrack));this.add_label_track(new LabelTrack(this,this.nav_labeltrack));$(window).bind("resize",function(){a.resize_window()});$(document).bind("redraw",function(){a.redraw()});this.reset();$(window).trigger("resize")},update_location:function(a,b){this.location_span.text(commatize(a)+" - "+commatize(b));this.nav_input.val(this.chrom+":"+commatize(a)+"-"+commatize(b))},load_chroms:function(b,c){b.num=MAX_CHROMS_SELECTABLE;$.extend(b,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var a=this;$.ajax({url:chrom_url,data:b,dataType:"json",success:function(e){if(e.reference){a.add_label_track(new ReferenceTrack(a))}a.chrom_data=e.chrom_info;var h='<option value="">Select Chrom/Contig</option>';for(var g=0,d=a.chrom_data.length;g<d;g++){var f=a.chrom_data[g].chrom;h+='<option value="'+f+'">'+f+"</option>"}if(e.prev_chroms){h+='<option value="previous">Previous '+MAX_CHROMS_SELECTABLE+"</option>"}if(e.next_chroms){h+='<option value="next">Next '+MAX_CHROMS_SELECTABLE+"</option>"}a.chrom_select.html(h);if(c){c()}a.chrom_start_index=e.start_index},error:function(){alert("Could not load chroms for this dbkey:",a.dbkey)}})},change_chrom:function(e,b,g){if(!e||e==="None"){return}var d=this;if(e==="previous"){d.load_chroms({low:this.chrom_start_index-MAX_CHROMS_SELECTABLE});return}if(e==="next"){d.load_chroms({low:this.chrom_start_index+MAX_CHROMS_SELECTABLE});return}var f=$.grep(d.chrom_data,function(j,k){return j.chrom===e})[0];if(f===undefined){d.load_chroms({chrom:e},function(){d.change_chrom(e,b,g)});return}else{if(e!==d.chrom){d.chrom=e;if(!d.chrom){d.intro_div.show()}else{d.intro_div.hide()}d.chrom_select.val(d.chrom);d.max_high=f.len-1;d.reset();d.redraw(true);for(var h=0,a=d.tracks.length;h<a;h++){var c=d.tracks[h];if(c.init){c.init()}}}if(b!==undefined&&g!==undefined){d.low=Math.max(b,0);d.high=Math.min(g,d.max_high)}d.reset_overview();d.redraw()}},go_to:function(f){var k=this,a,d,b=f.split(":"),h=b[0],j=b[1];if(j!==undefined){try{var g=j.split("-");a=parseInt(g[0].replace(/,/g,""),10);d=parseInt(g[1].replace(/,/g,""),10)}catch(c){return false}}k.change_chrom(h,a,d)},move_fraction:function(c){var a=this;var b=a.high-a.low;this.move_delta(c*b)},move_delta:function(c){var a=this;var b=a.high-a.low;if(a.low-c<a.max_low){a.low=a.max_low;a.high=a.max_low+b}else{if(a.high-c>a.max_high){a.high=a.max_high;a.low=a.max_high-b}else{a.high-=c;a.low-=c}}a.redraw()},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);sortable(a.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=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)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(h){var g=this.high-this.low,f=this.low,b=this.high;if(f<this.max_low){f=this.max_low}if(b>this.max_high){b=this.max_high}if(this.high!==0&&g<this.min_separation){b=f+this.min_separation}this.low=Math.floor(f);this.high=Math.ceil(b);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))));var a=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var e=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var j=13;this.overview_box.css({left:a,width:Math.max(j,e)}).show();if(e<j){this.overview_box.css("left",a-(j-e)/2)}if(this.overview_highlight){this.overview_highlight.css({left:a,width:e})}this.update_location(this.low,this.high);if(!h){for(var c=0,d=this.tracks.length;c<d;c++){if(this.tracks[c]&&this.tracks[c].enabled){this.tracks[c].draw()}}for(c=0,d=this.label_tracks.length;c<d;c++){this.label_tracks[c].draw()}}},zoom_in:function(b,c){if(this.max_high===0||this.high-this.low<this.min_separation){return}var d=this.high-this.low,e=d/2+this.low,a=(d/this.zoom_factor)/2;if(b){e=b/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(e-a);this.high=Math.round(e+a);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var b=this.high-this.low,c=b/2+this.low,a=(b*this.zoom_factor)/2;this.low=Math.round(c-a);this.high=Math.round(c+a);this.redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.nav_container.width(this.container.width());this.redraw()},reset_overview:function(){this.overview_viewport.find("canvas").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide()}});var Tool=function(a,b){this.name=a;this.params=b};$.extend(Tool.prototype,{get_param_values_dict:function(){var b={};for(var a=0;a<this.params.length;a++){var c=this.params[a];b[c.name]=c.value}return b},get_param_values:function(){var b=[];for(var a=0;a<this.params.length;a++){b[a]=this.params[a].value}return b}});var NumberToolParameter=function(c,b,e,a,d){this.name=c;this.label=b;this.min=e;this.max=a;this.value=d};var get_tool_from_dict=function(f){if(obj_length(f)===0){return undefined}var b=f.name;var l=f.params;var c=Array();for(var e=0;e<l.length;e++){var g=l[e];var a=g.name,k=g.label,h=g.type,d=g.min,j=g.max,m=g.value;c[c.length]=new NumberToolParameter(a,k,d,j,m)}return new Tool(b,c)};var Filter=function(b,a,c){this.name=b;this.index=a;this.value=c};var NumberFilter=function(b,a){this.name=b;this.index=a;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.slider_min=Number.MAX_VALUE;this.slider_max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};$.extend(NumberFilter.prototype,{applies_to:function(a){if(a.length>this.index){return true}return false},keep:function(a){if(!this.applies_to(a)){return true}return(a[this.index]>=this.low&&a[this.index]<=this.high)},update_attrs:function(b){var a=false;if(!this.applies_to(b)){return a}if(b[this.index]<this.slider_min){this.slider_min=b[this.index];a=true}if(b[this.index]>this.slider_max){this.slider_max=b[this.index];a=false}return a},update_ui_elt:function(){var b=this.slider.slider("option","min"),a=this.slider.slider("option","max");if(this.slider_min<b||this.slider_max>a){this.slider.slider("option","min",this.slider_min);this.slider.slider("option","max",this.slider_max);this.slider.slider("option","values",[this.slider_min,this.slider_max])}}});var get_filters_from_dict=function(a){var g=[];for(var d=0;d<a.length;d++){var f=a[d];var c=f.name,e=f.type,b=f.index;if(e==="int"||e==="float"){g[d]=new NumberFilter(c,b)}else{g[d]=new Filter(c,b,e)}}return g};var TrackConfig=function(a){this.track=a.track;this.params=a.params;this.values={};if(a.saved_values){this.restore_values(a.saved_values)}this.onchange=a.onchange};$.extend(TrackConfig.prototype,{restore_values:function(a){var b=this;$.each(this.params,function(c,d){if(a[d.key]!==undefined){b.values[d.key]=a[d.key]}else{b.values[d.key]=d.default_value}})},build_form:function(){var b=this;var a=$("<div />");$.each(this.params,function(f,d){if(!d.hidden){var c="param_"+f;var l=$("<div class='form-row' />").appendTo(a);l.append($("<label />").attr("for",c).text(d.label+":"));if(d.type==="bool"){l.append($('<input type="checkbox" />').attr("id",c).attr("name",c).attr("checked",b.values[d.key]))}else{if(d.type==="color"){var h=b.values[d.key];var g=$("<input />").attr("id",c).attr("name",c).val(h);var j=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var e=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(j);var k=$("<div/>").appendTo(e).farbtastic({width:100,height:100,callback:g,color:h});$("<div />").append(g).append(j).appendTo(l).bind("click",function(m){j.css({left:$(this).position().left+($(g).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){j.hide();$(document).unbind("click.color-picker")});m.stopPropagation()})}else{l.append($("<input />").attr("id",c).attr("name",c).val(b.values[d.key]))}}}});return a},update_from_form:function(a){var c=this;var b=false;$.each(this.params,function(d,f){if(!f.hidden){var g="param_"+d;var e=a.find("#"+g).val();if(f.type==="float"){e=parseFloat(e)}else{if(f.type==="int"){e=parseInt(e)}else{if(f.type==="bool"){e=a.find("#"+g).is(":checked")}}}if(e!==c.values[f.key]){c.values[f.key]=e;b=true}}});if(b){this.onchange()}}});var Track=function(b,a,e,c,d){this.name=b;this.view=a;this.parent_element=e;this.data_url=(c?c:default_data_url);this.data_query_wait=(d?d:DEFAULT_DATA_QUERY_WAIT);this.dataset_check_url=converted_datasets_state_url;this.container_div=$("<div />").addClass("track").css("position","relative");if(!this.hidden){this.header_div=$("<div class='track-header' />").appendTo(this.container_div);if(this.view.editor){this.drag_div=$("<div class='draghandle' />").appendTo(this.header_div)}this.name_div=$("<div class='menubutton popup' />").appendTo(this.header_div);this.name_div.text(this.name);this.name_div.attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase())}this.content_div=$("<div class='track-content'>").appendTo(this.container_div);this.parent_element.append(this.container_div)};$.extend(Track.prototype,{init:function(){var a=this;a.enabled=false;a.tile_cache.clear();a.data_cache.clear();a.initial_canvas=undefined;a.content_div.css("height","auto");a.container_div.removeClass("nodata error pending");if(!a.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:a.hda_ldda,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(!b||b==="error"||b.kind==="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR);if(b.message){var d=a.view.tracks.indexOf(a);var c=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+b.message+"</pre>",{Close:hide_modal})});a.content_div.append(c)}}else{if(b==="no converter"){a.container_div.addClass("error");a.content_div.text(DATA_NOCONVERTER)}else{if(b==="no data"||(b.data!==undefined&&(b.data===null||b.data.length===0))){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b==="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},a.data_query_wait)}else{if(b.status==="data"){if(b.valid_chroms){a.valid_chroms=b.valid_chroms;a.make_name_popup_menu()}a.content_div.text(DATA_OK);if(a.view.chrom){a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.enabled=true;$.when(a.predraw_init()).done(function(){a.draw()})}}}}}}})},predraw_init:function(){},update_name:function(a){this.old_name=this.name;this.name=a;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var TiledTrack=function(b,j,n){var c=this,o=c.view;this.filters=(b!==undefined?get_filters_from_dict(b):[]);this.filters_available=false;this.filters_visible=false;this.tool=(j!==undefined?get_tool_from_dict(j):undefined);this.parent_track=n;this.child_tracks=[];if(c.hidden){return}if(this.parent_track){this.header_div.find(".draghandle").removeClass("draghandle").addClass("child-track-icon").addClass("icon-button");this.parent_element.addClass("child-track");this.tool=undefined}this.filters_div=$("<div/>").addClass("filters").hide();this.header_div.after(this.filters_div);this.filters_div.bind("drag",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});$.each(this.filters,function(t,w){var u=$("<div/>").addClass("slider-row").appendTo(c.filters_div);var v=$("<div/>").addClass("slider-label").appendTo(u);var s=$("<span/>").addClass("name").appendTo(v);s.text(w.name+" ");var r=$("<span/>").addClass("values").appendTo(v);var q=$("<div/>").addClass("slider").appendTo(u);w.control_element=$("<div/>").attr("id",w.name+"-filter-control").appendTo(q);w.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(y,z){var x=z.values;r.text("["+x[0]+"-"+x[1]+"]");w.low=x[0];w.high=x[1];c.draw(true,true)},change:function(x,y){w.control_element.slider("option","slide").call(w.control_element,x,y)}});w.slider=w.control_element;w.slider_label=r;$("<div style='clear: both;'/>").appendTo(u)});if(this.tool){this.dynamic_tool_div=$("<div/>").addClass("dynamic-tool").hide();this.header_div.after(this.dynamic_tool_div);this.dynamic_tool_div.bind("drag",function(q){q.stopPropagation()}).bind("click",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});var m=$("<div class='tool-name'>").appendTo(this.dynamic_tool_div).text(this.tool.name);var l=this.tool.params;var c=this;$.each(this.tool.params,function(x,s){var v=$("<div>").addClass("slider-row").appendTo(c.dynamic_tool_div);var u=$("<div>").addClass("slider-label").appendTo(v);var z=$("<span class='param-name'>").text(s.label+" ").appendTo(u);var t=$("<span/>").text(s.value);var w=$("<span class='param-value'>").appendTo(u).append("[").append(t).append("]");var y=$("<div/>").addClass("slider").appendTo(v);var q=$("<div id='"+s.name+"-param-control'>").appendTo(y);var r=(s.max<=1?0.01:(s.max<=1000?1:5));q.slider({min:s.min,max:s.max,step:r,value:s.value,slide:function(A,C){var B=C.value;s.value=B;if(0<B&&B<1){B=parseFloat(B).toFixed(2)}t.text(B)},change:function(A,B){s.value=B.value}});w.click(function(){var C=t,B=C.text(),A=(s.max<=1?4:s.max.length);C.text("");$("<input type='text'/>").attr("size",A).attr("maxlength",A).attr("value",B).appendTo(C).focus().select().click(function(D){D.stopPropagation()}).blur(function(){$(this).remove();C.text(B)}).keyup(function(F){if(F.keyCode===27){$(this).trigger("blur")}else{if(F.keyCode===13){var D=$(this),E=parseFloat(D.val());if(isNaN(E)||E>s.max||E<s.min){alert("Parameter value must be in the range ["+s.min+"-"+s.max+"]");return $(this)}C.text(E);q.slider("value",E);s.value=E}}})});$("<div style='clear: both;'/>").appendTo(v)});var p=$("<div>").addClass("slider-row").appendTo(this.dynamic_tool_div);var k=$("<input type='submit'>").attr("value","Run").appendTo(p);var c=this;k.click(function(){c.run_tool()})}c.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();c.container_div.append(c.child_tracks_container);if(c.display_modes!==undefined){if(c.mode_div===undefined){c.mode_div=$("<div class='right-float menubutton popup' />").appendTo(c.header_div);var e=(c.track_config&&c.track_config.values.mode?c.track_config.values.mode:c.display_modes[0]);c.mode=e;c.mode_div.text(e);var d=function(q){c.mode_div.text(q);c.mode=q;c.track_config.values.mode=q;c.tile_cache.clear();c.draw()};var a={};for(var f=0,h=c.display_modes.length;f<h;f++){var g=c.display_modes[f];a[g]=function(q){return function(){d(q)}}(g)}make_popupmenu(c.mode_div,a)}else{c.mode_div.hide()}}this.make_name_popup_menu()};$.extend(TiledTrack.prototype,Track.prototype,{make_name_popup_menu:function(){var b=this;var a={};a["Edit configuration"]=function(){var h=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},f=function(){b.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},g=function(j){if((j.keyCode||j.which)===27){h()}else{if((j.keyCode||j.which)===13){f()}}};$(window).bind("keypress.check_enter_esc",g);show_modal("Configure Track",b.track_config.build_form(),{Cancel:h,OK:f})};if(b.filters_available>0){var e=(b.filters_div.is(":visible")?"Hide filters":"Show filters");a[e]=function(){b.filters_visible=(b.filters_div.is(":visible"));b.filters_div.toggle();b.make_name_popup_menu()}}if(b.tool){var e=(b.dynamic_tool_div.is(":visible")?"Hide Tool":"Show Tool");a[e]=function(){if(!b.dynamic_tool_div.is(":visible")){b.update_name(b.name+b.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";b.revert_name()}b.dynamic_tool_div.toggle();b.make_name_popup_menu()}}if(b.track_type=="ReadTrack"){var e=(b.show_insertions?"Hide Insertions":"Show Insertions");a[e]=function(){b.show_insertions=!b.show_insertions;b.draw(true);b.make_name_popup_menu()}}if(b.valid_chroms){a["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+b.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var c=view;var d=function(){$("#no-tracks").show()};if(this.parent_track){c=this.parent_track;d=function(){}}a.Remove=function(){c.remove_track(b);if(c.num_tracks===0){d()}};make_popupmenu(b.name_div,a)},tile_data:function(d,a,g,k,j){var b=this,h=a*DENSITY*d,f=(a+1)*DENSITY*d,e={chrom:this.view.chrom,low:h,high:f,dbkey:this.view.dbkey};if(j===undefined){j=d+"_"+a}var c=b.data_cache.get(j);if(c){return k(c)}$.extend(e,g);$.ajax({url:this.data_url,dataType:"json",data:e,success:function(l){b.data_cache.set(j,l);return k(l)},error:function(m,l,n){console.log(m,l,n)}})},draw:function(a,d){var s=this.view.low,g=this.view.high,j=g-s,l=this.view.container.width(),m=this.view.resolution;var e=$("<div style='position: relative;'></div>"),f=l/j;if(!d){this.content_div.children().remove()}this.content_div.append(e);this.max_height=0;var o=Math.floor(s/m/DENSITY);var c={};while((o*DENSITY*m)<g){var r=l+"_"+f+"_"+o;var h=this.tile_cache.get(r);var p=o*DENSITY*this.view.resolution;var b=p+DENSITY*this.view.resolution;if(!a&&h){this.show_tile(h,e,p,f)}else{this.delayed_draw(a,r,p,b,o,m,e,f,c)}o+=1}if(d){var k=this;var q=setInterval(function(){if(obj_length(c)===0){var v=k.content_div.children();var u=false;for(var w=v.length-1,t=0;w>=t;w--){var x=$(v[w]);if(u){x.remove()}else{if(x.children().length!==0){u=true}}}clearInterval(q)}},50)}for(var n=0;n<this.child_tracks.length;n++){this.child_tracks[n].draw(a,d)}},delayed_draw:function(b,j,h,l,c,e,k,m,f){var d=this;var g=function(n){d.tile_cache.set(j,n);d.show_tile(n,k,h,m)};var a=setTimeout(function(){if(h<=d.view.high&&l>=d.view.low){var n;if(!b){n=d.tile_cache.get(j)}if(!n){d.draw_tile(e,c,k,m,function(p){if(p){var o=$("<div class='track-tile'>").prepend(p);n=o}g(n)})}if(n){g(n)}}delete f[a]},50);f[a]=true},show_tile:function(h,j,e,k){var a=this;var c=this.view.high-this.view.low,b=(e-this.view.low)*k;if(this.left_offset){b-=this.left_offset}h.css({position:"absolute",top:0,left:b,height:""});j.append(h);a.max_height=Math.max(a.max_height,h.height());a.content_div.css("height",a.max_height+"px");j.children().css("height",a.max_height+"px");if(a.hidden){return}for(var g=0;g<a.filters.length;g++){a.filters[g].update_ui_elt()}var d=false;if(a.example_feature){for(var g=0;g<a.filters.length;g++){if(a.filters[g].applies_to(a.example_feature)){d=true;break}}}if(a.filters_available!==d){a.filters_available=d;if(!a.filters_available){a.filters_div.hide()}a.make_name_popup_menu()}},set_overview:function(){var a=this.view;if(this.initial_canvas&&this.is_overview){a.overview_close.show();a.overview_viewport.append(this.initial_canvas);a.overview_highlight.show().height(this.initial_canvas.height());a.overview_viewport.height(this.initial_canvas.height()+a.overview_box.height())}$(window).trigger("resize")},run_tool:function(){var b={dataset_id:this.original_dataset_id,chrom:this.view.chrom,low:this.view.low,high:this.view.high,tool_id:this.tool.name};$.extend(b,this.tool.get_param_values_dict());var d=this,c=b.tool_id+d.tool_region_and_parameters_str(b.chrom,b.low,b.high),e;if(d.track_type==="FeatureTrack"){e=new ToolDataFeatureTrack(c,view,d.hda_ldda,undefined,{},{},d)}this.add_track(e);e.content_div.text("Starting job.");view.has_changes=true;var a=function(){$.getJSON(run_tool_url,b,function(f){if(f==="no converter"){e.container_div.addClass("error");e.content_div.text(DATA_NOCONVERTER)}else{if(f.error){e.container_div.addClass("error");e.content_div.text(DATA_CANNOT_RUN_TOOL+f.message)}else{if(f==="pending"){e.container_div.addClass("pending");e.content_div.text("Converting input data so that it can be easily reused.");setTimeout(a,2000)}else{e.dataset_id=f.dataset_id;e.content_div.text("Running job.");e.init()}}}})};a()},tool_region_and_parameters_str:function(c,a,d){var b=this,e=(c!==undefined&&a!==undefined&&d!==undefined?c+":"+a+"-"+d:"all");return" - region=["+e+"], parameters=["+b.tool.get_param_values().join(", ")+"]"},add_track:function(a){a.track_id=this.track_id+"_"+this.child_tracks.length;a.container_div.attr("id","track_"+a.track_id);this.child_tracks_container.append(a.container_div);sortable(a.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(a)},remove_track:function(a){a.container_div.fadeOut("slow",function(){$(this).remove()})}});var LabelTrack=function(a,b){this.track_type="LabelTrack";this.hidden=true;Track.call(this,null,a,b);this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.view.container.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var ReferenceTrack=function(a){this.track_type="ReferenceTrack";this.hidden=true;Track.call(this,null,a,a.top_labeltrack);TiledTrack.call(this);a.reference_track=this;this.left_offset=200;this.height_px=12;this.font=DEFAULT_FONT;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_url=reference_url;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE)};$.extend(ReferenceTrack.prototype,TiledTrack.prototype,{draw_tile:function(c,b,e,g,f){var a=this,d=DENSITY*c;if(g>CHAR_WIDTH_PX){a.tile_data(c,b,{},function(j){if(j===null){a.content_div.css("height","0px");return}var k=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(k)}k=$(k);var h=k.get(0).getContext("2d");k.get(0).width=Math.ceil(d*g+a.left_offset);k.get(0).height=a.height_px;h.font=DEFAULT_FONT;h.textAlign="center";for(var n=0,l=j.length;n<l;n++){var m=Math.round(n*g);h.fillText(j[n],m+a.left_offset,10)}return f(k)})}this.content_div.css("height","0px")}});var LineTrack=function(e,c,f,a,d){var b=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";Track.call(this,e,c,c.viewport_container);TiledTrack.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=f;this.dataset_id=a;this.original_dataset_id=a;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE);this.track_config=new TrackConfig({track:this,params:[{key:"color",label:"Color",type:"color",default_value:"black"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.height_px,hidden:true}],saved_values:d,onchange:function(){b.vertical_range=b.prefs.max_value-b.prefs.min_value;$("#linetrack_"+b.track_id+"_minval").text(b.prefs.min_value);$("#linetrack_"+b.track_id+"_maxval").text(b.prefs.max_value);b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;this.height_px=this.track_config.values.height;this.vertical_range=this.track_config.values.max_value-this.track_config.values.min_value;(function(g){var k=false;var j=false;var h=$("<div class='track-resize'>");$(g.container_div).hover(function(){k=true;h.show()},function(){k=false;if(!j){h.hide()}});h.hide().bind("dragstart",function(l,m){j=true;m.original_height=$(g.content_div).height()}).bind("drag",function(m,n){var l=Math.min(Math.max(n.original_height+n.deltaY,g.min_height_px),g.max_height_px);$(g.content_div).css("height",l);g.height_px=l;g.draw(true)}).bind("dragend",function(l,m){g.tile_cache.clear();j=false;if(!k){h.hide()}g.track_config.values.height=g.height_px}).appendTo(g.container_div)})(this)};$.extend(LineTrack.prototype,TiledTrack.prototype,{predraw_init:function(){var a=this,b=a.view.tracks.indexOf(a);a.vertical_range=undefined;return $.getJSON(a.data_url,{stats:true,chrom:a.view.chrom,low:null,high:null,hda_ldda:a.hda_ldda,dataset_id:a.dataset_id},function(c){a.container_div.addClass("line-track");var e=c.data;if(isNaN(parseFloat(a.prefs.min_value))||isNaN(parseFloat(a.prefs.max_value))){a.prefs.min_value=e.min;a.prefs.max_value=e.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;a.total_frequency=e.total_frequency;a.container_div.find(".yaxislabel").remove();var f=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(round_1000(a.prefs.min_value));var d=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(round_1000(a.prefs.max_value));d.css({position:"absolute",top:"24px",left:"10px"});d.prependTo(a.container_div);f.css({position:"absolute",bottom:"2px",left:"10px"});f.prependTo(a.container_div)})},draw_tile:function(d,a,j,k,h){if(this.vertical_range===undefined){return}var c=this,f=a*DENSITY*d,b=DENSITY*d,g=d+"_"+a,e={hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,resolution:this.view.resolution};this.tile_data(d,a,e,function(C){var l=document.createElement("canvas"),q=C.data;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(l)}l=$(l);l.get(0).width=Math.ceil(b*k);l.get(0).height=c.height_px;var z=l.get(0).getContext("2d"),n=false,B=c.prefs.min_value,v=c.prefs.max_value,A=c.vertical_range,m=c.total_frequency,u=c.height_px,s=c.mode;var r=Math.round(u+B/A*u);z.beginPath();z.moveTo(0,r);z.lineTo(b*k,r);z.fillStyle="#aaa";z.stroke();z.beginPath();z.fillStyle=c.prefs.color;var p,w,x;if(q.length>1){x=Math.ceil((q[1][0]-q[0][0])*k)}else{x=10}for(var o=0,t=q.length;o<t;o++){p=Math.round((q[o][0]-f)*k);w=q[o][1];if(w===null){if(n&&s==="Filled"){z.lineTo(p,u)}n=false;continue}if(w<B){w=B}else{if(w>v){w=v}}if(s==="Histogram"){w=Math.round(w/A*u);z.fillRect(p,r,x,-w)}else{if(s==="Intensity"){w=255-Math.floor((w-B)/A*255);z.fillStyle="rgb("+w+","+w+","+w+")";z.fillRect(p,0,x,u)}else{w=Math.round(u-(w-B)/A*u);if(n){z.lineTo(p,w)}else{n=true;if(s==="Filled"){z.moveTo(p,u);z.lineTo(p,w)}else{z.moveTo(p,w)}}}}}if(s==="Filled"){if(n){z.lineTo(p,r);z.lineTo(0,r)}z.fill()}else{z.stroke()}h(l)})}});var FeatureTrack=function(a,f,e,j,h,c,d,g){var b=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new TrackConfig({track:this,params:[{key:"block_color",label:"Block color",type:"color",default_value:"#444"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:h,onchange:function(){b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;Track.call(this,a,f,f.viewport_container);TiledTrack.call(this,c,d,g);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=e;this.dataset_id=j;this.original_dataset_id=j;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.default_font=DEFAULT_FONT;this.inc_slots={};this.start_end_dct={};this.tile_cache=new Cache(CACHED_TILES_FEATURE);this.data_cache=new DataCache(20);this.left_offset=200};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{incremental_slots:function(a,h,p){var q=this.inc_slots[a];if(!q||(q.mode!==p)){q={};q.w_scale=a;q.mode=p;this.inc_slots[a]=q;this.start_end_dct[a]={}}var l=q.w_scale,w=[],x=[],j=0,n=this.view.max_low;for(var u=0,v=h.length;u<v;u++){var g=h[u],k=g[0];if(q[k]!==undefined){j=Math.max(j,q[k]);x.push(q[k])}else{w.push(u)}}var d=this.start_end_dct[a];var m=function(D,E){for(var C=0;C<=MAX_FEATURE_DEPTH;C++){var A=false,F=d[C];if(F!==undefined){for(var z=0,B=F.length;z<B;z++){var y=F[z];if(E>y[0]&&D<y[1]){A=true;break}}}if(!A){return C}}return -1};for(var u=0,v=w.length;u<v;u++){var g=h[w[u]],k=g[0],s=g[1],b=g[2],o=g[3],c=Math.floor((s-n)*l),f=Math.ceil((b-n)*l),t=CONTEXT.measureText(o).width,e;if(o!==undefined&&p==="Pack"){t+=(LABEL_SPACING+PACK_SPACING);if(c-t>=0){c-=t;e="left"}else{f+=t;e="right"}}var r=m(c,f);if(r>=0){if(d[r]===undefined){d[r]=[]}d[r].push([c,f]);q[k]=r;j=Math.max(j,r)}else{}}return j+1},draw_summary_tree:function(b,o,n,l,r,j,f,e){var c=j+LABEL_SPACING+CHAR_HEIGHT_PX;delta_x_px=Math.ceil(n*r);var h=$("<div />").addClass("yaxislabel");h.text(l);h.css({position:"absolute",top:"22px",left:"10px"});h.prependTo(this.container_div);var q=b.get(0).getContext("2d");for(var d=0,g=o.length;d<g;d++){var m=Math.floor((o[d][0]-f)*r);var k=o[d][1];if(!k){continue}var p=k/l*j;q.fillStyle="black";q.fillRect(m+e,c-p,delta_x_px,p);var a=4;if(this.prefs.show_counts&&(q.measureText(k).width+a)<delta_x_px){q.fillStyle="#666";q.textAlign="center";q.fillText(k,m+e+(delta_x_px/2),10)}}},draw_element:function(p,f,g,x,j,r,I,M,N,a,A){var u=x[0],K=x[1],C=x[2],s=x[3],D=Math.floor(Math.max(0,(K-r)*M)),q=Math.ceil(Math.min(a,Math.max(0,(C-r)*M))),B=ERROR_PADDING+(g==="Dense"?0:(0+j))*N,o,G,t=null,O=null,d=this.prefs.block_color,F=this.prefs.label_color;if(g==="Dense"){p.fillStyle=d;p.fillRect(D+A,B,q-D,DENSE_FEATURE_HEIGHT)}else{if(g==="no_detail"){p.fillStyle=d;p.fillRect(D+A,B+5,q-D,DENSE_FEATURE_HEIGHT)}else{var n=x[5],z=x[6],E=x[7],e=x[8];if(z&&E){t=Math.floor(Math.max(0,(z-r)*M));O=Math.ceil(Math.min(a,Math.max(0,(E-r)*M)))}var L,v;if(g==="Squish"){L=1;v=SQUISH_FEATURE_HEIGHT}else{L=5;v=PACK_FEATURE_HEIGHT}if(!e){if(x.strand){if(x.strand==="+"){p.fillStyle=RIGHT_STRAND_INV}else{if(x.strand==="-"){p.fillStyle=LEFT_STRAND_INV}}}else{p.fillStyle=d}p.fillRect(D+A,B,q-D,v)}else{var m,w;if(g==="Squish"){p.fillStyle=CONNECTOR_COLOR;m=B+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;w=1}else{if(n){var m=B;var w=v;if(n==="+"){p.fillStyle=RIGHT_STRAND}else{if(n==="-"){p.fillStyle=LEFT_STRAND}}}else{p.fillStyle=CONNECTOR_COLOR;m+=(SQUISH_FEATURE_HEIGHT/2)+1;w=1}}p.fillRect(D+A,m,q-D,w);for(var J=0,c=e.length;J<c;J++){var h=e[J],b=Math.floor(Math.max(0,(h[0]-r)*M)),y=Math.ceil(Math.min(a,Math.max((h[1]-r)*M)));if(b>y){continue}p.fillStyle=d;p.fillRect(b+A,B+(v-L)/2+1,y-b,L);if(t!==undefined&&!(b>O||y<t)){var H=Math.max(b,t),l=Math.min(y,O-1);p.fillRect(H+A,B+1,l-H,v)}}}if(g==="Pack"&&K>r){p.fillStyle=F;if(f===0&&D-p.measureText(s).width<0){p.textAlign="left";p.fillText(s,q+A+LABEL_SPACING,B+8)}else{p.textAlign="right";p.fillText(s,D+A-LABEL_SPACING,B+8)}p.fillStyle=d}}}},get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="no_detail"){a=NO_DETAIL_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT}}}return a},draw_tile:function(z,E,l,n,j,d,p){var v=this;if(v.view.reference_track&&n>CHAR_WIDTH_PX&&d===undefined){return v.view.reference_track.tile_data(z,E,{},function(f){v.draw_tile(z,E,l,n,j,f)})}var G=E*DENSITY*z,a=(E+1)*DENSITY*z,s=a-G,H={hda_ldda:v.hda_ldda,dataset_id:v.dataset_id,resolution:this.view.resolution,mode:this.mode};if(p===undefined){var q=this.data_cache.get_data(G,a,this.mode),J=z+"_"+E+"_"+this.mode;if(q===undefined){return v.tile_data(z,E,H,function(f){v.data_cache.set_data(G,a,this.mode,f);v.draw_tile(z,E,l,n,j,d,f)},J)}p=q}var x=Math.ceil(s*n),u=this.mode,K=25,g=this.left_offset,r,h;var c=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(c)}c=$(c);if(u==="Auto"){if(p.dataset_type==="summary_tree"){u=p.dataset_type}else{if(p.extra_info==="no_detail"){u="no_detail"}else{var I=p.data;if((I.length&&I.length<4)||(this.view.high-this.view.low>MIN_SQUISH_VIEW_WIDTH)){u="Squish"}else{u="Pack"}}}}var A=this.get_y_scale(u);if(u==="summary_tree"){h=this.summary_draw_height}if(u==="Dense"){h=K}else{if(u==="no_detail"||u==="Squish"||u==="Pack"){h=this.incremental_slots(n,p.data,u)*A+K;r=this.inc_slots[n]}}c.get(0).width=x+g;c.get(0).height=h;if(p.dataset_type==="summary_tree"){c.get(0).height+=LABEL_SPACING+CHAR_HEIGHT_PX}l.parent().css("height",Math.max(this.height_px,h)+"px");var y=c.get(0).getContext("2d");y.fillStyle=this.prefs.block_color;y.font=this.default_font;y.textAlign="right";this.container_div.find(".yaxislabel").remove();if(u==="summary_tree"){this.draw_summary_tree(c,p.data,p.delta,p.max,n,h,G,g);return j(c)}if(p.message){c.css({"border-top":"1px solid red"});y.fillStyle="red";y.textAlign="left";var t=y.textBaseline;y.textBaseline="top";y.fillText(p.message,g,0);y.textBaseline=t;if(!p.data){return j(c)}}this.example_feature=(p.data.length?p.data[0]:undefined);var I=p.data;for(var B=0,D=I.length;B<D;B++){var k=I[B],m=k[0],w=k[1],b=k[2],e=(r&&r[m]!==undefined?r[m]:null);var C=false;var o;for(var F=0;F<this.filters.length;F++){o=this.filters[F];o.update_attrs(k);if(!o.keep(k)){C=true;break}}if(C){continue}if(is_overlap([w,b],[G,a])&&(u=="Dense"||e!==null)){this.draw_element(y,E,u,k,e,G,a,n,A,x,g,d)}}j(c)}});var VcfTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="VcfTrack"};$.extend(VcfTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_element:function(u,p,j,e,x,c,m,v,s){var j=data[i],l=j[0],t=j[1],d=j[2]-1,o=j[3],g=Math.floor(Math.max(0,(t-x)*m)),k=Math.ceil(Math.min(s,Math.max(0,(d-x)*m))),f=ERROR_PADDING+(p==="Dense"?0:(0+e))*v,a,y,b=null,n=null;if(no_label){u.fillStyle=block_color;u.fillRect(g+left_offset,f+5,k-g,1)}else{var w=j[4],r=j[5],h=j[6];a=9;y=1;u.fillRect(g+left_offset,f,k-g,a);if(p!=="Dense"&&o!==undefined&&t>x){u.fillStyle=label_color;if(tile_index===0&&g-u.measureText(o).width<0){u.textAlign="left";u.fillText(o,k+2+left_offset,f+8)}else{u.textAlign="right";u.fillText(o,g-2+left_offset,f+8)}u.fillStyle=block_color}var q=w+" / "+r;if(t>x&&u.measureText(q).width<(k-g)){u.fillStyle="white";u.textAlign="center";u.fillText(q,left_offset+g+(k-g)/2,f+8);u.fillStyle=block_color}}}});var ReadTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="ReadTrack";this.difference_mode=true;this.show_insertions=false;this.make_name_popup_menu()};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT;if(this.show_insertions){a*=2}}}return a},draw_read:function(m,d,J,n,D,G,e,o,y,a){m.textAlign="center";var l=this,u=[n,D],C=0,z=0,f=0;var r=[];if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){f=Math.round(J/2)}if(!e){e=[[0,o.length]]}for(var h=0,k=e.length;h<k;h++){var b=e[h],g="MIDNSHP=X"[b[0]],v=b[1];if(g==="H"||g==="S"){C-=v}var x=G+C,B=Math.floor(Math.max(0,(x-n)*J)),E=Math.floor(Math.max(0,(x+v-n)*J));switch(g){case"H":break;case"S":case"M":case"=":var p=compute_overlap([x,x+v],u);if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(f>0){m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset-f,y+1,E-B,9);m.fillStyle=CONNECTOR_COLOR;for(var I=0,j=q.length;I<j;I++){if(this.difference_mode&&a){var s=a[x-n+I];if(!s||s.toLowerCase()===q[I].toLowerCase()){continue}}if(x+I>=n&&x+I<=D){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset,y+9)}}}else{m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset,y+(this.mode!=="Dense"?4:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}z+=v;C+=v;break;case"N":m.fillStyle=CONNECTOR_COLOR;m.fillRect(B+this.left_offset-f,y+5,E-B,1);C+=v;break;case"D":m.fillStyle="red";m.fillRect(B+this.left_offset-f,y+4,E-B,3);C+=v;break;case"P":break;case"I":var p=compute_overlap([x,x+v],u),K=this.left_offset+B-f;if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(this.show_insertions){var w=this.left_offset+B-(E-B)/2;if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){m.fillStyle="yellow";m.fillRect(w-f,y-9,E-B,9);r[r.length]={type:"triangle",data:[K,y+4,5]};m.fillStyle=CONNECTOR_COLOR;switch(p){case (OVERLAP_START):q=q.slice(n-x);break;case (OVERLAP_END):q=q.slice(0,x-D);break;case (CONTAINED_BY):break;case (CONTAINS):q=q.slice(n-x,x-D);break}for(var I=0,j=q.length;I<j;I++){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset-(E-B)/2,y)}}else{m.fillStyle="yellow";m.fillRect(w,y+(this.mode!=="Dense"?2:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){r[r.length]={type:"text",data:[q.length,K,y+9]}}else{}}}z+=v;break;case"X":z+=v;break}}m.fillStyle="yellow";var t,L,H;for(var F=0;F<r.length;F++){t=r[F];L=t.type;H=t.data;if(L==="text"){m.font="bold "+DEFAULT_FONT;m.fillText(H[0],H[1],H[2]);m.font=DEFAULT_FONT}else{if(L=="triangle"){m.drawDownwardEquilateralTriangle(H[0],H[1],H[2])}}}},draw_element:function(w,y,r,k,e,A,b,n,x,u,f,c){var m=k[0],v=k[1],d=k[2],o=k[3],h=Math.floor(Math.max(0,(v-A)*n)),j=Math.ceil(Math.min(u,Math.max(0,(d-A)*n))),g=(r==="Dense"?1:(1+e))*x,z=this.prefs.block_color,l=this.prefs.label_color;t=0;w.fillStyle=z;if(k[5] instanceof Array){var s=Math.floor(Math.max(0,(k[4][0]-A)*n)),q=Math.ceil(Math.min(u,Math.max(0,(k[4][1]-A)*n))),p=Math.floor(Math.max(0,(k[5][0]-A)*n)),a=Math.ceil(Math.min(u,Math.max(0,(k[5][1]-A)*n)));if(k[4][1]>=A&&k[4][0]<=b&&k[4][2]){this.draw_read(w,r,n,A,b,k[4][0],k[4][2],k[4][3],g,c)}if(k[5][1]>=A&&k[5][0]<=b&&k[5][2]){this.draw_read(w,r,n,A,b,k[5][0],k[5][2],k[5][3],g,c)}if(p>q){w.fillStyle=CONNECTOR_COLOR;w.dashedLine(q+f,g+5,f+p,g+5)}}else{w.fillStyle=z;this.draw_read(w,r,n,A,b,v,k[4],k[5],g,c)}if(r==="Pack"&&v>A){w.fillStyle=this.prefs.label_color;if((r==="Pack"||this.mode==="Auto")&&n>CHAR_WIDTH_PX){var t=Math.round(n/2)}if(y===0&&h-w.measureText(o).width<0){w.textAlign="left";w.fillText(o,j+f+LABEL_SPACING-t,g+8)}else{w.textAlign="right";w.fillText(o,h+f-LABEL_SPACING-t,g+8)}w.fillStyle=z}}});var ToolDataFeatureTrack=function(e,c,g,a,d,f,b){FeatureTrack.call(this,e,c,g,a,d,f,{},b);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};$.extend(ToolDataFeatureTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{predraw_init:function(){var b=this;var a=function(){if(b.data_cache.size()===0){setTimeout(a,300)}else{b.data_url=default_data_url;b.data_query_wait=DEFAULT_DATA_QUERY_WAIT;b.dataset_state_url=converted_datasets_state_url;$.getJSON(b.dataset_state_url,{dataset_id:b.dataset_id,hda_ldda:b.hda_ldda},function(c){})}};a()}});
\ No newline at end of file
--- a/static/scripts/trackster.js Fri Mar 11 15:57:06 2011 -0500
+++ b/static/scripts/trackster.js Fri Mar 11 17:54:06 2011 -0500
@@ -1067,47 +1067,45 @@
return;
}
- if ( track.view.chrom !== null ) {
- // Get dataset state; if state is fine, enable and draw track. Otherwise, show message
- // about track status.
- $.getJSON(converted_datasets_state_url, { hda_ldda: track.hda_ldda, dataset_id: track.dataset_id, chrom: track.view.chrom},
- function (result) {
- if (!result || result === "error" || result.kind === "error") {
- track.container_div.addClass("error");
- track.content_div.text(DATA_ERROR);
- if (result.message) {
- var track_id = track.view.tracks.indexOf(track);
- var error_link = $(" <a href='javascript:void(0);'></a>").text("View error").bind("click", function() {
- show_modal( "Trackster Error", "<pre>" + result.message + "</pre>", { "Close" : hide_modal } );
- });
- track.content_div.append(error_link);
- }
- } else if (result === "no converter") {
- track.container_div.addClass("error");
- track.content_div.text(DATA_NOCONVERTER);
- } else if (result === "no data" || (result.data !== undefined && (result.data === null || result.data.length === 0))) {
- track.container_div.addClass("nodata");
- track.content_div.text(DATA_NONE);
- } else if (result === "pending") {
- track.container_div.addClass("pending");
- track.content_div.text(DATA_PENDING);
- setTimeout(function() { track.init(); }, track.data_query_wait);
- } else if (result['status'] === "data") {
- if (result['valid_chroms']) {
- track.valid_chroms = result['valid_chroms'];
- track.make_name_popup_menu();
- }
- track.content_div.text(DATA_OK);
- if (track.view.chrom) {
- track.content_div.text("");
- track.content_div.css( "height", track.height_px + "px" );
- track.enabled = true;
- // predraw_init may be asynchronous, wait for it and then draw
- $.when( track.predraw_init() ).done( function() { track.draw() } );
- }
+ // Get dataset state; if state is fine, enable and draw track. Otherwise, show message
+ // about track status.
+ $.getJSON(converted_datasets_state_url, { hda_ldda: track.hda_ldda, dataset_id: track.dataset_id, chrom: track.view.chrom},
+ function (result) {
+ if (!result || result === "error" || result.kind === "error") {
+ track.container_div.addClass("error");
+ track.content_div.text(DATA_ERROR);
+ if (result.message) {
+ var track_id = track.view.tracks.indexOf(track);
+ var error_link = $(" <a href='javascript:void(0);'></a>").text("View error").bind("click", function() {
+ show_modal( "Trackster Error", "<pre>" + result.message + "</pre>", { "Close" : hide_modal } );
+ });
+ track.content_div.append(error_link);
}
- });
- }
+ } else if (result === "no converter") {
+ track.container_div.addClass("error");
+ track.content_div.text(DATA_NOCONVERTER);
+ } else if (result === "no data" || (result.data !== undefined && (result.data === null || result.data.length === 0))) {
+ track.container_div.addClass("nodata");
+ track.content_div.text(DATA_NONE);
+ } else if (result === "pending") {
+ track.container_div.addClass("pending");
+ track.content_div.text(DATA_PENDING);
+ setTimeout(function() { track.init(); }, track.data_query_wait);
+ } else if (result['status'] === "data") {
+ if (result['valid_chroms']) {
+ track.valid_chroms = result['valid_chroms'];
+ track.make_name_popup_menu();
+ }
+ track.content_div.text(DATA_OK);
+ if (track.view.chrom) {
+ track.content_div.text("");
+ track.content_div.css( "height", track.height_px + "px" );
+ track.enabled = true;
+ // predraw_init may be asynchronous, wait for it and then draw
+ $.when( track.predraw_init() ).done( function() { track.draw() } );
+ }
+ }
+ });
},
/**
* Additional initialization required before drawing track for the first time.
@@ -2779,6 +2777,10 @@
if ((mode === "Pack" || this.mode === "Auto") && orig_seq !== undefined && w_scale > CHAR_WIDTH_PX) {
gap = Math.round(w_scale/2);
}
+ if (!cigar) {
+ // If no cigar string, then assume all matches
+ cigar = [ [0, orig_seq.length] ]
+ }
for (var cig_id = 0, len = cigar.length; cig_id < len; cig_id++) {
var cig = cigar[cig_id],
cig_op = "MIDNSHP=X"[cig[0]],
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/760c981e0a8e/
changeset: r5218:760c981e0a8e
user: kanwei
date: 2011-03-11 21:57:06
summary: Include
affected #: 1 file (4 bytes)
--- a/lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.py Fri Mar 11 14:56:11 2011 -0500
+++ b/lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.py Fri Mar 11 15:57:06 2011 -0500
@@ -2,7 +2,7 @@
from __future__ import division
-import sys
+import sys, os
sys.stderr = open(os.devnull, 'w') # suppress stderr as cython produces warning on some systems:
# csamtools.so:6: RuntimeWarning: __builtin__.file size changed
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Per request from Peter Cock, turn the "Copy data into Galaxy?" check box into a select list that clarifies the behavior. The default is to copy files into Galaxy.
by Bitbucket 11 Mar '11
by Bitbucket 11 Mar '11
11 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/70d7d0bfaad6/
changeset: r5217:70d7d0bfaad6
user: greg
date: 2011-03-11 20:56:11
summary: Per request from Peter Cock, turn the "Copy data into Galaxy?" check box into a select list that clarifies the behavior. The default is to copy files into Galaxy.
affected #: 5 files (617 bytes)
--- a/lib/galaxy/tools/actions/upload_common.py Fri Mar 11 13:36:29 2011 -0500
+++ b/lib/galaxy/tools/actions/upload_common.py Fri Mar 11 14:56:11 2011 -0500
@@ -280,7 +280,7 @@
try:
link_data_only = uploaded_dataset.link_data_only
except:
- link_data_only = False
+ link_data_only = 'copy_files'
json = dict( file_type = uploaded_dataset.file_type,
ext = uploaded_dataset.ext,
name = uploaded_dataset.name,
--- a/lib/galaxy/web/controllers/library_common.py Fri Mar 11 13:36:29 2011 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Fri Mar 11 14:56:11 2011 -0500
@@ -717,7 +717,7 @@
space_to_tab = params.get( 'files_0|space_to_tab', '' )
else:
space_to_tab = params.get( 'space_to_tab', '' )
- link_data_only = params.get( 'link_data_only', '' )
+ link_data_only = params.get( 'link_data_only', 'copy_files' )
dbkey = params.get( 'dbkey', '?' )
if isinstance( dbkey, list ):
last_used_build = dbkey[0]
@@ -1044,8 +1044,9 @@
if in_folder:
uploaded_dataset.in_folder = in_folder
uploaded_dataset.data = upload_common.new_upload( trans, cntrller, uploaded_dataset, library_bunch )
- if params.get( 'link_data_only', False ):
- uploaded_dataset.link_data_only = True
+ link_data_only = params.get( 'link_data_only', 'copy_files' )
+ uploaded_dataset.link_data_only = link_data_only
+ if link_data_only == 'link_to_files':
uploaded_dataset.data.file_name = os.path.abspath( path )
# Since we are not copying the file into Galaxy's managed
# default file location, the dataset should never be purgable.
@@ -1059,7 +1060,8 @@
for entry in os.listdir( full_dir ):
# Only import regular files
path = os.path.join( full_dir, entry )
- if os.path.islink( full_dir ) and params.get( 'link_data_only', False ):
+ link_data_only = params.get( 'link_data_only', 'copy_files' )
+ if os.path.islink( full_dir ) and link_data_only == 'link_to_files':
# If we're linking instead of copying and the
# sub-"directory" in the import dir is actually a symlink,
# dereference the symlink, but not any of its contents.
@@ -1068,7 +1070,7 @@
path = os.path.join( link_path, entry )
else:
path = os.path.abspath( os.path.join( link_path, entry ) )
- elif os.path.islink( path ) and os.path.isfile( path ) and params.get( 'link_data_only', False ):
+ elif os.path.islink( path ) and os.path.isfile( path ) and link_data_only == 'link_to_files':
# If we're linking instead of copying and the "file" in the
# sub-directory of the import dir is actually a symlink,
# dereference the symlink (one dereference only, Vasili).
@@ -1146,7 +1148,7 @@
space_to_tab = params.get( 'files_0|space_to_tab', '' )
else:
space_to_tab = params.get( 'space_to_tab', '' )
- link_data_only = params.get( 'link_data_only', '' )
+ link_data_only = params.get( 'link_data_only', 'copy_files' )
dbkey = params.get( 'dbkey', '?' )
if isinstance( dbkey, list ):
last_used_build = dbkey[0]
--- a/templates/library/common/common.mako Fri Mar 11 13:36:29 2011 -0500
+++ b/templates/library/common/common.mako Fri Mar 11 14:56:11 2011 -0500
@@ -218,33 +218,33 @@
<input type="checkbox" name="preserve_dirs" value="Yes" checked="true" />Yes
</div><div class="toolParamHelp" style="clear: both;">
- If checked (default), library subfolders will be used to preserve any subdirectories on the filesystem.<br />
+ If checked (default), library sub-folders will be used to preserve any subdirectories on the filesystem.
If unchecked, any files in subdirectories on the filesystem will be placed directly in the library folder.
</div></div>
%endif
%if upload_option in ( 'upload_directory', 'upload_paths' ):
<div class="form-row">
- <%
- if link_data_only == 'No':
- checked = ' checked'
- else:
- checked = ''
- link_data_only_field = '<input type="checkbox" name="link_data_only" value="No"%s/>No' % checked
- %><label>Copy data into Galaxy?</label><div class="form-row-input">
- ${link_data_only_field}
+ <select name="link_data_only">
+ %if not link_data_only or link_data_only == 'copy_files':
+ <option value="copy_files" selected>Copy files into Galaxy
+ <option value="link_to_files">Link to files without copying into Galaxy
+ %else:
+ <option value="copy_files">Copy files into Galaxy
+ <option value="link_to_files" selected>Link to files without copying into Galaxy
+ %endif
+ </select></div><div class="toolParamHelp" style="clear: both;">
- Normally data uploaded with this tool is copied into Galaxy's "files" directory
- so any later changes to the data will not affect Galaxy. However, this may not
- be desired (especially for large NGS datasets), so use of this option will
- force Galaxy to always read the data from its original path.
+ Normally data uploaded with this tool is copied into Galaxy's configured "file_path" location where Galaxy
+ has a form of control over the data files. However, this may not be desired (especially for large NGS
+ datasets), so using the option labeled "Link to files without copying into Galaxy" will force Galaxy to
+ always read the data from its original path.
%if upload_option == 'upload_directory':
- Any symlinks encountered in the upload directory will be dereferenced once -
- that is, Galaxy will point directly to the file that is linked, but no other
- symlinks further down the line will be dereferenced.
+ Any symlinks encountered in the uploaded directory will be dereferenced once. That is, Galaxy will
+ point directly to the file that is linked, but no other symlinks further down the line will be dereferenced.
%endif
</div></div>
--- a/test/base/twilltestcase.py Fri Mar 11 13:36:29 2011 -0500
+++ b/test/base/twilltestcase.py Fri Mar 11 14:56:11 2011 -0500
@@ -2004,7 +2004,7 @@
# Library dataset stuff
def upload_library_dataset( self, cntrller, library_id, folder_id, filename='', server_dir='', replace_id='',
upload_option='upload_file', file_type='auto', dbkey='hg18', space_to_tab='',
- link_data_only='', preserve_dirs='Yes', roles=[], ldda_message='', hda_ids='',
+ link_data_only='copy_files', preserve_dirs='Yes', roles=[], ldda_message='', hda_ids='',
template_refresh_field_name='1_field_name', template_refresh_field_contents='', template_fields=[],
show_deleted='False', strings_displayed=[] ):
"""Add datasets to library using any upload_option"""
@@ -2031,10 +2031,6 @@
tc.fv( "1", "dbkey", dbkey )
if space_to_tab:
tc.fv( "1", "space_to_tab", space_to_tab )
- if link_data_only:
- tc.fv( "1", "link_data_only", link_data_only )
- if upload_option == 'filesystem_paths' and preserve_dirs == 'Yes':
- tc.fv( "1", "preserve_dirs", preserve_dirs )
for role_id in roles:
tc.fv( "1", "roles", role_id )
# Refresh the form by selecting the upload_option - we do this here to ensure
@@ -2051,18 +2047,21 @@
tc.fv( "add_history_datasets_to_library", "hda_ids", '1' )
tc.submit( 'add_history_datasets_to_library_button' )
else:
- if filename:
- filename = self.get_filename( filename )
- tc.formfile( "1", "files_0|file_data", filename )
- elif server_dir:
+ if upload_option == 'filesystem_paths' or upload_option == 'upload_directory':
+ tc.fv( "1", "link_data_only", link_data_only )
+ if upload_option == 'filesystem_paths' and preserve_dirs == 'Yes':
+ tc.fv( "1", "preserve_dirs", preserve_dirs )
+ if upload_option == 'upload_directory' and server_dir:
tc.fv( "1", "server_dir", server_dir )
+ if upload_option == 'upload_file':
+ if filename:
+ filename = self.get_filename( filename )
+ tc.formfile( "1", "files_0|file_data", filename )
for check_str in strings_displayed:
self.check_page_for_string( check_str )
tc.submit( "runtool_btn" )
# Give the files some time to finish uploading
self.library_wait( library_id )
- data = self.last_page()
- file( 'greg1.html', 'wb' ).write( data )
self.home()
def ldda_permissions( self, cntrller, library_id, folder_id, id, role_ids_str,
permissions_in=[], permissions_out=[], strings_displayed=[], ldda_name='' ):
--- a/tools/data_source/upload.py Fri Mar 11 13:36:29 2011 -0500
+++ b/tools/data_source/upload.py Fri Mar 11 14:56:11 2011 -0500
@@ -157,6 +157,7 @@
line_count = None
converted_path = None
stdout = None
+ link_data_only = dataset.get( 'link_data_only', 'copy_files' )
try:
ext = dataset.file_type
@@ -334,7 +335,7 @@
return
if data_type != 'binary':
# don't convert newlines on data we're only going to symlink
- if not dataset.get( 'link_data_only', False ):
+ if link_data_only == 'link_to_files':
in_place = True
if dataset.type in ( 'server_dir', 'path_paste' ):
in_place = False
@@ -353,9 +354,7 @@
if ext == 'auto':
ext = 'data'
# Move the dataset to its "real" path
- if dataset.get( 'link_data_only', False ):
- pass # data will remain in place
- elif dataset.type in ( 'server_dir', 'path_paste' ):
+ if link_data_only == 'copy_files' and dataset.type in ( 'server_dir', 'path_paste' ):
if converted_path is not None:
shutil.copy( converted_path, output_path )
try:
@@ -365,7 +364,7 @@
else:
# this should not happen, but it's here just in case
shutil.copy( dataset.path, output_path )
- else:
+ elif link_data_only == 'copy_files':
shutil.move( dataset.path, output_path )
# Write the job info
stdout = stdout or 'uploaded %s file' % data_type
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: kanwei: trackster: Suppress cython warning message causing bam_to_summary_tree to fail. Fix for chroms without 'chr' in front not being displayed
by Bitbucket 11 Mar '11
by Bitbucket 11 Mar '11
11 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/faf3b3fda8d6/
changeset: r5216:faf3b3fda8d6
user: kanwei
date: 2011-03-11 19:36:29
summary: trackster: Suppress cython warning message causing bam_to_summary_tree to fail. Fix for chroms without 'chr' in front not being displayed
affected #: 2 files (251 bytes)
--- a/lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.py Fri Mar 11 10:01:54 2011 -0500
+++ b/lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.py Fri Mar 11 13:36:29 2011 -0500
@@ -3,6 +3,9 @@
from __future__ import division
import sys
+sys.stderr = open(os.devnull, 'w') # suppress stderr as cython produces warning on some systems:
+ # csamtools.so:6: RuntimeWarning: __builtin__.file size changed
+
from galaxy import eggs
import pkg_resources
--- a/lib/galaxy/visualization/tracks/data_providers.py Fri Mar 11 10:01:54 2011 -0500
+++ b/lib/galaxy/visualization/tracks/data_providers.py Fri Mar 11 13:36:29 2011 -0500
@@ -170,7 +170,7 @@
self.CACHE[filename] = st
# Check for data.
- return st.chrom_blocks.get(chrom, None) is not None
+ return st.chrom_blocks.get(chrom, None) is not None or st.chrom_blocks.get(chrom[3:], None) is not None
class VcfDataProvider( TracksDataProvider ):
"""
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Apply a corrected version of the patch from Peter Cock that flips the  "Preserve directory structure?" setting when uploading library datasets from filesystem paths.
by Bitbucket 11 Mar '11
by Bitbucket 11 Mar '11
11 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/74c4dd43485a/
changeset: r5215:74c4dd43485a
user: greg
date: 2011-03-11 16:01:54
summary: Apply a corrected version of the patch from Peter Cock that flips the  "Preserve directory structure?" setting when uploading library datasets from filesystem paths.
affected #: 3 files (194 bytes)
--- a/lib/galaxy/web/controllers/library_common.py Fri Mar 11 09:16:16 2011 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Fri Mar 11 10:01:54 2011 -0500
@@ -1097,9 +1097,7 @@
message = "No paths entered in the upload form"
response_code = 400
return None, response_code, message
- preserve_dirs = True
- if params.get( 'dont_preserve_dirs', False ):
- preserve_dirs = False
+ preserve_dirs = util.string_as_bool( params.get( 'preserve_dirs', False ) )
# locate files
bad_paths = []
uploaded_datasets = []
--- a/templates/library/common/common.mako Fri Mar 11 09:16:16 2011 -0500
+++ b/templates/library/common/common.mako Fri Mar 11 10:01:54 2011 -0500
@@ -215,10 +215,11 @@
<div class="form-row"><label>Preserve directory structure?</label><div class="form-row-input">
- <input type="checkbox" name="dont_preserve_dirs" value="No"/>No
+ <input type="checkbox" name="preserve_dirs" value="Yes" checked="true" />Yes
</div><div class="toolParamHelp" style="clear: both;">
- If checked, all files in subdirectories on the filesystem will be placed at the top level of the folder, instead of into subfolders.
+ If checked (default), library subfolders will be used to preserve any subdirectories on the filesystem.<br />
+ If unchecked, any files in subdirectories on the filesystem will be placed directly in the library folder.
</div></div>
%endif
--- a/test/base/twilltestcase.py Fri Mar 11 09:16:16 2011 -0500
+++ b/test/base/twilltestcase.py Fri Mar 11 10:01:54 2011 -0500
@@ -2004,7 +2004,7 @@
# Library dataset stuff
def upload_library_dataset( self, cntrller, library_id, folder_id, filename='', server_dir='', replace_id='',
upload_option='upload_file', file_type='auto', dbkey='hg18', space_to_tab='',
- link_data_only='', dont_preserve_dirs='', roles=[], ldda_message='', hda_ids='',
+ link_data_only='', preserve_dirs='Yes', roles=[], ldda_message='', hda_ids='',
template_refresh_field_name='1_field_name', template_refresh_field_contents='', template_fields=[],
show_deleted='False', strings_displayed=[] ):
"""Add datasets to library using any upload_option"""
@@ -2033,8 +2033,8 @@
tc.fv( "1", "space_to_tab", space_to_tab )
if link_data_only:
tc.fv( "1", "link_data_only", link_data_only )
- if dont_preserve_dirs:
- tc.fv( "1", "dont_preserve_dirs", dont_preserve_dirs )
+ if upload_option == 'filesystem_paths' and preserve_dirs == 'Yes':
+ tc.fv( "1", "preserve_dirs", preserve_dirs )
for role_id in roles:
tc.fv( "1", "roles", role_id )
# Refresh the form by selecting the upload_option - we do this here to ensure
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Apply patch from Ry4an Brase to correct "NoneType dereference on the jobs view" issue.
by Bitbucket 11 Mar '11
by Bitbucket 11 Mar '11
11 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/0b9bba943c8f/
changeset: r5214:0b9bba943c8f
user: greg
date: 2011-03-11 15:16:16
summary: Apply patch from Ry4an Brase to correct "NoneType dereference on the jobs view" issue.
affected #: 1 file (16 bytes)
--- a/templates/admin/jobs.mako Thu Mar 10 17:30:35 2011 -0500
+++ b/templates/admin/jobs.mako Fri Mar 11 09:16:16 2011 -0500
@@ -47,7 +47,7 @@
%endif
</td><td>${job.id}</td>
- %if job.history.user:
+ %if job.history and job.history.user:
<td>${job.history.user.email}</td>
%else:
<td>anonymous</td>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Trackster: access to datasets is based on accessibility, not ownership.
by Bitbucket 10 Mar '11
by Bitbucket 10 Mar '11
10 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/620da901f5b1/
changeset: r5213:620da901f5b1
user: jgoecks
date: 2011-03-10 23:30:35
summary: Trackster: access to datasets is based on accessibility, not ownership.
affected #: 1 file (230 bytes)
--- a/lib/galaxy/web/controllers/tracks.py Thu Mar 10 16:42:34 2011 -0500
+++ b/lib/galaxy/web/controllers/tracks.py Thu Mar 10 17:30:35 2011 -0500
@@ -408,7 +408,7 @@
"""
# Dataset check.
- dataset = self.get_dataset( trans, dataset_id )
+ dataset = self.get_dataset( trans, dataset_id, check_ownership=False, check_accessible=True )
msg = self._check_dataset_state( trans, dataset )
if msg:
return msg
@@ -426,7 +426,7 @@
# TODO: this code is copied from data() -- should refactor.
# Dataset check.
- dataset = self.get_dataset( trans, dataset_id )
+ dataset = self.get_dataset( trans, dataset_id, check_ownership=False, check_accessible=True )
msg = self._check_dataset_state( trans, dataset )
if not msg:
msg = messages.DATA
@@ -443,7 +443,7 @@
# Dataset check.
if hda_ldda == "hda":
- dataset = self.get_dataset( trans, dataset_id )
+ dataset = self.get_dataset( trans, dataset_id, check_ownership=False, check_accessible=True )
else:
dataset = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( trans.security.decode_id( dataset_id ) )
msg = self._check_dataset_state( trans, dataset )
@@ -488,7 +488,7 @@
# Dataset check.
if hda_ldda == "hda":
- dataset = self.get_dataset( trans, dataset_id )
+ dataset = self.get_dataset( trans, dataset_id, check_ownership=False, check_accessible=True )
else:
dataset = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( trans.security.decode_id( dataset_id ) )
msg = self._check_dataset_state( trans, dataset )
@@ -656,7 +656,7 @@
low, high = int( low ), int( high )
# Dataset check.
- original_dataset = self.get_dataset( trans, dataset_id )
+ original_dataset = self.get_dataset( trans, dataset_id, check_ownership=False, check_accessible=True )
msg = self._check_dataset_state( trans, original_dataset )
if msg:
return to_json_string( msg )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Make shared visualizations work again and pack trackster.js
by Bitbucket 10 Mar '11
by Bitbucket 10 Mar '11
10 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/52ead6780d84/
changeset: r5212:52ead6780d84
user: jgoecks
date: 2011-03-10 22:42:34
summary: Make shared visualizations work again and pack trackster.js
affected #: 4 files (4.0 KB)
--- a/lib/galaxy/web/controllers/visualization.py Thu Mar 10 16:11:49 2011 -0500
+++ b/lib/galaxy/web/controllers/visualization.py Thu Mar 10 16:42:34 2011 -0500
@@ -68,7 +68,9 @@
return query.filter( self.model_class.deleted==False ).filter( self.model_class.published==True )
-class VisualizationController( BaseController, Sharable, UsesAnnotations, UsesVisualization, UsesItemRatings ):
+class VisualizationController( BaseController, Sharable, UsesAnnotations,
+ UsesHistoryDatasetAssociation, UsesVisualization,
+ UsesItemRatings ):
_user_list_grid = VisualizationListGrid()
_published_list_grid = VisualizationAllPublishedGrid()
--- a/static/scripts/packed/trackster.js Thu Mar 10 16:11:49 2011 -0500
+++ b/static/scripts/packed/trackster.js Thu Mar 10 16:42:34 2011 -0500
@@ -1,1 +1,1 @@
-CanvasRenderingContext2D.prototype.dashedLine=function(c,j,b,h,f){if(f===undefined){f=4}var e=b-c;var d=h-j;var g=Math.floor(Math.sqrt(e*e+d*d)/f);var l=e/g;var k=d/g;var a;for(a=0;a<g;a++,c+=l,j+=k){if(a%2!==0){continue}this.fillRect(c,j,f,1)}};CanvasRenderingContext2D.prototype.drawDownwardEquilateralTriangle=function(b,a,e){var d=b-e/2,c=b+e/2,f=a-Math.sqrt(e*3/2);this.beginPath();this.moveTo(d,f);this.lineTo(c,f);this.lineTo(b,a);this.lineTo(d,f);this.strokeStyle=this.fillStyle;this.fill();this.stroke();this.closePath()};function sortable(a,b){a.bind("drag",{handle:b,relative:true},function(h,j){var g=$(this).parent();var f=g.children();var c;for(c=0;c<f.length;c++){if(j.offsetY<$(f.get(c)).position().top){break}}if(c===f.length){if(this!==f.get(c-1)){g.append(this)}}else{if(this!==f.get(c)){$(this).insertBefore(f.get(c))}}})}var NO_OVERLAP=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005;function compute_overlap(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=NO_OVERLAP}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=NO_OVERLAP}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a}function is_overlap(b,a){return(compute_overlap(b,a)!==NO_OVERLAP)}var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=1,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,ERROR_PADDING=10,LABEL_SPACING=2,PACK_SPACING=5,MIN_SQUISH_VIEW_WIDTH=12000,DEFAULT_FONT="9px Monaco, Lucida Console, monospace",DENSITY=200,FEATURE_LEVELS=10,MAX_FEATURE_DEPTH=100,DEFAULT_DATA_QUERY_WAIT=5000,MAX_CHROMS_SELECTABLE=100,CONNECTOR_COLOR="#ccc",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_CANNOT_RUN_TOOL="Tool cannot be rerun: ",DATA_LOADING="Loading data...",DATA_OK="Ready for display",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=5,CACHED_DATA=5,DUMMY_CANVAS=document.createElement("canvas"),RIGHT_STRAND,LEFT_STRAND;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(DUMMY_CANVAS)}var CONTEXT=DUMMY_CANVAS.getContext("2d");CONTEXT.font=DEFAULT_FONT;var CHAR_WIDTH_PX=CONTEXT.measureText("A").width,CHAR_HEIGHT_PX=9;var right_img=new Image();right_img.src=image_path+"/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src=image_path+"/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=image_path+"/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=image_path+"/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function round_1000(a){return Math.round(a*1000)/1000}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.move_key_to_end(b,a)}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},move_key_to_end:function(b,a){this.key_ary.splice(a,1);this.key_ary.push(b)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var DataCache=function(a){Cache.call(this,a)};$.extend(DataCache.prototype,Cache.prototype,{get_data:function(g,b,e){var h=this.get(this.gen_key(g,b,e));if(h){return h}var j,f,a,d,e,h;for(var c=0;c<this.key_ary.length;c++){j=this.key_ary[c];f=this.split_key(j);a=f[0];d=f[1];if(g>=a&&b<=d){h=this.obj_cache[j];if(h.dataset_type!=="summary_tree"&&h.extra_info!=="no_detail"){this.move_key_to_end(j,c);return h}}}return undefined},set_data:function(b,c,d,a){return this.set(this.gen_key(b,c,d),a)},gen_key:function(a,c,d){var b=a+"_"+c+"_"+d;return b},split_key:function(a){return a.split("_")}});var View=function(a,d,c,b,e){this.container=a;this.chrom=null;this.vis_id=c;this.dbkey=b;this.title=d;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.num_tracks=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.init(e);this.reset()};$.extend(View.prototype,{init:function(d){var c=this.container,a=this;this.top_container=$("<div/>").addClass("top-container").appendTo(c);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(c);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(c);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").addClass("viewport-container").appendTo(this.content_div);this.intro_div=$("<div/>").addClass("intro").text("Select a chrom from the dropdown below").hide();this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a href='javascript:void(0);'>Close Overview</a>").addClass("overview-close").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var b=function(f){if(f.type==="focusout"||(f.keyCode||f.which)===13||(f.keyCode||f.which)===27){if((f.keyCode||f.which)!==27){a.go_to($(this).val())}$(this).hide();a.location_span.show();a.chrom_select.show();return false}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",b).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){a.location_span.hide();a.chrom_select.hide();a.nav_input.css("display","inline-block");a.nav_input.select();a.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){a.zoom_out();a.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){a.zoom_in();a.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},d);this.chrom_select.bind("change",function(){a.change_chrom(a.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(f){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(f){a.zoom_in(f.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(f,g){this.current_x=g.offsetX}).bind("drag",function(f,h){var j=h.offsetX-this.current_x;this.current_x=h.offsetX;var g=Math.round(j/a.viewport_container.width()*(a.max_high-a.max_low));a.move_delta(-g)});this.overview_close.bind("click",function(){for(var f=0,e=a.tracks.length;f<e;f++){a.tracks[f].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",a.overview_box.height());a.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(f,g){if(f.clientX>a.viewport_container.width()-16){return false}}).bind("dragstart",function(f,g){g.original_low=a.low;g.current_height=f.clientY;g.current_x=g.offsetX}).bind("drag",function(h,k){var f=$(this);var l=k.offsetX-k.current_x;var g=f.scrollTop()-(h.clientY-k.current_height);f.scrollTop(g);k.current_height=h.clientY;k.current_x=k.offsetX;var j=Math.round(l/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}).bind("mousewheel",function(h,k,g,f){if(g){var j=Math.round(-g/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}});this.top_labeltrack.bind("dragstart",function(f,g){return $("<div />").css({height:a.content_div.height()+a.top_labeltrack.height()+a.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(k,l){$(l.proxy).css({left:Math.min(k.pageX,l.startX),width:Math.abs(k.pageX-l.startX)});var g=Math.min(k.pageX,l.startX)-a.container.offset().left,f=Math.max(k.pageX,l.startX)-a.container.offset().left,j=(a.high-a.low),h=a.viewport_container.width();a.update_location(Math.round(g/h*j)+a.low,Math.round(f/h*j)+a.low)}).bind("dragend",function(l,m){var g=Math.min(l.pageX,m.startX),f=Math.max(l.pageX,m.startX),j=(a.high-a.low),h=a.viewport_container.width(),k=a.low;a.low=Math.round(g/h*j)+k;a.high=Math.round(f/h*j)+k;$(m.proxy).remove();a.redraw()});this.add_label_track(new LabelTrack(this,this.top_labeltrack));this.add_label_track(new LabelTrack(this,this.nav_labeltrack));$(window).bind("resize",function(){a.resize_window()});$(document).bind("redraw",function(){a.redraw()});this.reset();$(window).trigger("resize")},update_location:function(a,b){this.location_span.text(commatize(a)+" - "+commatize(b));this.nav_input.val(this.chrom+":"+commatize(a)+"-"+commatize(b))},load_chroms:function(b,c){b.num=MAX_CHROMS_SELECTABLE;$.extend(b,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var a=this;$.ajax({url:chrom_url,data:b,dataType:"json",success:function(e){if(e.reference){a.add_label_track(new ReferenceTrack(a))}a.chrom_data=e.chrom_info;var h='<option value="">Select Chrom/Contig</option>';for(var g=0,d=a.chrom_data.length;g<d;g++){var f=a.chrom_data[g].chrom;h+='<option value="'+f+'">'+f+"</option>"}if(e.prev_chroms){h+='<option value="previous">Previous '+MAX_CHROMS_SELECTABLE+"</option>"}if(e.next_chroms){h+='<option value="next">Next '+MAX_CHROMS_SELECTABLE+"</option>"}a.chrom_select.html(h);if(c){c()}a.chrom_start_index=e.start_index},error:function(){alert("Could not load chroms for this dbkey:",a.dbkey)}})},change_chrom:function(e,b,g){if(!e||e==="None"){return}var d=this;if(e==="previous"){d.load_chroms({low:this.chrom_start_index-MAX_CHROMS_SELECTABLE});return}if(e==="next"){d.load_chroms({low:this.chrom_start_index+MAX_CHROMS_SELECTABLE});return}var f=$.grep(d.chrom_data,function(j,k){return j.chrom===e})[0];if(f===undefined){d.load_chroms({chrom:e},function(){d.change_chrom(e,b,g)});return}else{if(e!==d.chrom){d.chrom=e;if(!d.chrom){d.intro_div.show()}else{d.intro_div.hide()}d.chrom_select.val(d.chrom);d.max_high=f.len-1;d.reset();d.redraw(true);for(var h=0,a=d.tracks.length;h<a;h++){var c=d.tracks[h];if(c.init){c.init()}}}if(b!==undefined&&g!==undefined){d.low=Math.max(b,0);d.high=Math.min(g,d.max_high)}d.reset_overview();d.redraw()}},go_to:function(f){var k=this,a,d,b=f.split(":"),h=b[0],j=b[1];if(j!==undefined){try{var g=j.split("-");a=parseInt(g[0].replace(/,/g,""),10);d=parseInt(g[1].replace(/,/g,""),10)}catch(c){return false}}k.change_chrom(h,a,d)},move_fraction:function(c){var a=this;var b=a.high-a.low;this.move_delta(c*b)},move_delta:function(c){var a=this;var b=a.high-a.low;if(a.low-c<a.max_low){a.low=a.max_low;a.high=a.max_low+b}else{if(a.high-c>a.max_high){a.high=a.max_high;a.low=a.max_high-b}else{a.high-=c;a.low-=c}}a.redraw()},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);sortable(a.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=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)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(h){var g=this.high-this.low,f=this.low,b=this.high;if(f<this.max_low){f=this.max_low}if(b>this.max_high){b=this.max_high}if(this.high!==0&&g<this.min_separation){b=f+this.min_separation}this.low=Math.floor(f);this.high=Math.ceil(b);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))));var a=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var e=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var j=13;this.overview_box.css({left:a,width:Math.max(j,e)}).show();if(e<j){this.overview_box.css("left",a-(j-e)/2)}if(this.overview_highlight){this.overview_highlight.css({left:a,width:e})}this.update_location(this.low,this.high);if(!h){for(var c=0,d=this.tracks.length;c<d;c++){if(this.tracks[c]&&this.tracks[c].enabled){this.tracks[c].draw()}}for(c=0,d=this.label_tracks.length;c<d;c++){this.label_tracks[c].draw()}}},zoom_in:function(b,c){if(this.max_high===0||this.high-this.low<this.min_separation){return}var d=this.high-this.low,e=d/2+this.low,a=(d/this.zoom_factor)/2;if(b){e=b/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(e-a);this.high=Math.round(e+a);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var b=this.high-this.low,c=b/2+this.low,a=(b*this.zoom_factor)/2;this.low=Math.round(c-a);this.high=Math.round(c+a);this.redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.nav_container.width(this.container.width());this.redraw()},reset_overview:function(){this.overview_viewport.find("canvas").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide()}});var Tool=function(a,b){this.name=a;this.params=b};$.extend(Tool.prototype,{get_param_values_dict:function(){var b={};for(var a=0;a<this.params.length;a++){var c=this.params[a];b[c.name]=c.value}return b},get_param_values:function(){var b=[];for(var a=0;a<this.params.length;a++){b[a]=this.params[a].value}return b}});var NumberToolParameter=function(c,b,e,a,d){this.name=c;this.label=b;this.min=e;this.max=a;this.value=d};var get_tool_from_dict=function(f){if(obj_length(f)===0){return undefined}var b=f.name;var l=f.params;var c=Array();for(var e=0;e<l.length;e++){var g=l[e];var a=g.name,k=g.label,h=g.type,d=g.min,j=g.max,m=g.value;c[c.length]=new NumberToolParameter(a,k,d,j,m)}return new Tool(b,c)};var Filter=function(b,a,c){this.name=b;this.index=a;this.value=c};var NumberFilter=function(b,a){this.name=b;this.index=a;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.slider_min=Number.MAX_VALUE;this.slider_max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};$.extend(NumberFilter.prototype,{applies_to:function(a){if(a.length>this.index){return true}return false},keep:function(a){if(!this.applies_to(a)){return true}return(a[this.index]>=this.low&&a[this.index]<=this.high)},update_attrs:function(b){var a=false;if(!this.applies_to(b)){return a}if(b[this.index]<this.slider_min){this.slider_min=b[this.index];a=true}if(b[this.index]>this.slider_max){this.slider_max=b[this.index];a=false}return a},update_ui_elt:function(){var b=this.slider.slider("option","min"),a=this.slider.slider("option","max");if(this.slider_min<b||this.slider_max>a){this.slider.slider("option","min",this.slider_min);this.slider.slider("option","max",this.slider_max);this.slider.slider("option","values",[this.slider_min,this.slider_max])}}});var get_filters_from_dict=function(a){var g=[];for(var d=0;d<a.length;d++){var f=a[d];var c=f.name,e=f.type,b=f.index;if(e==="int"||e==="float"){g[d]=new NumberFilter(c,b)}else{g[d]=new Filter(c,b,e)}}return g};var TrackConfig=function(a){this.track=a.track;this.params=a.params;this.values={};if(a.saved_values){this.restore_values(a.saved_values)}this.onchange=a.onchange};$.extend(TrackConfig.prototype,{restore_values:function(a){var b=this;$.each(this.params,function(c,d){if(a[d.key]!==undefined){b.values[d.key]=a[d.key]}else{b.values[d.key]=d.default_value}})},build_form:function(){var b=this;var a=$("<div />");$.each(this.params,function(f,d){if(!d.hidden){var c="param_"+f;var l=$("<div class='form-row' />").appendTo(a);l.append($("<label />").attr("for",c).text(d.label+":"));if(d.type==="bool"){l.append($('<input type="checkbox" />').attr("id",c).attr("name",c).attr("checked",b.values[d.key]))}else{if(d.type==="color"){var h=b.values[d.key];var g=$("<input />").attr("id",c).attr("name",c).val(h);var j=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var e=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(j);var k=$("<div/>").appendTo(e).farbtastic({width:100,height:100,callback:g,color:h});$("<div />").append(g).append(j).appendTo(l).bind("click",function(m){j.css({left:$(this).position().left+($(g).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){j.hide();$(document).unbind("click.color-picker")});m.stopPropagation()})}else{l.append($("<input />").attr("id",c).attr("name",c).val(b.values[d.key]))}}}});return a},update_from_form:function(a){var c=this;var b=false;$.each(this.params,function(d,f){if(!f.hidden){var g="param_"+d;var e=a.find("#"+g).val();if(f.type==="float"){e=parseFloat(e)}else{if(f.type==="int"){e=parseInt(e)}else{if(f.type==="bool"){e=a.find("#"+g).is(":checked")}}}if(e!==c.values[f.key]){c.values[f.key]=e;b=true}}});if(b){this.onchange()}}});var Track=function(b,a,e,c,d){this.name=b;this.view=a;this.parent_element=e;this.data_url=(c?c:default_data_url);this.data_query_wait=(d?d:DEFAULT_DATA_QUERY_WAIT);this.dataset_check_url=converted_datasets_state_url;this.container_div=$("<div />").addClass("track").css("position","relative");if(!this.hidden){this.header_div=$("<div class='track-header' />").appendTo(this.container_div);if(this.view.editor){this.drag_div=$("<div class='draghandle' />").appendTo(this.header_div)}this.name_div=$("<div class='menubutton popup' />").appendTo(this.header_div);this.name_div.text(this.name);this.name_div.attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase())}this.content_div=$("<div class='track-content'>").appendTo(this.container_div);this.parent_element.append(this.container_div)};$.extend(Track.prototype,{init:function(){var a=this;a.enabled=false;a.tile_cache.clear();a.data_cache.clear();a.initial_canvas=undefined;a.content_div.css("height","auto");a.container_div.removeClass("nodata error pending");if(!a.dataset_id){return}if(a.view.chrom!==null){$.getJSON(converted_datasets_state_url,{hda_ldda:a.hda_ldda,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(!b||b==="error"||b.kind==="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR);if(b.message){var d=a.view.tracks.indexOf(a);var c=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+b.message+"</pre>",{Close:hide_modal})});a.content_div.append(c)}}else{if(b==="no converter"){a.container_div.addClass("error");a.content_div.text(DATA_NOCONVERTER)}else{if(b==="no data"||(b.data!==undefined&&(b.data===null||b.data.length===0))){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b==="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},a.data_query_wait)}else{if(b.status==="data"){if(b.valid_chroms){a.valid_chroms=b.valid_chroms;a.make_name_popup_menu()}a.content_div.text(DATA_OK);if(a.view.chrom){a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.enabled=true;$.when(a.predraw_init()).done(function(){a.draw()})}}}}}}})}},predraw_init:function(){},update_name:function(a){this.old_name=this.name;this.name=a;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var TiledTrack=function(b,j,n){var c=this,o=c.view;this.filters=(b!==undefined?get_filters_from_dict(b):[]);this.filters_available=false;this.filters_visible=false;this.tool=(j!==undefined?get_tool_from_dict(j):undefined);this.parent_track=n;this.child_tracks=[];if(c.hidden){return}if(this.parent_track){this.header_div.find(".draghandle").removeClass("draghandle").addClass("child-track-icon").addClass("icon-button");this.parent_element.addClass("child-track");this.tool=undefined}this.filters_div=$("<div/>").addClass("filters").hide();this.header_div.after(this.filters_div);this.filters_div.bind("drag",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});$.each(this.filters,function(t,w){var u=$("<div/>").addClass("slider-row").appendTo(c.filters_div);var v=$("<div/>").addClass("slider-label").appendTo(u);var s=$("<span/>").addClass("name").appendTo(v);s.text(w.name+" ");var r=$("<span/>").addClass("values").appendTo(v);var q=$("<div/>").addClass("slider").appendTo(u);w.control_element=$("<div/>").attr("id",w.name+"-filter-control").appendTo(q);w.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(y,z){var x=z.values;r.text("["+x[0]+"-"+x[1]+"]");w.low=x[0];w.high=x[1];c.draw(true,true)},change:function(x,y){w.control_element.slider("option","slide").call(w.control_element,x,y)}});w.slider=w.control_element;w.slider_label=r;$("<div style='clear: both;'/>").appendTo(u)});if(this.tool){this.dynamic_tool_div=$("<div/>").addClass("dynamic-tool").hide();this.header_div.after(this.dynamic_tool_div);this.dynamic_tool_div.bind("drag",function(q){q.stopPropagation()}).bind("click",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});var m=$("<div class='tool-name'>").appendTo(this.dynamic_tool_div).text(this.tool.name);var l=this.tool.params;var c=this;$.each(this.tool.params,function(x,s){var v=$("<div>").addClass("slider-row").appendTo(c.dynamic_tool_div);var u=$("<div>").addClass("slider-label").appendTo(v);var z=$("<span class='param-name'>").text(s.label+" ").appendTo(u);var t=$("<span/>").text(s.value);var w=$("<span class='param-value'>").appendTo(u).append("[").append(t).append("]");var y=$("<div/>").addClass("slider").appendTo(v);var q=$("<div id='"+s.name+"-param-control'>").appendTo(y);var r=(s.max<=1?0.01:(s.max<=1000?1:5));q.slider({min:s.min,max:s.max,step:r,value:s.value,slide:function(A,C){var B=C.value;s.value=B;if(0<B&&B<1){B=parseFloat(B).toFixed(2)}t.text(B)},change:function(A,B){s.value=B.value}});w.click(function(){var C=t,B=C.text(),A=(s.max<=1?4:s.max.length);C.text("");$("<input type='text'/>").attr("size",A).attr("maxlength",A).attr("value",B).appendTo(C).focus().select().click(function(D){D.stopPropagation()}).blur(function(){$(this).remove();C.text(B)}).keyup(function(F){if(F.keyCode===27){$(this).trigger("blur")}else{if(F.keyCode===13){var D=$(this),E=parseFloat(D.val());if(isNaN(E)||E>s.max||E<s.min){alert("Parameter value must be in the range ["+s.min+"-"+s.max+"]");return $(this)}C.text(E);q.slider("value",E);s.value=E}}})});$("<div style='clear: both;'/>").appendTo(v)});var p=$("<div>").addClass("slider-row").appendTo(this.dynamic_tool_div);var k=$("<input type='submit'>").attr("value","Run").appendTo(p);var c=this;k.click(function(){c.run_tool()})}c.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();c.container_div.append(c.child_tracks_container);if(c.display_modes!==undefined){if(c.mode_div===undefined){c.mode_div=$("<div class='right-float menubutton popup' />").appendTo(c.header_div);var e=(c.track_config&&c.track_config.values.mode?c.track_config.values.mode:c.display_modes[0]);c.mode=e;c.mode_div.text(e);var d=function(q){c.mode_div.text(q);c.mode=q;c.track_config.values.mode=q;c.tile_cache.clear();c.draw()};var a={};for(var f=0,h=c.display_modes.length;f<h;f++){var g=c.display_modes[f];a[g]=function(q){return function(){d(q)}}(g)}make_popupmenu(c.mode_div,a)}else{c.mode_div.hide()}}this.make_name_popup_menu()};$.extend(TiledTrack.prototype,Track.prototype,{make_name_popup_menu:function(){var b=this;var a={};a["Edit configuration"]=function(){var h=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},f=function(){b.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},g=function(j){if((j.keyCode||j.which)===27){h()}else{if((j.keyCode||j.which)===13){f()}}};$(window).bind("keypress.check_enter_esc",g);show_modal("Configure Track",b.track_config.build_form(),{Cancel:h,OK:f})};if(b.filters_available>0){var e=(b.filters_div.is(":visible")?"Hide filters":"Show filters");a[e]=function(){b.filters_visible=(b.filters_div.is(":visible"));b.filters_div.toggle();b.make_name_popup_menu()}}if(b.tool){var e=(b.dynamic_tool_div.is(":visible")?"Hide Tool":"Show Tool");a[e]=function(){if(!b.dynamic_tool_div.is(":visible")){b.update_name(b.name+b.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";b.revert_name()}b.dynamic_tool_div.toggle();b.make_name_popup_menu()}}if(b.track_type=="ReadTrack"){var e=(b.show_insertions?"Hide Insertions":"Show Insertions");a[e]=function(){b.show_insertions=!b.show_insertions;b.draw(true);b.make_name_popup_menu()}}if(b.valid_chroms){a["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+b.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var c=view;var d=function(){$("#no-tracks").show()};if(this.parent_track){c=this.parent_track;d=function(){}}a.Remove=function(){c.remove_track(b);if(c.num_tracks===0){d()}};make_popupmenu(b.name_div,a)},tile_data:function(d,a,g,k,j){var b=this,h=a*DENSITY*d,f=(a+1)*DENSITY*d,e={chrom:this.view.chrom,low:h,high:f,dbkey:this.view.dbkey};if(j===undefined){j=d+"_"+a}var c=b.data_cache.get(j);if(c){return k(c)}$.extend(e,g);$.ajax({url:this.data_url,dataType:"json",data:e,success:function(l){b.data_cache.set(j,l);return k(l)},error:function(m,l,n){console.log(m,l,n)}})},draw:function(a,d){var s=this.view.low,g=this.view.high,j=g-s,l=this.view.container.width(),m=this.view.resolution;var e=$("<div style='position: relative;'></div>"),f=l/j;if(!d){this.content_div.children().remove()}this.content_div.append(e);this.max_height=0;var o=Math.floor(s/m/DENSITY);var c={};while((o*DENSITY*m)<g){var r=l+"_"+f+"_"+o;var h=this.tile_cache.get(r);var p=o*DENSITY*this.view.resolution;var b=p+DENSITY*this.view.resolution;if(!a&&h){this.show_tile(h,e,p,f)}else{this.delayed_draw(a,r,p,b,o,m,e,f,c)}o+=1}if(d){var k=this;var q=setInterval(function(){console.log("draw_tile_dict_length:",obj_length(c));if(obj_length(c)===0){var v=k.content_div.children();var u=false;for(var w=v.length-1,t=0;w>=t;w--){var x=$(v[w]);if(u){x.remove()}else{if(x.children().length!==0){u=true}}}clearInterval(q)}},50)}for(var n=0;n<this.child_tracks.length;n++){this.child_tracks[n].draw(a,d)}},delayed_draw:function(b,j,h,l,c,e,k,m,f){var d=this;var g=function(n){d.tile_cache.set(j,n);d.show_tile(n,k,h,m)};var a=setTimeout(function(){if(h<=d.view.high&&l>=d.view.low){var n;if(!b){n=d.tile_cache.get(j)}if(!n){d.draw_tile(e,c,k,m,function(p){if(p){var o=$("<div class='track-tile'>").prepend(p);n=o}g(n)})}if(n){g(n)}}delete f[a]},50);f[a]=true},show_tile:function(h,j,e,k){var a=this;var c=this.view.high-this.view.low,b=(e-this.view.low)*k;if(this.left_offset){b-=this.left_offset}h.css({position:"absolute",top:0,left:b,height:""});j.append(h);a.max_height=Math.max(a.max_height,h.height());a.content_div.css("height",a.max_height+"px");j.children().css("height",a.max_height+"px");if(a.hidden){return}for(var g=0;g<a.filters.length;g++){a.filters[g].update_ui_elt()}var d=false;if(a.example_feature){for(var g=0;g<a.filters.length;g++){if(a.filters[g].applies_to(a.example_feature)){d=true;break}}}if(a.filters_available!==d){a.filters_available=d;if(!a.filters_available){a.filters_div.hide()}a.make_name_popup_menu()}},set_overview:function(){var a=this.view;if(this.initial_canvas&&this.is_overview){a.overview_close.show();a.overview_viewport.append(this.initial_canvas);a.overview_highlight.show().height(this.initial_canvas.height());a.overview_viewport.height(this.initial_canvas.height()+a.overview_box.height())}$(window).trigger("resize")},run_tool:function(){var b={dataset_id:this.original_dataset_id,chrom:this.view.chrom,low:this.view.low,high:this.view.high,tool_id:this.tool.name};$.extend(b,this.tool.get_param_values_dict());var d=this,c=b.tool_id+d.tool_region_and_parameters_str(b.chrom,b.low,b.high),e;if(d.track_type==="FeatureTrack"){e=new ToolDataFeatureTrack(c,view,d.hda_ldda,undefined,{},{},d)}this.add_track(e);e.content_div.text("Starting job.");view.has_changes=true;var a=function(){$.getJSON(run_tool_url,b,function(f){if(f==="no converter"){e.container_div.addClass("error");e.content_div.text(DATA_NOCONVERTER)}else{if(f.error){e.container_div.addClass("error");e.content_div.text(DATA_CANNOT_RUN_TOOL+f.message)}else{if(f==="pending"){e.container_div.addClass("pending");e.content_div.text("Converting input data so that it can be easily reused.");setTimeout(a,2000)}else{e.dataset_id=f.dataset_id;e.content_div.text("Running job.");e.init()}}}})};a()},tool_region_and_parameters_str:function(c,a,d){var b=this,e=(c!==undefined&&a!==undefined&&d!==undefined?c+":"+a+"-"+d:"all");return" - region=["+e+"], parameters=["+b.tool.get_param_values().join(", ")+"]"},add_track:function(a){a.track_id=this.track_id+"_"+this.child_tracks.length;a.container_div.attr("id","track_"+a.track_id);this.child_tracks_container.append(a.container_div);sortable(a.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(a)},remove_track:function(a){a.container_div.fadeOut("slow",function(){$(this).remove()})}});var LabelTrack=function(a,b){this.track_type="LabelTrack";this.hidden=true;Track.call(this,null,a,b);this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.view.container.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var ReferenceTrack=function(a){this.track_type="ReferenceTrack";this.hidden=true;Track.call(this,null,a,a.top_labeltrack);TiledTrack.call(this);a.reference_track=this;this.left_offset=200;this.height_px=12;this.font=DEFAULT_FONT;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_url=reference_url;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE)};$.extend(ReferenceTrack.prototype,TiledTrack.prototype,{draw_tile:function(c,b,e,g,f){var a=this,d=DENSITY*c;if(g>CHAR_WIDTH_PX){a.tile_data(c,b,{},function(j){if(j===null){a.content_div.css("height","0px");return}var k=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(k)}k=$(k);var h=k.get(0).getContext("2d");k.get(0).width=Math.ceil(d*g+a.left_offset);k.get(0).height=a.height_px;h.font=DEFAULT_FONT;h.textAlign="center";for(var n=0,l=j.length;n<l;n++){var m=Math.round(n*g);h.fillText(j[n],m+a.left_offset,10)}return f(k)})}this.content_div.css("height","0px")}});var LineTrack=function(e,c,f,a,d){var b=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";Track.call(this,e,c,c.viewport_container);TiledTrack.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=f;this.dataset_id=a;this.original_dataset_id=a;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE);this.track_config=new TrackConfig({track:this,params:[{key:"color",label:"Color",type:"color",default_value:"black"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.height_px,hidden:true}],saved_values:d,onchange:function(){b.vertical_range=b.prefs.max_value-b.prefs.min_value;$("#linetrack_"+b.track_id+"_minval").text(b.prefs.min_value);$("#linetrack_"+b.track_id+"_maxval").text(b.prefs.max_value);b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;this.height_px=this.track_config.values.height;this.vertical_range=this.track_config.values.max_value-this.track_config.values.min_value;(function(g){var k=false;var j=false;var h=$("<div class='track-resize'>");$(g.container_div).hover(function(){k=true;h.show()},function(){k=false;if(!j){h.hide()}});h.hide().bind("dragstart",function(l,m){j=true;m.original_height=$(g.content_div).height()}).bind("drag",function(m,n){var l=Math.min(Math.max(n.original_height+n.deltaY,g.min_height_px),g.max_height_px);$(g.content_div).css("height",l);g.height_px=l;g.draw(true)}).bind("dragend",function(l,m){g.tile_cache.clear();j=false;if(!k){h.hide()}g.track_config.values.height=g.height_px}).appendTo(g.container_div)})(this)};$.extend(LineTrack.prototype,TiledTrack.prototype,{predraw_init:function(){var a=this,b=a.view.tracks.indexOf(a);a.vertical_range=undefined;return $.getJSON(a.data_url,{stats:true,chrom:a.view.chrom,low:null,high:null,hda_ldda:a.hda_ldda,dataset_id:a.dataset_id},function(c){a.container_div.addClass("line-track");var e=c.data;if(isNaN(parseFloat(a.prefs.min_value))||isNaN(parseFloat(a.prefs.max_value))){a.prefs.min_value=e.min;a.prefs.max_value=e.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;a.total_frequency=e.total_frequency;a.container_div.find(".yaxislabel").remove();var f=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(round_1000(a.prefs.min_value));var d=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(round_1000(a.prefs.max_value));d.css({position:"absolute",top:"24px",left:"10px"});d.prependTo(a.container_div);f.css({position:"absolute",bottom:"2px",left:"10px"});f.prependTo(a.container_div)})},draw_tile:function(d,a,j,k,h){if(this.vertical_range===undefined){return}var c=this,f=a*DENSITY*d,b=DENSITY*d,g=d+"_"+a,e={hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,resolution:this.view.resolution};this.tile_data(d,a,e,function(C){var l=document.createElement("canvas"),q=C.data;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(l)}l=$(l);l.get(0).width=Math.ceil(b*k);l.get(0).height=c.height_px;var z=l.get(0).getContext("2d"),n=false,B=c.prefs.min_value,v=c.prefs.max_value,A=c.vertical_range,m=c.total_frequency,u=c.height_px,s=c.mode;var r=Math.round(u+B/A*u);z.beginPath();z.moveTo(0,r);z.lineTo(b*k,r);z.fillStyle="#aaa";z.stroke();z.beginPath();z.fillStyle=c.prefs.color;var p,w,x;if(q.length>1){x=Math.ceil((q[1][0]-q[0][0])*k)}else{x=10}for(var o=0,t=q.length;o<t;o++){p=Math.round((q[o][0]-f)*k);w=q[o][1];if(w===null){if(n&&s==="Filled"){z.lineTo(p,u)}n=false;continue}if(w<B){w=B}else{if(w>v){w=v}}if(s==="Histogram"){w=Math.round(w/A*u);z.fillRect(p,r,x,-w)}else{if(s==="Intensity"){w=255-Math.floor((w-B)/A*255);z.fillStyle="rgb("+w+","+w+","+w+")";z.fillRect(p,0,x,u)}else{w=Math.round(u-(w-B)/A*u);if(n){z.lineTo(p,w)}else{n=true;if(s==="Filled"){z.moveTo(p,u);z.lineTo(p,w)}else{z.moveTo(p,w)}}}}}if(s==="Filled"){if(n){z.lineTo(p,r);z.lineTo(0,r)}z.fill()}else{z.stroke()}h(l)})}});var FeatureTrack=function(a,f,e,j,h,c,d,g){var b=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new TrackConfig({track:this,params:[{key:"block_color",label:"Block color",type:"color",default_value:"#444"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:h,onchange:function(){b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;Track.call(this,a,f,f.viewport_container);TiledTrack.call(this,c,d,g);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=e;this.dataset_id=j;this.original_dataset_id=j;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.default_font=DEFAULT_FONT;this.inc_slots={};this.start_end_dct={};this.tile_cache=new Cache(CACHED_TILES_FEATURE);this.data_cache=new DataCache(20);this.left_offset=200};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{incremental_slots:function(a,h,p){var q=this.inc_slots[a];if(!q||(q.mode!==p)){q={};q.w_scale=a;q.mode=p;this.inc_slots[a]=q;this.start_end_dct[a]={}}var l=q.w_scale,w=[],x=[],j=0,n=this.view.max_low;for(var u=0,v=h.length;u<v;u++){var g=h[u],k=g[0];if(q[k]!==undefined){j=Math.max(j,q[k]);x.push(q[k])}else{w.push(u)}}var d=this.start_end_dct[a];var m=function(D,E){for(var C=0;C<=MAX_FEATURE_DEPTH;C++){var A=false,F=d[C];if(F!==undefined){for(var z=0,B=F.length;z<B;z++){var y=F[z];if(E>y[0]&&D<y[1]){A=true;break}}}if(!A){return C}}return -1};for(var u=0,v=w.length;u<v;u++){var g=h[w[u]],k=g[0],s=g[1],b=g[2],o=g[3],c=Math.floor((s-n)*l),f=Math.ceil((b-n)*l),t=CONTEXT.measureText(o).width,e;if(o!==undefined&&p==="Pack"){t+=(LABEL_SPACING+PACK_SPACING);if(c-t>=0){c-=t;e="left"}else{f+=t;e="right"}}var r=m(c,f);if(r>=0){if(d[r]===undefined){d[r]=[]}d[r].push([c,f]);q[k]=r;j=Math.max(j,r)}else{}}return j+1},draw_summary_tree:function(b,o,n,l,r,j,f,e){var c=j+LABEL_SPACING+CHAR_HEIGHT_PX;delta_x_px=Math.ceil(n*r);var h=$("<div />").addClass("yaxislabel");h.text(l);h.css({position:"absolute",top:"22px",left:"10px"});h.prependTo(this.container_div);var q=b.get(0).getContext("2d");for(var d=0,g=o.length;d<g;d++){var m=Math.floor((o[d][0]-f)*r);var k=o[d][1];if(!k){continue}var p=k/l*j;q.fillStyle="black";q.fillRect(m+e,c-p,delta_x_px,p);var a=4;if(this.prefs.show_counts&&(q.measureText(k).width+a)<delta_x_px){q.fillStyle="#666";q.textAlign="center";q.fillText(k,m+e+(delta_x_px/2),10)}}},draw_element:function(p,f,g,x,j,r,I,M,N,a,A){var u=x[0],K=x[1],C=x[2],s=x[3],D=Math.floor(Math.max(0,(K-r)*M)),q=Math.ceil(Math.min(a,Math.max(0,(C-r)*M))),B=ERROR_PADDING+(g==="Dense"?0:(0+j))*N,o,G,t=null,O=null,d=this.prefs.block_color,F=this.prefs.label_color;if(g==="Dense"){p.fillStyle=d;p.fillRect(D+A,B,q-D,DENSE_FEATURE_HEIGHT)}else{if(g==="no_detail"){p.fillStyle=d;p.fillRect(D+A,B+5,q-D,DENSE_FEATURE_HEIGHT)}else{var n=x[5],z=x[6],E=x[7],e=x[8];if(z&&E){t=Math.floor(Math.max(0,(z-r)*M));O=Math.ceil(Math.min(a,Math.max(0,(E-r)*M)))}var L,v;if(g==="Squish"){L=1;v=SQUISH_FEATURE_HEIGHT}else{L=5;v=PACK_FEATURE_HEIGHT}if(!e){if(x.strand){if(x.strand==="+"){p.fillStyle=RIGHT_STRAND_INV}else{if(x.strand==="-"){p.fillStyle=LEFT_STRAND_INV}}}else{p.fillStyle=d}p.fillRect(D+A,B,q-D,v)}else{var m,w;if(g==="Squish"){p.fillStyle=CONNECTOR_COLOR;m=B+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;w=1}else{if(n){var m=B;var w=v;if(n==="+"){p.fillStyle=RIGHT_STRAND}else{if(n==="-"){p.fillStyle=LEFT_STRAND}}}else{p.fillStyle=CONNECTOR_COLOR;m+=(SQUISH_FEATURE_HEIGHT/2)+1;w=1}}p.fillRect(D+A,m,q-D,w);for(var J=0,c=e.length;J<c;J++){var h=e[J],b=Math.floor(Math.max(0,(h[0]-r)*M)),y=Math.ceil(Math.min(a,Math.max((h[1]-r)*M)));if(b>y){continue}p.fillStyle=d;p.fillRect(b+A,B+(v-L)/2+1,y-b,L);if(t!==undefined&&!(b>O||y<t)){var H=Math.max(b,t),l=Math.min(y,O-1);p.fillRect(H+A,B+1,l-H,v)}}}if(g==="Pack"&&K>r){p.fillStyle=F;if(f===0&&D-p.measureText(s).width<0){p.textAlign="left";p.fillText(s,q+A+LABEL_SPACING,B+8)}else{p.textAlign="right";p.fillText(s,D+A-LABEL_SPACING,B+8)}p.fillStyle=d}}}},get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="no_detail"){a=NO_DETAIL_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT}}}return a},draw_tile:function(z,E,l,n,j,d,p){var v=this;if(v.view.reference_track&&n>CHAR_WIDTH_PX&&d===undefined){return v.view.reference_track.tile_data(z,E,{},function(f){v.draw_tile(z,E,l,n,j,f)})}var G=E*DENSITY*z,a=(E+1)*DENSITY*z,s=a-G,H={hda_ldda:v.hda_ldda,dataset_id:v.dataset_id,resolution:this.view.resolution,mode:this.mode};if(p===undefined){var q=this.data_cache.get_data(G,a,this.mode),J=z+"_"+E+"_"+this.mode;if(q===undefined){return v.tile_data(z,E,H,function(f){v.data_cache.set_data(G,a,this.mode,f);v.draw_tile(z,E,l,n,j,d,f)},J)}p=q}var x=Math.ceil(s*n),u=this.mode,K=25,g=this.left_offset,r,h;var c=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(c)}c=$(c);if(u==="Auto"){if(p.dataset_type==="summary_tree"){u=p.dataset_type}else{if(p.extra_info==="no_detail"){u="no_detail"}else{var I=p.data;if((I.length&&I.length<4)||(this.view.high-this.view.low>MIN_SQUISH_VIEW_WIDTH)){u="Squish"}else{u="Pack"}}}}var A=this.get_y_scale(u);if(u==="summary_tree"){h=this.summary_draw_height}if(u==="Dense"){h=K}else{if(u==="no_detail"||u==="Squish"||u==="Pack"){h=this.incremental_slots(n,p.data,u)*A+K;r=this.inc_slots[n]}}c.get(0).width=x+g;c.get(0).height=h;if(p.dataset_type==="summary_tree"){c.get(0).height+=LABEL_SPACING+CHAR_HEIGHT_PX}l.parent().css("height",Math.max(this.height_px,h)+"px");var y=c.get(0).getContext("2d");y.fillStyle=this.prefs.block_color;y.font=this.default_font;y.textAlign="right";this.container_div.find(".yaxislabel").remove();if(u==="summary_tree"){this.draw_summary_tree(c,p.data,p.delta,p.max,n,h,G,g);return j(c)}if(p.message){c.css({"border-top":"1px solid red"});y.fillStyle="red";y.textAlign="left";var t=y.textBaseline;y.textBaseline="top";y.fillText(p.message,g,0);y.textBaseline=t;if(!p.data){return j(c)}}this.example_feature=(p.data.length?p.data[0]:undefined);var I=p.data;for(var B=0,D=I.length;B<D;B++){var k=I[B],m=k[0],w=k[1],b=k[2],e=(r&&r[m]!==undefined?r[m]:null);var C=false;var o;for(var F=0;F<this.filters.length;F++){o=this.filters[F];o.update_attrs(k);if(!o.keep(k)){C=true;break}}if(C){continue}if(is_overlap([w,b],[G,a])&&(u=="Dense"||e!==null)){this.draw_element(y,E,u,k,e,G,a,n,A,x,g,d)}}j(c)}});var VcfTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="VcfTrack"};$.extend(VcfTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_element:function(u,p,j,e,x,c,m,v,s){var j=data[i],l=j[0],t=j[1],d=j[2]-1,o=j[3],g=Math.floor(Math.max(0,(t-x)*m)),k=Math.ceil(Math.min(s,Math.max(0,(d-x)*m))),f=ERROR_PADDING+(p==="Dense"?0:(0+e))*v,a,y,b=null,n=null;if(no_label){u.fillStyle=block_color;u.fillRect(g+left_offset,f+5,k-g,1)}else{var w=j[4],r=j[5],h=j[6];a=9;y=1;u.fillRect(g+left_offset,f,k-g,a);if(p!=="Dense"&&o!==undefined&&t>x){u.fillStyle=label_color;if(tile_index===0&&g-u.measureText(o).width<0){u.textAlign="left";u.fillText(o,k+2+left_offset,f+8)}else{u.textAlign="right";u.fillText(o,g-2+left_offset,f+8)}u.fillStyle=block_color}var q=w+" / "+r;if(t>x&&u.measureText(q).width<(k-g)){u.fillStyle="white";u.textAlign="center";u.fillText(q,left_offset+g+(k-g)/2,f+8);u.fillStyle=block_color}}}});var ReadTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="ReadTrack";this.difference_mode=true;this.show_insertions=false;this.make_name_popup_menu()};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT;if(this.show_insertions){a*=2}}}return a},draw_read:function(m,d,J,n,D,G,e,o,y,a){m.textAlign="center";var l=this,u=[n,D],C=0,z=0,f=0;var r=[];if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){f=Math.round(J/2)}for(var h=0,k=e.length;h<k;h++){var b=e[h],g="MIDNSHP=X"[b[0]],v=b[1];if(g==="H"||g==="S"){C-=v}var x=G+C,B=Math.floor(Math.max(0,(x-n)*J)),E=Math.floor(Math.max(0,(x+v-n)*J));switch(g){case"H":break;case"S":case"M":case"=":var p=compute_overlap([x,x+v],u);if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(f>0){m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset-f,y+1,E-B,9);m.fillStyle=CONNECTOR_COLOR;for(var I=0,j=q.length;I<j;I++){if(this.difference_mode&&a){var s=a[x-n+I];if(!s||s.toLowerCase()===q[I].toLowerCase()){continue}}if(x+I>=n&&x+I<=D){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset,y+9)}}}else{m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset,y+(this.mode!=="Dense"?4:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}z+=v;C+=v;break;case"N":m.fillStyle=CONNECTOR_COLOR;m.fillRect(B+this.left_offset-f,y+5,E-B,1);C+=v;break;case"D":m.fillStyle="red";m.fillRect(B+this.left_offset-f,y+4,E-B,3);C+=v;break;case"P":break;case"I":var p=compute_overlap([x,x+v],u),K=this.left_offset+B-f;if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(this.show_insertions){var w=this.left_offset+B-(E-B)/2;if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){m.fillStyle="yellow";m.fillRect(w-f,y-9,E-B,9);r[r.length]={type:"triangle",data:[K,y+4,5]};m.fillStyle=CONNECTOR_COLOR;switch(p){case (OVERLAP_START):q=q.slice(n-x);break;case (OVERLAP_END):q=q.slice(0,x-D);break;case (CONTAINED_BY):break;case (CONTAINS):q=q.slice(n-x,x-D);break}for(var I=0,j=q.length;I<j;I++){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset-(E-B)/2,y)}}else{m.fillStyle="yellow";m.fillRect(w,y+(this.mode!=="Dense"?2:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){r[r.length]={type:"text",data:[q.length,K,y+9]}}else{}}}z+=v;break;case"X":z+=v;break}}m.fillStyle="yellow";var t,L,H;for(var F=0;F<r.length;F++){t=r[F];L=t.type;H=t.data;if(L==="text"){m.font="bold "+DEFAULT_FONT;m.fillText(H[0],H[1],H[2]);m.font=DEFAULT_FONT}else{if(L=="triangle"){m.drawDownwardEquilateralTriangle(H[0],H[1],H[2])}}}},draw_element:function(w,y,r,k,e,A,b,n,x,u,f,c){var m=k[0],v=k[1],d=k[2],o=k[3],h=Math.floor(Math.max(0,(v-A)*n)),j=Math.ceil(Math.min(u,Math.max(0,(d-A)*n))),g=(r==="Dense"?1:(1+e))*x,z=this.prefs.block_color,l=this.prefs.label_color;t=0;w.fillStyle=z;if(k[5] instanceof Array){var s=Math.floor(Math.max(0,(k[4][0]-A)*n)),q=Math.ceil(Math.min(u,Math.max(0,(k[4][1]-A)*n))),p=Math.floor(Math.max(0,(k[5][0]-A)*n)),a=Math.ceil(Math.min(u,Math.max(0,(k[5][1]-A)*n)));if(k[4][1]>=A&&k[4][0]<=b&&k[4][2]){this.draw_read(w,r,n,A,b,k[4][0],k[4][2],k[4][3],g,c)}if(k[5][1]>=A&&k[5][0]<=b&&k[5][2]){this.draw_read(w,r,n,A,b,k[5][0],k[5][2],k[5][3],g,c)}if(p>q){w.fillStyle=CONNECTOR_COLOR;w.dashedLine(q+f,g+5,f+p,g+5)}}else{w.fillStyle=z;this.draw_read(w,r,n,A,b,v,k[4],k[5],g,c)}if(r==="Pack"&&v>A){w.fillStyle=this.prefs.label_color;if((r==="Pack"||this.mode==="Auto")&&n>CHAR_WIDTH_PX){var t=Math.round(n/2)}if(y===0&&h-w.measureText(o).width<0){w.textAlign="left";w.fillText(o,j+f+LABEL_SPACING-t,g+8)}else{w.textAlign="right";w.fillText(o,h+f-LABEL_SPACING-t,g+8)}w.fillStyle=z}}});var ToolDataFeatureTrack=function(e,c,g,a,d,f,b){FeatureTrack.call(this,e,c,g,a,d,f,{},b);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};$.extend(ToolDataFeatureTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{predraw_init:function(){var b=this;var a=function(){if(b.data_cache.size()===0){setTimeout(a,300)}else{b.data_url=default_data_url;b.data_query_wait=DEFAULT_DATA_QUERY_WAIT;b.dataset_state_url=converted_datasets_state_url;$.getJSON(b.dataset_state_url,{dataset_id:b.dataset_id,hda_ldda:b.hda_ldda},function(c){})}};a()}});
\ No newline at end of file
+CanvasRenderingContext2D.prototype.dashedLine=function(c,j,b,h,f){if(f===undefined){f=4}var e=b-c;var d=h-j;var g=Math.floor(Math.sqrt(e*e+d*d)/f);var l=e/g;var k=d/g;var a;for(a=0;a<g;a++,c+=l,j+=k){if(a%2!==0){continue}this.fillRect(c,j,f,1)}};CanvasRenderingContext2D.prototype.drawDownwardEquilateralTriangle=function(b,a,e){var d=b-e/2,c=b+e/2,f=a-Math.sqrt(e*3/2);this.beginPath();this.moveTo(d,f);this.lineTo(c,f);this.lineTo(b,a);this.lineTo(d,f);this.strokeStyle=this.fillStyle;this.fill();this.stroke();this.closePath()};function sortable(a,b){a.bind("drag",{handle:b,relative:true},function(h,j){var g=$(this).parent();var f=g.children();var c;for(c=0;c<f.length;c++){if(j.offsetY<$(f.get(c)).position().top){break}}if(c===f.length){if(this!==f.get(c-1)){g.append(this)}}else{if(this!==f.get(c)){$(this).insertBefore(f.get(c))}}})}var NO_OVERLAP=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005;function compute_overlap(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=NO_OVERLAP}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=NO_OVERLAP}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a}function is_overlap(b,a){return(compute_overlap(b,a)!==NO_OVERLAP)}var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=1,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,ERROR_PADDING=10,LABEL_SPACING=2,PACK_SPACING=5,MIN_SQUISH_VIEW_WIDTH=12000,DEFAULT_FONT="9px Monaco, Lucida Console, monospace",DENSITY=200,FEATURE_LEVELS=10,MAX_FEATURE_DEPTH=100,DEFAULT_DATA_QUERY_WAIT=5000,MAX_CHROMS_SELECTABLE=100,CONNECTOR_COLOR="#ccc",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_CANNOT_RUN_TOOL="Tool cannot be rerun: ",DATA_LOADING="Loading data...",DATA_OK="Ready for display",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=5,CACHED_DATA=5,DUMMY_CANVAS=document.createElement("canvas"),RIGHT_STRAND,LEFT_STRAND;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(DUMMY_CANVAS)}var CONTEXT=DUMMY_CANVAS.getContext("2d");CONTEXT.font=DEFAULT_FONT;var CHAR_WIDTH_PX=CONTEXT.measureText("A").width,CHAR_HEIGHT_PX=9;var right_img=new Image();right_img.src=image_path+"/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src=image_path+"/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=image_path+"/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=image_path+"/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function round_1000(a){return Math.round(a*1000)/1000}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.move_key_to_end(b,a)}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},move_key_to_end:function(b,a){this.key_ary.splice(a,1);this.key_ary.push(b)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var DataCache=function(a){Cache.call(this,a)};$.extend(DataCache.prototype,Cache.prototype,{get_data:function(g,b,e){var h=this.get(this.gen_key(g,b,e));if(h){return h}var j,f,a,d,e,h;for(var c=0;c<this.key_ary.length;c++){j=this.key_ary[c];f=this.split_key(j);a=f[0];d=f[1];if(g>=a&&b<=d){h=this.obj_cache[j];if(h.dataset_type!=="summary_tree"&&h.extra_info!=="no_detail"){this.move_key_to_end(j,c);return h}}}return undefined},set_data:function(b,c,d,a){return this.set(this.gen_key(b,c,d),a)},gen_key:function(a,c,d){var b=a+"_"+c+"_"+d;return b},split_key:function(a){return a.split("_")}});var View=function(a,d,c,b,e){this.container=a;this.chrom=null;this.vis_id=c;this.dbkey=b;this.title=d;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.num_tracks=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.init(e);this.reset()};$.extend(View.prototype,{init:function(d){var c=this.container,a=this;this.top_container=$("<div/>").addClass("top-container").appendTo(c);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(c);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(c);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").addClass("viewport-container").appendTo(this.content_div);this.intro_div=$("<div/>").addClass("intro").text("Select a chrom from the dropdown below").hide();this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a href='javascript:void(0);'>Close Overview</a>").addClass("overview-close").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var b=function(f){if(f.type==="focusout"||(f.keyCode||f.which)===13||(f.keyCode||f.which)===27){if((f.keyCode||f.which)!==27){a.go_to($(this).val())}$(this).hide();a.location_span.show();a.chrom_select.show();return false}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",b).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){a.location_span.hide();a.chrom_select.hide();a.nav_input.css("display","inline-block");a.nav_input.select();a.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){a.zoom_out();a.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){a.zoom_in();a.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},d);this.chrom_select.bind("change",function(){a.change_chrom(a.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(f){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(f){a.zoom_in(f.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(f,g){this.current_x=g.offsetX}).bind("drag",function(f,h){var j=h.offsetX-this.current_x;this.current_x=h.offsetX;var g=Math.round(j/a.viewport_container.width()*(a.max_high-a.max_low));a.move_delta(-g)});this.overview_close.bind("click",function(){for(var f=0,e=a.tracks.length;f<e;f++){a.tracks[f].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",a.overview_box.height());a.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(f,g){if(f.clientX>a.viewport_container.width()-16){return false}}).bind("dragstart",function(f,g){g.original_low=a.low;g.current_height=f.clientY;g.current_x=g.offsetX}).bind("drag",function(h,k){var f=$(this);var l=k.offsetX-k.current_x;var g=f.scrollTop()-(h.clientY-k.current_height);f.scrollTop(g);k.current_height=h.clientY;k.current_x=k.offsetX;var j=Math.round(l/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}).bind("mousewheel",function(h,k,g,f){if(g){var j=Math.round(-g/a.viewport_container.width()*(a.high-a.low));a.move_delta(j)}});this.top_labeltrack.bind("dragstart",function(f,g){return $("<div />").css({height:a.content_div.height()+a.top_labeltrack.height()+a.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(k,l){$(l.proxy).css({left:Math.min(k.pageX,l.startX),width:Math.abs(k.pageX-l.startX)});var g=Math.min(k.pageX,l.startX)-a.container.offset().left,f=Math.max(k.pageX,l.startX)-a.container.offset().left,j=(a.high-a.low),h=a.viewport_container.width();a.update_location(Math.round(g/h*j)+a.low,Math.round(f/h*j)+a.low)}).bind("dragend",function(l,m){var g=Math.min(l.pageX,m.startX),f=Math.max(l.pageX,m.startX),j=(a.high-a.low),h=a.viewport_container.width(),k=a.low;a.low=Math.round(g/h*j)+k;a.high=Math.round(f/h*j)+k;$(m.proxy).remove();a.redraw()});this.add_label_track(new LabelTrack(this,this.top_labeltrack));this.add_label_track(new LabelTrack(this,this.nav_labeltrack));$(window).bind("resize",function(){a.resize_window()});$(document).bind("redraw",function(){a.redraw()});this.reset();$(window).trigger("resize")},update_location:function(a,b){this.location_span.text(commatize(a)+" - "+commatize(b));this.nav_input.val(this.chrom+":"+commatize(a)+"-"+commatize(b))},load_chroms:function(b,c){b.num=MAX_CHROMS_SELECTABLE;$.extend(b,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var a=this;$.ajax({url:chrom_url,data:b,dataType:"json",success:function(e){if(e.reference){a.add_label_track(new ReferenceTrack(a))}a.chrom_data=e.chrom_info;var h='<option value="">Select Chrom/Contig</option>';for(var g=0,d=a.chrom_data.length;g<d;g++){var f=a.chrom_data[g].chrom;h+='<option value="'+f+'">'+f+"</option>"}if(e.prev_chroms){h+='<option value="previous">Previous '+MAX_CHROMS_SELECTABLE+"</option>"}if(e.next_chroms){h+='<option value="next">Next '+MAX_CHROMS_SELECTABLE+"</option>"}a.chrom_select.html(h);if(c){c()}a.chrom_start_index=e.start_index},error:function(){alert("Could not load chroms for this dbkey:",a.dbkey)}})},change_chrom:function(e,b,g){if(!e||e==="None"){return}var d=this;if(e==="previous"){d.load_chroms({low:this.chrom_start_index-MAX_CHROMS_SELECTABLE});return}if(e==="next"){d.load_chroms({low:this.chrom_start_index+MAX_CHROMS_SELECTABLE});return}var f=$.grep(d.chrom_data,function(j,k){return j.chrom===e})[0];if(f===undefined){d.load_chroms({chrom:e},function(){d.change_chrom(e,b,g)});return}else{if(e!==d.chrom){d.chrom=e;if(!d.chrom){d.intro_div.show()}else{d.intro_div.hide()}d.chrom_select.val(d.chrom);d.max_high=f.len-1;d.reset();d.redraw(true);for(var h=0,a=d.tracks.length;h<a;h++){var c=d.tracks[h];if(c.init){c.init()}}}if(b!==undefined&&g!==undefined){d.low=Math.max(b,0);d.high=Math.min(g,d.max_high)}d.reset_overview();d.redraw()}},go_to:function(f){var k=this,a,d,b=f.split(":"),h=b[0],j=b[1];if(j!==undefined){try{var g=j.split("-");a=parseInt(g[0].replace(/,/g,""),10);d=parseInt(g[1].replace(/,/g,""),10)}catch(c){return false}}k.change_chrom(h,a,d)},move_fraction:function(c){var a=this;var b=a.high-a.low;this.move_delta(c*b)},move_delta:function(c){var a=this;var b=a.high-a.low;if(a.low-c<a.max_low){a.low=a.max_low;a.high=a.max_low+b}else{if(a.high-c>a.max_high){a.high=a.max_high;a.low=a.max_high-b}else{a.high-=c;a.low-=c}}a.redraw()},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);sortable(a.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=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)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(h){var g=this.high-this.low,f=this.low,b=this.high;if(f<this.max_low){f=this.max_low}if(b>this.max_high){b=this.max_high}if(this.high!==0&&g<this.min_separation){b=f+this.min_separation}this.low=Math.floor(f);this.high=Math.ceil(b);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))));var a=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var e=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var j=13;this.overview_box.css({left:a,width:Math.max(j,e)}).show();if(e<j){this.overview_box.css("left",a-(j-e)/2)}if(this.overview_highlight){this.overview_highlight.css({left:a,width:e})}this.update_location(this.low,this.high);if(!h){for(var c=0,d=this.tracks.length;c<d;c++){if(this.tracks[c]&&this.tracks[c].enabled){this.tracks[c].draw()}}for(c=0,d=this.label_tracks.length;c<d;c++){this.label_tracks[c].draw()}}},zoom_in:function(b,c){if(this.max_high===0||this.high-this.low<this.min_separation){return}var d=this.high-this.low,e=d/2+this.low,a=(d/this.zoom_factor)/2;if(b){e=b/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(e-a);this.high=Math.round(e+a);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var b=this.high-this.low,c=b/2+this.low,a=(b*this.zoom_factor)/2;this.low=Math.round(c-a);this.high=Math.round(c+a);this.redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.nav_container.width(this.container.width());this.redraw()},reset_overview:function(){this.overview_viewport.find("canvas").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide()}});var Tool=function(a,b){this.name=a;this.params=b};$.extend(Tool.prototype,{get_param_values_dict:function(){var b={};for(var a=0;a<this.params.length;a++){var c=this.params[a];b[c.name]=c.value}return b},get_param_values:function(){var b=[];for(var a=0;a<this.params.length;a++){b[a]=this.params[a].value}return b}});var NumberToolParameter=function(c,b,e,a,d){this.name=c;this.label=b;this.min=e;this.max=a;this.value=d};var get_tool_from_dict=function(f){if(obj_length(f)===0){return undefined}var b=f.name;var l=f.params;var c=Array();for(var e=0;e<l.length;e++){var g=l[e];var a=g.name,k=g.label,h=g.type,d=g.min,j=g.max,m=g.value;c[c.length]=new NumberToolParameter(a,k,d,j,m)}return new Tool(b,c)};var Filter=function(b,a,c){this.name=b;this.index=a;this.value=c};var NumberFilter=function(b,a){this.name=b;this.index=a;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.slider_min=Number.MAX_VALUE;this.slider_max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};$.extend(NumberFilter.prototype,{applies_to:function(a){if(a.length>this.index){return true}return false},keep:function(a){if(!this.applies_to(a)){return true}return(a[this.index]>=this.low&&a[this.index]<=this.high)},update_attrs:function(b){var a=false;if(!this.applies_to(b)){return a}if(b[this.index]<this.slider_min){this.slider_min=b[this.index];a=true}if(b[this.index]>this.slider_max){this.slider_max=b[this.index];a=false}return a},update_ui_elt:function(){var b=this.slider.slider("option","min"),a=this.slider.slider("option","max");if(this.slider_min<b||this.slider_max>a){this.slider.slider("option","min",this.slider_min);this.slider.slider("option","max",this.slider_max);this.slider.slider("option","values",[this.slider_min,this.slider_max])}}});var get_filters_from_dict=function(a){var g=[];for(var d=0;d<a.length;d++){var f=a[d];var c=f.name,e=f.type,b=f.index;if(e==="int"||e==="float"){g[d]=new NumberFilter(c,b)}else{g[d]=new Filter(c,b,e)}}return g};var TrackConfig=function(a){this.track=a.track;this.params=a.params;this.values={};if(a.saved_values){this.restore_values(a.saved_values)}this.onchange=a.onchange};$.extend(TrackConfig.prototype,{restore_values:function(a){var b=this;$.each(this.params,function(c,d){if(a[d.key]!==undefined){b.values[d.key]=a[d.key]}else{b.values[d.key]=d.default_value}})},build_form:function(){var b=this;var a=$("<div />");$.each(this.params,function(f,d){if(!d.hidden){var c="param_"+f;var l=$("<div class='form-row' />").appendTo(a);l.append($("<label />").attr("for",c).text(d.label+":"));if(d.type==="bool"){l.append($('<input type="checkbox" />').attr("id",c).attr("name",c).attr("checked",b.values[d.key]))}else{if(d.type==="color"){var h=b.values[d.key];var g=$("<input />").attr("id",c).attr("name",c).val(h);var j=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var e=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(j);var k=$("<div/>").appendTo(e).farbtastic({width:100,height:100,callback:g,color:h});$("<div />").append(g).append(j).appendTo(l).bind("click",function(m){j.css({left:$(this).position().left+($(g).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){j.hide();$(document).unbind("click.color-picker")});m.stopPropagation()})}else{l.append($("<input />").attr("id",c).attr("name",c).val(b.values[d.key]))}}}});return a},update_from_form:function(a){var c=this;var b=false;$.each(this.params,function(d,f){if(!f.hidden){var g="param_"+d;var e=a.find("#"+g).val();if(f.type==="float"){e=parseFloat(e)}else{if(f.type==="int"){e=parseInt(e)}else{if(f.type==="bool"){e=a.find("#"+g).is(":checked")}}}if(e!==c.values[f.key]){c.values[f.key]=e;b=true}}});if(b){this.onchange()}}});var Track=function(b,a,e,c,d){this.name=b;this.view=a;this.parent_element=e;this.data_url=(c?c:default_data_url);this.data_query_wait=(d?d:DEFAULT_DATA_QUERY_WAIT);this.dataset_check_url=converted_datasets_state_url;this.container_div=$("<div />").addClass("track").css("position","relative");if(!this.hidden){this.header_div=$("<div class='track-header' />").appendTo(this.container_div);if(this.view.editor){this.drag_div=$("<div class='draghandle' />").appendTo(this.header_div)}this.name_div=$("<div class='menubutton popup' />").appendTo(this.header_div);this.name_div.text(this.name);this.name_div.attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase())}this.content_div=$("<div class='track-content'>").appendTo(this.container_div);this.parent_element.append(this.container_div)};$.extend(Track.prototype,{init:function(){var a=this;a.enabled=false;a.tile_cache.clear();a.data_cache.clear();a.initial_canvas=undefined;a.content_div.css("height","auto");a.container_div.removeClass("nodata error pending");if(!a.dataset_id){return}if(a.view.chrom!==null){$.getJSON(converted_datasets_state_url,{hda_ldda:a.hda_ldda,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(!b||b==="error"||b.kind==="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR);if(b.message){var d=a.view.tracks.indexOf(a);var c=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+b.message+"</pre>",{Close:hide_modal})});a.content_div.append(c)}}else{if(b==="no converter"){a.container_div.addClass("error");a.content_div.text(DATA_NOCONVERTER)}else{if(b==="no data"||(b.data!==undefined&&(b.data===null||b.data.length===0))){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b==="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},a.data_query_wait)}else{if(b.status==="data"){if(b.valid_chroms){a.valid_chroms=b.valid_chroms;a.make_name_popup_menu()}a.content_div.text(DATA_OK);if(a.view.chrom){a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.enabled=true;$.when(a.predraw_init()).done(function(){a.draw()})}}}}}}})}},predraw_init:function(){},update_name:function(a){this.old_name=this.name;this.name=a;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var TiledTrack=function(b,j,n){var c=this,o=c.view;this.filters=(b!==undefined?get_filters_from_dict(b):[]);this.filters_available=false;this.filters_visible=false;this.tool=(j!==undefined?get_tool_from_dict(j):undefined);this.parent_track=n;this.child_tracks=[];if(c.hidden){return}if(this.parent_track){this.header_div.find(".draghandle").removeClass("draghandle").addClass("child-track-icon").addClass("icon-button");this.parent_element.addClass("child-track");this.tool=undefined}this.filters_div=$("<div/>").addClass("filters").hide();this.header_div.after(this.filters_div);this.filters_div.bind("drag",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});$.each(this.filters,function(t,w){var u=$("<div/>").addClass("slider-row").appendTo(c.filters_div);var v=$("<div/>").addClass("slider-label").appendTo(u);var s=$("<span/>").addClass("name").appendTo(v);s.text(w.name+" ");var r=$("<span/>").addClass("values").appendTo(v);var q=$("<div/>").addClass("slider").appendTo(u);w.control_element=$("<div/>").attr("id",w.name+"-filter-control").appendTo(q);w.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(y,z){var x=z.values;r.text("["+x[0]+"-"+x[1]+"]");w.low=x[0];w.high=x[1];c.draw(true,true)},change:function(x,y){w.control_element.slider("option","slide").call(w.control_element,x,y)}});w.slider=w.control_element;w.slider_label=r;$("<div style='clear: both;'/>").appendTo(u)});if(this.tool){this.dynamic_tool_div=$("<div/>").addClass("dynamic-tool").hide();this.header_div.after(this.dynamic_tool_div);this.dynamic_tool_div.bind("drag",function(q){q.stopPropagation()}).bind("click",function(q){q.stopPropagation()}).bind("dblclick",function(q){q.stopPropagation()});var m=$("<div class='tool-name'>").appendTo(this.dynamic_tool_div).text(this.tool.name);var l=this.tool.params;var c=this;$.each(this.tool.params,function(x,s){var v=$("<div>").addClass("slider-row").appendTo(c.dynamic_tool_div);var u=$("<div>").addClass("slider-label").appendTo(v);var z=$("<span class='param-name'>").text(s.label+" ").appendTo(u);var t=$("<span/>").text(s.value);var w=$("<span class='param-value'>").appendTo(u).append("[").append(t).append("]");var y=$("<div/>").addClass("slider").appendTo(v);var q=$("<div id='"+s.name+"-param-control'>").appendTo(y);var r=(s.max<=1?0.01:(s.max<=1000?1:5));q.slider({min:s.min,max:s.max,step:r,value:s.value,slide:function(A,C){var B=C.value;s.value=B;if(0<B&&B<1){B=parseFloat(B).toFixed(2)}t.text(B)},change:function(A,B){s.value=B.value}});w.click(function(){var C=t,B=C.text(),A=(s.max<=1?4:s.max.length);C.text("");$("<input type='text'/>").attr("size",A).attr("maxlength",A).attr("value",B).appendTo(C).focus().select().click(function(D){D.stopPropagation()}).blur(function(){$(this).remove();C.text(B)}).keyup(function(F){if(F.keyCode===27){$(this).trigger("blur")}else{if(F.keyCode===13){var D=$(this),E=parseFloat(D.val());if(isNaN(E)||E>s.max||E<s.min){alert("Parameter value must be in the range ["+s.min+"-"+s.max+"]");return $(this)}C.text(E);q.slider("value",E);s.value=E}}})});$("<div style='clear: both;'/>").appendTo(v)});var p=$("<div>").addClass("slider-row").appendTo(this.dynamic_tool_div);var k=$("<input type='submit'>").attr("value","Run").appendTo(p);var c=this;k.click(function(){c.run_tool()})}c.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();c.container_div.append(c.child_tracks_container);if(c.display_modes!==undefined){if(c.mode_div===undefined){c.mode_div=$("<div class='right-float menubutton popup' />").appendTo(c.header_div);var e=(c.track_config&&c.track_config.values.mode?c.track_config.values.mode:c.display_modes[0]);c.mode=e;c.mode_div.text(e);var d=function(q){c.mode_div.text(q);c.mode=q;c.track_config.values.mode=q;c.tile_cache.clear();c.draw()};var a={};for(var f=0,h=c.display_modes.length;f<h;f++){var g=c.display_modes[f];a[g]=function(q){return function(){d(q)}}(g)}make_popupmenu(c.mode_div,a)}else{c.mode_div.hide()}}this.make_name_popup_menu()};$.extend(TiledTrack.prototype,Track.prototype,{make_name_popup_menu:function(){var b=this;var a={};a["Edit configuration"]=function(){var h=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},f=function(){b.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},g=function(j){if((j.keyCode||j.which)===27){h()}else{if((j.keyCode||j.which)===13){f()}}};$(window).bind("keypress.check_enter_esc",g);show_modal("Configure Track",b.track_config.build_form(),{Cancel:h,OK:f})};if(b.filters_available>0){var e=(b.filters_div.is(":visible")?"Hide filters":"Show filters");a[e]=function(){b.filters_visible=(b.filters_div.is(":visible"));b.filters_div.toggle();b.make_name_popup_menu()}}if(b.tool){var e=(b.dynamic_tool_div.is(":visible")?"Hide Tool":"Show Tool");a[e]=function(){if(!b.dynamic_tool_div.is(":visible")){b.update_name(b.name+b.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";b.revert_name()}b.dynamic_tool_div.toggle();b.make_name_popup_menu()}}if(b.track_type=="ReadTrack"){var e=(b.show_insertions?"Hide Insertions":"Show Insertions");a[e]=function(){b.show_insertions=!b.show_insertions;b.draw(true);b.make_name_popup_menu()}}if(b.valid_chroms){a["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+b.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var c=view;var d=function(){$("#no-tracks").show()};if(this.parent_track){c=this.parent_track;d=function(){}}a.Remove=function(){c.remove_track(b);if(c.num_tracks===0){d()}};make_popupmenu(b.name_div,a)},tile_data:function(d,a,g,k,j){var b=this,h=a*DENSITY*d,f=(a+1)*DENSITY*d,e={chrom:this.view.chrom,low:h,high:f,dbkey:this.view.dbkey};if(j===undefined){j=d+"_"+a}var c=b.data_cache.get(j);if(c){return k(c)}$.extend(e,g);$.ajax({url:this.data_url,dataType:"json",data:e,success:function(l){b.data_cache.set(j,l);return k(l)},error:function(m,l,n){console.log(m,l,n)}})},draw:function(a,d){var s=this.view.low,g=this.view.high,j=g-s,l=this.view.container.width(),m=this.view.resolution;var e=$("<div style='position: relative;'></div>"),f=l/j;if(!d){this.content_div.children().remove()}this.content_div.append(e);this.max_height=0;var o=Math.floor(s/m/DENSITY);var c={};while((o*DENSITY*m)<g){var r=l+"_"+f+"_"+o;var h=this.tile_cache.get(r);var p=o*DENSITY*this.view.resolution;var b=p+DENSITY*this.view.resolution;if(!a&&h){this.show_tile(h,e,p,f)}else{this.delayed_draw(a,r,p,b,o,m,e,f,c)}o+=1}if(d){var k=this;var q=setInterval(function(){if(obj_length(c)===0){var v=k.content_div.children();var u=false;for(var w=v.length-1,t=0;w>=t;w--){var x=$(v[w]);if(u){x.remove()}else{if(x.children().length!==0){u=true}}}clearInterval(q)}},50)}for(var n=0;n<this.child_tracks.length;n++){this.child_tracks[n].draw(a,d)}},delayed_draw:function(b,j,h,l,c,e,k,m,f){var d=this;var g=function(n){d.tile_cache.set(j,n);d.show_tile(n,k,h,m)};var a=setTimeout(function(){if(h<=d.view.high&&l>=d.view.low){var n;if(!b){n=d.tile_cache.get(j)}if(!n){d.draw_tile(e,c,k,m,function(p){if(p){var o=$("<div class='track-tile'>").prepend(p);n=o}g(n)})}if(n){g(n)}}delete f[a]},50);f[a]=true},show_tile:function(h,j,e,k){var a=this;var c=this.view.high-this.view.low,b=(e-this.view.low)*k;if(this.left_offset){b-=this.left_offset}h.css({position:"absolute",top:0,left:b,height:""});j.append(h);a.max_height=Math.max(a.max_height,h.height());a.content_div.css("height",a.max_height+"px");j.children().css("height",a.max_height+"px");if(a.hidden){return}for(var g=0;g<a.filters.length;g++){a.filters[g].update_ui_elt()}var d=false;if(a.example_feature){for(var g=0;g<a.filters.length;g++){if(a.filters[g].applies_to(a.example_feature)){d=true;break}}}if(a.filters_available!==d){a.filters_available=d;if(!a.filters_available){a.filters_div.hide()}a.make_name_popup_menu()}},set_overview:function(){var a=this.view;if(this.initial_canvas&&this.is_overview){a.overview_close.show();a.overview_viewport.append(this.initial_canvas);a.overview_highlight.show().height(this.initial_canvas.height());a.overview_viewport.height(this.initial_canvas.height()+a.overview_box.height())}$(window).trigger("resize")},run_tool:function(){var b={dataset_id:this.original_dataset_id,chrom:this.view.chrom,low:this.view.low,high:this.view.high,tool_id:this.tool.name};$.extend(b,this.tool.get_param_values_dict());var d=this,c=b.tool_id+d.tool_region_and_parameters_str(b.chrom,b.low,b.high),e;if(d.track_type==="FeatureTrack"){e=new ToolDataFeatureTrack(c,view,d.hda_ldda,undefined,{},{},d)}this.add_track(e);e.content_div.text("Starting job.");view.has_changes=true;var a=function(){$.getJSON(run_tool_url,b,function(f){if(f==="no converter"){e.container_div.addClass("error");e.content_div.text(DATA_NOCONVERTER)}else{if(f.error){e.container_div.addClass("error");e.content_div.text(DATA_CANNOT_RUN_TOOL+f.message)}else{if(f==="pending"){e.container_div.addClass("pending");e.content_div.text("Converting input data so that it can be easily reused.");setTimeout(a,2000)}else{e.dataset_id=f.dataset_id;e.content_div.text("Running job.");e.init()}}}})};a()},tool_region_and_parameters_str:function(c,a,d){var b=this,e=(c!==undefined&&a!==undefined&&d!==undefined?c+":"+a+"-"+d:"all");return" - region=["+e+"], parameters=["+b.tool.get_param_values().join(", ")+"]"},add_track:function(a){a.track_id=this.track_id+"_"+this.child_tracks.length;a.container_div.attr("id","track_"+a.track_id);this.child_tracks_container.append(a.container_div);sortable(a.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(a)},remove_track:function(a){a.container_div.fadeOut("slow",function(){$(this).remove()})}});var LabelTrack=function(a,b){this.track_type="LabelTrack";this.hidden=true;Track.call(this,null,a,b);this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.view.container.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var ReferenceTrack=function(a){this.track_type="ReferenceTrack";this.hidden=true;Track.call(this,null,a,a.top_labeltrack);TiledTrack.call(this);a.reference_track=this;this.left_offset=200;this.height_px=12;this.font=DEFAULT_FONT;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_url=reference_url;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE)};$.extend(ReferenceTrack.prototype,TiledTrack.prototype,{draw_tile:function(c,b,e,g,f){var a=this,d=DENSITY*c;if(g>CHAR_WIDTH_PX){a.tile_data(c,b,{},function(j){if(j===null){a.content_div.css("height","0px");return}var k=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(k)}k=$(k);var h=k.get(0).getContext("2d");k.get(0).width=Math.ceil(d*g+a.left_offset);k.get(0).height=a.height_px;h.font=DEFAULT_FONT;h.textAlign="center";for(var n=0,l=j.length;n<l;n++){var m=Math.round(n*g);h.fillText(j[n],m+a.left_offset,10)}return f(k)})}this.content_div.css("height","0px")}});var LineTrack=function(e,c,f,a,d){var b=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";Track.call(this,e,c,c.viewport_container);TiledTrack.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=f;this.dataset_id=a;this.original_dataset_id=a;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE);this.track_config=new TrackConfig({track:this,params:[{key:"color",label:"Color",type:"color",default_value:"black"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.height_px,hidden:true}],saved_values:d,onchange:function(){b.vertical_range=b.prefs.max_value-b.prefs.min_value;$("#linetrack_"+b.track_id+"_minval").text(b.prefs.min_value);$("#linetrack_"+b.track_id+"_maxval").text(b.prefs.max_value);b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;this.height_px=this.track_config.values.height;this.vertical_range=this.track_config.values.max_value-this.track_config.values.min_value;(function(g){var k=false;var j=false;var h=$("<div class='track-resize'>");$(g.container_div).hover(function(){k=true;h.show()},function(){k=false;if(!j){h.hide()}});h.hide().bind("dragstart",function(l,m){j=true;m.original_height=$(g.content_div).height()}).bind("drag",function(m,n){var l=Math.min(Math.max(n.original_height+n.deltaY,g.min_height_px),g.max_height_px);$(g.content_div).css("height",l);g.height_px=l;g.draw(true)}).bind("dragend",function(l,m){g.tile_cache.clear();j=false;if(!k){h.hide()}g.track_config.values.height=g.height_px}).appendTo(g.container_div)})(this)};$.extend(LineTrack.prototype,TiledTrack.prototype,{predraw_init:function(){var a=this,b=a.view.tracks.indexOf(a);a.vertical_range=undefined;return $.getJSON(a.data_url,{stats:true,chrom:a.view.chrom,low:null,high:null,hda_ldda:a.hda_ldda,dataset_id:a.dataset_id},function(c){a.container_div.addClass("line-track");var e=c.data;if(isNaN(parseFloat(a.prefs.min_value))||isNaN(parseFloat(a.prefs.max_value))){a.prefs.min_value=e.min;a.prefs.max_value=e.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;a.total_frequency=e.total_frequency;a.container_div.find(".yaxislabel").remove();var f=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(round_1000(a.prefs.min_value));var d=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(round_1000(a.prefs.max_value));d.css({position:"absolute",top:"24px",left:"10px"});d.prependTo(a.container_div);f.css({position:"absolute",bottom:"2px",left:"10px"});f.prependTo(a.container_div)})},draw_tile:function(d,a,j,k,h){if(this.vertical_range===undefined){return}var c=this,f=a*DENSITY*d,b=DENSITY*d,g=d+"_"+a,e={hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,resolution:this.view.resolution};this.tile_data(d,a,e,function(C){var l=document.createElement("canvas"),q=C.data;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(l)}l=$(l);l.get(0).width=Math.ceil(b*k);l.get(0).height=c.height_px;var z=l.get(0).getContext("2d"),n=false,B=c.prefs.min_value,v=c.prefs.max_value,A=c.vertical_range,m=c.total_frequency,u=c.height_px,s=c.mode;var r=Math.round(u+B/A*u);z.beginPath();z.moveTo(0,r);z.lineTo(b*k,r);z.fillStyle="#aaa";z.stroke();z.beginPath();z.fillStyle=c.prefs.color;var p,w,x;if(q.length>1){x=Math.ceil((q[1][0]-q[0][0])*k)}else{x=10}for(var o=0,t=q.length;o<t;o++){p=Math.round((q[o][0]-f)*k);w=q[o][1];if(w===null){if(n&&s==="Filled"){z.lineTo(p,u)}n=false;continue}if(w<B){w=B}else{if(w>v){w=v}}if(s==="Histogram"){w=Math.round(w/A*u);z.fillRect(p,r,x,-w)}else{if(s==="Intensity"){w=255-Math.floor((w-B)/A*255);z.fillStyle="rgb("+w+","+w+","+w+")";z.fillRect(p,0,x,u)}else{w=Math.round(u-(w-B)/A*u);if(n){z.lineTo(p,w)}else{n=true;if(s==="Filled"){z.moveTo(p,u);z.lineTo(p,w)}else{z.moveTo(p,w)}}}}}if(s==="Filled"){if(n){z.lineTo(p,r);z.lineTo(0,r)}z.fill()}else{z.stroke()}h(l)})}});var FeatureTrack=function(a,f,e,j,h,c,d,g){var b=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new TrackConfig({track:this,params:[{key:"block_color",label:"Block color",type:"color",default_value:"#444"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:h,onchange:function(){b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;Track.call(this,a,f,f.viewport_container);TiledTrack.call(this,c,d,g);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=e;this.dataset_id=j;this.original_dataset_id=j;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.default_font=DEFAULT_FONT;this.inc_slots={};this.start_end_dct={};this.tile_cache=new Cache(CACHED_TILES_FEATURE);this.data_cache=new DataCache(20);this.left_offset=200};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{incremental_slots:function(a,h,p){var q=this.inc_slots[a];if(!q||(q.mode!==p)){q={};q.w_scale=a;q.mode=p;this.inc_slots[a]=q;this.start_end_dct[a]={}}var l=q.w_scale,w=[],x=[],j=0,n=this.view.max_low;for(var u=0,v=h.length;u<v;u++){var g=h[u],k=g[0];if(q[k]!==undefined){j=Math.max(j,q[k]);x.push(q[k])}else{w.push(u)}}var d=this.start_end_dct[a];var m=function(D,E){for(var C=0;C<=MAX_FEATURE_DEPTH;C++){var A=false,F=d[C];if(F!==undefined){for(var z=0,B=F.length;z<B;z++){var y=F[z];if(E>y[0]&&D<y[1]){A=true;break}}}if(!A){return C}}return -1};for(var u=0,v=w.length;u<v;u++){var g=h[w[u]],k=g[0],s=g[1],b=g[2],o=g[3],c=Math.floor((s-n)*l),f=Math.ceil((b-n)*l),t=CONTEXT.measureText(o).width,e;if(o!==undefined&&p==="Pack"){t+=(LABEL_SPACING+PACK_SPACING);if(c-t>=0){c-=t;e="left"}else{f+=t;e="right"}}var r=m(c,f);if(r>=0){if(d[r]===undefined){d[r]=[]}d[r].push([c,f]);q[k]=r;j=Math.max(j,r)}else{}}return j+1},draw_summary_tree:function(b,o,n,l,r,j,f,e){var c=j+LABEL_SPACING+CHAR_HEIGHT_PX;delta_x_px=Math.ceil(n*r);var h=$("<div />").addClass("yaxislabel");h.text(l);h.css({position:"absolute",top:"22px",left:"10px"});h.prependTo(this.container_div);var q=b.get(0).getContext("2d");for(var d=0,g=o.length;d<g;d++){var m=Math.floor((o[d][0]-f)*r);var k=o[d][1];if(!k){continue}var p=k/l*j;q.fillStyle="black";q.fillRect(m+e,c-p,delta_x_px,p);var a=4;if(this.prefs.show_counts&&(q.measureText(k).width+a)<delta_x_px){q.fillStyle="#666";q.textAlign="center";q.fillText(k,m+e+(delta_x_px/2),10)}}},draw_element:function(p,f,g,x,j,r,I,M,N,a,A){var u=x[0],K=x[1],C=x[2],s=x[3],D=Math.floor(Math.max(0,(K-r)*M)),q=Math.ceil(Math.min(a,Math.max(0,(C-r)*M))),B=ERROR_PADDING+(g==="Dense"?0:(0+j))*N,o,G,t=null,O=null,d=this.prefs.block_color,F=this.prefs.label_color;if(g==="Dense"){p.fillStyle=d;p.fillRect(D+A,B,q-D,DENSE_FEATURE_HEIGHT)}else{if(g==="no_detail"){p.fillStyle=d;p.fillRect(D+A,B+5,q-D,DENSE_FEATURE_HEIGHT)}else{var n=x[5],z=x[6],E=x[7],e=x[8];if(z&&E){t=Math.floor(Math.max(0,(z-r)*M));O=Math.ceil(Math.min(a,Math.max(0,(E-r)*M)))}var L,v;if(g==="Squish"){L=1;v=SQUISH_FEATURE_HEIGHT}else{L=5;v=PACK_FEATURE_HEIGHT}if(!e){if(x.strand){if(x.strand==="+"){p.fillStyle=RIGHT_STRAND_INV}else{if(x.strand==="-"){p.fillStyle=LEFT_STRAND_INV}}}else{p.fillStyle=d}p.fillRect(D+A,B,q-D,v)}else{var m,w;if(g==="Squish"){p.fillStyle=CONNECTOR_COLOR;m=B+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;w=1}else{if(n){var m=B;var w=v;if(n==="+"){p.fillStyle=RIGHT_STRAND}else{if(n==="-"){p.fillStyle=LEFT_STRAND}}}else{p.fillStyle=CONNECTOR_COLOR;m+=(SQUISH_FEATURE_HEIGHT/2)+1;w=1}}p.fillRect(D+A,m,q-D,w);for(var J=0,c=e.length;J<c;J++){var h=e[J],b=Math.floor(Math.max(0,(h[0]-r)*M)),y=Math.ceil(Math.min(a,Math.max((h[1]-r)*M)));if(b>y){continue}p.fillStyle=d;p.fillRect(b+A,B+(v-L)/2+1,y-b,L);if(t!==undefined&&!(b>O||y<t)){var H=Math.max(b,t),l=Math.min(y,O-1);p.fillRect(H+A,B+1,l-H,v)}}}if(g==="Pack"&&K>r){p.fillStyle=F;if(f===0&&D-p.measureText(s).width<0){p.textAlign="left";p.fillText(s,q+A+LABEL_SPACING,B+8)}else{p.textAlign="right";p.fillText(s,D+A-LABEL_SPACING,B+8)}p.fillStyle=d}}}},get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="no_detail"){a=NO_DETAIL_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT}}}return a},draw_tile:function(z,E,l,n,j,d,p){var v=this;if(v.view.reference_track&&n>CHAR_WIDTH_PX&&d===undefined){return v.view.reference_track.tile_data(z,E,{},function(f){v.draw_tile(z,E,l,n,j,f)})}var G=E*DENSITY*z,a=(E+1)*DENSITY*z,s=a-G,H={hda_ldda:v.hda_ldda,dataset_id:v.dataset_id,resolution:this.view.resolution,mode:this.mode};if(p===undefined){var q=this.data_cache.get_data(G,a,this.mode),J=z+"_"+E+"_"+this.mode;if(q===undefined){return v.tile_data(z,E,H,function(f){v.data_cache.set_data(G,a,this.mode,f);v.draw_tile(z,E,l,n,j,d,f)},J)}p=q}var x=Math.ceil(s*n),u=this.mode,K=25,g=this.left_offset,r,h;var c=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(c)}c=$(c);if(u==="Auto"){if(p.dataset_type==="summary_tree"){u=p.dataset_type}else{if(p.extra_info==="no_detail"){u="no_detail"}else{var I=p.data;if((I.length&&I.length<4)||(this.view.high-this.view.low>MIN_SQUISH_VIEW_WIDTH)){u="Squish"}else{u="Pack"}}}}var A=this.get_y_scale(u);if(u==="summary_tree"){h=this.summary_draw_height}if(u==="Dense"){h=K}else{if(u==="no_detail"||u==="Squish"||u==="Pack"){h=this.incremental_slots(n,p.data,u)*A+K;r=this.inc_slots[n]}}c.get(0).width=x+g;c.get(0).height=h;if(p.dataset_type==="summary_tree"){c.get(0).height+=LABEL_SPACING+CHAR_HEIGHT_PX}l.parent().css("height",Math.max(this.height_px,h)+"px");var y=c.get(0).getContext("2d");y.fillStyle=this.prefs.block_color;y.font=this.default_font;y.textAlign="right";this.container_div.find(".yaxislabel").remove();if(u==="summary_tree"){this.draw_summary_tree(c,p.data,p.delta,p.max,n,h,G,g);return j(c)}if(p.message){c.css({"border-top":"1px solid red"});y.fillStyle="red";y.textAlign="left";var t=y.textBaseline;y.textBaseline="top";y.fillText(p.message,g,0);y.textBaseline=t;if(!p.data){return j(c)}}this.example_feature=(p.data.length?p.data[0]:undefined);var I=p.data;for(var B=0,D=I.length;B<D;B++){var k=I[B],m=k[0],w=k[1],b=k[2],e=(r&&r[m]!==undefined?r[m]:null);var C=false;var o;for(var F=0;F<this.filters.length;F++){o=this.filters[F];o.update_attrs(k);if(!o.keep(k)){C=true;break}}if(C){continue}if(is_overlap([w,b],[G,a])&&(u=="Dense"||e!==null)){this.draw_element(y,E,u,k,e,G,a,n,A,x,g,d)}}j(c)}});var VcfTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="VcfTrack"};$.extend(VcfTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{draw_element:function(u,p,j,e,x,c,m,v,s){var j=data[i],l=j[0],t=j[1],d=j[2]-1,o=j[3],g=Math.floor(Math.max(0,(t-x)*m)),k=Math.ceil(Math.min(s,Math.max(0,(d-x)*m))),f=ERROR_PADDING+(p==="Dense"?0:(0+e))*v,a,y,b=null,n=null;if(no_label){u.fillStyle=block_color;u.fillRect(g+left_offset,f+5,k-g,1)}else{var w=j[4],r=j[5],h=j[6];a=9;y=1;u.fillRect(g+left_offset,f,k-g,a);if(p!=="Dense"&&o!==undefined&&t>x){u.fillStyle=label_color;if(tile_index===0&&g-u.measureText(o).width<0){u.textAlign="left";u.fillText(o,k+2+left_offset,f+8)}else{u.textAlign="right";u.fillText(o,g-2+left_offset,f+8)}u.fillStyle=block_color}var q=w+" / "+r;if(t>x&&u.measureText(q).width<(k-g)){u.fillStyle="white";u.textAlign="center";u.fillText(q,left_offset+g+(k-g)/2,f+8);u.fillStyle=block_color}}}});var ReadTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="ReadTrack";this.difference_mode=true;this.show_insertions=false;this.make_name_popup_menu()};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{get_y_scale:function(b){var a;if(b==="summary_tree"){}if(b==="Dense"){a=DENSE_TRACK_HEIGHT}else{if(b==="Squish"){a=SQUISH_TRACK_HEIGHT}else{a=PACK_TRACK_HEIGHT;if(this.show_insertions){a*=2}}}return a},draw_read:function(m,d,J,n,D,G,e,o,y,a){m.textAlign="center";var l=this,u=[n,D],C=0,z=0,f=0;var r=[];if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){f=Math.round(J/2)}for(var h=0,k=e.length;h<k;h++){var b=e[h],g="MIDNSHP=X"[b[0]],v=b[1];if(g==="H"||g==="S"){C-=v}var x=G+C,B=Math.floor(Math.max(0,(x-n)*J)),E=Math.floor(Math.max(0,(x+v-n)*J));switch(g){case"H":break;case"S":case"M":case"=":var p=compute_overlap([x,x+v],u);if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(f>0){m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset-f,y+1,E-B,9);m.fillStyle=CONNECTOR_COLOR;for(var I=0,j=q.length;I<j;I++){if(this.difference_mode&&a){var s=a[x-n+I];if(!s||s.toLowerCase()===q[I].toLowerCase()){continue}}if(x+I>=n&&x+I<=D){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset,y+9)}}}else{m.fillStyle=this.prefs.block_color;m.fillRect(B+this.left_offset,y+(this.mode!=="Dense"?4:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}z+=v;C+=v;break;case"N":m.fillStyle=CONNECTOR_COLOR;m.fillRect(B+this.left_offset-f,y+5,E-B,1);C+=v;break;case"D":m.fillStyle="red";m.fillRect(B+this.left_offset-f,y+4,E-B,3);C+=v;break;case"P":break;case"I":var p=compute_overlap([x,x+v],u),K=this.left_offset+B-f;if(p!==NO_OVERLAP){var q=o.slice(z,z+v);if(this.show_insertions){var w=this.left_offset+B-(E-B)/2;if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){m.fillStyle="yellow";m.fillRect(w-f,y-9,E-B,9);r[r.length]={type:"triangle",data:[K,y+4,5]};m.fillStyle=CONNECTOR_COLOR;switch(p){case (OVERLAP_START):q=q.slice(n-x);break;case (OVERLAP_END):q=q.slice(0,x-D);break;case (CONTAINED_BY):break;case (CONTAINS):q=q.slice(n-x,x-D);break}for(var I=0,j=q.length;I<j;I++){var A=Math.floor(Math.max(0,(x+I-n)*J));m.fillText(q[I],A+this.left_offset-(E-B)/2,y)}}else{m.fillStyle="yellow";m.fillRect(w,y+(this.mode!=="Dense"?2:5),E-B,(d!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((d==="Pack"||this.mode==="Auto")&&o!==undefined&&J>CHAR_WIDTH_PX){r[r.length]={type:"text",data:[q.length,K,y+9]}}else{}}}z+=v;break;case"X":z+=v;break}}m.fillStyle="yellow";var t,L,H;for(var F=0;F<r.length;F++){t=r[F];L=t.type;H=t.data;if(L==="text"){m.font="bold "+DEFAULT_FONT;m.fillText(H[0],H[1],H[2]);m.font=DEFAULT_FONT}else{if(L=="triangle"){m.drawDownwardEquilateralTriangle(H[0],H[1],H[2])}}}},draw_element:function(w,y,r,k,e,A,b,n,x,u,f,c){var m=k[0],v=k[1],d=k[2],o=k[3],h=Math.floor(Math.max(0,(v-A)*n)),j=Math.ceil(Math.min(u,Math.max(0,(d-A)*n))),g=(r==="Dense"?1:(1+e))*x,z=this.prefs.block_color,l=this.prefs.label_color;t=0;w.fillStyle=z;if(k[5] instanceof Array){var s=Math.floor(Math.max(0,(k[4][0]-A)*n)),q=Math.ceil(Math.min(u,Math.max(0,(k[4][1]-A)*n))),p=Math.floor(Math.max(0,(k[5][0]-A)*n)),a=Math.ceil(Math.min(u,Math.max(0,(k[5][1]-A)*n)));if(k[4][1]>=A&&k[4][0]<=b&&k[4][2]){this.draw_read(w,r,n,A,b,k[4][0],k[4][2],k[4][3],g,c)}if(k[5][1]>=A&&k[5][0]<=b&&k[5][2]){this.draw_read(w,r,n,A,b,k[5][0],k[5][2],k[5][3],g,c)}if(p>q){w.fillStyle=CONNECTOR_COLOR;w.dashedLine(q+f,g+5,f+p,g+5)}}else{w.fillStyle=z;this.draw_read(w,r,n,A,b,v,k[4],k[5],g,c)}if(r==="Pack"&&v>A){w.fillStyle=this.prefs.label_color;if((r==="Pack"||this.mode==="Auto")&&n>CHAR_WIDTH_PX){var t=Math.round(n/2)}if(y===0&&h-w.measureText(o).width<0){w.textAlign="left";w.fillText(o,j+f+LABEL_SPACING-t,g+8)}else{w.textAlign="right";w.fillText(o,h+f-LABEL_SPACING-t,g+8)}w.fillStyle=z}}});var ToolDataFeatureTrack=function(e,c,g,a,d,f,b){FeatureTrack.call(this,e,c,g,a,d,f,{},b);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};$.extend(ToolDataFeatureTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{predraw_init:function(){var b=this;var a=function(){if(b.data_cache.size()===0){setTimeout(a,300)}else{b.data_url=default_data_url;b.data_query_wait=DEFAULT_DATA_QUERY_WAIT;b.dataset_state_url=converted_datasets_state_url;$.getJSON(b.dataset_state_url,{dataset_id:b.dataset_id,hda_ldda:b.hda_ldda},function(c){})}};a()}});
\ No newline at end of file
--- a/templates/tracks/browser.mako Thu Mar 10 16:11:49 2011 -0500
+++ b/templates/tracks/browser.mako Thu Mar 10 16:42:34 2011 -0500
@@ -10,29 +10,29 @@
</%def><%def name="stylesheets()">
-${parent.stylesheets()}
+ ${parent.stylesheets()}
-${h.css( "history", "autocomplete_tagging", "trackster", "overcast/jquery-ui-1.8.5.custom" )}
+ ${h.css( "history", "autocomplete_tagging", "trackster", "overcast/jquery-ui-1.8.5.custom" )}
-<style type="text/css">
- #browser-container {
- overflow: none;
- }
- .nav-container {
- width: 100%;
- ## Overriding styles from trackster.css to push nav up into title bar
- height: 0;
- text-align: center;
- }
- .nav {
- ## Overriding styles from trackster.css to push nav up into title bar
- position: relative;
- display: inline-block;
- top: -2em;
- background: transparent;
- border: none;
- }
-</style>
+ <style type="text/css">
+ #browser-container {
+ overflow: none;
+ }
+ .nav-container {
+ width: 100%;
+ ## Overriding styles from trackster.css to push nav up into title bar
+ height: 0;
+ text-align: center;
+ }
+ .nav {
+ ## Overriding styles from trackster.css to push nav up into title bar
+ position: relative;
+ display: inline-block;
+ top: -2em;
+ background: transparent;
+ border: none;
+ }
+ </style></%def><%def name="center_panel()">
--- a/templates/visualization/display.mako Thu Mar 10 16:11:49 2011 -0500
+++ b/templates/visualization/display.mako Thu Mar 10 16:42:34 2011 -0500
@@ -8,17 +8,39 @@
<script type='text/javascript' src="${h.url_for('/static/scripts/excanvas.js')}"></script><![endif]-->
- ${h.js( "jquery.event.drag", "jquery.autocomplete", "trackster" )}
+ ${h.js( "jquery.event.drag", "jquery.autocomplete", "jquery.mousewheel", "jquery.autocomplete", "trackster", "jquery.ui.sortable.slider", "jquery.scrollTo", "farbtastic" )}
</%def><%def name="stylesheets()">
${parent.stylesheets()}
-
+
+ ## For page:
<style type="text/css">
.page-body {
padding: 0px;
}
+ </style>
+ ## For visualization (TODO: copied from browser.mako):
+ ${h.css( "trackster", "overcast/jquery-ui-1.8.5.custom" )}
+ <style type="text/css">
+ #browser-container {
+ overflow: none;
+ }
+ .nav-container {
+ width: 100%;
+ ## Overriding styles from trackster.css to push nav up into title bar
+ height: 0;
+ text-align: center;
+ }
+ .nav {
+ ## Overriding styles from trackster.css to push nav up into title bar
+ position: relative;
+ display: inline-block;
+ top: -2em;
+ background: transparent;
+ border: none;
+ }
</style></%def>
@@ -34,10 +56,19 @@
<div id="${visualization.id}" class="unified-panel-body" style="overflow:none;top:0px;"></div><script type="text/javascript">
-
- var data_url = "${h.url_for( controller='/tracks', action='data' )}",
+ // TODO: much of this code is copied from browser.mako -- create shared base and use in both places.
+
+ //
+ // Place URLs here so that url_for can be used to generate them.
+ //
+ var default_data_url = "${h.url_for( controller='/tracks', action='data' )}",
+ raw_data_url = "${h.url_for( controller='/tracks', action='raw_data' )}",
+ run_tool_url = "${h.url_for( controller='/tracks', action='run_tool' )}",
reference_url = "${h.url_for( controller='/tracks', action='reference' )}",
chrom_url = "${h.url_for( controller='/tracks', action='chroms' )}",
+ dataset_state_url = "${h.url_for( controller='/tracks', action='dataset_state' )}",
+ converted_datasets_state_url = "${h.url_for( controller='/tracks', action='converted_datasets_state' )}",
+ addable_track_types = { "LineTrack": LineTrack, "FeatureTrack": FeatureTrack, "ReadTrack": ReadTrack },
view,
container_element = $("#${visualization.id}");
@@ -48,12 +79,60 @@
} else { // Viewing just one shared viz
$("#right-border").live("click", function() { view.resize_window(); });
}
- view = new View( container_element, "${config.get('title') | h}", "${config.get('vis_id')}", "${config.get('dbkey')}" );
- %for track in config.get('tracks'):
- view.add_track(
- new ${track["track_type"]}( "${track['name'] | h}", view, ${track['dataset_id']}, ${track['prefs']} )
- );
- %endfor
+
+ // Create view and add tracks.
+ var callback;
+ %if 'viewport' in config:
+ var callback = function() { view.change_chrom( '${config['viewport']['chrom']}', ${config['viewport']['start']}, ${config['viewport']['end']} ); }
+ %endif
+ view = new View(container_element, "${config.get('title') | h}", "${config.get('vis_id')}", "${config.get('dbkey')}", callback);
+ ## A little ugly and redundant, but it gets the job done moving the config from python to JS:
+ var tracks_config = JSON.parse('${ h.to_json_string( config.get('tracks') ) }');
+ var track_config, track, parent_track, parent_obj;
+ for (var i = 0; i < tracks_config.length; i++) {
+ track_config = tracks_config[i];
+ track = new addable_track_types[track_config["track_type"]](
+ track_config['name'],
+ view,
+ track_config['hda_ldda'],
+ track_config['dataset_id'],
+ track_config['prefs'],
+ track_config['filters'],
+ track_config['tool'],
+ (track_config.is_child ? parent_track : undefined));
+ parent_obj = view;
+ if (track_config.is_child) {
+ parent_obj = parent_track;
+ }
+ else {
+ // New parent track is this track.
+ parent_track = track;
+ }
+ parent_obj.add_track(track);
+ }
+
+ //
+ // Keyboard navigation. Scroll ~7% of height when scrolling up/down.
+ //
+ $(document).keydown(function(e) {
+ // Key codes: left == 37, up == 38, right == 39, down == 40
+ switch(e.which) {
+ case 37:
+ view.move_fraction(0.25);
+ break
+ case 38:
+ var change = Math.round(view.viewport_container.height()/15.0);
+ view.viewport_container.scrollTo('-=' + change + 'px');
+ break;
+ case 39:
+ view.move_fraction(-0.25);
+ break;
+ case 40:
+ var change = Math.round(view.viewport_container.height()/15.0);
+ view.viewport_container.scrollTo('+=' + change + 'px');
+ break;
+ }
+ });
});
</script>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new changesets in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/d69e36d1d2f6/
changeset: r5210:d69e36d1d2f6
user: kanwei
date: 2011-03-10 22:09:03
summary: Make workflow run_complete.mako modern
affected #: 1 file (621 bytes)
--- a/templates/workflow/run_complete.mako Thu Mar 10 15:48:00 2011 -0500
+++ b/templates/workflow/run_complete.mako Thu Mar 10 16:09:03 2011 -0500
@@ -1,38 +1,20 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<%inherit file="/base.mako"/>
-<head>
-<link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
-<script>
-if ( parent.frames && parent.frames.galaxy_history ) {
- parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history' ) }";
-}
-</script>
-</head>
-
-<body>
- <div class="donemessage">
- <p>
- Successfully ran workflow "${workflow.name}", the following datasets have
- been added to the queue.
- %if new_history:
- These datasets will appear in a new history:
- <a target='galaxy_history' href="${h.url_for( controller='history', action='list', operation="Switch", id=trans.security.encode_id(new_history.id), use_panels=False, show_deleted=False )}">
- '${h.to_unicode(new_history.name)}'.
- </a>
- %endif
- </p>
- <div style="padding-left: 10px;">
- %for step_outputs in outputs.itervalues():
- %for data in step_outputs.itervalues():
- %if not new_history or data.history == new_history:
- <p><b>${data.hid}</b>: ${data.name}</p>
- %endif
- %endfor
+<div class="donemessagelarge">
+ Successfully ran workflow "${workflow.name}". The following datasets have been added to the queue:
+ %if new_history:
+ These datasets will appear in a new history:
+ <a target='galaxy_history' href="${h.url_for( controller='history', action='list', operation="Switch", id=trans.security.encode_id(new_history.id), use_panels=False, show_deleted=False )}">
+ '${h.to_unicode(new_history.name)}'.
+ </a>
+ %endif
+ <div style="padding-left: 10px;">
+ %for step_outputs in outputs.itervalues():
+ %for data in step_outputs.itervalues():
+ %if not new_history or data.history == new_history:
+ <p><strong>${data.hid}</strong>: ${data.name}</p>
+ %endif
%endfor
- </div>
+ %endfor
</div>
-</body>
-
-</html>
+</div>
\ No newline at end of file
http://bitbucket.org/galaxy/galaxy-central/changeset/394e58a5e63c/
changeset: r5211:394e58a5e63c
user: kanwei
date: 2011-03-10 22:11:49
summary: merge
affected #: 0 files (0 bytes)
--- a/tool-data/shared/ucsc/manual_builds.txt Thu Mar 10 16:09:03 2011 -0500
+++ b/tool-data/shared/ucsc/manual_builds.txt Thu Mar 10 16:11:49 2011 -0500
@@ -696,3 +696,5 @@
Spur_v2.6 Purple Sea Urchin (Strongylocentrotus purpuratus) v2.6
Ptrichocarpa_156 Poplar (Populus trichocarpa)
Hydra_JCVI Hydra magnipapillata str. 105
+Araly1 Arabidopsis lyrata
+Zea_mays_B73_RefGen_v2 Maize (Zea mays) chr1=301354135,chr2=237068928,chr3=232140222,chr4=241473566,chr5=217872898,chr6=169174371,chr7=176764813,chr8=175793772,chr9=156750718,chr10=150189513,chr11=7140224
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: kellyv: Added two more builds to the manual builds list
by Bitbucket 10 Mar '11
by Bitbucket 10 Mar '11
10 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/0c5d60534ea8/
changeset: r5209:0c5d60534ea8
user: kellyv
date: 2011-03-10 22:08:39
summary: Added two more builds to the manual builds list
affected #: 1 file (233 bytes)
--- a/tool-data/shared/ucsc/manual_builds.txt Thu Mar 10 15:48:00 2011 -0500
+++ b/tool-data/shared/ucsc/manual_builds.txt Thu Mar 10 16:08:39 2011 -0500
@@ -696,3 +696,5 @@
Spur_v2.6 Purple Sea Urchin (Strongylocentrotus purpuratus) v2.6
Ptrichocarpa_156 Poplar (Populus trichocarpa)
Hydra_JCVI Hydra magnipapillata str. 105
+Araly1 Arabidopsis lyrata
+Zea_mays_B73_RefGen_v2 Maize (Zea mays) chr1=301354135,chr2=237068928,chr3=232140222,chr4=241473566,chr5=217872898,chr6=169174371,chr7=176764813,chr8=175793772,chr9=156750718,chr10=150189513,chr11=7140224
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Add a checkbox to the Create Group page that if checked will create a new Role with the same name. This provides a similar feature the the existing checkbox on the Create Role page.
by Bitbucket 10 Mar '11
by Bitbucket 10 Mar '11
10 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/8c04153e4cf6/
changeset: r5208:8c04153e4cf6
user: greg
date: 2011-03-10 21:48:00
summary: Add a checkbox to the Create Group page that if checked will create a new Role with the same name. This provides a similar feature the the existing checkbox on the Create Role page.
However, the behavior is now changed such that new associations are created when the checkbox is checked whereas before, only the Group or Role objects with the same name were created, but not associated with anything.
This code was very old, so I did some cleanup / improvements as well. Functional tests enhanced to reflect changes.
affected #: 6 files (3.9 KB)
--- a/lib/galaxy/web/base/controller.py Thu Mar 10 15:20:40 2011 -0500
+++ b/lib/galaxy/web/base/controller.py Thu Mar 10 15:48:00 2011 -0500
@@ -1185,16 +1185,24 @@
webapp = params.get( 'webapp', 'galaxy' )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
+ name = util.restore_text( params.get( 'name', '' ) )
+ description = util.restore_text( params.get( 'description', '' ) )
+ in_users = util.listify( params.get( 'in_users', [] ) )
+ out_users = util.listify( params.get( 'out_users', [] ) )
+ in_groups = util.listify( params.get( 'in_groups', [] ) )
+ out_groups = util.listify( params.get( 'out_groups', [] ) )
+ create_group_for_role = params.get( 'create_group_for_role', '' )
+ create_group_for_role_checked = CheckboxField.is_checked( create_group_for_role )
+ ok = True
if params.get( 'create_role_button', False ):
- name = util.restore_text( params.name )
- description = util.restore_text( params.description )
- in_users = util.listify( params.get( 'in_users', [] ) )
- in_groups = util.listify( params.get( 'in_groups', [] ) )
- create_group_for_role = params.get( 'create_group_for_role', 'no' )
if not name or not description:
- message = "Enter a valid name and a description"
+ message = "Enter a valid name and a description."
+ status = 'error'
+ ok = False
elif trans.sa_session.query( trans.app.model.Role ).filter( trans.app.model.Role.table.c.name==name ).first():
- message = "A role with that name already exists"
+ message = "Role names must be unique and a role with that name already exists, so choose another name."
+ status = 'error'
+ ok = False
else:
# Create the role
role = trans.app.model.Role( name=name, description=description, type=trans.app.model.Role.types.ADMIN )
@@ -1207,41 +1215,44 @@
for group in [ trans.sa_session.query( trans.app.model.Group ).get( x ) for x in in_groups ]:
gra = trans.app.model.GroupRoleAssociation( group, role )
trans.sa_session.add( gra )
- if create_group_for_role == 'yes':
+ if create_group_for_role_checked:
# Create the group
group = trans.app.model.Group( name=name )
trans.sa_session.add( group )
- message = "Group '%s' has been created, and role '%s' has been created with %d associated users and %d associated groups" % \
- ( group.name, role.name, len( in_users ), len( in_groups ) )
+ # Associate the group with the role
+ gra = trans.model.GroupRoleAssociation( group, role )
+ trans.sa_session.add( gra )
+ num_in_groups = len( in_groups ) + 1
else:
- message = "Role '%s' has been created with %d associated users and %d associated groups" % ( role.name, len( in_users ), len( in_groups ) )
+ num_in_groups = len( in_groups )
trans.sa_session.flush()
+ message = "Role '%s' has been created with %d associated users and %d associated groups. " \
+ % ( role.name, len( in_users ), num_in_groups )
+ if create_group_for_role_checked:
+ message += 'One of the groups associated with this role is the newly created group with the same name.'
trans.response.send_redirect( web.url_for( controller='admin',
action='roles',
webapp=webapp,
message=util.sanitize_text( message ),
status='done' ) )
- trans.response.send_redirect( web.url_for( controller='admin',
- action='create_role',
- webapp=webapp,
- message=util.sanitize_text( message ),
- status='error' ) )
- out_users = []
- for user in trans.sa_session.query( trans.app.model.User ) \
- .filter( trans.app.model.User.table.c.deleted==False ) \
- .order_by( trans.app.model.User.table.c.email ):
- out_users.append( ( user.id, user.email ) )
- out_groups = []
- for group in trans.sa_session.query( trans.app.model.Group ) \
- .filter( trans.app.model.Group.table.c.deleted==False ) \
- .order_by( trans.app.model.Group.table.c.name ):
- out_groups.append( ( group.id, group.name ) )
+ if ok:
+ for user in trans.sa_session.query( trans.app.model.User ) \
+ .filter( trans.app.model.User.table.c.deleted==False ) \
+ .order_by( trans.app.model.User.table.c.email ):
+ out_users.append( ( user.id, user.email ) )
+ for group in trans.sa_session.query( trans.app.model.Group ) \
+ .filter( trans.app.model.Group.table.c.deleted==False ) \
+ .order_by( trans.app.model.Group.table.c.name ):
+ out_groups.append( ( group.id, group.name ) )
return trans.fill_template( '/admin/dataset_security/role/role_create.mako',
- in_users=[],
+ webapp=webapp,
+ name=name,
+ description=description,
+ in_users=in_users,
out_users=out_users,
- in_groups=[],
+ in_groups=in_groups,
out_groups=out_groups,
- webapp=webapp,
+ create_group_for_role_checked=create_group_for_role_checked,
message=message,
status=status )
@web.expose
@@ -1617,14 +1628,23 @@
webapp = params.get( 'webapp', 'galaxy' )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
+ name = util.restore_text( params.get( 'name', '' ) )
+ in_users = util.listify( params.get( 'in_users', [] ) )
+ out_users = util.listify( params.get( 'out_users', [] ) )
+ in_roles = util.listify( params.get( 'in_roles', [] ) )
+ out_roles = util.listify( params.get( 'out_roles', [] ) )
+ create_role_for_group = params.get( 'create_role_for_group', '' )
+ create_role_for_group_checked = CheckboxField.is_checked( create_role_for_group )
+ ok = True
if params.get( 'create_group_button', False ):
- name = util.restore_text( params.name )
- in_users = util.listify( params.get( 'in_users', [] ) )
- in_roles = util.listify( params.get( 'in_roles', [] ) )
if not name:
- message = "Enter a valid name"
+ message = "Enter a valid name."
+ status = 'error'
+ ok = False
elif trans.sa_session.query( trans.app.model.Group ).filter( trans.app.model.Group.table.c.name==name ).first():
- message = "A group with that name already exists"
+ message = "Group names must be unique and a group with that name already exists, so choose another name."
+ status = 'error'
+ ok = False
else:
# Create the group
group = trans.app.model.Group( name=name )
@@ -1634,39 +1654,49 @@
for user in [ trans.sa_session.query( trans.app.model.User ).get( x ) for x in in_users ]:
uga = trans.app.model.UserGroupAssociation( user, group )
trans.sa_session.add( uga )
- trans.sa_session.flush()
# Create the GroupRoleAssociations
for role in [ trans.sa_session.query( trans.app.model.Role ).get( x ) for x in in_roles ]:
gra = trans.app.model.GroupRoleAssociation( group, role )
trans.sa_session.add( gra )
- trans.sa_session.flush()
- message = "Group '%s' has been created with %d associated users and %d associated roles" % ( name, len( in_users ), len( in_roles ) )
+ if create_role_for_group_checked:
+ # Create the role
+ role = trans.app.model.Role( name=name, description='Role for group %s' % name )
+ trans.sa_session.add( role )
+ # Associate the role with the group
+ gra = trans.model.GroupRoleAssociation( group, role )
+ trans.sa_session.add( gra )
+ num_in_roles = len( in_roles ) + 1
+ else:
+ num_in_roles = len( in_roles )
+ trans.sa_session.flush()
+ message = "Group '%s' has been created with %d associated users and %d associated roles. " \
+ % ( group.name, len( in_users ), num_in_roles )
+ if create_role_for_group_checked:
+ message += 'One of the roles associated with this group is the newly created role with the same name.'
trans.response.send_redirect( web.url_for( controller='admin',
action='groups',
webapp=webapp,
message=util.sanitize_text( message ),
status='done' ) )
- trans.response.send_redirect( web.url_for( controller='admin',
- action='create_group',
- webapp=webapp,
- message=util.sanitize_text( message ),
- status='error' ) )
- out_users = []
- for user in trans.sa_session.query( trans.app.model.User ) \
- .filter( trans.app.model.User.table.c.deleted==False ) \
- .order_by( trans.app.model.User.table.c.email ):
- out_users.append( ( user.id, user.email ) )
- out_roles = []
- for role in trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name ):
- out_roles.append( ( role.id, role.name ) )
+
+
+ if ok:
+ for user in trans.sa_session.query( trans.app.model.User ) \
+ .filter( trans.app.model.User.table.c.deleted==False ) \
+ .order_by( trans.app.model.User.table.c.email ):
+ out_users.append( ( user.id, user.email ) )
+ for role in trans.sa_session.query( trans.app.model.Role ) \
+ .filter( trans.app.model.Role.table.c.deleted==False ) \
+ .order_by( trans.app.model.Role.table.c.name ):
+ out_roles.append( ( role.id, role.name ) )
return trans.fill_template( '/admin/dataset_security/group/group_create.mako',
- in_users=[],
+ webapp=webapp,
+ name=name,
+ in_users=in_users,
out_users=out_users,
- in_roles=[],
+ in_roles=in_roles,
out_roles=out_roles,
- webapp=webapp,
+ create_role_for_group_checked=create_role_for_group_checked,
message=message,
status=status )
@web.expose
--- a/lib/galaxy/web/controllers/library_common.py Thu Mar 10 15:20:40 2011 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Thu Mar 10 15:48:00 2011 -0500
@@ -1986,13 +1986,7 @@
# We've been called from a menu option for a library dataset search result set
move_ldda_ids = util.listify( item_id )
if move_ldda_ids:
- # Checkboxes cause 2 copies of each id to be included in the request
move_ldda_ids = map( trans.security.decode_id, move_ldda_ids )
- unique_ldda_ids = []
- for ldda_id in move_ldda_ids:
- if ldda_id not in unique_ldda_ids:
- unique_ldda_ids.append( ldda_id )
- move_ldda_ids = unique_ldda_ids
elif item_type == 'folder':
move_folder_id = item_id
move_folder = trans.sa_session.query( trans.model.LibraryFolder ).get( trans.security.decode_id( move_folder_id ) )
--- a/templates/admin/dataset_security/group/group_create.mako Thu Mar 10 15:20:40 2011 -0500
+++ b/templates/admin/dataset_security/group/group_create.mako Thu Mar 10 15:48:00 2011 -0500
@@ -42,7 +42,12 @@
});
});
</script>
-
+
+<%
+ from galaxy.web.form_builder import CheckboxField
+ create_role_for_group_checkbox = CheckboxField( 'create_role_for_group' )
+%>
+
%if message:
${render_msg( message, status )}
%endif
@@ -54,7 +59,7 @@
<div class="form-row"><input name="webapp" type="hidden" value="${webapp}" size=40"/><label>Name:</label>
- <input name="name" type="textfield" value="" size=40"/>
+ <input name="name" type="textfield" value="${name}" size=40"/></div><div class="form-row"><div style="float: left; margin-right: 10px;">
@@ -81,6 +86,12 @@
</div></div><div class="form-row">
+ %if create_role_for_group_checked:
+ <% create_role_for_group_checkbox.checked = True %>
+ %endif
+ ${create_role_for_group_checkbox.get_html()} Create a new role of the same name for this group
+ </div>
+ <div class="form-row"><input type="submit" name="create_group_button" value="Save"/></div></form>
--- a/templates/admin/dataset_security/role/role_create.mako Thu Mar 10 15:20:40 2011 -0500
+++ b/templates/admin/dataset_security/role/role_create.mako Thu Mar 10 15:48:00 2011 -0500
@@ -19,30 +19,35 @@
</%def><script type="text/javascript">
-$().ready(function() {
- $('#groups_add_button').click(function() {
- return !$('#out_groups option:selected').remove().appendTo('#in_groups');
- });
- $('#groups_remove_button').click(function() {
- return !$('#in_groups option:selected').remove().appendTo('#out_groups');
- });
- $('#users_add_button').click(function() {
- return !$('#out_users option:selected').remove().appendTo('#in_users');
- });
- $('#users_remove_button').click(function() {
- return !$('#in_users option:selected').remove().appendTo('#out_users');
- });
- $('form#associate_role_group_user').submit(function() {
- $('#in_groups option').each(function(i) {
- $(this).attr("selected", "selected");
+ $().ready(function() {
+ $('#groups_add_button').click(function() {
+ return !$('#out_groups option:selected').remove().appendTo('#in_groups');
});
- $('#in_users option').each(function(i) {
- $(this).attr("selected", "selected");
+ $('#groups_remove_button').click(function() {
+ return !$('#in_groups option:selected').remove().appendTo('#out_groups');
+ });
+ $('#users_add_button').click(function() {
+ return !$('#out_users option:selected').remove().appendTo('#in_users');
+ });
+ $('#users_remove_button').click(function() {
+ return !$('#in_users option:selected').remove().appendTo('#out_users');
+ });
+ $('form#associate_role_group_user').submit(function() {
+ $('#in_groups option').each(function(i) {
+ $(this).attr("selected", "selected");
+ });
+ $('#in_users option').each(function(i) {
+ $(this).attr("selected", "selected");
+ });
});
});
-});
</script>
+<%
+ from galaxy.web.form_builder import CheckboxField
+ create_group_for_role_checkbox = CheckboxField( 'create_group_for_role' )
+%>
+
%if message:
${render_msg( message, status )}
%endif
@@ -54,11 +59,11 @@
<div class="form-row"><input name="webapp" type="hidden" value="${webapp}" size=40"/><label>Name:</label>
- <input name="name" type="textfield" value="" size=40"/>
+ <input name="name" type="textfield" value="${name}" size=40"/></div><div class="form-row"><label>Description:</label>
- <input name="description" type="textfield" value="" size=40"/>
+ <input name="description" type="textfield" value="${description}" size=40"/></div><div class="form-row"><div style="float: left; margin-right: 10px;">
@@ -85,7 +90,10 @@
</div></div><div class="form-row">
- <input type="checkbox" name="create_group_for_role" value="yes" />Create a new group of the same name for this role
+ %if create_group_for_role_checked:
+ <% create_group_for_role_checkbox.checked = True %>
+ %endif
+ ${create_group_for_role_checkbox.get_html()} Create a new group of the same name for this role
</div><div class="form-row"><input type="submit" name="create_role_button" value="Save"/>
--- a/test/base/twilltestcase.py Thu Mar 10 15:20:40 2011 -0500
+++ b/test/base/twilltestcase.py Thu Mar 10 15:48:00 2011 -0500
@@ -1229,25 +1229,22 @@
description="This is Role One",
in_user_ids=[],
in_group_ids=[],
- create_group_for_role='no',
- private_role='' ):
+ create_group_for_role='',
+ private_role='',
+ strings_displayed=[] ):
"""Create a new role"""
- url = "%s/admin/roles?operation=create&create_role_button=Save&name=%s&description=%s" % ( self.url, name.replace( ' ', '+' ), description.replace( ' ', '+' ) )
+ url = "%s/admin/roles?operation=create&create_role_button=Save&name=%s&description=%s" % \
+ ( self.url, name.replace( ' ', '+' ), description.replace( ' ', '+' ) )
if in_user_ids:
url += "&in_users=%s" % ','.join( in_user_ids )
if in_group_ids:
url += "&in_groups=%s" % ','.join( in_group_ids )
if create_group_for_role == 'yes':
- url += '&create_group_for_role=yes'
+ url += '&create_group_for_role=yes&create_group_for_role=yes'
self.home()
self.visit_url( url )
- if create_group_for_role == 'yes':
- check_str = "Group '%s' has been created, and role '%s' has been created with %d associated users and %d associated groups" % \
- ( name, name, len( in_user_ids ), len( in_group_ids ) )
- else:
- check_str = "Role '%s' has been created with %d associated users and %d associated groups" % \
- ( name, len( in_user_ids ), len( in_group_ids ) )
- self.check_page_for_string( check_str )
+ for check_str in strings_displayed:
+ self.check_page_for_string( check_str )
if private_role:
# Make sure no private roles are displayed
try:
@@ -1304,17 +1301,19 @@
self.home()
# Tests associated with groups
- def create_group( self, name='Group One', in_user_ids=[], in_role_ids=[] ):
+ def create_group( self, name='Group One', in_user_ids=[], in_role_ids=[], create_role_for_group='', strings_displayed=[] ):
"""Create a new group"""
url = "%s/admin/groups?operation=create&create_group_button=Save&name=%s" % ( self.url, name.replace( ' ', '+' ) )
if in_user_ids:
url += "&in_users=%s" % ','.join( in_user_ids )
if in_role_ids:
url += "&in_roles=%s" % ','.join( in_role_ids )
+ if create_role_for_group == 'yes':
+ url += '&create_role_for_group=yes&create_role_for_group=yes'
self.home()
self.visit_url( url )
- check_str = "Group '%s' has been created with %d associated users and %d associated roles" % ( name, len( in_user_ids ), len( in_role_ids ) )
- self.check_page_for_string( check_str )
+ for check_str in strings_displayed:
+ self.check_page_for_string( check_str )
self.home()
self.visit_url( "%s/admin/groups" % self.url )
self.check_page_for_string( name )
--- a/test/functional/test_admin_features.py Thu Mar 10 15:20:40 2011 -0500
+++ b/test/functional/test_admin_features.py Thu Mar 10 15:48:00 2011 -0500
@@ -126,21 +126,26 @@
# Logged in as admin_user
name = 'Role One'
description = "This is Role Ones description"
- user_ids=[ str( admin_user.id ), str( regular_user1.id ), str( regular_user3.id ) ]
+ in_user_ids = [ str( admin_user.id ), str( regular_user1.id ), str( regular_user3.id ) ]
+ in_group_ids = []
+ # Add 1 to the number of associated groups since we are creating a new one with the same name as the role
+ num_gras = len( in_group_ids ) + 1
self.create_role( name=name,
description=description,
- in_user_ids=user_ids,
- in_group_ids=[],
+ in_user_ids=in_user_ids,
+ in_group_ids=in_group_ids,
create_group_for_role='yes',
- private_role=admin_user.email )
+ private_role=admin_user.email,
+ strings_displayed=[ "Role '%s' has been created with %d associated users and %d associated groups." % ( name, len( in_user_ids ), num_gras ),
+ "One of the groups associated with this role is the newly created group with the same name." ] )
# Get the role object for later tests
global role_one
role_one = sa_session.query( galaxy.model.Role ).filter( galaxy.model.Role.table.c.name==name ).first()
assert role_one is not None, 'Problem retrieving role named "Role One" from the database'
# Make sure UserRoleAssociations are correct
- if len( role_one.users ) != len( user_ids ):
+ if len( role_one.users ) != len( in_user_ids ):
raise AssertionError( '%d UserRoleAssociations were created for role id %d when it was created ( should have been %d )' \
- % ( len( role_one.users ), role_one.id, len( user_ids ) ) )
+ % ( len( role_one.users ), role_one.id, len( in_user_ids ) ) )
# Each of the following users should now have 2 role associations, their private role and role_one
for user in [ admin_user, regular_user1, regular_user3 ]:
refresh( user )
@@ -162,29 +167,36 @@
# Reset the role back to the original name and description
self.rename_role( self.security.encode_id( role_one.id ), name=name, description=description )
def test_035_create_group( self ):
- """Testing creating new group with 3 members and 1 associated role, then renaming it"""
+ """Testing creating new group with 3 members and 2 associated roles, then renaming it"""
# Logged in as admin_user
name = "Group One's Name"
- user_ids=[ str( admin_user.id ), str( regular_user1.id ), str( regular_user3.id ) ]
- role_ids=[ str( role_one.id ) ]
- self.create_group( name=name, in_user_ids=user_ids, in_role_ids=role_ids )
+ in_user_ids = [ str( admin_user.id ), str( regular_user1.id ), str( regular_user3.id ) ]
+ in_role_ids = [ str( role_one.id ) ]
+ # The number of GroupRoleAssociations should be 2, role_one and the newly created role named 'Group One's Name'
+ num_gras = len( in_role_ids ) + 1
+ self.create_group( name=name,
+ in_user_ids=in_user_ids,
+ in_role_ids=in_role_ids,
+ create_role_for_group='yes',
+ strings_displayed=[ "Group '%s' has been created with %d associated users and %d associated roles." % ( name, len( in_user_ids ), num_gras ),
+ "One of the roles associated with this group is the newly created role with the same name." ] )
# Get the group object for later tests
global group_one
group_one = get_group_by_name( name )
assert group_one is not None, 'Problem retrieving group named "Group One" from the database'
# Make sure UserGroupAssociations are correct
- if len( group_one.users ) != len( user_ids ):
+ if len( group_one.users ) != len( in_user_ids ):
raise AssertionError( '%d UserGroupAssociations were created for group id %d when it was created ( should have been %d )' \
- % ( len( group_one.users ), group_one.id, len( user_ids ) ) )
+ % ( len( group_one.users ), group_one.id, len( in_user_ids ) ) )
# Each user should now have 1 group association, group_one
for user in [ admin_user, regular_user1, regular_user3 ]:
refresh( user )
if len( user.groups ) != 1:
raise AssertionError( '%d UserGroupAssociations are associated with user %s ( should be 1 )' % ( len( user.groups ), user.email ) )
# Make sure GroupRoleAssociations are correct
- if len( group_one.roles ) != len( role_ids ):
+ if len( group_one.roles ) != num_gras:
raise AssertionError( '%d GroupRoleAssociations were created for group id %d when it was created ( should have been %d )' \
- % ( len( group_one.roles ), group_one.id, len( role_ids ) ) )
+ % ( len( group_one.roles ), group_one.id, num_gras ) )
# Rename the group
rename = "Group One's been Renamed"
self.rename_group( self.security.encode_id( group_one.id ), name=rename, )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: dan: Allow composite datatype datasets to be populated in the Upload tool from files that were uploaded to the Galaxy FTP server.
by Bitbucket 10 Mar '11
by Bitbucket 10 Mar '11
10 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/72d560d3e7fd/
changeset: r5207:72d560d3e7fd
user: dan
date: 2011-03-10 21:20:40
summary: Allow composite datatype datasets to be populated in the Upload tool from files that were uploaded to the Galaxy FTP server.
affected #: 1 file (1.6 KB)
--- a/lib/galaxy/tools/parameters/grouping.py Thu Mar 10 13:28:33 2011 -0500
+++ b/lib/galaxy/tools/parameters/grouping.py Thu Mar 10 15:20:40 2011 -0500
@@ -245,6 +245,7 @@
def get_one_filename( context ):
data_file = context['file_data']
url_paste = context['url_paste']
+ ftp_files = context['ftp_files']
name = context.get( 'NAME', None )
info = context.get( 'INFO', None )
warnings = []
@@ -252,13 +253,34 @@
if context.get( 'space_to_tab', None ) not in [ "None", None, False ]:
space_to_tab = True
file_bunch = get_data_file_filename( data_file, override_name = name, override_info = info )
- if file_bunch.path and url_paste:
- if url_paste.strip():
+ if file_bunch.path:
+ if url_paste is not None and url_paste.strip():
warnings.append( "All file contents specified in the paste box were ignored." )
- else: #we need to use url_paste
+ if ftp_files:
+ warnings.append( "All FTP uploaded file selections were ignored." )
+ elif url_paste is not None and url_paste.strip(): #we need to use url_paste
for file_bunch in get_url_paste_urls_or_filename( context, override_name = name, override_info = info ):
if file_bunch.path:
break
+ if file_bunch.path and ftp_files is not None:
+ warnings.append( "All FTP uploaded file selections were ignored." )
+ elif ftp_files is not None and trans.user is not None: # look for files uploaded via FTP
+ user_ftp_dir = os.path.join( trans.app.config.ftp_upload_dir, trans.user.email )
+ for ( dirpath, dirnames, filenames ) in os.walk( user_ftp_dir ):
+ for filename in filenames:
+ for ftp_filename in ftp_files:
+ if ftp_filename == filename:
+ path = relpath( os.path.join( dirpath, filename ), user_ftp_dir )
+ if not os.path.islink( os.path.join( dirpath, filename ) ):
+ ftp_data_file = { 'local_filename' : os.path.abspath( os.path.join( user_ftp_dir, path ) ),
+ 'filename' : os.path.basename( path ) }
+ file_bunch = get_data_file_filename( ftp_data_file, override_name = name, override_info = info )
+ if file_bunch.path:
+ break
+ if file_bunch.path:
+ break
+ if file_bunch.path:
+ break
file_bunch.space_to_tab = space_to_tab
return file_bunch, warnings
def get_filenames( context ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: kellyv: Modified script that adds manual builds to add build even if chrom length details not present; added a few new manual builds
by Bitbucket 10 Mar '11
by Bitbucket 10 Mar '11
10 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/3d53f4f548c7/
changeset: r5206:3d53f4f548c7
user: kellyv
date: 2011-03-10 19:28:33
summary: Modified script that adds manual builds to add build even if chrom length details not present; added a few new manual builds
affected #: 2 files (656 bytes)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: rc: Extending sample search to include search using form fields. Resolved #489
by Bitbucket 09 Mar '11
by Bitbucket 09 Mar '11
09 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/b001ba3b7b3a/
changeset: r5205:b001ba3b7b3a
user: rc
date: 2011-03-09 21:33:04
summary: Extending sample search to include search using form fields. Resolved #489
affected #: 2 files (1.4 KB)
--- a/lib/galaxy/web/controllers/requests_common.py Wed Mar 09 14:50:54 2011 -0500
+++ b/lib/galaxy/web/controllers/requests_common.py Wed Mar 09 15:33:04 2011 -0500
@@ -748,6 +748,20 @@
trans.model.SampleDataset.table.c.sample_id==trans.model.Sample.table.c.id,
func.lower( trans.model.SampleDataset.table.c.name ).like( "%" + search_string.lower() + "%" ) ) ) \
.order_by( trans.model.Sample.table.c.create_time.desc() )
+ elif search_type == 'form value':
+ samples = []
+ if search_string.find('=') != -1:
+ field_label, field_value = search_string.split('=')
+ all_samples = trans.sa_session.query( trans.model.Sample ) \
+ .filter( trans.model.Sample.table.c.deleted==False ) \
+ .order_by( trans.model.Sample.table.c.create_time.desc() )
+ for sample in all_samples:
+ # find the field in the sample form with the given label
+ for field in sample.request.type.sample_form.fields:
+ if field_label == field['label']:
+ # check if the value is equal to the value in the search string
+ if sample.values.content[ field['name'] ] == field_value:
+ samples.append( sample )
if is_admin:
for s in samples:
if not s.request.deleted and s.request.state in request_states:
@@ -770,7 +784,7 @@
display='checkboxes' )
# Build the search_type SelectField
selected_value = kwd.get( 'search_type', 'sample name' )
- types = [ 'sample name', 'bar_code', 'dataset' ]
+ types = [ 'sample name', 'bar_code', 'dataset', 'form value' ]
search_type = build_select_field( trans, types, 'self', 'search_type', selected_value=selected_value, refresh_on_change=False )
# Build the search_box TextField
search_box = TextField( 'search_box', 50, kwd.get('search_box', '' ) )
--- a/templates/requests/common/find_samples.mako Wed Mar 09 14:50:54 2011 -0500
+++ b/templates/requests/common/find_samples.mako Wed Mar 09 15:33:04 2011 -0500
@@ -47,8 +47,15 @@
${search_box.get_html()}
<input type="submit" name="find_samples_button" value="Find"/><div class="toolParamHelp" style="clear: both;">
+ <p>
Wildcard search (%) can be used as placeholder for any sequence of characters or words.<br/>
For example, to search for samples starting with 'mysample' use 'mysample%' as the search string.
+ </p>
+ <p>
+ When 'form value' search type is selected, then enter the search string in 'field label=value' format.
+ <br/>For example, when searching for all samples whose 'Volume' field is 1.3mL, then the search string
+ should be 'Volume=1.3mL' (without qoutes).
+ </p></div></div>
%if results:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Add functional tests to cover some recent new library features, and a couple of miscellaneous UI improvements.
by Bitbucket 09 Mar '11
by Bitbucket 09 Mar '11
09 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/ba87157587e0/
changeset: r5204:ba87157587e0
user: greg
date: 2011-03-09 20:50:54
summary: Add functional tests to cover some recent new library features, and a couple of miscellaneous UI improvements.
affected #: 5 files (8.5 KB)
--- a/lib/galaxy/web/controllers/library_common.py Wed Mar 09 14:22:10 2011 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Wed Mar 09 14:50:54 2011 -0500
@@ -2132,7 +2132,8 @@
def __build_target_folder_id_select_field( trans, folders, selected_value='none' ):
for folder in folders:
if not folder.parent:
- folder.name = 'Data library root folder'
+ folder.name = 'Data library root'
+ break
return build_select_field( trans,
objs=folders,
label_attr='name',
--- a/lib/galaxy/web/controllers/requests_common.py Wed Mar 09 14:22:10 2011 -0500
+++ b/lib/galaxy/web/controllers/requests_common.py Wed Mar 09 14:50:54 2011 -0500
@@ -1636,9 +1636,11 @@
else:
selected_folder_id = 'none'
folders = []
- # TODO: Change the name of the library root folder to "Library root" to clarify to the
- # user that it is the root folder. We probably should just change this in the Library code,
- # and update the data in the db.
+ # Change the name of the library root folder to clarify that it is the root
+ for folder in folders:
+ if not folder.parent:
+ folder.name = 'Data library root'
+ break
folder_select_field = build_select_field( trans,
folders,
'name',
--- a/templates/library/common/move_library_item.mako Wed Mar 09 14:22:10 2011 -0500
+++ b/templates/library/common/move_library_item.mako Wed Mar 09 14:50:54 2011 -0500
@@ -1,6 +1,16 @@
<%namespace file="/message.mako" import="render_msg" /><%inherit file="/base.mako"/>
+<%def name="javascripts()">
+ ${parent.javascripts()}
+ ${h.js("jquery.autocomplete", "autocomplete_tagging" )}
+</%def>
+
+<%def name="stylesheets()">
+ ${parent.stylesheets()}
+ ${h.css( "autocomplete_tagging" )}
+</%def>
+
<%
if source_library:
source_library_id = trans.security.encode_id( source_library.id )
--- a/test/base/twilltestcase.py Wed Mar 09 14:22:10 2011 -0500
+++ b/test/base/twilltestcase.py Wed Mar 09 14:50:54 2011 -0500
@@ -2144,7 +2144,8 @@
#tc.fv( "1", "do_action", format )
#tc.submit( "action_on_datasets_button" )
# Here's the new approach...
- url = "%s/library_common/act_on_multiple_datasets?cntrller=%s&library_id=%s&do_action=%s" % ( self.url, cntrller, library_id, format )
+ url = "%s/library_common/act_on_multiple_datasets?cntrller=%s&library_id=%s&do_action=%s" \
+ % ( self.url, cntrller, library_id, format )
for ldda_id in ldda_ids:
url += "&ldda_ids=%s" % ldda_id
self.visit_url( url )
@@ -2195,6 +2196,21 @@
errmsg += 'Unpacked archive remains in: %s\n' % tmpd
raise AssertionError( errmsg )
shutil.rmtree( tmpd )
+ def move_library_item( self, cntrller, item_type, item_id, source_library_id, make_target_current,
+ target_library_id='', target_folder_id='', strings_displayed=[], strings_displayed_after_submit=[] ):
+ self.home()
+ self.visit_url( "%s/library_common/move_library_item?cntrller=%s&item_type=%s&item_id=%s&source_library_id=%s&make_target_current=%s" \
+ % ( self.url, cntrller, item_type, item_id, source_library_id, make_target_current ) )
+ if target_library_id:
+ self.refresh_form( 'target_library_id', target_library_id )
+ if target_folder_id:
+ tc.fv( '1', 'target_folder_id', target_folder_id )
+ for check_str in strings_displayed:
+ self.check_page_for_string( check_str )
+ tc.submit( 'move_library_item_button' )
+ for check_str in strings_displayed_after_submit:
+ self.check_page_for_string( check_str )
+ self.home()
def delete_library_item( self, cntrller, library_id, item_id, item_name, item_type='library_dataset' ):
"""Mark a library item as deleted"""
self.home()
--- a/test/functional/test_library_features.py Wed Mar 09 14:22:10 2011 -0500
+++ b/test/functional/test_library_features.py Wed Mar 09 14:50:54 2011 -0500
@@ -35,7 +35,7 @@
def test_005_create_libraries( self ):
"""Testing creating libraries used in this script, then renaming one of them"""
# Logged in as admin_user
- for index in range( 0, 1 ):
+ for index in range( 0, 3 ):
name = 'library%s' % str( index + 1 )
description = '%s description' % name
synopsis = '%s synopsis' % name
@@ -45,6 +45,12 @@
global library1
library1 = get_library( 'library1', 'library1 description', 'library1 synopsis' )
assert library1 is not None, 'Problem retrieving library (library1) from the database'
+ global library2
+ library2 = get_library( 'library2', 'library2 description', 'library2 synopsis' )
+ assert library2 is not None, 'Problem retrieving library (library2) from the database'
+ global library3
+ library3 = get_library( 'library3', 'library3 description', 'library3 synopsis' )
+ assert library3 is not None, 'Problem retrieving library (library3) from the database'
# Rename the library
new_name = "library1 new name"
new_description = "library1 new description"
@@ -413,13 +419,128 @@
raise AssertionError( 'The library_dataset id %s named "%s" has not been marked as deleted.' % \
( str( library_dataset.id ), library_dataset.name ) )
check_folder( library1.root_folder )
+ def test_120_populate_public_library2( self ):
+ """Testing library datasets within a library"""
+ # Logged in as admin_user
+ # Add a folder named Three to library2 root
+ root_folder = library2.root_folder
+ name = "One"
+ description = "One description"
+ self.add_folder( 'library_admin',
+ self.security.encode_id( library2.id ),
+ self.security.encode_id( root_folder.id ),
+ name=name,
+ description=description )
+ global folder3
+ folder3 = get_folder( root_folder.id, name, description )
+ assert folder3 is not None, 'Problem retrieving library folder named "%s" from the database' % name
+ # Upload dataset 1.bed to folder One
+ filename = '1.bed'
+ ldda_message = "Testing uploading %s" % filename
+ self.upload_library_dataset( cntrller='library_admin',
+ library_id=self.security.encode_id( library2.id ),
+ folder_id=self.security.encode_id( folder3.id ),
+ filename=filename,
+ file_type='bed',
+ dbkey='hg18',
+ ldda_message=ldda_message,
+ strings_displayed=[ 'Upload files' ] )
+ global ldda5
+ ldda5 = get_latest_ldda_by_name( filename )
+ assert ldda5 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda5 from the database'
+ # Add a sub-folder named Two to folder One
+ name = "Two"
+ description = "Two description"
+ self.add_folder( 'library_admin',
+ self.security.encode_id( library2.id ),
+ self.security.encode_id( folder3.id ),
+ name=name,
+ description=description )
+ global folder4
+ folder4 = get_folder( folder3.id, name, description )
+ assert folder4 is not None, 'Problem retrieving library folder named "%s" from the database' % name
+ # Upload dataset 2.bed to folder Two
+ filename = '2.bed'
+ ldda_message = "Testing uploading %s" % filename
+ self.upload_library_dataset( cntrller='library_admin',
+ library_id=self.security.encode_id( library2.id ),
+ folder_id=self.security.encode_id( folder4.id ),
+ filename=filename,
+ file_type='bed',
+ dbkey='hg18',
+ ldda_message=ldda_message,
+ strings_displayed=[ 'Upload files' ] )
+ global ldda6
+ ldda6 = get_latest_ldda_by_name( filename )
+ assert ldda6 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda6 from the database'
+ # Add a folder named Three to library2 root
+ name = "Three"
+ description = "Three description"
+ self.add_folder( 'library_admin',
+ self.security.encode_id( library2.id ),
+ self.security.encode_id( root_folder.id ),
+ name=name,
+ description=description )
+ global folder5
+ folder5 = get_folder( root_folder.id, name, description )
+ assert folder5 is not None, 'Problem retrieving library folder named "%s" from the database' % name
+ # Upload dataset 3.bed to library2 root folder
+ filename = '3.bed'
+ ldda_message = "Testing uploading %s" % filename
+ self.upload_library_dataset( cntrller='library_admin',
+ library_id=self.security.encode_id( library2.id ),
+ folder_id=self.security.encode_id( root_folder.id ),
+ filename=filename,
+ file_type='bed',
+ dbkey='hg18',
+ ldda_message=ldda_message,
+ strings_displayed=[ 'Upload files' ] )
+ global ldda7
+ ldda7 = get_latest_ldda_by_name( filename )
+ assert ldda7 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda7 from the database'
+ def test_125_move_dataset_within_library2( self ):
+ """Testing moving a dataset within library2"""
+ # Logged in as admin_user
+ # Move 3.bed to folder Three
+ self.move_library_item( cntrller='library_admin',
+ item_type='ldda',
+ item_id=self.security.encode_id( ldda7.id ),
+ source_library_id=self.security.encode_id( library2.id ),
+ make_target_current=True,
+ target_folder_id=self.security.encode_id( folder5.id ),
+ strings_displayed=[ 'Move data library items',
+ '3.bed' ],
+ strings_displayed_after_submit=[ '1 dataset moved to folder (Three) within data library (library2)' ] )
+ def test_130_move_folder_to_another_library( self ):
+ """Testing moving a folder to another library"""
+ # Logged in as admin_user
+ # Move folder Three which now includes 3.bed to library3
+ self.move_library_item( cntrller='library_admin',
+ item_type='folder',
+ item_id=self.security.encode_id( folder5.id ),
+ source_library_id=self.security.encode_id( library2.id ),
+ make_target_current=False,
+ target_library_id=self.security.encode_id( library3.id ),
+ target_folder_id=self.security.encode_id( library3.root_folder.id ),
+ strings_displayed=[ 'Move data library items',
+ 'Three' ],
+ strings_displayed_after_submit=[ 'Moved folder (Three) to folder (library3) within data library (library3)' ] )
+ # Make sure folder Three is not longer in library2
+ self.browse_library( cntrller='library_admin',
+ library_id=self.security.encode_id( library2.id ),
+ strings_displayed=[ folder4.name, folder4.description ],
+ strings_not_displayed=[ folder5.name, folder5.description ] )
+ # Make sure folder Three was moved to library3
+ self.browse_library( cntrller='library_admin',
+ library_id=self.security.encode_id( library3.id ),
+ strings_displayed=[ folder5.name, folder5.description, ldda7.name ] )
def test_999_reset_data_for_later_test_runs( self ):
"""Reseting data to enable later test runs to pass"""
# Logged in as admin_user
##################
# Purge all libraries
##################
- for library in [ library1 ]:
+ for library in [ library1, library2, library3 ]:
self.delete_library_item( 'library_admin',
self.security.encode_id( library.id ),
self.security.encode_id( library.id ),
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Fix bugs in GFFReaderWrapper so that GFF3 files are read properly. Add GFF3 test to gff_filter_by_feature_count.
by Bitbucket 09 Mar '11
by Bitbucket 09 Mar '11
09 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/917fe1e0356e/
changeset: r5203:917fe1e0356e
user: jgoecks
date: 2011-03-09 20:22:10
summary: Fix bugs in GFFReaderWrapper so that GFF3 files are read properly. Add GFF3 test to gff_filter_by_feature_count.
affected #: 4 files (903 bytes)
--- a/lib/galaxy/datatypes/util/gff_util.py Tue Mar 08 19:01:59 2011 -0500
+++ b/lib/galaxy/datatypes/util/gff_util.py Wed Mar 09 14:22:10 2011 -0500
@@ -12,8 +12,18 @@
"""
def __init__( self, reader, fields, chrom_col, feature_col, start_col, end_col, \
strand_col, score_col, default_strand, fix_strand=False, raw_line='' ):
+ # HACK: GFF format allows '.' for strand but GenomicInterval does not. To get around this,
+ # temporarily set strand and then unset after initing GenomicInterval.
+ unknown_strand = False
+ if not fix_strand and fields[ strand_col ] == '.':
+ unknown_strand = True
+ fields[ strand_col ] = '+'
GenomicInterval.__init__( self, reader, fields, chrom_col, start_col, end_col, strand_col, \
default_strand, fix_strand=fix_strand )
+ if unknown_strand:
+ self.strand = '.'
+ self.fields[ strand_col ] = '.'
+
# Handle feature, score column.
self.feature_col = feature_col
if self.feature_col >= self.nfields:
@@ -40,13 +50,10 @@
self.intervals = intervals
# Use intervals to set feature attributes.
for interval in self.intervals:
- # Error checking.
+ # Error checking. NOTE: intervals need not share the same strand.
if interval.chrom != self.chrom:
- raise ValueError( "interval chrom does not match self chrom: %i != %i" % \
+ raise ValueError( "interval chrom does not match self chrom: %s != %s" % \
( interval.chrom, self.chrom ) )
- if interval.strand != self.strand:
- raise ValueError( "interval strand does not match self strand: %s != %s" % \
- ( interval.strand, self.strand ) )
# Set start, end of interval.
if interval.start < self.start:
self.start = interval.start
@@ -140,7 +147,7 @@
# For debugging, uncomment this to propogate parsing exceptions up.
# I.e. the underlying reason for an unexpected StopIteration exception
# can be found by uncommenting this.
- # raise e
+ #raise e
#
# Get next GFFFeature
@@ -163,7 +170,7 @@
# Initialize feature name from seed.
feature_group = self.seed_interval.attributes.get( 'group', None ) # For GFF
- feature_id = self.seed_interval.attributes.get( 'id', None ) # For GFF3
+ feature_id = self.seed_interval.attributes.get( 'ID', None ) # For GFF3
feature_gene_id = self.seed_interval.attributes.get( 'gene_id', None ) # For GTF
feature_transcript_id = self.seed_interval.attributes.get( 'transcript_id', None ) # For GTF
@@ -183,11 +190,14 @@
# If interval not associated with feature, break.
group = interval.attributes.get( 'group', None )
+ # GFF test:
if group and feature_group != group:
break
- id = interval.attributes.get( 'id', None )
- if id and feature_id != id:
+ # GFF3 test:
+ parent = interval.attributes.get( 'Parent', None )
+ if feature_id and feature_id != parent:
break
+ # GTF test:
gene_id = interval.attributes.get( 'gene_id', None )
transcript_id = interval.attributes.get( 'transcript_id', None )
if ( transcript_id and transcript_id != feature_transcript_id ) or \
--- a/tools/filters/gff/gff_filter_by_feature_count.py Tue Mar 08 19:01:59 2011 -0500
+++ b/tools/filters/gff/gff_filter_by_feature_count.py Wed Mar 09 14:22:10 2011 -0500
@@ -8,8 +8,7 @@
import sys
from galaxy import eggs
from galaxy.datatypes.util.gff_util import GFFReaderWrapper
-
-assert sys.version_info[:2] >= ( 2, 4 )
+from bx.intervals.io import GenomicInterval
# Valid operators, ordered so that complex operators (e.g. '>=') are
# recognized before simple operators (e.g. '>')
@@ -62,7 +61,9 @@
skipped_lines = 0
first_skipped_line = 0
out = open( output_name, 'w' )
- for i, feature in enumerate( GFFReaderWrapper( open( input_name ), fix_strand=True ) ):
+ for i, feature in enumerate( GFFReaderWrapper( open( input_name ) ) ):
+ if not isinstance( feature, GenomicInterval ):
+ continue
count = 0
for interval in feature.intervals:
if interval.feature == feature_name:
@@ -73,6 +74,9 @@
out.write( "\t".join(interval.fields) + '\n' )
kept_features += 1
+ # Needed because i is 0-based but want to display stats using 1-based.
+ i += 1
+
# Clean up.
out.close()
info_msg = "%i of %i features kept (%.2f%%) using condition %s. " % \
--- a/tools/filters/gff/gff_filter_by_feature_count.xml Tue Mar 08 19:01:59 2011 -0500
+++ b/tools/filters/gff/gff_filter_by_feature_count.xml Wed Mar 09 14:22:10 2011 -0500
@@ -20,12 +20,20 @@
<data format="input" name="out_file1" metadata_source="input_file1"/></outputs><tests>
- <test>
- <param name="input_file1" value="gops_subtract_in1.gff"/>
- <param name="feature_name" value="exon"/>
- <param name="cond" value=">1"/>
- <output name="out_file1" file="gff_filter_by_feature_count_out1.gff"/>
- </test>
+ <!-- Test GTF filtering. -->
+ <test>
+ <param name="input_file1" value="gops_subtract_in1.gff"/>
+ <param name="feature_name" value="exon"/>
+ <param name="cond" value=">1"/>
+ <output name="out_file1" file="gff_filter_by_feature_count_out1.gff"/>
+ </test>
+ <!-- Test GFF3 filtering. -->
+ <test>
+ <param name="input_file1" value="5.gff3"/>
+ <param name="feature_name" value="HSP"/>
+ <param name="cond" value=">=5"/>
+ <output name="out_file1" file="gff_filter_by_feature_count_out2.gff"/>
+ </test></tests><help>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: jgoecks: Use GFFReaderWrapper in gff_filter_by_feature_count tool in order to leverage support for GTF, GFF, and GFF3 found in reader wrapper. This also simplifies the tool considerably.
by Bitbucket 08 Mar '11
by Bitbucket 08 Mar '11
08 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/c9e6bc81817a/
changeset: r5202:c9e6bc81817a
user: jgoecks
date: 2011-03-09 01:01:59
summary: Use GFFReaderWrapper in gff_filter_by_feature_count tool in order to leverage support for GTF, GFF, and GFF3 found in reader wrapper. This also simplifies the tool considerably.
affected #: 2 files (2.7 KB)
--- a/lib/galaxy/datatypes/util/gff_util.py Tue Mar 08 16:17:09 2011 -0500
+++ b/lib/galaxy/datatypes/util/gff_util.py Tue Mar 08 19:01:59 2011 -0500
@@ -10,14 +10,18 @@
A GFF interval, including attributes. If file is strictly a GFF file,
only attribute is 'group.'
"""
- def __init__( self, reader, fields, chrom_col, start_col, end_col, strand_col, \
- score_col, default_strand, fix_strand=False, raw_line='' ):
+ def __init__( self, reader, fields, chrom_col, feature_col, start_col, end_col, \
+ strand_col, score_col, default_strand, fix_strand=False, raw_line='' ):
GenomicInterval.__init__( self, reader, fields, chrom_col, start_col, end_col, strand_col, \
default_strand, fix_strand=fix_strand )
- # Handle score column.
+ # Handle feature, score column.
+ self.feature_col = feature_col
+ if self.feature_col >= self.nfields:
+ raise MissingFieldError( "No field for feature_col (%d)" % feature_col )
+ self.feature = self.fields[ self.feature_col ]
self.score_col = score_col
if self.score_col >= self.nfields:
- raise MissingFieldError( "No field for score_col (%d)" % score_col )
+ raise MissingFieldError( "No field for score_col (%d)" % score_col )
self.score = self.fields[ self.score_col ]
# Attributes specific to GFF.
@@ -28,10 +32,11 @@
"""
A GFF feature, which can include multiple intervals.
"""
- def __init__( self, reader, chrom_col, start_col, end_col, strand_col, score_col, default_strand, \
- fix_strand=False, intervals=[] ):
- GFFInterval.__init__( self, reader, intervals[0].fields, chrom_col, start_col, end_col, \
- strand_col, score_col, default_strand, fix_strand=fix_strand )
+ def __init__( self, reader, chrom_col, feature_col, start_col, end_col, \
+ strand_col, score_col, default_strand, fix_strand=False, intervals=[] ):
+ GFFInterval.__init__( self, reader, intervals[0].fields, chrom_col, feature_col, \
+ start_col, end_col, strand_col, score_col, default_strand, \
+ fix_strand=fix_strand )
self.intervals = intervals
# Use intervals to set feature attributes.
for interval in self.intervals:
@@ -99,20 +104,20 @@
expect traditional interval format.
"""
- def __init__( self, reader, chrom_col=0, start_col=3, end_col=4, strand_col=6, score_col=5, \
- fix_strand=False, **kwargs ):
+ def __init__( self, reader, chrom_col=0, feature_col=2, start_col=3, \
+ end_col=4, strand_col=6, score_col=5, fix_strand=False, **kwargs ):
NiceReaderWrapper.__init__( self, reader, chrom_col=chrom_col, start_col=start_col, end_col=end_col, \
strand_col=strand_col, fix_strand=fix_strand, **kwargs )
- # HACK: NiceReaderWrapper (bx-python) does not handle score_col yet, so store ourselves.
+ self.feature_col = feature_col
self.score_col = score_col
self.last_line = None
self.cur_offset = 0
self.seed_interval = None
def parse_row( self, line ):
- interval = GFFInterval( self, line.split( "\t" ), self.chrom_col, self.start_col, \
- self.end_col, self.strand_col, self.score_col, self.default_strand, \
- fix_strand=self.fix_strand, raw_line=line )
+ interval = GFFInterval( self, line.split( "\t" ), self.chrom_col, self.feature_col, \
+ self.start_col, self.end_col, self.strand_col, self.score_col, \
+ self.default_strand, fix_strand=self.fix_strand, raw_line=line )
return interval
def next( self ):
@@ -196,8 +201,9 @@
self.seed_interval = interval
# Return GFF feature with all intervals.
- return GFFFeature( self, self.chrom_col, self.start_col, self.end_col, self.strand_col, \
- self.score_col, self.default_strand, fix_strand=self.fix_strand, \
+ return GFFFeature( self, self.chrom_col, self.feature_col, self.start_col, \
+ self.end_col, self.strand_col, self.score_col, \
+ self.default_strand, fix_strand=self.fix_strand, \
intervals=feature_intervals )
--- a/tools/filters/gff/gff_filter_by_feature_count.py Tue Mar 08 16:17:09 2011 -0500
+++ b/tools/filters/gff/gff_filter_by_feature_count.py Tue Mar 08 19:01:59 2011 -0500
@@ -7,7 +7,7 @@
"""
import sys
from galaxy import eggs
-from galaxy.datatypes.util.gff_util import parse_gff_attributes
+from galaxy.datatypes.util.gff_util import GFFReaderWrapper
assert sys.version_info[:2] >= ( 2, 4 )
@@ -58,77 +58,25 @@
break
# Do filtering.
- kept_lines = 0
+ kept_features = 0
skipped_lines = 0
first_skipped_line = 0
out = open( output_name, 'w' )
- i = 0
- cur_transcript_id = None
- cur_transcript_lines = []
- cur_transcript_feature_counts = {} # Key is feature name, value is feature count.
- for i, line in enumerate( file( input_name ) ):
- line = line.rstrip( '\r\n' )
- if line and not line.startswith( '#' ):
- try:
- # GFF format: chrom, source, feature, chromStart, chromEnd, score, strand, attributes
- elems = line.split( '\t' )
- feature = elems[2]
- start = str( long( elems[3] ) - 1 )
- coords = [ long( start ), long( elems[4] ) ]
- strand = elems[6]
- attributes = parse_gff_attributes( elems[8] )
- t_id = attributes.get( "transcript_id", None )
-
- if not t_id:
- # No transcript id, so pass line to output.
- out.write( line )
- kept_lines += 1
- continue
-
- # There is a transcript ID, so process line at transcript level.
- if t_id == cur_transcript_id:
- # Line is element of transcript; increment feature count.
- if not feature in cur_transcript_feature_counts:
- cur_transcript_feature_counts[feature] = 0
- cur_transcript_feature_counts[feature] += 1
- cur_transcript_lines.append( line )
- continue
-
- #
- # Line is part of new transcript; filter previous transcript.
- #
-
- # Filter/write previous transcript.
- result = eval( '%s %s' % ( cur_transcript_feature_counts.get( feature_name, 0 ), condition ) )
- if cur_transcript_id and result:
- # Transcript passes filter; write transcript line to file."
- out.write( "\n".join( cur_transcript_lines ) + "\n" )
- kept_lines += len( cur_transcript_lines )
-
- # Start new transcript.
- cur_transcript_id = t_id
- cur_transcript_feature_counts = {}
- cur_transcript_feature_counts[feature] = 1
- cur_transcript_lines = [ line ]
- except Exception, e:
- print e
- skipped_lines += 1
- if not first_skipped_line:
- first_skipped_line = i + 1
- else:
- skipped_lines += 1
- if not first_skipped_line:
- first_skipped_line = i + 1
-
- # Write last transcript.
- if cur_transcript_id and eval( '%s %s' % ( cur_transcript_feature_counts[feature_name], condition ) ):
- # Transcript passes filter; write transcript lints to file.
- out.write( "\n".join( cur_transcript_lines ) + "\n" )
- kept_lines += len( cur_transcript_lines )
+ for i, feature in enumerate( GFFReaderWrapper( open( input_name ), fix_strand=True ) ):
+ count = 0
+ for interval in feature.intervals:
+ if interval.feature == feature_name:
+ count += 1
+ if eval( '%s %s' % ( count, condition ) ):
+ # Keep feature.
+ for interval in feature.intervals:
+ out.write( "\t".join(interval.fields) + '\n' )
+ kept_features += 1
# Clean up.
out.close()
- info_msg = "%i lines kept (%.2f%%) using condition %s. " % ( kept_lines, float(kept_lines)/i * 100.0, feature_name + condition )
+ info_msg = "%i of %i features kept (%.2f%%) using condition %s. " % \
+ ( kept_features, i, float(kept_features)/i * 100.0, feature_name + condition )
if skipped_lines > 0:
info_msg += "Skipped %d blank/comment/invalid lines starting with line #%d." %( skipped_lines, first_skipped_line )
print info_msg
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: kellyv: Update SRMA test files so that functional tests pass
by Bitbucket 08 Mar '11
by Bitbucket 08 Mar '11
08 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/575531ef4a53/
changeset: r5201:575531ef4a53
user: kellyv
date: 2011-03-08 22:17:09
summary: Update SRMA test files so that functional tests pass
affected #: 5 files (10.7 MB)
Diff too large to display.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: greg: Add the ability to move data library items within a data library or between data libraries.
by Bitbucket 08 Mar '11
by Bitbucket 08 Mar '11
08 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/ed7b6180b925/
changeset: r5200:ed7b6180b925
user: greg
date: 2011-03-08 21:50:19
summary: Add the ability to move data library items within a data library or between data libraries.
affected #: 7 files (16.8 KB)
--- a/lib/galaxy/model/__init__.py Tue Mar 08 14:35:26 2011 -0500
+++ b/lib/galaxy/model/__init__.py Tue Mar 08 15:50:19 2011 -0500
@@ -941,6 +941,28 @@
self.description = description
self.synopsis = synopsis
self.root_folder = root_folder
+ def get_active_folders( self, folder, folders=None ):
+ # TODO: should we make sure the library is not deleted?
+ def sort_by_attr( seq, attr ):
+ """
+ Sort the sequence of objects by object's attribute
+ Arguments:
+ seq - the list or any sequence (including immutable one) of objects to sort.
+ attr - the name of attribute to sort by
+ """
+ # Use the "Schwartzian transform"
+ # Create the auxiliary list of tuples where every i-th tuple has form
+ # (seq[i].attr, i, seq[i]) and sort it. The second item of tuple is needed not
+ # only to provide stable sorting, but mainly to eliminate comparison of objects
+ # (which can be expensive or prohibited) in case of equal attribute values.
+ intermed = map( None, map( getattr, seq, ( attr, ) * len( seq ) ), xrange( len( seq ) ), seq )
+ intermed.sort()
+ return map( operator.getitem, intermed, ( -1, ) * len( intermed ) )
+ if folders is None:
+ active_folders = [ folder ]
+ for active_folder in folder.active_folders:
+ active_folders.extend( self.get_active_folders( active_folder, folders ) )
+ return sort_by_attr( active_folders, 'id' )
def get_info_association( self, restrict=False, inherited=False ):
if self.info_association:
if not inherited or self.info_association[0].inheritable:
--- a/lib/galaxy/web/controllers/library_common.py Tue Mar 08 14:35:26 2011 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Tue Mar 08 15:50:19 2011 -0500
@@ -1539,16 +1539,6 @@
show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
use_panels = util.string_as_bool( params.get( 'use_panels', False ) )
action = params.get( 'do_action', None )
- if action == 'import_to_histories':
- return trans.response.send_redirect( web.url_for( controller='library_common',
- action='import_datasets_to_histories',
- cntrller=cntrller,
- library_id=library_id,
- ldda_ids=ldda_ids,
- use_panels=use_panels,
- show_deleted=show_deleted,
- message=message,
- status=status ) )
lddas = []
error = False
is_admin = trans.user_is_admin() and cntrller == 'library_admin'
@@ -1560,6 +1550,31 @@
error = True
message = 'You must select an action to perform on the selected datasets.'
else:
+ if action == 'import_to_histories':
+ return trans.response.send_redirect( web.url_for( controller='library_common',
+ action='import_datasets_to_histories',
+ cntrller=cntrller,
+ library_id=library_id,
+ ldda_ids=ldda_ids,
+ use_panels=use_panels,
+ show_deleted=show_deleted,
+ message=message,
+ status=status ) )
+ if action == 'move':
+ if library_id in [ 'none', 'None', None ]:
+ source_library_id = ''
+ else:
+ source_library_id = library_id
+ return trans.response.send_redirect( web.url_for( controller='library_common',
+ action='move_library_item',
+ cntrller=cntrller,
+ source_library_id=source_library_id,
+ item_type='ldda',
+ item_id=ldda_ids,
+ use_panels=use_panels,
+ show_deleted=show_deleted,
+ message=message,
+ status=status ) )
ldda_ids = util.listify( ldda_ids )
for ldda_id in ldda_ids:
try:
@@ -1779,9 +1794,11 @@
@web.expose
def import_datasets_to_histories( self, trans, cntrller, library_id='', folder_id='', ldda_ids='', target_history_ids='', new_history_name='', **kwd ):
# This method is called from one of the following places:
- # - a menu option for a library dataset ( ldda_ids will be a singel dataset id )
- # - a menu option for a library folder ( folder_id will have a value )
- # - a menu option for a library dataset search result set ( ldda_ids will be a comma separated string of dataset ids )
+ # - a menu option for a library dataset ( ldda_ids is a single ldda id )
+ # - a menu option for a library folder ( folder_id has a value )
+ # - a select list option for acting on multiple selected datasets within a library
+ # ( ldda_ids is a comma separated string of ldda ids )
+ # - a menu option for a library dataset search result set ( ldda_ids is a comma separated string of ldda ids )
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
@@ -1799,13 +1816,7 @@
folder = None
ldda_ids = util.listify( ldda_ids )
if ldda_ids:
- # Check boxes cause 2 copies of each id to be included in the request
ldda_ids = map( trans.security.decode_id, ldda_ids )
- unique_ldda_ids = []
- for ldda_id in ldda_ids:
- if ldda_id not in unique_ldda_ids:
- unique_ldda_ids.append( ldda_id )
- ldda_ids = unique_ldda_ids
target_history_ids = util.listify( target_history_ids )
if target_history_ids:
target_history_ids = [ trans.security.decode_id( target_history_id ) for target_history_id in target_history_ids if target_history_id ]
@@ -1831,15 +1842,15 @@
status = 'error'
for ldda in map( trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get, ldda_ids ):
if ldda is None:
- message += "You tried to import a library dataset that does not exist. "
+ message += "You tried to import a dataset that does not exist. "
status = 'error'
invalid_datasets += 1
elif ldda.dataset.state not in [ trans.model.Dataset.states.OK, trans.model.Dataset.states.ERROR ]:
- message += "Cannot import dataset '%s' since its state is '%s'. " % ( ldda.name, ldda.dataset.state )
+ message += "You cannot import dataset '%s' since its state is '%s'. " % ( ldda.name, ldda.dataset.state )
status = 'error'
invalid_datasets += 1
elif not ldda.has_data():
- message += "Cannot import empty dataset '%s'. " % ldda.name
+ message += "You cannot import empty dataset '%s'. " % ldda.name
status = 'error'
invalid_datasets += 1
else:
@@ -1931,6 +1942,226 @@
message=util.sanitize_text( message ),
status='done' ) )
@web.expose
+ def move_library_item( self, trans, cntrller, item_type, item_id, source_library_id='', make_target_current=True, **kwd ):
+ # This method is called from one of the following places:
+ # - a menu option for a library dataset ( item_type is 'ldda' and item_id is a single ldda id )
+ # - a menu option for a library folder ( item_type is 'folder' and item_id is a single folder id )
+ # - a select list option for acting on multiple selected datasets within a library ( item_type is
+ # 'ldda' and item_id is a comma separated string of ldda ids )
+ # - a menu option for a library dataset search result set ( item_type is 'ldda' and item_id is a
+ # comma separated string of ldda ids )
+ params = util.Params( kwd )
+ message = util.restore_text( params.get( 'message', '' ) )
+ status = params.get( 'status', 'done' )
+ show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
+ use_panels = util.string_as_bool( params.get( 'use_panels', False ) )
+ make_target_current = util.string_as_bool( make_target_current )
+ is_admin = trans.user_is_admin() and cntrller == 'library_admin'
+ user = trans.get_user()
+ current_user_roles = trans.get_current_user_roles()
+ move_ldda_ids = []
+ move_lddas = []
+ move_folder_id = []
+ move_folder = None
+ if source_library_id:
+ source_library = trans.sa_session.query( trans.model.Library ).get( trans.security.decode_id( source_library_id ) )
+ else:
+ # Request sent from the library_dataset_search_results page.
+ source_library = None
+ target_library_id = params.get( 'target_library_id', '' )
+ if target_library_id not in [ '', 'none', None ]:
+ target_library = trans.sa_session.query( trans.model.Library ).get( trans.security.decode_id( target_library_id ) )
+ elif make_target_current:
+ target_library = source_library
+ else:
+ target_library = None
+ target_folder_id = params.get( 'target_folder_id', '' )
+ if target_folder_id not in [ '', 'none', None ]:
+ target_folder = trans.sa_session.query( trans.model.LibraryFolder ).get( trans.security.decode_id( target_folder_id ) )
+ if target_library is None:
+ target_library = target_folder.parent_library
+ else:
+ target_folder = None
+ if item_type == 'ldda':
+ # We've been called from a menu option for a library dataset search result set
+ move_ldda_ids = util.listify( item_id )
+ if move_ldda_ids:
+ # Checkboxes cause 2 copies of each id to be included in the request
+ move_ldda_ids = map( trans.security.decode_id, move_ldda_ids )
+ unique_ldda_ids = []
+ for ldda_id in move_ldda_ids:
+ if ldda_id not in unique_ldda_ids:
+ unique_ldda_ids.append( ldda_id )
+ move_ldda_ids = unique_ldda_ids
+ elif item_type == 'folder':
+ move_folder_id = item_id
+ move_folder = trans.sa_session.query( trans.model.LibraryFolder ).get( trans.security.decode_id( move_folder_id ) )
+ if params.get( 'move_library_item_button', False ):
+ if not ( move_ldda_ids or move_folder_id ) or target_folder_id in [ '', 'none', None ]:
+ message = "You must select a source folder or one or more source datasets, and a target folder."
+ status = 'error'
+ else:
+ valid_lddas = []
+ invalid_lddas = []
+ invalid_items = 0
+ flush_required = False
+ if item_type == 'ldda':
+ for ldda in map( trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get, move_ldda_ids ):
+ if ldda is None:
+ message += "You tried to move a dataset that does not exist. "
+ status = 'error'
+ invalid_items += 1
+ elif ldda.dataset.state not in [ trans.model.Dataset.states.OK, trans.model.Dataset.states.ERROR ]:
+ message += "You cannot move dataset '%s' since its state is '%s'. " % ( ldda.name, ldda.dataset.state )
+ status = 'error'
+ invalid_items += 1
+ elif not ldda.has_data():
+ message += "You cannot move empty dataset '%s'. " % ldda.name
+ status = 'error'
+ invalid_items += 1
+ else:
+ if is_admin:
+ library_dataset = ldda.library_dataset
+ library_dataset.folder = target_folder
+ trans.sa_session.add( library_dataset )
+ flush_required = True
+ else:
+ if trans.app.security_agent.can_modify_library_item( current_user_roles, ldda ):
+ valid_lddas.append( ldda )
+ library_dataset = ldda.library_dataset
+ library_dataset.folder = target_folder
+ trans.sa_session.add( library_dataset )
+ flush_required = True
+ else:
+ invalid_items += 1
+ invalid_lddas.append( ldda )
+ if not valid_lddas:
+ message = "You are not authorized to move any of the selected datasets."
+ elif invalid_lddas:
+ message += "You are not authorized to move %s: " % inflector.cond_plural( len( invalid_lddas ), "dataset" )
+ for ldda in invalid_lddas:
+ message += '(%s)' % ldda.name
+ message += '. '
+ num_source = len( move_ldda_ids ) - invalid_items
+ message = "%i %s moved to folder (%s) within data library (%s)" % ( num_source,
+ inflector.cond_plural( num_source, "dataset" ),
+ target_folder.name,
+ target_library.name )
+ elif item_type == 'folder':
+ move_folder = trans.sa_session.query( trans.app.model.LibraryFolder ) \
+ .get( trans.security.decode_id( move_folder_id ) )
+ if move_folder is None:
+ message += "You tried to move a folder that does not exist. "
+ status = 'error'
+ invalid_items += 1
+ else:
+ move_folder.parent = target_folder
+ trans.sa_session.add( move_folder )
+ flush_required = True
+ message = "Moved folder (%s) to folder (%s) within data library (%s) " % ( move_folder.name,
+ target_folder.name,
+ target_library.name )
+ if flush_required:
+ trans.sa_session.flush()
+ if target_library:
+ if is_admin:
+ target_library_folders = target_library.get_active_folders( target_library.root_folder )
+ else:
+ folders_with_permission_to_add = []
+ for folder in target_library.get_active_folders( target_library.root_folder ):
+ if trans.app.security_agent.can_add_library_item( current_user_roles, folder ):
+ folders_with_permission_to_add.append( folder )
+ target_library_folders = folders_with_permission_to_add
+ else:
+ target_library_folders = []
+ if item_type == 'ldda':
+ for ldda_id in move_ldda_ids:
+ # TODO: It is difficult to filter out undesired folders (e.g. the ldda's current
+ # folder) if we have a list of lddas, but we may want to filter folders that
+ # are easily handled.
+ ldda = trans.sa_session.query( trans.model.LibraryDatasetDatasetAssociation ).get( ldda_id )
+ move_lddas.append( ldda )
+ elif item_type == 'folder':
+ def __is_contained_in( folder1, folder2 ):
+ # Return True if folder1 is contained in folder2
+ if folder1.parent:
+ if folder1.parent == folder2:
+ return True
+ return __is_contained_in( folder1.parent, folder2 )
+ return False
+ filtered_folders = []
+ for folder in target_library_folders:
+ include = True
+ if move_folder:
+ if __is_contained_in( folder, move_folder ):
+ # Don't allow moving a folder to one of it's sub-folders (circular issues in db)
+ include = False
+ if move_folder.id == folder.id:
+ # Don't allow moving a folder to itself
+ include = False
+ if move_folder.parent and move_folder.parent.id == folder.id:
+ # Don't allow moving a folder to it's current parent folder
+ include = False
+ if include:
+ filtered_folders.append( folder )
+ target_library_folders = filtered_folders
+ def __build_target_library_id_select_field( trans, selected_value='none' ):
+ # Get all the libraries for which the current user can add items.
+ target_libraries = []
+ if is_admin:
+ for library in trans.sa_session.query( trans.model.Library ) \
+ .filter( trans.model.Library.deleted == False ) \
+ .order_by( trans.model.Library.table.c.name ):
+ if source_library is None or library.id != source_library.id:
+ target_libraries.append( library )
+ else:
+ for library in trans.app.security_agent.get_accessible_libraries( trans, user ):
+ if source_library is None:
+ if trans.app.security_agent.can_add_library_item( current_user_roles, library ):
+ target_libraries.append( library )
+ elif library.id != source_library.id:
+ if trans.app.security_agent.can_add_library_item( current_user_roles, library ):
+ target_libraries.append( library )
+ # A refresh_on_change is required to display the selected library's folders
+ return build_select_field( trans,
+ objs=target_libraries,
+ label_attr='name',
+ select_field_name='target_library_id',
+ selected_value=selected_value,
+ refresh_on_change=True )
+ def __build_target_folder_id_select_field( trans, folders, selected_value='none' ):
+ for folder in folders:
+ if not folder.parent:
+ folder.name = 'Data library root folder'
+ return build_select_field( trans,
+ objs=folders,
+ label_attr='name',
+ select_field_name='target_folder_id',
+ selected_value=selected_value,
+ refresh_on_change=False )
+ if target_library:
+ selected_value = target_library.id
+ else:
+ selected_value = 'none'
+ target_library_id_select_field = __build_target_library_id_select_field( trans, selected_value=selected_value )
+ target_folder_id_select_field = __build_target_folder_id_select_field( trans, target_library_folders )
+ return trans.fill_template( "/library/common/move_library_item.mako",
+ cntrller=cntrller,
+ make_target_current=make_target_current,
+ source_library=source_library,
+ item_type=item_type,
+ item_id=item_id,
+ move_ldda_ids=move_ldda_ids,
+ move_lddas=move_lddas,
+ move_folder=move_folder,
+ target_library=target_library,
+ target_library_id_select_field=target_library_id_select_field,
+ target_folder_id_select_field=target_folder_id_select_field,
+ show_deleted=show_deleted,
+ use_panels=use_panels,
+ message=message,
+ status=status )
+ @web.expose
def delete_library_item( self, trans, cntrller, library_id, item_id, item_type, **kwd ):
# This action will handle deleting all types of library items. State is saved for libraries and
# folders ( i.e., if undeleted, the state of contents of the library or folder will remain, so previously
@@ -2257,7 +2488,7 @@
# Perform search
parser = MultifieldParser( [ 'name', 'info', 'dbkey', 'message' ], schema=schema )
# Search term with wildcards may be slow...
- results = searcher.search( parser.parse( '*' + search_term + '*' ), minscore=0.5 )
+ results = searcher.search( parser.parse( '*' + search_term + '*' ), minscore=0.01 )
ldda_ids = [ result[ 'id' ] for result in results ]
lddas = []
for ldda_id in ldda_ids:
--- a/templates/library/common/browse_library.mako Tue Mar 08 14:35:26 2011 -0500
+++ b/templates/library/common/browse_library.mako Tue Mar 08 15:50:19 2011 -0500
@@ -247,19 +247,20 @@
checked="checked"
%endif
/>
- %if ldda.library_dataset.deleted:
- <span class="libraryItem-error">
- %endif
<div style="float: left; margin-left: 1px;" class="menubutton split popup" id="dataset-${ldda.id}-popup">
- <a class="view-info" href="${h.url_for( controller='library_common', action='ldda_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ), use_panels=use_panels, show_deleted=show_deleted )}">${ldda.name}</a>
+ <a class="view-info" href="${h.url_for( controller='library_common', action='ldda_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ), use_panels=use_panels, show_deleted=show_deleted )}">
+ %if ldda.library_dataset.deleted:
+ <div class="libraryItem-error">${ldda.name}</div>
+ %else:
+ ${ldda.name}
+ %endif
+ </a></div>
- %if ldda.library_dataset.deleted:
- </span>
- %endif
%if not library.deleted:
<div popupmenu="dataset-${ldda.id}-popup">
%if not branch_deleted( folder ) and not ldda.library_dataset.deleted and can_modify:
<a class="action-button" href="${h.url_for( controller='library_common', action='ldda_edit_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit information</a>
+ <a class="action-button" href="${h.url_for( controller='library_common', action='move_library_item', cntrller=cntrller, item_type='ldda', item_id=trans.security.encode_id( ldda.id ), source_library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Move this dataset</a>
%else:
<a class="action-button" href="${h.url_for( controller='library_common', action='ldda_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ), use_panels=use_panels, show_deleted=show_deleted )}">View information</a>
%endif
@@ -348,7 +349,7 @@
info_association, inherited = folder.get_info_association( restrict=True )
%>
%if not root_folder and ( not folder.deleted or show_deleted ):
- <% encoded_id = trans.security.encode_id(folder.id) %>
+ <% encoded_id = trans.security.encode_id( folder.id ) %><tr id="folder-${encoded_id}" class="folderRow libraryOrFolderRow"
%if parent is not None:
parent="${parent}"
@@ -358,15 +359,16 @@
<td style="padding-left: ${folder_pad}px;"><input type="checkbox" class="folderCheckbox"/><span class="expandLink folder-${encoded_id}-click">
- <div style="float: left; margin-left: 2px;" class="menubutton split popup" id="folder_img-${folder.id}-popup">
- <a class="folder-${encoded_id}-click" href="javascript:void(0);">
- %if folder.deleted:
- <span class="libraryItem-error">${folder.name}</span>
- %else:
- ${folder.name}
- %endif
- </a>
- </div>
+ <div style="float: left; margin-left: 2px;" class="menubutton split popup" id="folder_img-${folder.id}-popup">
+ <a class="folder-${encoded_id}-click" href="javascript:void(0);">
+ %if folder.deleted:
+ <div class="libraryItem-error">${folder.name}</div>
+ %else:
+ ${folder.name}
+ %endif
+ </a>
+ </div>
+ </span>
%if not library.deleted:
<div popupmenu="folder_img-${folder.id}-popup">
%if not branch_deleted( folder ) and can_add:
@@ -379,6 +381,7 @@
%endif
%if can_modify:
<a class="action-button" href="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit information</a>
+ <a class="action-button" href="${h.url_for( controller='library_common', action='move_library_item', cntrller=cntrller, item_type='folder', item_id=trans.security.encode_id( folder.id ), source_library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Move this folder</a>
%else:
<a class="action-button" class="view-info" href="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">View information</a>
%endif
--- a/templates/library/common/common.mako Tue Mar 08 14:35:26 2011 -0500
+++ b/templates/library/common/common.mako Tue Mar 08 15:50:19 2011 -0500
@@ -399,17 +399,18 @@
can_download = 'download' not in actions_to_exclude
can_import_to_histories = 'import_to_histories' not in actions_to_exclude
can_manage_permissions = 'manage_permissions' not in actions_to_exclude
+ can_move = 'move' not in actions_to_exclude
%><tfoot><tr><td colspan="5" style="padding-left: 42px;">
- For selected items:
+ For selected datasets:
<select name="do_action" id="action_on_selected_items">
%if can_import_to_histories:
%if not is_admin and default_action == 'import_to_histories':
- <option value="import_to_histories" selected>Import selected datasets to histories</option>
+ <option value="import_to_histories" selected>Import to histories</option>
%else:
- <option value="import_to_histories">Import selected datasets to histories</option>
+ <option value="import_to_histories">Import to histories</option>
%endif
%endif
%if can_manage_permissions:
@@ -419,13 +420,19 @@
<option value="manage_permissions">Edit permissions</option>
%endif
%endif
+ %if can_move:
+ <option value="move">Move</option>
+ %endif
+ %if can_delete:
+ <option value="delete">Delete</option>
+ %endif
%if can_download:
%if 'gz' in comptypes:
<option value="tgz"
%if default_action == 'download':
selected
%endif>
- >Download as a .tar.gz file</option>
+ >Download as a .tar.gz file</option>
%endif
%if 'bz2' in comptypes:
<option value="tbz">Download as a .tar.bz2 file</option>
@@ -442,9 +449,6 @@
>Download as a .zip file</option>
%endif
%endif
- %if can_delete:
- <option value="delete">Delete</option>
- %endif
</select><input type="submit" class="primary-button" name="action_on_datasets_button" id="action_on_datasets_button" value="Go"/></td>
--- a/templates/library/common/import_datasets_to_histories.mako Tue Mar 08 14:35:26 2011 -0500
+++ b/templates/library/common/import_datasets_to_histories.mako Tue Mar 08 15:50:19 2011 -0500
@@ -4,74 +4,53 @@
<%def name="title()">Import library datasets to histories</%def><%def name="javascripts()">
-
-${parent.javascripts()}
-${h.js( "jquery", "galaxy.base" )}
-<script type="text/javascript">
- $(function() {
- $("#select-multiple").click(function() {
- $("#single-dest-select").val("");
- $("#single-destination").hide();
- $("#multiple-destination").show();
+ ${parent.javascripts()}
+ ${h.js( "jquery", "galaxy.base" )}
+ <script type="text/javascript">
+ $(function() {
+ $("#select-multiple").click(function() {
+ $("#single-dest-select").val("");
+ $("#single-destination").hide();
+ $("#multiple-destination").show();
+ });
});
- });
-</script>
-
+ </script></%def>
%if message:
${render_msg( message, status )}
%endif
-<p>
- <div class="infomessage">Import library datasets into histories.</div>
- <div style="clear: both"></div>
-</p>
-<p>
- <form method="post">
- <div class="toolForm" style="float: left; width: 45%; padding: 0px;">
- <div class="toolFormBody">
- <input type="hidden" name="cntrller" value="${cntrller}"/>
- %if source_lddas:
- %for source_ldda in source_lddas:
- <%
- checked = ""
- encoded_id = trans.security.encode_id( source_ldda.id )
- if source_ldda.id in ldda_ids:
- checked = " checked='checked'"
- %>
- <div class="form-row">
- <input type="checkbox" name="ldda_ids" id="dataset_${encoded_id}" value="${encoded_id}" ${checked}/>
- <label for="dataset_${encoded_id}" style="display: inline;font-weight:normal;">${source_ldda.name}</label>
- </div>
- %endfor
- %else:
- <div class="form-row">This folder has no accessible library datasets.</div>
- %endif
- </div>
+<b>Import library datasets into histories</b>
+<br/><br/>
+<form action="${h.url_for( controller='library_common', action='import_datasets_to_histories', cntrller=cntrller, use_panels=use_panels, show_deleted=show_deleted )}" method="post">
+ <div class="toolForm" style="float: left; width: 45%; padding: 0px;">
+ <div class="toolFormBody">
+ %if source_lddas:
+ %for source_ldda in source_lddas:
+ <%
+ checked = ""
+ encoded_id = trans.security.encode_id( source_ldda.id )
+ if source_ldda.id in ldda_ids:
+ checked = " checked='checked'"
+ %>
+ <div class="form-row">
+ <input type="checkbox" name="ldda_ids" id="dataset_${encoded_id}" value="${encoded_id}" ${checked}/>
+ <label for="dataset_${encoded_id}" style="display: inline;font-weight:normal;">${source_ldda.name}</label>
+ </div>
+ %endfor
+ %else:
+ <div class="form-row">This folder has no accessible library datasets.</div>
+ %endif
</div>
- <div style="float: left; padding-left: 10px; font-size: 36px;">→</div>
- <div class="toolForm" style="float: right; width: 45%; padding: 0px;">
- <div class="toolFormTitle">Destination Histories:</div>
- <div class="toolFormBody">
- <div class="form-row" id="single-destination">
- <select id="single-dest-select" name="target_history_ids">
- <option value=""></option>
- %for i, target_history in enumerate( target_histories ):
- <%
- encoded_id = trans.security.encode_id( target_history.id )
- if target_history == current_history:
- current_history_text = " (current history)"
- else:
- current_history_text = ""
- %>
- <option value="${encoded_id}">${i + 1}: ${h.truncate( target_history.name, 30 )}${current_history_text}</option>
- %endfor
- </select>
- <br/><br/>
- <a style="margin-left: 10px;" href="javascript:void(0);" id="select-multiple">Choose multiple histories</a>
- </div>
- <div id="multiple-destination" style="display: none;">
+ </div>
+ <div style="float: left; padding-left: 10px; font-size: 36px;">→</div>
+ <div class="toolForm" style="float: right; width: 45%; padding: 0px;">
+ <div class="toolFormTitle">Destination Histories:</div>
+ <div class="toolFormBody">
+ <div class="form-row" id="single-destination">
+ <select id="single-dest-select" name="target_history_ids">
+ <option value=""></option>
%for i, target_history in enumerate( target_histories ):
<%
encoded_id = trans.security.encode_id( target_history.id )
@@ -80,31 +59,45 @@
else:
current_history_text = ""
%>
- <div class="form-row">
- <input type="checkbox" name="target_history_ids" id="target_history_${encoded_id}" value="${encoded_id}"/>
- <label for="target_history_${encoded_id}" style="display: inline; font-weight:normal;">${i + 1}: ${target_history.name}${current_history_text}</label>
- </div>
+ <option value="${encoded_id}">${i + 1}: ${h.truncate( target_history.name, 30 )}${current_history_text}</option>
%endfor
+ </select>
+ <br/><br/>
+ <a style="margin-left: 10px;" href="javascript:void(0);" id="select-multiple">Choose multiple histories</a>
+ </div>
+ <div id="multiple-destination" style="display: none;">
+ %for i, target_history in enumerate( target_histories ):
+ <%
+ encoded_id = trans.security.encode_id( target_history.id )
+ if target_history == current_history:
+ current_history_text = " (current history)"
+ else:
+ current_history_text = ""
+ %>
+ <div class="form-row">
+ <input type="checkbox" name="target_history_ids" id="target_history_${encoded_id}" value="${encoded_id}"/>
+ <label for="target_history_${encoded_id}" style="display: inline; font-weight:normal;">${i + 1}: ${target_history.name}${current_history_text}</label>
+ </div>
+ %endfor
+ </div>
+ %if trans.get_user():
+ <%
+ checked = ""
+ if "create_new_history" in target_history_ids:
+ checked = " checked='checked'"
+ %>
+ <hr />
+ <div style="text-align: center; color: #888;">— OR —</div>
+ <div class="form-row">
+ <label for="new_history_name" style="display: inline; font-weight:normal;">New history named:</label>
+ <input type="textbox" name="new_history_name" /></div>
- %if trans.get_user():
- <%
- checked = ""
- if "create_new_history" in target_history_ids:
- checked = " checked='checked'"
- %>
- <hr />
- <div style="text-align: center; color: #888;">— OR —</div>
- <div class="form-row">
- <label for="new_history_name" style="display: inline; font-weight:normal;">New history named:</label>
- <input type="textbox" name="new_history_name" />
- </div>
- %endif
- </div>
+ %endif
</div>
- <div style="clear: both"></div>
- <div class="form-row" align="center">
- <input type="submit" class="primary-button" name="import_datasets_to_histories_button" value="Import library datasets"/>
- </div>
- </form></div>
-</p>
+ <div style="clear: both"></div>
+ <div class="form-row" align="center">
+ <input type="submit" class="primary-button" name="import_datasets_to_histories_button" value="Import library datasets"/>
+ </div>
+ </form>
+</div>
--- a/templates/library/common/library_dataset_search_results.mako Tue Mar 08 14:35:26 2011 -0500
+++ b/templates/library/common/library_dataset_search_results.mako Tue Mar 08 15:50:19 2011 -0500
@@ -95,7 +95,7 @@
<p>The string "${search_term}" was found in at least one of the following information components of the displayed library datasets.</p>
${render_searched_components()}
<form name="act_on_multiple_datasets" action="${h.url_for( controller='library_common', action='act_on_multiple_datasets', cntrller=cntrller, use_panels=use_panels, show_deleted=show_deleted )}" onSubmit="javascript:return checkForm();" method="post">
- <input type="hidden" name=search_term value="${search_term}"/>
+ <input type="hidden" name="search_term" value="${search_term}"/><table cellspacing="0" cellpadding="0" border="0" width="100%" class="grid" id="library-grid"><thead><tr class="libraryTitle">
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/6f03367736a8/
changeset: r5199:6f03367736a8
user: rc
date: 2011-03-08 20:35:26
summary: Add import statement for binascii
affected #: 1 file (16 bytes)
--- a/lib/galaxy/model/migrate/versions/0076_fix_form_values_data_corruption.py Tue Mar 08 14:08:07 2011 -0500
+++ b/lib/galaxy/model/migrate/versions/0076_fix_form_values_data_corruption.py Tue Mar 08 14:35:26 2011 -0500
@@ -7,6 +7,7 @@
from migrate import *
from migrate.changeset import *
from sqlalchemy.exc import *
+import binascii
from galaxy.util.json import from_json_string, to_json_string
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: rc: Added the postgres9 json sniffnfix method to the migration script instead of importing it from custom_types.py
by Bitbucket 08 Mar '11
by Bitbucket 08 Mar '11
08 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/e844d6edf929/
changeset: r5198:e844d6edf929
user: rc
date: 2011-03-08 20:08:07
summary: Added the postgres9 json sniffnfix method to the migration script instead of importing it from custom_types.py
affected #: 1 file (319 bytes)
--- a/lib/galaxy/model/migrate/versions/0076_fix_form_values_data_corruption.py Tue Mar 08 12:42:26 2011 -0500
+++ b/lib/galaxy/model/migrate/versions/0076_fix_form_values_data_corruption.py Tue Mar 08 14:08:07 2011 -0500
@@ -9,7 +9,6 @@
from sqlalchemy.exc import *
from galaxy.util.json import from_json_string, to_json_string
-from galaxy.model.custom_types import _sniffnfix_pg9_hex
import logging
log = logging.getLogger( __name__ )
@@ -17,6 +16,18 @@
metadata = MetaData( migrate_engine )
db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) )
+def _sniffnfix_pg9_hex(value):
+ """
+ Sniff for and fix postgres 9 hex decoding issue
+
+ """
+ try:
+ if value[0] == 'x':
+ return binascii.unhexlify(value[1:])
+ else:
+ return value
+ except Exception, ex:
+ return value
def upgrade():
print __doc__
@@ -32,7 +43,7 @@
# first check if loading the dict from the json succeeds
# if that fails, it means that the content field is corrupted.
try:
- field_values_dict = from_json_string( str( row['field_values'] ) )
+ field_values_dict = from_json_string( _sniffnfix_pg9_hex( str( row['field_values'] ) ) )
except Exception, e:
corrupted_rows = corrupted_rows + 1
# content field is corrupted
@@ -72,7 +83,10 @@
json_values = to_json_string(field_values_dict)
cmd = "UPDATE form_values SET content='%s' WHERE id=%i" %( json_values, int( row['id'] ) )
db_session.execute( cmd )
- print 'Fixed %i corrupted rows.' % corrupted_rows
+ if corrupted_rows:
+ print 'Fixed %i corrupted rows.' % corrupted_rows
+ else:
+ print 'No corrupted rows found.'
def downgrade():
pass
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

commit/galaxy-central: rc: Fixes the data corruption caused in the form_values table (content field) by the migrate script 65.
by Bitbucket 08 Mar '11
by Bitbucket 08 Mar '11
08 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/0ce107ca4e8b/
changeset: r5197:0ce107ca4e8b
user: rc
date: 2011-03-08 18:42:26
summary: Fixes the data corruption caused in the form_values table (content field) by the migrate script 65.
affected #: 1 file (0 bytes)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0

08 Mar '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/86b7fa44549c/
changeset: r5196:86b7fa44549c
user: natefoo
date: 2011-03-08 17:17:57
summary: An uninitialized value in R's PDF driver was causing it to sometimes randomly add a few elements to PDF outputs. The bug has been fixed in the buildbot environment and these changes account for that fix.
affected #: 17 files (728 bytes)
--- a/test-data/peakcalling_macs/test2/Galaxy_Test_Run_model.pdf Tue Mar 08 10:26:52 2011 -0500
+++ b/test-data/peakcalling_macs/test2/Galaxy_Test_Run_model.pdf Tue Mar 08 11:17:57 2011 -0500
@@ -28,7 +28,7 @@
\/Length\ 7\ 0\ R
\>\>
stream
-q
+[1Jj ]*q
Q\ q\ 59\.04\ 73\.44\ 342\.72\ 299\.52\ re\ W\ n
1\.000\ 0\.000\ 0\.000\ RG
0\.75\ w
@@ -3759,7 +3759,7 @@
endstream
endobj
7\ 0\ obj
-59450
+5945[0-9]
endobj
3\ 0\ obj
\<\<
--- a/test/base/twilltestcase.py Tue Mar 08 10:26:52 2011 -0500
+++ b/test/base/twilltestcase.py Tue Mar 08 11:17:57 2011 -0500
@@ -75,7 +75,7 @@
# PDF files contain creation dates, modification dates, ids and descriptions that change with each
# new file, so we need to handle these differences. As long as the rest of the PDF file does
# not differ we're ok.
- valid_diff_strs = [ 'description', 'createdate', 'creationdate', 'moddate', 'id', 'producer', 'creator', 'extgstate', 'ais' ]
+ valid_diff_strs = [ 'description', 'createdate', 'creationdate', 'moddate', 'id', 'producer', 'creator' ]
valid_diff = False
invalid_diff_lines = 0
for line in diff_slice:
--- a/tools/multivariate_stats/cca.xml Tue Mar 08 10:26:52 2011 -0500
+++ b/tools/multivariate_stats/cca.xml Tue Mar 08 11:17:57 2011 -0500
@@ -52,7 +52,7 @@
<param name="y_scale" value="scale"/><param name="std_scores" value="yes"/><output name="out_file1" file="cca_out1.tabular"/>
- <output name="out_file2" file="cca_out2.pdf" lines_diff="6"/>
+ <output name="out_file2" file="cca_out2.pdf"/></test></tests><help>
--- a/tools/multivariate_stats/kpca.xml Tue Mar 08 10:26:52 2011 -0500
+++ b/tools/multivariate_stats/kpca.xml Tue Mar 08 11:17:57 2011 -0500
@@ -108,7 +108,7 @@
<param name="scale" value="1"/><param name="degree" value="2"/><output name="out_file1" file="kpca_out1.tabular"/>
- <output name="out_file2" file="kpca_out2.pdf" lines_diff="6"/>
+ <output name="out_file2" file="kpca_out2.pdf"/></test></tests><help>
--- a/tools/multivariate_stats/pca.xml Tue Mar 08 10:26:52 2011 -0500
+++ b/tools/multivariate_stats/pca.xml Tue Mar 08 11:17:57 2011 -0500
@@ -47,14 +47,14 @@
<param name="var_cols" value="1,2,3,4"/><param name="method" value="cor"/><output name="out_file1" file="pca_out1.tabular"/>
- <output name="out_file2" file="pca_out2.pdf" lines_diff="6"/>
+ <output name="out_file2" file="pca_out2.pdf"/></test><test><param name="input1" value="iris.tabular"/><param name="var_cols" value="1,2,3,4"/><param name="method" value="cov"/><output name="out_file1" file="pca_out3.tabular"/>
- <output name="out_file2" file="pca_out4.pdf" lines_diff="6"/>
+ <output name="out_file2" file="pca_out4.pdf"/></test><test><param name="input1" value="iris.tabular"/>
@@ -62,7 +62,7 @@
<param name="method" value="svd"/><param name="scale" value="both"/><output name="out_file1" file="pca_out5.tabular"/>
- <output name="out_file2" file="pca_out6.pdf" lines_diff="6"/>
+ <output name="out_file2" file="pca_out6.pdf"/></test></tests><help>
--- a/tools/plotting/histogram2.xml Tue Mar 08 10:26:52 2011 -0500
+++ b/tools/plotting/histogram2.xml Tue Mar 08 11:17:57 2011 -0500
@@ -22,7 +22,7 @@
<param name="xlab" value="V1"/><param name="density" value="true"/><param name="frequency" value="false"/>
- <output name="out_file1" file="histogram_out1.pdf" lines_diff="6" />
+ <output name="out_file1" file="histogram_out1.pdf"/></test></tests><requirements>
--- a/tools/regVariation/draw_stacked_barplots.xml Tue Mar 08 10:26:52 2011 -0500
+++ b/tools/regVariation/draw_stacked_barplots.xml Tue Mar 08 11:17:57 2011 -0500
@@ -16,7 +16,7 @@
<tests><test><param name="inputFile1" value="categories_criteria.tabular" />
- <output name="outputFile1" file="statcked_bars_plot.pdf" />
+ <output name="outputFile1" file="stacked_barplot.pdf" /></test></tests>
--- a/tools/regVariation/linear_regression.xml Tue Mar 08 10:26:52 2011 -0500
+++ b/tools/regVariation/linear_regression.xml Tue Mar 08 11:17:57 2011 -0500
@@ -29,7 +29,7 @@
<param name="response_col" value="3"/><param name="predictor_cols" value="1,2"/><output name="out_file1" file="regr_out.tabular"/>
- <output name="out_file2" file="regr_out.pdf" lines_diff="6"/>
+ <output name="out_file2" file="regr_out.pdf"/></test></tests><help>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/58f118c440ad/
changeset: r5195:58f118c440ad
user: jgoecks
date: 2011-03-08 16:26:52
summary: Remove debugging statement.
affected #: 1 file (83 bytes)
--- a/static/scripts/trackster.js Tue Mar 08 10:04:39 2011 -0500
+++ b/static/scripts/trackster.js Tue Mar 08 10:26:52 2011 -0500
@@ -1573,7 +1573,6 @@
if (clear_after) {
var track = this;
var intervalId = setInterval(function() {
- console.log("draw_tile_dict_length:", obj_length(draw_tile_dict));
if (obj_length(draw_tile_dict) === 0) {
// All tiles have been drawn; clear out track content in order to show the most recent content.
// Most recent content is the div with children (tiles) most recently appended to track.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0