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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: snp_annot_info.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:22:14  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SNP_ANNOT_INFO__HPP
  10. #define SNP_ANNOT_INFO__HPP
  11. /*  $Id: snp_annot_info.hpp,v 1000.2 2004/06/01 19:22:14 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: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   SNP Seq-annot object information
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <corelib/ncbi_limits.hpp>
  44. #include <util/range.hpp>
  45. #include <vector>
  46. #include <map>
  47. #include <algorithm>
  48. #include <objects/seqloc/Seq_id.hpp>
  49. #include <objmgr/impl/tse_info_object.hpp>
  50. BEGIN_NCBI_SCOPE
  51. class CObjectIStream;
  52. class IWriter;
  53. class IReader;
  54. BEGIN_SCOPE(objects)
  55. class CSeq_entry;
  56. class CSeq_feat;
  57. class CSeq_annot;
  58. class CSeq_annot_Info;
  59. class CSeq_annot_SNP_Info;
  60. class CSeq_point;
  61. class CSeq_interval;
  62. struct NCBI_XOBJMGR_EXPORT SSNP_Info
  63. {
  64. public:
  65.     typedef CRange<TSeqPos> TRange;
  66.     TSeqPos GetFrom(void) const;
  67.     TSeqPos GetTo(void) const;
  68.     bool MinusStrand(void) const;
  69.     bool operator<(const SSNP_Info& snp) const;
  70.     bool operator<(TSeqPos end_position) const;
  71.     bool NoMore(const TRange& range) const;
  72.     bool NotThis(const TRange& range) const;
  73.     // type of SNP feature returned by parsing method
  74.     enum ESNP_Type {
  75.         eSNP_Simple,
  76.         eSNP_Bad_WrongMemberSet,
  77.         eSNP_Bad_WrongTextId,
  78.         eSNP_Complex_HasComment,
  79.         eSNP_Complex_LocationIsNotPoint,
  80.         eSNP_Complex_LocationIsNotGi,
  81.         eSNP_Complex_LocationGiIsBad,
  82.         eSNP_Complex_LocationStrandIsBad,
  83.         eSNP_Complex_IdCountTooLarge,
  84.         eSNP_Complex_IdCountIsNotOne,
  85.         eSNP_Complex_AlleleLengthBad,
  86.         eSNP_Complex_AlleleCountTooLarge,
  87.         eSNP_Complex_AlleleCountIsNonStandard,
  88.         eSNP_Complex_WeightBadValue,
  89.         eSNP_Complex_WeightCountIsNotOne,
  90.         eSNP_Type_last
  91.     };
  92.     // names of types for logging
  93.     static const char* const s_SNP_Type_Label[eSNP_Type_last];
  94.     // parser, if returned value is eSNP_Simple, then
  95.     // other members are filled and can be stored.
  96.     ESNP_Type ParseSeq_feat(const CSeq_feat& feat,
  97.                             CSeq_annot_SNP_Info& annot_info);
  98.     // restore Seq-feat object from parsed info.
  99.     CRef<CSeq_feat>
  100.     CreateSeq_feat(const CSeq_annot_SNP_Info& annot_info) const;
  101.     void UpdateSeq_feat(CRef<CSeq_feat>& seq_feat,
  102.                         const CSeq_annot_SNP_Info& annot_info) const;
  103.     void UpdateSeq_feat(CRef<CSeq_feat>& seq_feat,
  104.                         CRef<CSeq_point>& seq_point,
  105.                         CRef<CSeq_interval>& seq_interval,
  106.                         const CSeq_annot_SNP_Info& annot_info) const;
  107.     
  108.     CRef<CSeq_feat> x_CreateSeq_feat(void) const;
  109.     void x_UpdateSeq_featData(CSeq_feat& feat,
  110.                               const CSeq_annot_SNP_Info& annot_info) const;
  111.     void x_UpdateSeq_feat(CSeq_feat& feat,
  112.                           const CSeq_annot_SNP_Info& annot_info) const;
  113.     void x_UpdateSeq_feat(CSeq_feat& feat,
  114.                           CRef<CSeq_point>& seq_point,
  115.                           CRef<CSeq_interval>& seq_interval,
  116.                           const CSeq_annot_SNP_Info& annot_info) const;
  117.     typedef int TSNPId;
  118.     typedef Int1 TPositionDelta;
  119.     enum {
  120.         kMax_PositionDelta = kMax_I1
  121.     };
  122.     typedef Uint1 TCommentIndex;
  123.     enum {
  124.         kNo_CommentIndex   = kMax_UI1,
  125.         kMax_CommentIndex  = kNo_CommentIndex - 1,
  126.         kMax_CommentLength = 65530
  127.     };
  128.     typedef Uint1 TAlleleIndex;
  129.     enum {
  130.         kNo_AlleleIndex    = kMax_UI1,
  131.         kMax_AlleleIndex   = kNo_AlleleIndex - 1,
  132.         kMax_AlleleLength  = 5
  133.     };
  134.     enum {
  135.         kMax_AllelesCount  = 4
  136.     };
  137.     typedef Uint1 TWeight;
  138.     enum {
  139.         kMax_Weight        = kMax_I1
  140.     };
  141.     typedef Uint1 TFlags;
  142.     enum FFlags {
  143.         fMinusStrand = 1,
  144.         fQualReplace = 2
  145.     };
  146.     TSeqPos         m_ToPosition;
  147.     TSNPId          m_SNP_Id;
  148.     TFlags          m_Flags;
  149.     TPositionDelta  m_PositionDelta;
  150.     TCommentIndex   m_CommentIndex;
  151.     TWeight         m_Weight;
  152.     TAlleleIndex    m_AllelesIndices[kMax_AllelesCount];
  153. };
  154. class CIndexedStrings
  155. {
  156. public:
  157.     void ClearIndices(void)
  158.         {
  159.             m_Indices.clear();
  160.         }
  161.     void Clear(void)
  162.         {
  163.             ClearIndices();
  164.             m_Strings.clear();
  165.         }
  166.     bool IsEmpty(void) const
  167.         {
  168.             return m_Strings.empty();
  169.         }
  170.     size_t GetSize(void) const
  171.         {
  172.             return m_Strings.size();
  173.         }
  174.     size_t GetIndex(const string& s, size_t max_index);
  175.     const string& GetString(size_t index) const
  176.         {
  177.             return m_Strings[index];
  178.         }
  179.     void StoreTo(CNcbiOstream& stream) const;
  180.     void LoadFrom(CNcbiIstream& stream, size_t max_index, size_t max_length);
  181. private:
  182.     typedef vector<string> TStrings;
  183.     typedef map<string, size_t> TIndices;
  184.     TStrings m_Strings;
  185.     TIndices m_Indices;
  186. };
  187. class NCBI_XOBJMGR_EXPORT CSeq_annot_SNP_Info : public CTSE_Info_Object
  188. {
  189.     typedef CTSE_Info_Object TParent;
  190. public:
  191.     CSeq_annot_SNP_Info(void);
  192.     CSeq_annot_SNP_Info(const CSeq_annot_SNP_Info& info);
  193.     ~CSeq_annot_SNP_Info(void);
  194.     const CSeq_annot_Info& GetParentSeq_annot_Info(void) const;
  195.     CSeq_annot_Info& GetParentSeq_annot_Info(void);
  196.     const CSeq_entry_Info& GetParentSeq_entry_Info(void) const;
  197.     CSeq_entry_Info& GetParentSeq_entry_Info(void);
  198.     // tree initialization
  199.     void x_ParentAttach(CSeq_annot_Info& parent);
  200.     void x_ParentDetach(CSeq_annot_Info& parent);
  201.     void x_UpdateAnnotIndexContents(CTSE_Info& tse);
  202.     void x_UnmapAnnotObjects(CTSE_Info& tse);
  203.     void x_DropAnnotObjects(CTSE_Info& tse);
  204.     typedef vector<SSNP_Info> TSNP_Set;
  205.     typedef TSNP_Set::const_iterator const_iterator;
  206.     typedef CRange<TSeqPos> TRange;
  207.     bool empty(void) const;
  208.     const_iterator begin(void) const;
  209.     const_iterator end(void) const;
  210.     const_iterator FirstIn(const TRange& range) const;
  211.     int GetGi(void) const;
  212.     const CSeq_id& GetSeq_id(void) const;
  213.     const SSNP_Info& GetSNP_Info(size_t index) const;
  214.     const CSeq_annot& GetRemainingSeq_annot(void) const;
  215.     void Reset(void);
  216. protected:
  217.     SSNP_Info::TCommentIndex x_GetCommentIndex(const string& comment);
  218.     const string& x_GetComment(SSNP_Info::TCommentIndex index) const;
  219.     SSNP_Info::TAlleleIndex x_GetAlleleIndex(const string& allele);
  220.     const string& x_GetAllele(SSNP_Info::TAlleleIndex index) const;
  221.     bool x_CheckGi(int gi);
  222.     void x_SetGi(int gi);
  223.     void x_AddSNP(const SSNP_Info& snp_info);
  224.     void x_DoUpdateObject(void);
  225. private:
  226.     CSeq_annot_SNP_Info& operator=(const CSeq_annot_SNP_Info&);
  227.     friend class CSeq_annot_Info;
  228.     friend class CSeq_annot_SNP_Info_Reader;
  229.     friend class CSNP_Seq_feat_hook;
  230.     friend struct SSNP_Info;
  231.     friend class CSeq_feat_Handle;
  232.     int                         m_Gi;
  233.     CRef<CSeq_id>               m_Seq_id;
  234.     TSNP_Set                    m_SNP_Set;
  235.     CIndexedStrings             m_Comments;
  236.     CIndexedStrings             m_Alleles;
  237.     CRef<CSeq_annot>            m_Seq_annot;
  238. };
  239. /////////////////////////////////////////////////////////////////////////////
  240. // SSNP_Info
  241. /////////////////////////////////////////////////////////////////////////////
  242. inline
  243. TSeqPos SSNP_Info::GetFrom(void) const
  244. {
  245.     return m_ToPosition - m_PositionDelta;
  246. }
  247. inline
  248. TSeqPos SSNP_Info::GetTo(void) const
  249. {
  250.     return m_ToPosition;
  251. }
  252. inline
  253. bool SSNP_Info::MinusStrand(void) const
  254. {
  255.     return (m_Flags & fMinusStrand) != 0;
  256. }
  257. inline
  258. bool SSNP_Info::operator<(const SSNP_Info& snp) const
  259. {
  260.     return m_ToPosition < snp.m_ToPosition;
  261. }
  262. inline
  263. bool SSNP_Info::operator<(TSeqPos to_position) const
  264. {
  265.     return m_ToPosition < to_position;
  266. }
  267. inline
  268. bool SSNP_Info::NoMore(const TRange& range) const
  269. {
  270.     return GetTo() >= min(kInvalidSeqPos-kMax_PositionDelta,
  271.                           range.GetToOpen()) + kMax_PositionDelta;
  272. }
  273. inline
  274. bool SSNP_Info::NotThis(const TRange& range) const
  275. {
  276.     return GetFrom() >= range.GetToOpen();
  277. }
  278. /////////////////////////////////////////////////////////////////////////////
  279. // CSeq_annot_SNP_Info
  280. /////////////////////////////////////////////////////////////////////////////
  281. inline
  282. bool CSeq_annot_SNP_Info::empty(void) const
  283. {
  284.     return m_SNP_Set.empty();
  285. }
  286. inline
  287. CSeq_annot_SNP_Info::const_iterator
  288. CSeq_annot_SNP_Info::begin(void) const
  289. {
  290.     return m_SNP_Set.begin();
  291. }
  292. inline
  293. CSeq_annot_SNP_Info::const_iterator
  294. CSeq_annot_SNP_Info::end(void) const
  295. {
  296.     return m_SNP_Set.end();
  297. }
  298. inline
  299. CSeq_annot_SNP_Info::const_iterator
  300. CSeq_annot_SNP_Info::FirstIn(const CRange<TSeqPos>& range) const
  301. {
  302.     return lower_bound(m_SNP_Set.begin(), m_SNP_Set.end(), range.GetFrom());
  303. }
  304. inline
  305. int CSeq_annot_SNP_Info::GetGi(void) const
  306. {
  307.     return m_Gi;
  308. }
  309. inline
  310. const CSeq_id& CSeq_annot_SNP_Info::GetSeq_id(void) const
  311. {
  312.     return *m_Seq_id;
  313. }
  314. inline
  315. bool CSeq_annot_SNP_Info::x_CheckGi(int gi)
  316. {
  317.     if ( gi == m_Gi ) {
  318.         return true;
  319.     }
  320.     if ( m_Gi < 0 ) {
  321.         x_SetGi(gi);
  322.         return true;
  323.     }
  324.     return false;
  325. }
  326. inline
  327. const CSeq_annot& CSeq_annot_SNP_Info::GetRemainingSeq_annot(void) const
  328. {
  329.     return *m_Seq_annot;
  330. }
  331. inline
  332. SSNP_Info::TCommentIndex
  333. CSeq_annot_SNP_Info::x_GetCommentIndex(const string& comment)
  334. {
  335.     return comment.size() > SSNP_Info::kMax_CommentLength?
  336.         SSNP_Info::kNo_CommentIndex:
  337.         m_Comments.GetIndex(comment, SSNP_Info::kMax_CommentIndex);
  338. }
  339. inline
  340. const string&
  341. CSeq_annot_SNP_Info::x_GetComment(SSNP_Info::TCommentIndex index) const
  342. {
  343.     return m_Comments.GetString(index);
  344. }
  345. inline
  346. const string&
  347. CSeq_annot_SNP_Info::x_GetAllele(SSNP_Info::TAlleleIndex index) const
  348. {
  349.     return m_Alleles.GetString(index);
  350. }
  351. inline
  352. void CSeq_annot_SNP_Info::x_AddSNP(const SSNP_Info& snp_info)
  353. {
  354.     m_SNP_Set.push_back(snp_info);
  355. }
  356. inline
  357. const SSNP_Info& CSeq_annot_SNP_Info::GetSNP_Info(size_t index) const
  358. {
  359.     _ASSERT(index < m_SNP_Set.size());
  360.     return m_SNP_Set[index];
  361. }
  362. END_SCOPE(objects)
  363. END_NCBI_SCOPE
  364. /*
  365. * ---------------------------------------------------------------------------
  366. * $Log: snp_annot_info.hpp,v $
  367. * Revision 1000.2  2004/06/01 19:22:14  gouriano
  368. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  369. *
  370. * Revision 1.14  2004/05/04 18:08:47  grichenk
  371. * Added CSeq_feat_Handle, CSeq_align_Handle and CSeq_graph_Handle
  372. *
  373. * Revision 1.13  2004/03/24 18:30:29  vasilche
  374. * Fixed edit API.
  375. * Every *_Info object has its own shallow copy of original object.
  376. *
  377. * Revision 1.12  2004/03/16 15:47:27  vasilche
  378. * Added CBioseq_set_Handle and set of EditHandles
  379. *
  380. * Revision 1.11  2004/02/06 16:13:19  vasilche
  381. * Added parsing "replace" as a synonym of "allele" in SNP qualifiers.
  382. * More compact format of SNP table in cache. SNP table version increased.
  383. * Fixed null pointer exception when SNP features are loaded from cache.
  384. *
  385. * Revision 1.10  2004/01/28 20:54:35  vasilche
  386. * Fixed mapping of annotations.
  387. *
  388. * Revision 1.9  2004/01/13 16:55:31  vasilche
  389. * CReader, CSeqref and some more classes moved from xobjmgr to separate lib.
  390. * Headers moved from include/objmgr to include/objtools/data_loaders/genbank.
  391. *
  392. * Revision 1.8  2003/10/21 16:29:14  vasilche
  393. * Added check for errors in SNP table loaded from cache.
  394. *
  395. * Revision 1.7  2003/10/21 14:27:35  vasilche
  396. * Added caching of gi -> sat,satkey,version resolution.
  397. * SNP blobs are stored in cache in preprocessed format (platform dependent).
  398. * Limit number of connections to GenBank servers.
  399. * Added collection of ID1 loader statistics.
  400. *
  401. * Revision 1.6  2003/09/30 16:22:01  vasilche
  402. * Updated internal object manager classes to be able to load ID2 data.
  403. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  404. * Scope caches results of requests for data to data loaders.
  405. * Optimized CSeq_id_Handle for gis.
  406. * Optimized bioseq lookup in scope.
  407. * Reduced object allocations in annotation iterators.
  408. * CScope is allowed to be destroyed before other objects using this scope are
  409. * deleted (feature iterators, bioseq handles etc).
  410. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  411. * Added 'adaptive' option to objmgr_demo application.
  412. *
  413. * Revision 1.5  2003/08/27 14:28:51  vasilche
  414. * Reduce amount of object allocations in feature iteration.
  415. *
  416. * Revision 1.4  2003/08/15 19:34:53  vasilche
  417. * Added missing #include <algorigm>
  418. *
  419. * Revision 1.3  2003/08/15 19:19:15  vasilche
  420. * Fixed memory leak in string packing hooks.
  421. * Fixed processing of 'partial' flag of features.
  422. * Allow table packing of non-point SNP.
  423. * Allow table packing of SNP with long alleles.
  424. *
  425. * Revision 1.2  2003/08/14 21:26:04  kans
  426. * fixed inconsistent line endings that stopped Mac compiler
  427. *
  428. * Revision 1.1  2003/08/14 20:05:19  vasilche
  429. * Simple SNP features are stored as table internally.
  430. * They are recreated when needed using CFeat_CI.
  431. *
  432. * ===========================================================================
  433. */
  434. #endif  // SNP_ANNOT_INFO__HPP