BioPHP - Molecular weight of a nucleic acid.
Original code submitted by josebaCode bellow is covered by GNU GPL v2 license.
Description
Last change: 2010/10/18 17:04 | Edit description | Recent Changes | Original descriptionCalculates the molecular weight of a nucleic acid. From GenePHP, seq.php, class seq
Code
Last change: 2010/10/18 17:04 | Edit Code | Recent Changes | Download | Original codefunction molwt()
{
// Check if characters outside our 20-letter amino alphabet is included in the sequence.
if ($this->moltype == "DNA")
{
preg_match_all("/[^ACGTMRWSYKVHDBXN]/", $this->sequence, $match);
// If there are unknown characters, then do not compute molwt and instead return FALSE.
if (count($match[0]) > 0) return FALSE;
}
elseif ($this->moltype == "RNA")
{
preg_match_all("/[^ACGUMRWSYKVHDBXN]/", $this->sequence, $match);
// If there are unknown characters, then do not compute molwt and instead return FALSE.
if (count($match[0]) > 0) return FALSE;
}
elseif ($this->moltype == "PROTEIN")
{ // sequence is a protein, so invoke the Protein class' molwt() method.
$prot = new Protein();
$prot->sequence = $this->sequence;
return $prot->molwt();
}
else return FALSE; // return FALSE when encountering unknown molecule types
$lowerlimit = 0;
$upperlimit = 1;
$Car = 12.01;
$Oxy = 16.00;
$Nit = 14.01;
$Hyd = 1.01;
$Pho = 30.97;
$water = 18.015;
$adenine = (5 * $Car) + (5 * $Nit) + (5 * $Hyd);
$guanine = (5 * $Car) + (5 * $Nit) + (1 * $Oxy) + (5 * $Hyd);
$cytosine = (4 * $Car) + (3 * $Nit) + (1 * $Oxy) + (5 * $Hyd);
$thymine = (5 * $Car) + (2 * $Nit) + (2 * $Oxy) + (6 * $Hyd);
$uracil = (4 * $Car) + (2 * $Nit) + (2 * $Oxy) + (4 * $Hyd);
// neutral (unionized) form
$ribo_pho = (5 * $Car) + (7 * $Oxy) + (9 * $Hyd) + (1 * $Pho);
$deoxy_pho = (5 * $Car) + (6 * $Oxy) + (9 * $Hyd) + (1 * $Pho);
// the following are single strand molecular weights / base
$rna_A_wt = $adenine + $ribo_pho - $water;
$rna_C_wt = $cytosine + $ribo_pho - $water;
$rna_G_wt = $guanine + $ribo_pho - $water;
$rna_U_wt = $uracil + $ribo_pho - $water;
$dna_A_wt = $adenine + $deoxy_pho - $water;
$dna_C_wt = $cytosine + $deoxy_pho - $water;
$dna_G_wt = $guanine + $deoxy_pho - $water;
$dna_T_wt = $thymine + $deoxy_pho - $water;
$dna_wts = array('A' => array($dna_A_wt, $dna_A_wt), // Adenine
'C' => array($dna_C_wt, $dna_C_wt), // Cytosine
'G' => array($dna_G_wt, $dna_G_wt), // Guanine
'T' => array($dna_T_wt, $dna_T_wt), // Thymine
'M' => array($dna_C_wt, $dna_A_wt), // A or C
'R' => array($dna_A_wt, $dna_G_wt), // A or G
'W' => array($dna_T_wt, $dna_A_wt), // A or T
'S' => array($dna_C_wt, $dna_G_wt), // C or G
'Y' => array($dna_C_wt, $dna_T_wt), // C or T
'K' => array($dna_T_wt, $dna_G_wt), // G or T
'V' => array($dna_C_wt, $dna_G_wt), // A or C or G
'H' => array($dna_C_wt, $dna_A_wt), // A or C or T
'D' => array($dna_T_wt, $dna_G_wt), // A or G or T
'B' => array($dna_C_wt, $dna_G_wt), // C or G or T
'X' => array($dna_C_wt, $dna_G_wt), // G or A or T or C
'N' => array($dna_C_wt, $dna_G_wt) // G or A or T or C
);
$rna_wts = array('A' => array($rna_A_wt, $rna_A_wt), // Adenine
'C' => array($rna_C_wt, $rna_C_wt), // Cytosine
'G' => array($rna_G_wt, $rna_G_wt), // Guanine
'U' => array($rna_U_wt, $rna_U_wt), // Uracil
'M' => array($rna_C_wt, $rna_A_wt), // A or C
'R' => array($rna_A_wt, $rna_G_wt), // A or G
'W' => array($rna_U_wt, $rna_A_wt), // A or U
'S' => array($rna_C_wt, $rna_G_wt), // C or G
'Y' => array($rna_C_wt, $rna_U_wt), // C or U
'K' => array($rna_U_wt, $rna_G_wt), // G or U
'V' => array($rna_C_wt, $rna_G_wt), // A or C or G
'H' => array($rna_C_wt, $rna_A_wt), // A or C or U
'D' => array($rna_U_wt, $rna_G_wt), // A or G or U
'B' => array($rna_C_wt, $rna_G_wt), // C or G or U
'X' => array($rna_C_wt, $rna_G_wt), // G or A or U or C
'N' => array($rna_C_wt, $rna_G_wt) // G or A or U or C
);
$all_na_wts = array("DNA" => $dna_wts, "RNA" => $rna_wts);
$na_wts = $all_na_wts[$this->moltype];
$weight_lower_bound += $water;
$weight_upper_bound += $water;
$mwt = array(0, 0);
$NA_len = $this->seqlen();
for($i = 0; $i < $NA_len; $i++)
{
$NA_base = substr($this->sequence, $i, 1);
$mwt[$lowerlimit] += $na_wts[$NA_base][$lowerlimit];
$mwt[$upperlimit] += $na_wts[$NA_base][$upperlimit];
} // closes FOR loop
$mwt_water = 18.015;
$mwt[$lowerlimit] += $mwt_water;
$mwt[$upperlimit] += $mwt_water;
return $mwt;
}