quorum 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +170 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +318 -0
- data/Rakefile +31 -0
- data/app/assets/images/quorum/.gitkeep +0 -0
- data/app/assets/images/quorum/bg.png +0 -0
- data/app/assets/images/quorum/knight_rider.gif +0 -0
- data/app/assets/images/quorum/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/quorum/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/images/quorum/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/app/assets/images/quorum/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/quorum/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/app/assets/images/quorum/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/app/assets/images/quorum/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/app/assets/images/quorum/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
- data/app/assets/images/quorum/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/quorum/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/images/quorum/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/quorum/ui-icons_888888_256x240.png +0 -0
- data/app/assets/images/quorum/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/javascripts/quorum/application.js +13 -0
- data/app/assets/javascripts/quorum/jobs.js +386 -0
- data/app/assets/stylesheets/quorum/application.css +224 -0
- data/app/assets/stylesheets/quorum/jobs.css +72 -0
- data/app/assets/stylesheets/quorum/jquery-ui-1.8.16.custom.css +568 -0
- data/app/assets/stylesheets/quorum/tipsy.css +25 -0
- data/app/controllers/quorum/application_controller.rb +5 -0
- data/app/controllers/quorum/jobs_controller.rb +102 -0
- data/app/helpers/quorum/application_helper.rb +4 -0
- data/app/models/quorum/blastn_job.rb +111 -0
- data/app/models/quorum/blastn_job_report.rb +7 -0
- data/app/models/quorum/blastp_job.rb +111 -0
- data/app/models/quorum/blastp_job_report.rb +7 -0
- data/app/models/quorum/blastx_job.rb +111 -0
- data/app/models/quorum/blastx_job_report.rb +7 -0
- data/app/models/quorum/job.rb +164 -0
- data/app/models/quorum/tblastn_job.rb +111 -0
- data/app/models/quorum/tblastn_job_report.rb +7 -0
- data/app/views/layouts/quorum/application.html.erb +15 -0
- data/app/views/quorum/jobs/_blastn_form.html.erb +71 -0
- data/app/views/quorum/jobs/_blastp_form.html.erb +71 -0
- data/app/views/quorum/jobs/_blastx_form.html.erb +71 -0
- data/app/views/quorum/jobs/_tblastn_form.html.erb +71 -0
- data/app/views/quorum/jobs/new.html.erb +45 -0
- data/app/views/quorum/jobs/show.html.erb +183 -0
- data/app/views/shared/_error_messages.html.erb +10 -0
- data/config/locales/en.yml +8 -0
- data/config/routes.rb +9 -0
- data/db/migrate/20111031204518_create_jobs.rb +12 -0
- data/db/migrate/20111031204701_create_blastn_jobs.rb +19 -0
- data/db/migrate/20111031204719_create_blastx_jobs.rb +19 -0
- data/db/migrate/20111031204733_create_blastp_jobs.rb +19 -0
- data/db/migrate/20111031204754_create_tblastn_jobs.rb +19 -0
- data/db/migrate/20111031204846_create_blastn_job_reports.rb +34 -0
- data/db/migrate/20111031204903_create_blastx_job_reports.rb +34 -0
- data/db/migrate/20111031204922_create_blastp_job_reports.rb +34 -0
- data/db/migrate/20111031204941_create_tblastn_job_reports.rb +34 -0
- data/lib/generators/quorum/install_generator.rb +68 -0
- data/lib/generators/quorum/styles_generator.rb +18 -0
- data/lib/generators/quorum/views_generator.rb +18 -0
- data/lib/generators/templates/README +25 -0
- data/lib/generators/templates/blast.rb +412 -0
- data/lib/generators/templates/logger.rb +43 -0
- data/lib/generators/templates/quorum_initializer.rb +36 -0
- data/lib/generators/templates/quorum_settings.yml +157 -0
- data/lib/generators/templates/search +141 -0
- data/lib/generators/templates/trollop.rb +781 -0
- data/lib/quorum/engine.rb +5 -0
- data/lib/quorum/helpers.rb +17 -0
- data/lib/quorum/sequence.rb +89 -0
- data/lib/quorum/version.rb +3 -0
- data/lib/quorum.rb +89 -0
- data/lib/tasks/blastdb/README +17 -0
- data/lib/tasks/blastdb/build_blast_db.rb +222 -0
- data/lib/tasks/quorum_resque.rake +3 -0
- data/lib/tasks/quorum_tasks.rake +50 -0
- data/lib/workers/quorum.rb +45 -0
- data/quorum.gemspec +29 -0
- data/script/rails +6 -0
- data/spec/data/nucl_prot_seqs.txt +36 -0
- data/spec/data/nucl_seqs.txt +32 -0
- data/spec/data/prot_seqs.txt +4 -0
- data/spec/data/seqs.docx +0 -0
- data/spec/data/seqs_not_fa.txt +16 -0
- data/spec/data/tmp/test.tgz +0 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/blast.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +46 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/environment.rb +20 -0
- data/spec/dummy/config/environments/development.rb +30 -0
- data/spec/dummy/config/environments/production.rb +60 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/quorum_initializer.rb +36 -0
- data/spec/dummy/config/initializers/resque.rb +1 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/locales/quorum.en.yml +8 -0
- data/spec/dummy/config/quorum_settings.yml +145 -0
- data/spec/dummy/config/routes.rb +9 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/schema.rb +214 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/quorum/bin/search +141 -0
- data/spec/dummy/quorum/blastdb/test/contigs.fa +2 -0
- data/spec/dummy/quorum/blastdb/test/peptides.fa +2 -0
- data/spec/dummy/quorum/blastdb/test.nhd +1 -0
- data/spec/dummy/quorum/blastdb/test.nhi +0 -0
- data/spec/dummy/quorum/blastdb/test.nhr +0 -0
- data/spec/dummy/quorum/blastdb/test.nin +0 -0
- data/spec/dummy/quorum/blastdb/test.nog +0 -0
- data/spec/dummy/quorum/blastdb/test.nsd +1 -0
- data/spec/dummy/quorum/blastdb/test.nsi +0 -0
- data/spec/dummy/quorum/blastdb/test.nsq +0 -0
- data/spec/dummy/quorum/blastdb/test.phd +1 -0
- data/spec/dummy/quorum/blastdb/test.phi +0 -0
- data/spec/dummy/quorum/blastdb/test.phr +0 -0
- data/spec/dummy/quorum/blastdb/test.pin +0 -0
- data/spec/dummy/quorum/blastdb/test.pog +0 -0
- data/spec/dummy/quorum/blastdb/test.psd +1 -0
- data/spec/dummy/quorum/blastdb/test.psi +0 -0
- data/spec/dummy/quorum/blastdb/test.psq +0 -0
- data/spec/dummy/quorum/lib/logger.rb +43 -0
- data/spec/dummy/quorum/lib/search_tools/blast.rb +412 -0
- data/spec/dummy/quorum/lib/trollop.rb +781 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/models/blastn_job_report_spec.rb +13 -0
- data/spec/models/blastn_job_spec.rb +103 -0
- data/spec/models/blastp_job_report_spec.rb +13 -0
- data/spec/models/blastp_job_spec.rb +103 -0
- data/spec/models/blastx_job_report_spec.rb +13 -0
- data/spec/models/blastx_job_spec.rb +103 -0
- data/spec/models/job_spec.rb +40 -0
- data/spec/models/tblastn_job_report_spec.rb +13 -0
- data/spec/models/tblastn_job_spec.rb +103 -0
- data/spec/quorum/quorum_sequence_spec.rb +64 -0
- data/spec/quorum_installed_spec.rb +64 -0
- data/spec/requests/jobs_spec.rb +138 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/tasks/blastdb_rake_spec.rb +119 -0
- data/spec/templates/blast_spec.rb +8 -0
- data/spec/templates/logger_spec.rb +35 -0
- data/vendor/assets/javascripts/jquery.tipsy.js +241 -0
- data/vendor/assets/javascripts/underscore-min.js +30 -0
- metadata +325 -0
@@ -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
|
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,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
|