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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: Seq_loc.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:30:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.37
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: Seq_loc.hpp,v 1000.3 2004/06/01 19:30:53 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Cliff Clausen, Eugene Vasilchenko
  35.  *
  36.  * File Description:
  37.  *   .......
  38.  *
  39.  * Remark:
  40.  *   This code was originally generated by application DATATOOL
  41.  *   using specifications from the ASN data definition file
  42.  *   'seqloc.asn'.
  43.  *
  44.  * ===========================================================================
  45.  */
  46. #ifndef OBJECTS_SEQLOC_SEQ_LOC_HPP
  47. #define OBJECTS_SEQLOC_SEQ_LOC_HPP
  48. // generated includes
  49. #include <objects/seqloc/Seq_loc_.hpp>
  50. #include <objects/seqloc/Seq_loc_mix.hpp>
  51. #include <objects/seqloc/Packed_seqpnt.hpp>
  52. #include <objects/seqloc/Packed_seqint.hpp>
  53. #include <objects/seqloc/Seq_id.hpp>
  54. #include <objects/general/Int_fuzz.hpp>
  55. //
  56. #include <corelib/ncbiexpt.hpp>
  57. #include <util/range.hpp>
  58. #include <vector>
  59. BEGIN_NCBI_SCOPE
  60. BEGIN_objects_SCOPE // namespace ncbi::objects::
  61. class NCBI_SEQLOC_EXPORT CSeq_loc : public CSeq_loc_Base
  62. {
  63. public:
  64.     typedef CSeq_loc_Base Tparent;
  65.     typedef CPacked_seqpnt_Base::TPoints TPoints;
  66.     typedef CPacked_seqint_Base::Tdata   TIntervals;
  67.     typedef CSeq_loc_mix_Base::Tdata     TLocations;
  68.     typedef CSeq_id                      TId;
  69.     typedef ENa_strand                   TStrand;
  70.     typedef TSeqPos                      TPoint;
  71.     typedef CPacked_seqint::TRanges      TRanges;
  72.     // constructor
  73.     CSeq_loc(void);
  74.     CSeq_loc(E_Choice index);
  75.     CSeq_loc(TId& id, TPoint point, TStrand strand = eNa_strand_unknown);
  76.     CSeq_loc(TId& id, const TPoints& points, TStrand strand = eNa_strand_unknown);
  77.     CSeq_loc(TId& id, TPoint from, TPoint to, TStrand strand = eNa_strand_unknown);
  78.     CSeq_loc(TId& id, TRanges ivals, TStrand strand = eNa_strand_unknown);
  79.     // destructor
  80.     virtual ~CSeq_loc(void);
  81.     // See related functions in util/sequence.hpp:
  82.     //
  83.     //   TSeqPos GetLength(const CSeq_loc&, CScope*)
  84.     //   bool IsOneBioseq(const CSeq_loc&, CScope*)
  85.     //   const CSeq_id& GetId(const CSeq_loc&, CScope*)
  86.     //   TSeqPos GetStart(const CSeq_loc&, CScope*)
  87.     //   sequence::ECompare Compare(const CSeq_loc&, CSeq_loc&, CScope*)
  88.     //   sequence::SeqLocMerge(...)
  89.     //
  90.     typedef CRange<TSeqPos> TRange;
  91.     TRange GetTotalRange(void) const;
  92.     void InvalidateTotalRangeCache(void);
  93.  
  94.     // Special case for circular sequences. No ID is checked for
  95.     // circular locations. If the sequence is not circular
  96.     // (seq_len == kInvalidSeqPos) all functions work like GetTotalRange()
  97.     TSeqPos GetStart(TSeqPos seq_len) const;
  98.     TSeqPos GetEnd(TSeqPos seq_len) const;
  99.     TSeqPos GetCircularLength(TSeqPos seq_len) const;
  100.     // Appends a label suitable for display (e.g., error messages)
  101.     // label must point to an existing string object
  102.     // Method just returns if label is null. Note this label is NOT
  103.     // GenBank-style.
  104.     void GetLabel(string* label) const;
  105.     // check left (5') or right (3') end of location for e_Lim fuzz
  106.     bool IsPartialLeft  (void) const;
  107.     bool IsPartialRight (void) const;
  108.     // set / remove e_Lim fuzz on left (5') or right (3') end
  109.     void SetPartialLeft (bool val);
  110.     void SetPartialRight(bool val);
  111.     // set the 'id' field in all parts of this location
  112.     void SetId(CSeq_id& id); // stores id
  113.     void SetId(const CSeq_id& id); // stores a new copy of id
  114.     // check that the 'id' field in all parts of the location is the same
  115.     // as the specifies id.
  116.     // if the id parameter is NULL will return the location's id (if unique)
  117.     void CheckId(const CSeq_id*& id) const;
  118.     void InvalidateIdCache(void);
  119.     virtual void Assign(const CSerialObject& source,
  120.                         ESerialRecursionMode how = eRecursive);
  121.     virtual bool Equals(const CSerialObject& object,
  122.                         ESerialRecursionMode how = eRecursive) const;
  123.     // Compare locations if they are defined on the same single sequence
  124.     // or throw exception.
  125.     int Compare(const CSeq_loc& loc) const;
  126.     void Add(const CSeq_loc& other);
  127. private:
  128.     // Prohibit copy constructor & assignment operator
  129.     CSeq_loc(const CSeq_loc&);
  130.     CSeq_loc& operator= (const CSeq_loc&);
  131.     TRange x_UpdateTotalRange(void) const;
  132.     TRange x_CalculateTotalRangeCheckId(const CSeq_id*& id) const;
  133.     void x_CheckId(const CSeq_id*& id) const;
  134.     void x_UpdateId(const CSeq_id*& total_id, const CSeq_id* id) const;
  135.     void x_ChangeToMix(const CSeq_loc& other);
  136.     void x_ChangeToPackedInt(const CSeq_loc& other);
  137.     void x_ChangeToPackedPnt(const CSeq_loc& other);
  138.     void x_InvalidateCache(void);
  139.     enum {
  140.         kDirtyCache = -2,
  141.         kSeveralIds = -3
  142.     };
  143.     mutable TRange m_TotalRangeCache;
  144.     // Seq-id for the whole seq-loc or null if multiple IDs were found
  145.     mutable const CSeq_id* m_IdCache;
  146. };
  147. // Seq-loc iterator class -- iterates all intervals from a seq-loc
  148. // in the correct order.
  149. class NCBI_SEQLOC_EXPORT CSeq_loc_CI
  150. {
  151. public:
  152.     // Options for empty locations processing
  153.     enum EEmptyFlag {
  154.         eEmpty_Skip,    // ignore empty locations
  155.         eEmpty_Allow    // treat empty locations as usual
  156.     };
  157.     CSeq_loc_CI(void);
  158.     CSeq_loc_CI(const CSeq_loc& loc, EEmptyFlag empty_flag = eEmpty_Skip);
  159.     ~CSeq_loc_CI(void);
  160.     CSeq_loc_CI(const CSeq_loc_CI& iter);
  161.     CSeq_loc_CI& operator= (const CSeq_loc_CI& iter);
  162.     CSeq_loc_CI& operator++ (void);
  163.     operator bool (void) const;
  164.     typedef CRange<TSeqPos> TRange;
  165.     // Get seq_id of the current location
  166.     const CSeq_id& GetSeq_id(void) const;
  167.     // Get the range
  168.     TRange         GetRange(void) const;
  169.     // Get strand
  170.     ENa_strand GetStrand(void) const;
  171.     // Get seq-loc for the current interval
  172.     const CSeq_loc& GetSeq_loc(void) const;
  173.     // Return null if non-fuzzy 
  174.     const CInt_fuzz* GetFuzzFrom(void) const;
  175.     const CInt_fuzz* GetFuzzTo  (void) const;
  176.     // True if the current location is a whole sequence
  177.     bool           IsWhole(void) const;
  178.     // True if the current location is empty
  179.     bool           IsEmpty(void) const;
  180.     // True if the current location is a single point
  181.     bool           IsPoint(void) const;
  182. private:
  183.     // Check the iterator position
  184.     bool x_IsValid(void) const;
  185.     // Check the position, throw exception if not valid
  186.     void x_CheckNotValid(const char* where) const;
  187.     void x_ThrowNotValid(const char* where) const;
  188.     // Process the location, fill the list
  189.     void x_ProcessLocation(const CSeq_loc& loc);
  190.     // Simple location structure: id/from/to
  191.     struct SLoc_Info {
  192.         SLoc_Info(void);
  193.         CConstRef<CSeq_id>  m_Id;
  194.         TRange              m_Range;
  195.         ENa_strand          m_Strand;
  196.         // The original seq-loc for the interval
  197.         CConstRef<CSeq_loc> m_Loc;
  198.         CConstRef<CInt_fuzz> m_Fuzz[2];
  199.     };
  200.     typedef list<SLoc_Info> TLocList;
  201.     // Prevent seq-loc destruction
  202.     CConstRef<CSeq_loc>      m_Location;
  203.     // List of intervals
  204.     TLocList                 m_LocList;
  205.     // Current interval
  206.     TLocList::const_iterator m_CurLoc;
  207.     // Empty locations processing option
  208.     EEmptyFlag               m_EmptyFlag;
  209. };
  210. /////////////////// CSeq_loc inline methods
  211. inline
  212. void CSeq_loc::InvalidateTotalRangeCache(void)
  213. {
  214.     m_TotalRangeCache.SetFrom(TSeqPos(kDirtyCache));
  215. }
  216. inline 
  217. void CSeq_loc::InvalidateIdCache(void)
  218. {
  219.     m_IdCache = 0;
  220. }
  221. inline 
  222. void CSeq_loc::x_InvalidateCache(void)
  223. {
  224.     InvalidateTotalRangeCache();
  225.     InvalidateIdCache();
  226. }
  227. // constructor
  228. inline
  229. CSeq_loc::CSeq_loc(void)
  230. {
  231.     x_InvalidateCache();
  232. }
  233. inline
  234. CSeq_loc::TRange CSeq_loc::GetTotalRange(void) const
  235. {
  236.     TRange range = m_TotalRangeCache;
  237.     if ( range.GetFrom() == TSeqPos(kDirtyCache) )
  238.         range = x_UpdateTotalRange();
  239.     return range;
  240. }
  241. inline
  242. void CSeq_loc::CheckId(const CSeq_id*& id) const
  243. {
  244.     const CSeq_id* my_id = m_IdCache;
  245.     if ( my_id == 0 ) {
  246.         x_CheckId(my_id);
  247.         m_IdCache = my_id;
  248.     }
  249.     x_UpdateId(id, my_id);
  250. }
  251. inline
  252. void CSeq_loc::SetId(const CSeq_id& id)
  253. {
  254.     InvalidateIdCache();
  255.     CRef<CSeq_id> nc_id(new CSeq_id);
  256.     nc_id->Assign(id);
  257.     SetId(*nc_id);
  258.     m_IdCache = nc_id.GetPointer();
  259. }
  260. inline
  261. int CSeq_loc::Compare(const CSeq_loc& loc) const
  262. {
  263.     CSeq_loc::TRange range1 = GetTotalRange();
  264.     CSeq_loc::TRange range2 = loc.GetTotalRange();
  265.     // smallest left extreme first
  266.     if ( range1.GetFrom() != range2.GetFrom() ) {
  267.         return range1.GetFrom() < range2.GetFrom()? -1: 1;
  268.     }
  269.     // longest first
  270.     if ( range1.GetToOpen() != range2.GetToOpen() ) {
  271.         return range1.GetToOpen() < range2.GetToOpen()? 1: -1;
  272.     }
  273.     return 0;
  274. }
  275. /////////////////// end of CSeq_loc inline methods
  276. /////////////////// CSeq_loc_CI inline methods
  277. inline
  278. CSeq_loc_CI::SLoc_Info::SLoc_Info(void)
  279.     : m_Id(0),
  280.       m_Strand(eNa_strand_unknown),
  281.       m_Loc(0)
  282. {
  283.     return;
  284. }
  285. inline
  286. CSeq_loc_CI& CSeq_loc_CI::operator++ (void)
  287. {
  288.     ++m_CurLoc;
  289.     return *this;
  290. }
  291. inline
  292. bool CSeq_loc_CI::x_IsValid(void) const
  293. {
  294.     return m_CurLoc != m_LocList.end();
  295. }
  296. inline
  297. CSeq_loc_CI::operator bool (void) const
  298. {
  299.     return x_IsValid();
  300. }
  301. inline
  302. void CSeq_loc_CI::x_CheckNotValid(const char* where) const
  303. {
  304.     if ( !x_IsValid() )
  305.         x_ThrowNotValid(where);
  306. }
  307. inline
  308. const CSeq_id& CSeq_loc_CI::GetSeq_id(void) const
  309. {
  310.     x_CheckNotValid("GetSeq_id()");
  311.     return *m_CurLoc->m_Id;
  312. }
  313. inline
  314. CSeq_loc_CI::TRange CSeq_loc_CI::GetRange(void) const
  315. {
  316.     x_CheckNotValid("GetRange()");
  317.     return m_CurLoc->m_Range;
  318. }
  319. inline
  320. ENa_strand CSeq_loc_CI::GetStrand(void) const
  321. {
  322.     x_CheckNotValid("GetStrand()");
  323.     return m_CurLoc->m_Strand;
  324. }
  325. inline
  326. const CSeq_loc& CSeq_loc_CI::GetSeq_loc(void) const
  327. {
  328.     x_CheckNotValid("GetSeq_loc()");
  329.     if ( !m_CurLoc->m_Loc ) {
  330.         NCBI_THROW(CException, eUnknown,
  331.             "CSeq_loc_CI::GetSeq_loc() -- NULL seq-loc");
  332.     }
  333.     return *m_CurLoc->m_Loc;
  334. }
  335. inline
  336. const CInt_fuzz* CSeq_loc_CI::GetFuzzFrom(void) const
  337. {
  338.     x_CheckNotValid("GetFuzzFrom()");
  339.     return m_CurLoc->m_Fuzz[0];
  340. }
  341. inline
  342. const CInt_fuzz* CSeq_loc_CI::GetFuzzTo(void) const
  343. {
  344.     x_CheckNotValid("GetFuzzTo()");
  345.     return m_CurLoc->m_Fuzz[1];
  346. }
  347. inline
  348. bool CSeq_loc_CI::IsWhole(void) const
  349. {
  350.     x_CheckNotValid("IsWhole()");
  351.     return m_CurLoc->m_Range.IsWhole();
  352. }
  353. inline
  354. bool CSeq_loc_CI::IsEmpty(void) const
  355. {
  356.     x_CheckNotValid("IsEmpty()");
  357.     return m_CurLoc->m_Range.Empty();
  358. }
  359. inline
  360. bool CSeq_loc_CI::IsPoint(void) const
  361. {
  362.     x_CheckNotValid("IsPoint()");
  363.     return m_CurLoc->m_Range.GetLength() == 1;
  364. }
  365. /////////////////// end of CSeq_loc_CI inline methods
  366. END_objects_SCOPE // namespace ncbi::objects::
  367. END_NCBI_SCOPE
  368. /*
  369.  * ===========================================================================
  370.  * $Log: Seq_loc.hpp,v $
  371.  * Revision 1000.3  2004/06/01 19:30:53  gouriano
  372.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.37
  373.  *
  374.  * Revision 1.37  2004/05/06 16:54:41  shomrat
  375.  * Added methods to set partial left and right
  376.  *
  377.  * Revision 1.36  2004/03/25 15:58:41  gouriano
  378.  * Added possibility to copy and compare serial object non-recursively
  379.  *
  380.  * Revision 1.35  2004/03/16 18:08:56  vasilche
  381.  * Use GetPointer() to avoid ambiguity
  382.  *
  383.  * Revision 1.34  2004/02/17 21:10:58  vasilche
  384.  * Fixed possible race condition in CSeq_loc::CheckId().
  385.  *
  386.  * Revision 1.33  2004/01/29 21:07:08  shomrat
  387.  * Made cache invalidation methods public
  388.  *
  389.  * Revision 1.32  2004/01/28 17:16:31  shomrat
  390.  * Added methods to ease the construction of objects
  391.  *
  392.  * Revision 1.31  2003/12/31 15:36:07  grichenk
  393.  * Moved CompareLocations() from CSeq_feat to CSeq_loc,
  394.  * renamed it to Compare().
  395.  *
  396.  * Revision 1.30  2003/11/21 14:45:00  grichenk
  397.  * Replaced runtime_error with CException
  398.  *
  399.  * Revision 1.29  2003/10/15 15:50:21  ucko
  400.  * CSeq_loc::SetId: add a version that takes a const ID and stores a new copy.
  401.  * CSeq_loc_CI: expose fuzz (if present).
  402.  *
  403.  * Revision 1.28  2003/10/14 16:49:53  dicuccio
  404.  * Added SetId()
  405.  *
  406.  * Revision 1.27  2003/09/22 18:38:13  grichenk
  407.  * Fixed circular seq-locs processing by TestForOverlap()
  408.  *
  409.  * Revision 1.26  2003/09/17 18:39:01  grichenk
  410.  * + GetStart(), GetEnd(), GetCircularLength()
  411.  *
  412.  * Revision 1.25  2003/06/18 16:00:07  vasilche
  413.  * Fixed GetTotalRange() in multithreaded app.
  414.  *
  415.  * Revision 1.24  2003/06/13 17:21:18  grichenk
  416.  * Added seq-id caching for single-id seq-locs
  417.  *
  418.  * Revision 1.23  2003/04/02 15:17:45  grichenk
  419.  * Added flag for CSeq_loc_CI to skip/include empty locations.
  420.  *
  421.  * Revision 1.22  2003/02/06 22:23:29  vasilche
  422.  * Added CSeq_id::Assign(), CSeq_loc::Assign().
  423.  * Added int CSeq_id::Compare() (not safe).
  424.  * Added caching of CSeq_loc::GetTotalRange().
  425.  *
  426.  * Revision 1.21  2003/02/04 16:04:12  dicuccio
  427.  * Changed postfix to prefix operator in op++() - marginally faster
  428.  *
  429.  * Revision 1.20  2003/02/04 15:15:11  grichenk
  430.  * Overrided Assign() for CSeq_loc and CSeq_id
  431.  *
  432.  * Revision 1.19  2003/01/22 20:13:57  vasilche
  433.  * Use more effective COpenRange<> methods.
  434.  *
  435.  * Revision 1.18  2002/12/30 19:37:02  vasilche
  436.  * Rewrote CSeq_loc::GetTotalRange() to avoid using CSeq_loc_CI -
  437.  * it's too expensive.
  438.  *
  439.  * Revision 1.17  2002/12/26 12:43:42  dicuccio
  440.  * Added Win32 export specifiers
  441.  *
  442.  * Revision 1.16  2002/12/23 17:19:26  grichenk
  443.  * Added GetSeq_loc() to CSeq_loc_CI
  444.  *
  445.  * Revision 1.15  2002/12/19 20:21:10  dicuccio
  446.  * Remove post-increment operator
  447.  *
  448.  * Revision 1.14  2002/12/19 20:11:20  grichenk
  449.  * Fixed error message
  450.  *
  451.  * Revision 1.13  2002/10/03 18:49:05  clausen
  452.  * Removed extra whitespace
  453.  *
  454.  * Revision 1.12  2002/10/03 16:37:39  clausen
  455.  * Added GetLabel()
  456.  *
  457.  * Revision 1.11  2002/09/12 21:16:14  kans
  458.  * added IsPartialLeft and IsPartialRight
  459.  *
  460.  * Revision 1.10  2002/06/07 11:54:34  clausen
  461.  * Added related functions comment
  462.  *
  463.  * Revision 1.9  2002/06/06 20:40:51  clausen
  464.  * Moved methods using object manager to objects/util
  465.  *
  466.  * Revision 1.8  2002/05/03 21:28:04  ucko
  467.  * Introduce T(Signed)SeqPos.
  468.  *
  469.  * Revision 1.7  2002/04/17 15:39:06  grichenk
  470.  * Moved CSeq_loc_CI to the seq-loc library
  471.  *
  472.  * Revision 1.6  2002/01/10 18:20:48  clausen
  473.  * Added IsOneBioseq, GetStart, and GetId
  474.  *
  475.  * Revision 1.5  2001/10/22 11:39:49  clausen
  476.  * Added Compare()
  477.  *
  478.  * Revision 1.4  2001/06/25 18:52:02  grichenk
  479.  * Prohibited copy constructor and assignment operator
  480.  *
  481.  * Revision 1.3  2001/01/05 20:11:41  vasilche
  482.  * CRange, CRangeMap were moved to util.
  483.  *
  484.  * Revision 1.2  2001/01/03 16:38:58  vasilche
  485.  * Added CAbstractObjectManager - stub for object manager.
  486.  * CRange extracted to separate file.
  487.  *
  488.  * Revision 1.1  2000/11/17 21:35:02  vasilche
  489.  * Added GetLength() method to CSeq_loc class.
  490.  *
  491.  *
  492.  * ===========================================================================
  493. */
  494. #endif // OBJECTS_SEQLOC_SEQ_LOC_HPP