#!/usr/local/perl/bin/perl

use Sybase::CTlib;

use CGI qw/:html3/;

my $q = new CGI;

print $q->header;
print $q->start_html(-title=>"Probe Search for DNA Oligo Microarray");
print "<h1>Welcome to DNA probe database for DNA Oligo microarray</h1>";
print "<h3>Please fill out the form based on each requirement</h3>";
print $q->start_form,
"<b>Organism</b>",
$q->popup_menu(-name=>'genome', -value=>['T7 phage', 'E. coli', 'S. cerevisial', 'C. elegans'], -default=>'T7 phage'),
$q->p(),
"<b>One gene name or type 'all'</b>",
$q->textfield(-name=>'gene_name', -value=>'all', -size=>40),
$q->p(),
"<b>Lowest melting temperature</b>",
$q->textfield(-name=>'tm1', -value=>65, -size=>40),
$q->p(),
"<b>Highest melting temperature</b>",
$q->textfield(-name=>'tm2', -value=>75, -size=>40),
$q->p(),
$q->submit(-name=>'submit'), $q->reset(-name=>'reset'),
$q->end_form;

print "<h2>For the detail information on each gene and probe please follow this</h2>";
print "If you like to know the detail information about the gene, please click ";
print $q->a({-href=>'probe1.pl'}, 'Gene Information');
print $q->p();
print "If you like to know the detail information about each probe, please click ";
print $q->a({-href=>'probe2.pl'}, 'Probe Information');
print $q->p();
print "If you have any question, please send email to: ";
print $q->a({-href=>'mailto:lif@ural.wustl.edu'}, 'lif@ural.wustl.edu');

$organism = $q->param('genome');
$gene_name = $q->param('gene_name');
$tm1 = $q->param('tm1');
$tm2 = $q->param('tm2');

if($organism eq 'T7 phage') {
   $table_name = 'T7_probe_data';
}
elsif($organism eq 'E. coli') {
   $table_name = 'ecoli_probe_data';
}
elsif($organism eq 'S. cerevisial') {
   $table_name = 'yeast_probe_data';
}
elsif($organism eq 'C. elegans') {
   print "<h1>we will add worm database soon</h1>";
   exit(0);
}            

if ($gene_name) {
  $d = new Sybase::CTlib lif, Fugen501;
  if($gene_name eq 'all') {
     @rows = $d->ct_sql("select * from $table_name where Tm >= $tm1 and Tm <= $tm2 and num_mismatches = 0");
  }
  else { @rows = $d->ct_sql("select * from $table_name where Tm >= $tm1 and Tm <= $tm2 and gene_name = '$gene_name' and num_mismatches = 0");
  }  
  print "<h1>Results for your search</h1>\n";
  if ($organism eq 'T7 phage') {
     @col_head = qw(gene_name probe_name probe_sequence beg_position end_position deltaG Tm);
     #print "<pre><b>gene_name   probe_name   align_probe   align_seq   match_gene   bpos_mgene   epos_mgene   mismatch_num   deltaG   Tm</b><p>";
  
     foreach $row_ref (@rows) {
        ($name, $probe_name, $align_probe, $align_gene, $match_gene, $mbegin_pos, $mend_pos, $num_mismatches, $deltaG, $Tm) = ($$row_ref[0], $$row_ref[1], $$row_ref[2], $$row_ref[3], $$row_ref[4], $$row_ref[5], $$row_ref[6], $$row_ref[7], $$row_ref[8], $$row_ref[10]);
        if(tm_check($name, $probe_name, $Tm)) {
           @data = ($name, $probe_name, $align_probe, $mbegin_pos, $mend_pos, $deltaG, $Tm);
           push(@rws, $q->td(\@data));
           #print "<pre><b>$name  $probe_name  $align_probe  $align_gene  $match_gene  $mbegin_pos  $mend_pos  $num_mismatches  $deltaG  $Tm</b><p>";
        }
     }
     print $q->table({-border=>''}, caption($caption), TR([th(\@col_head), @rws]));
  }  
  else {  print "<pre><b>gene_name        probe_name           align_probe             hybrid_seq      match_gene   bpos_mgene   epos_mgene   mismatch_num  deltaG            Tm</b><p>";
  
          foreach $row_ref (@rows) {
             ($name, $probe_name, $align_probe, $align_gene, $match_gene, $mbegin_pos, $mend_pos, $num_mismatches, $deltaG, $Tm) = ($$row_ref[0], $$row_ref[1], $$row_ref[2], $$row_ref[3], $$row_ref[4], $$row_ref[5], $$row_ref[6], $$row_ref[7], $$row_ref[8], $$row_ref[10]);
             if(tm_check($name, $probe_name, $Tm)) {
                 if (($organism eq 'S. cerevisial') || ($organism eq 'C. elegans')) {
                    $mbegin_pos -= 1;
                    $mend_pos -= 1;
                 }   
                 print "<pre><b>$name  $probe_name  $align_probe  $align_gene  $match_gene $mbegin_pos          $mend_pos            $num_mismatches         $deltaG  $Tm</b><p>";
             }
          }
       }          
}

print $q->end_html;

sub tm_check {
   my($gene_name, $probe_name, $tm) = @_;
   my $count = 0;
   $d->ct_execute("select Tm from $table_name where gene_name = '$gene_name' and probe_name = '$probe_name'") == CS_SUCCEED || die;
   while ($d->ct_results($restype) == CS_SUCCEED) {
      next unless $d->ct_fetchable($restype);
      while( $temp = $d->ct_fetch) {
         if (($tm != $temp) && (($tm-$temp) < 20)) {
            $count++;
         }
      }
    } 
    if ($count > 0) {
      return 0;
    }
    else { 
           return 1;
         }      
}               
