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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnvec.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:34:45  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.33
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_ALNMGR___ALNVEC__HPP
  10. #define OBJECTS_ALNMGR___ALNVEC__HPP
  11. /*  $Id: alnvec.hpp,v 1000.1 2004/04/12 17:34:45 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:  Kamen Todorov, NCBI
  37.  *
  38.  * File Description:
  39.  *   Access to the actual aligned residues
  40.  *
  41.  */
  42. #include <objtools/alnmgr/alnmap.hpp>
  43. #include <objmgr/seq_vector.hpp>
  44. BEGIN_NCBI_SCOPE
  45. BEGIN_objects_SCOPE
  46. // forward declarations
  47. class CScope;
  48. class NCBI_XALNMGR_EXPORT CAlnVec : public CAlnMap
  49. {
  50.     typedef CAlnMap                         Tparent;
  51.     typedef map<TNumrow, CBioseq_Handle>    TBioseqHandleCache;
  52.     typedef map<TNumrow, CRef<CSeqVector> > TSeqVectorCache;
  53. public:
  54.     typedef CSeqVector::TResidue            TResidue;
  55.     typedef vector<int>                     TResidueCount;
  56.     // constructor
  57.     CAlnVec(const CDense_seg& ds, CScope& scope);
  58.     CAlnVec(const CDense_seg& ds, TNumrow anchor, CScope& scope);
  59.     // destructor
  60.     ~CAlnVec(void);
  61.     CScope& GetScope(void) const;
  62.     // GetSeqString methods:
  63.     // raw seq string (in seq coords)
  64.     string& GetSeqString   (string& buffer,
  65.                             TNumrow row,
  66.                             TSeqPos seq_from, TSeqPos seq_to)             const;
  67.     string& GetSeqString   (string& buffer,
  68.                             TNumrow row,
  69.                             const CAlnMap::TRange& seq_rng)               const;
  70.     string& GetSegSeqString(string& buffer, 
  71.                             TNumrow row, 
  72.                             TNumseg seg, TNumseg offset = 0)              const;
  73.  
  74.    // alignment (seq + gaps) string (in aln coords)
  75.     string& GetAlnSeqString(string& buffer,
  76.                             TNumrow row, 
  77.                             const CAlnMap::TSignedRange& aln_rng)         const;
  78.     // creates a vertical string of residues for a given aln pos
  79.     // optionally, returns a distribution of residues
  80.     // optionally, counts the gaps in this distribution
  81.     string& GetColumnVector(string& buffer,
  82.                             TSeqPos aln_pos,
  83.                             TResidueCount * residue_count = 0,
  84.                             bool gaps_in_count = false)                   const;
  85.     // get the seq string for the whole alignment (seq + gaps)
  86.     // optionally, get the inserts and screen limit coords
  87.     string& GetWholeAlnSeqString(TNumrow       row,
  88.                                  string&       buffer,
  89.                                  TSeqPosList * insert_aln_starts = 0,
  90.                                  TSeqPosList * insert_starts = 0,
  91.                                  TSeqPosList * insert_lens = 0,
  92.                                  unsigned int  scrn_width = 0,
  93.                                  TSeqPosList * scrn_lefts = 0,
  94.                                  TSeqPosList * scrn_rights = 0) const;
  95.     const CBioseq_Handle& GetBioseqHandle(TNumrow row)                  const;
  96.     TResidue              GetResidue     (TNumrow row, TSeqPos aln_pos) const;
  97.     // gap character could be explicitely set otherwise taken from seqvector
  98.     void     SetGapChar(TResidue gap_char);
  99.     void     UnsetGapChar();
  100.     bool     IsSetGapChar()                const;
  101.     TResidue GetGapChar(TNumrow row)       const;
  102.     // end character is ' ' by default
  103.     void     SetEndChar(TResidue gap_char);
  104.     bool     IsSetEndChar()                const;
  105.     TResidue GetEndChar()                  const;
  106.     // functions for manipulating the consensus sequence
  107.     CRef<CDense_seg> CreateConsensus(int& consensus_row) const;
  108.     // utilities
  109.     int CalculateScore          (TNumrow row1, TNumrow row2) const;
  110.     int CalculatePercentIdentity(TSeqPos aln_pos)            const;
  111.     // static utilities
  112.     static void TranslateNAToAA(const string& na, string& aa);
  113.     static int  CalculateScore (const string& s1, const string& s2,
  114.                                 bool s1_is_prot, bool s2_is_prot);
  115.     
  116.     // temporaries for conversion (see note below)
  117.     static unsigned char FromIupac(unsigned char c);
  118.     static unsigned char ToIupac  (unsigned char c);
  119. protected:
  120.     CSeqVector& x_GetSeqVector         (TNumrow row)       const;
  121.     CSeqVector& x_GetConsensusSeqVector(void)              const;
  122.     mutable CRef<CScope>            m_Scope;
  123.     mutable TBioseqHandleCache      m_BioseqHandlesCache;
  124.     mutable TSeqVectorCache         m_SeqVectorCache;
  125. private:
  126.     // Prohibit copy constructor and assignment operator
  127.     CAlnVec(const CAlnVec&);
  128.     CAlnVec& operator=(const CAlnVec&);
  129.     TResidue m_GapChar;
  130.     bool     m_set_GapChar;
  131.     TResidue m_EndChar;
  132.     bool     m_set_EndChar;
  133. };
  134. /////////////////////////////////////////////////////////////////////////////
  135. //  IMPLEMENTATION of INLINE functions
  136. /////////////////////////////////////////////////////////////////////////////
  137. inline
  138. CScope& CAlnVec::GetScope(void) const
  139. {
  140.     return *m_Scope;
  141. }
  142. inline 
  143. CSeqVector::TResidue CAlnVec::GetResidue(TNumrow row, TSeqPos aln_pos) const
  144. {
  145.     if (aln_pos > GetAlnStop()) {
  146.         return (TResidue) 0; // out of range
  147.     }
  148.     TSegTypeFlags type = GetSegType(row, GetSeg(aln_pos));
  149.     if (type & fSeq) {
  150.         CSeqVector& seq_vec = x_GetSeqVector(row);
  151.         TSignedSeqPos pos = GetSeqPosFromAlnPos(row, aln_pos);
  152.         if (GetWidth(row) == 3) {
  153.             string na_buff, aa_buff;
  154.             if (IsPositiveStrand(row)) {
  155.                 seq_vec.GetSeqData(pos, pos + 3, na_buff);
  156.             } else {
  157.                 TSeqPos size = seq_vec.size();
  158.                 seq_vec.GetSeqData(size - pos - 3, size - pos, na_buff);
  159.             }
  160.             TranslateNAToAA(na_buff, aa_buff);
  161.             return aa_buff[0];
  162.         } else {
  163.             return seq_vec[IsPositiveStrand(row) ?
  164.                           pos : seq_vec.size() - pos - 1];
  165.         }
  166.     } else {
  167.         if (type & fNoSeqOnLeft  ||  type & fNoSeqOnRight) {
  168.             return GetEndChar();
  169.         } else {
  170.             return GetGapChar(row);
  171.         }
  172.     }
  173. }
  174. inline
  175. string& CAlnVec::GetSeqString(string& buffer,
  176.                               TNumrow row,
  177.                               TSeqPos seq_from, TSeqPos seq_to) const
  178. {
  179.     if (GetWidth(row) == 3) {
  180.         string buff;
  181.         buffer.erase();
  182.         if (IsPositiveStrand(row)) {
  183.             x_GetSeqVector(row).GetSeqData(seq_from, seq_to + 1, buff);
  184.         } else {
  185.             CSeqVector& seq_vec = x_GetSeqVector(row);
  186.             TSeqPos size = seq_vec.size();
  187.             seq_vec.GetSeqData(size - seq_to - 1, size - seq_from, buff);
  188.         }
  189.         TranslateNAToAA(buff, buffer);
  190.     } else {
  191.         if (IsPositiveStrand(row)) {
  192.             x_GetSeqVector(row).GetSeqData(seq_from, seq_to + 1, buffer);
  193.         } else {
  194.             CSeqVector& seq_vec = x_GetSeqVector(row);
  195.             TSeqPos size = seq_vec.size();
  196.             seq_vec.GetSeqData(size - seq_to - 1, size - seq_from, buffer);
  197.         }
  198.     }
  199.     return buffer;
  200. }
  201. inline
  202. string& CAlnVec::GetSegSeqString(string& buffer,
  203.                                  TNumrow row,
  204.                                  TNumseg seg, int offset) const
  205. {
  206.     return GetSeqString(buffer, row,
  207.                         GetStart(row, seg, offset),
  208.                         GetStop (row, seg, offset));
  209. }
  210. inline
  211. string& CAlnVec::GetSeqString(string& buffer,
  212.                               TNumrow row,
  213.                               const CAlnMap::TRange& seq_rng) const
  214. {
  215.     return GetSeqString(buffer, row,
  216.                         seq_rng.GetFrom(),
  217.                         seq_rng.GetTo());
  218. }
  219. inline
  220. void CAlnVec::SetGapChar(TResidue gap_char)
  221. {
  222.     m_GapChar = gap_char;
  223.     m_set_GapChar = true;
  224. }
  225. inline
  226. void CAlnVec::UnsetGapChar()
  227. {
  228.     m_set_GapChar = false;
  229. }
  230. inline
  231. bool CAlnVec::IsSetGapChar() const
  232. {
  233.     return m_set_GapChar;
  234. }
  235. inline
  236. CSeqVector::TResidue CAlnVec::GetGapChar(TNumrow row) const
  237. {
  238.     if (IsSetGapChar()) {
  239.         return m_GapChar;
  240.     } else {
  241.         return x_GetSeqVector(row).GetGapChar();
  242.     }
  243. }
  244. inline
  245. void CAlnVec::SetEndChar(TResidue end_char)
  246. {
  247.     m_EndChar = end_char;
  248.     m_set_EndChar = true;
  249. }
  250. inline
  251. bool CAlnVec::IsSetEndChar() const
  252. {
  253.     return m_set_EndChar;
  254. }
  255. inline
  256. CSeqVector::TResidue CAlnVec::GetEndChar() const
  257. {
  258.     if (IsSetEndChar()) {
  259.         return m_EndChar;
  260.     } else {
  261.         return ' ';
  262.     }
  263. }
  264. //
  265. // these are a temporary work-around
  266. // CSeqportUtil contains routines for converting sequence data from one
  267. // format to another, but it places a requirement on the data: it must in
  268. // a CSeq_data class.  I can get this for my data, but it is a bit of work
  269. // (much more work than calling CSeqVector::GetSeqdata(), which, if I use the
  270. // internal sequence vector, is guaranteed to be in IUPAC notation)
  271. //
  272. inline
  273. unsigned char CAlnVec::FromIupac(unsigned char c)
  274. {
  275.     switch (c)
  276.     {
  277.     case 'A': return 0x01;
  278.     case 'C': return 0x02;
  279.     case 'M': return 0x03;
  280.     case 'G': return 0x04;
  281.     case 'R': return 0x05;
  282.     case 'S': return 0x06;
  283.     case 'V': return 0x07;
  284.     case 'T': return 0x08;
  285.     case 'W': return 0x09;
  286.     case 'Y': return 0x0a;
  287.     case 'H': return 0x0b;
  288.     case 'K': return 0x0c;
  289.     case 'D': return 0x0d;
  290.     case 'B': return 0x0e;
  291.     case 'N': return 0x0f;
  292.     }
  293.     return 0x00;
  294. }
  295. inline unsigned char CAlnVec::ToIupac(unsigned char c)
  296. {
  297.     const char *data = "-ACMGRSVTWYHKDBN";
  298.     return ((c < 16) ? data[c] : 0);
  299. }
  300. ///////////////////////////////////////////////////////////
  301. ////////////////// end of inline methods //////////////////
  302. ///////////////////////////////////////////////////////////
  303. END_objects_SCOPE // namespace ncbi::objects::
  304. END_NCBI_SCOPE
  305. /*
  306.  * ===========================================================================
  307.  *
  308.  * $Log: alnvec.hpp,v $
  309.  * Revision 1000.1  2004/04/12 17:34:45  gouriano
  310.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.33
  311.  *
  312.  * Revision 1.33  2004/03/30 16:37:43  todorov
  313.  * +GetColumnVector comments
  314.  *
  315.  * Revision 1.32  2003/12/22 19:14:13  todorov
  316.  * Only left constructors that accept CScope&
  317.  *
  318.  * Revision 1.31  2003/12/22 18:30:38  todorov
  319.  * ObjMgr is no longer created internally. Scope should be passed as a reference in the ctor
  320.  *
  321.  * Revision 1.30  2003/12/18 19:48:28  todorov
  322.  * + GetColumnVector & CalculatePercentIdentity
  323.  *
  324.  * Revision 1.29  2003/12/17 17:01:07  todorov
  325.  * Added translated GetResidue
  326.  *
  327.  * Revision 1.28  2003/12/10 17:17:40  todorov
  328.  * CalcScore now const
  329.  *
  330.  * Revision 1.27  2003/10/15 21:18:57  yazhuk
  331.  * Made TResidue declaration public
  332.  *
  333.  * Revision 1.26  2003/09/10 15:28:11  todorov
  334.  * improved the Get{,Seg,Aln}SeqString comments
  335.  *
  336.  * Revision 1.25  2003/08/29 18:17:50  dicuccio
  337.  * Changed API for creating consensus - CreateConsensus() now returns the new
  338.  * dense-seg, rather than altering the existing alignment manager
  339.  *
  340.  * Revision 1.24  2003/08/25 16:35:06  todorov
  341.  * exposed GetWidth
  342.  *
  343.  * Revision 1.23  2003/08/20 14:35:14  todorov
  344.  * Support for NA2AA Densegs
  345.  *
  346.  * Revision 1.22  2003/07/23 20:40:54  todorov
  347.  * +aln_starts for the inserts in GetWhole...
  348.  *
  349.  * Revision 1.21  2003/07/17 22:46:09  todorov
  350.  * +GetWholeAlnSeqString
  351.  *
  352.  * Revision 1.20  2003/06/02 16:01:38  dicuccio
  353.  * Rearranged include/objects/ subtree.  This includes the following shifts:
  354.  *     - include/objects/alnmgr --> include/objtools/alnmgr
  355.  *     - include/objects/cddalignview --> include/objtools/cddalignview
  356.  *     - include/objects/flat --> include/objtools/flat
  357.  *     - include/objects/objmgr/ --> include/objmgr/
  358.  *     - include/objects/util/ --> include/objmgr/util/
  359.  *     - include/objects/validator --> include/objtools/validator
  360.  *
  361.  * Revision 1.19  2003/02/11 21:32:37  todorov
  362.  * fMinGap optional merging algorithm
  363.  *
  364.  * Revision 1.18  2003/01/27 22:30:24  todorov
  365.  * Attune to seq_vector interface change
  366.  *
  367.  * Revision 1.17  2003/01/23 21:30:50  todorov
  368.  * Removing the original, inefficient GetXXXString methods
  369.  *
  370.  * Revision 1.16  2003/01/23 16:31:56  todorov
  371.  * Added calc score methods
  372.  *
  373.  * Revision 1.15  2003/01/22 22:54:04  todorov
  374.  * Removed an obsolete function
  375.  *
  376.  * Revision 1.14  2003/01/17 18:17:29  todorov
  377.  * Added a better-performing set of GetXXXString methods
  378.  *
  379.  * Revision 1.13  2003/01/16 20:46:30  todorov
  380.  * Added Gap/EndChar set flags
  381.  *
  382.  * Revision 1.12  2002/12/26 12:38:08  dicuccio
  383.  * Added Win32 export specifiers
  384.  *
  385.  * Revision 1.11  2002/10/21 19:15:12  todorov
  386.  * added GetAlnSeqString
  387.  *
  388.  * Revision 1.10  2002/10/04 17:31:36  todorov
  389.  * Added gap char and end char
  390.  *
  391.  * Revision 1.9  2002/09/27 17:01:16  todorov
  392.  * changed order of params for GetSeqPosFrom{Seq,Aln}Pos
  393.  *
  394.  * Revision 1.8  2002/09/25 19:34:15  todorov
  395.  * "un-inlined" x_GetSeqVector
  396.  *
  397.  * Revision 1.7  2002/09/25 18:16:26  dicuccio
  398.  * Reworked computation of consensus sequence - this is now stored directly
  399.  * in the underlying CDense_seg
  400.  * Added exception class; currently used only on access of non-existent
  401.  * consensus.
  402.  *
  403.  * Revision 1.6  2002/09/23 18:22:45  vakatov
  404.  * Workaround an older MSVC++ compiler bug.
  405.  * Get rid of "signed/unsigned" comp.warning, and some code prettification.
  406.  *
  407.  * Revision 1.5  2002/09/19 18:22:28  todorov
  408.  * New function name for GetSegSeqString to avoid confusion
  409.  *
  410.  * Revision 1.4  2002/09/19 18:19:18  todorov
  411.  * fixed unsigned to signed return type for GetConsensusSeq{Start,Stop}
  412.  *
  413.  * Revision 1.3  2002/09/05 19:31:18  dicuccio
  414.  * - added ability to reference a consensus sequence for a given alignment
  415.  * - added caching of CSeqVector (big performance win)
  416.  * - many small bugs fixed
  417.  *
  418.  * Revision 1.2  2002/08/29 18:40:53  dicuccio
  419.  * added caching mechanism for CSeqVector - this greatly improves speed in
  420.  * accessing sequence data.
  421.  *
  422.  * Revision 1.1  2002/08/23 14:43:50  ucko
  423.  * Add the new C++ alignment manager to the public tree (thanks, Kamen!)
  424.  *
  425.  *
  426.  * ===========================================================================
  427.  */
  428. #endif  /* OBJECTS_ALNMGR___ALNVEC__HPP */