quorum 0.1.0 → 0.2.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.
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