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,5 @@
1
+ module Quorum
2
+ class Engine < Rails::Engine
3
+ isolate_namespace Quorum
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module Quorum
2
+ module Helpers
3
+
4
+ #
5
+ # I18n flash helper. Set flash message based on key.
6
+ #
7
+ def set_flash_message(key, kind, options = {})
8
+ options[:scope] = "quorum.#{controller_name}"
9
+ options[:scope] << ".errors" if key.to_s == "error"
10
+ options[:scope] << ".notices" if key.to_s == "notice"
11
+ options[:scope] << ".alerts" if key.to_s == "alert"
12
+ message = I18n.t("#{kind}", options)
13
+ flash[key] = message if message.present?
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,89 @@
1
+ module Quorum
2
+ module Sequence
3
+
4
+ #
5
+ # Create a unique hash plus timestamp.
6
+ #
7
+ def create_hash(sequence)
8
+ Digest::MD5.hexdigest(sequence).to_s + "-" + Time.now.to_f.to_s
9
+ end
10
+
11
+ #
12
+ # Write input sequence to file. Pass the raw input data through seqret
13
+ # to ensure FASTA format.
14
+ #
15
+ def write_input_sequence_to_file(tmp_dir, hash, sequence)
16
+ seq = File.join(tmp_dir, hash + ".seq")
17
+ File.open(seq, "w") do |f|
18
+ f << sequence
19
+ end
20
+
21
+ fasta = File.join(tmp_dir, hash + ".fa")
22
+
23
+ # Force FASTA format.
24
+ cmd = "seqret -filter -sformat pearson -osformat fasta < #{seq} " <<
25
+ "> #{fasta} 2> /dev/null"
26
+ system(cmd)
27
+ if $?.exitstatus > 0
28
+ raise " - Please enter your sequence(s) in Plain Text as " <<
29
+ "FASTA."
30
+ end
31
+ end
32
+
33
+ #
34
+ # Discover input sequence type (nucleic acid NA or amino acid AA).
35
+ #
36
+ # Subtracting all AA single letter chars from NA single letter chars
37
+ # (including ALL ambiguity codes for each!) leaves us with
38
+ # EQILFP. If a sequence contains EQILFP, it's safe to call it an AA.
39
+ #
40
+ # See single letter char tables for more information:
41
+ # http://en.wikipedia.org/wiki/Proteinogenic_amino_acid
42
+ # http://www.chick.manchester.ac.uk/SiteSeer/IUPAC_codes.html
43
+ #
44
+ # If a sequence doesn't contain EQILFP, it could be either an AA
45
+ # or NA. To distinguish the two, count the number of As Ts Gs Cs
46
+ # and Ns, divide by the the length of the sequence and * 100.
47
+ #
48
+ # If the percentage of A, T, U, G, C or N is >= 15.0, call it a NA.
49
+ # 15% was choosen based on the data in the table
50
+ # "Relative proportions (%) of bases in DNA"
51
+ # (http://en.wikipedia.org/wiki/Chargaff's_rules) and the
52
+ # precentage of AAs found in peptides
53
+ # (http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2590925/).
54
+ #
55
+ def discover_input_sequence_type(sequence)
56
+ # Index of the first newline char.
57
+ start = sequence.index(/\n/)
58
+ # Remove the sequence FASTA header.
59
+ seq = sequence.slice(start..-1).gsub!(/\n/, '')
60
+
61
+ if seq =~ /[EQILFP]+/
62
+ type = "amino_acid"
63
+ else
64
+ # Length of the sequence minus the FASTA header.
65
+ len = seq.length.to_f
66
+
67
+ na_percent = 15.0
68
+
69
+ a = (seq.count("A").to_f / len) * 100
70
+ t = (seq.count("T").to_f / len) * 100
71
+ u = (seq.count("U").to_f / len) * 100
72
+
73
+ g = (seq.count("G").to_f / len) * 100
74
+ c = (seq.count("C").to_f / len) * 100
75
+
76
+ n = (seq.count("N").to_f / len) * 100
77
+
78
+ if (a >= na_percent) || (t >= na_percent) || (u >= na_percent) ||
79
+ (g >= na_percent) || (c >= na_percent) || (n >= na_percent)
80
+ type = "nucleic_acid"
81
+ else
82
+ type = "amino_acid"
83
+ end
84
+ end
85
+ type
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,3 @@
1
+ module Quorum
2
+ VERSION = "0.1.0"
3
+ end
data/lib/quorum.rb ADDED
@@ -0,0 +1,89 @@
1
+ require "quorum/engine"
2
+ require "quorum/helpers"
3
+ require "quorum/sequence"
4
+ require "workers/quorum"
5
+ require "resque"
6
+ require "resque/server"
7
+ require "net/ssh"
8
+
9
+ module Quorum
10
+
11
+ ## Supported Algorithms ##
12
+ BLAST_ALGORITHMS = ["blastn", "blastx", "blastp", "tblastn"]
13
+
14
+ mattr_accessor :blast_remote, :blast_ssh_host, :blast_ssh_user,
15
+ :blast_ssh_options, :blast_script, :blast_log_dir, :blast_tmp_dir,
16
+ :blast_db, :tblastn, :blastp, :blastn, :blastx, :blast_threads
17
+
18
+ class << self
19
+
20
+ ## Blast ##
21
+
22
+ # Execute remotely.
23
+ def blast_remote
24
+ @@blast_remote || false
25
+ end
26
+
27
+ # Net::SSH host.
28
+ def blast_ssh_host
29
+ @@blast_ssh_host || nil
30
+ end
31
+
32
+ # Net::SSH user.
33
+ def blast_ssh_user
34
+ @@blast_ssh_user || nil
35
+ end
36
+
37
+ # Net::SSH options.
38
+ def blast_ssh_options
39
+ @@blast_ssh_options || {}
40
+ end
41
+
42
+ # Blast script path.
43
+ def blast_script
44
+ @@blast_script || nil
45
+ end
46
+
47
+ # Blast log dir path.
48
+ def blast_log_dir
49
+ @@blast_log_dir || nil
50
+ end
51
+
52
+ # Blast tmp dir path.
53
+ def blast_tmp_dir
54
+ @@blast_tmp_dir || nil
55
+ end
56
+
57
+ # Blast database path.
58
+ def blast_db
59
+ @@blast_db || nil
60
+ end
61
+
62
+ # tblastn directories.
63
+ def tblastn
64
+ @@tblastn || []
65
+ end
66
+
67
+ # blastp directories.
68
+ def blastp
69
+ @@blastp || []
70
+ end
71
+
72
+ # blastn directories.
73
+ def blastn
74
+ @@blastn || []
75
+ end
76
+
77
+ # blastx directories.
78
+ def blastx
79
+ @@blastx || []
80
+ end
81
+
82
+ # Number of Blast threads.
83
+ def blast_threads
84
+ @@blast_threads || 1
85
+ end
86
+
87
+ end
88
+
89
+ end
@@ -0,0 +1,17 @@
1
+
2
+ ==
3
+
4
+ Finished building your Blast database(s).
5
+
6
+ makeblastdb results are located in quorum/log/makeblastdb.log.
7
+
8
+ ===================================================================
9
+
10
+ Add the newly created Blast database files in
11
+ quorum/blastdb to config/quorum_settings.yml. Update
12
+ RAILS_ENV settings.
13
+
14
+ See config/quorum_settings.yml for instructions.
15
+
16
+ ===================================================================
17
+
@@ -0,0 +1,222 @@
1
+ module Quorum
2
+ #
3
+ # Build Blast Database(s)
4
+ #
5
+ class BuildBlastDB
6
+
7
+ # Valid values for @type.
8
+ VALID_TYPES = ["both", "prot", "nucl"]
9
+
10
+ # Blast dependencies
11
+ DEPENDENCIES = ["makeblastdb"]
12
+
13
+ # File bz2 and gz extensions.
14
+ GZIP = /\.(tgz$)|(tar.gz$)/
15
+ BZIP = /\.(tbz$)|(tar.bz2$)/
16
+
17
+ private
18
+
19
+ def initialize(args, output = $stdout)
20
+ @dir = args[:dir]
21
+ @type = args[:type]
22
+ @prot_file = args[:prot_file]
23
+ @nucl_file = args[:nucl_file]
24
+ @rebuild_db = args[:rebuild_db]
25
+ @empty = args[:empty]
26
+ @blastdb_dir = args[:blastdb_dir]
27
+ @gff_dir = args[:gff_dir]
28
+ @log_dir = args[:log_dir]
29
+
30
+ @output = output
31
+ end
32
+
33
+ #
34
+ # Check build_blast_db dependencies.
35
+ #
36
+ def check_dependencies
37
+ DEPENDENCIES.each do |b|
38
+ system("which #{b} > /dev/null 2>&1")
39
+ if $?.exitstatus > 0
40
+ raise "Dependency not found. Please add `#{b}` to your PATH."
41
+ end
42
+ end
43
+ end
44
+
45
+ #
46
+ # Make Quorum directories.
47
+ #
48
+ def make_directories
49
+ begin
50
+ `rm -rf #{@blastdb_dir}` if File.directory?(@blastdb_dir) && @rebuild_db
51
+ Dir.mkdir(@blastdb_dir) unless File.directory?(@blastdb_dir)
52
+
53
+ `rm -rf #{@gff_dir}` if File.directory?(@gff_dir) && @rebuild_db
54
+ Dir.mkdir(@gff_dir) unless File.directory?(@gff_dir)
55
+
56
+ Dir.mkdir(@log_dir) unless File.directory?(@log_dir)
57
+ rescue SystemCallError => e
58
+ @output.puts e.message
59
+ raise "Unable to make directory. " <<
60
+ "Perhaps you forgot to execute the quorum initializer. \n\n" <<
61
+ "rails generate quorum:install"
62
+ end
63
+ end
64
+
65
+ #
66
+ # Create directories per tarball and return tarball file name
67
+ # minus the file extension.
68
+ #
69
+ def create_file_name(file, base_dir)
70
+ file_name = file.split("/").delete_if { |f| f.include?(".") }.first
71
+ unless File.exists?(File.join(base_dir, file_name))
72
+ Dir.mkdir(File.join(base_dir, file_name))
73
+ end
74
+ file_name
75
+ end
76
+
77
+ #
78
+ # Extracts and concatenates files from tarballs.
79
+ #
80
+ def extract_files(src, file, flag, path)
81
+ extract_data_error = File.join(@log_dir, "extract_data_error.log")
82
+
83
+ cmd = "tar -x#{flag}Of #{src} #{file} >> #{path} 2>> " <<
84
+ "#{extract_data_error}"
85
+ system(cmd)
86
+ if $?.exitstatus > 0
87
+ raise "Data extraction error. " <<
88
+ "See #{extract_data_error} for details."
89
+ end
90
+ end
91
+
92
+ #
93
+ # Execute makeblastdb on an extracted dataset.
94
+ #
95
+ def execute_makeblastdb(type, title, input)
96
+ @output.puts "Executing makeblastdb for #{title} dbtype #{type}..."
97
+
98
+ makeblast_log = File.join(@log_dir, "makeblastdb.log")
99
+ output = File.dirname(input)
100
+
101
+ cmd = "makeblastdb " <<
102
+ "-dbtype #{type} " <<
103
+ "-title #{title} " <<
104
+ "-in #{input} " <<
105
+ "-out #{output} " <<
106
+ "-hash_index >> #{makeblast_log}"
107
+ system(cmd)
108
+ if $?.exitstatus > 0
109
+ raise "makeblastdb error. " <<
110
+ "See #{makeblast_log} for details."
111
+ end
112
+ end
113
+
114
+ #
115
+ # Builds a Blast database from parse_blast_db_data.
116
+ #
117
+ def build_blast_db(blastdb)
118
+ Dir.glob(File.expand_path(blastdb) + "/*").each do |d|
119
+ if File.directory?(d)
120
+ contigs = File.join(d, "contigs.fa")
121
+ peptides = File.join(d, "peptides.fa")
122
+
123
+ found = false
124
+
125
+ if File.exists?(contigs) && File.readable?(contigs)
126
+ execute_makeblastdb("nucl", d, contigs)
127
+ found = true
128
+ end
129
+ if File.exists?(peptides) && File.readable?(peptides)
130
+ execute_makeblastdb("prot", d, peptides)
131
+ found = true
132
+ end
133
+
134
+ unless found
135
+ raise "Extracted data not found for #{contigs} or #{peptides}. " <<
136
+ "Make sure you supplied the correct data directory and file names."
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ #
143
+ # Display BLAST_README
144
+ #
145
+ def readme
146
+ file = File.readlines(File.join(File.dirname(__FILE__), "README"))
147
+ file.each { |f| @output.print f }
148
+ end
149
+
150
+ public
151
+
152
+ #
153
+ # Parse Blast database data.
154
+ #
155
+ def build_blast_db_data
156
+ # Create necessary directories and return.
157
+ if @empty
158
+ make_directories
159
+ return
160
+ end
161
+
162
+ if @dir.blank?
163
+ raise "DIR must be set to continue. Execute `rake -D` for more information."
164
+ end
165
+
166
+ unless VALID_TYPES.include?(@type)
167
+ raise "Unknown type: #{@type}. " <<
168
+ "Please provide one: both, nucl or prot."
169
+ end
170
+
171
+ check_dependencies
172
+
173
+ make_directories
174
+
175
+ begin
176
+ @dir.split(':').each do |d|
177
+ unless File.directory?(d)
178
+ raise "Directory not found: #{d}"
179
+ end
180
+
181
+ @data = Dir.glob("#{d}/*.{tgz,tar.gz,tbz,tar.bz2}")
182
+
183
+ if @data.blank?
184
+ raise "Data not found. Please check your directory and try " <<
185
+ "again.\nDirectory Entered: #{d}"
186
+ end
187
+
188
+ @data.each do |s|
189
+ if s =~ GZIP
190
+ files = `tar -tzf #{s}`
191
+ flag = "z"
192
+ elsif s =~ BZIP
193
+ files = `tar -tjf #{s}`
194
+ flag = "j"
195
+ end
196
+ files = files.split(/\n/)
197
+ files.each do |f|
198
+ if f.include?(@prot_file)
199
+ file_name = create_file_name(f, @blastdb_dir)
200
+ extract_files(s, f, flag, File.join(@blastdb_dir, file_name, "peptides.fa"))
201
+ elsif f.include?(@nucl_file)
202
+ file_name = create_file_name(f, @blastdb_dir)
203
+ extract_files(s, f, flag, File.join(@blastdb_dir, file_name, "contigs.fa"))
204
+ elsif f.include?("gff")
205
+ file_name = create_file_name(f, @gff_dir)
206
+ extract_files(s, f, flag, File.join(@gff_dir, file_name, "annots.gff"))
207
+ end
208
+ end
209
+ end
210
+ end
211
+ build_blast_db(@blastdb_dir)
212
+ rescue Exception => e
213
+ # Remove empty directories.
214
+ `rm -rf #{@blastdb_dir}/*` if File.directory?(@blastdb_dir)
215
+ `rm -rf #{@gff_dir}/*` if File.directory?(@gff_dir)
216
+ raise e
217
+ end
218
+ readme
219
+ end
220
+
221
+ end
222
+ end
@@ -0,0 +1,3 @@
1
+ require 'resque/tasks'
2
+
3
+ task "resque:setup" => :environment
@@ -0,0 +1,50 @@
1
+ #
2
+ # Quourm Rake Tasks
3
+ #
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'blastdb'))
6
+
7
+ require 'build_blast_db'
8
+
9
+ namespace :quorum do
10
+ namespace :blastdb do
11
+ desc "Build Blast Database (options: DIR=/path/to/data " <<
12
+ "{valid extensions: .tar.gz .tgz .tar.bz2 .tbz} " <<
13
+ "-- separate multiple directories with a colon. " <<
14
+ "TYPE={both}{prot}{nucl} -- defaults to both. " <<
15
+ "PROT_FILE_NAME= -- defaults to peptides.fa. " <<
16
+ "NUCL_FILE_NAME= -- defaults to contigs.fa. " <<
17
+ "REBUILD_DB= {true or false} -- remove existing blast database(s). " <<
18
+ "Defaults to false. " <<
19
+ "EMPTY={true or false} -- skip makeblastdb and create empty " <<
20
+ "directories. Use this option if you prefer to create your own " <<
21
+ "Blast database. Defaults to false.)"
22
+ task :build do
23
+
24
+ args = {}
25
+
26
+ args[:dir] = ENV['DIR']
27
+ args[:type] = ENV['TYPE'] || 'both'
28
+ args[:prot_file] = ENV['PROT_FILE_NAME'] || 'peptides.fa'
29
+ args[:nucl_file] = ENV['NUCL_FILE_NAME'] || 'contigs.fa'
30
+ args[:rebuild_db] = ENV['REBUILD_DB'] || false
31
+ args[:empty] = ENV['EMPTY'] || false
32
+
33
+ args[:blastdb_dir] = File.join(::Rails.root.to_s, "quorum", "blastdb")
34
+ args[:gff_dir] = File.join(::Rails.root.to_s, "quorum", "gff3")
35
+ args[:log_dir] = File.join(::Rails.root.to_s, "quorum", "log")
36
+
37
+ args[:type] = args[:type].downcase.strip
38
+ args[:prot_file] = args[:prot_file].downcase.strip
39
+ args[:nucl_file] = args[:nucl_file].downcase.strip
40
+ args[:nucl_file] = "NULL" if args[:type] == "prot"
41
+ args[:prot_file] = "NULL" if args[:type] == "nucl"
42
+
43
+ puts "Building your Blast database(s). This may take a while..."
44
+
45
+ build = Quorum::BuildBlastDB.new(args)
46
+ build.build_blast_db_data
47
+ end
48
+ end
49
+ end
50
+
@@ -0,0 +1,45 @@
1
+ module Workers
2
+ class System
3
+ @queue = :system_queue
4
+
5
+ #
6
+ # Resque worker method.
7
+ #
8
+ def self.perform(cmd, remote, ssh_host, ssh_user, ssh_options = {})
9
+ unless ssh_options.empty?
10
+ # Convert each key in ssh_options to a symbol.
11
+ ssh_options = ssh_options.inject({}) do |memo, (k, v)|
12
+ memo[k.to_sym] = v
13
+ memo
14
+ end
15
+ end
16
+
17
+ exit_status = 1
18
+
19
+ if remote
20
+ # Execute command on remote machine.
21
+ Net::SSH.start(ssh_host, ssh_user, ssh_options) do |ssh|
22
+ ssh.open_channel do |ch|
23
+ ch.exec(cmd) do |ch, success|
24
+ unless success
25
+ Rails.logger.warn "Channel Net::SSH exec() failed. :'("
26
+ else
27
+ # Read the exit status of the remote process.
28
+ ch.on_request("exit-status") do |ch, data|
29
+ exit_status = data.read_long
30
+ end
31
+ end
32
+ end
33
+ end
34
+ ssh.loop
35
+ end
36
+ else
37
+ system(cmd)
38
+ exit_status = $?.exitstatus
39
+ end
40
+ if exit_status > 0
41
+ raise "Worker failed :'(. See quorum/log/quorum.log for more information."
42
+ end
43
+ end
44
+ end
45
+ end
data/quorum.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require "quorum/version"
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |s|
8
+ s.name = "quorum"
9
+ s.version = Quorum::VERSION
10
+ s.authors = ["Ken Seal"]
11
+ s.email = ["kas@ncgr.org"]
12
+ s.homepage = "https://github.com/ncgr/quorum"
13
+ s.summary = "Flexible bioinformatics search tool."
14
+ s.description = "Flexible bioinformatics search tool."
15
+
16
+ s.files = `git ls-files`.split(/\n/)
17
+
18
+ s.add_dependency "rails", "~> 3.1.0"
19
+ s.add_dependency "jquery-rails"
20
+ s.add_dependency "net-ssh", "~> 2.2.1"
21
+ s.add_dependency "resque", "~> 1.19.0"
22
+ s.add_dependency "bio-blastxmlparser", "~> 1.0.1"
23
+
24
+ s.add_development_dependency "mysql2"
25
+ s.add_development_dependency "rspec-rails", "~> 2.6"
26
+ s.add_development_dependency "capybara"
27
+ s.add_development_dependency "database_cleaner"
28
+ s.add_development_dependency "factory_girl_rails", "~> 1.2.0"
29
+ end
data/script/rails ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ #!/usr/bin/env ruby
3
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
4
+
5
+ ENGINE_PATH = File.expand_path('../..', __FILE__)
6
+ load File.expand_path('../../spec/dummy/script/rails', __FILE__)
@@ -0,0 +1,36 @@
1
+ >TOG900080
2
+ TGATAGGATAATTCTAGACAAAACATTAGCCGATCAAGTGTCATCATGGAAAAGCAGCAGGGGCCTTAGTGATACAGTGGTGACTGATCATGCTTGTTCTGGGGAAACATGCTCGTACTACGCAATTGGAGATGTATTTATTTGTGAAAAGACTGGACAAGTTCATGTTTGTGACGAAACATGTAGGGAAGTAGTAATGGATCCCACCAACGAGCTTTTGGTCTGTACAATATCTGGCCACTGTTTTGACAGATTGCTATCACCTGCTGAAATGGAGCCTGATGCTGAGCAGCAGCAAGGTGGTGCGGCAGATGAGGCAGAACCGTTTATGGGATCTGGCCGTTTTGCACGGGCTTATTTGCTGGGATACAATTGTGCTGATGAAAAGGAGCTTGAAGCTACTTTGAGGTTTTGCTGATCCCTATTGGCCCTTCTGGAGTGGATGATCTCATGTCTCAGCATTTACCTATTTAAGATCAAATAAATCGGGTTTCCTTTTCGTGTTTCTCTTGGCATAAGAATGTTTGATTAGATCTAGATTATGAAACTCTAATCGTCTTCTATATTAATAATTGTATGCTTAAATTTATAGTTGAAATTCCATTGATGAATTTTTCTT
3
+ >TOG899661
4
+ CAGAAGACATGTCTTTGACAAAGGTATACCATCTTTTCCNCCAACTTGGTTTGAGACATTTATTTGTTGTACCTCGTCCATCGCGTGTGCTTGGTTTGATAACCAGAAAAGATTTGTTGATTGAGGACACAGATGCGAATACATTAGAGCTTCAGGCAACTAGTAGTTCGGCATCCAGGTAAAAGATTGATGGCAAGGAATGCAGATGTGGAGAGCCCTCTGCTAAATGGTCTTCTGGTTCAGAATCAGATACCTGACTAATACCGTCTGCAGCCTTCCCGAATTCCTTTTTGCGTCCCATTTTCACTTGAAAATCATTCTTTATTATTTTTGTATTAATGTTGAAATAGGTTAGAGAACCCGATATTTTGGGGATGGAACGGGGTTGTAGACTGACAGTATACCCTAGAATTTTGTATATAAAGTATAAACTACAGCAAGCACAGAAAAAAATCATGAAAGCGCCCTTGTGATAATTATGATAGCAGAATTTAGACTGAT
5
+ >TOG899078
6
+ CTCTCTCTCTCTCTCTCTCTCTCTCTCTCCGTCGTCGTTTTGGGTTCTGCGGATCGGTGGATTCTGGTCGCGAATTCCGACGCTGTTCGTGGCGGCGAACCGAATTCCGGTCAACAAGCGAAGAAGATGAAGGTTTTCGTCAAGACTCTGAAGGGCTCTCACTTCGAAATCGAAGTCAAGCCCCAAGACACGGTTTCGGATGTGAAGAAAAATATTGAAACTGTTCAAGGTGGATGTCTATCCTGCCGCGCAGCAAATGCTTATTCATCAAGGGAAAGTTCTTAAGGATGGTACTACCTTGGAGGAAAATAAAGTAGCTGAAAATAGTTTCATTGTGATTATGATTTCCAAGAGTAAGACTCCGTCTGGTGAAGGATCTACTACTTCAGCTGCACCTTCAGCTAAGGCTCCAGCTCCTGCTCCTATATCTTCGGGCACGGCTGTGGAAGGTTCTGATGTCTATGGACAAGCAGCATCCAATCTGGTTGCTGGTAGCAACTTGGAAGACACAATTCAGCAAATTCTTGATGTTGGAGGAGGGACCTGGGATAGGGATACTGTAGTCCGGGCTCTTCGAGCTGCCTTCAACAACCCTGAGAGAGCTATTGAATATTTATATTCAGGAATCCCCGAGCAAGCTGAAGCTCCACCTGTGGGCCGTGTGCCTGCAAGTGCACAACCTGCAAATCCTCCAGCAGCTGCAGCTCCGCAAGCGGCACAACCTGCTCCTGTTACCTCAAGTGGGCCTAATGCTAATCCTTTAGACCTTTTTCCACAGGGCCTCCCAAATGTTGGTTCTGGTGGTGCTGGTGCTGGTGCTGGCTCTTTAGATTTTCTTCGCAACAGCCAACAATTCCAAGCCTTGCGAGCTATGGTGCAGGCTAATCCACAAATATTGCAGCCTATGCTACAAGAGCTTGGCAAACAGAATCCTCATCTAATGAGATTGATTCGAGATCATCAAGCTGACTTCCTTCGCTTGATAAATGAGCCTGTGGAAGGTGGCGAAGGGAACCCATTGGGGCAGCTGGCTGGTGGCATACCACAAGCAATAACTGTCACCCCTGAGGAGCGCCAAGCAATTGAACGTCTTGAAGCAATGGGTTTCGATCGTGCGATTGTATTGGAGGTGTTCTTCGCTTGCAACAAAAATGAGGAATTGGCTGCCAACTACCTTTTAGATCACATGCATGAGTTCGACGAACAATAAATCTCTTCATGTTGCTAAATTATTTATCTGTTATCTTTTTAATGTTTATGGGGCCTTTGTTTTACTAGACGGTTTGATGAGGTAATACTTGAAAATGAAAAAAATCTCAAGTGGAGAAGGAACGTTTTTACCACCTCCACATTATTGCCTTTGTGGACAGTCTCAGTATTCATATACATAGTCGTTTGTCCTGTACTATTGGTATTGTGCATCCTTTTAACATGTGTAATTGTTTAGCTGCGCATCCTATTCTATATTTTCT
7
+ >TOG896930
8
+ CGTTCGCATTGTTCACTCACCATACGCACTTCCATTTTCATCTCCCACCGTCGCATTTTCTTCGGATCTGAAATTCCTCACCATGAATCGCCACCACGATCCCAATCCATTCGACGAAGACGAAGTCAATCCCTTCTCGAACGGTGCTGCTCCTGGATCTAAATCACGTATTCCACCATTGGCATCCGAACCACTGGGCTTTGGTCAAAGACATGATGCTACAGTTGATATTCCTTTGGATACCACAAATGAGCCTAAAAAAAAAGGTCAAGAGCTAGCAGCTTGGGAAGCAGATTTGAAAAGGAGAGAAAAGGATTTAAAAAGAAGAGAGGATGCTGTTTCTAGAGCTGGTGTGCCTGTTGATGATAAGAATTGGCCTCCGATTTTCCCAATTATTCACCATGATATTGCCAATGAGATACCGGTTCATGCTCAGAGGCTGCAATATTTGGCCTTTGCAAGTTGGTTAGGAATTGTTCTCTGCCTTGTTTTTAATGTAGTTGCTGTGATGGTCTGTTGGATCAGAGGCGGTGGTGTTAAAATTTTTTTCCTTGCGGTGATCTATGCTCTACTTGGTGTTCCCCTTTCATATGTGCTTTGGTACAGGCCCCTTTATCGTGCTATGAGGACGGATAGTGCACTGAAGTTTGGCTGGTTTTTCATGTTCTACTTGCTTCATATTGCATTTTGCATCTTTGCTGCAATTGCACCTCCAGTTGTTTTTCATGGGAAATCATTAACGGGCATCCTTGCAGCAACTGACGTCTTCTCAGACCATGTATTGGTTGGGATATTCTATTTGGTTGGATTTGGCCTGTTTTGCTTGGAGTCTCTTCTAAGCTTGTGGGTAATTCAGAAAATATACCTGTTTTTCCGGGGGCATAAGTGAGGCTACTCAGGATTTTGATCCATCGGCTTTTATGATATCAGTCACTTCCCGGCGTGGCTTAGTATATTCTTTCTTTTTGTCTATCCTCTTTTTTCGCTTGCAATATTTTCGTGTGATATTGTTTGTTGTTGTAGTCTAGTTCTTGTTACAGAGCTTAGTGTGTAATTTCCTGTGTAATGAATTCTGTGAAGTTTAGTAATTTTCTAGTGTAACAATAACCAAGCTTTGCTTTCGATAAGCATATATGTAGTGGATTTCCATAAGGAATTATTGTAGTGCTATTGTAGTTGTGAATAGTGACACCCCTCGGAGGTTTTCTATTTGTAAGACAGCACTGATGCAAACACTTTAGTTAAAATTCATGTAGGATCTATTCAATT
9
+ >TOG902802
10
+ CAGGATACACCTCCAGATGGGGAAAATATGACAGGAGCCTCCAAAGAGATGAATGTAGAATCTATTCCTTCCTTCTTTCAAGATATTATTGAGCGTATGGTTTCCTCACAAGTTATGACTGTGAAGCCTGATGCTTGCATTGTGGATTTCTATAATGAGGGCGATCACTCACATCCCTACAATTGGCCACATTGGTATGGAAGGCCTGTCTATATCCTTTCCCTGACAGAATGTGATATGACTTTAGGAAGAGTAATTTCCTCAGACCATCCAGGGGATTACAGGGGCTCTCTGAAGCTTTCTCTTCTCCCTGGGTCTCTTCTGTCAAGGCAAGGGAAATCTACTAATTTTGCTAGATATGCTATTCCTTCTATCCGCAAACAACGCATACTTGTTATTTTTACAAAGTCCCAACCAAAGAAGTCACTGTCAAGTGATGCTCAACGTTTTACCTCATCAGCAGCATCTTCTCATTGGGGTCCACCGCCAAGCCGTTCCCCCAATCACGTTCGTCATCATTTAGGCCACAAGCATTATGCTTCAGCTCCAACAAACGGAGGACTGCCAGCTCCACCAATCCGGCCACA
11
+ >TOG913027
12
+ AAGGACTAGTTGATTTGCTACATGTGTTCTGTGTTGTTCTTGCTTTGGTAAATGTGTCTCTAGTGAAAGCAGAAGATCCATACAAGTTCTACACATGGACAGTGACTTATGGAACTCTTTCTCCTCTGGGCAGTCCTCAACAAGTTATTCTGATCAATGGTCAGTTTCCTGGTCCAAGACTTGACTTGGTAACTAATGACAACGTGATTCTCAACCTCATCAACAAGCTGGATGAGCCATTCTTGCTCACATGGAATGGCATTAAGCAGAGGAAAAATTCTTGGCAAGATGGGGTTTTAGGAACTAACTGTCCCATTCCTCCAAACTCAAATTACACTTACAAGTTTCAGGCCAAGGATCAGATTGGCACTTATACATACTTTCCATCAACTAAGATGCATAAAGCTTCTGGAGGGTTTGGAGCTCTCAATGTTCTTCATAGATCTGTCATCCCAATCCCTTATCCAAACCCTGATGGAGATTTTACATTACTCATTGGTGATTGGTACAAAACTAGCCACAAGACATTAAGCCAAACATTGGATTCTGGGAAATCTCTTGCCTTTCCTGATGGCCTCCTTATCAATGGCCAGGCTCATTCTACCTTCACTGTTAACCAGGGAAAAACCTATATGTTCAGGATCTCAAATGTTGGTCTGTCAACCTCAATTAACTTCAGAATTCAGGGACATACCCTAAAACTAGTTGAGGTTGAAGGATCACACACTATCCAGAACGAATACGACTCGCTTGATGTGCATGTTGGCCAATCAGTTTCTGTGTTAGTAACCTTAAATCAACCTCCAAAGGACTATTACATCGTTGCCTCAACAAGATTTACCAAGACTGTTCTCACTACAACCTCAGTGCTACACTAAAATTCTCAGTCAGCCGCATCAGGATCCTTGCCTGCTCCCCCTGCTGACAAT
13
+ >TOG919655
14
+ ATTGAAATACGTCTTGCAAAAGCTGAAGCTATTAATTGGACATCTCTCGAATATAGCAAGGATATGCCTCCCCAAAAAATTAAAGTGCCTACAATTCAATCTGAAAGGCCTGCATACCCATCATCAAAGCCAAGGACAAAAGATTGGGATAAGTTGGAAGCTATGGTGAAAAAAGAGGAGAAAGAAGAAAAGCTGGATGGTGATGCTGCTTTGAATAAATTGTTCCGTGATATTTATCAAAATGCTGATGAGGACATGCGGAGAGCAATGAGCAAGTCATTTCTGGAGTCAAATGGAACAGTGCTGTCAACGGATTGGAAAGAAGTGGGATCCAAGAAGGTGGAAGGAAGTCCTCCAGAAGGTATGGAATTGAAGAAATGGGAGTACTAATTCAGTACAAGCTGATGCTCATGAGAGTTCAAATTCACAAAAATAAATTCTGAGAAGGGAAACAAATTCTGTAATCTTAATGGTATCGGTTATTTTG
15
+ >TOG906701
16
+ TGAGATCATGCGCGAAATGATGAGGAATACAGACAGAGCCATGAGCAACATTGAGTCTTCTCCTGAGGGATTCAACATGCTGAGGCGCATGTATGAAAATGTTCAAGAACCATTTTTAAATGCCACTACAATGGCTGGTAATACAGGAAATGATGGTGTCAGGAATCAATCAACTAATCCCTCAACGACTAATTCTGAAGCAACTTCCCCTGTTCCAAATACTAACCCACTTCCTAATCCTTGGTCCTCCACTGGAACTGGAGGTGCACAAGGCAACACCAGAAGGACAACTGCTGGTGGGGATGCTCGGCAGCAGGCACTCACTGGACTAGGAGGACTTGGTGTGCCAGATCTTGAAGGCATGATGGGTGGTATGCCAGATCCTGCTATGTTGACCCAATTAATGCAAAATCCAGCTATTTCACAAATGATGCAGAGTATCCTTTCCAATCCACAGACTATGAATCAGATTCTTGGTCTCAATACTGAGCAGCGTGGCATGCCTGATCTAAACTCACTAAGAAGATGTGATGCAAAACCCAGAGTTTCTTCGCTTATTTTCCTCACCTGAGACACTGCAGCAACTCATGTCTTTCCAGCAATCTCTTATGTCTCAAGTTGG
17
+ >TOG894885
18
+ CAGCTCTATTCTCCACCAACACAAAAACGCTCACAAACTAGCTTCTTTGGAGAAAACATTAGAGACAATAGTGGCGGTGGTGGGAACAATGGCAGCCTCACTACAAGCAGCAGCTACTTTCATGCAACCAACCAAGTTTGGTCGCACCAACACTTTGCAGCTGAAATCTACTCAATCCATTTCTAAGGCTTTTGGGTTGGAGCCCTCTGCAGCTAAGGTCTCATGTTCCCTTCAGGCTGATTTCAAGGAGTTGGCTCACAAGTGTGTTGAAGCTACCAAGATTGCTGGGTTTGCTCTTGCCACCTCTGCTCTAGTTGTCTCTGGAGCAAGTGCGGAAGGTGCTCCGAAGAGGCTAACCTTCGATGAAATCCAGAGCAAGACATACATGGAAGTGAAGGGAACCGGAACCGCAAACCAGTGCCCCACCATTGAAGGGGGAGTGGAATCATTTTCCTTCAAGGCCGGGAAGTACAATGCCAAGAAGTTCTGCCTTGAACCCACTTCATTCACAGTGAAGGCAGAGGGAGTAGCCAAGAACGCCCCACTTGAGTTCCAAAACACCAAGCTCATGACACGTCTGACCTACACCCTCGACGAGATCGAAGGACCCTTTGAGGTTTCCTCTGATGGCACTGTCAAGTTCGAGGAGAAAGATGGCATTGACTACGCTGCTGTCACAGTTCAGCTTCCCGGTGGCGAGCGTGTTCCATTCCTTTTCACCATCAAACAGTTGGTAGCATCTGGGAAGCCAGACAGCTTCAGTGGGGAGTTTCTAGTGCCTTCATACCGTGGATCTTCCTTCTTGGACCCCAAGGGAAGAGGTGCGTCAACTGGTTATGACAATGCTGTCGCATTGCCTGCTGGTGGCAGAGGAGATGAGGAAGAACTTGCTAAGGAGAACAACCAGAGTGCTTCTTCATCCCAAGGGAAGATCACCTTGAGCGTGACACAGAGCAAGCCTGATACCGGTGAGGTGATTGGTGTGTTCGAGAGCATTCAGCCGTCCGACACTGATTTGGGAGCGAAAGCTCCCAAGGATGTGAAGATCCAGGGAGTTTGGTATGCTCAGCTCGAGTCATAGACAGCTTTATCTCTCTTCTGCTTTATTTTGTATTTTGTTGTAACTTCTCAGTGTTGCTGCCATTACCTTTGACACCACTGTCCCAGCATGAGAGTGTTATCCTTGTTTGTATGTATACTATCGACTTTCAATTATAATGCTCGAAAATGTCCAAGGTTT
19
+ >TOG897619
20
+ AGCAGTGTTCCCATGAAACCTTCCCACTGAGTCAACTCACTCTGTACATAAAACCCTCTTCATCATCATCATGGCTTCTCAAGTTTTTCTTCAGCAAGGGTTGTTACTGTTTGCCCCAAACCAATGTTCTCCAACCAAGCTCGGTGTATCTTCTTGCCTCGGTTCTCGTAACTTTCCGTTGATTTCCTCCACCTCAATTTCATGGCGTTGCAACAACCCTCTCTCTGCCAAACCCTCTTTTGTTGTCAGAGCTGACTCCAATGTCGACGCTGCTTCCGACAATGCTGGTGAAGTTCCAGAAGCTGAAGGTAGCGTTGATCAGGTTCCTGAAGATGGAGAAGCAGAACTAGCTTCGGATTCTGAGGTGGAGCAACCCAAGCCCCCTAGAAAGCAACGAGTCAAGCTTGGAGATGTTATGGGGATATTGAATCAGAGGGCAATTGAGGCATCGGAAAGCATGAGGCCGACTCCAGAAATTAGGACTGGAGATGTTGTGGAAATCAAACTGGAAGTTCCTGAGAACAAGCGTAGGTTGTCTATTTATAAAGGTATAGTCATCTCAAGACAAAATGCTGGTATTCACACAACTATTCGAATCCGAAGGATTATTGCTGGCACAGGGGTTGAGATTGTCTTCCCAATTTACTCACCAAACATCAAAGAAATCAAAGTGGTAAACCACCGTAAAGTCAGAAGAGCAAGATTGTACTATTTAAGAGACAAGCTTCCCAGATTCTCCACTTTCAAATGATACGGTTACCACTTCTCATCCTGATCTTCTTCAAAGTAGTTGCTGATATTGCAGGGCCATATTTTGGTTATTTCGTTTTGTTGTGTTGTAGAATATATCATTTTTCTTCCTCTAAATCTATCCTCCGAGAATTGGAAACAAGTGTATGTATGTTGCCCTTGATAATATTTGAAATTTGAAGTGTTCTCCCTTGCATTCCTTGGTATAGGATAGAAAGCCAAGCTCCTAAACAAACATTACTAAATATGACAGTCTAAGGAATGAGCATGTGTATCGATACCAGTTAAGTGCATTGTGAATGTATTTTTTTTTTTTATCTCTATCCATAAAAAAAGGTATGTTCATTCTTG
21
+ >TOG898302
22
+ AAGAAACAAGAGAGAGAAGATGATTTAGATGAGCCAAAAACAAAGGAAAAACGGCAAAAGGGAGAGAAAGGAAAATCTCCATCAGGTTTTCTTGCTCCTCTCCAGCTATCTGATGCCCTTGTAAACTTCCTTGGTACTGGAGAAAGTGAATTATCAAGATCTGATGTCATAAAAAGAATGTGGGAATACATAAAAGGAAACGACCTTCAGGATCCTTCTGACAAGAGGAAAATATTATGCGACGACAAGCTGAAAGAACTCTTTGATGTGGACTCCTTTAACGGCTTCACCGTTACAAAACTGTTGACTCCTCATTTTATAAAGGCAGAGCAGTGAGTTGCTTGTGGAAATCGGTAATGTTGTCCAATTAGGTTTGGAAGGTCCTTCTTTTGTGGCCTTTTGGCATTGTCTGCCAACACGAGGAATAGGAATTAGGAACATGACAGATTTTCAGTAAATTTTTCTCCAAGAATTTAATGTTACGTGACCATTACTTTGTTTTTTTTAATATCACGTTTTGTCACTTGGCAGTTGAAATTTTTGTATATTTTCAGTTCCTGAAGCTGCAAGGATAATGCTGACTTCTTACTCTACTCTGCATTTGCTCATATGAGGCACTACACATATCCATAATACATGAATAAATTTGCAGTATTGAA
23
+ >TOG897516
24
+ CATTTGTTCCATTTGCTCAGGCATTTGCAGCTGTACTTACAGCTGTCCTTACTGGTTCTCTCTATTATGTGGCTGCCTCTCCTAAAGATCCTACTTATATTGTGGCACCTGTTTTACAGTCTCGCTCTGGTCGTCAAGATTTGAAAAAGCTATTTGAAGCCTGGTATGAGAAACGGCAAATGAAAAAAATATATTCACCACTTCTGGAAGGACTACTAGCTCTCTACCTAGGATTTGAGTGGATCCAAACGAATAACATTCTTGCTCCCATTATCACACATGGCATATACTCCACAGTTATATTGGGACATGGCCTTTGGAAGATAAACGACCACCGGCGAAGACTACGTCAAAGAATCCAACAGCTCAAATCTGAAGAACAAAATTCCCAGTAGACTTTGAAATACCTTCCATGTCTGGCTGTGATACAAAAAATGTATATGTATGTATTAGAGCTGCTAATTATGTAAAGAGAAAAGATGTATATACTTGTGTTAGCTGAGGTCTCGTACACACTGAATATTCAGGTTTTGTTCACCATTTTCTAATTTCGAGTTACTATATGTAGTGTTTTCTAATAAAATGAAATAAAATCCCCAAGTTGGGTTGATTTAAATT
25
+ >TOG894063
26
+ GAGACCTGTTATGATTCACAGAGCCATTCTAGGATCTGTTGAGCGCATGTTTGCCATTCTTTTAGAGCACTACAAGGGTAAATGGCCCTTGTGGCTCAGTCCTCGTCAAGCAATTGTATGTCCTGTGTCAGAGAAATCACAAGCTTATGCACTGCAGGTGCGAGATCAGATCCACCAAGCAGGATATCACGTTGATGCTGATACAACTGATCGGAAGATTCAGAAGAAGGTACGGGAAGCTCAATTAGCGCAGTACAACTACATCTTGGTTGTTGGAGAGGAGGAAGCTAATACAGGACAGGTGAGTGTACGGGTTAGAGATAAAGCAGACCATAGCGTTATGAGTATTGAGAATCTACTCAAACACTTCAGCGACGAAGTTGCAGCTTTTCATTGATACTTCTCTTGTGAAAACTGTTGGAAGCAAATTTTACCCCCACTCACCTAGTTTGTTCACACTTTGTGTGCATTATTTATATTTTCAGCCTGACAATTTACATTTAGATGATTTGGGTAATGACTGTATTTTCTATGTGAATTTTGGAGCGCACTGATATCGATCCATTGTTTGAAAAGCTGAGAGAAAGTGTAATCTTTTATTTTCTGTCTACATTTTAATTATGTTTTTCGTTAGTTTTTTCCTTTTATATATTTGTTTGTTAAATTGAAGGAAACTATTGTTGG
27
+ >TOG897346
28
+ GGCACCAGGGATCTTACAAGGCTGGATCTCCATAATAACAAGTTGACAGGGCCTATTCCTCCTCAAATTGGACGGTTGAAGCGTCTTAAAATACTCAATTTGAGGTGGAACAAACTACAGGATGCAATTCCTCCAGAAATTGGCGAGCTTAAAAGTTTAACACATCTGTACCTAAGCTTCAATAGTTTCAAGGGAGAAATTCCCAAAGAGCTAGCAAATCTTCCAGACCTTCGCTACCTTTATCTTCATGAAAACCGTTTAATTGGTAGGATACCACCTGAGTTGGGCACTCTACAAAACCTTCGGCACTTGGATGCTGGTAACAATCATTTGGTGGGTACCATAAGGGAACTCATTCGTATTGAAGGTTGCTTTCCAGCACTCCGCAATCTATATCTAAACAATAATTATTTTACTGGAGGAATGCCTGCACAACTTGCCAACTTATCCAGTCTTGAGATCTTGTACCTGTCCTACAATAAAATGTCAGGAGTTATACCATCTAGCCTTGCTCATATTCCTAAATTGACATACTTGTACTTGGATCACAATCAGTTTTCGGGGAGAATTCCCGAACCCTTTTACAAACATTCATTTTTGAAAGAAATGTACATCGAGGGAAATGCATTCCGGCCTGGTGTTAAACCCATTGGTTTCCATAAAGTGCTTGAAGTTTCTGATTCAGACTTCCTTGTTTAATGAAACTCAACATATTTAGTTTTTTAGGAAGTTTACGTGTATAATTAATGAAACAATAGCTCCTCTGATTTTCTCAATGAAAATTGCTATATGGGTAATTCAATTTTTGTCACGGCTGTCTTGTCAGAAGAATCAATAAATAATAGTGTTTTTTAACTCT
29
+ >TOG915900
30
+ GGAAATGAGCACAATGTTAAGCAGATCAAGAATTACCGCCAAAAGGTTGAGGAGGAACTCTCCAAAATTTGTGGTGACATCCTGACTATTATAGACCAGCATCTAATTCCTTCTTCCGCCTCAGCAGAAGCTAGTGTTTTCTACTATAAGATGAAAGGTGATTATTATCGGTATCTTGCTGAGTTCAAGACCGACCAAGAAAGGAAAGAGGCAGCCGAGCAGTCACTCAAGGGATATGAGGCTGCTTCAGCCACTGCCAACACCGATCTTCCATCAACACATCCAATCCGTCTTGGACTTGCTCTCAACTTCTCTGTCTTTTATTACGAGATCATGAACTCTCCTGAAAGGGCCTGCCATTTGGCTAAACAAGCTTTTGATGAGGCAATTGCAGAGTTGGACACCTTGAGTGAAGAGTCATACAAGGACAGTACTTTGATCATGCAGTTGTTGAGAGACAACCTGACTCTCTGGACATCCGATTTGCCAGAAGATGGAGGCGAGGAGAACATAAAAGCTGAAGAAGCCAAACCTACTGAGCCTGAGAATTAACTAGGTTCTTTTGGATCTTTGGCCCTGATTCAATAGTCAGATTTTTGTGGTGCTCTGCAAAGAGGGCATTTTTCAGCTTTTCTTGCAATGGATTTGGAATGGACAATATGAGCTGTCGCCACTTCATAATTACCAACCAAAGCCAAAAGATCTGAGCCTGCCTTTTCTTTATTTCTTTAAATTGTTTTTCTTTCTTACTGCCTTTATCTATTTTAAGCAAAGTGGTCGGTTGAAACAATGGATAATTCACATTTAAATCATAAGAATCTTTTTCAAGTGTTCATTACATCCGTTTTGGTTCGTTTAAAATATTGTTTCCTATGCGCTCCTAGATGGGATACAGTACAAGTATTCAACTGTTGAGCAGAGATTTTTACCTCAAAAAATTAGT
31
+ >TOG895871
32
+ AGACACAACATCATAGAAACAGATCAACAACACATTAAAATTAGCATGGATCATAGCTTACGTTGTTTTGGGTCGACACTACCCAAAACTCTTCTTCAGTTTCTGTTATCACCTTCACTCCTTCTCTTCATCTCCTTCTTCAGTTTCTCCAACGCAGCCTTCGACCTCGCCACCATACCCTTCAACGATGCCTATTCACCCCTCTTTGGGGATGGCAACCTTGTCCGCTCCGCCGATGGCAACGGTGTTCAACTCCTCCTCGATCGCTTCACCGGTTCTGGTTTCGTTTCTTCCAATATGTACCAGCATGGATTCTTCAGCGCCAATATCAAGCTACCATCGAATTACAGCGCTGGTATTTGCGTGGCCTTTTATACATCAAACAATGAGATGTTTGAGAAGACACACGATGAGTTAGACTTTGAATTCTTAGGTAATATAGCCGGAAAGCCTTGGAGGTTTCAGACAAACTTGTACGGCAATGGCAGCACCAACCGTGGCCGTGAGGAGCGGTACCGCCTCTGGTTTGATCCAACCAAGGGATTCCATAGATACAGCATTCTATGGACAGCTAAGAACATCATATTTTACATAGATGAGGTTCCAATTAGAGAAATTATAAGAAGTGAAGAAATGGGAGCTGATTACCCAGCAAAGCCAATGGCATTATACGCCACAATATGGGATGCATCAAATTGGGCCACATCGGGTGGAAA
33
+ >ADA84676.1 protein L-isoaspartyl methyltransferase 1 [Cicer arietinum]
34
+ MEQYWSGSAINENKGMVENLQRYGIIKSSKVAETMEKIDRGLFVPNGVQPYIDSPMSIGYNATISAPHMHATCLQLLENYLQPGMHALDVGSGTGYLTACFAMMVGPNGRAVGVEHIPELVSFSINNIEKSAAAPQLKDGSLSVHEGDGRQGWPEFATYDAIHVGAAAPEIPQPLIDQLKTGGRMIIPVGNVFQDLKVVDKNSDGSISIRTETSVRYVPLTSKEAQLKE
35
+ >ADA84676.2 protein L-isoaspartyl methyltransferase 1 [Cicer arietinum]
36
+ MEQYWSGSAGIIKSSKVAETMEKIDRGLFVPNGVQPYIDSPMSIGYNATISAPHMHATCLQLLENYLQINENKGMVENLQRYPGMHALDVGSGTGYLTACFAMMVGPNGRAVGVEHIPELVSFSINNIEKSAAAPQLKDGSLSVHEGDGRQGWPEFATYDAIHVGAAAPEIPGIIKSSKVAETMEKIDRGLFVPNGVQPYIDSPMSIGYNATISAPHMHATCLQLLENYLQPLIDQLKTGGRMIIPVGNVFQDLKVVDKNSDGSISIRTETGIIKSSKVAETMEKIDRGLFVPNGVQPYIDSPMSIGYNATISAPHMHATCLQLLENYLQSVRYVPLTSKEAQLKE