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,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