genevalidator 1.6.2 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +147 -76
- data/Rakefile +1 -1
- data/aux/files/css/genevalidator.compiled.min.css +16 -0
- data/aux/files/css/{bootstrap.min.css → src/bootstrap.min.css} +0 -0
- data/aux/files/css/{font-awesome.min.css → src/font-awesome.min.css} +0 -0
- data/aux/files/css/{style.css → src/style.css} +0 -0
- data/aux/files/js/genevalidator.compiled.min.js +28 -0
- data/aux/files/js/{bootstrap.min.js → src/bootstrap.min.js} +0 -0
- data/aux/files/js/{d3.v3.min.js → src/d3.v3.min.js} +0 -0
- data/aux/files/js/{jquery-2.1.1.min.js → src/jquery-2.1.1.min.js} +0 -0
- data/aux/files/js/{jquery.tablesorter.min.js → src/jquery.tablesorter.min.js} +0 -0
- data/aux/files/js/src/plots.js +814 -0
- data/aux/files/js/src/script.js +43 -0
- data/aux/json_header.erb +6 -6
- data/aux/json_query.erb +2 -1
- data/aux/template_footer.erb +0 -11
- data/aux/template_header.erb +4 -4
- data/aux/template_query.erb +1 -1
- data/bin/genevalidator +8 -6
- data/genevalidator.gemspec +1 -1
- data/lib/genevalidator.rb +7 -5
- data/lib/genevalidator/arg_validation.rb +12 -9
- data/lib/genevalidator/blast.rb +18 -11
- data/lib/genevalidator/clusterization.rb +35 -31
- data/lib/genevalidator/exceptions.rb +0 -1
- data/lib/genevalidator/get_raw_sequences.rb +115 -69
- data/lib/genevalidator/hsp.rb +8 -8
- data/lib/genevalidator/json_to_gv_results.rb +4 -4
- data/lib/genevalidator/output.rb +40 -41
- data/lib/genevalidator/pool.rb +5 -4
- data/lib/genevalidator/query.rb +37 -0
- data/lib/genevalidator/tabular_parser.rb +3 -4
- data/lib/genevalidator/validation.rb +16 -11
- data/lib/genevalidator/validation_alignment.rb +17 -23
- data/lib/genevalidator/validation_blast_reading_frame.rb +3 -3
- data/lib/genevalidator/validation_duplication.rb +8 -18
- data/lib/genevalidator/validation_gene_merge.rb +11 -9
- data/lib/genevalidator/validation_length_cluster.rb +8 -11
- data/lib/genevalidator/validation_length_rank.rb +5 -4
- data/lib/genevalidator/validation_open_reading_frame.rb +5 -5
- data/lib/genevalidator/version.rb +1 -1
- data/test/test_all_validations.rb +2 -1
- data/test/test_blast.rb +4 -3
- data/test/test_extended_array_methods.rb +2 -1
- data/test/{test_sequences.rb → test_query.rb} +5 -23
- data/test/test_validation_open_reading_frame.rb +7 -7
- data/test/test_validations.rb +8 -6
- metadata +16 -16
- data/aux/app_template_footer.erb +0 -1
- data/aux/app_template_header.erb +0 -12
- data/aux/files/js/plots.js +0 -828
- data/aux/files/js/script.js +0 -71
- data/lib/genevalidator/sequences.rb +0 -101
@@ -97,8 +97,7 @@ module GeneValidator
|
|
97
97
|
# +LengthClusterValidationOutput+ object
|
98
98
|
def run
|
99
99
|
fail NotEnoughHitsError unless hits.length >= 5
|
100
|
-
fail
|
101
|
-
hits[0].is_a?(Sequence)
|
100
|
+
fail unless prediction.is_a?(Query) && hits[0].is_a?(Query)
|
102
101
|
|
103
102
|
start = Time.now
|
104
103
|
# get [clusters, max_density_cluster_idx]
|
@@ -125,7 +124,7 @@ module GeneValidator
|
|
125
124
|
@validation_report = ValidationReport.new('Not enough evidence', :warning,
|
126
125
|
@short_header, @header,
|
127
126
|
@description)
|
128
|
-
rescue
|
127
|
+
rescue
|
129
128
|
@validation_report = ValidationReport.new('Unexpected error', :error,
|
130
129
|
@short_header, @header,
|
131
130
|
@description)
|
@@ -136,16 +135,15 @@ module GeneValidator
|
|
136
135
|
# Clusterization by length from a list of sequences
|
137
136
|
# Params:
|
138
137
|
# +debug+ (optional):: true to display debug information, false by default
|
139
|
-
# +lst+:: array of +
|
140
|
-
# +predicted_seq+:: +
|
138
|
+
# +lst+:: array of +Query+ objects
|
139
|
+
# +predicted_seq+:: +Query+ objetc
|
141
140
|
# Output
|
142
141
|
# output 1:: array of Cluster objects
|
143
142
|
# output 2:: the index of the most dense cluster
|
144
143
|
def clusterization_by_length(_debug = false,
|
145
144
|
lst = @hits,
|
146
145
|
predicted_seq = @prediction)
|
147
|
-
fail TypeError unless lst[0].is_a?(
|
148
|
-
predicted_seq.is_a?(Sequence)
|
146
|
+
fail TypeError unless lst[0].is_a?(Query) && predicted_seq.is_a?(Query)
|
149
147
|
|
150
148
|
contents = lst.map { |x| x.length_protein.to_i }.sort { |a, b| a <=> b }
|
151
149
|
|
@@ -179,10 +177,9 @@ module GeneValidator
|
|
179
177
|
# +prediction+: +Sequence+ object
|
180
178
|
# Output:
|
181
179
|
# +Plot+ object
|
182
|
-
def plot_histo_clusters(
|
183
|
-
|
184
|
-
|
185
|
-
prediction = @prediction)
|
180
|
+
def plot_histo_clusters(clusters = @clusters,
|
181
|
+
max_density_cluster = @max_density_cluster,
|
182
|
+
prediction = @prediction)
|
186
183
|
|
187
184
|
data = clusters.each_with_index.map { |cluster, i|
|
188
185
|
cluster.lengths.collect { |k, v|
|
@@ -44,7 +44,7 @@ module GeneValidator
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def explain
|
47
|
-
diff = (@query_length
|
47
|
+
diff = (@query_length > @median) ? 'longer' : 'shorter'
|
48
48
|
exp1 = "The query sequence is #{@query_length} amino-acids long. BLAST" \
|
49
49
|
" identified #{@no_of_hits} hit sequences with lengths from" \
|
50
50
|
" #{@smallest_hit} to #{@largest_hit} amino-acids (median:" \
|
@@ -105,11 +105,12 @@ module GeneValidator
|
|
105
105
|
# +LengthRankValidationOutput+ object
|
106
106
|
def run(hits = @hits, prediction = @prediction)
|
107
107
|
fail NotEnoughHitsError unless hits.length >= 5
|
108
|
-
fail
|
108
|
+
fail unless prediction.is_a?(Query) && hits[0].is_a?(Query)
|
109
109
|
|
110
110
|
start = Time.now
|
111
111
|
|
112
|
-
hits_lengths = hits.map { |x| x.length_protein.to_i }
|
112
|
+
hits_lengths = hits.map { |x| x.length_protein.to_i }
|
113
|
+
.sort { |a, b| a <=> b }
|
113
114
|
|
114
115
|
no_of_hits = hits_lengths.length
|
115
116
|
median = hits_lengths.median.round
|
@@ -151,7 +152,7 @@ module GeneValidator
|
|
151
152
|
@validation_report = ValidationReport.new('Not enough evidence', :warning,
|
152
153
|
@short_header, @header,
|
153
154
|
@description)
|
154
|
-
rescue
|
155
|
+
rescue
|
155
156
|
@validation_report = ValidationReport.new('Unexpected error', :error,
|
156
157
|
@short_header, @header,
|
157
158
|
@description)
|
@@ -91,7 +91,7 @@ module GeneValidator
|
|
91
91
|
return @validation_report
|
92
92
|
end
|
93
93
|
|
94
|
-
fail
|
94
|
+
fail unless prediction.is_a?(Query)
|
95
95
|
|
96
96
|
start = Time.new
|
97
97
|
orfs = get_orfs
|
@@ -109,7 +109,7 @@ module GeneValidator
|
|
109
109
|
|
110
110
|
@validation_report.plot_files.push(plot1)
|
111
111
|
@validation_report
|
112
|
-
rescue
|
112
|
+
rescue
|
113
113
|
@validation_report = ValidationReport.new('Unexpected error', :error,
|
114
114
|
@short_header, @header,
|
115
115
|
@description)
|
@@ -160,7 +160,7 @@ module GeneValidator
|
|
160
160
|
# +orfs+: +Hash+ containing the open reading frame
|
161
161
|
# +output+: location where the plot will be saved in jped file format
|
162
162
|
# +prediction+: Sequence objects
|
163
|
-
def plot_orfs(orfs, translated_length
|
163
|
+
def plot_orfs(orfs, translated_length)
|
164
164
|
fail QueryError unless orfs.is_a? Hash
|
165
165
|
|
166
166
|
data = []
|
@@ -169,13 +169,13 @@ module GeneValidator
|
|
169
169
|
(-3..3).each do |frame|
|
170
170
|
next if frame == 0
|
171
171
|
data << { 'y' => frame, 'start' => 1, 'stop' => translated_length,
|
172
|
-
|
172
|
+
'color' => 'gray' }
|
173
173
|
end
|
174
174
|
|
175
175
|
# Create the hashes for the ORFs...
|
176
176
|
orfs.each do |_key, h|
|
177
177
|
data << { 'y' => h[:frame], 'start' => h[:orf_start],
|
178
|
-
|
178
|
+
'stop' => h[:orf_end], 'color' => 'red' }
|
179
179
|
end
|
180
180
|
|
181
181
|
Plot.new(data,
|
data/test/test_blast.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'fileutils'
|
4
|
+
|
4
5
|
require 'genevalidator'
|
5
6
|
require 'genevalidator/blast'
|
6
7
|
require 'genevalidator/tabular_parser'
|
@@ -202,7 +203,7 @@ module GeneValidator
|
|
202
203
|
|
203
204
|
GeneValidator.init(default_opt)
|
204
205
|
|
205
|
-
prediction =
|
206
|
+
prediction = Query.new
|
206
207
|
prediction.length_protein = 1808
|
207
208
|
tabular_headers = 'qseqid sseqid sacc slen qstart qend sstart' \
|
208
209
|
' send pident length qframe evalue'
|
@@ -241,7 +242,7 @@ module GeneValidator
|
|
241
242
|
|
242
243
|
GeneValidator.init(default_opt)
|
243
244
|
|
244
|
-
prediction =
|
245
|
+
prediction = Query.new
|
245
246
|
prediction.length_protein = 219 / 3
|
246
247
|
tabular_headers = 'qseqid sseqid pident length mismatch gapopen' \
|
247
248
|
' qstart qend sstart send evalue bitscore'
|
@@ -275,7 +276,7 @@ module GeneValidator
|
|
275
276
|
|
276
277
|
GeneValidator.init(default_opt)
|
277
278
|
|
278
|
-
prediction =
|
279
|
+
prediction = Query.new
|
279
280
|
prediction.length_protein = 219 / 3
|
280
281
|
output = File.open(ncbi_mrna_xml20, 'rb').read
|
281
282
|
iterator = Bio::BlastXMLParser::NokogiriBlastXml.new(output).to_enum
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
require 'genevalidator/ext/array'
|
3
3
|
require 'minitest/autorun'
|
4
|
+
|
4
5
|
module GeneValidator
|
5
6
|
# Test the Enumerable extension class
|
6
|
-
class
|
7
|
+
class TestArray < Minitest::Test
|
7
8
|
describe 'Array Class' do
|
8
9
|
it 'test1' do
|
9
10
|
v = [1, 2, 3, 4, 5, 6]
|
@@ -1,36 +1,18 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
require 'minitest/autorun'
|
3
|
-
|
3
|
+
|
4
4
|
require 'genevalidator/hsp'
|
5
|
+
require 'genevalidator/query'
|
6
|
+
|
5
7
|
module GeneValidator
|
6
8
|
# Test the Sequence class
|
7
|
-
class
|
9
|
+
class TestQueryClass < Minitest::Test
|
8
10
|
describe 'Test Sequence Class' do
|
9
|
-
it 'should get sequence by accession for mrna' do
|
10
|
-
seq_mrna = Sequence.new
|
11
|
-
seq_mrna.get_sequence_by_accession_no('EF100000', 'nucleotide',
|
12
|
-
'swissprot -remote')
|
13
|
-
assert_equal('AGAGTTTGAT', seq_mrna.raw_sequence[0..9])
|
14
|
-
start_idx = seq_mrna.raw_sequence.length - 10
|
15
|
-
end_idx = seq_mrna.raw_sequence.length - 1
|
16
|
-
assert_equal('GCCCGTCAAG', seq_mrna.raw_sequence[start_idx..end_idx])
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should get sequence by accession for protein' do
|
20
|
-
seq_prot = Sequence.new
|
21
|
-
seq_prot.get_sequence_by_accession_no('F8WCM5', 'protein',
|
22
|
-
'swissprot -remote')
|
23
|
-
assert_equal('MALWMRLLPL', seq_prot.raw_sequence[0..9])
|
24
|
-
start_idx = seq_prot.raw_sequence.length - 10
|
25
|
-
end_idx = seq_prot.raw_sequence.length - 1
|
26
|
-
assert_equal('WPRRPQRSQN', seq_prot.raw_sequence[start_idx..end_idx])
|
27
|
-
end
|
28
|
-
|
29
11
|
it 'should initialize seq tabular attributes' do
|
30
12
|
identifier = 'sp|Q8N302|AGGF1_HUMAN'
|
31
13
|
accession_no = 'Q8N302'
|
32
14
|
slen = 714
|
33
|
-
seq =
|
15
|
+
seq = Query.new
|
34
16
|
hash = { 'qseqid' => 'GB10034-PA',
|
35
17
|
'sseqid' => identifier,
|
36
18
|
'sacc' => accession_no,
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
require 'minitest/autorun'
|
3
3
|
|
4
|
-
require 'genevalidator/validation_test'
|
5
|
-
require 'genevalidator/validation_open_reading_frame'
|
6
|
-
require 'genevalidator/sequences'
|
7
4
|
require 'genevalidator'
|
5
|
+
require 'genevalidator/query'
|
6
|
+
require 'genevalidator/validation_open_reading_frame'
|
7
|
+
require 'genevalidator/validation_test'
|
8
8
|
|
9
9
|
module GeneValidator
|
10
10
|
# Classs to test the ORF validation
|
@@ -13,7 +13,7 @@ module GeneValidator
|
|
13
13
|
it 'should find ORFs - test 1 ' do
|
14
14
|
GeneValidator.config = {}
|
15
15
|
GeneValidator.config[:type] = :nucleotide
|
16
|
-
prediction =
|
16
|
+
prediction = Query.new
|
17
17
|
prediction.raw_sequence = 'ATGGCTCTCTGGATCCGGTCGCTGCCTCTCCTGGCCCTTCTT' \
|
18
18
|
'GCTCTTTCTGGCCCTGGGATCAGCCACGCAGCTGCCAACCAG' \
|
19
19
|
'CACCTCTGTGGCTCCCACTTGGTTGAGGCTCTCTACCTGGTG' \
|
@@ -69,7 +69,7 @@ module GeneValidator
|
|
69
69
|
it 'should find - test 2 ' do
|
70
70
|
GeneValidator.config = {}
|
71
71
|
GeneValidator.config[:type] = :nucleotide
|
72
|
-
prediction =
|
72
|
+
prediction = Query.new
|
73
73
|
prediction.raw_sequence = 'ATGGCTCTCTGGATCCGGTCGCTGCCTCTCCTGGCCCTTCTT' \
|
74
74
|
'GCTCTTTCTGGCCCTGGGATCAGCCACGCAGCTGCCAACCAG' \
|
75
75
|
'CACCTCTGTGGCTCCCACTTGGTTGAGGCTCTCTACCTGGTG' \
|
@@ -144,8 +144,8 @@ module GeneValidator
|
|
144
144
|
|
145
145
|
it 'should find - test 3 ' do
|
146
146
|
GeneValidator.config = {}
|
147
|
-
GeneValidator.config[:type] = :nucleotide
|
148
|
-
prediction =
|
147
|
+
GeneValidator.config[:type] = :nucleotide
|
148
|
+
prediction = Query.new
|
149
149
|
prediction.raw_sequence = 'GGCGGGGCGGGAGGGCGGCGCGGAGTGCGCCGGCGCGTCGTC' \
|
150
150
|
'GGGGACGCCGGGTCCAGGATCTTGCTAGGGAACCAGTGTTGT' \
|
151
151
|
'CGCGTCGTCCCGCCCCCTCGGGGCTTTTGCTCCCGTTAACTG' \
|
data/test/test_validations.rb
CHANGED
@@ -2,6 +2,7 @@ require_relative 'test_helper'
|
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'yaml'
|
4
4
|
require 'fileutils'
|
5
|
+
|
5
6
|
require 'genevalidator'
|
6
7
|
require 'genevalidator/blast'
|
7
8
|
require 'genevalidator/validation_length_cluster'
|
@@ -14,9 +15,10 @@ require 'genevalidator/validation_alignment'
|
|
14
15
|
require 'genevalidator/validation'
|
15
16
|
|
16
17
|
module GeneValidator
|
18
|
+
# Class that initalises a separate Validate.new() instance for each query.
|
17
19
|
class Validate
|
18
20
|
# Extend Validate Class with an alternative validate method that
|
19
|
-
#
|
21
|
+
# doesn't produce the output and returns the output instance
|
20
22
|
def validate_without_output(prediction, hits, current_idx)
|
21
23
|
hits = remove_identical_hits(prediction, hits)
|
22
24
|
vals = create_validation_tests(prediction, hits)
|
@@ -50,7 +52,7 @@ module GeneValidator
|
|
50
52
|
|
51
53
|
describe 'Detailed Validation of normal Insulin Query' do
|
52
54
|
hits = BlastUtils.parse_next(iterator, :nucleotide)
|
53
|
-
prediction =
|
55
|
+
prediction = Query.new
|
54
56
|
prediction.definition = ''
|
55
57
|
prediction.identifier = ''
|
56
58
|
prediction.type = :nucleotide
|
@@ -153,7 +155,7 @@ module GeneValidator
|
|
153
155
|
|
154
156
|
describe 'Validate a trancated sequence' do
|
155
157
|
hits = BlastUtils.parse_next(iterator, :nucleotide)
|
156
|
-
prediction =
|
158
|
+
prediction = Query.new
|
157
159
|
prediction.definition = ''
|
158
160
|
prediction.identifier = ''
|
159
161
|
prediction.type = :nucleotide
|
@@ -186,7 +188,7 @@ module GeneValidator
|
|
186
188
|
|
187
189
|
describe 'Validate a duplicated sequence' do
|
188
190
|
hits = BlastUtils.parse_next(iterator, :nucleotide)
|
189
|
-
prediction =
|
191
|
+
prediction = Query.new
|
190
192
|
prediction.definition = ''
|
191
193
|
prediction.identifier = ''
|
192
194
|
prediction.type = :nucleotide
|
@@ -230,7 +232,7 @@ module GeneValidator
|
|
230
232
|
describe 'Validate a merged sequence' do
|
231
233
|
hits = BlastUtils.parse_next(iterator, :nucleotide)
|
232
234
|
|
233
|
-
prediction =
|
235
|
+
prediction = Query.new
|
234
236
|
prediction.definition = ''
|
235
237
|
prediction.identifier = ''
|
236
238
|
prediction.type = :nucleotide
|
@@ -272,7 +274,7 @@ module GeneValidator
|
|
272
274
|
describe 'Validate a sequence with a frameshift' do
|
273
275
|
hits = BlastUtils.parse_next(iterator, :nucleotide)
|
274
276
|
|
275
|
-
prediction =
|
277
|
+
prediction = Query.new
|
276
278
|
prediction.definition = ''
|
277
279
|
prediction.identifier = ''
|
278
280
|
prediction.type = :nucleotide
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genevalidator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Monica Dragan
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-07-
|
14
|
+
date: 2015-07-28 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -146,23 +146,23 @@ files:
|
|
146
146
|
- LICENCE.txt
|
147
147
|
- README.md
|
148
148
|
- Rakefile
|
149
|
-
- aux/
|
150
|
-
- aux/
|
151
|
-
- aux/files/css/
|
152
|
-
- aux/files/css/
|
153
|
-
- aux/files/css/style.css
|
149
|
+
- aux/files/css/genevalidator.compiled.min.css
|
150
|
+
- aux/files/css/src/bootstrap.min.css
|
151
|
+
- aux/files/css/src/font-awesome.min.css
|
152
|
+
- aux/files/css/src/style.css
|
154
153
|
- aux/files/fonts/FontAwesome.otf
|
155
154
|
- aux/files/fonts/fontawesome-webfont.eot
|
156
155
|
- aux/files/fonts/fontawesome-webfont.svg
|
157
156
|
- aux/files/fonts/fontawesome-webfont.ttf
|
158
157
|
- aux/files/fonts/fontawesome-webfont.woff
|
159
158
|
- aux/files/img/gene.png
|
160
|
-
- aux/files/js/
|
161
|
-
- aux/files/js/
|
162
|
-
- aux/files/js/
|
163
|
-
- aux/files/js/jquery.
|
164
|
-
- aux/files/js/
|
165
|
-
- aux/files/js/
|
159
|
+
- aux/files/js/genevalidator.compiled.min.js
|
160
|
+
- aux/files/js/src/bootstrap.min.js
|
161
|
+
- aux/files/js/src/d3.v3.min.js
|
162
|
+
- aux/files/js/src/jquery-2.1.1.min.js
|
163
|
+
- aux/files/js/src/jquery.tablesorter.min.js
|
164
|
+
- aux/files/js/src/plots.js
|
165
|
+
- aux/files/js/src/script.js
|
166
166
|
- aux/files/json/.gitkeep
|
167
167
|
- aux/json_footer.erb
|
168
168
|
- aux/json_header.erb
|
@@ -190,7 +190,7 @@ files:
|
|
190
190
|
- lib/genevalidator/json_to_gv_results.rb
|
191
191
|
- lib/genevalidator/output.rb
|
192
192
|
- lib/genevalidator/pool.rb
|
193
|
-
- lib/genevalidator/
|
193
|
+
- lib/genevalidator/query.rb
|
194
194
|
- lib/genevalidator/tabular_parser.rb
|
195
195
|
- lib/genevalidator/validation.rb
|
196
196
|
- lib/genevalidator/validation_alignment.rb
|
@@ -237,7 +237,7 @@ files:
|
|
237
237
|
- test/test_files/test_sequences.fasta.blast_xml.raw_seq.idx
|
238
238
|
- test/test_files/test_validations.fasta
|
239
239
|
- test/test_helper.rb
|
240
|
-
- test/
|
240
|
+
- test/test_query.rb
|
241
241
|
- test/test_validation_open_reading_frame.rb
|
242
242
|
- test/test_validations.rb
|
243
243
|
homepage: https://github.com/wurmlab/GeneValidator
|
@@ -310,7 +310,7 @@ test_files:
|
|
310
310
|
- test/test_files/test_sequences.fasta.blast_xml.raw_seq.idx
|
311
311
|
- test/test_files/test_validations.fasta
|
312
312
|
- test/test_helper.rb
|
313
|
-
- test/
|
313
|
+
- test/test_query.rb
|
314
314
|
- test/test_validation_open_reading_frame.rb
|
315
315
|
- test/test_validations.rb
|
316
316
|
has_rdoc:
|
data/aux/app_template_footer.erb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
</tbody></table><script>var evaluation_div = document.getElementById('report_1');evaluation_div.innerHTML = "<%= less %>";</script>
|
data/aux/app_template_header.erb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
<h4>Overview</h4><div id="report"><div id="report_1"></div></div><hr><h4 id="results_header">Results</h4><table id="sortable_table" class="table table-bordered table-condensed tablesorter"><thead><tr id="header"><th>#</th><th>Ranking</th><th>Sequence Definition<span data-toggle="tooltip" title="Query definition as it apears in the input fasta file." data-placement="top"><i class="fa fa-question-circle"></i></span></th><th>No. Hits<span data-toggle="tooltip" title="Number of non-identical hits found by BLAST." data-placement="top"><i class="fa fa-question-circle"></i></span></th>
|
2
|
-
<% @validations.each do |item| %>
|
3
|
-
<th class="sorter-false">
|
4
|
-
<b><%= item.header %></b>
|
5
|
-
<% if item.short_header == "LengthCluster" || item.short_header == "Gene_Merge" || item.short_header == "ORF" || item.short_header == "MA" %>
|
6
|
-
<span data-toggle="tooltip" title="Charts available for this validation" data-placement="top"><i class="fa fa-bar-chart-o chartIcon"></i></span> <span data-toggle="tooltip" title="<%=item.description%>" data-placement="top"><i class="fa fa-question-circle"></i></span>
|
7
|
-
<% else %>
|
8
|
-
<span data-toggle="tooltip" title="<%=item.description%>" data-placement="top"><i class="fa fa-question-circle"></i></span>
|
9
|
-
<% end %>
|
10
|
-
</th>
|
11
|
-
<% end %>
|
12
|
-
<th class="sorter-false chart-column"></th></tr></thead><tbody>
|
data/aux/files/js/plots.js
DELETED
@@ -1,828 +0,0 @@
|
|
1
|
-
function show_all_plots(button){
|
2
|
-
'use strict';
|
3
|
-
var plotBtns = $('.plot_btn');
|
4
|
-
if (plotBtns.length > 30){
|
5
|
-
$('#alert').modal();
|
6
|
-
} else {
|
7
|
-
if (window.chrome && (window.location.protocol === 'file:') ) {
|
8
|
-
createChromeModal();
|
9
|
-
} else {
|
10
|
-
|
11
|
-
// show activity spinner
|
12
|
-
$('#spinner1').modal({ backdrop: 'static', keyboard: 'false' });
|
13
|
-
|
14
|
-
if (button.status !== 'pressed'){
|
15
|
-
button.status = 'pressed';
|
16
|
-
button.innerHTML = '<i class="fa fa-2x fa-bar-chart-o"></i><br>Hide All Charts';
|
17
|
-
button.onclick = function() {
|
18
|
-
hide_all_plots(button);
|
19
|
-
};
|
20
|
-
}
|
21
|
-
|
22
|
-
remove_all_plots(); // remove all plots
|
23
|
-
|
24
|
-
//iterate over the plot_btns and add data to each childRow
|
25
|
-
$('.plot_btn').each (function(){
|
26
|
-
addData(this, 'all');
|
27
|
-
});
|
28
|
-
|
29
|
-
$('#spinner1').modal('hide'); // remove activity spinner
|
30
|
-
}
|
31
|
-
}
|
32
|
-
}
|
33
|
-
|
34
|
-
function createChromeModal() {
|
35
|
-
if (($('#browser-alert').length) === 0) {
|
36
|
-
$('#browseralertText').html('<stong>Sorry, this feature is not supported in your browser.');
|
37
|
-
$('#browseralert').modal();
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
function remove_all_plots() {
|
42
|
-
'use strict';
|
43
|
-
$('.tablesorter-childRow').each (function(){
|
44
|
-
$(this).remove();
|
45
|
-
});
|
46
|
-
|
47
|
-
$('.plot_btn').each (function(){
|
48
|
-
this.status = 'released';
|
49
|
-
});
|
50
|
-
}
|
51
|
-
|
52
|
-
function hide_all_plots(button){
|
53
|
-
'use strict';
|
54
|
-
button.status = 'released';
|
55
|
-
button.innerHTML = '<i class="fa fa-2x fa-bar-chart-o"></i><br>Show All Charts';
|
56
|
-
button.onclick = function() {
|
57
|
-
show_all_plots(button);
|
58
|
-
};
|
59
|
-
remove_all_plots();
|
60
|
-
}
|
61
|
-
|
62
|
-
function addData(source, val){
|
63
|
-
'use strict';
|
64
|
-
if (window.chrome && (window.location.protocol === 'file:') ) {
|
65
|
-
createChromeModal();
|
66
|
-
return true;
|
67
|
-
}
|
68
|
-
var graphs = '',
|
69
|
-
graphData = '',
|
70
|
-
$currentRow = $(source).closest('tr'),
|
71
|
-
target = $currentRow.attr("data-target"),
|
72
|
-
$childRow = $('#mainrow' + target);
|
73
|
-
|
74
|
-
if ($childRow.length && source.status !== 'pressed') {
|
75
|
-
// if you click on another td...
|
76
|
-
emptyChildRow($currentRow, target, source);
|
77
|
-
addDataToChildRow($currentRow, target, val);
|
78
|
-
} else if ($childRow.length === 0){
|
79
|
-
createChildRow($currentRow, target, source);
|
80
|
-
addDataToChildRow($currentRow, target, val);
|
81
|
-
} else if ($childRow.length) {
|
82
|
-
removeChildRow($currentRow, $childRow, source);
|
83
|
-
}
|
84
|
-
|
85
|
-
$('table').trigger('update');
|
86
|
-
|
87
|
-
}
|
88
|
-
|
89
|
-
function addOverallPlot(file){
|
90
|
-
$.getJSON(file, function( json ) {
|
91
|
-
addPlot(json.data, 'report_1', json.type, json.title, json.footer, json.xtitle, json.ytitle);
|
92
|
-
});
|
93
|
-
}
|
94
|
-
|
95
|
-
function createChildRow($currentRow, target, source){
|
96
|
-
var childRowHTML = '<tr class="tablesorter-childRow" id="mainrow' + target + '"><td colspan="12" id="row' +
|
97
|
-
target + '"><div id="' + target + '" class="expanded-child"></div></td></tr>';
|
98
|
-
$currentRow.addClass('tablesorter-hasChildRow');
|
99
|
-
$currentRow.after(childRowHTML);
|
100
|
-
source.status = 'pressed';
|
101
|
-
}
|
102
|
-
|
103
|
-
function removeChildRow($currentRow, $childRow, source){
|
104
|
-
$currentRow.removeClass('tablesorter-hasChildRow');
|
105
|
-
$childRow.remove();
|
106
|
-
source.status = 'released';
|
107
|
-
}
|
108
|
-
|
109
|
-
function emptyChildRow($currentRow, target, source){
|
110
|
-
var targetId = '#' + target;
|
111
|
-
var explanationId = '#' + target + 'explanation';
|
112
|
-
$(targetId).empty();
|
113
|
-
$(explanationId).remove();
|
114
|
-
resetStatusOfOtherButtons($currentRow);
|
115
|
-
source.status = 'pressed';
|
116
|
-
}
|
117
|
-
|
118
|
-
function resetStatusOfOtherButtons($currentRow){
|
119
|
-
$currentRow.find('td').each (function(){
|
120
|
-
if (this.status == 'pressed') { this.status = 'released'; }
|
121
|
-
});
|
122
|
-
$currentRow.find('.plot_btn').each (function(){
|
123
|
-
if (this.status == 'pressed') { this.status = 'released'; }
|
124
|
-
});
|
125
|
-
}
|
126
|
-
|
127
|
-
function addDataToChildRow($currentRow, target, val){
|
128
|
-
var file = $currentRow.attr("data-jsonFile");
|
129
|
-
|
130
|
-
$.getJSON(file, function( json ) {
|
131
|
-
if (val === 'all'){
|
132
|
-
for (var i in json.validations){
|
133
|
-
if (json.validations[i].graphs !== undefined) {
|
134
|
-
generatePlotCommands(json.validations[i].graphs, target);
|
135
|
-
}
|
136
|
-
}
|
137
|
-
} else {
|
138
|
-
addExplanation(target, json.validations[val]);
|
139
|
-
if (json.validations[val].graphs !== undefined) {
|
140
|
-
generatePlotCommands(json.validations[val].graphs, target);
|
141
|
-
}
|
142
|
-
}
|
143
|
-
});
|
144
|
-
}
|
145
|
-
|
146
|
-
function generatePlotCommands(graphs, target) {
|
147
|
-
for (var g = 0; g < graphs.length; g++) {
|
148
|
-
var graphData = graphs[g];
|
149
|
-
addPlot(graphData.data, target, graphData.type, graphData.title,
|
150
|
-
graphData.footer, graphData.xtitle, graphData.ytitle,
|
151
|
-
graphData.aux1, graphData.aux2);
|
152
|
-
}
|
153
|
-
}
|
154
|
-
|
155
|
-
function addExplanation(target, jsonData){
|
156
|
-
'use strict';
|
157
|
-
var row = '#row' + target;
|
158
|
-
var approach_html = '<p><b>Approach:</b> ' + jsonData.approach + '</p>';
|
159
|
-
var explanation_html = '<p><b>Explanation:</b> ' + jsonData.explanation + '</p>';
|
160
|
-
var conclusion_html = '<p><b>Conclusion:</b> ' + jsonData.conclusion + '</p>';
|
161
|
-
|
162
|
-
var explain = $('<div id="' + target + 'explanation" class="alert alert-info explanation_alert" role="alert">' +
|
163
|
-
approach_html + explanation_html + conclusion_html + '</div>');
|
164
|
-
$(row).prepend(explain);
|
165
|
-
}
|
166
|
-
|
167
|
-
function addPlot(jsonData, target, type, title, footer, xtitle, ytitle, aux1, aux2){
|
168
|
-
'use strict';
|
169
|
-
var legend;
|
170
|
-
if (footer === '') {
|
171
|
-
legend = [];
|
172
|
-
} else {
|
173
|
-
legend = footer.split(';');
|
174
|
-
}
|
175
|
-
|
176
|
-
switch(type) {
|
177
|
-
case 'scatter':
|
178
|
-
plot_scatter(jsonData, target, title, footer, xtitle, ytitle, aux1, aux2);
|
179
|
-
break;
|
180
|
-
case 'bars':
|
181
|
-
plot_bars(jsonData, target, title, legend, xtitle, ytitle, aux1);
|
182
|
-
break;
|
183
|
-
case 'simplebars':
|
184
|
-
plot_simple_bars(jsonData, target, title, legend, xtitle, ytitle);
|
185
|
-
break;
|
186
|
-
case 'lines':
|
187
|
-
if (aux2 !== null) {
|
188
|
-
aux2 = aux2.split(',');
|
189
|
-
}
|
190
|
-
plot_lines(jsonData, target, title, legend, xtitle, ytitle, aux1, aux2);
|
191
|
-
break;
|
192
|
-
case 'align':
|
193
|
-
if (aux2 !== null) {
|
194
|
-
aux2 = aux2.split(',');
|
195
|
-
}
|
196
|
-
plot_align(jsonData, target, title, legend, xtitle, ytitle, aux1, aux2);
|
197
|
-
break;
|
198
|
-
default:
|
199
|
-
break;
|
200
|
-
}
|
201
|
-
}
|
202
|
-
|
203
|
-
function color_beautification(color){
|
204
|
-
'use strict';
|
205
|
-
switch(color){
|
206
|
-
case 'red':
|
207
|
-
return d3.rgb(189,54,47);
|
208
|
-
case 'blue':
|
209
|
-
return d3.rgb(58,135,173);
|
210
|
-
case 'green':
|
211
|
-
return d3.rgb(70,136,71);
|
212
|
-
case 'yellow':
|
213
|
-
return d3.rgb(255,255,51);
|
214
|
-
case 'orange':
|
215
|
-
return d3.rgb(248,148,6);
|
216
|
-
case 'violet':
|
217
|
-
return d3.rgb(153,0,153);
|
218
|
-
case 'gray':
|
219
|
-
return d3.rgb(160,160,160);
|
220
|
-
default:
|
221
|
-
return color;
|
222
|
-
}
|
223
|
-
}
|
224
|
-
|
225
|
-
// bars plot
|
226
|
-
function plot_bars(alldata, target, title, footer, xTitle, yTitle, bar){
|
227
|
-
var margin = {top: 70, right: 50, bottom: 75, left: 50},
|
228
|
-
width = 600 - margin.left - margin.right,
|
229
|
-
height = 500 - margin.top - margin.bottom;
|
230
|
-
var legend_width = 15;
|
231
|
-
|
232
|
-
var svg = d3.select("#".concat(target)).append("svg")
|
233
|
-
.attr("width", width + margin.left + margin.right)
|
234
|
-
.attr("height", height + margin.top + margin.bottom)
|
235
|
-
.append("g")
|
236
|
-
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
237
|
-
|
238
|
-
svg.append("text")
|
239
|
-
.attr("x", (width / 2))
|
240
|
-
.attr("y", -45)
|
241
|
-
.attr("text-anchor", "middle")
|
242
|
-
.style("font-size", "16px")
|
243
|
-
.text(title);
|
244
|
-
|
245
|
-
var colors = new Array("orange", "blue", "green", "yellow", "brown");
|
246
|
-
var no_colors = colors.length;
|
247
|
-
|
248
|
-
var padding = 100;
|
249
|
-
|
250
|
-
flattened_data = [].concat.apply([], alldata);
|
251
|
-
var yMax = d3.max(flattened_data, function(d) { return d.value; }) + 3;
|
252
|
-
var y = d3.scale.linear()
|
253
|
-
.domain([0, yMax + yMax/10])
|
254
|
-
.range([height, 0]);
|
255
|
-
|
256
|
-
var xMin = d3.min(flattened_data, function(d) { return d.key; });
|
257
|
-
if (bar!=undefined){
|
258
|
-
var xMin = Math.min(xMin, bar);
|
259
|
-
}
|
260
|
-
|
261
|
-
var xMax = d3.max(flattened_data, function(d) { return d.key; });
|
262
|
-
if (bar!=undefined){
|
263
|
-
var xMax = Math.max(xMax, bar);
|
264
|
-
}
|
265
|
-
|
266
|
-
var x = d3.scale.linear()
|
267
|
-
.domain([xMin-padding, xMax+padding])
|
268
|
-
.range([13, width]);
|
269
|
-
|
270
|
-
var xAxis = d3.svg.axis()
|
271
|
-
.scale(x)
|
272
|
-
.orient("bottom")
|
273
|
-
.ticks(8);
|
274
|
-
|
275
|
-
var yAxis = d3.svg.axis()
|
276
|
-
.scale(y)
|
277
|
-
.orient("left")
|
278
|
-
.tickFormat(d3.format("d"))
|
279
|
-
.ticks(8);
|
280
|
-
|
281
|
-
svg.append("g")
|
282
|
-
.attr("class", "x axis")
|
283
|
-
.attr("transform", "translate(0," + height + ")")
|
284
|
-
.call(xAxis)
|
285
|
-
.append("text")
|
286
|
-
.attr("class", "label")
|
287
|
-
.attr("x", (width-xTitle.length)/2-50)
|
288
|
-
.attr("y", 35)
|
289
|
-
.style("text-anchor", "start")
|
290
|
-
.text(xTitle);
|
291
|
-
|
292
|
-
svg.append("g")
|
293
|
-
.attr("class", "y axis")
|
294
|
-
.call(yAxis)
|
295
|
-
.append("text")
|
296
|
-
.attr("class", "label")
|
297
|
-
.attr("transform", "rotate(-90)")
|
298
|
-
.attr("x", -(height+yTitle.length)/2-50)
|
299
|
-
.attr("y", -40)
|
300
|
-
.style("text-anchor", "start")
|
301
|
-
.text(yTitle);
|
302
|
-
|
303
|
-
alldata.map( function(data, i) {
|
304
|
-
|
305
|
-
color = colors[i % (no_colors - 1)];
|
306
|
-
svg.selectAll(".bar")
|
307
|
-
.data(data)
|
308
|
-
.enter().append("rect")
|
309
|
-
.attr("x", function(d) { return x(d.key); })
|
310
|
-
.attr("width", 6)
|
311
|
-
.attr("y", function(d) { return y(d.value); })
|
312
|
-
.attr("height", function(d) { return height - y(d.value); })
|
313
|
-
.attr("fill", function(d) { if (d.main == true) return color_beautification("red"); return color_beautification("blue");});
|
314
|
-
});
|
315
|
-
|
316
|
-
if (bar!=undefined){
|
317
|
-
svg.append("rect")
|
318
|
-
.attr("x", x(bar))
|
319
|
-
.attr("width", 4)
|
320
|
-
.attr("y", y(yMax + yMax/10))
|
321
|
-
.style("opacity",0.6)
|
322
|
-
.attr("height", height - y(yMax + yMax/8))
|
323
|
-
.attr("fill", color_beautification("black"));
|
324
|
-
|
325
|
-
svg.append("text")
|
326
|
-
.attr("transform", "rotate(-90)")
|
327
|
-
.attr("x", -yMax/10 - 35)
|
328
|
-
.attr("y", x(bar) - 5)
|
329
|
-
.text("query");
|
330
|
-
}
|
331
|
-
|
332
|
-
var offset = 0;
|
333
|
-
var total_len = 0;
|
334
|
-
for (var i = 0; i < footer.length; i++) {
|
335
|
-
var array = footer[i].split(",");
|
336
|
-
total_len = total_len + array[0].length*8 + 15;
|
337
|
-
}
|
338
|
-
|
339
|
-
for (var i = 0; i < footer.length; i++) {
|
340
|
-
|
341
|
-
var array = footer[i].split(",");
|
342
|
-
svg.append("rect")
|
343
|
-
.attr("x", (width-total_len)/2 + offset)
|
344
|
-
.attr("y", -30)
|
345
|
-
.attr("width", 10)
|
346
|
-
.attr("height", 10)
|
347
|
-
.style("fill", color_beautification(array[1].replace(/\s+/g, '')));
|
348
|
-
|
349
|
-
svg.append("text")
|
350
|
-
.attr("x", (width-total_len)/2 + offset + 15)
|
351
|
-
.attr("y", -20)
|
352
|
-
.text(array[0]);
|
353
|
-
offset = offset + array[0].length*8 + 15;
|
354
|
-
}
|
355
|
-
}
|
356
|
-
|
357
|
-
// bars plot
|
358
|
-
function plot_simple_bars(alldata, target, title, footer, xTitle, yTitle){
|
359
|
-
'use strict';
|
360
|
-
|
361
|
-
var margin = {top: 70, right: 50, bottom: 75, left: 50},
|
362
|
-
width = 600 - margin.left - margin.right,
|
363
|
-
height = 500 - margin.top - margin.bottom;
|
364
|
-
var legend_width = 15;
|
365
|
-
|
366
|
-
var svg = d3.select("#".concat(target)).append("svg")
|
367
|
-
.attr("width", width + margin.left + margin.right)
|
368
|
-
.attr("height", height + margin.top + margin.bottom)
|
369
|
-
.append("g")
|
370
|
-
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
371
|
-
|
372
|
-
svg.append("text")
|
373
|
-
.attr("x", (width / 2))
|
374
|
-
.attr("y", -45)
|
375
|
-
.attr("text-anchor", "middle")
|
376
|
-
.style("font-size", "16px")
|
377
|
-
.text(title);
|
378
|
-
|
379
|
-
var colors = new Array("orange", "blue", "green", "yellow", "brown");
|
380
|
-
var no_colors = colors.length;
|
381
|
-
|
382
|
-
var padding = 0;
|
383
|
-
|
384
|
-
var flattened_data = [].concat.apply([], alldata);
|
385
|
-
var yMax = d3.max(flattened_data, function(d) { return d.value; }) + 3;
|
386
|
-
var y = d3.scale.linear()
|
387
|
-
.domain([0, yMax])
|
388
|
-
.range([height, 0]);
|
389
|
-
|
390
|
-
var xMin = d3.min(flattened_data, function(d) { return d.key; });
|
391
|
-
var xMax = d3.max(flattened_data, function(d) { return d.key; });
|
392
|
-
|
393
|
-
var x = d3.scale.linear()
|
394
|
-
.domain([xMin-padding, xMax+padding])
|
395
|
-
.range([13, width]);
|
396
|
-
|
397
|
-
var xAxis = d3.svg.axis()
|
398
|
-
.scale(x)
|
399
|
-
.orient("bottom")
|
400
|
-
.ticks(8);
|
401
|
-
|
402
|
-
var yAxis = d3.svg.axis()
|
403
|
-
.scale(y)
|
404
|
-
.orient("left")
|
405
|
-
.tickFormat(d3.format("d"))
|
406
|
-
.ticks(8);
|
407
|
-
|
408
|
-
svg.append("g")
|
409
|
-
.attr("class", "x axis")
|
410
|
-
.attr("transform", "translate(0," + height + ")")
|
411
|
-
.call(xAxis)
|
412
|
-
.append("text")
|
413
|
-
.attr("class", "label")
|
414
|
-
.attr("x", (width-xTitle.length)/2-50)
|
415
|
-
.attr("y", 35)
|
416
|
-
.style("text-anchor", "start")
|
417
|
-
.text(xTitle);
|
418
|
-
|
419
|
-
svg.append("g")
|
420
|
-
.attr("class", "y axis")
|
421
|
-
.call(yAxis)
|
422
|
-
.append("text")
|
423
|
-
.attr("class", "label")
|
424
|
-
.attr("transform", "rotate(-90)")
|
425
|
-
.attr("x", -(height+yTitle.length)/2-50)
|
426
|
-
.attr("y", -40)
|
427
|
-
.style("text-anchor", "start")
|
428
|
-
.text(yTitle);
|
429
|
-
|
430
|
-
alldata.map( function(data, i) {
|
431
|
-
|
432
|
-
var color = colors[i % (no_colors - 1)];
|
433
|
-
|
434
|
-
svg.selectAll(".bar")
|
435
|
-
.data(data)
|
436
|
-
.enter().append("rect")
|
437
|
-
.attr("x", function(d) { return x(d.key); })
|
438
|
-
.attr("width", 6)
|
439
|
-
.attr("y", function(d) { return y(d.value); })
|
440
|
-
.attr("height", function(d) { return height - y(d.value); })
|
441
|
-
.attr("fill", function(d) { if (d.main == true) return color_beautification("red"); return color_beautification("blue");});
|
442
|
-
});
|
443
|
-
}
|
444
|
-
|
445
|
-
|
446
|
-
// scatter plot
|
447
|
-
// ecuation of the line: slope * x + yLine
|
448
|
-
function plot_scatter(data, target, title, footer, xTitle, yTitle, yLine, slope){
|
449
|
-
'use strict';
|
450
|
-
|
451
|
-
var margin = {top: 50, right: 30, bottom: 75, left: 50},
|
452
|
-
width = 500 - margin.left - margin.right,
|
453
|
-
height = 500 - margin.top - margin.bottom;
|
454
|
-
|
455
|
-
var x = d3.scale.linear()
|
456
|
-
.range([0, width]);
|
457
|
-
var y = d3.scale.linear()
|
458
|
-
.range([height, 0]);
|
459
|
-
|
460
|
-
var color = d3.scale.category10();
|
461
|
-
|
462
|
-
var xAxis = d3.svg.axis()
|
463
|
-
.scale(x)
|
464
|
-
.orient("bottom")
|
465
|
-
.ticks(8);
|
466
|
-
var yAxis = d3.svg.axis()
|
467
|
-
.scale(y)
|
468
|
-
.orient("left")
|
469
|
-
.tickFormat(d3.format("d"))
|
470
|
-
.ticks(8);
|
471
|
-
|
472
|
-
var svg = d3.select("#".concat(target)).append("svg")
|
473
|
-
.attr("width", width + margin.left + margin.right)
|
474
|
-
.attr("height", height + margin.top + margin.bottom)
|
475
|
-
.append("g")
|
476
|
-
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
477
|
-
|
478
|
-
svg.append("text")
|
479
|
-
.attr("x", (width / 2))
|
480
|
-
.attr("y", -25)
|
481
|
-
.attr("text-anchor", "middle")
|
482
|
-
.style("font-size", "16px")
|
483
|
-
.text(title);
|
484
|
-
|
485
|
-
svg.append("text")
|
486
|
-
.attr("x", (width / 2))
|
487
|
-
.attr("y", height+ 55)
|
488
|
-
.attr("text-anchor", "middle")
|
489
|
-
.style("font-size", "12px")
|
490
|
-
.text(footer);
|
491
|
-
|
492
|
-
var xMax = d3.max(data, function(d) { return d.x; });
|
493
|
-
var xMin = d3.min(data, function(d) { return d.x; });
|
494
|
-
var yMax = d3.max(data, function(d) { return d.y; });
|
495
|
-
var yMin = d3.min(data, function(d) { return d.y; });
|
496
|
-
x.domain(d3.extent(data, function(d) { return d.x; })).nice();
|
497
|
-
y.domain(d3.extent(data, function(d) { return d.y; })).nice();
|
498
|
-
|
499
|
-
svg.append("g")
|
500
|
-
.attr("class", "x axis")
|
501
|
-
.attr("transform", "translate(0," + height + ")")
|
502
|
-
.call(xAxis)
|
503
|
-
.append("text")
|
504
|
-
.attr("class", "label")
|
505
|
-
.attr("x", (width-xTitle.length)/2-50)
|
506
|
-
.attr("y", 35)
|
507
|
-
.style("text-anchor", "start")
|
508
|
-
.text(xTitle);
|
509
|
-
|
510
|
-
svg.append("g")
|
511
|
-
.attr("class", "y axis")
|
512
|
-
.call(yAxis)
|
513
|
-
.append("text")
|
514
|
-
.attr("class", "label")
|
515
|
-
.attr("transform", "rotate(-90)")
|
516
|
-
.attr("x", -(height+yTitle.length)/2-50)
|
517
|
-
.attr("y", -40)
|
518
|
-
.style("text-anchor", "start")
|
519
|
-
.text(yTitle);
|
520
|
-
|
521
|
-
svg.selectAll(".dot")
|
522
|
-
.data(data)
|
523
|
-
.enter().append("circle")
|
524
|
-
.attr("r", 2)
|
525
|
-
.attr("cx", function(d) { return x(d.x); })
|
526
|
-
.attr("cy", function(d) { return y(d.y); })
|
527
|
-
.style("fill", function(d) { return color_beautification("red"); })
|
528
|
-
.style("opacity",0.6);
|
529
|
-
|
530
|
-
if ((slope!=undefined && slope != "") && (yLine!=undefined && yLine != "")){
|
531
|
-
yLine = parseFloat(yLine.replace(",", "."));
|
532
|
-
var xMaxValue = xMax;
|
533
|
-
var yMaxValue = yLine + slope * xMax;
|
534
|
-
if (yMaxValue > yMax){
|
535
|
-
xMaxValue = (yMax-yLine)/slope;
|
536
|
-
yMaxValue = yMax;
|
537
|
-
}
|
538
|
-
|
539
|
-
if (yMaxValue < yMin){
|
540
|
-
xMaxValue = (yMin-yLine)/slope;
|
541
|
-
yMaxValue = yMin;
|
542
|
-
}
|
543
|
-
|
544
|
-
var xMinValue = xMin;
|
545
|
-
var yMinValue = yLine + slope * xMin;
|
546
|
-
if (yMinValue > yMax){
|
547
|
-
xMinValue = (yMax-yLine)/slope;
|
548
|
-
yMinValue = yMin;
|
549
|
-
}
|
550
|
-
|
551
|
-
if (yMinValue < yMin){
|
552
|
-
xMinValue = (yMin-yLine)/slope;
|
553
|
-
yMinValue = yMin;
|
554
|
-
}
|
555
|
-
|
556
|
-
svg.append("line")
|
557
|
-
.attr("x1", x(xMinValue))
|
558
|
-
.attr("y1", y(yMinValue))
|
559
|
-
.attr("x2", x(xMaxValue))
|
560
|
-
.attr("y2", y(yMaxValue))
|
561
|
-
.attr("stroke-width", 2)
|
562
|
-
.attr("stroke", "black");
|
563
|
-
}
|
564
|
-
}
|
565
|
-
|
566
|
-
// line plot
|
567
|
-
// maximum 80 lines
|
568
|
-
function plot_lines(data, target, title, footer, xTitle, yTitle, no_lines, yValues){
|
569
|
-
'use strict';
|
570
|
-
var margin = {top: 70, right: 50, bottom: 75, left: 50},
|
571
|
-
width = 600 - margin.left - margin.right,
|
572
|
-
height = 500 - margin.top - margin.bottom;
|
573
|
-
var legend_width = 17;
|
574
|
-
|
575
|
-
var x = d3.scale.linear()
|
576
|
-
.range([0, width]);
|
577
|
-
var y = d3.scale.linear()
|
578
|
-
.range([height, 0]);
|
579
|
-
|
580
|
-
var color = d3.scale.category10();
|
581
|
-
|
582
|
-
if (title === 'Open Reading Frames in all 6 Frames') {
|
583
|
-
var xAxis = d3.svg.axis()
|
584
|
-
.scale(x)
|
585
|
-
.orient("bottom")
|
586
|
-
.ticks(0);
|
587
|
-
} else {
|
588
|
-
var xAxis = d3.svg.axis()
|
589
|
-
.scale(x)
|
590
|
-
.orient("bottom")
|
591
|
-
.ticks(5);
|
592
|
-
}
|
593
|
-
|
594
|
-
var yAxis = d3.svg.axis()
|
595
|
-
.scale(y)
|
596
|
-
.orient("left")
|
597
|
-
.ticks(5);
|
598
|
-
|
599
|
-
var svg = d3.select("#".concat(target)).append("svg")
|
600
|
-
.attr("width", width + margin.left + margin.right)
|
601
|
-
.attr("height", height + margin.top + margin.bottom)
|
602
|
-
.append("g")
|
603
|
-
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
604
|
-
|
605
|
-
svg.append("text")
|
606
|
-
.attr("x", (width / 2))
|
607
|
-
.attr("y", -35)
|
608
|
-
.attr("text-anchor", "middle")
|
609
|
-
.style("font-size", "16px")
|
610
|
-
.text(title);
|
611
|
-
|
612
|
-
var idx = -1;
|
613
|
-
|
614
|
-
x.domain([0, d3.max(data, function(d) { return d.stop; })]);
|
615
|
-
y.domain(d3.extent(data, function(d) { return d.y; })).nice();
|
616
|
-
|
617
|
-
svg.append("g")
|
618
|
-
.attr("class", "x axis")
|
619
|
-
.attr("transform", "translate(0," + (height + height/no_lines) + ")")
|
620
|
-
.call(xAxis)
|
621
|
-
.append("text")
|
622
|
-
.attr("class", "label")
|
623
|
-
.attr("x", (width-xTitle.length)/2-50)
|
624
|
-
.attr("y", 35)
|
625
|
-
.style("text-anchor", "start")
|
626
|
-
.text(xTitle);
|
627
|
-
|
628
|
-
if (yValues !== null){
|
629
|
-
svg.append("g")
|
630
|
-
.attr("class", "y axis")
|
631
|
-
.call(yAxis.ticks(yValues.length)
|
632
|
-
.tickFormat(function (d) {
|
633
|
-
idx = idx + 1;
|
634
|
-
return yValues[idx];
|
635
|
-
}))
|
636
|
-
.append("text")
|
637
|
-
.attr("class", "label")
|
638
|
-
.attr("transform", "rotate(-90)")
|
639
|
-
.attr("x", -(height+yTitle.length)/2-50)
|
640
|
-
.attr("y", -40)
|
641
|
-
.style("text-anchor", "start")
|
642
|
-
.text(yTitle);
|
643
|
-
} else {
|
644
|
-
svg.append("g")
|
645
|
-
.attr("class", "y axis")
|
646
|
-
.call(yAxis)
|
647
|
-
.append("text")
|
648
|
-
.attr("class", "label")
|
649
|
-
.attr("transform", "rotate(-90)")
|
650
|
-
.attr("x", -(height+yTitle.length)/2)
|
651
|
-
.attr("y", -40)
|
652
|
-
.style("text-anchor", "start")
|
653
|
-
.text(yTitle);
|
654
|
-
}
|
655
|
-
|
656
|
-
svg.selectAll(".dot")
|
657
|
-
.data(data)
|
658
|
-
.enter().append("line")
|
659
|
-
.attr("x1", function(d) { return x(d.start); })
|
660
|
-
.attr("y1", function(d) { return y(d.y); })
|
661
|
-
.attr("x2", function(d) { return x(d.stop); })
|
662
|
-
.attr("x2", function(d) { return x(d.stop); })
|
663
|
-
.attr("y2", function(d) { return y(d.y); })
|
664
|
-
.attr("stroke-width", function(d) {
|
665
|
-
if (d.dotted == undefined) {
|
666
|
-
if (d.color == "red" ) {
|
667
|
-
return height/no_lines/2.5;
|
668
|
-
} else {
|
669
|
-
return height/no_lines;
|
670
|
-
}
|
671
|
-
} else {
|
672
|
-
return height/no_lines/5;
|
673
|
-
}
|
674
|
-
})
|
675
|
-
.style("stroke-dasharray", function(d) { if (d.dotted == undefined) return ("0, 0"); return ("2, 6");})
|
676
|
-
.attr("stroke", function(d) { return color_beautification(d.color); });
|
677
|
-
|
678
|
-
// add legend
|
679
|
-
var legend = svg.append("g")
|
680
|
-
.attr("class", "legend")
|
681
|
-
.attr("height", 100)
|
682
|
-
.attr("width", 100)
|
683
|
-
.attr('transform', 'translate(-20,50)');
|
684
|
-
|
685
|
-
var h = 0;
|
686
|
-
|
687
|
-
var offset = 40;
|
688
|
-
var total_len = 0;
|
689
|
-
for (var i = 0; i < footer.length; i++) {
|
690
|
-
var array = footer[i].split(",");
|
691
|
-
total_len = total_len + array[0].length*8 + 15;
|
692
|
-
}
|
693
|
-
|
694
|
-
for (var i = 0; i < footer.length; i++) {
|
695
|
-
var array = footer[i].split(",");
|
696
|
-
svg.append("rect")
|
697
|
-
.attr("x", (width-total_len)/2 + offset)
|
698
|
-
.attr("y", -30)
|
699
|
-
.attr("width", 10)
|
700
|
-
.attr("height", 10)
|
701
|
-
.style("fill", color_beautification(array[1].replace(/\s+/g, '')));
|
702
|
-
|
703
|
-
svg.append("text")
|
704
|
-
.attr("x", (width-total_len)/2 + offset + 15)
|
705
|
-
.attr("y", -20)
|
706
|
-
.text(array[0]);
|
707
|
-
offset = offset + array[0].length*8 + 15;
|
708
|
-
}
|
709
|
-
}
|
710
|
-
|
711
|
-
// line plot
|
712
|
-
// maximum 80 lines
|
713
|
-
function plot_align(data, target, title, footer, xTitle, yTitle, no_lines, yValues){
|
714
|
-
'use strict';
|
715
|
-
|
716
|
-
var margin = {top: 75, right: 50, bottom: 75, left: 150},
|
717
|
-
width = 600 - margin.left - margin.right,
|
718
|
-
height = 300 - margin.top - margin.bottom;
|
719
|
-
var legend_width = 17;
|
720
|
-
|
721
|
-
var x = d3.scale.linear()
|
722
|
-
.range([0, width]);
|
723
|
-
var y = d3.scale.linear()
|
724
|
-
.range([height, 0]);
|
725
|
-
|
726
|
-
var color = d3.scale.category10();
|
727
|
-
|
728
|
-
var xAxis = d3.svg.axis()
|
729
|
-
.scale(x)
|
730
|
-
.orient("bottom")
|
731
|
-
.ticks(5);
|
732
|
-
|
733
|
-
var yAxis = d3.svg.axis()
|
734
|
-
.scale(y)
|
735
|
-
.orient("left")
|
736
|
-
.ticks(5);
|
737
|
-
|
738
|
-
var svg = d3.select("#".concat(target)).append("svg")
|
739
|
-
.style("vertical-align", "top")
|
740
|
-
.attr("width", width + margin.left + margin.right)
|
741
|
-
.attr("height", height + margin.top + margin.bottom)
|
742
|
-
.append("g")
|
743
|
-
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
744
|
-
|
745
|
-
svg.append("text")
|
746
|
-
.attr("x", (width / 2))
|
747
|
-
.attr("y", -35)
|
748
|
-
.attr("text-anchor", "middle")
|
749
|
-
.style("font-size", "16px")
|
750
|
-
.text(title);
|
751
|
-
|
752
|
-
var idx = -1;
|
753
|
-
|
754
|
-
x.domain([0, d3.max(data, function(d) { return d.stop; })]);
|
755
|
-
y.domain(d3.extent(data, function(d) { return d.y; })).nice();
|
756
|
-
|
757
|
-
svg.append("g")
|
758
|
-
.attr("class", "x axis")
|
759
|
-
.attr("transform", "translate(0," + (height+height/no_lines) + ")")
|
760
|
-
.call(xAxis)
|
761
|
-
.append("text")
|
762
|
-
.attr("class", "label")
|
763
|
-
.attr("x", (width-xTitle.length)/2-50)
|
764
|
-
.attr("y", 35)
|
765
|
-
.style("text-anchor", "start")
|
766
|
-
.text(xTitle);
|
767
|
-
|
768
|
-
if (yValues !== null){
|
769
|
-
svg.append("g")
|
770
|
-
.attr("class", "y axis")
|
771
|
-
.call(yAxis.ticks(yValues.length)
|
772
|
-
.tickFormat(function (d) {
|
773
|
-
idx = idx + 1;
|
774
|
-
return yValues[idx];
|
775
|
-
}))
|
776
|
-
.append("text")
|
777
|
-
.attr("class", "label")
|
778
|
-
.attr("transform", "rotate(-90)")
|
779
|
-
.attr("x", -(height+yTitle.length)/2-50)
|
780
|
-
.attr("y", -40)
|
781
|
-
.style("text-anchor", "start")
|
782
|
-
.text(yTitle);
|
783
|
-
} else {
|
784
|
-
svg.append("g")
|
785
|
-
.attr("class", "y axis")
|
786
|
-
.call(yAxis)
|
787
|
-
.append("text")
|
788
|
-
.attr("class", "label")
|
789
|
-
.attr("transform", "rotate(-90)")
|
790
|
-
.attr("x", -(height+yTitle.length)/2-50)
|
791
|
-
.attr("y", -40)
|
792
|
-
.style("text-anchor", "start")
|
793
|
-
.text(yTitle);
|
794
|
-
}
|
795
|
-
|
796
|
-
svg.selectAll(".dot")
|
797
|
-
.data(data)
|
798
|
-
.enter().append("line")
|
799
|
-
.attr("x1", function(d) { return x(d.start); })
|
800
|
-
.attr("y1", function(d) { return y(d.y); })
|
801
|
-
.attr("x2", function(d) { return x(d.stop); })
|
802
|
-
.attr("y2", function(d) { return y(d.y); })
|
803
|
-
.attr("stroke-width", function(d) { if (d.height == -1) return height/no_lines; return (height/no_lines * d.height) ; })
|
804
|
-
.attr("stroke", function(d) { return color_beautification(d.color); });
|
805
|
-
|
806
|
-
var offset = 0;
|
807
|
-
var total_len = 0;
|
808
|
-
for (var i = 0; i < footer.length; i++) {
|
809
|
-
var array = footer[i].split(",");
|
810
|
-
total_len = total_len + array[0].length*8 + 15;
|
811
|
-
}
|
812
|
-
|
813
|
-
for (var i = 0; i < footer.length; i++) {
|
814
|
-
var array = footer[i].split(",");
|
815
|
-
svg.append("rect")
|
816
|
-
.attr("x", (width-total_len)/2 + offset)
|
817
|
-
.attr("y", -30)
|
818
|
-
.attr("width", 10)
|
819
|
-
.attr("height", 10)
|
820
|
-
.style("fill", color_beautification(array[1].replace(/\s+/g, '')));
|
821
|
-
|
822
|
-
svg.append("text")
|
823
|
-
.attr("x", (width-total_len)/2 + offset + 15)
|
824
|
-
.attr("y", -20)
|
825
|
-
.text(array[0]);
|
826
|
-
offset = offset + array[0].length*8 + 15;
|
827
|
-
}
|
828
|
-
}
|