quorum 0.1.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 (165) hide show
  1. data/.gitignore +10 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +15 -0
  4. data/Gemfile.lock +170 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +318 -0
  7. data/Rakefile +31 -0
  8. data/app/assets/images/quorum/.gitkeep +0 -0
  9. data/app/assets/images/quorum/bg.png +0 -0
  10. data/app/assets/images/quorum/knight_rider.gif +0 -0
  11. data/app/assets/images/quorum/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  12. data/app/assets/images/quorum/ui-bg_flat_75_ffffff_40x100.png +0 -0
  13. data/app/assets/images/quorum/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  14. data/app/assets/images/quorum/ui-bg_glass_65_ffffff_1x400.png +0 -0
  15. data/app/assets/images/quorum/ui-bg_glass_75_dadada_1x400.png +0 -0
  16. data/app/assets/images/quorum/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  17. data/app/assets/images/quorum/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  18. data/app/assets/images/quorum/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
  19. data/app/assets/images/quorum/ui-icons_222222_256x240.png +0 -0
  20. data/app/assets/images/quorum/ui-icons_2e83ff_256x240.png +0 -0
  21. data/app/assets/images/quorum/ui-icons_454545_256x240.png +0 -0
  22. data/app/assets/images/quorum/ui-icons_888888_256x240.png +0 -0
  23. data/app/assets/images/quorum/ui-icons_cd0a0a_256x240.png +0 -0
  24. data/app/assets/javascripts/quorum/application.js +13 -0
  25. data/app/assets/javascripts/quorum/jobs.js +386 -0
  26. data/app/assets/stylesheets/quorum/application.css +224 -0
  27. data/app/assets/stylesheets/quorum/jobs.css +72 -0
  28. data/app/assets/stylesheets/quorum/jquery-ui-1.8.16.custom.css +568 -0
  29. data/app/assets/stylesheets/quorum/tipsy.css +25 -0
  30. data/app/controllers/quorum/application_controller.rb +5 -0
  31. data/app/controllers/quorum/jobs_controller.rb +102 -0
  32. data/app/helpers/quorum/application_helper.rb +4 -0
  33. data/app/models/quorum/blastn_job.rb +111 -0
  34. data/app/models/quorum/blastn_job_report.rb +7 -0
  35. data/app/models/quorum/blastp_job.rb +111 -0
  36. data/app/models/quorum/blastp_job_report.rb +7 -0
  37. data/app/models/quorum/blastx_job.rb +111 -0
  38. data/app/models/quorum/blastx_job_report.rb +7 -0
  39. data/app/models/quorum/job.rb +164 -0
  40. data/app/models/quorum/tblastn_job.rb +111 -0
  41. data/app/models/quorum/tblastn_job_report.rb +7 -0
  42. data/app/views/layouts/quorum/application.html.erb +15 -0
  43. data/app/views/quorum/jobs/_blastn_form.html.erb +71 -0
  44. data/app/views/quorum/jobs/_blastp_form.html.erb +71 -0
  45. data/app/views/quorum/jobs/_blastx_form.html.erb +71 -0
  46. data/app/views/quorum/jobs/_tblastn_form.html.erb +71 -0
  47. data/app/views/quorum/jobs/new.html.erb +45 -0
  48. data/app/views/quorum/jobs/show.html.erb +183 -0
  49. data/app/views/shared/_error_messages.html.erb +10 -0
  50. data/config/locales/en.yml +8 -0
  51. data/config/routes.rb +9 -0
  52. data/db/migrate/20111031204518_create_jobs.rb +12 -0
  53. data/db/migrate/20111031204701_create_blastn_jobs.rb +19 -0
  54. data/db/migrate/20111031204719_create_blastx_jobs.rb +19 -0
  55. data/db/migrate/20111031204733_create_blastp_jobs.rb +19 -0
  56. data/db/migrate/20111031204754_create_tblastn_jobs.rb +19 -0
  57. data/db/migrate/20111031204846_create_blastn_job_reports.rb +34 -0
  58. data/db/migrate/20111031204903_create_blastx_job_reports.rb +34 -0
  59. data/db/migrate/20111031204922_create_blastp_job_reports.rb +34 -0
  60. data/db/migrate/20111031204941_create_tblastn_job_reports.rb +34 -0
  61. data/lib/generators/quorum/install_generator.rb +68 -0
  62. data/lib/generators/quorum/styles_generator.rb +18 -0
  63. data/lib/generators/quorum/views_generator.rb +18 -0
  64. data/lib/generators/templates/README +25 -0
  65. data/lib/generators/templates/blast.rb +412 -0
  66. data/lib/generators/templates/logger.rb +43 -0
  67. data/lib/generators/templates/quorum_initializer.rb +36 -0
  68. data/lib/generators/templates/quorum_settings.yml +157 -0
  69. data/lib/generators/templates/search +141 -0
  70. data/lib/generators/templates/trollop.rb +781 -0
  71. data/lib/quorum/engine.rb +5 -0
  72. data/lib/quorum/helpers.rb +17 -0
  73. data/lib/quorum/sequence.rb +89 -0
  74. data/lib/quorum/version.rb +3 -0
  75. data/lib/quorum.rb +89 -0
  76. data/lib/tasks/blastdb/README +17 -0
  77. data/lib/tasks/blastdb/build_blast_db.rb +222 -0
  78. data/lib/tasks/quorum_resque.rake +3 -0
  79. data/lib/tasks/quorum_tasks.rake +50 -0
  80. data/lib/workers/quorum.rb +45 -0
  81. data/quorum.gemspec +29 -0
  82. data/script/rails +6 -0
  83. data/spec/data/nucl_prot_seqs.txt +36 -0
  84. data/spec/data/nucl_seqs.txt +32 -0
  85. data/spec/data/prot_seqs.txt +4 -0
  86. data/spec/data/seqs.docx +0 -0
  87. data/spec/data/seqs_not_fa.txt +16 -0
  88. data/spec/data/tmp/test.tgz +0 -0
  89. data/spec/dummy/Rakefile +7 -0
  90. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  91. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  92. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  93. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  94. data/spec/dummy/app/mailers/.gitkeep +0 -0
  95. data/spec/dummy/app/models/.gitkeep +0 -0
  96. data/spec/dummy/app/models/blast.rb +2 -0
  97. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  98. data/spec/dummy/config/application.rb +46 -0
  99. data/spec/dummy/config/boot.rb +10 -0
  100. data/spec/dummy/config/environment.rb +20 -0
  101. data/spec/dummy/config/environments/development.rb +30 -0
  102. data/spec/dummy/config/environments/production.rb +60 -0
  103. data/spec/dummy/config/environments/test.rb +42 -0
  104. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  105. data/spec/dummy/config/initializers/inflections.rb +10 -0
  106. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  107. data/spec/dummy/config/initializers/quorum_initializer.rb +36 -0
  108. data/spec/dummy/config/initializers/resque.rb +1 -0
  109. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  110. data/spec/dummy/config/initializers/session_store.rb +8 -0
  111. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  112. data/spec/dummy/config/locales/en.yml +5 -0
  113. data/spec/dummy/config/locales/quorum.en.yml +8 -0
  114. data/spec/dummy/config/quorum_settings.yml +145 -0
  115. data/spec/dummy/config/routes.rb +9 -0
  116. data/spec/dummy/config.ru +4 -0
  117. data/spec/dummy/db/schema.rb +214 -0
  118. data/spec/dummy/lib/assets/.gitkeep +0 -0
  119. data/spec/dummy/log/.gitkeep +0 -0
  120. data/spec/dummy/public/404.html +26 -0
  121. data/spec/dummy/public/422.html +26 -0
  122. data/spec/dummy/public/500.html +26 -0
  123. data/spec/dummy/public/favicon.ico +0 -0
  124. data/spec/dummy/quorum/bin/search +141 -0
  125. data/spec/dummy/quorum/blastdb/test/contigs.fa +2 -0
  126. data/spec/dummy/quorum/blastdb/test/peptides.fa +2 -0
  127. data/spec/dummy/quorum/blastdb/test.nhd +1 -0
  128. data/spec/dummy/quorum/blastdb/test.nhi +0 -0
  129. data/spec/dummy/quorum/blastdb/test.nhr +0 -0
  130. data/spec/dummy/quorum/blastdb/test.nin +0 -0
  131. data/spec/dummy/quorum/blastdb/test.nog +0 -0
  132. data/spec/dummy/quorum/blastdb/test.nsd +1 -0
  133. data/spec/dummy/quorum/blastdb/test.nsi +0 -0
  134. data/spec/dummy/quorum/blastdb/test.nsq +0 -0
  135. data/spec/dummy/quorum/blastdb/test.phd +1 -0
  136. data/spec/dummy/quorum/blastdb/test.phi +0 -0
  137. data/spec/dummy/quorum/blastdb/test.phr +0 -0
  138. data/spec/dummy/quorum/blastdb/test.pin +0 -0
  139. data/spec/dummy/quorum/blastdb/test.pog +0 -0
  140. data/spec/dummy/quorum/blastdb/test.psd +1 -0
  141. data/spec/dummy/quorum/blastdb/test.psi +0 -0
  142. data/spec/dummy/quorum/blastdb/test.psq +0 -0
  143. data/spec/dummy/quorum/lib/logger.rb +43 -0
  144. data/spec/dummy/quorum/lib/search_tools/blast.rb +412 -0
  145. data/spec/dummy/quorum/lib/trollop.rb +781 -0
  146. data/spec/dummy/script/rails +6 -0
  147. data/spec/models/blastn_job_report_spec.rb +13 -0
  148. data/spec/models/blastn_job_spec.rb +103 -0
  149. data/spec/models/blastp_job_report_spec.rb +13 -0
  150. data/spec/models/blastp_job_spec.rb +103 -0
  151. data/spec/models/blastx_job_report_spec.rb +13 -0
  152. data/spec/models/blastx_job_spec.rb +103 -0
  153. data/spec/models/job_spec.rb +40 -0
  154. data/spec/models/tblastn_job_report_spec.rb +13 -0
  155. data/spec/models/tblastn_job_spec.rb +103 -0
  156. data/spec/quorum/quorum_sequence_spec.rb +64 -0
  157. data/spec/quorum_installed_spec.rb +64 -0
  158. data/spec/requests/jobs_spec.rb +138 -0
  159. data/spec/spec_helper.rb +45 -0
  160. data/spec/tasks/blastdb_rake_spec.rb +119 -0
  161. data/spec/templates/blast_spec.rb +8 -0
  162. data/spec/templates/logger_spec.rb +35 -0
  163. data/vendor/assets/javascripts/jquery.tipsy.js +241 -0
  164. data/vendor/assets/javascripts/underscore-min.js +30 -0
  165. metadata +325 -0
@@ -0,0 +1,111 @@
1
+ module Quorum
2
+ class TblastnJob < ActiveRecord::Base
3
+
4
+ before_save :set_optional_params, :set_blast_dbs
5
+
6
+ belongs_to :job
7
+ has_many :tblastn_job_reports,
8
+ :dependent => :destroy,
9
+ :foreign_key => :tblastn_job_id,
10
+ :primary_key => :job_id
11
+
12
+ attr_accessible :expectation, :max_score, :min_bit_score,
13
+ :filter, :gapped_alignments, :gap_opening_penalty,
14
+ :gap_extension_penalty, :gap_opening_extension, :queue,
15
+ :blast_dbs
16
+
17
+ validates_format_of :expectation,
18
+ :with => /^[+-]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/,
19
+ :message => " - Valid formats (12, 32.05, 43e-123)",
20
+ :allow_blank => true
21
+ validates_numericality_of :max_score,
22
+ :only_integer => true,
23
+ :allow_blank => true
24
+ validates_numericality_of :min_bit_score,
25
+ :only_integer => true,
26
+ :allow_blank => true
27
+ validates_numericality_of :gap_opening_penalty,
28
+ :only_integer => true,
29
+ :allow_blank => true
30
+ validates_numericality_of :gap_extension_penalty,
31
+ :only_integer => true,
32
+ :allow_blank => true
33
+ validates_presence_of :blast_dbs, :if => :queue
34
+ validate :gap_opening_extension_exists
35
+
36
+ #
37
+ # Gapped alignment helper.
38
+ #
39
+ def gapped_alignment?
40
+ self.gapped_alignments
41
+ end
42
+
43
+ #
44
+ # Valid gap opening and extension values.
45
+ #
46
+ def gap_opening_extension_values
47
+ [
48
+ ['--Select--', ''],
49
+ ['32767, 32767', '32767,32767'],
50
+ ['11, 2', '11,2'],
51
+ ['10, 2', '10,2'],
52
+ ['9, 2', '9,2'],
53
+ ['8, 2', '8,2'],
54
+ ['7, 2', '7,2'],
55
+ ['6, 2', '6,2'],
56
+ ['13, 1', '13,1'],
57
+ ['12, 1', '12,1'],
58
+ ['11, 1', '11,1'],
59
+ ['10, 1', '10,1'],
60
+ ['9, 1', '9,1']
61
+ ]
62
+ end
63
+
64
+ #
65
+ # Virtual attribute getter.
66
+ #
67
+ def gap_opening_extension
68
+ [gap_opening_penalty, gap_extension_penalty].join(',')
69
+ end
70
+
71
+ #
72
+ # Virtual attribute setter.
73
+ #
74
+ def gap_opening_extension=(value)
75
+ v = value.split(',')
76
+ self.gap_opening_penalty = v.first
77
+ self.gap_extension_penalty = v.last
78
+ end
79
+
80
+ private
81
+
82
+ def set_blast_dbs
83
+ if self.blast_dbs.present?
84
+ self.blast_dbs = self.blast_dbs.join(';')
85
+ end
86
+ end
87
+
88
+ def set_optional_params
89
+ self.expectation = "5e-20" if self.expectation.blank?
90
+ self.max_score ||= 25
91
+ self.min_bit_score ||= 0
92
+ unless self.gapped_alignments
93
+ self.gap_opening_penalty = 0
94
+ self.gap_extension_penalty = 0
95
+ end
96
+ end
97
+
98
+ #
99
+ # Add error if gapped_alignment? without gap_opening_extension.
100
+ #
101
+ def gap_opening_extension_exists
102
+ if gap_opening_extension.split(',').blank? && gapped_alignment?
103
+ errors.add(
104
+ :gap_opening_extension,
105
+ " - Please select a value."
106
+ )
107
+ end
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,7 @@
1
+ module Quorum
2
+ class TblastnJobReport < ActiveRecord::Base
3
+ belongs_to :tblastn_job
4
+ scope :default_order, order("query ASC, bit_score DESC")
5
+ scope :by_query, lambda { |query| where("query = ?", query) }
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Quorum</title>
5
+ <%= stylesheet_link_tag "quorum/application" %>
6
+ <%= javascript_include_tag "quorum/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <% flash.each do |name, msg| %>
11
+ <%= content_tag :div, msg, :id => name %>
12
+ <% end %>
13
+ <%= yield %>
14
+ </body>
15
+ </html>
@@ -0,0 +1,71 @@
1
+ <%= f.fields_for :blastn_job do |n| %>
2
+ <p>
3
+ <strong>blastn</strong>
4
+ <%= n.check_box :queue %>
5
+ </p>
6
+ <div id="blastn" class="toggle">
7
+ <table class="options">
8
+ <tr>
9
+ <td>
10
+ <label>Database(s)</label>
11
+ </td>
12
+ <td>
13
+ <%= n.select :blast_dbs, @blast_dbs[:blastn], {}, { :multiple => true } %>
14
+ </td>
15
+ <td>
16
+ <%= n.label :filter, "DUST" %>
17
+ </td>
18
+ <td>
19
+ <%= n.check_box :filter %>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td>
24
+ <%= n.label :expectation %>
25
+ </td>
26
+ <td>
27
+ <%= n.text_field :expectation, :size => 15, :title => "5e-20",
28
+ :class => "auto-hint" %>
29
+ </td>
30
+ <td>
31
+ <%= n.label :min_bit_score %>
32
+ </td>
33
+ <td>
34
+ <%= n.text_field :min_bit_score, :size => 15, :title => "0",
35
+ :class => "auto-hint" %>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td>
40
+ <%= n.label :max_score %>
41
+ </td>
42
+ <td>
43
+ <%= n.text_field :max_score, :size => 15, :title => "25",
44
+ :class => "auto-hint" %>
45
+ </td>
46
+ <td>
47
+ <%= n.label :gapped_alignments %>
48
+ </td>
49
+ <td>
50
+ <%= n.select :gapped_alignments, [['No', false], ['Yes', true]] %>
51
+ </td>
52
+ </tr>
53
+ <tr>
54
+ <td>
55
+ <%= n.label :gap_opening_extension %>
56
+ </td>
57
+ <td>
58
+ <%=
59
+ n.select :gap_opening_extension,
60
+ options_for_select(
61
+ @job.blastn_job.gap_opening_extension_values,
62
+ @job.blastn_job.gap_opening_extension
63
+ )
64
+ %>
65
+ </td>
66
+ <td></td>
67
+ <td></td>
68
+ </tr>
69
+ </table>
70
+ </div>
71
+ <% end %>
@@ -0,0 +1,71 @@
1
+ <%= f.fields_for :blastp_job do |n| %>
2
+ <p>
3
+ <strong>blastp</strong>
4
+ <%= n.check_box :queue %>
5
+ </p>
6
+ <div id="blastp" class="toggle">
7
+ <table class="options">
8
+ <tr>
9
+ <td>
10
+ <label>Database(s)</label>
11
+ </td>
12
+ <td>
13
+ <%= n.select :blast_dbs, @blast_dbs[:blastp], {}, { :multiple => true } %>
14
+ </td>
15
+ <td>
16
+ <%= n.label :filter, "SEG" %>
17
+ </td>
18
+ <td>
19
+ <%= n.check_box :filter %>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td>
24
+ <%= n.label :expectation %>
25
+ </td>
26
+ <td>
27
+ <%= n.text_field :expectation, :size => 15, :title => "5e-20",
28
+ :class => "auto-hint" %>
29
+ </td>
30
+ <td>
31
+ <%= n.label :min_bit_score %>
32
+ </td>
33
+ <td>
34
+ <%= n.text_field :min_bit_score, :size => 15, :title => "0",
35
+ :class => "auto-hint" %>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td>
40
+ <%= n.label :max_score %>
41
+ </td>
42
+ <td>
43
+ <%= n.text_field :max_score, :size => 15, :title => "25",
44
+ :class => "auto-hint" %>
45
+ </td>
46
+ <td>
47
+ <%= n.label :gapped_alignments %>
48
+ </td>
49
+ <td>
50
+ <%= n.select :gapped_alignments, [['No', false], ['Yes', true]] %>
51
+ </td>
52
+ </tr>
53
+ <tr>
54
+ <td>
55
+ <%= n.label :gap_opening_extension %>
56
+ </td>
57
+ <td>
58
+ <%=
59
+ n.select :gap_opening_extension,
60
+ options_for_select(
61
+ @job.blastn_job.gap_opening_extension_values,
62
+ @job.blastn_job.gap_opening_extension
63
+ )
64
+ %>
65
+ </td>
66
+ <td></td>
67
+ <td></td>
68
+ </tr>
69
+ </table>
70
+ </div>
71
+ <% end %>
@@ -0,0 +1,71 @@
1
+ <%= f.fields_for :blastx_job do |n| %>
2
+ <p>
3
+ <strong>blastx</strong>
4
+ <%= n.check_box :queue %>
5
+ </p>
6
+ <div id="blastx" class="toggle">
7
+ <table class="options">
8
+ <tr>
9
+ <td>
10
+ <label>Database(s)</label>
11
+ </td>
12
+ <td>
13
+ <%= n.select :blast_dbs, @blast_dbs[:blastx], {}, { :multiple => true } %>
14
+ </td>
15
+ <td>
16
+ <%= n.label :filter, "SEG" %>
17
+ </td>
18
+ <td>
19
+ <%= n.check_box :filter %>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td>
24
+ <%= n.label :expectation %>
25
+ </td>
26
+ <td>
27
+ <%= n.text_field :expectation, :size => 15, :title => "5e-20",
28
+ :class => "auto-hint" %>
29
+ </td>
30
+ <td>
31
+ <%= n.label :min_bit_score %>
32
+ </td>
33
+ <td>
34
+ <%= n.text_field :min_bit_score, :size => 15, :title => "0",
35
+ :class => "auto-hint" %>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td>
40
+ <%= n.label :max_score %>
41
+ </td>
42
+ <td>
43
+ <%= n.text_field :max_score, :size => 15, :title => "25",
44
+ :class => "auto-hint" %>
45
+ </td>
46
+ <td>
47
+ <%= n.label :gapped_alignments %>
48
+ </td>
49
+ <td>
50
+ <%= n.select :gapped_alignments, [['No', false], ['Yes', true]] %>
51
+ </td>
52
+ </tr>
53
+ <tr>
54
+ <td>
55
+ <%= n.label :gap_opening_extension %>
56
+ </td>
57
+ <td>
58
+ <%=
59
+ n.select :gap_opening_extension,
60
+ options_for_select(
61
+ @job.blastn_job.gap_opening_extension_values,
62
+ @job.blastn_job.gap_opening_extension
63
+ )
64
+ %>
65
+ </td>
66
+ <td></td>
67
+ <td></td>
68
+ </tr>
69
+ </table>
70
+ </div>
71
+ <% end %>
@@ -0,0 +1,71 @@
1
+ <%= f.fields_for :tblastn_job do |n| %>
2
+ <p>
3
+ <strong>tblastn</strong>
4
+ <%= n.check_box :queue %>
5
+ </p>
6
+ <div id="tblastn" class="toggle">
7
+ <table class="options">
8
+ <tr>
9
+ <td>
10
+ <label>Database(s)</label>
11
+ </td>
12
+ <td>
13
+ <%= n.select :blast_dbs, @blast_dbs[:tblastn], {}, { :multiple => true } %>
14
+ </td>
15
+ <td>
16
+ <%= n.label :filter, "SEG" %>
17
+ </td>
18
+ <td>
19
+ <%= n.check_box :filter %>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td>
24
+ <%= n.label :expectation %>
25
+ </td>
26
+ <td>
27
+ <%= n.text_field :expectation, :size => 15, :title => "5e-20",
28
+ :class => "auto-hint" %>
29
+ </td>
30
+ <td>
31
+ <%= n.label :min_bit_score %>
32
+ </td>
33
+ <td>
34
+ <%= n.text_field :min_bit_score, :size => 15, :title => "0",
35
+ :class => "auto-hint" %>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td>
40
+ <%= n.label :max_score %>
41
+ </td>
42
+ <td>
43
+ <%= n.text_field :max_score, :size => 15, :title => "25",
44
+ :class => "auto-hint" %>
45
+ </td>
46
+ <td>
47
+ <%= n.label :gapped_alignments %>
48
+ </td>
49
+ <td>
50
+ <%= n.select :gapped_alignments, [['No', false], ['Yes', true]] %>
51
+ </td>
52
+ </tr>
53
+ <tr>
54
+ <td>
55
+ <%= n.label :gap_opening_extension %>
56
+ </td>
57
+ <td>
58
+ <%=
59
+ n.select :gap_opening_extension,
60
+ options_for_select(
61
+ @job.blastn_job.gap_opening_extension_values,
62
+ @job.blastn_job.gap_opening_extension
63
+ )
64
+ %>
65
+ </td>
66
+ <td></td>
67
+ <td></td>
68
+ </tr>
69
+ </table>
70
+ </div>
71
+ <% end %>
@@ -0,0 +1,45 @@
1
+ <div id="new">
2
+ <h1>Quorum Search</h1>
3
+ <%= form_for @job, :html => {:id => "quorum_job"} do |f| %>
4
+ <%= render "shared/error_messages", :target => @job %>
5
+ <div>
6
+ <%= f.text_area :sequence,
7
+ :title => "Paste nucleic and amino acid FASTA sequence(s) here or upload a file below.",
8
+ :class => "auto-hint" %>
9
+ </div>
10
+ <div>
11
+ <%= f.file_field :sequence_file %>
12
+ </div>
13
+ <!-- Search Algorithms -->
14
+ <!-- Comment out an alorithm below to remove it from the form. -->
15
+
16
+ <!-- blastn -->
17
+ <%= render :partial => "blastn_form", :locals => {
18
+ :f => f, :blast_dbs => @blast_dbs } %>
19
+
20
+ <!-- blastx -->
21
+ <%= render :partial => "blastx_form", :locals => {
22
+ :f => f, :blast_dbs => @blast_dbs } %>
23
+
24
+ <!-- tblastn -->
25
+ <%= render :partial => "tblastn_form", :locals => {
26
+ :f => f, :blast_dbs => @blast_dbs } %>
27
+
28
+ <!-- blastp -->
29
+ <%= render :partial => "blastp_form", :locals => {
30
+ :f => f, :blast_dbs => @blast_dbs } %>
31
+
32
+ <!-- End Search Algorithms -->
33
+ <div>
34
+ <%= f.submit "Submit" %>&nbsp;&nbsp;
35
+ <%= submit_tag "Reset", :name => "reset",
36
+ :type => "button", :id => "quorum_job_reset" %>
37
+ </div>
38
+ <% end %>
39
+ </div>
40
+ <div id="quorum">
41
+ <hr class="big" />
42
+ <p>
43
+ Powered by <%= link_to "Quorum", "https://github.com/ncgr/quorum" %>
44
+ </p>
45
+ </div>
@@ -0,0 +1,183 @@
1
+ <div id="show">
2
+ <h1>Search Results</h1>
3
+ <p class="small right"><%= link_to raw("Search Again &raquo;"), :jobs %></p>
4
+ <!-- Tabs -->
5
+ <!-- To remove an algorithm from the view, simply comment out the -->
6
+ <!-- div#tabs ul li and corresponding div#tabs-(tab number) -->
7
+ <div id="tabs">
8
+ <ul>
9
+ <li><a href="#tabs-1">Blastn</a></li>
10
+ <li><a href="#tabs-2">Blastx</a></li>
11
+ <li><a href="#tabs-3">Tblastn</a></li>
12
+ <li><a href="#tabs-4">Blastp</a></li>
13
+ </ul>
14
+
15
+ <!-- Search results per algorithm -->
16
+ <div id="tabs-1">
17
+ <h2>Blastn</h2>
18
+ <div id="blastn-results">
19
+ Searching... <%= image_tag "quorum/knight_rider.gif" %>
20
+ </div>
21
+ </div>
22
+
23
+ <div id="tabs-2">
24
+ <h2>Blastx</h2>
25
+ <div id="blastx-results">
26
+ Searching... <%= image_tag "quorum/knight_rider.gif" %>
27
+ </div>
28
+ </div>
29
+
30
+ <div id="tabs-3">
31
+ <h2>Tblastn</h2>
32
+ <div id="tblastn-results">
33
+ Searching... <%= image_tag "quorum/knight_rider.gif" %>
34
+ </div>
35
+ </div>
36
+
37
+ <div id="tabs-4">
38
+ <h2>Blastp</h2>
39
+ <div id="blastp-results">
40
+ Searching... <%= image_tag "quorum/knight_rider.gif" %>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <!-- End Tabs -->
45
+ <p class="small right"><%= link_to raw("Search Again &raquo;"), :jobs %></p>
46
+
47
+ <!-- Detailed report element -->
48
+ <div id="detailed_report_dialog" title="Quorum Report Details"></div>
49
+ </div>
50
+ <div id="quorum">
51
+ <hr class="big" />
52
+ <p>
53
+ Powered by <%= link_to "Quorum", "https://github.com/ncgr/quorum" %>
54
+ </p>
55
+ </div>
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>
171
+
172
+ <script type="text/javascript">
173
+ $(function() {
174
+ //
175
+ // Asynchronously poll Quorum for search results.
176
+ //
177
+ // pollResults(id, interval)
178
+ // id: Job.id
179
+ // interval: poll interval in milliseconds. 5000 default.
180
+ //
181
+ pollResults(<%= @jobs.id %>);
182
+ });
183
+ </script>
@@ -0,0 +1,10 @@
1
+ <% if target.errors.any? %>
2
+ <div id="error_explanation">
3
+ <h2><%= pluralize(target.errors.count, "error") %> prohibited this record from being saved:</h2>
4
+ <ul>
5
+ <% target.errors.full_messages.each do |msg| %>
6
+ <li><%= msg %></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
10
+ <% end %>
@@ -0,0 +1,8 @@
1
+ en:
2
+ quorum:
3
+ jobs:
4
+ errors:
5
+ notices:
6
+ data_not_found: "The data you requested is unavailable. Please check your URL and try again."
7
+ alerts:
8
+
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ Quorum::Engine.routes.draw do
2
+ resources :jobs, :only => [:index, :show, :new, :create] do
3
+ member do
4
+ get :get_quorum_search_results
5
+ end
6
+ end
7
+
8
+ root :to => "jobs#index"
9
+ end