galaxy-commits
Threads by month
- ----- 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
February 2014
- 1 participants
- 192 discussions
commit/galaxy-central: martenson: data libraries: visual tweaks, removal of buttons (now navigate through clicking on names)
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/7d649885e325/
Changeset: 7d649885e325
User: martenson
Date: 2014-02-17 23:17:36
Summary: data libraries: visual tweaks, removal of buttons (now navigate through clicking on names)
Affected #: 5 files
diff -r fb791568304883fe0357b6173dcc43d772214c8b -r 7d649885e3259f3359e8c3816315c60e958c1518 static/scripts/galaxy.library.js
--- a/static/scripts/galaxy.library.js
+++ b/static/scripts/galaxy.library.js
@@ -156,17 +156,17 @@
// FOLDER CONTENT
tmpl_array.push('<table id="folder_table" class="table table-condensed">');
tmpl_array.push(' <thead>');
+ tmpl_array.push(' <th class="button_heading"></th>');
tmpl_array.push(' <th style="text-align: center; width: 20px; "><input id="select-all-checkboxes" style="margin: 0;" type="checkbox"></th>');
- tmpl_array.push(' <th class="button_heading">view</th>');
tmpl_array.push(' <th>name</th>');
tmpl_array.push(' <th>data type</th>');
tmpl_array.push(' <th>size</th>');
tmpl_array.push(' <th>date (UTC)</th>');
tmpl_array.push(' </thead>');
tmpl_array.push(' <tbody>');
+ tmpl_array.push(' <td><button title="Go to parent folder" type="button" data-id="<%- upper_folder_id %>" class="btn_open_folder btn btn-default btn-xs">');
+ tmpl_array.push(' ..</td>');
tmpl_array.push(' <td></td>');
- tmpl_array.push(' <td><button title="Go to parent folder" type="button" data-id="<%- upper_folder_id %>" class="btn_open_folder btn btn-default btn-xs">');
- tmpl_array.push(' <span class="fa fa-arrow-up"></span> .. go up</td>');
tmpl_array.push(' <td></td>');
tmpl_array.push(' <td></td>');
tmpl_array.push(' <td></td>');
@@ -175,9 +175,9 @@
tmpl_array.push(' <% _.each(items, function(content_item) { %>');
tmpl_array.push(' <tr class="folder_row light" id="<%- content_item.id %>">');
tmpl_array.push(' <% if (content_item.get("type") === "folder") { %>'); // folder
+ tmpl_array.push(' <td>');
+ tmpl_array.push(' <span class="fa fa-folder-open"></span></td>');
tmpl_array.push(' <td></td>');
- tmpl_array.push(' <td><button title="Open this folder" type="button" data-id="<%- content_item.id %>" class="btn_open_folder btn btn-default btn-xs">');
- tmpl_array.push(' <span class="fa fa-folder-open"></span> browse</td>');
tmpl_array.push(' <td><%- content_item.get("name") %>');
tmpl_array.push(' <% if (content_item.get("item_count") === 0) { %>'); // empty folder
tmpl_array.push(' <span class="muted">(empty folder)</span>');
@@ -186,13 +186,11 @@
tmpl_array.push(' <td>folder</td>');
tmpl_array.push(' <td><%= _.escape(content_item.get("item_count")) %> item(s)</td>'); // size
tmpl_array.push(' <% } else { %>');
+ tmpl_array.push(' <td>');
+ tmpl_array.push(' <span class="fa fa-file"></span>');
+ tmpl_array.push(' </td>');
tmpl_array.push(' <td style="text-align: center; "><input style="margin: 0;" type="checkbox"></td>');
- tmpl_array.push(' <td>');
- tmpl_array.push(' <button title="See details of this dataset" type="button" class="library-dataset btn btn-default btn-xs">');
- tmpl_array.push(' <span class="fa fa-eye"></span> details');
- tmpl_array.push(' </button>');
- tmpl_array.push(' </td>');
- tmpl_array.push(' <td><%- content_item.get("name") %></td>'); // dataset
+ tmpl_array.push(' <td><a href="#" class="library-dataset"><%- content_item.get("name") %><a></td>'); // dataset
tmpl_array.push(' <td><%= _.escape(content_item.get("data_type")) %></td>'); // data type
tmpl_array.push(' <td><%= _.escape(content_item.get("readable_size")) %></td>'); // size
tmpl_array.push(' <% } %> ');
@@ -416,10 +414,16 @@
// prevent default
event.preventDefault();
-//TODO check whether we already have the data
+ //TODO check whether we already have the data
//load the ID of the row
- var id = $(event.target).parent().parent().attr('id');
+ var id = $(event.target).parent().parent().parent().attr('id');
+ if (typeof id === 'undefined'){
+ id = $(event.target).parent().attr('id');
+ }
+ if (typeof id === 'undefined'){
+ id = $(event.target).parent().parent().attr('id')
+ }
//create new item
var item = new Item();
@@ -430,7 +434,7 @@
//fetch the dataset info
item.fetch({
success: function (item) {
-// TODO can render here already
+ // TODO can render here already
//fetch user histories for import purposes
histories.fetch({
success: function (histories){
@@ -811,21 +815,16 @@
// tmpl_array.push('<a href="" id="create_new_library_btn" class="btn btn-primary file ">New Library</a>');
tmpl_array.push('<table class="table table-condensed">');
tmpl_array.push(' <thead>');
- tmpl_array.push(' <th class="button_heading"></th>');
tmpl_array.push(' <th>name</th>');
tmpl_array.push(' <th>description</th>');
tmpl_array.push(' <th>synopsis</th> ');
- // tmpl_array.push(' <th>model type</th> ');
tmpl_array.push(' </thead>');
tmpl_array.push(' <tbody>');
tmpl_array.push(' <% _.each(libraries, function(library) { %>');
tmpl_array.push(' <tr>');
- tmpl_array.push(' <td><button title="Open this library" type="button" data-id="<%- library.get("root_folder_id") %>" class="btn_open_folder btn btn-default btn-xs">');
- tmpl_array.push(' <span class="fa fa-folder-open"></span> browse</td>');
- tmpl_array.push(' <td><%- library.get("name") %></td>');
+ tmpl_array.push(' <td><a href="#folders/<%- library.get("root_folder_id") %>"><%- library.get("name") %></a></td>');
tmpl_array.push(' <td><%= _.escape(library.get("description")) %></td>');
tmpl_array.push(' <td><%= _.escape(library.get("synopsis")) %></td>');
- // tmpl_array.push(' <td><%= _.escape(library.get("model_class")) %></td>');
tmpl_array.push(' </tr>');
tmpl_array.push(' <% }); %>');
tmpl_array.push(' </tbody>');
@@ -862,7 +861,7 @@
that.$el.html(template);
},
error: function(model, response){
- if (response.statusCode().status === 403){
+ if (response.statusCode().status === 403){ //TODO open to public
mod_toastr.info('Please log in first. Redirecting to login page in 3s.');
setTimeout(that.redirectToLogin, 3000);
} else {
diff -r fb791568304883fe0357b6173dcc43d772214c8b -r 7d649885e3259f3359e8c3816315c60e958c1518 static/scripts/packed/galaxy.library.js
--- a/static/scripts/packed/galaxy.library.js
+++ b/static/scripts/packed/galaxy.library.js
@@ -1,1 +1,1 @@
-var view=null;var library_router=null;var responses=[];define(["galaxy.modal","galaxy.masthead","utils/utils","libs/toastr"],function(k,l,h,n){var f=Backbone.Model.extend({urlRoot:"/api/libraries"});var c=Backbone.Model.extend({urlRoot:"/api/folders"});var o=Backbone.Collection.extend({url:"/api/libraries",model:f});var i=Backbone.Model.extend({urlRoot:"/api/libraries/datasets"});var d=Backbone.Collection.extend({model:i});var e=Backbone.Model.extend({defaults:{folder:new d(),full_path:"unknown",urlRoot:"/api/folders/",id:"unknown"},parse:function(r){this.full_path=r[0].full_path;this.get("folder").reset(r[1].folder_contents);return r}});var b=Backbone.Model.extend({urlRoot:"/api/histories/"});var j=Backbone.Model.extend({url:"/api/histories/"});var p=Backbone.Collection.extend({url:"/api/histories",model:j});var q=Backbone.Router.extend({routes:{"":"libraries","folders/:id":"folder_content","folders/:folder_id/download/:format":"download"}});var m=Backbone.View.extend({el:"#center",progress:0,progressStep:1,lastSelectedHistory:"",modal:null,folders:null,initialize:function(){this.folders=[];this.queue=jQuery.Deferred();this.queue.resolve()},templateFolder:function(){var r=[];r.push('<div id="library_container" style="width: 90%; margin: auto; margin-top: 2em; ">');r.push('<h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');r.push('<div id="library_folder_toolbar" >');r.push(' <button id="toolbtn_bulk_import" class="btn btn-primary" style="display: none; margin-left: 0.5em;" type="button"><span class="fa fa-external-link"></span> to history</button>');r.push(' <div id="toolbtn_dl" class="btn-group" style="margin-left: 0.5em; display: none; ">');r.push(' <button id="drop_toggle" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">');r.push(' <span class="fa fa-download"></span> download <span class="caret"></span>');r.push(" </button>");r.push(' <ul class="dropdown-menu" role="menu">');r.push(' <li><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');r.push(' <li><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');r.push(' <li><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');r.push(" </ul>");r.push(" </div>");r.push("</div>");r.push('<div class="library_breadcrumb">');r.push('<a title="Return to the list of libraries" href="#">Libraries</a><b>|</b> ');r.push("<% _.each(path, function(path_item) { %>");r.push("<% if (path_item[0] != id) { %>");r.push('<a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a><b>|</b> ');r.push("<% } else { %>");r.push('<span title="You are in this folder"><%- path_item[1] %></span>');r.push("<% } %>");r.push("<% }); %>");r.push("</div>");r.push('<table id="folder_table" class="table table-condensed">');r.push(" <thead>");r.push(' <th style="text-align: center; width: 20px; "><input id="select-all-checkboxes" style="margin: 0;" type="checkbox"></th>');r.push(' <th class="button_heading">view</th>');r.push(" <th>name</th>");r.push(" <th>data type</th>");r.push(" <th>size</th>");r.push(" <th>date (UTC)</th>");r.push(" </thead>");r.push(" <tbody>");r.push(" <td></td>");r.push(' <td><button title="Go to parent folder" type="button" data-id="<%- upper_folder_id %>" class="btn_open_folder btn btn-default btn-xs">');r.push(' <span class="fa fa-arrow-up"></span> .. go up</td>');r.push(" <td></td>");r.push(" <td></td>");r.push(" <td></td>");r.push(" <td></td>");r.push(" </tr>");r.push(" <% _.each(items, function(content_item) { %>");r.push(' <tr class="folder_row light" id="<%- content_item.id %>">');r.push(' <% if (content_item.get("type") === "folder") { %>');r.push(" <td></td>");r.push(' <td><button title="Open this folder" type="button" data-id="<%- content_item.id %>" class="btn_open_folder btn btn-default btn-xs">');r.push(' <span class="fa fa-folder-open"></span> browse</td>');r.push(' <td><%- content_item.get("name") %>');r.push(' <% if (content_item.get("item_count") === 0) { %>');r.push(' <span class="muted">(empty folder)</span>');r.push(" <% } %>");r.push(" </td>");r.push(" <td>folder</td>");r.push(' <td><%= _.escape(content_item.get("item_count")) %> item(s)</td>');r.push(" <% } else { %>");r.push(' <td style="text-align: center; "><input style="margin: 0;" type="checkbox"></td>');r.push(" <td>");r.push(' <button title="See details of this dataset" type="button" class="library-dataset btn btn-default btn-xs">');r.push(' <span class="fa fa-eye"></span> details');r.push(" </button>");r.push(" </td>");r.push(' <td><%- content_item.get("name") %></td>');r.push(' <td><%= _.escape(content_item.get("data_type")) %></td>');r.push(' <td><%= _.escape(content_item.get("readable_size")) %></td>');r.push(" <% } %> ");r.push(' <td><%= _.escape(content_item.get("time_updated")) %></td>');r.push(" </tr>");r.push(" <% }); %>");r.push(" ");r.push(" </tbody>");r.push("</table>");r.push("</div>");return r.join("")},templateDatasetModal:function(){var r=[];r.push('<div id="dataset_info_modal">');r.push(' <table class="table table-striped table-condensed">');r.push(" <tr>");r.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');r.push(' <td><%= _.escape(item.get("name")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Data type</th>');r.push(' <td><%= _.escape(item.get("data_type")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Genome build</th>');r.push(' <td><%= _.escape(item.get("genome_build")) %></td>');r.push(" </tr>");r.push(' <th scope="row">Size</th>');r.push(" <td><%= _.escape(size) %></td>");r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Date uploaded (UTC)</th>');r.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Uploaded by</th>');r.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');r.push(" </tr>");r.push(' <tr scope="row">');r.push(' <th scope="row">Data Lines</th>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');r.push(" </tr>");r.push(' <th scope="row">Comment Lines</th>');r.push(' <% if (item.get("metadata_comment_lines") === "") { %>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');r.push(" <% } else { %>");r.push(' <td scope="row">unknown</td>');r.push(" <% } %>");r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Number of Columns</th>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Column Types</th>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Miscellaneous information</th>');r.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');r.push(" </tr>");r.push(" </table>");r.push(' <pre class="peek">');r.push(" </pre>");r.push("</div>");return r.join("")},templateHistorySelectInModal:function(){var r=[];r.push('<span id="history_modal_combo" style="width:90%; margin-left: 1em; margin-right: 1em; ">');r.push("Select history: ");r.push('<select id="dataset_import_single" name="dataset_import_single" style="width:50%; margin-bottom: 1em; "> ');r.push(" <% _.each(histories, function(history) { %>");r.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');r.push(" <% }); %>");r.push("</select>");r.push("</span>");return r.join("")},templateBulkImportInModal:function(){var r=[];r.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');r.push("Select history: ");r.push('<select id="dataset_import_bulk" name="dataset_import_bulk" style="width:50%; margin-bottom: 1em; "> ');r.push(" <% _.each(histories, function(history) { %>");r.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');r.push(" <% }); %>");r.push("</select>");r.push("</span>");return r.join("")},templateProgressBar:function(){var r=[];r.push('<div class="import_text">');r.push("Importing selected datasets to history <b><%= _.escape(history_name) %></b>");r.push("</div>");r.push('<div class="progress">');r.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');r.push(' <span class="completion_span">0% Complete</span>');r.push(" </div>");r.push("</div>");r.push("");return r.join("")},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_folder_modal">');tmpl_array.push("<form>");tmpl_array.push('<input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push('<input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push("</form>");tmpl_array.push("</div>");return tmpl_array.join("")},events:{"click #select-all-checkboxes":"selectAll","click .folder_row":"selectClickedRow","click #toolbtn_bulk_import":"modalBulkImport","click #toolbtn_dl":"bulkDownload","click .library-dataset":"showDatasetDetails","click #toolbtn_create_folder":"createFolderFromModal","click .btn_open_folder":"navigateToFolder"},render:function(r){$("#center").css("overflow","auto");view=this;var t=this;var s=new e({id:r.id});s.url=s.attributes.urlRoot+r.id+"/contents";s.fetch({success:function(u){for(var w=0;w<s.attributes.folder.models.length;w++){var v=s.attributes.folder.models[w];if(v.get("type")==="file"){v.set("readable_size",t.size_to_string(v.get("file_size")))}}var y=s.full_path;var z;if(y.length===1){z=0}else{z=y[y.length-2][0]}var x=_.template(t.templateFolder(),{path:s.full_path,items:s.attributes.folder.models,id:r.id,upper_folder_id:z});t.$el.html(x)},error:function(){n.error("An error occured :(")}})},size_to_string:function(r){var s="";if(r>=100000000000){r=r/100000000000;s="TB"}else{if(r>=100000000){r=r/100000000;s="GB"}else{if(r>=100000){r=r/100000;s="MB"}else{if(r>=100){r=r/100;s="KB"}else{r=r*10;s="b"}}}}return(Math.round(r)/10)+s},navigateToFolder:function(s){var r=$(s.target).attr("data-id");if(typeof r==="undefined"){return false}else{if(r==="0"){library_router.navigate("/",{trigger:true,replace:false})}else{library_router.navigate("folders/"+r,{trigger:true,replace:false})}}},showDatasetDetails:function(u){u.preventDefault();var v=$(u.target).parent().parent().attr("id");var t=new i();var s=new p();t.id=v;var r=this;t.fetch({success:function(w){s.fetch({success:function(x){r.renderModalAfterFetch(w,x)},error:function(){n.error("An error occured during fetching histories:(");r.renderModalAfterFetch(w)}})},error:function(){n.error("An error occured during loading dataset details :(")}})},renderModalAfterFetch:function(w,t){var u=this.size_to_string(w.get("file_size"));var v=_.template(this.templateDatasetModal(),{item:w,size:u});var s=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Dataset Details",body:v,buttons:{Import:function(){s.importCurrentIntoHistory()},Download:function(){s.downloadCurrent()},Close:function(){s.modal.hide()}}});$(".peek").html(w.get("peek"));if(typeof history.models!==undefined){var r=_.template(this.templateHistorySelectInModal(),{histories:t.models});$(this.modal.elMain).find(".buttons").prepend(r);if(s.lastSelectedHistory.length>0){$(this.modal.elMain).find("#dataset_import_single").val(s.lastSelectedHistory)}}},downloadCurrent:function(){this.modal.disableButton("Import");this.modal.disableButton("Download");var r=[];r.push($("#id_row").attr("data-id"));var s="/api/libraries/datasets/download/uncompressed";var t={ldda_ids:r};folderContentView.processDownload(s,t);this.modal.enableButton("Import");this.modal.enableButton("Download")},importCurrentIntoHistory:function(){this.modal.disableButton("Import");this.modal.disableButton("Download");var t=$(this.modal.elMain).find("select[name=dataset_import_single] option:selected").val();this.lastSelectedHistory=t;var r=$("#id_row").attr("data-id");var u=new b();var s=this;u.url=u.urlRoot+t+"/contents";u.save({content:r,source:"library"},{success:function(){n.success("Dataset imported");s.modal.enableButton("Import");s.modal.enableButton("Download")},error:function(){n.error("An error occured! Dataset not imported. Please try again.");s.modal.enableButton("Import");s.modal.enableButton("Download")}})},selectAll:function(s){var r=s.target.checked;that=this;$(":checkbox").each(function(){this.checked=r;$row=$(this.parentElement.parentElement);(r)?that.makeDarkRow($row):that.makeWhiteRow($row)});this.checkTools()},selectClickedRow:function(s){var u="";var r;var t;if(s.target.localName==="input"){u=s.target;r=$(s.target.parentElement.parentElement);t="input"}else{if(s.target.localName==="td"){u=$("#"+s.target.parentElement.id).find(":checkbox")[0];r=$(s.target.parentElement);t="td"}}if(u===""){s.stopPropagation();return}if(u===undefined){s.stopPropagation();return}if(u.checked){if(t==="td"){u.checked="";this.makeWhiteRow(r)}else{if(t==="input"){this.makeDarkRow(r)}}}else{if(t==="td"){u.checked="selected";this.makeDarkRow(r)}else{if(t==="input"){this.makeWhiteRow(r)}}}this.checkTools()},makeDarkRow:function(r){r.removeClass("light");r.find("a").removeClass("light");r.addClass("dark");r.find("a").addClass("dark")},makeWhiteRow:function(r){r.removeClass("dark");r.find("a").removeClass("dark");r.addClass("light");r.find("a").addClass("light")},checkTools:function(){var r=$("#folder_table").find(":checked");if(r.length>0){$("#toolbtn_bulk_import").show();$("#toolbtn_dl").show()}else{$("#toolbtn_bulk_import").hide();$("#toolbtn_dl").hide()}},modalBulkImport:function(){var s=this;var r=new p();r.fetch({success:function(t){var u=_.template(s.templateBulkImportInModal(),{histories:t.models});s.modal=Galaxy.modal;s.modal.show({closing_events:true,title:"Import into History",body:u,buttons:{Import:function(){s.importAllIntoHistory()},Close:function(){s.modal.hide()}}})},error:function(){n.error("An error occured :(")}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var t=$("select[name=dataset_import_bulk] option:selected").val();var x=$("select[name=dataset_import_bulk] option:selected").text();var z=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!=""){z.push(this.parentElement.parentElement.id)}});var y=_.template(this.templateProgressBar(),{history_name:x});$(this.modal.elMain).find(".modal-body").html(y);var u=100/z.length;this.initProgress(u);var r=[];for(var s=z.length-1;s>=0;s--){library_dataset_id=z[s];var v=new b();var w=this;v.url=v.urlRoot+t+"/contents";v.content=library_dataset_id;v.source="library";r.push(v)}this.chainCall(r)},chainCall:function(s){var r=this;var t=s.pop();if(typeof t==="undefined"){n.success("All datasets imported");this.modal.hide();return}var u=$.when(t.save({content:t.content,source:t.source})).done(function(v){r.updateProgress();responses.push(v);r.chainCall(s)})},initProgress:function(r){this.progress=0;this.progressStep=r},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(r,v){var t=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!=""){t.push(this.parentElement.parentElement.id)}});var s="/api/libraries/datasets/download/"+v;var u={ldda_ids:t};this.processDownload(s,u,"get")},processDownload:function(s,t,u){if(s&&t){t=typeof t=="string"?t:$.param(t);var r="";$.each(t.split("&"),function(){var v=this.split("=");r+='<input type="hidden" name="'+v[0]+'" value="'+v[1]+'" />'});$('<form action="'+s+'" method="'+(u||"post")+'">'+r+"</form>").appendTo("body").submit().remove();n.info("Your download will begin soon")}},createFolderFromModal:function(){event.preventDefault();event.stopPropagation();var r=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:this.templateNewFolderInModal(),buttons:{Create:function(){r.create_new_folder_event()},Close:function(){r.modal.hide();r.modal=null}}})},create_new_folder_event:function(){var r=this.serialize_new_folder();if(this.validate_new_folder(r)){var t=new c();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];t.url=t.urlRoot+"/"+current_folder_id;var s=this;t.save(r,{success:function(u){s.modal.hide();n.success("Folder created");s.render({id:current_folder_id})},error:function(){n.error("An error occured :(")}})}else{n.error("Folder's name is missing")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(r){return r.name!==""}});var a=Backbone.View.extend({el:"#center",events:{"click #create_new_library_btn":"show_library_modal"},initialize:function(){},templateLibraryList:function(){tmpl_array=[];tmpl_array.push('<div id="library_container" style="width: 90%; margin: auto; margin-top: 2em; overflow: auto !important; ">');tmpl_array.push("");tmpl_array.push('<h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');tmpl_array.push('<table class="table table-condensed">');tmpl_array.push(" <thead>");tmpl_array.push(' <th class="button_heading"></th>');tmpl_array.push(" <th>name</th>");tmpl_array.push(" <th>description</th>");tmpl_array.push(" <th>synopsis</th> ");tmpl_array.push(" </thead>");tmpl_array.push(" <tbody>");tmpl_array.push(" <% _.each(libraries, function(library) { %>");tmpl_array.push(" <tr>");tmpl_array.push(' <td><button title="Open this library" type="button" data-id="<%- library.get("root_folder_id") %>" class="btn_open_folder btn btn-default btn-xs">');tmpl_array.push(' <span class="fa fa-folder-open"></span> browse</td>');tmpl_array.push(' <td><%- library.get("name") %></td>');tmpl_array.push(' <td><%= _.escape(library.get("description")) %></td>');tmpl_array.push(' <td><%= _.escape(library.get("synopsis")) %></td>');tmpl_array.push(" </tr>");tmpl_array.push(" <% }); %>");tmpl_array.push(" </tbody>");tmpl_array.push("</table>");tmpl_array.push("</div>");return tmpl_array.join("")},templateNewLibraryInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_library_modal">');tmpl_array.push(" <form>");tmpl_array.push(' <input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push(' <input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push(' <input type="text" name="Synopsis" value="" placeholder="Synopsis">');tmpl_array.push(" </form>");tmpl_array.push("</div>");return tmpl_array.join("")},render:function(){$("#center").css("overflow","auto");var r=this;libraries=new o();libraries.fetch({success:function(s){var t=_.template(r.templateLibraryList(),{libraries:s.models});r.$el.html(t)},error:function(t,s){if(s.statusCode().status===403){n.info("Please log in first. Redirecting to login page in 3s.");setTimeout(r.redirectToLogin,3000)}else{n.error("An error occured. Please try again.")}}})},redirectToHome:function(){window.location="../"},redirectToLogin:function(){window.location="/user/login"},modal:null,show_library_modal:function(s){s.preventDefault();s.stopPropagation();var r=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Library",body:this.templateNewLibraryInModal(),buttons:{Create:function(){r.create_new_library_event()},Close:function(){r.modal.hide()}}})},create_new_library_event:function(){var t=this.serialize_new_library();if(this.validate_new_library(t)){var s=new f();var r=this;s.save(t,{success:function(u){r.modal.hide();r.clear_library_modal();r.render();n.success("Library created")},error:function(){n.error("An error occured :(")}})}else{n.error("Library's name is missing")}return false},clear_library_modal:function(){$("input[name='Name']").val("");$("input[name='Description']").val("");$("input[name='Synopsis']").val("")},serialize_new_library:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val(),synopsis:$("input[name='Synopsis']").val()}},validate_new_library:function(r){return r.name!==""}});var g=Backbone.View.extend({folderContentView:null,galaxyLibraryview:null,initialize:function(){folderContentView=new m();galaxyLibraryview=new a();library_router=new q();library_router.on("route:libraries",function(){galaxyLibraryview.render()});library_router.on("route:folder_content",function(r){folderContentView.render({id:r})});library_router.on("route:download",function(r,s){if($("#center").find(":checked").length===0){library_router.navigate("folders/"+r,{trigger:true,replace:true})}else{folderContentView.download(r,s);library_router.navigate("folders/"+r,{trigger:false,replace:true})}});Backbone.history.start({pushState:false})}});return{GalaxyApp:g}});
\ No newline at end of file
+var view=null;var library_router=null;var responses=[];define(["galaxy.modal","galaxy.masthead","utils/utils","libs/toastr"],function(k,l,h,n){var f=Backbone.Model.extend({urlRoot:"/api/libraries"});var c=Backbone.Model.extend({urlRoot:"/api/folders"});var o=Backbone.Collection.extend({url:"/api/libraries",model:f});var i=Backbone.Model.extend({urlRoot:"/api/libraries/datasets"});var d=Backbone.Collection.extend({model:i});var e=Backbone.Model.extend({defaults:{folder:new d(),full_path:"unknown",urlRoot:"/api/folders/",id:"unknown"},parse:function(r){this.full_path=r[0].full_path;this.get("folder").reset(r[1].folder_contents);return r}});var b=Backbone.Model.extend({urlRoot:"/api/histories/"});var j=Backbone.Model.extend({url:"/api/histories/"});var p=Backbone.Collection.extend({url:"/api/histories",model:j});var q=Backbone.Router.extend({routes:{"":"libraries","folders/:id":"folder_content","folders/:folder_id/download/:format":"download"}});var m=Backbone.View.extend({el:"#center",progress:0,progressStep:1,lastSelectedHistory:"",modal:null,folders:null,initialize:function(){this.folders=[];this.queue=jQuery.Deferred();this.queue.resolve()},templateFolder:function(){var r=[];r.push('<div id="library_container" style="width: 90%; margin: auto; margin-top: 2em; ">');r.push('<h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');r.push('<div id="library_folder_toolbar" >');r.push(' <button id="toolbtn_bulk_import" class="btn btn-primary" style="display: none; margin-left: 0.5em;" type="button"><span class="fa fa-external-link"></span> to history</button>');r.push(' <div id="toolbtn_dl" class="btn-group" style="margin-left: 0.5em; display: none; ">');r.push(' <button id="drop_toggle" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">');r.push(' <span class="fa fa-download"></span> download <span class="caret"></span>');r.push(" </button>");r.push(' <ul class="dropdown-menu" role="menu">');r.push(' <li><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');r.push(' <li><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');r.push(' <li><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');r.push(" </ul>");r.push(" </div>");r.push("</div>");r.push('<div class="library_breadcrumb">');r.push('<a title="Return to the list of libraries" href="#">Libraries</a><b>|</b> ');r.push("<% _.each(path, function(path_item) { %>");r.push("<% if (path_item[0] != id) { %>");r.push('<a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a><b>|</b> ');r.push("<% } else { %>");r.push('<span title="You are in this folder"><%- path_item[1] %></span>');r.push("<% } %>");r.push("<% }); %>");r.push("</div>");r.push('<table id="folder_table" class="table table-condensed">');r.push(" <thead>");r.push(' <th class="button_heading"></th>');r.push(' <th style="text-align: center; width: 20px; "><input id="select-all-checkboxes" style="margin: 0;" type="checkbox"></th>');r.push(" <th>name</th>");r.push(" <th>data type</th>");r.push(" <th>size</th>");r.push(" <th>date (UTC)</th>");r.push(" </thead>");r.push(" <tbody>");r.push(' <td><button title="Go to parent folder" type="button" data-id="<%- upper_folder_id %>" class="btn_open_folder btn btn-default btn-xs">');r.push(" ..</td>");r.push(" <td></td>");r.push(" <td></td>");r.push(" <td></td>");r.push(" <td></td>");r.push(" <td></td>");r.push(" </tr>");r.push(" <% _.each(items, function(content_item) { %>");r.push(' <tr class="folder_row light" id="<%- content_item.id %>">');r.push(' <% if (content_item.get("type") === "folder") { %>');r.push(" <td>");r.push(' <span class="fa fa-folder-open"></span></td>');r.push(" <td></td>");r.push(' <td><%- content_item.get("name") %>');r.push(' <% if (content_item.get("item_count") === 0) { %>');r.push(' <span class="muted">(empty folder)</span>');r.push(" <% } %>");r.push(" </td>");r.push(" <td>folder</td>");r.push(' <td><%= _.escape(content_item.get("item_count")) %> item(s)</td>');r.push(" <% } else { %>");r.push(" <td>");r.push(' <span class="fa fa-file"></span>');r.push(" </td>");r.push(' <td style="text-align: center; "><input style="margin: 0;" type="checkbox"></td>');r.push(' <td><a href="#" class="library-dataset"><%- content_item.get("name") %><a></td>');r.push(' <td><%= _.escape(content_item.get("data_type")) %></td>');r.push(' <td><%= _.escape(content_item.get("readable_size")) %></td>');r.push(" <% } %> ");r.push(' <td><%= _.escape(content_item.get("time_updated")) %></td>');r.push(" </tr>");r.push(" <% }); %>");r.push(" ");r.push(" </tbody>");r.push("</table>");r.push("</div>");return r.join("")},templateDatasetModal:function(){var r=[];r.push('<div id="dataset_info_modal">');r.push(' <table class="table table-striped table-condensed">');r.push(" <tr>");r.push(' <th scope="row" id="id_row" data-id="<%= _.escape(item.get("ldda_id")) %>">Name</th>');r.push(' <td><%= _.escape(item.get("name")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Data type</th>');r.push(' <td><%= _.escape(item.get("data_type")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Genome build</th>');r.push(' <td><%= _.escape(item.get("genome_build")) %></td>');r.push(" </tr>");r.push(' <th scope="row">Size</th>');r.push(" <td><%= _.escape(size) %></td>");r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Date uploaded (UTC)</th>');r.push(' <td><%= _.escape(item.get("date_uploaded")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Uploaded by</th>');r.push(' <td><%= _.escape(item.get("uploaded_by")) %></td>');r.push(" </tr>");r.push(' <tr scope="row">');r.push(' <th scope="row">Data Lines</th>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_data_lines")) %></td>');r.push(" </tr>");r.push(' <th scope="row">Comment Lines</th>');r.push(' <% if (item.get("metadata_comment_lines") === "") { %>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_comment_lines")) %></td>');r.push(" <% } else { %>");r.push(' <td scope="row">unknown</td>');r.push(" <% } %>");r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Number of Columns</th>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_columns")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Column Types</th>');r.push(' <td scope="row"><%= _.escape(item.get("metadata_column_types")) %></td>');r.push(" </tr>");r.push(" <tr>");r.push(' <th scope="row">Miscellaneous information</th>');r.push(' <td scope="row"><%= _.escape(item.get("misc_blurb")) %></td>');r.push(" </tr>");r.push(" </table>");r.push(' <pre class="peek">');r.push(" </pre>");r.push("</div>");return r.join("")},templateHistorySelectInModal:function(){var r=[];r.push('<span id="history_modal_combo" style="width:90%; margin-left: 1em; margin-right: 1em; ">');r.push("Select history: ");r.push('<select id="dataset_import_single" name="dataset_import_single" style="width:50%; margin-bottom: 1em; "> ');r.push(" <% _.each(histories, function(history) { %>");r.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');r.push(" <% }); %>");r.push("</select>");r.push("</span>");return r.join("")},templateBulkImportInModal:function(){var r=[];r.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');r.push("Select history: ");r.push('<select id="dataset_import_bulk" name="dataset_import_bulk" style="width:50%; margin-bottom: 1em; "> ');r.push(" <% _.each(histories, function(history) { %>");r.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');r.push(" <% }); %>");r.push("</select>");r.push("</span>");return r.join("")},templateProgressBar:function(){var r=[];r.push('<div class="import_text">');r.push("Importing selected datasets to history <b><%= _.escape(history_name) %></b>");r.push("</div>");r.push('<div class="progress">');r.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');r.push(' <span class="completion_span">0% Complete</span>');r.push(" </div>");r.push("</div>");r.push("");return r.join("")},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_folder_modal">');tmpl_array.push("<form>");tmpl_array.push('<input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push('<input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push("</form>");tmpl_array.push("</div>");return tmpl_array.join("")},events:{"click #select-all-checkboxes":"selectAll","click .folder_row":"selectClickedRow","click #toolbtn_bulk_import":"modalBulkImport","click #toolbtn_dl":"bulkDownload","click .library-dataset":"showDatasetDetails","click #toolbtn_create_folder":"createFolderFromModal","click .btn_open_folder":"navigateToFolder"},render:function(r){$("#center").css("overflow","auto");view=this;var t=this;var s=new e({id:r.id});s.url=s.attributes.urlRoot+r.id+"/contents";s.fetch({success:function(u){for(var w=0;w<s.attributes.folder.models.length;w++){var v=s.attributes.folder.models[w];if(v.get("type")==="file"){v.set("readable_size",t.size_to_string(v.get("file_size")))}}var y=s.full_path;var z;if(y.length===1){z=0}else{z=y[y.length-2][0]}var x=_.template(t.templateFolder(),{path:s.full_path,items:s.attributes.folder.models,id:r.id,upper_folder_id:z});t.$el.html(x)},error:function(){n.error("An error occured :(")}})},size_to_string:function(r){var s="";if(r>=100000000000){r=r/100000000000;s="TB"}else{if(r>=100000000){r=r/100000000;s="GB"}else{if(r>=100000){r=r/100000;s="MB"}else{if(r>=100){r=r/100;s="KB"}else{r=r*10;s="b"}}}}return(Math.round(r)/10)+s},navigateToFolder:function(s){var r=$(s.target).attr("data-id");if(typeof r==="undefined"){return false}else{if(r==="0"){library_router.navigate("/",{trigger:true,replace:false})}else{library_router.navigate("folders/"+r,{trigger:true,replace:false})}}},showDatasetDetails:function(u){u.preventDefault();var v=$(u.target).parent().parent().parent().attr("id");if(typeof v==="undefined"){v=$(u.target).parent().attr("id")}if(typeof v==="undefined"){v=$(u.target).parent().parent().attr("id")}var t=new i();var s=new p();t.id=v;var r=this;t.fetch({success:function(w){s.fetch({success:function(x){r.renderModalAfterFetch(w,x)},error:function(){n.error("An error occured during fetching histories:(");r.renderModalAfterFetch(w)}})},error:function(){n.error("An error occured during loading dataset details :(")}})},renderModalAfterFetch:function(w,t){var u=this.size_to_string(w.get("file_size"));var v=_.template(this.templateDatasetModal(),{item:w,size:u});var s=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Dataset Details",body:v,buttons:{Import:function(){s.importCurrentIntoHistory()},Download:function(){s.downloadCurrent()},Close:function(){s.modal.hide()}}});$(".peek").html(w.get("peek"));if(typeof history.models!==undefined){var r=_.template(this.templateHistorySelectInModal(),{histories:t.models});$(this.modal.elMain).find(".buttons").prepend(r);if(s.lastSelectedHistory.length>0){$(this.modal.elMain).find("#dataset_import_single").val(s.lastSelectedHistory)}}},downloadCurrent:function(){this.modal.disableButton("Import");this.modal.disableButton("Download");var r=[];r.push($("#id_row").attr("data-id"));var s="/api/libraries/datasets/download/uncompressed";var t={ldda_ids:r};folderContentView.processDownload(s,t);this.modal.enableButton("Import");this.modal.enableButton("Download")},importCurrentIntoHistory:function(){this.modal.disableButton("Import");this.modal.disableButton("Download");var t=$(this.modal.elMain).find("select[name=dataset_import_single] option:selected").val();this.lastSelectedHistory=t;var r=$("#id_row").attr("data-id");var u=new b();var s=this;u.url=u.urlRoot+t+"/contents";u.save({content:r,source:"library"},{success:function(){n.success("Dataset imported");s.modal.enableButton("Import");s.modal.enableButton("Download")},error:function(){n.error("An error occured! Dataset not imported. Please try again.");s.modal.enableButton("Import");s.modal.enableButton("Download")}})},selectAll:function(s){var r=s.target.checked;that=this;$(":checkbox").each(function(){this.checked=r;$row=$(this.parentElement.parentElement);(r)?that.makeDarkRow($row):that.makeWhiteRow($row)});this.checkTools()},selectClickedRow:function(s){var u="";var r;var t;if(s.target.localName==="input"){u=s.target;r=$(s.target.parentElement.parentElement);t="input"}else{if(s.target.localName==="td"){u=$("#"+s.target.parentElement.id).find(":checkbox")[0];r=$(s.target.parentElement);t="td"}}if(u===""){s.stopPropagation();return}if(u===undefined){s.stopPropagation();return}if(u.checked){if(t==="td"){u.checked="";this.makeWhiteRow(r)}else{if(t==="input"){this.makeDarkRow(r)}}}else{if(t==="td"){u.checked="selected";this.makeDarkRow(r)}else{if(t==="input"){this.makeWhiteRow(r)}}}this.checkTools()},makeDarkRow:function(r){r.removeClass("light");r.find("a").removeClass("light");r.addClass("dark");r.find("a").addClass("dark")},makeWhiteRow:function(r){r.removeClass("dark");r.find("a").removeClass("dark");r.addClass("light");r.find("a").addClass("light")},checkTools:function(){var r=$("#folder_table").find(":checked");if(r.length>0){$("#toolbtn_bulk_import").show();$("#toolbtn_dl").show()}else{$("#toolbtn_bulk_import").hide();$("#toolbtn_dl").hide()}},modalBulkImport:function(){var s=this;var r=new p();r.fetch({success:function(t){var u=_.template(s.templateBulkImportInModal(),{histories:t.models});s.modal=Galaxy.modal;s.modal.show({closing_events:true,title:"Import into History",body:u,buttons:{Import:function(){s.importAllIntoHistory()},Close:function(){s.modal.hide()}}})},error:function(){n.error("An error occured :(")}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var t=$("select[name=dataset_import_bulk] option:selected").val();var x=$("select[name=dataset_import_bulk] option:selected").text();var z=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!=""){z.push(this.parentElement.parentElement.id)}});var y=_.template(this.templateProgressBar(),{history_name:x});$(this.modal.elMain).find(".modal-body").html(y);var u=100/z.length;this.initProgress(u);var r=[];for(var s=z.length-1;s>=0;s--){library_dataset_id=z[s];var v=new b();var w=this;v.url=v.urlRoot+t+"/contents";v.content=library_dataset_id;v.source="library";r.push(v)}this.chainCall(r)},chainCall:function(s){var r=this;var t=s.pop();if(typeof t==="undefined"){n.success("All datasets imported");this.modal.hide();return}var u=$.when(t.save({content:t.content,source:t.source})).done(function(v){r.updateProgress();responses.push(v);r.chainCall(s)})},initProgress:function(r){this.progress=0;this.progressStep=r},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(r,v){var t=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!=""){t.push(this.parentElement.parentElement.id)}});var s="/api/libraries/datasets/download/"+v;var u={ldda_ids:t};this.processDownload(s,u,"get")},processDownload:function(s,t,u){if(s&&t){t=typeof t=="string"?t:$.param(t);var r="";$.each(t.split("&"),function(){var v=this.split("=");r+='<input type="hidden" name="'+v[0]+'" value="'+v[1]+'" />'});$('<form action="'+s+'" method="'+(u||"post")+'">'+r+"</form>").appendTo("body").submit().remove();n.info("Your download will begin soon")}},createFolderFromModal:function(){event.preventDefault();event.stopPropagation();var r=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:this.templateNewFolderInModal(),buttons:{Create:function(){r.create_new_folder_event()},Close:function(){r.modal.hide();r.modal=null}}})},create_new_folder_event:function(){var r=this.serialize_new_folder();if(this.validate_new_folder(r)){var t=new c();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];t.url=t.urlRoot+"/"+current_folder_id;var s=this;t.save(r,{success:function(u){s.modal.hide();n.success("Folder created");s.render({id:current_folder_id})},error:function(){n.error("An error occured :(")}})}else{n.error("Folder's name is missing")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(r){return r.name!==""}});var a=Backbone.View.extend({el:"#center",events:{"click #create_new_library_btn":"show_library_modal"},initialize:function(){},templateLibraryList:function(){tmpl_array=[];tmpl_array.push('<div id="library_container" style="width: 90%; margin: auto; margin-top: 2em; overflow: auto !important; ">');tmpl_array.push("");tmpl_array.push('<h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');tmpl_array.push('<table class="table table-condensed">');tmpl_array.push(" <thead>");tmpl_array.push(" <th>name</th>");tmpl_array.push(" <th>description</th>");tmpl_array.push(" <th>synopsis</th> ");tmpl_array.push(" </thead>");tmpl_array.push(" <tbody>");tmpl_array.push(" <% _.each(libraries, function(library) { %>");tmpl_array.push(" <tr>");tmpl_array.push(' <td><a href="#folders/<%- library.get("root_folder_id") %>"><%- library.get("name") %></a></td>');tmpl_array.push(' <td><%= _.escape(library.get("description")) %></td>');tmpl_array.push(' <td><%= _.escape(library.get("synopsis")) %></td>');tmpl_array.push(" </tr>");tmpl_array.push(" <% }); %>");tmpl_array.push(" </tbody>");tmpl_array.push("</table>");tmpl_array.push("</div>");return tmpl_array.join("")},templateNewLibraryInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_library_modal">');tmpl_array.push(" <form>");tmpl_array.push(' <input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push(' <input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push(' <input type="text" name="Synopsis" value="" placeholder="Synopsis">');tmpl_array.push(" </form>");tmpl_array.push("</div>");return tmpl_array.join("")},render:function(){$("#center").css("overflow","auto");var r=this;libraries=new o();libraries.fetch({success:function(s){var t=_.template(r.templateLibraryList(),{libraries:s.models});r.$el.html(t)},error:function(t,s){if(s.statusCode().status===403){n.info("Please log in first. Redirecting to login page in 3s.");setTimeout(r.redirectToLogin,3000)}else{n.error("An error occured. Please try again.")}}})},redirectToHome:function(){window.location="../"},redirectToLogin:function(){window.location="/user/login"},modal:null,show_library_modal:function(s){s.preventDefault();s.stopPropagation();var r=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Library",body:this.templateNewLibraryInModal(),buttons:{Create:function(){r.create_new_library_event()},Close:function(){r.modal.hide()}}})},create_new_library_event:function(){var t=this.serialize_new_library();if(this.validate_new_library(t)){var s=new f();var r=this;s.save(t,{success:function(u){r.modal.hide();r.clear_library_modal();r.render();n.success("Library created")},error:function(){n.error("An error occured :(")}})}else{n.error("Library's name is missing")}return false},clear_library_modal:function(){$("input[name='Name']").val("");$("input[name='Description']").val("");$("input[name='Synopsis']").val("")},serialize_new_library:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val(),synopsis:$("input[name='Synopsis']").val()}},validate_new_library:function(r){return r.name!==""}});var g=Backbone.View.extend({folderContentView:null,galaxyLibraryview:null,initialize:function(){folderContentView=new m();galaxyLibraryview=new a();library_router=new q();library_router.on("route:libraries",function(){galaxyLibraryview.render()});library_router.on("route:folder_content",function(r){folderContentView.render({id:r})});library_router.on("route:download",function(r,s){if($("#center").find(":checked").length===0){library_router.navigate("folders/"+r,{trigger:true,replace:true})}else{folderContentView.download(r,s);library_router.navigate("folders/"+r,{trigger:false,replace:true})}});Backbone.history.start({pushState:false})}});return{GalaxyApp:g}});
\ No newline at end of file
diff -r fb791568304883fe0357b6173dcc43d772214c8b -r 7d649885e3259f3359e8c3816315c60e958c1518 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1292,7 +1292,7 @@
tr.dark:hover td{background-color:#bbbfd0;color:white}
a.dark:hover{color:yellow}
a.dark{color:white}
-th.button_heading{width:7em}
+th.button_heading{width:2em}
div.library_breadcrumb{padding-top:0.8em;padding-bottom:0.8em}
div.library_breadcrumb a:hover{color:green}
img.expanderIcon{padding-right:4px}
diff -r fb791568304883fe0357b6173dcc43d772214c8b -r 7d649885e3259f3359e8c3816315c60e958c1518 static/style/blue/library.css
--- a/static/style/blue/library.css
+++ b/static/style/blue/library.css
@@ -12,7 +12,7 @@
tr.dark:hover td{background-color:#bbbfd0;color:white}
a.dark:hover{color:yellow}
a.dark{color:white}
-th.button_heading{width:7em}
+th.button_heading{width:2em}
div.library_breadcrumb{padding-top:0.8em;padding-bottom:0.8em}
div.library_breadcrumb a:hover{color:green}
img.expanderIcon{padding-right:4px}
diff -r fb791568304883fe0357b6173dcc43d772214c8b -r 7d649885e3259f3359e8c3816315c60e958c1518 static/style/src/less/library.less
--- a/static/style/src/less/library.less
+++ b/static/style/src/less/library.less
@@ -62,7 +62,7 @@
}
th.button_heading
{
- width: 7em;
+ width: 2em;
}
div.library_breadcrumb{
padding-top: 0.8em;
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/44968207ddd2/
Changeset: 44968207ddd2
Branch: stable
User: carlfeberhard
Date: 2014-02-17 22:20:21
Summary: Fix to history view: include purged datasets in history list when bootstrapping (this prevents them being added later and out of order when an update occurs)
Affected #: 1 file
diff -r fa8bdf1f6fc7318d120a3420c50e4045dbdb1e8b -r 44968207ddd283d0023c72e3d25fd39b1c71eb99 lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -929,7 +929,9 @@
return trans.show_error_message( "Either you are not allowed to view this history"
+ " or the owner of this history has not made it accessible." )
- hdas = self.get_history_datasets( trans, history_to_view, show_deleted=True, show_hidden=True )
+ # include all datasets: hidden, deleted, and purged
+ hdas = self.get_history_datasets( trans, history_to_view,
+ show_deleted=True, show_hidden=True, show_purged=True )
for hda in hdas:
hda_dict = {}
try:
https://bitbucket.org/galaxy/galaxy-central/commits/fb7915683048/
Changeset: fb7915683048
User: carlfeberhard
Date: 2014-02-17 22:20:42
Summary: Merge
Affected #: 1 file
diff -r 423a2939e224a294ded5842daa485da0a007fcbb -r fb791568304883fe0357b6173dcc43d772214c8b lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -900,7 +900,9 @@
return trans.show_error_message( "Either you are not allowed to view this history"
+ " or the owner of this history has not made it accessible." )
- hdas = self.get_history_datasets( trans, history_to_view, show_deleted=True, show_hidden=True )
+ # include all datasets: hidden, deleted, and purged
+ hdas = self.get_history_datasets( trans, history_to_view,
+ show_deleted=True, show_hidden=True, show_purged=True )
for hda in hdas:
hda_dict = {}
try:
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: Update LWR client through LWR changeset 5c609be.
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/423a2939e224/
Changeset: 423a2939e224
User: jmchilton
Date: 2014-02-17 21:17:43
Summary: Update LWR client through LWR changeset 5c609be.
The LWR server and client can be driven via message queues, though this changeset doesn't update the LWR runner itself to allow this - only the client itself. The runner however has been updated to support some more minor changes that enabled the LWR client to be message queue driven.
In particular, a new action type was added "remote_copy" that does a file-system copy of files being staged in or out like "copy" - but it does so on the LWR side instead of the Galaxy client. In this scenario these actions are serialized and transferred with the "launch" command to the LWR - potentially eliminating many HTTP calls.
Paired with this, more processing can happen on the client side - namely calculating remote paths and properties - and if configured in this fashion the LWR "setup" step can be eliminated - allowing the LWR client to completely specify a job with a single one-directional message (very useful for message queues). While modifying the LWR to be able to behave in this fashion was done to enable message queues - a traditional HTTP driven LWR can use these features (remote copy, client-side path calculation, etc...) and job_conf.xml.sample_advanced has been updated to reflect this.
For more information on changes to the LWR client this encompasses see the following LWR changesets:
https://bitbucket.org/jmchilton/lwr/commits/bacaa5c840bbf41952fcafe6e0deadd…
https://bitbucket.org/jmchilton/lwr/commits/c8254d4525fa19f6761c6a75506d7b2…
https://bitbucket.org/jmchilton/lwr/commits/1f068927a677bbfb932c475e5a4dad9…
https://bitbucket.org/jmchilton/lwr/commits/bde8cbe6f5736a82d5fa20b322cb34d…
https://bitbucket.org/jmchilton/lwr/commits/993910fa0c5a0ac2be72b2d70eeaaa0…
Affected #: 14 files
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb job_conf.xml.sample_advanced
--- a/job_conf.xml.sample_advanced
+++ b/job_conf.xml.sample_advanced
@@ -96,6 +96,16 @@
ones (both alternatives are a little brittle). --><!-- <param id="remote_metadata">true</param> --><!-- <param id="use_remote_datatypes">false</param> -->
+ <!-- Traditionally, the LWR client sends request to LWR
+ server to populate various system properties. This
+ extra step can be disabled and these calculated here
+ on client by uncommenting job_directory and
+ specifying any additional remote_property_ of
+ interest. When using message queues this is nessecary
+ not optional.
+ -->
+ <!-- <param id="jobs_directory">/path/to/remote/lwr/lwr_staging/</param> -->
+ <!-- <param id="remote_property_galaxy_home">/path/to/remote/galaxy-central</param> --><!-- If remote LWR server is configured to run jobs as the real user,
uncomment the following line to pass the current Galaxy user
along. -->
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr.py
--- a/lib/galaxy/jobs/runners/lwr.py
+++ b/lib/galaxy/jobs/runners/lwr.py
@@ -6,19 +6,19 @@
from galaxy.jobs import JobDestination
from galaxy.jobs.command_factory import build_command
from galaxy.util import string_as_bool_or_none
-from galaxy.util import in_directory
from galaxy.util.bunch import Bunch
import errno
from time import sleep
import os
-from .lwr_client import ClientManager, url_to_destination_params
+from .lwr_client import build_client_manager
+from .lwr_client import url_to_destination_params
from .lwr_client import finish_job as lwr_finish_job
from .lwr_client import submit_job as lwr_submit_job
from .lwr_client import ClientJobDescription
from .lwr_client import LwrOutputs
-from .lwr_client import GalaxyOutputs
+from .lwr_client import ClientOutputs
from .lwr_client import PathMapper
log = logging.getLogger( __name__ )
@@ -41,7 +41,7 @@
self._init_monitor_thread()
self._init_worker_threads()
client_manager_kwargs = {'transport_type': transport, 'cache': string_as_bool_or_none(cache)}
- self.client_manager = ClientManager(**client_manager_kwargs)
+ self.client_manager = build_client_manager(**client_manager_kwargs)
def url_to_destination( self, url ):
"""Convert a legacy URL to a job destination"""
@@ -83,13 +83,12 @@
client_job_description = ClientJobDescription(
command_line=command_line,
- output_files=self.get_output_files(job_wrapper),
input_files=self.get_input_files(job_wrapper),
+ client_outputs=self.__client_outputs(client, job_wrapper),
working_directory=job_wrapper.working_directory,
tool=job_wrapper.tool,
config_files=job_wrapper.extra_filenames,
requirements=requirements,
- version_file=job_wrapper.get_version_string_path(),
rewrite_paths=rewrite_paths,
arbitrary_files=unstructured_path_rewrites,
)
@@ -197,30 +196,17 @@
stdout = run_results.get('stdout', '')
stderr = run_results.get('stderr', '')
exit_code = run_results.get('returncode', None)
- lwr_outputs = LwrOutputs(run_results)
+ lwr_outputs = LwrOutputs.from_status_response(run_results)
# Use LWR client code to transfer/copy files back
# and cleanup job if needed.
completed_normally = \
job_wrapper.get_state() not in [ model.Job.states.ERROR, model.Job.states.DELETED ]
cleanup_job = self.app.config.cleanup_job
- remote_work_dir_copy = LwrJobRunner.__remote_work_dir_copy( client )
- if not remote_work_dir_copy:
- work_dir_outputs = self.get_work_dir_outputs( job_wrapper )
- else:
- # They have already been copied over to look like regular outputs remotely,
- # no need to handle them differently here.
- work_dir_outputs = []
- output_files = self.get_output_files( job_wrapper )
- galaxy_outputs = GalaxyOutputs(
- working_directory=job_wrapper.working_directory,
- work_dir_outputs=work_dir_outputs,
- output_files=output_files,
- version_file=job_wrapper.get_version_string_path(),
- )
+ client_outputs = self.__client_outputs(client, job_wrapper)
finish_args = dict( client=client,
job_completed_normally=completed_normally,
cleanup_job=cleanup_job,
- galaxy_outputs=galaxy_outputs,
+ client_outputs=client_outputs,
lwr_outputs=lwr_outputs )
failed = lwr_finish_job( **finish_args )
@@ -305,6 +291,23 @@
job_state.running = state == model.Job.states.RUNNING
self.monitor_queue.put( job_state )
+ def __client_outputs( self, client, job_wrapper ):
+ remote_work_dir_copy = LwrJobRunner.__remote_work_dir_copy( client )
+ if not remote_work_dir_copy:
+ work_dir_outputs = self.get_work_dir_outputs( job_wrapper )
+ else:
+ # They have already been copied over to look like regular outputs remotely,
+ # no need to handle them differently here.
+ work_dir_outputs = []
+ output_files = self.get_output_files( job_wrapper )
+ client_outputs = ClientOutputs(
+ working_directory=job_wrapper.working_directory,
+ work_dir_outputs=work_dir_outputs,
+ output_files=output_files,
+ version_file=job_wrapper.get_version_string_path(),
+ )
+ return client_outputs
+
@staticmethod
def __dependency_resolution( lwr_client ):
dependency_resolution = lwr_client.destination_params.get( "dependency_resolution", "local" )
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/__init__.py
--- a/lib/galaxy/jobs/runners/lwr_client/__init__.py
+++ b/lib/galaxy/jobs/runners/lwr_client/__init__.py
@@ -10,20 +10,20 @@
from .staging.up import submit_job
from .staging import ClientJobDescription
from .staging import LwrOutputs
-from .staging import GalaxyOutputs
+from .staging import ClientOutputs
from .client import OutputNotFoundException
-from .manager import ClientManager
+from .manager import build_client_manager
from .destination import url_to_destination_params
from .path_mapper import PathMapper
__all__ = [
- ClientManager,
+ build_client_manager,
OutputNotFoundException,
url_to_destination_params,
finish_job,
submit_job,
ClientJobDescription,
LwrOutputs,
- GalaxyOutputs,
+ ClientOutputs,
PathMapper,
]
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/action_mapper.py
--- a/lib/galaxy/jobs/runners/lwr_client/action_mapper.py
+++ b/lib/galaxy/jobs/runners/lwr_client/action_mapper.py
@@ -7,6 +7,7 @@
import fnmatch
from re import compile
from re import escape
+import galaxy.util
from galaxy.util.bunch import Bunch
from .util import directory_files
from .util import unique_path_prefix
@@ -14,6 +15,11 @@
DEFAULT_MAPPED_ACTION = 'transfer' # Not really clear to me what this should be, exception?
DEFAULT_PATH_MAPPER_TYPE = 'prefix'
+STAGING_ACTION_REMOTE = "remote"
+STAGING_ACTION_LOCAL = "local"
+STAGING_ACTION_NONE = None
+STAGING_ACTION_DEFAULT = "default"
+
# Poor man's enum.
path_type = Bunch(
# Galaxy input datasets and extra files.
@@ -63,6 +69,7 @@
... f.close()
... mock_client = Bunch(default_file_action=default_action, action_config_path=f.name)
... mapper = FileActionMapper(mock_client)
+ ... mapper = FileActionMapper(config=mapper.to_dict()) # Serialize and deserialize it to make sure still works
... unlink(f.name)
... return mapper
>>> mapper = mapper_for(default_action='none', config_contents=json_string)
@@ -110,18 +117,33 @@
True
"""
- def __init__(self, client):
- self.default_action = client.default_file_action
+ def __init__(self, client=None, config=None):
+ if config is None and client is None:
+ message = "FileActionMapper must be constructed from either a client or a config dictionary."
+ raise Exception(message)
+ if config is None:
+ config = self.__client_to_config(client)
+ self.default_action = config.get("default_action", "transfer")
+ self.mappers = mappers_from_dicts(config.get("paths", []))
+
+ def to_dict(self):
+ return dict(
+ default_action=self.default_action,
+ paths=map(lambda m: m.to_dict(), self.mappers)
+ )
+
+ def __client_to_config(self, client):
action_config_path = client.action_config_path
- self.mappers = []
if action_config_path:
- self.__load_action_config(action_config_path)
+ config = load(open(action_config_path, 'rb'))
+ else:
+ config = dict()
+ config["default_action"] = client.default_file_action
+ return config
def __load_action_config(self, path):
config = load(open(path, 'rb'))
- for path_config in config.get('paths', []):
- map_type = path_config.get('match_type', DEFAULT_PATH_MAPPER_TYPE)
- self.mappers.append(mappers[map_type](path_config))
+ self.mappers = mappers_from_dicts(config.get('paths', []))
def action(self, path, type, mapper=None):
action_type = self.default_action if type in ACTION_DEFAULT_PATH_TYPES else "none"
@@ -167,6 +189,14 @@
unstructured_map[path] = join(prefix, name)
return unstructured_map
+ @property
+ def staging_needed(self):
+ return self.staging != STAGING_ACTION_NONE
+
+ @property
+ def staging_action_local(self):
+ return self.staging == STAGING_ACTION_LOCAL
+
class NoneAction(BaseAction):
""" This action indicates the corresponding path does not require any
@@ -174,7 +204,7 @@
the LWR client (i.e. Galaxy server) and remote LWR server with the same
paths. """
action_type = "none"
- staging_needed = False
+ staging = STAGING_ACTION_NONE
class TransferAction(BaseAction):
@@ -182,7 +212,7 @@
transfer of the corresponding path to the remote LWR server before
launching the job. """
action_type = "transfer"
- staging_needed = True
+ staging = STAGING_ACTION_LOCAL
class CopyAction(BaseAction):
@@ -190,7 +220,74 @@
copy of the corresponding path to the LWR staging directory prior to
launching the corresponding job. """
action_type = "copy"
- staging_needed = True
+ staging = STAGING_ACTION_LOCAL
+
+
+class RemoteCopyAction(BaseAction):
+ """ This action indicates the LWR server should copy the file before
+ execution via direct file system copy. This is like a CopyAction, but
+ it indicates the action should occur on the LWR server instead of on
+ the client.
+ """
+ action_type = "remote_copy"
+ staging = STAGING_ACTION_REMOTE
+
+ def to_dict(self):
+ return dict(path=self.path, action_type=RemoteCopyAction.action_type)
+
+ @classmethod
+ def from_dict(cls, action_dict):
+ return RemoteCopyAction(path=action_dict["path"])
+
+ def write_to_path(self, path):
+ galaxy.util.copy_to_path(open(self.path, "rb"), path)
+
+
+class MessageAction(object):
+ """ Sort of pseudo action describing "files" store in memory and
+ transferred via message (HTTP, Python-call, MQ, etc...)
+ """
+ action_type = "message"
+ staging = STAGING_ACTION_DEFAULT
+
+ def __init__(self, contents, client=None):
+ self.contents = contents
+ self.client = client
+
+ @property
+ def staging_needed(self):
+ return True
+
+ @property
+ def staging_action_local(self):
+ # Ekkk, cannot be called if created through from_dict.
+ # Shouldn't be a problem the way it is used - but is an
+ # object design problem.
+ return self.client.prefer_local_staging
+
+ def to_dict(self):
+ return dict(contents=self.contents, action_type=MessageAction.action_type)
+
+ @classmethod
+ def from_dict(cls, action_dict):
+ return MessageAction(contents=action_dict["contents"])
+
+ def write_to_path(self, path):
+ open(path, "w").write(self.contents)
+
+DICTIFIABLE_ACTION_CLASSES = [RemoteCopyAction, MessageAction]
+
+
+def from_dict(action_dict):
+ action_type = action_dict.get("action_type", None)
+ target_class = None
+ for action_class in DICTIFIABLE_ACTION_CLASSES:
+ if action_type == action_class.action_type:
+ target_class = action_class
+ if not target_class:
+ message = "Failed to recover action from dictionary - invalid action type specified %s." % action_type
+ raise Exception(message)
+ return target_class.from_dict(action_dict)
class BasePathMapper(object):
@@ -207,8 +304,19 @@
path_type_matches = path_type in self.path_types
return path_type_matches and self._path_matches(path)
+ def _extend_base_dict(self, **kwds):
+ base_dict = dict(
+ action=self.action_type,
+ path_types=",".join(self.path_types),
+ match_type=self.match_type,
+ **self.file_lister.to_dict()
+ )
+ base_dict.update(**kwds)
+ return base_dict
+
class PrefixPathMapper(BasePathMapper):
+ match_type = 'prefix'
def __init__(self, config):
super(PrefixPathMapper, self).__init__(config)
@@ -221,8 +329,12 @@
pattern_str = "(%s%s[^\s,\"\']+)" % (escape(self.prefix_path), escape(sep))
return compile(pattern_str)
+ def to_dict(self):
+ return self._extend_base_dict(path=self.prefix_path)
+
class GlobPathMapper(BasePathMapper):
+ match_type = 'glob'
def __init__(self, config):
super(GlobPathMapper, self).__init__(config)
@@ -234,12 +346,17 @@
def to_pattern(self):
return compile(fnmatch.translate(self.glob_path))
+ def to_dict(self):
+ return self._extend_base_dict(path=self.glob_path)
+
class RegexPathMapper(BasePathMapper):
+ match_type = 'regex'
def __init__(self, config):
super(RegexPathMapper, self).__init__(config)
- self.pattern = compile(config['path'])
+ self.pattern_raw = config['path']
+ self.pattern = compile(self.pattern_raw)
def _path_matches(self, path):
return self.pattern.match(path) is not None
@@ -247,12 +364,32 @@
def to_pattern(self):
return self.pattern
+ def to_dict(self):
+ return self._extend_base_dict(path=self.pattern_raw)
+
+MAPPER_CLASSES = [PrefixPathMapper, GlobPathMapper, RegexPathMapper]
+MAPPER_CLASS_DICT = dict(map(lambda c: (c.match_type, c), MAPPER_CLASSES))
+
+
+def mappers_from_dicts(mapper_def_list):
+ return map(lambda m: __mappper_from_dict(m), mapper_def_list)
+
+
+def __mappper_from_dict(mapper_dict):
+ map_type = mapper_dict.get('match_type', DEFAULT_PATH_MAPPER_TYPE)
+ return MAPPER_CLASS_DICT[map_type](mapper_dict)
+
class FileLister(object):
def __init__(self, config):
self.depth = int(config.get("depth", "0"))
+ def to_dict(self):
+ return dict(
+ depth=self.depth
+ )
+
def unstructured_map(self, path):
depth = self.depth
if self.depth == 0:
@@ -265,14 +402,8 @@
DEFAULT_FILE_LISTER = FileLister(dict(depth=0))
-ACTION_CLASSES = [NoneAction, TransferAction, CopyAction]
+ACTION_CLASSES = [NoneAction, TransferAction, CopyAction, RemoteCopyAction]
actions = dict([(clazz.action_type, clazz) for clazz in ACTION_CLASSES])
-mappers = {
- 'prefix': PrefixPathMapper,
- 'glob': GlobPathMapper,
- 'regex': RegexPathMapper,
-}
-
-__all__ = [FileActionMapper, path_type]
+__all__ = [FileActionMapper, path_type, from_dict, MessageAction]
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/amqp_exchange.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/lwr_client/amqp_exchange.py
@@ -0,0 +1,83 @@
+try:
+ import kombu
+ from kombu import pools
+except ImportError:
+ kombu = None
+
+import socket
+import logging
+log = logging.getLogger(__name__)
+
+
+KOMBU_UNAVAILABLE = "Attempting to bind to AMQP message queue, but kombu dependency unavailable"
+
+DEFAULT_EXCHANGE_NAME = "lwr"
+DEFAULT_EXCHANGE_TYPE = "direct"
+DEFAULT_TIMEOUT = 0.2 # Set timeout to periodically give up looking and check
+ # if polling should end.
+
+
+class LwrExchange(object):
+ """ Utility for publishing and consuming structured LWR queues using kombu.
+ This is shared between the server and client - an exchange should be setup
+ for each manager (or in the case of the client, each manager one wished to
+ communicate with.)
+
+ Each LWR manager is defined solely by name in the scheme, so only one LWR
+ should target each AMQP endpoint or care should be taken that unique
+ manager names are used across LWR servers targetting same AMQP endpoint -
+ and in particular only one such LWR should define an default manager with
+ name _default_.
+ """
+
+ def __init__(self, url, manager_name, timeout=DEFAULT_TIMEOUT):
+ """
+ """
+ if not kombu:
+ raise Exception(KOMBU_UNAVAILABLE)
+ self.__url = url
+ self.__manager_name = manager_name
+ self.__exchange = kombu.Exchange(DEFAULT_EXCHANGE_NAME, DEFAULT_EXCHANGE_TYPE)
+ self.__timeout = timeout
+
+ def consume(self, queue_name, callback, check=True, connection_kwargs={}):
+ queue = self.__queue(queue_name)
+ with self.connection(self.__url, **connection_kwargs) as connection:
+ with kombu.Consumer(connection, queues=[queue], callbacks=[callback], accept=['json']):
+ while check:
+ try:
+ connection.drain_events(timeout=self.__timeout)
+ except socket.timeout:
+ pass
+
+ def publish(self, name, payload):
+ with self.connection(self.__url) as connection:
+ with pools.producers[connection].acquire() as producer:
+ key = self.__queue_name(name)
+ producer.publish(
+ payload,
+ serializer='json',
+ exchange=self.__exchange,
+ declare=[self.__exchange],
+ routing_key=key,
+ )
+
+ def connection(self, connection_string, **kwargs):
+ return kombu.Connection(connection_string, **kwargs)
+
+ def __queue(self, name):
+ queue_name = self.__queue_name(name)
+ queue = kombu.Queue(queue_name, self.__exchange, routing_key=queue_name)
+ return queue
+
+ def __queue_name(self, name):
+ key_prefix = self.__key_prefix()
+ queue_name = '%s_%s' % (key_prefix, name)
+ return queue_name
+
+ def __key_prefix(self):
+ if self.__manager_name == "_default_":
+ key_prefix = "lwr_"
+ else:
+ key_prefix = "lwr_%s_" % self.__manager_name
+ return key_prefix
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/client.py
--- a/lib/galaxy/jobs/runners/lwr_client/client.py
+++ b/lib/galaxy/jobs/runners/lwr_client/client.py
@@ -1,9 +1,12 @@
import os
import shutil
-from json import dumps, loads
+import json
+from json import dumps
from time import sleep
from .destination import submit_params
+from .setup_handler import build as build_setup_handler
+from .job_directory import RemoteJobDirectory
CACHE_WAIT_SECONDS = 3
MAX_RETRY_COUNT = 5
@@ -15,7 +18,7 @@
def __call__(self, func):
def replacement(*args, **kwargs):
response = func(*args, **kwargs)
- return loads(response)
+ return json.loads(response)
return replacement
@@ -49,7 +52,47 @@
return "No remote output found for path %s" % self.path
-class JobClient(object):
+class BaseJobClient(object):
+
+ def __init__(self, destination_params, job_id):
+ self.destination_params = destination_params
+ self.job_id = job_id
+ if "jobs_directory" in (destination_params or {}):
+ staging_directory = destination_params["jobs_directory"]
+ sep = destination_params.get("remote_sep", os.sep)
+ job_directory = RemoteJobDirectory(
+ remote_staging_directory=staging_directory,
+ remote_id=job_id,
+ remote_sep=sep,
+ )
+ else:
+ job_directory = None
+ self.job_directory = job_directory
+
+ self.default_file_action = self.destination_params.get("default_file_action", "transfer")
+ self.action_config_path = self.destination_params.get("file_action_config", None)
+
+ self.setup_handler = build_setup_handler(self, destination_params)
+
+ def setup(self, tool_id=None, tool_version=None):
+ """
+ Setup remote LWR server to run this job.
+ """
+ setup_args = {"job_id": self.job_id}
+ if tool_id:
+ setup_args["tool_id"] = tool_id
+ if tool_version:
+ setup_args["tool_version"] = tool_version
+ return self.setup_handler.setup(**setup_args)
+
+ @property
+ def prefer_local_staging(self):
+ # If doing a job directory is defined, calculate paths here and stage
+ # remotely.
+ return self.job_directory is None
+
+
+class JobClient(BaseJobClient):
"""
Objects of this client class perform low-level communication with a remote LWR server.
@@ -62,12 +105,8 @@
"""
def __init__(self, destination_params, job_id, job_manager_interface):
+ super(JobClient, self).__init__(destination_params, job_id)
self.job_manager_interface = job_manager_interface
- self.destination_params = destination_params
- self.job_id = job_id
-
- self.default_file_action = self.destination_params.get("default_file_action", "transfer")
- self.action_config_path = self.destination_params.get("file_action_config", None)
def _raw_execute(self, command, args={}, data=None, input_path=None, output_path=None):
return self.job_manager_interface.execute(command, args, data, input_path, output_path)
@@ -206,10 +245,11 @@
}
self._raw_execute("download_output", output_params, output_path=output_path)
- def launch(self, command_line, requirements=[]):
+ def launch(self, command_line, requirements=[], remote_staging=[], job_config=None):
"""
- Run or queue up the execution of the supplied
- `command_line` on the remote server.
+ Queue up the execution of the supplied `command_line` on the remote
+ server. Called launch for historical reasons, should be renamed to
+ enqueue or something like that.
**Parameters**
@@ -222,6 +262,14 @@
launch_params['params'] = dumps(submit_params)
if requirements:
launch_params['requirements'] = dumps([requirement.to_dict() for requirement in requirements])
+ if remote_staging:
+ launch_params['remote_staging'] = dumps(remote_staging)
+ if job_config and self.setup_handler.local:
+ # Setup not yet called, job properties were inferred from
+ # destination arguments. Hence, must have LWR setup job
+ # before queueing.
+ setup_params = _setup_params_from_job_config(job_config)
+ launch_params["setup_params"] = dumps(setup_params)
return self._raw_execute("launch", launch_params)
def kill(self):
@@ -230,15 +278,20 @@
"""
return self._raw_execute("kill", {"job_id": self.job_id})
- def wait(self):
+ def wait(self, max_seconds=None):
"""
Wait for job to finish.
"""
- while True:
+ i = 0
+ while max_seconds is None or i < max_seconds:
complete_response = self.raw_check_complete()
if complete_response["complete"] == "true":
+ print complete_response
return complete_response
+ else:
+ print complete_response
sleep(1)
+ i += 1
@parseJson()
def raw_check_complete(self):
@@ -276,15 +329,10 @@
self._raw_execute("clean", {"job_id": self.job_id})
@parseJson()
- def setup(self, tool_id=None, tool_version=None):
+ def remote_setup(self, **setup_args):
"""
Setup remote LWR server to run this job.
"""
- setup_args = {"job_id": self.job_id}
- if tool_id:
- setup_args["tool_id"] = tool_id
- if tool_version:
- setup_args["tool_version"] = tool_version
return self._raw_execute("setup", setup_args)
def _copy(self, source, destination):
@@ -294,6 +342,35 @@
shutil.copyfile(source, destination)
+class MessageJobClient(BaseJobClient):
+
+ def __init__(self, destination_params, job_id, exchange):
+ super(MessageJobClient, self).__init__(destination_params, job_id)
+ if not self.job_directory:
+ error_message = "Message-queue based LWR client requires destination define a remote job_directory to stage files into."
+ raise Exception(error_message)
+ self.exchange = exchange
+
+ def launch(self, command_line, requirements=[], remote_staging=[], job_config=None):
+ """
+ """
+ launch_params = dict(command_line=command_line, job_id=self.job_id)
+ submit_params_dict = submit_params(self.destination_params)
+ if submit_params_dict:
+ launch_params['params'] = submit_params_dict
+ if requirements:
+ launch_params['requirements'] = [requirement.to_dict() for requirement in requirements]
+ if remote_staging:
+ launch_params['remote_staging'] = remote_staging
+ if job_config and self.setup_handler.local:
+ # Setup not yet called, job properties were inferred from
+ # destination arguments. Hence, must have LWR setup job
+ # before queueing.
+ setup_params = _setup_params_from_job_config(job_config)
+ launch_params["setup_params"] = setup_params
+ return self.exchange.publish("setup", launch_params)
+
+
class InputCachingJobClient(JobClient):
"""
Beta client that cache's staged files to prevent duplication.
@@ -337,6 +414,17 @@
return self._raw_execute("file_available", {"path": path})
+def _setup_params_from_job_config(job_config):
+ job_id = job_config.get("job_id", None)
+ tool_id = job_config.get("tool_id", None)
+ tool_version = job_config.get("tool_version", None)
+ return dict(
+ job_id=job_id,
+ tool_id=tool_id,
+ tool_version=tool_version
+ )
+
+
class ObjectStoreClient(object):
def __init__(self, lwr_interface):
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/destination.py
--- a/lib/galaxy/jobs/runners/lwr_client/destination.py
+++ b/lib/galaxy/jobs/runners/lwr_client/destination.py
@@ -1,5 +1,6 @@
from re import match
+from .util import filter_destination_params
SUBMIT_PREFIX = "submit_"
@@ -54,7 +55,4 @@
>>> result
{'native_specification': '-q batch'}
"""
- destination_params = destination_params or {}
- return dict([(key[len(SUBMIT_PREFIX):], destination_params[key])
- for key in destination_params
- if key.startswith(SUBMIT_PREFIX)])
+ return filter_destination_params(destination_params, SUBMIT_PREFIX)
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/job_directory.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/lwr_client/job_directory.py
@@ -0,0 +1,137 @@
+"""
+"""
+import os.path
+from collections import deque
+import posixpath
+
+from .util import PathHelper
+from galaxy.util import in_directory
+
+from logging import getLogger
+log = getLogger(__name__)
+
+
+TYPES_TO_METHOD = dict(
+ input="inputs_directory",
+ input_extra="inputs_directory",
+ unstructured="unstructured_files_directory",
+ config="configs_directory",
+ tool="tool_files_directory",
+ work_dir="working_directory",
+ workdir="working_directory",
+ output="outputs_directory",
+ output_workdir="working_directory",
+)
+
+
+class RemoteJobDirectory(object):
+ """ Representation of a (potentially) remote LWR-style staging directory.
+ """
+
+ def __init__(self, remote_staging_directory, remote_id, remote_sep):
+ self.path_helper = PathHelper(remote_sep)
+ self.job_directory = self.path_helper.remote_join(
+ remote_staging_directory,
+ remote_id
+ )
+
+ def working_directory(self):
+ return self._sub_dir('working')
+
+ def inputs_directory(self):
+ return self._sub_dir('inputs')
+
+ def outputs_directory(self):
+ return self._sub_dir('outputs')
+
+ def configs_directory(self):
+ return self._sub_dir('configs')
+
+ def tool_files_directory(self):
+ return self._sub_dir('tool_files')
+
+ def unstructured_files_directory(self):
+ return self._sub_dir('unstructured')
+
+ @property
+ def path(self):
+ return self.job_directory
+
+ @property
+ def separator(self):
+ return self.path_helper.separator
+
+ def calculate_path(self, remote_relative_path, input_type):
+ """ Only for used by LWR client, should override for managers to
+ enforce security and make the directory if needed.
+ """
+ directory, allow_nested_files = self._directory_for_file_type(input_type)
+ return self.path_helper.remote_join(directory, remote_relative_path)
+
+ def _directory_for_file_type(self, file_type):
+ allow_nested_files = False
+ # work_dir and input_extra are types used by legacy clients...
+ # Obviously this client won't be legacy because this is in the
+ # client module, but this code is reused on server which may
+ # serve legacy clients.
+ allow_nested_files = file_type in ['input', 'input_extra', 'unstructured', 'output', 'output_workdir']
+ directory_function = getattr(self, TYPES_TO_METHOD.get(file_type, None), None)
+ if not directory_function:
+ raise Exception("Unknown file_type specified %s" % file_type)
+ return directory_function(), allow_nested_files
+
+ def _sub_dir(self, name):
+ return self.path_helper.remote_join(self.job_directory, name)
+
+
+def get_mapped_file(directory, remote_path, allow_nested_files=False, local_path_module=os.path, mkdir=True):
+ """
+
+ >>> import ntpath
+ >>> get_mapped_file(r'C:\\lwr\\staging\\101', 'dataset_1_files/moo/cow', allow_nested_files=True, local_path_module=ntpath, mkdir=False)
+ 'C:\\\\lwr\\\\staging\\\\101\\\\dataset_1_files\\\\moo\\\\cow'
+ >>> get_mapped_file(r'C:\\lwr\\staging\\101', 'dataset_1_files/moo/cow', allow_nested_files=False, local_path_module=ntpath)
+ 'C:\\\\lwr\\\\staging\\\\101\\\\cow'
+ >>> get_mapped_file(r'C:\\lwr\\staging\\101', '../cow', allow_nested_files=True, local_path_module=ntpath, mkdir=False)
+ Traceback (most recent call last):
+ Exception: Attempt to read or write file outside an authorized directory.
+ """
+ if not allow_nested_files:
+ name = local_path_module.basename(remote_path)
+ path = local_path_module.join(directory, name)
+ else:
+ local_rel_path = __posix_to_local_path(remote_path, local_path_module=local_path_module)
+ local_path = local_path_module.join(directory, local_rel_path)
+ verify_is_in_directory(local_path, directory, local_path_module=local_path_module)
+ local_directory = local_path_module.dirname(local_path)
+ if mkdir and not local_path_module.exists(local_directory):
+ os.makedirs(local_directory)
+ path = local_path
+ return path
+
+
+def __posix_to_local_path(path, local_path_module=os.path):
+ """
+ Converts a posix path (coming from Galaxy), to a local path (be it posix or Windows).
+
+ >>> import ntpath
+ >>> __posix_to_local_path('dataset_1_files/moo/cow', local_path_module=ntpath)
+ 'dataset_1_files\\\\moo\\\\cow'
+ >>> import posixpath
+ >>> __posix_to_local_path('dataset_1_files/moo/cow', local_path_module=posixpath)
+ 'dataset_1_files/moo/cow'
+ """
+ partial_path = deque()
+ while True:
+ if not path or path == '/':
+ break
+ (path, base) = posixpath.split(path)
+ partial_path.appendleft(base)
+ return local_path_module.join(*partial_path)
+
+
+def verify_is_in_directory(path, directory, local_path_module=os.path):
+ if not in_directory(path, directory, local_path_module):
+ msg = "Attempt to read or write file outside an authorized directory."
+ log.warn("%s Attempted path: %s, valid directory: %s" % (msg, path, directory))
+ raise Exception(msg)
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/manager.py
--- a/lib/galaxy/jobs/runners/lwr_client/manager.py
+++ b/lib/galaxy/jobs/runners/lwr_client/manager.py
@@ -21,9 +21,11 @@
from .client import JobClient
from .client import InputCachingJobClient
from .client import ObjectStoreClient
+from .client import MessageJobClient
from .transport import get_transport
from .util import TransferEventManager
from .destination import url_to_destination_params
+from .amqp_exchange import LwrExchange
from logging import getLogger
@@ -32,6 +34,15 @@
DEFAULT_TRANSFER_THREADS = 2
+def build_client_manager(**kwargs):
+ if 'job_manager' in kwargs:
+ return ClientManager(**kwargs) # TODO: Consider more separation here.
+ elif 'url' in kwargs:
+ return MessageQueueClientManager(**kwargs)
+ else:
+ return ClientManager(**kwargs)
+
+
class ClientManager(object):
"""
Factory to create LWR clients, used to manage potential shared
@@ -60,20 +71,51 @@
self.extra_client_kwds = {}
def get_client(self, destination_params, job_id):
- destination_params = self.__parse_destination_params(destination_params)
+ destination_params = _parse_destination_params(destination_params)
job_manager_interface_class = self.job_manager_interface_class
job_manager_interface_args = dict(destination_params=destination_params, **self.job_manager_interface_args)
job_manager_interface = job_manager_interface_class(**job_manager_interface_args)
return self.client_class(destination_params, job_id, job_manager_interface, **self.extra_client_kwds)
- def __parse_destination_params(self, destination_params):
- try:
- unicode_type = unicode
- except NameError:
- unicode_type = str
- if isinstance(destination_params, str) or isinstance(destination_params, unicode_type):
- destination_params = url_to_destination_params(destination_params)
- return destination_params
+ def shutdown(self):
+ pass
+
+
+class MessageQueueClientManager(object):
+
+ def __init__(self, **kwds):
+ self.url = kwds.get('url')
+ self.manager_name = kwds.get("manager", "_default_")
+ self.exchange = LwrExchange(self.url, self.manager_name)
+ self.thread = None
+ self.active = True
+
+ def listen_for_job_completes(self, callback):
+ # TODO: Call this from LWR runner.
+ def callback_wrapper(body, message):
+ callback(body)
+ message.ack()
+
+ def run():
+ self.exchange.consume("complete", callback_wrapper, check=self)
+
+ t = Thread(
+ name="lwr_client_%s_complete_callback" % self.manager_name,
+ target=run
+ )
+ t.daemon = False # Lets not interrupt processing of this.
+ t.start()
+ self.thread = t
+
+ def shutdown(self):
+ self.active = False
+
+ def __nonzero__(self):
+ return self.active
+
+ def get_client(self, destination_params, job_id):
+ destination_params = _parse_destination_params(destination_params)
+ return MessageJobClient(destination_params, job_id, self.exchange)
class ObjectStoreClientManager(object):
@@ -163,7 +205,8 @@
if controller.response_type != 'file':
return controller.body(result)
else:
- from lwr.util import copy_to_path
+ # TODO: Add to Galaxy.
+ from galaxy.util import copy_to_path
with open(result, 'rb') as result_file:
copy_to_path(result_file, output_path)
@@ -221,6 +264,16 @@
t.start()
+def _parse_destination_params(destination_params):
+ try:
+ unicode_type = unicode
+ except NameError:
+ unicode_type = str
+ if isinstance(destination_params, str) or isinstance(destination_params, unicode_type):
+ destination_params = url_to_destination_params(destination_params)
+ return destination_params
+
+
def _environ_default_int(variable, default="0"):
val = getenv(variable, default)
int_val = int(default)
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/setup_handler.py
--- /dev/null
+++ b/lib/galaxy/jobs/runners/lwr_client/setup_handler.py
@@ -0,0 +1,103 @@
+import os
+from .util import filter_destination_params
+
+REMOTE_SYSTEM_PROPERTY_PREFIX = "remote_property_"
+
+
+def build(client, destination_args):
+ """ Build a SetupHandler object for client from destination parameters.
+ """
+ # Have defined a remote job directory, lets do the setup locally.
+ if client.job_directory:
+ handler = LocalSetupHandler(client, destination_args)
+ else:
+ handler = RemoteSetupHandler(client)
+ return handler
+
+
+class LocalSetupHandler(object):
+ """ Parse destination params to infer job setup parameters (input/output
+ directories, etc...). Default is to get this configuration data from the
+ remote LWR server.
+
+ Downside of this approach is that it requires more and more dependent
+ configuraiton of Galaxy. Upside is that it is asynchronous and thus makes
+ message queue driven configurations possible.
+
+ Remote system properties (such as galaxy_home) can be specified in
+ destination args by prefixing property with remote_property_ (e.g.
+ remote_property_galaxy_home).
+ """
+
+ def __init__(self, client, destination_args):
+ self.client = client
+ system_properties = self.__build_system_properties(destination_args)
+ system_properties["sep"] = client.job_directory.separator
+ self.system_properties = system_properties
+ self.jobs_directory = destination_args["jobs_directory"]
+
+ def setup(self, job_id, tool_id=None, tool_version=None):
+ return build_job_config(
+ job_id=job_id,
+ job_directory=self.client.job_directory,
+ system_properties=self.system_properties,
+ tool_id=tool_id,
+ tool_version=tool_version,
+ )
+
+ @property
+ def local(self):
+ """
+ """
+ return True
+
+ def __build_system_properties(self, destination_params):
+ return filter_destination_params(destination_params, REMOTE_SYSTEM_PROPERTY_PREFIX)
+
+
+class RemoteSetupHandler(object):
+ """ Default behavior. Fetch setup information from remote LWR server.
+ """
+ def __init__(self, client):
+ self.client = client
+
+ def setup(self, **setup_args):
+ return self.client.remote_setup(**setup_args)
+
+ @property
+ def local(self):
+ """
+ """
+ return False
+
+
+def build_job_config(job_id, job_directory, system_properties={}, tool_id=None, tool_version=None):
+ """
+ """
+ inputs_directory = job_directory.inputs_directory()
+ working_directory = job_directory.working_directory()
+ outputs_directory = job_directory.outputs_directory()
+ configs_directory = job_directory.configs_directory()
+ tools_directory = job_directory.tool_files_directory()
+ unstructured_files_directory = job_directory.unstructured_files_directory()
+ sep = system_properties.get("sep", os.sep)
+ job_config = {
+ "working_directory": working_directory,
+ "outputs_directory": outputs_directory,
+ "configs_directory": configs_directory,
+ "tools_directory": tools_directory,
+ "inputs_directory": inputs_directory,
+ "unstructured_files_directory": unstructured_files_directory,
+ # Poorly named legacy attribute. Drop at some point.
+ "path_separator": sep,
+ "job_id": job_id,
+ "system_properties": system_properties,
+ }
+ if tool_id:
+ job_config["tool_id"] = tool_id
+ if tool_version:
+ job_config["tool_version"] = tool_version
+ return job_config
+
+
+__all__ = [build_job_config, build]
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/staging/__init__.py
--- a/lib/galaxy/jobs/runners/lwr_client/staging/__init__.py
+++ b/lib/galaxy/jobs/runners/lwr_client/staging/__init__.py
@@ -14,15 +14,20 @@
**Parameters**
command_line : str
- The local command line to execute, this will be rewritten for the remote server.
+ The local command line to execute, this will be rewritten for
+ the remote server.
config_files : list
- List of Galaxy 'configfile's produced for this job. These will be rewritten and sent to remote server.
+ List of Galaxy 'configfile's produced for this job. These will
+ be rewritten and sent to remote server.
input_files : list
- List of input files used by job. These will be transferred and references rewritten.
- output_files : list
- List of output_files produced by job.
+ List of input files used by job. These will be transferred and
+ references rewritten.
+ client_outputs : ClientOutputs
+ Description of outputs produced by job (at least output files along
+ with optional version string and working directory outputs.
tool_dir : str
- Directory containing tool to execute (if a wrapper is used, it will be transferred to remote server).
+ Directory containing tool to execute (if a wrapper is used, it will
+ be transferred to remote server).
working_directory : str
Local path created by Galaxy for running this job.
requirements : list
@@ -46,10 +51,9 @@
command_line,
config_files,
input_files,
- output_files,
+ client_outputs,
working_directory,
requirements,
- version_file=None,
arbitrary_files=None,
rewrite_paths=True,
):
@@ -57,38 +61,74 @@
self.command_line = command_line
self.config_files = config_files
self.input_files = input_files
- self.output_files = output_files
+ self.client_outputs = client_outputs
self.working_directory = working_directory
self.requirements = requirements
- self.version_file = version_file
self.rewrite_paths = rewrite_paths
self.arbitrary_files = arbitrary_files or {}
+ @property
+ def output_files(self):
+ return self.client_outputs.output_files
-class GalaxyOutputs(object):
+ @property
+ def version_file(self):
+ return self.client_outputs.version_file
+
+
+class ClientOutputs(object):
""" Abstraction describing the output datasets EXPECTED by the Galaxy job
- runner client. """
+ runner client.
+ """
- def __init__(self, working_directory, work_dir_outputs, output_files, version_file):
+ def __init__(self, working_directory, output_files, work_dir_outputs=None, version_file=None):
self.working_directory = working_directory
self.work_dir_outputs = work_dir_outputs
self.output_files = output_files
self.version_file = version_file
+ def to_dict(self):
+ return dict(
+ working_directory=self.working_directory,
+ work_dir_outputs=self.work_dir_outputs,
+ output_files=self.output_files,
+ version_file=self.version_file
+ )
+
+ @staticmethod
+ def from_dict(config_dict):
+ return ClientOutputs(
+ working_directory=config_dict.get('working_directory'),
+ work_dir_outputs=config_dict.get('work_dir_outputs'),
+ output_files=config_dict.get('output_files'),
+ version_file=config_dict.get('version_file'),
+ )
+
class LwrOutputs(object):
""" Abstraction describing the output files PRODUCED by the remote LWR
server. """
- def __init__(self, complete_response):
+ def __init__(self, working_directory_contents, output_directory_contents, remote_separator=sep):
+ self.working_directory_contents = working_directory_contents
+ self.output_directory_contents = output_directory_contents
+ self.path_helper = PathHelper(remote_separator)
+
+ @staticmethod
+ def from_status_response(complete_response):
# Default to None instead of [] to distinguish between empty contents and it not set
# by the LWR - older LWR instances will not set these in complete response.
- self.working_directory_contents = complete_response.get("working_directory_contents", None)
- self.output_directory_contents = complete_response.get("outputs_directory_contents", None)
+ working_directory_contents = complete_response.get("working_directory_contents", None)
+ output_directory_contents = complete_response.get("outputs_directory_contents", None)
# Older (pre-2014) LWR servers will not include separator in response,
- #so this should only be used when reasoning about outputs in
- # subdirectories which was not previously supported.
- self.path_helper = PathHelper(complete_response.get("system_properties", {}).get("separator", sep))
+ # so this should only be used when reasoning about outputs in
+ # subdirectories (which was not previously supported prior to that).
+ remote_separator = complete_response.get("system_properties", {}).get("separator", sep)
+ return LwrOutputs(
+ working_directory_contents,
+ output_directory_contents,
+ remote_separator
+ )
def has_output_file(self, output_file):
if self.output_directory_contents is None:
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/staging/down.py
--- a/lib/galaxy/jobs/runners/lwr_client/staging/down.py
+++ b/lib/galaxy/jobs/runners/lwr_client/staging/down.py
@@ -17,111 +17,144 @@
COPY_FROM_WORKING_DIRECTORY_PATTERN = compile(r"primary_.*|galaxy.json|metadata_.*|dataset_\d+\.dat|dataset_\d+_files.+")
-def finish_job(client, cleanup_job, job_completed_normally, galaxy_outputs, lwr_outputs):
+def finish_job(client, cleanup_job, job_completed_normally, client_outputs, lwr_outputs):
""" Responsible for downloading results from remote server and cleaning up
LWR staging directory (if needed.)
"""
- download_failure_exceptions = []
+ collection_failure_exceptions = []
if job_completed_normally:
- downloader = ResultsDownloader(client, galaxy_outputs, lwr_outputs)
- download_failure_exceptions = downloader.download()
- return __clean(download_failure_exceptions, cleanup_job, client)
+ output_collector = ClientOutputCollector(client)
+ action_mapper = FileActionMapper(client)
+ results_stager = ResultsCollector(output_collector, action_mapper, client_outputs, lwr_outputs)
+ collection_failure_exceptions = results_stager.collect()
+ __clean(collection_failure_exceptions, cleanup_job, client)
+ return collection_failure_exceptions
-class ResultsDownloader(object):
+class ClientOutputCollector(object):
- def __init__(self, client, galaxy_outputs, lwr_outputs):
+ def __init__(self, client):
self.client = client
- self.galaxy_outputs = galaxy_outputs
+
+ def collect_output(self, results_collector, output_type, action, name):
+ # This output should have been handled by the LWR.
+ if not action.staging_action_local:
+ return False
+
+ path = action.path
+ if output_type == 'legacy':
+ working_directory = results_collector.client_outputs.working_directory
+ self.client.fetch_output_legacy(path, working_directory, action_type=action.action_type)
+ elif output_type == 'output_workdir':
+ working_directory = results_collector.client_outputs.working_directory
+ self.client.fetch_work_dir_output(name, working_directory, path, action_type=action.action_type)
+ elif output_type == 'output':
+ self.client.fetch_output(path=path, name=name, action_type=action.action_type)
+ return True
+
+
+class ResultsCollector(object):
+
+ def __init__(self, output_collector, action_mapper, client_outputs, lwr_outputs):
+ self.output_collector = output_collector
+ self.action_mapper = action_mapper
+ self.client_outputs = client_outputs
self.lwr_outputs = lwr_outputs
- self.action_mapper = FileActionMapper(client)
self.downloaded_working_directory_files = []
self.exception_tracker = DownloadExceptionTracker()
- self.output_files = galaxy_outputs.output_files
+ self.output_files = client_outputs.output_files
self.working_directory_contents = lwr_outputs.working_directory_contents or []
- def download(self):
- self.__download_working_directory_outputs()
- self.__download_outputs()
- self.__download_version_file()
- self.__download_other_working_directory_files()
- return self.exception_tracker.download_failure_exceptions
+ def collect(self):
+ self.__collect_working_directory_outputs()
+ self.__collect_outputs()
+ self.__collect_version_file()
+ self.__collect_other_working_directory_files()
+ return self.exception_tracker.collection_failure_exceptions
- def __download_working_directory_outputs(self):
- working_directory = self.galaxy_outputs.working_directory
+ def __collect_working_directory_outputs(self):
+ working_directory = self.client_outputs.working_directory
# Fetch explicit working directory outputs.
- for source_file, output_file in self.galaxy_outputs.work_dir_outputs:
+ for source_file, output_file in self.client_outputs.work_dir_outputs:
name = relpath(source_file, working_directory)
- remote_name = self.lwr_outputs.path_helper.remote_name(name)
- with self.exception_tracker():
- action = self.action_mapper.action(output_file, 'output_workdir')
- self.client.fetch_work_dir_output(remote_name, working_directory, output_file, action_type=action.action_type)
- self.downloaded_working_directory_files.append(remote_name)
+ lwr_name = self.lwr_outputs.path_helper.remote_name(name)
+ if self._attempt_collect_output('output_workdir', path=output_file, name=lwr_name):
+ self.downloaded_working_directory_files.append(lwr_name)
# Remove from full output_files list so don't try to download directly.
self.output_files.remove(output_file)
- def __download_outputs(self):
+ def __collect_outputs(self):
# Legacy LWR not returning list of files, iterate over the list of
# expected outputs for tool.
for output_file in self.output_files:
- # Fetch ouptut directly...
- with self.exception_tracker():
- action = self.action_mapper.action(output_file, 'output')
- output_generated = self.lwr_outputs.has_output_file(output_file)
- working_directory = self.galaxy_outputs.working_directory
- if output_generated is None:
- self.client.fetch_output_legacy(output_file, working_directory, action_type=action.action_type)
- elif output_generated:
- self.client.fetch_output(output_file, action_type=action.action_type)
+ # Fetch output directly...
+ output_generated = self.lwr_outputs.has_output_file(output_file)
+ if output_generated is None:
+ self._attempt_collect_output('legacy', output_file)
+ elif output_generated:
+ self._attempt_collect_output('output', output_file)
- for local_path, remote_name in self.lwr_outputs.output_extras(output_file).iteritems():
- with self.exception_tracker():
- action = self.action_mapper.action(local_path, 'output')
- self.client.fetch_output(path=local_path, name=remote_name, action_type=action.action_type)
+ for galaxy_path, lwr_name in self.lwr_outputs.output_extras(output_file).iteritems():
+ self._attempt_collect_output('output', path=galaxy_path, name=lwr_name)
# else not output generated, do not attempt download.
- def __download_version_file(self):
- version_file = self.galaxy_outputs.version_file
+ def __collect_version_file(self):
+ version_file = self.client_outputs.version_file
# output_directory_contents may be none for legacy LWR servers.
lwr_output_directory_contents = (self.lwr_outputs.output_directory_contents or [])
if version_file and COMMAND_VERSION_FILENAME in lwr_output_directory_contents:
- action = self.action_mapper.action(version_file, 'output')
- self.client.fetch_output(path=version_file, name=COMMAND_VERSION_FILENAME, action_type=action.action_type)
+ self._attempt_collect_output('output', version_file, name=COMMAND_VERSION_FILENAME)
- def __download_other_working_directory_files(self):
- working_directory = self.galaxy_outputs.working_directory
+ def __collect_other_working_directory_files(self):
+ working_directory = self.client_outputs.working_directory
# Fetch remaining working directory outputs of interest.
for name in self.working_directory_contents:
if name in self.downloaded_working_directory_files:
continue
if COPY_FROM_WORKING_DIRECTORY_PATTERN.match(name):
- with self.exception_tracker():
- output_file = join(working_directory, self.lwr_outputs.path_helper.local_name(name))
- action = self.action_mapper.action(output_file, 'output_workdir')
- self.client.fetch_work_dir_output(name, working_directory, output_file, action_type=action.action_type)
+ output_file = join(working_directory, self.lwr_outputs.path_helper.local_name(name))
+ if self._attempt_collect_output(output_type='output_workdir', path=output_file, name=name):
self.downloaded_working_directory_files.append(name)
+ def _attempt_collect_output(self, output_type, path, name=None):
+ # path is final path on galaxy server (client)
+ # name is the 'name' of the file on the LWR server (possible a relative)
+ # path.
+ collected = False
+ with self.exception_tracker():
+ # output_action_type cannot be 'legacy' but output_type may be
+ # eventually drop support for legacy mode (where type wasn't known)
+ # ahead of time.
+ output_action_type = 'output_workdir' if output_type == 'output_workdir' else 'output'
+ action = self.action_mapper.action(path, output_action_type)
+ if self._collect_output(output_type, action, name):
+ collected = True
+
+ return collected
+
+ def _collect_output(self, output_type, action, name):
+ return self.output_collector.collect_output(self, output_type, action, name)
+
class DownloadExceptionTracker(object):
def __init__(self):
- self.download_failure_exceptions = []
+ self.collection_failure_exceptions = []
@contextmanager
def __call__(self):
try:
yield
except Exception as e:
- self.download_failure_exceptions.append(e)
+ self.collection_failure_exceptions.append(e)
-def __clean(download_failure_exceptions, cleanup_job, client):
- failed = (len(download_failure_exceptions) > 0)
+def __clean(collection_failure_exceptions, cleanup_job, client):
+ failed = (len(collection_failure_exceptions) > 0)
if (not failed and cleanup_job != "never") or cleanup_job == "always":
try:
client.clean()
- except:
+ except Exception:
log.warn("Failed to cleanup remote LWR job")
- return failed
__all__ = [finish_job]
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/staging/up.py
--- a/lib/galaxy/jobs/runners/lwr_client/staging/up.py
+++ b/lib/galaxy/jobs/runners/lwr_client/staging/up.py
@@ -8,6 +8,7 @@
from ..staging import COMMAND_VERSION_FILENAME
from ..action_mapper import FileActionMapper
from ..action_mapper import path_type
+from ..action_mapper import MessageAction
from ..util import PathHelper
from ..util import directory_files
@@ -21,7 +22,24 @@
file_stager = FileStager(client, client_job_description, job_config)
rebuilt_command_line = file_stager.get_command_line()
job_id = file_stager.job_id
- client.launch(rebuilt_command_line, requirements=client_job_description.requirements)
+ launch_kwds = dict(
+ command_line=rebuilt_command_line,
+ requirements=client_job_description.requirements,
+ )
+ if file_stager.job_config:
+ launch_kwds["job_config"] = file_stager.job_config
+ remote_staging = {}
+ remote_staging_actions = file_stager.transfer_tracker.remote_staging_actions
+ if remote_staging_actions:
+ remote_staging["setup"] = remote_staging_actions
+ # Somehow make the following optional.
+ remote_staging["action_mapper"] = file_stager.action_mapper.to_dict()
+ remote_staging["client_outputs"] = client_job_description.client_outputs.to_dict()
+
+ if remote_staging:
+ launch_kwds["remote_staging"] = remote_staging
+
+ client.launch(**launch_kwds)
return job_id
@@ -100,6 +118,7 @@
# Remote LWR server assigned an id different than the
# Galaxy job id, update client to reflect this.
self.client.job_id = self.job_id
+ self.job_config = job_config
def __parse_remote_separator(self, job_config):
separator = job_config.get("system_properties", {}).get("separator", None)
@@ -195,7 +214,7 @@
def __upload_rewritten_config_files(self):
for config_file, new_config_contents in self.job_inputs.config_files.items():
- self.client.put_file(config_file, input_type='config', contents=new_config_contents)
+ self.transfer_tracker.handle_transfer(config_file, type='config', contents=new_config_contents)
def get_command_line(self):
"""
@@ -317,29 +336,48 @@
self.job_inputs = job_inputs
self.rewrite_paths = rewrite_paths
self.file_renames = {}
+ self.remote_staging_actions = []
def handle_transfer(self, path, type, name=None, contents=None):
+ action = self.__action_for_transfer(path, type, contents)
+
+ if action.staging_needed:
+ local_action = action.staging_action_local
+ if local_action:
+ response = self.client.put_file(path, type, name=name, contents=contents)
+ get_path = lambda: response['path']
+ else:
+ job_directory = self.client.job_directory
+ assert job_directory, "job directory required for action %s" % action
+ if not name:
+ name = basename(path)
+ self.__add_remote_staging_input(action, name, type)
+ get_path = lambda: job_directory.calculate_path(name, type)
+ register = self.rewrite_paths or type == 'tool' # Even if inputs not rewritten, tool must be.
+ if register:
+ self.register_rewrite(path, get_path(), type, force=True)
+ # else: # No action for this file
+
+ def __add_remote_staging_input(self, action, name, type):
+ input_dict = dict(
+ name=name,
+ type=type,
+ action=action.to_dict(),
+ )
+ self.remote_staging_actions.append(input_dict)
+
+ def __action_for_transfer(self, path, type, contents):
if contents:
# If contents loaded in memory, no need to write out file and copy,
# just transfer.
- action_type = 'transfer'
+ action = MessageAction(contents=contents, client=self.client)
else:
if not exists(path):
message = "handle_tranfer called on non-existent file - [%s]" % path
log.warn(message)
raise Exception(message)
- action_type = self.__action(path, type).action_type
-
- if action_type in ['transfer', 'copy']:
- response = self.client.put_file(path, type, name=name, contents=contents)
- register = self.rewrite_paths or type == 'tool' # Even if inputs not rewritten, tool must be.
- if register:
- self.register_rewrite(path, response['path'], type, force=True)
- elif action_type == 'none':
- # No action for this file.
- pass
- else:
- raise Exception("Unknown action type (%s) encountered for path (%s)" % (action_type, path))
+ action = self.__action(path, type)
+ return action
def register_rewrite(self, local_path, remote_path, type, force=False):
action = self.__action(local_path, type)
diff -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 -r 423a2939e224a294ded5842daa485da0a007fcbb lib/galaxy/jobs/runners/lwr_client/util.py
--- a/lib/galaxy/jobs/runners/lwr_client/util.py
+++ b/lib/galaxy/jobs/runners/lwr_client/util.py
@@ -46,6 +46,13 @@
return contents
+def filter_destination_params(destination_params, prefix):
+ destination_params = destination_params or {}
+ return dict([(key[len(prefix):], destination_params[key])
+ for key in destination_params
+ if key.startswith(prefix)])
+
+
class PathHelper(object):
'''
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: martenson: admin/users: show time created and activated status columns to help admins to manage users
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/11744e84d4d2/
Changeset: 11744e84d4d2
User: martenson
Date: 2014-02-17 19:58:55
Summary: admin/users: show time created and activated status columns to help admins to manage users
Affected #: 1 file
diff -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a -r 11744e84d4d2389a28ff8e1929d3b4f5eafb21f0 lib/galaxy/webapps/galaxy/controllers/admin.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin.py
@@ -56,6 +56,15 @@
if user.galaxy_sessions:
return self.format( user.galaxy_sessions[ 0 ].update_time )
return 'never'
+ class TimeCreatedColumn( grids.GridColumn ):
+ def get_value( self, trans, grid, user ):
+ return user.create_time.strftime('%x')
+ class ActivatedColumn( grids.GridColumn ):
+ def get_value( self, trans, grid, user ):
+ if user.active:
+ return 'Y'
+ else:
+ return 'N'
# Grid definition
title = "Users"
@@ -79,6 +88,8 @@
ExternalColumn( "External", attach_popup=False ),
LastLoginColumn( "Last Login", format=time_ago ),
StatusColumn( "Status", attach_popup=False ),
+ TimeCreatedColumn( "Created", attach_popup=False ),
+ ActivatedColumn( "Activated", attach_popup=False ),
# Columns that are valid for filtering but are not visible.
grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
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: inithello: Remove tool that was migrated to the tool shed in 10719:c2f06b5cfba1. Remove test data that belonged to tools that were removed in 12288:401ee23dcf2f.
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f68bd3660813/
Changeset: f68bd3660813
User: inithello
Date: 2014-02-17 19:05:00
Summary: Remove tool that was migrated to the tool shed in 10719:c2f06b5cfba1. Remove test data that belonged to tools that were removed in 12288:401ee23dcf2f.
Affected #: 34 files
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/branchlength_in.fasta
--- a/test-data/branchlength_in.fasta
+++ /dev/null
@@ -1,44 +0,0 @@
->hg17.chr7(+):26907301-26907310|hg17_0
-GTGGGAGGT
->panTro1.chr6(+):28037319-28037328|panTro1_0
-GTGGGAGGT
->mm5.chr6(+):52104022-52104031|mm5_0
-GTGGGAGGT
->rn3.chr4(+):80734395-80734404|rn3_0
-GTGGGAGGT
->canFam1.chr14(+):42826409-42826418|canFam1_0
-GTGGGAGGT
-
->hg17.chr7(+):26907310-26907326|hg17_1
-AGTCAGAGTGTCTGAG
->panTro1.chr6(+):28037328-28037344|panTro1_1
-AGTCAGAGTGTCTGAG
->mm5.chr6(+):52104031-52104047|mm5_1
-AGTCAGAGTGTCTGAG
->rn3.chr4(+):80734404-80734420|rn3_1
-AGTCAGAGTATCTGAG
->canFam1.chr14(+):42826418-42826434|canFam1_1
-AGTCAGAGTGTCTGAG
-
->hg17.chr7(+):26907326-26907338|hg17_2
-GTAGAAGACCCC
->panTro1.chr6(+):28037344-28037356|panTro1_2
-GTAGAAGACCCC
->mm5.chr6(+):52104047-52104059|mm5_2
-GTAGACGATGCC
->rn3.chr4(+):80734420-80734432|rn3_2
-GTAGATGATGCG
->canFam1.chr14(+):42826434-42826446|canFam1_2
-GTAGAAGACCCC
-
->hg17.chr7(+):26907338-26907654|hg17_3
-GGGGAAGGAACGCAGGGCGAAGAGCTGGACTTCTCTGAGGAT---TCCTCGGCCTTCTCGT-----CGTTTCCTGG----CGGGGTGGCCGGAGAGATGGGCAAGAGACCCTCCTTCTCACGTTTCTTTTGCTTCATTCGGCGGTTCTGGAACCAGATCTTCACTTGGGTCTCGTTGAGCTGCAGGGATGCAGCGATCTCCACCCTGCGGGCGCGCGTCAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGTTCCGTGAGCTGCTTGGTAGTGAAGTTGGTGCGCACCGCGTTGGGTTGACCCAGGTAGCCGTACTCTCCAACTTTCC
->panTro1.chr6(+):28037356-28037672|panTro1_3
-GGGGAAGGAACGCAGGGCGAAGAGCTGGACTTCTCTGAGGAT---TCCTCGGCCTTCTCGT-----CGTTTCCTGG----CGGGGTGGCCGGAGAGATGGGCAAGAGACCCTCCTTCTCACGTTTCTTTTGCTTCATTCGGCGGTTCTGGAACCAGATCTTCACTTGGGTCTCGTTGAGCTGCAGGGATGCAGCGATCTCCACCCTGCGGGCGCGCGTCAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGTTCCGTGAGCTGCTTGGTAGTGAAGTTGGTGCGCACCGCGTTGGGTTGACCCAGGTAGCCGTACTCTCCAACTTTCC
->mm5.chr6(+):52104059-52104375|mm5_3
-GGAGAAGGGGCACTGGGCGAGGGGCTAGATTTCTCAGATGAT---TCTTCCGTTTTCTCAT-----CGCTGCCAGG----AGGAGTGGCAGGGGAGATGGGCAGGAGCCCCTCCTTCTCACGCTTCTTCTGCTTCATGCGGCGATTCTGGAACCAGATCTTCACCTGGGTCTCATTGAGCTGTAGGGACGCGGCAATCTCCACCCTGCGCGCTCGTGTAAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGCTCTGTGAGCTGCTTGGTGGTGAAATTGGTGCGCACTGCGTTGGGTTGACCCACGTAGCCGTACTCTCCAACTTTCC
->rn3.chr4(+):80734432-80734748|rn3_3
-GGAGAAGGGGCGCTGGGCGAGGAGCTGGATTTCTCAGATGAT---TCTTCAGTTTTCTCAT-----CGCTTCCAGG----AGGGGTGGCGGGTGAAATGGGCAAGAGCCCCTCTTTCTCGCGCTTCTTCTGCTTCATGCGGCGATTCTGGAACCAGATCTTCACCTGGGTCTCATTGAGTTGCAGGGACGCGGCTATCTCCACCCTGCGGGCTCTTGTTAGGTACTTGTTGAAGTGGAACTCCTTCTCCAGCTCTGTGAGCTGCTTGGTGGTGAAGTTGGTGCGCACTGCGTTGGGTTGACCCACGTAGCCATACTCTCCAACTTTCC
->canFam1.chr14(+):42826446-42826762|canFam1_3
-GGAGACGGAATGCAGGGCGAGGAGCTGGATTTCTCTGAAGAT---TCCTCCGCCTTCTCCT-----CACTTCCTGG----CGGGGTGGCAGGGGAGATGGGCAAAAGGCCCTCTTTCTCTCGTTTCTTCTGCTTCATCCGGCGGTTCTGGAACCAGATCTTCACCTGGGTCTCGTTGAGCTGCAGGGATGCTGCGATCTCCACCCTGCGGGCGCGGGTCAGATACTTATTGAAGTGGAACTCCTTTTCCAGCTCGGTGAGCTGCTTGGTGGTGAAGTTGGTACGCACTGCATTCGGTTGACCCACGTAGCCGTACTCTCCAACTTTCC
-
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/branchlength_out.tabular
--- a/test-data/branchlength_out.tabular
+++ /dev/null
@@ -1,33 +0,0 @@
-Block Branch Length LowerBound UpperBound
-1 hg17.chr7(+):26907301-26907310|hg17_0 0 0 0.235398
-1 panTro1.chr6(+):28037319-28037328|panTro1_0 0 0 0.235398
-1 Node1 0 0 0.235398
-1 mm5.chr6(+):52104022-52104031|mm5_0 0 0 0.235398
-1 rn3.chr4(+):80734395-80734404|rn3_0 0 0 0.235398
-1 Node4 0 0 0.235398
-1 canFam1.chr14(+):42826409-42826418|canFam1_0 0 0 0.235398
-1 Total Tree 0 0 0
-2 hg17.chr7(+):26907310-26907326|hg17_1 0 0 0.13592
-2 panTro1.chr6(+):28037328-28037344|panTro1_1 0 0 0.13592
-2 Node1 0 0 0.13592
-2 mm5.chr6(+):52104031-52104047|mm5_1 0 0 0.13592
-2 rn3.chr4(+):80734404-80734420|rn3_1 0.069102 0.00372954 0.421886
-2 Node4 0 0 0.13592
-2 canFam1.chr14(+):42826418-42826434|canFam1_1 0 0 0.13592
-2 Total Tree 0.069102 0.00372954 0.421893
-3 hg17.chr7(+):26907326-26907338|hg17_2 0 0 0.167602
-3 panTro1.chr6(+):28037344-28037356|panTro1_2 0 0 0.167602
-3 Node1 0 0 0.167602
-3 mm5.chr6(+):52104047-52104059|mm5_2 0 0 0.250304
-3 rn3.chr4(+):80734420-80734432|rn3_2 0.198834 0.0311152 0.746578
-3 Node4 0.3077 0.0691968 1.10319
-3 canFam1.chr14(+):42826434-42826446|canFam1_2 0 0 0.167602
-3 Total Tree 0.506533 0.169204 1.27895
-4 hg17.chr7(+):26907338-26907654|hg17_3 0 0 0.0061265
-4 panTro1.chr6(+):28037356-28037672|panTro1_3 0 0 0.0061265
-4 Node1 0.058307 0.0318704 0.0951274
-4 mm5.chr6(+):52104059-52104375|mm5_3 0.0357629 0.0167852 0.0644078
-4 rn3.chr4(+):80734432-80734748|rn3_3 0.0320295 0.0141343 0.0594854
-4 Node4 0.0770194 0.0463495 0.118484
-4 canFam1.chr14(+):42826446-42826762|canFam1_3 0.0575357 0.0316289 0.0936537
-4 Total Tree 0.260654 0.205256 0.325686
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in1.pileup
--- a/test-data/column_join_in1.pileup
+++ /dev/null
@@ -1,30 +0,0 @@
-chrM 1 A G 25 0 25 1 ^:. I
-chrM 2 C T 25 0 25 2 .N I$
-chrM 3 T G 27 0 25 2 .. II
-chrM 4 G C 36 0 25 3 .^:.^:. II+
-chrM 5 T A 38 0 25 3 ... III
-chrM 6 T A 39 0 25 4 .N.. I$II
-chrM 7 G C 43 0 25 5 ...^:.^:. IIIII
-chrM 8 A C 46 0 25 6 .....^:. IIIIII
-chrM 9 T G 53 0 25 8 ..G...^:.^:. IIIII$II
-chrM 10 T G 56 0 25 9 ........^:. IIIIIIIII
-chrM 11 C G 57 0 25 10 .........^:. IIIIIIIIII
-chrM 12 T C 61 0 25 11 ..........^:. IIIIIIIIIII
-chrM 13 T G 79 0 25 15 .........^:.^:.^:.^:.^:.^:. IIIIIIIIIIII#II
-chrM 14 A C 58 0 25 18 .......G.........^:. BIIIIIII+IIIIIIIII
-chrM 15 G A 87 0 25 19 ..N...............^:.^:. DIIIIII$(IIIIIIIIIII
-chrM 16 G C 88 0 25 20 .........N.......... IIIIIIIIIIIIIIIIIIII
-chrM 17 A C 88 0 25 20 .........G.......... 9IIIIIIIIIIIIIIIIIII
-chrM 18 G A 89 0 25 20 ...A................ @IIIIIIIIIIIIIIIIIII
-chrM 19 G T 58 0 25 20 ....T.............GG IIIIIIIIIIIIIIIIII'A
-chrM 20 T C 55 0 25 20 .........C........C. IIIIIIIIIIIIIII2II#$
-chrM 21 C T 87 0 25 20 ..........G......... IIIIIIIIIIIIIIIIIIII
-chrM 22 C A 87 0 25 20 ..........N......... IIIIIIIIIIIIIIAIIIII
-chrM 23 A G 87 0 25 20 .....T.............. 9IIIIIIIIII0IIIIIIII
-chrM 24 A T 89 0 25 20 .....N..N........... III$IIII"IIIIICII#II
-chrM 25 G A 57 0 25 21 ...A................^:. A@.$IIIIIIIFIIIIIIIII
-chrM 26 C G 58 0 25 22 ...N....A............. IIHIDII&IIIIII@IIIIII
-chrM 27 T A 99 0 25 23 ....................^:.^:.^:. IE8IFIII9IIIIIIIIIIIIII
-chrM 28 A C 99 0 25 24 ..G..................... 1FIIIIIIIIIIIIIIIIDEIIII
-chrM 29 G C 58 0 25 25 ........C.........NN.... ;IIIIII+HII=III$III""IIII
-chrM 30 T T 65 0 25 25 ...C....................^:. ;I?&IAI0IIIIIIIIIIIIIIIII
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in10.pileup
--- a/test-data/column_join_in10.pileup
+++ /dev/null
@@ -1,26 +0,0 @@
-0610009D07Rik 2 1.41 1.41 -0.24 12/12 2 1
-1110002N22Rik 2 1.70 1.70 -0.06 10/12 2 1
-1110008L16Rik 3 1.73 1.73 -0.54 12/12 2 1
-1110054O05Rik 1 1.55 1.55 1.14 5/12 1 1
-Actg1 2 4.24 4.24 2.36 4/12 2 1
-Actl6a 2 1.55 1.55 1.00 10/12 1 1
-Actn1 1 3.46 3.46 3.17 1/12 1 1
-Actn4 1 3.46 3.46 3.17 1/12 1 1
-Bnc2 1 2.00 2.00 1.67 3/12 1 1
-Bub3 2 1.89 1.89 1.02 9/12 2 1
-Cad 4 4.90 4.90 3.09 2/12 1 1
-Calm1;Calm3;Calm2 2 2.83 2.83 2.57 3/12 1 1
-E130012A19Rik 2 5.66 5.66 1.50 3/12 2 1
-E2f6 2 3.39 3.39 1.80 5/12 2 1
-Gm12620 1 3.46 3.46 3.17 1/12 1 1
-Gm13092;LOC677017 1 1.15 1.15 0.29 9/12 1 1
-Gm14173;Rpl37a;Gm4149 1 3.00 3.00 1.37 4/12 2 1
-Gm14393;2210418O10Rik;Gm14296;Gm14401;RP23-330D3.5 1 3.46 3.46 3.17 1/12 1 1
-Gm189 1 1.20 1.20 0.16 10/12 2 1
-Sfrs7 1 1.71 1.71 0.18 7/12 2 1
-Sin3a 1 1.71 1.71 -0.12 7/12 2 1
-Ski 1 2.45 2.45 2.13 2/12 1 1
-Skil 1 2.00 2.00 1.03 3/12 1 1
-Tubb2c 1 2.00 2.00 1.67 3/12 1 1
-Tubb2c-ps1 1 12.00 12.00 3.17 1/12 2 1
-Zscan4f 2 1.70 1.70 1.00 10/12 2 1
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in11.pileup
--- a/test-data/column_join_in11.pileup
+++ /dev/null
@@ -1,36 +0,0 @@
-0610009D07Rik 3 1.73 1.73 1.15 12/12 2 1
-0610010K14Rik 1 1.41 1.41 0.96 6/12 1 1
-1110002N22Rik 3 2.08 2.08 0.74 10/12 2 1
-1110008L16Rik 1 1.00 1.00 -1.35 12/12 1 1
-Acta1 2 1.54 1.54 0.63 11/12 2 1
-Actb 1 1.33 1.33 0.00 9/12 2 1
-Actg1 1 3.00 3.00 0.87 4/12 2 1
-Actl6a 1 1.10 1.10 -0.33 10/12 1 1
-Actl6b 1 2.45 2.45 2.13 2/12 1 1
-Bnc2 1 2.00 2.00 1.67 3/12 1 1
-Bptf 1 3.46 3.46 3.17 1/12 1 1
-Brip1 1 1.22 1.22 -0.19 8/12 1 1
-Brms1l 1 12.00 12.00 3.17 1/12 2 1
-Btf3;Gm3531 1 2.00 2.00 1.67 3/12 1 1
-Bub3 3 2.00 2.00 2.13 9/12 1 1
-C330007P06Rik 1 2.45 2.45 2.13 2/12 1 1
-Cad 1 2.45 2.45 0.50 2/12 1 1
-Calm1;Calm3;Calm2 1 2.00 2.00 1.03 3/12 1 1
-Cbx1 2 3.39 3.39 2.24 5/12 2 1
-E2f6 1 2.40 2.40 0.53 5/12 2 1
-Eed 1 1.20 1.20 -0.47 10/12 2 1
-Gm10079 2 1.41 1.41 0.16 12/12 1 1
-Gm11230 2 1.48 1.48 1.21 11/12 1 1
-Gm13072;Trmt112 1 3.46 3.46 3.17 1/12 1 1
-Gm13092;LOC677017 1 1.33 1.33 0.29 9/12 2 1
-Gm14231 1 1.31 1.31 0.51 7/12 1 1
-Gm14456;Tpt1 1 2.00 2.00 1.67 3/12 1 1
-Gm15501;Rps8 1 1.55 1.55 1.14 5/12 1 1
-Gm189 1 1.20 1.20 0.16 10/12 2 1
-Sfrs11 3 1.73 1.73 1.15 12/12 2 1
-Sin3a 4 3.43 3.43 1.93 7/12 2 1
-Sirt7 1 2.00 2.00 1.67 3/12 1 1
-Skiv2l2 12 3.46 3.46 -0.72 12/12 2 1
-Tubb2b 4 2.00 2.00 0.49 12/12 2 1
-Zscan4e 1 1.41 1.41 0.63 6/12 1 1
-Zscan4f 2 1.70 1.70 1.00 10/12 2 1
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in12.pileup
--- a/test-data/column_join_in12.pileup
+++ /dev/null
@@ -1,36 +0,0 @@
-0610009D07Rik 4 2.00 2.00 2.54 12/12 2 1
-0610010K14Rik 1 1.41 1.41 0.96 6/12 1 1
-1110002N22Rik 2 1.70 1.70 -0.06 10/12 2 1
-1110008L16Rik 6 2.45 2.45 0.68 12/12 2 1
-1110037F02Rik 1 2.45 2.45 2.13 2/12 1 1
-1190005F20Rik 4 2.18 2.18 0.28 11/12 2 1
-Acot8 1 2.00 2.00 0.07 6/12 2 1
-Acta1 2 1.54 1.54 0.63 11/12 2 1
-Actb 2 1.89 1.89 1.35 9/12 2 1
-Actl6b 1 6.00 6.00 2.13 2/12 2 1
-Bend3 1 1.15 1.33 -0.51 9/12 1 1.33
-Bend5 1 3.46 3.46 3.17 1/12 1 1
-Brip1 2 1.73 1.73 0.58 8/12 1 1
-Btf3;Gm3531 1 4.00 4.00 1.67 3/12 2 1
-Bub3 1 1.33 1.33 -0.09 9/12 2 1
-C130039O16Rik 1 2.45 2.45 2.13 2/12 1 1
-C1d 1 1.73 1.73 0.87 4/12 1 1
-Caprin1 2 2.42 2.42 0.51 7/12 2 1
-Cbx3 2 1.54 1.54 0.75 11/12 2 1
-Eed 1 1.10 1.10 -0.47 10/12 1 1
-Efha1 1 3.46 3.46 3.17 1/12 1 1
-Exosc1 3 1.73 1.73 1.29 12/12 2 1
-Exosc10 25 5.00 5.00 1.03 12/12 2 1
-Gm189 2 1.70 1.70 2.12 10/12 2 1
-Gm3200 1 2.45 2.45 2.13 2/12 1 1
-Gm9855;Tdg 2 1.70 1.70 1.37 10/12 2 1
-Sfrs11 4 2.00 2.00 2.54 12/12 2 1
-Sfrs12 2 5.66 5.66 2.57 3/12 2 1
-Sin3a 1 1.31 1.31 -0.12 7/12 1 1
-Sirt7 1 2.00 2.00 1.67 3/12 1 1
-Skiv2l2 34 5.83 5.83 0.68 12/12 2 1
-Tubb2b 3 1.73 1.73 -0.10 12/12 2 1
-Tubb4 1 1.15 1.15 0.29 9/12 1 1
-Zscan4-ps2 1 12.00 12.00 3.17 1/12 2 1
-Zscan4e 2 2.83 2.83 2.12 6/12 2 1
-Zscan4f 2 1.70 1.70 1.00 10/12 2 1
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in13.tabular
--- a/test-data/column_join_in13.tabular
+++ /dev/null
@@ -1,6 +0,0 @@
-alpha beta gamma delta
-1 A I a i
-2 B II b ii
-5 C III c
-7 D IV d iii
-11 E V e iv
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in14.tabular
--- a/test-data/column_join_in14.tabular
+++ /dev/null
@@ -1,11 +0,0 @@
-alpha beta gamma delta epsilon
-1 AA I2 aa i2
-2 BB II2 bb
-3 CC III2 cc ii2
-4 DD IV2 dd iii2
-6 EE V2 ee iv2
-7 FF VI2 ff
-8 GG VII2 gg v2
-9 HH VIII2 hh vi2
-10 II IX2 ii vii2
-11 JJ X2 jj viii2
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in15.tabular
--- a/test-data/column_join_in15.tabular
+++ /dev/null
@@ -1,11 +0,0 @@
-alpha beta gamma
-2 BBB II3 bbb i3
-3 CCC III3 ccc ii3
-4 DDD IV2 ddd iii3
-5 EEE V3 eee
-6 FFF VI3 fff iv3
-7 GGG VII3 ggg v3
-8 HHH VIII3 hhh
-9 III IX3 iii vi3
-10 JJJ X3 jjj vii3
-11 LLL XI3 lll
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in2.pileup
--- a/test-data/column_join_in2.pileup
+++ /dev/null
@@ -1,30 +0,0 @@
-chrM 1 T G 25 0 25 1 ^:. I
-chrM 2 C A 25 0 25 1 . I
-chrM 3 C A 25 0 25 2 .. I+
-chrM 4 G A 36 0 25 3 .^:.^:. II+
-chrM 5 A T 36 0 25 3 ... IDI
-chrM 6 A G 36 0 25 4 ..T. IIBI
-chrM 7 C G 42 0 25 5 ...^:.^:. ID@II
-chrM 8 T T 45 0 25 6 .....^:. III$BI
-chrM 9 C A 51 0 25 8 ......^:.^:. $#III+III
-chrM 10 G G 54 0 25 9 ........^:. III$III#I
-chrM 11 T C 57 0 25 10 .........^:. IIIDBIIIII
-chrM 12 A T 60 0 25 11 ..........^:. IIIIIIIII$I
-chrM 13 A T 78 0 25 18 ..A.........^:.^:.^:.^:.^:.^:. III#$IIIIII+IIDIIB
-chrM 14 G A 56 0 25 19 ........T.........^:. BIIIIIII+IIII$IBIII
-chrM 15 G A 87 0 25 20 ..................^:.^:. DIIIIIII(IIIIIIIIIII
-chr1 1 T T 87 0 25 20 .............T...... IIIIIIIIIIII$DIIIIII
-chr1 2 A T 87 0 25 20 ......G............. 9IIIIIIIIIIIIICBIIII
-chr1 3 A G 87 0 25 20 ....A............... @IIIIIIIII#IIII#IIII
-chr1 4 A T 55 0 25 20 ..................GG IIIII@II$IIIIIIIII'A
-chr1 5 C A 54 0 25 20 .......A..........C. IIIIIIIIIDIIIII2II#$
-chr1 6 G T 87 0 25 20 .............A...... IIIIIIIBIIIIII#IIIII
-chr1 7 A C 87 0 25 20 ..........C......... IIIII+IIIIIIIIAIIIII
-chr1 8 G A 87 0 25 20 ....G.........T..... 9IIIIIIIIII0IIIIIIII
-chr1 9 A T 87 0 25 20 ........N........... IIII$III"IIIIICIIIII
-chr1 10 G A 57 0 25 21 ...A................^:. A@.$IIIIIIIFIIIIIIIII
-chr1 11 C A 57 0 25 22 ....G...A............. IIHIDII&IIIIII#III$II
-chr1 12 T A 99 0 25 24 .....................^:.^:.^:. IE8IFIII9IIIIIIIIIIIIIII
-chr1 13 A C 99 0 25 25 ...N..................... 1FIIIIIIIIIIIIIIIIDEII$II
-chr1 14 G C 55 0 25 25 ....G..............NN.... ;IIIBIII+HII=IIIIII""IIII
-chr1 15 T G 68 0 25 28 ...C.......N............^:. ;I?&IAI0IIIIIII@II#$II@II
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in3.pileup
--- a/test-data/column_join_in3.pileup
+++ /dev/null
@@ -1,30 +0,0 @@
-chr1 1 G G 25 0 25 1 ^:. I
-chr1 2 T T 25 0 25 1 . I
-chr1 3 T T 27 0 25 1 . I
-chr1 4 A A 36 0 25 2 .^:. I+
-chr1 5 A A 36 0 25 3 ... III
-chr1 6 T T 36 0 25 4 .N.. II#I
-chr1 7 G G 42 0 25 5 ...^:.^:. IIIII
-chr1 8 T T 45 0 25 6 .....^:. IIIIII
-chr1 9 A A 51 0 25 7 .....^:.^:. IBIIIII
-chr1 10 G G 54 0 25 9 ........^:. IIIIIIIII
-chr1 11 C C 57 0 25 10 .........^:. IIIIIIII"I
-chr1 12 T T 60 0 25 11 ..........^:. IIIIIIDIIII
-chr1 13 T T 78 0 25 17 ...........^:.^:.^:.^:.^:.^:. IIII"$IIIIIIIIIII
-chr1 14 A A 56 0 25 18 .......G.........^:. BIIIIIII+IIIIIIIII
-chr1 15 A A 87 0 25 20 ....N.............^:.^:. DIII$III(IIIIIIIIIII
-chr4 1 T T 90 0 25 20 ..........N......... IIIIIIIII$IIIIIIIIII
-chr4 2 A A 87 0 25 20 .......C............ 9IIIIIIIII"IIIIIIIII
-chr4 3 A A 34 0 25 20 ......G............. @IIIIIIIIIIII#IIIIII
-chr4 4 T T 55 0 25 21 ...........N.......GG IIIII@IIIIIIIIIIIII'A
-chr4 5 A A 54 0 25 21 ...N...............C. IIII"IIIIIIIIIII2II#$
-chr4 6 T T 87 0 25 21 ................N.... IIIIIIII$IIIIIIIIIIII
-chr4 7 A A 80 0 25 21 .....G............... III$IIIIIIIIIIIAIIIII
-chr4 8 A A 87 0 25 22 ..N................... 9IIIIIIIIII0IIIII"$III
-chr4 9 A A 87 0 25 22 .GG.......N........... IIII$IIIII"IIIIICIIIII
-chr4 10 G G 57 0 25 23 .....A................^:. A@.$IIIIIIIIIFIIIIIIIII
-chr4 11 C C 57 0 25 25 .......A.....GN.......... IIHIDII&III#IIIIIIIIIIIII
-chr4 12 A A 99 0 25 26 .......................^:.^:.^:. IE8IFIII9IIIIIII$IIIIIIIII
-chr4 13 A A 99 0 25 27 ........N.................. 1FIIIIII$IIIIIIIIIIIIDEIIII
-chr4 14 G G 55 0 25 28 ..N...................NN.... ;III$I#IIII+HII=IIIIII""IIII
-chr4 15 G G 68 0 25 30 ...C....N..G.................^:. ;I?&IAI0IIIIIII$#I$@IIIIIIIIII
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in4.pileup
--- a/test-data/column_join_in4.pileup
+++ /dev/null
@@ -1,25 +0,0 @@
-chr2 1 T 6 .C..., I$$III
-chr2 2 G 6 ..N.., III@II
-chr2 3 C 7 ..C..., I$IIIII
-chr2 4 G 7 .G...., I#IIIII
-chr2 5 G 7 ...N.., IIII#BI
-chr2 6 A 7 ..T..., I$IDIII
-chr2 7 T 8 ...C..., IIIBD$II
-chr2 8 A 8 ..A...., IBI#IIII
-chr2 9 C 9 .GA..N.., I$IBIII#I
-chr2 10 T 9 ........, I$II#IIII
-chr2 11 C 10 .>>..T..., IIII@I$I$I
-chr2 12 G 10 .N..G...., III$IIIIII
-chr2 13 A 11 ....A..T.., IIIIII#I@II
-chr1 1 C 1 ^:. I
-chr1 2 G 2 .^:. $I
-chr1 3 A 2 .. I%
-chr1 4 C 2 .. I$
-chr1 5 T 3 ..^:. I#I
-chr1 6 G 3 ..^:, I#I
-chr1 7 C 4 .N., IIII
-chr1 8 A 4 ..., I$II
-chr1 9 T 5 ..C., I#IDI
-chr1 10 G 5 N..., IBII@
-chr1 11 A 5 .C.., I$II#
-chr1 12 C 5 ..N., I$III
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in5.pileup
--- a/test-data/column_join_in5.pileup
+++ /dev/null
@@ -1,25 +0,0 @@
-chr1 42 T 1 ^:. I
-chr1 43 G 2 .^:. $I
-chr1 44 T 2 .. I%
-chr1 45 C 3 ..^:. III
-chr1 46 G 3 ..^:. I#I
-chr1 47 T 4 ...^:, I#II
-chr1 48 A 4 .N., IIII
-chr1 49 C 5 ...., IIIII
-chr1 50 A 5 ..G., IIIDI
-chr1 51 A 5 A..., IBIII
-chr1 52 A 5 ...., IIII#
-chr1 53 G 5 ..N., I$III
-chr2 77 C 6 .G..., I$$III
-chr2 78 G 6 ..N.., III@II
-chr2 79 T 7 ..N..., I$IIIII
-chr2 80 C 7 .G...., I#IIIII
-chr2 81 G 7 ...A.., IIII#BI
-chr2 82 A 8 ...G..., I$IDIIII
-chr2 83 A 8 ...T..., IIIBD$II
-chr2 84 T 8 ..A...., IBI#IIII
-chr2 85 G 8 .GA...., IIBIII#I
-chr2 86 C 9 ........, I$II#IIII
-chr2 87 G 9 ....T..., IIIII$I$I
-chr2 88 G 10 .N..G...., III$IIIIII
-chr2 89 G 10 ...A..T.., IIIII#I@II
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in6.pileup
--- a/test-data/column_join_in6.pileup
+++ /dev/null
@@ -1,25 +0,0 @@
-chr1 42 C 1 ^:. I
-chr1 43 C 2 .^:. II
-chr1 44 T 2 .. II
-chr1 45 A 3 ..^:. III
-chr1 46 G 4 ...^:. IIII
-chr1 47 A 5 ....^:, IIIII
-chr1 48 T 5 ...N, I#III
-chr1 49 G 5 ...., IIIII
-chr1 50 A 5 .G.., IIIII
-chr1 51 G 5 ...., IIIII
-chr2 52 T 5 .N.., II$II
-chr2 53 A 5 ...., IIIII
-chr2 54 T 5 ...., IIIII
-chr2 55 T 5 ...., IIIII
-chr2 56 C 5 ...., IIIBI
-chr2 57 T 5 ...., IDIII
-chr2 58 T 6 .N..., IIIIII
-chr2 59 A 6 ....., IIII$I
-chr3 60 C 6 ...G., I#IIII
-chr3 61 T 6 ..N.., IIIIII
-chr3 62 C 6 ...A., IIIIII
-chr3 63 C 7 .N...., IIIIIII
-chr3 64 A 7 ...G.., IIIII$I
-chr3 65 T 7 ...AA., IIIII@@
-chr3 66 A 7 ....N., IIIIIII
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in7.pileup
--- a/test-data/column_join_in7.pileup
+++ /dev/null
@@ -1,32 +0,0 @@
-chr2 1 T 6 .C..., I$$III
-chr2 2 G 6 ..N.., III@II
-chr2 3 C 7 ..C..., I$IIIII
-chr2 4 G 7 .G...., I#IIIII
-chr2 5 G 7 ...N.., IIII#BI
-chr2 6 A 7 ..T..., I$IDIII
-chr2 7 T 8 ...C..., IIIBD$II
-chr2 8 A 8 ..A...., IBI#IIII
-chr2 9 C 9 .GA..N.., I$IBIII#I
-chr2 10 T 9 ........, I$II#IIII
-chr2 11 C 10 .>>..T..., IIII@I$I$I
-chr2 12 G 10 .N..G...., III$IIIIII
-chr2 13 A 11 ....A..T.., IIIIII#I@II
-chr2 14 G 11 ..N....... IICIBII@AII
-chr2 15 C 11 A.....NG.. IIIIIDIIIII
-chr2 16 T 11 ...C.....G I$IIIB@IIIC
-chr2 17 C 12 G......TN.. IIAII@IIII$I
-chr2 18 A 12 N......G..A IIIBIII$IIII
-chr2 19 A 13 .......NN... IIIIIIBIII$$@
-chr2 20 C 13 ..GT.......N IIIIABIIC$III
-chr1 1 C 1 ^:. I
-chr1 2 G 2 .^:. $I
-chr1 3 A 2 .. I%
-chr1 4 C 2 .. I$
-chr1 5 T 3 ..^:. I#I
-chr1 6 G 3 ..^:, I#I
-chr1 7 C 4 .N., IIII
-chr1 8 A 4 ..., I$II
-chr1 9 T 5 ..C., I#IDI
-chr1 10 G 5 N..., IBII@
-chr1 11 A 5 .C.., I$II#
-chr1 12 C 5 ..N., I$III
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in8.pileup
--- a/test-data/column_join_in8.pileup
+++ /dev/null
@@ -1,23 +0,0 @@
-chr1 42 T 1 ^:. I
-chr1 43 G 2 .^:. $I
-chr1 44 T 2 .. I%
-chr1 45 C 3 ..^:. III
-chr1 46 G 3 ..^:. I#I
-chr1 47 T 4 ...^:, I#II
-chr1 48 A 4 .N., IIII
-chr1 49 C 5 ...., IIIII
-chr1 50 A 5 ..G., IIIDI
-chr1 51 A 5 A..., IBIII
-chr1 52 A 5 ...., IIII#
-chr1 53 G 5 ..N., I$III
-chr2 77 C 6 .G..., I$$III
-chr2 78 G 6 ..N.., III@II
-chr2 79 T 7 ..N..., I$IIIII
-chr2 80 C 7 .G...., I#IIIII
-chr2 81 G 7 ...A.., IIII#BI
-chr2 82 A 8 ...G..., I$IDIIII
-chr2 83 A 8 ...T..., IIIBD$II
-chr2 84 T 8 ..A...., IBI#IIII
-chr2 85 G 8 .GA...., IIBIII#I
-chr2 86 C 9 ........, I$II#IIII
-chr2 87 G 9 ....T..., IIIII$I$I
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_in9.pileup
--- a/test-data/column_join_in9.pileup
+++ /dev/null
@@ -1,25 +0,0 @@
-chr1 43 C 2 .^:. II
-chr3 65 T 7 ...AA., IIIII@@
-chr1 44 T 2 .. II
-chr2 54 T 5 ...., IIIII
-chr1 45 A 3 ..^:. III
-chr1 47 A 5 ....^:, IIIII
-chr1 50 A 5 .G.., IIIII
-chr1 51 G 5 ...., IIIII
-chr2 52 T 5 .N.., II$II
-chr2 53 A 5 ...., IIIII
-chr3 60 C 6 ...G., I#IIII
-chr3 61 T 6 ..N.., IIIIII
-chr1 49 G 5 ...., IIIII
-chr2 55 T 5 ...., IIIII
-chr2 56 C 5 ...., IIIBI
-chr2 58 T 6 .N..., IIIIII
-chr2 59 A 6 ....., IIII$I
-chr3 62 C 6 ...A., IIIIII
-chr1 42 C 1 ^:. I
-chr3 63 C 7 .N...., IIIIIII
-chr1 48 T 5 ...N, I#III
-chr1 46 G 4 ...^:. IIII
-chr3 64 A 7 ...G.., IIIII$I
-chr3 66 A 7 ....N., IIIIIII
-chr2 57 T 5 ...., IDIII
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_out1.pileup
--- a/test-data/column_join_out1.pileup
+++ /dev/null
@@ -1,60 +0,0 @@
-chr1 1 ? ? ? ? T T 87 25 G G 25 25
-chr1 2 ? ? ? ? A T 87 25 T T 25 25
-chr1 3 ? ? ? ? A G 87 25 T T 27 25
-chr1 4 ? ? ? ? A T 55 25 A A 36 25
-chr1 5 ? ? ? ? C A 54 25 A A 36 25
-chr1 6 ? ? ? ? G T 87 25 T T 36 25
-chr1 7 ? ? ? ? A C 87 25 G G 42 25
-chr1 8 ? ? ? ? G A 87 25 T T 45 25
-chr1 9 ? ? ? ? A T 87 25 A A 51 25
-chr1 10 ? ? ? ? G A 57 25 G G 54 25
-chr1 11 ? ? ? ? C A 57 25 C C 57 25
-chr1 12 ? ? ? ? T A 99 25 T T 60 25
-chr1 13 ? ? ? ? A C 99 25 T T 78 25
-chr1 14 ? ? ? ? G C 55 25 A A 56 25
-chr1 15 ? ? ? ? T G 68 25 A A 87 25
-chr4 1 ? ? ? ? ? ? ? ? T T 90 25
-chr4 2 ? ? ? ? ? ? ? ? A A 87 25
-chr4 3 ? ? ? ? ? ? ? ? A A 34 25
-chr4 4 ? ? ? ? ? ? ? ? T T 55 25
-chr4 5 ? ? ? ? ? ? ? ? A A 54 25
-chr4 6 ? ? ? ? ? ? ? ? T T 87 25
-chr4 7 ? ? ? ? ? ? ? ? A A 80 25
-chr4 8 ? ? ? ? ? ? ? ? A A 87 25
-chr4 9 ? ? ? ? ? ? ? ? A A 87 25
-chr4 10 ? ? ? ? ? ? ? ? G G 57 25
-chr4 11 ? ? ? ? ? ? ? ? C C 57 25
-chr4 12 ? ? ? ? ? ? ? ? A A 99 25
-chr4 13 ? ? ? ? ? ? ? ? A A 99 25
-chr4 14 ? ? ? ? ? ? ? ? G G 55 25
-chr4 15 ? ? ? ? ? ? ? ? G G 68 25
-chrM 1 A G 25 25 T G 25 25 ? ? ? ?
-chrM 2 C T 25 25 C A 25 25 ? ? ? ?
-chrM 3 T G 27 25 C A 25 25 ? ? ? ?
-chrM 4 G C 36 25 G A 36 25 ? ? ? ?
-chrM 5 T A 38 25 A T 36 25 ? ? ? ?
-chrM 6 T A 39 25 A G 36 25 ? ? ? ?
-chrM 7 G C 43 25 C G 42 25 ? ? ? ?
-chrM 8 A C 46 25 T T 45 25 ? ? ? ?
-chrM 9 T G 53 25 C A 51 25 ? ? ? ?
-chrM 10 T G 56 25 G G 54 25 ? ? ? ?
-chrM 11 C G 57 25 T C 57 25 ? ? ? ?
-chrM 12 T C 61 25 A T 60 25 ? ? ? ?
-chrM 13 T G 79 25 A T 78 25 ? ? ? ?
-chrM 14 A C 58 25 G A 56 25 ? ? ? ?
-chrM 15 G A 87 25 G A 87 25 ? ? ? ?
-chrM 16 G C 88 25 ? ? ? ? ? ? ? ?
-chrM 17 A C 88 25 ? ? ? ? ? ? ? ?
-chrM 18 G A 89 25 ? ? ? ? ? ? ? ?
-chrM 19 G T 58 25 ? ? ? ? ? ? ? ?
-chrM 20 T C 55 25 ? ? ? ? ? ? ? ?
-chrM 21 C T 87 25 ? ? ? ? ? ? ? ?
-chrM 22 C A 87 25 ? ? ? ? ? ? ? ?
-chrM 23 A G 87 25 ? ? ? ? ? ? ? ?
-chrM 24 A T 89 25 ? ? ? ? ? ? ? ?
-chrM 25 G A 57 25 ? ? ? ? ? ? ? ?
-chrM 26 C G 58 25 ? ? ? ? ? ? ? ?
-chrM 27 T A 99 25 ? ? ? ? ? ? ? ?
-chrM 28 A C 99 25 ? ? ? ? ? ? ? ?
-chrM 29 G C 58 25 ? ? ? ? ? ? ? ?
-chrM 30 T T 65 25 ? ? ? ? ? ? ? ?
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_out2.pileup
--- a/test-data/column_join_out2.pileup
+++ /dev/null
@@ -1,65 +0,0 @@
-chr1 1 C 1
-chr1 2 G 2
-chr1 3 A 2
-chr1 4 C 2
-chr1 5 T 3
-chr1 6 G 3
-chr1 7 C 4
-chr1 8 A 4
-chr1 9 T 5
-chr1 10 G 5
-chr1 11 A 5
-chr1 12 C 5
-chr1 42 T 1 C 1
-chr1 43 G 2 C 2
-chr1 44 T 2 T 2
-chr1 45 C 3 A 3
-chr1 46 G 3 G 4
-chr1 47 T 4 A 5
-chr1 48 A 4 T 5
-chr1 49 C 5 G 5
-chr1 50 A 5 A 5
-chr1 51 A 5 G 5
-chr1 52 A 5
-chr1 53 G 5
-chr2 1 T 6
-chr2 2 G 6
-chr2 3 C 7
-chr2 4 G 7
-chr2 5 G 7
-chr2 6 A 7
-chr2 7 T 8
-chr2 8 A 8
-chr2 9 C 9
-chr2 10 T 9
-chr2 11 C 10
-chr2 12 G 10
-chr2 13 A 11
-chr2 52 T 5
-chr2 53 A 5
-chr2 54 T 5
-chr2 55 T 5
-chr2 56 C 5
-chr2 57 T 5
-chr2 58 T 6
-chr2 59 A 6
-chr2 77 C 6
-chr2 78 G 6
-chr2 79 T 7
-chr2 80 C 7
-chr2 81 G 7
-chr2 82 A 8
-chr2 83 A 8
-chr2 84 T 8
-chr2 85 G 8
-chr2 86 C 9
-chr2 87 G 9
-chr2 88 G 10
-chr2 89 G 10
-chr3 60 C 6
-chr3 61 T 6
-chr3 62 C 6
-chr3 63 C 7
-chr3 64 A 7
-chr3 65 T 7
-chr3 66 A 7
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_out3.pileup
--- a/test-data/column_join_out3.pileup
+++ /dev/null
@@ -1,70 +0,0 @@
-chr1 1 C 1 ^:. X X
-chr1 2 G 2 .^:. X X
-chr1 3 A 2 .. X X
-chr1 4 C 2 .. X X
-chr1 5 T 3 ..^:. X X
-chr1 6 G 3 ..^:, X X
-chr1 7 C 4 .N., X X
-chr1 8 A 4 ..., X X
-chr1 9 T 5 ..C., X X
-chr1 10 G 5 N..., X X
-chr1 11 A 5 .C.., X X
-chr1 12 C 5 ..N., X X
-chr1 42 X T 1 ^:. C 1 ^:.
-chr1 43 X G 2 .^:. C 2 .^:.
-chr1 44 X T 2 .. T 2 ..
-chr1 45 X C 3 ..^:. A 3 ..^:.
-chr1 46 X G 3 ..^:. G 4 ...^:.
-chr1 47 X T 4 ...^:, A 5 ....^:,
-chr1 48 X A 4 .N., T 5 ...N,
-chr1 49 X C 5 ...., G 5 ....,
-chr1 50 X A 5 ..G., A 5 .G..,
-chr1 51 X A 5 A..., G 5 ....,
-chr1 52 X A 5 ...., X
-chr1 53 X G 5 ..N., X
-chr2 1 T 6 .C..., X X
-chr2 2 G 6 ..N.., X X
-chr2 3 C 7 ..C..., X X
-chr2 4 G 7 .G...., X X
-chr2 5 G 7 ...N.., X X
-chr2 6 A 7 ..T..., X X
-chr2 7 T 8 ...C..., X X
-chr2 8 A 8 ..A...., X X
-chr2 9 C 9 .GA..N.., X X
-chr2 10 T 9 ........, X X
-chr2 11 C 10 .>>..T..., X X
-chr2 12 G 10 .N..G...., X X
-chr2 13 A 11 ....A..T.., X X
-chr2 14 G 11 ..N....... X X
-chr2 15 C 11 A.....NG.. X X
-chr2 16 T 11 ...C.....G X X
-chr2 17 C 12 G......TN.. X X
-chr2 18 A 12 N......G..A X X
-chr2 19 A 13 .......NN... X X
-chr2 20 C 13 ..GT.......N X X
-chr2 52 X X T 5 .N..,
-chr2 53 X X A 5 ....,
-chr2 54 X X T 5 ....,
-chr2 55 X X T 5 ....,
-chr2 56 X X C 5 ....,
-chr2 57 X X T 5 ....,
-chr2 58 X X T 6 .N...,
-chr2 59 X X A 6 .....,
-chr2 77 X C 6 .G..., X
-chr2 78 X G 6 ..N.., X
-chr2 79 X T 7 ..N..., X
-chr2 80 X C 7 .G...., X
-chr2 81 X G 7 ...A.., X
-chr2 82 X A 8 ...G..., X
-chr2 83 X A 8 ...T..., X
-chr2 84 X T 8 ..A...., X
-chr2 85 X G 8 .GA...., X
-chr2 86 X C 9 ........, X
-chr2 87 X G 9 ....T..., X
-chr3 60 X X C 6 ...G.,
-chr3 61 X X T 6 ..N..,
-chr3 62 X X C 6 ...A.,
-chr3 63 X X C 7 .N....,
-chr3 64 X X A 7 ...G..,
-chr3 65 X X T 7 ...AA.,
-chr3 66 X X A 7 ....N.,
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_out4.pileup
--- a/test-data/column_join_out4.pileup
+++ /dev/null
@@ -1,65 +0,0 @@
-0610009D07Rik 2 2 3 2 4 2
-0610010K14Rik 1 1 1 1
-1110002N22Rik 2 2 3 2 2 2
-1110008L16Rik 3 2 1 1 6 2
-1110037F02Rik 1 1
-1110054O05Rik 1 1
-1190005F20Rik 4 2
-Acot8 1 2
-Acta1 2 2 2 2
-Actb 1 2 2 2
-Actg1 2 2 1 2
-Actl6a 2 1 1 1
-Actl6b 1 1 1 2
-Actn1 1 1
-Actn4 1 1
-Bend3 1 1
-Bend5 1 1
-Bnc2 1 1 1 1
-Bptf 1 1
-Brip1 1 1 2 1
-Brms1l 1 2
-Btf3;Gm3531 1 1 1 2
-Bub3 2 2 3 1 1 2
-C1d 1 1
-C130039O16Rik 1 1
-C330007P06Rik 1 1
-Cad 4 1 1 1
-Calm1;Calm3;Calm2 2 1 1 1
-Caprin1 2 2
-Cbx1 2 2
-Cbx3 2 2
-E2f6 2 2 1 2
-E130012A19Rik 2 2
-Eed 1 2 1 1
-Efha1 1 1
-Exosc1 3 2
-Exosc10 25 2
-Gm189 1 2 1 2 2 2
-Gm3200 1 1
-Gm9855;Tdg 2 2
-Gm10079 2 1
-Gm11230 2 1
-Gm12620 1 1
-Gm13072;Trmt112 1 1
-Gm13092;LOC677017 1 1 1 2
-Gm14173;Rpl37a;Gm4149 1 2
-Gm14231 1 1
-Gm14393;2210418O10Rik;Gm14296;Gm14401;RP23-330D3.5 1 1
-Gm14456;Tpt1 1 1
-Gm15501;Rps8 1 1
-Sfrs7 1 2
-Sfrs11 3 2 4 2
-Sfrs12 2 2
-Sin3a 1 2 4 2 1 1
-Sirt7 1 1 1 1
-Ski 1 1
-Skil 1 1
-Skiv2l2 12 2 34 2
-Tubb2b 4 2 3 2
-Tubb2c 1 1
-Tubb2c-ps1 1 2
-Tubb4 1 1
-Zscan4-ps2 1 2
-Zscan4e 1 1 2 2
-Zscan4f 2 2 2 2 2 2
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/column_join_out5.tabular
--- a/test-data/column_join_out5.tabular
+++ /dev/null
@@ -1,12 +0,0 @@
-1 i i2 0
-2 ii 0 i3
-3 0 ii2 ii3
-4 0 iii2 iii3
-5 0 0 0
-6 0 iv2 iv3
-7 iii 0 v3
-8 0 v2 0
-9 0 vi2 vi3
-10 0 vii2 vii3
-11 iv viii2 0
-alpha 0 epsilon 0
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/dnds_inp.fasta
--- a/test-data/dnds_inp.fasta
+++ /dev/null
@@ -1,76 +0,0 @@
->human
-ATGGCTGTGGCCCTGGGTTGTGCAATCCAGGCATCCTTGAATCAAGGCTCTGTGTTTCAAGAATATGATACTGACTGTGAAGTTTTCCGTCAGCGCTTCAGGCAGTTCCAGTACAGAGAAGCAGCTGGGCCTCATGAAGCATTTAACAAACTCTGGGAGCTTTGCTGTCAATGGCTGAAGCCAAAGATGCGCTCTAAGGAACAAATCCTGGAGCTGCTAGTGTTGGAGCAATTCCTAACTATCCTGCCCACAGAGATAGAGACCTGGGTGAGGGAGCACTGCCCAGAGAATAGAGAAAGAGTTGTGTCACTGATAGAAGACTTACAGAGAGAACTTGAGATACCAGAGCAGCAGGTTGATATGCATGACATGCTCTTGGAAGAACTGGCACCAGTGGGAACGGCACACATACCACCAACCATGCACCTAGAGTCACCTGCACTCCAGGTAATGGGACCTGCCCAGGAGGCCCCAGTAGCAGAGGCATGGATCCCACAGGCAGGGCCACCGGAGCTGAACTATGGTGCTACTGGAGAATGTCAGAACTTTCTGGACCCTGGATATCCATTACCAAAACTTGACATGAACTTCTCATTGGAGAATAGAGAAGAGCCATGGGTGAAGGAATTACAGGATTCTAAAGAAATGAAACAATTACTTGATTCCAAGATAGGTTTTGAGATCGGGATAGAAAATGAAGAAGATACTTCAAAACAGAAAAAAATGGAGACTATGTATCCATTTATTGTAACTTTAGAGGGGAATGCTCTCCAGGGTCCCATTTTGCAAAAAGACTATGTACAGTTAGAAAATCAATGGGAAACCCCCCCAGAGGATTTACAGACAGATTTAGCAAAACTGGTAGATCAGCAGAACCCCACTCTGGGAGAGACACCTGAGAACTCCAACTTGGAAGAACCTCTCAACCCTAAACCCCACAAGAAAAAGAGTCCAGGAGAGAAACCTCACCGATGTCCTCAGTGTGGAAAATGTTTTGCTCGGAAGTCACAACTTACTGGGCATCAGAGAATTCATTCAGGAGAAGAACCTCACAAATGCCCTGAATGTGGGAAAAGATTCCTTCGTAGTTCAGACCTTTATAGACACCAACGACTTCATACAGGGGAGAGACCCTATGAATGCACTGTATGTAAAAAGCGATTCACTCGGCGGTCACATCTTATAGGGCACCAGAGAACCCATTCTGAAGAAGAAACATATAAATGTCTTGAGTGTGGGAAAAGTTTTTGTCATGGATCAAGTCTTAAAAGACATCTGAAAACTCATACAGGTGAAAAACCTCATAGATGTCATAATTGTGGGAAAAGTTTTAGTCGACTGACAGCTCTTACTTTGCACCAGAGAACGCATACTGAAGAGAGACCTTTTAAATGTAATTATTGTGGGAAAAGTTTTAGACAGAGACCAAGCCTCGTTATTCATTTAAGAATCCACACAGGGGAGAAGCCATACAAGTGTACTCATTGTTCTAAAAGCTTCAGACAGAGAGCCGGCCTTATTATGCACCAGGTCACTCACTTTAGAGGACTTATTTAA
->chimp
-ATGGCTGTGGCCCTGGGTTGTGCAATCCAGGCATCCTTGAATCAAGGCTCTGTGTTTCAAGAATATGATACTGACTGTGAAGTTTTCCGTCAGCGCTTCAGGCAGTTCCAGTACAGAGAAGCAGCTGGGCCTCATGAAGCATTTAACAAACTCTGGGAACTTTGCTGTCAATGGCTGAAGCCAAAGATGCGCTCTAAGGAACAAATCCTGGAGCTGCTAGTGTTGGAGCAATTCCTAACTATCCTGCCCACAGAGATAGAGACCTGGGTGAGGGAGCACTGCCCAGAGAATAGAGAAAGAGTTGTGTCACTGATAGAAGACTTACAGAGAGAACTTGAGATACCAGAGCAGCAG?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GATATCCATTACCCAAACTTGACATGAACTTCTCATTGGAGAATAGAGAAGAGCCATGGGTGAAGGAATTACAGGATTCTAAAGAAATGAAACAATTACTTGATTCCAAGATAGGTTTTGAGATCGGGATAGAAAATGAAGAAGATACTTCAAAACAGAAAAAAATGGAGACTATGTATCCATTTATTGTAACTTTAGAGGGGAATGCTCTCCAGGGTCCCATTTTGCAAAAAGACTATGTACAGTTAGAAAATCAATGGGAAACCCCCCCAGAGGATTTACAGAGAGATTTAGCAAAACTGGTAGATCAGCAGAACCCCACTCTGGGAGAGACACCTGAGAACTCCAACTTGGAAGAACCTCTCAACCCTAAACCCCACAAGAAAAAGAGTCCAGGAGAGAAACCTCACCGATGTCCTCAGTGTGGAAAATGTTTTGCTCGGAAGTCACAACTTACTGGGCATCAGAGAATTCATTCAGGAGAAGAACCTCACAAATGCCCTGAATGTGGGAAAAGATTCCTTCGTAGTTCAGACCTTTATAGACACCAACGACTTCATACAGGGGAGAGACCCTATGAATGCACTGTATGTAAAAAGCGATTCACTCGGCGGTCACATCTTATAGGGCACCAGAGAACCCATTCTGAAGAAGAAACATATAAATGTCTTGAGTGTGGGAAAAGTTTTTGTCATGGATCAAGTCTTAAAAGACATCTGAAAACTCATACAGGTGAAAAACCTCATAGATGTCATAATTGTGGGAAAAGTTTTAGTCGACTGACAGCTCTTACTTTGCACCAGAGAACGCATACTGAAGAGAGACCTTTTAAATGTAATTATTGTGGGAAAAGTTTTAGACAGAGACCAAGCCTCGTTATTCATTTAAGAATCCACACAGGGGAGAAGCCATACAAGTGTACTCATTGTTCTAAAAGCTTCAGACAGAGAGCCGGCCTTATTATGCACCAGGTCACTCACTTTAGAGGACTTATTTAA
->mouse
-ATGGCTGTGGCCCTGGGCTGTGCAATCCAGGCCTCCTTGAATCAGGGCTCTGTGCTGCAAGAGTATGACACAGACTGTGAAGTTTTCCGACAGCGTTTCAGGCAGTTCCAGTACACAGAAGCTGCCGGGCCTCATGAAGCATTCAACAAACTCTGGGAGCTTTGCTGTCAGTGGCTGAAGCCAAAGATGCGTTCTAAGGAACAAATCCTGGAACTGCTTGTGCTAGAGCAATTCCTAACTATTCTGCCCACAGAAATAGAGACCTGGGTGAGGGAACACTGCCCAGACAATAGAGAAAGAGTTGTGTCACTCATTGAAGACTTACAAAGAGAGCTTGAGATACCAGAACCACAGATTGACATGGATGACATGCTCTTGGAAGAACTGGCGCCAGTTGGAACAGTACCCATGCCACCCAACTTGCACCTGGAGGAGCCTTCACTCCAGGTGATGGAACCTGTTCAGGAGCCTCCGGTGCCGGATGCCTGGATTCCACAAGCTGGCCCCCAGGATCTGAACTACAGTGCTGATGCTGAATGCCAGTCCTTTCTGGACCCTGGTTATCAGTTACCAAAGCTTGACATGAACTTCCCATTGGATCATAGAGAAGAACCATGGGTAAAAGACTTAGAGGATCCCAAAGAAATGAAACAATTACTTGATTCCAAGATTGGTTTTGAGATGGGAATAGAAAATGAAGAAGATACTTCAAAGGAAAAAAAACTGGAAACTTTGTACCCATTTGTTGTAACTTTAGAAGGGAATGCTCTCCATGGTCCCATTTTGCAGAAAGACTATGTGCAGTTAGAAAACCAATGGGAAACATCCCCAGAGGACTTACAGACAGACCTAACAAAACTCGTAGATCCTCAGAACCCAACTCTAGGAGAGACACCCGAGAGCCCCAGCCTGGAAGAACCTCTCACCCCGAAGCCTCCAAAGAAAAAGAGTCCTGGGGACAAACCTCACCGATGTCCCCAGTGTGGCAAATGTTTCGCTCGGAAGTCACAACTTACAGGGCACCAGCGAATTCATTCAGGAGAAGAACCTCACAAGTGCCCTGAATGCGGAAAAAGGTTCCTGCGTAGCTCTGACCTTTACAGACACCAACGACTTCACACAGGAGAAAGACCCTATGAATGCACTGTATGTAAAAAGCGATTCACTAGGCGCTCACACCTTCTTGGGCACCAGAGAACCCATTCTGAAGAAGAAACATATAAATGTCTTGAGTGTGGAAAAACCTTTTGTCATGGGTCAAGTCTTAAAAGACATCTAAAAACTCATACAGGTGAAAAGCCTCATAGATGTCCTAATTGTGGGAAAAGTTTTAGTCGCCTGACGGCACTTACTTTGCACCAGAGAACACACACGGAAGAGAGACCTTTTAAATGTAGTTACTGTGGGAAAAGCTTTAGACAGAGACCAAGCCTTGTCATTCATTTAAGAATCCATACAGGGGAAAAGCCATACAAGTGTACTCATTGTTCTAAAAGCTTCCGGCAGAGAGCAGGCCTTATTATGCACCAGGTCACACACTTTAGAGGACTTCTTTAA
-
->human
-?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CTTCTAGGGACCTATTAAAAGAGTTCCCACAGCCCAAAAATCTTCTCAACAGTGTGATTGGAAGAGCCCTCGGCATCTCACATGCAAAAGACAAACTAGTCTACGTGCACACAAATGGACCGAAGAAAAAGAAAGTCACACTGCACATAAAATGGCCCAAGAGCGTGGAGGTAGAAGGCTATGGCAGCAAGAAGATCGATGCTGAGCGGCAGGCTGCAGCTGCAGCCTGCCAGCTGTTCAAGGGTTGGGGTCTGCTAGGTCCCCGGAATGAGTTGTTTGACGCAGCCAAATACCGAGTGCTAGCTGATCGCTTTGGCTCCCCTGCCGACAGCTGGTGGCGTCCGGAACCCACCATGCCCCCTACTTCCTGGCGGCAGCTGAATCCAGAGAGTATTCGACCAGGGGGACCTGGGGGCCTATCCCGCTCTTTAGGCCGGGAAGAAGAGGAGGACGAGGAGGAAGAGCTAGAAGAAGGGACCATAGATGTTACCGACTTCTTGTCCATGACCCAGCAGGATTCCCACGCTCCACTCAGGGACTCAAGGGGGAGTTCCTTTGAGATGACAGATGACGACAGTGCCATTAGGGCTCTGACCCAGTTTCCACTTCCCAAGAACCTTCTGGCCAAGGTGATTCAGATTGCAACGTCATCCTCCACAGCTAAGAACCTCATGCAGTTCCATACTGTGGGCACCAAGACCAAGCTGTCTACACTCACCCTGCTCTGGCCCTGCCCCATGACCTTTGTTGCCAAAGGGCGCCGCAAAGCAGAGGCTGAGAATAAGGCGGCAGCCTTGGCCTGCAAGAAACTGAAGAGCCTGGGCCTGGTGGACAGGAACAACGAACCGCTTACACACGCCATGTATAACCTGGCCTCTTTGCGTGAGCTGGGTGAGACCCAGCGCCGACCATGCACCATCCAGGTGCCCGAGCCCATCCTCCGCAAGATAGAGACCTTCCTGAACCATTACCCTGTGGAGAGTTCATGGATCGCCCCAGAACTCCGGCTGCAGAGTGATGACATCTTGCCCTTGGGCAAGGACTCAGGGCCTCTGAGTGACCCTATCACAGGCAAGCCCTATGTGCCCCTGTTGGAAGCAGAGGAGGTACGTCTCAGCCAGAGTCTGCTAGAACTGTGGCGGCGGCGAGGGCCGGTCTGGCAGGAGGCCCCCCAGCTACCTGTGGACCCACATCGGGACACCATCCTCAACGCCATTGAGCAGCACCCGGTGGTGGTCATCTCTGGGGACACGGGCTGTGGGAAGACCACGCGCATCCCCCAGCTGTTGCTGGAGCGCTATGTGACCGAGGGCCGAGGTGCCCGCTGCAATGTTATCATCACCCAACCTCGCCGCATCTCTGCTGTGTCTGTGGCACAGCGGGTCAGCCACGAACTGGGCCCCTCCCTGCGCCGGAATGTGGGCTTCCAGGTGCGGTTGGAAAGTAAGCCCCCATCCCGAGGCGGGGCCCTGCTCTTCTGCACTGTGGGTATCCTGCTGCGTAAGCTGCAGAGCAACCCCAGCCTGGAGGGCGTGAGCCACGTCATCGTGGATGAGGTGCATGAGCGGGACGTGAACACAGACTTTCTGCTGATCCTGCTCAAGGGCCTGCAGCGGCTCAACCCGGCCCTGCGGCTGGTGCTCATGAGTGCCACAGGGGACAATGAGCGCTTCTCCCGATACTTTGGTGGCTGCCCCGTCATCAAGGTGCCTGGCTTCATGTACCCAGTCAAGGAGCACTACCTAGAGGACATCCTGGCCAAGTTGGGCAAGCACCAGTACCTGCACCGGCACCGGCACCATGAGTCTGAGGATGAATGCGCACTCGATTTGGACCTTGTGACTGATCTGGTTCTGCACATCGATGCTCGCGGGGAACCAGGTGGGATCCTGTGCTTCCTGCCTGGGTGGCAGGAGATCAAAGGAGTGCAGCAGCGCCTCCAGGAGGCCCTGGGCATGCACGAGAGCAAGTACCTCATCCTGCCAGTGCACTCCAACATCCCCATGATGGATCAGAAGGCCATATTCCAGCAGCCTCCAGTTGGGGTGCGCAAGATTGTCTTGGCCACCAACATTGCTGAGACTTCCATCACAATCAATGACATCGTGCATGTGGTGGACAGTGGGCTGCACAAGGAAGAACGCTATGACCTGAAGACCAAGGTGTCCTGCCTGGAGACAGTGTGGGTATCAAGAGCCAATGTGATCCAGCGCCGGGGCCGGGCGGGCCGCTGCCAGTCCGGCTTTGCCTACCACTTGTTCCCTCGAAGCCGGCTGGAGAAAATGGTCCCTTTCCAAGTGCCAGAGATCCTGCGCACACCTCTTGAGAACCTGGTGCTGCAAGCGAAAATCCACATGCCTGAGAAGACGGCGGTGGAGTTCCTGTCCAAGGCTGTGGACAGTCCAAACATCAAGGCAGTGGACGAGGCTGTGATCTTGCTCCAGGAGATCGGGGTGCTGGACCAGCGGGAGTACCTGACTACCCTGGGGCAGCGCCTGGCTCACATCTCCACCGACCCCCGGTTGGCCAAGGCCATTGTGTTGGCTGCCATCTTCCGTTGCCTGCACCCACTACTGGTGGTCGTTTCCTGCCTCACCCGGGACCCCTTCAGCAGCAGCCTACAGAACCGGGCAGAGGTGGACAAGGTGAAAGCACTGTTGAGCCATGACAGCGGCAGTGACCACCTGGCCTTTGTGCGGGCTGTCGCCGGCTGGGAGGAGGTGCTGCGTTGGCAGGACCGCAGCTCCCGGGAGAATTACCTGGAGGAAAACCTGCTGTACGCACCCAGCCTGCGCTTCATCCACGGACTCATCAAGCAGTTCTCAGAGAACATTTATGAGGCCTTCCTGGTGGGGAAGCCCTCGGACTGCACCCTGGCCTCCGCCCAGTGCAACGAGTACAGTGAGGAGGAGGAGCTGGTGAAGGGCGTGCTGATGGCCGGCCTCTACCCCAACCTCATCCAGGTGAGGCAGGGCAAGGTCACCCGGCAGGGGAAGTTCAAGCCCAACAGCGTCACATATAGGACCAAATCAGGCAACATCCTGCTGCACAAGTCGACCATTAACAGGGAGGCCACACGGTTACGGAGCCGATGGCTGACGTATTTCATGGCAGTCAAGTCCAATGGCAGCGTCTTCGTCCGGGACTCCTCTCAGGTGCACCCGCTAGCTGTGCTGCTGCTGACCGACGGGGACGTGCACATCCGTGATGACGGGCGCCGGGCCACCATCTCACTGAGCGACAGTGACCTGCTGCGGCTGGAGGGTGACTCGCGTACCGTGCGGCTGCTGAAGGAGCTGCGGCGGGCCCTGGGCCGCATGGTGGAGCGGAGCCTGCGCAGCGAGCTGGCTGCACTTCCCCCCAGCGTACAGGAGGAGCACGGGCAGCTGCTTGCGCTACTGGCAGAGCTGCTGCGAGGACCCTGTGGCAGCTTTGATGTGCGCAAGACAGCTGACGACTGA
->chimp
-????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????AAAGTCACACTGCACATAAAGTGGCCCAAGAGCGTGGAGGTAGAAGGCTATGGCAGCAAGAAGATCGATGCTGAGCGGCAGGCTGCAGCTGCGGCCTGCCAGCTGTTCAAGGGTTGGGGTCTG??AGGTCCCCGGAATGAGTTGTTTGACGCAGCCAAATACCGAGTGCTAGCTGATCGCTTTGGCTCCCCTGCCGACAGCTGGTGGCGTCCGGAACCCACCATGCCCCCTACTTCCTGGCGGCAGCTGAATCCAGAGAGTATTCGACCAGGGGGACCTGGGGGCCTATCCCGCTCTTTAGGCCGGGAAGAAGAGGAGGACGAGGAGGAAGAGCTAGAAGAAGGGACCATAGATGTTACCGACTTCTTGTCCATGACCCAGCAGGATTCCCACGCTCCACTCAGGGACTCAAGGGGGAGTTCCTTTGAGATGACAGATGACGACAGTGCCATTAGGGCTCTGACCCAGTTTCCACTTCCCAAGAACCTTCTGGCCAAGGTGATTCAGATTGCAACGTCATCCTCCACAGCTAAGAACCTCATGCAGTTCCATACTGTGGGCACCAAGACCAAGCTGTCTACACTCACCCTGCTCTGGCCCTGCCCCATGACCTTTGTTGCCAAAGGGCGCCGCAAAGCAGAGGCTGAGAATAAGGCGGCAGCCTTGGCCTGCAAGAAACTGAAGAGCCTGGGCCTGGTGGACAGGAACAACGAACCGCTTACACACGCCATGTATAACCTGGCCTCTTTGCGTGAGCTGGGTGAGACCCAGCGCCGACCATGCACCATCCAGGTGCCCGAGCCCATCCTCCGCAAGATAGAGACCTTCCTGAACCATTACCCTGTGGAGAGTTCATGGATCGCCCCAGAACTCCGGCTGCAGAGTGATGACATCTTGCCCTTGGGCAAGGACTCAGGGCCTCTGAGTGACCCTATCACAGGCAAGCCCTATGTGCCCCTGTTGGAAGCAGAGGAGGTACGTCTCAGCCAGAGTCTGCTAGAACTGTGGCGGCGGCGAGGGCCGGTCTGGCAGGAGGCCCCCCAGCTACCTGTGGACCCACATCGGGACACCATCCTCAACG?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CCTCCCTGCGCCGGAATGTGGGCTTCCAGGTGCGGTTGGAAAGTAAGCCCCCATCCCGAGGCGGGGCCCTGCTCTTCTGCACTGTGGGTATCCTGCTGCGTAAGCTGCAGAGCAACCCCAGCCTGGAGGGCGTGAGCCACGTCATCGTGGATGAGGTGCATGAGCGGGACGTGAACACAGACTTTCTGCTGATCCTGCTCAAGGGCCTGCAGCGGCTCAACCCGGCCCTGCGGCTGGTGCTCATGAGTGCCACAGGGGACAATGAGCGCTTCTCCCGATACTTTGGTGGCTGCCCCGTCATCAAGGTGCCTGGCTTCATGTACCCAGTCAAGGAGCACTACCTAGAGGACATCCTGGCCAAGTTGGGCAAGCACCAGTACCTGCACCGGCACCGGCACCATG?????????????????????????????????????????????????????????????????????????????????????????????????????????GGCAGGAGATCAAAGGAGTGCAGCAGCGCCTCCAGGAGGCCCTGGGCATGCACGAGAGCAAGTACCTCATCCTGCCAGTGCACTCCAACATCCCCATGATGGATCAGAAGGCCATATTCCAGCAGCCTCCAGTTGGGGTGCGCAAGATTGTCTTGGCCACCAACATTGCTGAGACTTCCATCACAATCAATGACATCGTGCATGTGGTGGACAGTGGGCTGCACAAGGAAGAACGCTATGACCTGAAGACCAAGGTGTCCTGCCTGGAGACAGTGTGGGTATCAAGAGCCAATGTGATCCAGCGCCGGGGCCGGGCGGGCCGCTGCCAGTCCGGCTTTGCCTACCACTTGTTCCCTCGAAGCCGGCTGGAGAAAATGGTCCCTTTCCAAGTGCCAGAGATCCTGCGCACACCTCTCGAGAACCTGGTGCTGCAAGCAAAAATCCACATGCCTGAGAAGACGGCGGTGGAGTTCCTGTCCAAGGCTGTGGACAGTCCAAACATCAAGGCAGTGGACGAGGCTGTGATCTTGCTCCAGGAGATCGGGGTGCTGGACC??CGGGAGTACCTGACTACCCTGGGGCAGCGCCTGGCTCACATCTCCACCGACCCCCGGTTGGCCAAGGCCATTGTGTTGGCTGCCATCTTCCGTTGCCTGCA???ACTACTGGTG????TTTCCTGCCTCACCCGGGACCCCTTC????????????????????????????????????GTGAAAGCACTG?TGAGCCATGACAGCGGCAGTGACCACCTGGCCTTTGTGCGGGCTGTCGCCGGCTGGGAGGAGGTGCTGCGTTGGCAGGACCGCAGCTCCCGGGAGAATTACCTGGAGGAAAACCTGCTCTACGCACCCAGCCTGCGCTTCATCCACGGACTCATCAAGCAGTTCTCAGAGAACATTTATGAGGCCTTCCTGGTGGGGAAGCCCTCGGACTGCACCCTGGCCTCCGCCCAGTGCAACGAGTACAGTGAGGAGGAGGAGCTGGTGAAGGGCGTGCTGATGGCCGGCCTCTACCCCAACCTCATCCAGGTGAGGCAGGGCAAGGTCACCCGGCAGGGGAAGTTCAAGCCCAACAGCGTCACATATAGGACCAAATCAGGCAACATCCTGCTGCACAAGTCGACCATTAACAGGGAGGCCACACGGTTACGGAGCCGATGGCTGACGTATTTCATGGCAGTCAAGTCCAATGGCAGCGTCTTCGTCCGGGACTCCTCTCAGGTGCACCCGCTAGCTGTGCTGCTGCTGACCGACGGGGACGTGCACATCCGTG??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
->mouse
-?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CTTCTAGGGACCTATTAAAAGAGTTTCCGCAGCCTAAAAACCTTCTCAACAGCGTGATTGGAAGAGCCCTTGGCATCTCACATGCAAAAGACAAGTTAGTCTATGTGCACACGAATGGACCGAAGAAAAAGAAAGTCACCCTGCACATAAAGTGGCCCAAGAGCGTGGAGGTGGAAGGCTATGGCAGCAAGAAGATTGATGCTGAGCGTCAGGCTGCAGCAGCTGCCTGCCAACTCTTCAAGGGCTGGGGTCTGCTGGGACCACGGAATGAGCTGTTTGATGCAGCTAAATACCGAGTGCTAGCTGATCGTTTTGGGTCTCCAGCTGACAGCTGGTGGCGCCCAGAACCCACCATGCCTCCAACTTCCTGGCGGCAGCTGAATCCTGAGAACATTCGGCCAGGGGGTCCTGCAGGACTATCCCGATCCTTAGGCCGAGAGGAAGAGGAAGATGAGGAGGAAGAGCTAGAAGAGGGGACCATTGATGTGACAGAGTTTCTGTCTATGACCCAGCAAGACTCCCACAACCCACTCAGGGACTCAAGGGGGGGCTCCTTTGAAATGACAGATGATGACAGTGCTATCAGAGCTCTGACCCAGTTTCCACTTCCCAAGAACCTCCTGGCCAAAGTGATTCAGATTGCAACCTCCTCCTCCACAGCTAAGAATCTCATGCAGTTCCATACTGTGGGTACCAAGACCAAGCTGGCTACACTCACTCTGCTCTGGCCCTGTCCCATGACCTTTGTTGCCAAAGGGCGACGCAAAGCTGAGGCTGAGAATAAGGCAGCAGCCTTGGCTTGCAAGAAACTGAAGAGCCTTGGCCTTGTGGACAGGAACAATGAGCCGCTTACCCATGCCATGTACAACCTGGCCTCCCTGCGTGAGTTGGGTGAGACCCAGCGCCGGCCATGTACCATCCAGGTGCCTGAGCCCATCCTTCGCAAGATAGAGGCCTTCCTGAGTCATTACCCGGTGGACAGCTCATGGATTTCCCCAGAACTCCGACTGCAGAGTGATGACATCTTGCCCTTAGGCAAGGACTCAGGGCCCTTGAGTGACCCTATCACAGGCAAGCCATACATGCCCCTGTCAGAAGCAGAGGAGGTGCGCTTAAGCCAGAGCCTGCTAGAGCTGTGGCGGAGGAGAGGGCCGATCTGGCAGGAGGCCCCGCAGCTACCTGTAGACCCTCATCGGGACACTATCCTCAGTGCCATTGAACAACACCCAGTGGTAGTCATCTCTGGGGACACAGGCTGTGGGAAGACCACACGTATCCCTCAGCTGCTATTGGAGCGCTATGTGACTGAGGGTCGAGGTGCCCGCTGCAATGTGATCATCACACAACCTCGCCGGATCTCAGCTGTGTCTGTGGCACAGCGGGTCAGCCATGAACTGGGCCCCTCCTTGCGCCGGAATGTGGGCTTCCAGGTACGCTTGGAAAGTAAGCCCCCAGCCCGAGGTGGGGCGCTGCTCTTCTGCACTGTGGGTATCCTGCTTCGGAAGCTGCAGAGCAACCCCAGCCTGGAGGGTGTGAGCCATGTCATTGTGGATGAGGTCCATGAGCGGGATGTGAACACAGACTTCCTGCTGATTCTGCTCAAGGGCCTGCAGCGGCTCAACCCAGCTCTTCGGCTGGTGCTCATGAGTGCTACAGGAGATAATGAGCGCTTTTCCCGATACTTTGGGGGCTGCCCTGTTATCAAGGTACCTGGCTTCATGTATCCCGTCAAGGAACACTACCTGGAGGACATCTTGGCCAAGCTGGGTAAACATCAGTACCCACACCGGCATTGGCACCATGAGTCGGAAGATGAATGTGCACTTGATTTGGACCTTGTGACTGACCTGGTTCTGCATATCGATGCCCGTGGGGAACCAGGTGGGATCCTGTGCTTTCTACCTGGCTGGCAAGAAATCAAAGGAGTGCAACAACGGCTCCAGGAGGCCCTGGGCATGCATGAAAGCAAGTACCTCATCTTACCAGTGCACTCCAATATCCCCATGATGGACCAGAAGGCCATATTCCAACAGCCTCCACTTGGGGTACGCAAGATTGTATTGGCCACCAACATTGCTGAAACCTCCATCACAGTTAACGACATTGTACATGTCGTGGACAGCGGTCTGCACAAGGAGGAACGCTATGACCTGAAGACCAAGGTGTCCTGCCTGGAGACTGTGTGGGTGTCGAGAGCAAATGTCATTCAGCGCCGGGGCAGGGCAGGCCGCTGCCAGTCAGGTTTTGCCTACCACTTGTTCCCGAGGAGCCGGCTGGAGAAAATGGTTCCTTTCCAAGTGCCAGAGATCCTGCGCACACCTCTTGAGAACCTGGTGCTGCAAGCCAAAATCCATATGCCTGAGAAGACGGCAGTGGAGTTCCTCTCTAAGGCTGTGGACAGTCCAAATATCAAGGCAGTGGATGAGGCCGTGATCCTGCTCCAGGAGATTGGGGTGCTGGACCAGCGGGAGTATCTGACCACCTTGGGACAGCGCCTGGCCCACATCTCTACTGACCCCCGACTGGCCAAGGCCATAGTGTTGGCTGCCATCTTCCGTTGCCTGCACCCACTGCTGGTGGTTGTTTCCTGCCTTACCCGGGACCCCTTCAGCAGCAGTTTGCAGAACCGGGCAGAAGTAGACAAGGTGAAGGCATTGCTGAGCCATGACAGTGGCAGTGACCATTTGGCCTTCGTGCGGGCTGTGGCTGGCTGGGAGGAGGTACTGCGCTGGCAGGACCGTACCTCCAGGGAAAACTACCTGGAAGAAAACCTTCTGTATGCCCCCAGCTTGCGCTTCATCCACGGGCTCATCAAGCAGTTCTCAGAGAACATTTATGAGGCTTTCCTAGTGGGGAAGCCCTCTGACTGCACACTGCCCTCTGCTCAGTGCAATGAGTACAGCGAGGAAGAGGAGCTGGTGAAGGGTGTGCTGATGGCTGGCCTCTACCCCAACCTCATCCAGGTGAGACAAGGTAAGGTTACTCGGCAAGGCAAGTTCAAACCCAACAGTGTCACTTACAGGACCAAATCTGGCAACATCTTGCTGCATAAGTCAACCATTAACAGGGAGGCTACCCGGTTACGGAGCCGATGGCTGACATATTTCATGGCCGTCAAGTCCAATGGTAGCGTCTTTGTTCGAGATTCCTCCCAGGTGCACCCACTAGCTGTGTTGCTCCTAACAGATGGGGACGTGCACATCCGAGATGATGGGCGTCGGGCCACCATCTCATTGAGTGACAGCGACCTGCTTCGGCTGGAAGGTGATTCACGAACTGTGCGGTTGCTAAGGGAGTTTCGTCGAGCCCTAGGACGGATGGTGGAGCGGAGCCTCCGCAGCGAGTTAGCTGCACTTCCTCTTAGTGTGCAGCAAGAACACGGGCAGCTGCTTGCACTGCTGGCAGAGTTGCTTCGAGGACCTTGTGGCAGCTTTGATATGCGCAAGACAGCTGATGACTGA
-
->human
-ATGGAAAACGAGACAGTCAGTGAACTGAACCAAACACAGCTTCAGCCACGAGCAGTGGTGGCCTTAGAATACCAGGTGGTCACCATCTTACTTGTACTCATTATTTGTGGCCTGGGCATTGTAGGCAACATCATGGTAGTCCTGGTTGTCATGAGAACCAAGCACATGAGGACCCCCACAAACTGCTACCTGGTGAGCCTGGCAGTAGCTGATCTCATGGTCTTGGTGGCCGCAGGCCTCCCCAACATAACAGACAGTATCTACGGTTCCTGGGTCTATGGCTATGTTGGATGCCTCTGCATTACTTACCTCCAGTATTTGGGAATTAATGCATCCTCTTGTTCAATAACAGCCTTTACCATTGAGAGGTACATAGCAATCTGTCACCCCATCAAAGCCCAGTTTCTCTGCACATTTTCCAGAGCCAAAAAGATTATCATCTTTGTCTGGGCTTTCACATCTCTTTACTGTATGCTCTGGTTCTTCTTGCTGGATCTCAATATTAGCACCTACAAAGATGCTATTGTGATATCCTGTGGCTACAAGATCTCCAGGAATTACTACTCACCTATTTACCTAATGGACTTTGGTGTCTTTTATGTTGTGCCAATGATCCTGGCTACCGTCCTCTATGGATTCATAGCTAGAATCCTTTTCTTAAATCCCATTCCTTCAGATCCTAAAGAAAACTCTAAGACATGGAAAAATGATTCAACCCATCAGAACACAAATCTGAATGTAAATACCTCTAATAGATGTTTCAACAGCACAGTATCTTCAAGGAAGCAGGTCACCAAGATGCTGGCAGTGGTTGTAATTCTGTTTGCCCTTTTATGGATGCCCTACAGGACTCTAGTGGTTGTCAACTCATTTCTCTCCAGTCCTTTCCAAGAAAATTGGTTTTTGCTCTTTTGCAGAATTTGCATTTATCTCAACAGTGCCATCAACCCGGTGATTTACAATCTCATGTCCCAGAAATTCCGTGCAGCCTTCAGAAAGCTCTGCAACTGCAAGCAGAAGCCAACAGAGAAACCTGCTAACTACAGTGTGGCCCTAAATTACAGCGTCATCAAGGAGTCAGACCATTTCAGCACAGAGCTTGATGATATCACTGTCACTGACACTTACCTGTCTGCCACAAAAGTGTCTTTTGATGACACCTGCTTGGCTTCTGAGGTATCCTTTAGCCAAAGTTGA
->chimp
-ATGGAAAACGAGACAGTCAGTGAACTGAACCAAACACAGCTTCAGCCACGAGCAGTGGTGGCCTTAGAATACCAGGTGGTCACCATCTTACTTGTGCTCATTATTTGTGGCCTGGGCATTGTAGGCAACATCATGGTAGTCCTGGTTGTCATGAGAACCAAGCACATGAGGACCCCCACAAACTGCTACCTGGTGAGCCTGGCAGTAGCTGATCTCATGGTCTTGGTGGCCGCAGGCCTCCCCAACATAACAGACAGTATCTACGGTTCCTGGGTCTATGGCTATGTTGGATGCCTCTGCATTACTTACCTCCAGTATTTGGGAATTAATGCATCCTCTTGTTCAATAACAGCCTTTACCATTGAGAGGTACATAGCAATCTGTCACCCCATCAAAGCCCAGTTTCTCT????ATTTTCCAGAGCCAAAAAGATTATCATTTTTGTTTGGGCTTTCACATCTCTTTACTGTATGCTCTGGTTCTTCTTGCTGGATCTCAATATTAGCACCTACAAAGATGCTATTGTGATATCCTGTGGCTACAAGATCTCCAGGAATTACTACTCACCTATTTACCTAATGGACTTTGGTGTCTTTTATGTTGTGCCAATGATCCTGGCTACCGTCCTCTATGGATTCATAGCTAGAATCCTTTTCTTAAATCCCATTCCTTCAGATCCTAAAGAAAACTCTAAGACATGGAAAAATGACTCAACCCATCAGAACACAAATTTGAATGTAAATACTTCTAATAGATGTTTCAACAGCACAGTATCTTCAAGGAAGCAGGTCACCAAGATGCTGGCAGTGGTTGTAATTCTGTTTGCCCTTTTATGGATGCCCTACAGGACTCTGGTGGTTGTCAACTCATTTCTCTCCAGTCCTTTCCAAGAAAATTGGTTTTTGCTCTTTTGCAGAATTTGCATTTATCTCAACAGTGCCATCAACCCGGTGGTTTACAATCTCATGTCCCAGAAATTCCGTGCAGCCTTCAGAAAGCTCTGCAACTGCAAGCAGAAGCCAACAGAGAAACCTGCTAACTACAGTGTGGCCCTAAATTACAGCGTCATCAAGGAGTCAGACCATTTCAGCACAGAGCTTGATGATATCACTGTCACTGACACTTACCTGTCTGCCACAAAAGTGTCTTTTGATGACACCTGCTTGGCTTCTGAGGTATCCTTTAGCCAAAGTTGA
->mouse
-ATGGAGAATGATACTGTCAGTGAAATGAACCAAACCGAGCTCCAGCCACAAGCAGCTGTGGCCCTCGAGTACCAGGTGGTTACCATCTTACTTGTGGTCATTATTTGTGGACTGGGCATTGTGGGCAACATCATGGTAGTCCTGGTGGTCATGAGAACAAAGCACATGAGAACCCCTACAAACTGTTACCTGGTAAGTCTGGCTGTGGCAGATCTCATGGTTCTGGTGGCTGCAGGCCTCCCCAACATAACCGACAGTATCTATGGTTCCTGGGTCTATGGCTATGTTGGCTGCCTCTGCATTACATATCTCCAGTACCTAGGCATTAATGCATCTTCATGTTCAATAACGGCCTTTACCATTGAAAGGTACATAGCAATCTGTCACCCCATCAAAGCCCAGTTTCTCTGCACGTTTTCCAGAGCCAAAAAAATCATCATCTTTGTCTGGGCCTTCACATCCATTTACTGTATGCTCTGGTTCTTCCTGCTGGATCTCAACATCAGCACCTACAAAAACGCTGTTGTGGTTTCCTGTGGCTACAAGATCTCCAGGAACTACTACTCACCTATTTACCTAATGGACTTTGGTGTCTTTTATGTTGTGCCAATGATCCTGGCCACTGTGCTTTATGGATTTATAGCTAGAATCCTCTTCTTAAACCCCATTCCTTCAGACCCTAAAGAAAACTCTAAGATGTGGAAAAATGACTCAATCCATCAGAACAAGAATTTGAATTTAAATGCCACCAACAGATGCTTCAACAGCACTGTATCTTCCAGGAAGCAGGTCACCAAGATGCTCGCAGTGGTTGTAATTCTGTTTGCCCTTTTATGGATGCCCTACAGGACTCTTGTGGTTGTCAACTCATTTCTCTCCAGCCCTTTCCAGGAAAATTGGTTCTTGCTCTTTTGCAGAATTTGCATTTATCTCAACAGTGCCATCAACCCAGTGATTTACAACCTCATGTCTCAGAAATTTCGTGCAGCCTTCAGGAAGCTCTGCAATTGCAAGCAGAAGCCCACAGAAAAAGCTGCTAACTACAGTGTGGCCCTAAATTACAGTGTCATCAAGGAGTCAGACCGCTTCAGCACAGAGCTAGAAGATATCACCGTCACCGATACGTATGTGTCAACCACAAAAGTGTCCTTTGATGACACCTGCTTGGCCTCTGAGGTAACCTTTAGTCAGAGCTGA
-
->human
-ATGACTGAGTTCTGGCTTATATCTGCTCCTGGGGAGAAAACCTGTCAGCAAACATGGGAGAAATTGCATGCGGCAACTTCAAAGAACAATAATCTTGCTGTCACTTCCAAGTTCAATATTCCTGACTTAAAGGTTGGCACGTTGGATGTCTTGGTTGGCTTGTCAGATGAACTGGCTAAACTGGATGCATTTGTAGAAGGAGTGGTTAAGAAAGTAGCTCAATACATGGCTGATGTATTGGAAGATAGCAAAGACAAAGTTCAAGAGAATCTGTTGGCTAATGGAGTGGACTTGGTTACTTATATAACAAGGTTCCAGTGGGACATGGCCAAATATCCAATCAAGCAGTCCCTGAAAAATATTTCTGAAATAATTGCCAAGGGAGTAACTCAGATTGATAATGACCTGAAATCTCGAGCATCTGCATACAATAACCTGAAAGGAAATCTTCAGAATTTGGAACGAAAGAATGCAGGAAGTTTGCTAACTAGAAGTCTAGCAGAAATTGTGAAGAAGGATGACTTTGTTCTTGATTCAGAGTATCTCGTCACATTACTGGTAGTAGTTCCCAAGTTAAACCACAACGACTGGATTAAGCAGTATGAAACACTAGCCGAAATGGTAGTTCCAAGGTCTAGCAATGTTCTTTCAGAGGACCAAGACAGTTACCTGTGTAATGTCACCTTGTTTAGGAAGGCAGTTGATGACTTCAGACACAAAGCCAGAGAAAACAAATTCATTGTTCGTGACTTCCAGTATAATGAAGAGGAGATGAAAGCAGATAAAGAAGAAATGAACAGGCTTTCTACTGATAAGAAAAAACAATTTGGACCACTTGTACGGTGGCTGAAAGTGAATTTTAGTGAAGCATTTATTGCATGGATTCACGTGAAAGCATTACGGGTTTTCGTTGAGTCTGTTTTAAGGTATGGCTTGCCAGTGAACTTCCAAGCAATGCTACTTCAGCCCAATAAGAAAACTTTGAAGAAACTGAGAGAAGTATTACATGAATTGTATAAACATCTAGACAGCAGTGCAGCAGCTATTATTGATGCTCCTATGGATATTCCAGGTTTAAACCTGAGTCAACAAGAATACTACCCCTATGTGTACTACAAGATTGATTGCAACTTGCTGGAATTCAAGTGA
->chimp
-ATGACTGAGTTCTGGCTTATATCTGCTCCTGGGGAGAAAACCTGTCAGCAAACATGGGAGAAATTGCATGCGGCAACTTCAAAGAACAATAATCTTGCTGTCACTTCCAAGTTCAATATTCCTGACTTAAAGGTTGGCACGTTGGATGTCTTGGTTGGCTTGTCAGATGAACTGGCTAAACTGGATGCATTTGTAGAAGGAGTGGTTAAGAAAGTAGCTCAATACATGGCTGATGTATTGGAAGATAGCAAAGACAAAGTTCAAGAGAATCTGTTGGCTAATGGAGTGGACTTGGTTACTTATATAACAAGGTTTCAGTGGGACATGGCCAAATATCCAATCAAGCAGTCCCTGAAAAATATTTCTGAAATAATTGCCAAGGGAGTAACTCAGATTGATAATGACCTGAAATCTCGAGCATCTGCATACAATAACCTGAAAGGAAATCTTCAGAATTTGGAACGAAAGAATGCAGGAAGTTTGCTAACTAGAAGTCTAGCAGAAATTGTGAAGAAGGATGACTTTGTTCTTGATTCAGAGTATCTCGTCACATTACTGGTAGTAGTTCCCAAGTTAAACCACAACGACTGGATTAAGCAGTATGAAACACTAGCCGAAATGGTAGTTCCAAGGTCTAGCAATGTTCTTTCAGAGGACCAAGACAGTTACCTGTGTAATGTCACCTTGTTTAGGAAGGCAGTTGATGACTTCAGACACAAAGCCAGAGAAAACAA??????????????????????????ATGAAGAGGAGATGAAAGCAGATAAAGAAGAAATGAACAGG???TCTACTGATAAGAAAAAACAATTTGGACCACTTGTACGGTGGCTGAAAGTGAATTTTAGTGAAGCATTTATTGCATGGATTCACGTGAAAGCATTACGGGTTTTCGTTGAGTCTGTTTTAAGGTATGGCTTGCCAGTGAACTTCCAAGCAAT?CTACTTCAGCCCAATAAGAAAACTTTGAAGAAACTGAGAGAAGTATTACATGAATTGTATAAACATCTAGACAGCAGTGCAGCAGCTATTATTGATGCTCCTATGGATATTCCAGGTTTAAACCTGAGTCAACAAGAATACTACCCCTATGTGTACTACAAGATTGATTGCAACTTGCTGGAATTCAAGTGA
->mouse
-ATGACTGAGTTCTGGCTCATATCTGCTCCTGGGGAGAAAACCTGTCAGCAAACATGGGAGAAACTACATGCAGCGACCACCAAGAACAATAATCTTGCCGTCTCTTCCAAGTTCAACATTCCTGACCTAAAGGTTGGCACGTTGGATGTCTTGGTTGGCTTGTCGGATGAACTGGCTAAACTGGATGCATTTGTAGAAGGTGTGGTCAAGAAAGTGGCTCAGTACATGGCTGATGTGCTGGAGGACAGCAAAGATAAAGTTCAGGAGAACTTGCTGGCCAGCGGAGTTGACTTGGTTACTTACATAACAAGGTTCCAGTGGGATATGGCTAAATATCCAATCAAGCAGTCTCTGAAAAATATTTCTGAAATAATTGCCAAGGGAGTGACTCAGATCGATAATGACCTAAAGTCTCGGGCGTCTGCATACAATAACCTGAAAGGGAATCTTCAGAATTTAGAGCGAAAGAACGCGGGAAGTTTGCTAACGCGAAGCCTGGCGGAAATCGTGAAGAAAGATGACTTTGTTCTTGATTCGGAGTATCTTGTCACATTGCTGGTGGTAGTTCCCAAGCTGAACCACAATGACTGGATTAAGCAGTATGAAACGCTCGCAGAAATGGTAGTACCAAGGTCAAGCAATGTTCTTTCAGAGGACCAAGACAGTTATCTTTGTAACGTCACCTTGTTTAGAAAAGCAGTTGATGATTTCAGACACAAAGCCAGAGAAAACAAGTTCATAGTTCGTGACTTCCAGTATAACGAGGAGGAGATGAAAGCAGATAAAGAAGAAATGACCAGGCTGTCTACTGACAAGAAGAAGCAGTTTGGACCACTTGTGCGGTGGCTTAAAGTGAATTTCAGTGAGGCGTTTATTGCGTGGATTCATATAAAAGCATTACGGGTTTTTGTGGAGTCTGTTTTAAGGTATGGCTTGCCGGTGAACTTCCAAGCAATGCTCCTTCAGCCGAATAAGAAGTCAGTGAAGAAGCTAAGAGAAGTGCTGCACGAGTTGTACAAGCATCTGGACAGCAGTGCGGCTGCCATCATTGACGCTCCCATGGATATCCCTGGCCTAAACCTGAGTCAGCAGGAATACTACCCCTATGTGTATTACAAGATTGATTGCAACTTGCTGGAATTCAAGTAA
-
->human
-ATGCCTTCCAGCGGCAGAGCGCTGCTGGACTCGCCG---CTGGACAGCGGCTCCCTGACCTCCCTGGACTCTAGTGTCTTCTGCAGCGAGGGTGAAGGGGAGCCCTTGGCGCTCGGGGACTGCTTCACGGTCAACGTGGGCGGCAGCCGCTTCGTGCTCTCGCAGCAGGCGCTGTCCTGCTTCCCGCACACGCGCCTTGGCAAGCTGGCCGTGGTGGTGGCTTCCTACCGCCGCCCCGGGGCCCTGGCCGCCGTGCCCAGCCCTCTGGAGCTTTGCGACGATGCCAACCCCGTGGACAACGAGTACTTCTTCGACCGCAGCTCGCAGGCGTTCCGATATGTCCTGCACTACTACCGCACCGGCCGCCTGCATGTCATGGAGCAGCTGTGCGCGCTCTCCTTCCTGCAGGAGATCCAGTACTGGGGCATCGATGAGCTCAGCATCGATTCCTGCTGCAGGGACAG????????????????????????????????????????????????????????????????????????????????????????????????????CCTTGTCCCACTGTTCGCCAGAAGCTCTGGAATATCCTGGAGAAACCTGGATCTTCCACAGCTGCCCGTATCTTTGGCGTCATCTCCATTATCTTCGTGGTGGTGTCCATCATTAACATGGCCCTGATGTCAGCTGAGTTAAGCTGGCTGGACCTGCAGCTGCTGGAAATCCTGGAGTATGTGTGCATTAGCTGGTTCACCGGGGAGTTTGTCCTCCGCTTCCTGTGTGTGCGGGACAGGTGTCGCTTCCTAAGAAAGGTGCCAAACATCATAGACCTCCTTGCCATCTTGCCCTTCTACATCACTCTTCTGGTAGAGAGCCTAAGTGGGAGCCAGACCACGCAGGAGCTGGAGAACGTGGGGCGCATTGTCCAGGTGTTGAGGCTGCTCAGGGCTCTGCGCATGCTAAAGCTGGGCAGACATTCCACAGGATTACGCTCCCTTGGGATGACAATCACCCAGTGTTACGAAGAAGTCGGCCTACTGCTCCTATTTCTATCCGTGGGAATCTCTATATTTTCAACTGTAGAATACTTTGCTGAGCAAAGCATTCCTGACACAACCTTCACAAGTGTCCCTTGTGCATGGTGGTGGGCCACCACCTCTATGACTACTGTGGGATATGGGGACATTAGACCAGACACCACCACAGGCAAAATCGTGGCCTTCATGTGTATATTATCGGGAATTCTTGTCTTGGCCTTGCCTATTGCTATTATTAACGATCGCTTCTCTGCTTGCTACTTCACCTTGAAACTCAAGGAAGCAGCTGTTAGACAGCGTGAAGCCCTAAAGAAGCTTACCAAGAATATAGCCACTGACTCATATATCAGTGTTAACTTGAGAGATGTCTATGCCCGGAGTATCATGGAGATGCTGCGACTGAAAGGCAGAGAAAGAGCAAGTACTAGGAGCAGCGGGGGAGATGATTTCTGGTTTTGA
->chimp
-ATGCCTTCCAGCGGCAGAGCGCTGCTGGACTCGCCG---CTGGACAGCGGCTCCCTGACCTCCCTGGACTCTAGTGTCTTCTGCAGCGAGGGTGAAGGGGAGCCCTTGGCGCTCGGGGACTGCTTCACGGTCAACGTGGGCGGCAGCCGCTTCGTGCTCTCGCAGCAGGCGCTGTCCTGCTTCCCGCACACGCGCCTTGGCAAGCTGGCCGTGGTGGTGGCTTCCTACCGCCGCCCCGGGGCCCTGGCCGCCGTGCCCAGCCCTCTGGAGCTTTGCGACGATGCCAACCCCGTGGACAACGAGTACTTCTTCGACCGCAGCTCGCAGGCGTTCCGATATGTCCTGCACTACTACCGCACCGGCCGCCTGCATGTCATGGAGCAGCTGTGCGCGCTCTCCTTCCTGCAGGAGATCCAGTACTGGGGCATCGATGAGCTCAGCATCGATTCCTGCTGCAGGGACAG???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CCTGGAG???CCTGGATCTTCCACAGCTGCCCGTATCTTTGGTGTCATCTCCATTGTCTTCGTGGTGGTGTCCATCATTAACATGGCCCTGATGTCAGCTGAGTTAAGCTGGCTGGACCTGCAGCTGCTGGAAATCCTGGAGTATGTGTGCATTAGCTGGTTCACCGGGGAGTTTGTCCTCCGCTTCCTGTGTGTGCGGGACAGGTGTCGCTTCCTAAGAAAGGTGCCAAACATCATAGACCTCCTTGCCATCTTGCCCTTCTACATCACTCTTCTGGTAGAGAGCCTAAGTGGGAGCCAGACCACGCAGGAGCTGGAGAACGTGGGGCGCATTGTCCAGGTGTTGAGGCTGCTCAGGGCTCTGCGCATGCTAAAGCTGGGCAGACATTCCACAGGATTACGCTCCCTTGGGATGACAATCACCCAGTGTTACGAAGAAGTCGGCCTACTGCTCCTATTTCTATCCGTGGGAATCTCTATATTTTCAACTGTAGAATATTTTGCTGAGCAAAGCATTCCTGACACAACCTTCACAAGTGTCCCTTGTGCATGGTGGTGGGCCACCACCTCTATGACTACTGTGGGATATGGGGACATTAGACCAGACACCACCACAGGCAAAATCGTGGCCTTCATGTGTATATTATCGGGAATTCTTGTCTTGGCCTTGCCTATTGCTATTATTAACGATCGCTTCTCTGCTTGCTACTTCACCTTGAAACTCAAGGAAGCAGCTGTTAGACAGCGTGAAGCCCTAAAGAAGCTTACCAAGAATATAGCCACTGACTCATATATCAGTGTTAACTTGAGAGATGTCTATGCCCGGAGTATCATGGAGATGCTGCGACTGAAAGGCAGAGAAAGAGCAAGTACTAGGAGCAGCGGGGGAGATGATTTCTGGTTTTGA
->mouse
-CTGTCACCCCGCAACCGGCCGCTACTGGACTCGTCGTCGCTGGACAGCGGTTCTCTGACCTCACTGGACTCCAGTGTTTTCTGTAGCGAGGGCGAAGGGGAACCCTTGGCTCTGGGGGACTGCTTTACAGTCAACGTGGGCGGTAGCCGCTTCGTGCTCTCGCAGCAAGCTCTGTCCTGCTTCCCGCACACGCGCCTGGGCAAACTGGCCGTAGTGGTGGCCTCCTACCGCCGCCTGGGTGCCCTGGCTGCCGCCCCCAGCCCCCTGGAGCTTTGCGATGATGCGAATCCGGTGGACAACGAGTACTTCTTTGATCGCAGCTCTCAGGCGTTCCGTTATGTCCTGCACTACTATCGCACTGGTCGCCTGCATGTCATGGAGCAGCTCTGTGCGCTCTCCTTTCTTCAGGAGATCCAGTACTGGGGCATAGATGAACTCAGCATTGACTCCTGCTGCAGGGACAGCCTTGTCCCACTGTCCGACAAAAGCTCTGGGATATTCTGGAGAAACCTGGATCTTCCACAGCAGCCCGGATCTTTGGAGTAATCTCCATCATTTTTGTGGCA----------------------------------------------------------------------------------------------------GTGTCCATCGTCAACATGGCCCTGATGTCAGCTGAGCTTAGCTGGCTCAACCTACAGCTGCTGGAGATCTTGGAGTATGTGTGCATCAGCTGGTTCACCGGGGAGTTCGTTCTGCGCTTCCTATGTGTGAAAGACAGGTGCCACTTCCTGAGGAAGGTTCCAAACATCATAGACCTCCTTGCCATCTTGCCCTTCTATATAACTCTTCTGGTGGAAAGCCTGAGCGGCAGCCACACCACACAAGAGCTGGAAAATGTGGGACGTCTGGTCCAGGTCTTGAGGCTCCTCAGAGCTCTGCGCATGCTGAAACTGGGAAGGCATTCTACAGGATTGCGCTCACTTGGGATGACAATCACTCAGTGCTATGAAGAAGTTGGCCTACTGCTCCTGTTTCTATCTGTGGGGATTTCTATATTTTCAACAATAGAATACTTTGCAGAGCAAAGCATTCCTGATACAACCTTCACAAGTGTTCCTTGTGCATGGTGGTGGGCCACAACATCCATGACTACAGTAGGATATGGGGACATTAGACCAGACACCACCACAGGCAAAATCGTGGCCTTCATGTGTATTCTGTCAGGAATCCTTGTCTTGGCCTTGCCTATTGCCATTATTAATGATCGATTCTCTGCTTGCTACTTCACCTTGAAACTCAAGGAAGCAGCTGTGAGACAGCGTGAAGCTCTCAAGAAACTTACCAAGAATATAGCCACTGACTCATATATTAGTGTTAACTTGAGGGATGTCTATGCCCGGAGCATAATGGAGATGCTTCGATTAAAGGGCAGGGAGAGAGCAAGTACTAGAAGCAGTGGTGGAGATGATTTCTGGTTTTAA
-
->human
-AGGAAAAGAAGCCCATCTGTGTCCAGAGATCAGAATAGAAGATACGACCAAAGGGAAGAAAGAGAGGAATATTCACAGTATGCTACTTCGGATACCGCAATGCCTAGATCTCCATCAGATTATGCTGATAGGCGATCTCAACATGAACCTCAGTTTTATGAAGACTCTGATCATTTAAGTTATAGGGACTCCAACAGGAGAAGTCATAGGCATTCCAAAGAATATATTGTAGATGATGAGGATGTGGAAAGCAGAGATGAATACGAAAGGCAAAGGAGAGAGGAAGAGTACCAGTCACGCTACCGAAGTGATCCGAATTTGGCCCGTTATCCAGTAAAGCCACAACCCTATGAAGAACAAATGCGGATCCATGCTGAAGTGTCCCGAGCACGGCATGAGAGAAGGCATAGTGATGTTTCTTTGGCAAATGCTGATCTGGAAGATTCCAGGATTTCTATGCTAAGGATGGATCGACCATCAAGGCAAAGATCTATATCAGAACGTAGAGCTGCCATGGAAAATCAGCGATCTTATTCAATGGAAAGAACTCGAGAGGCTCAGGGACCAAGTTCTTATGCACAAAGGACCACAAACCATAGTCCTCCTACCCCCAGGAGGAGTCCACTACCCATAGATAGACCAGACTTGAGGCGTACTGACTCACTACGGAAACAGCACCACTTAGATCCTAGCTCTGCTGTAAGAAAAACAAAACGGGAAAAAATGGAAACAATGTTAAGGAATGATTCTCTCAGTTCAGACCAGTCAGAGTCAGTGAGACCTCCACCACCAAAGCCTCATAAATCAAAGAAAGGCGGTAAAATGCGCCAGATTTCGTTGAGCAGTTCAGAGGAGGAATTGGCTTCCACGCCTGAATATACAAGTTGTGATGATGTTGAGATTGAAAGTGAGAGTGTAAGTGAAAAAGGGGACAGTCAAAAGGGAAAAAGAAAAACTAGTGAGCAGGCAGTTTTGTCGGACTCTAACACCAGGTCTGAGAGACAAAAGGAAATGATGTACTTTGGTGGCCACTCTTTGGAAGAGGATTTGGAATGGTCTGAACCTCAGATTAAGGACTCTGGGGTAGATACGTGTAGTAGCACAACCCTTAACGAGGAGCATAGCCATAGTGATAAGCACCCTGTAACCTGGCAACCATCTAAAGATGGAGATCGTTTAATTGGTCGCATTTTATTAAATAAGCGTCTAAAAGATGGAAGTGTACCTCGAGATTCAGGAGCAATGCTTGGCTTGAAGGTTGTAGGAGGAAAGATGACTGAATCAGGTCGGCTTTGTGCATTTATTACTAAAGTAAAAAAAGGAAGTTTAGCTGATACTGTAGGACATCTTAGACCAGGTGATGAAGTATTAGAATGGAATGGAAGACTACTGCAAGGAGCCACATTTGAGGAAGTGTACAACATCATTCTAGAATCCAAACCTGAACCACAAGTAGAACTTGTAGTTTCAAGGCCTATTGG???????????????????????????????????????????????GTTCTAGCTCCTTTGAATCTCAAAAAATGGATCGTCCTTCTATTTCTGTTACCTCTCCCATGAGTCCTGGAATGTTGAGGGATGTCCCA????????????????????????ATAAAACTATGGTTTGACAAGGTTGGTCACCAATTAATAGTTACAATTTTGGGAGCAAAAGATCTCCCTTCCAGGGAAGATGGGAGGCCAAGGAATCCTTATGTTAAAATTTACTTTCTTCCAGACAGAAG????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ATTTTAATTGAATTAGAAACAGCATTATTAGATGATGAGCCACATTGGTACAAACTTCAGACGCATGATGTCTCTTCATTGCCACTTCCCCACCCTTCTCCATATATGCCACGAAGACAGCTCCATGGAGAGAGCCCAACACGGAGGTTGCAAAGGTCAAAGAGAATAAGTGATAGTGAAGTCTCTGACTATGACTGTGATGATGGAATTGGTGTAGTATCAGATTATCGACATGATGGTCGAGATCTTCAAAGCTCAACATTATCAGTGCCAGAACAAGTAATGTCATCAAACCACTGTTCACCATCAGGGTCTCCTCATCGAGTAGATGTTATAGGAAGGACTAGATCATGGTCACCCAGTGTCCCTCCTCCACA???TCGGAATGTGGAACAGGGGCTTCGAGGGACCCGCACTATGACCGGACATTATAATACAATTAGCCGAATGGACAGACATCGTGTCATGGATGACCATTATTCTCCAGATAGAGACAGGGATTGTGAAGCAGCAGATAGACAGCCATATCACAGATCCAGATCAACAGAACAACGGCCTCTCCTTGAGCGGACCACCACCCGCTCCAGATCCACTGAACGTCCTGATACAAACCTCATGAGGTCGATGCCTTCATTAATGACTGGAAGATCTGCCCCTCCTTCACCTGCCTTATCGAGGTCTCATCCTCGTACTGGGTCTGTCCAGACAAGCCCATCAAGTACTCCAGTCGCAGGACGAAGGGGCCGACAGCTTCCACAGCTTCCACCAAAGGGAACGTTGGATAGAAAAGCAGGAGGTAAAAAACTAAGGAGCACTGTCCAAAGAAGTACAGAAACAGGCCTGGCCGTGGAAATGAGGAACTGGATGACTCGACAGGCAAGCCGAGAGTCTACAGATGGTAGCATGAACAGCTACAGCTCAGAAGGAAATCTGATTTTCCCTGGTGTTCGCTTGGCCTCTGATAGCCAGTTCAGTGATTTCCTGGATGGCCTTGGCCCTGCTCAGCTAGTGGGACGCCAGACTCTGGCAACACCTGCAATGGGTGACATTCAGGTAGGAATGATGGACAAAAAGGGACAGCTGGAGGTAGAAATCATCCGGGCCCGTGGCCTTGTTGTAAAACCAGGTTCCAAGACACTGCCAGCACCGTATGTAAAAGTGTATCTATTAGATAACGGAGTCTGCATAGCCAAAAAGAAAACAAAAGTGGCAAGAAAAACGCTGGAACCCCTTTACCAGCAGCTATTATCTTTCGAAGAGAGTCCACAAGGAAAAGTTTTACAGATCATCGTCTGGGGAGATTATGGCCGCATGGATCACAAATCTTTTATGGGAGTGGCCCAGATACTTTTAGATGAACTAGAGCTATCCAATATGGTGATCGGATGGTTCAAACTTTTCCCACCTTCCTCCCTAGTAGATCCAACCTTGGCCCCTCTGACAAGAAGAGCTTCCCAATCATCTCTGGAAAGTTCAACTGGACCTTCTTACTCTCGTTCATAG
->chimp
-AGGAAAAGAAGCCCATCTGTGTCCAGAGATCAGAATAGAAGATACGACCAAAGGGAAGAAAGAGAGGAATATTCACAGTATGCTACTTCGGATACCGCAATGCCTAGATCTCCATCAGATTATGCTGATAGGCGATCTCAACATGAACCTCAGTTTTATGAAGACTCTGATCATTTAAGTTATAGGGACTCCAACAGGAGAAGTCATAGGCATTCCAAAGAATATATTGTAGATGATGAGGATGTGGAAAGCAGAGATGAATACGAAAGGCAAAGGAGAGAGGAAGAGTACCAGTCACGCTACCGAAGTGATCCGAATTTGGCCCGTTATCCAGTAAAGCCACAACCCTATGAAGAACAAATGCGGATCCATGCTGAAGTGTCCCGAGCACGGCATGAGAGAAGGC?TAGTGATGTTTCTTTGGCAAATGCTGATC??????????????????????????????????????????????????????????ATCAGAACGTAGA?CTGC???GGAAAATCA?C?A???TATTCA??GGAAAGA???????AGGCTCAGGGACCAA?TTCT???GCAC?AAG?AC???A?ACCATAGTCCTCCTACCCCCAGGAGGAGTCCACTACCCATAGATAGACCAGACTTGAGGCGTACTGACTCACTACGGAAACAGCACCACTTAGATCCTAGCTCTGCTGTAAGAAAAACAAAACGGGAAAAAATGGAAACGATGTTAAGGAATGATTCTCTCAGTTCAGACCAGTCAGAGTCAGTGAGACCTCCACCACCAAAGCCTCATAAATCAAAGAAAGGCGGTAAAATGC??????????????????????????????????????????????????????????????????????????????????????????????????????GGGACAGTCAAAAGGGAAAAAGAAAAAC?AGTGAGCAGGCAGTTTTGTCGGAC???AACACCAGG????AGAGACAAAAGGAAATGATGTACTTTG???GCCACTCTTTGGAAGAGGAT??GGAATGGTCTGAACCTCAGATTAAGGACTCTGGGGTAGATACGTGTAGTAGCACAACCC??AACGAGGAGCAT???????????????CACCCTGTAACCTGGCAACCATCTAAAGATGGAGATCGTTTAATTGGTCGCATTTTATTGAATAAGCGTCTAAAAGATGGAAGTGTACCTCGAGATTCAGGAGCAATGCTTGGCTTGAAGGTTGTAGGAGGAAAGATGACTGAATCAGGTCGGCTTTGTGCATTTATTACTAAAGTAAAAAAAGGAAGTTTAGCTGATACTGTAGGACATC?????????GTGATGAAGTATTAGAATGGAATGGAAGACTACTGCAAGGAGCCACATTTGAGGAAGTGTACAACATCATTCTAGAATCCAAACCTGAACCACAAGTAGAACTTGTAGTTTCAAGGCCTATTGG???????????????????????????????????????????????GTTCTAGCTCCTTTGAATCTCAAAAAATGGATCGTCCTTCTATTTCTGTTACCTCTCCCATGAGTCCTGGAATGTTGAGGGATGTCCCA????????????????????????ATAAAACTATGGTTTGACAAGGTTGGTCACCAATTAATAGTTACAATTTTGGGAGCAAAAGATCTCCCTTCCAGGGAAGATGGGAGGCCAAGGAATCCTTATGTTAAAATTTACTTTCTTCCAGACAGAAG????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ATTTTAATTGAATTAGAAACAGCATTATTAGATGATGAGCCACATTGGTACAAACTTCAGACGCATGATGTCTCTTCATTGCCACTTCCCCACCCTTCTCCATATATGCCACGAAGACAGCTCCATGGAGAGAGCCCAACACGGAGGTTGCAAA????????????????????????????CTCTGACTATGACTGTGATGATGGAAT?GGTGTA???????ATTATCGACATGATGGTCGAGATCTTCAAAGCTCAACATTATCAGTGCCAGAACAAGTAATGTCATCAAACCACTGTTCACCATCAGGGTCTCCTCATCGAGTAGA????ATAGGAAGGACTAGATCATGGTCACCCAGT?????????????????TCGGAATGTGGAACAGGGGCTTCGAGGGACCCG?ACTACGACCGGACATTATAATACAATTAGCCGAATGGATAGACATCGTGTCATGGATGACCATTATTCTCCAGATAGAGACAG????????????????????GACAGCCATATCA????TCCAGATCAACAGAACAACG???TCTTCTTG???GGACCACCACCCGCTCC???TCCACTGA?CGTCCTGATACAAACCTCA?????????????????????????????????????????????????????????????GTCTCATCCTCGTACTGGGTCTGTCCAGACAAGCCCATCAAGTACTCCAGTGGCAGGACGAAGGGGCCGACAGCTTCCACAGCTTCCACCAAAGGGAACGTTGGATAGAAAAGCAGGAGGTAAAAAACTAAGGAGCACTGTCCAAAGAAGTACAGAAACAGGCCTGGCCGTGGAAATGAGGAACTGGATGACTCGACAGGCAAGCCGAGAGTCTACAGATGGTAGCATGAACAGCTACAGCTCAGAAGGAAA????ATTTTCCCTGGTGTTCGCTTGGCCTCTGATAGCCAGTTCAGTGATTTCCTGGATGGCCTTGGCCCTGCTCAGCTAGTGGGACGCCAGACTCTGGCAACACCTGCAATGG??????????????????????????????????????????????????????????????????????????????????????????????????????CACCGTATGTAAAAGTGTATCTATTAGATAACGGAGTCTGCATAGCCAAAAAGAAAACAAAAGTGGCAAGAAAAACGCTGGAACCCCTTTACCAGCAGCTATTATCTTTCGAAGAGAGTCCACAAGGAAAAGTTTTACAG???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
->mouse
-AGAAAACGAAGTCCATCAGTGTCCAGGGATCAAAATCGAAGATACGAGCAAAGTGAAGAAAGAGAGGACTACTCACAGTATGTTCCTTCAGATGGTACAATGCCAAGATCTCCTTCGGATTATGCTGATAGACGATCTCAGCGTGAGCCTCAATTTTATGAAGAACCTGGTCATTTAAATTACAGGGATTCTAACAGGAGAGGCCATAGACATTCCAAAGAGTATATTGTGGATGATGAAGATGTGGAGAGCAGAGATGAATATGAAAGACAAAGGAGAGAGGAGGAATACCAGGCACGCTACAGAAGTGATCCAAATCTGGCCCGGTATCCCGTAAAGCCACAACCCTACGAAGAACAAATGCGCATCCACGCTGAGGTGTCCAGGGCACGACATGAGAGAAGGCACAGTGATGTTTCTTTGGCAAACGCTGAACTAGAAGATTCCAGGATTTCTCTGCTAAGGATGGATAGACCATCAAGGCAAAGATCTGTATCTGAACGTAGAGCTGCAATGGAAAACCAACGATCGTATTCAATGGAAAGAACTCGAGAGGCTCAGGGACAAAGTTCTTATCCACAAAGGACCTCAAATCATAGTCCTCCCACCCCTCGGCGGAGCCCTATACCGCTTGATAGACCAGACATGAGGCGCGCTGACTCCCTACGGAAACAGCACCACTTAGATCCCAGCTCTGCTGTGAGGAAAACGAAGCGAGAAAAAATGGAAACCATGTTAAGGAATGATTCTTTGAGTTCAGACCAGTCCGAGTCAGTGAGGCCGCCCCCACCAAGGCCTCATAAATCCAAGAAAGGAGGTAAAATGCGCCAGGTTTCACTGAGCAGCTCGGAGGAGGAGCTGGCATCCACACCTGAGTATACAAGCTGTGATGATGTGGAGCTGGAAAGCGAGAGTGTGAGTGAGAAAGGGGACAGTCAAAAGGGAAAAAGAAAAACTAGTGAGCAGGGAGTTTTGTCGGATTCTAACACCAGGTCTGAGAGACAAAAGAAAAGGATGTACTATGGTGGCCACTCTTTGGAAGAGGATTTGGAATGGTCTGAGCCTCAGATTAAGGACTCTGGGGTAGATACCTGTAGTAGCACAACCCTTAACGAGGAGCATAGCCATAGTGATAAGCACCCTGTGACCTGGCAGCCATCCAAAGATGGAGATCGCCTAATTGGTCGTATTTTATTAAATAAGCGTTTAAAAGATGGGAGTGTACCTCGAGACTCAGGAGCAATGCTGGGCTTAAAGGTTGTAGGAGGAAAGATGACTGAATCAGGTCGACTTTGTGCATTTATTACCAAAGTAAAAAAAGGAAGTTTAGCTGATACTGTAGGACATCTTAGACCAGGTGATGAAGTCTTGGAATGGAATGGGAGGCTATTGCAAGGAGCCACATTTGAGGAAGTTTACAACATTATTCTAGAATCCAAACCTGAACCACAAGTTGAGCTTGTTGTTTCAAGGCCAATTGG???????????????????????????????????????????????GTTCTAGCTCATTTGAATCTCAAAAAATGGACCGTCCTTCTATATCCGTTACCTCACCCATGAGTCCTGG------------------------CATGCTGAGGGATGTCCCGATAAAACTATGGTTTGACAAGGTTGGTCACCAGTTGATAGTTACAATTTTGGGAGCAAAGGATCTCCCTTCCAGGGAAGATGGGAGGCCAAGGAATCCTTATGTTAAGATTTACTTCCTTCCAGATAGAAG????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ATTTTAATTGAATTGGAAACAGCTCTGCTAGATGATGAGCCGCACTGGTATAAGCTGCAGACCCATGATGTCTCCTCATTGCCACTCCCTCGCCCTTCCCCATATCTGCCCCGGAGGCAGCTCCATGGAGAGAGCCCAACGCGCAGGCTGCAAAGGTCGAAGAGAATAAGTGACAGTGAAGTGTCTGACTACGACTGCGAGGATGGCGTGGGAGTAGTGTCAGATTATCGACACAATGGCCGCGATCTTCAAAGCTCCACGTTGTCGGTGCCAGAACAAGTCATGTCATCAAATCATTGCTCACCATCAGGGTCTCCTCATCGAGTAGATGTTATAGGAAGGACAAGGTCATGGTCGCCTAGTGCCCCTCCTCC---TCATAGGAATGTGGAACAGGGGCACCGAGGGACACGTGCTA---CTGGCCATTACAACACAATTAGCCGAATGGATAGACACCGTGTCATGGATGACCACTACTCTTCAGATAGAGACAGGGATTGTGAAGCAGCAGATAGACAGCCATATCACAGATCCAGATCAACAGAACAACGGCCTCTCCTAGAGCGGACCACCACCCGCTCCAGATCCTCTGAACGTCCTGATACAAACCTCATGAGGTCGATGCCTTCATTAATGACTGGAAGATCTGCCCCTCCTTCACCTGCCTTATCGAGGTCTCACCCTCGTACCGGGTCTGTCCAGACAAGCCCATCAAGTACTCCGGGAACAGGACGAAGGGGCCGACAGCTTCCACAGCTTCCACCAAAGGGAACATTGGAGAGAAAAGGAGGAGGTAAAAAGCTACGGAGCACTGTTCAGAGAAGCACGGAGACCGGGCTAGCAGTGGAGATGAGGAACTGGATGACCCGCCAGGCCAGCCGGGAATCCACAGATGGCAGCATGAACAGCTATAGCTCGGAAGGAAATCTGATCTTCCCTGGGGTCCGCCTGGCCTCTGACAGCCAGTTCAGTGATTTCCTGGATGGCCTGGGCCCTGCTCAGCTAGTGGGACGCCAGACCCTGGCTACTCCTGCAATGGGTGACATTCAGGTGGGAATGATGGATAAAAAGGGACAGCTGGAGGTAGAAATCATCCGGGCGCGCGGCCTTGTGGTAAAACCAGGTTCCAAGACACTGCCAGCACCGTATGTCAAGGTGTATCTGTTAGACAACGGAGTCTGCATAGCCAAAAAGAAAACCAAGGTGGCGAGAAAGACCCTGGAGCCCCTGTACCAGCAGCTCTTGTCCTTCGAGGAGAGCCCCCAGGGGAGGGTGTTACAGATCATTGTCTGGGGAGATTATGGTCGTATGGATCACAAATCCTTTATGGGAGTGGCCCAGATACTCTTAGATGAACTGGAACTATCCAACATGGTGATTGGATGGTTCAAACTCTTCCCTCCTTCCTCCCTAGTAGATCCAACCTTGGCACCTCTGACAAGAAGAGCTTCCCAATCGTCTCTGGAAAGTTCTACCGGACCTTCTTACTCTCGTTCATAG
-
->human
-???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GGCACCTTCTCTCTGATTATTGAAGCTCTCCACACAGATTCTCCTGATGACCTCGCAACAGAAAACCCAGAAAGACTCATCAGCCGCCTGGCCACCCAGAGGCACCTGACGGTGGGCGAGGAGTGGTCCCAGGACCTGCACAGCAGCGGCCGCACGGACCTCAAGTACTCCTACCGCTTCGTGTGTGACGAACACTACTACGGAGAGGGCTGCTCCGTTTTCTGCCGTCCCCGGGACGATGCCTTCGGCCACTTCACCTGTGGGGAGCGTGGGGAGAAAGTGTGCAACCCTGGCTGGAAAGGGCCCTACTGCACAGAGCCGATCTGCCTGCCTGGATGTGATGAGCAGCATGGATTTTGTGACAAACCAGGGGAATGCAAGTGCAGAGTGGGCTGGCAGGGCCGGTACTGTGACGAGTGTATCCGCTATCCAGGCTGTCTCCATGGCACCTGCCAGCAGCCCTGGCAGTGCAACTGCCAGGAAGGCTGGGGGGGCCTTTTCTGCAACCAGGACCTGAACTACTGCACACACCATAAGCCCTGCAAGAATGGAGCCACCTGCACCAACACGGGCCAGGGGAGCTACACTTGCTCTTGCCGGCCTGGGTACACAGGTGCCACCTGCGAGCTGGGGATTGACGAGTGTGACCCCAGCCCTTGTAAGAACGGAGGGAGCTGCACGGATCTCGAGAACAGCTACTCCTGTACCTGCCCACCCGGCTTCTACGGCAAAATCTGTGAATTGAGTGCCATGACCTGTGCGGACGGCCCTTGCTTTAACGGGGGTCGGTGCTCAGACAGCCCCGATGGAGGGTACAGCTGCCGCTGCCCCGTGGGCTACTCCGGCTTCAACTGTGAGAAGAAAATTGACTACTGCAGCTCTTCACCCTGTTCTAATGGTGCCAAGTGTGTGGACCTCGGTGATGCCTACCTGTGCCGCTGCCAGGCCGGCTTCTCGGGGAGGCACTGTGACGACAACGTGGACGACTGCGCCTCCTCCCCGTGCGCCAACGGGGGCACCTGCCGGGATGGCGTGAACGACTTCTCCTGCACCTGCCCGCCTGGCTACACGGGCAGGAACTGCAGTGCCCCCGTCAGCAGGTGCGAGCACGCACCCTGCCACAATGGGGCCACCTGCCACGAGAGGGGCCACCGCTATGTGTGCGAGTGTGCCCGAGGCTACGGGGGTCCCAACTGCCAGTTCCTGCTCCCCGAGCTGCCCCCGGGCCCAGCGGTGGTGGACCTCACTGAGAAGC---TAGAGGGCCAGGGCGGGCCATTCCCCTGGGTGGCCGTGTGCGCCGGGGTCATCCTTGTCCTCATGCTGCTGCTGGGCTGTGCCGCTGTGGTGGTCTGCGTCCGGCTGAGGCTGCAGAAGCACCGGCCCCCAGCCGACCCCTGCCGGGGGGAGACGGAGACCATGAACAACCTGGCCAACTGCCAGCGTGAGAAGGACATCTCAGTCAGCATCATCGGGGCCACGCAGATCAAGAACACCAACAAGAAGGCGGACTTCCACGGGGACCACAGCGCCGACAAGAATGGCTTCAAGGCCCGCTACCCAGCGGTGGACTATAACCTCGTGCAGGACCTCAAGGGTGACGACACCGCCGTCAGGGACGCGCACAGCAAGCGTGACACCAAGTGCCAGCCCCAGGGCTCCTCAGGGGAGGAGAAGGGGACCCCGACCACACTCAGGGGTGGAGAAGCATCTGAAAGAAAAAGGCCGGACTCGGGCTGTTCAACTTCAAAAGACACCAAGTACCAGTCGGTGTACGTCATATCCGAGGAGAAGGATGAGTGCGTCATAGCAACTGAG??????
->chimp
-???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GGCACCTTCTCTCTGATTATTGAAGCTCTCCACACAGATTCTCCTGATGACCTCGCAACAGAAAACCCAGAAAGACTCATCAGCCGCCTGGCCACCCAGAGGCA?CTGACGGTGGGCGAGGAGTGGTCCCAGGACCTGCACAGCAGCGGCCGCACGGACCTCAAGTACTCCTACCGCTTCGTGTGTGACGAACACTACTACGGAGAGGGCTGCTCCGTTTTCTGCCGTCCCCGGGACGATGCCTTCGGCCACTTCACCTGTGGGGAGCGTGGGGAGAAAGTGTGCAACCCTGGCTGGAAAGGGCCCTACTGCACAGAGCCGATCTGCCTGCCTGGATGTGATGAGCAGCATGGATTTTGTGACAAACCAGGGGAATGCAA???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ACCTGAACTACTGCACACACCATAAGCCCTGCA????TGGGGCCACCTGCACCAACAC??G??A???GAGCTACACTTGCTCTTGCCGGCCTGGGTACAC??????????????????????????????????????????????????????????????????????GATCTCGAGAACAGCTACTCCTGTACCTGCCCACCCGGCTTCTACGGCAAAATCTGTGAATTGAGTGCCATGACCTGTGCGGACGGCCCTTGCTTTAACGGGGGCCGGTGCTCAGACAGCCCCGATGGAGGGTACAGCTGCCGCTGCCCCGTGGGCTACTCCGGCTTCAACTGTGAGAAGAAAATTGACTACTGCAGCTCTTCACCCTGTTCTAATGGTGCCAAGTGTGTGGA??TCGGTGATGCCTACCTGTGCCGCTGCCAGGCCGG???????GGGAGGCACTGTGACGACAACGTGGATG???GCGCCTCCTCCCCGTGCGCCAACGGGGGCACCTGCCGGGATGGCGTGAACGACT?????TGCACCTGCCCGCCCGGCTACACGGGCAGGAACTGCAGTGCCCCCGTCAGCAGGTGCGAGCACGCACCCTGCCACAATGGGGCCACCTGCCACGAGAGGGGCCACCGCTATGTGTGCGAGTGTGCCCGAGGCTACGGGGGTCCCAACTGCCAGTTCCTGCTCCCCGAGCTGCCCCCGGGCCCAGCGGTGGTGGACCTCACTGAGAAGC---TAGAGGGCCAGGGCGGGCCATTCCCCTGGGTGGCCGTGTGCGCCGGGGTCATCCTTGTCCTCATGCTGCTGCTGGGCTGTGCCGCTGTGGTGGTCTGCGTCCGGCTGAGGCTGCAGAAGCACCGGCCCCCAGCCGACCCCTGCCGGGGGGAGACGGAGACCATGAACAACCTGGCCAACTGCCAGCGTGAGAAGGACATCTCAGTCAGCATCATCGGGGCCACGCAGATCAAGAACACCAACAAGAAGGCGGACTTCCACGGGGACCACAGCGCCGACAAGAATGGCTTCAAGGCCCGCTACCCGGCGGTGGACTATAACCTCGTGCAGGACCTCAAGGGTGACGACACCGCCGTCAGGGACGCGCACAGCAAGCGTGACACCAAGTGCCAGCCCCAGGGCTCCTCAGGGGAGGAGAAGGGGACCCCAACCACACTCAGGGGTGGAGAAGCATCTGAAAGAAAAAGGCCGGACTCGGGCTGTTCGACTTCAAAAGACACCAAGTACCAGTCGGTGTACGTCATATCCGAGGAGAAGGATGAGTGCGTCATAGCAACTGAG??????
->mouse
-???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GGTACCTTCTCTCTGATCATTGAAGCCCTCCATACAGACTCTCCCGATGACCTCGCAACAGAAAACCCAGAAAGACTCATCAGCCGCCTGACCACACAGAGGCACCTCACTGTGGGAGAAGAATGGTCTCAGGACCTTCACAGTAGCGGCCGCACAGACCTCCGGTACTCTTACCGGTTTGTGTGTGACGAGCACTACTACGGAGAAGGTTGCTCTGTGTTCTGCCGACCTCGGGATGACGCCTTTGGCCACTTCACCTGCGGGGACAGAGGGGAGAAGATGTGCGACCCTGGCTGGAAAGGCCAGTACTGCACTGACCCAATCTGTCTGCCAGGGTGTGATGACCAACATGGATACTGTGACAAACCAGGGGAGTGCAAGTGCAGAGTTGGCTGGCAGGGCCGCTACTGCGATGAGTGCATCCGATACCCAGGTTGTCTCCATGGCACCTGCCAGCAACCCTGGCAGTGTAACTGCCAGGAAGGCTGGGGGGGCCTTTTCTGCAACCAAGACCTGAACTACTGTACTCACCATAAGCCGTGCAGGAATGGAGCCACCTGCACCAACACGGGCCAGGGGAGCTACACATGTTCCTGCCGACCTGGGTATACAGGTGCCAACTGTGAGCTGGAAGTAGATGAGTGTGCTCCTAGCCCCTGCAAGAACGGAGCGAGCTGCACGGACCTTGAGGACAGCTTCTCTTGCACCTGCCCTCCCGGCTTCTATGGCAAGGTCTGTGAGCTGAGCGCCATGACCTGTGCAGATGGCCCTTGCTTCAATGGAGGACGATGTTCAGATAACCCTGACGGAGGCTACACCTGCCATTGCCCCTTGGGCTTCTCTGGCTTCAACTGTGAGAAGAAGATGGATCTCTGCGGCTCTTCCCCTTGTTCTAACGGTGCCAAGTGTGTGGACCTCGGCAACTCTTACCTGTGCCGGTGCCAGGCTGGCTTCTCCGGGAGGTACTGCGAGGACAATGTGGATGACTGTGCCTCCTCCCCGTGTGCAAATGGGGGCACCTGCCGGGACAGTGTGAACGACTTCTCCTGTACCTGCCCACCTGGCTACACGGGCAAGAACTGCAGCGCCCCTGTCAGCAGGTGTGAGCATGCACCCTGCCATAATGGGGCCACCTGCCACCAGAGGGGCCAGCGCTACATGTGTGAGTGCGCCCAGGGCTATGGCGGCCCCAACTGCCAGTTTCTGCTCCCTGAGCCACCACCAGGGCCCATGGTGGTGGACCTCAGTGAGAGGCATATGGAGAGCCAGGGCGGGCCCTTCCCCTGGGTGGCCGTGTGTGCCGGGGTGGTGCTTGTCCTCCTGCTGCTGCTGGGCTGTGCTGCTGTGGTGGTCTGCGTCCGGCTGAAGCTACAGAAACACCAGCCTCCACCTGAACCCTGTGGGGGAGAGACAGAAACCATGAACAACCTAGCCAATTGCCAGCGCGAGAAGGACGTTTCTGTTAGCATCATTGGGGCTACCCAGATCAAGAACACCAACAAGAAGGCGGACTTTCACGGGGACCATGGAGCCGAGAAGAGCAGCTTTAAGGTCCGATACCCCACTGTGGACTATAACCTCGTTCGAGACCTCAAGGGAGATGAAGCCACGGTCAGGGATACACACAGCAAACGTGACACCAAGTGCCAGTCACAGAGCTCTGCAGGAGAAGAGAAGATCGCCCCAAC---ACTTAGGGGTGGGGAGATTCCTGACAGAAAAAGGCCAGAGTCTGTCTACTCTACTTCAAAGGACACCAAGTACCAGTCGGTGTATGTTCTGTCTGCAGAAAAGGATGAGTGTGTTATAGCGACTGAG??????
-
->human
-ATGGTCTGGAGGCTGGTCCTGCTGGCTCTGTGGGTGTGGCCCAGCACGCAAGCTGGTCACCAGGACAAAGACACGACCTTCGACCTTTTCAGTATCAGCAACATCAACCGCAAGACCATTGGCGCCAAGCAGTTCCGCGGGCCCGACCCCGGCGTGCCGGCTTACCGCTTCGTGCGCTTTGACTACATCCCACCGGTGAACGCAGATGACCTCAGCAAGATCACCAAGATCATGCGGCAGAAGGAGGGCTTCTTCCTCACGGCCCAGCTCAAGCAGGACGGCAAGTCCAGGGGCACGCTGTTGGCTCTGGAGGGCCCCGGTCTCTCCCAGAGGCAGTTCGAGATCGTCTCCAACGGCCCCGCGGACACGCTGGATCTCACCTACTGGATTGACGGCACCCGGCATGTGGTCTCCCTGGAGGACGTCGGCCTGGCTGACTCGCAGTGGAAGAACGTCACCGTGCAGGTGGCTGGCGAGACCTACAGCTTGCACGTGGGCTGCGACCTCATAGACAGCTTCGCTCTGGACGAGCCCTTCTACGAGCACCTGCAGGCGGAAAAGAGCCGGATGTACGTGGCCAAAGGCTCTGCCAGAGAGAGTCACTTCAGGGGTTTGCTTCAGAACGTCCACCTAGTGTTTGAAAACTCTGTGGAAGATATTCTAAGCAAGAAGGGTTGCCAGCAAGGCCAGGGAGCTGAGATCAACGCCATCAGTGAGAACACAGAGACGCTGCGCCTGGGTCCGCATGTCACCACCGAGTACGTGGGCCCCAGCTCGGAGAGGAGGCCCGAGGTGTGCGAACGCTCGTGCGAGGAGCTGGGAAACATGGTCCAGGAGCTCTCGGGGCTCCACGTCCTCGTGAACCAGCTCAGCGAGAACCTCAAGAGAGTGTCGAATGATAACCAGTTTCTCTGGGAGCTCATTGGTGGCCCTCCTAAGACAAGGAACATGTCAGCTTGCTGGCAGGATGGCCGGTTCTTTGCGGAAAATGAAACGTGGGTGGTGGACAGCTGCACCACGTGTACCTGCAAGAAATTTAAAACCATTTGCCACCAAATCACCTGCCCGCCTGCAACCTGCGCCAGTCCATCCTTTGTGGAAGGCGAATGCTGCCCTTCCTGCCTCCACTCGGTGGACGGTGAGGAGGGCTGGTCTCCGTGGGCAGAGTGGACCCAGTGCTCCGTGACGTGTGGCTCTGGGACCCAGCAGAGAGGCCGGTCCTGTGACGTCACCAGCAACACCTGCTTGGGGCCCTCCATCCAGACACGGGCTTGCAGTCTGAGCAAGTGTGACACCCGCATCCGGCAGGACGGCGGCTGGAGCCACTGGTCACCTTGGTCTTCATGCTCTGTGACCTGTGGAGTTGGCAATATCACACGCATCCGTCTCTGCAACTCCCCAGTGCCCCAGATGGGGGGCAAGAATTGCAAAGGGAGTGGCCGGGAGACCAAAGCCTGCCAGGGCGCCCCATGCCCAATCGATGGCCGCTGGAGCCCCTGGTCCCCGTGGTCGGCCTGCACTGTCACCTGTGCCGGTGGGATCCGGGAGCGCACCCGGGTCTGCAACAGCCCTGAGCCTCAGTACGGAGGGAAGGCCTGCGTGGGGGATGTGCAGGAGCGTCAGATGTGCAACAAGAGGAGCTGCCCCGTGGATGGCTGTTTATCCAACCCCTGCTTCCCGGGAGCCCAGTGCAGCAGCTTCCCCGATGGGTCCTGGTCATGCGGCTCCTGCCCTGTGGGCTTCTTGGGCAATGGCACCCACTGTGAGGACCTGGACGAGTGTGCCCTGGTCCCCGACATCTGCTTCTCCACCAGCAAGGTGCCTCGCTGTGTCAACACTCAGCCTGGCTTCCACTGCCTGCCCTGCCCGCCCCGATACAGAGGGAACCAGCCCGTCGGGGTCGGCCTGGAAGCAGCCAAGACGGAAAAGCAAGTGTGTGAGCCCGAAAACCCATGCAAGGACAAGACACACAACTGCCACAAGCACGCGGAGTGCATCTACCTGGGCCACTTCAGCGACCCCATGTACAAGTGCGAGTGCCAGACAGGCTACGCGGGCGACGGGCTCATCTGCGGGGAGGACTCGGACCTGGACGGCTGGCCCAACCTCAATCTGGTCTGCGCCACCAACGCCACCTACCACTGCATCAAGGATAACTGCCCCCATCTGCCAAATTCTGGGCAGGAAGACTTTGACAAGGACGGGATTGGCGATGCCTGTGATGATGACGATGACAATGACGGTGTGACCGATGAGAAGGACAACTGCCAGCTCCTCTTCAATCCCCGCCAGGCTGACTATGACAAGGATGAGGTTGGGGACCGCTGTGACAACTGCCCTTACGTGCACAACCCTGCCCAGATCGACACAGACAACAATGGAGAGGGTGACGCCTGCTCCGTGGACATTGATGGGGACGATGTCTTCAATGAACGAGACAATTGTCCCTACGTCTACAACACTGACCAGAGGGACACGGATGGTGACGGTGTGGGGGATCACTGTGACAACTGCCCCCTGGTGCACAACCCTGACCAGACCGACGTGGACAATGACCTTGTTGGGGACCAGTGTGACAACAACGAGGACATAGATGACGACGGCCACCAGAACAACCAGGACAACTGCCCCTACATCTCCAACGCCAACCAGGCTGACCATGACAGAGACGGCCAGGGCGACGCCTGTGACCCTGATGATGACAACGATGGCGTCCCCGATGACAGGGACAACTGCCGGCTTGTGTTCAACCCAGACCAGGAGGACTTGGACGGTGATGGACGGGGTGATATTTGTAAAGATGATTTTGACAATGACAACATCCCAGATATTGATGATGTGTGTCCTGAAAACAATGCCATCAGTGAGACAGACTTCAGGAACTTCCAGATGGTCCCCTTGGATCCCAAAGGGACCACCCAAATTGATCCCAACTGGGTCATTCGCCATCAAGGCAAGGAGCTGGTTCAGACAGCCAACTCGGACCCCGGCATCGCTGTAGGTTTTGACGAGTTTGGGTCTGTGGACTTCAGTGGCACATTCTACGTAAACACTGACCGGGACGACGACTATGCCGGCTTCGTCTTTGGTTACCAGTCAAGCAGCCGCTTCTATGTGGTGATGTGGAAGCAGGTGACGCAGACCTACTGGGAGGACCAGCCCACGCGGGCCTATGGCTACTCCGGCGTGTCCCTCAAGGTGGTGAACTCCACCACGGGGACGGGCGAGCACCTGAGGAACGCGCTGTGGCACACGGGGAACACGCCGGGGCAGGTGCGAACCTTATGGCACGACCCCAGGAACATTGGCTGGAAGGACTACACGGCCTATAGGTGGCACCTGACTCACAGGCCCAAGACTGGCTACATCAG????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
->chimp
-ATGGTCTGGAGGCTGGTCCTGCTGGCTCTGTGGGTGTGGCCCAGCACGCAAG??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GATCACCAAGATCATGCGGCAGAAGGAGGGCTTCTTCCTCACGGCCCAGCTCAAGCAGGACGGCAAGTCCAGGGGCACGCTGTTGGCTCTGGAGGGCCCCGGTCTCTCCCAGAGGCAGTTCGAGATCGTCTCCAATGGCCCCGCGGACACGCTGGATCTCACCTACTGGATTGACGGCACCCGGCACGTGGTCTCCCTGGAGGACGTCGGCCTGGCTGACTCGCAGTGGAAGAACGTCACCGTGCAGGTGGCTGGCGAGACCTACAGCTTGCACGTGGGCTGCGACCTCATAGACAGCTTCGCTCTGGACGAGCCCTTCTACGAGCACCTGCAGGCGGAAAAGAGCCGGATGTACGTGGCCAAAGGCTCTGCCAGAGAGAGTCACTTCAGGGGTTTGCTTCAGAACGTCCACCTAGTGTTTGAAAACTCTCTGGAAGACATTCTAAGCAAGAAGGGTTGCCAGCAAGGCC???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????TCGAATGATAACCAGTTTCTCTGGGAGCTCATCGGTGGCCCTCCTAAGACAAGGAACATGTCAGCTTGCTGGCAGGATGGCCGGTTCTTTGCGGAAAATGAAACGTGGGTGGTGGACAGCTGCACCTCGTGTACCTGCAAGAAATTTAAAACCATTTGCCACCAAATCACCTGCCCGCCTGCAACCTGCGCCAGTCCGTCCTTTGTGGAAG???AATGCT???CTTCCTGCCTCCACTCGGTGGACGGTGAGGAGGGCTGGTCTCCGTGGGCAGAGTGGACCCAGTGCTCTGTGACGTGTGGCTCTGGGACCCAGCAGAGAGGCCGGTCCTGTGACGTCACCAGCAACACCTGCTTGGGGCCCTCCATCCAGACACGGGCTTGCAGTCTGAGCAAGTGTGACACCCGCATCCGGCAGGACGGCGG???GAGCCAC??GTCACCTTGGTCTTCATGCT???TGAC?????GAG??GGCA??ATCACACGCATCCGT?TCTGC?????CCCAGTGCCCCAG???GGGGGCAAGAA???CAAAGGGAGTGGCCGGGAGACCAAAGCCTGCCAGGGCGCCCCATGCCCAATCGATGGCCGCTGGAGCCCCTGGTCCCCGTGGTCGGCCTGCACTGTCACCTGTGCCGGTGGGATCCGGGAGCGCACCCGGGTCTGCAACAGCCCTGAGCCTCAGTACGGAGGGAAGGCCTGCGTGGGGGATGTGCAGGAGCGTCAGATGTGCAACAAGAGGAGCTGCCCCGTGG?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GTGTGTGAGCCCGAAAACCCATGCAAGGACAAGACACACAACTGCCACAAGCACGCGGAGTGCATCTACCTGGGCCACTTCAGCGACCCCATGTACAAGTGCGAGTGCCAGACAGGCTACGCGGGCGACGGGCTCATCTGCGGGGAGGACTCGGACCTGGACGGCTGGCCCAACCTCAATCTGGTCTGCGCCACCAACGCCACCTACCACTGCATCAAGGATAACTGCCCCCATCTGCCAAATTCTGGGCAGGAAGACTTTGACAAGGACGGGATTGGCGATGCCTGTGATGATGACGATGACAATGACGGTGTGACCGATGAGAAG???????????????????????????????????TGACTATGACAAGGATG???TTGGGGACCGCT???ACAACTGCCCTTAC????????????????????????????????????????????????????????????????????????????ATGTCTTCAATGAACGAGACAATTGTCCCTACGTCTACAACACTGACCAGAGGGACACGGATGGTGACGGTGTGGGGGATC??????????????????????????????????????ACCGACGTGGACAATGACCTTGTTGGGGACCAGTGTGACAACAACGAGGACATAGATGATGACGGCCACCAGAACAACCAGGACAACTGCCCCTACATCTCCAACGCCAACCAGGCTGACCATGACAGAGACGGCCAGGGCGACGCCTGTGACCCCGATGATGACAACGATGGCGTCCCCGATGACAGGGACAACTGCCGGCTTGTGTTCAACCCAGACCAGGAGGACTTGGACGGTGATGGACGGGGTGATATTTGTAAAGATGATTTTGACAATGAC??CATCCC???TATTGATGATGTGTGTCCTGAAAACAATGCCATCAGTGAGACAGACTTCAGGAACTTCCAGATGGTCCCCTTGGATCCCAAAGGGACCACCCAAATTGATCCCAACTGGGTCATTCGCCATCAAGGCAAGGAGCTGGTTCAGACAGCCAACTCGGACCCTGGCATCGCTGTAGGTTTTGACGAGTTTGGGTCTGTGGACTTCAGTGGCACATTCTACGTAAACACTGACCGGGACGACGACTATGCCGGCTTCGTCTTTGGTTACCAGTCAAGCAGCCGCTTCTATGTGGTGATGTGGAAGCAGGTGACGCAGACCTACTGGGAGGACCAGCCCACGCGGGCCTATGGCTACTCCGGCGTGTCCCTCAAGGTGGTGAACTCCACCACAGGGACGGGCGAGCACCTGAGGAACGCGCTGTGGCACACGGGGAACACGCCGGGGCAG??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
->mouse
-ATGCTCTGGGCACTGGCCCTGCTGGCTCTGGGCATAGGGCCAAGAGCTTCTGCTGGTGACCACGTCAAGGACACTTCATTTGACCTTTTCAGCATCAGCAACATTAACCGGAAGACCATCGGTGCCAAGCAGTTCCGAGGGCCTGACCCCGGGGTGCCCGCCTACCGTTTTGTACGGTTTGACTACATCCCCCCAGTGAACACAGATGATCTCAACAGGATTGTCAAGCTTGCAAGGAGAAAGGAGGGCTTCTTCCTCACAGCCCAACTGAAGCAGGACCGCAAGTCTCGGGGAACGCTCCTGGTGTTGGAAGGCCCCGGCACCTCCCAGAGGCAGTTTGAGATTGTGTCCAATGGCCCAGGGGACACTTTGGACCTCAACTACTGGGTAGAAGGCAATCAGCATACCAACTTCCTGGAGGATGTGGGCCTGGCTGACTCCCAGTGGAAGAATGTGACTGTGCAGGTGGCCAGTGACACCTATAGCCTGTATGTGGGCTGCGATCTTATCGACAGTGTCACCCTGGAAGAACCATTCTATGAGCAGCTAGAAGTAGACAGGAGCAGGATGTACGTGGCCAAAGGTGCATCTCGAGAGAGTCACTTCAGGGGCTTGCTGCAGAATGTCCATCTCGTATTTGCAGATTCTGTGGAAGATATCTTAAGCAAGAAAGGCTGTCAACACAGCCAGGGAGCTGAAGTCAACACCATCAGTGAACATACAGAGACTCTCCATCTGAGCCCTCACATCACCACAGATCTCGTGGTCCAGGGTGTGGAGAAGGCACAGGAGGTGTGTACGCACTCCTGCGAGGAGTTGAGCAACATGATGAATGAGCTCTCTGGACTGCACGTCATGGTGAACCAGCTGAGCAAGAACCTGGAGAGAGTGTCTAGTGATAACCAGTTCCTTTTGGAGCTCATTGGGGGCCCTCTGAAGACAAGAAACATGTCAGCCTGTGTGCAGGAGGGCCGAATCTTTGCAGAAAATGAAACCTGGGTTGTGGATAGTTGTACCACATGCACCTGCAAGAAATTTAAAACAGTCTGCCATCAGATCACCTGCTCACCTGCAACTTGTGCCAACCCATCTTTTGTGGAAGGCGAGTGCTGTCCATCCTGTTCACACTCTGCAGACAGTGATGAGGGCTGGTCTCCGTGGGCAGAGTGGACCGAGTGTTCTGTCACCTGTGGCTCTGGGACCCAGCAGAGAGGCCGGTCTTGTGATGTCACCAGCAACACCTGCCTGGGCCCCTCCATTCAGACAAGGACATGCAGCCTGGGCAAATGTGATACGAGAATCCGTCAGAATGGAGGCTGGAGTCACTGGTCACCCTGGTCTTCATGCTCCGTGACTTGTGGAGTTGGCAATGTCACCCGCATACGTCTCTGCAACTCACCAGTGCCCCAGATGGGTGGCAAGAACTGCAAGGGCAGCGGCCGGGAAACCAAACCCTGTCAGCGTGATCCGTGCCCAATTGATGGCCGCTGGAGCCCCTGGTCCCCTTGGTCAGCCTGCACAGTTACCTGTGCTGGAGGGATCCGTGAGCGCTCACGTGTTTGCAACAGCCCTGAGCCCCAGTATGGAGGGAAGGACTGTGTCGGGGATGTGACAGAACACCAAATGTGCAACAAGAGAAGCTGCCCTATTGATGGGTGCTTATCCAACCCGTGTTTTCCTGGAGCCAAGTGCAACAGCTTCCCTGATGGGTCCTGGTCCTGTGGCTCCTGCCCAGTGGGCTTTCTGGGCAATGGTACCCACTGTGAGGACCTGGATGAGTGTGCTGTGGTCACAGATATTTGCTTCTCAACTAACAAAGCTCCCCGCTGTGTCAACACCAACCCGGGCTTCCACTGCCTGCCTTGTCCACCACGCTACAAGGGGAACCAACCCTTCGGTGTTGGCCTGGAGGATGCTAGGACAGAAAAACAAGTGTGTGAGCCAGAGAATCCATGTAAGGACAAGACTCACAGCTGCCACAAGAATGCAGAGTGCATCTACCTGGGCCACTTTAGTGACCCCATGTACAAGTGTGAGTGCCAGATTGGCTACGCAGGTGATGGGCTCATCTGCGGGGAGGACTCAGACCTGGATGGCTGGCCCAACAACAACCTGGTGTGTGCTACTAATGCCACCTACCACTGCATCAAGGACAACTGCCCCAAACTGCCAAATTCCGGGCAGGAGGATTTTGATAAGGATGGAATCGGAGATGCTTGTGACGAGGACGATGACAATGACGGTGTGAGCGATGAGAAGGACAATTGCCAGCTTCTCTTCAATCCCCGTCAATTAGACTATGACAAGGATGAGGTTGGAGACCGCTGTGACAACTGCCCCTATGTGCACAACCCAGCACAGATCGACACAGACAACAATGGCGAGGGGGATGCCTGCTCTGTGGACATTGACGGAGACGATGTTTTCAATGAGCGAGACAATTGTCCATATGTCTACAACACTGACCAGAGAGATACGGATGGTGATGGCGTGGGTGACCACTGTGACAATTGTCCTCTGATGCACAACCCAGATCAGATCGATCAGGACAATGATCTCGTTGGAGACCAGTGTGACAACAATGAGGACATAGATGATGACGGCCACCAGAACAACCAAGACAACTGCCCATACATCTCCAACTCCAACCAGGCTGACCATGACAACGACGGCAAGGGCGATGCCTGCGACTCTGATGATGACAATGATGGTGTTCCAGATGACAGGGACAACTGTCGGCTTGTGTTCAACCCAGACCAGGAAGACTCGGACGGTGACGGCCGAGGTGACATTTGTAAAGATGACTTTGACAATGATAATGTCCCAGATATTGATGATGTGTGCCCTGAGAACAATGCCATCACTGAGACAGACTTCAGAAACTTCCAGATGGTCCCTCTGGATCCCAAGGGGACCACACAAATTGATCCCAACTGGGTAATTCGTCACCAAGGCAAAGAGCTGGTGCAGACAGCAAACTCAGACCCTGGCATCGCTGTAGGTTTCGACGAGTTTGGGTCTGTGGACTTCAGTGGCACTTTCTATGTCAACACTGACCGGGATGATGACTACGCTGGCTTTGTCTTTGGCTATCAGTCAAGCAGCCGCTTCTATGTGGTGATGTGGAAGCAGGTGACCCAGACCTACTGGGAAGACAAGCCCAGTCGGGCTTACGGCTACTCTGGTGTGTCACTCAAAGTGGTAAACTCCACGACTGGTACTGGCGAGCACCTGAGGAATGCCCTGTGGCACACGGGAAACACAGAAGGCCAGGTCCGGACTCTATGGCATGACCCCAAAAACATTGGCTGGAAAGACTACACTGCCTACAGGTGGCACCTGATTCACAGGCCTAAGACAGGCTACATGAG????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
-
->human
-????????????????TACAAGATATGGAGCAATTTTACGAACTATGGCTCAAGAGTCAAAAAAATGAAAAAAGTGAAGACATAGCCAGTCAGTCAAACAAGGAAAATGGAAAACAAATTCACATGCCAACAGATTATGCTGAAGTTACAGTGGACTTTCACTGCTGGATGTGTGGGAAAAACTGCAACAGTGAGAAGCAGTGGCAGGGCCACATCTCCTCCGAGAAGCACAAAGAGAAGGTTTTCCACACCGAGGACGACCAGTACTGCTGGCAGCACCGCTTCCCAACAGGCTATTTCAGTATTTGTGATAGGTATATGAATGGCACCTGCCCAGAAGGAAACAGCTGTAAATTTGCACATGGAAATGCCGAACTTCATGAATGGGAAGAAAGAAGAGATGCCCTAAAGATGAAGCTCAACAAAGCACGAAAAGATCACTTAATTGGCCCAAATGATAATGACTTTGGAAAATATAGTTTTTTGTTTAAAGATTTAAACTAA
->chimp
-??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GTGGACTTTCACTGCTGGATGTGTGGGAAAAACTGCAACAGTGAGAAGCAGTGGCAGGGCCACATCTCCTCCGAGAAGCACAAAGAGAAGGTTTTCCACACCGAGGACGACCAGTACTGCTGGCAGCACCGCTTCCCAACAGGCTATTTCAGTATTTGTGATAGGTATATGAATGGCACCTGCCCAGAAGGAAACAGCTGTAAATTTGCACATGGAAATGCCGAACTTCATGAATGGGAAGAAAGAAGAGATGCCCTAAAGATGAAGCTCAACAAAGCACGAAAAGATCACTTAATTGGCCCAAATGATAATGACTTTGGAAAATATAGTTTTTTGTTTAAAGATTTAAACTAA
->mouse
-????????????????TACATGATATAGAGCAATTTTATGAACTCTGGCTGAAGAACCAAAAAACTGAAAAAAGTGATGAGACAGCCAGTCACTGTAGCAAAGAAAACGGGAAGCAGATCCATATGCCAACAGACTATGCTGAAGTCACTGTGGACTTCCACTGCTGGATGTGTGGGAAGAACTGTAACAGTGAGAAGCAATGGCAAGACCACATCTCCTCTGAGAAGCACAAGGAGAAGGTTTTCCACACTGAGGATGACCAGTACTGCTGGCAGCACCGCTTCCCCACTGGGTACTTCAGTATTTGTGAGAGGTATATAAATGGCTCCTGCACAGAAGGAAGCAGCTGTAAATTTGCACATGGAAATGCTGAACTTCATGAATGGGAAGAAAGAAGAAAGGCCCTACAGATGAAATTCAAGAAAGCACGGAAAGATCACTTAATTGCCCCAAATGATAATGACTTTGGAAAATATAGTTTTTTGTTTAAAGATTTAAAGTAA
-
->human
-????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CGCCTGCGGATTCTACTGGGGGCCCCTGAGCGTGCACGGGGCGCACGAGCGGCTGCGCGCCGAGCCCGTGGGCACCTTCCTGGTGCGCGACAGCCGCCAGCGGAACTGCTTTTTCGCCCTTAGCGTGAAGATGGCCTCGGGACCCACGAGCATCCGCGTGCACTTTCAGGCCGGCCGCTTTCACCTGGATGGCAGCCGCGAGAGCTTCGACTGCCTCTTCGAGCTGCTGGAGCACTACGTGGCGGCGCCGCGCCGCATGCTGGGGGCCCCGCTGCGCCAGCGCCGCGTGCGGCCGCTGCAGGAGCTGTGCCGCCAGCGCATCGTGGCCACCGTGGGCCGCGAGAACCTGGCTCGCATCCCCCTCAACCCCGTCCTCCGCGACTACCTGAGCTCCTTCCCCTTCCAGATTTGA
->chimp
-??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????CGTGGGCACCTTCCTGGTGCGCGACAGCCGCCA???GAACTGCTT???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????GGGGCCCCGCTGCGCCAGCGCCGCGTGCGGCCGCTGCAGGAGCTGTGCCGCCAGCGCATCGTGGCTACCGTGGGCCGCGAGAA??????????ATCCCCCTCAACCCCGTCCTCCGCGACTACCTGAGCTCCTTCCCCTTCCAGATTTG?
->mouse
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CCTGGACGCCTGCGGCTTCTATTGGGGACCCCTGAGCGTGCACGGGGCGCACGAGCGGCTGCGTGCCGAGCCCGTGGGCACCTTCTTGGTGCGCGACAGTCGCCAACGGAACTGCTTCTTCGCGCTCAGCGTGAAGATGGCTTCGGGCCCCACGAGCATCCGCGTGCACTTCCAGGCCGGCCGCTTCCACTTGGACGGCAGCCGCGAGACCTTCGACTGCCTTTTCGAGCTGCTGGAGCACTACGTGGCGGCGCCGCGCCGCATGTTGGGGGCCCCGCTGCGCCAGCGCCGCGTGCGGCCGCTGCAGGAGCTGTGTCGCCAGCGCATCGTGGCCGCCGTGGGTCGCGAGAACCTGGCGCGCATCCCTCTTAACCCGGTACTCCGTGACTACCTGAGTTCCTTCCCCTTCCAGATCTGA
-
->human
-ATGGAGAGGGCTTCTAAGAATCTTAAGGGTCGGTGTACCCGAGAGAACTGCAAGTACCTTCACCCTCCTCCACACTTAAAAACGCAGCTGGAGATTAATGGGCGGAACAATCTGATTCAACAGAAGACTGCCGCAGCCATGTTCGCCCAGCAGATGCAGCTTATGCTCCAAAACGCTCAAATGTCATCACTTGGTTCTTTTCCTATGACTCCATCAATTCCAGCTAATCCTCCCATGGCTTTCAATCCTTACATACCACATCCTGGGATGGGCCTCGTTCCTGCAGAACTTGTACCAAATACACCTGTTCTGATTCCTGGAAACCCACCTCTTGCAATGCCAGGAGCTGTTGGCCCAAAACTGATGCGTTCAGATAAACTGGAGGTTTGCCGAGAATTTCAGCGTGGAAATTGTACCCGTGGGGAGAATGATTGCCGCTATGCTCACCCTACTGATGCTTCCATGATTGAAGCGAGTGATAATACTGTGACAATCTGCATGGATTACATCAAAGGTCGATGCTCGCGGGAGAAATGCAAGTACTTTCATCCTCCTGCACACTTGCAAGCCAGACTCAAGGCAGCTCATCATCAGATGAACCATTCAGCTGCCTCTGCCATGGCCCTGCAGCCTGGTACACTGCAACTGATACCAAAGAGATCAGCACTGGAAAAGCCCAATGGTGCCACCCCGGTCTTTAATCCCACTGTTTTCCACTGCCAACAGGCTCTGACTAACCTGCAGCTCCCACAGCCGGCATTTATCCCTGCAGGGCCAATACTGTGCATGGCACCCGCTTCAAATATTGTGCCCATGATGCACGGTGCTACACCTACCACTGTGTCTGCAGCAACAACACCTGCCACCAGCGTTCCGTTCGCTGCACCAACTACAGGCAATCAG????????????
->chimp
-ATGGAGAGGGCTTCTAAGAATCTTAAGGGTCGGTGTACTCGAGAGAACTGCAAGTACCTTCACCCTCCTCCACACTTAAAAACGCAGCTGGAGATTAATGGGCGGAACAATCTGATTCAACAGAAGACTGCCGCAGCCATGTTCGCCCAGCAGATGCAGCTTATGCTCCAAAACGCTCAAATGTCATCACTT????CTTTTCCTATGACTCCATCACTTC????TAATCCTCCC????????????????????????????????????????????????????????TGTACCAAATACACCTGTTCTGATTCCTGGAAACCCACCTCTTGCAATGCCAGGAGCTGTTGGCCCAAAACTGATGCGTTCAGATAAACTGGAG???????GAGAATTTCAGCGTGGAAATTGTACCCGTGGGGAGAATGATTGCCGCTATGCTCACCCTACTGATGCTTCCATGATTGAAGCGAGTGATAATACTGTGACAATCTGCATGGATTACATCAAAG???GAT?CTCGCGGG??AAAT???AGTACTTTCATCCTCCT???CACTTG??AGCCAGACTCAAGGCAGCTCATCACCAGATGAACCATTCAGCTGCCTCTGCCATG???????????TGGTA?ACTGCAACTGATACCAAAGAGATC?????TGGAAAAGCCCAATGGTGCCACCCCGGTCTTTAATCCCACTGTTTTCCACTGCCAACAG???????????????CAGCTCCCACAGCCGGCATTTATC?????????????????????????????????????????????CCCATGATGCACGGTGCTACACCTACCACTGTGTCTGCAGCAACAACACCTGC???CAGCGTTCCGTTCGC??????????????????????????????????
->mouse
-???????????????????????????GGTCGGTGCACTCGTGAGAACTGCAAGTACCTCCACCCTCCACCGCACTTAAAGTCGCAGCTAGAAGTTAATGGGAGAAACAATCTGATTCAACAGAAGACTGCCGCAGCCATGTTCGCCCAGCACATGCAACTCATGCTGCAGAACGCTCAGATGTCATCTCTTGCGTCTTTTCCTATGAATCCATCACTTGCAGCTAATCCTGCCATGGCTTTCAATCCTTACATGACTCATCCTGGCATGGGCCTGGTTCCTGCTGAGCTTTTACCAAATGGTCCGGTTCTGATTTCTGGAAACCCTCCTCTTGCACTGCCAGGAGTTCCTGGTCCAAAGCCAATTCGTACAGATAGACTGGAGGTTTGCCGTGAATTTCAGCGTGGAAATTGTACCCGTGGGGAGAGCGAGTGCCGCTATGCTCACCCTACGGATGTTTCCATGATTGAAGTCACTGATAATTCTGTGACAATCTGCATGGATTACATTAAAGGCCGATGCTCCCGGGAGAAATGCAAGTACTTTCATCCTCCTCCCCACTTGCAGGCCAAACTCAGGGCAGCTCATCACCAGATGAACCATTCTGCTGCCAATGCAATGGCCCTGCCGCATGGTGCACTTCAACTGATACCAAAGAGGTCAGCCCTTGACAAGGCCAATGGTGCCACTCCAGTCTTTAACCCCAGTGTTTTCCACTGCCAACAGGCTCTGGCTAACATGCAGATTCCTCAGCAGGCTTTTATCCCAACAGGGCAAATACTGTGCATGACTCCTACTTCAACTTTTGTGCCCATGATGCACGGTGCTACACCTTCCACTGTGTCTACAGCAACACCACCTGCCAGCAACGTTCCCTACGTTCCAACAACTACAGGCAACCAG????????????
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/dnds_out.tabular
--- a/test-data/dnds_out.tabular
+++ /dev/null
@@ -1,12 +0,0 @@
-BLOCK BP S_sites NS_sites Stop_codons LogL omega omega_range AC AT CG CT GT Tree
-1 1554 355.669 1129.12 1 -2747.41 0.101091 0.0764852-0.130612 1 1 1 1 1 (human:0,chimp:0.00240807,mouse:0.146665)
-2 3795 924.935 2749.35 1 -5781.01 0.0179472 0.0119925-0.0256202 1 1 1 1 1 (human:0.000420081,chimp:0.00148421,mouse:0.144947)
-3 1194 272.323 881.914 1 -2043.72 0.0578031 0.0372143-0.084959 1 1 1 1 1 (human:0.00284673,chimp:0.00410898,mouse:0.119894)
-4 1146 248.261 850.364 1 -1871.67 0.0127675 0.00548017-0.0247362 1 1 1 1 1 (human:0,chimp:0.000930953,mouse:0.147214)
-5 1500 366.374 1086.09 2 -2522.97 0.0331798 0.020375-0.0505273 1 1 1 1 1 (human:0,chimp:0.00225972,mouse:0.15608)
-6 3444 824.107 2475.54 1 -5459.18 0.0439794 0.0326464-0.0577021 1 1 1 1 1 (human:0.000511634,chimp:0.00203553,mouse:0.12664)
-7 2175 505.186 1587.7 0 -3307.52 0.0711476 0.0563725-0.088397 1 1 1 1 1 (human:0.00229288,chimp:0.00236918,mouse:0.226482)
-8 3519 792.702 2601.36 0 -6219.39 0.0669744 0.0568959-0.0782191 1 1 1 1 1 (human:0.00102613,chimp:0.00431639,mouse:0.251285)
-9 501 100.22 376.039 1 -834.329 0.130018 0.0833903-0.191879 1 1 1 1 1 (human:0,chimp:0,mouse:0.150605)
-10 633 160.252 453.228 1 -618.997 0.0151077 0.00250472-0.0467226 1 1 1 1 1 (human:0,chimp:0.00611289,mouse:0.104294)
-11 915 229.705 658.82 0 -1664.02 0.299399 0.227668-0.385279 1 1 1 1 1 (human:0.00457673,chimp:0,mouse:0.145584)
diff -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 -r f68bd3660813e4d5024a71d84a8a8c0a24ae892a test-data/encode_1.bed
--- a/test-data/encode_1.bed
+++ /dev/null
@@ -1,568 +0,0 @@
-chr7 26853157 26854215 EarlyRepSeg
-chr7 26865558 26956110 EarlyRepSeg
-chr7 26956330 26958851 EarlyRepSeg
-chr7 26958893 26959464 EarlyRepSeg
-chr7 26959504 26959533 EarlyRepSeg
-chr7 26960356 26960376 EarlyRepSeg
-chr7 26960632 26960801 EarlyRepSeg
-chr7 89741530 89743766 EarlyRepSeg
-chr7 89743824 89744003 EarlyRepSeg
-chr7 89744088 89744106 EarlyRepSeg
-chr7 89745480 89968351 EarlyRepSeg
-chr7 90542632 90542691 EarlyRepSeg
-chr7 113919823 113919871 EarlyRepSeg
-chr7 113919935 113920029 EarlyRepSeg
-chr7 113920113 113920978 EarlyRepSeg
-chr7 113922569 113924554 EarlyRepSeg
-chr7 113924746 113924793 EarlyRepSeg
-chr7 113924833 113927725 EarlyRepSeg
-chr7 113927893 113928509 EarlyRepSeg
-chr7 113929396 113929453 EarlyRepSeg
-chr7 113933276 114108846 EarlyRepSeg
-chr7 114108947 114119346 EarlyRepSeg
-chr7 114119404 114119556 EarlyRepSeg
-chr7 114119621 114123541 EarlyRepSeg
-chr7 114124457 114124490 EarlyRepSeg
-chr7 114124634 114136954 EarlyRepSeg
-chr7 114142730 114142885 EarlyRepSeg
-chr7 114143714 114143737 EarlyRepSeg
-chr7 114143779 114144176 EarlyRepSeg
-chr7 114144305 114144327 EarlyRepSeg
-chr7 114360998 114361020 EarlyRepSeg
-chr7 114362526 114363858 EarlyRepSeg
-chr7 115404471 116251468 EarlyRepSeg
-chr7 116251612 116251638 EarlyRepSeg
-chr7 116251693 116251827 EarlyRepSeg
-chr7 116251956 116252352 EarlyRepSeg
-chr7 116252418 116253165 EarlyRepSeg
-chr7 116463012 116463121 EarlyRepSeg
-chr7 116474219 116474393 EarlyRepSeg
-chr7 116474517 116474771 EarlyRepSeg
-chr7 116484623 116561352 EarlyRepSeg
-chr7 116561778 116562791 EarlyRepSeg
-chr7 116563539 116571400 EarlyRepSeg
-chr7 116572311 116572335 EarlyRepSeg
-chr7 116572377 116572548 EarlyRepSeg
-chr7 116576381 116576667 EarlyRepSeg
-chr7 116597894 116597915 EarlyRepSeg
-chr7 116598129 116598237 EarlyRepSeg
-chr7 116598300 116608071 EarlyRepSeg
-chr7 116608165 116608209 EarlyRepSeg
-chr7 116608255 116608278 EarlyRepSeg
-chr7 116608335 116608527 EarlyRepSeg
-chr7 116609208 116609273 EarlyRepSeg
-chr7 116630981 116631297 EarlyRepSeg
-chr7 116633902 116634213 EarlyRepSeg
-chr7 116634270 116641382 EarlyRepSeg
-chr7 116694148 116698403 EarlyRepSeg
-chr7 116698511 116698606 EarlyRepSeg
-chr7 116698648 116698807 EarlyRepSeg
-chr7 116699036 116699669 EarlyRepSeg
-chr7 116735241 116737872 EarlyRepSeg
-chr7 116738045 116738948 EarlyRepSeg
-chr7 116739086 116739461 EarlyRepSeg
-chr7 116739526 116742149 EarlyRepSeg
-chr7 116742220 116744605 EarlyRepSeg
-chr7 116746201 116746659 EarlyRepSeg
-chr7 116746728 116746820 EarlyRepSeg
-chr7 116747018 116758597 EarlyRepSeg
-chr7 116763552 116928910 EarlyRepSeg
-chr7 116929761 116930077 EarlyRepSeg
-chr7 116931422 116931446 EarlyRepSeg
-chr6 41867303 41867713 EarlyRepSeg
-chr6 41868622 41868636 EarlyRepSeg
-chr6 41871084 41871127 EarlyRepSeg
-chr6 41871277 41871508 EarlyRepSeg
-chr6 41881436 41904567 EarlyRepSeg
-chr6 74114855 74115081 EarlyRepSeg
-chr6 74115174 74289952 EarlyRepSeg
-chr6 108641673 108641689 EarlyRepSeg
-chr6 108641837 108645076 EarlyRepSeg
-chr6 108645288 108645828 EarlyRepSeg
-chr6 108645850 108645872 EarlyRepSeg
-chr6 108645893 108647550 EarlyRepSeg
-chr6 108655265 108657582 EarlyRepSeg
-chr6 108658752 108658815 EarlyRepSeg
-chr6 108667835 108668566 EarlyRepSeg
-chr6 108675247 108677563 EarlyRepSeg
-chr6 108678755 108678800 EarlyRepSeg
-chr6 108687834 108688151 EarlyRepSeg
-chr6 108689330 108689377 EarlyRepSeg
-chr6 108751831 108752466 EarlyRepSeg
-chr6 108870546 108870611 EarlyRepSeg
-chr6 132325404 132325465 EarlyRepSeg
-chr6 132327970 132328191 EarlyRepSeg
-chr6 132328279 132329125 EarlyRepSeg
-chr6 132329408 132329455 EarlyRepSeg
-chr6 132329514 132329602 EarlyRepSeg
-chr6 132329683 132340765 EarlyRepSeg
-chr6 132341999 132342746 EarlyRepSeg
-chr6 132344613 132344841 EarlyRepSeg
-chr6 132345103 132345170 EarlyRepSeg
-chr6 132346006 132346044 EarlyRepSeg
-chr6 132346178 132346746 EarlyRepSeg
-chr6 132347078 132347478 EarlyRepSeg
-chr6 132370237 132372346 EarlyRepSeg
-chr6 132383528 132383567 EarlyRepSeg
-chr6 132384242 132384262 EarlyRepSeg
-chr6 132384405 132384422 EarlyRepSeg
-chr6 132384833 132385384 EarlyRepSeg
-chr6 132387114 132387150 EarlyRepSeg
-chr6 132394199 132396580 EarlyRepSeg
-chr5 55886021 55886041 EarlyRepSeg
-chr5 55886110 55886132 EarlyRepSeg
-chr5 55886176 55886195 EarlyRepSeg
-chr5 55888015 55889053 EarlyRepSeg
-chr5 55889099 55889140 EarlyRepSeg
-chr5 55889401 55890905 EarlyRepSeg
-chr5 56106962 56107249 EarlyRepSeg
-chr5 56107766 56107862 EarlyRepSeg
-chr5 56367460 56370292 EarlyRepSeg
-chr5 56370336 56370891 EarlyRepSeg
-chr5 131285263 131285306 EarlyRepSeg
-chr5 131475247 131494484 EarlyRepSeg
-chr5 131505619 131505861 EarlyRepSeg
-chr5 131507116 131595694 EarlyRepSeg
-chr5 131655935 131849308 EarlyRepSeg
-chr5 131849349 131849383 EarlyRepSeg
-chr5 131849499 131849515 EarlyRepSeg
-chr5 131888105 132000339 EarlyRepSeg
-chr5 132005729 132006017 EarlyRepSeg
-chr5 132006171 132007566 EarlyRepSeg
-chr5 132007757 132008189 EarlyRepSeg
-chr5 132015742 132015789 EarlyRepSeg
-chr5 132015951 132018096 EarlyRepSeg
-chr5 132018338 132019909 EarlyRepSeg
-chr5 132052942 132052981 EarlyRepSeg
-chr5 132053021 132056571 EarlyRepSeg
-chr5 132058138 132058229 EarlyRepSeg
-chr5 132058505 132058526 EarlyRepSeg
-chr5 132061788 132061810 EarlyRepSeg
-chr5 132061846 132062661 EarlyRepSeg
-chr5 132062832 132113831 EarlyRepSeg
-chr5 132139962 132145821 EarlyRepSeg
-chr5 132145885 132146737 EarlyRepSeg
-chr5 132146782 132146803 EarlyRepSeg
-chr5 132146845 132158072 EarlyRepSeg
-chr5 132158112 132158184 EarlyRepSeg
-chr5 132159741 132165336 EarlyRepSeg
-chr5 132165401 132165803 EarlyRepSeg
-chr5 132165876 132166736 EarlyRepSeg
-chr5 132192266 132192327 EarlyRepSeg
-chr5 132192395 132194449 EarlyRepSeg
-chr5 132194758 132195445 EarlyRepSeg
-chr5 132195811 132196282 EarlyRepSeg
-chr5 132207140 132213592 EarlyRepSeg
-chr5 132214738 132214752 EarlyRepSeg
-chr5 132226393 132234169 EarlyRepSeg
-chr5 132234504 132234598 EarlyRepSeg
-chr5 132235860 132235963 EarlyRepSeg
-chr5 132236046 132236459 EarlyRepSeg
-chr5 132236763 132237613 EarlyRepSeg
-chr5 132238255 132238299 EarlyRepSeg
-chr5 132238475 132283603 EarlyRepSeg
-chr5 142095059 142095166 EarlyRepSeg
-chr5 142095247 142095397 EarlyRepSeg
-chr5 142095465 142100861 EarlyRepSeg
-chr5 142101243 142102608 EarlyRepSeg
-chr5 142102655 142151401 EarlyRepSeg
-chr5 142154629 142158905 EarlyRepSeg
-chr5 142159158 142159198 EarlyRepSeg
-chr5 142159679 142173072 EarlyRepSeg
-chr18 59412370 59433985 EarlyRepSeg
-chr18 59434207 59456478 EarlyRepSeg
-chr18 59456699 59456831 EarlyRepSeg
-chr18 59456869 59456903 EarlyRepSeg
-chr18 59456922 59457354 EarlyRepSeg
-chr18 59457439 59465986 EarlyRepSeg
-chr18 59466027 59466067 EarlyRepSeg
-chr18 59466105 59466165 EarlyRepSeg
-chr18 59466225 59472274 EarlyRepSeg
-chr18 59472339 59472402 EarlyRepSeg
-chr18 59473339 59473490 EarlyRepSeg
-chr18 59475475 59475498 EarlyRepSeg
-chr18 59475900 59476000 EarlyRepSeg
-chr18 59476207 59476408 EarlyRepSeg
-chr18 59476471 59476911 EarlyRepSeg
-chr18 59477077 59477336 EarlyRepSeg
-chr18 59477401 59485966 EarlyRepSeg
-chr18 59486026 59486046 EarlyRepSeg
-chr18 59486215 59492264 EarlyRepSeg
-chr18 59492348 59492397 EarlyRepSeg
-chr18 59493339 59493451 EarlyRepSeg
-chr18 59521111 59521385 EarlyRepSeg
-chr18 59558120 59558177 EarlyRepSeg
-chr18 59558222 59558288 EarlyRepSeg
-chr2 220105509 220107457 EarlyRepSeg
-chr2 234274981 234460520 EarlyRepSeg
-chr1 147971142 148444534 EarlyRepSeg
-chr1 148444657 148444760 EarlyRepSeg
-chr1 148445123 148445166 EarlyRepSeg
-chr1 148445324 148445350 EarlyRepSeg
-chr1 148446462 148446660 EarlyRepSeg
-chr1 148447388 148447426 EarlyRepSeg
-chr1 148447762 148471133 EarlyRepSeg
-chr9 128765210 128856811 EarlyRepSeg
-chr9 128901865 129004365 EarlyRepSeg
-chr9 129005361 129008847 EarlyRepSeg
-chr9 129009370 129009735 EarlyRepSeg
-chr9 129010052 129015022 EarlyRepSeg
-chr9 129015082 129018165 EarlyRepSeg
-chr9 129018225 129027884 EarlyRepSeg
-chr9 129028821 129039792 EarlyRepSeg
-chr9 129040135 129040200 EarlyRepSeg
-chr9 129040288 129040309 EarlyRepSeg
-chr9 129040511 129040529 EarlyRepSeg
-chr9 129045169 129045941 EarlyRepSeg
-chr9 129046139 129052414 EarlyRepSeg
-chr9 129059485 129063706 EarlyRepSeg
-chr9 129064025 129064072 EarlyRepSeg
-chr9 129064243 129064284 EarlyRepSeg
-chr9 129071282 129073376 EarlyRepSeg
-chr9 129073850 129074365 EarlyRepSeg
-chr9 129075271 129075470 EarlyRepSeg
-chr9 129148128 129148471 EarlyRepSeg
-chr9 129174601 129174644 EarlyRepSeg
-chr9 129174683 129174867 EarlyRepSeg
-chr9 129177812 129178277 EarlyRepSeg
-chr9 129179593 129181321 EarlyRepSeg
-chr9 129182910 129182993 EarlyRepSeg
-chr9 129185792 129229546 EarlyRepSeg
-chrX 122515118 122518380 EarlyRepSeg
-chrX 122519180 122519262 EarlyRepSeg
-chrX 122519357 122521476 EarlyRepSeg
-chrX 122526240 122526737 EarlyRepSeg
-chrX 122527607 122527693 EarlyRepSeg
-chrX 122528249 122528336 EarlyRepSeg
-chrX 122528657 122529022 EarlyRepSeg
-chrX 122529666 122530817 EarlyRepSeg
-chrX 122565527 122565950 EarlyRepSeg
-chrX 122566173 122566198 EarlyRepSeg
-chrX 122566267 122566475 EarlyRepSeg
-chrX 122566527 122566817 EarlyRepSeg
-chrX 122567687 122582126 EarlyRepSeg
-chrX 122583489 122584103 EarlyRepSeg
-chrX 122594426 122596210 EarlyRepSeg
-chrX 122596274 122617296 EarlyRepSeg
-chrX 122633600 122633665 EarlyRepSeg
-chrX 122634493 122634584 EarlyRepSeg
-chrX 122636090 122872532 EarlyRepSeg
-chrX 122876952 122877037 EarlyRepSeg
-chrX 122877088 122877176 EarlyRepSeg
-chrX 122878185 122878198 EarlyRepSeg
-chrX 122879577 122880529 EarlyRepSeg
-chrX 122880573 122880754 EarlyRepSeg
-chrX 122880991 122881034 EarlyRepSeg
-chrX 122884162 122904171 EarlyRepSeg
-chrX 122904230 122904397 EarlyRepSeg
-chrX 122905605 122905631 EarlyRepSeg
-chrX 122905822 122906072 EarlyRepSeg
-chrX 122906141 122908153 EarlyRepSeg
-chrX 122908290 122908441 EarlyRepSeg
-chrX 122908471 122909074 EarlyRepSeg
-chrX 122909361 122909402 EarlyRepSeg
-chrX 122909482 122913104 EarlyRepSeg
-chrX 122915256 122915324 EarlyRepSeg
-chrX 152760672 152760721 EarlyRepSeg
-chrX 152760829 152760842 EarlyRepSeg
-chrX 152761258 152770914 EarlyRepSeg
-chrX 152771016 152808667 EarlyRepSeg
-chrX 152808758 152808842 EarlyRepSeg
-chrX 152809200 152809641 EarlyRepSeg
-chrX 152809809 152809850 EarlyRepSeg
-chrX 152809894 152809916 EarlyRepSeg
-chrX 152810266 152810965 EarlyRepSeg
-chrX 152830891 152831471 EarlyRepSeg
-chrX 152850880 152851459 EarlyRepSeg
-chrX 152861605 152868939 EarlyRepSeg
-chrX 152868998 152869602 EarlyRepSeg
-chrX 152869727 152870175 EarlyRepSeg
-chrX 152876992 152877431 EarlyRepSeg
-chrX 152877498 152878262 EarlyRepSeg
-chrX 152901180 152901356 EarlyRepSeg
-chrX 152901520 152901723 EarlyRepSeg
-chrX 152903274 152903322 EarlyRepSeg
-chrX 152904885 152907019 EarlyRepSeg
-chrX 153090357 153101014 EarlyRepSeg
-chrX 153101371 153104136 EarlyRepSeg
-chrX 153104196 153106352 EarlyRepSeg
-chrX 153297819 153305186 EarlyRepSeg
-chrX 153367214 153398065 EarlyRepSeg
-chrX 153409564 153409652 EarlyRepSeg
-chrX 153409708 153452751 EarlyRepSeg
-chrX 153825634 153825902 EarlyRepSeg
-chrX 153825944 153832126 EarlyRepSeg
-chrX 153833045 153834044 EarlyRepSeg
-chr13 29689066 29689271 EarlyRepSeg
-chr13 29689993 29691138 EarlyRepSeg
-chr13 29691184 29691786 EarlyRepSeg
-chr13 29699635 29723447 EarlyRepSeg
-chr13 29724097 29724150 EarlyRepSeg
-chr13 29724437 29729278 EarlyRepSeg
-chr13 29729324 29729541 EarlyRepSeg
-chr13 29748182 29749259 EarlyRepSeg
-chr13 29749301 29749322 EarlyRepSeg
-chr13 29750436 29778548 EarlyRepSeg
-chr13 29779059 29779318 EarlyRepSeg
-chr13 29779377 29782224 EarlyRepSeg
-chr13 29782457 29782521 EarlyRepSeg
-chr13 29782985 29783026 EarlyRepSeg
-chr13 29783068 29783105 EarlyRepSeg
-chr13 29783187 29794875 EarlyRepSeg
-chr13 29795145 29795419 EarlyRepSeg
-chr13 29795506 29795568 EarlyRepSeg
-chr13 29795610 29795657 EarlyRepSeg
-chr13 29797042 29797089 EarlyRepSeg
-chr13 29797248 29805175 EarlyRepSeg
-chr13 29807253 29807274 EarlyRepSeg
-chr13 29807727 29812203 EarlyRepSeg
-chr13 29812642 29820660 EarlyRepSeg
-chr13 29842265 29842438 EarlyRepSeg
-chr13 29854299 29854461 EarlyRepSeg
-chr13 29855916 29863126 EarlyRepSeg
-chr13 29865139 29866737 EarlyRepSeg
-chr13 29867798 29867842 EarlyRepSeg
-chr13 29867923 29868153 EarlyRepSeg
-chr13 29870372 29870486 EarlyRepSeg
-chr13 29870595 29871893 EarlyRepSeg
-chr13 29875493 29875515 EarlyRepSeg
-chr13 29875906 29876049 EarlyRepSeg
-chr13 29876280 29876544 EarlyRepSeg
-chr13 29877549 29877594 EarlyRepSeg
-chr13 29877640 29877755 EarlyRepSeg
-chr13 29888848 29889116 EarlyRepSeg
-chr13 29913298 29915450 EarlyRepSeg
-chr13 29916692 29916808 EarlyRepSeg
-chr13 29916871 29916912 EarlyRepSeg
-chr12 38857192 38857838 EarlyRepSeg
-chr12 38858064 38859517 EarlyRepSeg
-chr11 64242393 64242795 EarlyRepSeg
-chr11 64244176 64244321 EarlyRepSeg
-chr11 64297901 64321446 EarlyRepSeg
-chr11 116114836 116128702 EarlyRepSeg
-chr11 116134467 116135228 EarlyRepSeg
-chr11 116256326 116256395 EarlyRepSeg
-chr11 116256453 116256519 EarlyRepSeg
-chr11 116257093 116257138 EarlyRepSeg
-chr11 116257203 116257403 EarlyRepSeg
-chr11 116259428 116260093 EarlyRepSeg
-chr11 116280588 116294899 EarlyRepSeg
-chr11 116294934 116295981 EarlyRepSeg
-chr11 116296783 116298100 EarlyRepSeg
-chr11 116298577 116298670 EarlyRepSeg
-chr11 116298713 116299250 EarlyRepSeg
-chr11 116320712 116321239 EarlyRepSeg
-chr11 116326943 116398307 EarlyRepSeg
-chr11 116398468 116398525 EarlyRepSeg
-chr11 116398574 116398772 EarlyRepSeg
-chr11 116398840 116399053 EarlyRepSeg
-chr11 116400410 116401850 EarlyRepSeg
-chr11 116401898 116402342 EarlyRepSeg
-chr11 116402425 116403775 EarlyRepSeg
-chr11 116406023 116415188 EarlyRepSeg
-chr11 116415423 116417404 EarlyRepSeg
-chr11 116417596 116441864 EarlyRepSeg
-chr11 116443999 116444201 EarlyRepSeg
-chr11 116444843 116445008 EarlyRepSeg
-chr11 116445046 116448354 EarlyRepSeg
-chr11 116448391 116448434 EarlyRepSeg
-chr11 116448672 116448715 EarlyRepSeg
-chr11 116461947 116462084 EarlyRepSeg
-chr22 30129315 30200724 EarlyRepSeg
-chr22 30200767 30200791 EarlyRepSeg
-chr22 30200897 30205649 EarlyRepSeg
-chr22 30230684 30231848 EarlyRepSeg
-chr22 30239701 30239723 EarlyRepSeg
-chr22 30240912 30240933 EarlyRepSeg
-chr22 30241666 30241903 EarlyRepSeg
-chr22 30243634 30243709 EarlyRepSeg
-chr22 30243791 30244495 EarlyRepSeg
-chr22 30247809 30247829 EarlyRepSeg
-chr22 30247864 30248161 EarlyRepSeg
-chr22 30314600 30316228 EarlyRepSeg
-chr22 30316287 30317023 EarlyRepSeg
-chr22 30317489 30321462 EarlyRepSeg
-chr22 30352638 30354524 EarlyRepSeg
-chr22 30358006 30369571 EarlyRepSeg
-chr22 30373001 30373025 EarlyRepSeg
-chr22 30373688 30374213 EarlyRepSeg
-chr22 30375809 30390770 EarlyRepSeg
-chr22 30391746 30391889 EarlyRepSeg
-chr22 30394782 30394870 EarlyRepSeg
-chr22 30395266 30398830 EarlyRepSeg
-chr22 30400519 30400864 EarlyRepSeg
-chr22 30404073 30424199 EarlyRepSeg
-chr22 30424283 30424687 EarlyRepSeg
-chr22 30424727 30424952 EarlyRepSeg
-chr22 30433357 30433997 EarlyRepSeg
-chr22 30435197 30437931 EarlyRepSeg
-chr22 30440803 30450151 EarlyRepSeg
-chr22 30458187 30462627 EarlyRepSeg
-chr22 30462670 30462856 EarlyRepSeg
-chr22 30502987 30513365 EarlyRepSeg
-chr22 30513992 30515580 EarlyRepSeg
-chr22 30520887 30530176 EarlyRepSeg
-chr22 30530212 30530945 EarlyRepSeg
-chr22 30531203 30535572 EarlyRepSeg
-chr22 30540983 30541043 EarlyRepSeg
-chr22 30541107 30541527 EarlyRepSeg
-chr22 30556465 30556478 EarlyRepSeg
-chr22 30556865 30604008 EarlyRepSeg
-chr22 30606868 30606911 EarlyRepSeg
-chr22 30606958 30616014 EarlyRepSeg
-chr22 30626838 30632058 EarlyRepSeg
-chr22 30632517 30633323 EarlyRepSeg
-chr22 30634821 30634842 EarlyRepSeg
-chr22 30678345 30691941 EarlyRepSeg
-chr22 30691979 30696363 EarlyRepSeg
-chr22 30711525 30731359 EarlyRepSeg
-chr22 30735405 30753182 EarlyRepSeg
-chr22 31296060 31296144 EarlyRepSeg
-chr22 31296268 31296857 EarlyRepSeg
-chr22 31298098 31300256 EarlyRepSeg
-chr22 31300336 31302162 EarlyRepSeg
-chr22 31303418 31306260 EarlyRepSeg
-chr22 31306323 31307916 EarlyRepSeg
-chr22 31307969 31308066 EarlyRepSeg
-chr22 31308112 31308264 EarlyRepSeg
-chr22 31313549 31313659 EarlyRepSeg
-chr22 31313726 31313930 EarlyRepSeg
-chr22 31316904 31316969 EarlyRepSeg
-chr16 100314 100528 EarlyRepSeg
-chr16 100577 143948 EarlyRepSeg
-chr16 196729 255742 EarlyRepSeg
-chr16 327386 345225 EarlyRepSeg
-chr16 420528 499964 EarlyRepSeg
-chr16 25780441 25782479 EarlyRepSeg
-chr15 41520416 41610592 EarlyRepSeg
-chr15 41617282 41617384 EarlyRepSeg
-chr15 41617425 41622100 EarlyRepSeg
-chr15 41625197 41872249 EarlyRepSeg
-chr15 41872351 41872407 EarlyRepSeg
-chr15 41915847 41915868 EarlyRepSeg
-chr15 41915967 41916752 EarlyRepSeg
-chr15 41916818 41916836 EarlyRepSeg
-chr15 41930084 41935449 EarlyRepSeg
-chr21 32669080 32677736 EarlyRepSeg
-chr21 32679799 32679870 EarlyRepSeg
-chr21 32679914 32680795 EarlyRepSeg
-chr21 32681127 32681942 EarlyRepSeg
-chr21 32682560 32708225 EarlyRepSeg
-chr21 32708295 32708358 EarlyRepSeg
-chr21 32708395 32708786 EarlyRepSeg
-chr21 32708933 32709007 EarlyRepSeg
-chr21 32755446 32777739 EarlyRepSeg
-chr21 32777860 32781095 EarlyRepSeg
-chr21 32784633 32784877 EarlyRepSeg
-chr21 32785037 32787843 EarlyRepSeg
-chr21 32789267 32789327 EarlyRepSeg
-chr21 32790767 32793305 EarlyRepSeg
-chr21 32793700 32794302 EarlyRepSeg
-chr21 32795603 32795626 EarlyRepSeg
-chr21 32823257 32834186 EarlyRepSeg
-chr21 32835989 32836025 EarlyRepSeg
-chr21 32838501 32838523 EarlyRepSeg
-chr21 32838557 32838598 EarlyRepSeg
-chr21 32838643 32838756 EarlyRepSeg
-chr21 32838799 32838988 EarlyRepSeg
-chr21 32839538 32877989 EarlyRepSeg
-chr21 32878079 32878098 EarlyRepSeg
-chr21 32878144 32878203 EarlyRepSeg
-chr21 32878246 32878267 EarlyRepSeg
-chr21 32879333 32879475 EarlyRepSeg
-chr21 32879966 32879983 EarlyRepSeg
-chr21 32912504 32915865 EarlyRepSeg
-chr21 32932980 32967601 EarlyRepSeg
-chr21 32967643 33018889 EarlyRepSeg
-chr21 33024974 33025376 EarlyRepSeg
-chr21 33026349 33028938 EarlyRepSeg
-chr21 33031749 33032829 EarlyRepSeg
-chr21 33524233 33524260 EarlyRepSeg
-chr21 33524376 33524397 EarlyRepSeg
-chr21 33524744 33524770 EarlyRepSeg
-chr21 33550677 33553459 EarlyRepSeg
-chr21 33553902 33558482 EarlyRepSeg
-chr21 33580367 33580388 EarlyRepSeg
-chr21 33580473 33581913 EarlyRepSeg
-chr21 33581954 33582007 EarlyRepSeg
-chr21 33583555 33583569 EarlyRepSeg
-chr21 33588909 33696499 EarlyRepSeg
-chr21 33701210 33702335 EarlyRepSeg
-chr21 33703711 33846043 EarlyRepSeg
-chr21 33849912 33850091 EarlyRepSeg
-chr21 33850300 33850348 EarlyRepSeg
-chr21 33850908 33853290 EarlyRepSeg
-chr21 33853477 33853863 EarlyRepSeg
-chr21 33854415 33854525 EarlyRepSeg
-chr21 33860617 33861553 EarlyRepSeg
-chr21 33866117 33867043 EarlyRepSeg
-chr21 33867103 33867476 EarlyRepSeg
-chr21 33867667 33867813 EarlyRepSeg
-chr21 33867890 33867925 EarlyRepSeg
-chr21 33868277 33868602 EarlyRepSeg
-chr21 34062073 34062141 EarlyRepSeg
-chr21 34065246 34066028 EarlyRepSeg
-chr21 34083525 34084396 EarlyRepSeg
-chr21 34084507 34084731 EarlyRepSeg
-chr21 34084771 34084899 EarlyRepSeg
-chr21 34084941 34085007 EarlyRepSeg
-chr21 34085853 34086015 EarlyRepSeg
-chr21 34086163 34086256 EarlyRepSeg
-chr21 34086596 34147021 EarlyRepSeg
-chr21 34147160 34147200 EarlyRepSeg
-chr21 34147243 34166659 EarlyRepSeg
-chr21 34187295 34187336 EarlyRepSeg
-chr21 34187430 34187454 EarlyRepSeg
-chr21 34187857 34188159 EarlyRepSeg
-chr21 34188471 34227545 EarlyRepSeg
-chr21 34229001 34229045 EarlyRepSeg
-chr21 34229089 34233826 EarlyRepSeg
-chr21 34233903 34234848 EarlyRepSeg
-chr21 34235342 34235364 EarlyRepSeg
-chr21 34242364 34243816 EarlyRepSeg
-chr21 34244824 34245017 EarlyRepSeg
-chr21 34245242 34246040 EarlyRepSeg
-chr21 34250064 34254276 EarlyRepSeg
-chr21 34262783 34263806 EarlyRepSeg
-chr21 39244471 39407125 EarlyRepSeg
-chr21 39407872 39408136 EarlyRepSeg
-chr21 39408196 39408258 EarlyRepSeg
-chr21 39408975 39409067 EarlyRepSeg
-chr21 39409165 39446186 EarlyRepSeg
-chr21 39446250 39446293 EarlyRepSeg
-chr21 39446335 39449236 EarlyRepSeg
-chr21 39449276 39449691 EarlyRepSeg
-chr21 39449734 39449769 EarlyRepSeg
-chr21 39449840 39500135 EarlyRepSeg
-chr21 39500212 39500230 EarlyRepSeg
-chr21 39500273 39500291 EarlyRepSeg
-chr21 39500380 39504958 EarlyRepSeg
-chr21 39505923 39505963 EarlyRepSeg
-chr21 39506003 39506049 EarlyRepSeg
-chr21 39506091 39506345 EarlyRepSeg
-chr21 39506424 39506484 EarlyRepSeg
-chr21 39506703 39507084 EarlyRepSeg
-chr21 39507119 39630459 EarlyRepSeg
-chr21 39630770 39631537 EarlyRepSeg
-chr21 39631609 39632660 EarlyRepSeg
-chr21 39634408 39634612 EarlyRepSeg
-chr21 39634672 39637021 EarlyRepSeg
-chr21 39637718 39637740 EarlyRepSeg
-chr21 39638104 39639318 EarlyRepSeg
-chr21 39639514 39639764 EarlyRepSeg
-chr21 39639832 39640101 EarlyRepSeg
-chr21 39640247 39640471 EarlyRepSeg
-chr21 39642473 39642490 EarlyRepSeg
-chr21 39642699 39643256 EarlyRepSeg
-chr21 39643292 39643361 EarlyRepSeg
-chr20 33304928 33309185 EarlyRepSeg
-chr20 33331535 33662613 EarlyRepSeg
-chr20 33663823 33784967 EarlyRepSeg
-chr8 119109535 119109779 EarlyRepSeg
-chr8 119133176 119314664 EarlyRepSeg
-chr8 119314783 119314804 EarlyRepSeg
-chr8 119315080 119315854 EarlyRepSeg
-chr8 119316284 119317841 EarlyRepSeg
-chr8 119317881 119319990 EarlyRepSeg
-chr8 119321302 119322430 EarlyRepSeg
-chr8 119322628 119322752 EarlyRepSeg
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: Upload: Use find from underscore
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/40b9b13ec62b/
Changeset: 40b9b13ec62b
User: guerler
Date: 2014-02-17 18:58:39
Summary: Upload: Use find from underscore
Affected #: 4 files
diff -r a67b8cdce345bef55e349641445598e7db735a1a -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -321,7 +321,7 @@
var $el = $(this.el).find('#extension-info');
var extension = this.model.get('extension');
var title = this.select_extension.text();
- var description = Utils.findPair(this.app.list_extensions, 'id', extension);
+ var description = _.findWhere(this.app.list_extensions, {'id': extension});
// create popup
if (!this.extension_popup) {
diff -r a67b8cdce345bef55e349641445598e7db735a1a -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 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(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(i,g){this.app=i;var f=this;this.model=new b.Model(g);this.setElement(this._template(g));var h=this.$el;this.settings=new c.View({title:"Upload configuration",container:h.find("#settings"),placement:"bottom"});this.select_genome=new e.View({css:"genome",onchange:function(){f.model.set("genome",f.select_genome.value())},data:f.app.list_genomes,container:h.find("#genome"),value:f.model.get("genome")});this.model.set("genome",f.select_genome.value());this.select_extension=new e.View({css:"extension",onchange:function(){f.model.set("extension",f.select_extension.value())},data:f.app.list_extensions,container:h.find("#extension"),value:f.model.get("extension")});this.model.set("extension",f.select_extension.value());h.find("#symbol").on("click",function(){f._removeRow()});h.find("#extension-info").on("click",function(j){f._showExtensionInfo()}).on("mousedown",function(j){j.preventDefault()});h.find("#settings").on("click",function(j){f._showSettings()}).on("mousedown",function(j){j.preventDefault()});h.find("#text-content").on("keyup",function(j){f.model.set("url_paste",$(j.target).val());f.model.set("file_size",$(j.target).val().length)});h.find("#space_to_tabs").on("change",function(j){f.model.set("space_to_tabs",$(j.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshGenome:function(){var f=this.model.get("genome");this.select_genome.value(f)},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showExtensionInfo:function(){var f=$(this.el).find("#extension-info");var i=this.model.get("extension");var h=this.select_extension.text();var g=d.findPair(this.app.list_extensions,"id",i);if(!this.extension_popup){this.extension_popup=new c.View({placement:"bottom",container:f})}if(!this.extension_popup.visible){this.extension_popup.title(h);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(g));this.extension_popup.show()}else{this.extension_popup.hide()}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_templateDescription:function(g){if(g.description){var f=g.description;if(g.description_url){f+=' (<a href="'+g.description_url+'" target="_blank">read more</a>)'}return f}else{return"There is no description available for this file extension."}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div style="position: relative;"><div id="mode"></div><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><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><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>'}})});
\ No newline at end of file
+define(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(i,g){this.app=i;var f=this;this.model=new b.Model(g);this.setElement(this._template(g));var h=this.$el;this.settings=new c.View({title:"Upload configuration",container:h.find("#settings"),placement:"bottom"});this.select_genome=new e.View({css:"genome",onchange:function(){f.model.set("genome",f.select_genome.value())},data:f.app.list_genomes,container:h.find("#genome"),value:f.model.get("genome")});this.model.set("genome",f.select_genome.value());this.select_extension=new e.View({css:"extension",onchange:function(){f.model.set("extension",f.select_extension.value())},data:f.app.list_extensions,container:h.find("#extension"),value:f.model.get("extension")});this.model.set("extension",f.select_extension.value());h.find("#symbol").on("click",function(){f._removeRow()});h.find("#extension-info").on("click",function(j){f._showExtensionInfo()}).on("mousedown",function(j){j.preventDefault()});h.find("#settings").on("click",function(j){f._showSettings()}).on("mousedown",function(j){j.preventDefault()});h.find("#text-content").on("keyup",function(j){f.model.set("url_paste",$(j.target).val());f.model.set("file_size",$(j.target).val().length)});h.find("#space_to_tabs").on("change",function(j){f.model.set("space_to_tabs",$(j.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshGenome:function(){var f=this.model.get("genome");this.select_genome.value(f)},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showExtensionInfo:function(){var f=$(this.el).find("#extension-info");var i=this.model.get("extension");var h=this.select_extension.text();var g=_.findWhere(this.app.list_extensions,{id:i});if(!this.extension_popup){this.extension_popup=new c.View({placement:"bottom",container:f})}if(!this.extension_popup.visible){this.extension_popup.title(h);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(g));this.extension_popup.show()}else{this.extension_popup.hide()}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_templateDescription:function(g){if(g.description){var f=g.description;if(g.description_url){f+=' (<a href="'+g.description_url+'" target="_blank">read more</a>)'}return f}else{return"There is no description available for this file extension."}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div style="position: relative;"><div id="mode"></div><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><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><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>'}})});
\ No newline at end of file
diff -r a67b8cdce345bef55e349641445598e7db735a1a -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 static/scripts/packed/utils/utils.js
--- a/static/scripts/packed/utils/utils.js
+++ b/static/scripts/packed/utils/utils.js
@@ -1,1 +1,1 @@
-define(["libs/underscore"],function(c){function f(k,j,i){var l=new XMLHttpRequest();l.open("GET",k,true);l.setRequestHeader("Accept","application/json");l.setRequestHeader("Cache-Control","no-cache");l.setRequestHeader("X-Requested-With","XMLHttpRequest");l.onloadend=function(){var m=l.status;if(m==200){try{response=jQuery.parseJSON(l.responseText)}catch(n){response=l.responseText}j&&j(response)}else{i&&i(m)}};l.send()}function b(l,i){var j=$('<div class="'+l+'"></div>');j.appendTo(":eq(0)");var k=j.css(i);j.remove();return k}function a(i){if(!$('link[href^="'+i+'"]').length){$('<link href="'+galaxy_config.root+i+'" rel="stylesheet">').appendTo("head")}}function h(i,j){if(i){return c.defaults(i,j)}else{return j}}function d(j,l){var k="";if(j>=100000000000){j=j/100000000000;k="TB"}else{if(j>=100000000){j=j/100000000;k="GB"}else{if(j>=100000){j=j/100000;k="MB"}else{if(j>=100){j=j/100;k="KB"}else{if(j>0){j=j*10;k="b"}else{return"<strong>-</strong>"}}}}}var i=(Math.round(j)/10);if(l){return i+" "+k}else{return"<strong>"+i+"</strong> "+k}}function e(){return(new Date().getTime()).toString(36)}function g(j,l,n){for(var k in j){var m=j[k];if(m[l]==n){return m}}return{}}return{cssLoadFile:a,cssGetAttribute:b,jsonFromUrl:f,merge:h,bytesToString:d,uuid:e,findPair:g}});
\ No newline at end of file
+define(["libs/underscore"],function(c){function f(j,i,h){var k=new XMLHttpRequest();k.open("GET",j,true);k.setRequestHeader("Accept","application/json");k.setRequestHeader("Cache-Control","no-cache");k.setRequestHeader("X-Requested-With","XMLHttpRequest");k.onloadend=function(){var l=k.status;if(l==200){try{response=jQuery.parseJSON(k.responseText)}catch(m){response=k.responseText}i&&i(response)}else{h&&h(l)}};k.send()}function b(k,h){var i=$('<div class="'+k+'"></div>');i.appendTo(":eq(0)");var j=i.css(h);i.remove();return j}function a(h){if(!$('link[href^="'+h+'"]').length){$('<link href="'+galaxy_config.root+h+'" rel="stylesheet">').appendTo("head")}}function g(h,i){if(h){return c.defaults(h,i)}else{return i}}function d(i,k){var j="";if(i>=100000000000){i=i/100000000000;j="TB"}else{if(i>=100000000){i=i/100000000;j="GB"}else{if(i>=100000){i=i/100000;j="MB"}else{if(i>=100){i=i/100;j="KB"}else{if(i>0){i=i*10;j="b"}else{return"<strong>-</strong>"}}}}}var h=(Math.round(i)/10);if(k){return h+" "+j}else{return"<strong>"+h+"</strong> "+j}}function e(){return(new Date().getTime()).toString(36)}return{cssLoadFile:a,cssGetAttribute:b,jsonFromUrl:f,merge:g,bytesToString:d,uuid:e}});
\ No newline at end of file
diff -r a67b8cdce345bef55e349641445598e7db735a1a -r 40b9b13ec62b43d83e96d6624edbaea967da82a6 static/scripts/utils/utils.js
--- a/static/scripts/utils/utils.js
+++ b/static/scripts/utils/utils.js
@@ -96,17 +96,6 @@
return (new Date().getTime()).toString(36);
};
-// find in dict
-function findPair(arr, key, val) {
- for (var i in arr) {
- var item = arr[i];
- if (item[key] == val) {
- return item;
- }
- }
- return {};
-}
-
// return
return {
cssLoadFile : cssLoadFile,
@@ -114,8 +103,7 @@
jsonFromUrl : jsonFromUrl,
merge : merge,
bytesToString: bytesToString,
- uuid: uuid,
- findPair: findPair
+ uuid: uuid
};
});
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Add a script to check toolshed dependency files for broken/invalid download URLs.
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a67b8cdce345/
Changeset: a67b8cdce345
User: dan
Date: 2014-02-17 18:51:34
Summary: Add a script to check toolshed dependency files for broken/invalid download URLs.
Affected #: 1 file
diff -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b -r a67b8cdce345bef55e349641445598e7db735a1a scripts/tool_shed/check_download_urls.py
--- /dev/null
+++ b/scripts/tool_shed/check_download_urls.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+##Dan Blankenberg
+##Script that checks toolshed tags to see if URLs are accessible.
+##Does not currently handle 'download_binary'
+
+import os
+import sys
+from optparse import OptionParser
+import xml.etree.ElementTree as ET
+import urllib2
+
+FILENAMES = [ 'tool_dependencies.xml' ]
+ACTION_TYPES = [ 'download_by_url', 'download_file' ]
+
+def main():
+ parser = OptionParser()
+ parser.add_option( '-d', '--directory', dest='directory', action='store', type="string", default='.', help='Root directory' )
+
+ ( options, args ) = parser.parse_args()
+
+ for (dirpath, dirnames, filenames) in os.walk( options.directory ):
+ for filename in filenames:
+ if filename in FILENAMES:
+ path = os.path.join( dirpath, filename )
+ try:
+ tree = ET.parse( path )
+ root = tree.getroot()
+ for action_type in ACTION_TYPES:
+ for element in root.findall( ".//action[@type='%s']" % action_type ):
+ url = element.text.strip()
+ try:
+ urllib2.urlopen( urllib2.Request( url ) )
+ except Exception, e:
+ print "Bad URL '%s' in file '%s': %s" % ( url, path, e )
+ except Exception, e:
+ print "Unable to check XML file '%s': %s" % ( path, e )
+
+if __name__ == "__main__":
+ main()
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: UI: add peek-based column selection control; Scatterplot: use peek-based control for selection of x, y, id axes
by commits-noreply@bitbucket.org 17 Feb '14
by commits-noreply@bitbucket.org 17 Feb '14
17 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6353214a32ee/
Changeset: 6353214a32ee
User: carlfeberhard
Date: 2014-02-17 18:11:04
Summary: UI: add peek-based column selection control; Scatterplot: use peek-based control for selection of x, y, id axes
Affected #: 8 files
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b config/plugins/visualizations/scatterplot/src/handlebars/datacontrol.handlebars
--- a/config/plugins/visualizations/scatterplot/src/handlebars/datacontrol.handlebars
+++ b/config/plugins/visualizations/scatterplot/src/handlebars/datacontrol.handlebars
@@ -1,55 +1,24 @@
<p class="help-text">
- Use the following controls to change the data used by the chart.
+ Use the following control to change which columns are used by the chart. Click any cell
+ from the last three rows of the table to select the column for the appropriate data.
Use the 'Draw' button to render (or re-render) the chart with the current settings.
</p>
-{{! column selector containers }}
-<div class="column-select">
- <label>Data column for X: </label>
- <select name="xColumn">
- {{#each numericColumns}}
- <option value="{{index}}">{{name}}</option>
- {{/each}}
- </select>
-</div>
-<div class="column-select">
- <label>Data column for Y: </label>
- <select name="yColumn">
- {{#each numericColumns}}
- <option value="{{index}}">{{name}}</option>
- {{/each}}
- </select>
+<ul class="help-text" style="margin-left: 8px">
+ <li><b>X Column</b>: which column values will be used for the x axis of the chart.</li>
+ <li><b>Y Column</b>: which column values will be used for the y axis of the chart.</li>
+ <li><b>ID Column</b>: an additional column value displayed when the user hovers over a data point.
+ It may be useful to select unique or categorical identifiers here (such as gene ids).
+ </li>
+</ul>
+
+<div class="column-selection">
+ <pre class="peek">{{{ peek }}}</pre></div>
-{{! optional id column }}
-<div id="include-id">
- <label for="include-id-checkbox">Include a third column as data point IDs?</label>
- <input type="checkbox" name="include-id" id="include-id-checkbox" />
- <p class="help-text-small">
- These will be displayed (along with the x and y values) when you hover over
- a data point.
- </p>
-</div>
-<div class="column-select" style="display: none">
- <label for="ID-select">Data column for IDs: </label>
- <select name="idColumn">
- {{#each allColumns}}
- <option value="{{index}}">{{name}}</option>
- {{/each}}
- </select>
-</div>
-
-{{! if we're using generic column selection names ('column 1') - allow the user to use the first line }}
-<div id="first-line-header" style="display: none;">
- <p>Possible headers: {{ possibleHeaders }}
- </p>
- <label for="first-line-header-checkbox">Use the above as column headers?</label>
- <input type="checkbox" name="include-id" id="first-line-header-checkbox"
- {{#if usePossibleHeaders }}checked="true"{{/if}}/>
- <p class="help-text-small">
- It looks like Galaxy couldn't get proper column headers for this data.
- Would you like to use the column headers above as column names to select columns?
- </p>
-</div>
+<p class="help-text help-text-small">
+ <b>Note</b>: If it can be determined from the dataset's filetype that column is not numeric, that
+ column choice may be disabled for either the x or y axis.
+</p><button class="render-button btn btn-primary active">Draw</button>
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b config/plugins/visualizations/scatterplot/src/scatterplot-config-editor.js
--- a/config/plugins/visualizations/scatterplot/src/scatterplot-config-editor.js
+++ b/config/plugins/visualizations/scatterplot/src/scatterplot-config-editor.js
@@ -78,73 +78,62 @@
return this;
},
+ /** get an object with arrays keyed with possible column types (numeric, text, all)
+ * and if metadata_column_types is set on the dataset, add the indeces of each
+ * column into the appropriate array.
+ * Used to disable certain columns from being selected for x, y axes.
+ */
+ _getColumnIndecesByType : function(){
+ //TODO: not sure these contraints are necc. now
+ var types = {
+ numeric : [],
+ text : [],
+ all : []
+ };
+ _.each( this.dataset.metadata_column_types || [], function( type, i ){
+ if( type === 'int' || type === 'float' ){
+ types.numeric.push( i );
+ } else if( type === 'str' || type === 'list' ){
+ types.text.push( i );
+ }
+ types.all.push( i );
+ });
+ if( types.numeric.length < 2 ){
+ types.numeric = [];
+ }
+ //console.log( 'types:', JSON.stringify( types ) );
+ return types;
+ },
+
/** controls for which columns are used to plot datapoints (and ids/additional info to attach if desired) */
_render_dataControl : function( $where ){
- //TODO: better handling of missing column names, column types
$where = $where || this.$el;
var editor = this,
- dataset = this.dataset,
- column_names = dataset.metadata_column_names || [],
- config = this.model.get( 'config' );
- //console.log( 'metadata_column_types:', this.dataset.metadata_column_types );
- //console.log( 'metadata_column_names:', this.dataset.metadata_column_names );
-
-//TODO: to peek based control
- var numericColumns = [],
- allColumns = _.map( dataset.metadata_column_types, function( type, i ){
- // save column data for select rendering, adding metadata name if available in dataset
- var column = { index: i, type: type, name: ( column_names[ i ] || ( 'column ' + ( i + 1 )) ) };
- // also add column to numerics if numeric type
- if( ( column.type === 'int' ) || ( column.type === 'float' ) ){
- numericColumns.push( column );
- }
- return column;
- });
- if( numericColumns.length < 2 ){
- numericColumns = allColumns;
- }
- //console.log( 'allColumns:', allColumns );
- //console.log( 'numericColumns:', numericColumns );
+ //column_names = dataset.metadata_column_names || [],
+ config = this.model.get( 'config' ),
+ columnTypes = this._getColumnIndecesByType();
// render the html
var $dataControl = $where.find( '.tab-pane#data-control' );
$dataControl.html( ScatterplotConfigEditor.templates.dataControl({
- allColumns : allColumns,
- numericColumns : numericColumns
+ peek : this.dataset.peek
}));
-//TODO: column selection boilerplate
- // preset to column selectors if they were passed in the config in the query string; set up events
- var newConfig = {
- xColumn : ( _.isFinite( config.xColumn ) )? ( config.xColumn ): ( numericColumns[0].index ),
- yColumn : ( _.isFinite( config.yColumn ) )? ( config.yColumn ): ( numericColumns[1].index ),
- idColumn : allColumns[0].index
- };
- // use an idColumn from the config or attempt to get one different from the numeric
- if( _.isFinite( config.idColumn ) ){
- newConfig.idColumn = config.idColumn;
- } else {
- if( allColumns.length > 2 ){
- var uniqueCol = _.find( allColumns, function( column, i ){
- return i !== newConfig.xColumn && i !== newConfig.yColumn;
- });
- newConfig.idColumn = uniqueCol.index;
- }
- }
- config = this.model.set( 'config', newConfig, { silent: true }).get( 'config' );
+ $dataControl.find( '.peek' ).peekControl({
+ controls : [
+ { label: 'X Column', id: 'xColumn', selected: config.xColumn, disabled: columnTypes.text },
+ { label: 'Y Column', id: 'yColumn', selected: config.yColumn, disabled: columnTypes.text },
+ { label: 'ID Column', id: 'idColumn', selected: config.idColumn }
+ ]
+ //renameColumns : true
- $dataControl.find( '[name="xColumn"]' ).val( config.xColumn ).on( 'change', function(){
- editor.model.set( 'config', { xColumn: Number( $( this ).val() ) });
+ }).on( 'peek-control.change', function( ev, data ){
+ //console.info( 'new selection:', data );
+ editor.model.set( 'config', data );
+
+ }).on( 'peek-control.rename', function( ev, data ){
+ //console.info( 'new column names', data );
});
- $dataControl.find( '[name="yColumn"]' ).val( config.yColumn ).on( 'change', function(){
- editor.model.set( 'config', { yColumn: Number( $( this ).val() ) });
- });
- $dataControl.find( 'select[name="idColumn"]' ).val( config.idColumn ).on( 'change', function(){
- editor.model.set( 'config', { idColumn: Number( $( this ).val() ) });
- });
- if( config.idColumn !== undefined ){
- $dataControl.find( '#include-id-checkbox' ).prop( 'checked', true ).trigger( 'change' );
- }
$dataControl.find( '[title]' ).tooltip();
return $dataControl;
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b config/plugins/visualizations/scatterplot/static/scatterplot-edit.js
--- a/config/plugins/visualizations/scatterplot/static/scatterplot-edit.js
+++ b/config/plugins/visualizations/scatterplot/static/scatterplot-edit.js
@@ -1,1 +1,1 @@
-function scatterplot(a,b,c){function d(){var a={v:{},h:{}};return a.v.lines=p.selectAll("line.v-grid-line").data(m.x.ticks(q.x.fn.ticks()[0])),a.v.lines.enter().append("svg:line").classed("grid-line v-grid-line",!0),a.v.lines.attr("x1",m.x).attr("x2",m.x).attr("y1",0).attr("y2",b.height),a.v.lines.exit().remove(),a.h.lines=p.selectAll("line.h-grid-line").data(m.y.ticks(q.y.fn.ticks()[0])),a.h.lines.enter().append("svg:line").classed("grid-line h-grid-line",!0),a.h.lines.attr("x1",0).attr("x2",b.width).attr("y1",m.y).attr("y2",m.y),a.h.lines.exit().remove(),a}function e(){return t.attr("cx",function(a,b){return m.x(j(a,b))}).attr("cy",function(a,b){return m.y(k(a,b))}).style("display","block").filter(function(){var a=d3.select(this).attr("cx"),c=d3.select(this).attr("cy");return 0>a||a>b.width?!0:0>c||c>b.height?!0:!1}).style("display","none")}function f(){$(".chart-info-box").remove(),q.redraw(),e(),s=d(),$(o.node()).trigger("zoom.scatterplot",{scale:n.scale(),translate:n.translate()})}function g(a,c,d){return c+=8,$(['<div class="chart-info-box" style="position: absolute">',void 0!==b.idColumn?"<div>"+d[b.idColumn]+"</div>":"","<div>",j(d),"</div>","<div>",k(d),"</div>","</div>"].join("")).css({top:a,left:c,"z-index":2})}var h=function(a,b){return"translate("+a+","+b+")"},i=function(a,b,c){return"rotate("+a+","+b+","+c+")"},j=function(a){return a[b.xColumn]},k=function(a){return a[b.yColumn]},l={x:{extent:d3.extent(c,j)},y:{extent:d3.extent(c,k)}},m={x:d3.scale.linear().domain(l.x.extent).range([0,b.width]),y:d3.scale.linear().domain(l.y.extent).range([b.height,0])},n=d3.behavior.zoom().x(m.x).y(m.y).scaleExtent([1,30]).scale(b.scale||1).translate(b.translate||[0,0]),o=d3.select(a).attr("class","scatterplot").attr("width","100%").attr("height",b.height+(b.margin.top+b.margin.bottom)),p=o.append("g").attr("class","content").attr("transform",h(b.margin.left,b.margin.top)).call(n);p.append("rect").attr("class","zoom-rect").attr("width",b.width).attr("height",b.height).style("fill","transparent");var q={x:{},y:{}};q.x.fn=d3.svg.axis().orient("bottom").scale(m.x).ticks(b.x.ticks).tickFormat(d3.format("s")),q.y.fn=d3.svg.axis().orient("left").scale(m.y).ticks(b.y.ticks).tickFormat(d3.format("s")),q.x.g=p.append("g").attr("class","x axis").attr("transform",h(0,b.height)).call(q.x.fn),q.y.g=p.append("g").attr("class","y axis").call(q.y.fn);var r=6;q.x.label=o.append("text").attr("class","axis-label").text(b.x.label).attr("text-anchor","middle").attr("dominant-baseline","text-after-edge").attr("x",b.width/2+b.margin.left).attr("y",b.height+b.margin.bottom+b.margin.top-r),q.y.label=o.append("text").attr("class","axis-label").text(b.y.label).attr("text-anchor","middle").attr("dominant-baseline","text-before-edge").attr("x",r).attr("y",b.height/2).attr("transform",i(-90,r,b.height/2)),q.redraw=function(){o.select(".x.axis").call(q.x.fn),o.select(".y.axis").call(q.y.fn)};var s=d(),t=p.selectAll(".glyph").data(c).enter().append("svg:circle").classed("glyph",!0).attr("cx",function(a,b){return m.x(j(a,b))}).attr("cy",function(a,b){return m.y(k(a,b))}).attr("r",0);t.transition().duration(b.animDuration).attr("r",b.datapointSize),e(),n.on("zoom",f),t.on("mouseover",function(a,c){var d=d3.select(this);d.classed("highlight",!0).style("fill","red").style("fill-opacity",1),p.append("line").attr("stroke","red").attr("stroke-width",1).attr("x1",d.attr("cx")-b.datapointSize).attr("y1",d.attr("cy")).attr("x2",0).attr("y2",d.attr("cy")).classed("hoverline",!0),d.attr("cy")<b.height&&p.append("line").attr("stroke","red").attr("stroke-width",1).attr("x1",d.attr("cx")).attr("y1",+d.attr("cy")+b.datapointSize).attr("x2",d.attr("cx")).attr("y2",b.height).classed("hoverline",!0);var e=this.getBoundingClientRect();$("body").append(g(e.top,e.right,a)),$(o.node()).trigger("mouseover-datapoint.scatterplot",[this,a,c])}),t.on("mouseout",function(){d3.select(this).classed("highlight",!1).style("fill","black").style("fill-opacity",.2),p.selectAll(".hoverline").remove(),$(".chart-info-box").remove()})}this.scatterplot=this.scatterplot||{},this.scatterplot.chartcontrol=Handlebars.template(function(a,b,c,d,e){this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var f,g="",h="function",i=this.escapeExpression;return g+='<p class="help-text">\n Use the following controls to how the chart is displayed.\n The slide controls can be moved by the mouse or, if the \'handle\' is in focus, your keyboard\'s arrow keys.\n Move the focus between controls by using the tab or shift+tab keys on your keyboard.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n</p>\n\n<div data-config-key="datapointSize" class="form-input numeric-slider-input">\n <label for="datapointSize">Size of data point: </label>\n <div class="slider-output">',(f=c.datapointSize)?f=f.call(b,{hash:{},data:e}):(f=b.datapointSize,f=typeof f===h?f.apply(b):f),g+=i(f)+'</div>\n <div class="slider"></div>\n <p class="form-help help-text-small">\n Size of the graphic representation of each data point\n </p>\n</div>\n\n<div data-config-key="width" class="form-input numeric-slider-input">\n <label for="width">Chart width: </label>\n <div class="slider-output">',(f=c.width)?f=f.call(b,{hash:{},data:e}):(f=b.width,f=typeof f===h?f.apply(b):f),g+=i(f)+'</div>\n <div class="slider"></div>\n <p class="form-help help-text-small">\n (not including chart margins and axes)\n </p>\n</div>\n\n<div data-config-key="height" class="form-input numeric-slider-input">\n <label for="height">Chart height: </label>\n <div class="slider-output">',(f=c.height)?f=f.call(b,{hash:{},data:e}):(f=b.height,f=typeof f===h?f.apply(b):f),g+=i(f)+'</div>\n <div class="slider"></div>\n <p class="form-help help-text-small">\n (not including chart margins and axes)\n </p>\n</div>\n\n<div data-config-key="X-axis-label"class="text-input form-input">\n <label for="X-axis-label">Re-label the X axis: </label>\n <input type="text" name="X-axis-label" id="X-axis-label" value="'+i((f=b.x,f=null==f||f===!1?f:f.label,typeof f===h?f.apply(b):f))+'" />\n <p class="form-help help-text-small"></p>\n</div>\n\n<div data-config-key="Y-axis-label" class="text-input form-input">\n <label for="Y-axis-label">Re-label the Y axis: </label>\n <input type="text" name="Y-axis-label" id="Y-axis-label" value="'+i((f=b.y,f=null==f||f===!1?f:f.label,typeof f===h?f.apply(b):f))+'" />\n <p class="form-help help-text-small"></p>\n</div>\n\n<button class="render-button btn btn-primary active">Draw</button>\n'}),this.scatterplot.datacontrol=Handlebars.template(function(a,b,c,d,e){function f(a,b){var d,e="";return e+='\n <option value="',(d=c.index)?d=d.call(a,{hash:{},data:b}):(d=a.index,d=typeof d===j?d.apply(a):d),e+=k(d)+'">',(d=c.name)?d=d.call(a,{hash:{},data:b}):(d=a.name,d=typeof d===j?d.apply(a):d),e+=k(d)+"</option>\n "}function g(){return'checked="true"'}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var h,i="",j="function",k=this.escapeExpression,l=this;return i+='<p class="help-text">\n Use the following controls to change the data used by the chart.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n</p>\n\n\n<div class="column-select">\n <label>Data column for X: </label>\n <select name="xColumn">\n ',h=c.each.call(b,b.numericColumns,{hash:{},inverse:l.noop,fn:l.program(1,f,e),data:e}),(h||0===h)&&(i+=h),i+='\n </select>\n</div>\n<div class="column-select">\n <label>Data column for Y: </label>\n <select name="yColumn">\n ',h=c.each.call(b,b.numericColumns,{hash:{},inverse:l.noop,fn:l.program(1,f,e),data:e}),(h||0===h)&&(i+=h),i+='\n </select>\n</div>\n\n\n<div id="include-id">\n <label for="include-id-checkbox">Include a third column as data point IDs?</label>\n <input type="checkbox" name="include-id" id="include-id-checkbox" />\n <p class="help-text-small">\n These will be displayed (along with the x and y values) when you hover over\n a data point.\n </p>\n</div>\n<div class="column-select" style="display: none">\n <label for="ID-select">Data column for IDs: </label>\n <select name="idColumn">\n ',h=c.each.call(b,b.allColumns,{hash:{},inverse:l.noop,fn:l.program(1,f,e),data:e}),(h||0===h)&&(i+=h),i+='\n </select>\n</div>\n\n\n<div id="first-line-header" style="display: none;">\n <p>Possible headers: ',(h=c.possibleHeaders)?h=h.call(b,{hash:{},data:e}):(h=b.possibleHeaders,h=typeof h===j?h.apply(b):h),i+=k(h)+'\n </p>\n <label for="first-line-header-checkbox">Use the above as column headers?</label>\n <input type="checkbox" name="include-id" id="first-line-header-checkbox"\n ',h=c["if"].call(b,b.usePossibleHeaders,{hash:{},inverse:l.noop,fn:l.program(3,g,e),data:e}),(h||0===h)&&(i+=h),i+='/>\n <p class="help-text-small">\n It looks like Galaxy couldn\'t get proper column headers for this data.\n Would you like to use the column headers above as column names to select columns?\n </p>\n</div>\n\n<button class="render-button btn btn-primary active">Draw</button>\n'}),this.scatterplot.editor=Handlebars.template(function(a,b,c,d,e){this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var f="";return f+='<div class="scatterplot-editor tabbable tabs-left">\n \n <ul class="nav nav-tabs">\n \n <li class="active">\n <a title="Use this tab to change which data are used"\n href="#data-control" data-toggle="tab">Data Controls</a>\n </li>\n <li>\n <a title="Use this tab to change how the chart is drawn"\n href="#chart-control" data-toggle="tab" >Chart Controls</a>\n </li>\n \n <li class="disabled">\n <a title="This tab will display the chart"\n href="#chart-display" data-toggle="tab">Chart</a>\n </li>\n \n <li class="file-controls">\n<!-- <button class="copy-btn btn btn-default"\n title="Save this as a new visualization">Save to new</button>-->\n <button class="save-btn btn btn-default">Save</button>\n </li>\n </ul>\n\n \n <div class="tab-content">\n \n <div id="data-control" class="scatterplot-config-control tab-pane active">\n \n </div>\n \n \n <div id="chart-control" class="scatterplot-config-control tab-pane">\n \n </div>\n\n \n <div id="chart-display" class="scatterplot-display tab-pane"></div>\n\n </div>\n</div>\n'});var ScatterplotConfigEditor=Backbone.View.extend(LoggableMixin).extend({className:"scatterplot-control-form",initialize:function(a){if(this.model||(this.model=new Visualization({type:"scatterplot"})),this.log(this+".initialize, attributes:",a),!a||!a.dataset)throw new Error("ScatterplotConfigEditor requires a dataset");this.dataset=a.dataset,this.log("dataset:",this.dataset),this.display=new ScatterplotDisplay({dataset:a.dataset,model:this.model})},render:function(){this.$el.empty().append(ScatterplotConfigEditor.templates.mainLayout({})),this.model.id&&(this.$el.find(".copy-btn").show(),this.$el.find(".save-btn").text("Update saved")),this.$el.find("[title]").tooltip(),this._render_dataControl(),this._render_chartControls(),this._render_chartDisplay();var a=this.model.get("config");return this.model.id&&_.isFinite(a.xColumn)&&_.isFinite(a.yColumn)&&this.renderChart(),this},_render_dataControl:function(a){a=a||this.$el;var b=this,c=this.dataset,d=c.metadata_column_names||[],e=this.model.get("config"),f=[],g=_.map(c.metadata_column_types,function(a,b){var c={index:b,type:a,name:d[b]||"column "+(b+1)};return("int"===c.type||"float"===c.type)&&f.push(c),c});f.length<2&&(f=g);var h=a.find(".tab-pane#data-control");h.html(ScatterplotConfigEditor.templates.dataControl({allColumns:g,numericColumns:f}));var i={xColumn:_.isFinite(e.xColumn)?e.xColumn:f[0].index,yColumn:_.isFinite(e.yColumn)?e.yColumn:f[1].index,idColumn:g[0].index};if(_.isFinite(e.idColumn))i.idColumn=e.idColumn;else if(g.length>2){var j=_.find(g,function(a,b){return b!==i.xColumn&&b!==i.yColumn});i.idColumn=j.index}return e=this.model.set("config",i,{silent:!0}).get("config"),h.find('[name="xColumn"]').val(e.xColumn).on("change",function(){b.model.set("config",{xColumn:Number($(this).val())})}),h.find('[name="yColumn"]').val(e.yColumn).on("change",function(){b.model.set("config",{yColumn:Number($(this).val())})}),h.find('select[name="idColumn"]').val(e.idColumn).on("change",function(){b.model.set("config",{idColumn:Number($(this).val())})}),void 0!==e.idColumn&&h.find("#include-id-checkbox").prop("checked",!0).trigger("change"),h.find("[title]").tooltip(),h},_render_chartControls:function(a){function b(){var a=$(this),b=a.slider("value");c.model.set("config",_.object([[a.parent().data("config-key"),b]])),a.siblings(".slider-output").text(b)}a=a||this.$el;var c=this,d=this.model.get("config"),e=a.find("#chart-control");e.html(ScatterplotConfigEditor.templates.chartControl(d));var f={datapointSize:{min:2,max:10,step:1},width:{min:200,max:800,step:20},height:{min:200,max:800,step:20}};e.find(".numeric-slider-input").each(function(){var a=$(this),c=a.attr("data-config-key"),e=_.extend(f[c],{value:d[c],change:b,slide:b});a.find(".slider").slider(e),a.children(".slider-output").text(d[c])});var g=this.dataset.metadata_column_names||[],h=d.xLabel||g[d.xColumn]||"X",i=d.yLabel||g[d.yColumn]||"Y";return e.find('input[name="X-axis-label"]').val(h).on("change",function(){c.model.set("config",{xLabel:$(this).val()})}),e.find('input[name="Y-axis-label"]').val(i).on("change",function(){c.model.set("config",{yLabel:$(this).val()})}),e.find("[title]").tooltip(),e},_render_chartDisplay:function(a){a=a||this.$el;var b=a.find(".tab-pane#chart-display");return this.display.setElement(b),this.display.render(),b.find("[title]").tooltip(),b},events:{"change #include-id-checkbox":"toggleThirdColumnSelector","click #data-control .render-button":"renderChart","click #chart-control .render-button":"renderChart","click .save-btn":"saveVisualization"},saveVisualization:function(){var a=this;this.model.save().fail(function(b,c,d){console.error(b,c,d),a.trigger("save:error",view),alert("Error loading data:\n"+b.responseText)}).then(function(){a.display.render()})},toggleThirdColumnSelector:function(){this.$el.find('select[name="idColumn"]').parent().toggle()},renderChart:function(){this.$el.find(".nav li.disabled").removeClass("disabled"),this.$el.find("ul.nav").find('a[href="#chart-display"]').tab("show"),this.display.fetchData()},toString:function(){return"ScatterplotConfigEditor("+(this.dataset?this.dataset.id:"")+")"}});ScatterplotConfigEditor.templates={mainLayout:scatterplot.editor,dataControl:scatterplot.datacontrol,chartControl:scatterplot.chartcontrol};var ScatterplotDisplay=Backbone.View.extend({initialize:function(a){this.data=null,this.dataset=a.dataset,this.lineCount=this.dataset.metadata_data_lines||null},fetchData:function(){this.showLoadingIndicator();var a=this,b=this.model.get("config"),c=jQuery.getJSON("/api/datasets/"+this.dataset.id,{data_type:"raw_data",provider:"dataset-column",limit:b.pagination.perPage,offset:b.pagination.currPage*b.pagination.perPage});return c.done(function(b){a.data=b.data,a.trigger("data:fetched",a),a.renderData()}),c.fail(function(b,c,d){console.error(b,c,d),a.trigger("data:error",a),alert("Error loading data:\n"+b.responseText)}),c},showLoadingIndicator:function(){this.$el.find(".scatterplot-data-info").html(['<div class="loading-indicator">','<span class="fa fa-spinner fa-spin"></span>','<span class="loading-indicator-message">loading...</span>',"</div>"].join(""))},template:function(){var a=['<div class="controls clear">','<div class="right">','<p class="scatterplot-data-info"></p>','<button class="stats-toggle-btn">Stats</button>','<button class="rerender-btn">Redraw</button>',"</div>",'<div class="left">','<div class="page-control"></div>',"</div>","</div>","<svg/>",'<div class="stats-display"></div>'].join("");return a},render:function(){return this.$el.addClass("scatterplot-display").html(this.template()),this.data&&this.renderData(),this},renderData:function(){this.renderLeftControls(),this.renderRightControls(),this.renderPlot(this.data),this.getStats()},renderLeftControls:function(){var a=this,b=this.model.get("config");return this.$el.find(".controls .left .page-control").pagination({startingPage:b.pagination.currPage,perPage:b.pagination.perPage,totalDataSize:this.lineCount,currDataSize:this.data.length}).off().on("pagination.page-change",function(c,d){b.pagination.currPage=d,a.model.set("config",{pagination:b.pagination}),a.resetZoom(),a.fetchData()}),this},renderRightControls:function(){var a=this;this.setLineInfo(this.data),this.$el.find(".stats-toggle-btn").off().click(function(){a.toggleStats()}),this.$el.find(".rerender-btn").off().click(function(){a.resetZoom(),a.renderPlot(this.data)})},renderPlot:function(){var a=this,b=this.$el.find("svg");this.toggleStats(!1),b.off().empty().show().on("zoom.scatterplot",function(b,c){a.model.set("config",c)}),scatterplot(b.get(0),this.model.get("config"),this.data)},setLineInfo:function(a,b){if(a){var c=this.model.get("config"),d=this.lineCount||"an unknown total",e=c.pagination.currPage*c.pagination.perPage,f=e+a.length;this.$el.find(".controls p.scatterplot-data-info").text([e+1,"to",f,"of",d].join(" "))}else this.$el.find(".controls p.scatterplot-data-info").html(b||"");return this},resetZoom:function(a,b){return a=void 0!==a?a:1,b=void 0!==b?b:[0,0],this.model.set("config",{scale:a,translate:b}),this},getStats:function(){if(this.data){var a=this,b=this.model.get("config"),c=new Worker("/plugins/visualizations/scatterplot/static/worker-stats.js");c.postMessage({data:this.data,keys:[b.xColumn,b.yColumn]}),c.onerror=function(){c.terminate()},c.onmessage=function(b){a.renderStats(b.data)}}},renderStats:function(a){var b=this.model.get("config"),c=this.$el.find(".stats-display"),d=b.x.label,e=b.y.label,f=$("<table/>").addClass("table").append(["<thead><th></th><th>",d,"</th><th>",e,"</th></thead>"].join("")).append(_.map(a,function(a,b){return $(["<tr><td>",b,"</td><td>",a[0],"</td><td>",a[1],"</td></tr>"].join(""))}));c.empty().append(f)},toggleStats:function(a){var b=this.$el.find(".stats-display");a=void 0===a?b.is(":hidden"):a,a?(this.$el.find("svg").hide(),b.show(),this.$el.find(".controls .stats-toggle-btn").text("Plot")):(b.hide(),this.$el.find("svg").show(),this.$el.find(".controls .stats-toggle-btn").text("Stats"))},toString:function(){return"ScatterplotView()"}}),ScatterplotModel=Visualization.extend({defaults:{type:"scatterplot",config:{pagination:{currPage:0,perPage:3e3},width:400,height:400,margin:{top:16,right:16,bottom:40,left:54},x:{ticks:10,label:"X"},y:{ticks:10,label:"Y"},datapointSize:4,animDuration:500,scale:1,translate:[0,0]}}});
\ No newline at end of file
+function scatterplot(a,b,c){function d(){var a={v:{},h:{}};return a.v.lines=p.selectAll("line.v-grid-line").data(m.x.ticks(q.x.fn.ticks()[0])),a.v.lines.enter().append("svg:line").classed("grid-line v-grid-line",!0),a.v.lines.attr("x1",m.x).attr("x2",m.x).attr("y1",0).attr("y2",b.height),a.v.lines.exit().remove(),a.h.lines=p.selectAll("line.h-grid-line").data(m.y.ticks(q.y.fn.ticks()[0])),a.h.lines.enter().append("svg:line").classed("grid-line h-grid-line",!0),a.h.lines.attr("x1",0).attr("x2",b.width).attr("y1",m.y).attr("y2",m.y),a.h.lines.exit().remove(),a}function e(){return t.attr("cx",function(a,b){return m.x(j(a,b))}).attr("cy",function(a,b){return m.y(k(a,b))}).style("display","block").filter(function(){var a=d3.select(this).attr("cx"),c=d3.select(this).attr("cy");return 0>a||a>b.width?!0:0>c||c>b.height?!0:!1}).style("display","none")}function f(){$(".chart-info-box").remove(),q.redraw(),e(),s=d(),$(o.node()).trigger("zoom.scatterplot",{scale:n.scale(),translate:n.translate()})}function g(a,c,d){return c+=8,$(['<div class="chart-info-box" style="position: absolute">',void 0!==b.idColumn?"<div>"+d[b.idColumn]+"</div>":"","<div>",j(d),"</div>","<div>",k(d),"</div>","</div>"].join("")).css({top:a,left:c,"z-index":2})}var h=function(a,b){return"translate("+a+","+b+")"},i=function(a,b,c){return"rotate("+a+","+b+","+c+")"},j=function(a){return a[b.xColumn]},k=function(a){return a[b.yColumn]},l={x:{extent:d3.extent(c,j)},y:{extent:d3.extent(c,k)}},m={x:d3.scale.linear().domain(l.x.extent).range([0,b.width]),y:d3.scale.linear().domain(l.y.extent).range([b.height,0])},n=d3.behavior.zoom().x(m.x).y(m.y).scaleExtent([1,30]).scale(b.scale||1).translate(b.translate||[0,0]),o=d3.select(a).attr("class","scatterplot").attr("width","100%").attr("height",b.height+(b.margin.top+b.margin.bottom)),p=o.append("g").attr("class","content").attr("transform",h(b.margin.left,b.margin.top)).call(n);p.append("rect").attr("class","zoom-rect").attr("width",b.width).attr("height",b.height).style("fill","transparent");var q={x:{},y:{}};q.x.fn=d3.svg.axis().orient("bottom").scale(m.x).ticks(b.x.ticks).tickFormat(d3.format("s")),q.y.fn=d3.svg.axis().orient("left").scale(m.y).ticks(b.y.ticks).tickFormat(d3.format("s")),q.x.g=p.append("g").attr("class","x axis").attr("transform",h(0,b.height)).call(q.x.fn),q.y.g=p.append("g").attr("class","y axis").call(q.y.fn);var r=6;q.x.label=o.append("text").attr("class","axis-label").text(b.x.label).attr("text-anchor","middle").attr("dominant-baseline","text-after-edge").attr("x",b.width/2+b.margin.left).attr("y",b.height+b.margin.bottom+b.margin.top-r),q.y.label=o.append("text").attr("class","axis-label").text(b.y.label).attr("text-anchor","middle").attr("dominant-baseline","text-before-edge").attr("x",r).attr("y",b.height/2).attr("transform",i(-90,r,b.height/2)),q.redraw=function(){o.select(".x.axis").call(q.x.fn),o.select(".y.axis").call(q.y.fn)};var s=d(),t=p.selectAll(".glyph").data(c).enter().append("svg:circle").classed("glyph",!0).attr("cx",function(a,b){return m.x(j(a,b))}).attr("cy",function(a,b){return m.y(k(a,b))}).attr("r",0);t.transition().duration(b.animDuration).attr("r",b.datapointSize),e(),n.on("zoom",f),t.on("mouseover",function(a,c){var d=d3.select(this);d.classed("highlight",!0).style("fill","red").style("fill-opacity",1),p.append("line").attr("stroke","red").attr("stroke-width",1).attr("x1",d.attr("cx")-b.datapointSize).attr("y1",d.attr("cy")).attr("x2",0).attr("y2",d.attr("cy")).classed("hoverline",!0),d.attr("cy")<b.height&&p.append("line").attr("stroke","red").attr("stroke-width",1).attr("x1",d.attr("cx")).attr("y1",+d.attr("cy")+b.datapointSize).attr("x2",d.attr("cx")).attr("y2",b.height).classed("hoverline",!0);var e=this.getBoundingClientRect();$("body").append(g(e.top,e.right,a)),$(o.node()).trigger("mouseover-datapoint.scatterplot",[this,a,c])}),t.on("mouseout",function(){d3.select(this).classed("highlight",!1).style("fill","black").style("fill-opacity",.2),p.selectAll(".hoverline").remove(),$(".chart-info-box").remove()})}this.scatterplot=this.scatterplot||{},this.scatterplot.chartcontrol=Handlebars.template(function(a,b,c,d,e){this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var f,g="",h="function",i=this.escapeExpression;return g+='<p class="help-text">\n Use the following controls to how the chart is displayed.\n The slide controls can be moved by the mouse or, if the \'handle\' is in focus, your keyboard\'s arrow keys.\n Move the focus between controls by using the tab or shift+tab keys on your keyboard.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n</p>\n\n<div data-config-key="datapointSize" class="form-input numeric-slider-input">\n <label for="datapointSize">Size of data point: </label>\n <div class="slider-output">',(f=c.datapointSize)?f=f.call(b,{hash:{},data:e}):(f=b.datapointSize,f=typeof f===h?f.apply(b):f),g+=i(f)+'</div>\n <div class="slider"></div>\n <p class="form-help help-text-small">\n Size of the graphic representation of each data point\n </p>\n</div>\n\n<div data-config-key="width" class="form-input numeric-slider-input">\n <label for="width">Chart width: </label>\n <div class="slider-output">',(f=c.width)?f=f.call(b,{hash:{},data:e}):(f=b.width,f=typeof f===h?f.apply(b):f),g+=i(f)+'</div>\n <div class="slider"></div>\n <p class="form-help help-text-small">\n (not including chart margins and axes)\n </p>\n</div>\n\n<div data-config-key="height" class="form-input numeric-slider-input">\n <label for="height">Chart height: </label>\n <div class="slider-output">',(f=c.height)?f=f.call(b,{hash:{},data:e}):(f=b.height,f=typeof f===h?f.apply(b):f),g+=i(f)+'</div>\n <div class="slider"></div>\n <p class="form-help help-text-small">\n (not including chart margins and axes)\n </p>\n</div>\n\n<div data-config-key="X-axis-label"class="text-input form-input">\n <label for="X-axis-label">Re-label the X axis: </label>\n <input type="text" name="X-axis-label" id="X-axis-label" value="'+i((f=b.x,f=null==f||f===!1?f:f.label,typeof f===h?f.apply(b):f))+'" />\n <p class="form-help help-text-small"></p>\n</div>\n\n<div data-config-key="Y-axis-label" class="text-input form-input">\n <label for="Y-axis-label">Re-label the Y axis: </label>\n <input type="text" name="Y-axis-label" id="Y-axis-label" value="'+i((f=b.y,f=null==f||f===!1?f:f.label,typeof f===h?f.apply(b):f))+'" />\n <p class="form-help help-text-small"></p>\n</div>\n\n<button class="render-button btn btn-primary active">Draw</button>\n'}),this.scatterplot.datacontrol=Handlebars.template(function(a,b,c,d,e){this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var f,g="",h="function";return g+='<p class="help-text">\n Use the following control to change which columns are used by the chart. Click any cell\n from the last three rows of the table to select the column for the appropriate data.\n Use the \'Draw\' button to render (or re-render) the chart with the current settings.\n</p>\n\n<ul class="help-text" style="margin-left: 8px">\n <li><b>X Column</b>: which column values will be used for the x axis of the chart.</li>\n <li><b>Y Column</b>: which column values will be used for the y axis of the chart.</li>\n <li><b>ID Column</b>: an additional column value displayed when the user hovers over a data point.\n It may be useful to select unique or categorical identifiers here (such as gene ids).\n </li>\n</ul>\n\n<div class="column-selection">\n <pre class="peek">',(f=c.peek)?f=f.call(b,{hash:{},data:e}):(f=b.peek,f=typeof f===h?f.apply(b):f),(f||0===f)&&(g+=f),g+='</pre>\n</div>\n\n<p class="help-text help-text-small">\n <b>Note</b>: If it can be determined from the dataset\'s filetype that column is not numeric, that\n column choice may be disabled for either the x or y axis.\n</p>\n\n<button class="render-button btn btn-primary active">Draw</button>\n'}),this.scatterplot.editor=Handlebars.template(function(a,b,c,d,e){this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var f="";return f+='<div class="scatterplot-editor tabbable tabs-left">\n \n <ul class="nav nav-tabs">\n \n <li class="active">\n <a title="Use this tab to change which data are used"\n href="#data-control" data-toggle="tab">Data Controls</a>\n </li>\n <li>\n <a title="Use this tab to change how the chart is drawn"\n href="#chart-control" data-toggle="tab" >Chart Controls</a>\n </li>\n \n <li class="disabled">\n <a title="This tab will display the chart"\n href="#chart-display" data-toggle="tab">Chart</a>\n </li>\n \n <li class="file-controls">\n<!-- <button class="copy-btn btn btn-default"\n title="Save this as a new visualization">Save to new</button>-->\n <button class="save-btn btn btn-default">Save</button>\n </li>\n </ul>\n\n \n <div class="tab-content">\n \n <div id="data-control" class="scatterplot-config-control tab-pane active">\n \n </div>\n \n \n <div id="chart-control" class="scatterplot-config-control tab-pane">\n \n </div>\n\n \n <div id="chart-display" class="scatterplot-display tab-pane"></div>\n\n </div>\n</div>\n'});var ScatterplotConfigEditor=Backbone.View.extend(LoggableMixin).extend({className:"scatterplot-control-form",initialize:function(a){if(this.model||(this.model=new Visualization({type:"scatterplot"})),this.log(this+".initialize, attributes:",a),!a||!a.dataset)throw new Error("ScatterplotConfigEditor requires a dataset");this.dataset=a.dataset,this.log("dataset:",this.dataset),this.display=new ScatterplotDisplay({dataset:a.dataset,model:this.model})},render:function(){this.$el.empty().append(ScatterplotConfigEditor.templates.mainLayout({})),this.model.id&&(this.$el.find(".copy-btn").show(),this.$el.find(".save-btn").text("Update saved")),this.$el.find("[title]").tooltip(),this._render_dataControl(),this._render_chartControls(),this._render_chartDisplay();var a=this.model.get("config");return this.model.id&&_.isFinite(a.xColumn)&&_.isFinite(a.yColumn)&&this.renderChart(),this},_getColumnIndecesByType:function(){var a={numeric:[],text:[],all:[]};return _.each(this.dataset.metadata_column_types||[],function(b,c){"int"===b||"float"===b?a.numeric.push(c):("str"===b||"list"===b)&&a.text.push(c),a.all.push(c)}),a.numeric.length<2&&(a.numeric=[]),a},_render_dataControl:function(a){a=a||this.$el;var b=this,c=this.model.get("config"),d=this._getColumnIndecesByType(),e=a.find(".tab-pane#data-control");return e.html(ScatterplotConfigEditor.templates.dataControl({peek:this.dataset.peek})),e.find(".peek").peekControl({controls:[{label:"X Column",id:"xColumn",selected:c.xColumn,disabled:d.text},{label:"Y Column",id:"yColumn",selected:c.yColumn,disabled:d.text},{label:"ID Column",id:"idColumn",selected:c.idColumn}]}).on("peek-control.change",function(a,c){b.model.set("config",c)}).on("peek-control.rename",function(){}),e.find("[title]").tooltip(),e},_render_chartControls:function(a){function b(){var a=$(this),b=a.slider("value");c.model.set("config",_.object([[a.parent().data("config-key"),b]])),a.siblings(".slider-output").text(b)}a=a||this.$el;var c=this,d=this.model.get("config"),e=a.find("#chart-control");e.html(ScatterplotConfigEditor.templates.chartControl(d));var f={datapointSize:{min:2,max:10,step:1},width:{min:200,max:800,step:20},height:{min:200,max:800,step:20}};e.find(".numeric-slider-input").each(function(){var a=$(this),c=a.attr("data-config-key"),e=_.extend(f[c],{value:d[c],change:b,slide:b});a.find(".slider").slider(e),a.children(".slider-output").text(d[c])});var g=this.dataset.metadata_column_names||[],h=d.xLabel||g[d.xColumn]||"X",i=d.yLabel||g[d.yColumn]||"Y";return e.find('input[name="X-axis-label"]').val(h).on("change",function(){c.model.set("config",{xLabel:$(this).val()})}),e.find('input[name="Y-axis-label"]').val(i).on("change",function(){c.model.set("config",{yLabel:$(this).val()})}),e.find("[title]").tooltip(),e},_render_chartDisplay:function(a){a=a||this.$el;var b=a.find(".tab-pane#chart-display");return this.display.setElement(b),this.display.render(),b.find("[title]").tooltip(),b},events:{"change #include-id-checkbox":"toggleThirdColumnSelector","click #data-control .render-button":"renderChart","click #chart-control .render-button":"renderChart","click .save-btn":"saveVisualization"},saveVisualization:function(){var a=this;this.model.save().fail(function(b,c,d){console.error(b,c,d),a.trigger("save:error",view),alert("Error loading data:\n"+b.responseText)}).then(function(){a.display.render()})},toggleThirdColumnSelector:function(){this.$el.find('select[name="idColumn"]').parent().toggle()},renderChart:function(){this.$el.find(".nav li.disabled").removeClass("disabled"),this.$el.find("ul.nav").find('a[href="#chart-display"]').tab("show"),this.display.fetchData()},toString:function(){return"ScatterplotConfigEditor("+(this.dataset?this.dataset.id:"")+")"}});ScatterplotConfigEditor.templates={mainLayout:scatterplot.editor,dataControl:scatterplot.datacontrol,chartControl:scatterplot.chartcontrol};var ScatterplotDisplay=Backbone.View.extend({initialize:function(a){this.data=null,this.dataset=a.dataset,this.lineCount=this.dataset.metadata_data_lines||null},fetchData:function(){this.showLoadingIndicator();var a=this,b=this.model.get("config"),c=jQuery.getJSON("/api/datasets/"+this.dataset.id,{data_type:"raw_data",provider:"dataset-column",limit:b.pagination.perPage,offset:b.pagination.currPage*b.pagination.perPage});return c.done(function(b){a.data=b.data,a.trigger("data:fetched",a),a.renderData()}),c.fail(function(b,c,d){console.error(b,c,d),a.trigger("data:error",a),alert("Error loading data:\n"+b.responseText)}),c},showLoadingIndicator:function(){this.$el.find(".scatterplot-data-info").html(['<div class="loading-indicator">','<span class="fa fa-spinner fa-spin"></span>','<span class="loading-indicator-message">loading...</span>',"</div>"].join(""))},template:function(){var a=['<div class="controls clear">','<div class="right">','<p class="scatterplot-data-info"></p>','<button class="stats-toggle-btn">Stats</button>','<button class="rerender-btn">Redraw</button>',"</div>",'<div class="left">','<div class="page-control"></div>',"</div>","</div>","<svg/>",'<div class="stats-display"></div>'].join("");return a},render:function(){return this.$el.addClass("scatterplot-display").html(this.template()),this.data&&this.renderData(),this},renderData:function(){this.renderLeftControls(),this.renderRightControls(),this.renderPlot(this.data),this.getStats()},renderLeftControls:function(){var a=this,b=this.model.get("config");return this.$el.find(".controls .left .page-control").pagination({startingPage:b.pagination.currPage,perPage:b.pagination.perPage,totalDataSize:this.lineCount,currDataSize:this.data.length}).off().on("pagination.page-change",function(c,d){b.pagination.currPage=d,a.model.set("config",{pagination:b.pagination}),a.resetZoom(),a.fetchData()}),this},renderRightControls:function(){var a=this;this.setLineInfo(this.data),this.$el.find(".stats-toggle-btn").off().click(function(){a.toggleStats()}),this.$el.find(".rerender-btn").off().click(function(){a.resetZoom(),a.renderPlot(this.data)})},renderPlot:function(){var a=this,b=this.$el.find("svg");this.toggleStats(!1),b.off().empty().show().on("zoom.scatterplot",function(b,c){a.model.set("config",c)}),scatterplot(b.get(0),this.model.get("config"),this.data)},setLineInfo:function(a,b){if(a){var c=this.model.get("config"),d=this.lineCount||"an unknown total",e=c.pagination.currPage*c.pagination.perPage,f=e+a.length;this.$el.find(".controls p.scatterplot-data-info").text([e+1,"to",f,"of",d].join(" "))}else this.$el.find(".controls p.scatterplot-data-info").html(b||"");return this},resetZoom:function(a,b){return a=void 0!==a?a:1,b=void 0!==b?b:[0,0],this.model.set("config",{scale:a,translate:b}),this},getStats:function(){if(this.data){var a=this,b=this.model.get("config"),c=new Worker("/plugins/visualizations/scatterplot/static/worker-stats.js");c.postMessage({data:this.data,keys:[b.xColumn,b.yColumn]}),c.onerror=function(){c.terminate()},c.onmessage=function(b){a.renderStats(b.data)}}},renderStats:function(a){var b=this.model.get("config"),c=this.$el.find(".stats-display"),d=b.x.label,e=b.y.label,f=$("<table/>").addClass("table").append(["<thead><th></th><th>",d,"</th><th>",e,"</th></thead>"].join("")).append(_.map(a,function(a,b){return $(["<tr><td>",b,"</td><td>",a[0],"</td><td>",a[1],"</td></tr>"].join(""))}));c.empty().append(f)},toggleStats:function(a){var b=this.$el.find(".stats-display");a=void 0===a?b.is(":hidden"):a,a?(this.$el.find("svg").hide(),b.show(),this.$el.find(".controls .stats-toggle-btn").text("Plot")):(b.hide(),this.$el.find("svg").show(),this.$el.find(".controls .stats-toggle-btn").text("Stats"))},toString:function(){return"ScatterplotView()"}}),ScatterplotModel=Visualization.extend({defaults:{type:"scatterplot",config:{pagination:{currPage:0,perPage:3e3},width:400,height:400,margin:{top:16,right:16,bottom:40,left:54},x:{ticks:10,label:"X"},y:{ticks:10,label:"Y"},datapointSize:4,animDuration:500,scale:1,translate:[0,0]}}});
\ No newline at end of file
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b config/plugins/visualizations/scatterplot/templates/scatterplot.mako
--- a/config/plugins/visualizations/scatterplot/templates/scatterplot.mako
+++ b/config/plugins/visualizations/scatterplot/templates/scatterplot.mako
@@ -87,7 +87,7 @@
model : model,
dataset : hdaJson
}).render();
- //window.editor = editor;
+ window.editor = editor;
$( '.chart-header h2' ).click( function(){
var returned = prompt( 'Enter a new title:' );
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b static/scripts/mvc/ui.js
--- a/static/scripts/mvc/ui.js
+++ b/static/scripts/mvc/ui.js
@@ -1299,3 +1299,310 @@
});
}());
+
+//==============================================================================
+/** Column selection using the peek display as the control.
+ * Adds rows to the bottom of the peek with clickable areas in each cell
+ * to allow the user to select columns.
+ * Column selection can be limited to a single column or multiple.
+ * (Optionally) adds a left hand column of column selection prompts.
+ * (Optionally) allows the column headers to be clicked/renamed
+ * and set to some initial value.
+ * (Optionally) hides comment rows.
+ * (Optionally) allows pre-selecting and disabling certain columns for
+ * each row control.
+ *
+ * Construct by selecting a peek table to be used with jQuery and
+ * calling 'peekControl' with options.
+ * Options must include a 'controls' array and can include other options
+ * listed below.
+ * @example:
+ * $( 'pre.peek' ).peekControl({
+ * columnNames : ["Chromosome", "Start", "Base", "", "", "Qual" ],
+ * controls : [
+ * { label: 'X Column', id: 'xColumn' },
+ * { label: 'Y Column', id: 'yColumn', selected: 2 },
+ * { label: 'ID Column', id: 'idColumn', selected: 4, disabled: [ 1, 5 ] },
+ * { label: 'Heatmap', id: 'heatmap', selected: [ 2, 4 ], disabled: [ 0, 1 ], multiselect: true,
+ * selectedText: 'Included', unselectedText: 'Excluded' }
+ * ],
+ * renameColumns : true,
+ * hideCommentRows : true,
+ * includePrompts : true,
+ * topLeftContent : 'Data sample:'
+ * }).on( 'peek-control.change', function( ev, selection ){
+ * console.info( 'new selection:', selection );
+ * //{ yColumn: 2 }
+ * }).on( 'peek-control.rename', function( ev, names ){
+ * console.info( 'column names', names );
+ * //[ 'Bler', 'Start', 'Base', '', '', 'Qual' ]
+ * });
+ *
+ * An event is fired when column selection is changed and the event
+ * is passed an object in the form: { the row id : the new selection value }.
+ * An event is also fired when the table headers are re-named and
+ * is passed the new array of column names.
+ */
+(function(){
+
+ /** option defaults */
+ var defaults = {
+ /** does this control allow renaming headers? */
+ renameColumns : false,
+ /** does this control allow renaming headers? */
+ columnNames : [],
+ /** the comment character used by the peek's datatype */
+ commentChar : '#',
+ /** should comment rows be shown or hidden in the peek */
+ hideCommentRows : false,
+ /** should a column of row control prompts be used */
+ includePrompts : true,
+ /** what is the content of the top left cell (often a title) */
+ topLeftContent : 'Columns:'
+ },
+ /** the string of the event fired when a control row changes */
+ CHANGE_EVENT = 'peek-control.change',
+ /** the string of the event fired when a column is renamed */
+ RENAME_EVENT = 'peek-control.rename',
+ /** class added to the pre.peek element (to allow css on just the control) */
+ PEEKCONTROL_CLASS = 'peek-control',
+ /** class added to the control rows */
+ ROW_CLASS = 'control',
+ /** class added to the left-hand cells that serve as row prompts */
+ PROMPT_CLASS = 'control-prompt',
+ /** class added to selected _cells_/tds */
+ SELECTED_CLASS = 'selected',
+ /** class added to disabled/un-clickable cells/tds */
+ DISABLED_CLASS = 'disabled',
+ /** class added to the clickable surface within a cell to select it */
+ BUTTON_CLASS = 'button',
+ /** class added to peek table header (th) cells to indicate they can be clicked and are renamable */
+ RENAMABLE_HEADER_CLASS = 'renamable-header',
+ /** the data key used for each cell to store the column index ('data-...') */
+ COLUMN_INDEX_DATA_KEY = 'column-index',
+ /** renamable header data key used to store the column name (w/o the number and dot: '1.Bler') */
+ COLUMN_NAME_DATA_KEY = 'column-name';
+
+ //TODO: not happy with pure functional here - rows should polymorph (multi, single, etc.)
+ //TODO: needs clean up, move handlers to outer scope
+
+ // ........................................................................
+ /** validate the control data sent in for each row */
+ function validateControl( control ){
+ if( control.disabled && jQuery.type( control.disabled ) !== 'array' ){
+ throw new Error( '"disabled" must be defined as an array of indeces: ' + JSON.stringify( control ) );
+ }
+ if( control.multiselect && control.selected && jQuery.type( control.selected ) !== 'array' ){
+ throw new Error( 'Mulitselect rows need an array for "selected": ' + JSON.stringify( control ) );
+ }
+ if( !control.label || !control.id ){
+ throw new Error( 'Peek controls need a label and id for each control row: ' + JSON.stringify( control ) );
+ }
+ if( control.disabled && control.disabled.indexOf( control.selected ) !== -1 ){
+ throw new Error( 'Selected column is in the list of disabled columns: ' + JSON.stringify( control ) );
+ }
+ return control;
+ }
+
+ /** build the inner control surface (i.e. button-like) */
+ function buildButton( control, columnIndex ){
+ return $( '<div/>' ).addClass( BUTTON_CLASS ).text( control.label );
+ }
+
+ /** build the basic (shared) cell structure */
+ function buildControlCell( control, columnIndex ){
+ var $td = $( '<td/>' )
+ .html( buildButton( control, columnIndex ) )
+ .attr( 'data-' + COLUMN_INDEX_DATA_KEY, columnIndex );
+
+ // disable if index in disabled array
+ if( control.disabled && control.disabled.indexOf( columnIndex ) !== -1 ){
+ $td.addClass( DISABLED_CLASS );
+ }
+ return $td;
+ }
+
+ /** set the text of the control based on selected/un */
+ function setSelectedText( $cell, control, columnIndex ){
+ var $button = $cell.children( '.' + BUTTON_CLASS );
+ if( $cell.hasClass( SELECTED_CLASS ) ){
+ $button.html( ( control.selectedText !== undefined )?( control.selectedText ):( control.label ) );
+ } else {
+ $button.html( ( control.unselectedText !== undefined )?( control.unselectedText ):( control.label ) );
+ }
+ }
+
+ /** build a cell for a row that only allows one selection */
+ function buildSingleSelectCell( control, columnIndex ){
+ // only one selection - selected is single index
+ var $cell = buildControlCell( control, columnIndex );
+ if( control.selected === columnIndex ){
+ $cell.addClass( SELECTED_CLASS );
+ }
+ setSelectedText( $cell, control, columnIndex );
+
+ // only add the handler to non-disabled controls
+ if( !$cell.hasClass( DISABLED_CLASS ) ){
+ $cell.click( function selectClick( ev ){
+ var $cell = $( this );
+ // don't re-select or fire event if already selected
+ if( !$cell.hasClass( SELECTED_CLASS ) ){
+ // only one can be selected - remove selected on all others, add it here
+ var $otherSelected = $cell.parent().children( '.' + SELECTED_CLASS ).removeClass( SELECTED_CLASS );
+ $otherSelected.each( function(){
+ setSelectedText( $( this ), control, columnIndex );
+ });
+
+ $cell.addClass( SELECTED_CLASS );
+ setSelectedText( $cell, control, columnIndex );
+
+ // fire the event from the table itself, passing the id and index of selected
+ var eventData = {},
+ key = $cell.parent().attr( 'id' ),
+ val = $cell.data( COLUMN_INDEX_DATA_KEY );
+ eventData[ key ] = val;
+ $cell.parents( '.peek' ).trigger( CHANGE_EVENT, eventData );
+ }
+ });
+ }
+ return $cell;
+ }
+
+ /** build a cell for a row that allows multiple selections */
+ function buildMultiSelectCell( control, columnIndex ){
+ var $cell = buildControlCell( control, columnIndex );
+ // multiple selection - selected is an array
+ if( control.selected && control.selected.indexOf( columnIndex ) !== -1 ){
+ $cell.addClass( SELECTED_CLASS );
+ }
+ setSelectedText( $cell, control, columnIndex );
+
+ // only add the handler to non-disabled controls
+ if( !$cell.hasClass( DISABLED_CLASS ) ){
+ $cell.click( function multiselectClick( ev ){
+ var $cell = $( this );
+ // can be more than one selected - toggle selected on this cell
+ $cell.toggleClass( SELECTED_CLASS );
+ setSelectedText( $cell, control, columnIndex );
+ var selectedColumnIndeces = $cell.parent().find( '.' + SELECTED_CLASS ).map( function( i, e ){
+ return $( e ).data( COLUMN_INDEX_DATA_KEY );
+ });
+ // fire the event from the table itself, passing the id and index of selected
+ var eventData = {},
+ key = $cell.parent().attr( 'id' ),
+ val = jQuery.makeArray( selectedColumnIndeces );
+ eventData[ key ] = val;
+ $cell.parents( '.peek' ).trigger( CHANGE_EVENT, eventData );
+ });
+ }
+ return $cell;
+ }
+
+ /** iterate over columns in peek and create a control for each */
+ function buildControlCells( count, control ){
+ var $cells = [];
+ // build a control for each column - using a build fn based on control
+ for( var columnIndex=0; columnIndex<count; columnIndex+=1 ){
+ $cells.push( control.multiselect? buildMultiSelectCell( control, columnIndex )
+ : buildSingleSelectCell( control, columnIndex ) );
+ }
+ return $cells;
+ }
+
+ /** build a row of controls for the peek */
+ function buildControlRow( cellCount, control, includePrompts ){
+ var $controlRow = $( '<tr/>' ).attr( 'id', control.id ).addClass( ROW_CLASS );
+ if( includePrompts ){
+ var $promptCell = $( '<td/>' ).addClass( PROMPT_CLASS ).text( control.label + ':' );
+ $controlRow.append( $promptCell );
+ }
+ $controlRow.append( buildControlCells( cellCount, control ) );
+ return $controlRow;
+ }
+
+ // ........................................................................
+ /** add to the peek, using options for configuration, return the peek */
+ function peekControl( options ){
+ options = jQuery.extend( true, {}, defaults, options );
+
+ var $peek = $( this ).addClass( PEEKCONTROL_CLASS ),
+ $peektable = $peek.find( 'table' ),
+ // get the size of the tables - width and height, number of comment rows
+ columnCount = $peektable.find( 'th' ).size(),
+ rowCount = $peektable.find( 'tr' ).size(),
+ // get the rows containing text starting with the comment char (also make them grey)
+ $commentRows = $peektable.find( 'td[colspan]' ).map( function( e, i ){
+ var $this = $( this );
+ if( $this.text() && $this.text().match( new RegExp( '^' + options.commentChar ) ) ){
+ return $( this ).css( 'color', 'grey' ).parent().get(0);
+ }
+ return null;
+ });
+
+ // should comment rows in the peek be hidden?
+ if( options.hideCommentRows ){
+ $commentRows.hide();
+ rowCount -= $commentRows.size();
+ }
+ //console.debug( 'rowCount:', rowCount, 'columnCount:', columnCount, '$commentRows:', $commentRows );
+
+ // should a first column of control prompts be added?
+ if( options.includePrompts ){
+ var $topLeft = $( '<th/>' ).addClass( 'top-left' ).text( options.topLeftContent )
+ .attr( 'rowspan', rowCount );
+ $peektable.find( 'tr' ).first().prepend( $topLeft );
+ }
+
+ // save either the options column name or the parsed text of each column header in html5 data attr and text
+ var $headers = $peektable.find( 'th:not(.top-left)' ).each( function( i, e ){
+ var $this = $( this ),
+ // can be '1.name' or '1'
+ text = $this.text().replace( /^\d+\.*/, '' ),
+ name = options.columnNames[ i ] || text;
+ $this.attr( 'data-' + COLUMN_NAME_DATA_KEY, name )
+ .text( ( i + 1 ) + (( name )?( '.' + name ):( '' )) );
+ });
+
+ // allow renaming of columns when the header is clicked
+ if( options.renameColumns ){
+ $headers.addClass( RENAMABLE_HEADER_CLASS )
+ .click( function renameColumn(){
+ // prompt for new name
+ var $this = $( this ),
+ index = $this.index() + ( options.includePrompts? 0: 1 ),
+ prevName = $this.data( COLUMN_NAME_DATA_KEY ),
+ newColumnName = prompt( 'New column name:', prevName );
+ if( newColumnName !== null && newColumnName !== prevName ){
+ // set the new text and data
+ $this.text( index + ( newColumnName?( '.' + newColumnName ):'' ) )
+ .data( COLUMN_NAME_DATA_KEY, newColumnName )
+ .attr( 'data-', COLUMN_NAME_DATA_KEY, newColumnName );
+ // fire event for new column names
+ var columnNames = jQuery.makeArray(
+ $this.parent().children( 'th:not(.top-left)' ).map( function(){
+ return $( this ).data( COLUMN_NAME_DATA_KEY );
+ }));
+ $this.parents( '.peek' ).trigger( RENAME_EVENT, columnNames );
+ }
+ });
+ }
+
+ // build a row for each control
+ options.controls.forEach( function( control, i ){
+ validateControl( control );
+ var $controlRow = buildControlRow( columnCount, control, options.includePrompts );
+ $peektable.find( 'tbody' ).append( $controlRow );
+ });
+ return this;
+ }
+
+ // ........................................................................
+ // as jq plugin
+ jQuery.fn.extend({
+ peekControl : function $peekControl( options ){
+ return this.map( function(){
+ return peekControl.call( this, options );
+ });
+ }
+ });
+}());
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b static/scripts/packed/mvc/ui.js
--- a/static/scripts/packed/mvc/ui.js
+++ b/static/scripts/packed/mvc/ui.js
@@ -1,1 +1,1 @@
-var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,is_menu_button:true,id:null,href:null,target:null,enabled:true,visible:true,tooltip_config:{}}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=this.template(this.model.toJSON());a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(_.isFunction(this.model.get("on_click"))){this.model.get("on_click")(a);return false}return true},template:function(b){var a='title="'+b.title+'" class="icon-button';if(b.is_menu_button){a+=" menu-button"}a+=" "+b.icon_class;if(!b.enabled){a+="_disabled"}a+='"';if(b.id){a+=' id="'+b.id+'"'}a+=' href="'+b.href+'"';if(b.target){a+=' target="'+b.target+'"'}if(!b.visible){a+=' style="display: none;"'}if(b.enabled){a="<a "+a+"/>"}else{a="<span "+a+"/>"}return $(a)}});var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var PopupMenu=Backbone.View.extend({initialize:function(b,a){this.$button=b;if(!this.$button.size()){this.$button=$("<div/>")}this.options=a||[];var c=this;this.$button.click(function(d){$(".popmenu-wrapper").remove();c._renderAndShow(d);return false})},_renderAndShow:function(a){this.render();this.$el.appendTo("body").css(this._getShownPosition(a)).show();this._setUpCloseBehavior()},render:function(){this.$el.addClass("popmenu-wrapper").hide().css({position:"absolute"}).html(this.template(this.$button.attr("id"),this.options));if(this.options.length){var a=this;this.$el.find("li").each(function(c,b){var d=a.options[c];if(d.func){$(this).children("a.popupmenu-option").click(function(e){d.func.call(a,e,d)})}})}return this},template:function(b,a){return['<ul id="',b,'-menu" class="dropdown-menu">',this._templateOptions(a),"</ul>"].join("")},_templateOptions:function(a){if(!a.length){return"<li>(no options)</li>"}return _.map(a,function(d){if(d.divider){return'<li class="divider"></li>'}else{if(d.header){return['<li class="head"><a href="javascript:void(0);">',d.html,"</a></li>"].join("")}}var c=d.href||"javascript:void(0);",e=(d.target)?(' target="'+d.target+'"'):(""),b=(d.checked)?('<span class="fa fa-check"></span>'):("");return['<li><a class="popupmenu-option" href="',c,'"',e,">",b,d.html,"</a></li>"].join("")}).join("")},_getShownPosition:function(b){var c=this.$el.width();var a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_setUpCloseBehavior:function(){var c=this;function a(e){$(document).off("click.close_popup");if(window.parent!==window){try{$(window.parent.document).off("click.close_popup")}catch(d){}}else{try{$("iframe#galaxy_main").contents().off("click.close_popup")}catch(d){}}c.remove()}$("html").one("click.close_popup",a);if(window.parent!==window){try{$(window.parent.document).find("html").one("click.close_popup",a)}catch(b){}}else{try{$("iframe#galaxy_main").contents().one("click.close_popup",a)}catch(b){}}},addItem:function(b,a){a=(a>=0)?a:this.options.length;this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if(_.has(this.options[a],"html")&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.create=function _create(b,a){return new PopupMenu(b,a)};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(d.attr("href")){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};var faIconButton=function(a){a=a||{};a.tooltipConfig=a.tooltipConfig||{placement:"bottom"};a.classes=["icon-btn"].concat(a.classes||[]);if(a.disabled){a.classes.push("disabled")}var b=['<a class="',a.classes.join(" "),'"',((a.title)?(' title="'+a.title+'"'):("")),((!a.disabled&&a.target)?(' target="'+a.target+'"'):("")),' href="',((!a.disabled&&a.href)?(a.href):("javascript:void(0);")),'">','<span class="fa ',a.faIcon,'"></span>',"</a>"].join("");var c=$(b).tooltip(a.tooltipConfig);if(_.isFunction(a.onclick)){c.click(a.onclick)}return c};function LoadingIndicator(a,c){var b=this;c=jQuery.extend({cover:false},c||{});function d(){var e=['<div class="loading-indicator">','<div class="loading-indicator-text">','<span class="fa fa-spinner fa-spin fa-lg"></span>','<span class="loading-indicator-message">loading...</span>',"</div>","</div>"].join("\n");var g=$(e).hide().css(c.css||{position:"fixed"}),f=g.children(".loading-indicator-text");if(c.cover){g.css({"z-index":2,top:a.css("top"),bottom:a.css("bottom"),left:a.css("left"),right:a.css("right"),opacity:0.5,"background-color":"white","text-align":"center"});f=g.children(".loading-indicator-text").css({"margin-top":"20px"})}else{f=g.children(".loading-indicator-text").css({margin:"12px 0px 0px 10px",opacity:"0.85",color:"grey"});f.children(".loading-indicator-message").css({margin:"0px 8px 0px 0px","font-style":"italic"})}return g}b.show=function(f,e,g){f=f||"loading...";e=e||"fast";b.$indicator=d().insertBefore(a);b.message(f);b.$indicator.fadeIn(e,g);return b};b.message=function(e){b.$indicator.find("i").text(e)};b.hide=function(e,f){e=e||"fast";if(b.$indicator&&b.$indicator.size()){b.$indicator.fadeOut(e,function(){b.$indicator.remove();if(f){f()}})}else{if(f){f()}}return b};return b}(function(){function a(j,p){var d=27,m=13,c=$(j),e=true,g={initialVal:"",name:"search",placeholder:"search",classes:"",onclear:function(){},onfirstsearch:null,onsearch:function(q){},minSearchLen:0,escWillClear:true,oninit:function(){}};function i(q){var r=$(this).parent().children("input");r.val("");r.trigger("clear:searchInput");p.onclear()}function o(r,q){$(this).trigger("search:searchInput",q);if(typeof p.onfirstsearch==="function"&&e){e=false;p.onfirstsearch(q)}else{p.onsearch(q)}}function f(){return['<input type="text" name="',p.name,'" placeholder="',p.placeholder,'" ','class="search-query ',p.classes,'" ',"/>"].join("")}function l(){return $(f()).focus(function(q){$(this).select()}).keyup(function(r){if(r.which===d&&p.escWillClear){i.call(this,r)}else{var q=$(this).val();if((r.which===m)||(p.minSearchLen&&q.length>=p.minSearchLen)){o.call(this,r,q)}else{if(!q.length){i.call(this,r)}}}}).val(p.initialVal)}function k(){return $(['<span class="search-clear fa fa-times-circle" ','title="',_l("clear search (esc)"),'"></span>'].join("")).tooltip({placement:"bottom"}).click(function(q){i.call(this,q)})}function n(){return $(['<span class="search-loading fa fa-spinner fa-spin" ','title="',_l("loading..."),'"></span>'].join("")).hide().tooltip({placement:"bottom"})}function h(){c.find(".search-loading").toggle();c.find(".search-clear").toggle()}if(jQuery.type(p)==="string"){if(p==="toggle-loading"){h()}return c}if(jQuery.type(p)==="object"){p=jQuery.extend(true,{},g,p)}return c.addClass("search-input").prepend([l(),k(),n()])}jQuery.fn.extend({searchInput:function b(c){return this.each(function(){return a(this,c)})}})}());(function(){function b(m,l){this.currModeIndex=0;return this.init(m,l)}b.prototype.DATA_KEY="mode-button";b.prototype.defaults={modes:[{mode:"default"}]};b.prototype.init=function f(m,l){l=l||{};this.$element=$(m);this.options=jQuery.extend(true,{},this.defaults,l);var o=this;this.$element.click(function n(p){o.callModeFn();o._incModeIndex();$(this).html(o.options.modes[o.currModeIndex].html)});this.currModeIndex=0;if(this.options.initialMode){this.currModeIndex=this._getModeIndex(this.options.initialMode)}return this};b.prototype._getModeIndex=function j(l){for(var m=0;m<this.options.modes.length;m+=1){if(this.options.modes[m].mode===l){return m}}throw new Error("mode not found: "+l)};b.prototype.getCurrMode=function a(){return this.options.modes[this.currModeIndex]};b.prototype.getMode=function g(l){if(!l){return this.getCurrMode()}return this.options.modes[(this._getModeIndex(l))]};b.prototype.hasMode=function k(l){return !!this.getMode(l)};b.prototype.currentMode=function e(){return this.options.modes[this.currModeIndex]};b.prototype.setMode=function c(m){var l=this.getMode(m);this.$element.html(l.html||null);return this};b.prototype._incModeIndex=function d(){this.currModeIndex+=1;if(this.currModeIndex>=this.options.modes.length){this.currModeIndex=0}return this};b.prototype.callModeFn=function h(l){var m=this.getMode(l).onclick;if(m&&jQuery.type(m==="function")){return m.call(this)}return undefined};jQuery.fn.extend({modeButton:function i(m){var l=jQuery.makeArray(arguments).slice(1);return this.map(function(){var p=$(this),o=p.data("mode-button");if(jQuery.type(m)==="object"){o=new b(p,m);p.data("mode-button",o)}else{if(o&&jQuery.type(m)==="string"){var n=o[m];if(jQuery.type(n)==="function"){return n.apply(o,l)}}else{if(o){return o}}}return this})}})}());function dropDownSelect(b,c){c=c||((!_.isEmpty(b))?(b[0]):(""));var a=$(['<div class="dropdown-select btn-group">','<button type="button" class="btn btn-default">','<span class="dropdown-select-selected">'+c+"</span>","</button>","</div>"].join("\n"));if(b&&b.length>1){a.find("button").addClass("dropdown-toggle").attr("data-toggle","dropdown").append(' <span class="caret"></span>');a.append(['<ul class="dropdown-menu" role="menu">',_.map(b,function(e){return['<li><a href="javascript:void(0)">',e,"</a></li>"].join("")}).join("\n"),"</ul>"].join("\n"))}function d(g){var h=$(this),f=h.parents(".dropdown-select"),e=h.text();f.find(".dropdown-select-selected").text(e);f.trigger("change.dropdown-select",e)}a.find("a").click(d);return a}(function(){function e(k,j){return this.init(k,j)}e.prototype.DATA_KEY="filter-control";e.prototype.init=function g(k,j){j=j||{filters:[]};this.$element=$(k).addClass("filter-control btn-group");this.options=jQuery.extend(true,{},this.defaults,j);this.currFilter=this.options.filters[0];return this.render()};e.prototype.render=function d(){this.$element.empty().append([this._renderKeySelect(),this._renderOpSelect(),this._renderValueInput()]);return this};e.prototype._renderKeySelect=function a(){var j=this;var k=this.options.filters.map(function(l){return l.key});this.$keySelect=dropDownSelect(k,this.currFilter.key).addClass("filter-control-key").on("change.dropdown-select",function(m,l){j.currFilter=_.findWhere(j.options.filters,{key:l});j.render()._triggerChange()});return this.$keySelect};e.prototype._renderOpSelect=function i(){var j=this,k=this.currFilter.ops;this.$opSelect=dropDownSelect(k,k[0]).addClass("filter-control-op").on("change.dropdown-select",function(m,l){j._triggerChange()});return this.$opSelect};e.prototype._renderValueInput=function c(){var j=this;if(this.currFilter.values){this.$valueSelect=dropDownSelect(this.currFilter.values,this.currFilter.values[0]).on("change.dropdown-select",function(l,k){j._triggerChange()})}else{this.$valueSelect=$("<input/>").addClass("form-control").on("change",function(k,l){j._triggerChange()})}this.$valueSelect.addClass("filter-control-value");return this.$valueSelect};e.prototype.val=function b(){var k=this.$element.find(".filter-control-key .dropdown-select-selected").text(),m=this.$element.find(".filter-control-op .dropdown-select-selected").text(),j=this.$element.find(".filter-control-value"),l=(j.hasClass("dropdown-select"))?(j.find(".dropdown-select-selected").text()):(j.val());return{key:k,op:m,value:l}};e.prototype._triggerChange=function h(){this.$element.trigger("change.filter-control",this.val())};jQuery.fn.extend({filterControl:function f(k){var j=jQuery.makeArray(arguments).slice(1);return this.map(function(){var n=$(this),m=n.data(e.prototype.DATA_KEY);if(jQuery.type(k)==="object"){m=new e(n,k);n.data(e.prototype.DATA_KEY,m)}if(m&&jQuery.type(k)==="string"){var l=m[k];if(jQuery.type(l)==="function"){return l.apply(m,j)}}return this})}})}());(function(){function i(o,n){this.numPages=null;this.currPage=0;return this.init(o,n)}i.prototype.DATA_KEY="pagination";i.prototype.defaults={startingPage:0,perPage:20,totalDataSize:null,currDataSize:null};i.prototype.init=function g(n,o){o=o||{};this.$element=n;this.options=jQuery.extend(true,{},this.defaults,o);this.currPage=this.options.startingPage;if(this.options.totalDataSize!==null){this.numPages=Math.ceil(this.options.totalDataSize/this.options.perPage);if(this.currPage>=this.numPages){this.currPage=this.numPages-1}}this.$element.data(i.prototype.DATA_KEY,this);this._render();return this};function m(n){return $(['<li><a href="javascript:void(0);">',n,"</a></li>"].join(""))}i.prototype._render=function e(){if(this.options.totalDataSize===0){return this}if(this.numPages===1){return this}if(this.numPages>0){this._renderPages();this._scrollToActivePage()}else{this._renderPrevNext()}return this};i.prototype._renderPrevNext=function b(){var o=this,p=m("Prev"),n=m("Next"),q=$("<ul/>").addClass("pagination pagination-prev-next");if(this.currPage===0){p.addClass("disabled")}else{p.click(function(){o.prevPage()})}if((this.numPages&&this.currPage===(this.numPages-1))||(this.options.currDataSize&&this.options.currDataSize<this.options.perPage)){n.addClass("disabled")}else{n.click(function(){o.nextPage()})}this.$element.html(q.append([p,n]));return this.$element};i.prototype._renderPages=function a(){var n=this,q=$("<div>").addClass("pagination-scroll-container"),s=$("<ul/>").addClass("pagination pagination-page-list"),r=function(t){n.goToPage($(this).data("page"))};for(var o=0;o<this.numPages;o+=1){var p=m(o+1).attr("data-page",o).click(r);if(o===this.currPage){p.addClass("active")}s.append(p)}return this.$element.html(q.html(s))};i.prototype._scrollToActivePage=function l(){var p=this.$element.find(".pagination-scroll-container");if(!p.size()){return this}var o=this.$element.find("li.active"),n=p.width()/2;p.scrollLeft(p.scrollLeft()+o.position().left-n);return this};i.prototype.goToPage=function j(n){if(n<=0){n=0}if(this.numPages&&n>=this.numPages){n=this.numPages-1}if(n===this.currPage){return this}this.currPage=n;this.$element.trigger("pagination.page-change",this.currPage);this._render();return this};i.prototype.prevPage=function c(){return this.goToPage(this.currPage-1)};i.prototype.nextPage=function h(){return this.goToPage(this.currPage+1)};i.prototype.page=function f(){return this.currPage};i.create=function k(n,o){return new i(n,o)};jQuery.fn.extend({pagination:function d(o){var n=jQuery.makeArray(arguments).slice(1);if(jQuery.type(o)==="object"){return this.map(function(){i.create($(this),o);return this})}var q=$(this[0]),r=q.data(i.prototype.DATA_KEY);if(r){if(jQuery.type(o)==="string"){var p=r[o];if(jQuery.type(p)==="function"){return p.apply(r,n)}}else{return r}}return undefined}})}());
\ No newline at end of file
+var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,is_menu_button:true,id:null,href:null,target:null,enabled:true,visible:true,tooltip_config:{}}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=this.template(this.model.toJSON());a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(_.isFunction(this.model.get("on_click"))){this.model.get("on_click")(a);return false}return true},template:function(b){var a='title="'+b.title+'" class="icon-button';if(b.is_menu_button){a+=" menu-button"}a+=" "+b.icon_class;if(!b.enabled){a+="_disabled"}a+='"';if(b.id){a+=' id="'+b.id+'"'}a+=' href="'+b.href+'"';if(b.target){a+=' target="'+b.target+'"'}if(!b.visible){a+=' style="display: none;"'}if(b.enabled){a="<a "+a+"/>"}else{a="<span "+a+"/>"}return $(a)}});var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var PopupMenu=Backbone.View.extend({initialize:function(b,a){this.$button=b;if(!this.$button.size()){this.$button=$("<div/>")}this.options=a||[];var c=this;this.$button.click(function(d){$(".popmenu-wrapper").remove();c._renderAndShow(d);return false})},_renderAndShow:function(a){this.render();this.$el.appendTo("body").css(this._getShownPosition(a)).show();this._setUpCloseBehavior()},render:function(){this.$el.addClass("popmenu-wrapper").hide().css({position:"absolute"}).html(this.template(this.$button.attr("id"),this.options));if(this.options.length){var a=this;this.$el.find("li").each(function(c,b){var d=a.options[c];if(d.func){$(this).children("a.popupmenu-option").click(function(e){d.func.call(a,e,d)})}})}return this},template:function(b,a){return['<ul id="',b,'-menu" class="dropdown-menu">',this._templateOptions(a),"</ul>"].join("")},_templateOptions:function(a){if(!a.length){return"<li>(no options)</li>"}return _.map(a,function(d){if(d.divider){return'<li class="divider"></li>'}else{if(d.header){return['<li class="head"><a href="javascript:void(0);">',d.html,"</a></li>"].join("")}}var c=d.href||"javascript:void(0);",e=(d.target)?(' target="'+d.target+'"'):(""),b=(d.checked)?('<span class="fa fa-check"></span>'):("");return['<li><a class="popupmenu-option" href="',c,'"',e,">",b,d.html,"</a></li>"].join("")}).join("")},_getShownPosition:function(b){var c=this.$el.width();var a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_setUpCloseBehavior:function(){var c=this;function a(e){$(document).off("click.close_popup");if(window.parent!==window){try{$(window.parent.document).off("click.close_popup")}catch(d){}}else{try{$("iframe#galaxy_main").contents().off("click.close_popup")}catch(d){}}c.remove()}$("html").one("click.close_popup",a);if(window.parent!==window){try{$(window.parent.document).find("html").one("click.close_popup",a)}catch(b){}}else{try{$("iframe#galaxy_main").contents().one("click.close_popup",a)}catch(b){}}},addItem:function(b,a){a=(a>=0)?a:this.options.length;this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if(_.has(this.options[a],"html")&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.create=function _create(b,a){return new PopupMenu(b,a)};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(d.attr("href")){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};var faIconButton=function(a){a=a||{};a.tooltipConfig=a.tooltipConfig||{placement:"bottom"};a.classes=["icon-btn"].concat(a.classes||[]);if(a.disabled){a.classes.push("disabled")}var b=['<a class="',a.classes.join(" "),'"',((a.title)?(' title="'+a.title+'"'):("")),((!a.disabled&&a.target)?(' target="'+a.target+'"'):("")),' href="',((!a.disabled&&a.href)?(a.href):("javascript:void(0);")),'">','<span class="fa ',a.faIcon,'"></span>',"</a>"].join("");var c=$(b).tooltip(a.tooltipConfig);if(_.isFunction(a.onclick)){c.click(a.onclick)}return c};function LoadingIndicator(a,c){var b=this;c=jQuery.extend({cover:false},c||{});function d(){var e=['<div class="loading-indicator">','<div class="loading-indicator-text">','<span class="fa fa-spinner fa-spin fa-lg"></span>','<span class="loading-indicator-message">loading...</span>',"</div>","</div>"].join("\n");var g=$(e).hide().css(c.css||{position:"fixed"}),f=g.children(".loading-indicator-text");if(c.cover){g.css({"z-index":2,top:a.css("top"),bottom:a.css("bottom"),left:a.css("left"),right:a.css("right"),opacity:0.5,"background-color":"white","text-align":"center"});f=g.children(".loading-indicator-text").css({"margin-top":"20px"})}else{f=g.children(".loading-indicator-text").css({margin:"12px 0px 0px 10px",opacity:"0.85",color:"grey"});f.children(".loading-indicator-message").css({margin:"0px 8px 0px 0px","font-style":"italic"})}return g}b.show=function(f,e,g){f=f||"loading...";e=e||"fast";b.$indicator=d().insertBefore(a);b.message(f);b.$indicator.fadeIn(e,g);return b};b.message=function(e){b.$indicator.find("i").text(e)};b.hide=function(e,f){e=e||"fast";if(b.$indicator&&b.$indicator.size()){b.$indicator.fadeOut(e,function(){b.$indicator.remove();if(f){f()}})}else{if(f){f()}}return b};return b}(function(){function a(j,p){var d=27,m=13,c=$(j),e=true,g={initialVal:"",name:"search",placeholder:"search",classes:"",onclear:function(){},onfirstsearch:null,onsearch:function(q){},minSearchLen:0,escWillClear:true,oninit:function(){}};function i(q){var r=$(this).parent().children("input");r.val("");r.trigger("clear:searchInput");p.onclear()}function o(r,q){$(this).trigger("search:searchInput",q);if(typeof p.onfirstsearch==="function"&&e){e=false;p.onfirstsearch(q)}else{p.onsearch(q)}}function f(){return['<input type="text" name="',p.name,'" placeholder="',p.placeholder,'" ','class="search-query ',p.classes,'" ',"/>"].join("")}function l(){return $(f()).focus(function(q){$(this).select()}).keyup(function(r){if(r.which===d&&p.escWillClear){i.call(this,r)}else{var q=$(this).val();if((r.which===m)||(p.minSearchLen&&q.length>=p.minSearchLen)){o.call(this,r,q)}else{if(!q.length){i.call(this,r)}}}}).val(p.initialVal)}function k(){return $(['<span class="search-clear fa fa-times-circle" ','title="',_l("clear search (esc)"),'"></span>'].join("")).tooltip({placement:"bottom"}).click(function(q){i.call(this,q)})}function n(){return $(['<span class="search-loading fa fa-spinner fa-spin" ','title="',_l("loading..."),'"></span>'].join("")).hide().tooltip({placement:"bottom"})}function h(){c.find(".search-loading").toggle();c.find(".search-clear").toggle()}if(jQuery.type(p)==="string"){if(p==="toggle-loading"){h()}return c}if(jQuery.type(p)==="object"){p=jQuery.extend(true,{},g,p)}return c.addClass("search-input").prepend([l(),k(),n()])}jQuery.fn.extend({searchInput:function b(c){return this.each(function(){return a(this,c)})}})}());(function(){function b(m,l){this.currModeIndex=0;return this.init(m,l)}b.prototype.DATA_KEY="mode-button";b.prototype.defaults={modes:[{mode:"default"}]};b.prototype.init=function f(m,l){l=l||{};this.$element=$(m);this.options=jQuery.extend(true,{},this.defaults,l);var o=this;this.$element.click(function n(p){o.callModeFn();o._incModeIndex();$(this).html(o.options.modes[o.currModeIndex].html)});this.currModeIndex=0;if(this.options.initialMode){this.currModeIndex=this._getModeIndex(this.options.initialMode)}return this};b.prototype._getModeIndex=function j(l){for(var m=0;m<this.options.modes.length;m+=1){if(this.options.modes[m].mode===l){return m}}throw new Error("mode not found: "+l)};b.prototype.getCurrMode=function a(){return this.options.modes[this.currModeIndex]};b.prototype.getMode=function g(l){if(!l){return this.getCurrMode()}return this.options.modes[(this._getModeIndex(l))]};b.prototype.hasMode=function k(l){return !!this.getMode(l)};b.prototype.currentMode=function e(){return this.options.modes[this.currModeIndex]};b.prototype.setMode=function c(m){var l=this.getMode(m);this.$element.html(l.html||null);return this};b.prototype._incModeIndex=function d(){this.currModeIndex+=1;if(this.currModeIndex>=this.options.modes.length){this.currModeIndex=0}return this};b.prototype.callModeFn=function h(l){var m=this.getMode(l).onclick;if(m&&jQuery.type(m==="function")){return m.call(this)}return undefined};jQuery.fn.extend({modeButton:function i(m){var l=jQuery.makeArray(arguments).slice(1);return this.map(function(){var p=$(this),o=p.data("mode-button");if(jQuery.type(m)==="object"){o=new b(p,m);p.data("mode-button",o)}else{if(o&&jQuery.type(m)==="string"){var n=o[m];if(jQuery.type(n)==="function"){return n.apply(o,l)}}else{if(o){return o}}}return this})}})}());function dropDownSelect(b,c){c=c||((!_.isEmpty(b))?(b[0]):(""));var a=$(['<div class="dropdown-select btn-group">','<button type="button" class="btn btn-default">','<span class="dropdown-select-selected">'+c+"</span>","</button>","</div>"].join("\n"));if(b&&b.length>1){a.find("button").addClass("dropdown-toggle").attr("data-toggle","dropdown").append(' <span class="caret"></span>');a.append(['<ul class="dropdown-menu" role="menu">',_.map(b,function(e){return['<li><a href="javascript:void(0)">',e,"</a></li>"].join("")}).join("\n"),"</ul>"].join("\n"))}function d(g){var h=$(this),f=h.parents(".dropdown-select"),e=h.text();f.find(".dropdown-select-selected").text(e);f.trigger("change.dropdown-select",e)}a.find("a").click(d);return a}(function(){function e(k,j){return this.init(k,j)}e.prototype.DATA_KEY="filter-control";e.prototype.init=function g(k,j){j=j||{filters:[]};this.$element=$(k).addClass("filter-control btn-group");this.options=jQuery.extend(true,{},this.defaults,j);this.currFilter=this.options.filters[0];return this.render()};e.prototype.render=function d(){this.$element.empty().append([this._renderKeySelect(),this._renderOpSelect(),this._renderValueInput()]);return this};e.prototype._renderKeySelect=function a(){var j=this;var k=this.options.filters.map(function(l){return l.key});this.$keySelect=dropDownSelect(k,this.currFilter.key).addClass("filter-control-key").on("change.dropdown-select",function(m,l){j.currFilter=_.findWhere(j.options.filters,{key:l});j.render()._triggerChange()});return this.$keySelect};e.prototype._renderOpSelect=function i(){var j=this,k=this.currFilter.ops;this.$opSelect=dropDownSelect(k,k[0]).addClass("filter-control-op").on("change.dropdown-select",function(m,l){j._triggerChange()});return this.$opSelect};e.prototype._renderValueInput=function c(){var j=this;if(this.currFilter.values){this.$valueSelect=dropDownSelect(this.currFilter.values,this.currFilter.values[0]).on("change.dropdown-select",function(l,k){j._triggerChange()})}else{this.$valueSelect=$("<input/>").addClass("form-control").on("change",function(k,l){j._triggerChange()})}this.$valueSelect.addClass("filter-control-value");return this.$valueSelect};e.prototype.val=function b(){var k=this.$element.find(".filter-control-key .dropdown-select-selected").text(),m=this.$element.find(".filter-control-op .dropdown-select-selected").text(),j=this.$element.find(".filter-control-value"),l=(j.hasClass("dropdown-select"))?(j.find(".dropdown-select-selected").text()):(j.val());return{key:k,op:m,value:l}};e.prototype._triggerChange=function h(){this.$element.trigger("change.filter-control",this.val())};jQuery.fn.extend({filterControl:function f(k){var j=jQuery.makeArray(arguments).slice(1);return this.map(function(){var n=$(this),m=n.data(e.prototype.DATA_KEY);if(jQuery.type(k)==="object"){m=new e(n,k);n.data(e.prototype.DATA_KEY,m)}if(m&&jQuery.type(k)==="string"){var l=m[k];if(jQuery.type(l)==="function"){return l.apply(m,j)}}return this})}})}());(function(){function i(o,n){this.numPages=null;this.currPage=0;return this.init(o,n)}i.prototype.DATA_KEY="pagination";i.prototype.defaults={startingPage:0,perPage:20,totalDataSize:null,currDataSize:null};i.prototype.init=function g(n,o){o=o||{};this.$element=n;this.options=jQuery.extend(true,{},this.defaults,o);this.currPage=this.options.startingPage;if(this.options.totalDataSize!==null){this.numPages=Math.ceil(this.options.totalDataSize/this.options.perPage);if(this.currPage>=this.numPages){this.currPage=this.numPages-1}}this.$element.data(i.prototype.DATA_KEY,this);this._render();return this};function m(n){return $(['<li><a href="javascript:void(0);">',n,"</a></li>"].join(""))}i.prototype._render=function e(){if(this.options.totalDataSize===0){return this}if(this.numPages===1){return this}if(this.numPages>0){this._renderPages();this._scrollToActivePage()}else{this._renderPrevNext()}return this};i.prototype._renderPrevNext=function b(){var o=this,p=m("Prev"),n=m("Next"),q=$("<ul/>").addClass("pagination pagination-prev-next");if(this.currPage===0){p.addClass("disabled")}else{p.click(function(){o.prevPage()})}if((this.numPages&&this.currPage===(this.numPages-1))||(this.options.currDataSize&&this.options.currDataSize<this.options.perPage)){n.addClass("disabled")}else{n.click(function(){o.nextPage()})}this.$element.html(q.append([p,n]));return this.$element};i.prototype._renderPages=function a(){var n=this,q=$("<div>").addClass("pagination-scroll-container"),s=$("<ul/>").addClass("pagination pagination-page-list"),r=function(t){n.goToPage($(this).data("page"))};for(var o=0;o<this.numPages;o+=1){var p=m(o+1).attr("data-page",o).click(r);if(o===this.currPage){p.addClass("active")}s.append(p)}return this.$element.html(q.html(s))};i.prototype._scrollToActivePage=function l(){var p=this.$element.find(".pagination-scroll-container");if(!p.size()){return this}var o=this.$element.find("li.active"),n=p.width()/2;p.scrollLeft(p.scrollLeft()+o.position().left-n);return this};i.prototype.goToPage=function j(n){if(n<=0){n=0}if(this.numPages&&n>=this.numPages){n=this.numPages-1}if(n===this.currPage){return this}this.currPage=n;this.$element.trigger("pagination.page-change",this.currPage);this._render();return this};i.prototype.prevPage=function c(){return this.goToPage(this.currPage-1)};i.prototype.nextPage=function h(){return this.goToPage(this.currPage+1)};i.prototype.page=function f(){return this.currPage};i.create=function k(n,o){return new i(n,o)};jQuery.fn.extend({pagination:function d(o){var n=jQuery.makeArray(arguments).slice(1);if(jQuery.type(o)==="object"){return this.map(function(){i.create($(this),o);return this})}var q=$(this[0]),r=q.data(i.prototype.DATA_KEY);if(r){if(jQuery.type(o)==="string"){var p=r[o];if(jQuery.type(p)==="function"){return p.apply(r,n)}}else{return r}}return undefined}})}());(function(){var g={renameColumns:false,columnNames:[],commentChar:"#",hideCommentRows:false,includePrompts:true,topLeftContent:"Columns:"},s="peek-control.change",t="peek-control.rename",l="peek-control",v="control",f="control-prompt",c="selected",n="disabled",u="button",q="renamable-header",p="column-index",a="column-name";function i(w){if(w.disabled&&jQuery.type(w.disabled)!=="array"){throw new Error('"disabled" must be defined as an array of indeces: '+JSON.stringify(w))}if(w.multiselect&&w.selected&&jQuery.type(w.selected)!=="array"){throw new Error('Mulitselect rows need an array for "selected": '+JSON.stringify(w))}if(!w.label||!w.id){throw new Error("Peek controls need a label and id for each control row: "+JSON.stringify(w))}if(w.disabled&&w.disabled.indexOf(w.selected)!==-1){throw new Error("Selected column is in the list of disabled columns: "+JSON.stringify(w))}return w}function o(x,w){return $("<div/>").addClass(u).text(x.label)}function k(x,w){var y=$("<td/>").html(o(x,w)).attr("data-"+p,w);if(x.disabled&&x.disabled.indexOf(w)!==-1){y.addClass(n)}return y}function e(y,z,w){var x=y.children("."+u);if(y.hasClass(c)){x.html((z.selectedText!==undefined)?(z.selectedText):(z.label))}else{x.html((z.unselectedText!==undefined)?(z.unselectedText):(z.label))}}function h(z,x){var y=k(z,x);if(z.selected===x){y.addClass(c)}e(y,z,x);if(!y.hasClass(n)){y.click(function w(D){var E=$(this);if(!E.hasClass(c)){var A=E.parent().children("."+c).removeClass(c);A.each(function(){e($(this),z,x)});E.addClass(c);e(E,z,x);var C={},B=E.parent().attr("id"),F=E.data(p);C[B]=F;E.parents(".peek").trigger(s,C)}})}return y}function m(z,x){var y=k(z,x);if(z.selected&&z.selected.indexOf(x)!==-1){y.addClass(c)}e(y,z,x);if(!y.hasClass(n)){y.click(function w(D){var E=$(this);E.toggleClass(c);e(E,z,x);var C=E.parent().find("."+c).map(function(G,H){return $(H).data(p)});var B={},A=E.parent().attr("id"),F=jQuery.makeArray(C);B[A]=F;E.parents(".peek").trigger(s,B)})}return y}function j(y,z){var w=[];for(var x=0;x<y;x+=1){w.push(z.multiselect?m(z,x):h(z,x))}return w}function r(y,z,x){var A=$("<tr/>").attr("id",z.id).addClass(v);if(x){var w=$("<td/>").addClass(f).text(z.label+":");A.append(w)}A.append(j(y,z));return A}function b(E){E=jQuery.extend(true,{},g,E);var D=$(this).addClass(l),A=D.find("table"),z=A.find("th").size(),C=A.find("tr").size(),w=A.find("td[colspan]").map(function(H,F){var G=$(this);if(G.text()&&G.text().match(new RegExp("^"+E.commentChar))){return $(this).css("color","grey").parent().get(0)}return null});if(E.hideCommentRows){w.hide();C-=w.size()}if(E.includePrompts){var y=$("<th/>").addClass("top-left").text(E.topLeftContent).attr("rowspan",C);A.find("tr").first().prepend(y)}var B=A.find("th:not(.top-left)").each(function(G,I){var H=$(this),J=H.text().replace(/^\d+\.*/,""),F=E.columnNames[G]||J;H.attr("data-"+a,F).text((G+1)+((F)?("."+F):("")))});if(E.renameColumns){B.addClass(q).click(function x(){var G=$(this),F=G.index()+(E.includePrompts?0:1),I=G.data(a),H=prompt("New column name:",I);if(H!==null&&H!==I){G.text(F+(H?("."+H):"")).data(a,H).attr("data-",a,H);var J=jQuery.makeArray(G.parent().children("th:not(.top-left)").map(function(){return $(this).data(a)}));G.parents(".peek").trigger(t,J)}})}E.controls.forEach(function(G,F){i(G);var H=r(z,G,E.includePrompts);A.find("tbody").append(H)});return this}jQuery.fn.extend({peekControl:function d(w){return this.map(function(){return b.call(this,w)})}})}());
\ No newline at end of file
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1396,6 +1396,17 @@
.pagination-scroll-container .pagination-page-list>li:first-child>a,.pagination-scroll-container .pagination-page-list>li:first-child>span{border-radius:0px;border-left:0px}
.pagination-scroll-container .pagination-page-list>li:last-child>a,.pagination-scroll-container .pagination-page-list>li:last-child>span{border-radius:0px}
.pagination-scroll-container .pagination-page-list>li>a{float:none;position:static;border:1px solid #BFBFBF;border-width:0px 0px 0px 1px}
+.peek-control{border-radius:3px;border:1px solid #5f6990}
+.peek-control td,th{padding:4px 10px 4px 4px}
+.peek-control th:last-child{width:100%}
+.peek-control .top-left{width:10%;white-space:normal;vertical-align:top;text-align:right;font-family:"Lucida Grande",verdana,arial,helvetica,sans-serif;font-weight:normal}
+.peek-control .renamable-header:hover{background-color:black}
+.peek-control .control td.control-prompt{background-color:#5f6990;padding:0px 4px 0px 8px;text-align:right;color:white}
+.peek-control .control td{padding:1px;font-family:"Lucida Grande",verdana,arial,helvetica,sans-serif;color:grey}
+.peek-control .control td .button{min-width:28px;border:1px solid grey;border-radius:3px;padding:4px;color:grey}
+.peek-control .control td:hover .button{background-color:#EEE;border:1px solid black;cursor:pointer;color:black}
+.peek-control .control td.disabled .button,.peek-control .control td.disabled:hover .button{background-color:transparent;border:1px solid #CCC;cursor:not-allowed;color:#CCC}
+.peek-control .control td.selected .button{background-color:black;border:1px solid black;color:white}
div.metadataForm{border:solid #aaaaaa 1px}
div.metadataFormTitle{font-weight:bold;padding:5px;padding-left:10px;padding-right:10px;background:#cccccc;background-repeat:repeat-x;background-position:top;border-bottom:solid #aaaaaa 1px}
div.metadataFormBody{background:#FFFFFF;padding:5px 0}
diff -r 3e7842687fd3bde8ab47007e91fcf705df1e66db -r 6353214a32ee96343f8a3e9e25e9e5b2f9517d9b static/style/src/less/base.less
--- a/static/style/src/less/base.less
+++ b/static/style/src/less/base.less
@@ -544,6 +544,76 @@
}
+// ---------------------------------------------------------------------------- peek-based column chooser
+.peek-control {
+ border-radius: 3px;
+ border: 1px solid rgb(95, 105, 144);
+}
+
+.peek-control td, th {
+ padding: 4px 10px 4px 4px;
+}
+
+.peek-control th:last-child {
+ width: 100%;
+}
+
+.peek-control .top-left {
+ width: 10%;
+ white-space: normal;
+ vertical-align: top;
+ text-align: right;
+ font-family: "Lucida Grande", verdana, arial, helvetica, sans-serif;
+ font-weight: normal;
+}
+
+.peek-control .renamable-header:hover {
+ background-color: black;
+}
+
+.peek-control .control td.control-prompt {
+ background-color: rgb(95, 105, 144);
+ padding: 0px 4px 0px 8px;
+ text-align: right;
+ color: white;
+}
+
+.peek-control .control td {
+ padding: 1px;
+ font-family: "Lucida Grande", verdana, arial, helvetica, sans-serif;
+ color: grey;
+}
+
+.peek-control .control td .button {
+ min-width: 28px;
+ border: 1px solid grey;
+ border-radius: 3px;
+ padding: 4px;
+ color: grey;
+}
+
+.peek-control .control td:hover .button {
+ background-color: #EEE;
+ border: 1px solid black;
+ cursor: pointer;
+ color: black;
+}
+
+.peek-control .control td.disabled .button,
+.peek-control .control td.disabled:hover .button {
+ background-color: transparent;
+ border: 1px solid #CCC;
+ cursor: not-allowed;
+ color: #CCC;
+}
+
+.peek-control .control td.selected .button {
+ background-color: black;
+ border: 1px solid black;
+ color: white;
+}
+
+
// ==== Tool form styles ====
div.metadataForm {
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: Config: Add ‘datatypes_disable_auto’ option to universe configuration
by commits-noreply@bitbucket.org 15 Feb '14
by commits-noreply@bitbucket.org 15 Feb '14
15 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3e7842687fd3/
Changeset: 3e7842687fd3
User: guerler
Date: 2014-02-15 08:06:57
Summary: Config: Add ‘datatypes_disable_auto’ option to universe configuration
Affected #: 8 files
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db static/scripts/mvc/ui/ui-select.js
--- a/static/scripts/mvc/ui/ui-select.js
+++ b/static/scripts/mvc/ui/ui-select.js
@@ -8,7 +8,8 @@
optionsDefault: {
css : '',
placeholder : 'No data available',
- data : []
+ data : [],
+ value : null
},
// initialize
@@ -54,17 +55,14 @@
// get current id/value
var after = this._getValue();
- if(after === undefined) {
- return null;
- } else {
- // fire onchange
- if ((after != before && this.options.onchange)) {
- this.options.onchange(after);
- }
+
+ // fire onchange
+ if ((after != before && this.options.onchange)) {
+ this.options.onchange(after);
+ }
- // return current value
- return after;
- }
+ // return current value
+ return after;
},
// label
@@ -133,28 +131,18 @@
// refresh
_refresh: function() {
-
- // link select data
- var select_data = this.select_data;
- if (!select_data || select_data.length == 0) {
- select_data = [];
- }
-
// selected
var selected = this._getValue();
// add select2 data
this.$el.select2({
- data : select_data,
+ data : this.select_data,
containerCssClass : this.options.css,
placeholder : this.options.placeholder
});
- // select
- var index = this._getIndex(selected);
- if (index != -1) {
- this._setValue(selected);
- }
+ // select previous value (if exists)
+ this._setValue(selected);
},
// get index
@@ -177,6 +165,12 @@
// set value
_setValue: function(new_value) {
+ var index = this._getIndex(new_value);
+ if (index == -1) {
+ if (this.select_data.length > 0) {
+ new_value = this.select_data[0].id;
+ }
+ }
this.$el.select2('val', new_value);
},
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -71,6 +71,9 @@
container: it.find('#genome'),
value: self.model.get('genome')
});
+
+ // initialize genome
+ this.model.set('genome', self.select_genome.value());
// select extension
this.select_extension = new Select.View({
@@ -83,6 +86,9 @@
value: self.model.get('extension')
});
+ // initialize extension
+ this.model.set('extension', self.select_extension.value());
+
//
// ui events
//
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db static/scripts/mvc/upload/upload-view.js
--- a/static/scripts/mvc/upload/upload-view.js
+++ b/static/scripts/mvc/upload/upload-view.js
@@ -42,15 +42,18 @@
upload_size: 0,
// extension types
- list_extensions :[{
- id : 'auto',
- text : 'Auto-detect',
- description : '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.'
- }],
+ list_extensions :[],
// genomes
list_genomes : [],
+ // datatype placeholder for auto-detection
+ auto: {
+ id : 'auto',
+ text : 'Auto-detect',
+ description : 'This system will try to detect the file type automatically. 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.'
+ },
+
// collection
collection : new UploadModel.Collection(),
@@ -75,7 +78,12 @@
initialize : function(options) {
// link this
var self = this;
-
+
+ // read in options
+ if (options) {
+ this.options = _.defaults(options, this.options);
+ }
+
// wait for galaxy history panel (workaround due to the use of iframes)
if (!Galaxy.currHistoryPanel || !Galaxy.currHistoryPanel.model) {
window.setTimeout(function() { self.initialize() }, 500)
@@ -122,12 +130,13 @@
// sort
self.list_extensions.sort(function(a, b) {
- if (a.id == 'auto')
- return -1;
- if (b.id == 'auto')
- return 1;
return a.id > b.id ? 1 : a.id < b.id ? -1 : 0;
});
+
+ // add auto field
+ if (!self.options.datatypes_disable_auto) {
+ self.list_extensions.unshift(self.auto);
+ }
});
// load genomes
@@ -146,11 +155,6 @@
});
});
- // read in options
- if (options) {
- this.options = _.defaults(options, this.options);
- }
-
// events
this.collection.on('remove', function(item) {
self._eventRemove(item);
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db static/scripts/packed/mvc/ui/ui-select.js
--- a/static/scripts/packed/mvc/ui/ui-select.js
+++ b/static/scripts/packed/mvc/ui/ui-select.js
@@ -1,1 +1,1 @@
-define(["utils/utils"],function(a){var b=Backbone.View.extend({optionsDefault:{css:"",placeholder:"No data available",data:[]},initialize:function(d){this.options=a.merge(d,this.optionsDefault);this.setElement(this._template(this.options));this.options.container.append(this.$el);this.select_data=this.options.data;this._refresh();if(this.options.value){this._setValue(this.options.value)}var c=this;if(this.options.onchange){this.$el.on("change",function(){c.options.onchange(c.value())})}},value:function(c){var d=this._getValue();if(c!==undefined){this._setValue(c)}var e=this._getValue();if(e===undefined){return null}else{if((e!=d&&this.options.onchange)){this.options.onchange(e)}return e}},text:function(){return this.$el.select2("data").text},disabled:function(){return !this.$el.select2("enable")},enable:function(){this.$el.select2("enable",true)},disable:function(){this.$el.select2("enable",false)},add:function(c){this.select_data.push({id:c.id,text:c.text});this._refresh()},del:function(d){var c=this._getIndex(d);if(c!=-1){this.select_data.splice(c,1);this._refresh()}},remove:function(){this.$el.select2("destroy")},update:function(c){this.select_data=[];for(var d in c.data){this.select_data.push(c.data[d])}this._refresh()},_refresh:function(){var e=this.select_data;if(!e||e.length==0){e=[]}var d=this._getValue();this.$el.select2({data:e,containerCssClass:this.options.css,placeholder:this.options.placeholder});var c=this._getIndex(d);if(c!=-1){this._setValue(d)}},_getIndex:function(d){for(var c in this.select_data){if(this.select_data[c].id==d){return c}}return -1},_getValue:function(){return this.$el.select2("val")},_setValue:function(c){this.$el.select2("val",c)},_template:function(c){return'<input type="hidden"/>'}});return{View:b}});
\ No newline at end of file
+define(["utils/utils"],function(a){var b=Backbone.View.extend({optionsDefault:{css:"",placeholder:"No data available",data:[],value:null},initialize:function(d){this.options=a.merge(d,this.optionsDefault);this.setElement(this._template(this.options));this.options.container.append(this.$el);this.select_data=this.options.data;this._refresh();if(this.options.value){this._setValue(this.options.value)}var c=this;if(this.options.onchange){this.$el.on("change",function(){c.options.onchange(c.value())})}},value:function(c){var d=this._getValue();if(c!==undefined){this._setValue(c)}var e=this._getValue();if((e!=d&&this.options.onchange)){this.options.onchange(e)}return e},text:function(){return this.$el.select2("data").text},disabled:function(){return !this.$el.select2("enable")},enable:function(){this.$el.select2("enable",true)},disable:function(){this.$el.select2("enable",false)},add:function(c){this.select_data.push({id:c.id,text:c.text});this._refresh()},del:function(d){var c=this._getIndex(d);if(c!=-1){this.select_data.splice(c,1);this._refresh()}},remove:function(){this.$el.select2("destroy")},update:function(c){this.select_data=[];for(var d in c.data){this.select_data.push(c.data[d])}this._refresh()},_refresh:function(){var c=this._getValue();this.$el.select2({data:this.select_data,containerCssClass:this.options.css,placeholder:this.options.placeholder});this._setValue(c)},_getIndex:function(d){for(var c in this.select_data){if(this.select_data[c].id==d){return c}}return -1},_getValue:function(){return this.$el.select2("val")},_setValue:function(d){var c=this._getIndex(d);if(c==-1){if(this.select_data.length>0){d=this.select_data[0].id}}this.$el.select2("val",d)},_template:function(c){return'<input type="hidden"/>'}});return{View:b}});
\ No newline at end of file
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db 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(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(i,g){this.app=i;var f=this;this.model=new b.Model(g);this.setElement(this._template(g));var h=this.$el;this.settings=new c.View({title:"Upload configuration",container:h.find("#settings"),placement:"bottom"});this.select_genome=new e.View({css:"genome",onchange:function(){f.model.set("genome",f.select_genome.value())},data:f.app.list_genomes,container:h.find("#genome"),value:f.model.get("genome")});this.select_extension=new e.View({css:"extension",onchange:function(){f.model.set("extension",f.select_extension.value())},data:f.app.list_extensions,container:h.find("#extension"),value:f.model.get("extension")});h.find("#symbol").on("click",function(){f._removeRow()});h.find("#extension-info").on("click",function(j){f._showExtensionInfo()}).on("mousedown",function(j){j.preventDefault()});h.find("#settings").on("click",function(j){f._showSettings()}).on("mousedown",function(j){j.preventDefault()});h.find("#text-content").on("keyup",function(j){f.model.set("url_paste",$(j.target).val());f.model.set("file_size",$(j.target).val().length)});h.find("#space_to_tabs").on("change",function(j){f.model.set("space_to_tabs",$(j.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshGenome:function(){var f=this.model.get("genome");this.select_genome.value(f)},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showExtensionInfo:function(){var f=$(this.el).find("#extension-info");var i=this.model.get("extension");var h=this.select_extension.text();var g=d.findPair(this.app.list_extensions,"id",i);if(!this.extension_popup){this.extension_popup=new c.View({placement:"bottom",container:f})}if(!this.extension_popup.visible){this.extension_popup.title(h);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(g));this.extension_popup.show()}else{this.extension_popup.hide()}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_templateDescription:function(g){if(g.description){var f=g.description;if(g.description_url){f+=' (<a href="'+g.description_url+'" target="_blank">read more</a>)'}return f}else{return"There is no description available for this file extension."}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div style="position: relative;"><div id="mode"></div><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><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><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>'}})});
\ No newline at end of file
+define(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(i,g){this.app=i;var f=this;this.model=new b.Model(g);this.setElement(this._template(g));var h=this.$el;this.settings=new c.View({title:"Upload configuration",container:h.find("#settings"),placement:"bottom"});this.select_genome=new e.View({css:"genome",onchange:function(){f.model.set("genome",f.select_genome.value())},data:f.app.list_genomes,container:h.find("#genome"),value:f.model.get("genome")});this.model.set("genome",f.select_genome.value());this.select_extension=new e.View({css:"extension",onchange:function(){f.model.set("extension",f.select_extension.value())},data:f.app.list_extensions,container:h.find("#extension"),value:f.model.get("extension")});this.model.set("extension",f.select_extension.value());h.find("#symbol").on("click",function(){f._removeRow()});h.find("#extension-info").on("click",function(j){f._showExtensionInfo()}).on("mousedown",function(j){j.preventDefault()});h.find("#settings").on("click",function(j){f._showSettings()}).on("mousedown",function(j){j.preventDefault()});h.find("#text-content").on("keyup",function(j){f.model.set("url_paste",$(j.target).val());f.model.set("file_size",$(j.target).val().length)});h.find("#space_to_tabs").on("change",function(j){f.model.set("space_to_tabs",$(j.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshGenome:function(){var f=this.model.get("genome");this.select_genome.value(f)},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showExtensionInfo:function(){var f=$(this.el).find("#extension-info");var i=this.model.get("extension");var h=this.select_extension.text();var g=d.findPair(this.app.list_extensions,"id",i);if(!this.extension_popup){this.extension_popup=new c.View({placement:"bottom",container:f})}if(!this.extension_popup.visible){this.extension_popup.title(h);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(g));this.extension_popup.show()}else{this.extension_popup.hide()}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_templateDescription:function(g){if(g.description){var f=g.description;if(g.description_url){f+=' (<a href="'+g.description_url+'" target="_blank">read more</a>)'}return f}else{return"There is no description available for this file extension."}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div style="position: relative;"><div id="mode"></div><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><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><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>'}})});
\ No newline at end of file
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db static/scripts/packed/mvc/upload/upload-view.js
--- a/static/scripts/packed/mvc/upload/upload-view.js
+++ b/static/scripts/packed/mvc/upload/upload-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.modal","utils/utils","mvc/upload/upload-button","mvc/upload/upload-model","mvc/upload/upload-row","mvc/upload/upload-ftp","mvc/ui/ui-popover","mvc/ui","utils/uploadbox"],function(a,f,e,c,b,g,d){return Backbone.View.extend({options:{nginx_upload_path:""},modal:null,ui_button:null,uploadbox:null,current_history:null,upload_size:0,list_extensions:[{id:"auto",text:"Auto-detect",description:"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."}],list_genomes:[],collection:new c.Collection(),ftp:null,counter:{announce:0,success:0,error:0,running:0,reset:function(){this.announce=this.success=this.error=this.running=0}},initialize:function(i){var h=this;if(!Galaxy.currHistoryPanel||!Galaxy.currHistoryPanel.model){window.setTimeout(function(){h.initialize()},500);return}if(!Galaxy.currUser.get("id")){return}this.ui_button=new e.Model({icon:"fa-upload",tooltip:"Download from URL or upload files from disk",label:"Load Data",onclick:function(j){if(j){h._eventShow(j)}},onunload:function(){if(h.counter.running>0){return"Several uploads are still processing."}}});$("#left .unified-panel-header-inner").append((new e.View(this.ui_button)).$el);var h=this;f.jsonFromUrl(galaxy_config.root+"api/datatypes?extension_only=False",function(j){for(key in j){h.list_extensions.push({id:j[key].extension,text:j[key].extension,description:j[key].description,description_url:j[key].description_url})}h.list_extensions.sort(function(l,k){if(l.id=="auto"){return -1}if(k.id=="auto"){return 1}return l.id>k.id?1:l.id<k.id?-1:0})});f.jsonFromUrl(galaxy_config.root+"api/genomes",function(j){for(key in j){h.list_genomes.push({id:j[key][1],text:j[key][0]})}h.list_genomes.sort(function(l,k){return l.id>k.id?1:l.id<k.id?-1:0})});if(i){this.options=_.defaults(i,this.options)}this.collection.on("remove",function(j){h._eventRemove(j)});this.collection.on("change:genome",function(k){var j=k.get("genome");h.collection.each(function(l){if(l.get("status")=="init"&&l.get("genome")=="?"){l.set("genome",j)}})})},_eventShow:function(j){j.preventDefault();if(!this.modal){var h=this;this.modal=new a.GalaxyModal({title:"Download data directly from web or upload files from your disk",body:this._template("upload-box","upload-info"),buttons:{"Choose local file":function(){h.uploadbox.select()},"Choose FTP file":function(){h._eventFtp()},"Create new file":function(){h._eventCreate()},Start:function(){h._eventStart()},Pause:function(){h._eventStop()},Reset:function(){h._eventReset()},Close:function(){h.modal.hide()},},height:"400",width:"900",closing_events:true});this.setElement("#upload-box");var h=this;this.uploadbox=this.$el.uploadbox({announce:function(k,l,m){h._eventAnnounce(k,l,m)},initialize:function(k,l,m){return h._eventInitialize(k,l,m)},progress:function(k,l,m){h._eventProgress(k,l,m)},success:function(k,l,m){h._eventSuccess(k,l,m)},error:function(k,l,m){h._eventError(k,l,m)},complete:function(){h._eventComplete()}});this._updateScreen();if(this.options.ftp_upload_dir&&this.options.ftp_upload_site){var i=this.modal.getButton("Choose FTP file");this.ftp=new d.View({title:"FTP files",container:i})}else{this.modal.hideButton("Choose FTP file")}}this.modal.show()},_eventRemove:function(i){var h=i.get("status");if(h=="success"){this.counter.success--}else{if(h=="error"){this.counter.error--}else{this.counter.announce--}}this._updateScreen();this.uploadbox.remove(i.id)},_eventAnnounce:function(h,i,k){this.counter.announce++;this._updateScreen();var j=new b(this,{id:h,file_name:i.name,file_size:i.size,file_mode:i.mode,file_path:i.path});this.collection.add(j.model);$(this.el).find("tbody:first").append(j.$el);j.render()},_eventInitialize:function(m,j,s){var k=this.collection.get(m);k.set("status","running");var o=k.get("file_name");var n=k.get("file_path");var h=k.get("file_mode");var p=k.get("extension");var r=k.get("genome");var q=k.get("url_paste");var l=k.get("space_to_tabs");var i=k.get("to_posix_lines");if(!q&&!(j.size>0)){return null}this.uploadbox.configure({url:this.options.nginx_upload_path});if(h=="local"){this.uploadbox.configure({paramname:"files_0|file_data"})}else{this.uploadbox.configure({paramname:null})}tool_input={};if(h=="new"){tool_input["files_0|url_paste"]=q}if(h=="ftp"){tool_input["files_0|ftp_files"]=n}tool_input.dbkey=r;tool_input.file_type=p;tool_input["files_0|type"]="upload_dataset";tool_input.space_to_tabs=l;tool_input.to_posix_lines=i;data={};data.history_id=this.current_history;data.tool_id="upload1";data.inputs=JSON.stringify(tool_input);return data},_eventProgress:function(i,j,h){var k=this.collection.get(i);k.set("percentage",h);this.ui_button.set("percentage",this._upload_percentage(h,j.size))},_eventSuccess:function(i,j,l){var k=this.collection.get(i);k.set("percentage",100);k.set("status","success");var h=k.get("file_size");this.ui_button.set("percentage",this._upload_percentage(100,h));this.upload_completed+=h*100;this.counter.announce--;this.counter.success++;this._updateScreen();Galaxy.currHistoryPanel.refreshHdas()},_eventError:function(h,i,k){var j=this.collection.get(h);j.set("percentage",100);j.set("status","error");j.set("info",k);this.ui_button.set("percentage",this._upload_percentage(100,i.size));this.ui_button.set("status","danger");this.upload_completed+=i.size*100;this.counter.announce--;this.counter.error++;this._updateScreen()},_eventComplete:function(){this.collection.each(function(h){if(h.get("status")=="queued"){h.set("status","init")}});this.counter.running=0;this._updateScreen()},_eventFtp:function(){if(!this.ftp.visible){this.ftp.empty();this.ftp.append((new g(this)).$el);this.ftp.show()}else{this.ftp.hide()}},_eventCreate:function(){this.uploadbox.add([{name:"New File",size:0,mode:"new"}])},_eventStart:function(){if(this.counter.announce==0||this.counter.running>0){return}var h=this;this.upload_size=0;this.upload_completed=0;this.collection.each(function(i){if(i.get("status")=="init"){i.set("status","queued");h.upload_size+=i.get("file_size")}});this.ui_button.set("percentage",0);this.ui_button.set("status","success");this.current_history=Galaxy.currHistoryPanel.model.get("id");this.counter.running=this.counter.announce;this._updateScreen();this.uploadbox.start()},_eventStop:function(){if(this.counter.running==0){return}this.ui_button.set("status","info");this.uploadbox.stop();$("#upload-info").html("Queue will pause after completing the current file...")},_eventReset:function(){if(this.counter.running==0){this.collection.reset();this.counter.reset();this._updateScreen();this.uploadbox.reset();this.ui_button.set("percentage",0)}},_updateScreen:function(){if(this.counter.announce==0){if(this.uploadbox.compatible()){message="You can Drag & Drop files into this box."}else{message="Unfortunately, your browser does not support multiple file uploads or drag&drop.<br>Some supported browsers are: Firefox 4+, Chrome 7+, IE 10+, Opera 12+ or Safari 6+."}}else{if(this.counter.running==0){message="You added "+this.counter.announce+" file(s) to the queue. Add more files or click 'Start' to proceed."}else{message="Please wait..."+this.counter.announce+" out of "+this.counter.running+" remaining."}}$("#upload-info").html(message);if(this.counter.running==0&&this.counter.announce+this.counter.success+this.counter.error>0){this.modal.enableButton("Reset")}else{this.modal.disableButton("Reset")}if(this.counter.running==0&&this.counter.announce>0){this.modal.enableButton("Start")}else{this.modal.disableButton("Start")}if(this.counter.running>0){this.modal.enableButton("Pause")}else{this.modal.disableButton("Pause")}if(this.counter.running==0){this.modal.enableButton("Choose local file");this.modal.enableButton("Choose FTP file");this.modal.enableButton("Create new file")}else{this.modal.disableButton("Choose local file");this.modal.disableButton("Choose FTP file");this.modal.disableButton("Create new file")}if(this.counter.announce+this.counter.success+this.counter.error>0){$(this.el).find("#upload-table").show()}else{$(this.el).find("#upload-table").hide()}},_upload_percentage:function(h,i){return(this.upload_completed+(h*i))/this.upload_size},_template:function(i,h){return'<div id="'+i+'" class="upload-box"><table id="upload-table" class="table table-striped" style="display: none;"><thead><tr><th>Name</th><th>Size</th><th>Type</th><th>Genome</th><th>Settings</th><th>Status</th><th></th></tr></thead><tbody></tbody></table></div><h6 id="'+h+'" class="upload-info"></h6>'}})});
\ No newline at end of file
+define(["galaxy.modal","utils/utils","mvc/upload/upload-button","mvc/upload/upload-model","mvc/upload/upload-row","mvc/upload/upload-ftp","mvc/ui/ui-popover","mvc/ui","utils/uploadbox"],function(a,f,e,c,b,g,d){return Backbone.View.extend({options:{nginx_upload_path:""},modal:null,ui_button:null,uploadbox:null,current_history:null,upload_size:0,list_extensions:[],list_genomes:[],auto:{id:"auto",text:"Auto-detect",description:"This system will try to detect the file type automatically. 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."},collection:new c.Collection(),ftp:null,counter:{announce:0,success:0,error:0,running:0,reset:function(){this.announce=this.success=this.error=this.running=0}},initialize:function(i){var h=this;if(i){this.options=_.defaults(i,this.options)}if(!Galaxy.currHistoryPanel||!Galaxy.currHistoryPanel.model){window.setTimeout(function(){h.initialize()},500);return}if(!Galaxy.currUser.get("id")){return}this.ui_button=new e.Model({icon:"fa-upload",tooltip:"Download from URL or upload files from disk",label:"Load Data",onclick:function(j){if(j){h._eventShow(j)}},onunload:function(){if(h.counter.running>0){return"Several uploads are still processing."}}});$("#left .unified-panel-header-inner").append((new e.View(this.ui_button)).$el);var h=this;f.jsonFromUrl(galaxy_config.root+"api/datatypes?extension_only=False",function(j){for(key in j){h.list_extensions.push({id:j[key].extension,text:j[key].extension,description:j[key].description,description_url:j[key].description_url})}h.list_extensions.sort(function(l,k){return l.id>k.id?1:l.id<k.id?-1:0});if(!h.options.datatypes_disable_auto){h.list_extensions.unshift(h.auto)}});f.jsonFromUrl(galaxy_config.root+"api/genomes",function(j){for(key in j){h.list_genomes.push({id:j[key][1],text:j[key][0]})}h.list_genomes.sort(function(l,k){return l.id>k.id?1:l.id<k.id?-1:0})});this.collection.on("remove",function(j){h._eventRemove(j)});this.collection.on("change:genome",function(k){var j=k.get("genome");h.collection.each(function(l){if(l.get("status")=="init"&&l.get("genome")=="?"){l.set("genome",j)}})})},_eventShow:function(j){j.preventDefault();if(!this.modal){var h=this;this.modal=new a.GalaxyModal({title:"Download data directly from web or upload files from your disk",body:this._template("upload-box","upload-info"),buttons:{"Choose local file":function(){h.uploadbox.select()},"Choose FTP file":function(){h._eventFtp()},"Create new file":function(){h._eventCreate()},Start:function(){h._eventStart()},Pause:function(){h._eventStop()},Reset:function(){h._eventReset()},Close:function(){h.modal.hide()},},height:"400",width:"900",closing_events:true});this.setElement("#upload-box");var h=this;this.uploadbox=this.$el.uploadbox({announce:function(k,l,m){h._eventAnnounce(k,l,m)},initialize:function(k,l,m){return h._eventInitialize(k,l,m)},progress:function(k,l,m){h._eventProgress(k,l,m)},success:function(k,l,m){h._eventSuccess(k,l,m)},error:function(k,l,m){h._eventError(k,l,m)},complete:function(){h._eventComplete()}});this._updateScreen();if(this.options.ftp_upload_dir&&this.options.ftp_upload_site){var i=this.modal.getButton("Choose FTP file");this.ftp=new d.View({title:"FTP files",container:i})}else{this.modal.hideButton("Choose FTP file")}}this.modal.show()},_eventRemove:function(i){var h=i.get("status");if(h=="success"){this.counter.success--}else{if(h=="error"){this.counter.error--}else{this.counter.announce--}}this._updateScreen();this.uploadbox.remove(i.id)},_eventAnnounce:function(h,i,k){this.counter.announce++;this._updateScreen();var j=new b(this,{id:h,file_name:i.name,file_size:i.size,file_mode:i.mode,file_path:i.path});this.collection.add(j.model);$(this.el).find("tbody:first").append(j.$el);j.render()},_eventInitialize:function(m,j,s){var k=this.collection.get(m);k.set("status","running");var o=k.get("file_name");var n=k.get("file_path");var h=k.get("file_mode");var p=k.get("extension");var r=k.get("genome");var q=k.get("url_paste");var l=k.get("space_to_tabs");var i=k.get("to_posix_lines");if(!q&&!(j.size>0)){return null}this.uploadbox.configure({url:this.options.nginx_upload_path});if(h=="local"){this.uploadbox.configure({paramname:"files_0|file_data"})}else{this.uploadbox.configure({paramname:null})}tool_input={};if(h=="new"){tool_input["files_0|url_paste"]=q}if(h=="ftp"){tool_input["files_0|ftp_files"]=n}tool_input.dbkey=r;tool_input.file_type=p;tool_input["files_0|type"]="upload_dataset";tool_input.space_to_tabs=l;tool_input.to_posix_lines=i;data={};data.history_id=this.current_history;data.tool_id="upload1";data.inputs=JSON.stringify(tool_input);return data},_eventProgress:function(i,j,h){var k=this.collection.get(i);k.set("percentage",h);this.ui_button.set("percentage",this._upload_percentage(h,j.size))},_eventSuccess:function(i,j,l){var k=this.collection.get(i);k.set("percentage",100);k.set("status","success");var h=k.get("file_size");this.ui_button.set("percentage",this._upload_percentage(100,h));this.upload_completed+=h*100;this.counter.announce--;this.counter.success++;this._updateScreen();Galaxy.currHistoryPanel.refreshHdas()},_eventError:function(h,i,k){var j=this.collection.get(h);j.set("percentage",100);j.set("status","error");j.set("info",k);this.ui_button.set("percentage",this._upload_percentage(100,i.size));this.ui_button.set("status","danger");this.upload_completed+=i.size*100;this.counter.announce--;this.counter.error++;this._updateScreen()},_eventComplete:function(){this.collection.each(function(h){if(h.get("status")=="queued"){h.set("status","init")}});this.counter.running=0;this._updateScreen()},_eventFtp:function(){if(!this.ftp.visible){this.ftp.empty();this.ftp.append((new g(this)).$el);this.ftp.show()}else{this.ftp.hide()}},_eventCreate:function(){this.uploadbox.add([{name:"New File",size:0,mode:"new"}])},_eventStart:function(){if(this.counter.announce==0||this.counter.running>0){return}var h=this;this.upload_size=0;this.upload_completed=0;this.collection.each(function(i){if(i.get("status")=="init"){i.set("status","queued");h.upload_size+=i.get("file_size")}});this.ui_button.set("percentage",0);this.ui_button.set("status","success");this.current_history=Galaxy.currHistoryPanel.model.get("id");this.counter.running=this.counter.announce;this._updateScreen();this.uploadbox.start()},_eventStop:function(){if(this.counter.running==0){return}this.ui_button.set("status","info");this.uploadbox.stop();$("#upload-info").html("Queue will pause after completing the current file...")},_eventReset:function(){if(this.counter.running==0){this.collection.reset();this.counter.reset();this._updateScreen();this.uploadbox.reset();this.ui_button.set("percentage",0)}},_updateScreen:function(){if(this.counter.announce==0){if(this.uploadbox.compatible()){message="You can Drag & Drop files into this box."}else{message="Unfortunately, your browser does not support multiple file uploads or drag&drop.<br>Some supported browsers are: Firefox 4+, Chrome 7+, IE 10+, Opera 12+ or Safari 6+."}}else{if(this.counter.running==0){message="You added "+this.counter.announce+" file(s) to the queue. Add more files or click 'Start' to proceed."}else{message="Please wait..."+this.counter.announce+" out of "+this.counter.running+" remaining."}}$("#upload-info").html(message);if(this.counter.running==0&&this.counter.announce+this.counter.success+this.counter.error>0){this.modal.enableButton("Reset")}else{this.modal.disableButton("Reset")}if(this.counter.running==0&&this.counter.announce>0){this.modal.enableButton("Start")}else{this.modal.disableButton("Start")}if(this.counter.running>0){this.modal.enableButton("Pause")}else{this.modal.disableButton("Pause")}if(this.counter.running==0){this.modal.enableButton("Choose local file");this.modal.enableButton("Choose FTP file");this.modal.enableButton("Create new file")}else{this.modal.disableButton("Choose local file");this.modal.disableButton("Choose FTP file");this.modal.disableButton("Create new file")}if(this.counter.announce+this.counter.success+this.counter.error>0){$(this.el).find("#upload-table").show()}else{$(this.el).find("#upload-table").hide()}},_upload_percentage:function(h,i){return(this.upload_completed+(h*i))/this.upload_size},_template:function(i,h){return'<div id="'+i+'" class="upload-box"><table id="upload-table" class="table table-striped" style="display: none;"><thead><tr><th>Name</th><th>Size</th><th>Type</th><th>Genome</th><th>Settings</th><th>Status</th><th></th></tr></thead><tbody></tbody></table></div><h6 id="'+h+'" class="upload-info"></h6>'}})});
\ No newline at end of file
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db templates/webapps/galaxy/galaxy.masthead.mako
--- a/templates/webapps/galaxy/galaxy.masthead.mako
+++ b/templates/webapps/galaxy/galaxy.masthead.mako
@@ -54,6 +54,7 @@
'active_view' : active_view,
'ftp_upload_dir' : app.config.get("ftp_upload_dir", None),
'ftp_upload_site' : app.config.get("ftp_upload_site", None),
+ 'datatypes_disable_auto' : app.config.get_bool("datatypes_disable_auto", False),
## user details
'user' : {
diff -r 72eec07ef71833f797c7e279a6c27c4e8a24535c -r 3e7842687fd3bde8ab47007e91fcf705df1e66db universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -174,6 +174,9 @@
# Galaxy.
#datatypes_config_file = datatypes_conf.xml
+# Disable the 'Auto-detect' option for file uploads
+#datatypes_disable_auto = True
+
# Visualizations config directory: where to look for individual visualization plugins.
# The path is relative to the Galaxy root dir. To use an absolute path begin the path
# with '/'.
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: Datatypes: Add datatype description to xml, Upload: Load description from xml
by commits-noreply@bitbucket.org 14 Feb '14
by commits-noreply@bitbucket.org 14 Feb '14
14 Feb '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/72eec07ef718/
Changeset: 72eec07ef718
User: guerler
Date: 2014-02-15 06:06:32
Summary: Datatypes: Add datatype description to xml, Upload: Load description from xml
Affected #: 12 files
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -1,13 +1,13 @@
<?xml version="1.0"?><datatypes><registration converters_path="lib/galaxy/datatypes/converters" display_path="display_applications">
- <datatype extension="ab1" type="galaxy.datatypes.binary:Ab1" mimetype="application/octet-stream" display_in_upload="true"/>
- <datatype extension="afg" type="galaxy.datatypes.assembly:Amos" display_in_upload="false"/>
+ <datatype extension="ab1" type="galaxy.datatypes.binary:Ab1" mimetype="application/octet-stream" display_in_upload="true" description="A binary sequence file in 'ab1' format with a '.ab1' file extension. You must manually select this 'File Format' when uploading the file." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Ab1"/>
+ <datatype extension="afg" type="galaxy.datatypes.assembly:Amos" display_in_upload="false" /><datatype extension="asn1" type="galaxy.datatypes.data:GenericAsn1" mimetype="text/plain" display_in_upload="true" /><datatype extension="asn1-binary" type="galaxy.datatypes.binary:GenericAsn1Binary" mimetype="application/octet-stream" display_in_upload="true" />
- <datatype extension="axt" type="galaxy.datatypes.sequence:Axt" display_in_upload="true"/>
+ <datatype extension="axt" type="galaxy.datatypes.sequence:Axt" display_in_upload="true" description="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." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Axt"/><datatype extension="fli" type="galaxy.datatypes.tabular:FeatureLocationIndex" display_in_upload="false"/>
- <datatype extension="bam" type="galaxy.datatypes.binary:Bam" mimetype="application/octet-stream" display_in_upload="true">
+ <datatype extension="bam" type="galaxy.datatypes.binary:Bam" mimetype="application/octet-stream" display_in_upload="true" description="A binary file compressed in the BGZF format with a '.bam' file extension." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#BAM"><converter file="bam_to_bai.xml" target_datatype="bai"/><converter file="bam_to_bigwig_converter.xml" target_datatype="bigwig"/><display file="ucsc/bam.xml" />
@@ -15,7 +15,7 @@
<display file="igv/bam.xml" /><display file="igb/bam.xml" /></datatype>
- <datatype extension="bed" type="galaxy.datatypes.interval:Bed" display_in_upload="true">
+ <datatype extension="bed" type="galaxy.datatypes.interval:Bed" display_in_upload="true" description="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." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Bed"><converter file="bed_to_gff_converter.xml" target_datatype="gff"/><converter file="bed_to_bgzip_converter.xml" target_datatype="bgzip"/><converter file="bed_to_tabix_converter.xml" target_datatype="tabix" depends_on="bgzip"/>
@@ -56,20 +56,20 @@
<datatype extension="csfasta" type="galaxy.datatypes.sequence:csFasta" display_in_upload="true"/><datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream" max_optional_metadata_filesize="1048576" /><datatype extension="data_manager_json" type="galaxy.datatypes.data:Text" mimetype="application/json" subclass="True" display_in_upload="False"/>
- <datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true">
+ <datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true" description="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." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Fasta"><converter file="fasta_to_tabular_converter.xml" target_datatype="tabular"/><converter file="fasta_to_bowtie_base_index_converter.xml" target_datatype="bowtie_base_index"/><converter file="fasta_to_bowtie_color_index_converter.xml" target_datatype="bowtie_color_index"/><converter file="fasta_to_2bit.xml" target_datatype="twobit"/><converter file="fasta_to_len.xml" target_datatype="len"/></datatype>
- <datatype extension="fastq" type="galaxy.datatypes.sequence:Fastq" display_in_upload="true">
+ <datatype extension="fastq" type="galaxy.datatypes.sequence:Fastq" display_in_upload="true" description="FASTQ format is a text-based format for storing both a biological sequence (usually nucleotide sequence) and its corresponding quality scores." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Fastq"><converter file="fastq_to_fqtoc.xml" target_datatype="fqtoc"/></datatype><datatype extension="fastqsanger" type="galaxy.datatypes.sequence:FastqSanger" display_in_upload="true"><converter file="fastq_to_fqtoc.xml" target_datatype="fqtoc"/></datatype>
- <datatype extension="fastqsolexa" type="galaxy.datatypes.sequence:FastqSolexa" display_in_upload="true">
+ <datatype extension="fastqsolexa" type="galaxy.datatypes.sequence:FastqSolexa" display_in_upload="true" description="FastqSolexa is the Illumina (Solexa) variant of the Fastq format, which stores sequences and quality scores in a single file." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#FastqSolexa"><converter file="fastq_to_fqtoc.xml" target_datatype="fqtoc"/></datatype><datatype extension="fastqcssanger" type="galaxy.datatypes.sequence:FastqCSSanger" display_in_upload="true">
@@ -84,7 +84,7 @@
<datatype extension="genetrack" type="galaxy.datatypes.tracks:GeneTrack"><!-- <display file="genetrack.xml" /> --></datatype>
- <datatype extension="gff" type="galaxy.datatypes.interval:Gff" display_in_upload="true">
+ <datatype extension="gff" type="galaxy.datatypes.interval:Gff" display_in_upload="true" description="GFF lines have nine required fields that must be tab-separated." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#GFF"><converter file="gff_to_bed_converter.xml" target_datatype="bed"/><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
@@ -92,7 +92,7 @@
<display file="ensembl/ensembl_gff.xml" inherit="True"/><!-- <display file="gbrowse/gbrowse_gff.xml" inherit="True" /> --></datatype>
- <datatype extension="gff3" type="galaxy.datatypes.interval:Gff3" display_in_upload="true"/>
+ <datatype extension="gff3" type="galaxy.datatypes.interval:Gff3" display_in_upload="true" description="The GFF3 format addresses the most common extensions to GFF, while preserving backward compatibility with previous formats." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#GFF3"/><datatype extension="gif" type="galaxy.datatypes.images:Gif" mimetype="image/gif"/><datatype extension="gmaj.zip" type="galaxy.datatypes.images:Gmaj" mimetype="application/zip"/><datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true">
@@ -102,7 +102,7 @@
<datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" /><datatype extension="html" type="galaxy.datatypes.images:Html" mimetype="text/html"/>
- <datatype extension="interval" type="galaxy.datatypes.interval:Interval" display_in_upload="true">
+ <datatype extension="interval" type="galaxy.datatypes.interval:Interval" display_in_upload="true" description="File must start with definition line in the following format (columns may be in any order)." ><converter file="interval_to_bed_converter.xml" target_datatype="bed"/><converter file="interval_to_bedstrict_converter.xml" target_datatype="bedstrict"/><converter file="interval_to_bed6_converter.xml" target_datatype="bed6"/>
@@ -139,8 +139,8 @@
<datatype extension="eps" type="galaxy.datatypes.images:Eps" mimetype="image/eps"/><datatype extension="rast" type="galaxy.datatypes.images:Rast" mimetype="image/rast"/><datatype extension="laj" type="galaxy.datatypes.images:Laj"/>
- <datatype extension="lav" type="galaxy.datatypes.sequence:Lav" display_in_upload="true"/>
- <datatype extension="maf" type="galaxy.datatypes.sequence:Maf" display_in_upload="true">
+ <datatype extension="lav" type="galaxy.datatypes.sequence:Lav" display_in_upload="true" description="Lav is the primary output format for BLASTZ. The first line of a .lav file begins with #:lav.." />
+ <datatype extension="maf" type="galaxy.datatypes.sequence:Maf" display_in_upload="true" description="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 '='." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#MAF"><converter file="maf_to_fasta_converter.xml" target_datatype="fasta"/><converter file="maf_to_interval_converter.xml" target_datatype="interval"/></datatype>
@@ -168,14 +168,14 @@
<converter file="sam_to_bam.xml" target_datatype="bam"/><converter file="sam_to_bigwig_converter.xml" target_datatype="bigwig"/></datatype>
- <datatype extension="scf" type="galaxy.datatypes.binary:Scf" mimetype="application/octet-stream" display_in_upload="true"/>
+ <datatype extension="scf" type="galaxy.datatypes.binary:Scf" mimetype="application/octet-stream" display_in_upload="true" description="A binary sequence file in 'scf' format with a '.scf' file extension. You must manually select this 'File Format' when uploading the file." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Scf"/><datatype extension="Sequences" type="galaxy.datatypes.assembly:Sequences" display_in_upload="false"/>
- <datatype extension="sff" type="galaxy.datatypes.binary:Sff" mimetype="application/octet-stream" display_in_upload="true"/>
+ <datatype extension="sff" type="galaxy.datatypes.binary:Sff" mimetype="application/octet-stream" display_in_upload="true" description="A binary file in 'Standard Flowgram Format' with a '.sff' file extension." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Sff"/><datatype extension="svg" type="galaxy.datatypes.images:Image" mimetype="image/svg+xml"/><datatype extension="taxonomy" type="galaxy.datatypes.tabular:Taxonomy" display_in_upload="true"/>
- <datatype extension="tabular" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true"/>
+ <datatype extension="tabular" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true" description="Any data in tab delimited format (tabular)." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Tabular_.28tab_delimited.29"/><datatype extension="twobit" type="galaxy.datatypes.binary:TwoBit" mimetype="application/octet-stream" display_in_upload="true"/>
- <datatype extension="txt" type="galaxy.datatypes.data:Text" display_in_upload="true"/>
+ <datatype extension="txt" type="galaxy.datatypes.data:Text" display_in_upload="true" description="Any text file." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Plain_text"/><datatype extension="linecount" type="galaxy.datatypes.data:LineCount" display_in_upload="false"/><datatype extension="memexml" type="galaxy.datatypes.xml:MEMEXml" mimetype="application/xml" display_in_upload="true"/><datatype extension="cisml" type="galaxy.datatypes.xml:CisML" mimetype="application/xml" display_in_upload="true"/>
@@ -191,7 +191,7 @@
</datatype><datatype extension="bcf" type="galaxy.datatypes.binary:Binary" subclass="True" display_in_upload="True"/><datatype extension="velvet" type="galaxy.datatypes.assembly:Velvet" display_in_upload="false"/>
- <datatype extension="wig" type="galaxy.datatypes.interval:Wiggle" display_in_upload="true">
+ <datatype extension="wig" type="galaxy.datatypes.interval:Wiggle" display_in_upload="true" description="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." description_url="https://wiki.galaxyproject.org/Learn/Datatypes#Wig"><converter file="wig_to_bigwig_converter.xml" target_datatype="bigwig"/><converter file="wiggle_to_simple_converter.xml" target_datatype="interval"/><!-- <display file="gbrowse/gbrowse_wig.xml" /> -->
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c lib/galaxy/webapps/galaxy/api/datatypes.py
--- a/lib/galaxy/webapps/galaxy/api/datatypes.py
+++ b/lib/galaxy/webapps/galaxy/api/datatypes.py
@@ -18,12 +18,25 @@
GET /api/datatypes
Return an object containing upload datatypes.
"""
+ extension_only = asbool( kwd.get( 'extension_only', True ) )
upload_only = asbool( kwd.get( 'upload_only', True ) )
try:
- if upload_only:
- return trans.app.datatypes_registry.upload_file_formats
+ if extension_only:
+ if upload_only:
+ return trans.app.datatypes_registry.upload_file_formats
+ else:
+ return [ ext for ext in trans.app.datatypes_registry.datatypes_by_extension ]
else:
- return [ ext for ext in trans.app.datatypes_registry.datatypes_by_extension ]
+ rval = []
+ for elem in trans.app.datatypes_registry.datatype_elems:
+ if not asbool(elem.get('display_in_upload')) and upload_only:
+ continue
+ keys = ['extension', 'description', 'description_url']
+ dictionary = {}
+ for key in keys:
+ dictionary[key] = elem.get(key)
+ rval.append(dictionary)
+ return rval
except Exception, exception:
log.error( 'could not get datatypes: %s', str( exception ), exc_info=True )
trans.response.status = 500
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/mvc/upload/upload-extensions.js
--- a/static/scripts/mvc/upload/upload-extensions.js
+++ /dev/null
@@ -1,110 +0,0 @@
-// 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 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -1,14 +1,12 @@
// dependencies
define(['utils/utils',
'mvc/upload/upload-model',
- 'mvc/upload/upload-extensions',
'mvc/upload/upload-settings',
'mvc/ui/ui-popover',
'mvc/ui/ui-select'],
function( Utils,
UploadModel,
- UploadExtensions,
UploadSettings,
Popover,
Select
@@ -317,11 +315,11 @@
var $el = $(this.el).find('#extension-info');
var extension = this.model.get('extension');
var title = this.select_extension.text();
+ var description = Utils.findPair(this.app.list_extensions, 'id', extension);
// create popup
if (!this.extension_popup) {
this.extension_popup = new Popover.View({
- content: UploadExtensions(extension),
placement: 'bottom',
container: $el
});
@@ -331,7 +329,7 @@
if (!this.extension_popup.visible) {
this.extension_popup.title(title);
this.extension_popup.empty();
- this.extension_popup.append(UploadExtensions(extension));
+ this.extension_popup.append(this._templateDescription(description));
this.extension_popup.show();
} else {
this.extension_popup.hide();
@@ -352,7 +350,20 @@
this.settings.hide();
}
},
-
+
+ // template
+ _templateDescription: function(options) {
+ if (options.description) {
+ var tmpl = options.description;
+ if (options.description_url) {
+ tmpl += ' (<a href="' + options.description_url + '" target="_blank">read more</a>)';
+ }
+ return tmpl;
+ } else {
+ return 'There is no description available for this file extension.';
+ }
+ },
+
// template
_template: function(options)
{
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/mvc/upload/upload-view.js
--- a/static/scripts/mvc/upload/upload-view.js
+++ b/static/scripts/mvc/upload/upload-view.js
@@ -42,7 +42,11 @@
upload_size: 0,
// extension types
- list_extensions :[{id: 'auto', text: 'Auto-detect'}],
+ list_extensions :[{
+ id : 'auto',
+ text : 'Auto-detect',
+ description : '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.'
+ }],
// genomes
list_genomes : [],
@@ -105,14 +109,25 @@
// load extension
var self = this;
- Utils.jsonFromUrl(galaxy_config.root + "api/datatypes?upload_only=True",
+ Utils.jsonFromUrl(galaxy_config.root + "api/datatypes?extension_only=False",
function(datatypes) {
for (key in datatypes) {
self.list_extensions.push({
- id : datatypes[key],
- text : datatypes[key]
+ id : datatypes[key].extension,
+ text : datatypes[key].extension,
+ description : datatypes[key].description,
+ description_url : datatypes[key].description_url
});
}
+
+ // sort
+ self.list_extensions.sort(function(a, b) {
+ if (a.id == 'auto')
+ return -1;
+ if (b.id == 'auto')
+ return 1;
+ return a.id > b.id ? 1 : a.id < b.id ? -1 : 0;
+ });
});
// load genomes
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/packed/mvc/upload/upload-extensions.js
--- a/static/scripts/packed/mvc/upload/upload-extensions.js
+++ /dev/null
@@ -1,1 +0,0 @@
-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 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c 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(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-extensions","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,f,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(j,h){this.app=j;var g=this;this.model=new b.Model(h);this.setElement(this._template(h));var i=this.$el;this.settings=new c.View({title:"Upload configuration",container:i.find("#settings"),placement:"bottom"});this.select_genome=new e.View({css:"genome",onchange:function(){g.model.set("genome",g.select_genome.value())},data:g.app.list_genomes,container:i.find("#genome"),value:g.model.get("genome")});this.select_extension=new e.View({css:"extension",onchange:function(){g.model.set("extension",g.select_extension.value())},data:g.app.list_extensions,container:i.find("#extension"),value:g.model.get("extension")});i.find("#symbol").on("click",function(){g._removeRow()});i.find("#extension-info").on("click",function(k){g._showExtensionInfo()}).on("mousedown",function(k){k.preventDefault()});i.find("#settings").on("click",function(k){g._showSettings()}).on("mousedown",function(k){k.preventDefault()});i.find("#text-content").on("keyup",function(k){g.model.set("url_paste",$(k.target).val());g.model.set("file_size",$(k.target).val().length)});i.find("#space_to_tabs").on("change",function(k){g.model.set("space_to_tabs",$(k.target).prop("checked"))});this.model.on("change:percentage",function(){g._refreshPercentage()});this.model.on("change:status",function(){g._refreshStatus()});this.model.on("change:info",function(){g._refreshInfo()});this.model.on("change:genome",function(){g._refreshGenome()});this.model.on("change:file_size",function(){g._refreshFileSize()});this.model.on("remove",function(){g.remove()});this.app.collection.on("reset",function(){g.remove()})},render:function(){var n=this.model.get("file_name");var h=this.model.get("file_size");var k=this.model.get("file_mode");var j=this.$el;j.find("#title").html(n);j.find("#size").html(d.bytesToString(h));j.find("#mode").removeClass().addClass("mode");if(k=="new"){var m=j.find("#text");var l=this.options.padding;var i=j.width()-2*l;var g=j.height()-l;m.css("width",i+"px");m.css("top",g+"px");j.height(g+m.height()+2*l);m.show();j.find("#mode").addClass("fa fa-pencil")}if(k=="local"){j.find("#mode").addClass("fa fa-laptop")}if(k=="ftp"){j.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshGenome:function(){var g=this.model.get("genome");this.select_genome.value(g)},_refreshInfo:function(){var g=this.model.get("info");if(g){this.$el.find("#info").html("<strong>Failed: </strong>"+g).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var g=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:g+"%"});if(g!=100){this.$el.find("#percentage").html(g+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var h=this.$el;var g=this.model.get("status");var j=this.status_classes[g];var i=this.$el.find("#symbol");i.removeClass();i.addClass(j);if(g=="init"){this.select_genome.enable();this.select_extension.enable();h.find("#text-content").attr("disabled",false);h.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();h.find("#text-content").attr("disabled",true);h.find("#space_to_tabs").attr("disabled",true)}if(g=="success"){h.addClass("success");h.find("#percentage").html("100%")}if(g=="error"){h.addClass("danger");h.find(".progress").remove()}},_refreshFileSize:function(){var g=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(g))},_removeRow:function(){var g=this.model.get("status");if(g=="init"||g=="success"||g=="error"){this.app.collection.remove(this.model)}},_showExtensionInfo:function(){var g=$(this.el).find("#extension-info");var i=this.model.get("extension");var h=this.select_extension.text();if(!this.extension_popup){this.extension_popup=new c.View({content:f(i),placement:"bottom",container:g})}if(!this.extension_popup.visible){this.extension_popup.title(h);this.extension_popup.empty();this.extension_popup.append(f(i));this.extension_popup.show()}else{this.extension_popup.hide()}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_template:function(g){return'<tr id="upload-item-'+g.id+'" class="upload-item"><td><div style="position: relative;"><div id="mode"></div><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><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><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>'}})});
\ No newline at end of file
+define(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(i,g){this.app=i;var f=this;this.model=new b.Model(g);this.setElement(this._template(g));var h=this.$el;this.settings=new c.View({title:"Upload configuration",container:h.find("#settings"),placement:"bottom"});this.select_genome=new e.View({css:"genome",onchange:function(){f.model.set("genome",f.select_genome.value())},data:f.app.list_genomes,container:h.find("#genome"),value:f.model.get("genome")});this.select_extension=new e.View({css:"extension",onchange:function(){f.model.set("extension",f.select_extension.value())},data:f.app.list_extensions,container:h.find("#extension"),value:f.model.get("extension")});h.find("#symbol").on("click",function(){f._removeRow()});h.find("#extension-info").on("click",function(j){f._showExtensionInfo()}).on("mousedown",function(j){j.preventDefault()});h.find("#settings").on("click",function(j){f._showSettings()}).on("mousedown",function(j){j.preventDefault()});h.find("#text-content").on("keyup",function(j){f.model.set("url_paste",$(j.target).val());f.model.set("file_size",$(j.target).val().length)});h.find("#space_to_tabs").on("change",function(j){f.model.set("space_to_tabs",$(j.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshGenome:function(){var f=this.model.get("genome");this.select_genome.value(f)},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showExtensionInfo:function(){var f=$(this.el).find("#extension-info");var i=this.model.get("extension");var h=this.select_extension.text();var g=d.findPair(this.app.list_extensions,"id",i);if(!this.extension_popup){this.extension_popup=new c.View({placement:"bottom",container:f})}if(!this.extension_popup.visible){this.extension_popup.title(h);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(g));this.extension_popup.show()}else{this.extension_popup.hide()}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_templateDescription:function(g){if(g.description){var f=g.description;if(g.description_url){f+=' (<a href="'+g.description_url+'" target="_blank">read more</a>)'}return f}else{return"There is no description available for this file extension."}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div style="position: relative;"><div id="mode"></div><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><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><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>'}})});
\ No newline at end of file
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/packed/mvc/upload/upload-view.js
--- a/static/scripts/packed/mvc/upload/upload-view.js
+++ b/static/scripts/packed/mvc/upload/upload-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.modal","utils/utils","mvc/upload/upload-button","mvc/upload/upload-model","mvc/upload/upload-row","mvc/upload/upload-ftp","mvc/ui/ui-popover","mvc/ui","utils/uploadbox"],function(a,f,e,c,b,g,d){return Backbone.View.extend({options:{nginx_upload_path:""},modal:null,ui_button:null,uploadbox:null,current_history:null,upload_size:0,list_extensions:[{id:"auto",text:"Auto-detect"}],list_genomes:[],collection:new c.Collection(),ftp:null,counter:{announce:0,success:0,error:0,running:0,reset:function(){this.announce=this.success=this.error=this.running=0}},initialize:function(i){var h=this;if(!Galaxy.currHistoryPanel||!Galaxy.currHistoryPanel.model){window.setTimeout(function(){h.initialize()},500);return}if(!Galaxy.currUser.get("id")){return}this.ui_button=new e.Model({icon:"fa-upload",tooltip:"Download from URL or upload files from disk",label:"Load Data",onclick:function(j){if(j){h._eventShow(j)}},onunload:function(){if(h.counter.running>0){return"Several uploads are still processing."}}});$("#left .unified-panel-header-inner").append((new e.View(this.ui_button)).$el);var h=this;f.jsonFromUrl(galaxy_config.root+"api/datatypes?upload_only=True",function(j){for(key in j){h.list_extensions.push({id:j[key],text:j[key]})}});f.jsonFromUrl(galaxy_config.root+"api/genomes",function(j){for(key in j){h.list_genomes.push({id:j[key][1],text:j[key][0]})}h.list_genomes.sort(function(l,k){return l.id>k.id?1:l.id<k.id?-1:0})});if(i){this.options=_.defaults(i,this.options)}this.collection.on("remove",function(j){h._eventRemove(j)});this.collection.on("change:genome",function(k){var j=k.get("genome");h.collection.each(function(l){if(l.get("status")=="init"&&l.get("genome")=="?"){l.set("genome",j)}})})},_eventShow:function(j){j.preventDefault();if(!this.modal){var h=this;this.modal=new a.GalaxyModal({title:"Download data directly from web or upload files from your disk",body:this._template("upload-box","upload-info"),buttons:{"Choose local file":function(){h.uploadbox.select()},"Choose FTP file":function(){h._eventFtp()},"Create new file":function(){h._eventCreate()},Start:function(){h._eventStart()},Pause:function(){h._eventStop()},Reset:function(){h._eventReset()},Close:function(){h.modal.hide()},},height:"400",width:"900",closing_events:true});this.setElement("#upload-box");var h=this;this.uploadbox=this.$el.uploadbox({announce:function(k,l,m){h._eventAnnounce(k,l,m)},initialize:function(k,l,m){return h._eventInitialize(k,l,m)},progress:function(k,l,m){h._eventProgress(k,l,m)},success:function(k,l,m){h._eventSuccess(k,l,m)},error:function(k,l,m){h._eventError(k,l,m)},complete:function(){h._eventComplete()}});this._updateScreen();if(this.options.ftp_upload_dir&&this.options.ftp_upload_site){var i=this.modal.getButton("Choose FTP file");this.ftp=new d.View({title:"FTP files",container:i})}else{this.modal.hideButton("Choose FTP file")}}this.modal.show()},_eventRemove:function(i){var h=i.get("status");if(h=="success"){this.counter.success--}else{if(h=="error"){this.counter.error--}else{this.counter.announce--}}this._updateScreen();this.uploadbox.remove(i.id)},_eventAnnounce:function(h,i,k){this.counter.announce++;this._updateScreen();var j=new b(this,{id:h,file_name:i.name,file_size:i.size,file_mode:i.mode,file_path:i.path});this.collection.add(j.model);$(this.el).find("tbody:first").append(j.$el);j.render()},_eventInitialize:function(m,j,s){var k=this.collection.get(m);k.set("status","running");var o=k.get("file_name");var n=k.get("file_path");var h=k.get("file_mode");var p=k.get("extension");var r=k.get("genome");var q=k.get("url_paste");var l=k.get("space_to_tabs");var i=k.get("to_posix_lines");if(!q&&!(j.size>0)){return null}this.uploadbox.configure({url:this.options.nginx_upload_path});if(h=="local"){this.uploadbox.configure({paramname:"files_0|file_data"})}else{this.uploadbox.configure({paramname:null})}tool_input={};if(h=="new"){tool_input["files_0|url_paste"]=q}if(h=="ftp"){tool_input["files_0|ftp_files"]=n}tool_input.dbkey=r;tool_input.file_type=p;tool_input["files_0|type"]="upload_dataset";tool_input.space_to_tabs=l;tool_input.to_posix_lines=i;data={};data.history_id=this.current_history;data.tool_id="upload1";data.inputs=JSON.stringify(tool_input);return data},_eventProgress:function(i,j,h){var k=this.collection.get(i);k.set("percentage",h);this.ui_button.set("percentage",this._upload_percentage(h,j.size))},_eventSuccess:function(i,j,l){var k=this.collection.get(i);k.set("percentage",100);k.set("status","success");var h=k.get("file_size");this.ui_button.set("percentage",this._upload_percentage(100,h));this.upload_completed+=h*100;this.counter.announce--;this.counter.success++;this._updateScreen();Galaxy.currHistoryPanel.refreshHdas()},_eventError:function(h,i,k){var j=this.collection.get(h);j.set("percentage",100);j.set("status","error");j.set("info",k);this.ui_button.set("percentage",this._upload_percentage(100,i.size));this.ui_button.set("status","danger");this.upload_completed+=i.size*100;this.counter.announce--;this.counter.error++;this._updateScreen()},_eventComplete:function(){this.collection.each(function(h){if(h.get("status")=="queued"){h.set("status","init")}});this.counter.running=0;this._updateScreen()},_eventFtp:function(){if(!this.ftp.visible){this.ftp.empty();this.ftp.append((new g(this)).$el);this.ftp.show()}else{this.ftp.hide()}},_eventCreate:function(){this.uploadbox.add([{name:"New File",size:0,mode:"new"}])},_eventStart:function(){if(this.counter.announce==0||this.counter.running>0){return}var h=this;this.upload_size=0;this.upload_completed=0;this.collection.each(function(i){if(i.get("status")=="init"){i.set("status","queued");h.upload_size+=i.get("file_size")}});this.ui_button.set("percentage",0);this.ui_button.set("status","success");this.current_history=Galaxy.currHistoryPanel.model.get("id");this.counter.running=this.counter.announce;this._updateScreen();this.uploadbox.start()},_eventStop:function(){if(this.counter.running==0){return}this.ui_button.set("status","info");this.uploadbox.stop();$("#upload-info").html("Queue will pause after completing the current file...")},_eventReset:function(){if(this.counter.running==0){this.collection.reset();this.counter.reset();this._updateScreen();this.uploadbox.reset();this.ui_button.set("percentage",0)}},_updateScreen:function(){if(this.counter.announce==0){if(this.uploadbox.compatible()){message="You can Drag & Drop files into this box."}else{message="Unfortunately, your browser does not support multiple file uploads or drag&drop.<br>Some supported browsers are: Firefox 4+, Chrome 7+, IE 10+, Opera 12+ or Safari 6+."}}else{if(this.counter.running==0){message="You added "+this.counter.announce+" file(s) to the queue. Add more files or click 'Start' to proceed."}else{message="Please wait..."+this.counter.announce+" out of "+this.counter.running+" remaining."}}$("#upload-info").html(message);if(this.counter.running==0&&this.counter.announce+this.counter.success+this.counter.error>0){this.modal.enableButton("Reset")}else{this.modal.disableButton("Reset")}if(this.counter.running==0&&this.counter.announce>0){this.modal.enableButton("Start")}else{this.modal.disableButton("Start")}if(this.counter.running>0){this.modal.enableButton("Pause")}else{this.modal.disableButton("Pause")}if(this.counter.running==0){this.modal.enableButton("Choose local file");this.modal.enableButton("Choose FTP file");this.modal.enableButton("Create new file")}else{this.modal.disableButton("Choose local file");this.modal.disableButton("Choose FTP file");this.modal.disableButton("Create new file")}if(this.counter.announce+this.counter.success+this.counter.error>0){$(this.el).find("#upload-table").show()}else{$(this.el).find("#upload-table").hide()}},_upload_percentage:function(h,i){return(this.upload_completed+(h*i))/this.upload_size},_template:function(i,h){return'<div id="'+i+'" class="upload-box"><table id="upload-table" class="table table-striped" style="display: none;"><thead><tr><th>Name</th><th>Size</th><th>Type</th><th>Genome</th><th>Settings</th><th>Status</th><th></th></tr></thead><tbody></tbody></table></div><h6 id="'+h+'" class="upload-info"></h6>'}})});
\ No newline at end of file
+define(["galaxy.modal","utils/utils","mvc/upload/upload-button","mvc/upload/upload-model","mvc/upload/upload-row","mvc/upload/upload-ftp","mvc/ui/ui-popover","mvc/ui","utils/uploadbox"],function(a,f,e,c,b,g,d){return Backbone.View.extend({options:{nginx_upload_path:""},modal:null,ui_button:null,uploadbox:null,current_history:null,upload_size:0,list_extensions:[{id:"auto",text:"Auto-detect",description:"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."}],list_genomes:[],collection:new c.Collection(),ftp:null,counter:{announce:0,success:0,error:0,running:0,reset:function(){this.announce=this.success=this.error=this.running=0}},initialize:function(i){var h=this;if(!Galaxy.currHistoryPanel||!Galaxy.currHistoryPanel.model){window.setTimeout(function(){h.initialize()},500);return}if(!Galaxy.currUser.get("id")){return}this.ui_button=new e.Model({icon:"fa-upload",tooltip:"Download from URL or upload files from disk",label:"Load Data",onclick:function(j){if(j){h._eventShow(j)}},onunload:function(){if(h.counter.running>0){return"Several uploads are still processing."}}});$("#left .unified-panel-header-inner").append((new e.View(this.ui_button)).$el);var h=this;f.jsonFromUrl(galaxy_config.root+"api/datatypes?extension_only=False",function(j){for(key in j){h.list_extensions.push({id:j[key].extension,text:j[key].extension,description:j[key].description,description_url:j[key].description_url})}h.list_extensions.sort(function(l,k){if(l.id=="auto"){return -1}if(k.id=="auto"){return 1}return l.id>k.id?1:l.id<k.id?-1:0})});f.jsonFromUrl(galaxy_config.root+"api/genomes",function(j){for(key in j){h.list_genomes.push({id:j[key][1],text:j[key][0]})}h.list_genomes.sort(function(l,k){return l.id>k.id?1:l.id<k.id?-1:0})});if(i){this.options=_.defaults(i,this.options)}this.collection.on("remove",function(j){h._eventRemove(j)});this.collection.on("change:genome",function(k){var j=k.get("genome");h.collection.each(function(l){if(l.get("status")=="init"&&l.get("genome")=="?"){l.set("genome",j)}})})},_eventShow:function(j){j.preventDefault();if(!this.modal){var h=this;this.modal=new a.GalaxyModal({title:"Download data directly from web or upload files from your disk",body:this._template("upload-box","upload-info"),buttons:{"Choose local file":function(){h.uploadbox.select()},"Choose FTP file":function(){h._eventFtp()},"Create new file":function(){h._eventCreate()},Start:function(){h._eventStart()},Pause:function(){h._eventStop()},Reset:function(){h._eventReset()},Close:function(){h.modal.hide()},},height:"400",width:"900",closing_events:true});this.setElement("#upload-box");var h=this;this.uploadbox=this.$el.uploadbox({announce:function(k,l,m){h._eventAnnounce(k,l,m)},initialize:function(k,l,m){return h._eventInitialize(k,l,m)},progress:function(k,l,m){h._eventProgress(k,l,m)},success:function(k,l,m){h._eventSuccess(k,l,m)},error:function(k,l,m){h._eventError(k,l,m)},complete:function(){h._eventComplete()}});this._updateScreen();if(this.options.ftp_upload_dir&&this.options.ftp_upload_site){var i=this.modal.getButton("Choose FTP file");this.ftp=new d.View({title:"FTP files",container:i})}else{this.modal.hideButton("Choose FTP file")}}this.modal.show()},_eventRemove:function(i){var h=i.get("status");if(h=="success"){this.counter.success--}else{if(h=="error"){this.counter.error--}else{this.counter.announce--}}this._updateScreen();this.uploadbox.remove(i.id)},_eventAnnounce:function(h,i,k){this.counter.announce++;this._updateScreen();var j=new b(this,{id:h,file_name:i.name,file_size:i.size,file_mode:i.mode,file_path:i.path});this.collection.add(j.model);$(this.el).find("tbody:first").append(j.$el);j.render()},_eventInitialize:function(m,j,s){var k=this.collection.get(m);k.set("status","running");var o=k.get("file_name");var n=k.get("file_path");var h=k.get("file_mode");var p=k.get("extension");var r=k.get("genome");var q=k.get("url_paste");var l=k.get("space_to_tabs");var i=k.get("to_posix_lines");if(!q&&!(j.size>0)){return null}this.uploadbox.configure({url:this.options.nginx_upload_path});if(h=="local"){this.uploadbox.configure({paramname:"files_0|file_data"})}else{this.uploadbox.configure({paramname:null})}tool_input={};if(h=="new"){tool_input["files_0|url_paste"]=q}if(h=="ftp"){tool_input["files_0|ftp_files"]=n}tool_input.dbkey=r;tool_input.file_type=p;tool_input["files_0|type"]="upload_dataset";tool_input.space_to_tabs=l;tool_input.to_posix_lines=i;data={};data.history_id=this.current_history;data.tool_id="upload1";data.inputs=JSON.stringify(tool_input);return data},_eventProgress:function(i,j,h){var k=this.collection.get(i);k.set("percentage",h);this.ui_button.set("percentage",this._upload_percentage(h,j.size))},_eventSuccess:function(i,j,l){var k=this.collection.get(i);k.set("percentage",100);k.set("status","success");var h=k.get("file_size");this.ui_button.set("percentage",this._upload_percentage(100,h));this.upload_completed+=h*100;this.counter.announce--;this.counter.success++;this._updateScreen();Galaxy.currHistoryPanel.refreshHdas()},_eventError:function(h,i,k){var j=this.collection.get(h);j.set("percentage",100);j.set("status","error");j.set("info",k);this.ui_button.set("percentage",this._upload_percentage(100,i.size));this.ui_button.set("status","danger");this.upload_completed+=i.size*100;this.counter.announce--;this.counter.error++;this._updateScreen()},_eventComplete:function(){this.collection.each(function(h){if(h.get("status")=="queued"){h.set("status","init")}});this.counter.running=0;this._updateScreen()},_eventFtp:function(){if(!this.ftp.visible){this.ftp.empty();this.ftp.append((new g(this)).$el);this.ftp.show()}else{this.ftp.hide()}},_eventCreate:function(){this.uploadbox.add([{name:"New File",size:0,mode:"new"}])},_eventStart:function(){if(this.counter.announce==0||this.counter.running>0){return}var h=this;this.upload_size=0;this.upload_completed=0;this.collection.each(function(i){if(i.get("status")=="init"){i.set("status","queued");h.upload_size+=i.get("file_size")}});this.ui_button.set("percentage",0);this.ui_button.set("status","success");this.current_history=Galaxy.currHistoryPanel.model.get("id");this.counter.running=this.counter.announce;this._updateScreen();this.uploadbox.start()},_eventStop:function(){if(this.counter.running==0){return}this.ui_button.set("status","info");this.uploadbox.stop();$("#upload-info").html("Queue will pause after completing the current file...")},_eventReset:function(){if(this.counter.running==0){this.collection.reset();this.counter.reset();this._updateScreen();this.uploadbox.reset();this.ui_button.set("percentage",0)}},_updateScreen:function(){if(this.counter.announce==0){if(this.uploadbox.compatible()){message="You can Drag & Drop files into this box."}else{message="Unfortunately, your browser does not support multiple file uploads or drag&drop.<br>Some supported browsers are: Firefox 4+, Chrome 7+, IE 10+, Opera 12+ or Safari 6+."}}else{if(this.counter.running==0){message="You added "+this.counter.announce+" file(s) to the queue. Add more files or click 'Start' to proceed."}else{message="Please wait..."+this.counter.announce+" out of "+this.counter.running+" remaining."}}$("#upload-info").html(message);if(this.counter.running==0&&this.counter.announce+this.counter.success+this.counter.error>0){this.modal.enableButton("Reset")}else{this.modal.disableButton("Reset")}if(this.counter.running==0&&this.counter.announce>0){this.modal.enableButton("Start")}else{this.modal.disableButton("Start")}if(this.counter.running>0){this.modal.enableButton("Pause")}else{this.modal.disableButton("Pause")}if(this.counter.running==0){this.modal.enableButton("Choose local file");this.modal.enableButton("Choose FTP file");this.modal.enableButton("Create new file")}else{this.modal.disableButton("Choose local file");this.modal.disableButton("Choose FTP file");this.modal.disableButton("Create new file")}if(this.counter.announce+this.counter.success+this.counter.error>0){$(this.el).find("#upload-table").show()}else{$(this.el).find("#upload-table").hide()}},_upload_percentage:function(h,i){return(this.upload_completed+(h*i))/this.upload_size},_template:function(i,h){return'<div id="'+i+'" class="upload-box"><table id="upload-table" class="table table-striped" style="display: none;"><thead><tr><th>Name</th><th>Size</th><th>Type</th><th>Genome</th><th>Settings</th><th>Status</th><th></th></tr></thead><tbody></tbody></table></div><h6 id="'+h+'" class="upload-info"></h6>'}})});
\ No newline at end of file
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/packed/utils/utils.js
--- a/static/scripts/packed/utils/utils.js
+++ b/static/scripts/packed/utils/utils.js
@@ -1,1 +1,1 @@
-define(["libs/underscore"],function(c){function f(j,i,h){var k=new XMLHttpRequest();k.open("GET",j,true);k.setRequestHeader("Accept","application/json");k.setRequestHeader("Cache-Control","no-cache");k.setRequestHeader("X-Requested-With","XMLHttpRequest");k.onloadend=function(){var l=k.status;if(l==200){try{response=jQuery.parseJSON(k.responseText)}catch(m){response=k.responseText}i&&i(response)}else{h&&h(l)}};k.send()}function b(k,h){var i=$('<div class="'+k+'"></div>');i.appendTo(":eq(0)");var j=i.css(h);i.remove();return j}function a(h){if(!$('link[href^="'+h+'"]').length){$('<link href="'+galaxy_config.root+h+'" rel="stylesheet">').appendTo("head")}}function g(h,i){if(h){return c.defaults(h,i)}else{return i}}function d(i,k){var j="";if(i>=100000000000){i=i/100000000000;j="TB"}else{if(i>=100000000){i=i/100000000;j="GB"}else{if(i>=100000){i=i/100000;j="MB"}else{if(i>=100){i=i/100;j="KB"}else{if(i>0){i=i*10;j="b"}else{return"<strong>-</strong>"}}}}}var h=(Math.round(i)/10);if(k){return h+" "+j}else{return"<strong>"+h+"</strong> "+j}}function e(){return(new Date().getTime()).toString(36)}return{cssLoadFile:a,cssGetAttribute:b,jsonFromUrl:f,merge:g,bytesToString:d,uuid:e}});
\ No newline at end of file
+define(["libs/underscore"],function(c){function f(k,j,i){var l=new XMLHttpRequest();l.open("GET",k,true);l.setRequestHeader("Accept","application/json");l.setRequestHeader("Cache-Control","no-cache");l.setRequestHeader("X-Requested-With","XMLHttpRequest");l.onloadend=function(){var m=l.status;if(m==200){try{response=jQuery.parseJSON(l.responseText)}catch(n){response=l.responseText}j&&j(response)}else{i&&i(m)}};l.send()}function b(l,i){var j=$('<div class="'+l+'"></div>');j.appendTo(":eq(0)");var k=j.css(i);j.remove();return k}function a(i){if(!$('link[href^="'+i+'"]').length){$('<link href="'+galaxy_config.root+i+'" rel="stylesheet">').appendTo("head")}}function h(i,j){if(i){return c.defaults(i,j)}else{return j}}function d(j,l){var k="";if(j>=100000000000){j=j/100000000000;k="TB"}else{if(j>=100000000){j=j/100000000;k="GB"}else{if(j>=100000){j=j/100000;k="MB"}else{if(j>=100){j=j/100;k="KB"}else{if(j>0){j=j*10;k="b"}else{return"<strong>-</strong>"}}}}}var i=(Math.round(j)/10);if(l){return i+" "+k}else{return"<strong>"+i+"</strong> "+k}}function e(){return(new Date().getTime()).toString(36)}function g(j,l,n){for(var k in j){var m=j[k];if(m[l]==n){return m}}return{}}return{cssLoadFile:a,cssGetAttribute:b,jsonFromUrl:f,merge:h,bytesToString:d,uuid:e,findPair:g}});
\ No newline at end of file
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/scripts/utils/utils.js
--- a/static/scripts/utils/utils.js
+++ b/static/scripts/utils/utils.js
@@ -96,6 +96,17 @@
return (new Date().getTime()).toString(36);
};
+// find in dict
+function findPair(arr, key, val) {
+ for (var i in arr) {
+ var item = arr[i];
+ if (item[key] == val) {
+ return item;
+ }
+ }
+ return {};
+}
+
// return
return {
cssLoadFile : cssLoadFile,
@@ -103,7 +114,8 @@
jsonFromUrl : jsonFromUrl,
merge : merge,
bytesToString: bytesToString,
- uuid: uuid
+ uuid: uuid,
+ findPair: findPair
};
});
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1261,7 +1261,7 @@
.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 .table th{text-align:center;white-space:nowrap}
-.upload-box .table td{margin:0px;paddign:0px}
+.upload-box .table td{margin:0px}
.upload-box .upload-item .select2-arrow b{background-position:0 -3px}
.upload-box .upload-item .select2-choice{max-height:20px;line-height:18px;background:transparent}
.upload-box .upload-item .select2-container-disabled .select2-arrow{background:transparent}
diff -r 5079dae08441dcf125cc9fee87b28aaba7a38f9d -r 72eec07ef71833f797c7e279a6c27c4e8a24535c static/style/src/less/upload.less
--- a/static/style/src/less/upload.less
+++ b/static/style/src/less/upload.less
@@ -82,7 +82,6 @@
.table td {
margin: 0px;
- paddign: 0px;
}
.upload-item {
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