From 04994ea1d5a77639ccc6bc011d1ab106fb62acf7 Mon Sep 17 00:00:00 2001 From: Tim Reddy Tim Date: Tue, 25 Nov 2008 01:26:35 +0000 Subject: [PATCH] Added script front-end for primer-design code --- htswanalysis/scripts/primer_design.pm | 173 ++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100755 htswanalysis/scripts/primer_design.pm diff --git a/htswanalysis/scripts/primer_design.pm b/htswanalysis/scripts/primer_design.pm new file mode 100755 index 0000000..9ce2e2a --- /dev/null +++ b/htswanalysis/scripts/primer_design.pm @@ -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 ' + + + + + Results + + + + '; +print "

Score range ($min_score,$max_score)


\n"; +print "\n"; + +print "\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 "\n"; + print "\n"; + $plate{$f_output_order[$_]} = $sorted_primers[$primer_index]{F}{seq}; + $plate{$r_output_order[$_]} = $sorted_primers[$primer_index]{R}{seq}; +} + +print '
ScoreCountCallCall CountSequenceTm (°C)Amplicon Size (bp)
$sorted_primers[$primer_index]{score}$sorted_primers[$primer_index]{chr}:$sorted_primers[$primer_index]{call_start}-$sorted_primers[$primer_index]{call_end}$sorted_primers[$primer_index]{count}$sorted_primers[$primer_index]{call_count}$sorted_primers[$primer_index]{F}{seq}$sorted_primers[$primer_index]{F}{tm}$sorted_primers[$primer_index]{len}
$sorted_primers[$primer_index]{R}{seq}$sorted_primers[$primer_index]{R}{tm}


Plate Order

'; +for (@plate_output_order) { + print "\n"; +} +print '
$_$plate{$_}
'; -- 2.30.2