quorum 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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