mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
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:
@@ -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 }
|
||||
|
||||
@@ -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 ):
|
||||
|
||||
@@ -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
@@ -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",
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user