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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmap.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:34:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.35
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_ALNMGR___ALNMAP__HPP
  10. #define OBJECTS_ALNMGR___ALNMAP__HPP
  11. /*  $Id: alnmap.hpp,v 1000.1 2004/04/12 17:34:39 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. *   Interface for examining alignments (of type Dense-seg)
  40. *
  41. */
  42. #include <objects/seqalign/Dense_seg.hpp>
  43. #include <objtools/alnmgr/alnexception.hpp>
  44. #include <util/range.hpp>
  45. BEGIN_NCBI_SCOPE
  46. BEGIN_objects_SCOPE // namespace ncbi::objects::
  47. class NCBI_XALNMGR_EXPORT CAlnMap : public CObject
  48. {
  49.     typedef CObject TParent;
  50. public:
  51.     // data types
  52.     typedef unsigned int TSegTypeFlags; // binary OR of ESegTypeFlags
  53.     enum ESegTypeFlags {
  54.         fSeq                     = 0x01,
  55.         fNotAlignedToSeqOnAnchor = 0x02,
  56.         fInsert                  = fSeq | fNotAlignedToSeqOnAnchor,
  57.         fUnalignedOnRight        = 0x04, // unaligned region on the right
  58.         fUnalignedOnLeft         = 0x08,
  59.         fNoSeqOnRight            = 0x10, // maybe gaps on the right but no seq
  60.         fNoSeqOnLeft             = 0x20,
  61.         fEndOnRight              = 0x40, // this is the last segment
  62.         fEndOnLeft               = 0x80,
  63.         // reserved for internal use
  64.         fTypeIsSet            = (TSegTypeFlags) 0x80000000
  65.     };
  66.     
  67.     typedef CDense_seg::TDim      TDim;
  68.     typedef TDim                  TNumrow;
  69.     typedef CRange<TSeqPos>       TRange;
  70.     typedef CRange<TSignedSeqPos> TSignedRange;
  71.     typedef CDense_seg::TNumseg   TNumseg;
  72.     typedef list<TSeqPos>         TSeqPosList;
  73.     enum EGetChunkFlags {
  74.         fAllChunks           = 0x0000,
  75.         fIgnoreUnaligned     = 0x0001,
  76.         // fInsertSameAsSeq, fDeletionSameAsGap and fIgnoreAnchor
  77.         // are used to consolidate adjacent segments which whose type
  78.         // only differs in how they relate to the anchor.
  79.         // Still, when obtaining the type of the chunks, the info about
  80.         // the relationship to anchor (fNotAlignedToSeqOnAnchor) will be
  81.         // present.
  82.         fInsertSameAsSeq     = 0x0002,
  83.         fDeletionSameAsGap   = 0x0004,
  84.         fIgnoreAnchor        = fInsertSameAsSeq | fDeletionSameAsGap,
  85.         fIgnoreGaps          = 0x0008,
  86.         fChunkSameAsSeg      = 0x0010,
  87.         
  88.         fSkipUnalignedGaps   = 0x0020,
  89.         fSkipDeletions       = 0x0040,
  90.         fSkipAllGaps         = fSkipUnalignedGaps | fSkipDeletions,
  91.         fSkipInserts         = 0x0080,
  92.         fSkipAlnSeq          = 0x0100,
  93.         fSeqOnly             = fSkipAllGaps | fSkipInserts,
  94.         fInsertsOnly         = fSkipAllGaps | fSkipAlnSeq,
  95.         fAlnSegsOnly         = fSkipInserts | fSkipUnalignedGaps,
  96.         // preserve the wholeness of the segments when intersecting
  97.         // with the given range instead of truncating them
  98.         fDoNotTruncateSegs   = 0x0200
  99.     };
  100.     typedef int TGetChunkFlags; // binary OR of EGetChunkFlags
  101.     typedef TNumseg TNumchunk;
  102.     enum ESearchDirection {
  103.         eNone,
  104.         eBackwards,
  105.         eForward,
  106.         eLeft,
  107.         eRight
  108.     };
  109.     // constructors
  110.     CAlnMap(const CDense_seg& ds);
  111.     CAlnMap(const CDense_seg& ds, TNumrow anchor);
  112.     // destructor
  113.     ~CAlnMap(void);
  114.     // Underlying Dense_seg accessor
  115.     const CDense_seg& GetDenseg(void) const;
  116.     // Dimensions
  117.     TNumseg GetNumSegs(void) const;
  118.     TDim    GetNumRows(void) const;
  119.     // Seq ids
  120.     const CSeq_id& GetSeqId(TNumrow row) const;
  121.     // Strands
  122.     bool IsPositiveStrand(TNumrow row) const;
  123.     bool IsNegativeStrand(TNumrow row) const;
  124.     int  StrandSign      (TNumrow row) const; // returns +/- 1
  125.     // Widths
  126.     int  GetWidth        (TNumrow row) const;
  127.     // Sequence visible range
  128.     TSignedSeqPos GetSeqAlnStart(TNumrow row) const; //aln coords, strand ignored
  129.     TSignedSeqPos GetSeqAlnStop (TNumrow row) const;
  130.     TSignedRange  GetSeqAlnRange(TNumrow row) const;
  131.     TSeqPos       GetSeqStart   (TNumrow row) const; //seq coords, with strand
  132.     TSeqPos       GetSeqStop    (TNumrow row) const;  
  133.     TRange        GetSeqRange   (TNumrow row) const;
  134.     // Segment info
  135.     TSignedSeqPos GetStart  (TNumrow row, TNumseg seg, int offset = 0) const;
  136.     TSignedSeqPos GetStop   (TNumrow row, TNumseg seg, int offset = 0) const;
  137.     TSignedRange  GetRange  (TNumrow row, TNumseg seg, int offset = 0) const;
  138.     TSeqPos       GetLen    (             TNumseg seg, int offset = 0) const;
  139.     TSeqPos       GetSeqLen (TNumrow row, TNumseg seg, int offset = 0) const;
  140.     TSegTypeFlags GetSegType(TNumrow row, TNumseg seg, int offset = 0) const;
  141.     
  142.     TSegTypeFlags GetTypeAtAlnPos(TNumrow row, TSeqPos aln_pos) const;
  143.     static bool IsTypeInsert(TSegTypeFlags type);
  144.     TSeqPos GetInsertedSeqLengthOnRight(TNumrow row, TNumseg seg) const;
  145.     // Alignment segments
  146.     TSeqPos GetAlnStart(TNumseg seg) const;
  147.     TSeqPos GetAlnStop (TNumseg seg) const;
  148.     TSeqPos GetAlnStart(void)        const { return 0; }
  149.     TSeqPos GetAlnStop (void)        const;
  150.     bool    IsSetAnchor(void)           const;
  151.     TNumrow GetAnchor  (void)           const;
  152.     void    SetAnchor  (TNumrow anchor);
  153.     void    UnsetAnchor(void);
  154.     // get number of
  155.     TNumseg GetNumberOfInsertedSegmentsOnRight(TNumrow row, TNumseg seg) const;
  156.     TNumseg GetNumberOfInsertedSegmentsOnLeft (TNumrow row, TNumseg seg) const;
  157.     //
  158.     // Position mapping funcitons
  159.     // 
  160.     // Note: Some of the mapping functions have optional parameters
  161.     //       ESearchDirection dir and bool try_reverse_dir 
  162.     //       which are used in case an exact match is not found.
  163.     //       If nothing is found in the ESearchDirection dir and 
  164.     //       try_reverse_dir == true will search in the opposite dir.
  165.     TNumseg       GetSeg                 (TSeqPos aln_pos)              const;
  166.     // if seq_pos falls outside the seq range or into an unaligned region
  167.     // and dir is provided, will return the first seg in according to dir
  168.     TNumseg       GetRawSeg              (TNumrow row, TSeqPos seq_pos,
  169.                                           ESearchDirection dir = eNone,
  170.                                           bool try_reverse_dir = true)  const;
  171.     // if seq_pos is outside the seq range or within an unaligned region or
  172.     // within an insert dir/try_reverse_dir will be used
  173.     TSignedSeqPos GetAlnPosFromSeqPos    (TNumrow row, TSeqPos seq_pos,
  174.                                           ESearchDirection dir = eNone,
  175.                                           bool try_reverse_dir = true)  const;
  176.     TSignedSeqPos GetSeqPosFromSeqPos    (TNumrow for_row,
  177.                                           TNumrow row, TSeqPos seq_pos) const;
  178.     // if seq pos is a gap, will use dir/try_reverse_dir
  179.     TSignedSeqPos GetSeqPosFromAlnPos    (TNumrow for_row,
  180.                                           TSeqPos aln_pos,
  181.                                           ESearchDirection dir = eNone,
  182.                                           bool try_reverse_dir = true)  const;
  183.     
  184.     // Create a vector of relative mapping positions from row0 to row1.
  185.     // Input:  row0, row1, aln_rng (vertical slice)
  186.     // Output: result (the resulting vector of positions),
  187.     //         rng0, rng1 (affected ranges in native sequence coords)
  188.     void          GetResidueIndexMap     (TNumrow row0,
  189.                                           TNumrow row1,
  190.                                           TRange aln_rng,
  191.                                           vector<TSignedSeqPos>& result,
  192.                                           TRange& rng0,
  193.                                           TRange& rng1)                 const;
  194.     // AlnChunks -- declared here for access to typedefs
  195.     class CAlnChunk;
  196.     class CAlnChunkVec;
  197.     
  198. protected:
  199.     void x_GetChunks              (CAlnChunkVec * vec,
  200.                                    TNumrow row,
  201.                                    TNumseg first_seg,
  202.                                    TNumseg last_seg,
  203.                                    TGetChunkFlags flags) const;
  204. public:
  205.     // Get a vector of chunks defined by flags
  206.     // in alignment coords range
  207.     CRef<CAlnChunkVec> GetAlnChunks(TNumrow row, const TSignedRange& range,
  208.                                     TGetChunkFlags flags = fAlnSegsOnly) const;
  209.     // or in native sequence coords range
  210.     CRef<CAlnChunkVec> GetSeqChunks(TNumrow row, const TSignedRange& range,
  211.                                     TGetChunkFlags flags = fAlnSegsOnly) const;
  212.     class NCBI_XALNMGR_EXPORT CAlnChunkVec : public CObject
  213.     {
  214.     public:
  215.         CAlnChunkVec(const CAlnMap& aln_map, TNumrow row)
  216.             : m_AlnMap(aln_map), m_Row(row) { }
  217.         CConstRef<CAlnChunk> operator[] (TNumchunk i) const;
  218.         TNumchunk size(void) const { return m_StartSegs.size(); };
  219.     private:
  220. #ifdef NCBI_COMPILER_MSVC // kludge
  221.         friend class CAlnMap;
  222. #else
  223.         friend
  224.         CRef<CAlnChunkVec> CAlnMap::GetAlnChunks(TNumrow row,
  225.                                                  const TSignedRange& range,
  226.                                                  TGetChunkFlags flags) const;
  227.         friend
  228.         CRef<CAlnChunkVec> CAlnMap::GetSeqChunks(TNumrow row,
  229.                                                  const TSignedRange& range,
  230.                                                  TGetChunkFlags flags) const;
  231.         friend
  232.         void               CAlnMap::x_GetChunks (CAlnChunkVec * vec,
  233.                                                  TNumrow row,
  234.                                                  TNumseg first_seg,
  235.                                                  TNumseg last_seg,
  236.                                                  TGetChunkFlags flags) const;
  237. #endif
  238.         // can only be created by CAlnMap::GetAlnChunks
  239.         CAlnChunkVec(void); 
  240.     
  241.         const CAlnMap&  m_AlnMap;
  242.         TNumrow         m_Row;
  243.         vector<TNumseg> m_StartSegs;
  244.         vector<TNumseg> m_StopSegs;
  245.         TSeqPos         m_LeftDelta;
  246.         TSeqPos         m_RightDelta;
  247.     };
  248.     class NCBI_XALNMGR_EXPORT CAlnChunk : public CObject
  249.     {
  250.     public:    
  251.         TSegTypeFlags GetType(void) const { return m_TypeFlags; }
  252.         CAlnChunk&    SetType(TSegTypeFlags type_flags)
  253.             { m_TypeFlags = type_flags; return *this; }
  254.         const TSignedRange& GetRange(void) const { return m_SeqRange; }
  255.         const TSignedRange& GetAlnRange(void) const { return m_AlnRange; }
  256.         bool IsGap(void) const { return m_SeqRange.GetFrom() < 0; }
  257.         
  258.     private:
  259.         // can only be created or modified by
  260.         friend CConstRef<CAlnChunk> CAlnChunkVec::operator[](TNumchunk i)
  261.             const;
  262.         CAlnChunk(void) {}
  263.         TSignedRange& SetRange(void)    { return m_SeqRange; }
  264.         TSignedRange& SetAlnRange(void) { return m_AlnRange; }
  265.         TSegTypeFlags m_TypeFlags;
  266.         TSignedRange  m_SeqRange;
  267.         TSignedRange  m_AlnRange;
  268.     };
  269. protected:
  270.     class CNumSegWithOffset
  271.     {
  272.     public:
  273.         CNumSegWithOffset(TNumseg seg, int offset = 0)
  274.             : m_AlnSeg(seg), m_Offset(offset) { }
  275.         TNumseg GetAlnSeg(void) const { return m_AlnSeg; };
  276.         int     GetOffset(void) const { return m_Offset; };
  277.         
  278.     private:
  279.         TNumseg m_AlnSeg;
  280.         int     m_Offset;
  281.     };
  282.     // Prohibit copy constructor and assignment operator
  283.     CAlnMap(const CAlnMap& value);
  284.     CAlnMap& operator=(const CAlnMap& value);
  285.     friend CConstRef<CAlnChunk> CAlnChunkVec::operator[](TNumchunk i) const;
  286.     // internal functions for handling alignment segments
  287.     void              x_Init            (void);
  288.     void              x_CreateAlnStarts (void);
  289.     TSegTypeFlags     x_GetRawSegType   (TNumrow row, TNumseg seg) const;
  290.     TSegTypeFlags     x_SetRawSegType   (TNumrow row, TNumseg seg) const;
  291.     CNumSegWithOffset x_GetSegFromRawSeg(TNumseg seg)              const;
  292.     TNumseg           x_GetRawSegFromSeg(TNumseg seg)              const;
  293.     TSignedSeqPos     x_GetRawStart     (TNumrow row, TNumseg seg) const;
  294.     TSignedSeqPos     x_GetRawStop      (TNumrow row, TNumseg seg) const;
  295.     TSeqPos           x_GetLen          (TNumrow row, TNumseg seg) const;
  296.     const TNumseg&    x_GetSeqLeftSeg   (TNumrow row)              const;
  297.     const TNumseg&    x_GetSeqRightSeg  (TNumrow row)              const;
  298.     bool x_SkipType               (TSegTypeFlags type,
  299.                                    TGetChunkFlags flags) const;
  300.     bool x_CompareAdjacentSegTypes(TSegTypeFlags left_type, 
  301.                                    TSegTypeFlags right_type,
  302.                                    TGetChunkFlags flags) const;
  303.     // returns true if types are the same (as specified by flags)
  304.     CConstRef<CDense_seg>           m_DS;
  305.     TNumrow                         m_NumRows;
  306.     TNumseg                         m_NumSegs;
  307.     const CDense_seg::TIds&         m_Ids;
  308.     const CDense_seg::TStarts&      m_Starts;
  309.     const CDense_seg::TLens&        m_Lens;
  310.     const CDense_seg::TStrands&     m_Strands;
  311.     const CDense_seg::TScores&      m_Scores;
  312.     const CDense_seg::TWidths&      m_Widths;
  313.     TNumrow                         m_Anchor;
  314.     vector<TNumseg>                 m_AlnSegIdx;
  315.     mutable vector<TNumseg>         m_SeqLeftSegs;
  316.     mutable vector<TNumseg>         m_SeqRightSegs;
  317.     CDense_seg::TStarts             m_AlnStarts;
  318.     vector<CNumSegWithOffset>       m_NumSegWithOffsets;
  319.     mutable vector<TSegTypeFlags> * m_RawSegTypes;
  320. };
  321. ///////////////////////////////////////////////////////////
  322. ///////////////////// inline methods //////////////////////
  323. ///////////////////////////////////////////////////////////
  324. inline
  325. CAlnMap::CAlnMap(const CDense_seg& ds) 
  326.     : m_DS(&ds),
  327.       m_NumRows(ds.GetDim()),
  328.       m_NumSegs(ds.GetNumseg()),
  329.       m_Ids(ds.GetIds()),
  330.       m_Starts(ds.GetStarts()),
  331.       m_Lens(ds.GetLens()),
  332.       m_Strands(ds.GetStrands()),
  333.       m_Scores(ds.GetScores()),
  334.       m_Widths(ds.GetWidths()),
  335.       m_Anchor(-1),
  336.       m_RawSegTypes(0)
  337. {
  338.     x_Init();
  339.     x_CreateAlnStarts();
  340. }
  341. inline
  342. CAlnMap::CAlnMap(const CDense_seg& ds, TNumrow anchor)
  343.     : m_DS(&ds),
  344.       m_NumRows(ds.GetDim()),
  345.       m_NumSegs(ds.GetNumseg()),
  346.       m_Ids(ds.GetIds()),
  347.       m_Starts(ds.GetStarts()),
  348.       m_Lens(ds.GetLens()),
  349.       m_Strands(ds.GetStrands()),
  350.       m_Scores(ds.GetScores()),
  351.       m_Widths(ds.GetWidths()),
  352.       m_Anchor(-1),
  353.       m_RawSegTypes(0)
  354. {
  355.     x_Init();
  356.     SetAnchor(anchor);
  357. }
  358. inline
  359. CAlnMap::~CAlnMap(void)
  360. {
  361.     if (m_RawSegTypes) {
  362.         delete m_RawSegTypes;
  363.     }
  364. }
  365. inline
  366. const CDense_seg& CAlnMap::GetDenseg() const
  367. {
  368.     return *m_DS;
  369. }
  370. inline TSeqPos CAlnMap::GetAlnStart(TNumseg seg) const
  371. {
  372.     return m_AlnStarts[seg];
  373. }
  374. inline
  375. TSeqPos CAlnMap::GetAlnStop(TNumseg seg) const
  376. {
  377.     return m_AlnStarts[seg] + m_Lens[x_GetRawSegFromSeg(seg)] - 1;
  378. }
  379. inline
  380. TSeqPos CAlnMap::GetAlnStop(void) const
  381. {
  382.     return GetAlnStop(GetNumSegs() - 1);
  383. }
  384. inline 
  385. CAlnMap::TSegTypeFlags 
  386. CAlnMap::GetSegType(TNumrow row, TNumseg seg, int offset) const
  387. {
  388.     return x_GetRawSegType(row, x_GetRawSegFromSeg(seg) + offset);
  389. }
  390. inline
  391. CAlnMap::TNumseg CAlnMap::GetNumSegs(void) const
  392. {
  393.     return IsSetAnchor() ? m_AlnSegIdx.size() : m_NumSegs;
  394. }
  395. inline
  396. CAlnMap::TDim CAlnMap::GetNumRows(void) const
  397. {
  398.     return m_NumRows;
  399. }
  400. inline
  401. bool CAlnMap::IsSetAnchor(void) const
  402. {
  403.     return m_Anchor >= 0;
  404. }
  405. inline
  406. CAlnMap::TNumrow CAlnMap::GetAnchor(void) const
  407. {
  408.     return m_Anchor;
  409. }
  410. inline
  411. CAlnMap::CNumSegWithOffset
  412. CAlnMap::x_GetSegFromRawSeg(TNumseg raw_seg) const
  413. {
  414.     return IsSetAnchor() ? m_NumSegWithOffsets[raw_seg] : raw_seg;
  415. }
  416. inline
  417. CAlnMap::TNumseg
  418. CAlnMap::x_GetRawSegFromSeg(TNumseg seg) const
  419. {
  420.     return IsSetAnchor() ? m_AlnSegIdx[seg] : seg;
  421. }
  422. inline
  423. TSignedSeqPos CAlnMap::x_GetRawStart(TNumrow row, TNumseg seg) const
  424. {
  425.     return m_Starts[seg * m_NumRows + row];
  426. }
  427. inline
  428. int CAlnMap::GetWidth(TNumrow row) const
  429. {
  430.     return
  431.         (m_Widths.size() == (size_t) m_NumRows) ? m_Widths[row] : 1;
  432. }
  433. inline
  434. TSeqPos CAlnMap::x_GetLen(TNumrow row, TNumseg seg) const
  435. {
  436.     return m_Lens[seg] * GetWidth(row);
  437. }
  438. inline
  439. TSignedSeqPos CAlnMap::x_GetRawStop(TNumrow row, TNumseg seg) const
  440. {
  441.     TSignedSeqPos start = x_GetRawStart(row, seg);
  442.     return ((start > -1) ? (start + (TSignedSeqPos)x_GetLen(row, seg) - 1)
  443.             : -1);
  444. }
  445. inline
  446. int CAlnMap::StrandSign(TNumrow row) const
  447. {
  448.     return IsPositiveStrand(row) ? 1 : -1;
  449. }
  450. inline
  451. bool CAlnMap::IsPositiveStrand(TNumrow row) const
  452. {
  453.     return (m_Strands.empty()  ||  m_Strands[row] != eNa_strand_minus);
  454. }
  455. inline
  456. bool CAlnMap::IsNegativeStrand(TNumrow row) const
  457. {
  458.     return ! IsPositiveStrand(row);
  459. }
  460. inline
  461. TSignedSeqPos CAlnMap::GetStart(TNumrow row, TNumseg seg, int offset) const
  462. {
  463.     return m_Starts
  464.         [(x_GetRawSegFromSeg(seg) + offset) * m_NumRows + row];
  465. }
  466. inline
  467. TSeqPos CAlnMap::GetLen(TNumseg seg, int offset) const
  468. {
  469.     return m_Lens[x_GetRawSegFromSeg(seg) + offset];
  470. }
  471. inline
  472. TSeqPos CAlnMap::GetSeqLen(TNumrow row, TNumseg seg, int offset) const
  473. {
  474.     return x_GetLen(row, x_GetRawSegFromSeg(seg) + offset);
  475. }
  476. inline
  477. TSignedSeqPos CAlnMap::GetStop(TNumrow row, TNumseg seg, int offset) const
  478. {
  479.     TSignedSeqPos start = GetStart(row, seg, offset);
  480.     return ((start > -1) ? 
  481.             (start + (TSignedSeqPos)GetSeqLen(row, seg, offset) - 1) :
  482.             -1);
  483. }
  484. inline
  485. const CSeq_id& CAlnMap::GetSeqId(TNumrow row) const
  486. {
  487.     return *(m_Ids[row]);
  488. }
  489. inline 
  490. CAlnMap::TSignedRange
  491. CAlnMap::GetRange(TNumrow row, TNumseg seg, int offset) const
  492. {
  493.     TSignedSeqPos start = GetStart(row, seg, offset);
  494.     if (start > -1) {
  495.         return TSignedRange(start, start + GetSeqLen(row, seg, offset) - 1);
  496.     } else {
  497.         return TSignedRange(-1, -1);
  498.     }
  499. }
  500. inline
  501. TSeqPos CAlnMap::GetSeqStart(TNumrow row) const
  502. {
  503.     return 
  504.         m_Starts[(IsPositiveStrand(row) ?
  505.                   x_GetSeqLeftSeg(row) :
  506.                   x_GetSeqRightSeg(row)) * m_NumRows + row];
  507. }
  508. inline
  509. TSeqPos CAlnMap::GetSeqStop(TNumrow row) const
  510. {
  511.     const TNumseg& seg = IsPositiveStrand(row) ?
  512.         x_GetSeqRightSeg(row) : x_GetSeqLeftSeg(row);
  513.     return m_Starts[seg * m_NumRows + row] + x_GetLen(row, seg) - 1;
  514. }
  515. inline
  516. CAlnMap::TRange CAlnMap::GetSeqRange(TNumrow row) const
  517. {
  518.     return TRange(GetSeqStart(row), GetSeqStop(row));
  519. }
  520. inline
  521. CAlnMap::TSignedRange CAlnMap::GetSeqAlnRange(TNumrow row) const
  522. {
  523.     return TSignedRange(GetSeqAlnStart(row), GetSeqAlnStop(row));
  524. }
  525. inline
  526. TSeqPos CAlnMap::GetInsertedSeqLengthOnRight(TNumrow row, TNumseg seg) const
  527. {
  528.     return (IsPositiveStrand(row) ?
  529.             GetStop(row, seg+1) - GetStart(row, seg) :
  530.             GetStart(row, seg+1) - GetStop(row, seg));
  531. }
  532. inline 
  533. CAlnMap::TSegTypeFlags 
  534. CAlnMap::x_GetRawSegType(TNumrow row, TNumseg seg) const
  535. {
  536.     TSegTypeFlags type;
  537.     if (m_RawSegTypes &&
  538.         (type = (*m_RawSegTypes)[row + m_NumRows * seg]) & fTypeIsSet) {
  539.         return type & (~ fTypeIsSet);
  540.     } else {
  541.         return x_SetRawSegType(row, seg);
  542.     }
  543. }
  544. inline
  545. bool CAlnMap::IsTypeInsert(TSegTypeFlags type)
  546. {
  547.     return (type & fInsert) == fInsert;
  548. }
  549. inline 
  550. CAlnMap::TSegTypeFlags 
  551. CAlnMap::GetTypeAtAlnPos(TNumrow row, TSeqPos aln_pos) const
  552. {
  553.     return GetSegType(row, GetSeg(aln_pos));
  554. }
  555. ///////////////////////////////////////////////////////////
  556. ////////////////// end of inline methods //////////////////
  557. ///////////////////////////////////////////////////////////
  558. END_objects_SCOPE // namespace ncbi::objects::
  559. END_NCBI_SCOPE
  560. /*
  561. * ===========================================================================
  562. *
  563. * $Log: alnmap.hpp,v $
  564. * Revision 1000.1  2004/04/12 17:34:39  gouriano
  565. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.35
  566. *
  567. * Revision 1.35  2004/03/03 20:33:27  todorov
  568. * +comments
  569. *
  570. * Revision 1.34  2004/03/03 19:39:43  todorov
  571. * +GetResidueIndexMap
  572. *
  573. * Revision 1.33  2004/01/21 20:59:42  todorov
  574. * fDoNotTruncate -> fDoNotTruncateSegs; +comments
  575. *
  576. * Revision 1.32  2004/01/21 20:53:44  todorov
  577. * EGetChunkFlags += fDoNotTruncate
  578. *
  579. * Revision 1.31  2003/12/31 17:26:18  todorov
  580. * +fIgnoreAnchore usage comment
  581. *
  582. * Revision 1.30  2003/09/18 23:05:11  todorov
  583. * Optimized GetSeqAln{Start,Stop}
  584. *
  585. * Revision 1.29  2003/09/09 19:42:37  dicuccio
  586. * Fixed thinko in GetWidth() - properly order ternary operator
  587. *
  588. * Revision 1.28  2003/09/08 19:49:19  todorov
  589. * signed vs unsigned warnings fixed
  590. *
  591. * Revision 1.27  2003/08/29 18:17:17  dicuccio
  592. * Minor change in specification of default parameters - rely only on prameters,
  593. * not on member variables
  594. *
  595. * Revision 1.26  2003/08/25 16:35:06  todorov
  596. * exposed GetWidth
  597. *
  598. * Revision 1.25  2003/08/20 14:35:14  todorov
  599. * Support for NA2AA Densegs
  600. *
  601. * Revision 1.24  2003/07/17 22:46:56  todorov
  602. * name change +TSeqPosList
  603. *
  604. * Revision 1.23  2003/07/08 20:26:28  todorov
  605. * Created seq end segments cache
  606. *
  607. * Revision 1.22  2003/06/05 19:03:29  todorov
  608. * Added const refs to Dense-seg members as a speed optimization
  609. *
  610. * Revision 1.21  2003/06/02 16:01:38  dicuccio
  611. * Rearranged include/objects/ subtree.  This includes the following shifts:
  612. *     - include/objects/alnmgr --> include/objtools/alnmgr
  613. *     - include/objects/cddalignview --> include/objtools/cddalignview
  614. *     - include/objects/flat --> include/objtools/flat
  615. *     - include/objects/objmgr/ --> include/objmgr/
  616. *     - include/objects/util/ --> include/objmgr/util/
  617. *     - include/objects/validator --> include/objtools/validator
  618. *
  619. * Revision 1.20  2003/05/23 18:10:38  todorov
  620. * +fChunkSameAsSeg
  621. *
  622. * Revision 1.19  2003/03/20 16:37:14  todorov
  623. * +fIgnoreGaps for GetXXXChunksalnmap.cpp
  624. *
  625. * Revision 1.18  2003/03/07 17:30:14  todorov
  626. * + ESearchDirection dir, bool try_reverse_dir for GetAlnPosFromSeqPos
  627. *
  628. * Revision 1.17  2003/03/04 16:18:58  todorov
  629. * Added advance search options for GetRawSeg
  630. *
  631. * Revision 1.16  2003/01/15 18:48:36  todorov
  632. * Added GetSeqChunks to be used with native seq range
  633. *
  634. * Revision 1.15  2003/01/09 22:08:11  todorov
  635. * Changed the default TGetChunkFlags for consistency
  636. *
  637. * Revision 1.14  2003/01/07 23:02:48  todorov
  638. * Fixed EGetChunkFlags
  639. *
  640. * Revision 1.13  2002/12/26 12:38:08  dicuccio
  641. * Added Win32 export specifiers
  642. *
  643. * Revision 1.12  2002/10/21 19:14:36  todorov
  644. * reworked aln chunks: now supporting more types; added chunk aln coords
  645. *
  646. * Revision 1.10  2002/10/04 17:05:31  todorov
  647. * Added GetTypeAtAlnPos method
  648. *
  649. * Revision 1.8  2002/09/27 16:58:21  todorov
  650. * changed order of params for GetSeqPosFrom{Seq,Aln}Pos
  651. *
  652. * Revision 1.7  2002/09/27 02:26:32  ucko
  653. * Remove static from the definition of CAlnMap::IsTypeInsert, as
  654. * (like virtual) it should appear only on the initial declaration.
  655. *
  656. * Revision 1.6  2002/09/26 18:43:11  todorov
  657. * Added a static method for convenient check for an insert
  658. *
  659. * Revision 1.5  2002/09/26 17:40:42  todorov
  660. * Changed flag fAlignedToSeqOnAnchor to fNotAlignedToSeqOnAnchor. This proved more convenient.
  661. *
  662. * Revision 1.4  2002/09/25 18:16:26  dicuccio
  663. * Reworked computation of consensus sequence - this is now stored directly
  664. * in the underlying CDense_seg
  665. * Added exception class; currently used only on access of non-existent
  666. * consensus.
  667. *
  668. * Revision 1.3  2002/09/05 19:31:18  dicuccio
  669. * - added ability to reference a consensus sequence for a given alignment
  670. * - added caching of CSeqVector (big performance win)
  671. * - many small bugs fixed
  672. *
  673. * Revision 1.2  2002/08/23 16:05:09  ucko
  674. * Kludge friendship for MSVC.  (Sigh.)
  675. *
  676. * Revision 1.1  2002/08/23 14:43:50  ucko
  677. * Add the new C++ alignment manager to the public tree (thanks, Kamen!)
  678. *
  679. *
  680. * ===========================================================================
  681. */
  682. #endif // OBJECTS_ALNMGR___ALNMAP__HPP