trackster:

- Custom dbkeys now create new HDA and copies info in
- Fix track reordering for all browsers
- Fix track deletion
- Fix BAM display
This commit is contained in:
Kanwei Li
2010-05-06 12:30:54 -04:00
parent dbfa0a7cca
commit 25b041ef16
8 changed files with 75 additions and 45 deletions
+3 -3
View File
@@ -10,7 +10,7 @@ from math import floor, ceil, log
import logging
log = logging.getLogger(__name__)
MAX_VALS = 50 # only display first MAX_VALS datapoints
MAX_VALS = 5000 # only display first MAX_VALS datapoints
class BamDataProvider( object ):
"""
@@ -36,7 +36,7 @@ class BamDataProvider( object ):
if chrom.startswith( 'chr' ):
try:
data = bamfile.fetch( start=start, end=end, reference=chrom[3:] )
except:
except ValueError:
return None
else:
return None
@@ -74,4 +74,4 @@ class BamDataProvider( object ):
results.append( [ qname, start, end, read['seq'], r1, r2 ] )
bamfile.close()
return results
return { 'data': results, 'message': message }
+22 -13
View File
@@ -99,7 +99,7 @@ class TracksController( BaseController, UsesVisualization ):
user = trans.get_user()
if 'dbkeys' in user.preferences:
user_keys = from_json_string( user.preferences['dbkeys'] )
dbkeys = [ (k, v) for k, v in trans.db_builds if k in self.len_files or k in user_keys ]
return trans.fill_template( "tracks/new_browser.mako", dbkeys=dbkeys )
@@ -197,21 +197,24 @@ class TracksController( BaseController, UsesVisualization ):
"""
Helper method that returns chrom lengths for a given user and dbkey.
"""
len_file = None
len_ds = None
# If there is any dataset in the history of extension `len`, this will use it
if 'dbkeys' in user.preferences:
user_keys = from_json_string( user.preferences['dbkeys'] )
if dbkey in user_keys:
return user_keys[dbkey]['chroms']
len_file = trans.sa_session.query( trans.app.model.HistoryDatasetAssociation ).get( user_keys[dbkey]['len'] ).file_name
db_manifest = trans.db_dataset_for( dbkey )
if not db_manifest:
db_manifest = os.path.join( trans.app.config.tool_data_path, 'shared','ucsc','chrom', "%s.len" % dbkey )
else:
db_manifest = db_manifest.file_name
if not len_file:
len_ds = trans.db_dataset_for( dbkey )
if not len_ds:
len_file = os.path.join( trans.app.config.tool_data_path, 'shared','ucsc','chrom', "%s.len" % dbkey )
else:
len_file = len_ds.file_name
manifest = {}
if not os.path.exists( db_manifest ):
if not os.path.exists( len_file ):
return None
for line in open( db_manifest ):
for line in open( len_file ):
if line.startswith("#"): continue
line = line.rstrip("\r\n")
fields = line.split("\t")
@@ -240,7 +243,9 @@ class TracksController( BaseController, UsesVisualization ):
# Need to check states again for the converted version
if converted_dataset and converted_dataset.state == model.Dataset.states.ERROR:
return messages.ERROR
job_id = trans.sa_session.query( trans.app.model.JobToOutputDatasetAssociation ).filter_by( dataset_id=converted_dataset.id ).first().job_id
job = trans.sa_session.query( trans.app.model.Job ).get( job_id )
return { 'kind': messages.ERROR, 'message': job.stderr }
if not converted_dataset or converted_dataset.state != model.Dataset.states.OK:
return messages.PENDING
@@ -256,13 +261,17 @@ class TracksController( BaseController, UsesVisualization ):
extra_info = "no_detail"
else:
frequencies, max_v, avg_v, delta = summary
return { "dataset_type": data_sources['index'], "data": frequencies, "max": max_v, "avg": avg_v, "delta": delta }
return { 'dataset_type': data_sources['index'], 'data': frequencies, 'max': max_v, 'avg': avg_v, 'delta': delta }
dataset_type = data_sources['data']
data_provider = dataset_type_to_data_provider[ dataset_type ]( dataset.get_converted_dataset(trans, dataset_type), dataset )
data = data_provider.get_data( chrom, low, high, **kwargs )
return { "dataset_type": dataset_type, "extra_info": extra_info, "data": data }
message = None
if isinstance(data, dict) and 'message' in data:
message = data['message']
data = data['data']
return { 'dataset_type': dataset_type, 'extra_info': extra_info, 'data': data, 'message': message }
@web.expose
def list_tracks( self, trans, hid ):
+16 -3
View File
@@ -902,7 +902,18 @@ class User( BaseController ):
if not name or not key or not len_text:
message = "You must specify values for all the fields."
else:
chrom_dict = {}
# Create new len file
new_len = trans.app.model.HistoryDatasetAssociation( extension="len", create_dataset=True, sa_session=trans.sa_session )
trans.sa_session.add( new_len )
new_len.name = name
new_len.visible = False
new_len.history_id = trans.get_history().id
new_len.state = trans.app.model.Job.states.OK
new_len.info = "custom build .len file"
trans.sa_session.flush()
counter = 0
f = open(new_len.file_name, "w")
for line in len_text.split("\n"):
lst = line.strip().split()
if not lst or len(lst) < 2:
@@ -914,8 +925,10 @@ class User( BaseController ):
except ValueError:
lines_skipped += 1
continue
chrom_dict[chrom] = length
dbkeys[key] = { "name": name, "chroms": chrom_dict }
counter += 1
f.write("%s\t%s\n" % (chrom, length))
f.close()
dbkeys[key] = { "name": name, "len": new_len.id, "count": counter }
user.preferences['dbkeys'] = to_json_string(dbkeys)
trans.sa_session.flush()
File diff suppressed because one or more lines are too long
+17 -11
View File
@@ -5,7 +5,7 @@ var DEBUG = false;
var DENSITY = 200,
FEATURE_LEVELS = 10,
DATA_ERROR = "There was an error in indexing this dataset.",
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",
@@ -118,17 +118,15 @@ $.extend( View.prototype, {
},
remove_track: function( track ) {
track.container_div.fadeOut('slow', function() { $(this).remove(); });
delete this.tracks[track];
delete this.tracks.splice(this.tracks.indexOf(track));
},
update_options: function() {
var sorted = $("ul#sortable-ul").sortable('toArray');
var payload = [];
for (var id_i in sorted) {
var id = sorted[id_i].split("_li")[0].split("track_")[1];
$("#viewport").append( $("#track_" + id) );
}
var divs = $("#viewport > div").sort(function (a, b) {
return sorted.indexOf( $(a).attr('id') ) > sorted.indexOf( $(b).attr('id') );
});
$("#viewport > div").remove();
$("#viewport").html(divs);
for (var track_id in view.tracks) {
var track = view.tracks[track_id];
if (track.update_options) {
@@ -234,13 +232,22 @@ $.extend( Track.prototype, {
if (track.view.chrom) {
$.getJSON( data_url, params, function (result) {
if (!result || result === "error") {
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>").attr("id", track_id + "_error");
error_link.text("Click to view error");
$("#" + track_id + "_error").live("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.data && result.data.length === 0 || result.data === null) {
} else if (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") {
@@ -441,7 +448,6 @@ $.extend( LineTrack.prototype, TiledTrack.prototype, {
var result = this.data_cache.get(key);
if (result === null) { return; }
console.log(result);
canvas.css( {
position: "absolute",
+1 -3
View File
@@ -272,7 +272,6 @@ ${h.js( 'galaxy.base', 'galaxy.panels', "json2", "jquery", "jquery.event.drag",
$.ajax({
url: "${h.url_for( action='chroms' )}",
## If vis is new, it doesn't have an id, so send the dbkey instead.
%if config.get('vis_id'):
data: { vis_id: view.vis_id },
%else:
@@ -327,7 +326,7 @@ ${h.js( 'galaxy.base', 'galaxy.panels', "json2", "jquery", "jquery.event.drag",
$("#track_" + track_id + "_editable").toggle();
});
del_icon.bind("click", function() {
$("#track_" + track_id + "_li").fadeOut('slow', function() { $("#track_" + track_id).remove(); });
$("#track_" + track_id + "_li").fadeOut('slow', function() { $("#track_" + track_id + "_li").remove(); });
view.remove_track(track);
view.update_options();
});
@@ -354,4 +353,3 @@ ${h.js( 'galaxy.base', 'galaxy.panels', "json2", "jquery", "jquery.event.drag",
</script>
</%def>
+14 -11
View File
@@ -41,23 +41,26 @@ $(function() {
<tr class="header">
<th>Name</th>
<th>Key</th>
<th>Chroms/Lengths</th>
<th>Number of Chroms</th>
<th></th>
</tr>
% for key, dct in dbkeys.iteritems():
<tr>
<td>${dct["name"] | h}</td>
<td>${dct['name'] | h}</td>
<td>${key | h}</td>
<td>
<span>${len(dct["chroms"])} entries</span>
<pre id="pre_${key}" class="db_hide">
<table cellspacing="0" cellpadding="0">
<tr><th>Chrom</th><th>Length</th></tr>
% for chrom, chrom_len in dct["chroms"].iteritems():
<tr><td>${chrom | h}</td><td>${chrom_len | h}</td></tr>
% endfor
</table>
</pre>
## <span>${len(dct["chroms"])} entries</span>
## <pre id="pre_${key}" class="db_hide">
## <table cellspacing="0" cellpadding="0">
## <tr><th>Chrom</th><th>Length</th></tr>
## % for chrom, chrom_len in dct["chroms"].iteritems():
## <tr><td>${chrom | h}</td><td>${chrom_len | h}</td></tr>
## % endfor
## </table>
## </pre>
% if 'count' in dct:
${dct['count']}
% endif
</td>
<td><form action="dbkeys" method="post"><input type="hidden" name="key" value="${key}" /><input type="submit" name="delete" value="Delete" /></form></td>
</tr>
+1
View File
@@ -35,6 +35,7 @@
<tool file="filters/changeCase.xml" />
<tool file="filters/pasteWrapper.xml" />
<tool file="filters/remove_beginning.xml" />
<tool file="filters/randomlines.xml" />
<tool file="filters/headWrapper.xml" />
<tool file="filters/tailWrapper.xml" />
<tool file="filters/trimmer.xml" />