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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: nw_aligner.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:02:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ALGO___NW_ALIGNER__HPP
  10. #define ALGO___NW_ALIGNER__HPP
  11. /* $Id: nw_aligner.hpp,v 1000.2 2004/06/01 18:02:25 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            public DOMAIN NOTICE                          
  15. *               National Center for Biotechnology Information
  16. *                                                                          
  17. *  This software/database is a "United States Government Work" under the   
  18. *  terms of the United States Copyright Act.  It was written as part of    
  19. *  the author's official duties as a United States Government employee and 
  20. *  thus cannot be copyrighted.  This software/database is freely available 
  21. *  to the public for use. The National Library of Medicine and the U.S.    
  22. *  Government have not placed any restriction on its use or reproduction.  
  23. *                                                                          
  24. *  Although all reasonable efforts have been taken to ensure the accuracy  
  25. *  and reliability of the software and data, the NLM and the U.S.          
  26. *  Government do not and cannot warrant the performance or results that    
  27. *  may be obtained by using this software or data. The NLM and the U.S.    
  28. *  Government disclaim all warranties, express or implied, including       
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.                                                                
  31. *                                                                          
  32. *  Please cite the author in any work or product based on this material.   
  33. *
  34. * ===========================================================================
  35. *
  36. * Author:  Yuri Kapustin
  37. *
  38. * File Description:
  39. *   CNWAligner class definition
  40. *
  41. *   CNWAligner encapsulates a generic global (Needleman-Wunsch)
  42. *   alignment algorithm with affine gap penalty model.
  43. *
  44. */
  45. #include <corelib/ncbistd.hpp>
  46. #include <corelib/ncbiobj.hpp>
  47. #include <corelib/ncbi_limits.hpp>
  48. #include <util/tables/raw_scoremat.h>
  49. #include <vector>
  50. #include <string>
  51. /** @addtogroup AlgoAlignRoot
  52.  *
  53.  * @{
  54.  */
  55. BEGIN_NCBI_SCOPE
  56. // Needleman Wunsch algorithm encapsulation
  57. //
  58. class NCBI_XALGOALIGN_EXPORT CNWAligner: public CObject
  59. {
  60. public:
  61.     typedef int TScore;
  62.     // ctors
  63.     CNWAligner(void);
  64.     // Null scoremat pointer indicates IUPACna coding
  65.     CNWAligner(const char* seq1, size_t len1,
  66.                const char* seq2, size_t len2,
  67.                const SNCBIPackedScoreMatrix* scoremat = 0);
  68.     virtual ~CNWAligner(void) {}
  69.     // Compute the alignment
  70.     TScore Run(void);
  71.     // Setters
  72.     void SetSequences(const char* seq1, size_t len1,
  73.       const char* seq2, size_t len2,
  74.       bool verify = true);
  75.   
  76.     void SetScoreMatrix(const SNCBIPackedScoreMatrix* scoremat);
  77.     void SetWm  (TScore value)  { m_Wm  = value; }   // match (na)
  78.     void SetWms (TScore value)  { m_Wms = value; }   // mismatch (na)
  79.     void SetWg  (TScore value)  { m_Wg  = value; }   // gap opening
  80.     void SetWs  (TScore value)  { m_Ws  = value; }   // gap extension
  81.     // specify whether end gaps should be penalized
  82.     void SetEndSpaceFree(bool Left1, bool Right1, bool Left2, bool Right2);
  83.     // alignment pattern (guides)
  84.     void  SetPattern(const vector<size_t>& pattern);
  85.     // progress reporting
  86.     struct SProgressInfo
  87.     {
  88.         SProgressInfo(void): m_iter_done(0), m_iter_total(0), m_data(0) {}
  89.         size_t m_iter_done;
  90.         size_t m_iter_total;
  91.         void*  m_data;
  92.         char   m_text_buffer [1024];
  93.     };
  94.     // return true to cancel calculation
  95.     typedef bool (*FProgressCallback) (SProgressInfo*);
  96.     void SetProgressCallback ( FProgressCallback prg_callback, void* data );
  97.     // Getters
  98.     static TScore GetDefaultWm  (void) { return  1; }
  99.     static TScore GetDefaultWms (void) { return -2; }
  100.     static TScore GetDefaultWg  (void) { return -5; }
  101.     static TScore GetDefaultWs  (void) { return -2; }
  102.     TScore GetWm  (void) const { return m_Wm; }
  103.     TScore GetWms (void) const { return m_Wms; }
  104.     TScore GetWg  (void) const { return m_Wg; }
  105.     TScore GetWs  (void) const { return m_Ws; }
  106.     const char*   GetSeq1(void) const { return m_Seq1; }
  107.     size_t        GetSeqLen1(void) const { return m_SeqLen1; }
  108.     const char*   GetSeq2(void) const { return m_Seq2; }
  109.     size_t        GetSeqLen2(void) const { return m_SeqLen2; }
  110.     void          GetEndSpaceFree(bool* L1, bool* R1, bool* L2, bool* R2)
  111.                       const;
  112.     TScore        GetScore(void) const;
  113.     
  114.     // transcript symbols
  115.     enum ETranscriptSymbol {
  116.         eTS_None    =  0,
  117.         eTS_Delete  = 'D',
  118.         eTS_Insert  = 'I',
  119.         eTS_Match   = 'M',
  120.         eTS_Replace = 'R',
  121.         eTS_Intron  = 'Z'
  122.     };
  123.     // raw transcript
  124.     const vector<ETranscriptSymbol>* GetTranscript(void) const {
  125.         return &m_Transcript;
  126.     }
  127.     // converted transcript vector
  128.     string GetTranscriptString(void) const;
  129.     // transcript parsers
  130.     size_t        GetLeftSeg(size_t* q0, size_t* q1,
  131.                              size_t* s0, size_t* s1,
  132.                              size_t min_size) const;
  133.     size_t        GetRightSeg(size_t* q0, size_t* q1,
  134.                               size_t* s0, size_t* s1,
  135.                               size_t min_size) const;
  136.     size_t        GetLongestSeg(size_t* q0, size_t* q1,
  137.                                 size_t* s0, size_t* s1) const;
  138.     // returns the size of a single backtrace matrix element
  139.     virtual size_t GetElemSize(void) const {
  140.         return 1;
  141.     }
  142. protected:
  143.     // Bonuses and penalties
  144.     TScore   m_Wm;   // match bonus (eNucl)
  145.     TScore   m_Wms;  // mismatch penalty (eNucl)
  146.     TScore   m_Wg;   // gap opening penalty
  147.     TScore   m_Ws;   // gap extension penalty
  148.     // end-space free flags
  149.     bool     m_esf_L1, m_esf_R1, m_esf_L2, m_esf_R2;
  150.     // alphabet and score matrix
  151.     const char*               m_abc;
  152.     SNCBIFullScoreMatrix      m_ScoreMatrix;
  153.     // progress callback
  154.     FProgressCallback         m_prg_callback;
  155.     // progress status
  156.     mutable SProgressInfo     m_prg_info;
  157.     // termination flag
  158.     mutable  bool             m_terminate;
  159.     // Source sequences
  160.     const char*               m_Seq1;
  161.     size_t                    m_SeqLen1;
  162.     const char*               m_Seq2;
  163.     size_t                    m_SeqLen2;
  164.     size_t x_CheckSequence(const char* seq, size_t len) const;
  165.     virtual bool x_CheckMemoryLimit(void);
  166.     // Transcript, score and guiding hits
  167.     vector<ETranscriptSymbol> m_Transcript;
  168.     TScore                    m_score;
  169.     vector<size_t>            m_guides;
  170.     // facilitate guide pre- and  post-processing, if applicable
  171.     virtual TScore x_Run   (void);
  172.     // core dynamic programming
  173.     virtual TScore x_Align (const char* seg1, size_t len1,
  174.                             const char* seg2, size_t len2,
  175.                             vector<ETranscriptSymbol>* transcript);
  176.     virtual TScore x_ScoreByTranscript(void) const;
  177.     // overflow safe "infinity"
  178.     enum { kInfMinus = kMin_Int / 2 };
  179.     // backtrace
  180.     void x_DoBackTrace(const unsigned char* backtrace_matrix,
  181.                        size_t N1, size_t N2,
  182.                        vector<ETranscriptSymbol>* transcript);
  183. };
  184. END_NCBI_SCOPE
  185. /* @} */
  186. /*
  187.  * ===========================================================================
  188.  * $Log: nw_aligner.hpp,v $
  189.  * Revision 1000.2  2004/06/01 18:02:25  gouriano
  190.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33
  191.  *
  192.  * Revision 1.33  2004/05/17 14:50:46  kapustin
  193.  * Add/remove/rearrange some includes and object declarations
  194.  *
  195.  * Revision 1.32  2003/12/29 13:02:39  kapustin
  196.  * Make x_GetElemSize() public and rename.
  197.  * Return string from GetTranscriptString().
  198.  *
  199.  * Revision 1.31  2003/10/27 20:46:21  kapustin
  200.  * Derive from CObject. Add more getters.
  201.  *
  202.  * Revision 1.30  2003/10/14 18:43:37  kapustin
  203.  * Run() is not iteslf polymorphic
  204.  *
  205.  * Revision 1.29  2003/09/30 19:49:32  kapustin
  206.  * Make use of standard score matrix interface
  207.  *
  208.  * Revision 1.28  2003/09/26 14:43:01  kapustin
  209.  * Remove exception specifications
  210.  *
  211.  * Revision 1.27  2003/09/10 20:12:47  kapustin
  212.  * Update Doxygen tags
  213.  *
  214.  * Revision 1.26  2003/09/02 22:30:34  kapustin
  215.  * Move formatting functionality out of the class
  216.  *
  217.  * Revision 1.24  2003/06/26 20:39:53  kapustin
  218.  * Rename formal parameters in SetEndSpaceFree() to avoid conflict with
  219.  * macro under some configurations
  220.  *
  221.  * Revision 1.23  2003/06/17 17:20:28  kapustin
  222.  * CNWAlignerException -> CAlgoAlignException
  223.  *
  224.  * Revision 1.22  2003/06/17 14:49:38  dicuccio
  225.  * Fix-up after move to algo/align
  226.  *
  227.  * Revision 1.21  2003/06/02 14:04:25  kapustin
  228.  * Progress indication-related updates
  229.  *
  230.  * Revision 1.20  2003/05/23 18:23:40  kapustin
  231.  * Introduce a generic splice type. Make transcript symbol to be more
  232.  * specific about type of the intron.
  233.  *
  234.  * Revision 1.19  2003/04/14 18:58:19  kapustin
  235.  * x_Run() -> x_Align()
  236.  *
  237.  * Revision 1.18  2003/04/10 19:14:04  kapustin
  238.  * Introduce guiding hits approach
  239.  *
  240.  * Revision 1.17  2003/04/10 19:04:30  siyan
  241.  * Added doxygen support
  242.  *
  243.  * Revision 1.16  2003/04/02 20:52:24  kapustin
  244.  * Make FormatAsText virtual. Pass output string as a parameter.
  245.  *
  246.  * Revision 1.15  2003/03/31 15:31:47  kapustin
  247.  * Calculate score independently from transcript
  248.  *
  249.  * Revision 1.14  2003/03/18 15:12:29  kapustin
  250.  * Declare virtual mem limit checking function. Allow separate specification
  251.  * of free end gaps
  252.  *
  253.  * Revision 1.13  2003/03/12 21:11:03  kapustin
  254.  * Add text buffer to progress callback info structure
  255.  *
  256.  * Revision 1.12  2003/03/05 20:12:22  kapustin
  257.  * Simplify FormatAsText interface
  258.  *
  259.  * Revision 1.11  2003/02/26 21:30:32  gouriano
  260.  * modify C++ exceptions thrown by this library
  261.  *
  262.  * Revision 1.10  2003/02/21 16:41:11  dicuccio
  263.  * Added Win32 export specifier
  264.  *
  265.  * Revision 1.9  2003/02/11 16:06:13  kapustin
  266.  * Add end-space free alignment support
  267.  *
  268.  * Revision 1.8  2003/02/04 23:04:38  kapustin
  269.  * Add progress callback support
  270.  *
  271.  * Revision 1.7  2003/01/30 20:32:51  kapustin
  272.  * Add EstiamteRunningTime()
  273.  *
  274.  * Revision 1.6  2003/01/28 12:36:52  kapustin
  275.  * Format() --> FormatAsText(). Add FormatAsSeqAlign() and
  276.  * support for sequence ids
  277.  *
  278.  * Revision 1.5  2003/01/24 16:48:36  kapustin
  279.  * Support more output formats - type 2 and gapped FastA
  280.  *
  281.  * Revision 1.4  2003/01/21 12:36:56  kapustin
  282.  * Specify negative infinity value
  283.  *
  284.  * Revision 1.3  2002/12/12 17:55:00  kapustin
  285.  * Add support for spliced alignment
  286.  *
  287.  * Revision 1.2  2002/12/09 15:44:40  kapustin
  288.  * exception forward declaration removed
  289.  *
  290.  * Revision 1.1  2002/12/06 17:40:12  ivanov
  291.  * Initial revision
  292.  *
  293.  * ===========================================================================
  294.  */
  295. #endif  /* ALGO___NW_ALIGNER__HPP */