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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_id_tree.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:28:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_OBJMGR___SEQ_ID_TREE__HPP
  10. #define OBJECTS_OBJMGR___SEQ_ID_TREE__HPP
  11. /*  $Id: seq_id_tree.hpp,v 1000.1 2004/04/12 17:28:34 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, Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Seq-id mapper for Object Manager
  40. *
  41. */
  42. #include <corelib/ncbiobj.hpp>
  43. #include <corelib/ncbimtx.hpp>
  44. #include <corelib/ncbistr.hpp>
  45. #include <corelib/ncbi_limits.hpp>
  46. #include <objects/general/Date.hpp>
  47. #include <objects/general/Dbtag.hpp>
  48. #include <objects/general/Object_id.hpp>
  49. #include <objects/biblio/Id_pat.hpp>
  50. #include <objects/seqloc/Seq_id.hpp>
  51. #include <objects/seqloc/PDB_mol_id.hpp>
  52. #include <objects/seqloc/PDB_seq_id.hpp>
  53. #include <objects/seqloc/Patent_seq_id.hpp>
  54. #include <objects/seqloc/Giimport_id.hpp>
  55. #include <objects/seqloc/Textseq_id.hpp>
  56. #include <objmgr/seq_id_handle.hpp>
  57. #include <vector>
  58. #include <set>
  59. #include <map>
  60. BEGIN_NCBI_SCOPE
  61. BEGIN_SCOPE(objects)
  62. class CSeq_id;
  63. class CSeq_id_Handle;
  64. class CSeq_id_Info;
  65. class CSeq_id_Mapper;
  66. class CSeq_id_Which_Tree;
  67. ////////////////////////////////////////////////////////////////////
  68. //
  69. //  CSeq_id_***_Tree::
  70. //
  71. //    Seq-id sub-type specific trees
  72. //
  73. // Base class for seq-id type-specific trees
  74. class NCBI_XOBJMGR_EXPORT CSeq_id_Which_Tree : public CObject
  75. {
  76. public:
  77.     // 'ctors
  78.     CSeq_id_Which_Tree(void);
  79.     virtual ~CSeq_id_Which_Tree(void);
  80.     static void Initialize(vector<CRef<CSeq_id_Which_Tree> >& v);
  81.     virtual bool Empty(void) const = 0;
  82.     // Find exaclty the same seq-id
  83.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const = 0;
  84.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id) = 0;
  85.     virtual CSeq_id_Handle GetGiHandle(int gi);
  86.     virtual void DropInfo(const CSeq_id_Info* info);
  87.     typedef set<CSeq_id_Handle> TSeq_id_MatchList;
  88.     // Get the list of matching seq-id.
  89.     virtual bool HaveMatch(const CSeq_id_Handle& id) const;
  90.     virtual void FindMatch(const CSeq_id_Handle& id,
  91.                            TSeq_id_MatchList& id_list) const = 0;
  92.     virtual void FindMatchStr(string sid,
  93.                               TSeq_id_MatchList& id_list) const = 0;
  94.     virtual bool IsBetterVersion(const CSeq_id_Handle& h1,
  95.                                  const CSeq_id_Handle& h2) const;
  96.     // Reverse matching
  97.     virtual bool HaveReverseMatch(const CSeq_id_Handle& id) const;
  98.     virtual void FindReverseMatch(const CSeq_id_Handle& id,
  99.                                   TSeq_id_MatchList& id_list);
  100. protected:
  101.     friend class CSeq_id_Mapper;
  102.     CSeq_id_Info* CreateInfo(void);
  103.     CSeq_id_Info* CreateInfo(const CSeq_id& id);
  104.     virtual void x_Unindex(const CSeq_id_Info* info) = 0;
  105. /*
  106.     typedef CRWLockPosix TRWLock;
  107.     typedef TRWLock::TReadLockGuard TReadLockGuard;
  108.     typedef TRWLock::TWriteLockGuard TWriteLockGuard;
  109. */
  110.     typedef CMutex TRWLock;
  111.     typedef CMutexGuard TReadLockGuard;
  112.     typedef CMutexGuard TWriteLockGuard;
  113.     mutable TRWLock m_TreeLock;
  114. private:
  115.     CSeq_id_Which_Tree(const CSeq_id_Which_Tree& tree);
  116.     const CSeq_id_Which_Tree& operator=(const CSeq_id_Which_Tree& tree);
  117. };
  118. ////////////////////////////////////////////////////////////////////
  119. // not-set tree (maximum 1 entry allowed)
  120. class CSeq_id_not_set_Tree : public CSeq_id_Which_Tree
  121. {
  122. public:
  123.     CSeq_id_not_set_Tree(void);
  124.     ~CSeq_id_not_set_Tree(void);
  125.     virtual bool Empty(void) const;
  126.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  127.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  128.     virtual void DropInfo(const CSeq_id_Info* info);
  129.     virtual bool HaveMatch(const CSeq_id_Handle& id) const;
  130.     virtual void FindMatch(const CSeq_id_Handle& id,
  131.                            TSeq_id_MatchList& id_list) const;
  132.     virtual void FindMatchStr(string sid,
  133.                               TSeq_id_MatchList& id_list) const;
  134.     virtual bool HaveReverseMatch(const CSeq_id_Handle& id) const;
  135.     virtual void FindReverseMatch(const CSeq_id_Handle& id,
  136.                                   TSeq_id_MatchList& id_list);
  137. protected:
  138.     virtual void x_Unindex(const CSeq_id_Info* info);
  139.     bool x_Check(const CSeq_id& id) const;
  140. };
  141. ////////////////////////////////////////////////////////////////////
  142. // Base class for Gi, Gibbsq & Gibbmt trees
  143. class CSeq_id_int_Tree : public CSeq_id_Which_Tree
  144. {
  145. public:
  146.     CSeq_id_int_Tree(void);
  147.     ~CSeq_id_int_Tree(void);
  148.     virtual bool Empty(void) const;
  149.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  150.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  151.     virtual bool HaveMatch(const CSeq_id_Handle& id) const;
  152.     virtual void FindMatch(const CSeq_id_Handle& id,
  153.                            TSeq_id_MatchList& id_list) const;
  154.     virtual void FindMatchStr(string sid,
  155.                               TSeq_id_MatchList& id_list) const;
  156. protected:
  157.     virtual void x_Unindex(const CSeq_id_Info* info);
  158.     virtual bool x_Check(const CSeq_id& id) const = 0;
  159.     virtual int  x_Get(const CSeq_id& id) const = 0;
  160. private:
  161.     typedef map<int, CSeq_id_Info*> TIntMap;
  162.     TIntMap m_IntMap;
  163. };
  164. ////////////////////////////////////////////////////////////////////
  165. // Gibbsq tree
  166. class CSeq_id_Gibbsq_Tree : public CSeq_id_int_Tree
  167. {
  168. protected:
  169.     virtual bool x_Check(const CSeq_id& id) const;
  170.     virtual int  x_Get(const CSeq_id& id) const;
  171. };
  172. ////////////////////////////////////////////////////////////////////
  173. // Gibbmt tree
  174. class CSeq_id_Gibbmt_Tree : public CSeq_id_int_Tree
  175. {
  176. protected:
  177.     virtual bool x_Check(const CSeq_id& id) const;
  178.     virtual int  x_Get(const CSeq_id& id) const;
  179. };
  180. ////////////////////////////////////////////////////////////////////
  181. // Gi tree
  182. class CSeq_id_Gi_Tree : public CSeq_id_Which_Tree
  183. {
  184. public:
  185.     CSeq_id_Gi_Tree(void);
  186.     ~CSeq_id_Gi_Tree(void);
  187.     virtual bool Empty(void) const;
  188.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  189.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  190.     virtual CSeq_id_Handle GetGiHandle(int gi);
  191.     virtual void DropInfo(const CSeq_id_Info* info);
  192.     virtual bool HaveMatch(const CSeq_id_Handle& id) const;
  193.     virtual void FindMatch(const CSeq_id_Handle& id,
  194.                            TSeq_id_MatchList& id_list) const;
  195.     virtual void FindMatchStr(string sid,
  196.                               TSeq_id_MatchList& id_list) const;
  197. protected:
  198.     virtual void x_Unindex(const CSeq_id_Info* info);
  199.     bool x_Check(const CSeq_id& id) const;
  200.     int  x_Get(const CSeq_id& id) const;
  201.     CConstRef<CSeq_id_Info> m_Info;
  202. };
  203. ////////////////////////////////////////////////////////////////////
  204. // Base class for e_Genbank, e_Embl, e_Pir, e_Swissprot, e_Other,
  205. // e_Ddbj, e_Prf, e_Tpg, e_Tpe, e_Tpd trees
  206. class CSeq_id_Textseq_Tree : public CSeq_id_Which_Tree
  207. {
  208. public:
  209.     CSeq_id_Textseq_Tree(void);
  210.     ~CSeq_id_Textseq_Tree(void);
  211.     virtual bool Empty(void) const;
  212.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  213.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  214.     virtual void FindMatch(const CSeq_id_Handle& id,
  215.                            TSeq_id_MatchList& id_list) const;
  216.     virtual void FindMatchStr(string sid,
  217.                               TSeq_id_MatchList& id_list) const;
  218.     virtual bool IsBetterVersion(const CSeq_id_Handle& h1,
  219.                                  const CSeq_id_Handle& h2) const;
  220.     virtual bool HaveReverseMatch(const CSeq_id_Handle& id) const;
  221.     virtual void FindReverseMatch(const CSeq_id_Handle& id,
  222.                                   TSeq_id_MatchList& id_list);
  223. protected:
  224.     virtual void x_Unindex(const CSeq_id_Info* info);
  225.     virtual bool x_Check(const CSeq_id& id) const = 0;
  226.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const = 0;
  227.     CSeq_id_Info* x_FindInfo(const CTextseq_id& tid) const;
  228. private:
  229.     typedef vector<CSeq_id_Info*>   TVersions;
  230.     typedef map<string, TVersions, PNocase> TStringMap;
  231.     CSeq_id_Info* x_FindVersionEqual(const TVersions& ver_list,
  232.                                      const CTextseq_id& tid) const;
  233.     void x_FindVersionMatch(const TVersions& ver_list,
  234.                             const CTextseq_id& tid,
  235.                             TSeq_id_MatchList& id_list) const;
  236.     TStringMap m_ByAccession;
  237.     TStringMap m_ByName; // Used for searching by string
  238. };
  239. ////////////////////////////////////////////////////////////////////
  240. // Genbank, EMBL and DDBJ joint tree
  241. class CSeq_id_GB_Tree : public CSeq_id_Textseq_Tree
  242. {
  243. protected:
  244.     virtual bool x_Check(const CSeq_id& id) const;
  245.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  246. };
  247. ////////////////////////////////////////////////////////////////////
  248. // Pir tree
  249. class CSeq_id_Pir_Tree : public CSeq_id_Textseq_Tree
  250. {
  251. protected:
  252.     virtual bool x_Check(const CSeq_id& id) const;
  253.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  254. };
  255. ////////////////////////////////////////////////////////////////////
  256. // Swissprot
  257. class CSeq_id_Swissprot_Tree : public CSeq_id_Textseq_Tree
  258. {
  259. protected:
  260.     virtual bool x_Check(const CSeq_id& id) const;
  261.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  262. };
  263. ////////////////////////////////////////////////////////////////////
  264. // Prf tree
  265. class CSeq_id_Prf_Tree : public CSeq_id_Textseq_Tree
  266. {
  267. protected:
  268.     virtual bool x_Check(const CSeq_id& id) const;
  269.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  270. };
  271. ////////////////////////////////////////////////////////////////////
  272. // Tpg tree
  273. class CSeq_id_Tpg_Tree : public CSeq_id_Textseq_Tree
  274. {
  275. protected:
  276.     virtual bool x_Check(const CSeq_id& id) const;
  277.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  278. };
  279. ////////////////////////////////////////////////////////////////////
  280. // Tpe tree
  281. class CSeq_id_Tpe_Tree : public CSeq_id_Textseq_Tree
  282. {
  283. protected:
  284.     virtual bool x_Check(const CSeq_id& id) const;
  285.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  286. };
  287. ////////////////////////////////////////////////////////////////////
  288. // Tpd tree
  289. class CSeq_id_Tpd_Tree : public CSeq_id_Textseq_Tree
  290. {
  291. protected:
  292.     virtual bool x_Check(const CSeq_id& id) const;
  293.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  294. };
  295. ////////////////////////////////////////////////////////////////////
  296. // Other tree
  297. class CSeq_id_Other_Tree : public CSeq_id_Textseq_Tree
  298. {
  299. protected:
  300.     virtual bool x_Check(const CSeq_id& id) const;
  301.     virtual const CTextseq_id& x_Get(const CSeq_id& id) const;
  302. };
  303. ////////////////////////////////////////////////////////////////////
  304. // e_Local tree
  305. class CSeq_id_Local_Tree : public CSeq_id_Which_Tree
  306. {
  307. public:
  308.     CSeq_id_Local_Tree(void);
  309.     ~CSeq_id_Local_Tree(void);
  310.     virtual bool Empty(void) const;
  311.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  312.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  313.     virtual bool HaveMatch(const CSeq_id_Handle& id) const;
  314.     virtual void FindMatch(const CSeq_id_Handle& id,
  315.                            TSeq_id_MatchList& id_list) const;
  316.     virtual void FindMatchStr(string sid,
  317.                               TSeq_id_MatchList& id_list) const;
  318. private:
  319.     virtual void x_Unindex(const CSeq_id_Info* info);
  320.     CSeq_id_Info* x_FindInfo(const CObject_id& oid) const;
  321.     typedef map<string, CSeq_id_Info*, PNocase> TByStr;
  322.     typedef map<int, CSeq_id_Info*>    TById;
  323.     TByStr m_ByStr;
  324.     TById  m_ById;
  325. };
  326. ////////////////////////////////////////////////////////////////////
  327. // e_General tree
  328. class CSeq_id_General_Tree : public CSeq_id_Which_Tree
  329. {
  330. public:
  331.     CSeq_id_General_Tree(void);
  332.     ~CSeq_id_General_Tree(void);
  333.     virtual bool Empty(void) const;
  334.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  335.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  336.     virtual bool HaveMatch(const CSeq_id_Handle& id) const;
  337.     virtual void FindMatch(const CSeq_id_Handle& id,
  338.                            TSeq_id_MatchList& id_list) const;
  339.     virtual void FindMatchStr(string sid,
  340.                               TSeq_id_MatchList& id_list) const;
  341. private:
  342.     virtual void x_Unindex(const CSeq_id_Info* info);
  343.     CSeq_id_Info* x_FindInfo(const CDbtag& dbid) const;
  344.     struct STagMap {
  345.     public:
  346.         typedef map<string, CSeq_id_Info*, PNocase> TByStr;
  347.         typedef map<int, CSeq_id_Info*>    TById;
  348.         TByStr m_ByStr;
  349.         TById  m_ById;
  350.     };
  351.     typedef map<string, STagMap, PNocase> TDbMap;
  352.     TDbMap m_DbMap;
  353. };
  354. ////////////////////////////////////////////////////////////////////
  355. // e_Giim tree
  356. class CSeq_id_Giim_Tree : public CSeq_id_Which_Tree
  357. {
  358. public:
  359.     CSeq_id_Giim_Tree(void);
  360.     ~CSeq_id_Giim_Tree(void);
  361.     virtual bool Empty(void) const;
  362.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  363.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  364.     virtual bool HaveMatch(const CSeq_id_Handle& ) const;
  365.     virtual void FindMatch(const CSeq_id_Handle& id,
  366.                            TSeq_id_MatchList& id_list) const;
  367.     virtual void FindMatchStr(string sid,
  368.                               TSeq_id_MatchList& id_list) const;
  369. private:
  370.     virtual void x_Unindex(const CSeq_id_Info* info);
  371.     CSeq_id_Info* x_FindInfo(const CGiimport_id& gid) const;
  372.     // 2-level indexing: first by Id, second by Db+Release
  373.     typedef vector<CSeq_id_Info*> TGiimList;
  374.     typedef map<int, TGiimList>  TIdMap;
  375.     TIdMap m_IdMap;
  376. };
  377. ////////////////////////////////////////////////////////////////////
  378. // e_Patent tree
  379. class CSeq_id_Patent_Tree : public CSeq_id_Which_Tree
  380. {
  381. public:
  382.     CSeq_id_Patent_Tree(void);
  383.     ~CSeq_id_Patent_Tree(void);
  384.     virtual bool Empty(void) const;
  385.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  386.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  387.     virtual bool HaveMatch(const CSeq_id_Handle& ) const;
  388.     virtual void FindMatch(const CSeq_id_Handle& id,
  389.                            TSeq_id_MatchList& id_list) const;
  390.     virtual void FindMatchStr(string sid,
  391.                               TSeq_id_MatchList& id_list) const;
  392. private:
  393.     virtual void x_Unindex(const CSeq_id_Info* info);
  394.     CSeq_id_Info* x_FindInfo(const CPatent_seq_id& pid) const;
  395.     // 3-level indexing: country, (number|app_number), seqid.
  396.     // Ignoring patent doc-type in indexing.
  397.     struct SPat_idMap {
  398.         typedef map<int, CSeq_id_Info*> TBySeqid;
  399.         typedef map<string, TBySeqid, PNocase> TByNumber; // or by App_number
  400.         TByNumber m_ByNumber;
  401.         TByNumber m_ByApp_number;
  402.     };
  403.     typedef map<string, SPat_idMap, PNocase> TByCountry;
  404.     TByCountry m_CountryMap;
  405. };
  406. ////////////////////////////////////////////////////////////////////
  407. // e_PDB tree
  408. class CSeq_id_PDB_Tree : public CSeq_id_Which_Tree
  409. {
  410. public:
  411.     CSeq_id_PDB_Tree(void);
  412.     ~CSeq_id_PDB_Tree(void);
  413.     virtual bool Empty(void) const;
  414.     virtual CSeq_id_Handle FindInfo(const CSeq_id& id) const;
  415.     virtual CSeq_id_Handle FindOrCreate(const CSeq_id& id);
  416.     virtual void FindMatch(const CSeq_id_Handle& id,
  417.                            TSeq_id_MatchList& id_list) const;
  418.     virtual void FindMatchStr(string sid,
  419.                               TSeq_id_MatchList& id_list) const;
  420. private:
  421.     virtual void x_Unindex(const CSeq_id_Info* info);
  422.     CSeq_id_Info* x_FindInfo(const CPDB_seq_id& pid) const;
  423.     string x_IdToStrKey(const CPDB_seq_id& id) const;
  424.     // Index by mol+chain, no date - too complicated
  425.     typedef vector<CSeq_id_Info*>  TSubMolList;
  426.     typedef map<string, TSubMolList, PNocase> TMolMap;
  427.     TMolMap m_MolMap;
  428. };
  429. /////////////////////////////////////////////////////////////////////////////
  430. //
  431. // Inline methods
  432. //
  433. /////////////////////////////////////////////////////////////////////////////
  434. END_SCOPE(objects)
  435. END_NCBI_SCOPE
  436. /*
  437. * ---------------------------------------------------------------------------
  438. * $Log: seq_id_tree.hpp,v $
  439. * Revision 1000.1  2004/04/12 17:28:34  gouriano
  440. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.5
  441. *
  442. * Revision 1.5  2004/02/19 17:25:34  vasilche
  443. * Use CRef<> to safely hold pointer to CSeq_id_Info.
  444. * CSeq_id_Info holds pointer to owner CSeq_id_Which_Tree.
  445. * Reduce number of calls to CSeq_id_Handle.GetSeqId().
  446. *
  447. * Revision 1.4  2004/02/10 21:15:15  grichenk
  448. * Added reverse ID matching.
  449. *
  450. * Revision 1.3  2004/01/08 02:49:11  ucko
  451. * Make m_TreeLock a recursive mutex, as CSeq_id_Textseq_Tree can no
  452. * longer safely use a fast mutex.
  453. *
  454. * Revision 1.2  2003/09/30 16:22:01  vasilche
  455. * Updated internal object manager classes to be able to load ID2 data.
  456. * SNP blobs are loaded as ID2 split blobs - readers convert them automatically.
  457. * Scope caches results of requests for data to data loaders.
  458. * Optimized CSeq_id_Handle for gis.
  459. * Optimized bioseq lookup in scope.
  460. * Reduced object allocations in annotation iterators.
  461. * CScope is allowed to be destroyed before other objects using this scope are
  462. * deleted (feature iterators, bioseq handles etc).
  463. * Optimized lookup for matching Seq-ids in CSeq_id_Mapper.
  464. * Added 'adaptive' option to objmgr_demo application.
  465. *
  466. * Revision 1.1  2003/06/10 19:06:35  vasilche
  467. * Simplified CSeq_id_Mapper and CSeq_id_Handle.
  468. *
  469. *
  470. * ===========================================================================
  471. */
  472. #endif  /* OBJECTS_OBJMGR___SEQ_ID_TREE__HPP */