lib/bio/db/primer3.rb in bio-polyploid-tools-0.5.2 vs lib/bio/db/primer3.rb in bio-polyploid-tools-0.6.0
- old
+ new
@@ -15,22 +15,22 @@
return defaults
end
def self.prepare_input_file(file, opts2={})
- opts = {
- :primer_product_size_range => "50-150" ,
- :primer_max_size => 25 ,
- :primer_lib_ambiguity_codes_consensus => 1,
- :primer_liberal_base => 1,
- :primer_num_return => 5,
- :primer_explain_flag => 1,
- :primer_thermodynamic_parameters_path => File.expand_path(File.dirname(__FILE__) + '../../../../conf/primer3_config/') + '/'
+ opts = {
+ :primer_product_size_range => "50-150" ,
+ :primer_max_size => 25 ,
+ :primer_lib_ambiguity_codes_consensus => 1,
+ :primer_liberal_base => 1,
+ :primer_num_return => 5,
+ :primer_explain_flag => 1,
+ :primer_thermodynamic_parameters_path => File.expand_path(File.dirname(__FILE__) + '../../../../conf/primer3_config/') + '/'
}.merge(opts2)
opts.each do |key,value|
- file.puts "#{key.to_s.upcase}=#{value}\n"
+ file.puts "#{key.to_s.upcase}=#{value}\n"
end
# file.puts "="
end
def self.run(opts={})
@@ -66,11 +66,11 @@
def initialize
@primers_line_1 = SortedSet.new
@primers_line_2 = SortedSet.new
@regions = SortedSet.new
- @primer3_errors = Set.new
+ @primer3_errors = Set.new
end
def line_2_name
"#{gene}:#{position}#{original}>#{snp} #{line_2}}"
end
@@ -104,58 +104,57 @@
return pr if find_left_primer_temp(primer) != "NA"
end
nil
end
-
- def print_primers
-#TODO: Retrieve error messages
+ def values
+ return @values if @values
left_start = 0
left_end = 0
right_start = 0
right_end = 0
total_columns_before_messages=17
- values = Array.new
- #values << "#{gene},,#{template_length},"
- values << gene
- values << "#{original}#{position}#{snp}"
- values << template_length
- values << snp_from.chromosome
- values << regions.size
- values << regions.join("|")
+ @values = Array.new
+ #@values << "#{gene},,#{template_length},"
+ @values << gene
+ @values << "#{original}#{position}#{snp}"
+ @values << template_length
+ @values << snp_from.chromosome
+ @values << regions.size
+ @values << regions.join("|")
if primer3_line_1 and primer3_line_2
- values << primer3_line_1.polymorphism
+ @values << primer3_line_1.polymorphism
#Block that searches both if both pairs have a TM
primer_2 = primer3_line_2.left_primer_with_coordinates(primer3_line_1.left_coordinates, primer3_line_1.orientation)
primer_2_tm = find_left_primer_temp(primer_2)
primer_1 = primer3_line_1.left_primer_with_coordinates(primer3_line_2.left_coordinates, primer3_line_2.orientation)
primer_1_tm = find_left_primer_temp(primer_1)
# $stderr.puts primer_1
# $stderr.puts primer_2
if primer3_line_1 < primer3_line_2 and primer_2_tm != "NA"
- values << primer3_line_1.left_primer
- values << primer_2
- values << primer3_line_1.right_primer
- values << primer3_line_1.type.to_s
- values << primer3_line_1.orientation.to_s
- values << primer3_line_1.best_pair.left.tm
- values << primer_2_tm
- values << primer3_line_1.best_pair.right.tm
- values << "first"
- values << primer3_line_1.best_pair.product_size
+ @values << primer3_line_1.left_primer
+ @values << primer_2
+ @values << primer3_line_1.right_primer
+ @values << primer3_line_1.type.to_s
+ @values << primer3_line_1.orientation.to_s
+ @values << primer3_line_1.best_pair.left.tm
+ @values << primer_2_tm
+ @values << primer3_line_1.best_pair.right.tm
+ @values << "first"
+ @values << primer3_line_1.best_pair.product_size
elsif primer_1_tm != "NA"
- values << primer_1
- values << primer3_line_2.left_primer
- values << primer3_line_2.right_primer
- values << primer3_line_2.type.to_s
- values << primer3_line_2.orientation.to_s
- values << primer_1_tm
- values << primer3_line_2.best_pair.left.tm
- values << primer3_line_2.best_pair.right.tm
- values << "second"
- values << primer3_line_2.best_pair.product_size
+ @values << primer_1
+ @values << primer3_line_2.left_primer
+ @values << primer3_line_2.right_primer
+ @values << primer3_line_2.type.to_s
+ @values << primer3_line_2.orientation.to_s
+ @values << primer_1_tm
+ @values << primer3_line_2.best_pair.left.tm
+ @values << primer3_line_2.best_pair.right.tm
+ @values << "second"
+ @values << primer3_line_2.best_pair.product_size
else
first_candidate = find_primer_pair_first
second_candidate = find_primer_pair_second
@@ -170,86 +169,105 @@
#puts "In the other funky if #{primer_2}"
end
if first_candidate and second_candidate and first_candidate < second_candidate
#puts "A"
- values << first_candidate.left_primer
- values << primer_2
- values << first_candidate.right_primer
- values << first_candidate.type.to_s
- values << first_candidate.orientation.to_s
- values << first_candidate.best_pair.left.tm
- values << primer_2_tm
- values << first_candidate.best_pair.right.tm
- values << "first"
- values << first_candidate.best_pair.product_size
+ @values << first_candidate.left_primer
+ @values << primer_2
+ @values << first_candidate.right_primer
+ @values << first_candidate.type.to_s
+ @values << first_candidate.orientation.to_s
+ @values << first_candidate.best_pair.left.tm
+ @values << primer_2_tm
+ @values << first_candidate.best_pair.right.tm
+ @values << "first"
+ @values << first_candidate.best_pair.product_size
elsif second_candidate
#puts "B"
- values << primer_1
- values << second_candidate.left_primer
- values << second_candidate.right_primer
- values << second_candidate.type.to_s
- values << second_candidate.orientation.to_s
- values << primer_1_tm
- values << second_candidate.best_pair.left.tm
- values << second_candidate.best_pair.right.tm
- values << "second"
- values << second_candidate.best_pair.product_size
+ @values << primer_1
+ @values << second_candidate.left_primer
+ @values << second_candidate.right_primer
+ @values << second_candidate.type.to_s
+ @values << second_candidate.orientation.to_s
+ @values << primer_1_tm
+ @values << second_candidate.best_pair.left.tm
+ @values << second_candidate.best_pair.right.tm
+ @values << "second"
+ @values << second_candidate.best_pair.product_size
elsif first_candidate
#puts "C"
- values << first_candidate.left_primer
- values << primer_2
- values << first_candidate.right_primer
- values << first_candidate.type.to_s
- values << first_candidate.orientation.to_s
- values << primer_2_tm
- values << first_candidate.best_pair.left.tm
- values << first_candidate.best_pair.right.tm
- values << "first"
- values << first_candidate.best_pair.product_size
-# else
-# values << ""
+ @values << first_candidate.left_primer
+ @values << primer_2
+ @values << first_candidate.right_primer
+ @values << first_candidate.type.to_s
+ @values << first_candidate.orientation.to_s
+ @values << primer_2_tm
+ @values << first_candidate.best_pair.left.tm
+ @values << first_candidate.best_pair.right.tm
+ @values << "first"
+ @values << first_candidate.best_pair.product_size
end
-
end
elsif primer3_line_1
- values << primer3_line_1.polymorphism
- values << primer3_line_1.left_primer
- values << primer3_line_1.left_primer_snp(self)
- values << primer3_line_1.right_primer
- values << primer3_line_1.type.to_s
- values << primer3_line_1.orientation.to_s
- values << primer3_line_1.best_pair.left.tm
- values << "NA"
- values << primer3_line_1.best_pair.right.tm
+ @values << primer3_line_1.polymorphism
+ @values << primer3_line_1.left_primer
+ @values << primer3_line_1.left_primer_snp(self)
+ @values << primer3_line_1.right_primer
+ @values << primer3_line_1.type.to_s
+ @values << primer3_line_1.orientation.to_s
+ @values << primer3_line_1.best_pair.left.tm
+ @values << "NA"
+ @values << primer3_line_1.best_pair.right.tm
- values << "first+"
- values << primer3_line_1.best_pair.product_size
+ @values << "first+"
+ @values << primer3_line_1.best_pair.product_size
elsif primer3_line_2
- values << primer3_line_2.polymorphism
- values << primer3_line_2.left_primer_snp(self)
- values << primer3_line_2.left_primer
- values << primer3_line_2.right_primer
- values << primer3_line_2.type.to_s
- values << primer3_line_2.orientation.to_s
- values << "NA"
- values << primer3_line_2.best_pair.left.tm
- values << primer3_line_2.best_pair.right.tm
- values << "second+"
- values << primer3_line_2.best_pair.product_size
+ @values << primer3_line_2.polymorphism
+ @values << primer3_line_2.left_primer_snp(self)
+ @values << primer3_line_2.left_primer
+ @values << primer3_line_2.right_primer
+ @values << primer3_line_2.type.to_s
+ @values << primer3_line_2.orientation.to_s
+ @values << "NA"
+ @values << primer3_line_2.best_pair.left.tm
+ @values << primer3_line_2.best_pair.right.tm
+ @values << "second+"
+ @values << primer3_line_2.best_pair.product_size
end
- if values.size < total_columns_before_messages
- values[total_columns_before_messages] = primer3_errors.to_a.join("|")
+ if @values.size < total_columns_before_messages
+ @values[total_columns_before_messages] = primer3_errors.to_a.join("|")
else
- values << nil
+ @values << nil
end
+ return @values
+ end
- values.join(",")
+ def print_primers
+ self.values.join(",")
end
+ def found_primers?
+ return self.values[7] && self.values[7] != nil
+ end
+
+ def first_primer
+ return self.values[7] if self.values[7] && self.values[7] != nil
+ return ""
+ end
+
+ def second_primer
+ return self.values[8] if self.values[8] && self.values[8] != nil
+ return ""
+ end
+
+ def common_primer
+ return self.values[9] if self.values[9]&& self.values[9] != nil
+ return ""
+ end
+
def self.parse(reg_str)
reg_str.chomp!
snp = SNP.new
snp.gene, snp.original, snp.position, snp.snp = reg_str.split(",")
snp.position = snp.position.to_i
@@ -271,14 +289,14 @@
def add_record(primer3record)
@primer3_errors = Set.new unless @primer3_errors
@template_length = primer3record.sequence_template.size
- if primer3record.primer_error != nil
- primer3_errors << primer3record.primer_error
- return
- end
+ if primer3record.primer_error != nil
+ primer3_errors << primer3record.primer_error
+ return
+ end
case
when primer3record.line == @line_1
@line_1_template = primer3record.sequence_template
@@ -449,11 +467,11 @@
@scores = Hash.new
@scores[:chromosome_specific] = 1000
@scores[:chromosome_semispecific] = 100
@scores[:chromosome_nonspecific] = 0
@scores[:exon] = 50
-
+
end
def snp
return @snp if @snp
parse_header
@@ -652,12 +670,12 @@
class KASPContainer
attr_accessor :line_1, :line_2
attr_accessor :snp_hash
-
+
def add_snp_file(filename)
@snp_hash=Hash.new unless @snp_hash
SNP.parse_file(filename) do |snp|
@snp_hash[snp.to_s] = snp
snp.line_1 = @line_1
@@ -694,8 +712,21 @@
snp_hash.each do |k, snp|
str << snp.print_primers << "\n"
end
return str
end
+
+ def print_primers_with_tails(tail_a: "GAAGGTCGGAGTCAACGGATT", tail_b: "GAAGGTGACCAAGTTCATGCT")
+ str = ""
+ snp_hash.each do |k, snp|
+ if snp.found_primers?
+ str << snp.gene << snp.original << "\t" << tail_a << snp.first_primer << "\n"
+ str << snp.gene << snp.snp << "\t" << tail_b << snp.second_primer << "\n"
+ str << snp.gene << "\t" << snp.common_primer << "\n"
+ end
+ end
+ return str
+ end
+
end
end