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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: signal_seq.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:10:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: signal_seq.cpp,v 1000.2 2004/06/01 18:10:56 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 signal sequences from protein sequence
  37.  *                    according to von Heijne, 1986 and 1987
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <algo/sequence/signal_seq.hpp>
  42. BEGIN_NCBI_SCOPE
  43. USING_SCOPE(objects);
  44. // Scoring matrix for eukaryotic signal sequences
  45. // we have to declare these extern to be accessible from template on ForteCC.
  46. extern const double const_EukMat[26][15];
  47. extern const double const_BacMat[26][15];
  48. const double const_EukMat[26][15] = {
  49.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  50.     {0.0984401, -0.109199, -0.0350913, 0.0339016, 0.321584,
  51.      0.216223, 0.216223, 0.159065, 0.544727, 0.0339016, 
  52.      1.176, -0.882389, 1.70788, 0.216223, -0.882389}, // A
  53.      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // B (?)
  54.     {-0.405465, 0.287682, 0.693147, 0.441833, 0.693147,
  55.      1.13498, 0.287682, 0.575364, 0.105361, 0.287682,
  56.      1.44036, -0.405465, 0.693147, 0.575364, -0.405465}, // C
  57.     {-2.18605, -2.18605, -2.18605, -2.18605, -2.18605,
  58.      -2.18605, -2.18605, -2.18605, -0.576613, -1.08744,
  59.      -25.2119, -0.576613, -25.2119, 0.116534, 0.211844}, // D
  60.     {-2.30259, -2.30259, -2.30259, -2.30259, -2.30259,
  61.      -2.30259, -2.30259, -2.30259, -1.20397, -0.356675,
  62.      -25.3284, -0.356675, -25.3284, 0.262364, 0.336472}, // E
  63.     {0.842183, 0.474458, 0.675129, 0.675129, 0.0689929,
  64.      0.223144, 1.16761, 0.842183, -0.336472, -0.113329,
  65.      -24.7486, 0.842183, -24.7486, 0.0689929, -0.336472}, // F
  66.     {-1.10691, -1.10691, -1.39459, -0.701446, -1.39459,
  67.      0.0717439, -1.39459, -1.80006, 0.451234, 1.03316,
  68.      -0.883768, -0.547295, 1.17036, -0.19062, -0.547295}, // G
  69.     {-1.22378, -1.22378, -1.22378, -1.22378, -1.22378,
  70.      -1.22378, -1.22378, -1.22378, 0.385662, -1.22378,
  71.      -24.2496, 0.567984, -24.2496, 0.162519, -0.530628}, // H
  72.     {0.70657, 0.70657, 0.0779615, -0.209721, 0.396415,
  73.      -0.392042, -0.615186, 0.0779615, -0.392042, -2.00148,
  74.      0.301105, -0.392042, -25.0273, 0.0779615, -0.0555699}, // I
  75.     {-2.4248, -2.4248, -2.4248, -2.4248, -2.4248,
  76.      -2.4248, -2.4248, -2.4248, -2.4248, -1.03851,
  77.      -25.4507, -1.73166, -25.4507, -0.0269075, -0.227578}, // K
  78.     {1.76947, 1.7263, 1.78346, 1.87624, 1.8635,
  79.      1.31346, 1.66568, 1.39861, -0.19062, 0.642289,
  80.      -0.413764, 0.502527, -2.49321, -0.413764, -1.10691}, // L
  81.     {-0.993252, 0.105361, 0.952658, 0.393043, -0.993252,
  82.      0.798508, -0.300105, -0.300105, -0.993252, -0.993252,
  83.      -24.0191, -0.993252, -24.0191, -0.993252, -0.300105}, // M
  84.     {-1.96009, -1.96009, -1.96009, -1.96009, -1.96009,
  85.      -1.96009, -1.96009, -1.96009, -0.861482, -0.861482,
  86.      -24.9859, 0.34249, -24.9859, -0.5738, -0.0141846}, // N
  87.     {-1.30833, -2.00148, -1.30833, -2.00148, -2.00148,
  88.      -0.615186, -2.00148, 0.0779615, 0.994252, 0.637577,
  89.      -25.0273, -2.00148, -0.902868, -2.00148, 1.08956}, // P
  90.     {-1.84055, -1.84055, -1.84055, -1.84055, -1.84055,
  91.      -0.0487902, -1.84055, -1.84055, 0.462035, 0.238892,
  92.      -24.8664, 1.04982, -0.741937, 1.10389, 0.462035}, // Q
  93.     {-1.335, -2.02815, -2.02815, -2.02815, -2.02815,
  94.      -2.02815, -2.02815, -2.02815, -0.0822381, -0.641854,
  95.      -25.054, 0.679902, -25.054, 0.456758, 0.169076}, // R
  96.     {-0.236389, -1.335, -0.354172, -0.641854, 0.131336,
  97.      -0.131028, 0.274437, 0.338975, 0.824483, -0.0357181,
  98.      0.701881, 0.3996, 0.562119, 0.274437, -0.131028}, // S
  99.     {-1.57898, 0.0304592, -0.662688, -0.885832, -0.662688,
  100.      0.292823, -0.326216, -0.326216, 0.212781, -0.480366,
  101.      0.561087, -0.192684, -0.480366, -1.17351, 0.0304592}, // T
  102.     {0.588787, 0.811931, 0.301105, 0.483427, 0.158004,
  103.      0.301105, -0.00904984, 0.888892, -2.40695, 0.0779615,
  104.      1.05879, -1.30833, -25.4328, -0.327504, 0.426268}, // V
  105.     {0.798508, 0.510826, 0.510826, -0.587787, -0.587787,
  106.      0.105361, 1.20397, 0.510826, -0.587787, 0.510826,
  107.      -23.6136, 1.60944, -23.6136, 0.105361, -0.587787}, // W
  108.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // X (?)
  109.     {-1.72277, -1.72277, -0.336472, -1.72277, -1.72277,
  110.      -1.72277, -0.624154, -1.72277, -1.72277, -1.02962,
  111.      -24.7486, -0.113329, -24.7486, -1.72277, 0.223144}, // Y
  112.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Z (?)
  113.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // U (?)
  114.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} // * (?)
  115. };
  116. // Scoring matrix for bacterial signal sequences
  117. const double const_BacMat[26][15] = {
  118.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  119.     {1.13943, 0.916291, 0.916291, 1.03407, 0.628609,
  120.      0.782759, 0.446287, 0.628609, 0.782759, 0.782759,
  121.      2.0149, -0.470004, 2.27084, 1.72722, 0.223144}, // A
  122.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // B (?)
  123.     {0, 0, 0, 0, 0,
  124.      0, 0, 0, 0, 0,
  125.      -23.0259, 0, -23.0259, 0, 0}, // C
  126.     {-0.693147, -0.693147, -0.693147, -0.693147, -0.693147,
  127.      -0.693147, -0.693147, -0.693147, -0.693147, -0.693147,
  128.      -23.719, -0.693147, -23.719, 0, 1.38629}, // D
  129.     {-0.788457, -0.788457, -0.788457, -0.788457, -0.788457,
  130.      -0.788457, -0.788457, -0.788457, -0.788457, -0.788457,
  131.      -23.8143, -0.788457, -23.8143, 0.597837, 1.29098}, // E
  132.     {0.430783, 1.12393, 0.836248, 1.12393, -0.262364,
  133.      -0.262364, 1.81708, -0.262364, 1.12393, -0.262364,
  134.      -23.2882, 1.68355, -23.2882, -0.262364, -0.262364}, // F
  135.     {0.393043, -0.300105, -0.300105, -0.300105, 0.105361,
  136.      0.616186, -0.300105, 0.393043, -0.300105, -0.300105,
  137.      -24.0191, -0.300105, -0.300105, -0.993252, -0.993252}, // G
  138.     {0.223144, 0.223144, 0.223144, 0.223144, 0.223144,
  139.      0.223144, 0.223144, 0.223144, 0.223144, 0.223144,
  140.      -22.8027, 2.16905, -22.8027, 0.223144, 0.223144}, // H
  141.     {0.567984, -0.530628, 1.07881, -0.530628, 1.07881,
  142.      -0.530628, -0.530628, 0.567984, -0.530628, -0.530628,
  143.      -23.5565, -0.530628, -23.5565, -0.530628, 0.162519}, // I
  144.     {-0.916291, -0.916291, -0.916291, -0.916291, -0.916291,
  145.      -0.916291, -0.916291, -0.916291, -0.916291, -0.916291,
  146.      -23.9421, -0.223144, -23.9421, 0.182322, -0.916291}, // K
  147.     {1.08619, 1.40464, 1.20397, 1.08619, 1.20397,
  148.      1.5717, -0.993252, -0.993252, -0.300105, -0.300105,
  149.      -0.993252, -0.300105, -24.0191, -0.993252, -0.993252}, // L
  150.     {0.510826, 1.20397, 0.510826, 0.510826, 1.60944,
  151.      1.20397, 1.60944, 0.510826, 0.510826, 1.20397,
  152.      -22.515, 1.89712, -22.515, 0.510826, 0.510826}, // M
  153.     {-0.470004, -0.470004, -0.470004, -0.470004, -0.470004,
  154.      -0.470004, -0.470004, -0.470004, -0.470004, -0.470004,
  155.      -23.4959, 0.628609, -23.4959, -0.470004, 0.916291}, // N
  156.     {-0.530628, -0.530628, -0.530628, -0.530628, -0.530628,
  157.      -0.530628, 0.162519, 0.567984, 1.07881, 0.162519,
  158.      -23.5565, -0.530628, -23.5565, -0.530628, 1.07881}, // P
  159.     {-0.336472, -0.336472, -0.336472, -0.336472, -0.336472,
  160.      -0.336472, -0.336472, -0.336472, 0.356675, 0.356675,
  161.      -23.3623, 0.76214, -23.3623, -0.336472, -0.336472}, // Q
  162.     {-0.530628, -0.530628, -0.530628, -0.530628, -0.530628,
  163.      -0.530628, -0.530628, -0.530628, -0.530628, -0.530628,
  164.      -23.5565, -0.530628, -23.5565, -0.530628, -0.530628}, // R
  165.     {-0.955511, -0.955511, -0.955511, 0.430783, 0.430783,
  166.      -0.955511, 0.653926, 1.75254, 0.653926, 1.12393,
  167.      0.653926, -0.262364, -0.262364, -0.955511, -0.955511}, // S
  168.     {-0.0953102, -0.788457, 0.597837, -0.0953102, -0.0953102,
  169.      -0.0953102, -0.0953102, -0.0953102, 0.820981, -0.788457,
  170.      0.310155, -0.788457, -0.788457, -0.788457, -0.0953102}, // T
  171.     {0.693147, 1.02962, -0.916291, 0.182322, -0.916291,
  172.      0.470004, 1.02962, -0.916291, -0.916291, 0.470004,
  173.      0.182322, -0.916291, -23.9421, -0.223144, -0.916291}, // V
  174.     {0.916291, 0.916291, 0.916291, 0.916291, 0.916291,
  175.      0.916291, 0.916291, 0.916291, 0.916291, 0.916291,
  176.      -22.1096, 0.916291, -22.1096, 0.916291, 0.916291}, // W
  177.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // X (?)
  178.     {-0.262364, -0.262364, -0.262364, -0.262364, -0.262364,
  179.      -0.262364, -0.262364, -0.262364, -0.262364, 0.836248,
  180.      -23.2882, -0.262364, -23.2882, -0.262364, -0.262364}, // Y
  181.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Z (?)
  182.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // U (?)
  183.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  // * (?)
  184. };
  185. template<class Seq>
  186. void x_PredictSignalSeq(const Seq& seq, CSignalSeq::EDomain domain,
  187.                         TSeqPos max_pos, TSeqPos& pos, double& score)
  188. {
  189.     const double (*Mat)[15];
  190.     if (domain == CSignalSeq::eBacterial) {
  191.         Mat = const_BacMat;
  192.     } else {
  193.         Mat = const_EukMat;
  194.     }
  195.     TSeqPos max_index = min((TSeqPos)seq.size() - 15, max_pos - 12);
  196.     
  197.     double max_score = -1e6;
  198.     TSeqPos max_loc;
  199.     for (unsigned int i = 0;  i <= max_index;  i++) {
  200.         double sum = 0;
  201.         for (unsigned int j = 0;  j < 15;  j++) {
  202.             sum += Mat[seq[i + j]][j];
  203.         }
  204.         if (sum > max_score) {
  205.             max_score = sum;
  206.             max_loc = i;
  207.         }
  208.     }
  209.     score = max_score;
  210.     pos = max_loc + 12;  // position before cut
  211. }
  212. void CSignalSeq::Predict(const string& seq, EDomain domain,
  213.                          TSeqPos max_pos, TSeqPos& pos, double& score)
  214. {
  215.     x_PredictSignalSeq(seq, domain, max_pos, pos, score);
  216. }
  217. void CSignalSeq::Predict(const vector<char>& seq, EDomain domain,
  218.                          TSeqPos max_pos, TSeqPos& pos, double& score)
  219. {
  220.     x_PredictSignalSeq(seq, domain, max_pos, pos, score);
  221. }
  222. void CSignalSeq::Predict(const CSeqVector& seq, EDomain domain,
  223.                          TSeqPos max_pos, TSeqPos& pos, double& score)
  224. {
  225.     string seq_ncbistdaa;
  226.     CSeqVector vec(seq);
  227.     vec.SetNcbiCoding();
  228.     vec.GetSeqData(0, vec.size(), seq_ncbistdaa);
  229.     x_PredictSignalSeq(seq_ncbistdaa, domain, max_pos, pos, score);
  230. }
  231. END_NCBI_SCOPE
  232. /*
  233.  * ===========================================================================
  234.  * $Log: signal_seq.cpp,v $
  235.  * Revision 1000.2  2004/06/01 18:10:56  gouriano
  236.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  237.  *
  238.  * Revision 1.7  2004/05/21 21:41:04  gorelenk
  239.  * Added PCH ncbi_pch.hpp
  240.  *
  241.  * Revision 1.6  2004/03/16 19:40:09  vasilche
  242.  * Made static const arrays accessible from template on ForteCC
  243.  *
  244.  * Revision 1.5  2004/03/15 12:30:19  dicuccio
  245.  * Changed name of const arrays
  246.  *
  247.  * Revision 1.4  2004/03/12 19:59:31  dicuccio
  248.  * Dropped static on private arrays as WorkShop doesn't let templates use such
  249.  * arrays
  250.  *
  251.  * Revision 1.3  2004/03/11 17:27:16  dicuccio
  252.  * Changed static member arrays to private static arrays
  253.  *
  254.  * Revision 1.2  2003/09/10 17:55:04  ucko
  255.  * Add a cast to fix 64-bit compilation.
  256.  *
  257.  * Revision 1.1  2003/09/10 15:31:34  jcherry
  258.  * Initial version
  259.  *
  260.  * ===========================================================================
  261.  */