#!/usr/bin/perl -T ################################################### $program_name = "pbrow.cgi"; # Pair BROWser #$program_path = "/web/genome/tmstat/"; #$program_path = "/csb/dme/granule/web/tmstat/cgi-bin/"; $program_path = "/data/web/tmstat/cgi-bin/"; $program_ver = "v.2.01"; $program_date = "000630"; $program_author = "Alessandro Senes"; $program_description .= "Enhanced version of the pair browser. New features: - inproved interface - it allow browsing of the complete list - it returns the data for all pairs in a input TM sequence - support all swiss-prot and genome databases For the syntax call the cgi with ?opt=syntax Versions: 2.00 First complete version 2.01 Corrected bug in sub ExponentRoundNumber, when the significance is 0 it returns <1E-40 "; ################################################### ################################################### # VARIABLES ################################################### ############################ # Convertion hash AA to number ############################ %aa = ( "A" => 0, "C" => 1, "D" => 2, "E" => 3, "F" => 4, "G" => 5, "H" => 6, "I" => 7, "K" => 8, "L" => 9, "M" => 10, "N" => 11, "P" => 12, "Q" => 13, "R" => 14, "S" => 15, "T" => 16, "V" => 17, "W" => 18, "Y" => 19 ); ############################ # Convertion array number to AA ############################ @aa = ( "A", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "Y" ); ############################ # 4 letter codes of genomes ############################ @genomeCodes = ( aaeo, aful, bbur, bsub, cele, cpne, ctra, ecol, hinf, hpyl, mgen, mjan, mpne, mthe, mtub, phor, rpro, scer, syne, tpal ); ############################ # codes of the 3 Sprot databases # all, single-span and multi-span ############################ @sprotCodes = ( sprot, sprotsingle, sprotmulti ); ############################ # Info string on databases ############################ $database_info{aaeo} = "All TMs in A.aeolicus genome (1227 TMs)"; $database_info{aful} = "All TMs in A.fulgidus genome (2122 TMs)"; $database_info{bbur} = "All TMs in B.burgdorferi genome (864 TMs)"; $database_info{bsub} = "All TMs in B.subtilis genome (5044 TMs)"; $database_info{cele} = "All TMs in C.elegans genome (21197 TMs)"; $database_info{cpne} = "All TMs in C.pneumoniae genome (1000 TMs)"; $database_info{ctra} = "All TMs in C.trachomatis genome (840 TMs)"; $database_info{ecol} = "All TMs in E.coli genome (5525 TMs)"; $database_info{hinf} = "All TMs in H.influenzae genome (1747 TMs)"; $database_info{hpyl} = "All TMs in H.pylori genome (1268 TMs)"; $database_info{mgen} = "All TMs in M.genitalium genome (490 TMs)"; $database_info{mjan} = "All TMs in M.jannaschii genome (1089 TMs)"; $database_info{mpne} = "All TMs in M.pneumoniae genome (616 TMs)"; $database_info{mthe} = "All TMs in M.thermoautotrophicum genome (1398 TMs) "; $database_info{mtub} = "All TMs in M.tuberculosis genome (3114 TMs)"; $database_info{phor} = "All TMs in P.horikoshii genome (1703 TMs) "; $database_info{rpro} = "All TMs in R.prowazekii genome (972 TMs)"; $database_info{scer} = "All TMs in S.cerevisiae genome (4520 TMs)"; $database_info{syne} = "All TMs in Synechocystis sp. genome (2891 TMs)"; $database_info{tpal} = "All TMs in T.pallidum genome (749 TMs)"; $database_info{sprot} = "All TMs in Swiss-Prot rel.37 after homology removal"; $database_info{sprotsingle} = "Single-span TMs in Swiss-Prot rel.37 after homology removal"; $database_info{sprotmulti} = "Multi-span TMs in Swiss-Prot rel.37 after homology removal"; #$database_info{null} = "Select a database"; $database_info{null} = "Select a database"; ############################ # Name of database ############################ $database_string{aaeo} = "A.aeolicus (1227 TMs)"; $database_string{aful} = "A.fulgidus (2122 TMs)"; $database_string{bbur} = "B.burgdorferi (864 TMs)"; $database_string{bsub} = "B.subtilis (5044 TMs)"; $database_string{cele} = "C.elegans (21197 TMs)"; $database_string{cpne} = "C.pneumoniae (1000 TMs)"; $database_string{ctra} = "C.trachomatis (840 TMs)"; $database_string{ecol} = "E.coli (5525 TMs)"; $database_string{hinf} = "H.influenzae (1747 TMs)"; $database_string{hpyl} = "H.pylori (1268 TMs)"; $database_string{mgen} = "M.genitalium (490 TMs)"; $database_string{mjan} = "M.jannaschii (1089 TMs)"; $database_string{mpne} = "M.pneumoniae (616 TMs)"; $database_string{mthe} = "M.thermoautotrophicum (1398 TMs)"; $database_string{mtub} = "M.tuberculosis (3114 TMs)"; $database_string{phor} = "P.horikoshii (1703 TMs)"; $database_string{rpro} = "R.prowazekii (972 TMs)"; $database_string{scer} = "S.cerevisiae (4520 TMs)"; $database_string{syne} = "Synechocystis sp. (2891 TMs)"; $database_string{tpal} = "T.pallidum (749 TMs)"; $database_string{sprot} = "Swiss-Prot database (13,606 TMs)"; $database_string{sprotsingle} = "Single-span Swiss-Prot database (1,410 TMs)"; $database_string{sprotmulti} = "Multi-span Swiss-Prot database (12,743 TMs)"; ############################ # Links to genome pages ############################ $database_url{aaeo} = " [Aaeo]"; $database_url{aful} = " [Aful]"; $database_url{bbur} = " [Bbur]"; $database_url{bsub} = " [Bsub]"; $database_url{cele} = " [Cele]"; $database_url{cpne} = " [Cpne]"; $database_url{ctra} = " [Ctra]"; $database_url{ecol} = " [Ecol]"; $database_url{hinf} = " [Hinf]"; $database_url{hpyl} = " [Hpyl]"; $database_url{mgen} = " [Mgen]"; $database_url{mjan} = " [Mjan]"; $database_url{mpne} = " [Mpne]"; $database_url{mthe} = " [Mthe]"; $database_url{mtub} = " [Mtub]"; $database_url{phor} = " [Phor]"; $database_url{rpro} = " [Rpro]"; $database_url{scer} = " [Scer]"; $database_url{syne} = " [Syne]"; $database_url{tpal} = " [Tpal]"; $database_url{sprot} = ""; $database_url{sprotsingle} = ""; $database_url{sprotmulti} = ""; ############################ # Links to genome pages ############################ $database_location{aaeo} = $program_path."data/pairs.aaeo.dat"; $database_location{aful} = $program_path."data/pairs.aful.dat"; $database_location{bbur} = $program_path."data/pairs.bbur.dat"; $database_location{bsub} = $program_path."data/pairs.bsub.dat"; $database_location{cele} = $program_path."data/pairs.cele.dat"; $database_location{cpne} = $program_path."data/pairs.cpne.dat"; $database_location{ctra} = $program_path."data/pairs.ctra.dat"; $database_location{ecol} = $program_path."data/pairs.ecol.dat"; $database_location{hinf} = $program_path."data/pairs.hinf.dat"; $database_location{hpyl} = $program_path."data/pairs.hpyl.dat"; $database_location{mgen} = $program_path."data/pairs.mgen.dat"; $database_location{mjan} = $program_path."data/pairs.mjan.dat"; $database_location{mpne} = $program_path."data/pairs.mpne.dat"; $database_location{mthe} = $program_path."data/pairs.mthe.dat"; $database_location{mtub} = $program_path."data/pairs.mtub.dat"; $database_location{phor} = $program_path."data/pairs.phor.dat"; $database_location{rpro} = $program_path."data/pairs.rpro.dat"; $database_location{scer} = $program_path."data/pairs.scer.dat"; $database_location{syne} = $program_path."data/pairs.syne.dat"; $database_location{tpal} = $program_path."data/pairs.tpal.dat"; $database_location{sprot} = $program_path."data/pairs.dat"; $database_location{sprotsingle} = $program_path."data/pairs.single.dat"; $database_location{sprotmulti} = $program_path."data/pairs.multi.dat"; ################################################### # Done with variables ################################################### $time = localtime(); ################################################### # Call the subroutine that parses the web input ################################################### $errorCode = &ReadParse; if ($errorCode) { &Error($errorCode); exit; } if ($field{opt} eq "syntax") { print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
ArgumentDescriptionValues
seqAmino acid sequenceAmino acid one letter code
Any combination of ACDEFGHIKLMNPQRSTVWY
Other characters OK
Up to 50 characters
Case insensitive
dbdatabase datasprot: Swiss-prot database
sprotsingle: Swiss-prot single span
sprotmulti: Swiss-prot multi span
aaeo: Aaeo genome
aful: Aful genome
bbur: Bbur genome
bsub: Bsub genome
cele: Cele genome
cpne: Cele genome
ctra: Ctra genome
ecol: Ecol genome
hinf: Hinf genome
hypl: Hypl genome
mgen: Mgen genome
mjan: Mjan genome
mpne: Mpne genome
mthe: Mthe genome
mtub: Mtub genome
phor: Phor genome
rpro: Rpro genome
scer: Scer genome
syne: Syne genome
tpal: Tpal genome
Case insensitive
dbtypedatabase type for select boxsprot: displays Swiss-prot databases
genome: display genome databases
Optional, default sprot
Case insensitive
Overridden by db argument
Case insensitive
sortsorting optionsPAIR & PAIRDOWN: by pair in alphabetical order
PAIRUP: by pair in reverse order
COUNT & COUNTUP: by number in segment, larger to smaller
COUNTDOWN: by number in segment, smaller to larger
OBS & OBSUP: by number observed in database, larger to smaller
OBSDOWN: by number observed in database, smaller to larger
EXP & EXPUP: by number expected in database, larger to smaller
EXPDOWN: by number expected in database, smaller to larger
SIGN & SIGNUP: by significance, smaller to larger p value
SIGNDOWN: by significance, larger to smaller p value
ODD & ODDUP: by odds ratio, larger to smaller
ODDDOWN: by odds ratio, larger to smaller
Optional, default SIGN
Case insensitive
optoptionssyntax: returns this page
Case insensitive
"; exit; } elsif ($field{opt} eq "help") { print "Content-type: text/html\n\n"; print "Help here soon
\n"; print "
"; exit; } elsif ($field{opt} ne "sequence" && $field{opt} ne "residues" && $field{opt} ne "sorted") { if ($field{seq}) { $field{opt} = "sequence"; } elsif ($field{res1} && $field{res2} &&$field{reg}) { $field{opt} = "residues"; } else { $field{opt} = "sorted"; } } $field{dbtype} =~ tr/A-Z/a-z/; if ($field{dbtype} eq "genome") { $select_menu = "genome"; } else { $select_menu = "sprot"; } $field{db} =~ tr/A-Z/a-z/; if ($field{db} eq "sprot") { $open_db = $database_location{sprot}; $selected_option{sprot} = "SELECTED"; $select_menu = "sprot"; } elsif ($field{db} eq "sprotsingle") { $open_db = $database_location{sprotsingle}; $selected_option{sprotsingle} = "SELECTED"; $select_menu = "sprot"; } elsif ($field{db} eq "sprotmulti") { $open_db = $database_location{sprotmulti}; $selected_option{sprotmulti} = "SELECTED"; $select_menu = "sprot"; } elsif ($field{db} eq "aaeo") { $open_db = $database_location{aaeo}; $selected_option{aaeo} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "aful") { $open_db = $database_location{aful}; $selected_option{aful} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "bbur") { $open_db = $database_location{bbur}; $selected_option{bbur} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "bsub") { $open_db = $database_location{bsub}; $selected_option{bsub} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "cele") { $open_db = $database_location{cele}; $selected_option{cele} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "cpne") { $open_db = $database_location{cpne}; $selected_option{cpne} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "ctra") { $open_db = $database_location{ctra}; $selected_option{ctra} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "ecol") { $open_db = $database_location{ecol}; $selected_option{ecol} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "hinf") { $open_db = $database_location{hinf}; $selected_option{hinf} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "hpyl") { $open_db = $database_location{hpyl}; $selected_option{hpyl} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "mgen") { $open_db = $database_location{mgen}; $selected_option{mgen} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "mjan") { $open_db = $database_location{mjan}; $selected_option{mjan} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "mpne") { $open_db = $database_location{mpne}; $selected_option{mpne} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "mthe") { $open_db = $database_location{mthe}; $selected_option{mthe} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "mtub") { $open_db = $database_location{mtub}; $selected_option{mtub} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "phor") { $open_db = $database_location{phor}; $selected_option{phor} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "rpro") { $open_db = $database_location{rpro}; $selected_option{rpro} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "scer") { $open_db = $database_location{scer}; $selected_option{scer} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "syne") { $open_db = $database_location{syne}; $selected_option{syne} = "SELECTED"; $select_menu = "genome"; } elsif ($field{db} eq "tpal") { $open_db = $database_location{tpal}; $selected_option{tpal} = "SELECTED"; $select_menu = "genome"; } else { $field{db} = "null"; $selected_option{null} = "SELECTED"; } if ($select_menu eq "genome") { $database_option_code = ""; $radio_dbtype_genome = "CHECKED"; } else { $database_option_code = ""; $radio_dbtype_sprot = "CHECKED"; } if ($field{opt} eq "sequence") { $javaScript = "submitSequence.js"; $boxColor = "#DDDDFF"; ################################################### # Start counting the pairs found in the sequence ################################################### $totalPairs = 0; $totalUniquePairs = 0; if ($field{seq}) { ################################################### # Change the sequence to all UPPERCASE ################################################### $field{seq} =~ tr/a-z/A-Z/; ################################################### # Trim the sequence if to long ################################################### if (length($field{seq}) > 40) { $oversizedString = 1; $field{seq} = substr($field{seq}, 0, 40); } elsif (length($field{seq}) == 0) { $nullString = 1; } ################################################### # For each letter of the sequence... ################################################### for ($skip=0;$skip\n"; substr($pairHighlightedSeq[$aa{$res1}][$aa{$res2}][$reg],$skip,1) = substr($field{seq},$skip,1); substr($pairHighlightedSeq[$aa{$res1}][$aa{$res2}][$reg],$skip + $reg,1) = substr($field{seq},$skip + $reg,1); } } } } } if ($totalPairs) { for ($res1=0;$res1<20;$res1++) { for ($res2=0;$res2<20;$res2++) { for ($reg=1;$reg<11;$reg++) { if ($paircount[$res1][$res2][$reg]>0) { if ($matchString) { $matchString .= "|"; } $matchString .= "^$aa[$res1]$aa[$res2]$reg\$"; } } } } open (PAIRS, $open_db); @pairdata = ; close PAIRS; for ($i=0;$i<@pairdata;$i++) { $pairdata[$i] =~ s/\n//g; @split = split("\t", $pairdata[$i]); if ($split[0] =~ /$matchString/) { push @pair, $split[0]; $res1 = substr($split[0],0,1); $res2 = substr($split[0],1,1); $reg = substr($split[0],2,length($split[0])-2); push @indexedPair, "$split[0] ($paircount[$aa{$res1}][$aa{$res2}][$reg])"; push @max, $split[1]; if (!$split[2]) { $split[2] = 0; } push @obs, $split[2]; push @exp, $split[3]; push @roundExp, &RoundNumber($split[3],1); push @sd, $split[4]; push @roundSd, &RoundNumber($split[4],2); push @sign, $split[5]; push @roundSign, &ExponentRoundNumber($split[5],2); push @od, $split[6]; push @roundOd, &RoundNumber($split[6],2); } } } } elsif ($field{opt} eq "residues") { $javaScript = "submitResidues.js"; $boxColor = "#DDFFDD"; $res1 = $field{res1}; $res1 =~ s/[\n ]//g; $res1 =~ s/X/ACDEFGHIKLMNPQRSTVWY/g; $res1 =~ tr/[a-z]/[A-Z]/; if ($res1 && !($res1 =~ /^[ACDEFGHIKLMNPQRSTVWY,]+$/)) { &Error(1); exit; } @split = split(",", $res1); for ($i=0;$i<@split;$i++) { for ($j=0;$j<@aa;$j++) { if ($split[$i] eq $aa[$j]) { $res1[$aa{$aa[$j]}] = 1; } } } for ($i=0;$i<@aa;$i++) { if ($res1[$i]) { $res1_total++; $res1_sel .= "$aa[$i],"; $res1_search_string .= $aa[$i]; $res1_checked[$i] = "CHECKED"; } } $res1_sel =~ s/,$//g; if (!$res1_sel) { $res1_sel = "?"; } $res2 = $field{res2}; $res2 =~ s/[\n ]//g; $res2 =~ s/X/ACDEFGHIKLMNPQRSTVWY/g; $res2 =~ tr/[a-z]/[A-Z]/; if ($res2 && !($res2 =~ /^[ACDEFGHIKLMNPQRSTVWY,]+$/)) { &Error(2); exit; } @split = split(",", $res2); for ($i=0;$i<@split;$i++) { for ($j=0;$j<@aa;$j++) { if ($split[$i] eq $aa[$j]) { $res2[$aa{$aa[$j]}] = 1; } } } for ($i=0;$i<@aa;$i++) { if ($res2[$i]) { $res2_total++; $res2_sel .= "$aa[$i],"; $res2_search_string .= $aa[$i]; $res2_checked[$i] = "CHECKED"; } } $res2_sel =~ s/,$//g; if (!$res2_sel) { $res2_sel = "?"; } $reg = $field{reg}; $reg =~ s/[\n ]//g; if ($reg && !($reg =~ /^[0-9,]+$/)) { &Error(3); exit; } @split = split(",", $reg); for ($i=0;$i<@split;$i++) { if ($split[$i] >= 1 && $split[$i] <= 10) { $reg[$split[$i]] = 1; } } for ($i=1;$i<=10;$i++) { if ($reg[$i]) { $reg_total++; $reg_sel .= "$i,"; push @reg_search, $i; $reg_checked[$i] = "CHECKED"; } } $reg_sel =~ s/,$//g; if (!$reg_sel) { $reg_sel = "?"; } if ($field{rev} eq "FR") { for ($i=0;$i<@aa;$i++) { if ($res1[$i] && $res2[$i]) { $res1_res2_overlap++; } } $total_combinations = ((2 * $res1_total * $res2_total) - $res1_res2_overlap) * $reg_total; $revFR_checked = "CHECKED"; $search_type_string = "forward & reversed"; } elsif ($field{rev} eq "R") { $total_combinations = $res1_total * $res2_total * $reg_total; $revR_checked = "CHECKED"; $search_type_string = "reversed"; } else { $total_combinations = $res1_total * $res2_total * $reg_total; $revF_checked = "CHECKED"; $search_type_string = ""; } open (PAIRS, $open_db); @pairdata = ; close PAIRS; if ($field{rev} eq "FR") { for ($i=0;$i<@pairdata;$i++) { for ($j=0;$j<@reg_search;$j++) { $pairdata[$i] =~ s/\n//g; @split = split("\t", $pairdata[$i]); if ($split[0] =~ /^[$res1_search_string][$res2_search_string]$reg_search[$j]$/ || $split[0] =~ /^[$res2_search_string][$res1_search_string]$reg_search[$j]$/) { push @pair, $split[0]; push @indexedPair, $split[0]; push @max, $split[1]; if (!$split[2]) { $split[2] = 0; } push @obs, $split[2]; push @exp, $split[3]; push @roundExp, &RoundNumber($split[3],1); push @sd, $split[4]; push @roundSd, &RoundNumber($split[4],2); push @sign, $split[5]; push @roundSign, &ExponentRoundNumber($split[5],2); push @od, $split[6]; push @roundOd, &RoundNumber($split[6],2); } } } } elsif($field{rev} eq "R") { for ($i=0;$i<@pairdata;$i++) { for ($j=0;$j<@reg_search;$j++) { $pairdata[$i] =~ s/\n//g; @split = split("\t", $pairdata[$i]); if ($split[0] =~ /^[$res2_search_string][$res1_search_string]$reg_search[$j]$/) { push @pair, $split[0]; push @indexedPair, $split[0]; push @max, $split[1]; if (!$split[2]) { $split[2] = 0; } push @obs, $split[2]; push @exp, $split[3]; push @roundExp, &RoundNumber($split[3],1); push @sd, $split[4]; push @roundSd, &RoundNumber($split[4],2); push @sign, $split[5]; push @roundSign, &ExponentRoundNumber($split[5],2); push @od, $split[6]; push @roundOd, &RoundNumber($split[6],2); } } } } else { for ($i=0;$i<@pairdata;$i++) { for ($j=0;$j<@reg_search;$j++) { $pairdata[$i] =~ s/\n//g; @split = split("\t", $pairdata[$i]); if ($split[0] =~ /^[$res1_search_string][$res2_search_string]$reg_search[$j]$/) { push @pair, $split[0]; push @indexedPair, $split[0]; push @max, $split[1]; if (!$split[2]) { $split[2] = 0; } push @obs, $split[2]; push @exp, $split[3]; push @roundExp, &RoundNumber($split[3],1); push @sd, $split[4]; push @roundSd, &RoundNumber($split[4],2); push @sign, $split[5]; push @roundSign, &ExponentRoundNumber($split[5],2); push @od, $split[6]; push @roundOd, &RoundNumber($split[6],2); } } } } } elsif ($field{opt} eq "sorted") { $boxColor = "#FFDDDD"; $javaScript = "submitSorted.js"; } print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; print "TMSTAT - Pair Browser\n"; print "\n"; print "\n"; print "\n"; print "\n"; $field{sort} =~ tr/a-z/A-Z/; $pairImgUp = "arrowupgrayed.gif"; $pairImgDown = "arrowdowngrayed.gif"; $countImgUp = "arrowupgrayed.gif"; $countImgDown = "arrowdowngrayed.gif"; $signImgUp = "arrowupgrayed.gif"; $signImgDown = "arrowdowngrayed.gif"; $obsImgUp = "arrowupgrayed.gif"; $obsImgDown = "arrowdowngrayed.gif"; $expImgUp = "arrowupgrayed.gif"; $expImgDown = "arrowdowngrayed.gif"; $oddImgUp = "arrowupgrayed.gif"; $oddImgDown = "arrowdowngrayed.gif"; if ($field{sort} eq "PAIR" || $field{sort} eq "PAIRUP" || $field{sort} eq "PAIRDOWN") { $sort_string = "pair"; if ($field{sort} eq "PAIRUP") { $pairImgUp = "arrowup.gif"; } else { $pairImgDown = "arrowdown.gif"; $field{sort} = "PAIRDOWN"; } } elsif ($field{sort} eq "COUNT" || $field{sort} eq "COUNTUP" || $field{sort} eq "COUNTDOWN") { $sort_string = "number in query sequence"; if ($field{sort} eq "COUNTDOWN") { $countImgUp = "arrowup.gif"; } else { $countImgDown = "arrowdown.gif"; $field{sort} = "COUNTUP"; } } elsif ($field{sort} eq "OBS" || $field{sort} eq "OBSUP" || $field{sort} eq "OBSDOWN") { $sort_string = "number observed"; if ($field{sort} eq "OBSDOWN") { $obsImgUp = "arrowup.gif"; } else { $obsImgDown = "arrowdown.gif"; $field{sort} = "OBSUP"; } } elsif ($field{sort} eq "EXP" || $field{sort} eq "EXPUP" || $field{sort} eq "EXPDOWN") { $sort_string = "number expected"; if ($field{sort} eq "EXPDOWN") { $expImgUp = "arrowup.gif"; } else { $expImgDown = "arrowdown.gif"; $field{sort} = "EXPUP"; } } elsif ($field{sort} eq "SIGN" || $field{sort} eq "SIGNUP" || $field{sort} eq "SIGNDOWN") { $sort_string = "significance"; if ($field{sort} eq "SIGNDOWN") { $signImgUp = "arrowup.gif"; } else { $signImgDown = "arrowdown.gif"; $field{sort} = "SIGNUP"; } } elsif ($field{sort} eq "ODD" || $field{sort} eq "ODDUP" || $field{sort} eq "ODDDOWN") { $sort_string = "odds ratio"; if ($field{sort} eq "ODDDOWN") { $oddImgUp = "arrowup.gif"; } else { $oddImgDown = "arrowdown.gif"; $field{sort} = "ODDUP"; } } else { $field{sort} = "SIGNUP"; $sort_string = "significance"; $signImgDown = "arrowdown.gif"; } if ($field{opt} eq "sequence") { if (!$field{seq} || $field{db} eq "null") { if (!$field{seq}) { $resultString .= "Input the sequence of a TM segment
\n"; } if ($field{db} eq "null") { $resultString .= "Select a database
\n"; } } elsif ($totalUniquePairs == 0) { $resultString .= "No pairs found in the sequence
\n"; } else { $displayPairs = 1; $resultString = "$totalUniquePairs pairs found, sorted by $sort_string"; if ($oversizedString) { $resultString = "$totalUniquePairs pairs found, sorted by $sort_string (Sequence truncated to 40 residues)"; } } } elsif ($field{opt} eq "residues") { if (!$field{res1} || !$field{res2} || !$field{reg} || $field{db} eq "null") { if (!$field{res1}) { $resultString .= "Select one or more amino acids for residue 1
\n"; } if (!$field{res2}) { $resultString .= "Select one or more amino acids for residue 2
\n"; } if (!$field{reg}) { $resultString .= "Select one or more separation registers
\n"; } if ($field{db} eq "null") { $resultString .= "Select a database
\n"; } } elsif ($total_combinations > 400) { $resultString .= "Too many combinations: $total_combinations (max. 400)
\n"; } else { $displayPairs = 1; $resultString = "$total_combinations combinations, sorted by $sort_string"; } } elsif ($field{opt} eq "sorted") { if ($field{db} ne "null") { $displayPairs = 1; if ($field{sort} eq "PAIR" || $field{sort} eq "PAIRUP" || $field{sort} eq "PAIRDOWN") { $open_db =~ s/\.dat$/\.pair.0.dat/; } elsif ($field{sort} eq "OBS" || $field{sort} eq "OBSUP" || $field{sort} eq "OBSDOWN") { $open_db =~ s/\.dat$/\.obs.0.dat/; } elsif ($field{sort} eq "EXP" || $field{sort} eq "EXPUP" || $field{sort} eq "EXPDOWN") { $open_db =~ s/\.dat$/\.exp.0.dat/; } elsif ($field{sort} eq "SIGN" || $field{sort} eq "SIGNUP" || $field{sort} eq "SIGNDOWN") { $open_db =~ s/\.dat$/\.sign.0.dat/; } elsif ($field{sort} eq "ODD" || $field{sort} eq "ODDUP" || $field{sort} eq "ODDDOWN") { $open_db =~ s/\.dat$/\.od.0.dat/; } open (PAIRS, $open_db); @pairdata = ; close PAIRS; #000 # exit; ### # print "AAAA\n";; for ($i=0;$i<@pairdata;$i++) { # print "$i
\n"; $pairdata[$i] =~ s/\n//g; @split = split("\t", $pairdata[$i]); push @pair, $split[0]; push @indexedPair, $split[0]; push @max, $split[1]; if (!$split[2]) { $split[2] = 0; } push @obs, $split[2]; push @exp, $split[3]; push @roundExp, &RoundNumber($split[3],1); push @sd, $split[4]; push @roundSd, &RoundNumber($split[4],2); push @sign, $split[5]; push @roundSign, &ExponentRoundNumber($split[5],2); # push @roundSign, $split[5],2; push @od, $split[6]; push @roundOd, &RoundNumber($split[6],2); } $field{num_sorted} = int($field{num_sorted}); if ($field{num_sorted} < 1) { $field{num_sorted} = 40; } elsif ($field{num_sorted} > 200) { $field{num_sorted} = 200; } if ($tot_pages > int($tot_pages)) { $tot_pages = int($tot_pages) + 1; } $field{start_sorted} = int($field{start_sorted}); if ($field{start_sorted} < 1) { $field{start_sorted} = 1; } elsif ($field{start_sorted} > 4000) { $field{start_sorted} = 4000; } $after_pages = (4000 - $field{start_sorted} + 1) / $field{num_sorted}; if ($after_pages > int($after_pages)) { $after_pages = int($after_pages) + 1; } $before_pages = ($field{start_sorted} - 1) / $field{num_sorted}; if ($before_pages > int($before_pages)) { $before_pages = int($before_pages) + 1; } $tot_pages = $after_pages + $before_pages; $curr_page = $before_pages + 1; $prev_start_sorted = $field{start_sorted} - $field{num_sorted}; if ($prev_start_sorted < 1) { $prev_start_sorted = 1; } $next_start_sorted = $field{start_sorted} + $field{num_sorted}; if ($next_start_sorted > 4000) { $next_start_sorted = 4000; } $firstPair = &Ordinal($field{start_sorted}); $lastPair = $field{start_sorted} + $field{num_sorted} - 1; $lastPair = &Ordinal($lastPair); $resultString = "Pair list sorted by $sort_string, from $firstPair to $lastPair"; } else { $resultString = "Please select a database"; $field{start_sorted} = 1; $field{num_sorted} = 40; $tot_pages = 0; $curr_page = 0; } } ############################ # Open table ############################ print "\n"; ############################ # Print header band with title and help button ############################ print "\n"; ############################ # Open selection form and display current database ############################ print "\n"; ############################ # Separation line ############################ print "\n"; ############################ # Tabs ############################ print "\n"; ############################ # Print message line ############################ print "\n"; ############################ # Input sequence field and send buttons ############################ if ($field{opt} eq "sequence") { print "\n"; } elsif ($field{opt} eq "residues") { print "\n"; } elsif ($field{opt} eq "sorted") { print "\n"; print "\n"; } ############################ # Info display textbox ############################ print "\n"; ############################ # Close table ############################ print "
Amino acid pair analysis in transmembrane (TM) domains

\nDatabase: $database_info{$field{db}}$database_url{$field{db}}
\n"; ############################ # Display database radio and selection fields ############################ print "Swiss-ProtGenomes $database_option_code

Input TM sequenceSelected patternsAll data, sorted

\n
$resultString

\n
 
"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "

Res.1
A
C
D
E
F
G
H
I
K
L
M
N
P
Q
R
S
T
V
W
Y

Res.2

Reg.
1
2
3
4
5
6
7
8
9
10

\n"; print "Query: Forward Reversed Forward & reversed"; print "
Display pairs, starting from
Page $curr_page of $tot_pages
\n"; if ($displayPairs) { ############################ # Open table ############################ print ""; ############################ # Print header of columns ############################ print "\n"; #print "\n"; ############################ # Print sortin arrow images ############################ print "\n"; #print "\n"; ############################ # Separation line ############################ print "\n"; if ($field{opt} eq "sorted") { if ($field{sort} eq "PAIR" || $field{sort} eq "PAIRUP" || $field{sort} eq "PAIRDOWN") { if ($field{sort} eq "PAIRUP") { for ($i=$#pair-$field{start_sorted}+1;$i>=$#pair-$field{num_sorted}-$field{start_sorted}+2 && $i>=0;$i--) { print "\n"; } } else { for ($i=$field{start_sorted}-1;$i<=$field{num_sorted}+$field{start_sorted}-2 && $i<=$#pair;$i++) { print "\n"; } } } elsif ($field{sort} eq "OBS" || $field{sort} eq "OBSUP" || $field{sort} eq "OBSDOWN") { if ($field{sort} eq "OBSDOWN") { for ($i=$field{start_sorted}-1;$i<=$field{num_sorted}+$field{start_sorted}-2 && $i<=$#pair;$i++) { print "\n"; } } else { for ($i=$#pair-$field{start_sorted}+1;$i>=$#pair-$field{num_sorted}-$field{start_sorted}+2 && $i>=0;$i--) { print "\n"; } } } elsif ($field{sort} eq "EXP" || $field{sort} eq "EXPUP" || $field{sort} eq "EXPDOWN") { if ($field{sort} eq "EXPDOWN") { for ($i=$field{start_sorted}-1;$i<=$field{num_sorted}+$field{start_sorted}-2 && $i<=$#pair;$i++) { print "\n"; } } else { for ($i=$#pair-$field{start_sorted}+1;$i>=$#pair-$field{num_sorted}-$field{start_sorted}+2 && $i>=0;$i--) { print "\n"; } } } elsif ($field{sort} eq "SIGN" || $field{sort} eq "SIGNUP" || $field{sort} eq "SIGNDOWN") { if ($field{sort} eq "SIGNUP") { for ($i=$field{start_sorted}-1;$i<=$field{num_sorted}+$field{start_sorted}-2 && $i<=$#pair;$i++) { print "\n"; } } else { for ($i=$#pair-$field{start_sorted}+1;$i>=$#pair-$field{num_sorted}-$field{start_sorted}+2 && $i>=0;$i--) { print "\n"; } } } elsif ($field{sort} eq "ODD" || $field{sort} eq "ODDUP" || $field{sort} eq "ODDDOWN") { if ($field{sort} eq "ODDDOWN") { for ($i=$field{start_sorted}-1;$i<=$field{num_sorted}+$field{start_sorted}-2 && $i<=$#pair;$i++) { print "\n"; } } else { for ($i=$#pair-$field{start_sorted}+1;$i>=$#pair-$field{num_sorted}-$field{start_sorted}+2 && $i>=0;$i--) { print "\n"; } } } } else { ############################ # If pairs were found and a database # given print results ############################ # } elsif ($field{sort} eq "COUNT" || $field{sort} eq "COUNTUP" || $field{sort} eq "COUNTDOWN") { # for ($i=0;$i<@pair;$i++) { # $record[$i] = "\n"; ## $record[$i] = "\n"; # } # if ($field{sort} eq "COUNTDOWN") { # &SortArrays(0, \@count, \@record); # } else { # &SortArrays(1, \@count, \@record); # } # for ($i=0;$i<@pair;$i++) { # print $record[$i]; # } if ($field{sort} eq "PAIR" || $field{sort} eq "PAIRUP" || $field{sort} eq "PAIRDOWN") { for ($i=0;$i<@pair;$i++) { $PAIRrecord[$i] = $aa{substr($pair[$i], 0, 1)} * 2000 + $aa{substr($pair[$i], 1, 1)} * 100 + substr($pair[$i], 2, length($pair[$i]) - 2); $record[$i] = "\n"; } if ($field{sort} eq "PAIRUP") { &SortArrays(1, \@PAIRrecord, \@record); } else { &SortArrays(0, \@PAIRrecord, \@record); } for ($i=0;$i<@pair;$i++) { print $record[$i]; } } elsif ($field{sort} eq "OBS" || $field{sort} eq "OBSUP" || $field{sort} eq "OBSDOWN") { for ($i=0;$i<@pair;$i++) { $OBSrecord[$i] = $obs[$i]; $record[$i] = "\n"; } if ($field{sort} eq "OBSDOWN") { &SortArrays(0, \@OBSrecord, \@record); } else { &SortArrays(1, \@OBSrecord, \@record); } for ($i=0;$i<@pair;$i++) { print $record[$i]; } } elsif ($field{sort} eq "EXP" || $field{sort} eq "EXPUP" || $field{sort} eq "EXPDOWN") { for ($i=0;$i<@pair;$i++) { $EXPrecord[$i] = $exp[$i]; $record[$i] = "\n"; } if ($field{sort} eq "EXPDOWN") { &SortArrays(0, \@EXPrecord, \@record); } else { &SortArrays(1, \@EXPrecord, \@record); } for ($i=0;$i<@pair;$i++) { print $record[$i]; } } elsif ($field{sort} eq "SIGN" || $field{sort} eq "SIGNUP" || $field{sort} eq "SIGNDOWN") { for ($i=0;$i<@pair;$i++) { $record[$i] = "\n"; if ($obs[$i] >= $exp[$i]) { $Orecord[$o] = $record[$i]; $OSIGNrecord[$o] = $sign[$i]; $o++; } else { $Urecord[$u] = $record[$i]; $USIGNrecord[$u] = $sign[$i]; $u++; } } if ($field{sort} eq "SIGNDOWN") { &SortArrays(1, \@OSIGNrecord, \@Orecord); &SortArrays(1, \@USIGNrecord, \@Urecord); } else { &SortArrays(0, \@OSIGNrecord, \@Orecord); &SortArrays(0, \@USIGNrecord, \@Urecord); } print "\n"; for ($i=0;$i<@OSIGNrecord;$i++) { print $Orecord[$i]; } print "\n"; for ($i=0;$i<@USIGNrecord;$i++) { print $Urecord[$i]; } } elsif ($field{sort} eq "ODD" || $field{sort} eq "ODDUP" || $field{sort} eq "ODDDOWN") { for ($i=0;$i<@pair;$i++) { $ODDrecord[$i] = $od[$i]; $record[$i] = "\n"; } if ($field{sort} eq "ODDDOWN") { &SortArrays(0, \@ODDrecord, \@record); } else { &SortArrays(1, \@ODDrecord, \@record); } for ($i=0;$i<@pair;$i++) { print $record[$i]; } } } print "\n"; print "
PairObservedExpectedSt.Dev.Significance1 pair is over-represented)\");return true\' ONMOUSEOUT=\'resetBox();return true\'>Odds ratio
Pair(#)ObservedExpectedSt.Dev.Significance1 pair is over-represented)\");return true\' ONMOUSEOUT=\'resetBox();return true\'>Odds ratio



 






 



$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]($count[$i])$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]
Observed > Expected (Odds ratio > 1)

\nObserved < Expected (Odds ratio < 1)
$indexedPair[$i]$obs[$i]$roundExp[$i]$roundSd[$i]$roundSign[$i]$roundOd[$i]

\n"; } sub ReadParse { my $buffer; my $pair; my @pairs; my $name; my $value; my $ErrorCode; if ($ENV{'REQUEST_METHOD'} eq 'POST') { if ($ENV{'CONTENT_LENGTH'} > 1000) { $ErrorCode = "24"; return ($ErrorCode); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { if (length($ENV{'QUERY_STRING'}) < 1000) { $buffer = $ENV{'QUERY_STRING'}; } else { $ErrorCode = "25"; return ($ErrorCode); } } @pairs = split (/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split (/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r\n/\n/g; $field{$name} .= $value; } return (0); } sub RoundNumber { my $number = shift; my $decimals = shift; my $pos; $number *= (10 ** int($decimals)); if ($number > 0) { $number += 0.5; } else { $number -= 0.5; } $number = int($number); $number /= (10 ** int($decimals)); if ($number =~ /\./g) { $pos = pos($number); while (length($number) < $pos + $decimals) { $number .= "0"; } } else { $number .= "."; $number =~ /\./g; $pos = length($number); while (length($number) < $pos + $decimals) { $number .= "0"; } } return $number; } sub ExponentRoundNumber { my $number = shift; my $decimals = shift; my $exponent; my $sign_exp; if ($number == 0) { $number = "<1x1040"; return $number; } if ($number > 1 - 10 ** (-1 * $decimals) && $number < 1 + 10 ** (-1 * $decimals)) { $number = 1; } if ($number =~ /[0-9]e\-[0-9]/g) { $pos = pos($number); $exponent = substr($number, $pos-2, length($number) - $pos + 2); $number = substr($number, 0, $pos-3); $number /= (10 ** (0 - $decimals)); } elsif ($number =~ /[0-9]e\+[0-9]/g) { $pos = pos($number); $exponent = substr($number, $pos-1, length($number) - $pos + 1); $number = substr($number, 0, $pos-3); $number /= (10 ** (0 - $decimals)); } else { $exponent = log($number)/log(10); if ($exponent >= 0) { $exponent = int($exponent); } else { $exponent = int($exponent-1); # $exponent = int($exponent-1); } $number /= (10 ** ($exponent - $decimals)); } if ($number > 0) { $number += 0.5; } else { $number -= 0.5; } $number = int($number); $number *= (10 ** int($0 - $decimals)); if ($exponent < 0) { $exponent *= -1; $sign_exp = "-"; } else { $sign_exp = "+"; } while (length($exponent) < 2) { $exponent = "0".$exponent; } # $number .= "E".$sign_exp.$exponent; $number .= "x10".$sign_exp.$exponent.""; return $number; } sub SortArrays { ################################### #v.1.01 #This sub sorts up to 4 arrays ascending #on the first of the two. #Arguments passes as references: # &SortArrays(order, \@array1,\@array2); # order = 0 -> ascending # order = 1 -> descending ################################### my $order = shift; my $masterArray = shift; my $slaveArray0 = shift; my $slaveArray1 = shift; my $slaveArray2 = shift; my $doneSorting; my $size; my $skip; my $i; my $tmpMaster; my $tmpSlave0; my $tmpSlave1; my $tmpSlave2; my @newMaster; my @newSlave0; my @newSlave1; my @newSlave2; if ($order) { while (!$doneSorting) { $size = @$masterArray; if ($size > 0 ) { $tmpMaster = shift(@$masterArray); $tmpSlave0 = shift(@$slaveArray0); $tmpSlave1 = shift(@$slaveArray1); $tmpSlave2 = shift(@$slaveArray2); $skip = 0; for ($i=0;$i<@newMaster;$i++) { if ($newMaster[$i] > $tmpMaster) { $skip++; } else { $i = @newMaster; } } splice(@newMaster, $skip, 0, $tmpMaster); splice(@newSlave0, $skip, 0, $tmpSlave0); splice(@newSlave1, $skip, 0, $tmpSlave1); splice(@newSlave2, $skip, 0, $tmpSlave2); } else { $doneSorting = 1; @$masterArray = @newMaster; @$slaveArray0 = @newSlave0; @$slaveArray1 = @newSlave1; @$slaveArray2 = @newSlave2; } } } else { while (!$doneSorting) { $size = @$masterArray; if ($size > 0 ) { $tmpMaster = shift(@$masterArray); $tmpSlave0 = shift(@$slaveArray0); $tmpSlave1 = shift(@$slaveArray1); $tmpSlave2 = shift(@$slaveArray2); $skip = 0; for ($i=0;$i<@newMaster;$i++) { if ($newMaster[$i] < $tmpMaster) { $skip++; } else { $i = @newMaster; } } splice(@newMaster, $skip, 0, $tmpMaster); splice(@newSlave0, $skip, 0, $tmpSlave0); splice(@newSlave1, $skip, 0, $tmpSlave1); splice(@newSlave2, $skip, 0, $tmpSlave2); } else { $doneSorting = 1; @$masterArray = @newMaster; @$slaveArray0 = @newSlave0; @$slaveArray1 = @newSlave1; @$slaveArray2 = @newSlave2; } } } } sub Error() { my $code = shift; print "Error $code
\n"; } sub Ordinal() { my $input = shift; my $output; if (substr($input, length($input)-1,1) eq "1") { $output = $input."st"; } elsif (substr($input, length($input)-1,1) eq "2") { $output = $input."nd"; } elsif (substr($input, length($input)-1,1) eq "3") { $output = $input."rd"; } else { $output = $input."th"; } return $output; }