#!/usr/bin/perl

use CGI;
my %TEMP = ('a'=>2, 't'=>2, 'g'=>4, 'c'=>4);
my $TITLE = "ACGT, melting and annealing temperature calculator";
my $CGI = CGI->new();

my $CODE = $CGI->param("code");
my $RNA  = $CGI->param("rna");
my $C13  = $CGI->param("c13");
my $PROC = '';

my $result = compute_result();
my $BODY_CLASS = $MESSAGE ? " warning" : "";

print <<EOF;
Content-Type: text/html

<html>
<head>
    <title>$TITLE</title>
    <link rel="stylesheet" href="acgt.css">
    <link rel="shortcut icon" href="acgt.ico">
</head>
<body class="normal$BODY_CLASS">
<a href="http://sabina.anzlovar.com/index.html">sabina.anzlovar.com</a>
<hr>
<span class="title">$TITLE</span>
EOF

print <<EOF;
$result

<span title='Formula used in computation of melting temperature'>Formula used: $PROC</span>
EOF

print "<hr class='message'/><span class='message'>$MESSAGE</span><hr class='message'/>\n" if $MESSAGE;

print "</body></html>\n";

# ----------------------------------------------------------

sub compute_result {
    my $code = lc($CODE);
    $code =~ s/[^acgtu]//gs;
    my $aa = scalar (@a = ($code =~ m/a/sg));
    my $tt = scalar (@a = ($code =~ m/t/sg));
    my $uu = scalar (@a = ($code =~ m/u/sg));
    my $cc = scalar (@a = ($code =~ m/c/sg));
    my $gg = scalar (@a = ($code =~ m/g/sg));
    if ($RNA and $tt) { $MESSAGE .= " Sequence is RNA and contains T "; }
    if (not $RNA and $uu) { $MESSAGE .= " Sequence is DNA and contains U "; }
    my $TT = $RNA ? $uu : $tt;
    my $all = $aa + $TT + $cc + $gg;
    my $mt;

    if ($all < 13 or $C13) {
        $PROC = "(less than 13 bases): a*A + t*T + c*C + g*G";
        $mt =   $aa * $TEMP{'a'} + $TT * $TEMP{'t'}
              + $cc * $TEMP{'c'} + $gg * $TEMP{'g'};
    }
    else {
        $PROC = "(more than 13 bases): 64 + (g+c-16.4)/(a+t+c+g)";
        $mt = 64 + ($gg+$cc-16.4)/$all;
    }
    my ($atp, $cgp, $sump);
    
    my $ann   = $mt - 5;

    if ($all) {
        $mt   = sprintf "%10.4f", $mt;
        $ann  = sprintf "%10.4f", $ann;
        $atp  = sprintf "%10.4f", (($aa + $TT) * 100) / $all;
        $cgp  = sprintf "%10.4f", (($cc + $gg) * 100) / $all;
        $sump = sprintf "%10.4f", $atp + $cgp;
    }
    else {
        $mt   = "N/A";
        $ann  = "N/A";
        $atp  = "N/A";
        $cgp  = "N/A";
        $sump = "N/A";
    }
    my $rv;
    my $checked_rna = $RNA ? "checked " : "";
    my $checked_c13 = $C13 ? "checked " : "";
    $rv .=  "<table class='calc'><tr><td valign='top'>";
    $CODE =~ s/&/&amp;/gs;
    $CODE =~ s/</&lt;/gs;
    $CODE =~ s/>/&gt;/gs;
    $rv .= <<EOF;
<form class='form' action="acgt.cgi" method="post">
<textarea style="code" name="code" wrap="off" rows="7" cols="30" title="Nucleotide sequence">$CODE</textarea>
<script language="JavaScript">document.forms[0].elements[0].focus();</script>
<br><span class='inq' title='RNA sequence, using Uracil instead of Thymine'><input type="checkbox" name="rna" value="1" $checked_rna /> Sequence is RNA</span>
<br><span class='inq' title='Yields lower melting temperature. Less accurate.'><input type="checkbox" name="c13" value="1" $checked_c13 /> Force formula for less than 13 bases</span>
<br/>
<input type="submit" access="C" value="Calculate" title='Calculate results using current parameters'/>
<input type="reset" value="Reset" title='Reset to original values'/>
<input type="button" value="Empty" onClick="javascript:document.forms[0].elements[0].value = '';" title='Empty sequence field'/>
</form>
</td><td valign='top'>
EOF
    $rv .=  "<table class='result' cellspacing='0'>\n";
    $rv .=  "<tr class='title'><td>Base</td><td align='right'>Count</td></tr>\n";
    $rv .=  "<tr><td>A </td><td align='right'>".($aa)."</td></tr>\n";
#    $rv .=  "<tr><td>".($RNA ?"U":"T")."</td><td align='right'>".($tt)."</td></tr>\n";
    $rv .=  "<tr><td>T</td><td align='right'>".($tt)."</td></tr>\n";
    $rv .=  "<tr><td>U</td><td align='right'>".($uu)."</td></tr>\n";
    $rv .=  "<tr><td>C</td><td align='right'>".($cc)."</td></tr>\n";
    $rv .=  "<tr><td>G</td><td align='right'>".($gg)."</td></tr>\n";
    $rv .=  "<tr class='title'><td>Total</td><td align='right'>$all</td></tr>\n";
    $rv .=  "</table>\n";
    $rv .=  "</td><td valign='top'>\n";
    $rv .=  "<table class='result' cellspacing='0'>\n";
    $rv .=  "<tr class='title'><td>Result</td><td align='right'>Value</td><td align='center'>Unit</td></tr>\n";
    $rv .=  "<tr class='aplus'><td>A + ".($RNA ?"U":"T")."</td><td align='right'>".($aa + $TT)."</td><td align='center'>bases</td></tr>\n";
    $rv .=  "<tr class='cplus'><td>C + G</td><td align='right'>".($cc + $gg)."</td><td align='center'>bases</td></tr>\n";
    $rv .=  "<tr class='aperc'><td>A - ".($RNA ?"U":"T")."</td><td align='right'>$atp</td><td align='center'>%</td></tr>\n";
    $rv .=  "<tr class='cperc'><td>C - G</td><td align='right'>$cgp</td><td align='center'>%</td></tr>\n";
    $rv .=  "<tr class='melting'><td>Melting</td><td align='right'>$mt</td><td align='center'>&deg;C</td></tr>\n";
    $rv .=  "<tr class='annealing'><td>Annealing</td><td align='right'>$ann</td><td align='center'>&deg;C</td></tr>\n";
    $rv .=  "</table>\n";

    $rv .=  "</td></tr></table>";
    return $rv;
}
