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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: nw_spliced_aligner32.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:05:06  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: nw_spliced_aligner32.cpp,v 1000.3 2004/06/01 18:05:06 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:  Yuri Kapustin
  35. *
  36. * File Description:  CSplicedAligner32
  37. *                   
  38. * ===========================================================================
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <algo/align/nw_spliced_aligner32.hpp>
  43. #include <algo/align/align_exception.hpp>
  44. BEGIN_NCBI_SCOPE
  45. const unsigned char g_nwspl32_donor[splice_type_count_32][2] = {
  46.     {'G','T'}, // donor type 1 in CDonorAcceptorMatrix coding
  47.     {'G','C'}, // 2
  48.     {'A','T'}  // 3
  49. };
  50. const unsigned char g_nwspl32_acceptor[splice_type_count_32][2] = {
  51.     {'A','G'}, // 1
  52.     {'A','G'}, // 2
  53.     {'A','C'}  // 3
  54. };
  55. // Transcript coding
  56. // (lower bits contain jump value for gaps and introns)
  57. const Uint4 kTypeDiag   = 0x00000000;  // single match or mismatch
  58. const Uint4 kTypeGap    = 0x40000000;  // gap - any type
  59. const Uint4 kTypeIntron = 0x80000000;  // intron
  60. // Donor-acceptor static object used
  61. // to figure out what donors and aceptors
  62. // could be transformed to any given na pair
  63. // by mutating either of its characters (but not both).
  64. // donor types:      bits 5-7
  65. // acceptor types:   bits 1-3
  66. class CDonorAcceptorMatrix {
  67. public:
  68.     CDonorAcceptorMatrix() {
  69.         memset(m_matrix, 0, sizeof m_matrix);
  70.         m_matrix['A']['A'] = 0x47; //       3 ; 1, 2, 3
  71.         m_matrix['A']['G'] = 0x47; //       3 ; 1, 2, 3
  72.         m_matrix['A']['T'] = 0x57; // 1,    3 ; 1, 2, 3
  73.         m_matrix['A']['C'] = 0x67; //    2, 3 ; 1, 2, 3
  74.         m_matrix['G']['A'] = 0x33; // 1, 2    ;
  75.         m_matrix['G']['G'] = 0x33; // 1, 2    ; 1, 2
  76.         m_matrix['G']['T'] = 0x70; // 1, 2, 3 ;
  77.         m_matrix['G']['C'] = 0x34; // 1, 2    ;       3
  78.         m_matrix['T']['A'] = 0x00; //         ;
  79.         m_matrix['T']['G'] = 0x03; //         ; 1, 2
  80.         m_matrix['T']['T'] = 0x50; // 1,    3 ;
  81.         m_matrix['T']['C'] = 0x24; //    2    ;       3
  82.         m_matrix['C']['A'] = 0x00; //         ;
  83.         m_matrix['C']['G'] = 0x03; //         ; 1, 2
  84.         m_matrix['C']['T'] = 0x50; // 1,    3 ;
  85.         m_matrix['C']['C'] = 0x24; //    2    ;       3
  86.     }
  87.     const Uint1* GetMatrix() const {
  88.         return m_matrix[0];
  89.     }
  90. private:
  91.     Uint1 m_matrix [256][256];
  92. };
  93. namespace {
  94.     CDonorAcceptorMatrix g_dnr_acc_matrix;
  95. }
  96. CSplicedAligner32::CSplicedAligner32():
  97.       m_Wd1(GetDefaultWd1()),
  98.       m_Wd2(GetDefaultWd2())
  99. {
  100.     for(unsigned char st = 0; st < splice_type_count_32; ++st) {
  101.         m_Wi[st] = GetDefaultWi(st);
  102.     }
  103. }
  104. CSplicedAligner32::CSplicedAligner32(const char* seq1, size_t len1,
  105.                                        const char* seq2, size_t len2)
  106.     : CSplicedAligner(seq1, len1, seq2, len2),
  107.       m_Wd1(GetDefaultWd1()),
  108.       m_Wd2(GetDefaultWd2())
  109. {
  110.     for(unsigned char st = 0; st < splice_type_count_32; ++st) {
  111.         m_Wi[st] = GetDefaultWi(st);
  112.     }
  113. }
  114. CNWAligner::TScore CSplicedAligner32::GetDefaultWi(unsigned char splice_type)
  115. {
  116.     switch(splice_type) {
  117.         case 0: return -15; // GT/AG
  118.         case 1: return -18; // GC/AG
  119.         case 2: return -21; // AT/AC
  120.         default: {
  121.             NCBI_THROW(CAlgoAlignException,
  122.                        eInvalidSpliceTypeIndex,
  123.                        "Invalid splice type index");
  124.         }
  125.     }
  126. }
  127. // Evaluate dynamic programming matrix. Create transcript.
  128. CNWAligner::TScore CSplicedAligner32::x_Align (
  129.                          const char* seg1, size_t len1,
  130.                          const char* seg2, size_t len2,
  131.                          vector<ETranscriptSymbol>* transcript )
  132. {
  133.     const size_t N1 = len1 + 1;
  134.     const size_t N2 = len2 + 1;
  135.     vector<TScore> stl_rowV (N2), stl_rowF (N2);
  136.     TScore* rowV    = &stl_rowV[0];
  137.     TScore* rowF    = &stl_rowF[0];
  138.     // index calculation: [i,j] = i*n2 + j
  139.     vector<Uint4> stl_bm (N1*N2);
  140.     Uint4* backtrace_matrix = &stl_bm[0];
  141.     TScore* pV = rowV - 1;
  142.     const char* seq1   = seg1 - 1;
  143.     const char* seq2   = seg2 - 1;
  144.     const TNCBIScore (*sm) [NCBI_FSM_DIM] = m_ScoreMatrix.s;
  145.     bool bFreeGapLeft1  = m_esf_L1 && seg1 == m_Seq1;
  146.     bool bFreeGapRight1 = m_esf_R1 && m_Seq1 + m_SeqLen1 - len1 == seg1;
  147.     bool bFreeGapLeft2  = m_esf_L2 && seg2 == m_Seq2;
  148.     bool bFreeGapRight2 = m_esf_R2 && m_Seq2 + m_SeqLen2 - len2 == seg2;
  149.     TScore wgleft1   = bFreeGapLeft1? 0: m_Wg;
  150.     TScore wsleft1   = bFreeGapLeft1? 0: m_Ws;
  151.     TScore wg1 = wgleft1, ws1 = wsleft1;
  152.     // recurrences
  153.     TScore wgleft2   = bFreeGapLeft2? 0: m_Wg;
  154.     TScore wsleft2   = bFreeGapLeft2? 0: m_Ws;
  155.     TScore V  = 0;
  156.     TScore V0 = 0;
  157.     TScore E, G, n0;
  158.     Uint4 type;
  159.     // store candidate donors
  160.     size_t* jAllDonors [splice_type_count_32];
  161.     TScore* vAllDonors [splice_type_count_32];
  162.     vector<size_t> stl_jAllDonors (splice_type_count_32 * N2);
  163.     vector<TScore> stl_vAllDonors (splice_type_count_32 * N2);
  164.     for(unsigned char st = 0; st < splice_type_count_32; ++st) {
  165.         jAllDonors[st] = &stl_jAllDonors[st*N2];
  166.         vAllDonors[st] = &stl_vAllDonors[st*N2];
  167.     }
  168.     size_t  jTail[splice_type_count_32], jHead[splice_type_count_32];
  169.     TScore  vBestDonor   [splice_type_count_32];
  170.     size_t  jBestDonor   [splice_type_count_32];
  171.     // place to store gap opening starts
  172.     size_t ins_start;
  173.     vector<size_t> stl_del_start(N2);
  174.     size_t* del_start = &stl_del_start[0];
  175.     // donor/acceptor matrix
  176.     const Uint1 * dnr_acc_matrix = g_dnr_acc_matrix.GetMatrix();
  177.     // fake row (above lambda)
  178.     rowV[0] = kInfMinus;
  179.     size_t k;
  180.     for (k = 0; k < N2; k++) {
  181.         rowV[k] = rowF[k] = kInfMinus;
  182. del_start[k] = k;
  183.     }
  184.     k = 0;
  185.     size_t i, j = 0, k0;
  186.     unsigned char ci;
  187.     for(i = 0;  i < N1;  ++i, j = 0) {
  188.         V = i > 0? (V0 += wsleft2) : 0;
  189.         E = kInfMinus;
  190.         ins_start = k0 = k;
  191.         backtrace_matrix[k++] = kTypeGap; // | del_start[0]
  192.         ci = i > 0? seq1[i]: 'N';
  193.         for(unsigned char st = 0; st < splice_type_count_32; ++st) {
  194.             jTail[st] = jHead[st] = 0;
  195.             vBestDonor[st] = kInfMinus;
  196.         }
  197.         if(i == N1 - 1 && bFreeGapRight1) {
  198.                 wg1 = ws1 = 0;
  199.         }
  200.         TScore wg2 = m_Wg, ws2 = m_Ws;
  201.             
  202.         // detect donor candidate
  203.         if(N2 > 2) {
  204.             unsigned char d1 = seq2[1], d2 = seq2[2];
  205.             Uint1 dnr_type = 0xF0 & dnr_acc_matrix[(size_t(d1)<<8)|d2];
  206.             for(Uint1 st = 0; st < splice_type_count_32; ++st ) {
  207.                 jAllDonors[st][jTail[st]] = j;
  208.                 if(dnr_type & (0x10 << st)) {
  209.                     vAllDonors[st][jTail[st]] = 
  210.                         ( d1 == g_nwspl32_donor[st][0] && d2 == g_nwspl32_donor[st][1] ) ?
  211.                         V: (V + m_Wd1);
  212.                 }
  213.                 else { // both chars distorted
  214.                     vAllDonors[st][jTail[st]] = V + m_Wd2;
  215.                 }
  216.                 ++(jTail[st]);
  217.             }
  218.         }
  219.         for (j = 1; j < N2; ++j, ++k) {
  220.             
  221.             G = pV[j] + sm[ci][(unsigned char)seq2[j]];
  222.             pV[j] = V;
  223.             n0 = V + wg1;
  224.             if(E >= n0) {
  225.                 E += ws1;      // continue the gap
  226.             }
  227.             else {
  228.                 E = n0 + ws1;  // open a new gap
  229. ins_start = k-1;
  230.             }
  231.             if(j == N2 - 1 && bFreeGapRight2) {
  232.                 wg2 = ws2 = 0;
  233.             }
  234.             n0 = rowV[j] + wg2;
  235.             if(rowF[j] >= n0) {
  236.                 rowF[j] += ws2;
  237.             }
  238.             else {
  239.                 rowF[j] = n0 + ws2;
  240.                 del_start[j] = k-N2;
  241.             }
  242.             // evaluate the score (V)
  243.             if (E >= rowF[j]) {
  244.                 if(E >= G) {
  245.                     V = E;
  246.                     type = kTypeGap | ins_start;
  247.                 }
  248.                 else {
  249.                     V = G;
  250.                     type = kTypeDiag;
  251.                 }
  252.             } else {
  253.                 if(rowF[j] >= G) {
  254.                     V = rowF[j];
  255.                     type = kTypeGap | del_start[j];
  256.                 }
  257.                 else {
  258.                     V = G;
  259.                     type = kTypeDiag;
  260.                 }
  261.             }
  262.             // find out if there are new donors
  263.             for(unsigned char st = 0; st < splice_type_count_32; ++st) {
  264.                 if(jTail[st] > jHead[st])  {
  265.                     if(j - jAllDonors[st][jHead[st]] >= m_IntronMinSize) {
  266.                         if(vAllDonors[st][jHead[st]] > vBestDonor[st]) {
  267.                             vBestDonor[st] = vAllDonors[st][jHead[st]];
  268.                             jBestDonor[st] = jAllDonors[st][jHead[st]];
  269.                         }
  270.                         ++(jHead[st]);
  271.                     }
  272.                 }
  273.             }
  274.                 
  275.             // check splice signal
  276.             Uint4 dnr_pos = kMax_UI4;
  277.             unsigned char c1 = seq2[j-1], c2 = seq2[j];
  278.             Uint1 acc_mask = 0x0F & dnr_acc_matrix[(size_t(c1)<<8)|c2];
  279.             for(Uint1 st = 0; st < splice_type_count_32; ++st ) {
  280.                 if(acc_mask & (0x01 << st)) {
  281.                     TScore vAcc = vBestDonor[st] + m_Wi[st];
  282.                     if( c1 != g_nwspl32_acceptor[st][0] || c2 != g_nwspl32_acceptor[st][1] ) {
  283.                         vAcc += m_Wd1;
  284.                     }
  285.                     if(vAcc > V) {
  286.                         V = vAcc;
  287.                         dnr_pos = k0 + jBestDonor[st];
  288.                     }
  289.                 }
  290.                 else {   // try arbitrary splice
  291.                     TScore vAcc = vBestDonor[st] + m_Wi[st] + m_Wd2;
  292.                     if(vAcc > V) {
  293.                         V = vAcc;
  294.                         dnr_pos = k0 + jBestDonor[st];
  295.                     }
  296.                 }
  297.             }
  298.             
  299.             if(dnr_pos != kMax_UI4) {
  300.                 type = kTypeIntron | dnr_pos;
  301.             }
  302.             backtrace_matrix[k] = type;
  303.             // detect donor candidates
  304.             if(j < N2 - 2) {
  305.                 unsigned char d1 = seq2[j+1], d2 = seq2[j+2];
  306.                 Uint1 dnr_mask = 0xF0 & dnr_acc_matrix[(size_t(d1)<<8)|d2];
  307.                 for(Uint1 st = 0; st < splice_type_count_32; ++st ) {
  308.                     if( dnr_mask & (0x10 << st) ) {
  309.                         if( d1 == g_nwspl32_donor[st][0] && d2 == g_nwspl32_donor[st][1] ) {
  310.                             if(V > vBestDonor[st]) {
  311.                                 jAllDonors[st][jTail[st]] = j;
  312.                                 vAllDonors[st][jTail[st]] = V;
  313.                                 ++(jTail[st]);
  314.                             }
  315.                         } else {
  316.                             TScore v = V + m_Wd1;
  317.                             if(v > vBestDonor[st]) {
  318.                                 jAllDonors[st][jTail[st]] = j;
  319.                                 vAllDonors[st][jTail[st]] = v;
  320.                                 ++(jTail[st]);
  321.                             }
  322.                         }
  323.                     }
  324.                     else { // both chars distorted
  325.                         TScore v = V + m_Wd2;
  326.                         if(v > vBestDonor[st]) {
  327.                             jAllDonors[st][jTail[st]] = j;
  328.                             vAllDonors[st][jTail[st]] = v;
  329.                             ++(jTail[st]);
  330.                         }
  331.                     }
  332.                 }
  333.             }
  334.         }
  335.         pV[j] = V;
  336.         if(i == 0) {
  337.             V0 = wgleft2;
  338.             wg1 = m_Wg;
  339.             ws1 = m_Ws;
  340.         }
  341.     }
  342.     try {
  343.     x_DoBackTrace(backtrace_matrix, N1, N2, transcript);
  344.     }
  345.     catch(exception&) { // GCC hack
  346.       throw;
  347.     }
  348.     
  349.     return V;
  350. }
  351. // perform backtrace step;
  352. void CSplicedAligner32::x_DoBackTrace ( const Uint4* backtrace_matrix,
  353.                                          size_t N1, size_t N2,
  354.                                          vector<ETranscriptSymbol>* transcript)
  355. {
  356.     transcript->clear();
  357.     transcript->reserve(N1 + N2);
  358.     const Uint4 mask_jump = 0x3FFFFFFF;
  359.     const Uint4 mask_type = ~mask_jump;
  360.     size_t k = N1*N2 - 1;
  361.     while (k != 0) {
  362.         Uint4 Key = backtrace_matrix[k];
  363.         Uint4 type = Key & mask_type;
  364. if(type == kTypeDiag) {
  365.     transcript->push_back(eTS_Match);
  366.     k -= N2 + 1;
  367. }
  368. else {
  369.   Uint4 k2 = (Key & mask_jump);
  370.   if(k2 >= k) {
  371.         NCBI_THROW(CAlgoAlignException, eInternal,
  372.                            "Incorrect backtrace jump detected");
  373.   }
  374.   ETranscriptSymbol ts;
  375.   Uint4 decr;
  376.   if(type == kTypeIntron) {
  377.     ts = eTS_Intron;
  378.     decr = 1;
  379.   }
  380.   else {
  381.     Uint4 kdel = k / N2, k2del = k2 / N2;
  382.     Uint4 kmod = k % N2, k2mod = k2 % N2;
  383.     if(kdel == k2del) {
  384.       ts = eTS_Insert;
  385.       decr = 1;
  386.     }
  387.     else if(kmod == k2mod) {
  388.       ts = eTS_Delete;
  389.       decr = N2;
  390.     }
  391.     else {
  392.       // ts = eTS_DiagSpace;
  393.       NCBI_THROW(CAlgoAlignException, eInternal,
  394.                          "Diag spaces not yet supported");
  395.     }
  396.   }
  397.   for(; k > k2; k -= decr) {
  398.     transcript->push_back(ts);
  399.   }
  400.   if(k != k2) {
  401.       NCBI_THROW(CAlgoAlignException, eInternal,
  402.                          "Backtrace jump failed");
  403.   }
  404. }
  405.     } // while
  406. }
  407. CNWAligner::TScore CSplicedAligner32::x_ScoreByTranscript() const
  408. {
  409.     const size_t dim = m_Transcript.size();
  410.     if(dim == 0) return 0;
  411.     TScore score = 0;
  412.     const char* p1 = m_Seq1;
  413.     const char* p2 = m_Seq2;
  414.     const TNCBIScore (*sm) [NCBI_FSM_DIM] = m_ScoreMatrix.s;
  415.     char state1;   // 0 = normal, 1 = gap, 2 = intron
  416.     char state2;   // 0 = normal, 1 = gap
  417.     switch( m_Transcript[dim - 1] ) {
  418.     case eTS_Match:
  419.         state1 = state2 = 0;
  420.         break;
  421.     case eTS_Insert:
  422.         state1 = 1; state2 = 0; score += m_Wg;
  423.         break;
  424.     case eTS_Intron:
  425.         state1 = 0; state2 = 0;
  426.         break; // intron flag set later
  427.     case eTS_Delete:
  428.         state1 = 0; state2 = 1; score += m_Wg;
  429.         break;
  430.     default: {
  431.         NCBI_THROW(CAlgoAlignException, eInternal,
  432.                    "Invalid transcript symbol");
  433.         }
  434.     }
  435.     for(int i = dim - 1; i >= 0; --i) {
  436.         unsigned char c1 = m_Seq1? *p1: 0;
  437.         unsigned char c2 = m_Seq2? *p2: 0;
  438.         switch(m_Transcript[i]) {
  439.         case eTS_Match: {
  440.             state1 = state2 = 0;
  441.             score += sm[c1][c2];
  442.             ++p1; ++p2;
  443.         }
  444.         break;
  445.         case eTS_Insert: {
  446.             if(state1 != 1) score += m_Wg;
  447.             state1 = 1; state2 = 0;
  448.             score += m_Ws;
  449.             ++p2;
  450.         }
  451.         break;
  452.         case eTS_Delete: {
  453.             if(state2 != 1) score += m_Wg;
  454.             state1 = 0; state2 = 1;
  455.             score += m_Ws;
  456.             ++p1;
  457.         }
  458.         break;
  459.         case eTS_Intron: {
  460.             if(state1 != 2) {
  461.                 for(unsigned char k = 0; k < splice_type_count_32; ++k) {
  462.                     if(*p2 == g_nwspl32_donor[k][0] && *(p2 + 1) == g_nwspl32_donor[k][1]) {
  463.                         score += m_Wi[k];
  464.                         break;
  465.                     }
  466.                 }
  467.             }
  468.             state1 = 2; state2 = 0;
  469.             ++p2;
  470.         }
  471.         break;
  472.         default: {
  473.         NCBI_THROW(CAlgoAlignException, eInternal,
  474.                    "Invalid transcript symbol");
  475.         }
  476.         }
  477.     }
  478.     if(m_esf_L1) {
  479.         size_t g = 0;
  480.         for(int i = dim - 1; i >= 0; --i) {
  481.             if(m_Transcript[i] == eTS_Insert) ++g; else break;
  482.         }
  483.         if(g > 0) {
  484.             score -= (m_Wg + g*m_Ws);
  485.         }
  486.     }
  487.     if(m_esf_L2) {
  488.         size_t g = 0;
  489.         for(int i = dim - 1; i >= 0; --i) {
  490.             if(m_Transcript[i] == eTS_Delete) ++g; else break;
  491.         }
  492.         if(g > 0) {
  493.             score -= (m_Wg + g*m_Ws);
  494.         }
  495.     }
  496.     if(m_esf_R1) {
  497.         size_t g = 0;
  498.         for(size_t i = 0; i < dim; ++i) {
  499.             if(m_Transcript[i] == eTS_Insert) ++g; else break;
  500.         }
  501.         if(g > 0) {
  502.             score -= (m_Wg + g*m_Ws);
  503.         }
  504.     }
  505.     if(m_esf_R2) {
  506.         size_t g = 0;
  507.         for(size_t i = 0; i < dim; ++i) {
  508.             if(m_Transcript[i] == eTS_Delete) ++g; else break;
  509.         }
  510.         if(g > 0) {
  511.             score -= (m_Wg + g*m_Ws);
  512.         }
  513.     }
  514.     return score;
  515. }
  516. END_NCBI_SCOPE
  517. /*
  518.  * ===========================================================================
  519.  * $Log: nw_spliced_aligner32.cpp,v $
  520.  * Revision 1000.3  2004/06/01 18:05:06  gouriano
  521.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  522.  *
  523.  * Revision 1.15  2004/05/21 21:41:02  gorelenk
  524.  * Added PCH ncbi_pch.hpp
  525.  *
  526.  * Revision 1.14  2004/05/18 21:43:40  kapustin
  527.  * Code cleanup
  528.  *
  529.  * Revision 1.13  2004/05/17 14:50:57  kapustin
  530.  * Add/remove/rearrange some includes and object declarations
  531.  *
  532.  * Revision 1.12  2004/04/23 14:39:47  kapustin
  533.  * Add Splign library and other changes
  534.  *
  535.  * Revision 1.10  2003/11/20 17:54:23  kapustin
  536.  * Alternative conventional splice penalty adjusted
  537.  *
  538.  * Revision 1.9  2003/10/31 19:40:13  kapustin
  539.  * Get rid of some WS and GCC complains
  540.  *
  541.  * Revision 1.8  2003/10/27 21:00:17  kapustin
  542.  * Set intron penalty defaults differently for 16- and 32-bit versions according to the expected quality of sequences those variants are supposed to be used with.
  543.  *
  544.  * Revision 1.7  2003/10/14 19:31:52  kapustin
  545.  * Use one flag for all gap types
  546.  *
  547.  * Revision 1.6  2003/09/30 19:50:04  kapustin
  548.  * Make use of standard score matrix interface
  549.  *
  550.  * Revision 1.5  2003/09/26 14:43:18  kapustin
  551.  * Remove exception specifications
  552.  *
  553.  * Revision 1.4  2003/09/10 20:25:21  kapustin
  554.  * Use unsigned char for score matrix index
  555.  *
  556.  * Revision 1.3  2003/09/10 19:13:10  kapustin
  557.  * Change backtrace type constants to allow larger jump values
  558.  *
  559.  * Revision 1.2  2003/09/04 16:07:38  kapustin
  560.  * Use STL vectors for exception-safe dynamic arrays and matrices
  561.  *
  562.  * Revision 1.1  2003/09/02 22:34:49  kapustin
  563.  * Initial revision
  564.  *
  565.  * ===========================================================================
  566.  */