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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sequence.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:22:17  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.44
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQUENCE__HPP
  10. #define SEQUENCE__HPP
  11. /*  $Id: sequence.hpp,v 1000.2 2004/06/01 19:22:17 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:  Clifford Clausen & Aaron Ucko
  37. *
  38. * File Description:
  39. *   Sequence utilities requiring CScope
  40. *   Obtains or constructs a sequence's title.  (Corresponds to
  41. *   CreateDefLine in the C toolkit.)
  42. */
  43. #include <corelib/ncbistd.hpp>
  44. #include <serial/serial.hpp>
  45. #include <serial/objistr.hpp>
  46. #include <serial/objostr.hpp>
  47. #include <objects/seqfeat/SeqFeatData.hpp>
  48. #include <objects/seqloc/Na_strand.hpp>
  49. #include <objects/seqloc/Seq_interval.hpp>
  50. #include <objects/seqloc/Seq_loc.hpp>
  51. #include <util/strsearch.hpp>
  52. BEGIN_NCBI_SCOPE
  53. BEGIN_SCOPE(objects)
  54. // Forward declarations
  55. class CSeq_id;
  56. class CSeq_loc_mix;
  57. class CSeq_point;
  58. class CPacked_seqpnt;
  59. class CScope;
  60. class CBioseq_Handle;
  61. class CSeqVector;
  62. class CCdregion;
  63. class CSeq_feat;
  64. class CSeq_entry;
  65. class CGenetic_code;
  66. BEGIN_SCOPE(sequence)
  67. struct CNotUnique : public runtime_error
  68. {
  69.     CNotUnique() : runtime_error("CSeq_ids do not refer to unique CBioseq") {}
  70. };
  71. struct CNoLength : public runtime_error
  72. {
  73.     CNoLength() : runtime_error("Unable to determine length") {}
  74. };
  75. // Containment relationships between CSeq_locs
  76. enum ECompare {
  77.     eNoOverlap = 0, // CSeq_locs do not overlap
  78.     eContained,     // First CSeq_loc contained by second
  79.     eContains,      // First CSeq_loc contains second
  80.     eSame,          // CSeq_locs contain each other
  81.     eOverlap        // CSeq_locs overlap
  82. };
  83. // Get sequence length if scope not null, else return max possible TSeqPos
  84. NCBI_XOBJUTIL_EXPORT
  85. TSeqPos GetLength(const CSeq_id& id, CScope* scope = 0);
  86. // Get length of sequence represented by CSeq_loc, if possible
  87. NCBI_XOBJUTIL_EXPORT
  88. TSeqPos GetLength(const CSeq_loc& loc, CScope* scope = 0)
  89.     THROWS((sequence::CNoLength));
  90. // Get length of CSeq_loc_mix == sum (length of embedded CSeq_locs)
  91. NCBI_XOBJUTIL_EXPORT
  92. TSeqPos GetLength(const CSeq_loc_mix& mix, CScope* scope = 0)
  93.     THROWS((sequence::CNoLength));
  94. // Checks that point >= 0 and point < length of Bioseq
  95. NCBI_XOBJUTIL_EXPORT
  96. bool IsValid(const CSeq_point& pt, CScope* scope = 0);
  97. // Checks that all points >=0 and < length of CBioseq. If scope is 0
  98. // assumes length of CBioseq is max value of TSeqPos.
  99. NCBI_XOBJUTIL_EXPORT
  100. bool IsValid(const CPacked_seqpnt& pts, CScope* scope = 0);
  101. // Checks from and to of CSeq_interval. If from < 0, from > to, or
  102. // to >= length of CBioseq this is an interval for, returns false, else true.
  103. NCBI_XOBJUTIL_EXPORT
  104. bool IsValid(const CSeq_interval& interval, CScope* scope = 0);
  105. // Determines if two CSeq_ids represent the same CBioseq
  106. NCBI_XOBJUTIL_EXPORT
  107. bool IsSameBioseq(const CSeq_id& id1, const CSeq_id& id2, CScope* scope = 0);
  108. // Returns true if all embedded CSeq_ids represent the same CBioseq, else false
  109. NCBI_XOBJUTIL_EXPORT
  110. bool IsOneBioseq(const CSeq_loc& loc, CScope* scope = 0);
  111. // If all CSeq_ids embedded in CSeq_loc refer to the same CBioseq, returns
  112. // the first CSeq_id found, else throws exception CNotUnique()
  113. NCBI_XOBJUTIL_EXPORT
  114. const CSeq_id& GetId(const CSeq_loc& loc, CScope* scope = 0)
  115.     THROWS((sequence::CNotUnique));
  116. // Returns eNa_strand_unknown if multiple Bioseqs in loc
  117. // Returns eNa_strand_other if multiple strands in same loc
  118. // Returns eNa_strand_both if loc is a Whole
  119. // Returns strand otherwise
  120. NCBI_XOBJUTIL_EXPORT
  121. ENa_strand GetStrand(const CSeq_loc& loc, CScope* scope = 0);
  122. // If only one CBioseq is represented by CSeq_loc, returns the lowest residue
  123. // position represented. If not null, scope is used to determine if two
  124. // CSeq_ids represent the same CBioseq. Throws exception CNotUnique if
  125. // CSeq_loc does not represent one CBioseq.
  126. NCBI_XOBJUTIL_EXPORT
  127. TSeqPos GetStart(const CSeq_loc& loc, CScope* scope = 0)
  128.     THROWS((sequence::CNotUnique));
  129. // If only one CBioseq is represented by CSeq_loc, returns the highest residue
  130. // position represented. If not null, scope is used to determine if two
  131. // CSeq_ids represent the same CBioseq. Throws exception CNotUnique if
  132. // CSeq_loc does not represent one CBioseq.
  133. NCBI_XOBJUTIL_EXPORT
  134. TSeqPos GetStop(const CSeq_loc& loc, CScope* scope = 0)
  135.     THROWS((sequence::CNotUnique));
  136. // Returns the sequence::ECompare containment relationship between CSeq_locs
  137. NCBI_XOBJUTIL_EXPORT
  138. sequence::ECompare Compare(const CSeq_loc& loc1,
  139.                            const CSeq_loc& loc2,
  140.                            CScope* scope = 0);
  141. // Get sequence's title (used in various flat-file formats.)
  142. // This function is here rather than in CBioseq because it may need
  143. // to inspect other sequences.  The reconstruct flag indicates that it
  144. // should ignore any existing title Seqdesc.
  145. enum EGetTitleFlags {
  146.     fGetTitle_Reconstruct = 0x1, // ignore existing title Seqdesc.
  147.     fGetTitle_Organism    = 0x2  // append [organism]
  148. };
  149. typedef int TGetTitleFlags;
  150. NCBI_XOBJUTIL_EXPORT
  151. string GetTitle(const CBioseq_Handle& hnd, TGetTitleFlags flags = 0);
  152. /// Retrieve a particular seq-id from a given bioseq handle.  This uses
  153. /// CSynonymsSet internally to decide which seq-id should be used.
  154. enum EGetIdType {
  155.     eGetId_ForceGi,         // return only a gi-based seq-id
  156.     eGetId_Best,            // return the "best" gi (uses FindBestScore(),
  157.                             // with CSeq_id::CalculateScore() as the score
  158.                             // function
  159.     eGetId_HandleDefault,   // returns the ID associated with a bioseq-handle
  160.     eGetId_Default = eGetId_Best
  161. };
  162. NCBI_XOBJUTIL_EXPORT
  163. const CSeq_id& GetId(const CBioseq_Handle& handle,
  164.                      EGetIdType type = eGetId_Default);
  165. // Change a CSeq_id to the one for the CBioseq that it represents
  166. // that has the best rank or worst rank according on value of best.
  167. // Just returns if scope == 0
  168. NCBI_XOBJUTIL_EXPORT
  169. void ChangeSeqId(CSeq_id* id, bool best, CScope* scope = 0);
  170. // Change each of the CSeq_ids embedded in a CSeq_loc to the best
  171. // or worst CSeq_id accoring to the value of best. Just returns if
  172. // scope == 0
  173. NCBI_XOBJUTIL_EXPORT
  174. void ChangeSeqLocId(CSeq_loc* loc, bool best, CScope* scope = 0);
  175. enum ESeqLocCheck {
  176.     eSeqLocCheck_ok,
  177.     eSeqLocCheck_warning,
  178.     eSeqLocCheck_error
  179. };
  180. // Checks that a CSeq_loc is all on one strand on one CBioseq. For embedded 
  181. // points, checks that the point location is <= length of sequence of point. 
  182. // For packed points, checks that all points are within length of sequence. 
  183. // For intervals, ensures from <= to and interval is within length of sequence.
  184. // If no mixed strands and lengths are valid, returns eSeqLocCheck_ok. If
  185. // only mixed strands/CBioseq error, then returns eSeqLocCheck_warning. If 
  186. // length error, then returns eSeqLocCheck_error.
  187. NCBI_XOBJUTIL_EXPORT
  188. ESeqLocCheck SeqLocCheck(const CSeq_loc& loc, CScope* scope);
  189. // Returns true if the order of Seq_locs is bad, otherwise, false
  190. NCBI_XOBJUTIL_EXPORT
  191. bool BadSeqLocSortOrder
  192. (const CBioseq&  seq,
  193.  const CSeq_loc& loc,
  194.  CScope*         scope);
  195. enum ES2PFlags {
  196.     fS2P_NoMerge  = 0x1, // don't merge adjacent intervals on the product
  197.     fS2P_AllowTer = 0x2  // map the termination codon as a legal location
  198. };
  199. typedef int TS2PFlags; // binary OR of ES2PFlags
  200. NCBI_XOBJUTIL_EXPORT
  201. CRef<CSeq_loc> SourceToProduct(const CSeq_feat& feat,
  202.                                const CSeq_loc& source_loc, TS2PFlags flags = 0,
  203.                                CScope* scope = 0, int* frame = 0);
  204. enum EP2SFlags {
  205.     fP2S_Extend = 0x1  // if hitting ends, extend to include partial codons
  206. };
  207. typedef int TP2SFlags; // binary OR of ES2PFlags
  208. NCBI_XOBJUTIL_EXPORT
  209. CRef<CSeq_loc> ProductToSource(const CSeq_feat& feat, const CSeq_loc& prod_loc,
  210.                                TP2SFlags flags = 0, CScope* scope = 0);
  211. enum EOffsetType {
  212.     // For positive-orientation strands, start = left and end = right;
  213.     // for reverse-orientation strands, start = right and end = left.
  214.     eOffset_FromStart, // relative to beginning of location
  215.     eOffset_FromEnd,   // relative to end of location
  216.     eOffset_FromLeft,  // relative to low-numbered end
  217.     eOffset_FromRight  // relative to high-numbered end
  218. };
  219. // returns (TSeqPos)-1 if the locations don't overlap
  220. NCBI_XOBJUTIL_EXPORT
  221. TSeqPos LocationOffset(const CSeq_loc& outer, const CSeq_loc& inner,
  222.                        EOffsetType how = eOffset_FromStart, CScope* scope = 0);
  223. enum EOverlapType {
  224.     eOverlap_Simple,         // any overlap of extremes
  225.     eOverlap_Contained,      // 2nd contained within 1st extremes
  226.     eOverlap_Contains,       // 2nd contains 1st extremes
  227.     eOverlap_Subset,         // 2nd is a subset of 1st ranges
  228.     eOverlap_CheckIntervals, // 2nd is a subset of 1st with matching boundaries
  229.     eOverlap_Interval        // at least one pair of intervals must overlap
  230. };
  231. // Check if the two locations have ovarlap of a given type
  232. NCBI_XOBJUTIL_EXPORT
  233. int TestForOverlap(const CSeq_loc& loc1,
  234.                    const CSeq_loc& loc2,
  235.                    EOverlapType type,
  236.                    TSeqPos circular_len = kInvalidSeqPos);
  237. NCBI_XOBJUTIL_EXPORT
  238. CConstRef<CSeq_feat> GetBestOverlappingFeat(const CSeq_loc& loc,
  239.                                             CSeqFeatData::E_Choice feat_type,
  240.                                             EOverlapType overlap_type,
  241.                                             CScope& scope);
  242. NCBI_XOBJUTIL_EXPORT
  243. CConstRef<CSeq_feat> GetBestOverlappingFeat(const CSeq_loc& loc,
  244.                                             CSeqFeatData::ESubtype feat_type,
  245.                                             EOverlapType overlap_type,
  246.                                             CScope& scope);
  247. // Convenience functions for popular overlapping types
  248. NCBI_XOBJUTIL_EXPORT
  249. CConstRef<CSeq_feat> GetOverlappingGene(const CSeq_loc& loc, CScope& scope);
  250. NCBI_XOBJUTIL_EXPORT
  251. CConstRef<CSeq_feat> GetOverlappingmRNA(const CSeq_loc& loc, CScope& scope);
  252. NCBI_XOBJUTIL_EXPORT
  253. CConstRef<CSeq_feat> GetOverlappingCDS(const CSeq_loc& loc, CScope& scope);
  254. NCBI_XOBJUTIL_EXPORT
  255. CConstRef<CSeq_feat> GetOverlappingPub(const CSeq_loc& loc, CScope& scope);
  256. NCBI_XOBJUTIL_EXPORT
  257. CConstRef<CSeq_feat> GetOverlappingSource(const CSeq_loc& loc, CScope& scope);
  258. NCBI_XOBJUTIL_EXPORT
  259. CConstRef<CSeq_feat> GetOverlappingOperon(const CSeq_loc& loc, CScope& scope);
  260. enum ESeqlocPartial {
  261.     eSeqlocPartial_Complete   =   0,
  262.     eSeqlocPartial_Start      =   1,
  263.     eSeqlocPartial_Stop       =   2,
  264.     eSeqlocPartial_Internal   =   4,
  265.     eSeqlocPartial_Other      =   8,
  266.     eSeqlocPartial_Nostart    =  16,
  267.     eSeqlocPartial_Nostop     =  32,
  268.     eSeqlocPartial_Nointernal =  64,
  269.     eSeqlocPartial_Limwrong   = 128,
  270.     eSeqlocPartial_Haderror   = 256
  271. };
  272.    
  273. // Sets bits for incomplete location and/or errors
  274. NCBI_XOBJUTIL_EXPORT
  275. int SeqLocPartialCheck(const CSeq_loc& loc, CScope* scope);
  276. enum ESeqLocFlags
  277. {
  278.     fMergeIntervals  = 1,    // merge overlapping intervals
  279.     fFuseAbutting    = 2,    // fuse together abutting intervals
  280.     fSingleInterval  = 4,    // create a single interval
  281.     fAddNulls        = 8     // will add a null Seq-loc between intervals 
  282. };
  283. typedef unsigned int TSeqLocFlags;  // logical OR of ESeqLocFlags
  284. // Merge two Seq-locs returning the merged location.
  285. NCBI_XOBJUTIL_EXPORT
  286. CSeq_loc* SeqLocMerge(const CBioseq_Handle& target,
  287.                       const CSeq_loc& loc1, const CSeq_loc& loc2,
  288.                       TSeqLocFlags flags = 0);
  289. // Merge a single Seq-loc
  290. NCBI_XOBJUTIL_EXPORT
  291. CSeq_loc* SeqLocMergeOne(const CBioseq_Handle& target,
  292.                         const CSeq_loc& loc,
  293.                         TSeqLocFlags flags = 0);
  294. // Merge a set of locations, returning the result.
  295. template<typename LocContainer>
  296. CSeq_loc* SeqLocMerge(const CBioseq_Handle& target,
  297.                       LocContainer& locs,
  298.                       TSeqLocFlags flags = 0)
  299. {
  300.     // create a single Seq-loc holding all the locations
  301.     CSeq_loc temp;
  302.     ITERATE( typename LocContainer, it, locs ) {
  303.         temp.Add(**it);
  304.     }
  305.     return SeqLocMergeOne(target, temp, flags);
  306. }
  307. NCBI_XOBJUTIL_EXPORT
  308. CSeq_loc* SeqLocRevCmp(const CSeq_loc& loc, CScope* scope = 0);
  309. // Get the encoding CDS feature of a given protein sequence.
  310. NCBI_XOBJUTIL_EXPORT
  311. const CSeq_feat* GetCDSForProduct(const CBioseq& product, CScope* scope);
  312. NCBI_XOBJUTIL_EXPORT
  313. const CSeq_feat* GetCDSForProduct(const CBioseq_Handle& product);
  314. // Get the mature peptide feature of a protein
  315. NCBI_XOBJUTIL_EXPORT
  316. const CSeq_feat* GetPROTForProduct(const CBioseq& product, CScope* scope);
  317. NCBI_XOBJUTIL_EXPORT
  318. const CSeq_feat* GetPROTForProduct(const CBioseq_Handle& product);
  319. // Get the encoding mRNA feature of a given mRNA (cDNA) bioseq.
  320. NCBI_XOBJUTIL_EXPORT
  321. const CSeq_feat* GetmRNAForProduct(const CBioseq& product, CScope* scope);
  322. NCBI_XOBJUTIL_EXPORT
  323. const CSeq_feat* GetmRNAForProduct(const CBioseq_Handle& product);
  324. // Get the encoding nucleotide sequnce of a protein.
  325. NCBI_XOBJUTIL_EXPORT
  326. const CBioseq* GetNucleotideParent(const CBioseq& product, CScope* scope);
  327. NCBI_XOBJUTIL_EXPORT
  328. CBioseq_Handle GetNucleotideParent(const CBioseq_Handle& product);
  329. // return the org-ref associated with a given sequence.  This will throw
  330. // a CException if there is no org-ref associated with the sequence
  331. NCBI_XOBJUTIL_EXPORT
  332. const COrg_ref& GetOrg_ref(const CBioseq_Handle& handle);
  333. // return the tax-id associated with a given sequence.  This will return 0
  334. // if no tax-id can be found.
  335. NCBI_XOBJUTIL_EXPORT
  336. int GetTaxId(const CBioseq_Handle& handle);
  337. END_SCOPE(sequence)
  338. // FASTA-format output; see also ReadFasta in <objtools/readers/fasta.hpp>
  339. class NCBI_XOBJUTIL_EXPORT CFastaOstream {
  340. public:
  341.     enum EFlags {
  342.         eAssembleParts   = 0x1,
  343.         eInstantiateGaps = 0x2
  344.     };
  345.     typedef int TFlags; // binary OR of EFlags
  346.     CFastaOstream(CNcbiOstream& out) : m_Out(out), m_Width(70), m_Flags(0) { }
  347.     // Unspecified locations designate complete sequences
  348.     void Write        (const CBioseq_Handle& handle,
  349.                        const CSeq_loc* location = 0);
  350.     void WriteTitle   (const CBioseq_Handle& handle);
  351.     void WriteSequence(const CBioseq_Handle& handle,
  352.                        const CSeq_loc* location = 0);
  353.     // These versions set up a temporary object manager
  354.     void Write(CSeq_entry& entry, const CSeq_loc* location = 0);
  355.     void Write(CBioseq&    seq,   const CSeq_loc* location = 0);
  356.     // Used only by Write(CSeq_entry, ...); permissive by default
  357.     virtual bool SkipBioseq(const CBioseq& /* seq */) { return false; }
  358.     // To adjust various parameters...
  359.     TSeqPos GetWidth   (void) const    { return m_Width;   }
  360.     void    SetWidth   (TSeqPos width) { m_Width = width;  }
  361.     TFlags  GetAllFlags(void) const    { return m_Flags;   }
  362.     void    SetAllFlags(TFlags flags)  { m_Flags = flags;  }
  363.     void    SetFlag    (EFlags flag)   { m_Flags |=  flag; }
  364.     void    ResetFlag  (EFlags flag)   { m_Flags &= ~flag; }
  365. private:
  366.     CNcbiOstream& m_Out;
  367.     TSeqPos       m_Width;
  368.     TFlags        m_Flags;
  369. };
  370. // public interface for coding region translation function
  371. // uses CTrans_table in <objects/seqfeat/Genetic_code_table.hpp>
  372. // for rapid translation from a given genetic code, allowing all
  373. // of the iupac nucleotide ambiguity characters
  374. class NCBI_XOBJUTIL_EXPORT CCdregion_translate
  375. {
  376. public:
  377.     // translation coding region into ncbieaa protein sequence
  378.     static void TranslateCdregion (string& prot,
  379.                                    const CBioseq_Handle& bsh,
  380.                                    const CSeq_loc& loc,
  381.                                    const CCdregion& cdr,
  382.                                    bool include_stop = true,
  383.                                    bool remove_trailing_X = false,
  384.                                    bool* alt_start = 0);
  385.     static void TranslateCdregion(string& prot,
  386.                                   const CSeq_feat& cds,
  387.                                   CScope& scope,
  388.                                   bool include_stop = true,
  389.                                   bool remove_trailing_X = false,
  390.                                   bool* alt_start = 0);
  391.     // return iupac sequence letters under feature location
  392.     static void ReadSequenceByLocation (string& seq,
  393.                                         const CBioseq_Handle& bsh,
  394.                                         const CSeq_loc& loc);
  395. };
  396. class NCBI_XOBJUTIL_EXPORT CSeqTranslator
  397. {
  398. public:
  399.     // translate a string using a specified genetic code
  400.     // if the code is NULL, then the default genetic code is used
  401.     static void Translate(const string& seq,
  402.                           string& prot,
  403.                           const CGenetic_code* code = NULL,
  404.                           bool include_stop = true,
  405.                           bool remove_trailing_X = false);
  406.     // translate a seq-vector using a specified genetic code
  407.     // if the code is NULL, then the default genetic code is used
  408.     static void Translate(const CSeqVector& seq,
  409.                           string& prot,
  410.                           const CGenetic_code* code = NULL,
  411.                           bool include_stop = true,
  412.                           bool remove_trailing_X = false);
  413.     // utility function: translate a given location on a sequence
  414.     static void Translate(const CSeq_loc& loc,
  415.                           const CBioseq_Handle& handle,
  416.                           string& prot,
  417.                           const CGenetic_code* code = NULL,
  418.                           bool include_stop = true,
  419.                           bool remove_trailing_X = false);
  420. };
  421. /// Location relative to a base Seq-loc: one (usually) or more ranges
  422. /// of offsets.
  423. // XXX - handle fuzz?
  424. struct NCBI_XOBJUTIL_EXPORT SRelLoc
  425. {
  426.     enum EFlags {
  427.         fNoMerge = 0x1 ///< don't merge adjacent intervals
  428.     };
  429.     typedef int TFlags; ///< binary OR of EFlags
  430.     /// For relative ranges (ONLY), id is irrelevant and normally unset.
  431.     typedef CSeq_interval         TRange;
  432.     typedef vector<CRef<TRange> > TRanges;
  433.     /// Beware: treats locations corresponding to different sequences as
  434.     /// disjoint, even if one is actually a segment of the other. :-/
  435.     SRelLoc(const CSeq_loc& parent, const CSeq_loc& child, CScope* scope = 0,
  436.             TFlags flags = 0);
  437.     /// For manual work.  As noted above, ranges need not contain any IDs.
  438.     SRelLoc(const CSeq_loc& parent, const TRanges& ranges)
  439.         : m_ParentLoc(&parent), m_Ranges(ranges) { }
  440.     CRef<CSeq_loc> Resolve(CScope* scope = 0, TFlags flags = 0) const
  441.         { return Resolve(*m_ParentLoc, scope, flags); }
  442.     CRef<CSeq_loc> Resolve(const CSeq_loc& new_parent, CScope* scope = 0,
  443.                            TFlags flags = 0) const;
  444.     CConstRef<CSeq_loc> m_ParentLoc;
  445.     TRanges             m_Ranges;
  446. };
  447. //============================================================================//
  448. //                             Sequence Search                                //
  449. //============================================================================//
  450. // CSeqSearch
  451. // ==========
  452. //
  453. // Search a nucleotide sequence for one or more patterns
  454. //
  455. //
  456. //
  457. //
  458. //
  459. //
  460. class NCBI_XOBJUTIL_EXPORT CSeqSearch
  461. {
  462. public:
  463.     
  464.     // Holds information associated with a match, such as the name of the
  465.     // restriction enzyme, location of cut site etc.
  466.     class CMatchInfo
  467.     {
  468.     public:
  469.         // Constructor:
  470.         CMatchInfo(const string& name,
  471.                    const string& pattern,
  472.                    int cut_site,
  473.                    int overhang,
  474.                    ENa_strand strand):
  475.             m_Name(name), m_Pattern(pattern), 
  476.             m_CutSite(cut_site), m_Overhang(overhang), 
  477.             m_Strand(strand)
  478.         {}
  479.             
  480.         // Getters
  481.         const string& GetName(void) const    { return m_Name; }
  482.         const string& GetPattern(void) const { return m_Pattern; }
  483.         int GetCutSite(void) const           { return m_CutSite; }
  484.         int GetOverhang(void) const          { return m_Overhang; }
  485.         ENa_strand GetStrand(void) const     { return m_Strand; }
  486.     private:
  487.         friend class CSeqSearch; 
  488.         string m_Name;
  489.         string m_Pattern;
  490.         int m_CutSite;
  491.         int m_Overhang;
  492.         ENa_strand m_Strand;        
  493.     };  // end of CMatchInfo
  494.     // Client interface:
  495.     // ==================
  496.     // A class that uses the SeqSearch facility should implement the Client 
  497.     // interface and register itself with the search utility to be notified 
  498.     // of matches detection.
  499.     class IClient
  500.     {
  501.     public:
  502.         virtual void MatchFound(const CMatchInfo& match, int position) = 0;
  503.     };
  504.     // Constructors and Destructors:
  505.     CSeqSearch(IClient *client = 0, bool allow_mismatch = false);
  506.     ~CSeqSearch(void);
  507.     // Add nucleotide pattern or restriction site to sequence search.
  508.     // Uses ambiguity codes, e.g., R = A and G, H = A, C and T
  509.     void AddNucleotidePattern(const string& name,
  510.                               const string& pattern, 
  511.                               int cut_site,
  512.                               int overhang);
  513.     // This is a low level search method.
  514.     // The user is responsible for feeding each character in turn,
  515.     // keep track of the position in the text and provide the length in case of
  516.     // a circular topoloy.
  517.     int Search(int current_state, char ch, int position, int length = INT_MAX);
  518.     // Search an entire bioseq.
  519.     void Search(const CBioseq_Handle& bsh);
  520.     // Get / Set the Client.
  521.     const IClient* GetClient() const { return m_Client; }
  522.     void SetClient(IClient* client) { m_Client = client; }
  523. private:
  524.     // Member Functions:
  525.     void InitializeMaps(void);
  526.     void AddNucleotidePattern(const string& name,
  527.                               const string& pattern, 
  528.                               int cut_site,
  529.                               int overhang,
  530.                               ENa_strand strand);
  531.     void ExpandPattern(const string& pattern,
  532.                        string& temp,
  533.                        int position,
  534.                        int pat_len,
  535.                        CMatchInfo& info);
  536.     string ReverseComplement(const string& pattern) const;
  537.     // Member Variables:
  538.     static map<unsigned char, int>  sm_CharToEnum;
  539.     static map<int, unsigned char>  sm_EnumToChar;
  540.     static map<char, char>          sm_Complement;
  541.     bool                 m_AllowOneMismatch;
  542.     size_t               m_MaxPatLen;
  543.     IClient*             m_Client;
  544.     CTextFsm<CMatchInfo> m_Fsa;
  545. }; // end of CSeqSearch
  546. END_SCOPE(objects)
  547. END_NCBI_SCOPE
  548. /*
  549. * ===========================================================================
  550. * $Log: sequence.hpp,v $
  551. * Revision 1000.2  2004/06/01 19:22:17  gouriano
  552. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.44
  553. *
  554. * Revision 1.44  2004/05/06 18:58:31  shomrat
  555. * removed export specifier from templated function
  556. *
  557. * Revision 1.43  2004/05/06 18:34:11  ucko
  558. * Reorder SeqLocMerge<> and SeqLocMergeOne to avoid compilation errors
  559. * on (at least) GCC 3.4.
  560. *
  561. * Revision 1.42  2004/05/06 17:38:37  shomrat
  562. * + Changed SeqLocMerge API
  563. *
  564. * Revision 1.41  2004/04/06 14:03:15  dicuccio
  565. * Added API to extract the single Org-ref from a bioseq handle.  Added API to
  566. * retrieve a single tax-id from a bioseq handle
  567. *
  568. * Revision 1.40  2004/03/25 20:02:30  vasilche
  569. * Added several method variants with CBioseq_Handle as argument.
  570. *
  571. * Revision 1.39  2004/03/01 18:22:07  shomrat
  572. * Added alternative start flag to TranslateCdregion
  573. *
  574. * Revision 1.38  2004/02/19 17:59:40  shomrat
  575. * Added function to reverse a location
  576. *
  577. * Revision 1.37  2004/02/05 19:41:10  shomrat
  578. * Convenience functions for popular overlapping types
  579. *
  580. * Revision 1.36  2004/01/30 17:22:52  dicuccio
  581. * Added sequence::GetId(const CBioseq_Handle&) - returns a selected ID class
  582. * (best, GI).  Added CSeqTranslator - utility class to translate raw sequence
  583. * data
  584. *
  585. * Revision 1.35  2004/01/28 17:17:14  shomrat
  586. * Added SeqLocMerge
  587. *
  588. * Revision 1.34  2003/12/16 19:37:13  shomrat
  589. * Retrieve encoding feature and bioseq of a protein
  590. *
  591. * Revision 1.33  2003/10/15 19:51:13  ucko
  592. * More adjustments to SRelLoc: rearrange so that the constructors appear
  593. * next to each other, and support resolving against an alternate parent.
  594. *
  595. * Revision 1.32  2003/10/09 18:53:24  ucko
  596. * SRelLoc: clarified and doxygen-ized comments
  597. *
  598. * Revision 1.31  2003/10/08 21:07:32  ucko
  599. * CCdregion_translate: take const Bioseq_Handles, since there's no need
  600. * to modify them.
  601. * SRelLoc: add a raw constructor.
  602. *
  603. * Revision 1.30  2003/09/22 18:38:14  grichenk
  604. * Fixed circular seq-locs processing by TestForOverlap()
  605. *
  606. * Revision 1.29  2003/08/21 16:09:44  ucko
  607. * Correct path to header for FASTA reader
  608. *
  609. * Revision 1.28  2003/05/09 15:36:55  ucko
  610. * Take const CBioseq_Handle references in CFastaOstream::Write et al.
  611. *
  612. * Revision 1.27  2003/02/13 14:35:23  grichenk
  613. * + eOverlap_Contains
  614. *
  615. * Revision 1.26  2003/01/22 21:02:44  ucko
  616. * Add a comment about LocationOffset's return value.
  617. *
  618. * Revision 1.25  2003/01/22 20:14:27  vasilche
  619. * Removed compiler warning.
  620. *
  621. * Revision 1.24  2003/01/09 17:48:26  ucko
  622. * Include Seq_interval.hpp rather than just forward-declaring
  623. * CSeq_interval now that we use CRef<CSeq_interval> here.
  624. *
  625. * Revision 1.23  2003/01/08 20:43:05  ucko
  626. * Adjust SRelLoc to use (ID-less) Seq-intervals for ranges, so that it
  627. * will be possible to add support for fuzz and strandedness/orientation.
  628. *
  629. * Revision 1.22  2003/01/03 19:27:45  shomrat
  630. * Added Win32 export specifier where missing
  631. *
  632. * Revision 1.21  2002/12/30 19:38:34  vasilche
  633. * Optimized CGenbankWriter::WriteSequence.
  634. * Implemented GetBestOverlappingFeat() with CSeqFeatData::ESubtype selector.
  635. *
  636. * Revision 1.20  2002/12/27 13:09:59  dicuccio
  637. * Added missing #include for SeqFeatData.hpp
  638. *
  639. * Revision 1.19  2002/12/26 21:45:28  grichenk
  640. * + GetBestOverlappingFeat()
  641. *
  642. * Revision 1.18  2002/12/26 12:44:39  dicuccio
  643. * Added Win32 export specifiers
  644. *
  645. * Revision 1.17  2002/12/23 13:48:34  dicuccio
  646. * Added predeclaration for CSeq_entry.
  647. *
  648. * Revision 1.16  2002/12/20 16:57:36  kans
  649. * ESeqlocPartial, SeqLocPartialCheck added
  650. *
  651. * Revision 1.15  2002/12/09 20:38:34  ucko
  652. * +sequence::LocationOffset
  653. *
  654. * Revision 1.14  2002/11/25 21:24:45  grichenk
  655. * Added TestForOverlap() function.
  656. *
  657. * Revision 1.13  2002/11/18 19:58:40  shomrat
  658. * Add CSeqSearch - a nucleotide search utility
  659. *
  660. * Revision 1.12  2002/11/12 20:00:19  ucko
  661. * +SourceToProduct, ProductToSource, SRelLoc
  662. *
  663. * Revision 1.11  2002/11/04 22:03:34  ucko
  664. * Pull in <objects/seqloc/Na_strand.hpp> rather than relying on previous headers
  665. *
  666. * Revision 1.10  2002/10/23 19:22:52  ucko
  667. * Move the FASTA reader from objects/util/sequence.?pp to
  668. * objects/seqset/Seq_entry.?pp because it doesn't need the OM.
  669. *
  670. * Revision 1.9  2002/10/23 18:23:43  ucko
  671. * Add a FASTA reader (known to compile, but not otherwise tested -- take care)
  672. *
  673. * Revision 1.8  2002/10/08 12:34:18  clausen
  674. * Improved comments
  675. *
  676. * Revision 1.7  2002/10/03 18:45:45  clausen
  677. * Removed extra whitespace
  678. *
  679. * Revision 1.6  2002/10/03 16:33:10  clausen
  680. * Added functions needed by validate
  681. *
  682. * Revision 1.5  2002/09/12 21:38:43  kans
  683. * added CCdregion_translate and CCdregion_translate
  684. *
  685. * Revision 1.4  2002/08/27 21:41:09  ucko
  686. * Add CFastaOstream.
  687. *
  688. * Revision 1.3  2002/06/10 16:30:22  ucko
  689. * Add forward declaration of CBioseq_Handle.
  690. *
  691. * Revision 1.2  2002/06/07 16:09:42  ucko
  692. * Move everything into the "sequence" namespace.
  693. *
  694. * Revision 1.1  2002/06/06 18:43:28  clausen
  695. * Initial version
  696. *
  697. * ===========================================================================
  698. */
  699. #endif  /* SEQUENCE__HPP */