rbbt-rest 1.6.5 → 1.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06f314767ae1d7c019b94dde061f9f6054468832
4
- data.tar.gz: 679a21602a557f06238043ad006ca09aa6fbad9c
3
+ metadata.gz: c8171c90d69575b3554125d4f2f4e26676c33a57
4
+ data.tar.gz: d6a2cc6d4f2bd526e631538f688de83f0dd23649
5
5
  SHA512:
6
- metadata.gz: 4943cc3f9f6dae9630fff2da2a5bdb738e23b68b96b884f3ad3488dfd5a1cd83109507d3791a5a1ffca1bcf28f006707027714fe7d3d6f20dd275b403fad1cf7
7
- data.tar.gz: 68fa386ded1a74b1ee8bd14bc2061bd73dceee7877fbeeba2b504d3ebc78ad1acc63d67e49f66784c6a5518a1cc1ef20b0535d2500a34b385cf876841e473975
6
+ metadata.gz: bea46a56129ed371de3e787f847b30570b97e9da74bc46c129b15b20894a341ced2c1ba15f1ca5a6c19d514cff595da40c5ce0b25254e56b9cd8b29809e3ab6c
7
+ data.tar.gz: 289978f606c05cb55324a469ea703c8ae6328a9fba822778df957389db6ff1792c65920e42f4436016c6317a00d39805ff381efa92a735be3209c4f48771d95f
@@ -5,6 +5,7 @@ module Sinatra
5
5
  options[:id] ||= toolname.to_s + "_#{rand(10000)}"
6
6
 
7
7
  template_file = locate_template("tools/#{toolname}")
8
+ Log.debug "Loading tool #{toolname} from: #{template_file}"
8
9
  content = Tilt::HamlTemplate.new(template_file, :filename => template_file, :ugly => production?).render(self, options)
9
10
 
10
11
  styles = begin
@@ -9,9 +9,10 @@
9
9
  // Semantic-ui
10
10
 
11
11
 
12
- -# record_css '/plugins/foundation-icons/foundation-icons.css'
13
12
  - record_css '/plugins/semantic-ui/dist/semantic.min.css'
14
13
 
14
+ - record_css '/plugins/jquery-ui/css/custom-theme/jquery-ui-1.8.14.custom.css'
15
+
15
16
  -# record_css '/stylesheets/layout'
16
17
  -# record_css '/stylesheets/responsive'
17
18
  -# record_css '/stylesheets/text'
@@ -39,6 +40,7 @@
39
40
  - record_js '/plugins/jquery.tablesorter/jquery.tablesorter.min.js'
40
41
  - record_js '/plugins/jquery.scrollTo/jquery.scrollTo'
41
42
  - record_js '/plugins/semantic-ui/dist/semantic.min.js'
43
+ - record_js '/plugins/FileSaver/js/FileSaver.js'
42
44
 
43
45
  - %w(helpers _md5 _ajax_replace _ellipsis).each do |file|
44
46
  - record_js "/js-find/#{ file }"
@@ -0,0 +1,248 @@
1
+ /* FileSaver.js
2
+ * A saveAs() FileSaver implementation.
3
+ * 2015-03-04
4
+ *
5
+ * By Eli Grey, http://eligrey.com
6
+ * License: X11/MIT
7
+ * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
8
+ */
9
+
10
+ /*global self */
11
+ /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
12
+
13
+ /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
14
+
15
+ var saveAs = saveAs
16
+ // IE 10+ (native saveAs)
17
+ || (typeof navigator !== "undefined" &&
18
+ navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
19
+ // Everyone else
20
+ || (function(view) {
21
+ "use strict";
22
+ // IE <10 is explicitly unsupported
23
+ if (typeof navigator !== "undefined" &&
24
+ /MSIE [1-9]\./.test(navigator.userAgent)) {
25
+ return;
26
+ }
27
+ var
28
+ doc = view.document
29
+ // only get URL when necessary in case Blob.js hasn't overridden it yet
30
+ , get_URL = function() {
31
+ return view.URL || view.webkitURL || view;
32
+ }
33
+ , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
34
+ , can_use_save_link = "download" in save_link
35
+ , click = function(node) {
36
+ var event = doc.createEvent("MouseEvents");
37
+ event.initMouseEvent(
38
+ "click", true, false, view, 0, 0, 0, 0, 0
39
+ , false, false, false, false, 0, null
40
+ );
41
+ node.dispatchEvent(event);
42
+ }
43
+ , webkit_req_fs = view.webkitRequestFileSystem
44
+ , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
45
+ , throw_outside = function(ex) {
46
+ (view.setImmediate || view.setTimeout)(function() {
47
+ throw ex;
48
+ }, 0);
49
+ }
50
+ , force_saveable_type = "application/octet-stream"
51
+ , fs_min_size = 0
52
+ // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and
53
+ // https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047
54
+ // for the reasoning behind the timeout and revocation flow
55
+ , arbitrary_revoke_timeout = 500 // in ms
56
+ , revoke = function(file) {
57
+ var revoker = function() {
58
+ if (typeof file === "string") { // file is an object URL
59
+ get_URL().revokeObjectURL(file);
60
+ } else { // file is a File
61
+ file.remove();
62
+ }
63
+ };
64
+ if (view.chrome) {
65
+ revoker();
66
+ } else {
67
+ setTimeout(revoker, arbitrary_revoke_timeout);
68
+ }
69
+ }
70
+ , dispatch = function(filesaver, event_types, event) {
71
+ event_types = [].concat(event_types);
72
+ var i = event_types.length;
73
+ while (i--) {
74
+ var listener = filesaver["on" + event_types[i]];
75
+ if (typeof listener === "function") {
76
+ try {
77
+ listener.call(filesaver, event || filesaver);
78
+ } catch (ex) {
79
+ throw_outside(ex);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ , FileSaver = function(blob, name) {
85
+ // First try a.download, then web filesystem, then object URLs
86
+ var
87
+ filesaver = this
88
+ , type = blob.type
89
+ , blob_changed = false
90
+ , object_url
91
+ , target_view
92
+ , dispatch_all = function() {
93
+ dispatch(filesaver, "writestart progress write writeend".split(" "));
94
+ }
95
+ // on any filesys errors revert to saving with object URLs
96
+ , fs_error = function() {
97
+ // don't create more object URLs than needed
98
+ if (blob_changed || !object_url) {
99
+ object_url = get_URL().createObjectURL(blob);
100
+ }
101
+ if (target_view) {
102
+ target_view.location.href = object_url;
103
+ } else {
104
+ var new_tab = view.open(object_url, "_blank");
105
+ if (new_tab == undefined && typeof safari !== "undefined") {
106
+ //Apple do not allow window.open, see http://bit.ly/1kZffRI
107
+ view.location.href = object_url
108
+ }
109
+ }
110
+ filesaver.readyState = filesaver.DONE;
111
+ dispatch_all();
112
+ revoke(object_url);
113
+ }
114
+ , abortable = function(func) {
115
+ return function() {
116
+ if (filesaver.readyState !== filesaver.DONE) {
117
+ return func.apply(this, arguments);
118
+ }
119
+ };
120
+ }
121
+ , create_if_not_found = {create: true, exclusive: false}
122
+ , slice
123
+ ;
124
+ filesaver.readyState = filesaver.INIT;
125
+ if (!name) {
126
+ name = "download";
127
+ }
128
+ if (can_use_save_link) {
129
+ object_url = get_URL().createObjectURL(blob);
130
+ save_link.href = object_url;
131
+ save_link.download = name;
132
+ click(save_link);
133
+ filesaver.readyState = filesaver.DONE;
134
+ dispatch_all();
135
+ revoke(object_url);
136
+ return;
137
+ }
138
+ // prepend BOM for UTF-8 XML and text/plain types
139
+ if (/^\s*(?:text\/(?:plain|xml)|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
140
+ blob = new Blob(["\ufeff", blob], {type: blob.type});
141
+ }
142
+ // Object and web filesystem URLs have a problem saving in Google Chrome when
143
+ // viewed in a tab, so I force save with application/octet-stream
144
+ // http://code.google.com/p/chromium/issues/detail?id=91158
145
+ // Update: Google errantly closed 91158, I submitted it again:
146
+ // https://code.google.com/p/chromium/issues/detail?id=389642
147
+ if (view.chrome && type && type !== force_saveable_type) {
148
+ slice = blob.slice || blob.webkitSlice;
149
+ blob = slice.call(blob, 0, blob.size, force_saveable_type);
150
+ blob_changed = true;
151
+ }
152
+ // Since I can't be sure that the guessed media type will trigger a download
153
+ // in WebKit, I append .download to the filename.
154
+ // https://bugs.webkit.org/show_bug.cgi?id=65440
155
+ if (webkit_req_fs && name !== "download") {
156
+ name += ".download";
157
+ }
158
+ if (type === force_saveable_type || webkit_req_fs) {
159
+ target_view = view;
160
+ }
161
+ if (!req_fs) {
162
+ fs_error();
163
+ return;
164
+ }
165
+ fs_min_size += blob.size;
166
+ req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
167
+ fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
168
+ var save = function() {
169
+ dir.getFile(name, create_if_not_found, abortable(function(file) {
170
+ file.createWriter(abortable(function(writer) {
171
+ writer.onwriteend = function(event) {
172
+ target_view.location.href = file.toURL();
173
+ filesaver.readyState = filesaver.DONE;
174
+ dispatch(filesaver, "writeend", event);
175
+ revoke(file);
176
+ };
177
+ writer.onerror = function() {
178
+ var error = writer.error;
179
+ if (error.code !== error.ABORT_ERR) {
180
+ fs_error();
181
+ }
182
+ };
183
+ "writestart progress write abort".split(" ").forEach(function(event) {
184
+ writer["on" + event] = filesaver["on" + event];
185
+ });
186
+ writer.write(blob);
187
+ filesaver.abort = function() {
188
+ writer.abort();
189
+ filesaver.readyState = filesaver.DONE;
190
+ };
191
+ filesaver.readyState = filesaver.WRITING;
192
+ }), fs_error);
193
+ }), fs_error);
194
+ };
195
+ dir.getFile(name, {create: false}, abortable(function(file) {
196
+ // delete file if it already exists
197
+ file.remove();
198
+ save();
199
+ }), abortable(function(ex) {
200
+ if (ex.code === ex.NOT_FOUND_ERR) {
201
+ save();
202
+ } else {
203
+ fs_error();
204
+ }
205
+ }));
206
+ }), fs_error);
207
+ }), fs_error);
208
+ }
209
+ , FS_proto = FileSaver.prototype
210
+ , saveAs = function(blob, name) {
211
+ return new FileSaver(blob, name);
212
+ }
213
+ ;
214
+ FS_proto.abort = function() {
215
+ var filesaver = this;
216
+ filesaver.readyState = filesaver.DONE;
217
+ dispatch(filesaver, "abort");
218
+ };
219
+ FS_proto.readyState = FS_proto.INIT = 0;
220
+ FS_proto.WRITING = 1;
221
+ FS_proto.DONE = 2;
222
+
223
+ FS_proto.error =
224
+ FS_proto.onwritestart =
225
+ FS_proto.onprogress =
226
+ FS_proto.onwrite =
227
+ FS_proto.onabort =
228
+ FS_proto.onerror =
229
+ FS_proto.onwriteend =
230
+ null;
231
+
232
+ return saveAs;
233
+ }(
234
+ typeof self !== "undefined" && self
235
+ || typeof window !== "undefined" && window
236
+ || this.content
237
+ ));
238
+ // `self` is undefined in Firefox for Android content script context
239
+ // while `this` is nsIContentFrameMessageManager
240
+ // with an attribute `content` that corresponds to the window
241
+
242
+ if (typeof module !== "undefined" && module.exports) {
243
+ module.exports.saveAs = saveAs;
244
+ } else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
245
+ define([], function() {
246
+ return saveAs;
247
+ });
248
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.5
4
+ version: 1.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-27 00:00:00.000000000 Z
11
+ date: 2015-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -388,6 +388,7 @@ files:
388
388
  - share/views/public/js/rbbt/reveal.js
389
389
  - share/views/public/js/rbbt/table.js
390
390
  - share/views/public/js/rbbt/workflow.js
391
+ - share/views/public/plugins/FileSaver/js/FileSaver.js
391
392
  - share/views/public/plugins/angular/angular.js
392
393
  - share/views/public/plugins/cytoscapejs/arbor.js
393
394
  - share/views/public/plugins/cytoscapejs/cytoscape.js
@@ -1751,8 +1752,6 @@ files:
1751
1752
  - share/views/public/plugins/underscore/js/underscore.js
1752
1753
  - share/views/tasks.haml
1753
1754
  - share/views/tools/cytoscape.haml
1754
- - share/views/tools/protein_tool.haml
1755
- - share/views/tools/protein_tool/controls.haml
1756
1755
  - share/views/wait.haml
1757
1756
  homepage: http://github.com/mikisvaz/rbbt-rest
1758
1757
  licenses:
@@ -1,391 +0,0 @@
1
- - position = nil unless defined? position
2
- - sequence = protein.sequence
3
- - jmol_id = 'Jmol-' << protein
4
- - select_id = jmol_id + '-select'
5
- - pdbs = protein.pdbs
6
- - position = nil unless defined? position
7
- - colors = %w(red blue green yellow black white purple)
8
-
9
- - organism = protein.organism
10
- - uni = Organism.protein_identifiers(organism).index :target => "UniProt/SwissProt Accession", :persist => true
11
-
12
- :sass
13
- .protein_tool
14
- .controls
15
- float: right
16
- margin-bottom: -2px
17
- .ui.input, .ui.buttons
18
- padding: 0px
19
- input
20
- width: 100% !important
21
- .tabular.menu
22
- width: 300px !important
23
-
24
- .protein_tool.very.basic.ui.segment(id=id)
25
- .controls.very.basic.segment
26
- .ui.input
27
- %input(placeholder='Position' type='text' name='position')
28
- .ui.buttons
29
- .mark.submit.ui.button Mark
30
- .clear.submit.ui.button Clear
31
- .align.submit.ui.button Align
32
- .ui.tabular.menu.top.attached
33
- .item.active(data-tab='Sequence') Sequence
34
- .item(data-tab='JMol') JMol
35
- .item(data-tab='COSMIC') COSMIC
36
- .window.bottom.attached.ui.segment
37
- .secondary_structure.active.very.basic.ui.segment.tab(data-tab='Sequence' style='background:white')
38
- .svg(data-sequence_length='#{sequence.length}')
39
- - log :svg, "Downloading SVG"
40
- - begin
41
- = protein.marked_svg([])
42
- - rescue Exception
43
- %p.error.ui.message
44
- Could not download protein SVG, try again later.
45
- %pre=$!.message
46
- .sequence(style='width: 677px; overflow-x: auto;font-family: monospace;margin-left:123px')
47
- %span.sequence(width="100%")= sequence
48
- %span.marks(width="100%")
49
- - size = sequence.length
50
- - marks = size / 10
51
- - str = ""
52
- - marks.times do |mark|
53
- - txt = "|"
54
- - str << ("_" * (10 - txt.length)) << txt
55
- = str
56
- %span.counts(width="100%")
57
- - size = sequence.length
58
- - marks = size / 10
59
- - str = ""
60
- - marks.times do |mark|
61
- - mark = (mark + 1) * 10
62
- - txt = mark.to_s
63
- - str << ("_" * (10 - txt.length)) << txt
64
- = str
65
- %p.scroll.ui.message
66
- Scroll horizontaly across the sequence
67
-
68
- .jmol.very.basic.ui.segment.tab(data-tab='JMol')
69
-
70
- .ui.field
71
- %label(for=select_id) Load a structure PDB
72
- %select.pdb(id=select_id style='width: 200px')
73
- %option(selected="selected") Select a PDB
74
- - (pdbs || []).each do |pdb, info|
75
- %option(attr-pdb="=#{pdb}")= "#{pdb}"
76
- - uniprot = uni[protein]
77
-
78
- - if uniprot and Structure::I3D_PROTEINS.include? uniprot
79
- - filepos = Structure::I3D_PROTEINS.identify_field "FILENAME"
80
- - Structure::I3D_PROTEINS[uniprot][filepos].each do |filename|
81
- - type = filename =~ /EXP/ ? :pdb : :model
82
- - url = "http://interactome3d.irbbarcelona.org/pdb.php?dataset=human&type1=proteins&type2=#{ type }&pdb=#{ filename }"
83
- -# url = "http://darthcaedus:28873/" << ["Structure", "get_protein_pdb"] * "/" << "?" << Misc.hash2GET_params(:_format => :raw, :filename => filename)
84
- %option.protein(attr-pdb=url)= "#{filename}"
85
-
86
- - if uniprot and Structure::I3D_INTERACTIONS.include? uniprot
87
- - filepos = Structure::I3D_INTERACTIONS.identify_field "FILENAME"
88
- - Structure::I3D_INTERACTIONS[uniprot][filepos].each do |filename|
89
- - type = filename =~ /EXP/ ? :pdb : :model
90
- - url = "http://interactome3d.irbbarcelona.org/pdb.php?dataset=human&type1=interactions&type2=#{ type }&pdb=#{ filename }"
91
- -# url = "http://darthcaedus:28873/" << ["Structure", "get_interaction_pdb"] * "/" << "?" << Misc.hash2GET_params(:_format => :raw, :filename => filename)
92
- %option.interaction(attr-pdb=url)= "#{filename}"
93
- .window
94
-
95
- .COSMIC.very.basic.ui.segment.tab(data-tab='COSMIC')
96
- = fragment do
97
- .highlight.submit.ui.button Highlight
98
- .ui.message
99
- In JMol positions with 1 mutation are white, with 2 are green, with 3 are orange, and with more than 3 are red
100
- -#%select(name='color')
101
- - colors.each do |c|
102
- %option(value=c)= c
103
-
104
-
105
- - header "Genomic Mutation", "GenomicMutation", {:organism => Organism.default_code("Hsa"), :watson => false}
106
- - filter "Primary site"
107
- = table :table_id => "COSMIC mutations for #{ protein.name || protein }", :row_ids => :consume do
108
- - association_items = COSMIC.knowledge_base.subset(:mutation_protein_changes, :target => [protein], :source => :all)
109
- - associations = association_items.tsv.to_double
110
-
111
- - log :sample_mutations
112
- - sample_mutations = COSMIC.knowledge_base.get_database(:sample_mutations, :type => :double, :merge => true, :target => "Sample name=~Sample", :source => "Genomic Mutation")
113
- - sample_mutations.fields = ["Sample"]
114
-
115
- - associations = associations.attach(sample_mutations)
116
-
117
- - log :sample_info
118
- - sample_info = COSMIC.sample_info.find.tsv
119
- - sample_info.key_field = "Sample"
120
-
121
- - associations = associations.attach(sample_info)
122
-
123
- - good_fields = associations.fields - ["Ensembl Protein ID"]
124
-
125
- - log :slice_and_show
126
- - associations.slice(good_fields)
127
-
128
- :deferjs
129
-
130
- $('.highlight.submit').click(function(){
131
- var link = $(this);
132
- var COSMIC = link.parents('.COSMIC').first();
133
- var protein_tool = COSMIC.parents('.protein_tool').first();
134
- var svg_element = protein_tool.find('.svg').first();
135
- var jmol_element = protein_tool.find('.jmol').first();
136
-
137
- var table = COSMIC.find('table');
138
- var url = table.attr('attr-url');
139
- var filter = table.attr('attr-filter');
140
-
141
- url = add_parameter(url, '_format', 'json')
142
- url = add_parameter(url, '_page', 'all')
143
- url = add_parameter(url, '_column', 'Change')
144
- if (undefined != filter){ url = add_parameter(url, '_filter', escape(filter)) }
145
-
146
- var color = 'red'
147
-
148
- $.ajax({
149
- url: url,
150
- success: function(data){
151
- data = JSON.parse(data);
152
- var change_positions = [];
153
- for (mutation in data){
154
- var change = data[mutation][0];
155
- var samples = data[mutation][1];
156
- if (m = change.match(/[A-Z*](\d*)[A-Z*]/)){
157
- change_positions.push(parseInt(m[1]));
158
- }
159
- }
160
- var change_counts = []
161
-
162
- for (i in change_positions){
163
- var position = change_positions[i]
164
- if (change_counts[position] === undefined){
165
- change_counts[position] = 1
166
- }else{
167
- change_counts[position] = change_counts[position] + 1
168
- }
169
- }
170
-
171
- var protein_tool = $('.protein_tool#' + '#{id}');
172
- rbbt.svg.mark_positions(svg_element, change_positions, color);
173
- for (position in change_counts){
174
- var jcolor = 'white';
175
- if (change_counts[position] > 1) jcolor = 'green'
176
- if (change_counts[position] > 2) jcolor = 'organge'
177
- if (change_counts[position] > 3) jcolor = 'red'
178
-
179
- rbbt.jmol.mark_position(jmol_element, position, jcolor);
180
- }
181
-
182
- }
183
- })
184
- return false;
185
- })
186
-
187
- :sass
188
- .jmol:not(.active)
189
- display: block !important
190
- visibility: hidden
191
- height: 0px
192
- margin: 0px
193
- padding: 0px
194
-
195
- :deferjs
196
- rbbt.sequence = {}
197
- $('.tabular.menu .item').tab()
198
-
199
- $('svg').attr('viewport-fill', 'white')
200
- rbbt.sequence.clear = function(element){
201
- var seq = element.find('span.sequence');
202
- var marked_chars = seq.find('.sequence_char_position')
203
- marked_chars.each(function(marked_char){ marked_char = $(this); marked_char.replaceWith(marked_char.html()) })
204
- }
205
-
206
- rbbt.sequence.mark_position = function(element, position, color){
207
- if (undefined === color) color = 'red';
208
- var seq = element.find('span.sequence');
209
- var str = seq.html();
210
- var char_pos = position - 1;
211
- str = str.slice(0, char_pos) + $('<span class="sequence_char_position" data-sequence_position=' + position + ' style="color:' + color + '">' + str[char_pos] + '</span>')[0].outerHTML + str.slice(char_pos+1)
212
- seq.html(str)
213
- }
214
-
215
- rbbt.svg = {}
216
-
217
- rbbt.svg.clear = function(element){
218
- var svg = element.find('svg');
219
- var vlines = svg.find('.rbbt-vline')
220
- vlines.remove()
221
- var vregions = svg.find('.rbbt-region')
222
- vregions.remove()
223
- }
224
-
225
- rbbt.svg.position_offset = function(element, position){
226
- var svg = element.find('svg');
227
- var width = parseInt(svg.attr('width'));
228
- var start = parseInt(svg.find('rect.ac').attr('x'));
229
- var seq_len = parseInt(element.attr('data-sequence_length'));
230
- return start + position * (width - start)/seq_len
231
- }
232
-
233
- rbbt.svg.mark_position = function(element, position, color){
234
- if (undefined === color) color = 'red';
235
- var svg = element.find('svg');
236
-
237
- var width = parseInt(svg.attr('width'));
238
- var height = parseInt(svg.attr('height'));
239
- var offset = rbbt.svg.position_offset(element, position)
240
-
241
- var line = document.createElementNS("http://www.w3.org/2000/svg", "line");
242
- line.setAttributeNS(null, "x1", offset);
243
- line.setAttributeNS(null, "y1", 5);
244
- line.setAttributeNS(null, "x2", offset);
245
- line.setAttributeNS(null, "y2", height - 5);
246
- line.setAttributeNS(null, "class", 'rbbt-vline');
247
- line.setAttributeNS(null, "style", "stroke:" + color + ";opacity:0.5;stroke-width:1;");
248
-
249
- svg.append(line);
250
- }
251
-
252
- rbbt.svg.mark_positions = function(element, positions, color){
253
- for ( i in positions){
254
- var position = positions[i]
255
- rbbt.svg.mark_position(element, position, color)
256
- }
257
- }
258
-
259
- rbbt.svg.mark_region = function(element, first, last, color){
260
- var svg = element.find('svg')
261
- var width = parseInt(svg.attr('width'));
262
- var height = parseInt(svg.attr('height'));
263
- var start = parseInt(svg.find('rect.ac').attr('x'));
264
- var seq_len = parseInt(element.attr('data-sequence_length'));
265
-
266
- var offset_start = rbbt.svg.position_offset(element, first)
267
- var offset_end = rbbt.svg.position_offset(element, last)
268
-
269
- var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
270
-
271
- rect.setAttributeNS(null, "x", offset_start);
272
- rect.setAttributeNS(null, "class", 'rbbt-region');
273
- rect.setAttributeNS(null, "y", 10);
274
- rect.setAttributeNS(null, "width", offset_end - offset_start);
275
- rect.setAttributeNS(null, "height", height - 30);
276
- rect.setAttributeNS(null, "style", "stroke:black;stroke-width: 2; opacity:0.3;fill:" + color + ";");
277
-
278
- svg.append(rect);
279
- }
280
-
281
- rbbt.svg.mark_aligned_region = function(element, map, color){
282
- if (undefined === color) color = 'blue'
283
-
284
- var positions = []
285
- for(seq_pos in map){
286
- positions.push(parseInt(seq_pos))
287
- }
288
-
289
- positions = positions.sort();
290
- console.log(positions)
291
- var last = -1
292
- var start = -1;
293
- for (var i = 0; i < positions.length; i++){
294
- if (positions[i] != last + 1){
295
- if (start != -1) { rbbt.svg.mark_region(element, start, last, color); }
296
- start = positions[i]
297
- }
298
- last = positions[i]
299
- }
300
- if (start != -1) { rbbt.svg.mark_region(element, start, last, color); }
301
- }
302
-
303
-
304
- rbbt.jmol = {}
305
- rbbt.jmol.clear = function(element){
306
- element.jmol_tool('clear')
307
- }
308
- rbbt.jmol.mark_position = function(element, position, color){
309
- if (undefined === color) color = 'red'
310
- element.jmol_tool('mark_position', position, color)
311
- }
312
-
313
- rbbt.jmol.mark_positions = function(element, positions, color){
314
- for (i in positions){
315
- var position = positions[i]
316
- rbbt.jmol.mark_position(element, position, color)
317
- }
318
- }
319
-
320
- require_js("/js/jmol.js", function(){
321
- var position = #{position ? position : "undefined"}
322
- var tool = $('.jmol').last().jmol_tool({protein:"#{ protein }", sequence: "#{protein.sequence}"});
323
-
324
- $('select.pdb').change(function(){
325
- var option = $(this).find('option:selected');
326
- var pdb = option.attr('attr-pdb');
327
- if (pdb == "Select a pdb") return false
328
- tool.jmol_tool("load_pdb", pdb)
329
- clean = pdb.replace(/=/,'')
330
- tool.find('.pdb_info > dd.pdbfile').html(clean)
331
-
332
- if (position !== undefined){
333
- tool.jmol_tool("clear")
334
- tool.jmol_tool("mark_position", position, 'red')
335
- }
336
- })
337
- })
338
-
339
-
340
- $('.clear.submit').click(function(){
341
- var link = $(this);
342
- var controls = link.parents('.controls').first();
343
- var protein_tool = controls.parents('.protein_tool').first();
344
- var sequence_element = protein_tool.find('.sequence').first();
345
- var svg_element = protein_tool.find('.svg').first();
346
- var jmol_element = protein_tool.find('.jmol').first();
347
-
348
- rbbt.sequence.clear(sequence_element)
349
- rbbt.svg.clear(svg_element)
350
- rbbt.jmol.clear(jmol_element)
351
- })
352
-
353
- $('.mark.submit').click(function(){
354
- var link = $(this);
355
- var controls = link.parents('.controls').first();
356
- var protein_tool = controls.parents('.protein_tool').first();
357
- var sequence_element = protein_tool.find('.sequence').first();
358
- var svg_element = protein_tool.find('.svg').first();
359
- var jmol_element = protein_tool.find('.jmol').first();
360
-
361
- var position = parseInt(controls.find('input[name=position]').val());
362
-
363
- if (! position > 0) return alert("No position specified")
364
-
365
- rbbt.sequence.clear(sequence_element)
366
- rbbt.svg.clear(svg_element)
367
-
368
- rbbt.sequence.mark_position(sequence_element, position)
369
- rbbt.svg.mark_position(svg_element, position)
370
- rbbt.jmol.mark_position(jmol_element, position)
371
- })
372
-
373
-
374
- $('.align.submit').click(function(){
375
- var link = $(this);
376
- var controls = link.parents('.controls').first();
377
- var protein_tool = controls.parents('.protein_tool').first();
378
- var svg_element = protein_tool.find('.svg').first();
379
-
380
- var jmol = $('.jmol');
381
-
382
- if(jmol.jmol_tool('is_pdb_loaded')){
383
- var map = jmol.jmol_tool('alignment_map');
384
- jmol.jmol_tool('mark_aligned_region', 'blue');
385
- rbbt.svg.mark_aligned_region(svg_element, map, 'blue');
386
- }else{
387
- alert("Select a PDB")
388
- }
389
- return false;
390
- })
391
-
@@ -1,315 +0,0 @@
1
- - colors = %w(red blue green yellow black white purple)
2
-
3
- .tool_menu.top.attached.tabular.ui.menu
4
- - if user
5
- .item(data-tab='Controls') Controls
6
-
7
- .item(data-tab='Appris') Appris
8
-
9
- .item(data-tab='COSMIC') COSMIC
10
-
11
-
12
- - if user
13
- .controls.bottom.attached.ui.tab.segment(data-tab='Controls')
14
- = action_parameters nil, {:klass => ''}, :action => '#' do
15
- - input :list, :select, "Genomic Mutation list", nil, :html_options => {:class => 'favourite_lists', :type => 'GenomicMutation'}
16
- - input :color, :select, "Color to use", 'green', :select_options => colors
17
-
18
- .appris.bottom.attached.ui.tab.segment(data-tab='Appris')
19
- .controls.ui.form
20
- .ui.field
21
- %label Highlight color
22
- %select.ui.select(name='color')
23
- - colors.each do |c|
24
- %option(value=c)= c
25
- %dl
26
- - (protein.appris_residues || []).each do |type, list|
27
- %dt= Misc.humanize type
28
- %dd
29
- %ul.clean_list
30
- - list.each do |range|
31
- %li
32
- %a.appris_highlight.ui.button(href="#" attr-start="#{range['start']}" attr-end="#{range['end']}") Highlight
33
- == (#{range['start']}..#{range['end']})
34
-
35
- :deferjs
36
- $('a.appris_highlight, a.feature_highlight').click(function(){
37
- var link = $(this)
38
- var color = link.parents('dd').find('select').first().val();
39
- var start = parseInt(link.attr('attr-start'));
40
- var end = parseInt(link.attr('attr-end'));
41
-
42
- var protein_tool = $(this).parents('.protein_tool').first()
43
-
44
- if (start == end){
45
- protein_tool.protein_tool('mark_position', start, color)
46
- }else{
47
- protein_tool.protein_tool('mark_region', start, end, color)
48
- }
49
- return false
50
- })
51
-
52
- .COSMIC.bottom.attached.ui.tab.segment(data-tab='COSMIC')
53
- = fragment do
54
-
55
- .highlight.ui.form
56
- .ui.field
57
- %label Highlight color
58
- %select.ui.select(name='color')
59
- - colors.each do |c|
60
- %option(value=c)= c
61
- %a.highlight.ui.button(href="#") highlight
62
-
63
- - header "Genomic Mutation", "GenomicMutation", {:organism => Organism.default_code("Hsa"), :watson => false}
64
- - filter "Primary site"
65
- = table :table_id => "COSMIC mutations for #{ protein.name || protein }", :row_ids => :consume do
66
- - association_items = COSMIC.knowledge_base.subset(:mutation_protein_changes, :target => [protein], :source => :all)
67
- - associations = association_items.tsv.to_double
68
-
69
- - log :sample_mutations
70
- - sample_mutations = COSMIC.knowledge_base.get_database(:sample_mutations, :type => :double, :merge => true, :target => "Sample name=~Sample", :source => "Genomic Mutation")
71
- - sample_mutations.fields = ["Sample"]
72
-
73
- - associations = associations.attach(sample_mutations)
74
-
75
- - log :sample_info
76
- - sample_info = COSMIC.sample_info.find.tsv
77
- - sample_info.key_field = "Sample"
78
-
79
- - associations = associations.attach(sample_info)
80
-
81
- - good_fields = associations.fields - ["Ensembl Protein ID"]
82
-
83
- - log :slice_and_show
84
- - associations.slice(good_fields)
85
-
86
- :deferjs
87
- $('.COSMIC ul.highlight > li > a.highlight').click(function(){
88
-
89
- var table = $(this).parents('dd').first().find('table');
90
- var url = table.attr('attr-url');
91
- var filter = table.attr('attr-filter');
92
-
93
- url = add_parameter(url, '_format', 'json')
94
- url = add_parameter(url, '_page', 'all')
95
- url = add_parameter(url, '_column', 'Change')
96
- if (undefined != filter){ url = add_parameter(url, '_filter', escape(filter)) }
97
-
98
- var color = $(this).parents('dd').first().find('select[name=color]').val();
99
-
100
- $.ajax({
101
- url: url,
102
- success: function(data){
103
- data = JSON.parse(data);
104
- var change_positions = [];
105
- for (mutation in data){
106
- var change = data[mutation][0];
107
- if (m = change.match(/[A-Z*](\d*)[A-Z*]/)){
108
- change_positions.push(parseInt(m[1]));
109
- }
110
- }
111
- var protein_tool = $('.protein_tool#' + '#{id}');
112
- protein_tool.protein_tool('mark_positions', change_positions, color);
113
- }
114
- })
115
- return false;
116
- })
117
-
118
-
119
- :deferjs
120
- $('.tabular.menu > .item').tab()
121
- -#
122
-
123
- %dd.COSMIC
124
- = fragment do
125
-
126
- %ul.highlight
127
- %li.button
128
- %a.highlight(href="#") highlight
129
- %li
130
- %select(name='color')
131
- - colors.each do |c|
132
- %option(value=c)= c
133
-
134
-
135
- - header "Genomic Mutation", "GenomicMutation", {:organism => Organism.default_code("Hsa"), :watson => false}
136
- - filter "Primary site"
137
- = table :table_id => "COSMIC mutations for #{ protein.name || protein }", :row_ids => :consume do
138
- - association_items = COSMIC.knowledge_base.subset(:mutation_protein_changes, :target => [protein], :source => :all)
139
- - associations = association_items.tsv.to_double
140
-
141
- - log :sample_mutations
142
- - sample_mutations = COSMIC.knowledge_base.get_database(:sample_mutations, :type => :double, :merge => true, :target => "Sample name=~Sample", :source => "Genomic Mutation")
143
- - sample_mutations.fields = ["Sample"]
144
-
145
- - associations = associations.attach(sample_mutations)
146
-
147
- - log :sample_info
148
- - sample_info = COSMIC.sample_info.find.tsv
149
- - sample_info.key_field = "Sample"
150
-
151
- - associations = associations.attach(sample_info)
152
-
153
- - good_fields = associations.fields - ["Ensembl Protein ID"]
154
-
155
- - log :slice_and_show
156
- - associations.slice(good_fields)
157
-
158
- :deferjs
159
- $('.COSMIC ul.highlight > li > a.highlight').click(function(){
160
-
161
- var table = $(this).parents('dd').first().find('table');
162
- var url = table.attr('attr-url');
163
- var filter = table.attr('attr-filter');
164
-
165
- url = add_parameter(url, '_format', 'json')
166
- url = add_parameter(url, '_page', 'all')
167
- url = add_parameter(url, '_column', 'Change')
168
- if (undefined != filter){ url = add_parameter(url, '_filter', escape(filter)) }
169
-
170
- var color = $(this).parents('dd').first().find('select[name=color]').val();
171
-
172
- $.ajax({
173
- url: url,
174
- success: function(data){
175
- data = JSON.parse(data);
176
- var change_positions = [];
177
- for (mutation in data){
178
- var change = data[mutation][0];
179
- if (m = change.match(/[A-Z*](\d*)[A-Z*]/)){
180
- change_positions.push(parseInt(m[1]));
181
- }
182
- }
183
- var protein_tool = $('.protein_tool#' + '#{id}');
184
- protein_tool.protein_tool('mark_positions', change_positions, color);
185
- }
186
- })
187
- return false;
188
- })
189
-
190
- - if protein.uniprot
191
- - uniprot_alignment, ensembl_alignment = SmithWaterman.align(UniProt.sequence(protein.uniprot), protein.sequence)
192
- - alignment_map = Structure.alignment_map(uniprot_alignment, ensembl_alignment)
193
-
194
- %dt.next UniProt mutations
195
- %dd.UniProt
196
- = fragment do
197
-
198
- %ul.highlight
199
- %li
200
- %a.highlight(href="#") highlight
201
- %li
202
- %select(name='color')
203
- - colors.each do |c|
204
- %option(value=c)= c
205
-
206
-
207
- = table :id => "UniProt mutations for #{ protein }" do
208
- - tsv = UniProt.annotated_variants.tsv(:persist => true, :type => :double, :key_field => "UniProt Variant ID", :zipped => true, :namespace => protein.organism)
209
- - tsv = tsv.select("UniProt/SwissProt Accession" => protein.uniprot)
210
-
211
- - tsv.add_field "Aligned Change" do |key, values|
212
- - change = values["Amino Acid Mutation"]
213
- - change = change.first if Array === change
214
- - if change.nil? or change.empty?
215
- - [""]
216
- - else
217
- - wt, pos, mut = change.match(/([A-Z])(\d+)([A-Z*])/).values_at 1, 2, 3
218
- - pos = alignment_map[pos.to_i]
219
- - [[wt, pos, mut] * ""]
220
- - tsv
221
-
222
- :deferjs
223
- $('.UniProt a.highlight').click(function(){
224
- var table = $(this).parents('dd').first().find('table');
225
- var url = table.attr('attr-url');
226
- var filter = table.attr('attr-filter');
227
-
228
- url = add_parameter(url, '_format', 'json')
229
- url = add_parameter(url, '_page', 'all')
230
- url = add_parameter(url, '_column', 'Aligned Change')
231
- if (undefined != filter){ url = add_parameter(url, '_filter', escape(filter)) }
232
-
233
- var color = $(this).parents('dd').first().find('select[name=color]').val();
234
-
235
- $.ajax({
236
- url: url,
237
- success: function(data){
238
- data = JSON.parse(data);
239
- var change_positions = [];
240
- for (mutation in data){
241
- var changes = data[mutation];
242
- for (i in changes){
243
- var c = changes[i];
244
- if (m = c.match(/(\d+)/)){
245
- change_positions.push(parseInt(m[1]));
246
- }
247
- }
248
- }
249
- var protein_tool = $('.protein_tool#' + '#{id}');
250
- protein_tool.protein_tool('mark_positions', change_positions, color);
251
- }
252
- })
253
-
254
- return false;
255
- })
256
-
257
- %dt.next UniProt features
258
- %dd.UniProt_features
259
- .controls
260
- %ul.controls
261
- %li
262
- %select(name='color')
263
- - colors.each do |c|
264
- %option(value=c)= c
265
-
266
- - features = UniProt.features(protein.uniprot)
267
- - feature_types = {}
268
- - features.each{|info| feature_types[info[:type]] ||= [] ; feature_types[info[:type]] << info}
269
- %dl
270
- - feature_types.sort_by{|k,v| k}.each do |type, list|
271
- %dt= type
272
- %dd
273
- - list.sort_by{|info| info[:start].to_i}.each do |info|
274
- - type, start, eend, description = info.values_at :type, :start, :end, :description
275
- - start = alignment_map[start]
276
- - eend = alignment_map[eend]
277
- - next if start.nil? or eend.nil?
278
- %li
279
- %a.feature_highlight(href="#" attr-start="#{start}" attr-end="#{eend}") Highlight
280
- == #{ type } (#{start}..#{eend}): #{description}
281
-
282
- :deferjs
283
- $('.UniProt a.highlight').click(function(){
284
- var table = $(this).parents('dd').first().find('table');
285
- var url = table.attr('attr-url');
286
- var filter = table.attr('attr-filter');
287
-
288
- url = add_parameter(url, '_format', 'json')
289
- url = add_parameter(url, '_page', 'all')
290
- url = add_parameter(url, '_column', 'Aligned Change')
291
- if (undefined != filter){ url = add_parameter(url, '_filter', escape(filter)) }
292
-
293
- $.ajax({
294
- url: url,
295
- success: function(data){
296
- data = JSON.parse(data);
297
- var change_positions = [];
298
- for (mutation in data){
299
- var changes = data[mutation];
300
- for (i in changes){
301
- var c = changes[i];
302
- if (m = c.match(/(\d+)/)){
303
- change_positions.push(parseInt(m[1]));
304
- }
305
- }
306
- }
307
- var protein_tool = $('.protein_tool#' + '#{id}');
308
- protein_tool.protein_tool('mark_positions', change_positions, color);
309
- }
310
- })
311
-
312
- return false;
313
- })
314
-
315
-