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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_align_mapper.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:22:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQ_ALIGN_MAPPER__HPP
  10. #define SEQ_ALIGN_MAPPER__HPP
  11. /*  $Id: seq_align_mapper.hpp,v 1000.1 2004/06/01 19:22:07 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: Aleksey Grichenko
  37. *
  38. * File Description:
  39. *   Alignment mapper
  40. *
  41. */
  42. #include <objmgr/seq_id_handle.hpp>
  43. #include <objmgr/impl/seq_loc_cvt.hpp>
  44. #include <objects/seqloc/Na_strand.hpp>
  45. #include <objects/seqalign/Seq_align.hpp>
  46. #include <objects/seqalign/Score.hpp>
  47. BEGIN_NCBI_SCOPE
  48. BEGIN_SCOPE(objects)
  49. class CDense_seg;
  50. class CPacked_seg;
  51. class CSeq_align_set;
  52. class CMappingRange;
  53. class CSeq_loc_Mapper;
  54. struct SAlignment_Segment
  55. {
  56.     struct SAlignment_Row
  57.     {
  58.         SAlignment_Row(void);
  59.         void SetMapped(void);
  60.         int GetSegStart(void) const;
  61.         bool SameStrand(const SAlignment_Row& r) const;
  62.         CSeq_id_Handle m_Id;
  63.         TSeqPos        m_Start; ///< kInvalidSeqPos means skipped segment
  64.         bool           m_IsSetStrand;
  65.         ENa_strand     m_Strand;
  66.         int            m_Width; ///< not stored in ASN.1, width of a character
  67.         bool           m_Mapped;
  68.     };
  69.     typedef vector<SAlignment_Row> TRows;
  70.     SAlignment_Segment(int len, size_t dim);
  71.     SAlignment_Row& GetRow(size_t idx);
  72.     SAlignment_Row& CopyRow(size_t idx, const SAlignment_Row& src_row);
  73.     SAlignment_Row& AddRow(size_t idx,
  74.                            const CSeq_id& id,
  75.                            int start,
  76.                            bool is_set_strand,
  77.                            ENa_strand strand,
  78.                            int width);
  79.     SAlignment_Row& AddRow(size_t idx,
  80.                            const CSeq_id_Handle& id,
  81.                            int start,
  82.                            bool is_set_strand,
  83.                            ENa_strand strand,
  84.                            int width);
  85.     typedef vector< CRef<CScore> >     TScores;
  86.     void SetScores(const TScores& scores);
  87.     int       m_Len;
  88.     TRows     m_Rows;
  89.     bool      m_HaveStrands;
  90.     TScores   m_Scores;
  91. };
  92. class CSeq_align_Mapper : public CObject
  93. {
  94. public:
  95.     typedef CSeq_align::C_Segs::TDendiag TDendiag;
  96.     typedef CSeq_align::C_Segs::TStd TStd;
  97.     CSeq_align_Mapper(const CSeq_align& align);
  98.     ~CSeq_align_Mapper(void) {}
  99.     void Convert(CSeq_loc_Conversion_Set& cvts,
  100.                  unsigned int loc_index_shift = 0);
  101.     void Convert(CSeq_loc_Mapper& mapper);
  102.     CRef<CSeq_align> GetDstAlign(void) const;
  103. private:
  104.     typedef list<SAlignment_Segment>   TSegments;
  105.     // Segment insertion functions
  106.     SAlignment_Segment& x_PushSeg(int len, size_t dim);
  107.     SAlignment_Segment& x_InsertSeg(TSegments::iterator& where,
  108.                                     int len,
  109.                                     size_t dim);
  110.     void x_Init(const TDendiag& diags);
  111.     void x_Init(const CDense_seg& denseg);
  112.     void x_Init(const TStd& sseg);
  113.     void x_Init(const CPacked_seg& pseg);
  114.     void x_Init(const CSeq_align_set& align_set);
  115.     typedef CSeq_loc_Conversion_Set::TRange       TRange;
  116.     typedef CSeq_loc_Conversion_Set::TRangeMap    TRangeMap;
  117.     typedef CSeq_loc_Conversion_Set::TIdMap       TIdMap;
  118.     typedef CSeq_loc_Conversion_Set::TConvByIndex TConvByIndex;
  119.     // Mapping through CSeq_loc_Conversion
  120.     void x_ConvertAlign(CSeq_loc_Conversion_Set& cvts,
  121.                         unsigned int loc_index_shift);
  122.     void x_ConvertRow(CSeq_loc_Conversion& cvt,
  123.                       size_t row);
  124.     void x_ConvertRow(TIdMap& cvts,
  125.                       size_t row);
  126.     CSeq_id_Handle x_ConvertSegment(TSegments::iterator& seg_it,
  127.                                     CSeq_loc_Conversion& cvt,
  128.                                     size_t row);
  129.     CSeq_id_Handle x_ConvertSegment(TSegments::iterator& seg_it,
  130.                                     TIdMap& id_map,
  131.                                     size_t row);
  132.     // Mapping through CSeq_loc_Mapper
  133.     void x_ConvertAlign(CSeq_loc_Mapper& mapper);
  134.     void x_ConvertRow(CSeq_loc_Mapper& mapper,
  135.                       size_t row);
  136.     CSeq_id_Handle x_ConvertSegment(TSegments::iterator& seg_it,
  137.                                     CSeq_loc_Mapper& mapper,
  138.                                     size_t row);
  139.     void x_GetDstDendiag(CRef<CSeq_align>& dst) const;
  140.     void x_GetDstDenseg(CRef<CSeq_align>& dst) const;
  141.     void x_GetDstStd(CRef<CSeq_align>& dst) const;
  142.     void x_GetDstPacked(CRef<CSeq_align>& dst) const;
  143.     void x_GetDstDisc(CRef<CSeq_align>& dst) const;
  144.     // Used for e_Disc alignments
  145.     typedef vector<CSeq_align_Mapper>  TSubAligns;
  146.     // Flags to indicate possible destination alignment types:
  147.     // multi-dim or multi-id alignments can be packed into std-seg
  148.     // or dense-diag only.
  149.     enum EAlignFlags {
  150.         eAlign_Normal,      // Normal alignment, may be packed into any type
  151.         eAlign_Empty,       // Empty alignment
  152.         eAlign_MultiId,     // A row contains different IDs
  153.         eAlign_MultiDim     // Segments have different number of rows
  154.     };
  155.     CConstRef<CSeq_align>        m_OrigAlign;
  156.     mutable CRef<CSeq_align>     m_DstAlign;
  157.     TSegments                    m_Segs;
  158.     TSubAligns                   m_SubAligns;
  159.     bool                         m_HaveStrands;
  160.     bool                         m_HaveWidths;
  161.     size_t                       m_Dim;
  162.     EAlignFlags                  m_AlignFlags;
  163. };
  164. inline
  165. SAlignment_Segment::SAlignment_Row::SAlignment_Row(void)
  166.     : m_Start(kInvalidSeqPos),
  167.       m_IsSetStrand(false),
  168.       m_Strand(eNa_strand_unknown),
  169.       m_Width(0),
  170.       m_Mapped(false)
  171. {
  172.     return;
  173. }
  174. inline
  175. void SAlignment_Segment::SAlignment_Row::SetMapped(void)
  176. {
  177.     m_Mapped = true;
  178. }
  179. inline
  180. bool SAlignment_Segment::SAlignment_Row::
  181. SameStrand(const SAlignment_Row& r) const
  182. {
  183.     return m_IsSetStrand  &&  SameOrientation(m_Strand, r.m_Strand);
  184. }
  185. inline
  186. int SAlignment_Segment::SAlignment_Row::GetSegStart(void) const
  187. {
  188.     return m_Start != kInvalidSeqPos ? m_Start : -1;
  189. }
  190. END_SCOPE(objects)
  191. END_NCBI_SCOPE
  192. /*
  193. * ---------------------------------------------------------------------------
  194. * $Log: seq_align_mapper.hpp,v $
  195. * Revision 1000.1  2004/06/01 19:22:07  gouriano
  196. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  197. *
  198. * Revision 1.7  2004/05/26 14:57:36  ucko
  199. * Change CSeq_align_Mapper::m_Dim's type from unsigned int to size_t
  200. * for consistency with STL containers' size() methods.
  201. *
  202. * Revision 1.6  2004/05/26 14:29:20  grichenk
  203. * Redesigned CSeq_align_Mapper: preserve non-mapping intervals,
  204. * fixed strands handling, improved performance.
  205. *
  206. * Revision 1.5  2004/05/13 19:10:57  grichenk
  207. * Preserve scores in mapped alignments
  208. *
  209. * Revision 1.4  2004/05/10 20:22:24  grichenk
  210. * Fixed more warnings (removed inlines)
  211. *
  212. * Revision 1.3  2004/04/12 14:35:59  grichenk
  213. * Fixed mapping of alignments between nucleotides and proteins
  214. *
  215. * Revision 1.2  2004/04/07 18:36:12  grichenk
  216. * Fixed std-seg mapping
  217. *
  218. * Revision 1.1  2004/03/30 15:40:34  grichenk
  219. * Initial revision
  220. *
  221. *
  222. * ===========================================================================
  223. */
  224. #endif  // SEQ_ALIGN_MAPPER__HPP