quorum 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rspec +1 -0
- data/.travis.yml +5 -1
- data/Gemfile +4 -2
- data/Gemfile.lock +68 -47
- data/HISTORY.md +9 -0
- data/README.rdoc +1 -1
- data/app/assets/javascripts/quorum/quorum.js +4 -4
- data/app/controllers/quorum/application_controller.rb +1 -0
- data/app/controllers/quorum/jobs_controller.rb +65 -80
- data/app/models/quorum/blastn_job.rb +1 -1
- data/app/models/quorum/blastn_job_report.rb +4 -1
- data/app/models/quorum/blastp_job.rb +1 -1
- data/app/models/quorum/blastp_job_report.rb +4 -1
- data/app/models/quorum/blastx_job.rb +1 -1
- data/app/models/quorum/blastx_job_report.rb +4 -1
- data/app/models/quorum/job.rb +64 -56
- data/app/models/quorum/job_data.rb +22 -0
- data/app/models/quorum/job_fetch_data.rb +11 -0
- data/app/models/quorum/job_queue_observer.rb +11 -0
- data/app/models/quorum/job_queue_service.rb +66 -0
- data/app/models/quorum/job_report_searcher.rb +36 -0
- data/app/models/quorum/job_serializer.rb +96 -0
- data/app/models/quorum/tblastn_job.rb +1 -1
- data/app/models/quorum/tblastn_job_report.rb +4 -1
- data/app/views/quorum/jobs/show.html.erb +3 -0
- data/app/views/quorum/jobs/templates/_blast_detailed_report_template.html.erb +1 -1
- data/app/views/quorum/jobs/templates/_blast_template.html.erb +3 -1
- data/config/initializers/mime_types.rb +2 -0
- data/config/routes.rb +3 -3
- data/db/migrate/20120809155712_add_percent_identity_to_blast_reports.rb +8 -0
- data/db/migrate/20120921182416_add_mismatch_to_blast_reports.rb +8 -0
- data/lib/generators/templates/blast.rb +8 -1
- data/lib/quorum/engine.rb +2 -0
- data/lib/quorum/sequence.rb +35 -0
- data/lib/quorum/version.rb +1 -1
- data/lib/quorum.rb +3 -10
- data/lib/tasks/quorum_blastdb_build.rake +3 -1
- data/lib/workers/system.rb +3 -1
- data/quorum.gemspec +1 -0
- data/spec/dummy/config/environment.rb +18 -5
- data/spec/javascripts/helpers/jasmine-jquery.js +2 -2
- data/spec/javascripts/{jobs_spec.js → suites/jobs_spec.js} +0 -0
- data/spec/javascripts/{quorum_spec.js → suites/quorum_spec.js} +0 -0
- data/spec/javascripts/{string_spec.js → suites/string_spec.js} +0 -0
- data/spec/lib/tasks/travis.rake +9 -4
- data/spec/models/blastn_job_report_spec.rb +7 -3
- data/spec/models/blastp_job_report_spec.rb +8 -3
- data/spec/models/blastx_job_report_spec.rb +8 -3
- data/spec/models/job_data_spec.rb +21 -0
- data/spec/models/job_fetch_data_spec.rb +25 -0
- data/spec/models/job_queue_observer_spec.rb +18 -0
- data/spec/models/job_queue_service_spec.rb +49 -0
- data/spec/models/job_report_searcher_spec.rb +47 -0
- data/spec/models/job_serializer_spec.rb +60 -0
- data/spec/models/job_spec.rb +1 -16
- data/spec/models/tblastn_job_report_spec.rb +8 -3
- data/spec/quorum/quorum_sequence_spec.rb +2 -0
- data/spec/requests/jobs_spec.rb +16 -7
- data/spec/spec_helper.rb +2 -0
- metadata +38 -8
- data/spec/dummy/app/models/blast.rb +0 -2
data/app/models/quorum/job.rb
CHANGED
@@ -3,8 +3,6 @@ module Quorum
|
|
3
3
|
|
4
4
|
include Quorum::Sequence
|
5
5
|
|
6
|
-
after_save :queue_workers
|
7
|
-
|
8
6
|
has_one :blastn_job, :dependent => :destroy
|
9
7
|
has_many :blastn_job_reports, :through => :blastn_job,
|
10
8
|
:dependent => :destroy
|
@@ -34,33 +32,72 @@ module Quorum
|
|
34
32
|
validate :filter_input_sequences, :algorithm_selected, :sequence_size
|
35
33
|
|
36
34
|
#
|
37
|
-
#
|
38
|
-
# return worker's meta_id.
|
35
|
+
# Return search results (Resque worker results).
|
39
36
|
#
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
37
|
+
def self.search(params)
|
38
|
+
data = JobData.new
|
39
|
+
|
40
|
+
# Allow for multiple algos and search params.
|
41
|
+
# Ex: /quorum/jobs/:id/search?algo=blastn,blastp
|
42
|
+
if params[:algo]
|
43
|
+
params[:algo].split(",").each do |a|
|
44
|
+
if Quorum::SUPPORTED_ALGORITHMS.include?(a)
|
45
|
+
enqueued = "#{a}_job".to_sym
|
46
|
+
report = "#{a}_job_reports".to_sym
|
47
|
+
begin
|
48
|
+
job = Job.find(params[:id])
|
49
|
+
rescue ActiveRecord::RecordNotFound => e
|
50
|
+
logger.error e.message
|
51
|
+
else
|
52
|
+
if job.try(enqueued).present?
|
53
|
+
if job.try(report).present?
|
54
|
+
data.results << job.try(report).search(a, params).default_order
|
55
|
+
else
|
56
|
+
data = JobData.new
|
57
|
+
end
|
58
|
+
else
|
59
|
+
data.not_enqueued
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
else
|
65
|
+
data.no_results
|
66
|
+
end
|
56
67
|
|
57
|
-
data
|
58
|
-
|
59
|
-
Quorum.blast_ssh_host, Quorum.blast_ssh_user,
|
60
|
-
Quorum.blast_ssh_options, true
|
61
|
-
)
|
68
|
+
data.results
|
69
|
+
end
|
62
70
|
|
63
|
-
|
71
|
+
#
|
72
|
+
# Fetch Blast hit_id, hit_display_id, queue Resque worker and
|
73
|
+
# return worker's meta_id.
|
74
|
+
#
|
75
|
+
def self.set_blast_hit_sequence_lookup_values(params)
|
76
|
+
fetch_data = JobFetchData.new
|
77
|
+
algo = params[:algo]
|
78
|
+
algo_id = params[:algo_id]
|
79
|
+
|
80
|
+
if Quorum::SUPPORTED_ALGORITHMS.include?(algo)
|
81
|
+
fetch_data.algo = algo
|
82
|
+
begin
|
83
|
+
job = Job.find(params[:id])
|
84
|
+
rescue ActiveRecord::RecordNotFound => e
|
85
|
+
logger.error e.message
|
86
|
+
else
|
87
|
+
algo_job = "#{algo}_job".to_sym
|
88
|
+
algo_job_reports = "#{algo}_job_reports".to_sym
|
89
|
+
|
90
|
+
fetch_data.blast_dbs = job.try(algo_job).blast_dbs
|
91
|
+
|
92
|
+
job_report = job.try(algo_job_reports).where(
|
93
|
+
"quorum_#{algo}_job_reports.id = ?", algo_id
|
94
|
+
).first
|
95
|
+
|
96
|
+
fetch_data.hit_id = job_report.hit_id
|
97
|
+
fetch_data.hit_display_id = job_report.hit_display_id
|
98
|
+
end
|
99
|
+
end
|
100
|
+
fetch_data
|
64
101
|
end
|
65
102
|
|
66
103
|
#
|
@@ -84,7 +121,7 @@ module Quorum
|
|
84
121
|
# Ensure the sequences are in plain text.
|
85
122
|
begin
|
86
123
|
ActiveSupport::Multibyte::Unicode.u_unpack(self.sequence)
|
87
|
-
rescue
|
124
|
+
rescue Exception => e
|
88
125
|
logger.error e.message
|
89
126
|
errors.add(
|
90
127
|
:sequence,
|
@@ -164,34 +201,5 @@ module Quorum
|
|
164
201
|
end
|
165
202
|
end
|
166
203
|
|
167
|
-
#
|
168
|
-
# Queue Resque workers.
|
169
|
-
#
|
170
|
-
def queue_workers
|
171
|
-
jobs = []
|
172
|
-
if self.blastn_job && self.blastn_job.queue
|
173
|
-
jobs << Workers::System.create_search_command("blastn", self.id)
|
174
|
-
end
|
175
|
-
if self.blastx_job && self.blastx_job.queue
|
176
|
-
jobs << Workers::System.create_search_command("blastx", self.id)
|
177
|
-
end
|
178
|
-
if self.tblastn_job && self.tblastn_job.queue
|
179
|
-
jobs << Workers::System.create_search_command("tblastn", self.id)
|
180
|
-
end
|
181
|
-
if self.blastp_job && self.blastp_job.queue
|
182
|
-
jobs << Workers::System.create_search_command("blastp", self.id)
|
183
|
-
end
|
184
|
-
|
185
|
-
unless jobs.blank?
|
186
|
-
jobs.each do |j|
|
187
|
-
Workers::System.enqueue(
|
188
|
-
j, Quorum.blast_remote,
|
189
|
-
Quorum.blast_ssh_host, Quorum.blast_ssh_user,
|
190
|
-
Quorum.blast_ssh_options
|
191
|
-
)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
204
|
end
|
197
205
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Quorum
|
2
|
+
class JobData
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@data = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def results
|
9
|
+
@data
|
10
|
+
end
|
11
|
+
|
12
|
+
def no_results
|
13
|
+
@data = [{ results: false }]
|
14
|
+
end
|
15
|
+
|
16
|
+
def not_enqueued
|
17
|
+
no_results
|
18
|
+
@data = [{ enqueued: false }.merge(@data[0])]
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Quorum
|
2
|
+
class JobQueueService
|
3
|
+
|
4
|
+
#
|
5
|
+
# Queue search workers.
|
6
|
+
#
|
7
|
+
def self.queue_search_workers(job)
|
8
|
+
blast_jobs = []
|
9
|
+
if job.blastn_job && job.blastn_job.queue
|
10
|
+
blast_jobs << Workers::System.create_search_command("blastn", job.id)
|
11
|
+
end
|
12
|
+
if job.blastx_job && job.blastx_job.queue
|
13
|
+
blast_jobs << Workers::System.create_search_command("blastx", job.id)
|
14
|
+
end
|
15
|
+
if job.tblastn_job && job.tblastn_job.queue
|
16
|
+
blast_jobs << Workers::System.create_search_command("tblastn", job.id)
|
17
|
+
end
|
18
|
+
if job.blastp_job && job.blastp_job.queue
|
19
|
+
blast_jobs << Workers::System.create_search_command("blastp", job.id)
|
20
|
+
end
|
21
|
+
|
22
|
+
unless blast_jobs.blank?
|
23
|
+
blast_jobs.each do |b|
|
24
|
+
Workers::System.enqueue(
|
25
|
+
b,
|
26
|
+
Quorum.blast_remote,
|
27
|
+
Quorum.blast_ssh_host,
|
28
|
+
Quorum.blast_ssh_user,
|
29
|
+
Quorum.blast_ssh_options
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Queue fetch worker to send blast hit sequence. Return job meta_id for
|
37
|
+
# for data access.
|
38
|
+
#
|
39
|
+
# See JobsController#send_blast_hit_sequence for more info.
|
40
|
+
#
|
41
|
+
def self.queue_fetch_worker(fetch_data)
|
42
|
+
unless fetch_data.valid?
|
43
|
+
return nil
|
44
|
+
end
|
45
|
+
|
46
|
+
cmd = Workers::System.create_blast_fetch_command(
|
47
|
+
fetch_data.blast_dbs,
|
48
|
+
fetch_data.hit_id,
|
49
|
+
fetch_data.hit_display_id,
|
50
|
+
fetch_data.algo
|
51
|
+
)
|
52
|
+
|
53
|
+
data = Workers::System.enqueue(
|
54
|
+
cmd,
|
55
|
+
Quorum.blast_remote,
|
56
|
+
Quorum.blast_ssh_host,
|
57
|
+
Quorum.blast_ssh_user,
|
58
|
+
Quorum.blast_ssh_options,
|
59
|
+
true
|
60
|
+
)
|
61
|
+
|
62
|
+
[{ meta_id: data.meta_id }]
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Quorum
|
2
|
+
module JobReportSearcher
|
3
|
+
|
4
|
+
#
|
5
|
+
# Simple search interface on query, id and job id for job reports.
|
6
|
+
#
|
7
|
+
def search(algo, params)
|
8
|
+
algo.downcase!
|
9
|
+
klass = "quorum/#{algo}_job_report".camelize.constantize
|
10
|
+
if params[:"#{algo}_id"].present? && params[:query].present?
|
11
|
+
klass.where(
|
12
|
+
"quorum_#{algo}_job_reports.id IN (?) AND query = ? " <<
|
13
|
+
"AND #{algo}_job_id = ?",
|
14
|
+
params[:"#{algo}_id"].split(","),
|
15
|
+
params[:query],
|
16
|
+
params[:id]
|
17
|
+
)
|
18
|
+
elsif params[:"#{algo}_id"].present?
|
19
|
+
klass.where(
|
20
|
+
"quorum_#{algo}_job_reports.id IN (?) AND #{algo}_job_id = ? ",
|
21
|
+
params[:"#{algo}_id"].split(","),
|
22
|
+
params[:id]
|
23
|
+
)
|
24
|
+
elsif params[:query].present?
|
25
|
+
klass.where(
|
26
|
+
"query = ? AND #{algo}_job_id = ?",
|
27
|
+
params[:query],
|
28
|
+
params[:id]
|
29
|
+
)
|
30
|
+
else
|
31
|
+
klass.where("#{algo}_job_id = ?", params[:id])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Quorum
|
2
|
+
module JobSerializer
|
3
|
+
|
4
|
+
#
|
5
|
+
# Convert jobs to json. Uses Rails default.
|
6
|
+
#
|
7
|
+
def self.as_json(job)
|
8
|
+
if job.respond_to?(:errors) && job.errors.present?
|
9
|
+
{ errors: job.errors.full_messages }
|
10
|
+
else
|
11
|
+
job.as_json(root: false)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# Convert jobs to tab delimited output.
|
17
|
+
#
|
18
|
+
def self.as_txt(job)
|
19
|
+
txt = ""
|
20
|
+
values = [
|
21
|
+
"query",
|
22
|
+
"hit_display_id",
|
23
|
+
"pct_identity",
|
24
|
+
"align_len",
|
25
|
+
"mismatch",
|
26
|
+
"gaps",
|
27
|
+
"query_from",
|
28
|
+
"query_to",
|
29
|
+
"hit_from",
|
30
|
+
"hit_to",
|
31
|
+
"evalue",
|
32
|
+
"bit_score"
|
33
|
+
]
|
34
|
+
|
35
|
+
job.each do |j|
|
36
|
+
txt << j.attributes.values_at(*values).join("\t") << "\n"
|
37
|
+
end
|
38
|
+
txt
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# Convert jobs to GFF.
|
43
|
+
#
|
44
|
+
def self.as_gff(job)
|
45
|
+
pragma = "##gff-version 3\n"
|
46
|
+
source = "."
|
47
|
+
type = "match"
|
48
|
+
phase = "."
|
49
|
+
txt = ""
|
50
|
+
job.each do |j|
|
51
|
+
if j.results
|
52
|
+
# Add sequence-region.
|
53
|
+
unless pragma.include?(j.hit_display_id)
|
54
|
+
pragma << "##sequence-region #{j.hit_display_id} 1 #{j.hit_len}\n"
|
55
|
+
end
|
56
|
+
|
57
|
+
start, stop = j.hit_from, j.hit_to
|
58
|
+
|
59
|
+
# Set the strand based on the original start, stop.
|
60
|
+
start > stop ? strand = "-" : strand = "+"
|
61
|
+
# Format the start, stop for GFF.
|
62
|
+
start, stop = format_hit_start_stop(start, stop)
|
63
|
+
|
64
|
+
values = [
|
65
|
+
j.hit_display_id,
|
66
|
+
source,
|
67
|
+
type,
|
68
|
+
start,
|
69
|
+
stop,
|
70
|
+
j.evalue,
|
71
|
+
strand,
|
72
|
+
phase
|
73
|
+
]
|
74
|
+
|
75
|
+
txt << values.join("\t") << "\tTarget=#{j.query} " <<
|
76
|
+
"#{j.query_from} #{j.query_to};Name=#{j.query};" <<
|
77
|
+
"identity=#{j.pct_identity};rawscore=#{j.score};" <<
|
78
|
+
"significance=#{j.evalue}\n"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
txt.insert(0, pragma)
|
82
|
+
end
|
83
|
+
|
84
|
+
#
|
85
|
+
# Start must be <= to stop.
|
86
|
+
#
|
87
|
+
def self.format_hit_start_stop(start, stop)
|
88
|
+
tmp_start, tmp_stop = start, stop
|
89
|
+
if start > stop
|
90
|
+
tmp_start, tmp_stop = stop, start
|
91
|
+
end
|
92
|
+
return tmp_start, tmp_stop
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
@@ -17,7 +17,7 @@ module Quorum
|
|
17
17
|
:blast_dbs
|
18
18
|
|
19
19
|
validates_format_of :expectation,
|
20
|
-
:with =>
|
20
|
+
:with => /\A[+-]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\z/,
|
21
21
|
:message => " - Valid formats (12, 32.05, 43e-123)",
|
22
22
|
:allow_blank => true
|
23
23
|
validates_numericality_of :max_target_seqs,
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module Quorum
|
2
2
|
class TblastnJobReport < ActiveRecord::Base
|
3
|
+
|
4
|
+
extend Quorum::JobReportSearcher
|
5
|
+
|
3
6
|
belongs_to :tblastn_job
|
4
7
|
scope :default_order, order("query ASC, bit_score DESC")
|
5
|
-
|
8
|
+
|
6
9
|
end
|
7
10
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
<%# Blast Results Template %>
|
2
2
|
<script type="text/template" id="blast_template">
|
3
|
-
{{ if (data[0].
|
3
|
+
{{ if (data[0].enqueued === false) { }}
|
4
|
+
<p><strong>Not enqueued.</strong></p>
|
5
|
+
{{ } else if (data[0].results === false) { }}
|
4
6
|
<p><strong>Your search returned 0 hits.</strong></p>
|
5
7
|
{{ } else { }}
|
6
8
|
<table class="results">
|
data/config/routes.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Quorum::Engine.routes.draw do
|
2
2
|
resources :jobs, :only => [:index, :show, :new, :create] do
|
3
3
|
member do
|
4
|
-
get :
|
5
|
-
get :
|
6
|
-
get :
|
4
|
+
get :search, :defaults => { :format => 'json' }
|
5
|
+
get :get_blast_hit_sequence, :defaults => { :format => 'json' }
|
6
|
+
get :send_blast_hit_sequence
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class AddPercentIdentityToBlastReports < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :quorum_blastn_job_reports, :pct_identity, :float
|
4
|
+
add_column :quorum_blastx_job_reports, :pct_identity, :float
|
5
|
+
add_column :quorum_tblastn_job_reports, :pct_identity, :float
|
6
|
+
add_column :quorum_blastp_job_reports, :pct_identity, :float
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class AddMismatchToBlastReports < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :quorum_blastn_job_reports, :mismatch, :integer
|
4
|
+
add_column :quorum_blastx_job_reports, :mismatch, :integer
|
5
|
+
add_column :quorum_tblastn_job_reports, :mismatch, :integer
|
6
|
+
add_column :quorum_blastp_job_reports, :mismatch, :integer
|
7
|
+
end
|
8
|
+
end
|
@@ -364,12 +364,19 @@ module Quorum
|
|
364
364
|
@data[:hseq] = hsp.hseq
|
365
365
|
@data[:midline] = hsp.midline
|
366
366
|
|
367
|
+
# Calculate percent identity
|
368
|
+
@data[:pct_identity] = (
|
369
|
+
@data[:identity].to_f / @data[:align_len].to_f
|
370
|
+
) * 100
|
371
|
+
|
372
|
+
# Calculate mismatch
|
373
|
+
@data[:mismatch] = @data[:align_len] - @data[:identity]
|
374
|
+
|
367
375
|
if @data[:bit_score] &&
|
368
376
|
(@data[:bit_score].to_i > @min_score.to_i)
|
369
377
|
@results = true
|
370
378
|
save_hsp_results
|
371
379
|
end
|
372
|
-
|
373
380
|
end
|
374
381
|
end
|
375
382
|
end
|
data/lib/quorum/engine.rb
CHANGED
data/lib/quorum/sequence.rb
CHANGED
@@ -86,5 +86,40 @@ module Quorum
|
|
86
86
|
type
|
87
87
|
end
|
88
88
|
|
89
|
+
|
90
|
+
#
|
91
|
+
# Send sequence data to the browser.
|
92
|
+
#
|
93
|
+
module SendSequence
|
94
|
+
|
95
|
+
def sequence(data)
|
96
|
+
@data = data
|
97
|
+
if @data.respond_to?(:succeeded?) && @data.succeeded?
|
98
|
+
if self.has_error?
|
99
|
+
return self.render_error
|
100
|
+
else
|
101
|
+
return send_data @data.result,
|
102
|
+
:filename => @data.meta_id,
|
103
|
+
:type => "text/plain",
|
104
|
+
:disposition => "attachment"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
self.render_empty
|
108
|
+
end
|
109
|
+
|
110
|
+
def has_error?
|
111
|
+
@data.result.downcase.include?("error")
|
112
|
+
end
|
113
|
+
|
114
|
+
def render_error
|
115
|
+
render :text => @data.result
|
116
|
+
end
|
117
|
+
|
118
|
+
def render_empty
|
119
|
+
render :text => ""
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
89
124
|
end
|
90
125
|
end
|
data/lib/quorum/version.rb
CHANGED
data/lib/quorum.rb
CHANGED
@@ -11,16 +11,15 @@ require "workers/system"
|
|
11
11
|
module Quorum
|
12
12
|
|
13
13
|
## Supported Algorithms ##
|
14
|
-
BLAST_ALGORITHMS
|
14
|
+
BLAST_ALGORITHMS = ["blastn", "blastx", "blastp", "tblastn"].freeze
|
15
|
+
SUPPORTED_ALGORITHMS = [BLAST_ALGORITHMS]
|
16
|
+
SUPPORTED_ALGORITHMS.flatten!
|
15
17
|
|
16
18
|
mattr_accessor :max_sequence_size, :blast_remote, :blast_ssh_host,
|
17
19
|
:blast_ssh_user, :blast_ssh_options, :blast_bin,
|
18
20
|
:blast_log_dir, :blast_tmp_dir, :blast_db, :tblastn,
|
19
21
|
:blastp, :blastn, :blastx, :blast_threads
|
20
22
|
|
21
|
-
## Deprecated ##
|
22
|
-
mattr_accessor :blast_script
|
23
|
-
|
24
23
|
class << self
|
25
24
|
|
26
25
|
## General ##
|
@@ -97,12 +96,6 @@ module Quorum
|
|
97
96
|
@@blast_threads || 1
|
98
97
|
end
|
99
98
|
|
100
|
-
## Blast Deprecated ##
|
101
|
-
|
102
|
-
def blast_script
|
103
|
-
nil
|
104
|
-
end
|
105
|
-
|
106
99
|
end
|
107
100
|
|
108
101
|
end
|
@@ -40,7 +40,9 @@ namespace :quorum do
|
|
40
40
|
args[:nucl_file] = "NULL" if args[:type] == "prot"
|
41
41
|
args[:prot_file] = "NULL" if args[:type] == "nucl"
|
42
42
|
|
43
|
-
|
43
|
+
unless args[:empty]
|
44
|
+
puts "Building your Blast database(s). This may take a while..."
|
45
|
+
end
|
44
46
|
|
45
47
|
build = Quorum::BuildBlastDB.new(args)
|
46
48
|
build.build_blast_db_data
|
data/lib/workers/system.rb
CHANGED
@@ -94,8 +94,10 @@ module Workers
|
|
94
94
|
def self.create_search_command(algo, id)
|
95
95
|
# System command
|
96
96
|
cmd = ""
|
97
|
+
return cmd unless Quorum::SUPPORTED_ALGORITHMS.include?(algo)
|
97
98
|
|
98
|
-
|
99
|
+
case
|
100
|
+
when Quorum::BLAST_ALGORITHMS.include?(algo)
|
99
101
|
search = File.join(Quorum.blast_bin, "search")
|
100
102
|
cmd << "#{search} -l #{Quorum.blast_log_dir} " <<
|
101
103
|
"-m #{Quorum.blast_tmp_dir} -b #{Quorum.blast_db} " <<
|
data/quorum.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency "bio-blastxmlparser", "~> 1.1.0"
|
24
24
|
|
25
25
|
s.add_development_dependency "mysql2", "~> 0.3.11"
|
26
|
+
s.add_development_dependency "pg", "~> 0.14.1"
|
26
27
|
s.add_development_dependency "rspec-rails", "~> 2.11"
|
27
28
|
s.add_development_dependency "resque_spec", "~> 0.12"
|
28
29
|
s.add_development_dependency "capybara", "~> 1.1"
|
@@ -4,17 +4,30 @@ require File.expand_path('../application', __FILE__)
|
|
4
4
|
# Initialize the rails application
|
5
5
|
Dummy::Application.initialize!
|
6
6
|
|
7
|
-
## Explicitly remove AR transactions during tests ##
|
7
|
+
## Explicitly remove MySQL AR transactions during tests ##
|
8
8
|
if Rails.env.test?
|
9
9
|
# Force the loading of AR stuff
|
10
10
|
ActiveRecord::Base.connection.execute('SELECT 1')
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
if ENV['DB'] == 'mysql'
|
13
|
+
# Remove transactions
|
14
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter.class_eval do
|
15
|
+
def begin_db_transaction
|
16
|
+
end
|
17
|
+
|
18
|
+
def commit_db_transaction
|
19
|
+
end
|
15
20
|
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if ENV['DB'] == 'postgresql'
|
24
|
+
# Remove transactions
|
25
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
26
|
+
def begin_db_transaction
|
27
|
+
end
|
16
28
|
|
17
|
-
|
29
|
+
def commit_db_transaction
|
30
|
+
end
|
18
31
|
end
|
19
32
|
end
|
20
33
|
end
|