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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cache.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:27:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef NCBI_TAXON1_CACHE_HPP
  10. #define NCBI_TAXON1_CACHE_HPP
  11. /* $Id: cache.hpp,v 1000.1 2004/04/12 17:27:03 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:  Vladimir Soussov, Michael Domrachev
  37.  *
  38.  * File Description:
  39.  *     NCBI Taxonomy information retreival library caching mechanism
  40.  *
  41.  */
  42. #include <objects/taxon1/taxon1.hpp>
  43. #include <objects/seqfeat/seqfeat__.hpp>
  44. #include "ctreecont.hpp"
  45. #include <map>
  46. BEGIN_NCBI_SCOPE
  47. BEGIN_objects_SCOPE
  48. class CTaxon1Node;
  49. class COrgRefCache
  50. {
  51. public:
  52.     COrgRefCache( CTaxon1& host );
  53.     bool Init( unsigned nCapacity = 10 );
  54.     bool Lookup( int tax_id, CTaxon1Node** ppNode );
  55.     bool LookupAndAdd( int tax_id, CTaxon1Node** ppData );
  56.     bool LookupAndInsert( int tax_id, CTaxon1_data** ppData );
  57.     bool LookupAndInsert( int tax_id, CTaxon2_data** ppData );
  58.     bool Lookup( int tax_id, CTaxon1_data** ppData );
  59.     bool Lookup( int tax_id, CTaxon2_data** ppData );
  60.     bool Insert1( CTaxon1Node& node );
  61.     bool Insert2( CTaxon1Node& node );
  62.     // Rank stuff
  63.     const char* GetRankName( int rank ) const;
  64.     int GetSuperkingdomRank() const { return m_nSuperkingdomRank; }
  65.     int GetFamilyRank() const { return m_nFamilyRank; }
  66.     int GetOrderRank() const { return m_nOrderRank; }
  67.     int GetClassRank() const { return m_nClassRank; }
  68.     int GetGenusRank() const { return m_nGenusRank; }
  69.     int GetSubgenusRank() const { return m_nSubgenusRank; }
  70.     int GetSpeciesRank() const { return m_nSpeciesRank; }
  71.     int GetSubspeciesRank() const { return m_nSubspeciesRank; }
  72.     int GetFormaRank() const { return m_nFormaRank; }
  73.     int GetVarietyRank() const { return m_nVarietyRank; }
  74.     const char* GetNameClassName( short nc ) const;
  75.     short GetPreferredCommonNameClass() const { return m_ncPrefCommon; }
  76.     short GetCommonNameClass() const { return m_ncCommon; }
  77.     short GetSynonymNameClass() const { return m_ncSynonym; }
  78.     short GetGBAcronymNameClass() const { return m_ncGBAcronym; }
  79.     short GetGBSynonymNameClass() const { return m_ncGBSynonym; }
  80.     short GetGBAnamorphNameClass() const { return m_ncGBAnamorph; }
  81.     const char* GetDivisionName( short div_id ) const;
  82.     const char* GetDivisionCode( short div_id ) const;
  83.     short GetVirusesDivision() const { return m_divViruses; }
  84.     short GetPhagesDivision() const { return m_divPhages; }
  85.     CTreeCont& GetTree() { return m_tPartTree; }
  86.     const CTreeCont& GetTree() const { return m_tPartTree; }
  87.     void  SetIndexEntry( int id, CTaxon1Node* pNode );
  88.     COrgMod::ESubtype GetSubtypeFromName( string& sName );
  89. private:
  90.     friend class CTaxon1Node;
  91.     struct SCacheEntry {
  92.         friend class CTaxon1Node;
  93.         CRef< CTaxon1_data > m_pTax1;
  94.         CRef< CTaxon2_data > m_pTax2;
  95.         CTaxon1Node*  m_pTreeNode;
  96.         //  COrg_ref* p_org_ref;
  97.         //  bool is_uncultured;
  98.         //  bool is_species;
  99.         //  bool has_modif;
  100.         //  list< string > blast_name;
  101.         CTaxon1_data* GetData1();
  102.         CTaxon2_data* GetData2();
  103.     };
  104.     CTaxon1&           m_host;
  105.     unsigned           m_nMaxTaxId;
  106.     CTaxon1Node**      m_ppEntries; // index by tax_id
  107.     CTreeCont          m_tPartTree; // Partial tree
  108.     unsigned           m_nCacheCapacity; // Max number of elements in cache
  109.     list<SCacheEntry*> m_lCache; // LRU list
  110.     bool             BuildOrgRef( CTaxon1Node& node, COrg_ref& org,
  111.                                   bool& is_species );
  112.     bool             BuildOrgModifier( CTaxon1Node* pNode,
  113.                                        COrgName& on,
  114.                                        CTaxon1Node* pParent = NULL );
  115.     bool             SetBinomialName( CTaxon1Node& node, COrgName& on );
  116.     bool             SetPartialName( CTaxon1Node& node, COrgName& on );
  117.     // Rank stuff
  118.     int m_nSuperkingdomRank;
  119.     int m_nFamilyRank;
  120.     int m_nOrderRank;
  121.     int m_nClassRank;
  122.     int m_nGenusRank;
  123.     int m_nSubgenusRank;
  124.     int m_nSpeciesRank;
  125.     int m_nSubspeciesRank;
  126.     int m_nFormaRank;
  127.     int m_nVarietyRank;
  128.     typedef map<int, string> TRankMap;
  129.     typedef TRankMap::const_iterator TRankMapCI;
  130.     typedef TRankMap::iterator TRankMapI;
  131.     TRankMap m_rankStorage;
  132.     bool     InitRanks();
  133.     int      FindRankByName( const char* pchName ) const;
  134.     // Name classes stuff
  135.     short m_ncPrefCommon; // now called "genbank common name"
  136.     short m_ncCommon;
  137.     short m_ncSynonym;
  138.     short m_ncGBAcronym;
  139.     short m_ncGBSynonym;
  140.     short m_ncGBAnamorph;
  141.     typedef map<short, string> TNameClassMap;
  142.     typedef TNameClassMap::const_iterator TNameClassMapCI;
  143.     typedef TNameClassMap::iterator TNameClassMapI;
  144.     TNameClassMap m_ncStorage;
  145.     bool     InitNameClasses();
  146.     short    FindNameClassByName( const char* pchName ) const;
  147.     // Division stuff
  148.     short m_divViruses;
  149.     short m_divPhages;
  150.     struct SDivision {
  151.         string m_sCode;
  152.         string m_sName;
  153.     };
  154.     typedef map<short, struct SDivision> TDivisionMap;
  155.     typedef TDivisionMap::const_iterator TDivisionMapCI;
  156.     typedef TDivisionMap::iterator TDivisionMapI;
  157.     TDivisionMap m_divStorage;
  158.     bool     InitDivisions();
  159.     short    FindDivisionByCode( const char* pchCode ) const;
  160. };
  161. class CTaxon1Node : public CTreeContNodeBase, public ITaxon1Node {
  162. public:
  163.     CTaxon1Node( const CRef< CTaxon1_name >& ref )
  164.         : m_ref( ref ), m_cacheEntry( NULL ), m_flags( 0 ) {}
  165.     explicit CTaxon1Node( const CTaxon1Node& node )
  166.         : CTreeContNodeBase(), m_ref( node.m_ref ),
  167.   m_cacheEntry( NULL ), m_flags( 0 ) {}
  168.     virtual ~CTaxon1Node() {}
  169.     virtual int           GetTaxId() const { return m_ref->GetTaxid(); }
  170.     virtual const string& GetName() const { return m_ref->GetOname(); }
  171.     virtual const string& GetBlastName() const
  172.     { return m_ref->CanGetUname() ? m_ref->GetUname() : kEmptyStr; }
  173.     virtual short         GetRank() const;
  174.     virtual short         GetDivision() const;
  175.     virtual short         GetGC() const;
  176.     virtual short         GetMGC() const;
  177.                        
  178.     virtual bool          IsUncultured() const;
  179.     virtual bool          IsGenBankHidden() const;
  180.     virtual bool          IsRoot() const
  181.     { return CTreeContNodeBase::IsRoot(); }
  182.     COrgRefCache::SCacheEntry* GetEntry() { return m_cacheEntry; }
  183.     bool                  IsJoinTerminal() const
  184.     { return m_flags&mJoinTerm ? true : false; }
  185.     void                  SetJoinTerminal() { m_flags |= mJoinTerm; }
  186.     bool                  IsSubtreeLoaded() const
  187.     { return m_flags&mSubtreeLoaded ? true : false; }
  188.     void                  SetSubtreeLoaded( bool b )
  189.     { if( b ) m_flags |= mSubtreeLoaded; else m_flags &= ~mSubtreeLoaded; }
  190.     CTaxon1Node*          GetParent()
  191.     { return static_cast<CTaxon1Node*>(Parent()); }
  192. private:
  193.     friend class COrgRefCache;
  194.     enum EFlags {
  195. mJoinTerm      = 0x1,
  196. mSubtreeLoaded = 0x2
  197.     };
  198.     CRef< CTaxon1_name >       m_ref;
  199.     COrgRefCache::SCacheEntry* m_cacheEntry;
  200.     unsigned                   m_flags;
  201. };
  202. class CTaxTreeConstIterator : public ITreeIterator {
  203. public:
  204.     CTaxTreeConstIterator( CTreeConstIterator* pIt, CTaxon1::EIteratorMode m )
  205. : m_it( pIt ), m_itMode( m )  {}
  206.     virtual ~CTaxTreeConstIterator() {
  207. delete m_it;
  208.     }
  209.     virtual CTaxon1::EIteratorMode GetMode() const { return m_itMode; }
  210.     virtual const ITaxon1Node* GetNode() const
  211.     { return CastCI(m_it->GetNode()); }
  212.     const ITaxon1Node* operator->() const { return GetNode(); }
  213.     virtual bool IsLastChild() const;
  214.     virtual bool IsFirstChild() const;
  215.     virtual bool IsTerminal() const;
  216.     // Navigation
  217.     virtual void GoRoot() { m_it->GoRoot(); }
  218.     virtual bool GoParent();
  219.     virtual bool GoChild();
  220.     virtual bool GoSibling();
  221.     virtual bool GoNode(const ITaxon1Node* pNode);
  222.     // move cursor to the nearest common ancestor
  223.     // between node pointed by cursor and the node
  224.     // with given node_id
  225.     virtual bool GoAncestor(const ITaxon1Node* pNode);
  226.     // check if node pointed by cursor
  227.     // is belong to subtree wich root node
  228.     // has given node_id
  229.     virtual bool BelongSubtree(const ITaxon1Node* subtree_root) const;
  230.     // check if node with given node_id belongs
  231.     // to subtree pointed by cursor
  232.     virtual bool AboveNode(const ITaxon1Node* node) const;
  233. protected:
  234.     virtual bool IsVisible( const CTreeContNodeBase* p ) const = 0;
  235.     // Moves m_it to the next visible for this parent
  236.     bool NextVisible( const CTreeContNodeBase* pParent ) const;
  237.     const ITaxon1Node* CastCI( const CTreeContNodeBase* p ) const
  238.     { return static_cast<const ITaxon1Node*>
  239.   (static_cast<const CTaxon1Node*>(p)); }
  240.     const CTreeContNodeBase* CastIC( const ITaxon1Node* p ) const
  241.     { return static_cast<const CTreeContNodeBase*>
  242.   (static_cast<const CTaxon1Node*>(p)); }
  243.     mutable CTreeConstIterator* m_it;
  244.     CTaxon1::EIteratorMode      m_itMode;
  245. };
  246. class CFullTreeConstIterator : public CTaxTreeConstIterator {
  247. public:
  248.     CFullTreeConstIterator( CTreeConstIterator* pIt )
  249. : CTaxTreeConstIterator( pIt, CTaxon1::eIteratorMode_FullTree ) {}
  250.     virtual ~CFullTreeConstIterator() {}
  251.     virtual bool IsLastChild() const
  252.     { return m_it->GetNode() && m_it->GetNode()->IsLastChild(); }
  253.     virtual bool IsFirstChild() const
  254.     { return m_it->GetNode() && m_it->GetNode()->IsFirstChild(); }
  255.     virtual bool IsTerminal() const
  256.     { return m_it->GetNode() && m_it->GetNode()->IsTerminal(); }
  257.     // Navigation
  258.     virtual bool GoParent() { return m_it->GoParent(); }
  259.     virtual bool GoChild() { return m_it->GoChild(); }
  260.     virtual bool GoSibling() { return m_it->GoSibling(); }
  261.     virtual bool GoNode(const ITaxon1Node* pNode)
  262.     { return m_it->GoNode(CastIC(pNode)); }
  263.     // move cursor to the nearest common ancestor
  264.     // between node pointed by cursor and the node
  265.     // with given node_id
  266.     virtual bool GoAncestor(const ITaxon1Node* pNode)
  267.     { return m_it->GoAncestor(CastIC(pNode)); }
  268.     // check if node pointed by cursor
  269.     // is belong to subtree wich root node
  270.     // has given node_id
  271.     virtual bool BelongSubtree(const ITaxon1Node* subtree_root) const
  272.     { return m_it->BelongSubtree(CastIC(subtree_root)); }
  273.     // check if node with given node_id belongs
  274.     // to subtree pointed by cursor
  275.     virtual bool AboveNode(const ITaxon1Node* node) const
  276.     { return m_it->AboveNode(CastIC(node)); }
  277. protected:
  278.     virtual bool IsVisible( const CTreeContNodeBase* ) const { return true; }
  279. };
  280. class CTreeLeavesBranchesIterator : public CTaxTreeConstIterator {
  281. public:
  282.     CTreeLeavesBranchesIterator( CTreeConstIterator* pIt ) :
  283. CTaxTreeConstIterator( pIt, CTaxon1::eIteratorMode_LeavesBranches ) {}
  284.     virtual ~CTreeLeavesBranchesIterator() {}
  285.     virtual bool IsTerminal() const
  286.     { return m_it->GetNode() && m_it->GetNode()->IsTerminal(); }
  287. protected:
  288.     virtual bool IsVisible( const CTreeContNodeBase* p ) const;
  289. };
  290. class CTreeBestIterator : public CTaxTreeConstIterator {
  291. public:
  292.     CTreeBestIterator( CTreeConstIterator* pIt ) :
  293. CTaxTreeConstIterator( pIt, CTaxon1::eIteratorMode_Best ) {}
  294.     virtual ~CTreeBestIterator() {}
  295.     virtual bool IsTerminal() const
  296.     { return m_it->GetNode() && m_it->GetNode()->IsTerminal(); }
  297. protected:
  298.     virtual bool IsVisible( const CTreeContNodeBase* p ) const;
  299. };
  300. class CTreeBlastIterator : public CTaxTreeConstIterator {
  301. public:
  302.     CTreeBlastIterator( CTreeConstIterator* pIt ) :
  303. CTaxTreeConstIterator( pIt, CTaxon1::eIteratorMode_Blast ) {}
  304.     virtual ~CTreeBlastIterator() {}
  305. protected:
  306.     virtual bool IsVisible( const CTreeContNodeBase* p ) const;
  307. };
  308. END_objects_SCOPE
  309. END_NCBI_SCOPE
  310. /*
  311.  * $Log: cache.hpp,v $
  312.  * Revision 1000.1  2004/04/12 17:27:03  gouriano
  313.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R6.13
  314.  *
  315.  * Revision 6.13  2004/02/04 16:14:44  domrach
  316.  * New iterator types (modes of operation) are introduced. They include:
  317.  * full tree, branches'n'leaves, best, and blast. Position inquiry f-ns
  318.  * IsTerminal(), IsFirstChild(), and IsLastChild() has been moved from
  319.  * ITreeNode to ITreeIterator. Node loading f-ns() now return the ITreeNode
  320.  * for tax id.
  321.  *
  322.  * Revision 6.12  2003/06/23 20:42:08  domrach
  323.  * New treatment of subspecies names introduced
  324.  *
  325.  * Revision 6.11  2003/06/05 20:44:01  domrach
  326.  * Adjusted to the new CanGetXxx verification methods
  327.  *
  328.  * Revision 6.10  2003/05/31 15:55:48  lavr
  329.  * Explicit 'int'->'bool' casts to avoid compiler warnings
  330.  *
  331.  * Revision 6.9  2003/05/06 19:53:53  domrach
  332.  * New functions and interfaces for traversing the cached partial taxonomy tree introduced. Convenience functions GetDivisionName() and GetRankName() were added
  333.  *
  334.  * Revision 6.8  2003/03/05 21:33:52  domrach
  335.  * Enhanced orgref processing. Orgref cache capacity control added.
  336.  *
  337.  * Revision 6.7  2003/01/21 19:36:23  domrach
  338.  * Secondary tax id support added. New copy constructor for partial tree support added.
  339.  *
  340.  * Revision 6.6  2003/01/10 19:58:46  domrach
  341.  * Function GetPopsetJoin() added to CTaxon1 class
  342.  *
  343.  * Revision 6.5  2002/11/08 14:39:52  domrach
  344.  * Member function GetSuperkingdom() added
  345.  *
  346.  * Revision 6.4  2002/08/06 15:09:46  domrach
  347.  * Introducing new genbank name classes
  348.  *
  349.  * Revision 6.3  2002/02/14 22:44:50  vakatov
  350.  * Use STimeout instead of time_t.
  351.  * Get rid of warnings and extraneous #include's, shuffled code a little.
  352.  *
  353.  * Revision 6.2  2002/01/31 00:31:26  vakatov
  354.  * Follow the renaming of "CTreeCont.hpp" to "ctreecont.hpp".
  355.  * Get rid of "std::" which is unnecessary and sometimes un-compilable.
  356.  * Also done some source identation/beautification.
  357.  *
  358.  * Revision 6.1  2002/01/28 19:56:10  domrach
  359.  * Initial checkin of the library implementation files
  360.  *
  361.  * ===========================================================================
  362.  */
  363. #endif // NCBI_TAXON1_CACHE_HPP