coiled_coil.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: coiled_coil.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:10:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: coiled_coil.cpp,v 1000.1 2004/06/01 18:10:25 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Josh Cherry
  35.  *
  36.  * File Description:  Prediction of coiled coil regions of proteins
  37.  *                    according to Lupas et al., 1991 (PMID 2031185)
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <objects/seqloc/Seq_interval.hpp>
  43. #include <algo/sequence/coiled_coil.hpp>
  44. #include "math.h"
  45. BEGIN_NCBI_SCOPE
  46. USING_SCOPE(objects);
  47. const double CCoiledCoil::sm_Propensities[26][7] = 
  48.     {
  49.         {0,     0,     0,     0,     0,     0,     0    },
  50.         {1.297, 1.551, 1.084, 2.612, 0.377, 1.248, 0.877}, // A
  51.         {0.030, 1.475, 1.534, 0.039, 0.663, 1.620, 1.448}, // B (min of D, N)
  52.         {0.824, 0.022, 0.308, 0.152, 0.180, 0.156, 0.044}, // C
  53.         {0.030, 2.352, 2.268, 0.237, 0.663, 1.620, 1.448}, // D
  54.         {0.262, 3.496, 3.108, 0.998, 5.685, 2.494, 3.048}, // E
  55.         {0.531, 0.076, 0.403, 0.662, 0.189, 0.106, 0.013}, // F
  56.         {0.045, 0.275, 0.578, 0.216, 0.211, 0.426, 0.156}, // G
  57.         {0.347, 0.275, 0.679, 0.395, 0.294, 0.579, 0.213}, // H
  58.         {2.597, 0.098, 0.345, 0.894, 0.514, 0.471, 0.431}, // I
  59.         {1.375, 2.639, 1.763, 0.191, 1.815, 1.961, 2.795}, // K
  60.         {3.167, 0.297, 0.398, 3.902, 0.585, 0.501, 0.483}, // L
  61.         {2.240, 0.370, 0.480, 1.409, 0.541, 0.772, 0.663}, // M
  62.         {0.835, 1.475, 1.534, 0.039, 1.722, 2.456, 2.280}, // N
  63.         {0,     0.008, 0,     0.013, 0,     0,     0    }, // P
  64.         {0.179, 2.114, 1.778, 0.631, 2.550, 1.578, 2.526}, // Q
  65.         {0.659, 1.163, 1.210, 0.031, 1.358, 1.937, 1.798}, // R
  66.         {0.382, 0.583, 1.052, 0.419, 0.525, 0.916, 0.628}, // S
  67.         {0.169, 0.702, 0.955, 0.654, 0.791, 0.843, 0.647}, // T
  68.         {1.665, 0.403, 0.386, 0.949, 0.211, 0.342, 0.360}, // V
  69.         {0.240, 0,     0,     0.456, 0.019, 0,     0    }, // W
  70.         {0,     0.008, 0,     0.013, 0,     0,     0    }, // X (min of 20)
  71.         {1.417, 0.090, 0.122, 1.659, 0.190, 0.130, 0.155}, // Y
  72.         {0.179, 2.114, 1.778, 0.631, 2.550, 1.578, 2.526}, // Z (min of E, Q)
  73.         {0,     0,     0,     0,     0,     0,     0    }, // U (not known)
  74.         {0,     0,     0,     0,     0,     0,     0    }  // *
  75.     };
  76. template<class Seq>
  77. void CCoil_ComputeScores(const Seq& seq, vector<double>& scores,
  78.                          vector<unsigned int>& frames, TSeqPos win_len)
  79. {
  80.     vector<vector<double> > prelim_scores(7);
  81.     for (unsigned int frame = 0;  frame < 7;  frame++) {
  82.         prelim_scores[frame].resize(seq.size());
  83.     }
  84.     // calculate 'preliminary' scores (one per frame per window position;
  85.     // score is recorded in position corresponing to the start of the window)
  86.     for (unsigned int frame = 0;  frame < 7;  frame++) {
  87.         for (TSeqPos start = 0;  start < seq.size() - win_len + 1;  start++) {
  88.             double prod;
  89.             if (start > 0  &&
  90.                 CCoiledCoil::sm_Propensities[seq[start - 1]]
  91.                     [(start - 1 + frame) % 7] != 0) {
  92.                 // compute product using last result, avoiding repeating mults
  93.                 prod /= CCoiledCoil::sm_Propensities[seq[start - 1]]
  94.                     [(start - 1 + frame) % 7];
  95.                 prod *= CCoiledCoil::sm_Propensities[seq[start + win_len - 1]]
  96.                     [(start + win_len - 1 + frame) % 7];
  97.             } else {
  98.                 // compute product from scratch
  99.                 prod = 1;
  100.                 for (TSeqPos i = start;  i < start + win_len;  i++) {
  101.                     prod *= CCoiledCoil::sm_Propensities[seq[i]]
  102.                         [(i + frame) % 7];
  103.                 }
  104.             }
  105.             prelim_scores[frame][start] = pow(prod, 1.0 / win_len);
  106.         }
  107.     }
  108.     // now find max among all frames at each window position
  109.     vector<double> w_score(seq.size());
  110.     vector<unsigned int> w_frame(seq.size());
  111.     for (TSeqPos start = 0;  start < seq.size() - win_len + 1;  start++) {
  112.         double max_score = 0;
  113.         unsigned int max_frame = 0;
  114.         for (unsigned int frame = 0;  frame < 7;  frame++) {
  115.             if (prelim_scores[frame][start] > max_score) {
  116.                 max_score = prelim_scores[frame][start];
  117.                 max_frame = frame;
  118.             }
  119.         }
  120.         w_score[start] = max_score;
  121.         w_frame[start] = max_frame;
  122.     }
  123.     
  124.     // now find, for each position, the max of the scores for the
  125.     // win_len or fewer windows to which it belongs
  126.     scores.resize(seq.size());
  127.     frames.resize(seq.size());
  128.     for (TSeqPos pos = 0;  pos < seq.size();  pos++) {
  129.         // if possible, compute the max the easy way, without iterating
  130.         if (pos > 0 && (pos < win_len
  131.                         || w_score[pos - win_len] != scores[pos - 1])) {
  132.             if (scores[pos - 1] > w_score[pos]) {
  133.                 scores[pos] = scores[pos - 1];
  134.                 frames[pos] = frames[pos - 1];
  135.             } else {
  136.                 scores[pos] = w_score[pos];
  137.                 frames[pos] = w_frame[pos];
  138.             }
  139.         } else {
  140.             // compute the max from scratch
  141.             double max_score = 0;
  142.             unsigned int max_frame = 0;
  143.         
  144.             for (TSeqPos win = pos < win_len ? 0 : (pos - win_len + 1);
  145.                  win <= pos;
  146.                  win++) {
  147.                 if (w_score[win] > max_score) {
  148.                     max_score = w_score[win];
  149.                     max_frame = w_frame[win];
  150.                 }
  151.             }
  152.             scores[pos] = max_score;
  153.             frames[pos] = max_frame;
  154.         }
  155.     }
  156. }
  157. void CCoiledCoil::ComputeScores(const string& seq, vector<double>& scores,
  158.                                 vector<unsigned int>& frames,
  159.                                 TSeqPos win_len)
  160. {
  161.     CCoil_ComputeScores(seq, scores, frames, win_len);
  162. }
  163. void CCoiledCoil::ComputeScores(const vector<char>& seq, vector<double>& scores,
  164.                                 vector<unsigned int>& frames,
  165.                                 TSeqPos win_len)
  166. {
  167.     CCoil_ComputeScores(seq, scores, frames, win_len);
  168. }
  169. void CCoiledCoil::ComputeScores(const CSeqVector& seq,
  170.                                 vector<double>& scores,
  171.                                 vector<unsigned int>& frames,
  172.                                 TSeqPos win_len)
  173. {
  174.     string seq_ncbistdaa;
  175.     CSeqVector vec(seq);
  176.     vec.SetNcbiCoding();
  177.     vec.GetSeqData(0, vec.size(), seq_ncbistdaa);
  178.     CCoil_ComputeScores(seq_ncbistdaa, scores, frames, win_len);
  179. }
  180. double CCoiledCoil::ScoreToProb(double score)
  181. {
  182.     // neglect factor of 1/sqrt(2*Pi); cancels in ratio
  183.     // (note that it's given as 1/(2*Pi) in the paper)
  184.     double gcc = 1 / 0.24 * exp(-0.5 * pow((score - 1.63) / 0.24, 2));
  185.     double gg  = 1 / 0.20 * exp(-0.5 * pow((score - 0.77) / 0.20, 2));
  186.     return gcc / (30 * gg + gcc);
  187. }
  188. void CCoiledCoil::ScoreToProb(const vector<double>& scores,
  189.                               vector<double>& probs)
  190. {
  191.     probs.resize(scores.size());
  192.     for (unsigned int i = 0;  i < scores.size();  i++) {
  193.         probs[i] = ScoreToProb(scores[i]);
  194.     }
  195. }
  196. // find runs where ScoreToProb(score) >= 0.5
  197. void CCoiledCoil::x_PredictRegions(const vector<double>& scores,
  198.                                    vector<CRef<CSeq_loc> >& regions,
  199.                                    vector<double>& max_scores)
  200. {
  201.     bool in_a_run = 0;
  202.     TSeqPos begin, end;
  203.     double max_score;  // max score for the run
  204.     for (unsigned int i = 0;  i < scores.size();  i++) {
  205.         if (CCoiledCoil::ScoreToProb(scores[i]) >= 0.5) {
  206.             if (!in_a_run) {
  207.                 in_a_run = true;
  208.                 begin = i;
  209.                 max_score = scores[i];
  210.             } else {
  211.                 if (scores[i] > max_score) {
  212.                     max_score = scores[i];
  213.                 }
  214.             }
  215.         } else {
  216.             if (in_a_run) {  // the end of a run
  217.                 in_a_run = false;
  218.                 end = i - 1;
  219.                 CRef<CSeq_loc> region(new CSeq_loc());
  220.                 region->SetInt().SetFrom(begin);
  221.                 region->SetInt().SetTo  (end);
  222.                 regions.push_back(region);
  223.                 max_scores.push_back(max_score);
  224.             }
  225.         }
  226.     }
  227.     // deal with case where run went to end of sequence
  228.     if (in_a_run) {
  229.         end = scores.size() - 1;
  230.         CRef<CSeq_loc> region(new CSeq_loc());
  231.         region->SetInt().SetFrom(begin);
  232.         region->SetInt().SetTo  (end);
  233.         regions.push_back(region);
  234.         max_scores.push_back(max_score);
  235.     }
  236. }
  237. template<class Seq>
  238. double CCoil_PredictRegions(const Seq& seq,
  239.                             vector<CRef<objects::CSeq_loc> >& regions,
  240.                             vector<double>& max_scores,
  241.                             TSeqPos win_len)
  242. {
  243.     vector<double> scores;
  244.     vector<unsigned int> frames;
  245.     CCoiledCoil::ComputeScores(seq, scores, frames, win_len);
  246.     CCoiledCoil::x_PredictRegions(scores, regions, max_scores);
  247.     return *max_element(scores.begin(), scores.end());
  248. }
  249. double CCoiledCoil::PredictRegions(const string& seq,
  250.                                    vector<CRef<objects::CSeq_loc> >& regions,
  251.                                    vector<double>& max_scores,
  252.                                    TSeqPos win_len)
  253. {
  254.     return CCoil_PredictRegions(seq, regions, max_scores, win_len);
  255. }
  256. double CCoiledCoil::PredictRegions(const vector<char>& seq,
  257.                                    vector<CRef<objects::CSeq_loc> >& regions,
  258.                                    vector<double>& max_scores,
  259.                                    TSeqPos win_len)
  260. {
  261.     return CCoil_PredictRegions(seq, regions, max_scores, win_len);
  262. }
  263. double CCoiledCoil::PredictRegions(const objects::CSeqVector& seq,
  264.                                    vector<CRef<objects::CSeq_loc> >& regions,
  265.                                    vector<double>& max_scores,
  266.                                    TSeqPos win_len)
  267. {
  268.     return CCoil_PredictRegions(seq, regions, max_scores, win_len);
  269. }
  270. END_NCBI_SCOPE
  271. /*
  272.  * ===========================================================================
  273.  * $Log: coiled_coil.cpp,v $
  274.  * Revision 1000.1  2004/06/01 18:10:25  gouriano
  275.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  276.  *
  277.  * Revision 1.4  2004/05/21 21:41:04  gorelenk
  278.  * Added PCH ncbi_pch.hpp
  279.  *
  280.  * Revision 1.3  2003/09/09 18:30:55  ucko
  281.  * Fixes for WorkShop, which (still) doesn't let templates access
  282.  * anything file-static.
  283.  *
  284.  * Revision 1.2  2003/09/09 16:10:20  dicuccio
  285.  * Fxes for MSVC.  Moved templated functions into implementation file to avoid
  286.  * naming / export conflicts.  Moved lookup table to implementation file.
  287.  *
  288.  * Revision 1.1  2003/09/08 16:15:12  jcherry
  289.  * Initial version
  290.  *
  291.  * ===========================================================================
  292.  */