quorum 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/Gemfile.lock +82 -74
  2. data/HISTORY.md +9 -0
  3. data/README.rdoc +101 -23
  4. data/app/assets/javascripts/quorum/jobs.js +45 -3
  5. data/app/controllers/quorum/jobs_controller.rb +47 -2
  6. data/app/models/quorum/job.rb +52 -9
  7. data/app/views/quorum/jobs/new.html.erb +7 -6
  8. data/app/views/quorum/jobs/show.html.erb +7 -118
  9. data/app/views/quorum/jobs/templates/_blast_detailed_report_template.html.erb +53 -0
  10. data/app/views/quorum/jobs/templates/_blast_template.html.erb +68 -0
  11. data/config/routes.rb +2 -0
  12. data/db/migrate/20120109232446_add_hit_display_id_to_blast_reports.rb +8 -0
  13. data/lib/generators/quorum/images_generator.rb +18 -0
  14. data/lib/generators/quorum/install_generator.rb +41 -13
  15. data/lib/generators/templates/README +1 -1
  16. data/lib/generators/templates/blast.rb +18 -7
  17. data/lib/generators/templates/blast_db.rb +106 -0
  18. data/lib/generators/templates/fetch +115 -0
  19. data/lib/generators/templates/quorum_initializer.rb +1 -1
  20. data/lib/generators/templates/quorum_settings.yml +4 -4
  21. data/lib/quorum/helpers.rb +71 -1
  22. data/lib/quorum/version.rb +1 -1
  23. data/lib/quorum.rb +15 -5
  24. data/lib/workers/quorum.rb +12 -2
  25. data/quorum.gemspec +4 -2
  26. data/spec/data/seqs_not_fa.txt +16 -16
  27. data/spec/dummy/config/initializers/quorum_initializer.rb +1 -1
  28. data/spec/dummy/config/initializers/resque.rb +4 -1
  29. data/spec/dummy/config/quorum_settings.yml +4 -4
  30. data/spec/dummy/db/schema.rb +8 -1
  31. data/spec/dummy/quorum/bin/fetch +115 -0
  32. data/spec/dummy/quorum/blastdb/test.nin +0 -0
  33. data/spec/dummy/quorum/blastdb/test.pin +0 -0
  34. data/spec/dummy/quorum/lib/fetch_tools/blast_db.rb +106 -0
  35. data/spec/dummy/quorum/lib/search_tools/blast.rb +18 -7
  36. data/spec/models/job_spec.rb +3 -4
  37. data/spec/quorum_installed_spec.rb +5 -0
  38. data/spec/requests/jobs_spec.rb +14 -1
  39. data/spec/spec_helper.rb +32 -1
  40. data/spec/support/streams.rb +16 -0
  41. data/spec/templates/blast_db_spec.rb +63 -0
  42. data/spec/templates/blast_spec.rb +108 -2
  43. metadata +64 -37
  44. /data/app/assets/images/quorum/{knight_rider.gif → loading.gif} +0 -0
  45. /data/app/views/quorum/jobs/{_blastn_form.html.erb → form/_blastn_form.html.erb} +0 -0
  46. /data/app/views/quorum/jobs/{_blastp_form.html.erb → form/_blastp_form.html.erb} +0 -0
  47. /data/app/views/quorum/jobs/{_blastx_form.html.erb → form/_blastx_form.html.erb} +0 -0
  48. /data/app/views/quorum/jobs/{_tblastn_form.html.erb → form/_tblastn_form.html.erb} +0 -0
@@ -33,6 +33,34 @@ module Quorum
33
33
 
34
34
  validate :filter_input_sequences, :algorithm_selected
35
35
 
36
+ #
37
+ # Fetch Blast hit_id, hit_display_id, queue Resque worker and
38
+ # return worker's meta_id.
39
+ #
40
+ def fetch_quorum_blast_sequence(algo, algo_id)
41
+ job = "#{algo}_job".to_sym
42
+ report = "#{algo}_job_reports".to_sym
43
+
44
+ blast_dbs = self.method(job).call.blast_dbs
45
+
46
+ job_report = self.method(report).call.where(
47
+ "quorum_#{algo}_job_reports.id = ?", algo_id
48
+ ).first
49
+
50
+ hit_id = job_report.hit_id
51
+ hit_display_id = job_report.hit_display_id
52
+
53
+ cmd = create_blast_fetch_command(blast_dbs, hit_id, hit_display_id, algo)
54
+
55
+ data = Workers::System.enqueue(
56
+ cmd, Quorum.blast_remote,
57
+ Quorum.blast_ssh_host, Quorum.blast_ssh_user,
58
+ Quorum.blast_ssh_options, true
59
+ )
60
+
61
+ Workers::System.get_meta(data.meta_id)
62
+ end
63
+
36
64
  private
37
65
 
38
66
  #
@@ -114,22 +142,22 @@ module Quorum
114
142
  def queue_workers
115
143
  jobs = []
116
144
  if self.blastn_job && self.blastn_job.queue
117
- jobs << create_system_command("blastn")
145
+ jobs << create_search_command("blastn")
118
146
  end
119
147
  if self.blastx_job && self.blastx_job.queue
120
- jobs << create_system_command("blastx")
148
+ jobs << create_search_command("blastx")
121
149
  end
122
150
  if self.tblastn_job && self.tblastn_job.queue
123
- jobs << create_system_command("tblastn")
151
+ jobs << create_search_command("tblastn")
124
152
  end
125
153
  if self.blastp_job && self.blastp_job.queue
126
- jobs << create_system_command("blastp")
154
+ jobs << create_search_command("blastp")
127
155
  end
128
156
 
129
157
  unless jobs.blank?
130
158
  jobs.each do |j|
131
- Resque.enqueue(
132
- Workers::System, j, Quorum.blast_remote,
159
+ Workers::System.enqueue(
160
+ j, Quorum.blast_remote,
133
161
  Quorum.blast_ssh_host, Quorum.blast_ssh_user,
134
162
  Quorum.blast_ssh_options
135
163
  )
@@ -138,14 +166,29 @@ module Quorum
138
166
  end
139
167
 
140
168
  #
141
- # Create system commands based on config/quorum_settings.yml
169
+ # Create fetch command based on config/quorum_settings.yml
170
+ #
171
+ def create_blast_fetch_command(db_names, hit_id, hit_display_id, algo)
172
+ # System command
173
+ cmd = ""
174
+
175
+ fetch = File.join(Quorum.blast_bin, "fetch")
176
+ cmd << "#{fetch} -f blastdbcmd -l #{Quorum.blast_log_dir} " <<
177
+ "-m #{Quorum.blast_tmp_dir} -d #{Quorum.blast_db} " <<
178
+ "-n '#{db_names}' -b '#{hit_id}' -s '#{hit_display_id}' " <<
179
+ "-a #{algo}"
180
+ end
181
+
182
+ #
183
+ # Create search command based on config/quorum_settings.yml
142
184
  #
143
- def create_system_command(algorithm)
185
+ def create_search_command(algorithm)
144
186
  # System command
145
187
  cmd = ""
146
188
 
147
189
  if Quorum::BLAST_ALGORITHMS.include?(algorithm)
148
- cmd << "#{Quorum.blast_script} -l #{Quorum.blast_log_dir} " <<
190
+ search = File.join(Quorum.blast_bin, "search")
191
+ cmd << "#{search} -l #{Quorum.blast_log_dir} " <<
149
192
  "-m #{Quorum.blast_tmp_dir} -b #{Quorum.blast_db} " <<
150
193
  "-t #{Quorum.blast_threads} "
151
194
  else
@@ -4,29 +4,30 @@
4
4
  <%= render "shared/error_messages", :target => @job %>
5
5
  <div>
6
6
  <%= f.text_area :sequence,
7
- :title => "Paste nucleic and amino acid FASTA sequence(s) here or upload a file below.",
7
+ :title => "Paste nucleic and amino acid FASTA sequence(s) here " <<
8
+ "or upload a file below.",
8
9
  :class => "auto-hint" %>
9
10
  </div>
10
11
  <div>
11
12
  <%= f.file_field :sequence_file %>
12
13
  </div>
13
14
  <!-- Search Algorithms -->
14
- <!-- Comment out an alorithm below to remove it from the form. -->
15
+ <!-- Comment out an algorithm below to remove it from the form. -->
15
16
 
16
17
  <!-- blastn -->
17
- <%= render :partial => "blastn_form", :locals => {
18
+ <%= render :partial => "quorum/jobs/form/blastn_form", :locals => {
18
19
  :f => f, :blast_dbs => @blast_dbs } %>
19
20
 
20
21
  <!-- blastx -->
21
- <%= render :partial => "blastx_form", :locals => {
22
+ <%= render :partial => "quorum/jobs/form/blastx_form", :locals => {
22
23
  :f => f, :blast_dbs => @blast_dbs } %>
23
24
 
24
25
  <!-- tblastn -->
25
- <%= render :partial => "tblastn_form", :locals => {
26
+ <%= render :partial => "quorum/jobs/form/tblastn_form", :locals => {
26
27
  :f => f, :blast_dbs => @blast_dbs } %>
27
28
 
28
29
  <!-- blastp -->
29
- <%= render :partial => "blastp_form", :locals => {
30
+ <%= render :partial => "quorum/jobs/form/blastp_form", :locals => {
30
31
  :f => f, :blast_dbs => @blast_dbs } %>
31
32
 
32
33
  <!-- End Search Algorithms -->
@@ -16,28 +16,28 @@
16
16
  <div id="tabs-1">
17
17
  <h2>Blastn</h2>
18
18
  <div id="blastn-results">
19
- Searching... <%= image_tag "quorum/knight_rider.gif" %>
19
+ Searching... <%= image_tag "quorum/loading.gif" %>
20
20
  </div>
21
21
  </div>
22
22
 
23
23
  <div id="tabs-2">
24
24
  <h2>Blastx</h2>
25
25
  <div id="blastx-results">
26
- Searching... <%= image_tag "quorum/knight_rider.gif" %>
26
+ Searching... <%= image_tag "quorum/loading.gif" %>
27
27
  </div>
28
28
  </div>
29
29
 
30
30
  <div id="tabs-3">
31
31
  <h2>Tblastn</h2>
32
32
  <div id="tblastn-results">
33
- Searching... <%= image_tag "quorum/knight_rider.gif" %>
33
+ Searching... <%= image_tag "quorum/loading.gif" %>
34
34
  </div>
35
35
  </div>
36
36
 
37
37
  <div id="tabs-4">
38
38
  <h2>Blastp</h2>
39
39
  <div id="blastp-results">
40
- Searching... <%= image_tag "quorum/knight_rider.gif" %>
40
+ Searching... <%= image_tag "quorum/loading.gif" %>
41
41
  </div>
42
42
  </div>
43
43
  </div>
@@ -54,120 +54,9 @@
54
54
  </p>
55
55
  </div>
56
56
 
57
- <!-- Blast Results Template -->
58
- <script type="text/template" id="blast_template">
59
- {{ if (data[0].results === false) { }}
60
- <p><strong>Your search returned 0 hits.</strong></p>
61
- {{ } else { }}
62
- <table class="results">
63
- <tr>
64
- <th>Query Accession</th>
65
- <th>Query Length</th>
66
- <th>Hit Length</th>
67
- <th>Qstrand / Hstrand</th>
68
- <th>Hit Accession</th>
69
- <th>Hit Description</th>
70
- <th>Alignment Length</th>
71
- <th>
72
- <a class="bit-score"
73
- onclick="openWindow(
74
- 'http://www.ncbi.nlm.nih.gov/books/NBK21106/def-item/app8/',
75
- 'Bit Score',
76
- 800,
77
- 300
78
- )">
79
- Bit Score
80
- </a>
81
- </th>
82
- <th>
83
- <a class="e-value"
84
- onclick="openWindow(
85
- 'http://www.ncbi.nlm.nih.gov/books/NBK21106/def-item/app42/',
86
- 'E-value',
87
- 800,
88
- 300
89
- )">
90
- E-value
91
- </a>
92
- </th>
93
- </tr>
94
- {{ var i = 1; var style = "" }}
95
- {{ _.each(data, function(v) { }}
96
- {{ i % 2 == 0 ? style = "even" : style = "odd" }}
97
- {{ var qstrand = v.query_frame }}
98
- {{ var hstrand = v.hit_frame }}
99
- <tr class="{{= style }}">
100
- <td>{{= v.query }}</td>
101
- <td class="right">{{= v.query_len }}</td>
102
- <td class="right">{{= v.hit_len }}</td>
103
- <td>{{= formatStrand(qstrand, hstrand) }}</td>
104
- <td>{{= v.hit_id }}</td>
105
- <td>{{= v.hit_def.trunc(20) }}</td>
106
- <td class="right">{{= v.align_len }}</td>
107
- <td class="right">{{= v.bit_score }}</td>
108
- <td class="right">
109
- <a class="detailed_report"
110
- onclick="viewDetailedReport(
111
- <%= @jobs.id %>,
112
- {{= v.id }},
113
- '{{= v.query }}',
114
- '{{= algo }}')">
115
- {{= v.evalue }}
116
- </a>
117
- </td>
118
- </tr>
119
- {{ i++ }}
120
- {{ }); }}
121
- </table>
122
- {{ } }}
123
- </script>
124
-
125
- <!-- Detailed Report Template -->
126
- <script type="text/template" id="detailed_report_template">
127
- <h3>Query Accession {{= query }}</h3>
128
- {{ _.each(data, function(v) { }}
129
- {{ var id = v.id }}
130
- {{ var qseq = v.qseq }}
131
- {{ var midline = v.midline }}
132
- {{ var hseq = v.hseq }}
133
- {{ var q_from = v.query_from }}
134
- {{ var q_to = v.query_to }}
135
- {{ var h_from = v.hit_from }}
136
- {{ var h_to = v.hit_to }}
137
- {{ var qstrand = v.query_frame }}
138
- {{ var hstrand = v.hit_frame }}
139
- {{ var hsp_group = v.hsp_group }}
140
- <div id="{{= id }}">
141
- <p class="small">{{= displayHspLinks(id, hsp_group, data) }}</p>
142
- <p class="small">Hit Accession: {{= v.hit_id }}</p>
143
- <p class="small">Hit Description: {{= v.hit_def }}</p>
144
- <table class="report_details">
145
- <tr>
146
- <td>E-value: {{= v.evalue }}</td>
147
- <td>Bit Score: {{= v.bit_score }}</td>
148
- <td></td>
149
- </tr>
150
- <tr>
151
- <td>Alignment Length: {{= v.align_len }}</td>
152
- <td>Qstrand / Hstrand: {{= formatStrand(qstrand, hstrand) }}</td>
153
- <td></td>
154
- </tr>
155
- <tr>
156
- <td>Query Length: {{= v.query_len }}</td>
157
- <td>Query From: {{= v.query_from }}</td>
158
- <td>Query To: {{= v.query_to }}</td>
159
- </tr>
160
- <tr>
161
- <td>Hit Length: {{= v.hit_len }}</td>
162
- <td>Hit From: {{= v.hit_from }}</td>
163
- <td>Hit To: {{= v.hit_to }}</td>
164
- </tr>
165
- </table>
166
- {{= formatSequenceReport(qseq, midline, hseq, q_from, q_to, h_from, h_to, algo) }}
167
- </div>
168
- <hr />
169
- {{ }); }}
170
- </script>
57
+ <!-- Templates -->
58
+ <%= render :partial => "quorum/jobs/templates/blast_template" %>
59
+ <%= render :partial => "quorum/jobs/templates/blast_detailed_report_template" %>
171
60
 
172
61
  <script type="text/javascript">
173
62
  $(function() {
@@ -0,0 +1,53 @@
1
+ <!-- Detailed Report Template -->
2
+ <script type="text/template" id="detailed_report_template">
3
+ <h3>Query Accession {{= query }}</h3>
4
+ {{ _.each(data, function(v) { }}
5
+ {{ var id = v.id }}
6
+ {{ var qseq = v.qseq }}
7
+ {{ var midline = v.midline }}
8
+ {{ var hseq = v.hseq }}
9
+ {{ var q_from = v.query_from }}
10
+ {{ var q_to = v.query_to }}
11
+ {{ var h_from = v.hit_from }}
12
+ {{ var h_to = v.hit_to }}
13
+ {{ var qstrand = v.query_frame }}
14
+ {{ var hstrand = v.hit_frame }}
15
+ {{ var hsp_group = v.hsp_group }}
16
+ <div id="{{= id }}">
17
+ <p class="small">{{= displayHspLinks(id, hsp_group, data) }}</p>
18
+ <p class="small">Hit Accession: {{= v.hit_display_id }}</p>
19
+ <p class="small">Hit Description: {{= v.hit_def }}</p>
20
+ <table class="report_details">
21
+ <tr>
22
+ <td>E-value: {{= v.evalue }}</td>
23
+ <td>Bit Score: {{= v.bit_score }}</td>
24
+ <td></td>
25
+ </tr>
26
+ <tr>
27
+ <td>Alignment Length: {{= v.align_len }}</td>
28
+ <td>Qstrand / Hstrand: {{= formatStrand(qstrand, hstrand) }}</td>
29
+ <td></td>
30
+ </tr>
31
+ <tr>
32
+ <td>Query Length: {{= v.query_len }}</td>
33
+ <td>Query From: {{= v.query_from }}</td>
34
+ <td>Query To: {{= v.query_to }}</td>
35
+ </tr>
36
+ <tr>
37
+ <td>Hit Length: {{= v.hit_len }}</td>
38
+ <td>Hit From: {{= v.hit_from }}</td>
39
+ <td>Hit To: {{= v.hit_to }}</td>
40
+ </tr>
41
+ </table>
42
+ <p class="small">
43
+ <a id="download_sequence_{{= id }}"
44
+ onclick="downloadSequence(<%= @jobs.id %>, {{= id }}, '{{= algo }}', this)">
45
+ Download Sequence
46
+ </a>
47
+ </p>
48
+ {{= formatSequenceReport(qseq, midline, hseq, q_from, q_to, h_from, h_to, algo) }}
49
+ </div>
50
+ <hr />
51
+ {{ }); }}
52
+ </script>
53
+
@@ -0,0 +1,68 @@
1
+ <!-- Blast Results Template -->
2
+ <script type="text/template" id="blast_template">
3
+ {{ if (data[0].results === false) { }}
4
+ <p><strong>Your search returned 0 hits.</strong></p>
5
+ {{ } else { }}
6
+ <table class="results">
7
+ <tr>
8
+ <th>Query Accession</th>
9
+ <th>Query Length</th>
10
+ <th>Hit Length</th>
11
+ <th>Qstrand / Hstrand</th>
12
+ <th>Hit Accession</th>
13
+ <th>Hit Description</th>
14
+ <th>Alignment Length</th>
15
+ <th>
16
+ <a class="bit-score"
17
+ onclick="openWindow(
18
+ 'http://www.ncbi.nlm.nih.gov/books/NBK21106/def-item/app8/',
19
+ 'Bit Score',
20
+ 800,
21
+ 300
22
+ )">
23
+ Bit Score
24
+ </a>
25
+ </th>
26
+ <th>
27
+ <a class="e-value"
28
+ onclick="openWindow(
29
+ 'http://www.ncbi.nlm.nih.gov/books/NBK21106/def-item/app42/',
30
+ 'E-value',
31
+ 800,
32
+ 300
33
+ )">
34
+ E-value
35
+ </a>
36
+ </th>
37
+ </tr>
38
+ {{ var i = 1; var style = "" }}
39
+ {{ _.each(data, function(v) { }}
40
+ {{ i % 2 == 0 ? style = "even" : style = "odd" }}
41
+ {{ var qstrand = v.query_frame }}
42
+ {{ var hstrand = v.hit_frame }}
43
+ <tr class="{{= style }}">
44
+ <td>{{= v.query }}</td>
45
+ <td class="right">{{= v.query_len }}</td>
46
+ <td class="right">{{= v.hit_len }}</td>
47
+ <td>{{= formatStrand(qstrand, hstrand) }}</td>
48
+ <td>{{= v.hit_display_id }}</td>
49
+ <td>{{= v.hit_def.trunc(20) }}</td>
50
+ <td class="right">{{= v.align_len }}</td>
51
+ <td class="right">{{= v.bit_score }}</td>
52
+ <td class="right">
53
+ <a class="detailed_report"
54
+ onclick="viewDetailedReport(
55
+ <%= @jobs.id %>,
56
+ {{= v.id }},
57
+ '{{= v.query }}',
58
+ '{{= algo }}')">
59
+ {{= v.evalue }}
60
+ </a>
61
+ </td>
62
+ </tr>
63
+ {{ i++ }}
64
+ {{ }); }}
65
+ </table>
66
+ {{ } }}
67
+ </script>
68
+
data/config/routes.rb CHANGED
@@ -2,6 +2,8 @@ Quorum::Engine.routes.draw do
2
2
  resources :jobs, :only => [:index, :show, :new, :create] do
3
3
  member do
4
4
  get :get_quorum_search_results
5
+ get :get_quorum_blast_hit_sequence
6
+ get :send_quorum_blast_hit_sequence
5
7
  end
6
8
  end
7
9
 
@@ -0,0 +1,8 @@
1
+ class AddHitDisplayIdToBlastReports < ActiveRecord::Migration
2
+ def change
3
+ add_column :quorum_blastn_job_reports, :hit_display_id, :string
4
+ add_column :quorum_blastx_job_reports, :hit_display_id, :string
5
+ add_column :quorum_tblastn_job_reports, :hit_display_id, :string
6
+ add_column :quorum_blastp_job_reports, :hit_display_id, :string
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ module Quorum
2
+ module Generators
3
+ class ImagesGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("../../../../app/assets/images", __FILE__)
5
+ desc "Copy quorum images to your application."
6
+
7
+ IMAGE_DIRECTORIES = [
8
+ "quorum"
9
+ ]
10
+
11
+ def copy_images
12
+ IMAGE_DIRECTORIES.each do |d|
13
+ directory d.to_s, "app/assets/images/#{d.to_s}"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,21 +1,26 @@
1
1
  module Quorum
2
2
  module Generators
3
3
  class InstallGenerator < Rails::Generators::Base
4
+
5
+ include Quorum::Helpers::Colors
6
+
4
7
  source_root File.expand_path("../../templates", __FILE__)
5
8
 
6
- desc "Creates Quorum initializer, settings and " <<
7
- "search tool files."
9
+ desc "Creates Quorum initializer, settings and search " <<
10
+ "/ fetch tool files."
8
11
 
9
12
  DEPENDENCIES = ["makeblastdb", "seqret"]
10
13
 
11
- def copy_initializer
14
+ def copy_quorum
12
15
  template "quorum_initializer.rb",
13
16
  "config/initializers/quorum_initializer.rb"
14
17
  template "quorum_settings.yml", "config/quorum_settings.yml"
15
18
  template "search", "quorum/bin/search"
19
+ template "fetch", "quorum/bin/fetch"
16
20
  template "trollop.rb", "quorum/lib/trollop.rb"
17
21
  template "logger.rb", "quorum/lib/logger.rb"
18
22
  template "blast.rb", "quorum/lib/search_tools/blast.rb"
23
+ template "blast_db.rb", "quorum/lib/fetch_tools/blast_db.rb"
19
24
  end
20
25
 
21
26
  def copy_locale
@@ -23,8 +28,9 @@ module Quorum
23
28
  end
24
29
 
25
30
  def change_file_permissions
26
- f = File.new("quorum/bin/search", "r")
27
- f.chmod(0755)
31
+ Dir.glob(File.join("quorum", "bin", "*")).each do |f|
32
+ File.new(f, "r").chmod(0755)
33
+ end
28
34
  end
29
35
 
30
36
  def create_quorum_tmp_dir
@@ -35,12 +41,30 @@ module Quorum
35
41
  Dir.mkdir("quorum/log") unless File.directory?("quorum/log")
36
42
  end
37
43
 
44
+ def set_mount_engines
45
+ @quorum = %Q(mount Quorum::Engine => "/quorum")
46
+ @resque = %Q(mount Resque::Server.new, :at => "/quorum/resque")
47
+ end
48
+
49
+ def read_routes_file
50
+ @routes = File.open(File.join("config", "routes.rb"), "r")
51
+ @routes = @routes.read
52
+ end
53
+
54
+ def mount_engine_exists?
55
+ @routes.include?(@quorum)
56
+ end
57
+
38
58
  def add_mount_engine
39
- route %Q(mount Quorum::Engine => "/quorum")
59
+ route @quorum unless mount_engine_exists?
60
+ end
61
+
62
+ def resque_mount_engine_exists?
63
+ @routes.include?(@resque)
40
64
  end
41
65
 
42
66
  def add_resque_mount_engine
43
- route %Q(mount Resque::Server.new, :at => "/quorum/resque")
67
+ route @resque unless resque_mount_engine_exists?
44
68
  end
45
69
 
46
70
  def check_dependencies
@@ -49,14 +73,18 @@ module Quorum
49
73
  messages = []
50
74
  DEPENDENCIES.each do |b|
51
75
  system("which #{b} > /dev/null 2>&1")
52
- if $?.exitstatus > 0
53
- messages << "Please add `#{b}` to your PATH."
54
- end
76
+ messages << b if $?.exitstatus > 0
55
77
  end
56
78
  unless messages.empty?
57
- puts "*** Warning: Quorum system dependencies not found ***"
58
- messages.each { |m| puts m }
59
- puts ""
79
+ puts bold(
80
+ red("*** Warning: Quorum system dependencies not found ***")
81
+ )
82
+ puts bold(
83
+ red("Please add the below to your PATH.")
84
+ )
85
+ messages.each { |m| puts bold(red(m)) }
86
+ else
87
+ puts "All good! Yay!!"
60
88
  end
61
89
  end
62
90
 
@@ -1,5 +1,5 @@
1
1
 
2
- ZOMG!! Thanks for installing Quorum!!
2
+ Thanks for installing Quorum!!
3
3
 
4
4
  ==============================================================================
5
5
 
@@ -11,6 +11,8 @@ module Quorum
11
11
  class Blast
12
12
 
13
13
  class QuorumJob < ActiveRecord::Base
14
+ set_table_name "quorum_jobs"
15
+
14
16
  has_one :quorum_blastn_job,
15
17
  :foreign_key => "job_id"
16
18
  has_many :quorum_blastn_job_reports,
@@ -33,38 +35,46 @@ module Quorum
33
35
  end
34
36
 
35
37
  class QuorumBlastnJob < ActiveRecord::Base
38
+ set_table_name "quorum_blastn_jobs"
36
39
  belongs_to :quorum_job
37
40
  has_many :quorum_blastn_job_reports
38
41
  end
39
42
 
40
43
  class QuorumBlastnJobReport < ActiveRecord::Base
44
+ set_table_name "quorum_blastn_job_reports"
41
45
  belongs_to :quorum_blastn_job
42
46
  end
43
47
 
44
48
  class QuorumBlastxJob < ActiveRecord::Base
49
+ set_table_name "quorum_blastx_jobs"
45
50
  belongs_to :quorum_job
46
51
  has_many :quorum_blastx_job_reports
47
52
  end
48
53
 
49
54
  class QuorumBlastxJobReport < ActiveRecord::Base
55
+ set_table_name "quorum_blastx_job_reports"
50
56
  belongs_to :quorum_blastx_job
51
57
  end
52
58
 
53
59
  class QuorumTblastnJob < ActiveRecord::Base
60
+ set_table_name "quorum_tblastn_jobs"
54
61
  belongs_to :quorum_job
55
62
  has_many :quorum_tblastn_job_reports
56
63
  end
57
64
 
58
65
  class QuorumTblastnJobReport < ActiveRecord::Base
66
+ set_table_name "quorum_tblastn_job_reports"
59
67
  belongs_to :quorum_tblastn_job
60
68
  end
61
69
 
62
70
  class QuorumBlastpJob < ActiveRecord::Base
71
+ set_table_name "quorum_blastp_jobs"
63
72
  belongs_to :quorum_job
64
73
  has_many :quorum_blastp_job_reports
65
74
  end
66
75
 
67
76
  class QuorumBlastpJobReport < ActiveRecord::Base
77
+ set_table_name "quorum_blastp_job_reports"
68
78
  belongs_to :quorum_blastp_job
69
79
  end
70
80
 
@@ -235,26 +245,26 @@ module Quorum
235
245
  end
236
246
 
237
247
  #
238
- # Format Blast report hit_id and hit_def.
248
+ # Format Blast report hit_display_id and hit_def.
239
249
  #
240
250
  # For added flexibility, Quorum doesn't parse seqids or deflines.
241
251
  # Instead, format_hit splits the hit_def on whitespace and
242
- # reports hit_id as the first element and hit_def as the second.
252
+ # reports hit_display_id as the first element and hit_def as the second.
243
253
  #
244
254
  def format_hit(str)
245
- hit_id = ""
255
+ hit_display_id = ""
246
256
  hit_def = ""
247
257
 
248
258
  hit = str.split(" ", 2)
249
259
  if hit.length < 2
250
- hit_id = hit.first
260
+ hit_display_id = hit.first
251
261
  hit_def = "None"
252
262
  else
253
- hit_id = hit.first
263
+ hit_display_id = hit.first
254
264
  hit_def = hit.last
255
265
  end
256
266
 
257
- return hit_id, hit_def
267
+ return hit_display_id, hit_def
258
268
  end
259
269
 
260
270
  #
@@ -275,8 +285,9 @@ module Quorum
275
285
  @data[:query_len] = iteration.query_len
276
286
 
277
287
  iteration.each do |hit|
278
- @data[:hit_id], @data[:hit_def] = format_hit(hit.hit_def)
288
+ @data[:hit_display_id], @data[:hit_def] = format_hit(hit.hit_def)
279
289
 
290
+ @data[:hit_id] = hit.hit_id
280
291
  @data[:hit_accession] = hit.accession
281
292
  @data[:hit_len] = hit.len
282
293