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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqdbalias.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/04/15 15:05:32  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [CATCHUP_003] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJTOOLS_READERS_SEQDB__SEQDBALIAS_HPP
  10. #define OBJTOOLS_READERS_SEQDB__SEQDBALIAS_HPP
  11. /*  $Id: seqdbalias.hpp,v 1000.0 2004/04/15 15:05:32 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:  Kevin Bealer
  37.  *
  38.  */
  39. /// CSeqDBAlias class
  40. /// 
  41. /// This object defines access to one database aliasume.
  42. #include <iostream>
  43. #include <objtools/readers/seqdb/seqdb.hpp>
  44. #include "seqdboidlist.hpp"
  45. #include "seqdbfile.hpp"
  46. #include "seqdbvol.hpp"
  47. #include "seqdbvolset.hpp"
  48. #include "seqdbgeneral.hpp"
  49. BEGIN_NCBI_SCOPE
  50. using namespace ncbi::objects;
  51. class CSeqDB_AliasWalker {
  52. public:
  53.     virtual ~CSeqDB_AliasWalker() {}
  54.     
  55.     virtual const char * GetFileKey(void) const        = 0;
  56.     virtual void         Accumulate(const CSeqDBVol &) = 0;
  57.     virtual void         AddString (const string &)    = 0;
  58. };
  59. class CSeqDBAliasNode : public CObject {
  60. public:
  61.     CSeqDBAliasNode(const string & name_list,
  62.                     char           prot_nucl,
  63.                     bool           use_mmap);
  64.     
  65.     // Add our volumes and our subnode's volumes to the end of "vols".
  66.     void GetVolumeNames(vector<string> & vols) const;
  67.     
  68.     // Compute title by recursive appending of subnodes values until
  69.     // value specification or volume is reached.
  70.     string GetTitle(const CSeqDBVolSet & volset) const;
  71.     
  72.     // Compute sequence count by recursive appending of subnodes
  73.     // values until value specification or volume is reached.
  74.     Uint4 GetNumSeqs(const CSeqDBVolSet & volset) const;
  75.     
  76.     // Compute sequence count by recursive appending of subnodes
  77.     // values until value specification or volume is reached.
  78.     Uint8 GetTotalLength(const CSeqDBVolSet & volset) const;
  79.     
  80.     void WalkNodes(CSeqDB_AliasWalker * walker,
  81.                    const CSeqDBVolSet & volset) const;
  82.     
  83.     void SetMasks(CSeqDBVolSet & volset);
  84.     
  85. private:
  86.     // To be called only from this class.  Note that the recursion
  87.     // prevention list is passed by value.
  88.     CSeqDBAliasNode(const string & dbpath,
  89.                     const string & dbname,
  90.                     char           prot_nucl,
  91.                     bool           use_mmap,
  92.                     set<string>    recurse);
  93.     
  94.     // Actual construction of the node
  95.     // Reads file as a list of values.
  96.     void x_ReadValues(const string & fn, bool use_mmap);
  97.     
  98.     // Reads one line, if it is a value pair it is added to the list.
  99.     void x_ReadLine(const char * bp, const char * ep);
  100.     
  101.     // Expand all DB members as aliases if they exist.
  102.     void x_ExpandAliases(const string & this_name,
  103.                          char           ending,
  104.                          bool           use_mmap,
  105.                          set<string>  & recurse);
  106.     
  107.     string x_MkPath(const string & dir, const string & name, char prot_nucl) const
  108.     {
  109.         return SeqDB_CombinePath(dir, name) + "." + prot_nucl + "al";
  110.     }
  111.     
  112.     // Add our volumes and our subnode's volumes to the end of "vols".
  113.     void x_GetVolumeNames(set<string> & vols) const;
  114.     
  115.     void x_ResolveNames(string & dbname_list,
  116.                         string & dbname_path,
  117.                         char     prot_nucl);
  118.     
  119.     // --- Data ---
  120.     
  121.     typedef map<string, string>             TVarList;
  122.     typedef vector<string>                  TVolNames;
  123.     typedef vector< CRef<CSeqDBAliasNode> > TSubNodeList;
  124.     
  125.     string       m_DBPath;
  126.     TVarList     m_Values;
  127.     TVolNames    m_VolNames;
  128.     TSubNodeList m_SubNodes;
  129. };
  130. class CSeqDBAliasFile {
  131. public:
  132.     CSeqDBAliasFile(const string & name_list, char prot_nucl, bool use_mmap)
  133.         : m_Node (name_list, prot_nucl, use_mmap)
  134.     {
  135.         m_Node.GetVolumeNames(m_VolumeNames);
  136.     }
  137.     
  138.     const vector<string> & GetVolumeNames(void) const
  139.     {
  140.         return m_VolumeNames;
  141.     }
  142.     
  143.     // Add our volumes and our subnode's volumes to the end of "vols".
  144.     string GetTitle(const CSeqDBVolSet & volset) const
  145.     {
  146.         return m_Node.GetTitle(volset);
  147.     }
  148.     
  149.     // Add our volumes and our subnode's seq counts.
  150.     Uint4 GetNumSeqs(const CSeqDBVolSet & volset) const
  151.     {
  152.         return m_Node.GetNumSeqs(volset);
  153.     }
  154.     
  155.     // Add our volumes and our subnode's base lengths.
  156.     Uint8 GetTotalLength(const CSeqDBVolSet & volset) const
  157.     {
  158.         return m_Node.GetTotalLength(volset);
  159.     }
  160.     
  161.     void SetMasks(CSeqDBVolSet & volset)
  162.     {
  163.         m_Node.SetMasks(volset);
  164.     }
  165.     
  166. private:
  167.     CSeqDBAliasNode m_Node;
  168.     vector<string>  m_VolumeNames;
  169. };
  170. END_NCBI_SCOPE
  171. #endif // OBJTOOLS_READERS_SEQDB__SEQDBALIAS_HPP