Added script front-end for primer-design code
authorTim Reddy Tim <treddy@hudsonalpha.org>
Tue, 25 Nov 2008 01:26:35 +0000 (01:26 +0000)
committerTim Reddy Tim <treddy@hudsonalpha.org>
Tue, 25 Nov 2008 01:26:35 +0000 (01:26 +0000)
htswanalysis/scripts/primer_design.pm [new file with mode: 0755]

diff --git a/htswanalysis/scripts/primer_design.pm b/htswanalysis/scripts/primer_design.pm
new file mode 100755 (executable)
index 0000000..9ce2e2a
--- /dev/null
@@ -0,0 +1,173 @@
+#!/usr/bin/perl -w
+
+use strict;
+use File::Basename;
+use File::Temp qw(tempfile);
+
+my $bed_file = shift;
+my $library = shift;
+my $root_dir = shift;
+my $data_dir = shift;
+
+if(!defined($library) || $library eq "") {
+  die "Error: no library indicated\n";
+}
+if( -z "~Data/Libraries/$library.txt") {
+  die "Error: library $library does not exist\n";
+}
+
+my @data = `$root_dir/bin/refine_peaks $bed_file $data_dir/Libraries/$library.txt $root_dir/reference_data/hg18_chrom_list.txt 2> $bed_file.err`;
+
+unless(-z "$bed_file.err") {
+  warn "Errors found: check $tmp_filename.err\n";
+}
+
+my $designed = "";
+my $missed = "";
+
+my($total,$no_match) = (0,0);
+my($id,$fseq,$rseq,$ftm,$rtm,$len);
+my @primers;
+for(@data) {
+  if($_ =~ /^PRIMER_SEQUENCE_ID=(.*)$/) { $id = $1; }
+  if($_ =~ /^PRIMER_LEFT_SEQUENCE=(.*)$/) { $fseq = $1; }
+  if($_ =~ /^PRIMER_RIGHT_SEQUENCE=(.*)$/) { $rseq = $1; }
+  if($_ =~ /^PRIMER_LEFT_TM=(.*)$/) { $ftm = $1; }
+  if($_ =~ /^PRIMER_RIGHT_TM=(.*)$/) { $rtm = $1; }
+  if($_ =~ /^PRIMER_PRODUCT_SIZE=(.*)$/) { 
+    $len = $1;
+    my %primer;
+
+    my($chr,$start,$stop,$score,$count,$call_start,$call_end,$call_count) = split(/_/,$id);
+    $primer{chr} = $chr;
+    $primer{start} = $start;
+    $primer{stop} = $stop;
+    $primer{score} = $score;
+    $primer{count} = $count;
+    $primer{call_start} = $call_start;
+    $primer{call_end} = $call_end;
+    $primer{call_count} = $call_count;
+    $primer{F}{seq} = $fseq; 
+    $primer{R}{seq} = $rseq; 
+    $primer{F}{tm} = $ftm;
+    $primer{R}{tm} = $rtm;
+    $primer{len} = $len;
+    push(@primers, \%primer);
+  }
+  if($_ =~ /^=$/) {
+    if(!defined($fseq)) {
+      $no_match++;
+    }
+    $total++;
+    ($id,$fseq,$rseq,$ftm,$rtm) = (undef,undef,undef,undef,undef);
+  }
+}
+
+# sort primers, get min and max score
+my @sorted_primers = sort { my %c = %{$a}; my %d = %{$b}; return $c{score} <=> $d{score}; } @primers;
+my $min_score = $sorted_primers[0]{score};
+my $max_score = $sorted_primers[scalar(@sorted_primers)-1]{score};
+
+#my @sorted_primers = sort { my %c = %{$a}; my %d = %{$b}; return $c{call_count} <=> $d{call_count}; } @primers;
+#my $min_score = $sorted_primers[0]{call_count};
+#my $max_score = $sorted_primers[scalar(@sorted_primers)-1]{call_count};
+
+my $num_primers = 44;
+my $score_range = $max_score - $min_score;
+my $score_increment = $score_range / ($num_primers+1);
+
+print '
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+   <title>Results</title>
+   <style type="text/css">
+     img {border: none;}
+   </style>
+ </head>
+ <body>
+ ';
+print "<H3>Score range ($min_score,$max_score)</H3><BR>\n";
+print "<TABLE BORDER=1>\n";
+
+print "<TR><TD><EM>Score</EM></TD><TD><EM>Count</EM></TD><TD><EM>Call</EM></TD><TD><EM>Call Count</EM></TD><TD><EM>Sequence</EM></TD><TD><EM>Tm (&deg;C)</EM></TD><TD><EM>Amplicon Size (bp)</EM></TR>\n";
+
+my %plate;
+$plate{A1} = "TGCTTTGGTTTGGTTTGATTTCC";  #neg2-F
+$plate{A2} = "AGCCAAAAGAAGGAAGCAACAGC";  #neg5-F
+$plate{C1} = "TGCTTTGGTTTGGTTTGATTTCC";  #neg2-F
+$plate{C2} = "AGCCAAAAGAAGGAAGCAACAGC";  #neg5-F
+$plate{E1} = "GCTCCAAAATTCAGGTGAAATGG";  #neg2-R
+$plate{E2} = "AGGGCTGGAAGCAATGAGAAAAG";  #neg5-R
+$plate{G1} = "GCTCCAAAATTCAGGTGAAATGG";  #neg2-R
+$plate{G2} = "AGGGCTGGAAGCAATGAGAAAAG";  #neg5-R
+
+my @f_output_order = (
+"A3","A4","A5","A6","A7","A8","A9","A10","A11","A12",
+"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12",
+"C3","C4","C5","C6","C7","C8","C9","C10","C11","C12",
+"D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12"
+);
+
+my @r_output_order = (
+"E3","E4","E5","E6","E7","E8","E9","E10","E11","E12",
+"F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12",
+"G3","G4","G5","G6","G7","G8","G9","G10","G11","G12",
+"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12"
+);
+
+my @plate_output_order = (
+"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12",
+"B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12",
+"C1","C2","C3","C4","C5","C6","C7","C8","C9","C10","C11","C12",
+"D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12",
+"E1","E2","E3","E4","E5","E6","E7","E8","E9","E10","E11","E12",
+"F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12",
+"G1","G2","G3","G4","G5","G6","G7","G8","G9","G10","G11","G12",
+"H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12"
+);
+
+my @chosen_primers;
+my $primer_index = 0;
+my $score_thresh = $min_score;
+
+my %bins;
+my $score_low = $min_score;
+my $score_high = $min_score;
+my $bin_id;
+for(0..$num_primers-1) {
+  $score_low = $score_high;
+  $score_high = $score_high + $score_increment;
+  $bin_id = $_;
+  my @a; $bins{$bin_id} = \@a;
+  while($sorted_primers[$primer_index]{score} < $score_high) { 
+    push @{$bins{$bin_id}}, $primer_index; 
+    $primer_index++; 
+    if($primer_index >= scalar(@sorted_primers)) { last; } 
+  } 
+}
+
+for(0..$num_primers-1) {
+  $score_thresh += $score_increment;
+  my $bin_idx = $_;
+  my $bin_size;
+  
+  $bin_size = scalar(@{$bins{$bin_idx}});
+  while($bin_size == 0) { 
+    $bin_idx--; 
+    $bin_size = scalar(@{$bins{$bin_idx}});
+  }
+  $primer_index = pop(@{$bins{$bin_idx}});
+  print "<TR><TD ROWSPAN=2>$sorted_primers[$primer_index]{score}</TD><TD ROWSPAN=2>$sorted_primers[$primer_index]{chr}:$sorted_primers[$primer_index]{call_start}-$sorted_primers[$primer_index]{call_end}<TD ROWSPAN=2>$sorted_primers[$primer_index]{count}</TD><TD ROWSPAN=2>$sorted_primers[$primer_index]{call_count}</TD><TD>$sorted_primers[$primer_index]{F}{seq}</TD><TD>$sorted_primers[$primer_index]{F}{tm}</TD><TD ROWSPAN=2>$sorted_primers[$primer_index]{len}</TD></TR>\n";
+  print "<TR><TD>$sorted_primers[$primer_index]{R}{seq}</TD><TD>$sorted_primers[$primer_index]{R}{tm}</TD></TR>\n";
+  $plate{$f_output_order[$_]} = $sorted_primers[$primer_index]{F}{seq};
+  $plate{$r_output_order[$_]} = $sorted_primers[$primer_index]{R}{seq};
+}
+
+print '</table><BR><BR><H2>Plate Order</H2><TABLE BORDER=1>';
+for (@plate_output_order) {
+  print "<TR><TD>$_</TD><TD>$plate{$_}</TD></TR>\n";
+}
+print '</TABLE></body></html>';