galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- 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
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/086e594d372c/
Changeset: 086e594d372c
User: guerler
Date: 2014-02-07 06:06:55
Summary: Merge
Affected #: 1 file
diff -r dc69ee2333c21cdc24d6b5855355fd5a08a8ab53 -r 086e594d372cc58a823f061c3a008a60c0c33472 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py
+++ b/lib/galaxy/web/framework/helpers/grids.py
@@ -777,7 +777,7 @@
return dict( operation=self.label, id=item.id )
def allowed( self, item ):
if self.condition:
- return self.condition( item )
+ return bool(self.condition( item ))
else:
return True
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: guerler: Grids: Convert ill defined conditions to boolean
by commits-noreply@bitbucket.org 07 Feb '14
by commits-noreply@bitbucket.org 07 Feb '14
07 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/deea87095946/
Changeset: deea87095946
Branch: next-stable
User: guerler
Date: 2014-02-07 06:05:02
Summary: Grids: Convert ill defined conditions to boolean
Affected #: 1 file
diff -r d5ce503c01b7e5520133014d0927b3d062eb9705 -r deea87095946ea32d28491b44a120bbc94683150 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py
+++ b/lib/galaxy/web/framework/helpers/grids.py
@@ -768,7 +768,7 @@
return dict( operation=self.label, id=item.id )
def allowed( self, item ):
if self.condition:
- return self.condition( item )
+ return bool(self.condition( item ))
else:
return True
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: guerler: Add default parameter to quota undelete grid action
by commits-noreply@bitbucket.org 07 Feb '14
by commits-noreply@bitbucket.org 07 Feb '14
07 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/dc69ee2333c2/
Changeset: dc69ee2333c2
User: guerler
Date: 2014-02-07 04:37:40
Summary: Add default parameter to quota undelete grid action
Affected #: 1 file
diff -r 4ede9ee8278e18df75a3d79b7a6b133274b058b6 -r dc69ee2333c21cdc24d6b5855355fd5a08a8ab53 lib/galaxy/actions/admin.py
--- a/lib/galaxy/actions/admin.py
+++ b/lib/galaxy/actions/admin.py
@@ -150,7 +150,7 @@
message += ', '.join( names )
return message
- def _undelete_quota( self, quota, params ):
+ def _undelete_quota( self, quota, params = None):
quotas = util.listify( quota )
names = []
for q in quotas:
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: guerler: Fix undelete action in quota grid
by commits-noreply@bitbucket.org 07 Feb '14
by commits-noreply@bitbucket.org 07 Feb '14
07 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/4ede9ee8278e/
Changeset: 4ede9ee8278e
User: guerler
Date: 2014-02-07 04:34:44
Summary: Fix undelete action in quota grid
Affected #: 1 file
diff -r a2739727943039f4c8f74194491396ffa1299267 -r 4ede9ee8278e18df75a3d79b7a6b133274b058b6 lib/galaxy/actions/admin.py
--- a/lib/galaxy/actions/admin.py
+++ b/lib/galaxy/actions/admin.py
@@ -150,7 +150,7 @@
message += ', '.join( names )
return message
- def _undelete_quota( self, quota ):
+ def _undelete_quota( self, quota, params ):
quotas = util.listify( quota )
names = []
for q in quotas:
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d5ce503c01b7/
Changeset: d5ce503c01b7
Branch: next-stable
User: jeremy goecks
Date: 2014-02-07 03:41:32
Summary: Prioritize gene id over transcript id for interval name in GFF data provider.
Affected #: 1 file
diff -r 54508df431ac564f4ddaf37e3c647f5b18576cbf -r d5ce503c01b7e5520133014d0927b3d062eb9705 lib/galaxy/datatypes/util/gff_util.py
--- a/lib/galaxy/datatypes/util/gff_util.py
+++ b/lib/galaxy/datatypes/util/gff_util.py
@@ -75,7 +75,7 @@
# Preference for name: GTF, GFF3, GFF.
for attr_name in [
# GTF:
- 'transcript_id', 'gene_id',
+ 'gene_id', 'transcript_id',
# GFF3:
'ID', 'id',
# GFF (TODO):
https://bitbucket.org/galaxy/galaxy-central/commits/a27397279430/
Changeset: a27397279430
User: jeremy goecks
Date: 2014-02-07 03:42:29
Summary: Merge next-stable to default
Affected #: 1 file
diff -r d92f65506e1cdc46b29aa0049d04bf2fb4179742 -r a2739727943039f4c8f74194491396ffa1299267 lib/galaxy/datatypes/util/gff_util.py
--- a/lib/galaxy/datatypes/util/gff_util.py
+++ b/lib/galaxy/datatypes/util/gff_util.py
@@ -75,7 +75,7 @@
# Preference for name: GTF, GFF3, GFF.
for attr_name in [
# GTF:
- 'transcript_id', 'gene_id',
+ 'gene_id', 'transcript_id',
# GFF3:
'ID', 'id',
# GFF (TODO):
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/54508df431ac/
Changeset: 54508df431ac
Branch: next-stable
User: jmchilton
Date: 2014-02-07 00:08:36
Summary: Fix documentation on normalize remote user e-mail.
Listed values should be unmodified defaults.
Affected #: 1 file
diff -r 0a9053d624bb0bf253b51b99f07cb600b3fb3490 -r 54508df431ac564f4ddaf37e3c647f5b18576cbf universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -602,9 +602,9 @@
#remote_user_logout_href = None
# If your proxy and/or authentication source does not normalize e-mail
-# addresses or user names being passed to Galaxy - enable the following option
-# to force these to lower case.
-#normalize_remote_user_email = True
+# addresses or user names being passed to Galaxy - set the following option
+# to True to force these to lower case.
+#normalize_remote_user_email = False
# Administrative users - set this to a comma-separated list of valid Galaxy
# users (email addresses). These users will have access to the Admin section
https://bitbucket.org/galaxy/galaxy-central/commits/d92f65506e1c/
Changeset: d92f65506e1c
User: jmchilton
Date: 2014-02-07 00:08:58
Summary: Merge next-stable.
Affected #: 1 file
diff -r d282cb8daecb0748350a6ea69164071854fdaf60 -r d92f65506e1cdc46b29aa0049d04bf2fb4179742 universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -602,9 +602,9 @@
#remote_user_logout_href = None
# If your proxy and/or authentication source does not normalize e-mail
-# addresses or user names being passed to Galaxy - enable the following option
-# to force these to lower case.
-#normalize_remote_user_email = True
+# addresses or user names being passed to Galaxy - set the following option
+# to True to force these to lower case.
+#normalize_remote_user_email = False
# Administrative users - set this to a comma-separated list of valid Galaxy
# users (email addresses). These users will have access to the Admin section
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0a9053d624bb/
Changeset: 0a9053d624bb
Branch: next-stable
User: carlfeberhard
Date: 2014-02-06 22:55:05
Summary: Move misc_info trimming to server side (causing UI flash on updates); Correctly handle wide misc info scrolling
Affected #: 5 files
diff -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 -r 0a9053d624bb0bf253b51b99f07cb600b3fb3490 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -1799,7 +1799,7 @@
update_time = hda.update_time.isoformat(),
data_type = hda.ext,
genome_build = hda.dbkey,
- misc_info = hda.info,
+ misc_info = hda.info.strip() if isinstance( hda.info, basestring ) else hda.info,
misc_blurb = hda.blurb )
# add tags string list
diff -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 -r 0a9053d624bb0bf253b51b99f07cb600b3fb3490 static/scripts/mvc/dataset/hda-model.js
--- a/static/scripts/mvc/dataset/hda-model.js
+++ b/static/scripts/mvc/dataset/hda-model.js
@@ -115,13 +115,6 @@
},
// ........................................................................ common queries
- toJSON : function(){
- var json = Backbone.Model.prototype.toJSON.call( this );
- //HACK: this should be done on the server side when setting
- json.misc_info = jQuery.trim( json.misc_info );
- return json;
- },
-
/** Is this hda deleted or purged? */
isDeletedOrPurged : function(){
return ( this.get( 'deleted' ) || this.get( 'purged' ) );
diff -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 -r 0a9053d624bb0bf253b51b99f07cb600b3fb3490 static/scripts/packed/mvc/dataset/hda-model.js
--- a/static/scripts/packed/mvc/dataset/hda-model.js
+++ b/static/scripts/packed/mvc/dataset/hda-model.js
@@ -1,1 +1,1 @@
-define([],function(){var d=Backbone.Model.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var i=this.get("id");if(!i){return{}}var h={purge:galaxy_config.root+"datasets/"+i+"/purge_async",display:galaxy_config.root+"datasets/"+i+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+i+"/edit",download:galaxy_config.root+"datasets/"+i+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+i,rerun:galaxy_config.root+"tool_runner/rerun?id="+i,show_params:galaxy_config.root+"datasets/"+i+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+i,set:galaxy_config.root+"dataset/annotate_async?id="+i},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+i+"&metadata_name="};return h},initialize:function(h){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",d.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(i,h){this.log(this+" has changed state:",i,h);if(this.inReadyState()){this.trigger("state:ready",i,h,this.previous("state"))}})},toJSON:function(){var h=Backbone.Model.prototype.toJSON.call(this);h.misc_info=jQuery.trim(h.misc_info);return h},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(i,j){var h=true;if((!i)&&(this.get("deleted")||this.get("purged"))){h=false}if((!j)&&(!this.get("visible"))){h=false}return h},hidden:function(){return !this.get("visible")},inReadyState:function(){var h=_.contains(d.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||h)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function c(h){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},h)},undelete:function a(h){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},h)},hide:function b(h){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},h)},unhide:function g(h){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},h)},purge:function f(h){if(this.get("purged")){return jQuery.when()}h=h||{};h.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var i=this,j=jQuery.ajax(h);j.done(function(m,k,l){i.set({deleted:true,purged:true})});j.fail(function(o,k,n){var l=_l("Unable to purge dataset");var m=("Removal of datasets by users is not allowed in this Galaxy instance");if(o.responseJSON&&o.responseJSON.error){l=o.responseJSON.error}else{if(o.responseText.indexOf(m)!==-1){l=m}}o.responseText=l;i.trigger("error",i,o,h,_l(l),{error:l})});return j},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(j,h){var i=this.get(j);if(!h||(i===undefined||i===null)){return false}if(_.isArray(i)){return this._searchArrayAttribute(i,h)}return(i.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)},_searchArrayAttribute:function(i,h){h=h.toLowerCase();return _.any(i,function(j){return(j.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)})},search:function(h){var i=this;return _.filter(this.searchAttributes,function(j){return i.searchAttribute(j,h)})},matches:function(i){var k="=",h=i.split(k);if(h.length>=2){var j=h[0];j=this.searchAliases[j]||j;return this.searchAttribute(j,h[1])}return !!this.search(i).length},matchesAll:function(i){var h=this;i=i.match(/(".*"|\w*=".*"|\S*)/g).filter(function(j){return !!j});return _.all(i,function(j){j=j.replace(/"/g,"");return h.matches(j)})},toString:function(){var h=this.get("id")||"";if(this.get("name")){h=this.get("hid")+' :"'+this.get("name")+'",'+h}return"HDA("+h+")"}});d.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};d.READY_STATES=[d.STATES.NEW,d.STATES.OK,d.STATES.EMPTY,d.STATES.PAUSED,d.STATES.FAILED_METADATA,d.STATES.NOT_VIEWABLE,d.STATES.DISCARDED,d.STATES.ERROR];d.NOT_READY_STATES=[d.STATES.UPLOAD,d.STATES.QUEUED,d.STATES.RUNNING,d.STATES.SETTING_METADATA];var e=Backbone.Collection.extend(LoggableMixin).extend({model:d,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(i,h){h=h||{};this.historyId=h.historyId},ids:function(){return this.map(function(h){return h.id})},notReady:function(){return this.filter(function(h){return !h.inReadyState()})},running:function(){var h=[];this.each(function(i){if(!i.inReadyState()){h.push(i.get("id"))}});return h},getByHid:function(h){return _.first(this.filter(function(i){return i.get("hid")===h}))},getVisible:function(h,k,j){j=j||[];var i=new e(this.filter(function(l){return l.isVisible(h,k)}));_.each(j,function(l){if(!_.isFunction(l)){return}i=new e(i.filter(l))});return i},haveDetails:function(){return this.all(function(h){return h.hasDetails()})},fetchAllDetails:function(i){i=i||{};var h={details:"all"};i.data=(i.data)?(_.extend(i.data,h)):(h);return this.fetch(i)},ajaxQueue:function(k,j){var i=jQuery.Deferred(),h=this.length,m=[];if(!h){i.resolve([]);return i}var l=this.chain().reverse().map(function(o,n){return function(){var p=k.call(o,j);p.done(function(q){i.notify({curr:n,total:h,response:q,model:o})});p.always(function(q){m.push(q);if(l.length){l.shift()()}else{i.resolve(m)}})}}).value();l.shift()();return i},matches:function(h){return this.filter(function(i){return i.matches(h)})},set:function(j,h){var i=this;j=_.map(j,function(l){var m=i.get(l.id);if(!m){return l}var k=m.toJSON();_.extend(k,l);return k});Backbone.Collection.prototype.set.call(this,j,h)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:d,HDACollection:e}});
\ No newline at end of file
+define([],function(){var d=Backbone.Model.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var i=this.get("id");if(!i){return{}}var h={purge:galaxy_config.root+"datasets/"+i+"/purge_async",display:galaxy_config.root+"datasets/"+i+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+i+"/edit",download:galaxy_config.root+"datasets/"+i+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+i,rerun:galaxy_config.root+"tool_runner/rerun?id="+i,show_params:galaxy_config.root+"datasets/"+i+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+i,set:galaxy_config.root+"dataset/annotate_async?id="+i},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+i+"&metadata_name="};return h},initialize:function(h){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",d.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(i,h){this.log(this+" has changed state:",i,h);if(this.inReadyState()){this.trigger("state:ready",i,h,this.previous("state"))}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(i,j){var h=true;if((!i)&&(this.get("deleted")||this.get("purged"))){h=false}if((!j)&&(!this.get("visible"))){h=false}return h},hidden:function(){return !this.get("visible")},inReadyState:function(){var h=_.contains(d.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||h)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function c(h){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},h)},undelete:function a(h){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},h)},hide:function b(h){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},h)},unhide:function g(h){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},h)},purge:function f(h){if(this.get("purged")){return jQuery.when()}h=h||{};h.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var i=this,j=jQuery.ajax(h);j.done(function(m,k,l){i.set({deleted:true,purged:true})});j.fail(function(o,k,n){var l=_l("Unable to purge dataset");var m=("Removal of datasets by users is not allowed in this Galaxy instance");if(o.responseJSON&&o.responseJSON.error){l=o.responseJSON.error}else{if(o.responseText.indexOf(m)!==-1){l=m}}o.responseText=l;i.trigger("error",i,o,h,_l(l),{error:l})});return j},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(j,h){var i=this.get(j);if(!h||(i===undefined||i===null)){return false}if(_.isArray(i)){return this._searchArrayAttribute(i,h)}return(i.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)},_searchArrayAttribute:function(i,h){h=h.toLowerCase();return _.any(i,function(j){return(j.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)})},search:function(h){var i=this;return _.filter(this.searchAttributes,function(j){return i.searchAttribute(j,h)})},matches:function(i){var k="=",h=i.split(k);if(h.length>=2){var j=h[0];j=this.searchAliases[j]||j;return this.searchAttribute(j,h[1])}return !!this.search(i).length},matchesAll:function(i){var h=this;i=i.match(/(".*"|\w*=".*"|\S*)/g).filter(function(j){return !!j});return _.all(i,function(j){j=j.replace(/"/g,"");return h.matches(j)})},toString:function(){var h=this.get("id")||"";if(this.get("name")){h=this.get("hid")+' :"'+this.get("name")+'",'+h}return"HDA("+h+")"}});d.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};d.READY_STATES=[d.STATES.NEW,d.STATES.OK,d.STATES.EMPTY,d.STATES.PAUSED,d.STATES.FAILED_METADATA,d.STATES.NOT_VIEWABLE,d.STATES.DISCARDED,d.STATES.ERROR];d.NOT_READY_STATES=[d.STATES.UPLOAD,d.STATES.QUEUED,d.STATES.RUNNING,d.STATES.SETTING_METADATA];var e=Backbone.Collection.extend(LoggableMixin).extend({model:d,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(i,h){h=h||{};this.historyId=h.historyId},ids:function(){return this.map(function(h){return h.id})},notReady:function(){return this.filter(function(h){return !h.inReadyState()})},running:function(){var h=[];this.each(function(i){if(!i.inReadyState()){h.push(i.get("id"))}});return h},getByHid:function(h){return _.first(this.filter(function(i){return i.get("hid")===h}))},getVisible:function(h,k,j){j=j||[];var i=new e(this.filter(function(l){return l.isVisible(h,k)}));_.each(j,function(l){if(!_.isFunction(l)){return}i=new e(i.filter(l))});return i},haveDetails:function(){return this.all(function(h){return h.hasDetails()})},fetchAllDetails:function(i){i=i||{};var h={details:"all"};i.data=(i.data)?(_.extend(i.data,h)):(h);return this.fetch(i)},ajaxQueue:function(k,j){var i=jQuery.Deferred(),h=this.length,m=[];if(!h){i.resolve([]);return i}var l=this.chain().reverse().map(function(o,n){return function(){var p=k.call(o,j);p.done(function(q){i.notify({curr:n,total:h,response:q,model:o})});p.always(function(q){m.push(q);if(l.length){l.shift()()}else{i.resolve(m)}})}}).value();l.shift()();return i},matches:function(h){return this.filter(function(i){return i.matches(h)})},set:function(j,h){var i=this;j=_.map(j,function(l){var m=i.get(l.id);if(!m){return l}var k=m.toJSON();_.extend(k,l);return k});Backbone.Collection.prototype.set.call(this,j,h)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:d,HDACollection:e}});
\ No newline at end of file
diff -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 -r 0a9053d624bb0bf253b51b99f07cb600b3fb3490 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1593,7 +1593,7 @@
.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.history-panel .dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.history-panel .dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto}.history-panel .dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
.history-panel .dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
.history-panel .dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
diff -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 -r 0a9053d624bb0bf253b51b99f07cb600b3fb3490 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -216,6 +216,7 @@
}
.dataset-info {
.info-section;
+ overflow: auto;
.value {
white-space: pre-line;
}
https://bitbucket.org/galaxy/galaxy-central/commits/d282cb8daecb/
Changeset: d282cb8daecb
User: carlfeberhard
Date: 2014-02-06 22:55:28
Summary: merge
Affected #: 5 files
diff -r c2fbf6fc1213eda63f56611635857e58388e2f0e -r d282cb8daecb0748350a6ea69164071854fdaf60 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -1826,7 +1826,7 @@
update_time = hda.update_time.isoformat(),
data_type = hda.ext,
genome_build = hda.dbkey,
- misc_info = hda.info,
+ misc_info = hda.info.strip() if isinstance( hda.info, basestring ) else hda.info,
misc_blurb = hda.blurb )
# add tags string list
diff -r c2fbf6fc1213eda63f56611635857e58388e2f0e -r d282cb8daecb0748350a6ea69164071854fdaf60 static/scripts/mvc/dataset/hda-model.js
--- a/static/scripts/mvc/dataset/hda-model.js
+++ b/static/scripts/mvc/dataset/hda-model.js
@@ -115,13 +115,6 @@
},
// ........................................................................ common queries
- toJSON : function(){
- var json = Backbone.Model.prototype.toJSON.call( this );
- //HACK: this should be done on the server side when setting
- json.misc_info = jQuery.trim( json.misc_info );
- return json;
- },
-
/** Is this hda deleted or purged? */
isDeletedOrPurged : function(){
return ( this.get( 'deleted' ) || this.get( 'purged' ) );
diff -r c2fbf6fc1213eda63f56611635857e58388e2f0e -r d282cb8daecb0748350a6ea69164071854fdaf60 static/scripts/packed/mvc/dataset/hda-model.js
--- a/static/scripts/packed/mvc/dataset/hda-model.js
+++ b/static/scripts/packed/mvc/dataset/hda-model.js
@@ -1,1 +1,1 @@
-define([],function(){var d=Backbone.Model.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var i=this.get("id");if(!i){return{}}var h={purge:galaxy_config.root+"datasets/"+i+"/purge_async",display:galaxy_config.root+"datasets/"+i+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+i+"/edit",download:galaxy_config.root+"datasets/"+i+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+i,rerun:galaxy_config.root+"tool_runner/rerun?id="+i,show_params:galaxy_config.root+"datasets/"+i+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+i,set:galaxy_config.root+"dataset/annotate_async?id="+i},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+i+"&metadata_name="};return h},initialize:function(h){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",d.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(i,h){this.log(this+" has changed state:",i,h);if(this.inReadyState()){this.trigger("state:ready",i,h,this.previous("state"))}})},toJSON:function(){var h=Backbone.Model.prototype.toJSON.call(this);h.misc_info=jQuery.trim(h.misc_info);return h},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(i,j){var h=true;if((!i)&&(this.get("deleted")||this.get("purged"))){h=false}if((!j)&&(!this.get("visible"))){h=false}return h},hidden:function(){return !this.get("visible")},inReadyState:function(){var h=_.contains(d.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||h)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function c(h){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},h)},undelete:function a(h){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},h)},hide:function b(h){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},h)},unhide:function g(h){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},h)},purge:function f(h){if(this.get("purged")){return jQuery.when()}h=h||{};h.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var i=this,j=jQuery.ajax(h);j.done(function(m,k,l){i.set({deleted:true,purged:true})});j.fail(function(o,k,n){var l=_l("Unable to purge dataset");var m=("Removal of datasets by users is not allowed in this Galaxy instance");if(o.responseJSON&&o.responseJSON.error){l=o.responseJSON.error}else{if(o.responseText.indexOf(m)!==-1){l=m}}o.responseText=l;i.trigger("error",i,o,h,_l(l),{error:l})});return j},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(j,h){var i=this.get(j);if(!h||(i===undefined||i===null)){return false}if(_.isArray(i)){return this._searchArrayAttribute(i,h)}return(i.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)},_searchArrayAttribute:function(i,h){h=h.toLowerCase();return _.any(i,function(j){return(j.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)})},search:function(h){var i=this;return _.filter(this.searchAttributes,function(j){return i.searchAttribute(j,h)})},matches:function(i){var k="=",h=i.split(k);if(h.length>=2){var j=h[0];j=this.searchAliases[j]||j;return this.searchAttribute(j,h[1])}return !!this.search(i).length},matchesAll:function(i){var h=this;i=i.match(/(".*"|\w*=".*"|\S*)/g).filter(function(j){return !!j});return _.all(i,function(j){j=j.replace(/"/g,"");return h.matches(j)})},toString:function(){var h=this.get("id")||"";if(this.get("name")){h=this.get("hid")+' :"'+this.get("name")+'",'+h}return"HDA("+h+")"}});d.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};d.READY_STATES=[d.STATES.NEW,d.STATES.OK,d.STATES.EMPTY,d.STATES.PAUSED,d.STATES.FAILED_METADATA,d.STATES.NOT_VIEWABLE,d.STATES.DISCARDED,d.STATES.ERROR];d.NOT_READY_STATES=[d.STATES.UPLOAD,d.STATES.QUEUED,d.STATES.RUNNING,d.STATES.SETTING_METADATA];var e=Backbone.Collection.extend(LoggableMixin).extend({model:d,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(i,h){h=h||{};this.historyId=h.historyId},ids:function(){return this.map(function(h){return h.id})},notReady:function(){return this.filter(function(h){return !h.inReadyState()})},running:function(){var h=[];this.each(function(i){if(!i.inReadyState()){h.push(i.get("id"))}});return h},getByHid:function(h){return _.first(this.filter(function(i){return i.get("hid")===h}))},getVisible:function(h,k,j){j=j||[];var i=new e(this.filter(function(l){return l.isVisible(h,k)}));_.each(j,function(l){if(!_.isFunction(l)){return}i=new e(i.filter(l))});return i},haveDetails:function(){return this.all(function(h){return h.hasDetails()})},fetchAllDetails:function(i){i=i||{};var h={details:"all"};i.data=(i.data)?(_.extend(i.data,h)):(h);return this.fetch(i)},ajaxQueue:function(k,j){var i=jQuery.Deferred(),h=this.length,m=[];if(!h){i.resolve([]);return i}var l=this.chain().reverse().map(function(o,n){return function(){var p=k.call(o,j);p.done(function(q){i.notify({curr:n,total:h,response:q,model:o})});p.always(function(q){m.push(q);if(l.length){l.shift()()}else{i.resolve(m)}})}}).value();l.shift()();return i},matches:function(h){return this.filter(function(i){return i.matches(h)})},set:function(j,h){var i=this;j=_.map(j,function(l){var m=i.get(l.id);if(!m){return l}var k=m.toJSON();_.extend(k,l);return k});Backbone.Collection.prototype.set.call(this,j,h)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:d,HDACollection:e}});
\ No newline at end of file
+define([],function(){var d=Backbone.Model.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var i=this.get("id");if(!i){return{}}var h={purge:galaxy_config.root+"datasets/"+i+"/purge_async",display:galaxy_config.root+"datasets/"+i+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+i+"/edit",download:galaxy_config.root+"datasets/"+i+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+i,rerun:galaxy_config.root+"tool_runner/rerun?id="+i,show_params:galaxy_config.root+"datasets/"+i+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+i,set:galaxy_config.root+"dataset/annotate_async?id="+i},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+i+"&metadata_name="};return h},initialize:function(h){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",d.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(i,h){this.log(this+" has changed state:",i,h);if(this.inReadyState()){this.trigger("state:ready",i,h,this.previous("state"))}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(i,j){var h=true;if((!i)&&(this.get("deleted")||this.get("purged"))){h=false}if((!j)&&(!this.get("visible"))){h=false}return h},hidden:function(){return !this.get("visible")},inReadyState:function(){var h=_.contains(d.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||h)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function c(h){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},h)},undelete:function a(h){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},h)},hide:function b(h){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},h)},unhide:function g(h){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},h)},purge:function f(h){if(this.get("purged")){return jQuery.when()}h=h||{};h.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var i=this,j=jQuery.ajax(h);j.done(function(m,k,l){i.set({deleted:true,purged:true})});j.fail(function(o,k,n){var l=_l("Unable to purge dataset");var m=("Removal of datasets by users is not allowed in this Galaxy instance");if(o.responseJSON&&o.responseJSON.error){l=o.responseJSON.error}else{if(o.responseText.indexOf(m)!==-1){l=m}}o.responseText=l;i.trigger("error",i,o,h,_l(l),{error:l})});return j},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(j,h){var i=this.get(j);if(!h||(i===undefined||i===null)){return false}if(_.isArray(i)){return this._searchArrayAttribute(i,h)}return(i.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)},_searchArrayAttribute:function(i,h){h=h.toLowerCase();return _.any(i,function(j){return(j.toString().toLowerCase().indexOf(h.toLowerCase())!==-1)})},search:function(h){var i=this;return _.filter(this.searchAttributes,function(j){return i.searchAttribute(j,h)})},matches:function(i){var k="=",h=i.split(k);if(h.length>=2){var j=h[0];j=this.searchAliases[j]||j;return this.searchAttribute(j,h[1])}return !!this.search(i).length},matchesAll:function(i){var h=this;i=i.match(/(".*"|\w*=".*"|\S*)/g).filter(function(j){return !!j});return _.all(i,function(j){j=j.replace(/"/g,"");return h.matches(j)})},toString:function(){var h=this.get("id")||"";if(this.get("name")){h=this.get("hid")+' :"'+this.get("name")+'",'+h}return"HDA("+h+")"}});d.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};d.READY_STATES=[d.STATES.NEW,d.STATES.OK,d.STATES.EMPTY,d.STATES.PAUSED,d.STATES.FAILED_METADATA,d.STATES.NOT_VIEWABLE,d.STATES.DISCARDED,d.STATES.ERROR];d.NOT_READY_STATES=[d.STATES.UPLOAD,d.STATES.QUEUED,d.STATES.RUNNING,d.STATES.SETTING_METADATA];var e=Backbone.Collection.extend(LoggableMixin).extend({model:d,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(i,h){h=h||{};this.historyId=h.historyId},ids:function(){return this.map(function(h){return h.id})},notReady:function(){return this.filter(function(h){return !h.inReadyState()})},running:function(){var h=[];this.each(function(i){if(!i.inReadyState()){h.push(i.get("id"))}});return h},getByHid:function(h){return _.first(this.filter(function(i){return i.get("hid")===h}))},getVisible:function(h,k,j){j=j||[];var i=new e(this.filter(function(l){return l.isVisible(h,k)}));_.each(j,function(l){if(!_.isFunction(l)){return}i=new e(i.filter(l))});return i},haveDetails:function(){return this.all(function(h){return h.hasDetails()})},fetchAllDetails:function(i){i=i||{};var h={details:"all"};i.data=(i.data)?(_.extend(i.data,h)):(h);return this.fetch(i)},ajaxQueue:function(k,j){var i=jQuery.Deferred(),h=this.length,m=[];if(!h){i.resolve([]);return i}var l=this.chain().reverse().map(function(o,n){return function(){var p=k.call(o,j);p.done(function(q){i.notify({curr:n,total:h,response:q,model:o})});p.always(function(q){m.push(q);if(l.length){l.shift()()}else{i.resolve(m)}})}}).value();l.shift()();return i},matches:function(h){return this.filter(function(i){return i.matches(h)})},set:function(j,h){var i=this;j=_.map(j,function(l){var m=i.get(l.id);if(!m){return l}var k=m.toJSON();_.extend(k,l);return k});Backbone.Collection.prototype.set.call(this,j,h)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:d,HDACollection:e}});
\ No newline at end of file
diff -r c2fbf6fc1213eda63f56611635857e58388e2f0e -r d282cb8daecb0748350a6ea69164071854fdaf60 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1594,7 +1594,7 @@
.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.history-panel .dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.history-panel .dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto}.history-panel .dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
.history-panel .dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
.history-panel .dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
diff -r c2fbf6fc1213eda63f56611635857e58388e2f0e -r d282cb8daecb0748350a6ea69164071854fdaf60 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -216,6 +216,7 @@
}
.dataset-info {
.info-section;
+ overflow: auto;
.value {
white-space: pre-line;
}
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
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2b1b1b0ac9f8/
Changeset: 2b1b1b0ac9f8
User: jmchilton
Date: 2014-02-05 22:20:31
Summary: Create replacement dict creation in worfklow controllers once.
Both recalculated this per step, brings the actual run code closer together - which will make subsequent changeset diff cleaner.
Affected #: 2 files
diff -r 99beec4c3a338249ab661a7edc3e30ee115486e9 -r 2b1b1b0ac9f8a2f6a452bb41807baac9d3c827ca lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -267,6 +267,9 @@
outputs = util.odict.odict()
rval['history'] = trans.security.encode_id(history.id)
rval['outputs'] = []
+
+ replacement_dict = payload.get('replacement_params', {})
+
for step in workflow.steps:
job = None
if step.type == 'tool' or step.type is None:
@@ -281,11 +284,9 @@
job, out_data = tool.execute( trans, step.state.inputs, history=history)
outputs[ step.id ] = out_data
- # Do post-job actions.
- replacement_params = payload.get('replacement_params', {})
for pja in step.post_job_actions:
if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict=replacement_params)
+ ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict=replacement_dict)
else:
job.add_post_job_action(pja)
diff -r 99beec4c3a338249ab661a7edc3e30ee115486e9 -r 2b1b1b0ac9f8a2f6a452bb41807baac9d3c827ca lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -1373,6 +1373,13 @@
workflow_invocation = model.WorkflowInvocation()
workflow_invocation.workflow = workflow
outputs = odict()
+
+ # Build replacement dict for this workflow execution.
+ replacement_dict = {}
+ for k, v in kwargs.iteritems():
+ if k.startswith('wf_parm|'):
+ replacement_dict[k[8:]] = v
+
for i, step in enumerate( workflow.steps ):
# Execute module
job = None
@@ -1401,10 +1408,6 @@
# Create new PJA associations with the created job, to be run on completion.
# PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
# Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
- replacement_dict = {}
- for k, v in kwargs.iteritems():
- if k.startswith('wf_parm|'):
- replacement_dict[k[8:]] = v
for pja in step.post_job_actions:
if pja.action_type in ActionBox.immediate_actions:
ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
https://bitbucket.org/galaxy/galaxy-central/commits/b8f7b6c1daf3/
Changeset: b8f7b6c1daf3
User: jmchilton
Date: 2014-02-05 22:20:31
Summary: Refactor out common code for running workflows.
This probably results in some bug fixes for the API workflow running - such as running tools with multiple=true data input parameters.
Affected #: 3 files
diff -r 2b1b1b0ac9f8a2f6a452bb41807baac9d3c827ca -r b8f7b6c1daf3834b71dfc1fb73b3d8004b924211 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -9,11 +9,10 @@
from galaxy import exceptions
from galaxy import util
from galaxy import web
-from galaxy.tools.parameters import visit_input_values, DataToolParameter
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.workflow.modules import module_factory
-from galaxy.jobs.actions.post import ActionBox
+from galaxy.workflow.run import invoke
log = logging.getLogger(__name__)
@@ -237,6 +236,14 @@
rval = {}
for step in workflow.steps:
step_errors = None
+ input_connections_by_name = {}
+ for conn in step.input_connections:
+ input_name = conn.input_name
+ if not input_name in input_connections_by_name:
+ input_connections_by_name[input_name] = []
+ input_connections_by_name[input_name].append(conn)
+ step.input_connections_by_name = input_connections_by_name
+
if step.type == 'tool' or step.type is None:
step.module = module_factory.from_workflow_step( trans, step )
# Check for missing parameters
@@ -259,50 +266,30 @@
return "Workflow cannot be run because an expected input step '%s' has no input dataset." % step.id
step.module = module_factory.from_workflow_step( trans, step )
step.state = step.module.get_runtime_state()
- step.input_connections_by_name = dict( ( conn.input_name, conn ) for conn in step.input_connections )
# Run each step, connecting outputs to inputs
- workflow_invocation = self.app.model.WorkflowInvocation()
- workflow_invocation.workflow = workflow
outputs = util.odict.odict()
rval['history'] = trans.security.encode_id(history.id)
rval['outputs'] = []
replacement_dict = payload.get('replacement_params', {})
+ outputs = invoke(
+ trans=trans,
+ workflow=workflow,
+ target_history=history,
+ replacement_dict=replacement_dict,
+ ds_map=ds_map,
+ )
+ trans.sa_session.flush()
+
+ # Build legacy output - should probably include more information from
+ # outputs.
for step in workflow.steps:
- job = None
if step.type == 'tool' or step.type is None:
- tool = self.app.toolbox.get_tool( step.tool_id )
+ for v in outputs[ step.id ].itervalues():
+ rval[ 'outputs' ].append( trans.security.encode_id( v.id ) )
- def callback( input, value, prefixed_name, prefixed_label ):
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- return outputs[ conn.output_step.id ][ conn.output_name ]
- visit_input_values( tool.inputs, step.state.inputs, callback )
- job, out_data = tool.execute( trans, step.state.inputs, history=history)
- outputs[ step.id ] = out_data
-
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict=replacement_dict)
- else:
- job.add_post_job_action(pja)
-
- for v in out_data.itervalues():
- rval['outputs'].append(trans.security.encode_id(v.id))
- else:
- #This is an input step. Use the dataset inputs from ds_map.
- job, out_data = step.module.execute( trans, step.state)
- outputs[step.id] = out_data
- outputs[step.id]['output'] = ds_map[str(step.id)]['hda']
- workflow_invocation_step = self.app.model.WorkflowInvocationStep()
- workflow_invocation_step.workflow_invocation = workflow_invocation
- workflow_invocation_step.workflow_step = step
- workflow_invocation_step.job = job
- trans.sa_session.add( workflow_invocation )
- trans.sa_session.flush()
return rval
@web.expose_api
diff -r 2b1b1b0ac9f8a2f6a452bb41807baac9d3c827ca -r b8f7b6c1daf3834b71dfc1fb73b3d8004b924211 lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -18,7 +18,6 @@
from galaxy import util
from galaxy import web
from galaxy.datatypes.data import Data
-from galaxy.jobs.actions.post import ActionBox
from galaxy.model.item_attrs import UsesItemRatings
from galaxy.model.mapping import desc
from galaxy.tools.parameters import visit_input_values
@@ -33,6 +32,7 @@
from galaxy.web.framework.helpers import grids, time_ago
from galaxy.web.framework.helpers import to_unicode
from galaxy.workflow.modules import module_factory
+from galaxy.workflow.run import invoke
class StoredWorkflowListGrid( grids.Grid ):
@@ -1369,10 +1369,6 @@
target_history = new_history
else:
target_history = trans.get_history()
- # Run each step, connecting outputs to inputs
- workflow_invocation = model.WorkflowInvocation()
- workflow_invocation.workflow = workflow
- outputs = odict()
# Build replacement dict for this workflow execution.
replacement_dict = {}
@@ -1380,54 +1376,14 @@
if k.startswith('wf_parm|'):
replacement_dict[k[8:]] = v
- for i, step in enumerate( workflow.steps ):
- # Execute module
- job = None
- if step.type == 'tool' or step.type is None:
- tool = trans.app.toolbox.get_tool( step.tool_id )
+ outputs = invoke(
+ trans=trans,
+ workflow=workflow,
+ target_history=target_history,
+ replacement_dict=replacement_dict,
+ copy_inputs_to_history=new_history is not None
+ )
- # Connect up
- def callback( input, value, prefixed_name, prefixed_label ):
- replacement = None
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- if input.multiple:
- replacement = [outputs[ c.output_step.id ][ c.output_name ] for c in conn]
- else:
- replacement = outputs[ conn[0].output_step.id ][ conn[0].output_name ]
- return replacement
- try:
- # Replace DummyDatasets with historydatasetassociations
- visit_input_values( tool.inputs, step.state.inputs, callback )
- except KeyError, k:
- error( "Error due to input mapping of '%s' in '%s'. A common cause of this is conditional outputs that cannot be determined until runtime, please review your workflow." % (tool.name, k.message))
- # Execute it
- job, out_data = tool.execute( trans, step.state.inputs, history=target_history)
- outputs[ step.id ] = out_data
- # Create new PJA associations with the created job, to be run on completion.
- # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
- # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
- else:
- job.add_post_job_action(pja)
- else:
- job, out_data = step.module.execute( trans, step.state )
- outputs[ step.id ] = out_data
- if new_history:
- for input_dataset_hda in out_data.values():
- new_hda = input_dataset_hda.copy( copy_children=True )
- new_history.add_dataset(new_hda)
- outputs[ step.id ]['input_ds_copy'] = new_hda
- # Record invocation
- workflow_invocation_step = model.WorkflowInvocationStep()
- workflow_invocation_step.workflow_invocation = workflow_invocation
- workflow_invocation_step.workflow_step = step
- workflow_invocation_step.job = job
- # All jobs ran successfully, so we can save now
- trans.sa_session.add( workflow_invocation )
invocations.append({'outputs': outputs,
'new_history': new_history})
trans.sa_session.flush()
diff -r 2b1b1b0ac9f8a2f6a452bb41807baac9d3c827ca -r b8f7b6c1daf3834b71dfc1fb73b3d8004b924211 lib/galaxy/workflow/run.py
--- /dev/null
+++ b/lib/galaxy/workflow/run.py
@@ -0,0 +1,108 @@
+from galaxy import model
+from galaxy import exceptions
+
+from galaxy.jobs.actions.post import ActionBox
+
+from galaxy.tools.parameters.basic import DataToolParameter
+from galaxy.tools.parameters import visit_input_values
+from galaxy.util.odict import odict
+
+
+def invoke( trans, workflow, target_history, replacement_dict, copy_inputs_to_history=False, ds_map={} ):
+ """ Run the supplied workflow in the supplied target_history.
+ """
+ return WorkflowInvoker(
+ trans,
+ workflow,
+ target_history,
+ replacement_dict,
+ copy_inputs_to_history=copy_inputs_to_history,
+ ds_map=ds_map,
+ ).invoke()
+
+
+class WorkflowInvoker( object ):
+
+ def __init__( self, trans, workflow, target_history, replacement_dict, copy_inputs_to_history, ds_map ):
+ self.trans = trans
+ self.workflow = workflow
+ self.target_history = target_history
+ self.replacement_dict = replacement_dict
+ self.copy_inputs_to_history = copy_inputs_to_history
+ self.ds_map = ds_map
+
+ self.outputs = odict()
+
+ def invoke( self ):
+ workflow_invocation = model.WorkflowInvocation()
+ workflow_invocation.workflow = self.workflow
+
+ for step in self.workflow.steps:
+ job = None
+ job = self._invoke_step( step )
+ # Record invocation
+ workflow_invocation_step = model.WorkflowInvocationStep()
+ workflow_invocation_step.workflow_invocation = workflow_invocation
+ workflow_invocation_step.workflow_step = step
+ workflow_invocation_step.job = job
+
+ # All jobs ran successfully, so we can save now
+ self.trans.sa_session.add( workflow_invocation )
+
+ # Not flushing in here, because web controller may create multiple
+ # invokations.
+ return self.outputs
+
+ def _invoke_step( self, step ):
+ trans = self.trans
+ outputs = self.outputs
+ target_history = self.target_history
+ replacement_dict = self.replacement_dict
+
+ if step.type == 'tool' or step.type is None:
+ tool = trans.app.toolbox.get_tool( step.tool_id )
+
+ # Connect up
+ def callback( input, value, prefixed_name, prefixed_label ):
+ replacement = None
+ if isinstance( input, DataToolParameter ):
+ if prefixed_name in step.input_connections_by_name:
+ conn = step.input_connections_by_name[ prefixed_name ]
+ if input.multiple:
+ replacement = [outputs[ c.output_step.id ][ c.output_name ] for c in conn]
+ else:
+ replacement = outputs[ conn[0].output_step.id ][ conn[0].output_name ]
+ return replacement
+ try:
+ # Replace DummyDatasets with historydatasetassociations
+ visit_input_values( tool.inputs, step.state.inputs, callback )
+ except KeyError, k:
+ raise exceptions.MessageException( "Error due to input mapping of '%s' in '%s'. A common cause of this is conditional outputs that cannot be determined until runtime, please review your workflow." % (tool.name, k.message))
+ # Execute it
+ job, out_data = tool.execute( trans, step.state.inputs, history=target_history)
+ outputs[ step.id ] = out_data
+ # Create new PJA associations with the created job, to be run on completion.
+ # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
+ # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
+ for pja in step.post_job_actions:
+ if pja.action_type in ActionBox.immediate_actions:
+ ActionBox.execute( trans.app, trans.sa_session, pja, job, replacement_dict )
+ else:
+ job.add_post_job_action(pja)
+ else:
+ job, out_data = step.module.execute( trans, step.state )
+ outputs[ step.id ] = out_data
+
+ # Web controller may set copy_inputs_to_history, API controller always sets
+ # ds_map.
+ if self.copy_inputs_to_history:
+ for input_dataset_hda in out_data.values():
+ new_hda = input_dataset_hda.copy( copy_children=True )
+ target_history.add_dataset(new_hda)
+ outputs[ step.id ]['input_ds_copy'] = new_hda
+ if self.ds_map:
+ outputs[step.id]['output'] = self.ds_map[ str( step.id ) ][ 'hda' ]
+
+ return job
+
+__all__ = [ invoke ]
https://bitbucket.org/galaxy/galaxy-central/commits/f263f13f1e6c/
Changeset: f263f13f1e6c
User: jmchilton
Date: 2014-02-05 22:20:31
Summary: Refactor 2 paths of workflow step invokation into helper functions.
Affected #: 1 file
diff -r b8f7b6c1daf3834b71dfc1fb73b3d8004b924211 -r f263f13f1e6c52de6f9b2990a9fe60cf1eef714d lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -54,55 +54,66 @@
return self.outputs
def _invoke_step( self, step ):
- trans = self.trans
- outputs = self.outputs
- target_history = self.target_history
- replacement_dict = self.replacement_dict
-
if step.type == 'tool' or step.type is None:
- tool = trans.app.toolbox.get_tool( step.tool_id )
-
- # Connect up
- def callback( input, value, prefixed_name, prefixed_label ):
- replacement = None
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- if input.multiple:
- replacement = [outputs[ c.output_step.id ][ c.output_name ] for c in conn]
- else:
- replacement = outputs[ conn[0].output_step.id ][ conn[0].output_name ]
- return replacement
- try:
- # Replace DummyDatasets with historydatasetassociations
- visit_input_values( tool.inputs, step.state.inputs, callback )
- except KeyError, k:
- raise exceptions.MessageException( "Error due to input mapping of '%s' in '%s'. A common cause of this is conditional outputs that cannot be determined until runtime, please review your workflow." % (tool.name, k.message))
- # Execute it
- job, out_data = tool.execute( trans, step.state.inputs, history=target_history)
- outputs[ step.id ] = out_data
- # Create new PJA associations with the created job, to be run on completion.
- # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
- # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute( trans.app, trans.sa_session, pja, job, replacement_dict )
- else:
- job.add_post_job_action(pja)
+ job = self._execute_tool_step( step )
else:
- job, out_data = step.module.execute( trans, step.state )
- outputs[ step.id ] = out_data
-
- # Web controller may set copy_inputs_to_history, API controller always sets
- # ds_map.
- if self.copy_inputs_to_history:
- for input_dataset_hda in out_data.values():
- new_hda = input_dataset_hda.copy( copy_children=True )
- target_history.add_dataset(new_hda)
- outputs[ step.id ]['input_ds_copy'] = new_hda
- if self.ds_map:
- outputs[step.id]['output'] = self.ds_map[ str( step.id ) ][ 'hda' ]
+ job = self._execute_input_step( step )
return job
+ def _execute_tool_step( self, step ):
+ trans = self.trans
+ outputs = self.outputs
+ replacement_dict = self.replacement_dict
+
+ tool = trans.app.toolbox.get_tool( step.tool_id )
+
+ # Connect up
+ def callback( input, value, prefixed_name, prefixed_label ):
+ replacement = None
+ if isinstance( input, DataToolParameter ):
+ if prefixed_name in step.input_connections_by_name:
+ conn = step.input_connections_by_name[ prefixed_name ]
+ if input.multiple:
+ replacement = [outputs[ c.output_step.id ][ c.output_name ] for c in conn]
+ else:
+ replacement = outputs[ conn[0].output_step.id ][ conn[0].output_name ]
+ return replacement
+ try:
+ # Replace DummyDatasets with historydatasetassociations
+ visit_input_values( tool.inputs, step.state.inputs, callback )
+ except KeyError, k:
+ raise exceptions.MessageException( "Error due to input mapping of '%s' in '%s'. A common cause of this is conditional outputs that cannot be determined until runtime, please review your workflow." % (tool.name, k.message))
+ # Execute it
+ job, out_data = tool.execute( trans, step.state.inputs, history=self.target_history)
+ outputs[ step.id ] = out_data
+ # Create new PJA associations with the created job, to be run on completion.
+ # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
+ # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
+ for pja in step.post_job_actions:
+ if pja.action_type in ActionBox.immediate_actions:
+ ActionBox.execute( trans.app, trans.sa_session, pja, job, replacement_dict )
+ else:
+ job.add_post_job_action(pja)
+
+ return job
+
+ def _execute_input_step( self, step ):
+ trans = self.trans
+ outputs = self.outputs
+
+ job, out_data = step.module.execute( trans, step.state )
+ outputs[ step.id ] = out_data
+
+ # Web controller may set copy_inputs_to_history, API controller always sets
+ # ds_map.
+ if self.copy_inputs_to_history:
+ for input_dataset_hda in out_data.values():
+ new_hda = input_dataset_hda.copy( copy_children=True )
+ self.target_history.add_dataset(new_hda)
+ outputs[ step.id ]['input_ds_copy'] = new_hda
+ if self.ds_map:
+ outputs[step.id]['output'] = self.ds_map[ str( step.id ) ][ 'hda' ]
+ return job
+
__all__ = [ invoke ]
https://bitbucket.org/galaxy/galaxy-central/commits/c2fbf6fc1213/
Changeset: c2fbf6fc1213
User: jmchilton
Date: 2014-02-06 22:00:51
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #320)
Refactor common workflow run functionality out of controllers
Affected #: 3 files
diff -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b -r c2fbf6fc1213eda63f56611635857e58388e2f0e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -9,11 +9,10 @@
from galaxy import exceptions
from galaxy import util
from galaxy import web
-from galaxy.tools.parameters import visit_input_values, DataToolParameter
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.workflow.modules import module_factory
-from galaxy.jobs.actions.post import ActionBox
+from galaxy.workflow.run import invoke
log = logging.getLogger(__name__)
@@ -237,6 +236,14 @@
rval = {}
for step in workflow.steps:
step_errors = None
+ input_connections_by_name = {}
+ for conn in step.input_connections:
+ input_name = conn.input_name
+ if not input_name in input_connections_by_name:
+ input_connections_by_name[input_name] = []
+ input_connections_by_name[input_name].append(conn)
+ step.input_connections_by_name = input_connections_by_name
+
if step.type == 'tool' or step.type is None:
step.module = module_factory.from_workflow_step( trans, step )
# Check for missing parameters
@@ -259,49 +266,30 @@
return "Workflow cannot be run because an expected input step '%s' has no input dataset." % step.id
step.module = module_factory.from_workflow_step( trans, step )
step.state = step.module.get_runtime_state()
- step.input_connections_by_name = dict( ( conn.input_name, conn ) for conn in step.input_connections )
# Run each step, connecting outputs to inputs
- workflow_invocation = self.app.model.WorkflowInvocation()
- workflow_invocation.workflow = workflow
outputs = util.odict.odict()
rval['history'] = trans.security.encode_id(history.id)
rval['outputs'] = []
+
+ replacement_dict = payload.get('replacement_params', {})
+
+ outputs = invoke(
+ trans=trans,
+ workflow=workflow,
+ target_history=history,
+ replacement_dict=replacement_dict,
+ ds_map=ds_map,
+ )
+ trans.sa_session.flush()
+
+ # Build legacy output - should probably include more information from
+ # outputs.
for step in workflow.steps:
- job = None
if step.type == 'tool' or step.type is None:
- tool = self.app.toolbox.get_tool( step.tool_id )
+ for v in outputs[ step.id ].itervalues():
+ rval[ 'outputs' ].append( trans.security.encode_id( v.id ) )
- def callback( input, value, prefixed_name, prefixed_label ):
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- return outputs[ conn.output_step.id ][ conn.output_name ]
- visit_input_values( tool.inputs, step.state.inputs, callback )
- job, out_data = tool.execute( trans, step.state.inputs, history=history)
- outputs[ step.id ] = out_data
-
- # Do post-job actions.
- replacement_params = payload.get('replacement_params', {})
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict=replacement_params)
- else:
- job.add_post_job_action(pja)
-
- for v in out_data.itervalues():
- rval['outputs'].append(trans.security.encode_id(v.id))
- else:
- #This is an input step. Use the dataset inputs from ds_map.
- job, out_data = step.module.execute( trans, step.state)
- outputs[step.id] = out_data
- outputs[step.id]['output'] = ds_map[str(step.id)]['hda']
- workflow_invocation_step = self.app.model.WorkflowInvocationStep()
- workflow_invocation_step.workflow_invocation = workflow_invocation
- workflow_invocation_step.workflow_step = step
- workflow_invocation_step.job = job
- trans.sa_session.add( workflow_invocation )
- trans.sa_session.flush()
return rval
@web.expose_api
diff -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b -r c2fbf6fc1213eda63f56611635857e58388e2f0e lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -18,7 +18,6 @@
from galaxy import util
from galaxy import web
from galaxy.datatypes.data import Data
-from galaxy.jobs.actions.post import ActionBox
from galaxy.model.item_attrs import UsesItemRatings
from galaxy.model.mapping import desc
from galaxy.tools.parameters import visit_input_values
@@ -33,6 +32,7 @@
from galaxy.web.framework.helpers import grids, time_ago
from galaxy.web.framework.helpers import to_unicode
from galaxy.workflow.modules import module_factory
+from galaxy.workflow.run import invoke
class StoredWorkflowListGrid( grids.Grid ):
@@ -1369,62 +1369,21 @@
target_history = new_history
else:
target_history = trans.get_history()
- # Run each step, connecting outputs to inputs
- workflow_invocation = model.WorkflowInvocation()
- workflow_invocation.workflow = workflow
- outputs = odict()
- for i, step in enumerate( workflow.steps ):
- # Execute module
- job = None
- if step.type == 'tool' or step.type is None:
- tool = trans.app.toolbox.get_tool( step.tool_id )
- # Connect up
- def callback( input, value, prefixed_name, prefixed_label ):
- replacement = None
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- if input.multiple:
- replacement = [outputs[ c.output_step.id ][ c.output_name ] for c in conn]
- else:
- replacement = outputs[ conn[0].output_step.id ][ conn[0].output_name ]
- return replacement
- try:
- # Replace DummyDatasets with historydatasetassociations
- visit_input_values( tool.inputs, step.state.inputs, callback )
- except KeyError, k:
- error( "Error due to input mapping of '%s' in '%s'. A common cause of this is conditional outputs that cannot be determined until runtime, please review your workflow." % (tool.name, k.message))
- # Execute it
- job, out_data = tool.execute( trans, step.state.inputs, history=target_history)
- outputs[ step.id ] = out_data
- # Create new PJA associations with the created job, to be run on completion.
- # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
- # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
- replacement_dict = {}
- for k, v in kwargs.iteritems():
- if k.startswith('wf_parm|'):
- replacement_dict[k[8:]] = v
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
- else:
- job.add_post_job_action(pja)
- else:
- job, out_data = step.module.execute( trans, step.state )
- outputs[ step.id ] = out_data
- if new_history:
- for input_dataset_hda in out_data.values():
- new_hda = input_dataset_hda.copy( copy_children=True )
- new_history.add_dataset(new_hda)
- outputs[ step.id ]['input_ds_copy'] = new_hda
- # Record invocation
- workflow_invocation_step = model.WorkflowInvocationStep()
- workflow_invocation_step.workflow_invocation = workflow_invocation
- workflow_invocation_step.workflow_step = step
- workflow_invocation_step.job = job
- # All jobs ran successfully, so we can save now
- trans.sa_session.add( workflow_invocation )
+ # Build replacement dict for this workflow execution.
+ replacement_dict = {}
+ for k, v in kwargs.iteritems():
+ if k.startswith('wf_parm|'):
+ replacement_dict[k[8:]] = v
+
+ outputs = invoke(
+ trans=trans,
+ workflow=workflow,
+ target_history=target_history,
+ replacement_dict=replacement_dict,
+ copy_inputs_to_history=new_history is not None
+ )
+
invocations.append({'outputs': outputs,
'new_history': new_history})
trans.sa_session.flush()
diff -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b -r c2fbf6fc1213eda63f56611635857e58388e2f0e lib/galaxy/workflow/run.py
--- /dev/null
+++ b/lib/galaxy/workflow/run.py
@@ -0,0 +1,119 @@
+from galaxy import model
+from galaxy import exceptions
+
+from galaxy.jobs.actions.post import ActionBox
+
+from galaxy.tools.parameters.basic import DataToolParameter
+from galaxy.tools.parameters import visit_input_values
+from galaxy.util.odict import odict
+
+
+def invoke( trans, workflow, target_history, replacement_dict, copy_inputs_to_history=False, ds_map={} ):
+ """ Run the supplied workflow in the supplied target_history.
+ """
+ return WorkflowInvoker(
+ trans,
+ workflow,
+ target_history,
+ replacement_dict,
+ copy_inputs_to_history=copy_inputs_to_history,
+ ds_map=ds_map,
+ ).invoke()
+
+
+class WorkflowInvoker( object ):
+
+ def __init__( self, trans, workflow, target_history, replacement_dict, copy_inputs_to_history, ds_map ):
+ self.trans = trans
+ self.workflow = workflow
+ self.target_history = target_history
+ self.replacement_dict = replacement_dict
+ self.copy_inputs_to_history = copy_inputs_to_history
+ self.ds_map = ds_map
+
+ self.outputs = odict()
+
+ def invoke( self ):
+ workflow_invocation = model.WorkflowInvocation()
+ workflow_invocation.workflow = self.workflow
+
+ for step in self.workflow.steps:
+ job = None
+ job = self._invoke_step( step )
+ # Record invocation
+ workflow_invocation_step = model.WorkflowInvocationStep()
+ workflow_invocation_step.workflow_invocation = workflow_invocation
+ workflow_invocation_step.workflow_step = step
+ workflow_invocation_step.job = job
+
+ # All jobs ran successfully, so we can save now
+ self.trans.sa_session.add( workflow_invocation )
+
+ # Not flushing in here, because web controller may create multiple
+ # invokations.
+ return self.outputs
+
+ def _invoke_step( self, step ):
+ if step.type == 'tool' or step.type is None:
+ job = self._execute_tool_step( step )
+ else:
+ job = self._execute_input_step( step )
+
+ return job
+
+ def _execute_tool_step( self, step ):
+ trans = self.trans
+ outputs = self.outputs
+ replacement_dict = self.replacement_dict
+
+ tool = trans.app.toolbox.get_tool( step.tool_id )
+
+ # Connect up
+ def callback( input, value, prefixed_name, prefixed_label ):
+ replacement = None
+ if isinstance( input, DataToolParameter ):
+ if prefixed_name in step.input_connections_by_name:
+ conn = step.input_connections_by_name[ prefixed_name ]
+ if input.multiple:
+ replacement = [outputs[ c.output_step.id ][ c.output_name ] for c in conn]
+ else:
+ replacement = outputs[ conn[0].output_step.id ][ conn[0].output_name ]
+ return replacement
+ try:
+ # Replace DummyDatasets with historydatasetassociations
+ visit_input_values( tool.inputs, step.state.inputs, callback )
+ except KeyError, k:
+ raise exceptions.MessageException( "Error due to input mapping of '%s' in '%s'. A common cause of this is conditional outputs that cannot be determined until runtime, please review your workflow." % (tool.name, k.message))
+ # Execute it
+ job, out_data = tool.execute( trans, step.state.inputs, history=self.target_history)
+ outputs[ step.id ] = out_data
+ # Create new PJA associations with the created job, to be run on completion.
+ # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
+ # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
+ for pja in step.post_job_actions:
+ if pja.action_type in ActionBox.immediate_actions:
+ ActionBox.execute( trans.app, trans.sa_session, pja, job, replacement_dict )
+ else:
+ job.add_post_job_action(pja)
+
+ return job
+
+ def _execute_input_step( self, step ):
+ trans = self.trans
+ outputs = self.outputs
+
+ job, out_data = step.module.execute( trans, step.state )
+ outputs[ step.id ] = out_data
+
+ # Web controller may set copy_inputs_to_history, API controller always sets
+ # ds_map.
+ if self.copy_inputs_to_history:
+ for input_dataset_hda in out_data.values():
+ new_hda = input_dataset_hda.copy( copy_children=True )
+ self.target_history.add_dataset(new_hda)
+ outputs[ step.id ]['input_ds_copy'] = new_hda
+ if self.ds_map:
+ outputs[step.id]['output'] = self.ds_map[ str( step.id ) ][ 'hda' ]
+ return job
+
+__all__ = [ invoke ]
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: jeremy goecks: (1) Update Backbone Config objects and (2) add config options to Circster.
by commits-noreply@bitbucket.org 06 Feb '14
by commits-noreply@bitbucket.org 06 Feb '14
06 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b2206f4ca10f/
Changeset: b2206f4ca10f
User: jeremy goecks
Date: 2014-02-06 21:41:05
Summary: (1) Update Backbone Config objects and (2) add config options to Circster.
Affected #: 4 files
diff -r c6eac0859bf917c176ec5995bff92a25841a9420 -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b static/scripts/packed/utils/config.js
--- a/static/scripts/packed/utils/config.js
+++ b/static/scripts/packed/utils/config.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/trackster/util"],function(b,e){var c=Backbone.Model.extend({initialize:function(f){var g=this.get("key");this.set("id",g);var h=b.find(c.known_settings_defaults,function(i){return i.key===g});if(h){this.set(b.extend({},h,f))}if(this.get("type")==="color"&&!this.get("value")){this.set("value",e.get_random_color())}this.on("change:value",this.cast_value,this)},cast_value:function(){var f=this.get("type"),g=this.get("value");if(f==="float"){g=parseFloat(g)}else{if(f==="int"){g=parseInt(g,10)}}this.set("value")}},{known_settings_defaults:[{key:"name",label:"Name",type:"text",default_value:""},{key:"color",label:"Color",type:"color",default_value:null},{key:"min_value",label:"Min Value",type:"float",default_value:null},{key:"max_value",label:"Max Value",type:"float",default_value:null},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:32,hidden:true},{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"block_color",label:"Block color",type:"color",default_value:null},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"reverse_strand_color",label:"Antisense strand color",type:"color",default_value:null},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true}]});var d=Backbone.Collection.extend({model:c,to_key_value_dict:function(){var f={};this.each(function(g){f[g.get("key")]=g.get("value")});return f},get_value:function(f){var g=this.get(f);if(g){return g.get("value")}return undefined}},{from_config_dict:function(g){var f=b.map(b.keys(g),function(h){return{key:h,value:g[h]}});return new d(f)}});var a=Backbone.View.extend({className:"config-settings-view",render:function(){var i=this.model;var f=this.$el;var h;function g(n,j){for(var r=0;r<n.length;r++){h=n[r];if(h.hidden){continue}var l="param_"+r;var v=i.values[h.key];var x=$("<div class='form-row' />").appendTo(j);x.append($("<label />").attr("for",l).text(h.label+":"));if(type==="bool"){x.append($('<input type="checkbox" />').attr("id",l).attr("name",l).attr("checked",v))}else{if(type==="text"){x.append($('<input type="text"/>').attr("id",l).val(v).click(function(){$(this).select()}))}else{if(type==="select"){var t=$("<select />").attr("id",l);for(var p=0;p<h.options.length;p++){$("<option/>").text(h.options[p].label).attr("value",h.options[p].value).appendTo(t)}t.val(v);x.append(t)}else{if(type==="color"){var w=$("<div/>").appendTo(x),s=$("<input />").attr("id",l).attr("name",l).val(v).css("float","left").appendTo(w).click(function(z){$(".tooltip").removeClass("in");var y=$(this).siblings(".tooltip").addClass("in");y.css({left:$(this).position().left+$(this).width()+5,top:$(this).position().top-($(y).height()/2)+($(this).height()/2)}).show();y.click(function(A){A.stopPropagation()});$(document).bind("click.color-picker",function(){y.hide();$(document).unbind("click.color-picker")});z.stopPropagation()}),q=$("<a href='javascript:void(0)'/>").addClass("icon-button arrow-circle").appendTo(w).attr("title","Set new random color").tooltip(),u=$("<div class='tooltip right' style='position: absolute;' />").appendTo(w).hide(),m=$("<div class='tooltip-inner' style='text-align: inherit'></div>").appendTo(u),k=$("<div class='tooltip-arrow'></div>").appendTo(u),o=$.farbtastic(m,{width:100,height:100,callback:s,color:v});w.append($("<div/>").css("clear","both"));(function(y){q.click(function(){y.setColor(e.get_random_color())})})(o)}else{x.append($("<input />").attr("id",l).attr("name",l).val(v))}}}}if(h.help){x.append($("<div class='help'/>").text(h.help))}}}g(this.params,f);return this},render_in_modal:function(){var h=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},f=function(){this.update_from_form();hide_modal();$(window).unbind("keypress.check_enter_esc")},g=function(i){if((i.keyCode||i.which)===27){h()}else{if((i.keyCode||i.which)===13){f()}}};$(window).bind("keypress.check_enter_esc",g);if(this.$el.children().length===0){this.render()}Galaxy.modal.show({title:"Configure",body:drawable.config.build_form(),buttons:{Cancel:h,OK:f}})},update_from_form:function(){var f=this;this.collection.each(function(h,g){if(!h.get("hidden")){var j="param_"+g;var i=f.$el.find("#"+j).val();if(type==="bool"){i=container.find("#"+j).is(":checked")}h.set("value",i)}})}});return{ConfigSettingCollection:d,ConfigSettingCollectionView:a}});
\ No newline at end of file
+define(["libs/underscore","viz/trackster/util","utils/config"],function(c,f,b){var d=Backbone.Model.extend({initialize:function(g){var h=this.get("key");this.set("id",h);var i=c.find(d.known_settings_defaults,function(j){return j.key===h});if(i){this.set(c.extend({},i,g))}if(this.get("type")==="color"&&!this.get("value")){this.set("value",f.get_random_color())}},set_value:function(h){var g=this.get("type");if(g==="float"){h=parseFloat(h)}else{if(g==="int"){h=parseInt(h,10)}}this.set("value",h)}},{known_settings_defaults:[{key:"name",label:"Name",type:"text",default_value:""},{key:"color",label:"Color",type:"color",default_value:null},{key:"min_value",label:"Min Value",type:"float",default_value:null},{key:"max_value",label:"Max Value",type:"float",default_value:null},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:32,hidden:true},{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"block_color",label:"Block color",type:"color",default_value:null},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"reverse_strand_color",label:"Antisense strand color",type:"color",default_value:null},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true}]});var e=Backbone.Collection.extend({model:d,to_key_value_dict:function(){var g={};this.each(function(h){g[h.get("key")]=h.get("value")});return g},get_value:function(g){var h=this.get(g);if(h){return h.get("value")}return undefined}},{from_config_dict:function(h){var g=c.map(c.keys(h),function(i){return{key:i,value:h[i]}});return new e(g)}});var a=Backbone.View.extend({className:"config-settings-view",render:function(){var g=this.$el;this.collection.each(function(k,p){if(k.get("hidden")){return}var j="param_"+p,q=k.get("type"),u=k.get("value");var w=$("<div class='form-row' />").appendTo(g);w.append($("<label />").attr("for",j).text(k.get("label")+":"));if(q==="bool"){w.append($('<input type="checkbox" />').attr("id",j).attr("name",j).attr("checked",u))}else{if(q==="text"){w.append($('<input type="text"/>').attr("id",j).val(u).click(function(){$(this).select()}))}else{if(q==="select"){var s=$("<select />").attr("id",j);for(var n=0;n<k.options.length;n++){$("<option/>").text(k.options[n].label).attr("value",k.options[n].value).appendTo(s)}s.val(u);w.append(s)}else{if(q==="color"){var v=$("<div/>").appendTo(w),r=$("<input />").attr("id",j).attr("name",j).val(u).css("float","left").appendTo(v).click(function(x){$(".tooltip").removeClass("in");var i=$(this).siblings(".tooltip").addClass("in");i.css({left:$(this).position().left+$(this).width()+5,top:$(this).position().top-($(i).height()/2)+($(this).height()/2)}).show();i.click(function(y){y.stopPropagation()});$(document).bind("click.color-picker",function(){i.hide();$(document).unbind("click.color-picker")});x.stopPropagation()}),o=$("<a href='javascript:void(0)'/>").addClass("icon-button arrow-circle").appendTo(v).attr("title","Set new random color").tooltip(),t=$("<div class='tooltip right' style='position: absolute;' />").appendTo(v).hide(),l=$("<div class='tooltip-inner' style='text-align: inherit'></div>").appendTo(t),h=$("<div class='tooltip-arrow'></div>").appendTo(t),m=$.farbtastic(l,{width:100,height:100,callback:r,color:u});v.append($("<div/>").css("clear","both"));(function(i){o.click(function(){i.setColor(f.get_random_color())})})(m)}else{w.append($("<input />").attr("id",j).attr("name",j).val(u))}}}}if(k.help){w.append($("<div class='help'/>").text(k.help))}});return this},render_in_modal:function(k){var g=this,j=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},h=function(){g.update_from_form();Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},i=function(l){if((l.keyCode||l.which)===27){j()}else{if((l.keyCode||l.which)===13){h()}}};$(window).bind("keypress.check_enter_esc",i);if(this.$el.children().length===0){this.render()}Galaxy.modal.show({title:k||"Configure",body:this.$el,buttons:{Cancel:j,OK:h}})},update_from_form:function(){var g=this;this.collection.each(function(i,h){if(!i.get("hidden")){var k="param_"+h;var j=g.$el.find("#"+k).val();if(i.get("type")==="bool"){j=container.find("#"+k).is(":checked")}i.set_value(j)}})}});return{ConfigSettingCollection:e,ConfigSettingCollectionView:a}});
\ No newline at end of file
diff -r c6eac0859bf917c176ec5995bff92a25841a9420 -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b static/scripts/packed/viz/circster.js
--- a/static/scripts/packed/viz/circster.js
+++ b/static/scripts/packed/viz/circster.js
@@ -1,1 +1,1 @@
-define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("drawables").on("add",this.add_track,this);this.model.get("drawables").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:p.get("vis_id"),title:p.get("title"),dbkey:p.get("dbkey"),type:"trackster",vis_json:JSON.stringify(p)}}).success(function(s){Galaxy.modal.hide();p.set("vis_id",s.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
+define(["utils/utils","libs/underscore","libs/d3","viz/visualization","utils/config"],function(h,i,n,k,c){h.cssLoadFile("static/style/circster.css");var o=Backbone.Model.extend({is_visible:function(s,p){var q=s.getBoundingClientRect(),r=$("svg")[0].getBoundingClientRect();if(q.right<0||q.left>r.right||q.bottom<0||q.top>r.bottom){return false}return true}});var j={drawTicks:function(t,s,x,r,p){var w=t.append("g").selectAll("g").data(s).enter().append("g").selectAll("g").data(x).enter().append("g").attr("class","tick").attr("transform",function(y){return"rotate("+(y.angle*180/Math.PI-90)+")translate("+y.radius+",0)"});var v=[],u=[],q=function(y){return y.angle>Math.PI?"end":null};if(p){v=[0,0,0,-4];u=[4,0,"",".35em"];q=null}else{v=[1,0,4,0];u=[0,4,".35em",""]}w.append("line").attr("x1",v[0]).attr("y1",v[1]).attr("x2",v[2]).attr("y1",v[3]).style("stroke","#000");w.append("text").attr("x",u[0]).attr("y",u[1]).attr("dx",u[2]).attr("dy",u[3]).attr("text-anchor",q).attr("transform",r).text(function(y){return y.label})},formatNum:function(q,p){if(p===undefined){p=2}if(q===null){return null}var s=null;if(q<1){s=q.toPrecision(p)}else{var r=Math.round(q.toPrecision(p));if(q<1000){s=r}else{if(q<1000000){s=Math.round((r/1000).toPrecision(3)).toFixed(0)+"K"}else{if(q<1000000000){s=Math.round((r/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return s}};var d=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(p){this.genome=p.genome;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("drawables").on("add",this.add_track,this);this.model.get("drawables").on("remove",this.remove_track,this);var q=this.model.get("config");q.get("arc_dataset_height").on("change:value",this.update_track_bounds,this)},get_circular_tracks:function(){return this.model.get("drawables").filter(function(p){return p.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(p){return p.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var r=this.get_circular_tracks(),s=this.model.get("config").get_value("arc_dataset_height"),p=Math.min(this.$el.width(),this.$el.height()),u=p/2-r.length*(s+this.track_gap)-(this.label_arc_height+this.track_gap),t=n.range(u,p/2,s+this.track_gap);var q=this;return i.map(t,function(v){return[v,v+s]})},render:function(){var y=this,p=y.$el.width(),x=y.$el.height(),u=this.get_circular_tracks(),s=this.get_chord_tracks(),r=y.model.get("config").get_value("total_gap"),t=this.get_tracks_bounds(),q=n.select(y.$el[0]).append("svg").attr("width",p).attr("height",x).attr("pointer-events","all").append("svg:g").call(n.behavior.zoom().on("zoom",function(){var z=n.event.scale;q.attr("transform","translate("+n.event.translate+") scale("+z+")");if(y.scale!==z){if(y.zoom_drag_timeout){clearTimeout(y.zoom_drag_timeout)}y.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+p/2+","+x/2+")").append("svg:g").attr("class","tracks");this.circular_views=u.map(function(A,B){var z=new e({el:q.append("g")[0],track:A,radius_bounds:t[B],genome:y.genome,total_gap:r});z.render();return z});this.chords_views=s.map(function(A){var z=new l({el:q.append("g")[0],track:A,radius_bounds:t[0],genome:y.genome,total_gap:r});z.render();return z});var w=this.circular_views[this.circular_views.length-1].radius_bounds[1],v=[w,w+this.label_arc_height];this.label_track_view=new b({el:q.append("g")[0],track:new d(),radius_bounds:v,genome:y.genome,total_gap:r});this.label_track_view.render()},add_track:function(w){var q=this.model.get("config").get_value("total_gap");if(w.get("track_type")==="DiagonalHeatmapTrack"){var s=this.circular_views[0].radius_bounds,v=new l({el:n.select("g.tracks").append("g")[0],track:w,radius_bounds:s,genome:this.genome,total_gap:q});v.render();this.chords_views.push(v)}else{var u=this.get_tracks_bounds();i.each(this.circular_views,function(x,y){x.update_radius_bounds(u[y])});i.each(this.chords_views,function(x){x.update_radius_bounds(u[0])});var t=this.circular_views.length,p=new e({el:n.select("g.tracks").append("g")[0],track:w,radius_bounds:u[t],genome:this.genome,total_gap:q});p.render();this.circular_views.push(p);var r=u[u.length-1];r[1]=r[0];this.label_track_view.update_radius_bounds(r)}},remove_track:function(q,s,r){var p=this.circular_views[r.index];this.circular_views.splice(r.index,1);p.$el.remove();var t=this.get_tracks_bounds();i.each(this.circular_views,function(u,v){u.update_radius_bounds(t[v])})},update_track_bounds:function(){var p=this.get_tracks_bounds();i.each(this.circular_views,function(q,r){q.update_radius_bounds(p[r])})}});var m=Backbone.View.extend({tagName:"g",initialize:function(p){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=p.total_gap;this.track=p.track;this.radius_bounds=p.radius_bounds;this.genome=p.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=n.select(this.$el[0])},get_fill_color:function(){var p=this.track.get("config").get_value("block_color");if(!p){p=this.track.get("config").get_value("color")}return p},render:function(){var t=this.parent_elt;if(!t){console.log("no parent elt")}var s=this.chroms_layout,v=n.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),p=t.selectAll("g").data(s).enter().append("svg:g"),r=p.append("path").attr("d",v).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);r.append("title").text(function(x){return x.data.chrom});var q=this,u=q.track.get("data_manager"),w=(u?u.data_is_ready():true);$.when(w).then(function(){$.when(q._render_data(t)).then(function(){r.style("fill",q.bg_fill);q.render_labels()})})},render_labels:function(){},update_radius_bounds:function(q){this.radius_bounds=q;var p=n.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",p);this._transition_chrom_data();this._transition_labels()},update_scale:function(s){var r=this.scale;this.scale=s;if(s<=r){return}var q=this,p=new o();this.parent_elt.selectAll("path.chrom-data").filter(function(u,t){return p.is_visible(this)}).each(function(z,v){var y=n.select(this),u=y.attr("chrom"),x=q.genome.get_chrom_region(u),w=q.track.get("data_manager"),t;if(!w.can_get_more_detailed_data(x)){return}t=q.track.get("data_manager").get_more_detailed_data(x,"Coverage",0,s);$.when(t).then(function(C){y.remove();q._update_data_bounds();var B=i.find(q.chroms_layout,function(D){return D.data.chrom===u});var A=q.get_fill_color();q._render_chrom_data(q.parent_elt,B,C).style("stroke",A).style("fill",A)})});return q},_transition_chrom_data:function(){var q=this.track,s=this.chroms_layout,p=this.parent_elt.selectAll("g>path.chrom-data"),t=p[0].length;if(t>0){var r=this;$.when(q.get("data_manager").get_genome_wide_data(this.genome)).then(function(v){var u=i.reject(i.map(v,function(w,x){var y=null,z=r._get_path_function(s[x],w);if(z){y=z(w.data)}return y}),function(w){return w===null});p.each(function(x,w){n.select(this).transition().duration(1000).attr("d",u[w])})})}},_transition_labels:function(){},_update_data_bounds:function(){var p=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<p[0]||this.data_bounds[1]>p[1]){this._transition_chrom_data()}},_render_data:function(s){var r=this,q=this.chroms_layout,p=this.track,t=$.Deferred();$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(v){r.data_bounds=r.get_data_bounds(v);layout_and_data=i.zip(q,v),chroms_data_layout=i.map(layout_and_data,function(w){var x=w[0],y=w[1];return r._render_chrom_data(s,x,y)});var u=r.get_fill_color();r.parent_elt.selectAll("path.chrom-data").style("stroke",u).style("fill",u);t.resolve(s)});return t},_render_chrom_data:function(p,q,r){},_get_path_function:function(q,p){},_chroms_layout:function(){var q=this.genome.get_chroms_info(),s=n.layout.pie().value(function(u){return u.len}).sort(null),t=s(q),p=2*Math.PI*this.total_gap/q.length,r=i.map(t,function(w,v){var u=w.endAngle-p;w.endAngle=(u>w.startAngle?u:w.startAngle);return w});return r}});var b=m.extend({initialize:function(p){m.prototype.initialize.call(this,p);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(r){var q=this,p=r.selectAll("g");p.selectAll("path").attr("id",function(v){return"label-"+v.data.chrom});p.append("svg:text").filter(function(v){return v.endAngle-v.startAngle>q.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(v){return"#label-"+v.data.chrom}).attr("startOffset","25%").text(function(v){return v.data.chrom});var s=function(x){var v=(x.endAngle-x.startAngle)/x.value,w=n.range(0,x.value,25000000).map(function(y,z){return{radius:q.innerRadius,angle:y*v+x.startAngle,label:z===0?0:(z%3?null:q.formatNum(y))}});if(w.length<4){w[w.length-1].label=q.formatNum(Math.round((w[w.length-1].angle-x.startAngle)/v))}return w};var u=function(v){return v.angle>Math.PI?"rotate(180)translate(-16)":null};var t=i.filter(this.chroms_layout,function(v){return v.endAngle-v.startAngle>q.min_arc_len});this.drawTicks(this.parent_elt,t,s,u)}});i.extend(b.prototype,j);var g=m.extend({_quantile:function(q,p){q.sort(n.ascending);return n.quantile(q,p)},_render_chrom_data:function(p,s,q){var t=this._get_path_function(s,q);if(!t){return null}var r=p.datum(q.data),u=r.append("path").attr("class","chrom-data").attr("chrom",s.data.chrom).attr("d",t);return u},_get_path_function:function(s,r){if(typeof r==="string"||!r.data||r.data.length===0){return null}var p=n.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var t=n.scale.linear().domain([0,r.data.length]).range([s.startAngle,s.endAngle]);var q=n.svg.line.radial().interpolate("linear").radius(function(u){return p(u[1])}).angle(function(v,u){return t(u)});return n.svg.area.radial().interpolate(q.interpolate()).innerRadius(p(0)).outerRadius(q.radius()).angle(q.angle())},render_labels:function(){var p=this,q=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),q,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var q=this,s=i.filter(this.chroms_layout,function(t){return t.endAngle-t.startAngle>0.08}),r=i.filter(s,function(u,t){return t%3===0}),p=i.flatten(i.map(r,function(t){return q._data_bounds_ticks_fn()(t)}));this.parent_elt.selectAll("g.tick").data(p).transition().attr("transform",function(t){return"rotate("+(t.angle*180/Math.PI-90)+")translate("+t.radius+",0)"})},_data_bounds_ticks_fn:function(){var p=this;visibleChroms=0;return function(q){return[{radius:p.radius_bounds[0],angle:q.startAngle,label:p.formatNum(p.data_bounds[0])},{radius:p.radius_bounds[1],angle:q.startAngle,label:p.formatNum(p.data_bounds[1])}]}},get_data_bounds:function(p){}});i.extend(g.prototype,j);var e=g.extend({get_data_bounds:function(q){var p=i.flatten(i.map(q,function(r){if(r){return i.map(r.data,function(s){return parseInt(s[1],10)||0})}else{return 0}}));return[i.min(p),this._quantile(p,0.98)||i.max(p)]}});var l=m.extend({render:function(){var p=this;$.when(p.track.get("data_manager").data_is_ready()).then(function(){$.when(p.track.get("data_manager").get_genome_wide_data(p.genome)).then(function(s){var r=[],q=p.genome.get_chroms_info();i.each(s,function(w,v){var t=q[v].chrom;var u=i.map(w.data,function(y){var x=p._get_region_angle(t,y[1]),z=p._get_region_angle(y[3],y[4]);return{source:{startAngle:x,endAngle:x+0.01},target:{startAngle:z,endAngle:z+0.01}}});r=r.concat(u)});p.parent_elt.append("g").attr("class","chord").selectAll("path").data(r).enter().append("path").style("fill",p.get_fill_color()).attr("d",n.svg.chord().radius(p.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(p){this.radius_bounds=p;this.parent_elt.selectAll("path").transition().attr("d",n.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(r,p){var q=i.find(this.chroms_layout,function(s){return s.data.chrom===r});return q.endAngle-((q.endAngle-q.startAngle)*(q.data.len-p)/q.data.len)}});var f=Backbone.View.extend({initialize:function(){var p=new k.Genome(galaxy_config.app.genome),q=new k.GenomeVisualization(galaxy_config.app.viz_config);q.get("config").add([{key:"arc_dataset_height",label:"Arc Dataset Height",type:"int",value:25,view:"circster"},{key:"total_gap",label:"Gap [0-1]",type:"float",value:0.4,view:"circster",hidden:true}]);var s=new a({el:$("#center .unified-panel-body"),genome:p,model:q});s.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var r=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){k.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",q.get("dbkey"),function(t){q.add_tracks(t)})}},{icon_class:"gear",title:"Settings",on_click:function(){var t=new c.ConfigSettingCollectionView({collection:q.get("config")});t.render_in_modal("Configure Visualization")}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:q.get("vis_id"),title:q.get("title"),dbkey:q.get("dbkey"),type:"trackster",vis_json:JSON.stringify(q)}}).success(function(t){Galaxy.modal.hide();q.set("vis_id",t.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});r.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(r.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:f}});
\ No newline at end of file
diff -r c6eac0859bf917c176ec5995bff92a25841a9420 -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b static/scripts/utils/config.js
--- a/static/scripts/utils/config.js
+++ b/static/scripts/utils/config.js
@@ -1,9 +1,10 @@
-define(['libs/underscore', 'viz/trackster/util'], function(_, util_mod) {
+define(['libs/underscore', 'viz/trackster/util', 'utils/config'], function(_, util_mod, config_mod) {
/**
* A configuration setting. Currently key is used as id.
*/
var ConfigSetting = Backbone.Model.extend({
+
initialize: function(options) {
// Use key as id for now.
var key = this.get('key');
@@ -19,26 +20,24 @@
if (this.get('type') === 'color' && !this.get('value')) {
this.set('value', util_mod.get_random_color());
}
-
- // When value updated, cast is appropriately.
- this.on('change:value', this.cast_value, this);
},
/**
- * Cast value from string to appropriate type.
+ * Cast and set value. This should be instead of
+ * setting.set('value', new_value)
*/
- cast_value: function() {
- var type = this.get('type'),
- value = this.get('value');
+ set_value: function(value) {
+ var type = this.get('type');
if (type === 'float') {
- value = parseFloat( value );
- } else if (type === 'int') {
- value = parseInt( value, 10 );
+ value = parseFloat(value);
+ }
+ else if (type === 'int') {
+ value = parseInt(value, 10);
}
// TODO: handle casting from string to bool?
- this.set('value');
+ this.set('value', value);
}
}, {
// This is a master list of default settings for known settings.
@@ -92,7 +91,8 @@
return undefined;
}
-}, {
+},
+{
/**
* Utility function that creates a ConfigSettingsCollection from a standard dictionary
* with configuration key-value pairs.
@@ -120,101 +120,99 @@
* Renders form for editing configuration settings.
*/
render: function() {
- var track_config = this.model;
var container = this.$el;
- var param;
+
+ this.collection.each(function(param, index) {
+ // Hidden params have no representation in the form
+ if (param.get('hidden')) { return; }
- // Function to process parameters recursively
- function handle_params( params, container ) {
- for ( var index = 0; index < params.length; index++ ) {
- param = params[index];
- // Hidden params have no representation in the form
- if ( param.hidden ) { continue; }
- // Build row for param
- var id = 'param_' + index;
- var value = track_config.values[ param.key ];
- var row = $("<div class='form-row' />").appendTo( container );
- row.append( $('<label />').attr("for", id ).text( param.label + ":" ) );
- // Draw parameter as checkbox
- if ( type === 'bool' ) {
- row.append( $('<input type="checkbox" />').attr("id", id ).attr("name", id ).attr( 'checked', value ) );
- // Draw parameter as textbox
- } else if ( type === 'text' ) {
- row.append( $('<input type="text"/>').attr("id", id ).val(value).click( function() { $(this).select(); }));
- // Draw paramter as select area
- } else if ( type === 'select' ) {
- var select = $('<select />').attr("id", id);
- for ( var i = 0; i < param.options.length; i++ ) {
- $("<option/>").text( param.options[i].label ).attr( "value", param.options[i].value ).appendTo( select );
- }
- select.val( value );
- row.append( select );
- // Draw parameter as color picker
- } else if ( type === 'color' ) {
- var
- container_div = $("<div/>").appendTo(row),
- input = $('<input />').attr("id", id ).attr("name", id ).val( value ).css("float", "left")
- .appendTo(container_div).click(function(e) {
- // Hide other pickers.
- $(".tooltip").removeClass( "in" );
+ // Build row for param.
+ var id = 'param_' + index,
+ type = param.get('type'),
+ value = param.get('value');
+ var row = $("<div class='form-row' />").appendTo(container);
+ row.append($('<label />').attr("for", id ).text(param.get('label') + ":" ));
+ // Draw parameter as checkbox
+ if ( type === 'bool' ) {
+ row.append( $('<input type="checkbox" />').attr("id", id ).attr("name", id ).attr( 'checked', value ) );
+ }
+ // Draw parameter as textbox
+ else if ( type === 'text' ) {
+ row.append( $('<input type="text"/>').attr("id", id ).val(value).click( function() { $(this).select(); }));
+ }
+ // Draw parameter as select area
+ else if ( type === 'select' ) {
+ var select = $('<select />').attr("id", id);
+ for ( var i = 0; i < param.options.length; i++ ) {
+ $("<option/>").text( param.options[i].label ).attr( "value", param.options[i].value ).appendTo( select );
+ }
+ select.val( value );
+ row.append( select );
+
+ }
+ // Draw parameter as color picker
+ else if ( type === 'color' ) {
+ var
+ container_div = $("<div/>").appendTo(row),
+ input = $('<input />').attr("id", id ).attr("name", id ).val( value ).css("float", "left")
+ .appendTo(container_div).click(function(e) {
+ // Hide other pickers.
+ $(".tooltip").removeClass( "in" );
+
+ // Show input's color picker.
+ var tip = $(this).siblings(".tooltip").addClass( "in" );
+ tip.css( {
+ // left: $(this).position().left + ( $(input).width() / 2 ) - 60,
+ // top: $(this).position().top + $(this.height)
+ left: $(this).position().left + $(this).width() + 5,
+ top: $(this).position().top - ( $(tip).height() / 2 ) + ( $(this).height() / 2 )
+ } ).show();
- // Show input's color picker.
- var tip = $(this).siblings(".tooltip").addClass( "in" );
- tip.css( {
- // left: $(this).position().left + ( $(input).width() / 2 ) - 60,
- // top: $(this).position().top + $(this.height)
- left: $(this).position().left + $(this).width() + 5,
- top: $(this).position().top - ( $(tip).height() / 2 ) + ( $(this).height() / 2 )
- } ).show();
-
- // Click management:
-
- // Keep showing tip if clicking in tip.
- tip.click(function(e) {
- e.stopPropagation();
- });
-
- // Hide tip if clicking outside of tip.
- $(document).bind( "click.color-picker", function() {
- tip.hide();
- $(document).unbind( "click.color-picker" );
- });
-
- // No propagation to avoid triggering document click (and tip hiding) above.
+ // Click management:
+
+ // Keep showing tip if clicking in tip.
+ tip.click(function(e) {
e.stopPropagation();
- }),
- // Icon for setting a new random color; behavior set below.
- new_color_icon = $("<a href='javascript:void(0)'/>").addClass("icon-button arrow-circle").appendTo(container_div)
- .attr("title", "Set new random color").tooltip(),
- // Color picker in tool tip style.
- tip = $( "<div class='tooltip right' style='position: absolute;' />" ).appendTo(container_div).hide(),
- // Inner div for padding purposes
- tip_inner = $("<div class='tooltip-inner' style='text-align: inherit'></div>").appendTo(tip),
- tip_arrow = $("<div class='tooltip-arrow'></div>").appendTo(tip),
- farb_obj = $.farbtastic(tip_inner, { width: 100, height: 100, callback: input, color: value });
-
- // Clear floating.
- container_div.append( $("<div/>").css("clear", "both"));
-
- // Use function to fix farb_obj value.
- (function(fixed_farb_obj) {
- new_color_icon.click(function() {
- fixed_farb_obj.setColor(util_mod.get_random_color());
- });
- })(farb_obj);
-
- }
- else {
- row.append( $('<input />').attr("id", id ).attr("name", id ).val( value ) );
- }
- // Help text
- if ( param.help ) {
- row.append( $("<div class='help'/>").text( param.help ) );
- }
+ });
+
+ // Hide tip if clicking outside of tip.
+ $(document).bind( "click.color-picker", function() {
+ tip.hide();
+ $(document).unbind( "click.color-picker" );
+ });
+
+ // No propagation to avoid triggering document click (and tip hiding) above.
+ e.stopPropagation();
+ }),
+ // Icon for setting a new random color; behavior set below.
+ new_color_icon = $("<a href='javascript:void(0)'/>").addClass("icon-button arrow-circle").appendTo(container_div)
+ .attr("title", "Set new random color").tooltip(),
+ // Color picker in tool tip style.
+ tip = $( "<div class='tooltip right' style='position: absolute;' />" ).appendTo(container_div).hide(),
+ // Inner div for padding purposes
+ tip_inner = $("<div class='tooltip-inner' style='text-align: inherit'></div>").appendTo(tip),
+ tip_arrow = $("<div class='tooltip-arrow'></div>").appendTo(tip),
+ farb_obj = $.farbtastic(tip_inner, { width: 100, height: 100, callback: input, color: value });
+
+ // Clear floating.
+ container_div.append( $("<div/>").css("clear", "both"));
+
+ // Use function to fix farb_obj value.
+ (function(fixed_farb_obj) {
+ new_color_icon.click(function() {
+ fixed_farb_obj.setColor(util_mod.get_random_color());
+ });
+ })(farb_obj);
+
+ }
+ else {
+ row.append( $('<input />').attr("id", id ).attr("name", id ).val( value ) );
}
- }
- // Handle top level parameters in order
- handle_params( this.params, container );
+ // Help text
+ if ( param.help ) {
+ row.append( $("<div class='help'/>").text( param.help ) );
+ }
+ });
return this;
},
@@ -222,13 +220,14 @@
/**
* Render view in modal.
*/
- render_in_modal: function() {
+ render_in_modal: function(title) {
// Set up handlers for cancel, ok button and for handling esc key.
- var cancel_fn = function() { hide_modal(); $(window).unbind("keypress.check_enter_esc"); },
+ var self = this,
+ cancel_fn = function() { Galaxy.modal.hide(); $(window).unbind("keypress.check_enter_esc"); },
ok_fn = function() {
- this.update_from_form();
- hide_modal();
- $(window).unbind("keypress.check_enter_esc");
+ self.update_from_form();
+ Galaxy.modal.hide();
+ $(window).unbind("keypress.check_enter_esc");
},
check_enter_esc = function(e) {
if ((e.keyCode || e.which) === 27) { // Escape key
@@ -246,8 +245,8 @@
this.render();
}
Galaxy.modal.show({
- title: "Configure",
- body: drawable.config.build_form(),
+ title: title || "Configure",
+ body: this.$el,
buttons: {
"Cancel": cancel_fn,
"OK": ok_fn
@@ -265,10 +264,10 @@
// Set value from view.
var id = 'param_' + index;
var value = self.$el.find( '#' + id ).val();
- if ( type === 'bool' ) {
+ if ( setting.get('type') === 'bool' ) {
value = container.find( '#' + id ).is( ':checked' );
}
- setting.set('value', value);
+ setting.set_value(value);
}
});
}
diff -r c6eac0859bf917c176ec5995bff92a25841a9420 -r b2206f4ca10f8cec7c37f43f80fc24f0b93b420b static/scripts/viz/circster.js
--- a/static/scripts/viz/circster.js
+++ b/static/scripts/viz/circster.js
@@ -1,4 +1,4 @@
-define(["utils/utils", "libs/underscore", "libs/d3", "viz/visualization"], function(utils, _, d3, visualization) {
+define(["utils/utils", "libs/underscore", "libs/d3", "viz/visualization", "utils/config"], function(utils, _, d3, visualization, config) {
// Load needed CSS.
utils.cssLoadFile("static/style/circster.css");
@@ -133,9 +133,7 @@
className: 'circster',
initialize: function(options) {
- this.total_gap = options.total_gap;
this.genome = options.genome;
- this.dataset_arc_height = options.dataset_arc_height;
this.track_gap = 10;
this.label_arc_height = 50;
this.scale = 1;
@@ -145,7 +143,10 @@
// When tracks added to/removed from model, update view.
this.model.get('drawables').on('add', this.add_track, this);
this.model.get('drawables').on('remove', this.remove_track, this);
- this.get_circular_tracks();
+
+ // When config settings change, update view.
+ var vis_config = this.model.get('config');
+ vis_config.get('arc_dataset_height').on('change:value', this.update_track_bounds, this);
},
// HACKs: using track_type for circular/chord distinction in the functions below for now.
@@ -172,22 +173,22 @@
* Returns a list of circular tracks' radius bounds.
*/
get_tracks_bounds: function() {
- var circular_tracks = this.get_circular_tracks();
- dataset_arc_height = this.dataset_arc_height,
+ var circular_tracks = this.get_circular_tracks(),
+ dataset_arc_height = this.model.get('config').get_value('arc_dataset_height'),
min_dimension = Math.min(this.$el.width(), this.$el.height()),
// Compute radius start based on model, will be centered
// and fit entirely inside element by default.
radius_start = min_dimension / 2 -
- circular_tracks.length * (this.dataset_arc_height + this.track_gap) -
+ circular_tracks.length * (dataset_arc_height + this.track_gap) -
(this.label_arc_height + this.track_gap),
// Compute range of track starting radii.
- tracks_start_radii = d3.range(radius_start, min_dimension / 2, this.dataset_arc_height + this.track_gap);
+ tracks_start_radii = d3.range(radius_start, min_dimension / 2, dataset_arc_height + this.track_gap);
// Map from track start to bounds.
var self = this;
return _.map(tracks_start_radii, function(radius) {
- return [radius, radius + self.dataset_arc_height];
+ return [radius, radius + dataset_arc_height];
});
},
@@ -196,11 +197,11 @@
*/
render: function() {
var self = this,
- dataset_arc_height = this.dataset_arc_height,
width = self.$el.width(),
height = self.$el.height(),
circular_tracks = this.get_circular_tracks(),
chords_tracks = this.get_chord_tracks(),
+ total_gap = self.model.get('config').get_value('total_gap'),
tracks_bounds = this.get_tracks_bounds(),
// Set up SVG element.
@@ -249,7 +250,7 @@
track: track,
radius_bounds: tracks_bounds[index],
genome: self.genome,
- total_gap: self.total_gap
+ total_gap: total_gap
});
view.render();
@@ -265,7 +266,7 @@
track: track,
radius_bounds: tracks_bounds[0],
genome: self.genome,
- total_gap: self.total_gap
+ total_gap: total_gap
});
view.render();
@@ -288,7 +289,7 @@
track: new CircsterLabelTrack(),
radius_bounds: track_bounds,
genome: self.genome,
- total_gap: self.total_gap
+ total_gap: total_gap
});
this.label_track_view.render();
@@ -298,6 +299,8 @@
* Render a single track on the outside of the current visualization.
*/
add_track: function(new_track) {
+ var total_gap = this.model.get('config').get_value('total_gap');
+
if (new_track.get('track_type') === 'DiagonalHeatmapTrack') {
// Added chords track.
var innermost_radius_bounds = this.circular_views[0].radius_bounds,
@@ -306,7 +309,7 @@
track: new_track,
radius_bounds: innermost_radius_bounds,
genome: this.genome,
- total_gap: this.total_gap
+ total_gap: total_gap
});
new_view.render();
this.chords_views.push(new_view);
@@ -332,7 +335,7 @@
track: new_track,
radius_bounds: new_track_bounds[track_index],
genome: this.genome,
- total_gap: this.total_gap
+ total_gap: total_gap
});
track_view.render();
this.circular_views.push(track_view);
@@ -358,6 +361,14 @@
_.each(this.circular_views, function(track_view, i) {
track_view.update_radius_bounds(new_track_bounds[i]);
});
+ },
+
+ update_track_bounds: function() {
+ // Recompute and update track bounds.
+ var new_track_bounds = this.get_tracks_bounds();
+ _.each(this.circular_views, function(track_view, i) {
+ track_view.update_radius_bounds(new_track_bounds[i]);
+ });
}
});
@@ -630,7 +641,7 @@
var chroms_info = this.genome.get_chroms_info(),
pie_layout = d3.layout.pie().value(function(d) { return d.len; }).sort(null),
init_arcs = pie_layout(chroms_info),
- gap_per_chrom = this.total_gap / chroms_info.length,
+ gap_per_chrom = 2 * Math.PI * this.total_gap / chroms_info.length,
chrom_arcs = _.map(init_arcs, function(arc, index) {
// For short chroms, endAngle === startAngle.
var new_endAngle = arc.endAngle - gap_per_chrom;
@@ -969,22 +980,25 @@
{
initialize: function ()
{
- // configure visualization
+ // -- Configure visualization --
var genome = new visualization.Genome(galaxy_config.app.genome),
- vis = new visualization.GenomeVisualization(galaxy_config.app.viz_config),
- viz_view = new CircsterView(
- {
- // view pane
- el : $('#center .unified-panel-body'),
-
- // gaps are difficult to set because it very dependent on chromosome size and organization.
- total_gap : 2 * Math.PI * 0.4,
- genome : genome,
- model : vis,
- dataset_arc_height : 25
- });
+ vis = new visualization.GenomeVisualization(galaxy_config.app.viz_config);
+
+ // Add Circster-specific config options.
+ vis.get('config').add([
+ { key: 'arc_dataset_height', label: 'Arc Dataset Height', type: 'int', value: 25, view: 'circster' },
+ { key: 'total_gap', label: 'Gap [0-1]', type: 'float', value: 0.4, view: 'circster', hidden: true }
+ ]);
+
+ var viz_view = new CircsterView(
+ {
+ // view pane
+ el : $('#center .unified-panel-body'),
+ genome : genome,
+ model : vis
+ });
- // render vizualization
+ // Render vizualization
viz_view.render();
// setup title
@@ -1002,6 +1016,15 @@
}
},
{
+ icon_class: 'gear', title: 'Settings', on_click: function()
+ {
+ var view = new config.ConfigSettingCollectionView({
+ collection: vis.get('config')
+ });
+ view.render_in_modal('Configure Visualization');
+ }
+ },
+ {
icon_class: 'disk--arrow', title: 'Save', on_click: function()
{
// show saving dialog box
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ca4c4a24bd6a/
Changeset: ca4c4a24bd6a
Branch: next-stable
User: carlfeberhard
Date: 2014-02-06 21:25:25
Summary: Fix css scoping in hda borders broken in 2b8e4f3
Affected #: 2 files
diff -r a66e4111ba2aeca52572d203e1713153a5ee293a -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1573,6 +1573,47 @@
.search-input .search-clear,.search-input .search-loading{position:relative;display:inline-block;float:right;margin-top:-23px;margin-right:4px;font-size:1.4em;line-height:23px;color:grey}
.search-input .search-clear:hover{color:#303030}
#history-refresh-button,#history-options-button{display:inline-block;height:22px;width:22px;text-align:center;line-height:19px;font-size:1.2em;padding:0px}
+.history-panel .dataset{border:1px solid #bfbfbf}.history-panel .dataset .vertical-spacing{margin-bottom:8px}
+.history-panel .dataset .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
+.history-panel .dataset .dataset-padding{padding:6px 10px 6px 8px}
+.history-panel .dataset [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
+.history-panel .dataset .help-text{font-weight:normal;color:#555}
+.history-panel .dataset .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
+.history-panel .dataset .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
+.history-panel .dataset .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
+.history-panel .dataset .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.history-panel .dataset .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.history-panel .dataset .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.history-panel .dataset .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.history-panel .dataset .dataset-primary-actions .icon-btn{margin-left:2px}
+.history-panel .dataset .dataset-body{display:none;padding:6px 10px 6px 8px}.history-panel .dataset .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
+.history-panel .dataset .dataset-body label{margin:0px;padding:0px;font-weight:normal}
+.history-panel .dataset .dataset-body .prompt{font-weight:normal;color:#555}
+.history-panel .dataset .dataset-body .prompt:after{content:':'}
+.history-panel .dataset .dataset-body .dataset-summary{margin-bottom:8px}.history-panel .dataset .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.history-panel .dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.history-panel .dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
+.history-panel .dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
+.history-panel .dataset .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
+.history-panel .dataset .dataset-body .dataset-actions .right{float:right}.history-panel .dataset .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
+.history-panel .dataset .dataset-body .tags-display{display:none;margin-bottom:8px}.history-panel .dataset .dataset-body .tags-display .select2-container{min-width:0px}.history-panel .dataset .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
+.history-panel .dataset .dataset-body .annotation-display{display:none;margin-bottom:8px}.history-panel .dataset .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
+.history-panel .dataset .dataset-body .annotation-display .annotation:empty{height:22px}
+.history-panel .dataset .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
+.history-panel .dataset .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
+.history-panel .dataset .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
+.history-panel .dataset .dataset-body .dataset-peek{margin-bottom:8px}.history-panel .dataset .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.history-panel .dataset .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
+.history-panel .dataset .dataset-body .dataset-peek pre.peek table,.history-panel .dataset .dataset-body .dataset-peek pre.peek th,.history-panel .dataset .dataset-body .dataset-peek pre.peek tr,.history-panel .dataset .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
+.history-panel .dataset .icon-btn-group{display:inline-block}.history-panel .dataset .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.history-panel .dataset .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.history-panel .dataset .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.history-panel .dataset .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
+.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.history-panel [class$="messagesmall"]{margin:0px}
.history-panel .editable-text{border:solid transparent 1px}
.history-panel .editable-text:hover{cursor:pointer;border:1px dotted #999999}
@@ -1604,47 +1645,6 @@
.history-panel .dataset:last-child{border-width:1px 0px 1px 0px}
.history-panel .empty-history-message{display:none;margin:0px 10px 0px 10px}
.history-panel .tag-button{display:inline-block;height:20px;margin:2px 2px 0px 0px;border:1px solid grey;border-radius:3px 10px 10px 3px;padding:2px 4px 2px 4px;background-color:#EEE;line-height:13px}.history-panel .tag-button .tag-name{margin-right:2px}
-.dataset.hda{border:1px solid #bfbfbf}.dataset.hda .vertical-spacing{margin-bottom:8px}
-.dataset.hda .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
-.dataset.hda .dataset-padding{padding:6px 10px 6px 8px}
-.dataset.hda [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
-.dataset.hda .help-text{font-weight:normal;color:#555}
-.dataset.hda .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
-.dataset.hda .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
-.dataset.hda .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
-.dataset.hda .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset.hda .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset.hda .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset.hda .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset.hda .dataset-primary-actions .icon-btn{margin-left:2px}
-.dataset.hda .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset.hda .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
-.dataset.hda .dataset-body label{margin:0px;padding:0px;font-weight:normal}
-.dataset.hda .dataset-body .prompt{font-weight:normal;color:#555}
-.dataset.hda .dataset-body .prompt:after{content:':'}
-.dataset.hda .dataset-body .dataset-summary{margin-bottom:8px}.dataset.hda .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
-.dataset.hda .dataset-body .dataset-summary .dataset-datatype,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
-.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
-.dataset.hda .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.dataset.hda .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset.hda .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
-.dataset.hda .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
-.dataset.hda .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset.hda .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset.hda .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset.hda .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset.hda .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
-.dataset.hda .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
-.dataset.hda .dataset-body .dataset-actions .right{float:right}.dataset.hda .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
-.dataset.hda .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .tags-display .select2-container{min-width:0px}.dataset.hda .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
-.dataset.hda .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
-.dataset.hda .dataset-body .annotation-display .annotation:empty{height:22px}
-.dataset.hda .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
-.dataset.hda .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
-.dataset.hda .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
-.dataset.hda .dataset-body .dataset-peek{margin-bottom:8px}.dataset.hda .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset.hda .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
-.dataset.hda .dataset-body .dataset-peek pre.peek table,.dataset.hda .dataset-body .dataset-peek pre.peek th,.dataset.hda .dataset-body .dataset-peek pre.peek tr,.dataset.hda .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
-.dataset.hda .icon-btn-group{display:inline-block}.dataset.hda .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset.hda .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset.hda .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset.hda .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
-.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.state-icon-running{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.state-icon-running:before{content:"\f110"}
.state-icon-upload{overflow:hidden}.state-icon-upload:before{display:inline-block;-webkit-animation:eclipse 2s infinite linear;-moz-animation:eclipse 2s infinite linear;-o-animation:eclipse 2s infinite linear;animation:eclipse 2s infinite linear;content:"\f062"}@-moz-keyframes eclipse{0%{-moz-transform:translate(0, 16px)} 100%{-moz-transform:translate(0, -16px)}}@-webkit-keyframes eclipse{0%{-webkit-transform:translate(0, 16px)} 100%{-webkit-transform:translate(0, -16px)}}@-o-keyframes eclipse{0%{-o-transform:translate(0, 16px)} 100%{-o-transform:translate(0, -16px)}}@-ms-keyframes eclipse{0%{-ms-transform:translate(0, 16px)} 100%{-ms-transform:translate(0, -16px)}}@keyframes eclipse{0%{transform:translate(0, 16px)} 100%{transform:translate(0, -16px)}}
.dataset.state-ok,.dataset.state-failed_metadata{background:#aff1af}.dataset.state-ok .state-icon,.dataset.state-failed_metadata .state-icon{display:none}
diff -r a66e4111ba2aeca52572d203e1713153a5ee293a -r ca4c4a24bd6a853993fc171394c0d2da75fc8829 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -98,6 +98,275 @@
}
+// ---------------------------------------------------------------------------- datasets
+//TODO: scope to history panels until embedded item .dataset is changed
+.history-panel {
+ .dataset {
+ border: 1px solid @border-default-color;
+
+ // body mixins
+ @vertical-gap: 8px;
+ .vertical-spacing {
+ margin-bottom: @vertical-gap;
+ }
+ .info-section {
+ border-radius: 3px;
+ border: 1px solid fadeout( @layout-border-color, 70% );
+ //background-color: fadeout( white, 60% );
+ padding: 4px;
+ }
+ @spacing-top : 6px;
+ @spacing-right : 10px;
+ @spacing-bottom : 6px;
+ @spacing-left : 8px;
+ .dataset-padding {
+ padding: @spacing-top @spacing-right @spacing-bottom @spacing-left;
+ }
+
+ [class$=messagesmall] {
+ margin: @spacing-top @spacing-right ( @spacing-bottom - 4 ) @spacing-left;
+ font-size: 90%;
+ }
+
+ .help-text {
+ font-weight: normal;
+ // font-style: italic;
+ // font-size: 90%;
+ color: #555;
+ }
+
+ .dataset-selector {
+ float: left;
+ // always initially hidden and zero width
+ display: none;
+ width: 0px;
+ //HACK: neg. on the bottom due to padding-bottom in title-bar - very tweakish
+ margin: 0px 0px -@spacing-bottom 0px;
+ padding: ( @spacing-top - 1 ) 0px 2px @spacing-left;
+ cursor: pointer;
+ //text-align: center;
+ vertical-align: middle;
+ }
+
+ .dataset-title-bar {
+ cursor: pointer;
+ outline: none;
+ .dataset-padding;
+
+ .dataset-state-icon {
+ }
+ .dataset-title {
+ display: inline;
+ font-weight: bold;
+ text-decoration: underline;
+ word-wrap: break-word;
+ word-break: break-all;
+ line-height: 16px;
+ }
+ }
+
+ .dataset-primary-actions {
+ .icon-btn-group();
+ float: right;
+ margin: @spacing-top @spacing-right 0;
+ .icon-btn {
+ margin-left: @icon-btn-margin;
+ }
+ }
+
+ .dataset-body {
+ display: none;
+ // background-color: fadeout( white, 70% );
+ .dataset-padding;
+
+ [class$=messagesmall] {
+ margin: 0px 0px 8px 0px;
+ }
+
+ label {
+ margin: 0px;
+ padding: 0px;
+ font-weight: normal;
+ }
+ .prompt {
+ .help-text;
+ }
+ .prompt:after {
+ content: ':';
+ }
+
+ .dataset-summary {
+ .dataset-blurb {
+ margin-bottom: 2px;
+ }
+ .dataset-datatype, .dataset-dbkey {
+ display: inline;
+ .value {
+ font-weight: bold;
+ }
+ }
+ .dataset-datatype .value:after {
+ content: ',';
+ .help-text;
+ }
+ .dataset-dbkey:after {
+ content: ' ';
+ display: block;
+ .vertical-spacing;
+ }
+ .dataset-info {
+ .info-section;
+ .value {
+ white-space: pre-line;
+ }
+ }
+
+ .job-error-text {
+ .info-section;
+ overflow: auto;
+ white-space: pre;
+ }
+
+ // handle the last vertical gap in the parent as summary is used in other states as well (w/o info)
+ .vertical-spacing;
+ }
+
+ .dataset-actions {
+ .left {
+ .icon-btn-group();
+ float: left;
+ .icon-btn {
+ margin-right: @icon-btn-margin;
+ }
+ //.icon-btn-group {
+ // margin-right: @icon-btn-margin;
+ // .icon-btn {
+ // margin-right: 0;
+ // }
+ //}
+ &:not(:empty) {
+ // can't use :empty on dataset-actions - will always have left & right, so
+ // add gap to left (more likely to have children)
+ .vertical-spacing;
+ }
+ }
+ .right {
+ float: right;
+ .icon-btn {
+ margin-left: @icon-btn-margin;
+ }
+ }
+ }
+
+ //TODO: move these out
+ .tags-display {
+ display: none;
+ .vertical-spacing;
+ .select2-container {
+ min-width: 0px;
+ .select2-choices {
+ border-radius: 3px;
+ }
+ }
+ }
+ .annotation-display {
+ display: none;
+ .vertical-spacing;
+ .annotation {
+ .info-section;
+ white-space: pre-line;
+ }
+ .annotation:empty {
+ height: @icon-btn-size;
+ }
+ // fake placeholder for editable text annotation
+ .annotation:empty:after {
+ position: relative;
+ top: -4px;
+ font-size: 10px;
+ font-style: italic;
+ color: grey;
+ content : 'Click here to edit annotation';
+ }
+ textarea {
+ margin: 0px 0px 2px 0px;
+ display: block;
+ border-radius: 3px;
+ width: 100%;
+ }
+ }
+
+ .dataset-display-applications {
+ .display-application:last-child {
+ .vertical-spacing;
+ }
+ }
+
+ .dataset-peek {
+ .vertical-spacing;
+ pre.peek {
+ width: 100%;
+ margin: 0px;
+ border-radius: 3px;
+ background: white;
+ color: black;
+ font-size: 10px;
+ overflow: auto;
+ th {
+ color: white;
+ background: @panel-primary-heading-bg;
+ }
+ table, th, tr, td {
+ font-family: @font-family-monospace;
+ font-size: 10px;
+ }
+ }
+ }
+ }
+
+ .icon-btn-group {
+ display: inline-block;
+ .icon-btn:not(:last-child) {
+ margin: 0px;
+ border-radius: 0px;
+ border-right: none;
+ }
+ .icon-btn:first-child {
+ margin-right: 0px;
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ }
+ .icon-btn:last-child {
+ margin-left: 0px;
+ border-radius: 0px 3px 3px 0px;
+ }
+ }
+
+ }
+
+ .dataset .state-icon {
+ .fa-icon;
+ display: inline-block;
+ vertical-align: middle;
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ text-align: center;
+ font-size: 16px;
+ }
+}
+
+.state-icon-error {
+ background-color: white;
+ border-radius: 8px;
+ &:before {
+ font-size: 20px;
+ line-height: 16px;
+ color: red;
+ content: @fa-var-times-circle;
+ }
+}
+
// ---------------------------------------------------------------------------- history
.history-panel {
@@ -268,272 +537,6 @@
}
}
-// ---------------------------------------------------------------------------- datasets
-.dataset.hda {
- border: 1px solid @border-default-color;
-
- // body mixins
- @vertical-gap: 8px;
- .vertical-spacing {
- margin-bottom: @vertical-gap;
- }
- .info-section {
- border-radius: 3px;
- border: 1px solid fadeout( @layout-border-color, 70% );
- //background-color: fadeout( white, 60% );
- padding: 4px;
- }
- @spacing-top : 6px;
- @spacing-right : 10px;
- @spacing-bottom : 6px;
- @spacing-left : 8px;
- .dataset-padding {
- padding: @spacing-top @spacing-right @spacing-bottom @spacing-left;
- }
-
- [class$=messagesmall] {
- margin: @spacing-top @spacing-right ( @spacing-bottom - 4 ) @spacing-left;
- font-size: 90%;
- }
-
- .help-text {
- font-weight: normal;
- // font-style: italic;
- // font-size: 90%;
- color: #555;
- }
-
- .dataset-selector {
- float: left;
- // always initially hidden and zero width
- display: none;
- width: 0px;
- //HACK: neg. on the bottom due to padding-bottom in title-bar - very tweakish
- margin: 0px 0px -@spacing-bottom 0px;
- padding: ( @spacing-top - 1 ) 0px 2px @spacing-left;
- cursor: pointer;
- //text-align: center;
- vertical-align: middle;
- }
-
- .dataset-title-bar {
- cursor: pointer;
- outline: none;
- .dataset-padding;
-
- .dataset-state-icon {
- }
- .dataset-title {
- display: inline;
- font-weight: bold;
- text-decoration: underline;
- word-wrap: break-word;
- word-break: break-all;
- line-height: 16px;
- }
- }
-
- .dataset-primary-actions {
- .icon-btn-group();
- float: right;
- margin: @spacing-top @spacing-right 0;
- .icon-btn {
- margin-left: @icon-btn-margin;
- }
- }
-
- .dataset-body {
- display: none;
- // background-color: fadeout( white, 70% );
- .dataset-padding;
-
- [class$=messagesmall] {
- margin: 0px 0px 8px 0px;
- }
-
- label {
- margin: 0px;
- padding: 0px;
- font-weight: normal;
- }
- .prompt {
- .help-text;
- }
- .prompt:after {
- content: ':';
- }
-
- .dataset-summary {
- .dataset-blurb {
- margin-bottom: 2px;
- }
- .dataset-datatype, .dataset-dbkey {
- display: inline;
- .value {
- font-weight: bold;
- }
- }
- .dataset-datatype .value:after {
- content: ',';
- .help-text;
- }
- .dataset-dbkey:after {
- content: ' ';
- display: block;
- .vertical-spacing;
- }
- .dataset-info {
- .info-section;
- .value {
- white-space: pre-line;
- }
- }
-
- .job-error-text {
- .info-section;
- overflow: auto;
- white-space: pre;
- }
-
- // handle the last vertical gap in the parent as summary is used in other states as well (w/o info)
- .vertical-spacing;
- }
-
- .dataset-actions {
- .left {
- .icon-btn-group();
- float: left;
- .icon-btn {
- margin-right: @icon-btn-margin;
- }
- //.icon-btn-group {
- // margin-right: @icon-btn-margin;
- // .icon-btn {
- // margin-right: 0;
- // }
- //}
- &:not(:empty) {
- // can't use :empty on dataset-actions - will always have left & right, so
- // add gap to left (more likely to have children)
- .vertical-spacing;
- }
- }
- .right {
- float: right;
- .icon-btn {
- margin-left: @icon-btn-margin;
- }
- }
- }
-
- //TODO: move these out
- .tags-display {
- display: none;
- .vertical-spacing;
- .select2-container {
- min-width: 0px;
- .select2-choices {
- border-radius: 3px;
- }
- }
- }
- .annotation-display {
- display: none;
- .vertical-spacing;
- .annotation {
- .info-section;
- white-space: pre-line;
- }
- .annotation:empty {
- height: @icon-btn-size;
- }
- // fake placeholder for editable text annotation
- .annotation:empty:after {
- position: relative;
- top: -4px;
- font-size: 10px;
- font-style: italic;
- color: grey;
- content : 'Click here to edit annotation';
- }
- textarea {
- margin: 0px 0px 2px 0px;
- display: block;
- border-radius: 3px;
- width: 100%;
- }
- }
-
- .dataset-display-applications {
- .display-application:last-child {
- .vertical-spacing;
- }
- }
-
- .dataset-peek {
- .vertical-spacing;
- pre.peek {
- width: 100%;
- margin: 0px;
- border-radius: 3px;
- background: white;
- color: black;
- font-size: 10px;
- overflow: auto;
- th {
- color: white;
- background: @panel-primary-heading-bg;
- }
- table, th, tr, td {
- font-family: @font-family-monospace;
- font-size: 10px;
- }
- }
- }
- }
-
- .icon-btn-group {
- display: inline-block;
- .icon-btn:not(:last-child) {
- margin: 0px;
- border-radius: 0px;
- border-right: none;
- }
- .icon-btn:first-child {
- margin-right: 0px;
- border-top-left-radius: 3px;
- border-bottom-left-radius: 3px;
- }
- .icon-btn:last-child {
- margin-left: 0px;
- border-radius: 0px 3px 3px 0px;
- }
- }
-
-}
-
-.dataset.hda .state-icon {
- .fa-icon;
- display: inline-block;
- vertical-align: middle;
- width: 16px;
- height: 16px;
- line-height: 16px;
- text-align: center;
- font-size: 16px;
-}
-
-.state-icon-error {
- background-color: white;
- border-radius: 8px;
- &:before {
- font-size: 20px;
- line-height: 16px;
- color: red;
- content: @fa-var-times-circle;
- }
-}
-
.state-icon-running {
//TODO: couldn't find a way to do this with fa/spinning.less as mixin
-webkit-animation: spin 2s infinite linear;
https://bitbucket.org/galaxy/galaxy-central/commits/c6eac0859bf9/
Changeset: c6eac0859bf9
User: carlfeberhard
Date: 2014-02-06 21:25:58
Summary: merge
Affected #: 2 files
diff -r 3db994bbb5794de782a824b5ea8b2220b99e97ec -r c6eac0859bf917c176ec5995bff92a25841a9420 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1574,6 +1574,47 @@
.search-input .search-clear,.search-input .search-loading{position:relative;display:inline-block;float:right;margin-top:-23px;margin-right:4px;font-size:1.4em;line-height:23px;color:grey}
.search-input .search-clear:hover{color:#303030}
#history-refresh-button,#history-options-button{display:inline-block;height:22px;width:22px;text-align:center;line-height:19px;font-size:1.2em;padding:0px}
+.history-panel .dataset{border:1px solid #bfbfbf}.history-panel .dataset .vertical-spacing{margin-bottom:8px}
+.history-panel .dataset .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
+.history-panel .dataset .dataset-padding{padding:6px 10px 6px 8px}
+.history-panel .dataset [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
+.history-panel .dataset .help-text{font-weight:normal;color:#555}
+.history-panel .dataset .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
+.history-panel .dataset .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
+.history-panel .dataset .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
+.history-panel .dataset .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.history-panel .dataset .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.history-panel .dataset .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.history-panel .dataset .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.history-panel .dataset .dataset-primary-actions .icon-btn{margin-left:2px}
+.history-panel .dataset .dataset-body{display:none;padding:6px 10px 6px 8px}.history-panel .dataset .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
+.history-panel .dataset .dataset-body label{margin:0px;padding:0px;font-weight:normal}
+.history-panel .dataset .dataset-body .prompt{font-weight:normal;color:#555}
+.history-panel .dataset .dataset-body .prompt:after{content:':'}
+.history-panel .dataset .dataset-body .dataset-summary{margin-bottom:8px}.history-panel .dataset .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value,.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
+.history-panel .dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.history-panel .dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.history-panel .dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
+.history-panel .dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.history-panel .dataset .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
+.history-panel .dataset .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
+.history-panel .dataset .dataset-body .dataset-actions .right{float:right}.history-panel .dataset .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
+.history-panel .dataset .dataset-body .tags-display{display:none;margin-bottom:8px}.history-panel .dataset .dataset-body .tags-display .select2-container{min-width:0px}.history-panel .dataset .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
+.history-panel .dataset .dataset-body .annotation-display{display:none;margin-bottom:8px}.history-panel .dataset .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
+.history-panel .dataset .dataset-body .annotation-display .annotation:empty{height:22px}
+.history-panel .dataset .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
+.history-panel .dataset .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
+.history-panel .dataset .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
+.history-panel .dataset .dataset-body .dataset-peek{margin-bottom:8px}.history-panel .dataset .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.history-panel .dataset .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
+.history-panel .dataset .dataset-body .dataset-peek pre.peek table,.history-panel .dataset .dataset-body .dataset-peek pre.peek th,.history-panel .dataset .dataset-body .dataset-peek pre.peek tr,.history-panel .dataset .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
+.history-panel .dataset .icon-btn-group{display:inline-block}.history-panel .dataset .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.history-panel .dataset .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.history-panel .dataset .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.history-panel .dataset .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
+.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.history-panel [class$="messagesmall"]{margin:0px}
.history-panel .editable-text{border:solid transparent 1px}
.history-panel .editable-text:hover{cursor:pointer;border:1px dotted #999999}
@@ -1605,47 +1646,6 @@
.history-panel .dataset:last-child{border-width:1px 0px 1px 0px}
.history-panel .empty-history-message{display:none;margin:0px 10px 0px 10px}
.history-panel .tag-button{display:inline-block;height:20px;margin:2px 2px 0px 0px;border:1px solid grey;border-radius:3px 10px 10px 3px;padding:2px 4px 2px 4px;background-color:#EEE;line-height:13px}.history-panel .tag-button .tag-name{margin-right:2px}
-.dataset.hda{border:1px solid #bfbfbf}.dataset.hda .vertical-spacing{margin-bottom:8px}
-.dataset.hda .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
-.dataset.hda .dataset-padding{padding:6px 10px 6px 8px}
-.dataset.hda [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
-.dataset.hda .help-text{font-weight:normal;color:#555}
-.dataset.hda .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
-.dataset.hda .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
-.dataset.hda .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
-.dataset.hda .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset.hda .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset.hda .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset.hda .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset.hda .dataset-primary-actions .icon-btn{margin-left:2px}
-.dataset.hda .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset.hda .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
-.dataset.hda .dataset-body label{margin:0px;padding:0px;font-weight:normal}
-.dataset.hda .dataset-body .prompt{font-weight:normal;color:#555}
-.dataset.hda .dataset-body .prompt:after{content:':'}
-.dataset.hda .dataset-body .dataset-summary{margin-bottom:8px}.dataset.hda .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
-.dataset.hda .dataset-body .dataset-summary .dataset-datatype,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
-.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
-.dataset.hda .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.dataset.hda .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset.hda .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
-.dataset.hda .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
-.dataset.hda .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset.hda .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset.hda .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset.hda .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset.hda .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
-.dataset.hda .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
-.dataset.hda .dataset-body .dataset-actions .right{float:right}.dataset.hda .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
-.dataset.hda .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .tags-display .select2-container{min-width:0px}.dataset.hda .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
-.dataset.hda .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
-.dataset.hda .dataset-body .annotation-display .annotation:empty{height:22px}
-.dataset.hda .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
-.dataset.hda .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
-.dataset.hda .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
-.dataset.hda .dataset-body .dataset-peek{margin-bottom:8px}.dataset.hda .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset.hda .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
-.dataset.hda .dataset-body .dataset-peek pre.peek table,.dataset.hda .dataset-body .dataset-peek pre.peek th,.dataset.hda .dataset-body .dataset-peek pre.peek tr,.dataset.hda .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
-.dataset.hda .icon-btn-group{display:inline-block}.dataset.hda .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset.hda .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset.hda .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset.hda .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
-.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.state-icon-running{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.state-icon-running:before{content:"\f110"}
.state-icon-upload{overflow:hidden}.state-icon-upload:before{display:inline-block;-webkit-animation:eclipse 2s infinite linear;-moz-animation:eclipse 2s infinite linear;-o-animation:eclipse 2s infinite linear;animation:eclipse 2s infinite linear;content:"\f062"}@-moz-keyframes eclipse{0%{-moz-transform:translate(0, 16px)} 100%{-moz-transform:translate(0, -16px)}}@-webkit-keyframes eclipse{0%{-webkit-transform:translate(0, 16px)} 100%{-webkit-transform:translate(0, -16px)}}@-o-keyframes eclipse{0%{-o-transform:translate(0, 16px)} 100%{-o-transform:translate(0, -16px)}}@-ms-keyframes eclipse{0%{-ms-transform:translate(0, 16px)} 100%{-ms-transform:translate(0, -16px)}}@keyframes eclipse{0%{transform:translate(0, 16px)} 100%{transform:translate(0, -16px)}}
.dataset.state-ok,.dataset.state-failed_metadata{background:#aff1af}.dataset.state-ok .state-icon,.dataset.state-failed_metadata .state-icon{display:none}
diff -r 3db994bbb5794de782a824b5ea8b2220b99e97ec -r c6eac0859bf917c176ec5995bff92a25841a9420 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -98,6 +98,275 @@
}
+// ---------------------------------------------------------------------------- datasets
+//TODO: scope to history panels until embedded item .dataset is changed
+.history-panel {
+ .dataset {
+ border: 1px solid @border-default-color;
+
+ // body mixins
+ @vertical-gap: 8px;
+ .vertical-spacing {
+ margin-bottom: @vertical-gap;
+ }
+ .info-section {
+ border-radius: 3px;
+ border: 1px solid fadeout( @layout-border-color, 70% );
+ //background-color: fadeout( white, 60% );
+ padding: 4px;
+ }
+ @spacing-top : 6px;
+ @spacing-right : 10px;
+ @spacing-bottom : 6px;
+ @spacing-left : 8px;
+ .dataset-padding {
+ padding: @spacing-top @spacing-right @spacing-bottom @spacing-left;
+ }
+
+ [class$=messagesmall] {
+ margin: @spacing-top @spacing-right ( @spacing-bottom - 4 ) @spacing-left;
+ font-size: 90%;
+ }
+
+ .help-text {
+ font-weight: normal;
+ // font-style: italic;
+ // font-size: 90%;
+ color: #555;
+ }
+
+ .dataset-selector {
+ float: left;
+ // always initially hidden and zero width
+ display: none;
+ width: 0px;
+ //HACK: neg. on the bottom due to padding-bottom in title-bar - very tweakish
+ margin: 0px 0px -@spacing-bottom 0px;
+ padding: ( @spacing-top - 1 ) 0px 2px @spacing-left;
+ cursor: pointer;
+ //text-align: center;
+ vertical-align: middle;
+ }
+
+ .dataset-title-bar {
+ cursor: pointer;
+ outline: none;
+ .dataset-padding;
+
+ .dataset-state-icon {
+ }
+ .dataset-title {
+ display: inline;
+ font-weight: bold;
+ text-decoration: underline;
+ word-wrap: break-word;
+ word-break: break-all;
+ line-height: 16px;
+ }
+ }
+
+ .dataset-primary-actions {
+ .icon-btn-group();
+ float: right;
+ margin: @spacing-top @spacing-right 0;
+ .icon-btn {
+ margin-left: @icon-btn-margin;
+ }
+ }
+
+ .dataset-body {
+ display: none;
+ // background-color: fadeout( white, 70% );
+ .dataset-padding;
+
+ [class$=messagesmall] {
+ margin: 0px 0px 8px 0px;
+ }
+
+ label {
+ margin: 0px;
+ padding: 0px;
+ font-weight: normal;
+ }
+ .prompt {
+ .help-text;
+ }
+ .prompt:after {
+ content: ':';
+ }
+
+ .dataset-summary {
+ .dataset-blurb {
+ margin-bottom: 2px;
+ }
+ .dataset-datatype, .dataset-dbkey {
+ display: inline;
+ .value {
+ font-weight: bold;
+ }
+ }
+ .dataset-datatype .value:after {
+ content: ',';
+ .help-text;
+ }
+ .dataset-dbkey:after {
+ content: ' ';
+ display: block;
+ .vertical-spacing;
+ }
+ .dataset-info {
+ .info-section;
+ .value {
+ white-space: pre-line;
+ }
+ }
+
+ .job-error-text {
+ .info-section;
+ overflow: auto;
+ white-space: pre;
+ }
+
+ // handle the last vertical gap in the parent as summary is used in other states as well (w/o info)
+ .vertical-spacing;
+ }
+
+ .dataset-actions {
+ .left {
+ .icon-btn-group();
+ float: left;
+ .icon-btn {
+ margin-right: @icon-btn-margin;
+ }
+ //.icon-btn-group {
+ // margin-right: @icon-btn-margin;
+ // .icon-btn {
+ // margin-right: 0;
+ // }
+ //}
+ &:not(:empty) {
+ // can't use :empty on dataset-actions - will always have left & right, so
+ // add gap to left (more likely to have children)
+ .vertical-spacing;
+ }
+ }
+ .right {
+ float: right;
+ .icon-btn {
+ margin-left: @icon-btn-margin;
+ }
+ }
+ }
+
+ //TODO: move these out
+ .tags-display {
+ display: none;
+ .vertical-spacing;
+ .select2-container {
+ min-width: 0px;
+ .select2-choices {
+ border-radius: 3px;
+ }
+ }
+ }
+ .annotation-display {
+ display: none;
+ .vertical-spacing;
+ .annotation {
+ .info-section;
+ white-space: pre-line;
+ }
+ .annotation:empty {
+ height: @icon-btn-size;
+ }
+ // fake placeholder for editable text annotation
+ .annotation:empty:after {
+ position: relative;
+ top: -4px;
+ font-size: 10px;
+ font-style: italic;
+ color: grey;
+ content : 'Click here to edit annotation';
+ }
+ textarea {
+ margin: 0px 0px 2px 0px;
+ display: block;
+ border-radius: 3px;
+ width: 100%;
+ }
+ }
+
+ .dataset-display-applications {
+ .display-application:last-child {
+ .vertical-spacing;
+ }
+ }
+
+ .dataset-peek {
+ .vertical-spacing;
+ pre.peek {
+ width: 100%;
+ margin: 0px;
+ border-radius: 3px;
+ background: white;
+ color: black;
+ font-size: 10px;
+ overflow: auto;
+ th {
+ color: white;
+ background: @panel-primary-heading-bg;
+ }
+ table, th, tr, td {
+ font-family: @font-family-monospace;
+ font-size: 10px;
+ }
+ }
+ }
+ }
+
+ .icon-btn-group {
+ display: inline-block;
+ .icon-btn:not(:last-child) {
+ margin: 0px;
+ border-radius: 0px;
+ border-right: none;
+ }
+ .icon-btn:first-child {
+ margin-right: 0px;
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ }
+ .icon-btn:last-child {
+ margin-left: 0px;
+ border-radius: 0px 3px 3px 0px;
+ }
+ }
+
+ }
+
+ .dataset .state-icon {
+ .fa-icon;
+ display: inline-block;
+ vertical-align: middle;
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ text-align: center;
+ font-size: 16px;
+ }
+}
+
+.state-icon-error {
+ background-color: white;
+ border-radius: 8px;
+ &:before {
+ font-size: 20px;
+ line-height: 16px;
+ color: red;
+ content: @fa-var-times-circle;
+ }
+}
+
// ---------------------------------------------------------------------------- history
.history-panel {
@@ -268,272 +537,6 @@
}
}
-// ---------------------------------------------------------------------------- datasets
-.dataset.hda {
- border: 1px solid @border-default-color;
-
- // body mixins
- @vertical-gap: 8px;
- .vertical-spacing {
- margin-bottom: @vertical-gap;
- }
- .info-section {
- border-radius: 3px;
- border: 1px solid fadeout( @layout-border-color, 70% );
- //background-color: fadeout( white, 60% );
- padding: 4px;
- }
- @spacing-top : 6px;
- @spacing-right : 10px;
- @spacing-bottom : 6px;
- @spacing-left : 8px;
- .dataset-padding {
- padding: @spacing-top @spacing-right @spacing-bottom @spacing-left;
- }
-
- [class$=messagesmall] {
- margin: @spacing-top @spacing-right ( @spacing-bottom - 4 ) @spacing-left;
- font-size: 90%;
- }
-
- .help-text {
- font-weight: normal;
- // font-style: italic;
- // font-size: 90%;
- color: #555;
- }
-
- .dataset-selector {
- float: left;
- // always initially hidden and zero width
- display: none;
- width: 0px;
- //HACK: neg. on the bottom due to padding-bottom in title-bar - very tweakish
- margin: 0px 0px -@spacing-bottom 0px;
- padding: ( @spacing-top - 1 ) 0px 2px @spacing-left;
- cursor: pointer;
- //text-align: center;
- vertical-align: middle;
- }
-
- .dataset-title-bar {
- cursor: pointer;
- outline: none;
- .dataset-padding;
-
- .dataset-state-icon {
- }
- .dataset-title {
- display: inline;
- font-weight: bold;
- text-decoration: underline;
- word-wrap: break-word;
- word-break: break-all;
- line-height: 16px;
- }
- }
-
- .dataset-primary-actions {
- .icon-btn-group();
- float: right;
- margin: @spacing-top @spacing-right 0;
- .icon-btn {
- margin-left: @icon-btn-margin;
- }
- }
-
- .dataset-body {
- display: none;
- // background-color: fadeout( white, 70% );
- .dataset-padding;
-
- [class$=messagesmall] {
- margin: 0px 0px 8px 0px;
- }
-
- label {
- margin: 0px;
- padding: 0px;
- font-weight: normal;
- }
- .prompt {
- .help-text;
- }
- .prompt:after {
- content: ':';
- }
-
- .dataset-summary {
- .dataset-blurb {
- margin-bottom: 2px;
- }
- .dataset-datatype, .dataset-dbkey {
- display: inline;
- .value {
- font-weight: bold;
- }
- }
- .dataset-datatype .value:after {
- content: ',';
- .help-text;
- }
- .dataset-dbkey:after {
- content: ' ';
- display: block;
- .vertical-spacing;
- }
- .dataset-info {
- .info-section;
- .value {
- white-space: pre-line;
- }
- }
-
- .job-error-text {
- .info-section;
- overflow: auto;
- white-space: pre;
- }
-
- // handle the last vertical gap in the parent as summary is used in other states as well (w/o info)
- .vertical-spacing;
- }
-
- .dataset-actions {
- .left {
- .icon-btn-group();
- float: left;
- .icon-btn {
- margin-right: @icon-btn-margin;
- }
- //.icon-btn-group {
- // margin-right: @icon-btn-margin;
- // .icon-btn {
- // margin-right: 0;
- // }
- //}
- &:not(:empty) {
- // can't use :empty on dataset-actions - will always have left & right, so
- // add gap to left (more likely to have children)
- .vertical-spacing;
- }
- }
- .right {
- float: right;
- .icon-btn {
- margin-left: @icon-btn-margin;
- }
- }
- }
-
- //TODO: move these out
- .tags-display {
- display: none;
- .vertical-spacing;
- .select2-container {
- min-width: 0px;
- .select2-choices {
- border-radius: 3px;
- }
- }
- }
- .annotation-display {
- display: none;
- .vertical-spacing;
- .annotation {
- .info-section;
- white-space: pre-line;
- }
- .annotation:empty {
- height: @icon-btn-size;
- }
- // fake placeholder for editable text annotation
- .annotation:empty:after {
- position: relative;
- top: -4px;
- font-size: 10px;
- font-style: italic;
- color: grey;
- content : 'Click here to edit annotation';
- }
- textarea {
- margin: 0px 0px 2px 0px;
- display: block;
- border-radius: 3px;
- width: 100%;
- }
- }
-
- .dataset-display-applications {
- .display-application:last-child {
- .vertical-spacing;
- }
- }
-
- .dataset-peek {
- .vertical-spacing;
- pre.peek {
- width: 100%;
- margin: 0px;
- border-radius: 3px;
- background: white;
- color: black;
- font-size: 10px;
- overflow: auto;
- th {
- color: white;
- background: @panel-primary-heading-bg;
- }
- table, th, tr, td {
- font-family: @font-family-monospace;
- font-size: 10px;
- }
- }
- }
- }
-
- .icon-btn-group {
- display: inline-block;
- .icon-btn:not(:last-child) {
- margin: 0px;
- border-radius: 0px;
- border-right: none;
- }
- .icon-btn:first-child {
- margin-right: 0px;
- border-top-left-radius: 3px;
- border-bottom-left-radius: 3px;
- }
- .icon-btn:last-child {
- margin-left: 0px;
- border-radius: 0px 3px 3px 0px;
- }
- }
-
-}
-
-.dataset.hda .state-icon {
- .fa-icon;
- display: inline-block;
- vertical-align: middle;
- width: 16px;
- height: 16px;
- line-height: 16px;
- text-align: center;
- font-size: 16px;
-}
-
-.state-icon-error {
- background-color: white;
- border-radius: 8px;
- &:before {
- font-size: 20px;
- line-height: 16px;
- color: red;
- content: @fa-var-times-circle;
- }
-}
-
.state-icon-running {
//TODO: couldn't find a way to do this with fa/spinning.less as mixin
-webkit-animation: spin 2s infinite linear;
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a66e4111ba2a/
Changeset: a66e4111ba2a
Branch: next-stable
User: carlfeberhard
Date: 2014-02-06 19:21:24
Summary: Fix: HDA API show on imported, non-shared histories (thanks, John Chilton)
Affected #: 1 file
diff -r 7dd1f6db0e3ff3affa9a01a63b8c11efbaa2380b -r a66e4111ba2aeca52572d203e1713153a5ee293a lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -616,11 +616,12 @@
check_ownership=False, check_accessible=False )
if check_accessible:
- if not trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), hda.dataset ):
+ if( not trans.user_is_admin()
+ and not trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), hda.dataset ) ):
error( "You are not allowed to access this dataset" )
- if check_state and hda.state == trans.model.Dataset.states.UPLOAD:
- error( "Please wait until this dataset finishes uploading before attempting to view it." )
+ if check_state and hda.state == trans.model.Dataset.states.UPLOAD:
+ error( "Please wait until this dataset finishes uploading before attempting to view it." )
return hda
def get_history_dataset_association_from_ids( self, trans, id, history_id ):
@@ -646,8 +647,6 @@
check_ownership=True, check_accessible=True )
return hda
-
-
def get_hda_list( self, trans, hda_ids, check_ownership=True, check_accessible=False, check_state=True ):
"""
Returns one or more datasets in a list.
https://bitbucket.org/galaxy/galaxy-central/commits/3db994bbb579/
Changeset: 3db994bbb579
User: carlfeberhard
Date: 2014-02-06 19:21:55
Summary: merge
Affected #: 1 file
diff -r 8922d9e14d83d2bbcb06ea8498b17c2e3ea460b2 -r 3db994bbb5794de782a824b5ea8b2220b99e97ec lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -659,11 +659,12 @@
check_ownership=False, check_accessible=False )
if check_accessible:
- if not trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), hda.dataset ):
+ if( not trans.user_is_admin()
+ and not trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), hda.dataset ) ):
error( "You are not allowed to access this dataset" )
- if check_state and hda.state == trans.model.Dataset.states.UPLOAD:
- error( "Please wait until this dataset finishes uploading before attempting to view it." )
+ if check_state and hda.state == trans.model.Dataset.states.UPLOAD:
+ error( "Please wait until this dataset finishes uploading before attempting to view it." )
return hda
def get_history_dataset_association_from_ids( self, trans, id, history_id ):
@@ -689,8 +690,6 @@
check_ownership=True, check_accessible=True )
return hda
-
-
def get_hda_list( self, trans, hda_ids, check_ownership=True, check_accessible=False, check_state=True ):
"""
Returns one or more datasets in a list.
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/7dd1f6db0e3f/
Changeset: 7dd1f6db0e3f
Branch: next-stable
User: jmchilton
Date: 2014-02-06 17:48:02
Summary: Bugfix: Allow users to 'unshare' histories shared with them.
Affected #: 1 file
diff -r d557d5dd942f5bbf820e19ec3fe7278401489555 -r 7dd1f6db0e3ff3affa9a01a63b8c11efbaa2380b lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -413,7 +413,9 @@
if not ids:
message = "Select a history to unshare"
return self.shared_list_grid( trans, status='error', message=message, **kwargs )
- histories = [ self.get_history( trans, history_id ) for history_id in ids ]
+ # No need to check security, association below won't yield a
+ # hit if this user isn't having the history shared with her.
+ histories = [ self.get_history( trans, history_id, check_ownership=False ) for history_id in ids ]
for history in histories:
# Current user is the user with which the histories were shared
association = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ).filter_by( user=trans.user, history=history ).one()
https://bitbucket.org/galaxy/galaxy-central/commits/8922d9e14d83/
Changeset: 8922d9e14d83
User: jmchilton
Date: 2014-02-06 17:48:18
Summary: Merge next-stable.
Affected #: 1 file
diff -r 75a81fcf38c477420f96035c9ed4b27edb55dd94 -r 8922d9e14d83d2bbcb06ea8498b17c2e3ea460b2 lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -417,7 +417,9 @@
if not ids:
message = "Select a history to unshare"
return self.shared_list_grid( trans, status='error', message=message, **kwargs )
- histories = [ self.get_history( trans, history_id ) for history_id in ids ]
+ # No need to check security, association below won't yield a
+ # hit if this user isn't having the history shared with her.
+ histories = [ self.get_history( trans, history_id, check_ownership=False ) for history_id in ids ]
for history in histories:
# Current user is the user with which the histories were shared
association = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ).filter_by( user=trans.user, history=history ).one()
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
5 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/9b86d73f9aea/
Changeset: 9b86d73f9aea
Branch: next-stable
User: jeremy goecks
Date: 2014-02-05 22:22:17
Summary: Fix bugs that prevented saving visualizations from Circster. To do this, introduced a mixin for custom toJSON methods. Pack scripts.
Affected #: 4 files
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 9b86d73f9aea574862eed1f6a0c02c9171ed2c3e static/scripts/packed/viz/circster.js
--- a/static/scripts/packed/viz/circster.js
+++ b/static/scripts/packed/viz/circster.js
@@ -1,1 +1,1 @@
-define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("tracks").on("add",this.add_track,this);this.model.get("tracks").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("tracks").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("tracks").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});var s=galaxy_config.app.viz_config;$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:s.vis_id,title:s.title,dbkey:s.dbkey,type:"trackster",vis_json:JSON.stringify(s)}}).success(function(t){Galaxy.modal.hide();s.vis_id=t.vis_id;s.has_changes=false;window.history.pushState({},"",t.url+window.location.hash)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
+define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("drawables").on("add",this.add_track,this);this.model.get("drawables").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:p.get("vis_id"),title:p.get("title"),dbkey:p.get("dbkey"),type:"trackster",vis_json:JSON.stringify(p)}}).success(function(s){Galaxy.modal.hide();p.set("vis_id",s.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 9b86d73f9aea574862eed1f6a0c02c9171ed2c3e static/scripts/packed/viz/visualization.js
--- a/static/scripts/packed/viz/visualization.js
+++ b/static/scripts/packed/viz/visualization.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(t,j,m,p){var a=function(v,y,x,w){$.ajax({url:v,data:x,error:function(){alert("Grid failed")},success:function(z){Galaxy.modal.show({title:"Select datasets for new tracks",body:z,buttons:{Cancel:function(){Galaxy.modal.hide()},Add:function(){var A=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var B={data_type:"track_config",hda_ldda:"hda"},C=$(this).val();if($(this).attr("name")!=="id"){B.hda_ldda="ldda"}A[A.length]=$.ajax({url:y+"/"+C,data:B,dataType:"json"})});$.when.apply($,A).then(function(){var B=(arguments[0] instanceof Array?$.map(arguments,function(C){return C[0]}):[arguments[0]]);w(B)});Galaxy.modal.hide()}}})}})};var k=function(v){return("promise" in v)};var f=function(v){this.default_font=v!==undefined?v:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};t.extend(f.prototype,{load_pattern:function(v,z){var w=this.patterns,x=this.dummy_context,y=new Image();y.src=galaxy_config.root+"static/images"+z;y.onload=function(){w[v]=x.createPattern(y,"repeat")}},get_pattern:function(v){return this.patterns[v]},new_canvas:function(){var v=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(v)}v.manager=this;return v}});var r=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(v){this.clear()},get_elt:function(x){var y=this.attributes.obj_cache,z=this.attributes.key_ary,w=x.toString(),v=t.indexOf(z,function(A){return A.toString()===w});if(v!==-1){if(y[w].stale){z.splice(v,1);delete y[w]}else{this.move_key_to_end(x,v)}}return y[w]},set_elt:function(x,z){var A=this.attributes.obj_cache,B=this.attributes.key_ary,w=x.toString(),y=this.attributes.num_elements;if(!A[w]){if(B.length>=y){var v=B.shift();delete A[v.toString()]}B.push(x)}A[w]=z;return z},move_key_to_end:function(w,v){this.attributes.key_ary.splice(v,1);this.attributes.key_ary.push(w)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length},most_recently_added:function(){return this.size()===0?null:this.attributes.key_ary[this.attributes.key_ary.length-1]}});var d=r.extend({defaults:t.extend({},r.prototype.defaults,{dataset:null,genome:null,init_data:null,min_region_size:200,filters_manager:null,data_type:"data",data_mode_compatible:function(v,w){return true},can_subset:function(v){return false}}),initialize:function(v){r.prototype.initialize.call(this);var w=this.get("init_data");if(w){this.add_data(w)}},add_data:function(v){if(this.get("num_elements")<v.length){this.set("num_elements",v.length)}var w=this;t.each(v,function(x){w.set_data(x.region,x)})},data_is_ready:function(){var y=this.get("dataset"),x=$.Deferred(),v=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),w=new m.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:y.get("hda_ldda"),data_type:v},dataType:"json"},interval:5000,success_fn:function(z){return z!=="pending"}});$.when(w.go()).then(function(z){x.resolve(z==="ok"||z==="data")});return x},search_features:function(v){var w=this.get("dataset"),x={query:v,hda_ldda:w.get("hda_ldda"),data_type:"features"};return $.getJSON(w.url(),x)},load_data:function(D,C,w,B){var z=this.get("dataset"),y={data_type:this.get("data_type"),chrom:D.get("chrom"),low:D.get("start"),high:D.get("end"),mode:C,resolution:w,hda_ldda:z.get("hda_ldda")};$.extend(y,B);var F=this.get("filters_manager");if(F){var G=[];var v=F.filters;for(var A=0;A<v.length;A++){G.push(v[A].name)}y.filter_cols=JSON.stringify(G)}var x=this,E=$.getJSON(z.url(),y,function(H){H.region=D;x.set_data(D,H)});this.set_data(D,E);return E},get_data:function(C,B,x,z){var D=this.get_elt(C);if(D&&(k(D)||this.get("data_mode_compatible")(D,B))){return D}var E=this.get("key_ary"),v=this.get("obj_cache"),w,A;for(var y=0;y<E.length;y++){w=E[y];if(w.contains(C)){A=true;D=v[w.toString()];if(k(D)||(this.get("data_mode_compatible")(D,B)&&this.get("can_subset")(D))){this.move_key_to_end(w,y);if(!k(D)){var G=this.subset_entry(D,C);this.set(C,G);D=G}return D}}}if(!A&&C.length()<this.attributes.min_region_size){C=C.copy();var F=this.most_recently_added();if(!F||(C.get("start")>F.get("start"))){C.set("end",C.get("start")+this.attributes.min_region_size)}else{C.set("start",C.get("end")-this.attributes.min_region_size)}C.set("genome",this.attributes.genome);C.trim()}return this.load_data(C,B,x,z)},set_data:function(w,v){this.set_elt(w,v)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(D,C,y,B,z){var F=this._mark_stale(D);if(!(F&&this.get("data_mode_compatible")(F,C))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var x=D.get("start");if(z===this.DEEP_DATA_REQ){$.extend(B,{start_val:F.data.length+1})}else{if(z===this.BROAD_DATA_REQ){x=(F.max_high?F.max_high:F.data[F.data.length-1][2])+1}}var E=D.copy().set("start",x);var w=this,A=this.load_data(E,C,y,B),v=$.Deferred();this.set_data(D,v);$.when(A).then(function(G){if(G.data){G.data=F.data.concat(G.data);if(G.max_low){G.max_low=F.max_low}if(G.message){G.message=G.message.replace(/[0-9]+/,G.data.length)}}w.set_data(D,G);v.resolve(G)});return v},can_get_more_detailed_data:function(w){var v=this.get_elt(w);return(v.dataset_type==="bigwig"&&v.data.length<8000)},get_more_detailed_data:function(y,A,w,z,x){var v=this._mark_stale(y);if(!v){console.log("ERROR getting more detailed data: no current data");return}if(!x){x={}}if(v.dataset_type==="bigwig"){x.num_samples=1000*z}return this.load_data(y,A,w,x)},_mark_stale:function(w){var v=this.get_elt(w);if(!v){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),w.toString())}v.stale=true;return v},get_genome_wide_data:function(v){var x=this,z=true,y=t.map(v.get("chroms_info").chrom_info,function(B){var A=x.get_elt(new g({chrom:B.chrom,start:0,end:B.len}));if(!A){z=false}return A});if(z){return y}var w=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(A){x.add_data(A.data);w.resolve(A.data)});return w},subset_entry:function(x,y){var v={bigwig:function(z,A){return t.filter(z,function(B){return B[0]>=A.get("start")&&B[0]<=A.get("end")})},refseq:function(A,B){var C=B.get("start")-x.region.get("start"),z=x.data.length-(x.region.get("end")-B.get("end"));return x.data.slice(C,z)}};var w=x.data;if(!x.region.same(y)&&x.dataset_type in v){w=v[x.dataset_type](x.data,y)}return{region:y,data:w,dataset_type:x.dataset_type}}});var q=d.extend({initialize:function(v){var w=new Backbone.Model();w.urlRoot=v.data_url;this.set("dataset",w)},load_data:function(x,y,v,w){return(x.length()<=100000?d.prototype.load_data.call(this,x,y,v,w):{data:null,region:x})}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(v){this.id=v.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(v){var w=t.find(this.get_chroms_info(),function(x){return x.chrom===v});return new g({chrom:w.chrom,end:w.len})},get_chrom_len:function(v){return t.find(this.get_chroms_info(),function(w){return w.chrom===v}).len}});var g=Backbone.Model.extend({defaults:{chrom:null,start:0,end:0,str_val:null,genome:null},same:function(v){return this.attributes.chrom===v.get("chrom")&&this.attributes.start===v.get("start")&&this.attributes.end===v.get("end")},initialize:function(w){if(w.from_str){var y=w.from_str.split(":"),x=y[0],v=y[1].split("-");this.set({chrom:x,start:parseInt(v[0],10),end:parseInt(v[1],10)})}this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end");this.on("change",function(){this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},this)},copy:function(){return new g({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.attributes.str_val},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(C){var w=this.get("chrom"),B=C.get("chrom"),A=this.get("start"),y=C.get("start"),z=this.get("end"),x=C.get("end"),v;if(w&&B&&w!==B){return g.overlap_results.DIF_CHROMS}if(A<y){if(z<y){v=g.overlap_results.BEFORE}else{if(z<x){v=g.overlap_results.OVERLAP_START}else{v=g.overlap_results.CONTAINS}}}else{if(A>y){if(A>x){v=g.overlap_results.AFTER}else{if(z<=x){v=g.overlap_results.CONTAINED_BY}else{v=g.overlap_results.OVERLAP_END}}}else{v=(z>=x?g.overlap_results.CONTAINS:g.overlap_results.CONTAINED_BY)}}return v},trim:function(v){if(this.attributes.start<0){this.attributes.start=0}if(this.attributes.genome){var w=this.attributes.genome.get_chrom_len(this.attributes.chrom);if(this.attributes.end>w){this.attributes.end=w-1}}return this},contains:function(v){return this.compute_overlap(v)===g.overlap_results.CONTAINS},overlaps:function(v){return t.intersection([this.compute_overlap(v)],[g.overlap_results.DIF_CHROMS,g.overlap_results.BEFORE,g.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var n=Backbone.Collection.extend({model:g});var e=Backbone.Model.extend({defaults:{region:null,note:""},initialize:function(v){this.set("region",new g(v.region))}});var s=Backbone.Collection.extend({model:e});var u=Backbone.Model.extend({initialize:function(v){this.set("dataset",new j.Dataset(v.dataset));this.set("config",p.ConfigSettingCollection.from_config_dict(v.prefs));this.get("config").add([{key:"name",value:this.get("name")},{key:"color"}]);var w=this.get("preloaded_data");if(w){w=w.data}else{w=[]}this.set("data_manager",new d({dataset:this.get("dataset"),init_data:w}))}});var i=Backbone.Collection.extend({model:u});var o=Backbone.Model.extend({defaults:{title:"",type:""},url:galaxy_config.root+"visualization/save",save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var l=o.extend({defaults:t.extend({},o.prototype.defaults,{dbkey:"",tracks:null,bookmarks:null,viewport:null}),initialize:function(v){this.set("tracks",new i(v.tracks))},add_tracks:function(v){this.get("tracks").add(v)}});var b=Backbone.Model.extend({});var h=Backbone.Router.extend({initialize:function(w){this.view=w.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var v=this;v.view.on("navigate",function(x){v.navigate(x)})},change_location:function(v){this.view.go_to(v)}});return{BackboneTrack:u,BrowserBookmark:e,BrowserBookmarkCollection:s,Cache:r,CanvasManager:f,Genome:c,GenomeDataManager:d,GenomeRegion:g,GenomeRegionCollection:n,GenomeVisualization:l,GenomeReferenceDataManager:q,TrackBrowserRouter:h,TrackConfig:b,Visualization:o,select_datasets:a}});
\ No newline at end of file
+define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(u,k,n,q){var f={toJSON:function(){var w=this,x={};u.each(w.constructor.to_json_keys,function(y){var z=w.get(y);if(y in w.constructor.to_json_mappers){z=w.constructor.to_json_mappers[y](z,w)}x[y]=z});return x}};var a=function(w,z,y,x){$.ajax({url:w,data:y,error:function(){alert("Grid failed")},success:function(A){Galaxy.modal.show({title:"Select datasets for new tracks",body:A,buttons:{Cancel:function(){Galaxy.modal.hide()},Add:function(){var B=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var C={data_type:"track_config",hda_ldda:"hda"},D=$(this).val();if($(this).attr("name")!=="id"){C.hda_ldda="ldda"}B[B.length]=$.ajax({url:z+"/"+D,data:C,dataType:"json"})});$.when.apply($,B).then(function(){var C=(arguments[0] instanceof Array?$.map(arguments,function(D){return D[0]}):[arguments[0]]);x(C)});Galaxy.modal.hide()}}})}})};var l=function(w){return("promise" in w)};var g=function(w){this.default_font=w!==undefined?w:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};u.extend(g.prototype,{load_pattern:function(w,A){var x=this.patterns,y=this.dummy_context,z=new Image();z.src=galaxy_config.root+"static/images"+A;z.onload=function(){x[w]=y.createPattern(z,"repeat")}},get_pattern:function(w){return this.patterns[w]},new_canvas:function(){var w=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(w)}w.manager=this;return w}});var s=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(w){this.clear()},get_elt:function(y){var z=this.attributes.obj_cache,A=this.attributes.key_ary,x=y.toString(),w=u.indexOf(A,function(B){return B.toString()===x});if(w!==-1){if(z[x].stale){A.splice(w,1);delete z[x]}else{this.move_key_to_end(y,w)}}return z[x]},set_elt:function(y,A){var B=this.attributes.obj_cache,C=this.attributes.key_ary,x=y.toString(),z=this.attributes.num_elements;if(!B[x]){if(C.length>=z){var w=C.shift();delete B[w.toString()]}C.push(y)}B[x]=A;return A},move_key_to_end:function(x,w){this.attributes.key_ary.splice(w,1);this.attributes.key_ary.push(x)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length},most_recently_added:function(){return this.size()===0?null:this.attributes.key_ary[this.attributes.key_ary.length-1]}});var d=s.extend({defaults:u.extend({},s.prototype.defaults,{dataset:null,genome:null,init_data:null,min_region_size:200,filters_manager:null,data_type:"data",data_mode_compatible:function(w,x){return true},can_subset:function(w){return false}}),initialize:function(w){s.prototype.initialize.call(this);var x=this.get("init_data");if(x){this.add_data(x)}},add_data:function(w){if(this.get("num_elements")<w.length){this.set("num_elements",w.length)}var x=this;u.each(w,function(y){x.set_data(y.region,y)})},data_is_ready:function(){var z=this.get("dataset"),y=$.Deferred(),w=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),x=new n.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:z.get("hda_ldda"),data_type:w},dataType:"json"},interval:5000,success_fn:function(A){return A!=="pending"}});$.when(x.go()).then(function(A){y.resolve(A==="ok"||A==="data")});return y},search_features:function(w){var x=this.get("dataset"),y={query:w,hda_ldda:x.get("hda_ldda"),data_type:"features"};return $.getJSON(x.url(),y)},load_data:function(E,D,x,C){var A=this.get("dataset"),z={data_type:this.get("data_type"),chrom:E.get("chrom"),low:E.get("start"),high:E.get("end"),mode:D,resolution:x,hda_ldda:A.get("hda_ldda")};$.extend(z,C);var G=this.get("filters_manager");if(G){var H=[];var w=G.filters;for(var B=0;B<w.length;B++){H.push(w[B].name)}z.filter_cols=JSON.stringify(H)}var y=this,F=$.getJSON(A.url(),z,function(I){I.region=E;y.set_data(E,I)});this.set_data(E,F);return F},get_data:function(D,C,y,A){var E=this.get_elt(D);if(E&&(l(E)||this.get("data_mode_compatible")(E,C))){return E}var F=this.get("key_ary"),w=this.get("obj_cache"),x,B;for(var z=0;z<F.length;z++){x=F[z];if(x.contains(D)){B=true;E=w[x.toString()];if(l(E)||(this.get("data_mode_compatible")(E,C)&&this.get("can_subset")(E))){this.move_key_to_end(x,z);if(!l(E)){var H=this.subset_entry(E,D);this.set(D,H);E=H}return E}}}if(!B&&D.length()<this.attributes.min_region_size){D=D.copy();var G=this.most_recently_added();if(!G||(D.get("start")>G.get("start"))){D.set("end",D.get("start")+this.attributes.min_region_size)}else{D.set("start",D.get("end")-this.attributes.min_region_size)}D.set("genome",this.attributes.genome);D.trim()}return this.load_data(D,C,y,A)},set_data:function(x,w){this.set_elt(x,w)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(E,D,z,C,A){var G=this._mark_stale(E);if(!(G&&this.get("data_mode_compatible")(G,D))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var y=E.get("start");if(A===this.DEEP_DATA_REQ){$.extend(C,{start_val:G.data.length+1})}else{if(A===this.BROAD_DATA_REQ){y=(G.max_high?G.max_high:G.data[G.data.length-1][2])+1}}var F=E.copy().set("start",y);var x=this,B=this.load_data(F,D,z,C),w=$.Deferred();this.set_data(E,w);$.when(B).then(function(H){if(H.data){H.data=G.data.concat(H.data);if(H.max_low){H.max_low=G.max_low}if(H.message){H.message=H.message.replace(/[0-9]+/,H.data.length)}}x.set_data(E,H);w.resolve(H)});return w},can_get_more_detailed_data:function(x){var w=this.get_elt(x);return(w.dataset_type==="bigwig"&&w.data.length<8000)},get_more_detailed_data:function(z,B,x,A,y){var w=this._mark_stale(z);if(!w){console.log("ERROR getting more detailed data: no current data");return}if(!y){y={}}if(w.dataset_type==="bigwig"){y.num_samples=1000*A}return this.load_data(z,B,x,y)},_mark_stale:function(x){var w=this.get_elt(x);if(!w){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),x.toString())}w.stale=true;return w},get_genome_wide_data:function(w){var y=this,A=true,z=u.map(w.get("chroms_info").chrom_info,function(C){var B=y.get_elt(new h({chrom:C.chrom,start:0,end:C.len}));if(!B){A=false}return B});if(A){return z}var x=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(B){y.add_data(B.data);x.resolve(B.data)});return x},subset_entry:function(y,z){var w={bigwig:function(A,B){return u.filter(A,function(C){return C[0]>=B.get("start")&&C[0]<=B.get("end")})},refseq:function(B,C){var D=C.get("start")-y.region.get("start"),A=y.data.length-(y.region.get("end")-C.get("end"));return y.data.slice(D,A)}};var x=y.data;if(!y.region.same(z)&&y.dataset_type in w){x=w[y.dataset_type](y.data,z)}return{region:z,data:x,dataset_type:y.dataset_type}}});var r=d.extend({initialize:function(w){var x=new Backbone.Model();x.urlRoot=w.data_url;this.set("dataset",x)},load_data:function(y,z,w,x){return(y.length()<=100000?d.prototype.load_data.call(this,y,z,w,x):{data:null,region:y})}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(w){this.id=w.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(w){var x=u.find(this.get_chroms_info(),function(y){return y.chrom===w});return new h({chrom:x.chrom,end:x.len})},get_chrom_len:function(w){return u.find(this.get_chroms_info(),function(x){return x.chrom===w}).len}});var h=Backbone.Model.extend({defaults:{chrom:null,start:0,end:0,str_val:null,genome:null},same:function(w){return this.attributes.chrom===w.get("chrom")&&this.attributes.start===w.get("start")&&this.attributes.end===w.get("end")},initialize:function(x){if(x.from_str){var z=x.from_str.split(":"),y=z[0],w=z[1].split("-");this.set({chrom:y,start:parseInt(w[0],10),end:parseInt(w[1],10)})}this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end");this.on("change",function(){this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},this)},copy:function(){return new h({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.attributes.str_val},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(D){var x=this.get("chrom"),C=D.get("chrom"),B=this.get("start"),z=D.get("start"),A=this.get("end"),y=D.get("end"),w;if(x&&C&&x!==C){return h.overlap_results.DIF_CHROMS}if(B<z){if(A<z){w=h.overlap_results.BEFORE}else{if(A<y){w=h.overlap_results.OVERLAP_START}else{w=h.overlap_results.CONTAINS}}}else{if(B>z){if(B>y){w=h.overlap_results.AFTER}else{if(A<=y){w=h.overlap_results.CONTAINED_BY}else{w=h.overlap_results.OVERLAP_END}}}else{w=(A>=y?h.overlap_results.CONTAINS:h.overlap_results.CONTAINED_BY)}}return w},trim:function(w){if(this.attributes.start<0){this.attributes.start=0}if(this.attributes.genome){var x=this.attributes.genome.get_chrom_len(this.attributes.chrom);if(this.attributes.end>x){this.attributes.end=x-1}}return this},contains:function(w){return this.compute_overlap(w)===h.overlap_results.CONTAINS},overlaps:function(w){return u.intersection([this.compute_overlap(w)],[h.overlap_results.DIF_CHROMS,h.overlap_results.BEFORE,h.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var o=Backbone.Collection.extend({model:h});var e=Backbone.Model.extend({defaults:{region:null,note:""},initialize:function(w){this.set("region",new h(w.region))}});var t=Backbone.Collection.extend({model:e});var v=Backbone.Model.extend(f).extend({defaults:{mode:"Auto"},initialize:function(w){this.set("dataset",new k.Dataset(w.dataset));this.set("config",q.ConfigSettingCollection.from_config_dict(w.prefs));this.get("config").add([{key:"name",value:this.get("dataset").get("name")},{key:"color"}]);var x=this.get("preloaded_data");if(x){x=x.data}else{x=[]}this.set("data_manager",new d({dataset:this.get("dataset"),init_data:x}))}},{to_json_keys:["track_type","dataset","prefs","mode","filters","tool_state"],to_json_mappers:{prefs:function(x,w){if(u.size(x)===0){x={name:w.get("config").get("name").get("value"),color:w.get("config").get("color").get("value")}}return x},dataset:function(w){return{id:w.id,hda_ldda:w.get("hda_ldda")}}}});var j=Backbone.Collection.extend({model:v});var p=Backbone.Model.extend({defaults:{title:"",type:""},url:galaxy_config.root+"visualization/save",save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var m=p.extend(f).extend({defaults:u.extend({},p.prototype.defaults,{dbkey:"",drawables:null,bookmarks:null,viewport:null}),initialize:function(w){this.set("drawables",new j(w.tracks));this.set("config",q.ConfigSettingCollection.from_config_dict(w.prefs||{}));this.unset("tracks");this.get("drawables").each(function(x){x.unset("preloaded_data")})},add_tracks:function(w){this.get("drawables").add(w)}},{to_json_keys:["view","viewport","bookmarks"],to_json_mappers:{view:function(x,w){return{obj_type:"View",prefs:{name:w.get("title"),content_visible:true},drawables:w.get("drawables")}}}});var b=Backbone.Model.extend({});var i=Backbone.Router.extend({initialize:function(x){this.view=x.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var w=this;w.view.on("navigate",function(y){w.navigate(y)})},change_location:function(w){this.view.go_to(w)}});return{BackboneTrack:v,BrowserBookmark:e,BrowserBookmarkCollection:t,Cache:s,CanvasManager:g,Genome:c,GenomeDataManager:d,GenomeRegion:h,GenomeRegionCollection:o,GenomeVisualization:m,GenomeReferenceDataManager:r,TrackBrowserRouter:i,TrackConfig:b,Visualization:p,select_datasets:a}});
\ No newline at end of file
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 9b86d73f9aea574862eed1f6a0c02c9171ed2c3e static/scripts/viz/circster.js
--- a/static/scripts/viz/circster.js
+++ b/static/scripts/viz/circster.js
@@ -143,8 +143,8 @@
this.chords_views = null;
// When tracks added to/removed from model, update view.
- this.model.get('tracks').on('add', this.add_track, this);
- this.model.get('tracks').on('remove', this.remove_track, this);
+ this.model.get('drawables').on('add', this.add_track, this);
+ this.model.get('drawables').on('remove', this.remove_track, this);
this.get_circular_tracks();
},
@@ -154,7 +154,7 @@
* Returns tracks to be rendered using circular view.
*/
get_circular_tracks: function() {
- return this.model.get('tracks').filter(function(track) {
+ return this.model.get('drawables').filter(function(track) {
return track.get('track_type') !== 'DiagonalHeatmapTrack';
});
},
@@ -163,7 +163,7 @@
* Returns tracks to be rendered using chords view.
*/
get_chord_tracks: function() {
- return this.model.get('tracks').filter(function(track) {
+ return this.model.get('drawables').filter(function(track) {
return track.get('track_type') === 'DiagonalHeatmapTrack';
});
},
@@ -992,41 +992,36 @@
// setup menu
var menu = create_icon_buttons_menu([
- { icon_class: 'plus-button', title: 'Add tracks', on_click: function()
+ {
+ icon_class: 'plus-button', title: 'Add tracks', on_click: function()
{
visualization.select_datasets(galaxy_config.root + "visualization/list_current_history_datasets", galaxy_config.root + "api/datasets", vis.get('dbkey'), function(tracks)
{
vis.add_tracks(tracks);
});
}
- },{
+ },
+ {
icon_class: 'disk--arrow', title: 'Save', on_click: function()
{
// show saving dialog box
Galaxy.modal.show({title: "Saving...", body: "progress" });
- // link configuration
- var view = galaxy_config.app.viz_config;
-
// send to server
$.ajax({
url: galaxy_config.root + "visualization/save",
type: "POST",
dataType: "json",
data: {
- 'id' : view.vis_id,
- 'title' : view.title,
- 'dbkey' : view.dbkey,
+ 'id' : vis.get('vis_id'),
+ 'title' : vis.get('title'),
+ 'dbkey' : vis.get('dbkey'),
'type' : 'trackster',
- 'vis_json' : JSON.stringify(view)
+ 'vis_json' : JSON.stringify(vis)
}
}).success(function(vis_info) {
Galaxy.modal.hide();
- view.vis_id = vis_info.vis_id;
- view.has_changes = false;
-
- // needed to set URL when first saving a visualization
- window.history.pushState({}, "", vis_info.url + window.location.hash);
+ vis.set('vis_id', vis_info.vis_id);
}).error(function() {
// show dialog
Galaxy.modal.show({
@@ -1036,7 +1031,8 @@
});
});
}
- },{
+ },
+ {
icon_class: 'cross-circle', title: 'Close', on_click: function()
{
window.location = galaxy_config.root + "visualization/list";
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 9b86d73f9aea574862eed1f6a0c02c9171ed2c3e static/scripts/viz/visualization.js
--- a/static/scripts/viz/visualization.js
+++ b/static/scripts/viz/visualization.js
@@ -1,6 +1,28 @@
define( ["libs/underscore", "mvc/data", "viz/trackster/util", "utils/config"], function(_, data_mod, util_mod, config_mod) {
/**
+ * Mixin for returning custom JSON representation from toJSON. Class attribute to_json_keys defines a set of attributes
+ * to include in the representation; to_json_mappers defines mappers for returned objects.
+ */
+var CustomToJSON = {
+ /**
+ * Returns JSON representation of object using to_json_keys and to_json_mappers.
+ */
+ toJSON: function() {
+ var self = this,
+ json = {};
+ _.each(self.constructor.to_json_keys, function(k) {
+ var val = self.get(k);
+ if (k in self.constructor.to_json_mappers) {
+ val = self.constructor.to_json_mappers[k](val, self);
+ }
+ json[k] = val;
+ });
+ return json;
+ }
+};
+
+/**
* Model, view, and controller objects for Galaxy visualization framework.
*
* Models have no references to views, instead using events to indicate state
@@ -872,7 +894,10 @@
* A track of data in a genome visualization.
*/
// TODO: rename to Track and merge with Trackster's Track object.
-var BackboneTrack = Backbone.Model.extend({
+var BackboneTrack = Backbone.Model.extend(CustomToJSON).extend({
+ defaults: {
+ mode: 'Auto'
+ },
initialize: function(options) {
this.set('dataset', new data_mod.Dataset(options.dataset));
@@ -883,7 +908,7 @@
// Set up some minimal config.
this.get('config').add( [
- { key: 'name', value: this.get('name') },
+ { key: 'name', value: this.get('dataset').get('name') },
{ key: 'color' }
] );
@@ -900,6 +925,34 @@
init_data: preloaded_data
}));
}
+},
+{
+ // This definition matches that produced by to_dict() methods in tracks.js
+ to_json_keys: [
+ 'track_type',
+ 'dataset',
+ 'prefs',
+ 'mode',
+ 'filters',
+ 'tool_state'
+ ],
+ to_json_mappers: {
+ prefs: function(p, self) {
+ if (_.size(p) === 0) {
+ p = {
+ name: self.get('config').get('name').get('value'),
+ color: self.get('config').get('color').get('value')
+ };
+ }
+ return p;
+ },
+ dataset: function(d) {
+ return {
+ id: d.id,
+ hda_ldda: d.get('hda_ldda')
+ };
+ }
+ }
});
var BackboneTrackCollection = Backbone.Collection.extend({
@@ -938,25 +991,55 @@
/**
* A visualization of genome data.
*/
-var GenomeVisualization = Visualization.extend({
+var GenomeVisualization = Visualization.extend(CustomToJSON).extend({
defaults: _.extend({}, Visualization.prototype.defaults, {
dbkey: '',
- tracks: null,
+ drawables: null,
bookmarks: null,
viewport: null
}),
initialize: function(options) {
- this.set('tracks', new BackboneTrackCollection(options.tracks));
+ // Replace drawables with tracks.
+ this.set('drawables', new BackboneTrackCollection(options.tracks));
+ this.set('config', config_mod.ConfigSettingCollection.from_config_dict(options.prefs || {}));
+
+ // Clear track and data definitions to avoid storing large objects.
+ this.unset('tracks');
+ this.get('drawables').each(function(d) {
+ d.unset('preloaded_data');
+ });
},
/**
* Add a track or array of tracks to the visualization.
*/
add_tracks: function(tracks) {
- this.get('tracks').add(tracks);
+ this.get('drawables').add(tracks);
}
-});
+},
+{
+ // This definition matches that produced by to_dict() methods in tracks.js
+ to_json_keys: [
+ 'view',
+ 'viewport',
+ 'bookmarks'
+ ],
+
+ to_json_mappers: {
+ 'view': function(dummy, self) {
+ return {
+ obj_type: 'View',
+ prefs: {
+ name: self.get('title'),
+ content_visible: true
+ },
+ drawables: self.get('drawables')
+ };
+ }
+ }
+}
+);
/**
* Configuration data for a Trackster track.
https://bitbucket.org/galaxy/galaxy-central/commits/c98072c51cf0/
Changeset: c98072c51cf0
User: jeremy goecks
Date: 2014-02-05 22:22:45
Summary: Merge next-stable into default.
Affected #: 4 files
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r c98072c51cf05de686c631739a5deb18c15734bf static/scripts/packed/viz/circster.js
--- a/static/scripts/packed/viz/circster.js
+++ b/static/scripts/packed/viz/circster.js
@@ -1,1 +1,1 @@
-define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("tracks").on("add",this.add_track,this);this.model.get("tracks").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("tracks").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("tracks").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});var s=galaxy_config.app.viz_config;$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:s.vis_id,title:s.title,dbkey:s.dbkey,type:"trackster",vis_json:JSON.stringify(s)}}).success(function(t){Galaxy.modal.hide();s.vis_id=t.vis_id;s.has_changes=false;window.history.pushState({},"",t.url+window.location.hash)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
+define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("drawables").on("add",this.add_track,this);this.model.get("drawables").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:p.get("vis_id"),title:p.get("title"),dbkey:p.get("dbkey"),type:"trackster",vis_json:JSON.stringify(p)}}).success(function(s){Galaxy.modal.hide();p.set("vis_id",s.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r c98072c51cf05de686c631739a5deb18c15734bf static/scripts/packed/viz/visualization.js
--- a/static/scripts/packed/viz/visualization.js
+++ b/static/scripts/packed/viz/visualization.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(t,j,m,p){var a=function(v,y,x,w){$.ajax({url:v,data:x,error:function(){alert("Grid failed")},success:function(z){Galaxy.modal.show({title:"Select datasets for new tracks",body:z,buttons:{Cancel:function(){Galaxy.modal.hide()},Add:function(){var A=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var B={data_type:"track_config",hda_ldda:"hda"},C=$(this).val();if($(this).attr("name")!=="id"){B.hda_ldda="ldda"}A[A.length]=$.ajax({url:y+"/"+C,data:B,dataType:"json"})});$.when.apply($,A).then(function(){var B=(arguments[0] instanceof Array?$.map(arguments,function(C){return C[0]}):[arguments[0]]);w(B)});Galaxy.modal.hide()}}})}})};var k=function(v){return("promise" in v)};var f=function(v){this.default_font=v!==undefined?v:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};t.extend(f.prototype,{load_pattern:function(v,z){var w=this.patterns,x=this.dummy_context,y=new Image();y.src=galaxy_config.root+"static/images"+z;y.onload=function(){w[v]=x.createPattern(y,"repeat")}},get_pattern:function(v){return this.patterns[v]},new_canvas:function(){var v=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(v)}v.manager=this;return v}});var r=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(v){this.clear()},get_elt:function(x){var y=this.attributes.obj_cache,z=this.attributes.key_ary,w=x.toString(),v=t.indexOf(z,function(A){return A.toString()===w});if(v!==-1){if(y[w].stale){z.splice(v,1);delete y[w]}else{this.move_key_to_end(x,v)}}return y[w]},set_elt:function(x,z){var A=this.attributes.obj_cache,B=this.attributes.key_ary,w=x.toString(),y=this.attributes.num_elements;if(!A[w]){if(B.length>=y){var v=B.shift();delete A[v.toString()]}B.push(x)}A[w]=z;return z},move_key_to_end:function(w,v){this.attributes.key_ary.splice(v,1);this.attributes.key_ary.push(w)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length},most_recently_added:function(){return this.size()===0?null:this.attributes.key_ary[this.attributes.key_ary.length-1]}});var d=r.extend({defaults:t.extend({},r.prototype.defaults,{dataset:null,genome:null,init_data:null,min_region_size:200,filters_manager:null,data_type:"data",data_mode_compatible:function(v,w){return true},can_subset:function(v){return false}}),initialize:function(v){r.prototype.initialize.call(this);var w=this.get("init_data");if(w){this.add_data(w)}},add_data:function(v){if(this.get("num_elements")<v.length){this.set("num_elements",v.length)}var w=this;t.each(v,function(x){w.set_data(x.region,x)})},data_is_ready:function(){var y=this.get("dataset"),x=$.Deferred(),v=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),w=new m.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:y.get("hda_ldda"),data_type:v},dataType:"json"},interval:5000,success_fn:function(z){return z!=="pending"}});$.when(w.go()).then(function(z){x.resolve(z==="ok"||z==="data")});return x},search_features:function(v){var w=this.get("dataset"),x={query:v,hda_ldda:w.get("hda_ldda"),data_type:"features"};return $.getJSON(w.url(),x)},load_data:function(D,C,w,B){var z=this.get("dataset"),y={data_type:this.get("data_type"),chrom:D.get("chrom"),low:D.get("start"),high:D.get("end"),mode:C,resolution:w,hda_ldda:z.get("hda_ldda")};$.extend(y,B);var F=this.get("filters_manager");if(F){var G=[];var v=F.filters;for(var A=0;A<v.length;A++){G.push(v[A].name)}y.filter_cols=JSON.stringify(G)}var x=this,E=$.getJSON(z.url(),y,function(H){H.region=D;x.set_data(D,H)});this.set_data(D,E);return E},get_data:function(C,B,x,z){var D=this.get_elt(C);if(D&&(k(D)||this.get("data_mode_compatible")(D,B))){return D}var E=this.get("key_ary"),v=this.get("obj_cache"),w,A;for(var y=0;y<E.length;y++){w=E[y];if(w.contains(C)){A=true;D=v[w.toString()];if(k(D)||(this.get("data_mode_compatible")(D,B)&&this.get("can_subset")(D))){this.move_key_to_end(w,y);if(!k(D)){var G=this.subset_entry(D,C);this.set(C,G);D=G}return D}}}if(!A&&C.length()<this.attributes.min_region_size){C=C.copy();var F=this.most_recently_added();if(!F||(C.get("start")>F.get("start"))){C.set("end",C.get("start")+this.attributes.min_region_size)}else{C.set("start",C.get("end")-this.attributes.min_region_size)}C.set("genome",this.attributes.genome);C.trim()}return this.load_data(C,B,x,z)},set_data:function(w,v){this.set_elt(w,v)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(D,C,y,B,z){var F=this._mark_stale(D);if(!(F&&this.get("data_mode_compatible")(F,C))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var x=D.get("start");if(z===this.DEEP_DATA_REQ){$.extend(B,{start_val:F.data.length+1})}else{if(z===this.BROAD_DATA_REQ){x=(F.max_high?F.max_high:F.data[F.data.length-1][2])+1}}var E=D.copy().set("start",x);var w=this,A=this.load_data(E,C,y,B),v=$.Deferred();this.set_data(D,v);$.when(A).then(function(G){if(G.data){G.data=F.data.concat(G.data);if(G.max_low){G.max_low=F.max_low}if(G.message){G.message=G.message.replace(/[0-9]+/,G.data.length)}}w.set_data(D,G);v.resolve(G)});return v},can_get_more_detailed_data:function(w){var v=this.get_elt(w);return(v.dataset_type==="bigwig"&&v.data.length<8000)},get_more_detailed_data:function(y,A,w,z,x){var v=this._mark_stale(y);if(!v){console.log("ERROR getting more detailed data: no current data");return}if(!x){x={}}if(v.dataset_type==="bigwig"){x.num_samples=1000*z}return this.load_data(y,A,w,x)},_mark_stale:function(w){var v=this.get_elt(w);if(!v){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),w.toString())}v.stale=true;return v},get_genome_wide_data:function(v){var x=this,z=true,y=t.map(v.get("chroms_info").chrom_info,function(B){var A=x.get_elt(new g({chrom:B.chrom,start:0,end:B.len}));if(!A){z=false}return A});if(z){return y}var w=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(A){x.add_data(A.data);w.resolve(A.data)});return w},subset_entry:function(x,y){var v={bigwig:function(z,A){return t.filter(z,function(B){return B[0]>=A.get("start")&&B[0]<=A.get("end")})},refseq:function(A,B){var C=B.get("start")-x.region.get("start"),z=x.data.length-(x.region.get("end")-B.get("end"));return x.data.slice(C,z)}};var w=x.data;if(!x.region.same(y)&&x.dataset_type in v){w=v[x.dataset_type](x.data,y)}return{region:y,data:w,dataset_type:x.dataset_type}}});var q=d.extend({initialize:function(v){var w=new Backbone.Model();w.urlRoot=v.data_url;this.set("dataset",w)},load_data:function(x,y,v,w){return(x.length()<=100000?d.prototype.load_data.call(this,x,y,v,w):{data:null,region:x})}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(v){this.id=v.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(v){var w=t.find(this.get_chroms_info(),function(x){return x.chrom===v});return new g({chrom:w.chrom,end:w.len})},get_chrom_len:function(v){return t.find(this.get_chroms_info(),function(w){return w.chrom===v}).len}});var g=Backbone.Model.extend({defaults:{chrom:null,start:0,end:0,str_val:null,genome:null},same:function(v){return this.attributes.chrom===v.get("chrom")&&this.attributes.start===v.get("start")&&this.attributes.end===v.get("end")},initialize:function(w){if(w.from_str){var y=w.from_str.split(":"),x=y[0],v=y[1].split("-");this.set({chrom:x,start:parseInt(v[0],10),end:parseInt(v[1],10)})}this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end");this.on("change",function(){this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},this)},copy:function(){return new g({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.attributes.str_val},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(C){var w=this.get("chrom"),B=C.get("chrom"),A=this.get("start"),y=C.get("start"),z=this.get("end"),x=C.get("end"),v;if(w&&B&&w!==B){return g.overlap_results.DIF_CHROMS}if(A<y){if(z<y){v=g.overlap_results.BEFORE}else{if(z<x){v=g.overlap_results.OVERLAP_START}else{v=g.overlap_results.CONTAINS}}}else{if(A>y){if(A>x){v=g.overlap_results.AFTER}else{if(z<=x){v=g.overlap_results.CONTAINED_BY}else{v=g.overlap_results.OVERLAP_END}}}else{v=(z>=x?g.overlap_results.CONTAINS:g.overlap_results.CONTAINED_BY)}}return v},trim:function(v){if(this.attributes.start<0){this.attributes.start=0}if(this.attributes.genome){var w=this.attributes.genome.get_chrom_len(this.attributes.chrom);if(this.attributes.end>w){this.attributes.end=w-1}}return this},contains:function(v){return this.compute_overlap(v)===g.overlap_results.CONTAINS},overlaps:function(v){return t.intersection([this.compute_overlap(v)],[g.overlap_results.DIF_CHROMS,g.overlap_results.BEFORE,g.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var n=Backbone.Collection.extend({model:g});var e=Backbone.Model.extend({defaults:{region:null,note:""},initialize:function(v){this.set("region",new g(v.region))}});var s=Backbone.Collection.extend({model:e});var u=Backbone.Model.extend({initialize:function(v){this.set("dataset",new j.Dataset(v.dataset));this.set("config",p.ConfigSettingCollection.from_config_dict(v.prefs));this.get("config").add([{key:"name",value:this.get("name")},{key:"color"}]);var w=this.get("preloaded_data");if(w){w=w.data}else{w=[]}this.set("data_manager",new d({dataset:this.get("dataset"),init_data:w}))}});var i=Backbone.Collection.extend({model:u});var o=Backbone.Model.extend({defaults:{title:"",type:""},url:galaxy_config.root+"visualization/save",save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var l=o.extend({defaults:t.extend({},o.prototype.defaults,{dbkey:"",tracks:null,bookmarks:null,viewport:null}),initialize:function(v){this.set("tracks",new i(v.tracks))},add_tracks:function(v){this.get("tracks").add(v)}});var b=Backbone.Model.extend({});var h=Backbone.Router.extend({initialize:function(w){this.view=w.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var v=this;v.view.on("navigate",function(x){v.navigate(x)})},change_location:function(v){this.view.go_to(v)}});return{BackboneTrack:u,BrowserBookmark:e,BrowserBookmarkCollection:s,Cache:r,CanvasManager:f,Genome:c,GenomeDataManager:d,GenomeRegion:g,GenomeRegionCollection:n,GenomeVisualization:l,GenomeReferenceDataManager:q,TrackBrowserRouter:h,TrackConfig:b,Visualization:o,select_datasets:a}});
\ No newline at end of file
+define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(u,k,n,q){var f={toJSON:function(){var w=this,x={};u.each(w.constructor.to_json_keys,function(y){var z=w.get(y);if(y in w.constructor.to_json_mappers){z=w.constructor.to_json_mappers[y](z,w)}x[y]=z});return x}};var a=function(w,z,y,x){$.ajax({url:w,data:y,error:function(){alert("Grid failed")},success:function(A){Galaxy.modal.show({title:"Select datasets for new tracks",body:A,buttons:{Cancel:function(){Galaxy.modal.hide()},Add:function(){var B=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var C={data_type:"track_config",hda_ldda:"hda"},D=$(this).val();if($(this).attr("name")!=="id"){C.hda_ldda="ldda"}B[B.length]=$.ajax({url:z+"/"+D,data:C,dataType:"json"})});$.when.apply($,B).then(function(){var C=(arguments[0] instanceof Array?$.map(arguments,function(D){return D[0]}):[arguments[0]]);x(C)});Galaxy.modal.hide()}}})}})};var l=function(w){return("promise" in w)};var g=function(w){this.default_font=w!==undefined?w:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};u.extend(g.prototype,{load_pattern:function(w,A){var x=this.patterns,y=this.dummy_context,z=new Image();z.src=galaxy_config.root+"static/images"+A;z.onload=function(){x[w]=y.createPattern(z,"repeat")}},get_pattern:function(w){return this.patterns[w]},new_canvas:function(){var w=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(w)}w.manager=this;return w}});var s=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(w){this.clear()},get_elt:function(y){var z=this.attributes.obj_cache,A=this.attributes.key_ary,x=y.toString(),w=u.indexOf(A,function(B){return B.toString()===x});if(w!==-1){if(z[x].stale){A.splice(w,1);delete z[x]}else{this.move_key_to_end(y,w)}}return z[x]},set_elt:function(y,A){var B=this.attributes.obj_cache,C=this.attributes.key_ary,x=y.toString(),z=this.attributes.num_elements;if(!B[x]){if(C.length>=z){var w=C.shift();delete B[w.toString()]}C.push(y)}B[x]=A;return A},move_key_to_end:function(x,w){this.attributes.key_ary.splice(w,1);this.attributes.key_ary.push(x)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length},most_recently_added:function(){return this.size()===0?null:this.attributes.key_ary[this.attributes.key_ary.length-1]}});var d=s.extend({defaults:u.extend({},s.prototype.defaults,{dataset:null,genome:null,init_data:null,min_region_size:200,filters_manager:null,data_type:"data",data_mode_compatible:function(w,x){return true},can_subset:function(w){return false}}),initialize:function(w){s.prototype.initialize.call(this);var x=this.get("init_data");if(x){this.add_data(x)}},add_data:function(w){if(this.get("num_elements")<w.length){this.set("num_elements",w.length)}var x=this;u.each(w,function(y){x.set_data(y.region,y)})},data_is_ready:function(){var z=this.get("dataset"),y=$.Deferred(),w=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),x=new n.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:z.get("hda_ldda"),data_type:w},dataType:"json"},interval:5000,success_fn:function(A){return A!=="pending"}});$.when(x.go()).then(function(A){y.resolve(A==="ok"||A==="data")});return y},search_features:function(w){var x=this.get("dataset"),y={query:w,hda_ldda:x.get("hda_ldda"),data_type:"features"};return $.getJSON(x.url(),y)},load_data:function(E,D,x,C){var A=this.get("dataset"),z={data_type:this.get("data_type"),chrom:E.get("chrom"),low:E.get("start"),high:E.get("end"),mode:D,resolution:x,hda_ldda:A.get("hda_ldda")};$.extend(z,C);var G=this.get("filters_manager");if(G){var H=[];var w=G.filters;for(var B=0;B<w.length;B++){H.push(w[B].name)}z.filter_cols=JSON.stringify(H)}var y=this,F=$.getJSON(A.url(),z,function(I){I.region=E;y.set_data(E,I)});this.set_data(E,F);return F},get_data:function(D,C,y,A){var E=this.get_elt(D);if(E&&(l(E)||this.get("data_mode_compatible")(E,C))){return E}var F=this.get("key_ary"),w=this.get("obj_cache"),x,B;for(var z=0;z<F.length;z++){x=F[z];if(x.contains(D)){B=true;E=w[x.toString()];if(l(E)||(this.get("data_mode_compatible")(E,C)&&this.get("can_subset")(E))){this.move_key_to_end(x,z);if(!l(E)){var H=this.subset_entry(E,D);this.set(D,H);E=H}return E}}}if(!B&&D.length()<this.attributes.min_region_size){D=D.copy();var G=this.most_recently_added();if(!G||(D.get("start")>G.get("start"))){D.set("end",D.get("start")+this.attributes.min_region_size)}else{D.set("start",D.get("end")-this.attributes.min_region_size)}D.set("genome",this.attributes.genome);D.trim()}return this.load_data(D,C,y,A)},set_data:function(x,w){this.set_elt(x,w)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(E,D,z,C,A){var G=this._mark_stale(E);if(!(G&&this.get("data_mode_compatible")(G,D))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var y=E.get("start");if(A===this.DEEP_DATA_REQ){$.extend(C,{start_val:G.data.length+1})}else{if(A===this.BROAD_DATA_REQ){y=(G.max_high?G.max_high:G.data[G.data.length-1][2])+1}}var F=E.copy().set("start",y);var x=this,B=this.load_data(F,D,z,C),w=$.Deferred();this.set_data(E,w);$.when(B).then(function(H){if(H.data){H.data=G.data.concat(H.data);if(H.max_low){H.max_low=G.max_low}if(H.message){H.message=H.message.replace(/[0-9]+/,H.data.length)}}x.set_data(E,H);w.resolve(H)});return w},can_get_more_detailed_data:function(x){var w=this.get_elt(x);return(w.dataset_type==="bigwig"&&w.data.length<8000)},get_more_detailed_data:function(z,B,x,A,y){var w=this._mark_stale(z);if(!w){console.log("ERROR getting more detailed data: no current data");return}if(!y){y={}}if(w.dataset_type==="bigwig"){y.num_samples=1000*A}return this.load_data(z,B,x,y)},_mark_stale:function(x){var w=this.get_elt(x);if(!w){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),x.toString())}w.stale=true;return w},get_genome_wide_data:function(w){var y=this,A=true,z=u.map(w.get("chroms_info").chrom_info,function(C){var B=y.get_elt(new h({chrom:C.chrom,start:0,end:C.len}));if(!B){A=false}return B});if(A){return z}var x=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(B){y.add_data(B.data);x.resolve(B.data)});return x},subset_entry:function(y,z){var w={bigwig:function(A,B){return u.filter(A,function(C){return C[0]>=B.get("start")&&C[0]<=B.get("end")})},refseq:function(B,C){var D=C.get("start")-y.region.get("start"),A=y.data.length-(y.region.get("end")-C.get("end"));return y.data.slice(D,A)}};var x=y.data;if(!y.region.same(z)&&y.dataset_type in w){x=w[y.dataset_type](y.data,z)}return{region:z,data:x,dataset_type:y.dataset_type}}});var r=d.extend({initialize:function(w){var x=new Backbone.Model();x.urlRoot=w.data_url;this.set("dataset",x)},load_data:function(y,z,w,x){return(y.length()<=100000?d.prototype.load_data.call(this,y,z,w,x):{data:null,region:y})}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(w){this.id=w.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(w){var x=u.find(this.get_chroms_info(),function(y){return y.chrom===w});return new h({chrom:x.chrom,end:x.len})},get_chrom_len:function(w){return u.find(this.get_chroms_info(),function(x){return x.chrom===w}).len}});var h=Backbone.Model.extend({defaults:{chrom:null,start:0,end:0,str_val:null,genome:null},same:function(w){return this.attributes.chrom===w.get("chrom")&&this.attributes.start===w.get("start")&&this.attributes.end===w.get("end")},initialize:function(x){if(x.from_str){var z=x.from_str.split(":"),y=z[0],w=z[1].split("-");this.set({chrom:y,start:parseInt(w[0],10),end:parseInt(w[1],10)})}this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end");this.on("change",function(){this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},this)},copy:function(){return new h({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.attributes.str_val},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(D){var x=this.get("chrom"),C=D.get("chrom"),B=this.get("start"),z=D.get("start"),A=this.get("end"),y=D.get("end"),w;if(x&&C&&x!==C){return h.overlap_results.DIF_CHROMS}if(B<z){if(A<z){w=h.overlap_results.BEFORE}else{if(A<y){w=h.overlap_results.OVERLAP_START}else{w=h.overlap_results.CONTAINS}}}else{if(B>z){if(B>y){w=h.overlap_results.AFTER}else{if(A<=y){w=h.overlap_results.CONTAINED_BY}else{w=h.overlap_results.OVERLAP_END}}}else{w=(A>=y?h.overlap_results.CONTAINS:h.overlap_results.CONTAINED_BY)}}return w},trim:function(w){if(this.attributes.start<0){this.attributes.start=0}if(this.attributes.genome){var x=this.attributes.genome.get_chrom_len(this.attributes.chrom);if(this.attributes.end>x){this.attributes.end=x-1}}return this},contains:function(w){return this.compute_overlap(w)===h.overlap_results.CONTAINS},overlaps:function(w){return u.intersection([this.compute_overlap(w)],[h.overlap_results.DIF_CHROMS,h.overlap_results.BEFORE,h.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var o=Backbone.Collection.extend({model:h});var e=Backbone.Model.extend({defaults:{region:null,note:""},initialize:function(w){this.set("region",new h(w.region))}});var t=Backbone.Collection.extend({model:e});var v=Backbone.Model.extend(f).extend({defaults:{mode:"Auto"},initialize:function(w){this.set("dataset",new k.Dataset(w.dataset));this.set("config",q.ConfigSettingCollection.from_config_dict(w.prefs));this.get("config").add([{key:"name",value:this.get("dataset").get("name")},{key:"color"}]);var x=this.get("preloaded_data");if(x){x=x.data}else{x=[]}this.set("data_manager",new d({dataset:this.get("dataset"),init_data:x}))}},{to_json_keys:["track_type","dataset","prefs","mode","filters","tool_state"],to_json_mappers:{prefs:function(x,w){if(u.size(x)===0){x={name:w.get("config").get("name").get("value"),color:w.get("config").get("color").get("value")}}return x},dataset:function(w){return{id:w.id,hda_ldda:w.get("hda_ldda")}}}});var j=Backbone.Collection.extend({model:v});var p=Backbone.Model.extend({defaults:{title:"",type:""},url:galaxy_config.root+"visualization/save",save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var m=p.extend(f).extend({defaults:u.extend({},p.prototype.defaults,{dbkey:"",drawables:null,bookmarks:null,viewport:null}),initialize:function(w){this.set("drawables",new j(w.tracks));this.set("config",q.ConfigSettingCollection.from_config_dict(w.prefs||{}));this.unset("tracks");this.get("drawables").each(function(x){x.unset("preloaded_data")})},add_tracks:function(w){this.get("drawables").add(w)}},{to_json_keys:["view","viewport","bookmarks"],to_json_mappers:{view:function(x,w){return{obj_type:"View",prefs:{name:w.get("title"),content_visible:true},drawables:w.get("drawables")}}}});var b=Backbone.Model.extend({});var i=Backbone.Router.extend({initialize:function(x){this.view=x.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var w=this;w.view.on("navigate",function(y){w.navigate(y)})},change_location:function(w){this.view.go_to(w)}});return{BackboneTrack:v,BrowserBookmark:e,BrowserBookmarkCollection:t,Cache:s,CanvasManager:g,Genome:c,GenomeDataManager:d,GenomeRegion:h,GenomeRegionCollection:o,GenomeVisualization:m,GenomeReferenceDataManager:r,TrackBrowserRouter:i,TrackConfig:b,Visualization:p,select_datasets:a}});
\ No newline at end of file
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r c98072c51cf05de686c631739a5deb18c15734bf static/scripts/viz/circster.js
--- a/static/scripts/viz/circster.js
+++ b/static/scripts/viz/circster.js
@@ -143,8 +143,8 @@
this.chords_views = null;
// When tracks added to/removed from model, update view.
- this.model.get('tracks').on('add', this.add_track, this);
- this.model.get('tracks').on('remove', this.remove_track, this);
+ this.model.get('drawables').on('add', this.add_track, this);
+ this.model.get('drawables').on('remove', this.remove_track, this);
this.get_circular_tracks();
},
@@ -154,7 +154,7 @@
* Returns tracks to be rendered using circular view.
*/
get_circular_tracks: function() {
- return this.model.get('tracks').filter(function(track) {
+ return this.model.get('drawables').filter(function(track) {
return track.get('track_type') !== 'DiagonalHeatmapTrack';
});
},
@@ -163,7 +163,7 @@
* Returns tracks to be rendered using chords view.
*/
get_chord_tracks: function() {
- return this.model.get('tracks').filter(function(track) {
+ return this.model.get('drawables').filter(function(track) {
return track.get('track_type') === 'DiagonalHeatmapTrack';
});
},
@@ -992,41 +992,36 @@
// setup menu
var menu = create_icon_buttons_menu([
- { icon_class: 'plus-button', title: 'Add tracks', on_click: function()
+ {
+ icon_class: 'plus-button', title: 'Add tracks', on_click: function()
{
visualization.select_datasets(galaxy_config.root + "visualization/list_current_history_datasets", galaxy_config.root + "api/datasets", vis.get('dbkey'), function(tracks)
{
vis.add_tracks(tracks);
});
}
- },{
+ },
+ {
icon_class: 'disk--arrow', title: 'Save', on_click: function()
{
// show saving dialog box
Galaxy.modal.show({title: "Saving...", body: "progress" });
- // link configuration
- var view = galaxy_config.app.viz_config;
-
// send to server
$.ajax({
url: galaxy_config.root + "visualization/save",
type: "POST",
dataType: "json",
data: {
- 'id' : view.vis_id,
- 'title' : view.title,
- 'dbkey' : view.dbkey,
+ 'id' : vis.get('vis_id'),
+ 'title' : vis.get('title'),
+ 'dbkey' : vis.get('dbkey'),
'type' : 'trackster',
- 'vis_json' : JSON.stringify(view)
+ 'vis_json' : JSON.stringify(vis)
}
}).success(function(vis_info) {
Galaxy.modal.hide();
- view.vis_id = vis_info.vis_id;
- view.has_changes = false;
-
- // needed to set URL when first saving a visualization
- window.history.pushState({}, "", vis_info.url + window.location.hash);
+ vis.set('vis_id', vis_info.vis_id);
}).error(function() {
// show dialog
Galaxy.modal.show({
@@ -1036,7 +1031,8 @@
});
});
}
- },{
+ },
+ {
icon_class: 'cross-circle', title: 'Close', on_click: function()
{
window.location = galaxy_config.root + "visualization/list";
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r c98072c51cf05de686c631739a5deb18c15734bf static/scripts/viz/visualization.js
--- a/static/scripts/viz/visualization.js
+++ b/static/scripts/viz/visualization.js
@@ -1,6 +1,28 @@
define( ["libs/underscore", "mvc/data", "viz/trackster/util", "utils/config"], function(_, data_mod, util_mod, config_mod) {
/**
+ * Mixin for returning custom JSON representation from toJSON. Class attribute to_json_keys defines a set of attributes
+ * to include in the representation; to_json_mappers defines mappers for returned objects.
+ */
+var CustomToJSON = {
+ /**
+ * Returns JSON representation of object using to_json_keys and to_json_mappers.
+ */
+ toJSON: function() {
+ var self = this,
+ json = {};
+ _.each(self.constructor.to_json_keys, function(k) {
+ var val = self.get(k);
+ if (k in self.constructor.to_json_mappers) {
+ val = self.constructor.to_json_mappers[k](val, self);
+ }
+ json[k] = val;
+ });
+ return json;
+ }
+};
+
+/**
* Model, view, and controller objects for Galaxy visualization framework.
*
* Models have no references to views, instead using events to indicate state
@@ -872,7 +894,10 @@
* A track of data in a genome visualization.
*/
// TODO: rename to Track and merge with Trackster's Track object.
-var BackboneTrack = Backbone.Model.extend({
+var BackboneTrack = Backbone.Model.extend(CustomToJSON).extend({
+ defaults: {
+ mode: 'Auto'
+ },
initialize: function(options) {
this.set('dataset', new data_mod.Dataset(options.dataset));
@@ -883,7 +908,7 @@
// Set up some minimal config.
this.get('config').add( [
- { key: 'name', value: this.get('name') },
+ { key: 'name', value: this.get('dataset').get('name') },
{ key: 'color' }
] );
@@ -900,6 +925,34 @@
init_data: preloaded_data
}));
}
+},
+{
+ // This definition matches that produced by to_dict() methods in tracks.js
+ to_json_keys: [
+ 'track_type',
+ 'dataset',
+ 'prefs',
+ 'mode',
+ 'filters',
+ 'tool_state'
+ ],
+ to_json_mappers: {
+ prefs: function(p, self) {
+ if (_.size(p) === 0) {
+ p = {
+ name: self.get('config').get('name').get('value'),
+ color: self.get('config').get('color').get('value')
+ };
+ }
+ return p;
+ },
+ dataset: function(d) {
+ return {
+ id: d.id,
+ hda_ldda: d.get('hda_ldda')
+ };
+ }
+ }
});
var BackboneTrackCollection = Backbone.Collection.extend({
@@ -938,25 +991,55 @@
/**
* A visualization of genome data.
*/
-var GenomeVisualization = Visualization.extend({
+var GenomeVisualization = Visualization.extend(CustomToJSON).extend({
defaults: _.extend({}, Visualization.prototype.defaults, {
dbkey: '',
- tracks: null,
+ drawables: null,
bookmarks: null,
viewport: null
}),
initialize: function(options) {
- this.set('tracks', new BackboneTrackCollection(options.tracks));
+ // Replace drawables with tracks.
+ this.set('drawables', new BackboneTrackCollection(options.tracks));
+ this.set('config', config_mod.ConfigSettingCollection.from_config_dict(options.prefs || {}));
+
+ // Clear track and data definitions to avoid storing large objects.
+ this.unset('tracks');
+ this.get('drawables').each(function(d) {
+ d.unset('preloaded_data');
+ });
},
/**
* Add a track or array of tracks to the visualization.
*/
add_tracks: function(tracks) {
- this.get('tracks').add(tracks);
+ this.get('drawables').add(tracks);
}
-});
+},
+{
+ // This definition matches that produced by to_dict() methods in tracks.js
+ to_json_keys: [
+ 'view',
+ 'viewport',
+ 'bookmarks'
+ ],
+
+ to_json_mappers: {
+ 'view': function(dummy, self) {
+ return {
+ obj_type: 'View',
+ prefs: {
+ name: self.get('title'),
+ content_visible: true
+ },
+ drawables: self.get('drawables')
+ };
+ }
+ }
+}
+);
/**
* Configuration data for a Trackster track.
https://bitbucket.org/galaxy/galaxy-central/commits/90b76033686b/
Changeset: 90b76033686b
User: jeremy goecks
Date: 2014-02-05 22:23:24
Summary: Merge local into default.
Affected #: 3 files
diff -r c98072c51cf05de686c631739a5deb18c15734bf -r 90b76033686b5c363bca32edf7f6c292a1d0d080 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1605,46 +1605,46 @@
.history-panel .dataset:last-child{border-width:1px 0px 1px 0px}
.history-panel .empty-history-message{display:none;margin:0px 10px 0px 10px}
.history-panel .tag-button{display:inline-block;height:20px;margin:2px 2px 0px 0px;border:1px solid grey;border-radius:3px 10px 10px 3px;padding:2px 4px 2px 4px;background-color:#EEE;line-height:13px}.history-panel .tag-button .tag-name{margin-right:2px}
-.dataset{border:1px solid #bfbfbf}.dataset .vertical-spacing{margin-bottom:8px}
-.dataset .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
-.dataset .dataset-padding{padding:6px 10px 6px 8px}
-.dataset [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
-.dataset .help-text{font-weight:normal;color:#555}
-.dataset .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
-.dataset .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
-.dataset .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
-.dataset .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .dataset-primary-actions .icon-btn{margin-left:2px}
-.dataset .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
-.dataset .dataset-body label{margin:0px;padding:0px;font-weight:normal}
-.dataset .dataset-body .prompt{font-weight:normal;color:#555}
-.dataset .dataset-body .prompt:after{content:':'}
-.dataset .dataset-body .dataset-summary{margin-bottom:8px}.dataset .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
-.dataset .dataset-body .dataset-summary .dataset-datatype,.dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset .dataset-body .dataset-summary .dataset-datatype .value,.dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
-.dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
-.dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
-.dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
-.dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
-.dataset .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
-.dataset .dataset-body .dataset-actions .right{float:right}.dataset .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
-.dataset .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset .dataset-body .tags-display .select2-container{min-width:0px}.dataset .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
-.dataset .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
-.dataset .dataset-body .annotation-display .annotation:empty{height:22px}
-.dataset .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
-.dataset .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
-.dataset .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
-.dataset .dataset-body .dataset-peek{margin-bottom:8px}.dataset .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
-.dataset .dataset-body .dataset-peek pre.peek table,.dataset .dataset-body .dataset-peek pre.peek th,.dataset .dataset-body .dataset-peek pre.peek tr,.dataset .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
-.dataset .icon-btn-group{display:inline-block}.dataset .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
+.dataset.hda{border:1px solid #bfbfbf}.dataset.hda .vertical-spacing{margin-bottom:8px}
+.dataset.hda .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
+.dataset.hda .dataset-padding{padding:6px 10px 6px 8px}
+.dataset.hda [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
+.dataset.hda .help-text{font-weight:normal;color:#555}
+.dataset.hda .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
+.dataset.hda .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
+.dataset.hda .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
+.dataset.hda .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset.hda .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .dataset-primary-actions .icon-btn{margin-left:2px}
+.dataset.hda .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset.hda .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
+.dataset.hda .dataset-body label{margin:0px;padding:0px;font-weight:normal}
+.dataset.hda .dataset-body .prompt{font-weight:normal;color:#555}
+.dataset.hda .dataset-body .prompt:after{content:':'}
+.dataset.hda .dataset-body .dataset-summary{margin-bottom:8px}.dataset.hda .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
+.dataset.hda .dataset-body .dataset-summary .dataset-datatype,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
+.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
+.dataset.hda .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset.hda .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.dataset.hda .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
+.dataset.hda .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset.hda .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
+.dataset.hda .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-actions .right{float:right}.dataset.hda .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
+.dataset.hda .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .tags-display .select2-container{min-width:0px}.dataset.hda .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
+.dataset.hda .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
+.dataset.hda .dataset-body .annotation-display .annotation:empty{height:22px}
+.dataset.hda .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
+.dataset.hda .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
+.dataset.hda .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-peek{margin-bottom:8px}.dataset.hda .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset.hda .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
+.dataset.hda .dataset-body .dataset-peek pre.peek table,.dataset.hda .dataset-body .dataset-peek pre.peek th,.dataset.hda .dataset-body .dataset-peek pre.peek tr,.dataset.hda .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
+.dataset.hda .icon-btn-group{display:inline-block}.dataset.hda .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.state-icon-running{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.state-icon-running:before{content:"\f110"}
.state-icon-upload{overflow:hidden}.state-icon-upload:before{display:inline-block;-webkit-animation:eclipse 2s infinite linear;-moz-animation:eclipse 2s infinite linear;-o-animation:eclipse 2s infinite linear;animation:eclipse 2s infinite linear;content:"\f062"}@-moz-keyframes eclipse{0%{-moz-transform:translate(0, 16px)} 100%{-moz-transform:translate(0, -16px)}}@-webkit-keyframes eclipse{0%{-webkit-transform:translate(0, 16px)} 100%{-webkit-transform:translate(0, -16px)}}@-o-keyframes eclipse{0%{-o-transform:translate(0, 16px)} 100%{-o-transform:translate(0, -16px)}}@-ms-keyframes eclipse{0%{-ms-transform:translate(0, 16px)} 100%{-ms-transform:translate(0, -16px)}}@keyframes eclipse{0%{transform:translate(0, 16px)} 100%{transform:translate(0, -16px)}}
diff -r c98072c51cf05de686c631739a5deb18c15734bf -r 90b76033686b5c363bca32edf7f6c292a1d0d080 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -269,7 +269,7 @@
}
// ---------------------------------------------------------------------------- datasets
-.dataset {
+.dataset.hda {
border: 1px solid @border-default-color;
// body mixins
@@ -512,7 +512,7 @@
}
-.dataset .state-icon {
+.dataset.hda .state-icon {
.fa-icon;
display: inline-block;
vertical-align: middle;
diff -r c98072c51cf05de686c631739a5deb18c15734bf -r 90b76033686b5c363bca32edf7f6c292a1d0d080 templates/webapps/galaxy/dataset/embed.mako
--- a/templates/webapps/galaxy/dataset/embed.mako
+++ b/templates/webapps/galaxy/dataset/embed.mako
@@ -4,10 +4,10 @@
%><%def name="render_item_links( dataset )">
- <a href="${h.url_for( controller='/dataset', action='display', dataset_id=trans.security.encode_id( dataset.id ), to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk tooltip"></a>
+ <a href="${h.url_for( controller='/dataset', action='display', dataset_id=trans.security.encode_id( dataset.id ), to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk"></a>
## Links for importing and viewing an item.
- <a href="${h.url_for( controller='/dataset', action='imp', dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset" class="icon-button import tooltip"></a>
- <a class="icon-button go-to-full-screen tooltip" href="${h.url_for( controller='/dataset', action='display_by_username_and_slug', username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id ) )}" title="Go to dataset"></a>
+ <a href="${h.url_for( controller='/dataset', action='imp', dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset" class="icon-button import"></a>
+ <a class="icon-button go-to-full-screen" href="${h.url_for( controller='/dataset', action='display_by_username_and_slug', username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id ) )}" title="Go to dataset"></a></%def>
https://bitbucket.org/galaxy/galaxy-central/commits/d557d5dd942f/
Changeset: d557d5dd942f
Branch: next-stable
User: jeremy goecks
Date: 2014-02-05 22:24:21
Summary: Automated merge.
Affected #: 4 files
diff -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 -r d557d5dd942f5bbf820e19ec3fe7278401489555 static/scripts/packed/viz/circster.js
--- a/static/scripts/packed/viz/circster.js
+++ b/static/scripts/packed/viz/circster.js
@@ -1,1 +1,1 @@
-define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("tracks").on("add",this.add_track,this);this.model.get("tracks").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("tracks").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("tracks").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});var s=galaxy_config.app.viz_config;$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:s.vis_id,title:s.title,dbkey:s.dbkey,type:"trackster",vis_json:JSON.stringify(s)}}).success(function(t){Galaxy.modal.hide();s.vis_id=t.vis_id;s.has_changes=false;window.history.pushState({},"",t.url+window.location.hash)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
+define(["utils/utils","libs/underscore","libs/d3","viz/visualization"],function(g,h,m,j){g.cssLoadFile("static/style/circster.css");var n=Backbone.Model.extend({is_visible:function(r,o){var p=r.getBoundingClientRect(),q=$("svg")[0].getBoundingClientRect();if(p.right<0||p.left>q.right||p.bottom<0||p.top>q.bottom){return false}return true}});var i={drawTicks:function(s,r,w,q,o){var v=s.append("g").selectAll("g").data(r).enter().append("g").selectAll("g").data(w).enter().append("g").attr("class","tick").attr("transform",function(x){return"rotate("+(x.angle*180/Math.PI-90)+")translate("+x.radius+",0)"});var u=[],t=[],p=function(x){return x.angle>Math.PI?"end":null};if(o){u=[0,0,0,-4];t=[4,0,"",".35em"];p=null}else{u=[1,0,4,0];t=[0,4,".35em",""]}v.append("line").attr("x1",u[0]).attr("y1",u[1]).attr("x2",u[2]).attr("y1",u[3]).style("stroke","#000");v.append("text").attr("x",t[0]).attr("y",t[1]).attr("dx",t[2]).attr("dy",t[3]).attr("text-anchor",p).attr("transform",q).text(function(x){return x.label})},formatNum:function(p,o){if(o===undefined){o=2}if(p===null){return null}var r=null;if(p<1){r=p.toPrecision(o)}else{var q=Math.round(p.toPrecision(o));if(p<1000){r=q}else{if(p<1000000){r=Math.round((q/1000).toPrecision(3)).toFixed(0)+"K"}else{if(p<1000000000){r=Math.round((q/1000000).toPrecision(3)).toFixed(0)+"M"}}}}return r}};var c=Backbone.Model.extend({});var a=Backbone.View.extend({className:"circster",initialize:function(o){this.total_gap=o.total_gap;this.genome=o.genome;this.dataset_arc_height=o.dataset_arc_height;this.track_gap=10;this.label_arc_height=50;this.scale=1;this.circular_views=null;this.chords_views=null;this.model.get("drawables").on("add",this.add_track,this);this.model.get("drawables").on("remove",this.remove_track,this);this.get_circular_tracks()},get_circular_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")!=="DiagonalHeatmapTrack"})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(o){return o.get("track_type")==="DiagonalHeatmapTrack"})},get_tracks_bounds:function(){var p=this.get_circular_tracks();dataset_arc_height=this.dataset_arc_height,min_dimension=Math.min(this.$el.width(),this.$el.height()),radius_start=min_dimension/2-p.length*(this.dataset_arc_height+this.track_gap)-(this.label_arc_height+this.track_gap),tracks_start_radii=m.range(radius_start,min_dimension/2,this.dataset_arc_height+this.track_gap);var o=this;return h.map(tracks_start_radii,function(q){return[q,q+o.dataset_arc_height]})},render:function(){var x=this,r=this.dataset_arc_height,o=x.$el.width(),w=x.$el.height(),t=this.get_circular_tracks(),q=this.get_chord_tracks(),s=this.get_tracks_bounds(),p=m.select(x.$el[0]).append("svg").attr("width",o).attr("height",w).attr("pointer-events","all").append("svg:g").call(m.behavior.zoom().on("zoom",function(){var y=m.event.scale;p.attr("transform","translate("+m.event.translate+") scale("+y+")");if(x.scale!==y){if(x.zoom_drag_timeout){clearTimeout(x.zoom_drag_timeout)}x.zoom_drag_timeout=setTimeout(function(){},400)}})).attr("transform","translate("+o/2+","+w/2+")").append("svg:g").attr("class","tracks");this.circular_views=t.map(function(z,A){var y=new d({el:p.append("g")[0],track:z,radius_bounds:s[A],genome:x.genome,total_gap:x.total_gap});y.render();return y});this.chords_views=q.map(function(z){var y=new k({el:p.append("g")[0],track:z,radius_bounds:s[0],genome:x.genome,total_gap:x.total_gap});y.render();return y});var v=this.circular_views[this.circular_views.length-1].radius_bounds[1],u=[v,v+this.label_arc_height];this.label_track_view=new b({el:p.append("g")[0],track:new c(),radius_bounds:u,genome:x.genome,total_gap:x.total_gap});this.label_track_view.render()},add_track:function(u){if(u.get("track_type")==="DiagonalHeatmapTrack"){var q=this.circular_views[0].radius_bounds,t=new k({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:q,genome:this.genome,total_gap:this.total_gap});t.render();this.chords_views.push(t)}else{var s=this.get_tracks_bounds();h.each(this.circular_views,function(v,w){v.update_radius_bounds(s[w])});h.each(this.chords_views,function(v){v.update_radius_bounds(s[0])});var r=this.circular_views.length,o=new d({el:m.select("g.tracks").append("g")[0],track:u,radius_bounds:s[r],genome:this.genome,total_gap:this.total_gap});o.render();this.circular_views.push(o);var p=s[s.length-1];p[1]=p[0];this.label_track_view.update_radius_bounds(p)}},remove_track:function(p,r,q){var o=this.circular_views[q.index];this.circular_views.splice(q.index,1);o.$el.remove();var s=this.get_tracks_bounds();h.each(this.circular_views,function(t,u){t.update_radius_bounds(s[u])})}});var l=Backbone.View.extend({tagName:"g",initialize:function(o){this.bg_stroke="ccc";this.loading_bg_fill="000";this.bg_fill="ccc";this.total_gap=o.total_gap;this.track=o.track;this.radius_bounds=o.radius_bounds;this.genome=o.genome;this.chroms_layout=this._chroms_layout();this.data_bounds=[];this.scale=1;this.parent_elt=m.select(this.$el[0])},get_fill_color:function(){var o=this.track.get("config").get_value("block_color");if(!o){o=this.track.get("config").get_value("color")}return o},render:function(){var s=this.parent_elt;if(!s){console.log("no parent elt")}var r=this.chroms_layout,u=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),o=s.selectAll("g").data(r).enter().append("svg:g"),q=o.append("path").attr("d",u).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);q.append("title").text(function(w){return w.data.chrom});var p=this,t=p.track.get("data_manager"),v=(t?t.data_is_ready():true);$.when(v).then(function(){$.when(p._render_data(s)).then(function(){q.style("fill",p.bg_fill);p.render_labels()})})},render_labels:function(){},update_radius_bounds:function(p){this.radius_bounds=p;var o=m.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1000).attr("d",o);this._transition_chrom_data();this._transition_labels()},update_scale:function(r){var q=this.scale;this.scale=r;if(r<=q){return}var p=this,o=new n();this.parent_elt.selectAll("path.chrom-data").filter(function(t,s){return o.is_visible(this)}).each(function(y,u){var x=m.select(this),t=x.attr("chrom"),w=p.genome.get_chrom_region(t),v=p.track.get("data_manager"),s;if(!v.can_get_more_detailed_data(w)){return}s=p.track.get("data_manager").get_more_detailed_data(w,"Coverage",0,r);$.when(s).then(function(B){x.remove();p._update_data_bounds();var A=h.find(p.chroms_layout,function(C){return C.data.chrom===t});var z=p.get_fill_color();p._render_chrom_data(p.parent_elt,A,B).style("stroke",z).style("fill",z)})});return p},_transition_chrom_data:function(){var p=this.track,r=this.chroms_layout,o=this.parent_elt.selectAll("g>path.chrom-data"),s=o[0].length;if(s>0){var q=this;$.when(p.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){var t=h.reject(h.map(u,function(v,w){var x=null,y=q._get_path_function(r[w],v);if(y){x=y(v.data)}return x}),function(v){return v===null});o.each(function(w,v){m.select(this).transition().duration(1000).attr("d",t[v])})})}},_transition_labels:function(){},_update_data_bounds:function(){var o=this.data_bounds;this.data_bounds=this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome));if(this.data_bounds[0]<o[0]||this.data_bounds[1]>o[1]){this._transition_chrom_data()}},_render_data:function(r){var q=this,p=this.chroms_layout,o=this.track,s=$.Deferred();$.when(o.get("data_manager").get_genome_wide_data(this.genome)).then(function(u){q.data_bounds=q.get_data_bounds(u);layout_and_data=h.zip(p,u),chroms_data_layout=h.map(layout_and_data,function(v){var w=v[0],x=v[1];return q._render_chrom_data(r,w,x)});var t=q.get_fill_color();q.parent_elt.selectAll("path.chrom-data").style("stroke",t).style("fill",t);s.resolve(r)});return s},_render_chrom_data:function(o,p,q){},_get_path_function:function(p,o){},_chroms_layout:function(){var p=this.genome.get_chroms_info(),r=m.layout.pie().value(function(t){return t.len}).sort(null),s=r(p),o=this.total_gap/p.length,q=h.map(s,function(v,u){var t=v.endAngle-o;v.endAngle=(t>v.startAngle?t:v.startAngle);return v});return q}});var b=l.extend({initialize:function(o){l.prototype.initialize.call(this,o);this.innerRadius=this.radius_bounds[0];this.radius_bounds[0]=this.radius_bounds[1];this.bg_stroke="fff";this.bg_fill="fff";this.min_arc_len=0.05},_render_data:function(q){var p=this,o=q.selectAll("g");o.selectAll("path").attr("id",function(u){return"label-"+u.data.chrom});o.append("svg:text").filter(function(u){return u.endAngle-u.startAngle>p.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(u){return"#label-"+u.data.chrom}).attr("startOffset","25%").text(function(u){return u.data.chrom});var r=function(w){var u=(w.endAngle-w.startAngle)/w.value,v=m.range(0,w.value,25000000).map(function(x,y){return{radius:p.innerRadius,angle:x*u+w.startAngle,label:y===0?0:(y%3?null:p.formatNum(x))}});if(v.length<4){v[v.length-1].label=p.formatNum(Math.round((v[v.length-1].angle-w.startAngle)/u))}return v};var t=function(u){return u.angle>Math.PI?"rotate(180)translate(-16)":null};var s=h.filter(this.chroms_layout,function(u){return u.endAngle-u.startAngle>p.min_arc_len});this.drawTicks(this.parent_elt,s,r,t)}});h.extend(b.prototype,i);var f=l.extend({_quantile:function(p,o){p.sort(m.ascending);return m.quantile(p,o)},_render_chrom_data:function(o,r,p){var s=this._get_path_function(r,p);if(!s){return null}var q=o.datum(p.data),t=q.append("path").attr("class","chrom-data").attr("chrom",r.data.chrom).attr("d",s);return t},_get_path_function:function(r,q){if(typeof q==="string"||!q.data||q.data.length===0){return null}var o=m.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(true);var s=m.scale.linear().domain([0,q.data.length]).range([r.startAngle,r.endAngle]);var p=m.svg.line.radial().interpolate("linear").radius(function(t){return o(t[1])}).angle(function(u,t){return s(t)});return m.svg.area.radial().interpolate(p.interpolate()).innerRadius(o(0)).outerRadius(p.radius()).angle(p.angle())},render_labels:function(){var o=this,p=function(){return"rotate(90)"};this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),p,true)},_transition_labels:function(){if(this.data_bounds.length===0){return}var p=this,r=h.filter(this.chroms_layout,function(s){return s.endAngle-s.startAngle>0.08}),q=h.filter(r,function(t,s){return s%3===0}),o=h.flatten(h.map(q,function(s){return p._data_bounds_ticks_fn()(s)}));this.parent_elt.selectAll("g.tick").data(o).transition().attr("transform",function(s){return"rotate("+(s.angle*180/Math.PI-90)+")translate("+s.radius+",0)"})},_data_bounds_ticks_fn:function(){var o=this;visibleChroms=0;return function(p){return[{radius:o.radius_bounds[0],angle:p.startAngle,label:o.formatNum(o.data_bounds[0])},{radius:o.radius_bounds[1],angle:p.startAngle,label:o.formatNum(o.data_bounds[1])}]}},get_data_bounds:function(o){}});h.extend(f.prototype,i);var d=f.extend({get_data_bounds:function(p){var o=h.flatten(h.map(p,function(q){if(q){return h.map(q.data,function(r){return parseInt(r[1],10)||0})}else{return 0}}));return[h.min(o),this._quantile(o,0.98)||h.max(o)]}});var k=l.extend({render:function(){var o=this;$.when(o.track.get("data_manager").data_is_ready()).then(function(){$.when(o.track.get("data_manager").get_genome_wide_data(o.genome)).then(function(r){var q=[],p=o.genome.get_chroms_info();h.each(r,function(v,u){var s=p[u].chrom;var t=h.map(v.data,function(x){var w=o._get_region_angle(s,x[1]),y=o._get_region_angle(x[3],x[4]);return{source:{startAngle:w,endAngle:w+0.01},target:{startAngle:y,endAngle:y+0.01}}});q=q.concat(t)});o.parent_elt.append("g").attr("class","chord").selectAll("path").data(q).enter().append("path").style("fill",o.get_fill_color()).attr("d",m.svg.chord().radius(o.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(o){this.radius_bounds=o;this.parent_elt.selectAll("path").transition().attr("d",m.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(q,o){var p=h.find(this.chroms_layout,function(r){return r.data.chrom===q});return p.endAngle-((p.endAngle-p.startAngle)*(p.data.len-o)/p.data.len)}});var e=Backbone.View.extend({initialize:function(){var o=new j.Genome(galaxy_config.app.genome),p=new j.GenomeVisualization(galaxy_config.app.viz_config),r=new a({el:$("#center .unified-panel-body"),total_gap:2*Math.PI*0.4,genome:o,model:p,dataset_arc_height:25});r.render();$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var q=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){j.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",p.get("dbkey"),function(s){p.add_tracks(s)})}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"});$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:p.get("vis_id"),title:p.get("title"),dbkey:p.get("dbkey"),type:"trackster",vis_json:JSON.stringify(p)}}).success(function(s){Galaxy.modal.hide();p.set("vis_id",s.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});q.$el.attr("style","float: right");$("#center .unified-panel-header-inner").append(q.$el);$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:e}});
\ No newline at end of file
diff -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 -r d557d5dd942f5bbf820e19ec3fe7278401489555 static/scripts/packed/viz/visualization.js
--- a/static/scripts/packed/viz/visualization.js
+++ b/static/scripts/packed/viz/visualization.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(t,j,m,p){var a=function(v,y,x,w){$.ajax({url:v,data:x,error:function(){alert("Grid failed")},success:function(z){Galaxy.modal.show({title:"Select datasets for new tracks",body:z,buttons:{Cancel:function(){Galaxy.modal.hide()},Add:function(){var A=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var B={data_type:"track_config",hda_ldda:"hda"},C=$(this).val();if($(this).attr("name")!=="id"){B.hda_ldda="ldda"}A[A.length]=$.ajax({url:y+"/"+C,data:B,dataType:"json"})});$.when.apply($,A).then(function(){var B=(arguments[0] instanceof Array?$.map(arguments,function(C){return C[0]}):[arguments[0]]);w(B)});Galaxy.modal.hide()}}})}})};var k=function(v){return("promise" in v)};var f=function(v){this.default_font=v!==undefined?v:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};t.extend(f.prototype,{load_pattern:function(v,z){var w=this.patterns,x=this.dummy_context,y=new Image();y.src=galaxy_config.root+"static/images"+z;y.onload=function(){w[v]=x.createPattern(y,"repeat")}},get_pattern:function(v){return this.patterns[v]},new_canvas:function(){var v=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(v)}v.manager=this;return v}});var r=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(v){this.clear()},get_elt:function(x){var y=this.attributes.obj_cache,z=this.attributes.key_ary,w=x.toString(),v=t.indexOf(z,function(A){return A.toString()===w});if(v!==-1){if(y[w].stale){z.splice(v,1);delete y[w]}else{this.move_key_to_end(x,v)}}return y[w]},set_elt:function(x,z){var A=this.attributes.obj_cache,B=this.attributes.key_ary,w=x.toString(),y=this.attributes.num_elements;if(!A[w]){if(B.length>=y){var v=B.shift();delete A[v.toString()]}B.push(x)}A[w]=z;return z},move_key_to_end:function(w,v){this.attributes.key_ary.splice(v,1);this.attributes.key_ary.push(w)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length},most_recently_added:function(){return this.size()===0?null:this.attributes.key_ary[this.attributes.key_ary.length-1]}});var d=r.extend({defaults:t.extend({},r.prototype.defaults,{dataset:null,genome:null,init_data:null,min_region_size:200,filters_manager:null,data_type:"data",data_mode_compatible:function(v,w){return true},can_subset:function(v){return false}}),initialize:function(v){r.prototype.initialize.call(this);var w=this.get("init_data");if(w){this.add_data(w)}},add_data:function(v){if(this.get("num_elements")<v.length){this.set("num_elements",v.length)}var w=this;t.each(v,function(x){w.set_data(x.region,x)})},data_is_ready:function(){var y=this.get("dataset"),x=$.Deferred(),v=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),w=new m.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:y.get("hda_ldda"),data_type:v},dataType:"json"},interval:5000,success_fn:function(z){return z!=="pending"}});$.when(w.go()).then(function(z){x.resolve(z==="ok"||z==="data")});return x},search_features:function(v){var w=this.get("dataset"),x={query:v,hda_ldda:w.get("hda_ldda"),data_type:"features"};return $.getJSON(w.url(),x)},load_data:function(D,C,w,B){var z=this.get("dataset"),y={data_type:this.get("data_type"),chrom:D.get("chrom"),low:D.get("start"),high:D.get("end"),mode:C,resolution:w,hda_ldda:z.get("hda_ldda")};$.extend(y,B);var F=this.get("filters_manager");if(F){var G=[];var v=F.filters;for(var A=0;A<v.length;A++){G.push(v[A].name)}y.filter_cols=JSON.stringify(G)}var x=this,E=$.getJSON(z.url(),y,function(H){H.region=D;x.set_data(D,H)});this.set_data(D,E);return E},get_data:function(C,B,x,z){var D=this.get_elt(C);if(D&&(k(D)||this.get("data_mode_compatible")(D,B))){return D}var E=this.get("key_ary"),v=this.get("obj_cache"),w,A;for(var y=0;y<E.length;y++){w=E[y];if(w.contains(C)){A=true;D=v[w.toString()];if(k(D)||(this.get("data_mode_compatible")(D,B)&&this.get("can_subset")(D))){this.move_key_to_end(w,y);if(!k(D)){var G=this.subset_entry(D,C);this.set(C,G);D=G}return D}}}if(!A&&C.length()<this.attributes.min_region_size){C=C.copy();var F=this.most_recently_added();if(!F||(C.get("start")>F.get("start"))){C.set("end",C.get("start")+this.attributes.min_region_size)}else{C.set("start",C.get("end")-this.attributes.min_region_size)}C.set("genome",this.attributes.genome);C.trim()}return this.load_data(C,B,x,z)},set_data:function(w,v){this.set_elt(w,v)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(D,C,y,B,z){var F=this._mark_stale(D);if(!(F&&this.get("data_mode_compatible")(F,C))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var x=D.get("start");if(z===this.DEEP_DATA_REQ){$.extend(B,{start_val:F.data.length+1})}else{if(z===this.BROAD_DATA_REQ){x=(F.max_high?F.max_high:F.data[F.data.length-1][2])+1}}var E=D.copy().set("start",x);var w=this,A=this.load_data(E,C,y,B),v=$.Deferred();this.set_data(D,v);$.when(A).then(function(G){if(G.data){G.data=F.data.concat(G.data);if(G.max_low){G.max_low=F.max_low}if(G.message){G.message=G.message.replace(/[0-9]+/,G.data.length)}}w.set_data(D,G);v.resolve(G)});return v},can_get_more_detailed_data:function(w){var v=this.get_elt(w);return(v.dataset_type==="bigwig"&&v.data.length<8000)},get_more_detailed_data:function(y,A,w,z,x){var v=this._mark_stale(y);if(!v){console.log("ERROR getting more detailed data: no current data");return}if(!x){x={}}if(v.dataset_type==="bigwig"){x.num_samples=1000*z}return this.load_data(y,A,w,x)},_mark_stale:function(w){var v=this.get_elt(w);if(!v){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),w.toString())}v.stale=true;return v},get_genome_wide_data:function(v){var x=this,z=true,y=t.map(v.get("chroms_info").chrom_info,function(B){var A=x.get_elt(new g({chrom:B.chrom,start:0,end:B.len}));if(!A){z=false}return A});if(z){return y}var w=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(A){x.add_data(A.data);w.resolve(A.data)});return w},subset_entry:function(x,y){var v={bigwig:function(z,A){return t.filter(z,function(B){return B[0]>=A.get("start")&&B[0]<=A.get("end")})},refseq:function(A,B){var C=B.get("start")-x.region.get("start"),z=x.data.length-(x.region.get("end")-B.get("end"));return x.data.slice(C,z)}};var w=x.data;if(!x.region.same(y)&&x.dataset_type in v){w=v[x.dataset_type](x.data,y)}return{region:y,data:w,dataset_type:x.dataset_type}}});var q=d.extend({initialize:function(v){var w=new Backbone.Model();w.urlRoot=v.data_url;this.set("dataset",w)},load_data:function(x,y,v,w){return(x.length()<=100000?d.prototype.load_data.call(this,x,y,v,w):{data:null,region:x})}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(v){this.id=v.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(v){var w=t.find(this.get_chroms_info(),function(x){return x.chrom===v});return new g({chrom:w.chrom,end:w.len})},get_chrom_len:function(v){return t.find(this.get_chroms_info(),function(w){return w.chrom===v}).len}});var g=Backbone.Model.extend({defaults:{chrom:null,start:0,end:0,str_val:null,genome:null},same:function(v){return this.attributes.chrom===v.get("chrom")&&this.attributes.start===v.get("start")&&this.attributes.end===v.get("end")},initialize:function(w){if(w.from_str){var y=w.from_str.split(":"),x=y[0],v=y[1].split("-");this.set({chrom:x,start:parseInt(v[0],10),end:parseInt(v[1],10)})}this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end");this.on("change",function(){this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},this)},copy:function(){return new g({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.attributes.str_val},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(C){var w=this.get("chrom"),B=C.get("chrom"),A=this.get("start"),y=C.get("start"),z=this.get("end"),x=C.get("end"),v;if(w&&B&&w!==B){return g.overlap_results.DIF_CHROMS}if(A<y){if(z<y){v=g.overlap_results.BEFORE}else{if(z<x){v=g.overlap_results.OVERLAP_START}else{v=g.overlap_results.CONTAINS}}}else{if(A>y){if(A>x){v=g.overlap_results.AFTER}else{if(z<=x){v=g.overlap_results.CONTAINED_BY}else{v=g.overlap_results.OVERLAP_END}}}else{v=(z>=x?g.overlap_results.CONTAINS:g.overlap_results.CONTAINED_BY)}}return v},trim:function(v){if(this.attributes.start<0){this.attributes.start=0}if(this.attributes.genome){var w=this.attributes.genome.get_chrom_len(this.attributes.chrom);if(this.attributes.end>w){this.attributes.end=w-1}}return this},contains:function(v){return this.compute_overlap(v)===g.overlap_results.CONTAINS},overlaps:function(v){return t.intersection([this.compute_overlap(v)],[g.overlap_results.DIF_CHROMS,g.overlap_results.BEFORE,g.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var n=Backbone.Collection.extend({model:g});var e=Backbone.Model.extend({defaults:{region:null,note:""},initialize:function(v){this.set("region",new g(v.region))}});var s=Backbone.Collection.extend({model:e});var u=Backbone.Model.extend({initialize:function(v){this.set("dataset",new j.Dataset(v.dataset));this.set("config",p.ConfigSettingCollection.from_config_dict(v.prefs));this.get("config").add([{key:"name",value:this.get("name")},{key:"color"}]);var w=this.get("preloaded_data");if(w){w=w.data}else{w=[]}this.set("data_manager",new d({dataset:this.get("dataset"),init_data:w}))}});var i=Backbone.Collection.extend({model:u});var o=Backbone.Model.extend({defaults:{title:"",type:""},url:galaxy_config.root+"visualization/save",save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var l=o.extend({defaults:t.extend({},o.prototype.defaults,{dbkey:"",tracks:null,bookmarks:null,viewport:null}),initialize:function(v){this.set("tracks",new i(v.tracks))},add_tracks:function(v){this.get("tracks").add(v)}});var b=Backbone.Model.extend({});var h=Backbone.Router.extend({initialize:function(w){this.view=w.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var v=this;v.view.on("navigate",function(x){v.navigate(x)})},change_location:function(v){this.view.go_to(v)}});return{BackboneTrack:u,BrowserBookmark:e,BrowserBookmarkCollection:s,Cache:r,CanvasManager:f,Genome:c,GenomeDataManager:d,GenomeRegion:g,GenomeRegionCollection:n,GenomeVisualization:l,GenomeReferenceDataManager:q,TrackBrowserRouter:h,TrackConfig:b,Visualization:o,select_datasets:a}});
\ No newline at end of file
+define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(u,k,n,q){var f={toJSON:function(){var w=this,x={};u.each(w.constructor.to_json_keys,function(y){var z=w.get(y);if(y in w.constructor.to_json_mappers){z=w.constructor.to_json_mappers[y](z,w)}x[y]=z});return x}};var a=function(w,z,y,x){$.ajax({url:w,data:y,error:function(){alert("Grid failed")},success:function(A){Galaxy.modal.show({title:"Select datasets for new tracks",body:A,buttons:{Cancel:function(){Galaxy.modal.hide()},Add:function(){var B=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var C={data_type:"track_config",hda_ldda:"hda"},D=$(this).val();if($(this).attr("name")!=="id"){C.hda_ldda="ldda"}B[B.length]=$.ajax({url:z+"/"+D,data:C,dataType:"json"})});$.when.apply($,B).then(function(){var C=(arguments[0] instanceof Array?$.map(arguments,function(D){return D[0]}):[arguments[0]]);x(C)});Galaxy.modal.hide()}}})}})};var l=function(w){return("promise" in w)};var g=function(w){this.default_font=w!==undefined?w:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};u.extend(g.prototype,{load_pattern:function(w,A){var x=this.patterns,y=this.dummy_context,z=new Image();z.src=galaxy_config.root+"static/images"+A;z.onload=function(){x[w]=y.createPattern(z,"repeat")}},get_pattern:function(w){return this.patterns[w]},new_canvas:function(){var w=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(w)}w.manager=this;return w}});var s=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(w){this.clear()},get_elt:function(y){var z=this.attributes.obj_cache,A=this.attributes.key_ary,x=y.toString(),w=u.indexOf(A,function(B){return B.toString()===x});if(w!==-1){if(z[x].stale){A.splice(w,1);delete z[x]}else{this.move_key_to_end(y,w)}}return z[x]},set_elt:function(y,A){var B=this.attributes.obj_cache,C=this.attributes.key_ary,x=y.toString(),z=this.attributes.num_elements;if(!B[x]){if(C.length>=z){var w=C.shift();delete B[w.toString()]}C.push(y)}B[x]=A;return A},move_key_to_end:function(x,w){this.attributes.key_ary.splice(w,1);this.attributes.key_ary.push(x)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length},most_recently_added:function(){return this.size()===0?null:this.attributes.key_ary[this.attributes.key_ary.length-1]}});var d=s.extend({defaults:u.extend({},s.prototype.defaults,{dataset:null,genome:null,init_data:null,min_region_size:200,filters_manager:null,data_type:"data",data_mode_compatible:function(w,x){return true},can_subset:function(w){return false}}),initialize:function(w){s.prototype.initialize.call(this);var x=this.get("init_data");if(x){this.add_data(x)}},add_data:function(w){if(this.get("num_elements")<w.length){this.set("num_elements",w.length)}var x=this;u.each(w,function(y){x.set_data(y.region,y)})},data_is_ready:function(){var z=this.get("dataset"),y=$.Deferred(),w=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),x=new n.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:z.get("hda_ldda"),data_type:w},dataType:"json"},interval:5000,success_fn:function(A){return A!=="pending"}});$.when(x.go()).then(function(A){y.resolve(A==="ok"||A==="data")});return y},search_features:function(w){var x=this.get("dataset"),y={query:w,hda_ldda:x.get("hda_ldda"),data_type:"features"};return $.getJSON(x.url(),y)},load_data:function(E,D,x,C){var A=this.get("dataset"),z={data_type:this.get("data_type"),chrom:E.get("chrom"),low:E.get("start"),high:E.get("end"),mode:D,resolution:x,hda_ldda:A.get("hda_ldda")};$.extend(z,C);var G=this.get("filters_manager");if(G){var H=[];var w=G.filters;for(var B=0;B<w.length;B++){H.push(w[B].name)}z.filter_cols=JSON.stringify(H)}var y=this,F=$.getJSON(A.url(),z,function(I){I.region=E;y.set_data(E,I)});this.set_data(E,F);return F},get_data:function(D,C,y,A){var E=this.get_elt(D);if(E&&(l(E)||this.get("data_mode_compatible")(E,C))){return E}var F=this.get("key_ary"),w=this.get("obj_cache"),x,B;for(var z=0;z<F.length;z++){x=F[z];if(x.contains(D)){B=true;E=w[x.toString()];if(l(E)||(this.get("data_mode_compatible")(E,C)&&this.get("can_subset")(E))){this.move_key_to_end(x,z);if(!l(E)){var H=this.subset_entry(E,D);this.set(D,H);E=H}return E}}}if(!B&&D.length()<this.attributes.min_region_size){D=D.copy();var G=this.most_recently_added();if(!G||(D.get("start")>G.get("start"))){D.set("end",D.get("start")+this.attributes.min_region_size)}else{D.set("start",D.get("end")-this.attributes.min_region_size)}D.set("genome",this.attributes.genome);D.trim()}return this.load_data(D,C,y,A)},set_data:function(x,w){this.set_elt(x,w)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(E,D,z,C,A){var G=this._mark_stale(E);if(!(G&&this.get("data_mode_compatible")(G,D))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var y=E.get("start");if(A===this.DEEP_DATA_REQ){$.extend(C,{start_val:G.data.length+1})}else{if(A===this.BROAD_DATA_REQ){y=(G.max_high?G.max_high:G.data[G.data.length-1][2])+1}}var F=E.copy().set("start",y);var x=this,B=this.load_data(F,D,z,C),w=$.Deferred();this.set_data(E,w);$.when(B).then(function(H){if(H.data){H.data=G.data.concat(H.data);if(H.max_low){H.max_low=G.max_low}if(H.message){H.message=H.message.replace(/[0-9]+/,H.data.length)}}x.set_data(E,H);w.resolve(H)});return w},can_get_more_detailed_data:function(x){var w=this.get_elt(x);return(w.dataset_type==="bigwig"&&w.data.length<8000)},get_more_detailed_data:function(z,B,x,A,y){var w=this._mark_stale(z);if(!w){console.log("ERROR getting more detailed data: no current data");return}if(!y){y={}}if(w.dataset_type==="bigwig"){y.num_samples=1000*A}return this.load_data(z,B,x,y)},_mark_stale:function(x){var w=this.get_elt(x);if(!w){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),x.toString())}w.stale=true;return w},get_genome_wide_data:function(w){var y=this,A=true,z=u.map(w.get("chroms_info").chrom_info,function(C){var B=y.get_elt(new h({chrom:C.chrom,start:0,end:C.len}));if(!B){A=false}return B});if(A){return z}var x=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(B){y.add_data(B.data);x.resolve(B.data)});return x},subset_entry:function(y,z){var w={bigwig:function(A,B){return u.filter(A,function(C){return C[0]>=B.get("start")&&C[0]<=B.get("end")})},refseq:function(B,C){var D=C.get("start")-y.region.get("start"),A=y.data.length-(y.region.get("end")-C.get("end"));return y.data.slice(D,A)}};var x=y.data;if(!y.region.same(z)&&y.dataset_type in w){x=w[y.dataset_type](y.data,z)}return{region:z,data:x,dataset_type:y.dataset_type}}});var r=d.extend({initialize:function(w){var x=new Backbone.Model();x.urlRoot=w.data_url;this.set("dataset",x)},load_data:function(y,z,w,x){return(y.length()<=100000?d.prototype.load_data.call(this,y,z,w,x):{data:null,region:y})}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(w){this.id=w.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(w){var x=u.find(this.get_chroms_info(),function(y){return y.chrom===w});return new h({chrom:x.chrom,end:x.len})},get_chrom_len:function(w){return u.find(this.get_chroms_info(),function(x){return x.chrom===w}).len}});var h=Backbone.Model.extend({defaults:{chrom:null,start:0,end:0,str_val:null,genome:null},same:function(w){return this.attributes.chrom===w.get("chrom")&&this.attributes.start===w.get("start")&&this.attributes.end===w.get("end")},initialize:function(x){if(x.from_str){var z=x.from_str.split(":"),y=z[0],w=z[1].split("-");this.set({chrom:y,start:parseInt(w[0],10),end:parseInt(w[1],10)})}this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end");this.on("change",function(){this.attributes.str_val=this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},this)},copy:function(){return new h({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.attributes.str_val},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(D){var x=this.get("chrom"),C=D.get("chrom"),B=this.get("start"),z=D.get("start"),A=this.get("end"),y=D.get("end"),w;if(x&&C&&x!==C){return h.overlap_results.DIF_CHROMS}if(B<z){if(A<z){w=h.overlap_results.BEFORE}else{if(A<y){w=h.overlap_results.OVERLAP_START}else{w=h.overlap_results.CONTAINS}}}else{if(B>z){if(B>y){w=h.overlap_results.AFTER}else{if(A<=y){w=h.overlap_results.CONTAINED_BY}else{w=h.overlap_results.OVERLAP_END}}}else{w=(A>=y?h.overlap_results.CONTAINS:h.overlap_results.CONTAINED_BY)}}return w},trim:function(w){if(this.attributes.start<0){this.attributes.start=0}if(this.attributes.genome){var x=this.attributes.genome.get_chrom_len(this.attributes.chrom);if(this.attributes.end>x){this.attributes.end=x-1}}return this},contains:function(w){return this.compute_overlap(w)===h.overlap_results.CONTAINS},overlaps:function(w){return u.intersection([this.compute_overlap(w)],[h.overlap_results.DIF_CHROMS,h.overlap_results.BEFORE,h.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var o=Backbone.Collection.extend({model:h});var e=Backbone.Model.extend({defaults:{region:null,note:""},initialize:function(w){this.set("region",new h(w.region))}});var t=Backbone.Collection.extend({model:e});var v=Backbone.Model.extend(f).extend({defaults:{mode:"Auto"},initialize:function(w){this.set("dataset",new k.Dataset(w.dataset));this.set("config",q.ConfigSettingCollection.from_config_dict(w.prefs));this.get("config").add([{key:"name",value:this.get("dataset").get("name")},{key:"color"}]);var x=this.get("preloaded_data");if(x){x=x.data}else{x=[]}this.set("data_manager",new d({dataset:this.get("dataset"),init_data:x}))}},{to_json_keys:["track_type","dataset","prefs","mode","filters","tool_state"],to_json_mappers:{prefs:function(x,w){if(u.size(x)===0){x={name:w.get("config").get("name").get("value"),color:w.get("config").get("color").get("value")}}return x},dataset:function(w){return{id:w.id,hda_ldda:w.get("hda_ldda")}}}});var j=Backbone.Collection.extend({model:v});var p=Backbone.Model.extend({defaults:{title:"",type:""},url:galaxy_config.root+"visualization/save",save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var m=p.extend(f).extend({defaults:u.extend({},p.prototype.defaults,{dbkey:"",drawables:null,bookmarks:null,viewport:null}),initialize:function(w){this.set("drawables",new j(w.tracks));this.set("config",q.ConfigSettingCollection.from_config_dict(w.prefs||{}));this.unset("tracks");this.get("drawables").each(function(x){x.unset("preloaded_data")})},add_tracks:function(w){this.get("drawables").add(w)}},{to_json_keys:["view","viewport","bookmarks"],to_json_mappers:{view:function(x,w){return{obj_type:"View",prefs:{name:w.get("title"),content_visible:true},drawables:w.get("drawables")}}}});var b=Backbone.Model.extend({});var i=Backbone.Router.extend({initialize:function(x){this.view=x.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var w=this;w.view.on("navigate",function(y){w.navigate(y)})},change_location:function(w){this.view.go_to(w)}});return{BackboneTrack:v,BrowserBookmark:e,BrowserBookmarkCollection:t,Cache:s,CanvasManager:g,Genome:c,GenomeDataManager:d,GenomeRegion:h,GenomeRegionCollection:o,GenomeVisualization:m,GenomeReferenceDataManager:r,TrackBrowserRouter:i,TrackConfig:b,Visualization:p,select_datasets:a}});
\ No newline at end of file
diff -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 -r d557d5dd942f5bbf820e19ec3fe7278401489555 static/scripts/viz/circster.js
--- a/static/scripts/viz/circster.js
+++ b/static/scripts/viz/circster.js
@@ -143,8 +143,8 @@
this.chords_views = null;
// When tracks added to/removed from model, update view.
- this.model.get('tracks').on('add', this.add_track, this);
- this.model.get('tracks').on('remove', this.remove_track, this);
+ this.model.get('drawables').on('add', this.add_track, this);
+ this.model.get('drawables').on('remove', this.remove_track, this);
this.get_circular_tracks();
},
@@ -154,7 +154,7 @@
* Returns tracks to be rendered using circular view.
*/
get_circular_tracks: function() {
- return this.model.get('tracks').filter(function(track) {
+ return this.model.get('drawables').filter(function(track) {
return track.get('track_type') !== 'DiagonalHeatmapTrack';
});
},
@@ -163,7 +163,7 @@
* Returns tracks to be rendered using chords view.
*/
get_chord_tracks: function() {
- return this.model.get('tracks').filter(function(track) {
+ return this.model.get('drawables').filter(function(track) {
return track.get('track_type') === 'DiagonalHeatmapTrack';
});
},
@@ -992,41 +992,36 @@
// setup menu
var menu = create_icon_buttons_menu([
- { icon_class: 'plus-button', title: 'Add tracks', on_click: function()
+ {
+ icon_class: 'plus-button', title: 'Add tracks', on_click: function()
{
visualization.select_datasets(galaxy_config.root + "visualization/list_current_history_datasets", galaxy_config.root + "api/datasets", vis.get('dbkey'), function(tracks)
{
vis.add_tracks(tracks);
});
}
- },{
+ },
+ {
icon_class: 'disk--arrow', title: 'Save', on_click: function()
{
// show saving dialog box
Galaxy.modal.show({title: "Saving...", body: "progress" });
- // link configuration
- var view = galaxy_config.app.viz_config;
-
// send to server
$.ajax({
url: galaxy_config.root + "visualization/save",
type: "POST",
dataType: "json",
data: {
- 'id' : view.vis_id,
- 'title' : view.title,
- 'dbkey' : view.dbkey,
+ 'id' : vis.get('vis_id'),
+ 'title' : vis.get('title'),
+ 'dbkey' : vis.get('dbkey'),
'type' : 'trackster',
- 'vis_json' : JSON.stringify(view)
+ 'vis_json' : JSON.stringify(vis)
}
}).success(function(vis_info) {
Galaxy.modal.hide();
- view.vis_id = vis_info.vis_id;
- view.has_changes = false;
-
- // needed to set URL when first saving a visualization
- window.history.pushState({}, "", vis_info.url + window.location.hash);
+ vis.set('vis_id', vis_info.vis_id);
}).error(function() {
// show dialog
Galaxy.modal.show({
@@ -1036,7 +1031,8 @@
});
});
}
- },{
+ },
+ {
icon_class: 'cross-circle', title: 'Close', on_click: function()
{
window.location = galaxy_config.root + "visualization/list";
diff -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 -r d557d5dd942f5bbf820e19ec3fe7278401489555 static/scripts/viz/visualization.js
--- a/static/scripts/viz/visualization.js
+++ b/static/scripts/viz/visualization.js
@@ -1,6 +1,28 @@
define( ["libs/underscore", "mvc/data", "viz/trackster/util", "utils/config"], function(_, data_mod, util_mod, config_mod) {
/**
+ * Mixin for returning custom JSON representation from toJSON. Class attribute to_json_keys defines a set of attributes
+ * to include in the representation; to_json_mappers defines mappers for returned objects.
+ */
+var CustomToJSON = {
+ /**
+ * Returns JSON representation of object using to_json_keys and to_json_mappers.
+ */
+ toJSON: function() {
+ var self = this,
+ json = {};
+ _.each(self.constructor.to_json_keys, function(k) {
+ var val = self.get(k);
+ if (k in self.constructor.to_json_mappers) {
+ val = self.constructor.to_json_mappers[k](val, self);
+ }
+ json[k] = val;
+ });
+ return json;
+ }
+};
+
+/**
* Model, view, and controller objects for Galaxy visualization framework.
*
* Models have no references to views, instead using events to indicate state
@@ -872,7 +894,10 @@
* A track of data in a genome visualization.
*/
// TODO: rename to Track and merge with Trackster's Track object.
-var BackboneTrack = Backbone.Model.extend({
+var BackboneTrack = Backbone.Model.extend(CustomToJSON).extend({
+ defaults: {
+ mode: 'Auto'
+ },
initialize: function(options) {
this.set('dataset', new data_mod.Dataset(options.dataset));
@@ -883,7 +908,7 @@
// Set up some minimal config.
this.get('config').add( [
- { key: 'name', value: this.get('name') },
+ { key: 'name', value: this.get('dataset').get('name') },
{ key: 'color' }
] );
@@ -900,6 +925,34 @@
init_data: preloaded_data
}));
}
+},
+{
+ // This definition matches that produced by to_dict() methods in tracks.js
+ to_json_keys: [
+ 'track_type',
+ 'dataset',
+ 'prefs',
+ 'mode',
+ 'filters',
+ 'tool_state'
+ ],
+ to_json_mappers: {
+ prefs: function(p, self) {
+ if (_.size(p) === 0) {
+ p = {
+ name: self.get('config').get('name').get('value'),
+ color: self.get('config').get('color').get('value')
+ };
+ }
+ return p;
+ },
+ dataset: function(d) {
+ return {
+ id: d.id,
+ hda_ldda: d.get('hda_ldda')
+ };
+ }
+ }
});
var BackboneTrackCollection = Backbone.Collection.extend({
@@ -938,25 +991,55 @@
/**
* A visualization of genome data.
*/
-var GenomeVisualization = Visualization.extend({
+var GenomeVisualization = Visualization.extend(CustomToJSON).extend({
defaults: _.extend({}, Visualization.prototype.defaults, {
dbkey: '',
- tracks: null,
+ drawables: null,
bookmarks: null,
viewport: null
}),
initialize: function(options) {
- this.set('tracks', new BackboneTrackCollection(options.tracks));
+ // Replace drawables with tracks.
+ this.set('drawables', new BackboneTrackCollection(options.tracks));
+ this.set('config', config_mod.ConfigSettingCollection.from_config_dict(options.prefs || {}));
+
+ // Clear track and data definitions to avoid storing large objects.
+ this.unset('tracks');
+ this.get('drawables').each(function(d) {
+ d.unset('preloaded_data');
+ });
},
/**
* Add a track or array of tracks to the visualization.
*/
add_tracks: function(tracks) {
- this.get('tracks').add(tracks);
+ this.get('drawables').add(tracks);
}
-});
+},
+{
+ // This definition matches that produced by to_dict() methods in tracks.js
+ to_json_keys: [
+ 'view',
+ 'viewport',
+ 'bookmarks'
+ ],
+
+ to_json_mappers: {
+ 'view': function(dummy, self) {
+ return {
+ obj_type: 'View',
+ prefs: {
+ name: self.get('title'),
+ content_visible: true
+ },
+ drawables: self.get('drawables')
+ };
+ }
+ }
+}
+);
/**
* Configuration data for a Trackster track.
https://bitbucket.org/galaxy/galaxy-central/commits/75a81fcf38c4/
Changeset: 75a81fcf38c4
User: jeremy goecks
Date: 2014-02-05 22:24:47
Summary: Merge next-stable with default.
Affected #: 0 files
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2b8e4f343a9a/
Changeset: 2b8e4f343a9a
Branch: next-stable
User: carlfeberhard
Date: 2014-02-05 22:17:16
Summary: Fix to bootstrap tooltip class hiding icons in embedded datasets within pages
Affected #: 3 files
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1604,46 +1604,46 @@
.history-panel .dataset:last-child{border-width:1px 0px 1px 0px}
.history-panel .empty-history-message{display:none;margin:0px 10px 0px 10px}
.history-panel .tag-button{display:inline-block;height:20px;margin:2px 2px 0px 0px;border:1px solid grey;border-radius:3px 10px 10px 3px;padding:2px 4px 2px 4px;background-color:#EEE;line-height:13px}.history-panel .tag-button .tag-name{margin-right:2px}
-.dataset{border:1px solid #bfbfbf}.dataset .vertical-spacing{margin-bottom:8px}
-.dataset .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
-.dataset .dataset-padding{padding:6px 10px 6px 8px}
-.dataset [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
-.dataset .help-text{font-weight:normal;color:#555}
-.dataset .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
-.dataset .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
-.dataset .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
-.dataset .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .dataset-primary-actions .icon-btn{margin-left:2px}
-.dataset .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
-.dataset .dataset-body label{margin:0px;padding:0px;font-weight:normal}
-.dataset .dataset-body .prompt{font-weight:normal;color:#555}
-.dataset .dataset-body .prompt:after{content:':'}
-.dataset .dataset-body .dataset-summary{margin-bottom:8px}.dataset .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
-.dataset .dataset-body .dataset-summary .dataset-datatype,.dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset .dataset-body .dataset-summary .dataset-datatype .value,.dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
-.dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
-.dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
-.dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
-.dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
-.dataset .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
-.dataset .dataset-body .dataset-actions .right{float:right}.dataset .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
-.dataset .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset .dataset-body .tags-display .select2-container{min-width:0px}.dataset .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
-.dataset .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
-.dataset .dataset-body .annotation-display .annotation:empty{height:22px}
-.dataset .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
-.dataset .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
-.dataset .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
-.dataset .dataset-body .dataset-peek{margin-bottom:8px}.dataset .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
-.dataset .dataset-body .dataset-peek pre.peek table,.dataset .dataset-body .dataset-peek pre.peek th,.dataset .dataset-body .dataset-peek pre.peek tr,.dataset .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
-.dataset .icon-btn-group{display:inline-block}.dataset .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
+.dataset.hda{border:1px solid #bfbfbf}.dataset.hda .vertical-spacing{margin-bottom:8px}
+.dataset.hda .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
+.dataset.hda .dataset-padding{padding:6px 10px 6px 8px}
+.dataset.hda [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
+.dataset.hda .help-text{font-weight:normal;color:#555}
+.dataset.hda .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
+.dataset.hda .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
+.dataset.hda .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
+.dataset.hda .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset.hda .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .dataset-primary-actions .icon-btn{margin-left:2px}
+.dataset.hda .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset.hda .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
+.dataset.hda .dataset-body label{margin:0px;padding:0px;font-weight:normal}
+.dataset.hda .dataset-body .prompt{font-weight:normal;color:#555}
+.dataset.hda .dataset-body .prompt:after{content:':'}
+.dataset.hda .dataset-body .dataset-summary{margin-bottom:8px}.dataset.hda .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
+.dataset.hda .dataset-body .dataset-summary .dataset-datatype,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
+.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
+.dataset.hda .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset.hda .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.dataset.hda .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
+.dataset.hda .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset.hda .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
+.dataset.hda .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-actions .right{float:right}.dataset.hda .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
+.dataset.hda .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .tags-display .select2-container{min-width:0px}.dataset.hda .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
+.dataset.hda .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
+.dataset.hda .dataset-body .annotation-display .annotation:empty{height:22px}
+.dataset.hda .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
+.dataset.hda .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
+.dataset.hda .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-peek{margin-bottom:8px}.dataset.hda .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset.hda .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
+.dataset.hda .dataset-body .dataset-peek pre.peek table,.dataset.hda .dataset-body .dataset-peek pre.peek th,.dataset.hda .dataset-body .dataset-peek pre.peek tr,.dataset.hda .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
+.dataset.hda .icon-btn-group{display:inline-block}.dataset.hda .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.state-icon-running{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.state-icon-running:before{content:"\f110"}
.state-icon-upload{overflow:hidden}.state-icon-upload:before{display:inline-block;-webkit-animation:eclipse 2s infinite linear;-moz-animation:eclipse 2s infinite linear;-o-animation:eclipse 2s infinite linear;animation:eclipse 2s infinite linear;content:"\f062"}@-moz-keyframes eclipse{0%{-moz-transform:translate(0, 16px)} 100%{-moz-transform:translate(0, -16px)}}@-webkit-keyframes eclipse{0%{-webkit-transform:translate(0, 16px)} 100%{-webkit-transform:translate(0, -16px)}}@-o-keyframes eclipse{0%{-o-transform:translate(0, 16px)} 100%{-o-transform:translate(0, -16px)}}@-ms-keyframes eclipse{0%{-ms-transform:translate(0, 16px)} 100%{-ms-transform:translate(0, -16px)}}@keyframes eclipse{0%{transform:translate(0, 16px)} 100%{transform:translate(0, -16px)}}
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -269,7 +269,7 @@
}
// ---------------------------------------------------------------------------- datasets
-.dataset {
+.dataset.hda {
border: 1px solid @border-default-color;
// body mixins
@@ -512,7 +512,7 @@
}
-.dataset .state-icon {
+.dataset.hda .state-icon {
.fa-icon;
display: inline-block;
vertical-align: middle;
diff -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa -r 2b8e4f343a9abe4e936afec8a3d99bf8d9a01ef0 templates/webapps/galaxy/dataset/embed.mako
--- a/templates/webapps/galaxy/dataset/embed.mako
+++ b/templates/webapps/galaxy/dataset/embed.mako
@@ -4,10 +4,10 @@
%><%def name="render_item_links( dataset )">
- <a href="${h.url_for( controller='/dataset', action='display', dataset_id=trans.security.encode_id( dataset.id ), to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk tooltip"></a>
+ <a href="${h.url_for( controller='/dataset', action='display', dataset_id=trans.security.encode_id( dataset.id ), to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk"></a>
## Links for importing and viewing an item.
- <a href="${h.url_for( controller='/dataset', action='imp', dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset" class="icon-button import tooltip"></a>
- <a class="icon-button go-to-full-screen tooltip" href="${h.url_for( controller='/dataset', action='display_by_username_and_slug', username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id ) )}" title="Go to dataset"></a>
+ <a href="${h.url_for( controller='/dataset', action='imp', dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset" class="icon-button import"></a>
+ <a class="icon-button go-to-full-screen" href="${h.url_for( controller='/dataset', action='display_by_username_and_slug', username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id ) )}" title="Go to dataset"></a></%def>
https://bitbucket.org/galaxy/galaxy-central/commits/99beec4c3a33/
Changeset: 99beec4c3a33
User: carlfeberhard
Date: 2014-02-05 22:18:33
Summary: merge
Affected #: 3 files
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r 99beec4c3a338249ab661a7edc3e30ee115486e9 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1605,46 +1605,46 @@
.history-panel .dataset:last-child{border-width:1px 0px 1px 0px}
.history-panel .empty-history-message{display:none;margin:0px 10px 0px 10px}
.history-panel .tag-button{display:inline-block;height:20px;margin:2px 2px 0px 0px;border:1px solid grey;border-radius:3px 10px 10px 3px;padding:2px 4px 2px 4px;background-color:#EEE;line-height:13px}.history-panel .tag-button .tag-name{margin-right:2px}
-.dataset{border:1px solid #bfbfbf}.dataset .vertical-spacing{margin-bottom:8px}
-.dataset .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
-.dataset .dataset-padding{padding:6px 10px 6px 8px}
-.dataset [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
-.dataset .help-text{font-weight:normal;color:#555}
-.dataset .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
-.dataset .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
-.dataset .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
-.dataset .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .dataset-primary-actions .icon-btn{margin-left:2px}
-.dataset .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
-.dataset .dataset-body label{margin:0px;padding:0px;font-weight:normal}
-.dataset .dataset-body .prompt{font-weight:normal;color:#555}
-.dataset .dataset-body .prompt:after{content:':'}
-.dataset .dataset-body .dataset-summary{margin-bottom:8px}.dataset .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
-.dataset .dataset-body .dataset-summary .dataset-datatype,.dataset .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset .dataset-body .dataset-summary .dataset-datatype .value,.dataset .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
-.dataset .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
-.dataset .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
-.dataset .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
-.dataset .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
-.dataset .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
-.dataset .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
-.dataset .dataset-body .dataset-actions .right{float:right}.dataset .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
-.dataset .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset .dataset-body .tags-display .select2-container{min-width:0px}.dataset .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
-.dataset .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
-.dataset .dataset-body .annotation-display .annotation:empty{height:22px}
-.dataset .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
-.dataset .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
-.dataset .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
-.dataset .dataset-body .dataset-peek{margin-bottom:8px}.dataset .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
-.dataset .dataset-body .dataset-peek pre.peek table,.dataset .dataset-body .dataset-peek pre.peek th,.dataset .dataset-body .dataset-peek pre.peek tr,.dataset .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
-.dataset .icon-btn-group{display:inline-block}.dataset .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
-.dataset .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
-.dataset .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
-.dataset .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
+.dataset.hda{border:1px solid #bfbfbf}.dataset.hda .vertical-spacing{margin-bottom:8px}
+.dataset.hda .info-section{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}
+.dataset.hda .dataset-padding{padding:6px 10px 6px 8px}
+.dataset.hda [class$=messagesmall]{margin:6px 10px 2px 8px;font-size:90%}
+.dataset.hda .help-text{font-weight:normal;color:#555}
+.dataset.hda .dataset-selector{float:left;display:none;width:0px;margin:0 0 -6px 0;padding:5px 0 2px 8px;cursor:pointer;vertical-align:middle}
+.dataset.hda .dataset-title-bar{cursor:pointer;outline:none;padding:6px 10px 6px 8px}
+.dataset.hda .dataset-title-bar .dataset-title{display:inline;font-weight:bold;text-decoration:underline;word-wrap:break-word;word-break:break-all;line-height:16px}
+.dataset.hda .dataset-primary-actions{display:inline-block;float:right;margin:6px 10px 0}.dataset.hda .dataset-primary-actions .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .dataset-primary-actions .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .dataset-primary-actions .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .dataset-primary-actions .icon-btn{margin-left:2px}
+.dataset.hda .dataset-body{display:none;padding:6px 10px 6px 8px}.dataset.hda .dataset-body [class$=messagesmall]{margin:0px 0px 8px 0px}
+.dataset.hda .dataset-body label{margin:0px;padding:0px;font-weight:normal}
+.dataset.hda .dataset-body .prompt{font-weight:normal;color:#555}
+.dataset.hda .dataset-body .prompt:after{content:':'}
+.dataset.hda .dataset-body .dataset-summary{margin-bottom:8px}.dataset.hda .dataset-body .dataset-summary .dataset-blurb{margin-bottom:2px}
+.dataset.hda .dataset-body .dataset-summary .dataset-datatype,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey{display:inline}.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value,.dataset.hda .dataset-body .dataset-summary .dataset-dbkey .value{font-weight:bold}
+.dataset.hda .dataset-body .dataset-summary .dataset-datatype .value:after{content:',';font-weight:normal;color:#555}
+.dataset.hda .dataset-body .dataset-summary .dataset-dbkey:after{content:' ';display:block;margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-summary .dataset-info{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px}.dataset.hda .dataset-body .dataset-summary .dataset-info .value{white-space:pre-line}
+.dataset.hda .dataset-body .dataset-summary .job-error-text{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;overflow:auto;white-space:pre}
+.dataset.hda .dataset-body .dataset-actions .left{display:inline-block;float:left}.dataset.hda .dataset-body .dataset-actions .left .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .dataset-body .dataset-actions .left .icon-btn{margin-right:2px}
+.dataset.hda .dataset-body .dataset-actions .left:not(:empty){margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-actions .right{float:right}.dataset.hda .dataset-body .dataset-actions .right .icon-btn{margin-left:2px}
+.dataset.hda .dataset-body .tags-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .tags-display .select2-container{min-width:0px}.dataset.hda .dataset-body .tags-display .select2-container .select2-choices{border-radius:3px}
+.dataset.hda .dataset-body .annotation-display{display:none;margin-bottom:8px}.dataset.hda .dataset-body .annotation-display .annotation{border-radius:3px;border:1px solid rgba(153,153,153,0.30000000000000004);padding:4px;white-space:pre-line}
+.dataset.hda .dataset-body .annotation-display .annotation:empty{height:22px}
+.dataset.hda .dataset-body .annotation-display .annotation:empty:after{position:relative;top:-4px;font-size:10px;font-style:italic;color:grey;content:'Click here to edit annotation'}
+.dataset.hda .dataset-body .annotation-display textarea{margin:0px 0px 2px 0px;display:block;border-radius:3px;width:100%}
+.dataset.hda .dataset-body .dataset-display-applications .display-application:last-child{margin-bottom:8px}
+.dataset.hda .dataset-body .dataset-peek{margin-bottom:8px}.dataset.hda .dataset-body .dataset-peek pre.peek{width:100%;margin:0px;border-radius:3px;background:white;color:black;font-size:10px;overflow:auto}.dataset.hda .dataset-body .dataset-peek pre.peek th{color:white;background:#5f6990}
+.dataset.hda .dataset-body .dataset-peek pre.peek table,.dataset.hda .dataset-body .dataset-peek pre.peek th,.dataset.hda .dataset-body .dataset-peek pre.peek tr,.dataset.hda .dataset-body .dataset-peek pre.peek td{font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:10px}
+.dataset.hda .icon-btn-group{display:inline-block}.dataset.hda .icon-btn-group .icon-btn:not(:last-child){margin:0px;border-radius:0px;border-right:none}
+.dataset.hda .icon-btn-group .icon-btn:first-child{margin-right:0px;border-top-left-radius:3px;border-bottom-left-radius:3px}
+.dataset.hda .icon-btn-group .icon-btn:last-child{margin-left:0px;border-radius:0px 3px 3px 0px}
+.dataset.hda .state-icon{font-family:FontAwesome;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;vertical-align:middle;width:16px;height:16px;line-height:16px;text-align:center;font-size:16px}
.state-icon-error{background-color:white;border-radius:8px}.state-icon-error:before{font-size:20px;line-height:16px;color:red;content:"\f057"}
.state-icon-running{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.state-icon-running:before{content:"\f110"}
.state-icon-upload{overflow:hidden}.state-icon-upload:before{display:inline-block;-webkit-animation:eclipse 2s infinite linear;-moz-animation:eclipse 2s infinite linear;-o-animation:eclipse 2s infinite linear;animation:eclipse 2s infinite linear;content:"\f062"}@-moz-keyframes eclipse{0%{-moz-transform:translate(0, 16px)} 100%{-moz-transform:translate(0, -16px)}}@-webkit-keyframes eclipse{0%{-webkit-transform:translate(0, 16px)} 100%{-webkit-transform:translate(0, -16px)}}@-o-keyframes eclipse{0%{-o-transform:translate(0, 16px)} 100%{-o-transform:translate(0, -16px)}}@-ms-keyframes eclipse{0%{-ms-transform:translate(0, 16px)} 100%{-ms-transform:translate(0, -16px)}}@keyframes eclipse{0%{transform:translate(0, 16px)} 100%{transform:translate(0, -16px)}}
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r 99beec4c3a338249ab661a7edc3e30ee115486e9 static/style/src/less/history.less
--- a/static/style/src/less/history.less
+++ b/static/style/src/less/history.less
@@ -269,7 +269,7 @@
}
// ---------------------------------------------------------------------------- datasets
-.dataset {
+.dataset.hda {
border: 1px solid @border-default-color;
// body mixins
@@ -512,7 +512,7 @@
}
-.dataset .state-icon {
+.dataset.hda .state-icon {
.fa-icon;
display: inline-block;
vertical-align: middle;
diff -r 0a8336ad8d4df064abcaa286814527ee8bbde34f -r 99beec4c3a338249ab661a7edc3e30ee115486e9 templates/webapps/galaxy/dataset/embed.mako
--- a/templates/webapps/galaxy/dataset/embed.mako
+++ b/templates/webapps/galaxy/dataset/embed.mako
@@ -4,10 +4,10 @@
%><%def name="render_item_links( dataset )">
- <a href="${h.url_for( controller='/dataset', action='display', dataset_id=trans.security.encode_id( dataset.id ), to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk tooltip"></a>
+ <a href="${h.url_for( controller='/dataset', action='display', dataset_id=trans.security.encode_id( dataset.id ), to_ext=dataset.ext )}" title="Save dataset" class="icon-button disk"></a>
## Links for importing and viewing an item.
- <a href="${h.url_for( controller='/dataset', action='imp', dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset" class="icon-button import tooltip"></a>
- <a class="icon-button go-to-full-screen tooltip" href="${h.url_for( controller='/dataset', action='display_by_username_and_slug', username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id ) )}" title="Go to dataset"></a>
+ <a href="${h.url_for( controller='/dataset', action='imp', dataset_id=trans.security.encode_id( item.id ) )}" title="Import dataset" class="icon-button import"></a>
+ <a class="icon-button go-to-full-screen" href="${h.url_for( controller='/dataset', action='display_by_username_and_slug', username=dataset.history.user.username, slug=trans.security.encode_id( dataset.id ) )}" title="Go to dataset"></a></%def>
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ce8a3e4414e6/
Changeset: ce8a3e4414e6
Branch: next-stable
User: dan
Date: 2014-02-05 21:48:36
Summary: Fix minor display bug in show_params.
Affected #: 1 file
diff -r 8e2fab723bca8ce5eac70d1bef2cb127897eae81 -r ce8a3e4414e6ea4e761d3b40b66541e8c53471fa templates/show_params.mako
--- a/templates/show_params.mako
+++ b/templates/show_params.mako
@@ -141,9 +141,9 @@
% if params_objects and tool:
${ inputs_recursive( tool.inputs, params_objects, depth=1, upgrade_messages=upgrade_messages ) }
%elif params_objects is None:
- <tr><td colspan="2">Unable to load parameters.</td></tr>
+ <tr><td colspan="3">Unable to load parameters.</td></tr>
% else:
- <tr><td colspan="2">No parameters.</td></tr>
+ <tr><td colspan="3">No parameters.</td></tr>
% endif
</tbody></table>
https://bitbucket.org/galaxy/galaxy-central/commits/0a8336ad8d4d/
Changeset: 0a8336ad8d4d
User: dan
Date: 2014-02-05 21:48:36
Summary: Fix minor display bug in show_params.
Affected #: 1 file
diff -r 58f73c96431bdd701c0bdf656d0f0f0d14c456e4 -r 0a8336ad8d4df064abcaa286814527ee8bbde34f templates/show_params.mako
--- a/templates/show_params.mako
+++ b/templates/show_params.mako
@@ -141,9 +141,9 @@
% if params_objects and tool:
${ inputs_recursive( tool.inputs, params_objects, depth=1, upgrade_messages=upgrade_messages ) }
%elif params_objects is None:
- <tr><td colspan="2">Unable to load parameters.</td></tr>
+ <tr><td colspan="3">Unable to load parameters.</td></tr>
% else:
- <tr><td colspan="2">No parameters.</td></tr>
+ <tr><td colspan="3">No parameters.</td></tr>
% endif
</tbody></table>
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8e2fab723bca/
Changeset: 8e2fab723bca
Branch: next-stable
User: dan
Date: 2014-02-05 19:44:32
Summary: Update GenomeSpace import tools to use current working directory instead of __new_file_path__ for extrafiles created using multiple outputs technique. Should resolve issue on our public servers where only the first selected file was being imported to the history.
Affected #: 2 files
diff -r c77d83fe4c3e37d07c241bb1f76064a3d0b7f149 -r 8e2fab723bca8ce5eac70d1bef2cb127897eae81 tools/genomespace/genomespace_file_browser.py
--- a/tools/genomespace/genomespace_file_browser.py
+++ b/tools/genomespace/genomespace_file_browser.py
@@ -166,7 +166,7 @@
while filename in used_filenames:
filename = "-%s" % filename
used_filenames.append( filename )
- output_filename = os.path.join( datasource_params['__new_file_path__'], 'primary_%i_%s_visible_%s' % ( hda_id, filename, galaxy_ext ) )
+ output_filename = os.path.join( os.getcwd(), 'primary_%i_%s_visible_%s' % ( hda_id, filename, galaxy_ext ) )
metadata_dict = dict( type = 'new_primary_dataset',
base_dataset_id = dataset_id,
diff -r c77d83fe4c3e37d07c241bb1f76064a3d0b7f149 -r 8e2fab723bca8ce5eac70d1bef2cb127897eae81 tools/genomespace/genomespace_importer.py
--- a/tools/genomespace/genomespace_importer.py
+++ b/tools/genomespace/genomespace_importer.py
@@ -189,7 +189,7 @@
while filename in used_filenames:
filename = "-%s" % filename
used_filenames.append( filename )
- target_output_filename = os.path.join( datasource_params['__new_file_path__'], 'primary_%i_%s_visible_%s' % ( hda_id, filename, file_type ) )
+ target_output_filename = os.path.join( os.getcwd(), 'primary_%i_%s_visible_%s' % ( hda_id, filename, file_type ) )
shutil.move( output_filename, target_output_filename )
metadata_parameter_file.write( "%s\n" % json.dumps( dict( type = 'new_primary_dataset',
base_dataset_id = base_dataset_id,
https://bitbucket.org/galaxy/galaxy-central/commits/58f73c96431b/
Changeset: 58f73c96431b
User: dan
Date: 2014-02-05 19:44:32
Summary: Update GenomeSpace import tools to use current working directory instead of __new_file_path__ for extrafiles created using multiple outputs technique. Should resolve issue on our public servers where only the first selected file was being imported to the history.
Affected #: 2 files
diff -r 47990c9bd4d8003e0ba619d73c1022646f3bc973 -r 58f73c96431bdd701c0bdf656d0f0f0d14c456e4 tools/genomespace/genomespace_file_browser.py
--- a/tools/genomespace/genomespace_file_browser.py
+++ b/tools/genomespace/genomespace_file_browser.py
@@ -166,7 +166,7 @@
while filename in used_filenames:
filename = "-%s" % filename
used_filenames.append( filename )
- output_filename = os.path.join( datasource_params['__new_file_path__'], 'primary_%i_%s_visible_%s' % ( hda_id, filename, galaxy_ext ) )
+ output_filename = os.path.join( os.getcwd(), 'primary_%i_%s_visible_%s' % ( hda_id, filename, galaxy_ext ) )
metadata_dict = dict( type = 'new_primary_dataset',
base_dataset_id = dataset_id,
diff -r 47990c9bd4d8003e0ba619d73c1022646f3bc973 -r 58f73c96431bdd701c0bdf656d0f0f0d14c456e4 tools/genomespace/genomespace_importer.py
--- a/tools/genomespace/genomespace_importer.py
+++ b/tools/genomespace/genomespace_importer.py
@@ -189,7 +189,7 @@
while filename in used_filenames:
filename = "-%s" % filename
used_filenames.append( filename )
- target_output_filename = os.path.join( datasource_params['__new_file_path__'], 'primary_%i_%s_visible_%s' % ( hda_id, filename, file_type ) )
+ target_output_filename = os.path.join( os.getcwd(), 'primary_%i_%s_visible_%s' % ( hda_id, filename, file_type ) )
shutil.move( output_filename, target_output_filename )
metadata_parameter_file.write( "%s\n" % json.dumps( dict( type = 'new_primary_dataset',
base_dataset_id = base_dataset_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: carlfeberhard: Visualizations API: properly return visualization model id from update; Visualizations MVC: bring setConfig into line with Backbone API
by commits-noreply@bitbucket.org 05 Feb '14
by commits-noreply@bitbucket.org 05 Feb '14
05 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/47990c9bd4d8/
Changeset: 47990c9bd4d8
User: carlfeberhard
Date: 2014-02-05 18:36:11
Summary: Visualizations API: properly return visualization model id from update; Visualizations MVC: bring setConfig into line with Backbone API
Affected #: 3 files
diff -r 6af6d838db509c1ce90a885d15a6e2cda2ef1e87 -r 47990c9bd4d8003e0ba619d73c1022646f3bc973 lib/galaxy/webapps/galaxy/api/visualizations.py
--- a/lib/galaxy/webapps/galaxy/api/visualizations.py
+++ b/lib/galaxy/webapps/galaxy/api/visualizations.py
@@ -176,8 +176,11 @@
or ( dbkey != visualization.latest_revision.dbkey )
or ( util.json.to_json_string( config ) != util.json.to_json_string( latest_config ) ) ):
revision = self.add_visualization_revision( trans, visualization, config, title, dbkey )
- #TODO: need to somehow get what changed here?
- rval = { 'id' : revision.id }
+ rval = { 'id' : id, 'revision' : revision.id }
+
+ #TODO: allow updating vis title & slug
+ #visualization.title = title
+ #trans.sa_session.flush()
except ( ItemAccessibilityException, ItemDeletionException ), exception:
trans.response.status = 403
diff -r 6af6d838db509c1ce90a885d15a6e2cda2ef1e87 -r 47990c9bd4d8003e0ba619d73c1022646f3bc973 static/scripts/mvc/visualization/visualization-model.js
--- a/static/scripts/mvc/visualization/visualization-model.js
+++ b/static/scripts/mvc/visualization/visualization-model.js
@@ -1,24 +1,6 @@
//define([
//], function(){
-//function saveVis( title, config ){
-// var xhr = jQuery.ajax( '/api/visualizations', {
-// type : 'POST',
-// data : {
-// type : 'scatterplot',
-// title : title,
-// config : JSON.stringify( config )
-// }
-// });
-// xhr.fail( function( xhr, status, message ){
-// console.debug( jQuery.makeArray( arguments ) );
-// console.error( 'Error saving visualization:', xhr.responseJSON.error );
-// });
-// return xhr.then( function( saveInfo ){
-// return saveInfo;
-// });
-//}
-
//==============================================================================
/** @class Model for a saved Galaxy visualization.
*
@@ -36,21 +18,13 @@
/** default attributes for a model */
defaults : {
- //id : null,
- //type : null,
- //title : null,
- //dbkey : null,
- //user_id : null,
- //slug : null,
- //revisions : [],
- //latest_revision : null
-
- //(this is unusual in that visualizations don't have configs, revisions do)
- //config : {}
+ config : {}
},
- url : function(){
- return galaxy_config.root + 'api/visualizations';
+ /** override urlRoot to handle presence/absence of galaxy_config */
+ urlRoot : function(){
+ var apiUrl = '/api/visualizations';
+ return (( window.galaxy_config && galaxy_config.root )?( galaxy_config.root + apiUrl ):( apiUrl ));
},
/** Set up the model, determine if accessible, bind listeners
@@ -58,27 +32,39 @@
*/
initialize : function( data ){
this.log( this + '.initialize', data, this.attributes );
+
+ // munge config sub-object here since bbone won't handle defaults with this
+ if( _.isObject( data.config ) && _.isObject( this.defaults.config ) ){
+ _.defaults( data.config, this.defaults.config );
+ }
+
this._setUpListeners();
},
/** set up any event listeners
*/
_setUpListeners : function(){
+ //this.on( 'change', function(){
+ // console.info( 'change:', arguments );
+ //});
},
// ........................................................................ config
- setConfig: function( config ){
- var oldConfig = this.get( 'config' );
- // extend if already exists (and clone in order to trigger change)
- if( _.isObject( oldConfig ) ){
- config = _.extend( _.clone( oldConfig ), config );
+ /** override set to properly allow update and trigger change when setting the sub-obj 'config' */
+ set: function( key, val ){
+ //TODO: validate config is object
+ if( key === 'config' ){
+ var oldConfig = this.get( 'config' );
+ // extend if already exists (is this correct behavior? no way to eliminate keys or reset entirely)
+ // clone in order to trigger change (diff. obj ref)
+ if( _.isObject( oldConfig ) ){
+ val = _.extend( _.clone( oldConfig ), val );
+ }
}
- this.set( 'config', config );
+ Backbone.Model.prototype.set.call( this, key, val );
return this;
},
- // ........................................................................ common queries
- // ........................................................................ ajax
// ........................................................................ misc
/** String representation */
toString : function(){
diff -r 6af6d838db509c1ce90a885d15a6e2cda2ef1e87 -r 47990c9bd4d8003e0ba619d73c1022646f3bc973 static/scripts/packed/mvc/visualization/visualization-model.js
--- a/static/scripts/packed/mvc/visualization/visualization-model.js
+++ b/static/scripts/packed/mvc/visualization/visualization-model.js
@@ -1,1 +1,1 @@
-var Visualization=Backbone.Model.extend(LoggableMixin).extend({defaults:{},url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(a){this.log(this+".initialize",a,this.attributes);this._setUpListeners()},_setUpListeners:function(){},setConfig:function(b){var a=this.get("config");if(_.isObject(a)){b=_.extend(_.clone(a),b)}this.set("config",b);return this},toString:function(){var a=this.get("id")||"";if(this.get("title")){a+=":"+this.get("title")}return"Visualization("+a+")"}});var VisualizationCollection=Backbone.Collection.extend(LoggableMixin).extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(b,a){a=a||{}},set:function(c,a){var b=this;c=_.map(c,function(e){var f=b.get(e.id);if(!f){return e}var d=f.toJSON();_.extend(d,e);return d});Backbone.Collection.prototype.set.call(this,c,a)},toString:function(){return(["VisualizationCollection(",[this.historyId,this.length].join(),")"].join(""))}});
\ No newline at end of file
+var Visualization=Backbone.Model.extend(LoggableMixin).extend({defaults:{config:{}},urlRoot:function(){var a="/api/visualizations";return((window.galaxy_config&&galaxy_config.root)?(galaxy_config.root+a):(a))},initialize:function(a){this.log(this+".initialize",a,this.attributes);if(_.isObject(a.config)&&_.isObject(this.defaults.config)){_.defaults(a.config,this.defaults.config)}this._setUpListeners()},_setUpListeners:function(){},set:function(b,c){if(b==="config"){var a=this.get("config");if(_.isObject(a)){c=_.extend(_.clone(a),c)}}Backbone.Model.prototype.set.call(this,b,c);return this},toString:function(){var a=this.get("id")||"";if(this.get("title")){a+=":"+this.get("title")}return"Visualization("+a+")"}});var VisualizationCollection=Backbone.Collection.extend(LoggableMixin).extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(b,a){a=a||{}},set:function(c,a){var b=this;c=_.map(c,function(e){var f=b.get(e.id);if(!f){return e}var d=f.toJSON();_.extend(d,e);return d});Backbone.Collection.prototype.set.call(this,c,a)},toString:function(){return(["VisualizationCollection(",[this.historyId,this.length].join(),")"].join(""))}});
\ 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: carlfeberhard: PageServingPluginManager: allow additional common paths to be added to each plugin's TemplateLookup and allow configuration of these paths; Visualizations Framework: add common/templates, readme, and configuration of same
by commits-noreply@bitbucket.org 05 Feb '14
by commits-noreply@bitbucket.org 05 Feb '14
05 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6af6d838db50/
Changeset: 6af6d838db50
User: carlfeberhard
Date: 2014-02-05 17:55:13
Summary: PageServingPluginManager: allow additional common paths to be added to each plugin's TemplateLookup and allow configuration of these paths; Visualizations Framework: add common/templates, readme, and configuration of same
Affected #: 3 files
diff -r 9c4a45cd38e6fd6122698db67689c7aaacd0adac -r 6af6d838db509c1ce90a885d15a6e2cda2ef1e87 config/plugins/visualizations/additional_template_paths.xml
--- /dev/null
+++ b/config/plugins/visualizations/additional_template_paths.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- these relative paths can contain common templates importable by all visualization plugins -->
+<paths>
+ <path>common/templates</path>
+</paths>
diff -r 9c4a45cd38e6fd6122698db67689c7aaacd0adac -r 6af6d838db509c1ce90a885d15a6e2cda2ef1e87 config/plugins/visualizations/common/templates/README.txt
--- /dev/null
+++ b/config/plugins/visualizations/common/templates/README.txt
@@ -0,0 +1,8 @@
+Common templates for visualization plugins
+==========================================
+
+Placing Mako templates in this directory will allow them to be properly
+inherited and imported in plugin directories. E.g. if you have a template file
+in this directory named 'config_utils.mako', you can import it in your plugin
+templates using:
+ <%namespace name="config_utils" file="config_utils.mako" />
diff -r 9c4a45cd38e6fd6122698db67689c7aaacd0adac -r 6af6d838db509c1ce90a885d15a6e2cda2ef1e87 lib/galaxy/web/base/pluginframework.py
--- a/lib/galaxy/web/base/pluginframework.py
+++ b/lib/galaxy/web/base/pluginframework.py
@@ -374,6 +374,8 @@
DEFAULT_TEMPLATE_COLLECTION_SIZE = 10
#: default encoding of plugin templates
DEFAULT_TEMPLATE_ENCODING = 'utf-8'
+ #: name of files to search for additional template lookup directories
+ additional_template_paths_config_filename = 'additional_template_paths.xml'
def __init__( self, app, base_url, template_cache_dir=None, **kwargs ):
"""
@@ -389,9 +391,42 @@
"""
self.base_url = base_url
self.template_cache_dir = template_cache_dir
+ self.additional_template_paths = []
super( PageServingPluginManager, self ).__init__( app, **kwargs )
+ def load_configuration( self ):
+ """
+ Load framework wide configuration, including:
+ additional template lookup directories
+ """
+ for directory in self.directories:
+ possible_path = os.path.join( directory, self.additional_template_paths_config_filename )
+ if os.path.exists( possible_path ):
+ added_paths = self.parse_additional_template_paths( possible_path, directory )
+ self.additional_template_paths.extend( added_paths )
+
+ def parse_additional_template_paths( self, config_filepath, base_directory ):
+ """
+ Parse an XML config file at `config_filepath` for template paths
+ (relative to `base_directory`) to add to each plugin's template lookup.
+
+ Allows having a set of common templates for import/inheritance in
+ plugin templates.
+
+ :type config_filepath: string
+ :param config_filepath: filesystem path to the config file
+ :type base_directory: string
+ :param base_directory: path prefixed to new, relative template paths
+ """
+ additional_paths = []
+ xml_tree = util.parse_xml( config_filepath )
+ paths_list = xml_tree.getroot()
+ for rel_path_elem in paths_list.findall( 'path' ):
+ if rel_path_elem.text is not None:
+ additional_paths.append( os.path.join( base_directory, rel_path_elem.text ) )
+ return additional_paths
+
def is_plugin( self, plugin_path ):
"""
Determines whether the given filesystem path contains a plugin.
@@ -518,7 +553,11 @@
"""
if not plugin.serves_templates:
return None
- template_lookup = self._create_mako_template_lookup( self.template_cache_dir, plugin.template_path )
+ template_lookup_paths = plugin.template_path
+ if self.additional_template_paths:
+ template_lookup_paths = [ template_lookup_paths ] + self.additional_template_paths
+ #log.debug( 'template_lookup_paths: %s', template_lookup_paths )
+ template_lookup = self._create_mako_template_lookup( self.template_cache_dir, template_lookup_paths )
return template_lookup
def _create_mako_template_lookup( self, cache_dir, paths,
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: guerler: Upload: Fix popup destruction
by commits-noreply@bitbucket.org 04 Feb '14
by commits-noreply@bitbucket.org 04 Feb '14
04 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/62488676f55e/
Changeset: 62488676f55e
User: guerler
Date: 2014-02-04 21:24:35
Summary: Upload: Fix popup destruction
Affected #: 2 files
diff -r 30ae36e55f869920a7959cef0e166a00f0be3d2b -r 62488676f55e37589536bae49b684e3df4ac4b5a static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -97,9 +97,11 @@
self._refreshGenome();
});
this.model.on('remove', function() {
+ self._destroyExtensionInfo();
self.remove();
});
this.app.collection.on('reset', function() {
+ self._destroyExtensionInfo();
self.remove();
});
},
@@ -263,10 +265,16 @@
// remove popup
var self = this
this.popover_timeout = setTimeout(function() {
- self.$el.find('#extension_info').popover('destroy');
+ self._destroyExtensionInfo();
}, this.options.timeout);
},
+ // attach file info popup
+ _destroyExtensionInfo : function()
+ {
+ this.$el.find('#extension_info').popover('destroy');
+ },
+
// template
_template: function(options)
{
diff -r 30ae36e55f869920a7959cef0e166a00f0be3d2b -r 62488676f55e37589536bae49b684e3df4ac4b5a static/scripts/packed/mvc/upload/upload-row.js
--- a/static/scripts/packed/mvc/upload/upload-row.js
+++ b/static/scripts/packed/mvc/upload/upload-row.js
@@ -1,1 +1,1 @@
-define(["mvc/upload/upload-model","mvc/upload/upload-extensions"],function(a,b){return Backbone.View.extend({options:{padding:8,timeout:2000},status_classes:{init:"symbol fa fa-trash-o",queued:"symbol fa fa-spinner fa-spin",running:"symbol fa fa-spinner fa-spin",success:"symbol fa fa-check",error:"symbol fa fa-exclamation-triangle"},initialize:function(f,d){this.app=f;var c=this;this.model=new a.Model(d);this.setElement(this._template(d));var e=this.$el;e.find("#symbol").on("click",function(){var g=c.model.get("status");if(g=="init"||g=="success"||g=="error"){c.app.collection.remove(c.model)}});e.find("#extension_info").on("mouseover",function(){c._showExtensionInfo()}).on("mouseleave",function(){c._hideExtensionInfo()});e.find("#text-content").on("keyup",function(){var g=e.find("#text-content");var i=g.val();var h=i.length;e.find("#size").html(c._formatSize(h));c.model.set("url_paste",i);c.model.set("file_size",h)});e.find("#genome").on("change",function(g){c.model.set("genome",$(g.target).val())});e.find("#extension").on("change",function(g){c.model.set("extension",$(g.target).val());c.$el.find("#extension_info").popover("destroy")});e.find("#space_to_tabs").on("change",function(g){c.model.set("space_to_tabs",$(g.target).prop("checked"))});this.model.on("change:percentage",function(){c._refreshPercentage()});this.model.on("change:status",function(){c._refreshStatus()});this.model.on("change:info",function(){c._refreshInfo()});this.model.on("change:genome",function(){c._refreshGenome()});this.model.on("remove",function(){c.remove()});this.app.collection.on("reset",function(){c.remove()})},render:function(){var i=this.model.get("file_name");var d=this.model.get("file_size");var f=this.$el;f.find("#title").html(i);f.find("#size").html(this._formatSize(d));if(d==-1){var h=f.find("#text");var g=this.options.padding;var e=f.width()-2*g;var c=f.height()-g;h.css("width",e+"px");h.css("top",c+"px");f.height(c+h.height()+2*g);h.show()}},_refreshGenome:function(){var c=this.model.get("genome");this.$el.find("#genome").val(c)},_refreshInfo:function(){var c=this.model.get("info");if(c){this.$el.find("#info").html("<strong>Failed: </strong>"+c).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var c=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:c+"%"});if(c!=100){this.$el.find("#percentage").html(c+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var d=this.$el;var c=this.model.get("status");var f=this.status_classes[c];var e=this.$el.find("#symbol");e.removeClass();e.addClass(f);if(c=="init"){d.find("#text-content").attr("disabled",false);d.find("#genome").attr("disabled",false);d.find("#extension").attr("disabled",false);d.find("#space_to_tabs").attr("disabled",false)}else{d.find("#text-content").attr("disabled",true);d.find("#genome").attr("disabled",true);d.find("#extension").attr("disabled",true);d.find("#space_to_tabs").attr("disabled",true)}if(c=="success"){d.addClass("success");d.find("#percentage").html("100%")}if(c=="error"){d.addClass("danger");d.find(".progress").remove()}},_formatSize:function(c){var d="";if(c>=100000000000){c=c/100000000000;d="TB"}else{if(c>=100000000){c=c/100000000;d="GB"}else{if(c>=100000){c=c/100000;d="MB"}else{if(c>=100){c=c/100;d="KB"}else{if(c>0){c=c*10;d="b"}else{return"<strong>-</strong>"}}}}}return"<strong>"+(Math.round(c)/10)+"</strong> "+d},_showExtensionInfo:function(){var c=this;var d=$(this.el).find("#extension_info");var f=this.model.get("extension");var e=$(this.el).find("#extension").find("option:selected").text();d.popover({html:true,title:e,content:b(f),placement:"bottom",container:c.$el.parent()});d.popover("show");clearTimeout(this.popover_timeout)},_hideExtensionInfo:function(){var c=this;this.popover_timeout=setTimeout(function(){c.$el.find("#extension_info").popover("destroy")},this.options.timeout)},_template:function(e){var d=this;var c='<tr id="upload-item-'+e.id+'" class="upload-item"><td><div style="position: relative;"><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td>';c+='<td><select id="extension" class="extension">';for(key in d.app.select_extension){c+='<option value="'+d.app.select_extension[key][1]+'">'+d.app.select_extension[key][0]+"</option>"}c+='</select> <i id="extension_info" class="fa fa-search" style="cursor: pointer;"/></td>';c+='<td><select id="genome" class="genome">';for(key in d.app.select_genome){c+='<option value="'+d.app.select_genome[key][1]+'">'+d.app.select_genome[key][0]+"</option>"}c+="</select></td>";c+='<td><input id="space_to_tabs" type="checkbox"></input></td><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>';return c}})});
\ No newline at end of file
+define(["mvc/upload/upload-model","mvc/upload/upload-extensions"],function(a,b){return Backbone.View.extend({options:{padding:8,timeout:2000},status_classes:{init:"symbol fa fa-trash-o",queued:"symbol fa fa-spinner fa-spin",running:"symbol fa fa-spinner fa-spin",success:"symbol fa fa-check",error:"symbol fa fa-exclamation-triangle"},initialize:function(f,d){this.app=f;var c=this;this.model=new a.Model(d);this.setElement(this._template(d));var e=this.$el;e.find("#symbol").on("click",function(){var g=c.model.get("status");if(g=="init"||g=="success"||g=="error"){c.app.collection.remove(c.model)}});e.find("#extension_info").on("mouseover",function(){c._showExtensionInfo()}).on("mouseleave",function(){c._hideExtensionInfo()});e.find("#text-content").on("keyup",function(){var g=e.find("#text-content");var i=g.val();var h=i.length;e.find("#size").html(c._formatSize(h));c.model.set("url_paste",i);c.model.set("file_size",h)});e.find("#genome").on("change",function(g){c.model.set("genome",$(g.target).val())});e.find("#extension").on("change",function(g){c.model.set("extension",$(g.target).val());c.$el.find("#extension_info").popover("destroy")});e.find("#space_to_tabs").on("change",function(g){c.model.set("space_to_tabs",$(g.target).prop("checked"))});this.model.on("change:percentage",function(){c._refreshPercentage()});this.model.on("change:status",function(){c._refreshStatus()});this.model.on("change:info",function(){c._refreshInfo()});this.model.on("change:genome",function(){c._refreshGenome()});this.model.on("remove",function(){c._destroyExtensionInfo();c.remove()});this.app.collection.on("reset",function(){c._destroyExtensionInfo();c.remove()})},render:function(){var i=this.model.get("file_name");var d=this.model.get("file_size");var f=this.$el;f.find("#title").html(i);f.find("#size").html(this._formatSize(d));if(d==-1){var h=f.find("#text");var g=this.options.padding;var e=f.width()-2*g;var c=f.height()-g;h.css("width",e+"px");h.css("top",c+"px");f.height(c+h.height()+2*g);h.show()}},_refreshGenome:function(){var c=this.model.get("genome");this.$el.find("#genome").val(c)},_refreshInfo:function(){var c=this.model.get("info");if(c){this.$el.find("#info").html("<strong>Failed: </strong>"+c).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var c=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:c+"%"});if(c!=100){this.$el.find("#percentage").html(c+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var d=this.$el;var c=this.model.get("status");var f=this.status_classes[c];var e=this.$el.find("#symbol");e.removeClass();e.addClass(f);if(c=="init"){d.find("#text-content").attr("disabled",false);d.find("#genome").attr("disabled",false);d.find("#extension").attr("disabled",false);d.find("#space_to_tabs").attr("disabled",false)}else{d.find("#text-content").attr("disabled",true);d.find("#genome").attr("disabled",true);d.find("#extension").attr("disabled",true);d.find("#space_to_tabs").attr("disabled",true)}if(c=="success"){d.addClass("success");d.find("#percentage").html("100%")}if(c=="error"){d.addClass("danger");d.find(".progress").remove()}},_formatSize:function(c){var d="";if(c>=100000000000){c=c/100000000000;d="TB"}else{if(c>=100000000){c=c/100000000;d="GB"}else{if(c>=100000){c=c/100000;d="MB"}else{if(c>=100){c=c/100;d="KB"}else{if(c>0){c=c*10;d="b"}else{return"<strong>-</strong>"}}}}}return"<strong>"+(Math.round(c)/10)+"</strong> "+d},_showExtensionInfo:function(){var c=this;var d=$(this.el).find("#extension_info");var f=this.model.get("extension");var e=$(this.el).find("#extension").find("option:selected").text();d.popover({html:true,title:e,content:b(f),placement:"bottom",container:c.$el.parent()});d.popover("show");clearTimeout(this.popover_timeout)},_hideExtensionInfo:function(){var c=this;this.popover_timeout=setTimeout(function(){c._destroyExtensionInfo()},this.options.timeout)},_destroyExtensionInfo:function(){this.$el.find("#extension_info").popover("destroy")},_template:function(e){var d=this;var c='<tr id="upload-item-'+e.id+'" class="upload-item"><td><div style="position: relative;"><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td>';c+='<td><select id="extension" class="extension">';for(key in d.app.select_extension){c+='<option value="'+d.app.select_extension[key][1]+'">'+d.app.select_extension[key][0]+"</option>"}c+='</select> <i id="extension_info" class="fa fa-search" style="cursor: pointer;"/></td>';c+='<td><select id="genome" class="genome">';for(key in d.app.select_genome){c+='<option value="'+d.app.select_genome[key][1]+'">'+d.app.select_genome[key][0]+"</option>"}c+="</select></td>";c+='<td><input id="space_to_tabs" type="checkbox"></input></td><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>';return c}})});
\ 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
04 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/30ae36e55f86/
Changeset: 30ae36e55f86
User: guerler
Date: 2014-02-04 21:02:46
Summary: Upload: Change icon
Affected #: 2 files
diff -r e1ac3242786b055b8cc2b80ed701643f41c1e42e -r 30ae36e55f869920a7959cef0e166a00f0be3d2b static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -292,7 +292,7 @@
for (key in self.app.select_extension)
tmpl += '<option value="' + self.app.select_extension[key][1] + '">' + self.app.select_extension[key][0] + '</option>';
tmpl += '</select>' +
- ' <i id="extension_info" class="fa fa-question" style="cursor: pointer;"/>' +
+ ' <i id="extension_info" class="fa fa-search" style="cursor: pointer;"/>' +
'</td>';
// add genome selector
diff -r e1ac3242786b055b8cc2b80ed701643f41c1e42e -r 30ae36e55f869920a7959cef0e166a00f0be3d2b static/scripts/packed/mvc/upload/upload-row.js
--- a/static/scripts/packed/mvc/upload/upload-row.js
+++ b/static/scripts/packed/mvc/upload/upload-row.js
@@ -1,1 +1,1 @@
-define(["mvc/upload/upload-model","mvc/upload/upload-extensions"],function(a,b){return Backbone.View.extend({options:{padding:8,timeout:2000},status_classes:{init:"symbol fa fa-trash-o",queued:"symbol fa fa-spinner fa-spin",running:"symbol fa fa-spinner fa-spin",success:"symbol fa fa-check",error:"symbol fa fa-exclamation-triangle"},initialize:function(f,d){this.app=f;var c=this;this.model=new a.Model(d);this.setElement(this._template(d));var e=this.$el;e.find("#symbol").on("click",function(){var g=c.model.get("status");if(g=="init"||g=="success"||g=="error"){c.app.collection.remove(c.model)}});e.find("#extension_info").on("mouseover",function(){c._showExtensionInfo()}).on("mouseleave",function(){c._hideExtensionInfo()});e.find("#text-content").on("keyup",function(){var g=e.find("#text-content");var i=g.val();var h=i.length;e.find("#size").html(c._formatSize(h));c.model.set("url_paste",i);c.model.set("file_size",h)});e.find("#genome").on("change",function(g){c.model.set("genome",$(g.target).val())});e.find("#extension").on("change",function(g){c.model.set("extension",$(g.target).val());c.$el.find("#extension_info").popover("destroy")});e.find("#space_to_tabs").on("change",function(g){c.model.set("space_to_tabs",$(g.target).prop("checked"))});this.model.on("change:percentage",function(){c._refreshPercentage()});this.model.on("change:status",function(){c._refreshStatus()});this.model.on("change:info",function(){c._refreshInfo()});this.model.on("change:genome",function(){c._refreshGenome()});this.model.on("remove",function(){c.remove()});this.app.collection.on("reset",function(){c.remove()})},render:function(){var i=this.model.get("file_name");var d=this.model.get("file_size");var f=this.$el;f.find("#title").html(i);f.find("#size").html(this._formatSize(d));if(d==-1){var h=f.find("#text");var g=this.options.padding;var e=f.width()-2*g;var c=f.height()-g;h.css("width",e+"px");h.css("top",c+"px");f.height(c+h.height()+2*g);h.show()}},_refreshGenome:function(){var c=this.model.get("genome");this.$el.find("#genome").val(c)},_refreshInfo:function(){var c=this.model.get("info");if(c){this.$el.find("#info").html("<strong>Failed: </strong>"+c).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var c=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:c+"%"});if(c!=100){this.$el.find("#percentage").html(c+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var d=this.$el;var c=this.model.get("status");var f=this.status_classes[c];var e=this.$el.find("#symbol");e.removeClass();e.addClass(f);if(c=="init"){d.find("#text-content").attr("disabled",false);d.find("#genome").attr("disabled",false);d.find("#extension").attr("disabled",false);d.find("#space_to_tabs").attr("disabled",false)}else{d.find("#text-content").attr("disabled",true);d.find("#genome").attr("disabled",true);d.find("#extension").attr("disabled",true);d.find("#space_to_tabs").attr("disabled",true)}if(c=="success"){d.addClass("success");d.find("#percentage").html("100%")}if(c=="error"){d.addClass("danger");d.find(".progress").remove()}},_formatSize:function(c){var d="";if(c>=100000000000){c=c/100000000000;d="TB"}else{if(c>=100000000){c=c/100000000;d="GB"}else{if(c>=100000){c=c/100000;d="MB"}else{if(c>=100){c=c/100;d="KB"}else{if(c>0){c=c*10;d="b"}else{return"<strong>-</strong>"}}}}}return"<strong>"+(Math.round(c)/10)+"</strong> "+d},_showExtensionInfo:function(){var c=this;var d=$(this.el).find("#extension_info");var f=this.model.get("extension");var e=$(this.el).find("#extension").find("option:selected").text();d.popover({html:true,title:e,content:b(f),placement:"bottom",container:c.$el.parent()});d.popover("show");clearTimeout(this.popover_timeout)},_hideExtensionInfo:function(){var c=this;this.popover_timeout=setTimeout(function(){c.$el.find("#extension_info").popover("destroy")},this.options.timeout)},_template:function(e){var d=this;var c='<tr id="upload-item-'+e.id+'" class="upload-item"><td><div style="position: relative;"><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td>';c+='<td><select id="extension" class="extension">';for(key in d.app.select_extension){c+='<option value="'+d.app.select_extension[key][1]+'">'+d.app.select_extension[key][0]+"</option>"}c+='</select> <i id="extension_info" class="fa fa-question" style="cursor: pointer;"/></td>';c+='<td><select id="genome" class="genome">';for(key in d.app.select_genome){c+='<option value="'+d.app.select_genome[key][1]+'">'+d.app.select_genome[key][0]+"</option>"}c+="</select></td>";c+='<td><input id="space_to_tabs" type="checkbox"></input></td><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>';return c}})});
\ No newline at end of file
+define(["mvc/upload/upload-model","mvc/upload/upload-extensions"],function(a,b){return Backbone.View.extend({options:{padding:8,timeout:2000},status_classes:{init:"symbol fa fa-trash-o",queued:"symbol fa fa-spinner fa-spin",running:"symbol fa fa-spinner fa-spin",success:"symbol fa fa-check",error:"symbol fa fa-exclamation-triangle"},initialize:function(f,d){this.app=f;var c=this;this.model=new a.Model(d);this.setElement(this._template(d));var e=this.$el;e.find("#symbol").on("click",function(){var g=c.model.get("status");if(g=="init"||g=="success"||g=="error"){c.app.collection.remove(c.model)}});e.find("#extension_info").on("mouseover",function(){c._showExtensionInfo()}).on("mouseleave",function(){c._hideExtensionInfo()});e.find("#text-content").on("keyup",function(){var g=e.find("#text-content");var i=g.val();var h=i.length;e.find("#size").html(c._formatSize(h));c.model.set("url_paste",i);c.model.set("file_size",h)});e.find("#genome").on("change",function(g){c.model.set("genome",$(g.target).val())});e.find("#extension").on("change",function(g){c.model.set("extension",$(g.target).val());c.$el.find("#extension_info").popover("destroy")});e.find("#space_to_tabs").on("change",function(g){c.model.set("space_to_tabs",$(g.target).prop("checked"))});this.model.on("change:percentage",function(){c._refreshPercentage()});this.model.on("change:status",function(){c._refreshStatus()});this.model.on("change:info",function(){c._refreshInfo()});this.model.on("change:genome",function(){c._refreshGenome()});this.model.on("remove",function(){c.remove()});this.app.collection.on("reset",function(){c.remove()})},render:function(){var i=this.model.get("file_name");var d=this.model.get("file_size");var f=this.$el;f.find("#title").html(i);f.find("#size").html(this._formatSize(d));if(d==-1){var h=f.find("#text");var g=this.options.padding;var e=f.width()-2*g;var c=f.height()-g;h.css("width",e+"px");h.css("top",c+"px");f.height(c+h.height()+2*g);h.show()}},_refreshGenome:function(){var c=this.model.get("genome");this.$el.find("#genome").val(c)},_refreshInfo:function(){var c=this.model.get("info");if(c){this.$el.find("#info").html("<strong>Failed: </strong>"+c).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var c=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:c+"%"});if(c!=100){this.$el.find("#percentage").html(c+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var d=this.$el;var c=this.model.get("status");var f=this.status_classes[c];var e=this.$el.find("#symbol");e.removeClass();e.addClass(f);if(c=="init"){d.find("#text-content").attr("disabled",false);d.find("#genome").attr("disabled",false);d.find("#extension").attr("disabled",false);d.find("#space_to_tabs").attr("disabled",false)}else{d.find("#text-content").attr("disabled",true);d.find("#genome").attr("disabled",true);d.find("#extension").attr("disabled",true);d.find("#space_to_tabs").attr("disabled",true)}if(c=="success"){d.addClass("success");d.find("#percentage").html("100%")}if(c=="error"){d.addClass("danger");d.find(".progress").remove()}},_formatSize:function(c){var d="";if(c>=100000000000){c=c/100000000000;d="TB"}else{if(c>=100000000){c=c/100000000;d="GB"}else{if(c>=100000){c=c/100000;d="MB"}else{if(c>=100){c=c/100;d="KB"}else{if(c>0){c=c*10;d="b"}else{return"<strong>-</strong>"}}}}}return"<strong>"+(Math.round(c)/10)+"</strong> "+d},_showExtensionInfo:function(){var c=this;var d=$(this.el).find("#extension_info");var f=this.model.get("extension");var e=$(this.el).find("#extension").find("option:selected").text();d.popover({html:true,title:e,content:b(f),placement:"bottom",container:c.$el.parent()});d.popover("show");clearTimeout(this.popover_timeout)},_hideExtensionInfo:function(){var c=this;this.popover_timeout=setTimeout(function(){c.$el.find("#extension_info").popover("destroy")},this.options.timeout)},_template:function(e){var d=this;var c='<tr id="upload-item-'+e.id+'" class="upload-item"><td><div style="position: relative;"><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td>';c+='<td><select id="extension" class="extension">';for(key in d.app.select_extension){c+='<option value="'+d.app.select_extension[key][1]+'">'+d.app.select_extension[key][0]+"</option>"}c+='</select> <i id="extension_info" class="fa fa-search" style="cursor: pointer;"/></td>';c+='<td><select id="genome" class="genome">';for(key in d.app.select_genome){c+='<option value="'+d.app.select_genome[key][1]+'">'+d.app.select_genome[key][0]+"</option>"}c+="</select></td>";c+='<td><input id="space_to_tabs" type="checkbox"></input></td><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>';return c}})});
\ 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: guerler: Upload: Add file extension descriptions
by commits-noreply@bitbucket.org 04 Feb '14
by commits-noreply@bitbucket.org 04 Feb '14
04 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e1ac3242786b/
Changeset: e1ac3242786b
User: guerler
Date: 2014-02-04 20:53:26
Summary: Upload: Add file extension descriptions
Affected #: 8 files
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/scripts/mvc/upload/upload-extensions.js
--- /dev/null
+++ b/static/scripts/mvc/upload/upload-extensions.js
@@ -0,0 +1,110 @@
+// dependencies
+define([], function() {
+
+var dictionary = {
+
+ auto : {
+ text: 'The system will attempt to detect Axt, Fasta, Fastqsolexa, Gff, Gff3, Html, Lav, Maf, Tabular, Wiggle, Bed and Interval (Bed with headers) formats. If your file is not detected properly as one of the known formats, it most likely means that it has some format problems (e.g., different number of columns on different rows). You can still coerce the system to set your data to the format you think it should be. You can also upload compressed files, which will automatically be decompressed'
+ },
+
+ ab1 : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Ab1',
+ text: 'A binary sequence file in \'ab1\' format with a \'.ab1\' file extension. You must manually select this \'File Format\' when uploading the file.'
+ },
+
+ axt : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Axt',
+ text: 'blastz pairwise alignment format. Each alignment block in an axt file contains three lines: a summary line and 2 sequence lines. Blocks are separated from one another by blank lines. The summary line contains chromosomal position and size information about the alignment. It consists of 9 required fields.'
+ },
+
+ bam : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#BAM',
+ text: 'A binary file compressed in the BGZF format with a \'.bam\' file extension.'
+ },
+
+ bed : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Bed',
+ text: 'BED format provides a flexible way to define the data lines that are displayed in an annotation track. BED lines have three required columns and nine additional optional columns. The three required columns are chrom, chromStart and chromEnd.'
+ },
+
+ fasta : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Fasta',
+ text: 'A sequence in FASTA format consists of a single-line description, followed by lines of sequence data. The first character of the description line is a greater-than (">") symbol in the first column. All lines should be shorter than 80 characters.'
+ },
+
+ fastq : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Fastq',
+ text: 'FASTQ format is a text-based format for storing both a biological sequence (usually nucleotide sequence) and its corresponding quality scores. '
+ },
+
+ fastqsolexa : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#FastqSolexa',
+ text: 'FastqSolexa is the Illumina (Solexa) variant of the Fastq format, which stores sequences and quality scores in a single file.'
+ },
+
+ gff : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#GFF',
+ text: 'GFF lines have nine required fields that must be tab-separated.'
+ },
+
+ gff3 : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#GFF3',
+ text: 'The GFF3 format addresses the most common extensions to GFF, while preserving backward compatibility with previous formats.'
+ },
+
+ interval : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#GFF3',
+ text: 'File must start with definition line in the following format (columns may be in any order).'
+ },
+
+ lav : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#GFF3',
+ text: 'Lav is the primary output format for BLASTZ. The first line of a .lav file begins with #:lav..'
+ },
+
+ maf : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#MAF',
+ text: 'TBA and multiz multiple alignment format. The first line of a .maf file begins with ##maf. This word is followed by white-space-separated "variable=value" pairs. There should be no white space surrounding the "=".'
+ },
+
+ scf : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Scf',
+ text: 'A binary sequence file in \'scf\' format with a \'.scf\' file extension. You must manually select this \'File Format\' when uploading the file.'
+ },
+
+ sff : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Sff',
+ text: 'A binary file in \'Standard Flowgram Format\' with a \'.sff\' file extension.'
+ },
+
+ tabular : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Tabular_.28tab_delimited.29',
+ text: 'Any data in tab delimited format (tabular).'
+ },
+
+ wig : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Wig',
+ text: 'The wiggle format is line-oriented. Wiggle data is preceded by a track definition line, which adds a number of options for controlling the default display of this track.'
+ },
+
+ txt : {
+ url : 'https://wiki.galaxyproject.org/Learn/Datatypes#Plain_text',
+ text: 'Any text file.'
+ },
+
+};
+
+// create description content
+return function(key) {
+ var description = dictionary[key];
+ if (description) {
+ var tmpl = description.text;
+ if (description.url) {
+ tmpl += ' (<a href="' + description.url + '" target="_blank">read more</a>)';
+ }
+ return tmpl;
+ } else {
+ return 'There is no description available for this file extension.';
+ }
+}
+});
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -1,11 +1,12 @@
// dependencies
-define(['mvc/upload/upload-model'], function(UploadModel) {
+define(['mvc/upload/upload-model', 'mvc/upload/upload-extensions'], function(UploadModel, UploadExtensions) {
// item view
return Backbone.View.extend({
// options
options: {
- padding : 8
+ padding : 8,
+ timeout : 2000
},
// states
@@ -46,6 +47,10 @@
self.app.collection.remove(self.model);
}
});
+
+ // handle mouse over
+ it.find('#extension_info').on('mouseover' , function() { self._showExtensionInfo(); })
+ .on('mouseleave', function() { self._hideExtensionInfo(); });
// handle text editing event
it.find('#text-content').on('keyup', function() {
@@ -70,6 +75,7 @@
// handle extension selection
it.find('#extension').on('change', function(e) {
self.model.set('extension', $(e.target).val());
+ self.$el.find('#extension_info').popover('destroy');
});
// handle space to tabs button
@@ -139,7 +145,7 @@
// genome
_refreshGenome: function()
{
- // write error message
+ // update genome info on screen
var genome = this.model.get('genome');
this.$el.find('#genome').val(genome);
},
@@ -226,6 +232,41 @@
return '<strong>' + (Math.round(size) / 10) + '</strong> ' + unit;
},
+ // attach file info popup
+ _showExtensionInfo : function()
+ {
+ // initialize
+ var self = this;
+ var $el = $(this.el).find('#extension_info');
+ var extension = this.model.get('extension');
+ var title = $(this.el).find('#extension').find('option:selected').text();
+
+ // create popup
+ $el.popover({
+ html: true,
+ title: title,
+ content: UploadExtensions(extension),
+ placement: 'bottom',
+ container: self.$el.parent()
+ });
+
+ // show popup
+ $el.popover('show');
+
+ // clear previous timers
+ clearTimeout(this.popover_timeout);
+ },
+
+ // attach file info popup
+ _hideExtensionInfo : function()
+ {
+ // remove popup
+ var self = this
+ this.popover_timeout = setTimeout(function() {
+ self.$el.find('#extension_info').popover('destroy');
+ }, this.options.timeout);
+ },
+
// template
_template: function(options)
{
@@ -251,6 +292,7 @@
for (key in self.app.select_extension)
tmpl += '<option value="' + self.app.select_extension[key][1] + '">' + self.app.select_extension[key][0] + '</option>';
tmpl += '</select>' +
+ ' <i id="extension_info" class="fa fa-question" style="cursor: pointer;"/>' +
'</td>';
// add genome selector
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/scripts/packed/mvc/upload/upload-extensions.js
--- /dev/null
+++ b/static/scripts/packed/mvc/upload/upload-extensions.js
@@ -0,0 +1,1 @@
+define([],function(){var a={auto:{text:"The system will attempt to detect Axt, Fasta, Fastqsolexa, Gff, Gff3, Html, Lav, Maf, Tabular, Wiggle, Bed and Interval (Bed with headers) formats. If your file is not detected properly as one of the known formats, it most likely means that it has some format problems (e.g., different number of columns on different rows). You can still coerce the system to set your data to the format you think it should be. You can also upload compressed files, which will automatically be decompressed"},ab1:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Ab1",text:"A binary sequence file in 'ab1' format with a '.ab1' file extension. You must manually select this 'File Format' when uploading the file."},axt:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Axt",text:"blastz pairwise alignment format. Each alignment block in an axt file contains three lines: a summary line and 2 sequence lines. Blocks are separated from one another by blank lines. The summary line contains chromosomal position and size information about the alignment. It consists of 9 required fields."},bam:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#BAM",text:"A binary file compressed in the BGZF format with a '.bam' file extension."},bed:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Bed",text:"BED format provides a flexible way to define the data lines that are displayed in an annotation track. BED lines have three required columns and nine additional optional columns. The three required columns are chrom, chromStart and chromEnd."},fasta:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Fasta",text:'A sequence in FASTA format consists of a single-line description, followed by lines of sequence data. The first character of the description line is a greater-than (">") symbol in the first column. All lines should be shorter than 80 characters.'},fastq:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Fastq",text:"FASTQ format is a text-based format for storing both a biological sequence (usually nucleotide sequence) and its corresponding quality scores. "},fastqsolexa:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#FastqSolexa",text:"FastqSolexa is the Illumina (Solexa) variant of the Fastq format, which stores sequences and quality scores in a single file."},gff:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#GFF",text:"GFF lines have nine required fields that must be tab-separated."},gff3:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#GFF3",text:"The GFF3 format addresses the most common extensions to GFF, while preserving backward compatibility with previous formats."},interval:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#GFF3",text:"File must start with definition line in the following format (columns may be in any order)."},lav:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#GFF3",text:"Lav is the primary output format for BLASTZ. The first line of a .lav file begins with #:lav.."},maf:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#MAF",text:'TBA and multiz multiple alignment format. The first line of a .maf file begins with ##maf. This word is followed by white-space-separated "variable=value" pairs. There should be no white space surrounding the "=".'},scf:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Scf",text:"A binary sequence file in 'scf' format with a '.scf' file extension. You must manually select this 'File Format' when uploading the file."},sff:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Sff",text:"A binary file in 'Standard Flowgram Format' with a '.sff' file extension."},tabular:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Tabular_.28tab_delimited.29",text:"Any data in tab delimited format (tabular)."},wig:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Wig",text:"The wiggle format is line-oriented. Wiggle data is preceded by a track definition line, which adds a number of options for controlling the default display of this track."},txt:{url:"https://wiki.galaxyproject.org/Learn/Datatypes#Plain_text",text:"Any text file."},};return function(c){var d=a[c];if(d){var b=d.text;if(d.url){b+=' (<a href="'+d.url+'" target="_blank">read more</a>)'}return b}else{return"There is no description available for this file extension."}}});
\ No newline at end of file
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/scripts/packed/mvc/upload/upload-row.js
--- a/static/scripts/packed/mvc/upload/upload-row.js
+++ b/static/scripts/packed/mvc/upload/upload-row.js
@@ -1,1 +1,1 @@
-define(["mvc/upload/upload-model"],function(a){return Backbone.View.extend({options:{padding:8},status_classes:{init:"symbol fa fa-trash-o",queued:"symbol fa fa-spinner fa-spin",running:"symbol fa fa-spinner fa-spin",success:"symbol fa fa-check",error:"symbol fa fa-exclamation-triangle"},initialize:function(e,c){this.app=e;var b=this;this.model=new a.Model(c);this.setElement(this._template(c));var d=this.$el;d.find("#symbol").on("click",function(){var f=b.model.get("status");if(f=="init"||f=="success"||f=="error"){b.app.collection.remove(b.model)}});d.find("#text-content").on("keyup",function(){var f=d.find("#text-content");var h=f.val();var g=h.length;d.find("#size").html(b._formatSize(g));b.model.set("url_paste",h);b.model.set("file_size",g)});d.find("#genome").on("change",function(f){b.model.set("genome",$(f.target).val())});d.find("#extension").on("change",function(f){b.model.set("extension",$(f.target).val())});d.find("#space_to_tabs").on("change",function(f){b.model.set("space_to_tabs",$(f.target).prop("checked"))});this.model.on("change:percentage",function(){b._refreshPercentage()});this.model.on("change:status",function(){b._refreshStatus()});this.model.on("change:info",function(){b._refreshInfo()});this.model.on("change:genome",function(){b._refreshGenome()});this.model.on("remove",function(){b.remove()});this.app.collection.on("reset",function(){b.remove()})},render:function(){var h=this.model.get("file_name");var c=this.model.get("file_size");var e=this.$el;e.find("#title").html(h);e.find("#size").html(this._formatSize(c));if(c==-1){var g=e.find("#text");var f=this.options.padding;var d=e.width()-2*f;var b=e.height()-f;g.css("width",d+"px");g.css("top",b+"px");e.height(b+g.height()+2*f);g.show()}},_refreshGenome:function(){var b=this.model.get("genome");this.$el.find("#genome").val(b)},_refreshInfo:function(){var b=this.model.get("info");if(b){this.$el.find("#info").html("<strong>Failed: </strong>"+b).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var b=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:b+"%"});if(b!=100){this.$el.find("#percentage").html(b+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var c=this.$el;var b=this.model.get("status");var e=this.status_classes[b];var d=this.$el.find("#symbol");d.removeClass();d.addClass(e);if(b=="init"){c.find("#text-content").attr("disabled",false);c.find("#genome").attr("disabled",false);c.find("#extension").attr("disabled",false);c.find("#space_to_tabs").attr("disabled",false)}else{c.find("#text-content").attr("disabled",true);c.find("#genome").attr("disabled",true);c.find("#extension").attr("disabled",true);c.find("#space_to_tabs").attr("disabled",true)}if(b=="success"){c.addClass("success");c.find("#percentage").html("100%")}if(b=="error"){c.addClass("danger");c.find(".progress").remove()}},_formatSize:function(b){var c="";if(b>=100000000000){b=b/100000000000;c="TB"}else{if(b>=100000000){b=b/100000000;c="GB"}else{if(b>=100000){b=b/100000;c="MB"}else{if(b>=100){b=b/100;c="KB"}else{if(b>0){b=b*10;c="b"}else{return"<strong>-</strong>"}}}}}return"<strong>"+(Math.round(b)/10)+"</strong> "+c},_template:function(d){var c=this;var b='<tr id="upload-item-'+d.id+'" class="upload-item"><td><div style="position: relative;"><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td>';b+='<td><select id="extension" class="extension">';for(key in c.app.select_extension){b+='<option value="'+c.app.select_extension[key][1]+'">'+c.app.select_extension[key][0]+"</option>"}b+="</select></td>";b+='<td><select id="genome" class="genome">';for(key in c.app.select_genome){b+='<option value="'+c.app.select_genome[key][1]+'">'+c.app.select_genome[key][0]+"</option>"}b+="</select></td>";b+='<td><input id="space_to_tabs" type="checkbox"></input></td><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>';return b}})});
\ No newline at end of file
+define(["mvc/upload/upload-model","mvc/upload/upload-extensions"],function(a,b){return Backbone.View.extend({options:{padding:8,timeout:2000},status_classes:{init:"symbol fa fa-trash-o",queued:"symbol fa fa-spinner fa-spin",running:"symbol fa fa-spinner fa-spin",success:"symbol fa fa-check",error:"symbol fa fa-exclamation-triangle"},initialize:function(f,d){this.app=f;var c=this;this.model=new a.Model(d);this.setElement(this._template(d));var e=this.$el;e.find("#symbol").on("click",function(){var g=c.model.get("status");if(g=="init"||g=="success"||g=="error"){c.app.collection.remove(c.model)}});e.find("#extension_info").on("mouseover",function(){c._showExtensionInfo()}).on("mouseleave",function(){c._hideExtensionInfo()});e.find("#text-content").on("keyup",function(){var g=e.find("#text-content");var i=g.val();var h=i.length;e.find("#size").html(c._formatSize(h));c.model.set("url_paste",i);c.model.set("file_size",h)});e.find("#genome").on("change",function(g){c.model.set("genome",$(g.target).val())});e.find("#extension").on("change",function(g){c.model.set("extension",$(g.target).val());c.$el.find("#extension_info").popover("destroy")});e.find("#space_to_tabs").on("change",function(g){c.model.set("space_to_tabs",$(g.target).prop("checked"))});this.model.on("change:percentage",function(){c._refreshPercentage()});this.model.on("change:status",function(){c._refreshStatus()});this.model.on("change:info",function(){c._refreshInfo()});this.model.on("change:genome",function(){c._refreshGenome()});this.model.on("remove",function(){c.remove()});this.app.collection.on("reset",function(){c.remove()})},render:function(){var i=this.model.get("file_name");var d=this.model.get("file_size");var f=this.$el;f.find("#title").html(i);f.find("#size").html(this._formatSize(d));if(d==-1){var h=f.find("#text");var g=this.options.padding;var e=f.width()-2*g;var c=f.height()-g;h.css("width",e+"px");h.css("top",c+"px");f.height(c+h.height()+2*g);h.show()}},_refreshGenome:function(){var c=this.model.get("genome");this.$el.find("#genome").val(c)},_refreshInfo:function(){var c=this.model.get("info");if(c){this.$el.find("#info").html("<strong>Failed: </strong>"+c).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var c=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:c+"%"});if(c!=100){this.$el.find("#percentage").html(c+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var d=this.$el;var c=this.model.get("status");var f=this.status_classes[c];var e=this.$el.find("#symbol");e.removeClass();e.addClass(f);if(c=="init"){d.find("#text-content").attr("disabled",false);d.find("#genome").attr("disabled",false);d.find("#extension").attr("disabled",false);d.find("#space_to_tabs").attr("disabled",false)}else{d.find("#text-content").attr("disabled",true);d.find("#genome").attr("disabled",true);d.find("#extension").attr("disabled",true);d.find("#space_to_tabs").attr("disabled",true)}if(c=="success"){d.addClass("success");d.find("#percentage").html("100%")}if(c=="error"){d.addClass("danger");d.find(".progress").remove()}},_formatSize:function(c){var d="";if(c>=100000000000){c=c/100000000000;d="TB"}else{if(c>=100000000){c=c/100000000;d="GB"}else{if(c>=100000){c=c/100000;d="MB"}else{if(c>=100){c=c/100;d="KB"}else{if(c>0){c=c*10;d="b"}else{return"<strong>-</strong>"}}}}}return"<strong>"+(Math.round(c)/10)+"</strong> "+d},_showExtensionInfo:function(){var c=this;var d=$(this.el).find("#extension_info");var f=this.model.get("extension");var e=$(this.el).find("#extension").find("option:selected").text();d.popover({html:true,title:e,content:b(f),placement:"bottom",container:c.$el.parent()});d.popover("show");clearTimeout(this.popover_timeout)},_hideExtensionInfo:function(){var c=this;this.popover_timeout=setTimeout(function(){c.$el.find("#extension_info").popover("destroy")},this.options.timeout)},_template:function(e){var d=this;var c='<tr id="upload-item-'+e.id+'" class="upload-item"><td><div style="position: relative;"><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td>';c+='<td><select id="extension" class="extension">';for(key in d.app.select_extension){c+='<option value="'+d.app.select_extension[key][1]+'">'+d.app.select_extension[key][0]+"</option>"}c+='</select> <i id="extension_info" class="fa fa-question" style="cursor: pointer;"/></td>';c+='<td><select id="genome" class="genome">';for(key in d.app.select_genome){c+='<option value="'+d.app.select_genome[key][1]+'">'+d.app.select_genome[key][0]+"</option>"}c+="</select></td>";c+='<td><input id="space_to_tabs" type="checkbox"></input></td><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>';return c}})});
\ No newline at end of file
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/scripts/packed/utils/uploadbox.js
--- a/static/scripts/packed/utils/uploadbox.js
+++ b/static/scripts/packed/utils/uploadbox.js
@@ -1,1 +1,1 @@
-(function(c){jQuery.event.props.push("dataTransfer");var h={url:"",paramname:"content",maxfilesize:2048,maxfilenumber:20,dragover:function(){},dragleave:function(){},announce:function(){},initialize:function(){},progress:function(){},success:function(){},error:function(k,l,m){alert(m)},complete:function(){},error_filesize:"File exceeds 2GB. Please use an FTP client.",error_default:"Please make sure the file is available.",error_server:"Upload request failed.",error_login:"Uploads require you to log in.",error_missing:"No upload content available."};var a={};var e={};var f=0;var j=0;var d=false;var g=false;var b=null;var i=null;c.fn.uploadbox=function(A){a=c.extend({},h,A);b=this;b.append('<input id="uploadbox_input" type="file" style="display: none" multiple>');b.on("drop",o);b.on("dragover",p);b.on("dragleave",x);c("#uploadbox_input").change(function(B){z(B.target.files);c(this).val("")});function o(B){if(!B.dataTransfer){return}z(B.dataTransfer.files);B.preventDefault();return false}function p(B){B.preventDefault();a.dragover.call(B)}function x(B){B.stopPropagation();a.dragleave.call(B)}function k(B){if(B.lengthComputable){a.progress(this.index,this.file,Math.round((B.loaded*100)/B.total))}}function z(D){if(d){return}for(var C=0;C<D.length;C++){if(j>=a.maxfilenumber){break}var B=String(f++);e[B]=D[C];a.announce(B,e[B],"");j++}}function r(B){if(e[B]){delete e[B];j--}}function m(){if(j==0||g){g=false;d=false;a.complete();return}else{d=true}var D=-1;for(var F in e){D=F;break}var E=e[D];r(D);var C=E.size;var B=1048576*a.maxfilesize;if(C<B){var G=a.initialize(D,E);if(G){q(D,E,G)}else{u(D,E,a.error_missing)}}else{u(D,E,a.error_filesize)}}function q(B,D,E){var F=new FormData();for(var C in E){F.append(C,E[C])}if(D.size>0){F.append(a.paramname,D,D.name)}i=new XMLHttpRequest();i.open("POST",a.url,true);i.setRequestHeader("Accept","application/json");i.setRequestHeader("Cache-Control","no-cache");i.setRequestHeader("X-Requested-With","XMLHttpRequest");i.onreadystatechange=function(){if(i.readyState!=i.DONE){return}var G=null;if(i.responseText){try{G=jQuery.parseJSON(i.responseText)}catch(H){G=i.responseText}}if(i.status<200||i.status>299){var I=i.statusText;if(i.status==403){I=a.error_login}else{if(i.status==0){I=a.error_server}else{if(!I){I=a.error_default}}}u(B,D,I+" ("+i.status+")")}else{y(B,D,G)}};i.upload.index=B;i.upload.file=D;i.upload.addEventListener("progress",k,false);i.send(F)}function y(B,C,D){a.success(B,C,D);m()}function u(B,C,D){a.error(B,C,D);m()}function w(){c("#uploadbox_input").trigger("click")}function t(B){for(B in e){r(B)}}function l(){if(!d){d=true;m()}}function v(){g=true}function n(B){a=c.extend({},a,B);return a}function s(){return window.File&&window.FormData&&window.XMLHttpRequest&&window.FileList}return{select:w,add:z,remove:r,start:l,stop:v,reset:t,configure:n,compatible:s}}})(jQuery);
\ No newline at end of file
+(function(c){jQuery.event.props.push("dataTransfer");var h={url:"",paramname:"content",maxfilesize:2048,maxfilenumber:50,dragover:function(){},dragleave:function(){},announce:function(){},initialize:function(){},progress:function(){},success:function(){},error:function(k,l,m){alert(m)},complete:function(){},error_filesize:"File exceeds 2GB. Please use an FTP client.",error_default:"Please make sure the file is available.",error_server:"Upload request failed.",error_login:"Uploads require you to log in.",error_missing:"No upload content available."};var a={};var e={};var f=0;var j=0;var d=false;var g=false;var b=null;var i=null;c.fn.uploadbox=function(A){a=c.extend({},h,A);b=this;b.append('<input id="uploadbox_input" type="file" style="display: none" multiple>');b.on("drop",o);b.on("dragover",p);b.on("dragleave",x);c("#uploadbox_input").change(function(B){z(B.target.files);c(this).val("")});function o(B){if(!B.dataTransfer){return}z(B.dataTransfer.files);B.preventDefault();return false}function p(B){B.preventDefault();a.dragover.call(B)}function x(B){B.stopPropagation();a.dragleave.call(B)}function k(B){if(B.lengthComputable){a.progress(this.index,this.file,Math.round((B.loaded*100)/B.total))}}function z(D){if(d){return}for(var C=0;C<D.length;C++){if(j>=a.maxfilenumber){break}var B=String(f++);e[B]=D[C];a.announce(B,e[B],"");j++}}function r(B){if(e[B]){delete e[B];j--}}function m(){if(j==0||g){g=false;d=false;a.complete();return}else{d=true}var D=-1;for(var F in e){D=F;break}var E=e[D];r(D);var C=E.size;var B=1048576*a.maxfilesize;if(C<B){var G=a.initialize(D,E);if(G){q(D,E,G)}else{u(D,E,a.error_missing)}}else{u(D,E,a.error_filesize)}}function q(B,D,E){var F=new FormData();for(var C in E){F.append(C,E[C])}if(D.size>0){F.append(a.paramname,D,D.name)}i=new XMLHttpRequest();i.open("POST",a.url,true);i.setRequestHeader("Accept","application/json");i.setRequestHeader("Cache-Control","no-cache");i.setRequestHeader("X-Requested-With","XMLHttpRequest");i.onreadystatechange=function(){if(i.readyState!=i.DONE){return}var G=null;if(i.responseText){try{G=jQuery.parseJSON(i.responseText)}catch(H){G=i.responseText}}if(i.status<200||i.status>299){var I=i.statusText;if(i.status==403){I=a.error_login}else{if(i.status==0){I=a.error_server}else{if(!I){I=a.error_default}}}u(B,D,I+" ("+i.status+")")}else{y(B,D,G)}};i.upload.index=B;i.upload.file=D;i.upload.addEventListener("progress",k,false);i.send(F)}function y(B,C,D){a.success(B,C,D);m()}function u(B,C,D){a.error(B,C,D);m()}function w(){c("#uploadbox_input").trigger("click")}function t(B){for(B in e){r(B)}}function l(){if(!d){d=true;m()}}function v(){g=true}function n(B){a=c.extend({},a,B);return a}function s(){return window.File&&window.FormData&&window.XMLHttpRequest&&window.FileList}return{select:w,add:z,remove:r,start:l,stop:v,reset:t,configure:n,compatible:s}}})(jQuery);
\ No newline at end of file
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/scripts/utils/uploadbox.js
--- a/static/scripts/utils/uploadbox.js
+++ b/static/scripts/utils/uploadbox.js
@@ -12,7 +12,7 @@
url : '',
paramname : 'content',
maxfilesize : 2048,
- maxfilenumber : 20,
+ maxfilenumber : 50,
dragover : function() {},
dragleave : function() {},
announce : function() {},
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1257,7 +1257,8 @@
.progress-button .progress-bar-notransition{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}
.progress-button .label{position:absolute;top:0px;width:inherit;text-align:center;line-height:19px}
.upload-info{font-weight:normal;text-align:center}
-.upload-box{width:100%;height:95%;text-align:center;overflow:scroll;font-size:12px;line-height:1.33;-moz-border-radius:5px;border-radius:5px;border:1px dashed #bfbfbf;padding:10px;overflow-x:hidden;-ms-overflow-style:none}.upload-box .table{width:100%}
+.upload-box{width:100%;height:95%;text-align:center;overflow:scroll;font-size:12px;line-height:1.33;-moz-border-radius:5px;border-radius:5px;border:1px dashed #bfbfbf;padding:10px;overflow-x:hidden;-ms-overflow-style:none}.upload-box .popover{max-width:600px;width:auto}
+.upload-box .table{width:100%}
.upload-box .table th{text-align:center;white-space:nowrap}
.upload-box .table td{margin:0px;paddign:0px}
.upload-box .title{width:130px;word-wrap:break-word;font-size:11px}
diff -r 82d2c2109792d098ddc5ede7992ae132e596584a -r e1ac3242786b055b8cc2b80ed701643f41c1e42e static/style/src/less/upload.less
--- a/static/style/src/less/upload.less
+++ b/static/style/src/less/upload.less
@@ -61,7 +61,12 @@
padding : 10px;
overflow-x : hidden;
-ms-overflow-style: none;
-
+
+ .popover {
+ max-width: 500px;
+ width: auto;
+ }
+
.table {
width : 100%;
}
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 commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/935942afdf70/
Changeset: 935942afdf70
User: nsoranzo
Date: 2014-01-27 19:51:46
Summary: Remove unused imports and unused variables. Fix spacing.
Affected #: 17 files
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/WeightedAverage.py
--- a/tools/regVariation/WeightedAverage.py
+++ b/tools/regVariation/WeightedAverage.py
@@ -1,20 +1,16 @@
#!/usr/bin/env python
"""
-
usage: %prog bed_file_1 bed_file_2 out_file
-1, --cols1=N,N,N,N: Columns for chr, start, end, strand in first file
-2, --cols2=N,N,N,N,N: Columns for chr, start, end, strand, name/value in second file
"""
-from galaxy import eggs
import collections
-import sys, string
+import sys
#import numpy
from galaxy import eggs
import pkg_resources
pkg_resources.require( "bx-python" )
-import sys, traceback, fileinput
-from warnings import warn
from galaxy.tools.util.galaxyops import *
from bx.cookbook import doc_optparse
@@ -27,77 +23,72 @@
sys.exit()
-def FindRate(chromosome,start_stop,dictType):
- OverlapList=[]
+def FindRate(chromosome, start_stop, dictType):
+ OverlapList = []
for tempO in dictType[chromosome]:
- DatabaseInterval=[tempO[0],tempO[1]]
- Overlap=GetOverlap(start_stop,DatabaseInterval)
- if Overlap>0:
- OverlapList.append([Overlap,tempO[2]])
-
- if len(OverlapList)>0:
-
- SumRecomb=0
- SumOverlap=0
+ DatabaseInterval = [tempO[0], tempO[1]]
+ Overlap = GetOverlap( start_stop, DatabaseInterval )
+ if Overlap > 0:
+ OverlapList.append([Overlap, tempO[2]])
+
+ if len(OverlapList) > 0:
+ SumRecomb = 0
+ SumOverlap = 0
for member in OverlapList:
- SumRecomb+=member[0]*member[1]
- SumOverlap+=member[0]
- averageRate=SumRecomb/SumOverlap
-
+ SumRecomb += member[0]*member[1]
+ SumOverlap += member[0]
+ averageRate = SumRecomb/SumOverlap
return averageRate
-
else:
return 'NA'
-
-
-
-def GetOverlap(a,b):
- return min(a[1],b[1])-max(a[0],b[0])
+
+
+def GetOverlap(a, b):
+ return min(a[1], b[1])-max(a[0], b[0])
+
options, args = doc_optparse.parse( __doc__ )
try:
chr_col_1, start_col_1, end_col_1, strand_col1 = parse_cols_arg( options.cols1 )
- chr_col_2, start_col_2, end_col_2, strand_col2, name_col_2 = parse_cols_arg( options.cols2 )
+ chr_col_2, start_col_2, end_col_2, strand_col2, name_col_2 = parse_cols_arg( options.cols2 )
input1, input2, input3 = args
except Exception, eee:
print eee
stop_err( "Data issue: click the pencil icon in the history item to correct the metadata attributes." )
-
+fd2 = open(input2)
+lines2 = fd2.readlines()
+RecombChrDict = collections.defaultdict(list)
-fd2=open(input2)
-lines2=fd2.readlines()
-RecombChrDict=collections.defaultdict(list)
-
-skipped=0
+skipped = 0
for line in lines2:
- temp=line.strip().split()
+ temp = line.strip().split()
try:
assert float(temp[int(name_col_2)])
except:
- skipped+=1
+ skipped += 1
continue
- tempIndex=[int(temp[int(start_col_2)]),int(temp[int(end_col_2)]),float(temp[int(name_col_2)])]
+ tempIndex = [int(temp[int(start_col_2)]), int(temp[int(end_col_2)]), float(temp[int(name_col_2)])]
RecombChrDict[temp[int(chr_col_2)]].append(tempIndex)
-print "Skipped %d features with invalid values" %(skipped)
+print "Skipped %d features with invalid values" % (skipped)
-fd1=open(input1)
-lines=fd1.readlines()
-finalProduct=''
+fd1 = open(input1)
+lines = fd1.readlines()
+finalProduct = ''
for line in lines:
- temp=line.strip().split('\t')
- chromosome=temp[int(chr_col_1)]
- start=int(temp[int(start_col_1)])
- stop=int(temp[int(end_col_1)])
- start_stop=[start,stop]
- RecombRate=FindRate(chromosome,start_stop,RecombChrDict)
+ temp = line.strip().split('\t')
+ chromosome = temp[int(chr_col_1)]
+ start = int(temp[int(start_col_1)])
+ stop = int(temp[int(end_col_1)])
+ start_stop = [start, stop]
+ RecombRate = FindRate( chromosome, start_stop, RecombChrDict )
try:
- RecombRate="%.4f" %(float(RecombRate))
+ RecombRate = "%.4f" % (float(RecombRate))
except:
- RecombRate=RecombRate
- finalProduct+=line.strip()+'\t'+str(RecombRate)+'\n'
-fdd=open(input3,'w')
+ RecombRate = RecombRate
+ finalProduct += line.strip()+'\t'+str(RecombRate)+'\n'
+fdd = open(input3, 'w')
fdd.writelines(finalProduct)
fdd.close()
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/best_regression_subsets.py
--- a/tools/regVariation/best_regression_subsets.py
+++ b/tools/regVariation/best_regression_subsets.py
@@ -2,7 +2,7 @@
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -10,19 +10,20 @@
sys.stderr.write(msg)
sys.exit()
+
infile = sys.argv[1]
y_col = int(sys.argv[2])-1
x_cols = sys.argv[3].split(',')
outfile = sys.argv[4]
outfile2 = sys.argv[5]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -32,12 +33,12 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile ) ):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -46,7 +47,7 @@
except Exception, ey:
yval = r('NA')
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except Exception, ex:
@@ -59,10 +60,10 @@
x_vals1 = numpy.asarray(x_vals).transpose()
-dat= r.list(x=array(x_vals1), y=y_vals)
+dat = r.list(x=array(x_vals1), y=y_vals)
r.library("leaps")
-
+
set_default_mode(NO_CONVERSION)
try:
leaps = r.regsubsets(r("y ~ x"), data= r.na_exclude(dat))
@@ -75,10 +76,10 @@
pattern = "["
for i in range(tot):
pattern = pattern + 'c' + str(int(x_cols[int(i)]) + 1) + ' '
-pattern = pattern.strip() + ']'
-print >>fout, "#Vars\t%s\tR-sq\tAdj. R-sq\tC-p\tbic" %(pattern)
-for ind,item in enumerate(summary['outmat']):
- print >>fout, "%s\t%s\t%s\t%s\t%s\t%s" %(str(item).count('*'), item, summary['rsq'][ind], summary['adjr2'][ind], summary['cp'][ind], summary['bic'][ind])
+pattern = pattern.strip() + ']'
+print >> fout, "#Vars\t%s\tR-sq\tAdj. R-sq\tC-p\tbic" % (pattern)
+for ind, item in enumerate(summary['outmat']):
+ print >> fout, "%s\t%s\t%s\t%s\t%s\t%s" % (str(item).count('*'), item, summary['rsq'][ind], summary['adjr2'][ind], summary['cp'][ind], summary['bic'][ind])
r.pdf( outfile2, 8, 8 )
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/featureCounter.py
--- a/tools/regVariation/featureCounter.py
+++ b/tools/regVariation/featureCounter.py
@@ -11,8 +11,7 @@
from galaxy import eggs
import pkg_resources
pkg_resources.require( "bx-python" )
-import sys, traceback, fileinput
-from warnings import warn
+import sys, fileinput
from bx.intervals.io import *
from bx.cookbook import doc_optparse
from bx.intervals.operations import quicksect
@@ -33,7 +32,7 @@
partial += 1
if node.left and node.left.maxend > start:
counter(node.left, start, end)
- if node.right:
+ if node.right:
counter(node.right, start, end)
elif start < node.start < end:
if node.end <= end:
@@ -42,10 +41,10 @@
partial += 1
if node.left and node.left.maxend > start:
counter(node.left, start, end)
- if node.right:
+ if node.right:
counter(node.right, start, end)
else:
- if node.left:
+ if node.left:
counter(node.left, start, end)
def count_coverage( readers, comments=True ):
@@ -58,8 +57,8 @@
if type( item ) is GenomicInterval:
rightTree.insert( item, secondary.linenum, item.fields )
- bitsets = secondary_copy.binned_bitsets()
-
+ bitsets = secondary_copy.binned_bitsets()
+
global full, partial
for interval in primary:
@@ -82,7 +81,7 @@
bases_covered = bitsets[ chrom ].count_range( start, end-start )
if (end - start) == 0:
percent = 0
- else:
+ else:
percent = float(bases_covered) / float(end - start)
if bases_covered:
root = rightTree.chroms[chrom] #root node for the chrom tree
@@ -92,13 +91,14 @@
interval.fields.append(str(full))
interval.fields.append(str(partial))
yield interval
-
+
+
def main():
options, args = doc_optparse.parse( __doc__ )
try:
chr_col_1, start_col_1, end_col_1, strand_col_1 = parse_cols_arg( options.cols1 )
- chr_col_2, start_col_2, end_col_2, strand_col_2 = parse_cols_arg( options.cols2 )
+ chr_col_2, start_col_2, end_col_2, strand_col_2 = parse_cols_arg( options.cols2 )
in1_fname, in2_fname, out_fname = args
except:
stop_err( "Data issue: click the pencil icon in the history item to correct the metadata attributes." )
@@ -126,7 +126,7 @@
out_file = open( out_fname, "w" )
try:
- for line in count_coverage([g1,g2,g2_copy]):
+ for line in count_coverage([g1, g2, g2_copy]):
if type( line ) is GenomicInterval:
out_file.write( "%s\n" % "\t".join( line.fields ) )
else:
@@ -143,6 +143,7 @@
print skipped( g2, filedesc=" of 2nd dataset" )
elif g2_copy.skipped > 0:
print skipped( g2_copy, filedesc=" of 2nd dataset" )
-
+
+
if __name__ == "__main__":
main()
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/getIndelRates_3way.py
--- a/tools/regVariation/getIndelRates_3way.py
+++ b/tools/regVariation/getIndelRates_3way.py
@@ -6,7 +6,6 @@
pkg_resources.require( "bx-python" )
import sys, os, tempfile
-import traceback
import fileinput
from warnings import warn
@@ -18,7 +17,8 @@
def stop_err(msg):
sys.stderr.write(msg)
sys.exit()
-
+
+
def counter(node, start, end, sort_col):
global full, blk_len, blk_list
if node.start < start:
@@ -31,14 +31,14 @@
blk_len += int(node.other[sort_col+2])
if node.left and node.left.maxend > start:
counter(node.left, start, end, sort_col)
- if node.right:
+ if node.right:
counter(node.right, start, end, sort_col)
elif node.start > end:
- if node.left:
+ if node.left:
counter(node.left, start, end, sort_col)
-
-infile = sys.argv[1]
+
+infile = sys.argv[1]
fout = open(sys.argv[2],'w')
int_file = sys.argv[3]
if int_file != "None": #User has specified an interval file
@@ -48,9 +48,9 @@
chr_col_i, start_col_i, end_col_i, strand_col_i = parse_cols_arg( sys.argv[5] )
except:
stop_err("Unable to open input Interval file")
-
+
+
def main():
-
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
@@ -86,8 +86,7 @@
break
except:
continue
-
-
+
fin = open(infile, 'r')
skipped = 0
@@ -98,7 +97,7 @@
os.system(cmdline)
except:
stop_err("Encountered error while sorting the input file.")
- print >>fout, "#Block\t%s_InsRate\t%s_InsRate\t%s_InsRate\t%s_DelRate\t%s_DelRate\t%s_DelRate" %(species[0],species[1],species[2],species[0],species[1],species[2])
+ print >> fout, "#Block\t%s_InsRate\t%s_InsRate\t%s_InsRate\t%s_DelRate\t%s_DelRate\t%s_DelRate" % ( species[0], species[1], species[2], species[0], species[1], species[2] )
prev_bnum = -1
sorted_infile.seek(0)
for line in sorted_infile.readlines():
@@ -112,16 +111,16 @@
if prev_bnum != -1:
irate = []
drate = []
- for i,elem in enumerate(inserts):
+ for i, elem in enumerate(inserts):
try:
- irate.append(str("%.2e" %(inserts[i]/blen[i])))
+ irate.append(str("%.2e" % (inserts[i]/blen[i])))
except:
irate.append('0')
try:
- drate.append(str("%.2e" %(deletes[i]/blen[i])))
+ drate.append(str("%.2e" % (deletes[i]/blen[i])))
except:
drate.append('0')
- print >>fout, "%s\t%s\t%s" %(prev_bnum, '\t'.join(irate) , '\t'.join(drate))
+ print >> fout, "%s\t%s\t%s" % ( prev_bnum, '\t'.join(irate) , '\t'.join(drate) )
inserts = [0.0, 0.0, 0.0]
deletes = [0.0, 0.0, 0.0]
blen = []
@@ -134,25 +133,24 @@
inserts[sp_ind] += 1
elif elems[1].endswith('delete'):
deletes[sp_ind] += 1
- prev_bnum = new_bnum
+ prev_bnum = new_bnum
except Exception, ei:
#print >>sys.stderr, ei
continue
irate = []
drate = []
- for i,elem in enumerate(inserts):
+ for i, elem in enumerate(inserts):
try:
- irate.append(str("%.2e" %(inserts[i]/blen[i])))
+ irate.append(str("%.2e" % (inserts[i]/blen[i])))
except:
irate.append('0')
try:
- drate.append(str("%.2e" %(deletes[i]/blen[i])))
+ drate.append(str("%.2e" % (deletes[i]/blen[i])))
except:
drate.append('0')
- print >>fout, "%s\t%s\t%s" %(prev_bnum, '\t'.join(irate) , '\t'.join(drate))
+ print >> fout, "%s\t%s\t%s" % ( prev_bnum, '\t'.join(irate) , '\t'.join(drate) )
sys.exit()
-
inf = open(infile, 'r')
start_met = False
end_met = False
@@ -163,14 +161,14 @@
try:
assert int(elems[0])
assert len(elems) == 18
- if dbkey_i not in elems[1]:
- if not(start_met):
+ if dbkey_i not in elems[1]:
+ if not(start_met):
continue
else:
sp_end = n
break
else:
- print >>sp_file, line
+ print >> sp_file, line
if not(start_met):
start_met = True
sp_start = n
@@ -201,7 +199,7 @@
for item in indel:
if type( item ) is GenomicInterval:
indelTree.insert( item, indel.linenum, item.fields )
- result=[]
+ result = []
global full, blk_len, blk_list
for interval in win:
@@ -213,14 +211,14 @@
chrom = interval.chrom
start = int(interval.start)
end = int(interval.end)
- if start > end:
+ if start > end:
warn( "Interval start after end!" )
- ins_chr = "%s.%s_insert" %(dbkey_i,chrom)
- del_chr = "%s.%s_delete" %(dbkey_i,chrom)
+ ins_chr = "%s.%s_insert" % ( dbkey_i, chrom )
+ del_chr = "%s.%s_delete" % ( dbkey_i, chrom )
irate = 0
drate = 0
if ins_chr not in indelTree.chroms and del_chr not in indelTree.chroms:
- pass
+ pass
else:
if ins_chr in indelTree.chroms:
full = 0.0
@@ -242,8 +240,9 @@
interval.fields.append(str("%.2e" %irate))
interval.fields.append(str("%.2e" %drate))
- print >>fout, "\t".join(interval.fields)
+ print >> fout, "\t".join(interval.fields)
fout.flush()
+
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/getIndels.py
--- a/tools/regVariation/getIndels.py
+++ b/tools/regVariation/getIndels.py
@@ -8,13 +8,12 @@
from __future__ import division
from galaxy import eggs
-import pkg_resources
+import pkg_resources
pkg_resources.require( "bx-python" )
try:
pkg_resources.require("numpy")
except:
pass
-import psyco_full
import sys
from bx.cookbook import doc_optparse
from galaxy.tools.exception_handling import *
@@ -22,24 +21,24 @@
assert sys.version_info[:2] >= ( 2, 4 )
-def main():
+def main():
# Parsing Command Line here
options, args = doc_optparse.parse( __doc__ )
try:
- inp_file, out_file1 = args
+ inp_file, out_file1 = args
except:
print >> sys.stderr, "Tool initialization error."
sys.exit()
try:
- fin = open(inp_file,'r')
+ open(inp_file, 'r')
except:
print >> sys.stderr, "Unable to open input file"
sys.exit()
try:
- fout1 = open(out_file1,'w')
- #fout2 = open(out_file2,'w')
+ fout1 = open(out_file1, 'w')
+ #fout2 = open(out_file2, 'w')
except:
print >> sys.stderr, "Unable to open output file"
sys.exit()
@@ -47,11 +46,10 @@
try:
maf_reader = bx.align.maf.Reader( open(inp_file, 'r') )
except:
- print >>sys.stderr, "Your MAF file appears to be malformed."
+ print >> sys.stderr, "Your MAF file appears to be malformed."
sys.exit()
- maf_count = 0
- print >>fout1, "#Block\tSource\tSeq1_Start\tSeq1_End\tSeq2_Start\tSeq2_End\tIndel_length"
+ print >> fout1, "#Block\tSource\tSeq1_Start\tSeq1_End\tSeq2_Start\tSeq2_End\tIndel_length"
for block_ind, block in enumerate(maf_reader):
if len(block.components) < 2:
continue
@@ -84,19 +82,19 @@
#write 2
if prev_pos_gap2 == 1:
prev_pos_gap2 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos1,nt_pos1+1,nt_pos2-1,nt_pos2-1+gaplen2,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos1, nt_pos1+1, nt_pos2-1, nt_pos2-1+gaplen2, gaplen2 )
if pos == len(seq1)-1:
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1,nt_pos1+1,nt_pos2+1-gaplen1,nt_pos2+1,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1, nt_pos1+1, nt_pos2+1-gaplen1, nt_pos2+1, gaplen1 )
else:
prev_pos_gap1 = 0
prev_pos_gap2 = 0
"""
if prev_pos_gap1 == 1:
prev_pos_gap1 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1-1,nt_pos1,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1-1, nt_pos1, gaplen1 )
elif prev_pos_gap2 == 1:
prev_pos_gap2 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos2-1,nt_pos2,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos2-1, nt_pos2, gaplen2 )
"""
else:
nt_pos1 += 1
@@ -105,19 +103,21 @@
#write both
if prev_pos_gap1 == 1:
prev_pos_gap1 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1-1,nt_pos1,nt_pos2-gaplen1,nt_pos2,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1-1, nt_pos1, nt_pos2-gaplen1, nt_pos2, gaplen1 )
elif prev_pos_gap2 == 1:
prev_pos_gap2 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos1-gaplen2,nt_pos1,nt_pos2-1,nt_pos2,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos1-gaplen2, nt_pos1, nt_pos2-1, nt_pos2, gaplen2 )
else:
gaplen2 += 1
prev_pos_gap2 = 1
#write 1
if prev_pos_gap1 == 1:
prev_pos_gap1 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1-1,nt_pos1,nt_pos2,nt_pos2+gaplen1,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1-1, nt_pos1, nt_pos2, nt_pos2+gaplen1, gaplen1 )
if pos == len(seq1)-1:
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos1+1-gaplen2,nt_pos1+1,nt_pos2,nt_pos2+1,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos1+1-gaplen2, nt_pos1+1, nt_pos2, nt_pos2+1, gaplen2 )
pos += 1
+
+
if __name__ == "__main__":
main()
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/linear_regression.py
--- a/tools/regVariation/linear_regression.py
+++ b/tools/regVariation/linear_regression.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -15,14 +15,14 @@
outfile = sys.argv[4]
outfile2 = sys.argv[5]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
elems = []
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -32,12 +32,12 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile )):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -46,7 +46,7 @@
except:
yval = r('NA')
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except:
@@ -57,7 +57,7 @@
x_vals1 = numpy.asarray(x_vals).transpose()
-dat= r.list(x=array(x_vals1), y=y_vals)
+dat = r.list(x=array(x_vals1), y=y_vals)
set_default_mode(NO_CONVERSION)
try:
@@ -66,8 +66,8 @@
stop_err("Error performing linear regression on the input data.\nEither the response column or one of the predictor columns contain only non-numeric or invalid values.")
set_default_mode(BASIC_CONVERSION)
-coeffs=linear_model.as_py()['coefficients']
-yintercept= coeffs['(Intercept)']
+coeffs = linear_model.as_py()['coefficients']
+yintercept = coeffs['(Intercept)']
summary = r.summary(linear_model)
co = summary.get('coefficients', 'NA')
@@ -82,8 +82,8 @@
except:
pass
-print >>fout, "Y-intercept\t%s" %(yintercept)
-print >>fout, "p-value (Y-intercept)\t%s" %(pvaly)
+print >> fout, "Y-intercept\t%s" % (yintercept)
+print >> fout, "p-value (Y-intercept)\t%s" % (pvaly)
if len(x_vals) == 1: #Simple linear regression case with 1 predictor variable
try:
@@ -94,22 +94,22 @@
pval = r.round(float(co[1][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[0]+1,slope)
- print >>fout, "p-value (c%d)\t%s" %(x_cols[0]+1,pval)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[0]+1, slope )
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[0]+1, pval )
else: #Multiple regression case with >1 predictors
- ind=1
+ ind = 1
while ind < len(coeffs.keys()):
try:
slope = r.round(float(coeffs['x'+str(ind)]), digits=10)
except:
slope = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[ind-1]+1,slope)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[ind-1]+1, slope )
try:
pval = r.round(float(co[ind][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "p-value (c%d)\t%s" %(x_cols[ind-1]+1,pval)
- ind+=1
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[ind-1]+1, pval )
+ ind += 1
rsq = summary.get('r.squared','NA')
adjrsq = summary.get('adj.r.squared','NA')
@@ -125,14 +125,14 @@
except:
pass
-print >>fout, "R-squared\t%s" %(rsq)
-print >>fout, "Adjusted R-squared\t%s" %(adjrsq)
-print >>fout, "F-statistic\t%s" %(fstat)
-print >>fout, "Sigma\t%s" %(sigma)
+print >> fout, "R-squared\t%s" % (rsq)
+print >> fout, "Adjusted R-squared\t%s" % (adjrsq)
+print >> fout, "F-statistic\t%s" % (fstat)
+print >> fout, "Sigma\t%s" % (sigma)
r.pdf( outfile2, 8, 8 )
if len(x_vals) == 1: #Simple linear regression case with 1 predictor variable
- sub_title = "Slope = %s; Y-int = %s" %(slope,yintercept)
+ sub_title = "Slope = %s; Y-int = %s" % ( slope, yintercept )
try:
r.plot(x=x_vals[0], y=y_vals, xlab="X", ylab="Y", sub=sub_title, main="Scatterplot with regression")
r.abline(a=yintercept, b=slope, col="red")
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/logistic_regression_vif.py
--- a/tools/regVariation/logistic_regression_vif.py
+++ b/tools/regVariation/logistic_regression_vif.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -15,14 +15,14 @@
outfile = sys.argv[4]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
elems = []
-for i, line in enumerate( file ( infile )):
+for i, line in enumerate( file( infile ) ):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -32,12 +32,12 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile )):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -46,7 +46,7 @@
except:
yval = r('NA')
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except:
@@ -57,46 +57,45 @@
x_vals1 = numpy.asarray(x_vals).transpose()
-check1=0
-check0=0
+check1 = 0
+check0 = 0
for i in y_vals:
if i == 1:
- check1=1
+ check1 = 1
if i == 0:
- check0=1
-if check1==0 or check0==0:
+ check0 = 1
+if check1 == 0 or check0 == 0:
sys.exit("Warning: logistic regression must have at least two classes")
for i in y_vals:
- if i not in [1,0,r('NA')]:
- print >>fout, str(i)
+ if i not in [1, 0, r('NA')]:
+ print >> fout, str(i)
sys.exit("Warning: the current version of this tool can run only with two classes and need to be labeled as 0 and 1.")
-
-
-dat= r.list(x=array(x_vals1), y=y_vals)
-novif=0
+
+dat = r.list(x=array(x_vals1), y=y_vals)
+novif = 0
set_default_mode(NO_CONVERSION)
try:
- linear_model = r.glm(r("y ~ x"), data = r.na_exclude(dat),family="binomial")
+ linear_model = r.glm(r("y ~ x"), data=r.na_exclude(dat), family="binomial")
except RException, rex:
stop_err("Error performing logistic regression on the input data.\nEither the response column or one of the predictor columns contain only non-numeric or invalid values.")
if len(x_cols)>1:
try:
r('suppressPackageStartupMessages(library(car))')
- r.assign('dat',dat)
- r.assign('ncols',len(x_cols))
- vif=r.vif(r('glm(dat$y ~ ., data = na.exclude(data.frame(as.matrix(dat$x,ncol=ncols))->datx),family="binomial")'))
+ r.assign('dat', dat)
+ r.assign('ncols', len(x_cols))
+ vif = r.vif(r('glm(dat$y ~ ., data = na.exclude(data.frame(as.matrix(dat$x,ncol=ncols))->datx), family="binomial")'))
except RException, rex:
print rex
else:
- novif=1
-
+ novif = 1
+
set_default_mode(BASIC_CONVERSION)
-coeffs=linear_model.as_py()['coefficients']
-null_deviance=linear_model.as_py()['null.deviance']
-residual_deviance=linear_model.as_py()['deviance']
-yintercept= coeffs['(Intercept)']
+coeffs = linear_model.as_py()['coefficients']
+null_deviance = linear_model.as_py()['null.deviance']
+residual_deviance = linear_model.as_py()['deviance']
+yintercept = coeffs['(Intercept)']
summary = r.summary(linear_model)
co = summary.get('coefficients', 'NA')
"""
@@ -109,14 +108,14 @@
pvaly = r.round(float(co[0][3]), digits=10)
except:
pass
-print >>fout, "response column\tc%d" %(y_col+1)
-tempP=[]
+print >> fout, "response column\tc%d" % (y_col+1)
+tempP = []
for i in x_cols:
tempP.append('c'+str(i+1))
-tempP=','.join(tempP)
-print >>fout, "predictor column(s)\t%s" %(tempP)
-print >>fout, "Y-intercept\t%s" %(yintercept)
-print >>fout, "p-value (Y-intercept)\t%s" %(pvaly)
+tempP = ','.join(tempP)
+print >> fout, "predictor column(s)\t%s" % (tempP)
+print >> fout, "Y-intercept\t%s" % (yintercept)
+print >> fout, "p-value (Y-intercept)\t%s" % (pvaly)
if len(x_vals) == 1: #Simple linear regression case with 1 predictor variable
try:
@@ -127,44 +126,43 @@
pval = r.round(float(co[1][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[0]+1,slope)
- print >>fout, "p-value (c%d)\t%s" %(x_cols[0]+1,pval)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[0]+1, slope )
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[0]+1, pval )
else: #Multiple regression case with >1 predictors
- ind=1
+ ind = 1
while ind < len(coeffs.keys()):
try:
slope = r.round(float(coeffs['x'+str(ind)]), digits=10)
except:
slope = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[ind-1]+1,slope)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[ind-1]+1, slope )
try:
pval = r.round(float(co[ind][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "p-value (c%d)\t%s" %(x_cols[ind-1]+1,pval)
- ind+=1
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[ind-1]+1, pval )
+ ind += 1
rsq = summary.get('r.squared','NA')
-
try:
- rsq= r.round(float((null_deviance-residual_deviance)/null_deviance), digits=5)
- null_deviance= r.round(float(null_deviance), digits=5)
- residual_deviance= r.round(float(residual_deviance), digits=5)
+ rsq = r.round(float((null_deviance-residual_deviance)/null_deviance), digits=5)
+ null_deviance = r.round(float(null_deviance), digits=5)
+ residual_deviance = r.round(float(residual_deviance), digits=5)
except:
pass
-print >>fout, "Null deviance\t%s" %(null_deviance)
-print >>fout, "Residual deviance\t%s" %(residual_deviance)
-print >>fout, "pseudo R-squared\t%s" %(rsq)
-print >>fout, "\n"
-print >>fout, 'vif'
+print >> fout, "Null deviance\t%s" % (null_deviance)
+print >> fout, "Residual deviance\t%s" % (residual_deviance)
+print >> fout, "pseudo R-squared\t%s" % (rsq)
+print >> fout, "\n"
+print >> fout, 'vif'
-if novif==0:
- py_vif=vif.as_py()
- count=0
+if novif == 0:
+ py_vif = vif.as_py()
+ count = 0
for i in sorted(py_vif.keys()):
- print >>fout,'c'+str(x_cols[count]+1) ,str(py_vif[i])
- count+=1
-elif novif==1:
- print >>fout, "vif can calculate only when model have more than 1 predictor"
+ print >> fout, 'c'+str(x_cols[count]+1), str(py_vif[i])
+ count += 1
+elif novif == 1:
+ print >> fout, "vif can calculate only when model have more than 1 predictor"
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/maf_cpg_filter.py
--- a/tools/regVariation/maf_cpg_filter.py
+++ b/tools/regVariation/maf_cpg_filter.py
@@ -10,7 +10,7 @@
"""
from galaxy import eggs
-import pkg_resources
+import pkg_resources
pkg_resources.require( "bx-python" )
try:
pkg_resources.require( "numpy" )
@@ -54,7 +54,7 @@
defn = "non-CpG"
cpgfilter.run( reader, writer.write )
- print "%2.2f percent bases masked; Mask character = %s, Definition = %s" %(float(cpgfilter.masked)/float(cpgfilter.total) * 100, mask, defn)
+ print "%2.2f percent bases masked; Mask character = %s, Definition = %s" % ( float(cpgfilter.masked)/float(cpgfilter.total) * 100, mask, defn )
if __name__ == "__main__":
main()
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/microsats_alignment_level.py
--- a/tools/regVariation/microsats_alignment_level.py
+++ b/tools/regVariation/microsats_alignment_level.py
@@ -4,7 +4,11 @@
Uses SPUTNIK to fetch microsatellites and extracts orthologous repeats from the sputnik output.
"""
from galaxy import eggs
-import sys, os, tempfile, string, math, re
+import os
+import re
+import string
+import sys
+import tempfile
def reverse_complement(text):
DNA_COMP = string.maketrans( "ACGTacgt", "TGCAtgca" )
@@ -12,31 +16,26 @@
comp.reverse()
return "".join(comp)
+
def main():
if len(sys.argv) != 8:
- print >>sys.stderr, "Insufficient number of arguments."
+ print >> sys.stderr, "Insufficient number of arguments."
sys.exit()
infile = open(sys.argv[1],'r')
separation = int(sys.argv[2])
outfile = sys.argv[3]
- align_type = sys.argv[4]
- if align_type == "2way":
- align_type_len = 2
- elif align_type == "3way":
- align_type_len = 3
mono_threshold = int(sys.argv[5])
non_mono_threshold = int(sys.argv[6])
allow_different_units = int(sys.argv[7])
- print "Min distance = %d bp; Min threshold for mono repeats = %d; Min threshold for non-mono repeats = %d; Allow different motifs = %s" %(separation, mono_threshold, non_mono_threshold, allow_different_units==1)
+ print "Min distance = %d bp; Min threshold for mono repeats = %d; Min threshold for non-mono repeats = %d; Allow different motifs = %s" % ( separation, mono_threshold, non_mono_threshold, allow_different_units==1 )
try:
fout = open(outfile, "w")
- print >>fout, "#Block\tSeq1_Name\tSeq1_Start\tSeq1_End\tSeq1_Type\tSeq1_Length\tSeq1_RepeatNumber\tSeq1_Unit\tSeq2_Name\tSeq2_Start\tSeq2_End\tSeq2_Type\tSeq2_Length\tSeq2_RepeatNumber\tSeq2_Unit"
+ print >> fout, "#Block\tSeq1_Name\tSeq1_Start\tSeq1_End\tSeq1_Type\tSeq1_Length\tSeq1_RepeatNumber\tSeq1_Unit\tSeq2_Name\tSeq2_Start\tSeq2_End\tSeq2_Type\tSeq2_Length\tSeq2_RepeatNumber\tSeq2_Unit"
#sputnik_cmd = os.path.join(os.path.split(sys.argv[0])[0], "sputnik")
sputnik_cmd = "sputnik"
input = infile.read()
- skipped = 0
block_num = 0
input = input.replace('\r','\n')
for block in input.split('\n\n'):
@@ -44,26 +43,24 @@
tmpin = tempfile.NamedTemporaryFile()
tmpout = tempfile.NamedTemporaryFile()
tmpin.write(block.strip())
- blk = tmpin.read()
cmdline = sputnik_cmd + " " + tmpin.name + " > /dev/null 2>&1 >> " + tmpout.name
try:
os.system(cmdline)
- except Exception, es:
+ except Exception:
continue
sputnik_out = tmpout.read()
tmpin.close()
tmpout.close()
if sputnik_out != "":
if len(block.split('>')[1:]) != 2: #len(sputnik_out.split('>')):
- skipped += 1
continue
align_block = block.strip().split('>')
lendict = {'mononucleotide':1, 'dinucleotide':2, 'trinucleotide':3, 'tetranucleotide':4, 'pentanucleotide':5, 'hexanucleotide':6}
- blockdict={}
- r=0
- namelist=[]
- for k,sput_block in enumerate(sputnik_out.split('>')[1:]):
+ blockdict = {}
+ r = 0
+ namelist = []
+ for k, sput_block in enumerate(sputnik_out.split('>')[1:]):
whole_seq = ''.join(align_block[k+1].split('\n')[1:]).replace('\n','').strip()
p = re.compile('\n(\S*nucleotide)')
repeats = p.split(sput_block.strip())
@@ -71,13 +68,12 @@
j = 1
name = repeats[0].strip()
try:
- coords = re.search('\d+[-_:]\d+',name).group()
- coords = coords.replace('_','-').replace(':','-')
- except Exception, e:
+ coords = re.search('\d+[-_:]\d+', name).group()
+ coords = coords.replace('_', '-').replace(':', '-')
+ except Exception:
coords = '0-0'
- pass
r += 1
- blockdict[r]={}
+ blockdict[r] = {}
try:
sp_name = name[:name.index('.')]
chr_name = name[name.index('.'):name.index('(')]
@@ -91,11 +87,10 @@
continue
if blockdict[r].has_key('types'):
- blockdict[r]['types'].append(repeats[j].strip()) #type of microsat
+ blockdict[r]['types'].append(repeats[j].strip()) #type of microsat
else:
- blockdict[r]['types'] = [repeats[j].strip()] #type of microsat
+ blockdict[r]['types'] = [repeats[j].strip()] #type of microsat
- sequence = ''.join(align_block[r].split('\n')[1:]).replace('\n','').strip()
start = int(repeats[j+1].split('--')[0].split(':')[0].strip())
#check to see if there are gaps before the start of the repeat, and change the start accordingly
sgaps = 0
@@ -107,7 +102,7 @@
break #break at the 1st non-gap character
ch_pos -= 1
if blockdict[r].has_key('starts'):
- blockdict[r]['starts'].append(start+sgaps) #start co-ords adjusted with alignment co-ords to include GAPS
+ blockdict[r]['starts'].append(start+sgaps) #start co-ords adjusted with alignment co-ords to include GAPS
else:
blockdict[r]['starts'] = [start+sgaps]
@@ -120,7 +115,7 @@
else:
break #break at the 1st non-gap character
if blockdict[r].has_key('ends'):
- blockdict[r]['ends'].append(end+egaps) #end co-ords adjusted with alignment co-ords to include GAPS
+ blockdict[r]['ends'].append(end+egaps) #end co-ords adjusted with alignment co-ords to include GAPS
else:
blockdict[r]['ends'] = [end+egaps]
@@ -134,20 +129,20 @@
gaps_before_start = whole_seq[:rel_start].count('-')
if blockdict[r].has_key('gaps_before_start'):
- blockdict[r]['gaps_before_start'].append(gaps_before_start) #lengths
+ blockdict[r]['gaps_before_start'].append(gaps_before_start) #lengths
else:
- blockdict[r]['gaps_before_start'] = [gaps_before_start] #lengths
+ blockdict[r]['gaps_before_start'] = [gaps_before_start] #lengths
- whole_seq_start= int(coords.split('-')[0])
+ whole_seq_start = int(coords.split('-')[0])
if blockdict[r].has_key('whole_seq_start'):
- blockdict[r]['whole_seq_start'].append(whole_seq_start) #lengths
+ blockdict[r]['whole_seq_start'].append(whole_seq_start) #lengths
else:
- blockdict[r]['whole_seq_start'] = [whole_seq_start] #lengths
+ blockdict[r]['whole_seq_start'] = [whole_seq_start] #lengths
if blockdict[r].has_key('lengths'):
- blockdict[r]['lengths'].append(repeat_len) #lengths
+ blockdict[r]['lengths'].append(repeat_len) #lengths
else:
- blockdict[r]['lengths'] = [repeat_len] #lengths
+ blockdict[r]['lengths'] = [repeat_len] #lengths
if blockdict[r].has_key('counts'):
blockdict[r]['counts'].append(str(int(repeat_len)/lendict[repeats[j].strip()])) #Repeat Unit
@@ -159,10 +154,10 @@
else:
blockdict[r]['units'] = [repeat_seq[:lendict[repeats[j].strip()]]] #Repeat Unit
- except Exception, eh:
+ except Exception:
pass
- j+=2
- #check the co-ords of all repeats corresponding to a sequence and remove adjacent repeats separated by less than the user-specified 'separation'.
+ j += 2
+ #check the co-ords of all repeats corresponding to a sequence and remove adjacent repeats separated by less than the user-specified 'separation'.
delete_index_list = []
for ind, item in enumerate(blockdict[r]['ends']):
try:
@@ -171,7 +166,7 @@
delete_index_list.append(ind)
if ind+1 not in delete_index_list:
delete_index_list.append(ind+1)
- except Exception, ek:
+ except Exception:
pass
for index in delete_index_list: #mark them for deletion
try:
@@ -183,7 +178,7 @@
blockdict[r]['lengths'][index] = 'marked'
blockdict[r]['counts'][index] = 'marked'
blockdict[r]['units'][index] = 'marked'
- except Exception, ej:
+ except Exception:
pass
#remove 'marked' elements from all the lists
"""
@@ -192,19 +187,19 @@
if elem == 'marked':
blockdict[r][key].remove(elem)
"""
- #print blockdict
+ #print blockdict
- #make sure that the blockdict has keys for both the species
+ #make sure that the blockdict has keys for both the species
if (1 not in blockdict) or (2 not in blockdict):
continue
visited_2 = [0 for x in range(len(blockdict[2]['starts']))]
- for ind1,coord_s1 in enumerate(blockdict[1]['starts']):
+ for ind1, coord_s1 in enumerate(blockdict[1]['starts']):
if coord_s1 == 'marked':
continue
coord_e1 = blockdict[1]['ends'][ind1]
out = []
- for ind2,coord_s2 in enumerate(blockdict[2]['starts']):
+ for ind2, coord_s2 in enumerate(blockdict[2]['starts']):
if coord_s2 == 'marked':
visited_2[ind2] = 1
continue
@@ -216,7 +211,7 @@
else:
if (blockdict[1]['units'][ind1] not in blockdict[2]['units'][ind2]*2) and (reverse_complement(blockdict[1]['units'][ind1]) not in blockdict[2]['units'][ind2]*2):
continue
- #print >>sys.stderr, (reverse_complement(blockdict[1]['units'][ind1]) not in blockdict[2]['units'][ind2]*2)
+ #print >> sys.stderr, (reverse_complement(blockdict[1]['units'][ind1]) not in blockdict[2]['units'][ind2]*2)
#skip if the repeat number thresholds are not met
if blockdict[1]['types'][ind1] == 'mononucleotide':
if (int(blockdict[1]['counts'][ind1]) < mono_threshold):
@@ -231,12 +226,12 @@
else:
if (int(blockdict[2]['counts'][ind2]) < non_mono_threshold):
continue
- #print "s1,e1=%s,%s; s2,e2=%s,%s" %(coord_s1,coord_e1,coord_s2,coord_e2)
- if (coord_s1 in range(coord_s2,coord_e2)) or (coord_e1 in range(coord_s2,coord_e2)):
+ #print "s1,e1=%s,%s; s2,e2=%s,%s" % ( coord_s1, coord_e1, coord_s2, coord_e2 )
+ if (coord_s1 in range(coord_s2, coord_e2)) or (coord_e1 in range(coord_s2, coord_e2)):
out.append(str(block_num))
out.append(namelist[0])
rel_start = blockdict[1]['whole_seq_start'][ind1] + coord_s1 - blockdict[1]['gaps_before_start'][ind1]
- rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
+ rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[1]['types'][ind1])
@@ -245,16 +240,16 @@
out.append(blockdict[1]['units'][ind1])
out.append(namelist[1])
rel_start = blockdict[2]['whole_seq_start'][ind2] + coord_s2 - blockdict[2]['gaps_before_start'][ind2]
- rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
+ rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[2]['types'][ind2])
out.append(blockdict[2]['lengths'][ind2])
out.append(blockdict[2]['counts'][ind2])
out.append(blockdict[2]['units'][ind2])
- print >>fout, '\t'.join(out)
+ print >> fout, '\t'.join(out)
visited_2[ind2] = 1
- out=[]
+ out = []
if 0 in visited_2: #there are still some elements in 2nd set which haven't found orthologs yet.
for ind2, coord_s2 in enumerate(blockdict[2]['starts']):
@@ -264,7 +259,7 @@
continue
coord_e2 = blockdict[2]['ends'][ind2]
out = []
- for ind1,coord_s1 in enumerate(blockdict[1]['starts']):
+ for ind1, coord_s1 in enumerate(blockdict[1]['starts']):
if coord_s1 == 'marked':
continue
coord_e1 = blockdict[1]['ends'][ind1]
@@ -290,11 +285,11 @@
if (int(blockdict[2]['counts'][ind2]) < non_mono_threshold):
continue
- if (coord_s2 in range(coord_s1,coord_e1)) or (coord_e2 in range(coord_s1,coord_e1)):
- out.append(str(block_num))
+ if (coord_s2 in range(coord_s1, coord_e1)) or (coord_e2 in range(coord_s1, coord_e1)):
+ out.append(str(block_num))
out.append(namelist[0])
rel_start = blockdict[1]['whole_seq_start'][ind1] + coord_s1 - blockdict[1]['gaps_before_start'][ind1]
- rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
+ rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[1]['types'][ind1])
@@ -303,21 +298,21 @@
out.append(blockdict[1]['units'][ind1])
out.append(namelist[1])
rel_start = blockdict[2]['whole_seq_start'][ind2] + coord_s2 - blockdict[2]['gaps_before_start'][ind2]
- rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
+ rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[2]['types'][ind2])
out.append(blockdict[2]['lengths'][ind2])
out.append(blockdict[2]['counts'][ind2])
out.append(blockdict[2]['units'][ind2])
- print >>fout, '\t'.join(out)
+ print >> fout, '\t'.join(out)
visited_2[ind2] = 1
- out=[]
+ out = []
- #print >>fout, blockdict
+ #print >> fout, blockdict
except Exception, exc:
- print >>sys.stderr, "type(exc),args,exc: %s, %s, %s" %(type(exc), exc.args, exc)
+ print >> sys.stderr, "type(exc),args,exc: %s, %s, %s" % ( type(exc), exc.args, exc )
+
if __name__ == "__main__":
main()
-
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/microsats_mutability.py
--- a/tools/regVariation/microsats_mutability.py
+++ b/tools/regVariation/microsats_mutability.py
@@ -4,7 +4,10 @@
This tool computes microsatellite mutability for the orthologous microsatellites fetched from 'Extract Orthologous Microsatellites from pair-wise alignments' tool.
"""
from galaxy import eggs
-import sys, string, re, commands, tempfile, os, fileinput
+import fileinput
+import string
+import sys
+import tempfile
from galaxy.tools.util.galaxyops import *
from bx.intervals.io import *
from bx.intervals.operations import quicksect
@@ -19,7 +22,7 @@
p_group_cols = [p_group, p_group+7]
s_group_cols = [s_group, s_group+7]
num_generations = int(sys.argv[7])
-region = sys.argv[8]
+region = sys.argv[8]
int_file = sys.argv[9]
if int_file != "None": #User has specified an interval file
try:
@@ -28,31 +31,35 @@
chr_col_i, start_col_i, end_col_i, strand_col_i = parse_cols_arg( sys.argv[11] )
except:
stop_err("Unable to open input Interval file")
-
+
+
def stop_err(msg):
sys.stderr.write(msg)
sys.exit()
+
def reverse_complement(text):
DNA_COMP = string.maketrans( "ACGTacgt", "TGCAtgca" )
comp = [ch for ch in text.translate(DNA_COMP)]
comp.reverse()
return "".join(comp)
+
def get_unique_elems(elems):
- seen=set()
+ seen = set()
return[x for x in elems if x not in seen and not seen.add(x)]
+
def get_binned_lists(uniqlist, binsize):
- binnedlist=[]
+ binnedlist = []
uniqlist.sort()
start = int(uniqlist[0])
- bin_ind=0
- l_ind=0
+ bin_ind = 0
+ l_ind = 0
binnedlist.append([])
while l_ind < len(uniqlist):
elem = int(uniqlist[l_ind])
- if elem in range(start,start+binsize):
+ if elem in range(start, start+binsize):
binnedlist[bin_ind].append(elem)
else:
start += binsize
@@ -62,39 +69,38 @@
l_ind += 1
return binnedlist
-def fetch_weight(H,C,t):
+
+def fetch_weight(H, C, t):
if (H-(C-H)) < t:
return 2.0
else:
return 1.0
-def mutabilityEstimator(repeats1,repeats2,thresholds):
+
+def mutabilityEstimator(repeats1, repeats2, thresholds):
mut_num = 0.0 #Mutability Numerator
mut_den = 0.0 #Mutability denominator
- for ind,H in enumerate(repeats1):
+ for ind, H in enumerate(repeats1):
C = repeats2[ind]
t = thresholds[ind]
- w = fetch_weight(H,C,t)
+ w = fetch_weight(H, C, t)
mut_num += ((H-C)*(H-C)*w)
mut_den += w
return [mut_num, mut_den]
+
def output_writer(blk, blk_lines):
global winspecies, speciesind
- all_elems_1=[]
- all_elems_2=[]
- all_s_elems_1=[]
- all_s_elems_2=[]
+ all_elems_1 = []
+ all_elems_2 = []
+ all_s_elems_1 = []
+ all_s_elems_2 = []
for bline in blk_lines:
if not(bline):
continue
items = bline.split('\t')
seq1 = items[1]
- start1 = items[2]
- end1 = items[3]
seq2 = items[8]
- start2 = items[9]
- end2 = items[10]
if p_group_cols[0] == 6:
items[p_group_cols[0]] = int(items[p_group_cols[0]])
items[p_group_cols[1]] = int(items[p_group_cols[1]])
@@ -111,8 +117,8 @@
if s_group_cols[0] != -1:
uniq_s_elems_1 = get_unique_elems(all_s_elems_1)
uniq_s_elems_2 = get_unique_elems(all_s_elems_2)
- mut1={}
- mut2={}
+ mut1 = {}
+ mut2 = {}
count1 = {}
count2 = {}
"""
@@ -120,12 +126,12 @@
uniq_elems_1 = get_unique_units(j.sort(lambda x, y: len(x)-len(y)))
"""
if p_group_cols[0] == 6: #i.e. the option chosen is group-by repeat number.
- uniq_elems_1 = get_binned_lists(uniq_elems_1,p_bin_size)
- uniq_elems_2 = get_binned_lists(uniq_elems_2,p_bin_size)
+ uniq_elems_1 = get_binned_lists( uniq_elems_1, p_bin_size )
+ uniq_elems_2 = get_binned_lists( uniq_elems_2, p_bin_size )
if s_group_cols[0] == 6: #i.e. the option chosen is subgroup-by repeat number.
- uniq_s_elems_1 = get_binned_lists(uniq_s_elems_1,s_bin_size)
- uniq_s_elems_2 = get_binned_lists(uniq_s_elems_2,s_bin_size)
+ uniq_s_elems_1 = get_binned_lists( uniq_s_elems_1, s_bin_size )
+ uniq_s_elems_2 = get_binned_lists( uniq_s_elems_2, s_bin_size )
for pitem1 in uniq_elems_1:
#repeats1 = []
@@ -143,61 +149,61 @@
if p_group_cols[0] == 6:
belems[p_group_cols[0]] = int(belems[p_group_cols[0]])
if belems[p_group_cols[0]] in pitem1:
- if belems[s_group_cols[0]]==sitem1:
+ if belems[s_group_cols[0]] == sitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1[str(pitem1)+'\t'+str(sitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1[str(pitem1)+'\t'+str(sitem1)] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1[str(pitem1)+'\t'+str(sitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1[str(pitem1)+'\t'+str(sitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats1)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats1)
elif winspecies == 2:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats2)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats2)
else:
if type(sitem1) == list:
if s_group_cols[0] == 6:
belems[s_group_cols[0]] = int(belems[s_group_cols[0]])
- if belems[p_group_cols[0]]==pitem1 and belems[s_group_cols[0]] in sitem1:
+ if belems[p_group_cols[0]] == pitem1 and belems[s_group_cols[0]] in sitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1["%s\t%s" %(pitem1,sitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1["%s\t%s" % ( pitem1, sitem1 )] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1[str(pitem1)+'\t'+str(sitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1[str(pitem1)+'\t'+str(sitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1[str(pitem1)+'\t'+str(sitem1)]=sum(repeats1)
+ count1[str(pitem1)+'\t'+str(sitem1)] = sum(repeats1)
elif winspecies == 2:
- count1[str(pitem1)+'\t'+str(sitem1)]=sum(repeats2)
+ count1[str(pitem1)+'\t'+str(sitem1)] = sum(repeats2)
else:
- if belems[p_group_cols[0]]==pitem1 and belems[s_group_cols[0]]==sitem1:
+ if belems[p_group_cols[0]] == pitem1 and belems[s_group_cols[0]] == sitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1["%s\t%s" %(pitem1,sitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1["%s\t%s" % ( pitem1, sitem1 )] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1[str(pitem1)+'\t'+str(sitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1[str(pitem1)+'\t'+str(sitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats1)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats1)
elif winspecies == 2:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats2)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats2)
else: #Sub-group by feature is None
for bline in blk_lines:
belems = bline.split('\t')
if type(pitem1) == list:
- #print >>sys.stderr, "item: " + str(item1)
+ #print >> sys.stderr, "item: " + str(item1)
if p_group_cols[0] == 6:
belems[p_group_cols[0]] = int(belems[p_group_cols[0]])
if belems[p_group_cols[0]] in pitem1:
@@ -208,21 +214,21 @@
else:
thresholds.append(non_mono_threshold)
else:
- if belems[p_group_cols[0]]==pitem1:
+ if belems[p_group_cols[0]] == pitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1["%s" %(pitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1["%s" % (pitem1)] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1["%s" %(pitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1["%s" % (pitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1[str(pitem1)]=sum(repeats1)
+ count1[str(pitem1)] = sum(repeats1)
elif winspecies == 2:
- count1[str(pitem1)]=sum(repeats2)
+ count1[str(pitem1)] = sum(repeats2)
for pitem2 in uniq_elems_2:
#repeats1 = []
@@ -239,57 +245,57 @@
if type(pitem2) == list:
if p_group_cols[0] == 6:
belems[p_group_cols[1]] = int(belems[p_group_cols[1]])
- if belems[p_group_cols[1]] in pitem2 and belems[s_group_cols[1]]==sitem2:
+ if belems[p_group_cols[1]] in pitem2 and belems[s_group_cols[1]] == sitem2:
repeats2.append(int(belems[13]))
repeats1.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s\t%s" %(pitem2,sitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s\t%s" % ( pitem2, sitem2 )] = mutabilityEstimator( repeats2, repeats1, thresholds )
#count2[str(pitem2)+'\t'+str(sitem2)]=len(repeats2)
if region == 'align':
- count2["%s\t%s" %(pitem2,sitem2)]=min(sum(repeats1),sum(repeats2))
- else:
+ count2["%s\t%s" % ( pitem2, sitem2 )] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats2)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats2)
elif winspecies == 2:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats1)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats1)
else:
if type(sitem2) == list:
if s_group_cols[0] == 6:
belems[s_group_cols[1]] = int(belems[s_group_cols[1]])
- if belems[p_group_cols[1]]==pitem2 and belems[s_group_cols[1]] in sitem2:
+ if belems[p_group_cols[1]] == pitem2 and belems[s_group_cols[1]] in sitem2:
repeats2.append(int(belems[13]))
repeats1.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s\t%s" %(pitem2,sitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s\t%s" % ( pitem2, sitem2 )] = mutabilityEstimator( repeats2, repeats1, thresholds )
if region == 'align':
- count2["%s\t%s" %(pitem2,sitem2)]=min(sum(repeats1),sum(repeats2))
- else:
+ count2["%s\t%s" % ( pitem2, sitem2 )] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats2)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats2)
elif winspecies == 2:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats1)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats1)
else:
- if belems[p_group_cols[1]]==pitem2 and belems[s_group_cols[1]]==sitem2:
+ if belems[p_group_cols[1]] == pitem2 and belems[s_group_cols[1]] == sitem2:
repeats1.append(int(belems[13]))
repeats2.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s\t%s" %(pitem2,sitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s\t%s" % ( pitem2, sitem2 )] = mutabilityEstimator( repeats2, repeats1, thresholds )
if region == 'align':
- count2["%s\t%s" %(pitem2,sitem2)]=min(sum(repeats1),sum(repeats2))
- else:
+ count2["%s\t%s" % ( pitem2, sitem2 )] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats2)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats2)
elif winspecies == 2:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats1)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats1)
else: #Sub-group by feature is None
for bline in blk_lines:
belems = bline.split('\t')
@@ -304,21 +310,21 @@
else:
thresholds.append(non_mono_threshold)
else:
- if belems[p_group_cols[1]]==pitem2:
+ if belems[p_group_cols[1]] == pitem2:
repeats2.append(int(belems[13]))
repeats1.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s" %(pitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s" % (pitem2)] = mutabilityEstimator( repeats2, repeats1, thresholds )
if region == 'align':
- count2["%s" %(pitem2)]=min(sum(repeats1),sum(repeats2))
+ count2["%s" % (pitem2)] = min( sum(repeats1), sum(repeats2) )
else:
if winspecies == 1:
- count2["%s" %(pitem2)]=sum(repeats2)
+ count2["%s" % (pitem2)] = sum(repeats2)
elif winspecies == 2:
- count2["%s" %(pitem2)]=sum(repeats1)
+ count2["%s" % (pitem2)] = sum(repeats1)
for key in mut1.keys():
if key in mut2.keys():
mut = (mut1[key][0]+mut2[key][0])/(mut1[key][1]+mut2[key][1])
@@ -328,9 +334,9 @@
unit_found = False
if p_group_cols[0] == 7 or s_group_cols[0] == 7: #if it is Repeat Unit (AG, GCT etc.) check for reverse-complements too
if p_group_cols[0] == 7:
- this,other = 0,1
+ this, other = 0, 1
else:
- this,other = 1,0
+ this, other = 1, 0
groups1 = key.split('\t')
mutn = mut1[key][0]
mutd = mut1[key][1]
@@ -351,28 +357,29 @@
else:
mut = mut1[key][0]/mut1[key][1]
count = count1[key]
- mut = "%.2e" %(mut/num_generations)
+ mut = "%.2e" % (mut/num_generations)
if region == 'align':
- print >>fout, str(blk) + '\t'+seq1 + '\t' + seq2 + '\t' +key.strip()+ '\t'+str(mut) + '\t'+ str(count)
+ print >> fout, str(blk) + '\t'+seq1 + '\t' + seq2 + '\t' +key.strip()+ '\t'+str(mut) + '\t'+ str(count)
elif region == 'win':
- fout.write("%s\t%s\t%s\t%s\n" %(blk,key.strip(),mut,count))
+ fout.write("%s\t%s\t%s\t%s\n" % ( blk, key.strip(), mut, count ))
fout.flush()
#catch any remaining repeats, for instance if the orthologous position contained different repeat units
for remaining_key in mut2.keys():
mut = mut2[remaining_key][0]/mut2[remaining_key][1]
- mut = "%.2e" %(mut/num_generations)
+ mut = "%.2e" % (mut/num_generations)
count = count2[remaining_key]
if region == 'align':
- print >>fout, str(blk) + '\t'+seq1 + '\t'+seq2 + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
+ print >> fout, str(blk) + '\t'+seq1 + '\t'+seq2 + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
elif region == 'win':
- fout.write("%s\t%s\t%s\t%s\n" %(blk,remaining_key.strip(),mut,count))
+ fout.write("%s\t%s\t%s\t%s\n" % ( blk, remaining_key.strip(), mut, count ))
fout.flush()
- #print >>fout, blk + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
+ #print >> fout, blk + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
+
def counter(node, start, end, report_func):
if start <= node.start < end and start < node.end <= end:
- report_func(node)
+ report_func(node)
if node.right:
counter(node.right, start, end, report_func)
if node.left:
@@ -381,8 +388,8 @@
counter(node.right, start, end, report_func)
elif node.start >= end and node.left and node.left.maxend > start:
counter(node.left, start, end, report_func)
-
-
+
+
def main():
infile = sys.argv[1]
@@ -400,21 +407,18 @@
if region == 'win':
if dbkey_i in elems[1]:
winspecies = 1
- speciesind = 1
+ speciesind = 1
elif dbkey_i in elems[8]:
winspecies = 2
speciesind = 8
else:
- stop_err("The species build corresponding to your interval file is not present in the Microsatellite file.")
+ stop_err("The species build corresponding to your interval file is not present in the Microsatellite file.")
fin = open(infile, 'r')
skipped = 0
- blk=0
- win=0
- linestr=""
+ linestr = ""
if region == 'win':
-
msats = NiceReaderWrapper( fileinput.FileInput( infile ),
chrom_col = speciesind,
start_col = speciesind+1,
@@ -435,7 +439,7 @@
ichr = ielems[chr_col_i]
istart = int(ielems[start_col_i])
iend = int(ielems[end_col_i])
- isrc = "%s.%s" %(dbkey_i,ichr)
+ isrc = "%s.%s" % ( dbkey_i, ichr )
if isrc not in msatTree.chroms:
continue
result = []
@@ -450,14 +454,14 @@
tmpfile1.seek(0)
output_writer(iline, tmpfile1.readlines())
except:
- skipped+=1
+ skipped += 1
if skipped:
- print "Skipped %d intervals as invalid." %(skipped)
+ print "Skipped %d intervals as invalid." % (skipped)
elif region == 'align':
if s_group_cols[0] != -1:
- print >>fout, "#Window\tSpecies_1\tSpecies_2\tGroupby_Feature\tSubGroupby_Feature\tMutability\tCount"
+ print >> fout, "#Window\tSpecies_1\tSpecies_2\tGroupby_Feature\tSubGroupby_Feature\tMutability\tCount"
else:
- print >>fout, "#Window\tSpecies_1\tWindow_Start\tWindow_End\tSpecies_2\tGroupby_Feature\tMutability\tCount"
+ print >> fout, "#Window\tSpecies_1\tWindow_Start\tWindow_End\tSpecies_2\tGroupby_Feature\tMutability\tCount"
prev_bnum = -1
try:
for line in fin:
@@ -481,9 +485,11 @@
prev_bnum = new_bnum
output_writer(prev_bnum, linestr.strip().replace('\r','\n').split('\n'))
except Exception, ea:
- print >>sys.stderr, ea
+ print >> sys.stderr, ea
skipped += 1
if skipped:
- print "Skipped %d lines as invalid." %(skipped)
+ print "Skipped %d lines as invalid." % (skipped)
+
+
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff -r 37cf56c3f0e4605e15f5988764f147bcb186f40f -r 935942afdf706951fb45faf5468e3e12c25fb28f tools/regVariation/partialR_square.py
--- a/tools/regVariation/partialR_square.py
+++ b/tools/regVariation/partialR_square.py
@@ -2,7 +2,7 @@
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -13,6 +13,7 @@
sys.stderr.write(msg)
sys.exit()
+
def sscombs(s):
if len(s) == 1:
return [s]
@@ -26,14 +27,14 @@
x_cols = sys.argv[3].split(',')
outfile = sys.argv[4]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -43,7 +44,7 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
"""
@@ -51,13 +52,13 @@
float( elems[x_cols[k]] )
except:
try:
- msg = "This operation cannot be performed on non-numeric column %d containing value '%s'." %( col, elems[x_cols[k]] )
+ msg = "This operation cannot be performed on non-numeric column %d containing value '%s'." % ( col, elems[x_cols[k]] )
except:
msg = "This operation cannot be performed on non-numeric data."
stop_err( msg )
"""
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile )):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -65,20 +66,20 @@
yval = float(fields[y_col])
except Exception, ey:
yval = r('NA')
- #print >>sys.stderr, "ey = %s" %ey
+ #print >> sys.stderr, "ey = %s" %ey
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except Exception, ex:
xval = r('NA')
- #print >>sys.stderr, "ex = %s" %ex
+ #print >> sys.stderr, "ex = %s" %ex
x_vals[k].append(xval)
except:
pass
x_vals1 = numpy.asarray(x_vals).transpose()
-dat= r.list(x=array(x_vals1), y=y_vals)
+dat = r.list(x=array(x_vals1), y=y_vals)
set_default_mode(NO_CONVERSION)
try:
@@ -91,7 +92,7 @@
fullr2 = summary.get('r.squared','NA')
if fullr2 == 'NA':
- stop_error("Error in linear regression")
+ stop_err("Error in linear regression")
if len(x_vals) < 10:
s = ""
@@ -100,10 +101,10 @@
else:
stop_err("This tool only works with less than 10 predictors.")
-print >>fout, "#Model\tR-sq\tpartial_R_Terms\tpartial_R_Value"
+print >> fout, "#Model\tR-sq\tpartial_R_Terms\tpartial_R_Value"
all_combos = sorted(sscombs(s), key=len)
all_combos.reverse()
-for j,cols in enumerate(all_combos):
+for j, cols in enumerate(all_combos):
#if len(cols) == len(s): #Same as the full model above
# continue
if len(cols) == 1:
@@ -113,7 +114,7 @@
for col in cols:
x_v.append(x_vals[int(col)])
x_vals1 = numpy.asarray(x_v).transpose()
- dat= r.list(x=array(x_vals1), y=y_vals)
+ dat = r.list(x=array(x_vals1), y=y_vals)
set_default_mode(NO_CONVERSION)
red = r.lm(r("y ~ x"), data= dat) #Reduced model
set_default_mode(BASIC_CONVERSION)
@@ -136,11 +137,11 @@
partial_R_col_str = "-"
partial_R = "-"
try:
- redr2 = "%.4f" %(float(redr2))
+ redr2 = "%.4f" % (float(redr2))
except:
pass
try:
- partial_R = "%.4f" %(float(partial_R))
+ partial_R = "%.4f" % (float(partial_R))
except:
pass
- print >>fout, "%s\t%s\t%s\t%s" %(col_str,redr2,partial_R_col_str,partial_R)
+ print >> fout, "%s\t%s\t%s\t%s" % ( col_str, redr2, partial_R_col_str, partial_R )
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/galaxy/galaxy-central/commits/82d2c2109792/
Changeset: 82d2c2109792
User: dannon
Date: 2014-02-04 16:33:40
Summary: Merged in nsoranzo/galaxy-central (pull request #312)
Remove unused imports and unused variables. Fix spacing.
Affected #: 17 files
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/WeightedAverage.py
--- a/tools/regVariation/WeightedAverage.py
+++ b/tools/regVariation/WeightedAverage.py
@@ -1,20 +1,16 @@
#!/usr/bin/env python
"""
-
usage: %prog bed_file_1 bed_file_2 out_file
-1, --cols1=N,N,N,N: Columns for chr, start, end, strand in first file
-2, --cols2=N,N,N,N,N: Columns for chr, start, end, strand, name/value in second file
"""
-from galaxy import eggs
import collections
-import sys, string
+import sys
#import numpy
from galaxy import eggs
import pkg_resources
pkg_resources.require( "bx-python" )
-import sys, traceback, fileinput
-from warnings import warn
from galaxy.tools.util.galaxyops import *
from bx.cookbook import doc_optparse
@@ -27,77 +23,72 @@
sys.exit()
-def FindRate(chromosome,start_stop,dictType):
- OverlapList=[]
+def FindRate(chromosome, start_stop, dictType):
+ OverlapList = []
for tempO in dictType[chromosome]:
- DatabaseInterval=[tempO[0],tempO[1]]
- Overlap=GetOverlap(start_stop,DatabaseInterval)
- if Overlap>0:
- OverlapList.append([Overlap,tempO[2]])
-
- if len(OverlapList)>0:
-
- SumRecomb=0
- SumOverlap=0
+ DatabaseInterval = [tempO[0], tempO[1]]
+ Overlap = GetOverlap( start_stop, DatabaseInterval )
+ if Overlap > 0:
+ OverlapList.append([Overlap, tempO[2]])
+
+ if len(OverlapList) > 0:
+ SumRecomb = 0
+ SumOverlap = 0
for member in OverlapList:
- SumRecomb+=member[0]*member[1]
- SumOverlap+=member[0]
- averageRate=SumRecomb/SumOverlap
-
+ SumRecomb += member[0]*member[1]
+ SumOverlap += member[0]
+ averageRate = SumRecomb/SumOverlap
return averageRate
-
else:
return 'NA'
-
-
-
-def GetOverlap(a,b):
- return min(a[1],b[1])-max(a[0],b[0])
+
+
+def GetOverlap(a, b):
+ return min(a[1], b[1])-max(a[0], b[0])
+
options, args = doc_optparse.parse( __doc__ )
try:
chr_col_1, start_col_1, end_col_1, strand_col1 = parse_cols_arg( options.cols1 )
- chr_col_2, start_col_2, end_col_2, strand_col2, name_col_2 = parse_cols_arg( options.cols2 )
+ chr_col_2, start_col_2, end_col_2, strand_col2, name_col_2 = parse_cols_arg( options.cols2 )
input1, input2, input3 = args
except Exception, eee:
print eee
stop_err( "Data issue: click the pencil icon in the history item to correct the metadata attributes." )
-
+fd2 = open(input2)
+lines2 = fd2.readlines()
+RecombChrDict = collections.defaultdict(list)
-fd2=open(input2)
-lines2=fd2.readlines()
-RecombChrDict=collections.defaultdict(list)
-
-skipped=0
+skipped = 0
for line in lines2:
- temp=line.strip().split()
+ temp = line.strip().split()
try:
assert float(temp[int(name_col_2)])
except:
- skipped+=1
+ skipped += 1
continue
- tempIndex=[int(temp[int(start_col_2)]),int(temp[int(end_col_2)]),float(temp[int(name_col_2)])]
+ tempIndex = [int(temp[int(start_col_2)]), int(temp[int(end_col_2)]), float(temp[int(name_col_2)])]
RecombChrDict[temp[int(chr_col_2)]].append(tempIndex)
-print "Skipped %d features with invalid values" %(skipped)
+print "Skipped %d features with invalid values" % (skipped)
-fd1=open(input1)
-lines=fd1.readlines()
-finalProduct=''
+fd1 = open(input1)
+lines = fd1.readlines()
+finalProduct = ''
for line in lines:
- temp=line.strip().split('\t')
- chromosome=temp[int(chr_col_1)]
- start=int(temp[int(start_col_1)])
- stop=int(temp[int(end_col_1)])
- start_stop=[start,stop]
- RecombRate=FindRate(chromosome,start_stop,RecombChrDict)
+ temp = line.strip().split('\t')
+ chromosome = temp[int(chr_col_1)]
+ start = int(temp[int(start_col_1)])
+ stop = int(temp[int(end_col_1)])
+ start_stop = [start, stop]
+ RecombRate = FindRate( chromosome, start_stop, RecombChrDict )
try:
- RecombRate="%.4f" %(float(RecombRate))
+ RecombRate = "%.4f" % (float(RecombRate))
except:
- RecombRate=RecombRate
- finalProduct+=line.strip()+'\t'+str(RecombRate)+'\n'
-fdd=open(input3,'w')
+ RecombRate = RecombRate
+ finalProduct += line.strip()+'\t'+str(RecombRate)+'\n'
+fdd = open(input3, 'w')
fdd.writelines(finalProduct)
fdd.close()
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/best_regression_subsets.py
--- a/tools/regVariation/best_regression_subsets.py
+++ b/tools/regVariation/best_regression_subsets.py
@@ -2,7 +2,7 @@
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -10,19 +10,20 @@
sys.stderr.write(msg)
sys.exit()
+
infile = sys.argv[1]
y_col = int(sys.argv[2])-1
x_cols = sys.argv[3].split(',')
outfile = sys.argv[4]
outfile2 = sys.argv[5]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -32,12 +33,12 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile ) ):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -46,7 +47,7 @@
except Exception, ey:
yval = r('NA')
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except Exception, ex:
@@ -59,10 +60,10 @@
x_vals1 = numpy.asarray(x_vals).transpose()
-dat= r.list(x=array(x_vals1), y=y_vals)
+dat = r.list(x=array(x_vals1), y=y_vals)
r.library("leaps")
-
+
set_default_mode(NO_CONVERSION)
try:
leaps = r.regsubsets(r("y ~ x"), data= r.na_exclude(dat))
@@ -75,10 +76,10 @@
pattern = "["
for i in range(tot):
pattern = pattern + 'c' + str(int(x_cols[int(i)]) + 1) + ' '
-pattern = pattern.strip() + ']'
-print >>fout, "#Vars\t%s\tR-sq\tAdj. R-sq\tC-p\tbic" %(pattern)
-for ind,item in enumerate(summary['outmat']):
- print >>fout, "%s\t%s\t%s\t%s\t%s\t%s" %(str(item).count('*'), item, summary['rsq'][ind], summary['adjr2'][ind], summary['cp'][ind], summary['bic'][ind])
+pattern = pattern.strip() + ']'
+print >> fout, "#Vars\t%s\tR-sq\tAdj. R-sq\tC-p\tbic" % (pattern)
+for ind, item in enumerate(summary['outmat']):
+ print >> fout, "%s\t%s\t%s\t%s\t%s\t%s" % (str(item).count('*'), item, summary['rsq'][ind], summary['adjr2'][ind], summary['cp'][ind], summary['bic'][ind])
r.pdf( outfile2, 8, 8 )
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/featureCounter.py
--- a/tools/regVariation/featureCounter.py
+++ b/tools/regVariation/featureCounter.py
@@ -11,8 +11,7 @@
from galaxy import eggs
import pkg_resources
pkg_resources.require( "bx-python" )
-import sys, traceback, fileinput
-from warnings import warn
+import sys, fileinput
from bx.intervals.io import *
from bx.cookbook import doc_optparse
from bx.intervals.operations import quicksect
@@ -33,7 +32,7 @@
partial += 1
if node.left and node.left.maxend > start:
counter(node.left, start, end)
- if node.right:
+ if node.right:
counter(node.right, start, end)
elif start < node.start < end:
if node.end <= end:
@@ -42,10 +41,10 @@
partial += 1
if node.left and node.left.maxend > start:
counter(node.left, start, end)
- if node.right:
+ if node.right:
counter(node.right, start, end)
else:
- if node.left:
+ if node.left:
counter(node.left, start, end)
def count_coverage( readers, comments=True ):
@@ -58,8 +57,8 @@
if type( item ) is GenomicInterval:
rightTree.insert( item, secondary.linenum, item.fields )
- bitsets = secondary_copy.binned_bitsets()
-
+ bitsets = secondary_copy.binned_bitsets()
+
global full, partial
for interval in primary:
@@ -82,7 +81,7 @@
bases_covered = bitsets[ chrom ].count_range( start, end-start )
if (end - start) == 0:
percent = 0
- else:
+ else:
percent = float(bases_covered) / float(end - start)
if bases_covered:
root = rightTree.chroms[chrom] #root node for the chrom tree
@@ -92,13 +91,14 @@
interval.fields.append(str(full))
interval.fields.append(str(partial))
yield interval
-
+
+
def main():
options, args = doc_optparse.parse( __doc__ )
try:
chr_col_1, start_col_1, end_col_1, strand_col_1 = parse_cols_arg( options.cols1 )
- chr_col_2, start_col_2, end_col_2, strand_col_2 = parse_cols_arg( options.cols2 )
+ chr_col_2, start_col_2, end_col_2, strand_col_2 = parse_cols_arg( options.cols2 )
in1_fname, in2_fname, out_fname = args
except:
stop_err( "Data issue: click the pencil icon in the history item to correct the metadata attributes." )
@@ -126,7 +126,7 @@
out_file = open( out_fname, "w" )
try:
- for line in count_coverage([g1,g2,g2_copy]):
+ for line in count_coverage([g1, g2, g2_copy]):
if type( line ) is GenomicInterval:
out_file.write( "%s\n" % "\t".join( line.fields ) )
else:
@@ -143,6 +143,7 @@
print skipped( g2, filedesc=" of 2nd dataset" )
elif g2_copy.skipped > 0:
print skipped( g2_copy, filedesc=" of 2nd dataset" )
-
+
+
if __name__ == "__main__":
main()
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/getIndelRates_3way.py
--- a/tools/regVariation/getIndelRates_3way.py
+++ b/tools/regVariation/getIndelRates_3way.py
@@ -6,7 +6,6 @@
pkg_resources.require( "bx-python" )
import sys, os, tempfile
-import traceback
import fileinput
from warnings import warn
@@ -18,7 +17,8 @@
def stop_err(msg):
sys.stderr.write(msg)
sys.exit()
-
+
+
def counter(node, start, end, sort_col):
global full, blk_len, blk_list
if node.start < start:
@@ -31,14 +31,14 @@
blk_len += int(node.other[sort_col+2])
if node.left and node.left.maxend > start:
counter(node.left, start, end, sort_col)
- if node.right:
+ if node.right:
counter(node.right, start, end, sort_col)
elif node.start > end:
- if node.left:
+ if node.left:
counter(node.left, start, end, sort_col)
-
-infile = sys.argv[1]
+
+infile = sys.argv[1]
fout = open(sys.argv[2],'w')
int_file = sys.argv[3]
if int_file != "None": #User has specified an interval file
@@ -48,9 +48,9 @@
chr_col_i, start_col_i, end_col_i, strand_col_i = parse_cols_arg( sys.argv[5] )
except:
stop_err("Unable to open input Interval file")
-
+
+
def main():
-
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
@@ -86,8 +86,7 @@
break
except:
continue
-
-
+
fin = open(infile, 'r')
skipped = 0
@@ -98,7 +97,7 @@
os.system(cmdline)
except:
stop_err("Encountered error while sorting the input file.")
- print >>fout, "#Block\t%s_InsRate\t%s_InsRate\t%s_InsRate\t%s_DelRate\t%s_DelRate\t%s_DelRate" %(species[0],species[1],species[2],species[0],species[1],species[2])
+ print >> fout, "#Block\t%s_InsRate\t%s_InsRate\t%s_InsRate\t%s_DelRate\t%s_DelRate\t%s_DelRate" % ( species[0], species[1], species[2], species[0], species[1], species[2] )
prev_bnum = -1
sorted_infile.seek(0)
for line in sorted_infile.readlines():
@@ -112,16 +111,16 @@
if prev_bnum != -1:
irate = []
drate = []
- for i,elem in enumerate(inserts):
+ for i, elem in enumerate(inserts):
try:
- irate.append(str("%.2e" %(inserts[i]/blen[i])))
+ irate.append(str("%.2e" % (inserts[i]/blen[i])))
except:
irate.append('0')
try:
- drate.append(str("%.2e" %(deletes[i]/blen[i])))
+ drate.append(str("%.2e" % (deletes[i]/blen[i])))
except:
drate.append('0')
- print >>fout, "%s\t%s\t%s" %(prev_bnum, '\t'.join(irate) , '\t'.join(drate))
+ print >> fout, "%s\t%s\t%s" % ( prev_bnum, '\t'.join(irate) , '\t'.join(drate) )
inserts = [0.0, 0.0, 0.0]
deletes = [0.0, 0.0, 0.0]
blen = []
@@ -134,25 +133,24 @@
inserts[sp_ind] += 1
elif elems[1].endswith('delete'):
deletes[sp_ind] += 1
- prev_bnum = new_bnum
+ prev_bnum = new_bnum
except Exception, ei:
#print >>sys.stderr, ei
continue
irate = []
drate = []
- for i,elem in enumerate(inserts):
+ for i, elem in enumerate(inserts):
try:
- irate.append(str("%.2e" %(inserts[i]/blen[i])))
+ irate.append(str("%.2e" % (inserts[i]/blen[i])))
except:
irate.append('0')
try:
- drate.append(str("%.2e" %(deletes[i]/blen[i])))
+ drate.append(str("%.2e" % (deletes[i]/blen[i])))
except:
drate.append('0')
- print >>fout, "%s\t%s\t%s" %(prev_bnum, '\t'.join(irate) , '\t'.join(drate))
+ print >> fout, "%s\t%s\t%s" % ( prev_bnum, '\t'.join(irate) , '\t'.join(drate) )
sys.exit()
-
inf = open(infile, 'r')
start_met = False
end_met = False
@@ -163,14 +161,14 @@
try:
assert int(elems[0])
assert len(elems) == 18
- if dbkey_i not in elems[1]:
- if not(start_met):
+ if dbkey_i not in elems[1]:
+ if not(start_met):
continue
else:
sp_end = n
break
else:
- print >>sp_file, line
+ print >> sp_file, line
if not(start_met):
start_met = True
sp_start = n
@@ -201,7 +199,7 @@
for item in indel:
if type( item ) is GenomicInterval:
indelTree.insert( item, indel.linenum, item.fields )
- result=[]
+ result = []
global full, blk_len, blk_list
for interval in win:
@@ -213,14 +211,14 @@
chrom = interval.chrom
start = int(interval.start)
end = int(interval.end)
- if start > end:
+ if start > end:
warn( "Interval start after end!" )
- ins_chr = "%s.%s_insert" %(dbkey_i,chrom)
- del_chr = "%s.%s_delete" %(dbkey_i,chrom)
+ ins_chr = "%s.%s_insert" % ( dbkey_i, chrom )
+ del_chr = "%s.%s_delete" % ( dbkey_i, chrom )
irate = 0
drate = 0
if ins_chr not in indelTree.chroms and del_chr not in indelTree.chroms:
- pass
+ pass
else:
if ins_chr in indelTree.chroms:
full = 0.0
@@ -242,8 +240,9 @@
interval.fields.append(str("%.2e" %irate))
interval.fields.append(str("%.2e" %drate))
- print >>fout, "\t".join(interval.fields)
+ print >> fout, "\t".join(interval.fields)
fout.flush()
+
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/getIndels.py
--- a/tools/regVariation/getIndels.py
+++ b/tools/regVariation/getIndels.py
@@ -8,13 +8,12 @@
from __future__ import division
from galaxy import eggs
-import pkg_resources
+import pkg_resources
pkg_resources.require( "bx-python" )
try:
pkg_resources.require("numpy")
except:
pass
-import psyco_full
import sys
from bx.cookbook import doc_optparse
from galaxy.tools.exception_handling import *
@@ -22,24 +21,24 @@
assert sys.version_info[:2] >= ( 2, 4 )
-def main():
+def main():
# Parsing Command Line here
options, args = doc_optparse.parse( __doc__ )
try:
- inp_file, out_file1 = args
+ inp_file, out_file1 = args
except:
print >> sys.stderr, "Tool initialization error."
sys.exit()
try:
- fin = open(inp_file,'r')
+ open(inp_file, 'r')
except:
print >> sys.stderr, "Unable to open input file"
sys.exit()
try:
- fout1 = open(out_file1,'w')
- #fout2 = open(out_file2,'w')
+ fout1 = open(out_file1, 'w')
+ #fout2 = open(out_file2, 'w')
except:
print >> sys.stderr, "Unable to open output file"
sys.exit()
@@ -47,11 +46,10 @@
try:
maf_reader = bx.align.maf.Reader( open(inp_file, 'r') )
except:
- print >>sys.stderr, "Your MAF file appears to be malformed."
+ print >> sys.stderr, "Your MAF file appears to be malformed."
sys.exit()
- maf_count = 0
- print >>fout1, "#Block\tSource\tSeq1_Start\tSeq1_End\tSeq2_Start\tSeq2_End\tIndel_length"
+ print >> fout1, "#Block\tSource\tSeq1_Start\tSeq1_End\tSeq2_Start\tSeq2_End\tIndel_length"
for block_ind, block in enumerate(maf_reader):
if len(block.components) < 2:
continue
@@ -84,19 +82,19 @@
#write 2
if prev_pos_gap2 == 1:
prev_pos_gap2 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos1,nt_pos1+1,nt_pos2-1,nt_pos2-1+gaplen2,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos1, nt_pos1+1, nt_pos2-1, nt_pos2-1+gaplen2, gaplen2 )
if pos == len(seq1)-1:
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1,nt_pos1+1,nt_pos2+1-gaplen1,nt_pos2+1,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1, nt_pos1+1, nt_pos2+1-gaplen1, nt_pos2+1, gaplen1 )
else:
prev_pos_gap1 = 0
prev_pos_gap2 = 0
"""
if prev_pos_gap1 == 1:
prev_pos_gap1 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1-1,nt_pos1,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1-1, nt_pos1, gaplen1 )
elif prev_pos_gap2 == 1:
prev_pos_gap2 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos2-1,nt_pos2,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos2-1, nt_pos2, gaplen2 )
"""
else:
nt_pos1 += 1
@@ -105,19 +103,21 @@
#write both
if prev_pos_gap1 == 1:
prev_pos_gap1 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1-1,nt_pos1,nt_pos2-gaplen1,nt_pos2,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1-1, nt_pos1, nt_pos2-gaplen1, nt_pos2, gaplen1 )
elif prev_pos_gap2 == 1:
prev_pos_gap2 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos1-gaplen2,nt_pos1,nt_pos2-1,nt_pos2,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos1-gaplen2, nt_pos1, nt_pos2-1, nt_pos2, gaplen2 )
else:
gaplen2 += 1
prev_pos_gap2 = 1
#write 1
if prev_pos_gap1 == 1:
prev_pos_gap1 = 0
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src1,nt_pos1-1,nt_pos1,nt_pos2,nt_pos2+gaplen1,gaplen1)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src1, nt_pos1-1, nt_pos1, nt_pos2, nt_pos2+gaplen1, gaplen1 )
if pos == len(seq1)-1:
- print >>fout1,"%d\t%s\t%s\t%s\t%s\t%s\t%s" %(block_ind+1,src2,nt_pos1+1-gaplen2,nt_pos1+1,nt_pos2,nt_pos2+1,gaplen2)
+ print >> fout1, "%d\t%s\t%s\t%s\t%s\t%s\t%s" % ( block_ind+1, src2, nt_pos1+1-gaplen2, nt_pos1+1, nt_pos2, nt_pos2+1, gaplen2 )
pos += 1
+
+
if __name__ == "__main__":
main()
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/linear_regression.py
--- a/tools/regVariation/linear_regression.py
+++ b/tools/regVariation/linear_regression.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -15,14 +15,14 @@
outfile = sys.argv[4]
outfile2 = sys.argv[5]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
elems = []
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -32,12 +32,12 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile )):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -46,7 +46,7 @@
except:
yval = r('NA')
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except:
@@ -57,7 +57,7 @@
x_vals1 = numpy.asarray(x_vals).transpose()
-dat= r.list(x=array(x_vals1), y=y_vals)
+dat = r.list(x=array(x_vals1), y=y_vals)
set_default_mode(NO_CONVERSION)
try:
@@ -66,8 +66,8 @@
stop_err("Error performing linear regression on the input data.\nEither the response column or one of the predictor columns contain only non-numeric or invalid values.")
set_default_mode(BASIC_CONVERSION)
-coeffs=linear_model.as_py()['coefficients']
-yintercept= coeffs['(Intercept)']
+coeffs = linear_model.as_py()['coefficients']
+yintercept = coeffs['(Intercept)']
summary = r.summary(linear_model)
co = summary.get('coefficients', 'NA')
@@ -82,8 +82,8 @@
except:
pass
-print >>fout, "Y-intercept\t%s" %(yintercept)
-print >>fout, "p-value (Y-intercept)\t%s" %(pvaly)
+print >> fout, "Y-intercept\t%s" % (yintercept)
+print >> fout, "p-value (Y-intercept)\t%s" % (pvaly)
if len(x_vals) == 1: #Simple linear regression case with 1 predictor variable
try:
@@ -94,22 +94,22 @@
pval = r.round(float(co[1][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[0]+1,slope)
- print >>fout, "p-value (c%d)\t%s" %(x_cols[0]+1,pval)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[0]+1, slope )
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[0]+1, pval )
else: #Multiple regression case with >1 predictors
- ind=1
+ ind = 1
while ind < len(coeffs.keys()):
try:
slope = r.round(float(coeffs['x'+str(ind)]), digits=10)
except:
slope = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[ind-1]+1,slope)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[ind-1]+1, slope )
try:
pval = r.round(float(co[ind][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "p-value (c%d)\t%s" %(x_cols[ind-1]+1,pval)
- ind+=1
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[ind-1]+1, pval )
+ ind += 1
rsq = summary.get('r.squared','NA')
adjrsq = summary.get('adj.r.squared','NA')
@@ -125,14 +125,14 @@
except:
pass
-print >>fout, "R-squared\t%s" %(rsq)
-print >>fout, "Adjusted R-squared\t%s" %(adjrsq)
-print >>fout, "F-statistic\t%s" %(fstat)
-print >>fout, "Sigma\t%s" %(sigma)
+print >> fout, "R-squared\t%s" % (rsq)
+print >> fout, "Adjusted R-squared\t%s" % (adjrsq)
+print >> fout, "F-statistic\t%s" % (fstat)
+print >> fout, "Sigma\t%s" % (sigma)
r.pdf( outfile2, 8, 8 )
if len(x_vals) == 1: #Simple linear regression case with 1 predictor variable
- sub_title = "Slope = %s; Y-int = %s" %(slope,yintercept)
+ sub_title = "Slope = %s; Y-int = %s" % ( slope, yintercept )
try:
r.plot(x=x_vals[0], y=y_vals, xlab="X", ylab="Y", sub=sub_title, main="Scatterplot with regression")
r.abline(a=yintercept, b=slope, col="red")
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/logistic_regression_vif.py
--- a/tools/regVariation/logistic_regression_vif.py
+++ b/tools/regVariation/logistic_regression_vif.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -15,14 +15,14 @@
outfile = sys.argv[4]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
elems = []
-for i, line in enumerate( file ( infile )):
+for i, line in enumerate( file( infile ) ):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -32,12 +32,12 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile )):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -46,7 +46,7 @@
except:
yval = r('NA')
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except:
@@ -57,46 +57,45 @@
x_vals1 = numpy.asarray(x_vals).transpose()
-check1=0
-check0=0
+check1 = 0
+check0 = 0
for i in y_vals:
if i == 1:
- check1=1
+ check1 = 1
if i == 0:
- check0=1
-if check1==0 or check0==0:
+ check0 = 1
+if check1 == 0 or check0 == 0:
sys.exit("Warning: logistic regression must have at least two classes")
for i in y_vals:
- if i not in [1,0,r('NA')]:
- print >>fout, str(i)
+ if i not in [1, 0, r('NA')]:
+ print >> fout, str(i)
sys.exit("Warning: the current version of this tool can run only with two classes and need to be labeled as 0 and 1.")
-
-
-dat= r.list(x=array(x_vals1), y=y_vals)
-novif=0
+
+dat = r.list(x=array(x_vals1), y=y_vals)
+novif = 0
set_default_mode(NO_CONVERSION)
try:
- linear_model = r.glm(r("y ~ x"), data = r.na_exclude(dat),family="binomial")
+ linear_model = r.glm(r("y ~ x"), data=r.na_exclude(dat), family="binomial")
except RException, rex:
stop_err("Error performing logistic regression on the input data.\nEither the response column or one of the predictor columns contain only non-numeric or invalid values.")
if len(x_cols)>1:
try:
r('suppressPackageStartupMessages(library(car))')
- r.assign('dat',dat)
- r.assign('ncols',len(x_cols))
- vif=r.vif(r('glm(dat$y ~ ., data = na.exclude(data.frame(as.matrix(dat$x,ncol=ncols))->datx),family="binomial")'))
+ r.assign('dat', dat)
+ r.assign('ncols', len(x_cols))
+ vif = r.vif(r('glm(dat$y ~ ., data = na.exclude(data.frame(as.matrix(dat$x,ncol=ncols))->datx), family="binomial")'))
except RException, rex:
print rex
else:
- novif=1
-
+ novif = 1
+
set_default_mode(BASIC_CONVERSION)
-coeffs=linear_model.as_py()['coefficients']
-null_deviance=linear_model.as_py()['null.deviance']
-residual_deviance=linear_model.as_py()['deviance']
-yintercept= coeffs['(Intercept)']
+coeffs = linear_model.as_py()['coefficients']
+null_deviance = linear_model.as_py()['null.deviance']
+residual_deviance = linear_model.as_py()['deviance']
+yintercept = coeffs['(Intercept)']
summary = r.summary(linear_model)
co = summary.get('coefficients', 'NA')
"""
@@ -109,14 +108,14 @@
pvaly = r.round(float(co[0][3]), digits=10)
except:
pass
-print >>fout, "response column\tc%d" %(y_col+1)
-tempP=[]
+print >> fout, "response column\tc%d" % (y_col+1)
+tempP = []
for i in x_cols:
tempP.append('c'+str(i+1))
-tempP=','.join(tempP)
-print >>fout, "predictor column(s)\t%s" %(tempP)
-print >>fout, "Y-intercept\t%s" %(yintercept)
-print >>fout, "p-value (Y-intercept)\t%s" %(pvaly)
+tempP = ','.join(tempP)
+print >> fout, "predictor column(s)\t%s" % (tempP)
+print >> fout, "Y-intercept\t%s" % (yintercept)
+print >> fout, "p-value (Y-intercept)\t%s" % (pvaly)
if len(x_vals) == 1: #Simple linear regression case with 1 predictor variable
try:
@@ -127,44 +126,43 @@
pval = r.round(float(co[1][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[0]+1,slope)
- print >>fout, "p-value (c%d)\t%s" %(x_cols[0]+1,pval)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[0]+1, slope )
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[0]+1, pval )
else: #Multiple regression case with >1 predictors
- ind=1
+ ind = 1
while ind < len(coeffs.keys()):
try:
slope = r.round(float(coeffs['x'+str(ind)]), digits=10)
except:
slope = 'NA'
- print >>fout, "Slope (c%d)\t%s" %(x_cols[ind-1]+1,slope)
+ print >> fout, "Slope (c%d)\t%s" % ( x_cols[ind-1]+1, slope )
try:
pval = r.round(float(co[ind][3]), digits=10)
except:
pval = 'NA'
- print >>fout, "p-value (c%d)\t%s" %(x_cols[ind-1]+1,pval)
- ind+=1
+ print >> fout, "p-value (c%d)\t%s" % ( x_cols[ind-1]+1, pval )
+ ind += 1
rsq = summary.get('r.squared','NA')
-
try:
- rsq= r.round(float((null_deviance-residual_deviance)/null_deviance), digits=5)
- null_deviance= r.round(float(null_deviance), digits=5)
- residual_deviance= r.round(float(residual_deviance), digits=5)
+ rsq = r.round(float((null_deviance-residual_deviance)/null_deviance), digits=5)
+ null_deviance = r.round(float(null_deviance), digits=5)
+ residual_deviance = r.round(float(residual_deviance), digits=5)
except:
pass
-print >>fout, "Null deviance\t%s" %(null_deviance)
-print >>fout, "Residual deviance\t%s" %(residual_deviance)
-print >>fout, "pseudo R-squared\t%s" %(rsq)
-print >>fout, "\n"
-print >>fout, 'vif'
+print >> fout, "Null deviance\t%s" % (null_deviance)
+print >> fout, "Residual deviance\t%s" % (residual_deviance)
+print >> fout, "pseudo R-squared\t%s" % (rsq)
+print >> fout, "\n"
+print >> fout, 'vif'
-if novif==0:
- py_vif=vif.as_py()
- count=0
+if novif == 0:
+ py_vif = vif.as_py()
+ count = 0
for i in sorted(py_vif.keys()):
- print >>fout,'c'+str(x_cols[count]+1) ,str(py_vif[i])
- count+=1
-elif novif==1:
- print >>fout, "vif can calculate only when model have more than 1 predictor"
+ print >> fout, 'c'+str(x_cols[count]+1), str(py_vif[i])
+ count += 1
+elif novif == 1:
+ print >> fout, "vif can calculate only when model have more than 1 predictor"
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/maf_cpg_filter.py
--- a/tools/regVariation/maf_cpg_filter.py
+++ b/tools/regVariation/maf_cpg_filter.py
@@ -10,7 +10,7 @@
"""
from galaxy import eggs
-import pkg_resources
+import pkg_resources
pkg_resources.require( "bx-python" )
try:
pkg_resources.require( "numpy" )
@@ -54,7 +54,7 @@
defn = "non-CpG"
cpgfilter.run( reader, writer.write )
- print "%2.2f percent bases masked; Mask character = %s, Definition = %s" %(float(cpgfilter.masked)/float(cpgfilter.total) * 100, mask, defn)
+ print "%2.2f percent bases masked; Mask character = %s, Definition = %s" % ( float(cpgfilter.masked)/float(cpgfilter.total) * 100, mask, defn )
if __name__ == "__main__":
main()
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/microsats_alignment_level.py
--- a/tools/regVariation/microsats_alignment_level.py
+++ b/tools/regVariation/microsats_alignment_level.py
@@ -4,7 +4,11 @@
Uses SPUTNIK to fetch microsatellites and extracts orthologous repeats from the sputnik output.
"""
from galaxy import eggs
-import sys, os, tempfile, string, math, re
+import os
+import re
+import string
+import sys
+import tempfile
def reverse_complement(text):
DNA_COMP = string.maketrans( "ACGTacgt", "TGCAtgca" )
@@ -12,31 +16,26 @@
comp.reverse()
return "".join(comp)
+
def main():
if len(sys.argv) != 8:
- print >>sys.stderr, "Insufficient number of arguments."
+ print >> sys.stderr, "Insufficient number of arguments."
sys.exit()
infile = open(sys.argv[1],'r')
separation = int(sys.argv[2])
outfile = sys.argv[3]
- align_type = sys.argv[4]
- if align_type == "2way":
- align_type_len = 2
- elif align_type == "3way":
- align_type_len = 3
mono_threshold = int(sys.argv[5])
non_mono_threshold = int(sys.argv[6])
allow_different_units = int(sys.argv[7])
- print "Min distance = %d bp; Min threshold for mono repeats = %d; Min threshold for non-mono repeats = %d; Allow different motifs = %s" %(separation, mono_threshold, non_mono_threshold, allow_different_units==1)
+ print "Min distance = %d bp; Min threshold for mono repeats = %d; Min threshold for non-mono repeats = %d; Allow different motifs = %s" % ( separation, mono_threshold, non_mono_threshold, allow_different_units==1 )
try:
fout = open(outfile, "w")
- print >>fout, "#Block\tSeq1_Name\tSeq1_Start\tSeq1_End\tSeq1_Type\tSeq1_Length\tSeq1_RepeatNumber\tSeq1_Unit\tSeq2_Name\tSeq2_Start\tSeq2_End\tSeq2_Type\tSeq2_Length\tSeq2_RepeatNumber\tSeq2_Unit"
+ print >> fout, "#Block\tSeq1_Name\tSeq1_Start\tSeq1_End\tSeq1_Type\tSeq1_Length\tSeq1_RepeatNumber\tSeq1_Unit\tSeq2_Name\tSeq2_Start\tSeq2_End\tSeq2_Type\tSeq2_Length\tSeq2_RepeatNumber\tSeq2_Unit"
#sputnik_cmd = os.path.join(os.path.split(sys.argv[0])[0], "sputnik")
sputnik_cmd = "sputnik"
input = infile.read()
- skipped = 0
block_num = 0
input = input.replace('\r','\n')
for block in input.split('\n\n'):
@@ -44,26 +43,24 @@
tmpin = tempfile.NamedTemporaryFile()
tmpout = tempfile.NamedTemporaryFile()
tmpin.write(block.strip())
- blk = tmpin.read()
cmdline = sputnik_cmd + " " + tmpin.name + " > /dev/null 2>&1 >> " + tmpout.name
try:
os.system(cmdline)
- except Exception, es:
+ except Exception:
continue
sputnik_out = tmpout.read()
tmpin.close()
tmpout.close()
if sputnik_out != "":
if len(block.split('>')[1:]) != 2: #len(sputnik_out.split('>')):
- skipped += 1
continue
align_block = block.strip().split('>')
lendict = {'mononucleotide':1, 'dinucleotide':2, 'trinucleotide':3, 'tetranucleotide':4, 'pentanucleotide':5, 'hexanucleotide':6}
- blockdict={}
- r=0
- namelist=[]
- for k,sput_block in enumerate(sputnik_out.split('>')[1:]):
+ blockdict = {}
+ r = 0
+ namelist = []
+ for k, sput_block in enumerate(sputnik_out.split('>')[1:]):
whole_seq = ''.join(align_block[k+1].split('\n')[1:]).replace('\n','').strip()
p = re.compile('\n(\S*nucleotide)')
repeats = p.split(sput_block.strip())
@@ -71,13 +68,12 @@
j = 1
name = repeats[0].strip()
try:
- coords = re.search('\d+[-_:]\d+',name).group()
- coords = coords.replace('_','-').replace(':','-')
- except Exception, e:
+ coords = re.search('\d+[-_:]\d+', name).group()
+ coords = coords.replace('_', '-').replace(':', '-')
+ except Exception:
coords = '0-0'
- pass
r += 1
- blockdict[r]={}
+ blockdict[r] = {}
try:
sp_name = name[:name.index('.')]
chr_name = name[name.index('.'):name.index('(')]
@@ -91,11 +87,10 @@
continue
if blockdict[r].has_key('types'):
- blockdict[r]['types'].append(repeats[j].strip()) #type of microsat
+ blockdict[r]['types'].append(repeats[j].strip()) #type of microsat
else:
- blockdict[r]['types'] = [repeats[j].strip()] #type of microsat
+ blockdict[r]['types'] = [repeats[j].strip()] #type of microsat
- sequence = ''.join(align_block[r].split('\n')[1:]).replace('\n','').strip()
start = int(repeats[j+1].split('--')[0].split(':')[0].strip())
#check to see if there are gaps before the start of the repeat, and change the start accordingly
sgaps = 0
@@ -107,7 +102,7 @@
break #break at the 1st non-gap character
ch_pos -= 1
if blockdict[r].has_key('starts'):
- blockdict[r]['starts'].append(start+sgaps) #start co-ords adjusted with alignment co-ords to include GAPS
+ blockdict[r]['starts'].append(start+sgaps) #start co-ords adjusted with alignment co-ords to include GAPS
else:
blockdict[r]['starts'] = [start+sgaps]
@@ -120,7 +115,7 @@
else:
break #break at the 1st non-gap character
if blockdict[r].has_key('ends'):
- blockdict[r]['ends'].append(end+egaps) #end co-ords adjusted with alignment co-ords to include GAPS
+ blockdict[r]['ends'].append(end+egaps) #end co-ords adjusted with alignment co-ords to include GAPS
else:
blockdict[r]['ends'] = [end+egaps]
@@ -134,20 +129,20 @@
gaps_before_start = whole_seq[:rel_start].count('-')
if blockdict[r].has_key('gaps_before_start'):
- blockdict[r]['gaps_before_start'].append(gaps_before_start) #lengths
+ blockdict[r]['gaps_before_start'].append(gaps_before_start) #lengths
else:
- blockdict[r]['gaps_before_start'] = [gaps_before_start] #lengths
+ blockdict[r]['gaps_before_start'] = [gaps_before_start] #lengths
- whole_seq_start= int(coords.split('-')[0])
+ whole_seq_start = int(coords.split('-')[0])
if blockdict[r].has_key('whole_seq_start'):
- blockdict[r]['whole_seq_start'].append(whole_seq_start) #lengths
+ blockdict[r]['whole_seq_start'].append(whole_seq_start) #lengths
else:
- blockdict[r]['whole_seq_start'] = [whole_seq_start] #lengths
+ blockdict[r]['whole_seq_start'] = [whole_seq_start] #lengths
if blockdict[r].has_key('lengths'):
- blockdict[r]['lengths'].append(repeat_len) #lengths
+ blockdict[r]['lengths'].append(repeat_len) #lengths
else:
- blockdict[r]['lengths'] = [repeat_len] #lengths
+ blockdict[r]['lengths'] = [repeat_len] #lengths
if blockdict[r].has_key('counts'):
blockdict[r]['counts'].append(str(int(repeat_len)/lendict[repeats[j].strip()])) #Repeat Unit
@@ -159,10 +154,10 @@
else:
blockdict[r]['units'] = [repeat_seq[:lendict[repeats[j].strip()]]] #Repeat Unit
- except Exception, eh:
+ except Exception:
pass
- j+=2
- #check the co-ords of all repeats corresponding to a sequence and remove adjacent repeats separated by less than the user-specified 'separation'.
+ j += 2
+ #check the co-ords of all repeats corresponding to a sequence and remove adjacent repeats separated by less than the user-specified 'separation'.
delete_index_list = []
for ind, item in enumerate(blockdict[r]['ends']):
try:
@@ -171,7 +166,7 @@
delete_index_list.append(ind)
if ind+1 not in delete_index_list:
delete_index_list.append(ind+1)
- except Exception, ek:
+ except Exception:
pass
for index in delete_index_list: #mark them for deletion
try:
@@ -183,7 +178,7 @@
blockdict[r]['lengths'][index] = 'marked'
blockdict[r]['counts'][index] = 'marked'
blockdict[r]['units'][index] = 'marked'
- except Exception, ej:
+ except Exception:
pass
#remove 'marked' elements from all the lists
"""
@@ -192,19 +187,19 @@
if elem == 'marked':
blockdict[r][key].remove(elem)
"""
- #print blockdict
+ #print blockdict
- #make sure that the blockdict has keys for both the species
+ #make sure that the blockdict has keys for both the species
if (1 not in blockdict) or (2 not in blockdict):
continue
visited_2 = [0 for x in range(len(blockdict[2]['starts']))]
- for ind1,coord_s1 in enumerate(blockdict[1]['starts']):
+ for ind1, coord_s1 in enumerate(blockdict[1]['starts']):
if coord_s1 == 'marked':
continue
coord_e1 = blockdict[1]['ends'][ind1]
out = []
- for ind2,coord_s2 in enumerate(blockdict[2]['starts']):
+ for ind2, coord_s2 in enumerate(blockdict[2]['starts']):
if coord_s2 == 'marked':
visited_2[ind2] = 1
continue
@@ -216,7 +211,7 @@
else:
if (blockdict[1]['units'][ind1] not in blockdict[2]['units'][ind2]*2) and (reverse_complement(blockdict[1]['units'][ind1]) not in blockdict[2]['units'][ind2]*2):
continue
- #print >>sys.stderr, (reverse_complement(blockdict[1]['units'][ind1]) not in blockdict[2]['units'][ind2]*2)
+ #print >> sys.stderr, (reverse_complement(blockdict[1]['units'][ind1]) not in blockdict[2]['units'][ind2]*2)
#skip if the repeat number thresholds are not met
if blockdict[1]['types'][ind1] == 'mononucleotide':
if (int(blockdict[1]['counts'][ind1]) < mono_threshold):
@@ -231,12 +226,12 @@
else:
if (int(blockdict[2]['counts'][ind2]) < non_mono_threshold):
continue
- #print "s1,e1=%s,%s; s2,e2=%s,%s" %(coord_s1,coord_e1,coord_s2,coord_e2)
- if (coord_s1 in range(coord_s2,coord_e2)) or (coord_e1 in range(coord_s2,coord_e2)):
+ #print "s1,e1=%s,%s; s2,e2=%s,%s" % ( coord_s1, coord_e1, coord_s2, coord_e2 )
+ if (coord_s1 in range(coord_s2, coord_e2)) or (coord_e1 in range(coord_s2, coord_e2)):
out.append(str(block_num))
out.append(namelist[0])
rel_start = blockdict[1]['whole_seq_start'][ind1] + coord_s1 - blockdict[1]['gaps_before_start'][ind1]
- rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
+ rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[1]['types'][ind1])
@@ -245,16 +240,16 @@
out.append(blockdict[1]['units'][ind1])
out.append(namelist[1])
rel_start = blockdict[2]['whole_seq_start'][ind2] + coord_s2 - blockdict[2]['gaps_before_start'][ind2]
- rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
+ rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[2]['types'][ind2])
out.append(blockdict[2]['lengths'][ind2])
out.append(blockdict[2]['counts'][ind2])
out.append(blockdict[2]['units'][ind2])
- print >>fout, '\t'.join(out)
+ print >> fout, '\t'.join(out)
visited_2[ind2] = 1
- out=[]
+ out = []
if 0 in visited_2: #there are still some elements in 2nd set which haven't found orthologs yet.
for ind2, coord_s2 in enumerate(blockdict[2]['starts']):
@@ -264,7 +259,7 @@
continue
coord_e2 = blockdict[2]['ends'][ind2]
out = []
- for ind1,coord_s1 in enumerate(blockdict[1]['starts']):
+ for ind1, coord_s1 in enumerate(blockdict[1]['starts']):
if coord_s1 == 'marked':
continue
coord_e1 = blockdict[1]['ends'][ind1]
@@ -290,11 +285,11 @@
if (int(blockdict[2]['counts'][ind2]) < non_mono_threshold):
continue
- if (coord_s2 in range(coord_s1,coord_e1)) or (coord_e2 in range(coord_s1,coord_e1)):
- out.append(str(block_num))
+ if (coord_s2 in range(coord_s1, coord_e1)) or (coord_e2 in range(coord_s1, coord_e1)):
+ out.append(str(block_num))
out.append(namelist[0])
rel_start = blockdict[1]['whole_seq_start'][ind1] + coord_s1 - blockdict[1]['gaps_before_start'][ind1]
- rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
+ rel_end = rel_start + int(blockdict[1]['lengths'][ind1])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[1]['types'][ind1])
@@ -303,21 +298,21 @@
out.append(blockdict[1]['units'][ind1])
out.append(namelist[1])
rel_start = blockdict[2]['whole_seq_start'][ind2] + coord_s2 - blockdict[2]['gaps_before_start'][ind2]
- rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
+ rel_end = rel_start + int(blockdict[2]['lengths'][ind2])
out.append(str(rel_start))
out.append(str(rel_end))
out.append(blockdict[2]['types'][ind2])
out.append(blockdict[2]['lengths'][ind2])
out.append(blockdict[2]['counts'][ind2])
out.append(blockdict[2]['units'][ind2])
- print >>fout, '\t'.join(out)
+ print >> fout, '\t'.join(out)
visited_2[ind2] = 1
- out=[]
+ out = []
- #print >>fout, blockdict
+ #print >> fout, blockdict
except Exception, exc:
- print >>sys.stderr, "type(exc),args,exc: %s, %s, %s" %(type(exc), exc.args, exc)
+ print >> sys.stderr, "type(exc),args,exc: %s, %s, %s" % ( type(exc), exc.args, exc )
+
if __name__ == "__main__":
main()
-
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/microsats_mutability.py
--- a/tools/regVariation/microsats_mutability.py
+++ b/tools/regVariation/microsats_mutability.py
@@ -4,7 +4,10 @@
This tool computes microsatellite mutability for the orthologous microsatellites fetched from 'Extract Orthologous Microsatellites from pair-wise alignments' tool.
"""
from galaxy import eggs
-import sys, string, re, commands, tempfile, os, fileinput
+import fileinput
+import string
+import sys
+import tempfile
from galaxy.tools.util.galaxyops import *
from bx.intervals.io import *
from bx.intervals.operations import quicksect
@@ -19,7 +22,7 @@
p_group_cols = [p_group, p_group+7]
s_group_cols = [s_group, s_group+7]
num_generations = int(sys.argv[7])
-region = sys.argv[8]
+region = sys.argv[8]
int_file = sys.argv[9]
if int_file != "None": #User has specified an interval file
try:
@@ -28,31 +31,35 @@
chr_col_i, start_col_i, end_col_i, strand_col_i = parse_cols_arg( sys.argv[11] )
except:
stop_err("Unable to open input Interval file")
-
+
+
def stop_err(msg):
sys.stderr.write(msg)
sys.exit()
+
def reverse_complement(text):
DNA_COMP = string.maketrans( "ACGTacgt", "TGCAtgca" )
comp = [ch for ch in text.translate(DNA_COMP)]
comp.reverse()
return "".join(comp)
+
def get_unique_elems(elems):
- seen=set()
+ seen = set()
return[x for x in elems if x not in seen and not seen.add(x)]
+
def get_binned_lists(uniqlist, binsize):
- binnedlist=[]
+ binnedlist = []
uniqlist.sort()
start = int(uniqlist[0])
- bin_ind=0
- l_ind=0
+ bin_ind = 0
+ l_ind = 0
binnedlist.append([])
while l_ind < len(uniqlist):
elem = int(uniqlist[l_ind])
- if elem in range(start,start+binsize):
+ if elem in range(start, start+binsize):
binnedlist[bin_ind].append(elem)
else:
start += binsize
@@ -62,39 +69,38 @@
l_ind += 1
return binnedlist
-def fetch_weight(H,C,t):
+
+def fetch_weight(H, C, t):
if (H-(C-H)) < t:
return 2.0
else:
return 1.0
-def mutabilityEstimator(repeats1,repeats2,thresholds):
+
+def mutabilityEstimator(repeats1, repeats2, thresholds):
mut_num = 0.0 #Mutability Numerator
mut_den = 0.0 #Mutability denominator
- for ind,H in enumerate(repeats1):
+ for ind, H in enumerate(repeats1):
C = repeats2[ind]
t = thresholds[ind]
- w = fetch_weight(H,C,t)
+ w = fetch_weight(H, C, t)
mut_num += ((H-C)*(H-C)*w)
mut_den += w
return [mut_num, mut_den]
+
def output_writer(blk, blk_lines):
global winspecies, speciesind
- all_elems_1=[]
- all_elems_2=[]
- all_s_elems_1=[]
- all_s_elems_2=[]
+ all_elems_1 = []
+ all_elems_2 = []
+ all_s_elems_1 = []
+ all_s_elems_2 = []
for bline in blk_lines:
if not(bline):
continue
items = bline.split('\t')
seq1 = items[1]
- start1 = items[2]
- end1 = items[3]
seq2 = items[8]
- start2 = items[9]
- end2 = items[10]
if p_group_cols[0] == 6:
items[p_group_cols[0]] = int(items[p_group_cols[0]])
items[p_group_cols[1]] = int(items[p_group_cols[1]])
@@ -111,8 +117,8 @@
if s_group_cols[0] != -1:
uniq_s_elems_1 = get_unique_elems(all_s_elems_1)
uniq_s_elems_2 = get_unique_elems(all_s_elems_2)
- mut1={}
- mut2={}
+ mut1 = {}
+ mut2 = {}
count1 = {}
count2 = {}
"""
@@ -120,12 +126,12 @@
uniq_elems_1 = get_unique_units(j.sort(lambda x, y: len(x)-len(y)))
"""
if p_group_cols[0] == 6: #i.e. the option chosen is group-by repeat number.
- uniq_elems_1 = get_binned_lists(uniq_elems_1,p_bin_size)
- uniq_elems_2 = get_binned_lists(uniq_elems_2,p_bin_size)
+ uniq_elems_1 = get_binned_lists( uniq_elems_1, p_bin_size )
+ uniq_elems_2 = get_binned_lists( uniq_elems_2, p_bin_size )
if s_group_cols[0] == 6: #i.e. the option chosen is subgroup-by repeat number.
- uniq_s_elems_1 = get_binned_lists(uniq_s_elems_1,s_bin_size)
- uniq_s_elems_2 = get_binned_lists(uniq_s_elems_2,s_bin_size)
+ uniq_s_elems_1 = get_binned_lists( uniq_s_elems_1, s_bin_size )
+ uniq_s_elems_2 = get_binned_lists( uniq_s_elems_2, s_bin_size )
for pitem1 in uniq_elems_1:
#repeats1 = []
@@ -143,61 +149,61 @@
if p_group_cols[0] == 6:
belems[p_group_cols[0]] = int(belems[p_group_cols[0]])
if belems[p_group_cols[0]] in pitem1:
- if belems[s_group_cols[0]]==sitem1:
+ if belems[s_group_cols[0]] == sitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1[str(pitem1)+'\t'+str(sitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1[str(pitem1)+'\t'+str(sitem1)] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1[str(pitem1)+'\t'+str(sitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1[str(pitem1)+'\t'+str(sitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats1)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats1)
elif winspecies == 2:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats2)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats2)
else:
if type(sitem1) == list:
if s_group_cols[0] == 6:
belems[s_group_cols[0]] = int(belems[s_group_cols[0]])
- if belems[p_group_cols[0]]==pitem1 and belems[s_group_cols[0]] in sitem1:
+ if belems[p_group_cols[0]] == pitem1 and belems[s_group_cols[0]] in sitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1["%s\t%s" %(pitem1,sitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1["%s\t%s" % ( pitem1, sitem1 )] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1[str(pitem1)+'\t'+str(sitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1[str(pitem1)+'\t'+str(sitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1[str(pitem1)+'\t'+str(sitem1)]=sum(repeats1)
+ count1[str(pitem1)+'\t'+str(sitem1)] = sum(repeats1)
elif winspecies == 2:
- count1[str(pitem1)+'\t'+str(sitem1)]=sum(repeats2)
+ count1[str(pitem1)+'\t'+str(sitem1)] = sum(repeats2)
else:
- if belems[p_group_cols[0]]==pitem1 and belems[s_group_cols[0]]==sitem1:
+ if belems[p_group_cols[0]] == pitem1 and belems[s_group_cols[0]] == sitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1["%s\t%s" %(pitem1,sitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1["%s\t%s" % ( pitem1, sitem1 )] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1[str(pitem1)+'\t'+str(sitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1[str(pitem1)+'\t'+str(sitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats1)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats1)
elif winspecies == 2:
- count1["%s\t%s" %(pitem1,sitem1)]=sum(repeats2)
+ count1["%s\t%s" % ( pitem1, sitem1 )] = sum(repeats2)
else: #Sub-group by feature is None
for bline in blk_lines:
belems = bline.split('\t')
if type(pitem1) == list:
- #print >>sys.stderr, "item: " + str(item1)
+ #print >> sys.stderr, "item: " + str(item1)
if p_group_cols[0] == 6:
belems[p_group_cols[0]] = int(belems[p_group_cols[0]])
if belems[p_group_cols[0]] in pitem1:
@@ -208,21 +214,21 @@
else:
thresholds.append(non_mono_threshold)
else:
- if belems[p_group_cols[0]]==pitem1:
+ if belems[p_group_cols[0]] == pitem1:
repeats1.append(int(belems[6]))
repeats2.append(int(belems[13]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut1["%s" %(pitem1)]=mutabilityEstimator(repeats1,repeats2,thresholds)
+ mut1["%s" % (pitem1)] = mutabilityEstimator( repeats1, repeats2, thresholds )
if region == 'align':
- count1["%s" %(pitem1)]=min(sum(repeats1),sum(repeats2))
- else:
+ count1["%s" % (pitem1)] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count1[str(pitem1)]=sum(repeats1)
+ count1[str(pitem1)] = sum(repeats1)
elif winspecies == 2:
- count1[str(pitem1)]=sum(repeats2)
+ count1[str(pitem1)] = sum(repeats2)
for pitem2 in uniq_elems_2:
#repeats1 = []
@@ -239,57 +245,57 @@
if type(pitem2) == list:
if p_group_cols[0] == 6:
belems[p_group_cols[1]] = int(belems[p_group_cols[1]])
- if belems[p_group_cols[1]] in pitem2 and belems[s_group_cols[1]]==sitem2:
+ if belems[p_group_cols[1]] in pitem2 and belems[s_group_cols[1]] == sitem2:
repeats2.append(int(belems[13]))
repeats1.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s\t%s" %(pitem2,sitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s\t%s" % ( pitem2, sitem2 )] = mutabilityEstimator( repeats2, repeats1, thresholds )
#count2[str(pitem2)+'\t'+str(sitem2)]=len(repeats2)
if region == 'align':
- count2["%s\t%s" %(pitem2,sitem2)]=min(sum(repeats1),sum(repeats2))
- else:
+ count2["%s\t%s" % ( pitem2, sitem2 )] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats2)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats2)
elif winspecies == 2:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats1)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats1)
else:
if type(sitem2) == list:
if s_group_cols[0] == 6:
belems[s_group_cols[1]] = int(belems[s_group_cols[1]])
- if belems[p_group_cols[1]]==pitem2 and belems[s_group_cols[1]] in sitem2:
+ if belems[p_group_cols[1]] == pitem2 and belems[s_group_cols[1]] in sitem2:
repeats2.append(int(belems[13]))
repeats1.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s\t%s" %(pitem2,sitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s\t%s" % ( pitem2, sitem2 )] = mutabilityEstimator( repeats2, repeats1, thresholds )
if region == 'align':
- count2["%s\t%s" %(pitem2,sitem2)]=min(sum(repeats1),sum(repeats2))
- else:
+ count2["%s\t%s" % ( pitem2, sitem2 )] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats2)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats2)
elif winspecies == 2:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats1)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats1)
else:
- if belems[p_group_cols[1]]==pitem2 and belems[s_group_cols[1]]==sitem2:
+ if belems[p_group_cols[1]] == pitem2 and belems[s_group_cols[1]] == sitem2:
repeats1.append(int(belems[13]))
repeats2.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s\t%s" %(pitem2,sitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s\t%s" % ( pitem2, sitem2 )] = mutabilityEstimator( repeats2, repeats1, thresholds )
if region == 'align':
- count2["%s\t%s" %(pitem2,sitem2)]=min(sum(repeats1),sum(repeats2))
- else:
+ count2["%s\t%s" % ( pitem2, sitem2 )] = min( sum(repeats1), sum(repeats2) )
+ else:
if winspecies == 1:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats2)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats2)
elif winspecies == 2:
- count2["%s\t%s" %(pitem2,sitem2)]=len(repeats1)
+ count2["%s\t%s" % ( pitem2, sitem2 )] = len(repeats1)
else: #Sub-group by feature is None
for bline in blk_lines:
belems = bline.split('\t')
@@ -304,21 +310,21 @@
else:
thresholds.append(non_mono_threshold)
else:
- if belems[p_group_cols[1]]==pitem2:
+ if belems[p_group_cols[1]] == pitem2:
repeats2.append(int(belems[13]))
repeats1.append(int(belems[6]))
if belems[4] == 'mononucleotide':
thresholds.append(mono_threshold)
else:
thresholds.append(non_mono_threshold)
- mut2["%s" %(pitem2)]=mutabilityEstimator(repeats2,repeats1,thresholds)
+ mut2["%s" % (pitem2)] = mutabilityEstimator( repeats2, repeats1, thresholds )
if region == 'align':
- count2["%s" %(pitem2)]=min(sum(repeats1),sum(repeats2))
+ count2["%s" % (pitem2)] = min( sum(repeats1), sum(repeats2) )
else:
if winspecies == 1:
- count2["%s" %(pitem2)]=sum(repeats2)
+ count2["%s" % (pitem2)] = sum(repeats2)
elif winspecies == 2:
- count2["%s" %(pitem2)]=sum(repeats1)
+ count2["%s" % (pitem2)] = sum(repeats1)
for key in mut1.keys():
if key in mut2.keys():
mut = (mut1[key][0]+mut2[key][0])/(mut1[key][1]+mut2[key][1])
@@ -328,9 +334,9 @@
unit_found = False
if p_group_cols[0] == 7 or s_group_cols[0] == 7: #if it is Repeat Unit (AG, GCT etc.) check for reverse-complements too
if p_group_cols[0] == 7:
- this,other = 0,1
+ this, other = 0, 1
else:
- this,other = 1,0
+ this, other = 1, 0
groups1 = key.split('\t')
mutn = mut1[key][0]
mutd = mut1[key][1]
@@ -351,28 +357,29 @@
else:
mut = mut1[key][0]/mut1[key][1]
count = count1[key]
- mut = "%.2e" %(mut/num_generations)
+ mut = "%.2e" % (mut/num_generations)
if region == 'align':
- print >>fout, str(blk) + '\t'+seq1 + '\t' + seq2 + '\t' +key.strip()+ '\t'+str(mut) + '\t'+ str(count)
+ print >> fout, str(blk) + '\t'+seq1 + '\t' + seq2 + '\t' +key.strip()+ '\t'+str(mut) + '\t'+ str(count)
elif region == 'win':
- fout.write("%s\t%s\t%s\t%s\n" %(blk,key.strip(),mut,count))
+ fout.write("%s\t%s\t%s\t%s\n" % ( blk, key.strip(), mut, count ))
fout.flush()
#catch any remaining repeats, for instance if the orthologous position contained different repeat units
for remaining_key in mut2.keys():
mut = mut2[remaining_key][0]/mut2[remaining_key][1]
- mut = "%.2e" %(mut/num_generations)
+ mut = "%.2e" % (mut/num_generations)
count = count2[remaining_key]
if region == 'align':
- print >>fout, str(blk) + '\t'+seq1 + '\t'+seq2 + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
+ print >> fout, str(blk) + '\t'+seq1 + '\t'+seq2 + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
elif region == 'win':
- fout.write("%s\t%s\t%s\t%s\n" %(blk,remaining_key.strip(),mut,count))
+ fout.write("%s\t%s\t%s\t%s\n" % ( blk, remaining_key.strip(), mut, count ))
fout.flush()
- #print >>fout, blk + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
+ #print >> fout, blk + '\t'+remaining_key.strip()+ '\t'+str(mut)+ '\t'+ str(count)
+
def counter(node, start, end, report_func):
if start <= node.start < end and start < node.end <= end:
- report_func(node)
+ report_func(node)
if node.right:
counter(node.right, start, end, report_func)
if node.left:
@@ -381,8 +388,8 @@
counter(node.right, start, end, report_func)
elif node.start >= end and node.left and node.left.maxend > start:
counter(node.left, start, end, report_func)
-
-
+
+
def main():
infile = sys.argv[1]
@@ -400,21 +407,18 @@
if region == 'win':
if dbkey_i in elems[1]:
winspecies = 1
- speciesind = 1
+ speciesind = 1
elif dbkey_i in elems[8]:
winspecies = 2
speciesind = 8
else:
- stop_err("The species build corresponding to your interval file is not present in the Microsatellite file.")
+ stop_err("The species build corresponding to your interval file is not present in the Microsatellite file.")
fin = open(infile, 'r')
skipped = 0
- blk=0
- win=0
- linestr=""
+ linestr = ""
if region == 'win':
-
msats = NiceReaderWrapper( fileinput.FileInput( infile ),
chrom_col = speciesind,
start_col = speciesind+1,
@@ -435,7 +439,7 @@
ichr = ielems[chr_col_i]
istart = int(ielems[start_col_i])
iend = int(ielems[end_col_i])
- isrc = "%s.%s" %(dbkey_i,ichr)
+ isrc = "%s.%s" % ( dbkey_i, ichr )
if isrc not in msatTree.chroms:
continue
result = []
@@ -450,14 +454,14 @@
tmpfile1.seek(0)
output_writer(iline, tmpfile1.readlines())
except:
- skipped+=1
+ skipped += 1
if skipped:
- print "Skipped %d intervals as invalid." %(skipped)
+ print "Skipped %d intervals as invalid." % (skipped)
elif region == 'align':
if s_group_cols[0] != -1:
- print >>fout, "#Window\tSpecies_1\tSpecies_2\tGroupby_Feature\tSubGroupby_Feature\tMutability\tCount"
+ print >> fout, "#Window\tSpecies_1\tSpecies_2\tGroupby_Feature\tSubGroupby_Feature\tMutability\tCount"
else:
- print >>fout, "#Window\tSpecies_1\tWindow_Start\tWindow_End\tSpecies_2\tGroupby_Feature\tMutability\tCount"
+ print >> fout, "#Window\tSpecies_1\tWindow_Start\tWindow_End\tSpecies_2\tGroupby_Feature\tMutability\tCount"
prev_bnum = -1
try:
for line in fin:
@@ -481,9 +485,11 @@
prev_bnum = new_bnum
output_writer(prev_bnum, linestr.strip().replace('\r','\n').split('\n'))
except Exception, ea:
- print >>sys.stderr, ea
+ print >> sys.stderr, ea
skipped += 1
if skipped:
- print "Skipped %d lines as invalid." %(skipped)
+ print "Skipped %d lines as invalid." % (skipped)
+
+
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 -r 82d2c2109792d098ddc5ede7992ae132e596584a tools/regVariation/partialR_square.py
--- a/tools/regVariation/partialR_square.py
+++ b/tools/regVariation/partialR_square.py
@@ -2,7 +2,7 @@
from galaxy import eggs
-import sys, string
+import sys
from rpy import *
import numpy
@@ -13,6 +13,7 @@
sys.stderr.write(msg)
sys.exit()
+
def sscombs(s):
if len(s) == 1:
return [s]
@@ -26,14 +27,14 @@
x_cols = sys.argv[3].split(',')
outfile = sys.argv[4]
-print "Predictor columns: %s; Response column: %d" %(x_cols,y_col+1)
+print "Predictor columns: %s; Response column: %d" % ( x_cols, y_col+1 )
fout = open(outfile,'w')
for i, line in enumerate( file ( infile )):
line = line.rstrip('\r\n')
if len( line )>0 and not line.startswith( '#' ):
elems = line.split( '\t' )
- break
+ break
if i == 30:
break # Hopefully we'll never get here...
@@ -43,7 +44,7 @@
y_vals = []
x_vals = []
-for k,col in enumerate(x_cols):
+for k, col in enumerate(x_cols):
x_cols[k] = int(col)-1
x_vals.append([])
"""
@@ -51,13 +52,13 @@
float( elems[x_cols[k]] )
except:
try:
- msg = "This operation cannot be performed on non-numeric column %d containing value '%s'." %( col, elems[x_cols[k]] )
+ msg = "This operation cannot be performed on non-numeric column %d containing value '%s'." % ( col, elems[x_cols[k]] )
except:
msg = "This operation cannot be performed on non-numeric data."
stop_err( msg )
"""
NA = 'NA'
-for ind,line in enumerate( file( infile )):
+for ind, line in enumerate( file( infile )):
if line and not line.startswith( '#' ):
try:
fields = line.split("\t")
@@ -65,20 +66,20 @@
yval = float(fields[y_col])
except Exception, ey:
yval = r('NA')
- #print >>sys.stderr, "ey = %s" %ey
+ #print >> sys.stderr, "ey = %s" %ey
y_vals.append(yval)
- for k,col in enumerate(x_cols):
+ for k, col in enumerate(x_cols):
try:
xval = float(fields[col])
except Exception, ex:
xval = r('NA')
- #print >>sys.stderr, "ex = %s" %ex
+ #print >> sys.stderr, "ex = %s" %ex
x_vals[k].append(xval)
except:
pass
x_vals1 = numpy.asarray(x_vals).transpose()
-dat= r.list(x=array(x_vals1), y=y_vals)
+dat = r.list(x=array(x_vals1), y=y_vals)
set_default_mode(NO_CONVERSION)
try:
@@ -91,7 +92,7 @@
fullr2 = summary.get('r.squared','NA')
if fullr2 == 'NA':
- stop_error("Error in linear regression")
+ stop_err("Error in linear regression")
if len(x_vals) < 10:
s = ""
@@ -100,10 +101,10 @@
else:
stop_err("This tool only works with less than 10 predictors.")
-print >>fout, "#Model\tR-sq\tpartial_R_Terms\tpartial_R_Value"
+print >> fout, "#Model\tR-sq\tpartial_R_Terms\tpartial_R_Value"
all_combos = sorted(sscombs(s), key=len)
all_combos.reverse()
-for j,cols in enumerate(all_combos):
+for j, cols in enumerate(all_combos):
#if len(cols) == len(s): #Same as the full model above
# continue
if len(cols) == 1:
@@ -113,7 +114,7 @@
for col in cols:
x_v.append(x_vals[int(col)])
x_vals1 = numpy.asarray(x_v).transpose()
- dat= r.list(x=array(x_vals1), y=y_vals)
+ dat = r.list(x=array(x_vals1), y=y_vals)
set_default_mode(NO_CONVERSION)
red = r.lm(r("y ~ x"), data= dat) #Reduced model
set_default_mode(BASIC_CONVERSION)
@@ -136,11 +137,11 @@
partial_R_col_str = "-"
partial_R = "-"
try:
- redr2 = "%.4f" %(float(redr2))
+ redr2 = "%.4f" % (float(redr2))
except:
pass
try:
- partial_R = "%.4f" %(float(partial_R))
+ partial_R = "%.4f" % (float(partial_R))
except:
pass
- print >>fout, "%s\t%s\t%s\t%s" %(col_str,redr2,partial_R_col_str,partial_R)
+ print >> fout, "%s\t%s\t%s\t%s" % ( col_str, redr2, partial_R_col_str, partial_R )
This diff is so big that we needed to truncate the remainder.
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: guerler: Grids: Fix filter column separator
by commits-noreply@bitbucket.org 03 Feb '14
by commits-noreply@bitbucket.org 03 Feb '14
03 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c043a2ca8051/
Changeset: c043a2ca8051
User: guerler
Date: 2014-02-03 22:23:53
Summary: Grids: Fix filter column separator
Affected #: 1 file
diff -r 519797105a694ac9044e5e6139380a51c5c5fc52 -r c043a2ca8051de612d4e895ba55e6dce0697a8d3 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py
+++ b/lib/galaxy/web/framework/helpers/grids.py
@@ -132,7 +132,7 @@
if len( column_filter ) == 1:
column_filter = column_filter[0]
# Interpret ',' as a separator for multiple terms.
- elif isinstance( column_filter, basestring ) and column_filter.find(',') != -1:
+ if isinstance( column_filter, basestring ) and column_filter.find(',') != -1:
column_filter = column_filter.split(',')
# Check if filter is empty
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: guerler: Grids: Fix grids with preserved states
by commits-noreply@bitbucket.org 03 Feb '14
by commits-noreply@bitbucket.org 03 Feb '14
03 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/519797105a69/
Changeset: 519797105a69
User: guerler
Date: 2014-02-03 22:21:12
Summary: Grids: Fix grids with preserved states
Affected #: 3 files
diff -r 37544732f61c32202d134c263c1257f0920e36a0 -r 519797105a694ac9044e5e6139380a51c5c5fc52 lib/galaxy/web/framework/helpers/grids.py
--- a/lib/galaxy/web/framework/helpers/grids.py
+++ b/lib/galaxy/web/framework/helpers/grids.py
@@ -105,6 +105,7 @@
column_filter = kwargs.get( "f-" + column.key )
elif column.key in base_filter:
column_filter = base_filter.get( column.key )
+
# Method (1) combines a mix of strings and lists of strings into a single string and (2) attempts to de-jsonify all strings.
def from_json_string_recurse(item):
decoded_list = []
@@ -131,15 +132,24 @@
if len( column_filter ) == 1:
column_filter = column_filter[0]
# Interpret ',' as a separator for multiple terms.
- if isinstance( column_filter, basestring ) and column_filter.find(',') != -1:
+ elif isinstance( column_filter, basestring ) and column_filter.find(',') != -1:
column_filter = column_filter.split(',')
- # If filter criterion is empty, do nothing.
- if column_filter == '':
- continue
+
+ # Check if filter is empty
+ if isinstance( column_filter, list ):
+ # Remove empty strings from filter list
+ column_filter = [x for x in column_filter if x != '']
+ if len(column_filter) == 0:
+ continue;
+ elif isinstance(column_filter, basestring):
+ # If filter criterion is empty, do nothing.
+ if column_filter == '':
+ continue
+
# Update query.
query = column.filter( trans, trans.user, query, column_filter )
# Upate current filter dict.
- #Column filters are rendered in various places, sanitize them all here.
+ # Column filters are rendered in various places, sanitize them all here.
cur_filter_dict[ column.key ] = sanitize_text(column_filter)
# Carry filter along to newly generated urls; make sure filter is a string so
# that we can encode to UTF-8 and thus handle user input to filters.
@@ -200,10 +210,7 @@
if page_num == 0:
# Show all rows in page.
total_num_rows = query.count()
- # persistent page='all'
page_num = 1
- #page_num = 'all'
- #extra_url_args['page'] = page_num
num_pages = 1
else:
# Show a limited number of rows. Before modifying query, get the total number of rows that query
diff -r 37544732f61c32202d134c263c1257f0920e36a0 -r 519797105a694ac9044e5e6139380a51c5c5fc52 static/scripts/mvc/grid/grid-model.js
--- a/static/scripts/mvc/grid/grid-model.js
+++ b/static/scripts/mvc/grid/grid-model.js
@@ -37,8 +37,8 @@
if (cur_val === null || cur_val === undefined) {
new_val = value;
}
- else if (typeof(cur_val) == "string") {
- if (cur_val == "All") {
+ else if (typeof(cur_val) == 'string') {
+ if (cur_val == 'All') {
new_val = value;
} else {
// Replace string with array.
@@ -70,29 +70,16 @@
return false;
}
- var removed = true;
- if (typeof(cur_val) === "string") {
- if (cur_val == "All") {
- // Unexpected. Throw error?
- removed = false;
- }
- else {
- // Remove condition.
- delete this.attributes.filters[key];
+ if (typeof(cur_val) === 'string') {
+ // overwrite/remove condition.
+ this.attributes.filters[key] = '';
+ } else {
+ // filter contains an array of conditions.
+ var condition_index = _.indexOf(cur_val, condition);
+ if (condition_index !== -1) {
+ cur_val[condition_index] = '';
}
}
- else {
- // Filter contains an array of conditions.
- var condition_index = _.indexOf(cur_val, condition);
- if (condition_index !== -1) {
- cur_val.splice(condition_index, 1);
- }
- else {
- removed = false;
- }
- }
-
- return removed;
},
/**
diff -r 37544732f61c32202d134c263c1257f0920e36a0 -r 519797105a694ac9044e5e6139380a51c5c5fc52 static/scripts/packed/mvc/grid/grid-model.js
--- a/static/scripts/packed/mvc/grid/grid-model.js
+++ b/static/scripts/packed/mvc/grid/grid-model.js
@@ -1,1 +1,1 @@
-define([],function(){return Backbone.Model.extend({defaults:{url_base:"",async:false,async_ops:[],categorical_filters:[],filters:{},sort_key:null,show_item_checkboxes:false,advanced_search:false,cur_page:1,num_pages:1,operation:undefined,item_ids:undefined},can_async_op:function(a){return _.indexOf(this.attributes.async_ops,a)!==-1},add_filter:function(e,f,b){if(b){var c=this.attributes.filters[e],a;if(c===null||c===undefined){a=f}else{if(typeof(c)=="string"){if(c=="All"){a=f}else{var d=[];d[0]=c;d[1]=f;a=d}}else{a=c;a.push(f)}}this.attributes.filters[e]=a}else{this.attributes.filters[e]=f}},remove_filter:function(b,e){var a=this.attributes.filters[b];if(a===null||a===undefined){return false}var d=true;if(typeof(a)==="string"){if(a=="All"){d=false}else{delete this.attributes.filters[b]}}else{var c=_.indexOf(a,e);if(c!==-1){a.splice(c,1)}else{d=false}}return d},get_url_data:function(){var a={async:this.attributes.async,sort:this.attributes.sort_key,page:this.attributes.cur_page,show_item_checkboxes:this.attributes.show_item_checkboxes,advanced_search:this.attributes.advanced_search};if(this.attributes.operation){a.operation=this.attributes.operation}if(this.attributes.item_ids){a.id=this.attributes.item_ids}var b=this;_.each(_.pairs(b.attributes.filters),function(c){a["f-"+c[0]]=c[1]});return a},get_url:function(a){return this.get("url_base")+"?"+$.param(this.get_url_data())+"&"+$.param(a)}})});
\ No newline at end of file
+define([],function(){return Backbone.Model.extend({defaults:{url_base:"",async:false,async_ops:[],categorical_filters:[],filters:{},sort_key:null,show_item_checkboxes:false,advanced_search:false,cur_page:1,num_pages:1,operation:undefined,item_ids:undefined},can_async_op:function(a){return _.indexOf(this.attributes.async_ops,a)!==-1},add_filter:function(e,f,b){if(b){var c=this.attributes.filters[e],a;if(c===null||c===undefined){a=f}else{if(typeof(c)=="string"){if(c=="All"){a=f}else{var d=[];d[0]=c;d[1]=f;a=d}}else{a=c;a.push(f)}}this.attributes.filters[e]=a}else{this.attributes.filters[e]=f}},remove_filter:function(b,d){var a=this.attributes.filters[b];if(a===null||a===undefined){return false}if(typeof(a)==="string"){this.attributes.filters[b]=""}else{var c=_.indexOf(a,d);if(c!==-1){a[c]=""}}},get_url_data:function(){var a={async:this.attributes.async,sort:this.attributes.sort_key,page:this.attributes.cur_page,show_item_checkboxes:this.attributes.show_item_checkboxes,advanced_search:this.attributes.advanced_search};if(this.attributes.operation){a.operation=this.attributes.operation}if(this.attributes.item_ids){a.id=this.attributes.item_ids}var b=this;_.each(_.pairs(b.attributes.filters),function(c){a["f-"+c[0]]=c[1]});return a},get_url:function(a){return this.get("url_base")+"?"+$.param(this.get_url_data())+"&"+$.param(a)}})});
\ 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: jmchilton: Improve examples of newer tool functional test features.
by commits-noreply@bitbucket.org 03 Feb '14
by commits-noreply@bitbucket.org 03 Feb '14
03 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/37544732f61c/
Changeset: 37544732f61c
User: jmchilton
Date: 2014-02-03 17:11:31
Summary: Improve examples of newer tool functional test features.
Affected #: 3 files
diff -r 0f636b29e4f58d1568e8658dcae57e3c45a14563 -r 37544732f61c32202d134c263c1257f0920e36a0 test/functional/tools/README.txt
--- a/test/functional/tools/README.txt
+++ b/test/functional/tools/README.txt
@@ -1,3 +1,3 @@
This directory contains tools only useful for testing the tool test framework
and demonstrating it features. Run the driver script 'run_functional_tests.sh'
-with '-installed' as first argument to run through these tests.
+with '-framework' as first argument to run through these tests.
diff -r 0f636b29e4f58d1568e8658dcae57e3c45a14563 -r 37544732f61c32202d134c263c1257f0920e36a0 test/functional/tools/disambiguate_cond.xml
--- a/test/functional/tools/disambiguate_cond.xml
+++ b/test/functional/tools/disambiguate_cond.xml
@@ -46,19 +46,8 @@
<data name="out_file1" format="txt" /></outputs><tests>
- <test>
- <param name="p1|use" value="True"/>
- <param name="p2|use" value="False"/>
- <param name="p3|use" value="True"/>
- <param name="p4|use" value="True" />
- <param name="p4|file" value="simple_line.txt" />
- <output name="out_file1">
- <assert_contents>
- <has_line line="4 7 4" />
- <has_line line="This is a line of text." />
- </assert_contents>
- </output>
- </test>
+ <!-- Can use nested conditional blocks as shown below to disambiguate
+ various nested parameters. --><test><conditional name="p1"><param name="use" value="False"/>
@@ -83,5 +72,23 @@
</assert_contents></output></test>
+ <!-- Can also use a more concise, flat verison of this, but it the
+ above version is more clear and should be considered preferable.
+ -->
+ <test>
+ <param name="p1|use" value="True"/>
+ <param name="p2|use" value="False"/>
+ <param name="p3|use" value="True"/>
+ <param name="p4|use" value="True" />
+ <!-- Only need to specify enough of a suffix to disambiguate,
+ but don't do this - it is too clever. -->
+ <param name="p4|file" value="simple_line.txt" />
+ <output name="out_file1">
+ <assert_contents>
+ <has_line line="4 7 4" />
+ <has_line line="This is a line of text." />
+ </assert_contents>
+ </output>
+ </test></tests></tool>
diff -r 0f636b29e4f58d1568e8658dcae57e3c45a14563 -r 37544732f61c32202d134c263c1257f0920e36a0 test/functional/tools/disambiguate_repeats.xml
--- a/test/functional/tools/disambiguate_repeats.xml
+++ b/test/functional/tools/disambiguate_repeats.xml
@@ -14,17 +14,24 @@
<data name="out_file1" format="txt" /></outputs><tests>
- <!-- Can use prefixes to disambiguate inputs or force order. -->
+ <!-- Can disambiguate repeats and specify multiple blocks using,
+ nested structure. --><test>
- <param name="queries_1|input" value="simple_line_alternative.txt"/>
- <param name="queries_0|input" value="simple_line.txt"/>
-
- <param name="more_queries_1|input" value="simple_line_alternative.txt" />
- <param name="more_queries_0|input" value="simple_line.txt"/>
-
- <output name="out_file1" file="simple_lines_interleaved.txt"/>
+ <repeat name="queries">
+ <param name="input" value="simple_line.txt"/>
+ </repeat>
+ <repeat name="more_queries">
+ <param name="input" value="simple_line_alternative.txt"/>
+ </repeat>
+ <output name="out_file1">
+ <assert_contents>
+ <has_line line="This is a line of text." />
+ <has_line line="This is a different line of text." />
+ </assert_contents>
+ </output></test>
-
+ <!-- Multiple such blocks can be specified but only with newer API
+ driven tests. --><test><repeat name="queries"><param name="input" value="simple_line.txt"/>
@@ -40,6 +47,17 @@
</repeat><output name="out_file1" file="simple_lines_interleaved.txt"/></test>
+ <!-- Can also use prefixes to disambiguate inputs or force order, but
+ the above nested structure is preferable. -->
+ <test>
+ <param name="queries_1|input" value="simple_line_alternative.txt"/>
+ <param name="queries_0|input" value="simple_line.txt"/>
+
+ <param name="more_queries_1|input" value="simple_line_alternative.txt" />
+ <param name="more_queries_0|input" value="simple_line.txt"/>
+
+ <output name="out_file1" file="simple_lines_interleaved.txt"/>
+ </test></tests></tool>
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