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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_loc_mapper.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:21:41  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQ_LOC_MAPPER__HPP
  10. #define SEQ_LOC_MAPPER__HPP
  11. /*  $Id: seq_loc_mapper.hpp,v 1000.1 2004/06/01 19:21:41 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. *   Seq-loc mapper
  40. *
  41. */
  42. #include <corelib/ncbistd.hpp>
  43. #include <corelib/ncbiobj.hpp>
  44. #include <util/range.hpp>
  45. #include <util/rangemap.hpp>
  46. #include <objects/seqloc/Na_strand.hpp>
  47. #include <objects/seqalign/Seq_align.hpp>
  48. #include <objmgr/seq_id_handle.hpp>
  49. #include <objects/general/Int_fuzz.hpp>
  50. BEGIN_NCBI_SCOPE
  51. BEGIN_SCOPE(objects)
  52. class CSeq_id;
  53. class CSeq_loc;
  54. class CSeq_loc_CI;
  55. class CSeq_feat;
  56. class CSeq_align;
  57. class CScope;
  58. class CBioseq_Handle;
  59. class CSeqMap;
  60. class CMappingRange : public CObject
  61. {
  62. public:
  63.     CMappingRange(CSeq_id_Handle    src_id,
  64.                   TSeqPos           src_from,
  65.                   TSeqPos           src_length,
  66.                   ENa_strand        src_strand,
  67.                   CSeq_id_Handle    dst_id,
  68.                   TSeqPos           dst_from,
  69.                   ENa_strand        dst_strand);
  70.     bool GoodSrcId(const CSeq_id& id) const;
  71.     CRef<CSeq_id> GetDstId(void);
  72.     typedef CRange<TSeqPos>    TRange;
  73.     typedef CRef<CInt_fuzz>    TFuzz;
  74.     typedef pair<TFuzz, TFuzz> TRangeFuzz;
  75.     bool CanMap(TSeqPos from,
  76.                 TSeqPos to,
  77.                 bool is_set_strand,
  78.                 ENa_strand strand) const;
  79.     TSeqPos Map_Pos(TSeqPos pos) const;
  80.     TRange Map_Range(TSeqPos from, TSeqPos to) const;
  81.     bool Map_Strand(bool is_set_strand, ENa_strand src, ENa_strand* dst) const;
  82.     TRangeFuzz Map_Fuzz(TRangeFuzz& fuzz) const;
  83. private:
  84.     CInt_fuzz::ELim x_ReverseFuzzLim(CInt_fuzz::ELim lim) const;
  85.     CSeq_id_Handle      m_Src_id_Handle;
  86.     TSeqPos             m_Src_from;
  87.     TSeqPos             m_Src_to;
  88.     ENa_strand          m_Src_strand;
  89.     CSeq_id_Handle      m_Dst_id_Handle;
  90.     TSeqPos             m_Dst_from;
  91.     ENa_strand          m_Dst_strand;
  92.     bool                m_Reverse;
  93.     friend class CSeq_loc_Mapper;
  94.     friend class CSeq_align_Mapper;
  95.     friend struct CMappingRangeRef_Less;
  96. };
  97. class NCBI_XOBJMGR_EXPORT CSeq_loc_Mapper : public CObject
  98. {
  99. public:
  100.     enum EFeatMapDirection {
  101.         eLocationToProduct,
  102.         eProductToLocation
  103.     };
  104.     // Mapping through a feature, both location and product must be set.
  105.     // If scope is set, synonyms are resolved for each source ID.
  106.     CSeq_loc_Mapper(const CSeq_feat&  map_feat,
  107.                     EFeatMapDirection dir,
  108.                     CScope*           scope = 0);
  109.     // Mapping between two seq_locs. If scope is set, synonyms are resolved
  110.     // for each source ID.
  111.     CSeq_loc_Mapper(const CSeq_loc&   source,
  112.                     const CSeq_loc&   target,
  113.                     CScope*           scope = 0);
  114.     // Mapping through an alignment. Need to specify target ID or
  115.     // target row of the alignment. Any other ID is mapped to the
  116.     // target one. If scope is set, synonyms are resolved for each source ID.
  117.     // Only the first row matching target ID is used, all other rows
  118.     // are considered source.
  119.     CSeq_loc_Mapper(const CSeq_align& map_align,
  120.                     const CSeq_id&    to_id,
  121.                     CScope*           scope = 0);
  122.     CSeq_loc_Mapper(const CSeq_align& map_align,
  123.                     size_t            to_row,
  124.                     CScope*           scope = 0);
  125.     // Mapping from segments to the segmented sequence (same as
  126.     // in annot iterator). If dst_id is set, all segments are
  127.     // mapped to the id. Otherwise mapping is done to the top
  128.     // level references in the map (e.g. if the map is created from
  129.     // a seq-loc).
  130.     CSeq_loc_Mapper(CBioseq_Handle target_seq);
  131.     CSeq_loc_Mapper(const CSeqMap& seq_map,
  132.                     const CSeq_id* dst_id = 0,
  133.                     CScope*        scope = 0);
  134.     // Mapping from master sequence to its segments, restricted
  135.     // by depth. Depth = 0 is for synonyms conversion.
  136.     CSeq_loc_Mapper(size_t          depth,
  137.                     CBioseq_Handle& source_seq);
  138.     CSeq_loc_Mapper(size_t         depth,
  139.                     const CSeqMap& source_seqmap,
  140.                     const CSeq_id* src_id = 0,
  141.                     CScope*        scope = 0);
  142.     ~CSeq_loc_Mapper(void);
  143.     // Intervals' merging mode
  144.     CSeq_loc_Mapper& SetMergeNone(void);
  145.     CSeq_loc_Mapper& SetMergeAbutting(void);
  146.     CSeq_loc_Mapper& SetMergeAll(void);
  147.     CSeq_loc_Mapper& SetGapPreserve(void);
  148.     CSeq_loc_Mapper& SetGapRemove(void);
  149.     // Create target-to-target mapping to avoid truncation of ranges
  150.     // already on the target sequence(s).
  151.     void PreserveDestinationLocs(void);
  152.     // Keep ranges which can not be mapped. Does not affect truncation
  153.     // of partially mapped ranges. By default nonmapping ranges are
  154.     // truncated.
  155.     void KeepNonmappingRanges(void);
  156.     void TruncateNonmappingRanges(void);
  157.     CRef<CSeq_loc>   Map(const CSeq_loc& src_loc);
  158.     CRef<CSeq_align> Map(const CSeq_align& src_align);
  159.     // Check if the last mapping resulted in partial location
  160.     bool             LastIsPartial(void);
  161. private:
  162.     CSeq_loc_Mapper(const CSeq_loc_Mapper&);
  163.     CSeq_loc_Mapper& operator=(const CSeq_loc_Mapper&);
  164.     friend class CSeq_loc_Conversion_Set;
  165.     friend class CSeq_align_Mapper;
  166.     enum EMergeFlags {
  167.         eMergeNone,      // no merging
  168.         eMergeAbutting,  // merge only abutting intervals, keep overlapping
  169.         eMergeAll        // merge both abutting and overlapping intervals
  170.     };
  171.     enum EGapFlags {
  172.         eGapPreserve,    // Leave gaps as-is
  173.         eGapRemove       // Remove gaps (NULLs)
  174.     };
  175.     enum EWidthFlags {
  176.         fWidthProtToNuc = 1,
  177.         fWidthNucToProt = 2
  178.     };
  179.     typedef int TWidthFlags; // binary OR of "EWidthFlags"
  180.     // Conversions
  181.     typedef CRange<TSeqPos>                              TRange;
  182.     typedef CRangeMultimap<CRef<CMappingRange>, TSeqPos> TRangeMap;
  183.     typedef TRangeMap::iterator                          TRangeIterator;
  184.     typedef map<CSeq_id_Handle, TRangeMap>               TIdMap;
  185.     // List and map of target ranges to construct target-to-target mapping
  186.     typedef list<TRange>                    TDstRanges;
  187.     typedef map<CSeq_id_Handle, TDstRanges> TDstIdMap;
  188.     typedef vector<TDstIdMap>               TDstStrandMap;
  189.     // Destination locations arranged by ID/range
  190.     typedef CRef<CInt_fuzz>                      TFuzz;
  191.     typedef pair<TFuzz, TFuzz>                   TRangeFuzz;
  192.     typedef pair<TRange, TRangeFuzz>             TRangeWithFuzz;
  193.     typedef list<TRangeWithFuzz>                 TMappedRanges;
  194.     // 0 = not set, any other index = na_strand + 1
  195.     typedef vector<TMappedRanges>                TRangesByStrand;
  196.     typedef map<CSeq_id_Handle, TRangesByStrand> TRangesById;
  197.     typedef map<CSeq_id_Handle, TWidthFlags>     TWidthById;
  198.     typedef CSeq_align::C_Segs::TDendiag TDendiag;
  199.     typedef CSeq_align::C_Segs::TStd     TStd;
  200.     // Check molecule type, return character width (3=na, 1=aa, 0=unknown).
  201.     int x_CheckSeqWidth(const CSeq_id& id, int width);
  202.     int x_CheckSeqWidth(const CSeq_loc& loc,
  203.                         TSeqPos* total_length);
  204.     // Get sequence length, try to get the real length for
  205.     // reverse strand, do not use "whole".
  206.     TSeqPos x_GetRangeLength(const CSeq_loc_CI& it);
  207.     void x_AddConversion(const CSeq_id& src_id,
  208.                          TSeqPos        src_start,
  209.                          ENa_strand     src_strand,
  210.                          const CSeq_id& dst_id,
  211.                          TSeqPos        dst_start,
  212.                          ENa_strand     dst_strand,
  213.                          TSeqPos        length);
  214.     void x_NextMappingRange(const CSeq_id&  src_id,
  215.                             TSeqPos&        src_start,
  216.                             TSeqPos&        src_len,
  217.                             ENa_strand      src_strand,
  218.                             const CSeq_id&  dst_id,
  219.                             TSeqPos&        dst_start,
  220.                             TSeqPos&        dst_len,
  221.                             ENa_strand      dst_strand);
  222.     // Optional frame is used for cd-region only
  223.     void x_Initialize(const CSeq_loc& source,
  224.                       const CSeq_loc& target,
  225.                       int             frame = 0);
  226.     void x_Initialize(const CSeq_align& map_align,
  227.                       const CSeq_id&    to_id);
  228.     void x_Initialize(const CSeq_align& map_align,
  229.                       size_t            to_row);
  230.     void x_Initialize(const CSeqMap& seq_map,
  231.                       const CSeq_id* top_id = 0);
  232.     void x_Initialize(const CSeqMap& seq_map,
  233.                       size_t         depth,
  234.                       const CSeq_id* top_id = 0);
  235.     void x_InitAlign(const CDense_diag& diag, size_t to_row);
  236.     void x_InitAlign(const CDense_seg& denseg, size_t to_row);
  237.     void x_InitAlign(const CStd_seg& sseg, size_t to_row);
  238.     void x_InitAlign(const CPacked_seg& pseg, size_t to_row);
  239.     TRangeIterator x_BeginMappingRanges(CSeq_id_Handle id,
  240.                                         TSeqPos from,
  241.                                         TSeqPos to);
  242.     bool x_MapInterval(const CSeq_id&   src_id,
  243.                        TRange           src_rg,
  244.                        bool             is_set_strand,
  245.                        ENa_strand       src_strand,
  246.                        TRangeFuzz       orig_fuzz);
  247.     void x_PushLocToDstMix(CRef<CSeq_loc> loc);
  248.     // Convert collected ranges into seq-loc and push into destination mix.
  249.     void x_PushRangesToDstMix(void);
  250.     void x_MapSeq_loc(const CSeq_loc& src_loc);
  251.     CRef<CSeq_align> x_MapSeq_align(const CSeq_align& src_align);
  252.     // Access mapped ranges, check vector size
  253.     TMappedRanges& x_GetMappedRanges(const CSeq_id_Handle& id,
  254.                                      int                   strand_idx) const;
  255.     CRef<CSeq_loc> x_RangeToSeq_loc(const CSeq_id_Handle& idh,
  256.                                     TSeqPos               from,
  257.                                     TSeqPos               to,
  258.                                     int                   strand_idx,
  259.                                     TRangeFuzz            rg_fuzz);
  260.     // Check location type, optimize if possible (empty mix to NULL,
  261.     // mix with a single element to this element etc.).
  262.     void x_OptimizeSeq_loc(CRef<CSeq_loc>& loc);
  263.     CRef<CSeq_loc> x_GetMappedSeq_loc(void);
  264.     CRef<CScope>      m_Scope;
  265.     // CSeq_loc_Conversion_Set m_Cvt;
  266.     EMergeFlags       m_MergeFlag;
  267.     EGapFlags         m_GapFlag;
  268.     bool              m_KeepNonmapping;
  269.     // Sources may have different widths, e.g. in an alignment
  270.     TWidthById      m_Widths;
  271.     bool            m_UseWidth;
  272.     int             m_Dst_width;
  273.     TIdMap          m_IdMap;
  274.     bool            m_Partial;
  275.     mutable TRangesById m_MappedLocs;
  276.     CRef<CSeq_loc>      m_Dst_loc;
  277.     TDstStrandMap       m_DstRanges;
  278. };
  279. struct CMappingRangeRef_Less
  280. {
  281.     bool operator()(const CRef<CMappingRange>& x,
  282.                     const CRef<CMappingRange>& y) const;
  283. };
  284. inline
  285. bool CMappingRangeRef_Less::operator()(const CRef<CMappingRange>& x,
  286.                                        const CRef<CMappingRange>& y) const
  287. {
  288.     if (x->m_Src_id_Handle != y->m_Src_id_Handle) {
  289.         return x->m_Src_id_Handle < y->m_Src_id_Handle;
  290.     }
  291.     // Leftmost first
  292.     if (x->m_Src_from != y->m_Src_from) {
  293.         return x->m_Src_from < y->m_Src_from;
  294.     }
  295.     // Longest first
  296.     return x->m_Src_to > y->m_Src_to;
  297. }
  298. inline
  299. bool CMappingRange::GoodSrcId(const CSeq_id& id) const
  300. {
  301.     return m_Src_id_Handle == id;
  302. }
  303. inline
  304. CRef<CSeq_id> CMappingRange::GetDstId(void)
  305. {
  306.     return m_Dst_id_Handle ?
  307.         Ref(&const_cast<CSeq_id&>(*m_Dst_id_Handle.GetSeqId())) :
  308.         CRef<CSeq_id>(0);
  309. }
  310. inline
  311. CSeq_loc_Mapper& CSeq_loc_Mapper::SetMergeNone(void)
  312. {
  313.     m_MergeFlag = eMergeNone;
  314.     return *this;
  315. }
  316. inline
  317. CSeq_loc_Mapper& CSeq_loc_Mapper::SetMergeAbutting(void)
  318. {
  319.     m_MergeFlag = eMergeAbutting;
  320.     return *this;
  321. }
  322. inline
  323. CSeq_loc_Mapper& CSeq_loc_Mapper::SetMergeAll(void)
  324. {
  325.     m_MergeFlag = eMergeAll;
  326.     return *this;
  327. }
  328. inline
  329. CSeq_loc_Mapper& CSeq_loc_Mapper::SetGapPreserve(void)
  330. {
  331.     m_GapFlag = eGapPreserve;
  332.     return *this;
  333. }
  334. inline
  335. CSeq_loc_Mapper& CSeq_loc_Mapper::SetGapRemove(void)
  336. {
  337.     m_GapFlag = eGapRemove;
  338.     return *this;
  339. }
  340. inline
  341. bool CSeq_loc_Mapper::LastIsPartial(void)
  342. {
  343.     return m_Partial;
  344. }
  345. inline
  346. void CSeq_loc_Mapper::KeepNonmappingRanges(void)
  347. {
  348.     m_KeepNonmapping = true;
  349. }
  350. inline
  351. void CSeq_loc_Mapper::TruncateNonmappingRanges(void)
  352. {
  353.     m_KeepNonmapping = false;
  354. }
  355. END_SCOPE(objects)
  356. END_NCBI_SCOPE
  357. /*
  358. * ---------------------------------------------------------------------------
  359. * $Log: seq_loc_mapper.hpp,v $
  360. * Revision 1000.1  2004/06/01 19:21:41  gouriano
  361. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  362. *
  363. * Revision 1.13  2004/05/26 14:29:20  grichenk
  364. * Redesigned CSeq_align_Mapper: preserve non-mapping intervals,
  365. * fixed strands handling, improved performance.
  366. *
  367. * Revision 1.12  2004/05/07 13:53:18  grichenk
  368. * Preserve fuzz from original location.
  369. * Better detection of partial locations.
  370. *
  371. * Revision 1.11  2004/05/05 14:04:22  grichenk
  372. * Use fuzz to indicate truncated intervals. Added KeepNonmapping flag.
  373. *
  374. * Revision 1.10  2004/04/23 15:34:49  grichenk
  375. * Added PreserveDestinationLocs().
  376. *
  377. * Revision 1.9  2004/04/12 14:35:59  grichenk
  378. * Fixed mapping of alignments between nucleotides and proteins
  379. *
  380. * Revision 1.8  2004/04/06 13:56:33  grichenk
  381. * Added possibility to remove gaps (NULLs) from mapped location
  382. *
  383. * Revision 1.7  2004/03/30 21:21:09  grichenk
  384. * Reduced number of includes.
  385. *
  386. * Revision 1.6  2004/03/30 17:00:00  grichenk
  387. * Fixed warnings, moved inline functions to hpp.
  388. *
  389. * Revision 1.5  2004/03/30 15:42:33  grichenk
  390. * Moved alignment mapper to separate file, added alignment mapping
  391. * to CSeq_loc_Mapper.
  392. *
  393. * Revision 1.4  2004/03/29 15:13:56  grichenk
  394. * Added mapping down to segments of a bioseq or a seqmap.
  395. * Fixed: preserve ranges already on the target bioseq(s).
  396. *
  397. * Revision 1.3  2004/03/22 21:10:58  grichenk
  398. * Added mapping from segments to master sequence or through a seq-map.
  399. *
  400. * Revision 1.2  2004/03/19 14:19:08  grichenk
  401. * Added seq-loc mapping through a seq-align.
  402. *
  403. * Revision 1.1  2004/03/10 16:22:29  grichenk
  404. * Initial revision
  405. *
  406. *
  407. * ===========================================================================
  408. */
  409. #endif  // SEQ_LOC_MAPPER__HPP