/* In silico PCR amplification Author: Joseba Bikandi */ if (!$_POST){print_form (); die();} // GET DATA // All non-word characters (\\W) and digits(\\d) are remove from primers and from sequence file // primer 1 $primer1=strtoupper ($_POST["primer1"]); $primer1=preg_replace("/\\W|\\d/","",$primer1); // primer 2 $primer2=strtoupper ($_POST["primer2"]); $primer2=preg_replace("/\\W|\\d/","",$primer2); // sequence $sequence= strtoupper ($_POST["sequence"]); $sequence=preg_replace("/\\W|\\d/","",$sequence); // maximum length of amplicons $maxlength=$_POST["length"]; // SET PATTERNS FROM PRIMERS // Change N to point in primers $pattern1=str_replace("N", ".", $primer1); $pattern2=str_replace("N", ".", $primer2); // If one missmatch is allowed, create new pattern // example: pattern="ACGT"; to allow one missmatch pattern=".CGT|A.GT|AC.T|ACG." if ($_POST["allowmissmatch"]==1){ $pattern1=includeN($primer1); $pattern2=includeN($primer2); } // SET PATTERN $start_pattern="$pattern1|$pattern2"; $end_pattern=RevComp($start_pattern); // CALL Amplify FUNCTION $results_array=Amplify($start_pattern,$end_pattern,$sequence,$maxlength); // PRINT RESULTS print "
Primer 1: $primer1\\n";
print "Primer 2: $primer2\\n\\n";
if (sizeof($results_array)>0){
print "List of amplicons: position in sequence, length and sequence\\n\\n";
foreach($results_array as $key => $val){
print "$key $val ".substr($sequence,$key,$val)."\\n";
}
}else{
print "No amplification\\n\\n";
}
// ##############################################################
// FUNCTIONS
// ##############################################################
function Amplify ($start_pattern,$end_pattern,$sequence,$maxlength){
// SPLIT SEQUENCE BASED IN $start_pattern (start positions of amplicons)
$fragments = preg_split("/($start_pattern)/", $sequence,-1,PREG_SPLIT_DELIM_CAPTURE);
$maxfragments=sizeof($fragments);
$position=strlen($fragments[0]);
$mn=0;
for ($m=1;$m<$maxfragments; $m+=2){
$subfragment_to_maximum=substr($fragments[$m+1],0,$maxlength);
$fragments2 = preg_split("/($end_pattern)/", $subfragment_to_maximum,-1,PREG_SPLIT_DELIM_CAPTURE);
if (sizeof($fragments2)>1){
$lenfragment=strlen($fragments[$m].$fragments2[0].$fragments2[1]);
$results_array[$position]=$lenfragment;
}
$position+=strlen($fragments[$m])+strlen($fragments[$m+1]);
}
return($results_array);
}
// ####################
function RevComp($p2){
$p2=strrev($p2);
$p2=str_replace("A", "t", $p2);
$p2=str_replace("T", "a", $p2);
$p2=str_replace("G", "c", $p2);
$p2=str_replace("C", "g", $p2);
$p2 = strtoupper ($p2);
return $p2;
}
// ####################
function includeN($pattern) {
if (strlen($pattern)>2){
$new_pattern=".".substr($pattern,1);
$pos=1;
while ($pos
In silico PCR amplification
In silico PCR amplification
Source code
}
?>