Login | Register

Info | Home

BioPHP - Molecular weight of a nucleic acid.

Original code submitted by joseba
Code bellow is covered by GNU GPL v2 license.

Description

Last change: 2010/10/18 17:04 | Edit description | Recent Changes | Original description
Calculates 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 code
function 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;
        }