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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqdb.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/21 19:27:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJTOOLS_READERS_SEQDB__SEQDB_HPP
  10. #define OBJTOOLS_READERS_SEQDB__SEQDB_HPP
  11. /*  $Id: seqdb.hpp,v 1000.1 2004/04/21 19:27:30 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. /// @file seqdb.hpp
  40. /// Defines BLAST database access classes.
  41. ///
  42. /// Defines classes:
  43. ///     CSeqDB
  44. ///     CSeqDBSequence
  45. ///
  46. /// Implemented for: UNIX, MS-Windows
  47. #include <objtools/readers/seqdb/seqdbcommon.hpp>
  48. #include <objects/blastdb/Blast_def_line.hpp>
  49. #include <objects/blastdb/Blast_def_line_set.hpp>
  50. #include <objects/general/Dbtag.hpp>
  51. #include <objects/general/Object_id.hpp>
  52. #include <objects/seq/Bioseq.hpp>
  53. #include <objects/seqloc/Seq_id.hpp>
  54. BEGIN_NCBI_SCOPE
  55. USING_SCOPE(objects);
  56. /////////////////////////////////////////////////////////////////////////////
  57. ///
  58. /// CSeqDBIter --
  59. ///
  60. /// Small class to iterate over a seqdb database.
  61. ///
  62. /// This serves something of the same role for a CSeqDB object that a
  63. /// vector iterator might serve in the standard template library.
  64. class CSeqDB;
  65. class CSeqDBIter {
  66. public:
  67.     typedef Uint4 TOID;
  68.     
  69.     virtual ~CSeqDBIter()
  70.     {
  71.         x_RetSeq();
  72.     }
  73.     
  74.     CSeqDBIter & operator++(void);
  75.     
  76.     TOID GetOID(void)
  77.     {
  78.         return m_OID;
  79.     }
  80.     
  81.     const char * GetData(void)
  82.     {
  83.         return m_Data;
  84.     }
  85.     
  86.     Uint4 GetLength(void)
  87.     {
  88.         return m_Length;
  89.     }
  90.     
  91.     operator bool()
  92.     {
  93.         return m_Length != (Uint4)-1;
  94.     }
  95.     
  96.     CSeqDBIter(const CSeqDBIter &);
  97.     
  98.     CSeqDBIter & operator =(const CSeqDBIter &);
  99.     
  100. private:
  101.     inline void x_GetSeq(void);
  102.     inline void x_RetSeq(void);
  103.     
  104.     friend class CSeqDB;
  105.     
  106.     CSeqDBIter(const CSeqDB *, Uint4 oid);
  107.     
  108.     const CSeqDB     * m_DB;
  109.     TOID               m_OID;
  110.     const char       * m_Data;
  111.     Uint4              m_Length;
  112. };
  113. /////////////////////////////////////////////////////////////////////////////
  114. ///
  115. /// CSeqDB --
  116. ///
  117. /// User interface class for blast databases.
  118. ///
  119. /// This class provides the top-level interface class for BLAST
  120. /// database users.  It defines access to the database component by
  121. /// calling methods on objects which represent the various database
  122. /// files, such as the index, header, sequence, and alias files.
  123. class NCBI_XOBJREAD_EXPORT CSeqDB : public CObject {
  124. public:
  125.     /// Sequence type accepted and returned for OID indexes.
  126.     typedef Uint4 TOID;
  127.     
  128.     /// Short Constructor.
  129.     /// 
  130.     /// @param dbname
  131.     ///   A list of database or alias names, seperated by spaces.
  132.     /// @param prot_nucl
  133.     ///   Either kSeqTypeProt for a protein database, or kSeqTypeNucl
  134.     ///   for nucleotide.  These can also be specified as 'p' or 'n'.
  135.     
  136.     CSeqDB(const string & dbname, char prot_nucl);
  137.     
  138.     /// Constructor with MMap Flag and OID Range.
  139.     /// 
  140.     /// @param dbname
  141.     ///   A list of database or alias names, seperated by spaces.
  142.     /// @param prot_nucl
  143.     ///   Either kSeqTypeProt for a protein database, or kSeqTypeNucl
  144.     ///   for nucleotide.  These can also be specified as 'p' or 'n'.
  145.     /// @param oid_begin
  146.     ///   Iterator will skip OIDs less than this value.  Only OIDs
  147.     ///   found in the OID lists (if any) will be returned.
  148.     /// @param oid_end
  149.     ///   Iterator will return up to (but not including) this OID.
  150.     /// @param use_mmap
  151.     ///   If kSeqDBMMap is specified (the default), memory mapping is
  152.     ///   attempted.  If kSeqDBNoMMap is specified, or memory mapping
  153.     ///   fails, this platform does not support it, the less efficient
  154.     ///   read and write calls are used instead.
  155.     
  156.     CSeqDB(const string & dbname,
  157.            char           prot_nucl,
  158.            Uint4          oid_begin,
  159.            Uint4          oid_end,
  160.            bool           use_mmap);
  161.     
  162.     /// Destructor.
  163.     ///
  164.     /// This will return resources acquired by this object, including
  165.     /// any gotten by the GetSequence() call, whether or not they have
  166.     /// been returned by RetSequence().
  167.     ~CSeqDB();
  168.     
  169.     
  170.     /// Returns the sequence length in base pairs or residues.
  171.     Uint4 GetSeqLength(TOID oid) const;
  172.     
  173.     /// Returns an unbiased, approximate sequence length.
  174.     ///
  175.     /// For protein DBs, this method is identical to GetSeqLength().
  176.     /// In the nucleotide case, computing the exact length requires
  177.     /// examination of the sequence data.  This method avoids doing
  178.     /// that, returning an approximation ranging from L-3 to L+3
  179.     /// (where L indicates the exact length), and unbiased on average.
  180.     Uint4 GetSeqLengthApprox(TOID oid) const;
  181.     
  182.     /// Get the ASN.1 header for the sequence.
  183.     CRef<CBlast_def_line_set> GetHdr(TOID oid) const;
  184.     
  185.     /// Get a CBioseq of the sequence.
  186.     CRef<CBioseq> GetBioseq(TOID                oid,
  187.                             bool use_objmgr   = true,
  188.                             bool insert_ctrlA = false) const;
  189.     
  190.     /// Get a pointer to raw sequence data.
  191.     ///
  192.     /// Get the raw sequence (strand data).  When done, resources
  193.     /// should be returned with RetSequence.  This data pointed to
  194.     /// by *buffer is in read-only memory (where supported).
  195.     /// @return
  196.     ///   The return value is the sequence length (in base pairs or
  197.     ///   residues).  In case of an error, an exception is thrown.
  198.     Uint4 GetSequence(TOID oid, const char ** buffer) const;
  199.     
  200.     /// Get a pointer to sequence data with embedded ambiguities.
  201.     ///
  202.     /// In the protein case, this is identical to GetSequence().  In
  203.     /// the nucleotide case, it stores 2 bases per byte instead of 4.
  204.     /// The third parameter indicates the encoding for nucleotide
  205.     /// data, either kSeqDBNucl4NA or kSeqDBNuclBlastNA, ignored if
  206.     /// the sequence is a protein sequence.  When done, resources
  207.     /// should be returned with RetSequence.
  208.     /// @return
  209.     ///   The return value is the sequence length (in base pairs or
  210.     ///   residues).  In case of an error, an exception is thrown.
  211.     Uint4 GetAmbigSeq(TOID oid, const char ** buffer, Uint4 nucl_code) const;
  212.     
  213.     /// Get a pointer to sequence data with embedded ambiguities.
  214.     ///
  215.     /// This is like GetAmbigSeq(), but the allocated object should be
  216.     /// deleted by the caller.  This is intended for users who are
  217.     /// going to modify the sequence data, or are going to mix the
  218.     /// data into a container with other data, and who are mixing data
  219.     /// from multiple sources and want to free the data in the same
  220.     /// way.  The fourth parameter should be given one of the values
  221.     /// from EAllocStrategy; the corresponding method should be used
  222.     /// to delete the object.  Note that "delete[]" should be used
  223.     /// instead of "delete"
  224.     /// @param oid
  225.     ///   Ordinal ID.
  226.     /// @param buffer
  227.     ///   Address of a char pointer to access the sequence data.
  228.     /// @param nucl_code
  229.     ///   The NA encoding, kSeqDBNuclNcbiNA8 or kSeqDBNuclBlastNA8.
  230.     /// @param alloc_strategy
  231.     ///   Indicate which allocation strategy to use.
  232.     Uint4 GetAmbigSeqAlloc(TOID               oid,
  233.                            char            ** buffer,
  234.                            Uint4              nucl_code,
  235.                            ESeqDBAllocType    strategy) const;
  236.     
  237.     /// Returns any resources associated with the sequence.
  238.     /// 
  239.     /// Note that if memory mapping was successful, the sequence data
  240.     /// is in read only memory; also, this method has no effect.  If
  241.     /// memory mapping failed, the sequence is probably in dynamically
  242.     /// allocated memory and this method frees that memory.
  243.     void RetSequence(const char ** buffer) const;
  244.     
  245.     /// Gets a list of sequence identifiers.
  246.     /// 
  247.     /// This returns the list of CSeq_id identifiers associated with
  248.     /// the sequence specified by the given OID.
  249.     list< CRef<CSeq_id> > GetSeqIDs(TOID oid) const;
  250.     
  251.     /// Returns the type of database opened - protein or nucleotide.
  252.     /// 
  253.     /// This uses the same constants as the constructor.
  254.     char GetSeqType(void) const;
  255.     
  256.     /// Returns the database title.
  257.     ///
  258.     /// This is usually read from database volumes or alias files.  If
  259.     /// multiple databases were passed to the constructor, this will
  260.     /// be a concatenation of those databases' titles.
  261.     string GetTitle(void) const;
  262.     
  263.     /// Returns the construction date of the database.
  264.     /// 
  265.     /// This is encoded in the database.  If multiple databases or
  266.     /// multiple volumes were accessed, the first available date will
  267.     /// be used.
  268.     string GetDate(void) const;
  269.     
  270.     /// Returns the number of sequences available.
  271.     Uint4 GetNumSeqs(void) const;
  272.     
  273.     /// Returns the sum of the lengths of all available sequences.
  274.     ///
  275.     /// This uses summary information stored in the database volumes
  276.     /// or alias files.  It provides an exact value, without iterating
  277.     /// over individual sequences.
  278.     Uint8 GetTotalLength(void) const;
  279.     
  280.     /// Returns the length of the largest sequence in the database.
  281.     ///
  282.     /// This uses summary information stored in the database volumes
  283.     /// or alias files.  This might be used to chose buffer sizes.
  284.     Uint4 GetMaxLength(void) const;
  285.     
  286.     /// Returns a sequence iterator.
  287.     ///
  288.     /// This gets an iterator designed to allow traversal of the
  289.     /// database from beginning to end.
  290.     CSeqDBIter Begin(void) const;
  291.     
  292.     /// Find an included OID, incrementing next_oid if necessary.
  293.     ///
  294.     /// If the specified OID is not included in the set (i.e. the OID
  295.     /// mask), the input parameter is incremented until one is found
  296.     /// that is.  The user will probably want to increment between
  297.     /// calls, if iterating over the db.
  298.     /// @return
  299.     ///   True if a valid OID was found, false otherwise.
  300.     bool CheckOrFindOID(TOID & next_oid) const;
  301.     
  302.     /// Get list of database names.
  303.     ///
  304.     /// This returns the database name list used at construction.
  305.     /// @return
  306.     ///   List of database names.
  307.     const string & GetDBNameList(void) const;
  308.     
  309. private:
  310.     /// Implementation details are hidden.  (See seqdbimpl.hpp).
  311.     class CSeqDBImpl * m_Impl;
  312. };
  313. /////////////////////////////////////////////////////////////////////////////
  314. ///
  315. /// CSeqDBSequence --
  316. ///
  317. /// Small class to manage return of sequence data.
  318. ///
  319. /// The CSeqDB class requires that sequences be returned at some point
  320. /// after they are gotten.  This class provides that service via the
  321. /// destructor.  It also insures that the database itself stays around
  322. /// for at least the duration of its lifetime, by holding a CRef<> to
  323. /// that object.  CSeqDB::GetSequence may be used directly to avoid
  324. /// the small overhead of this class, provided care is taken to call
  325. /// CSeqDB::RetSequence.  The data referred to by this object is not
  326. /// modifyable, and is memory mapped (read only) where supported.
  327. class CSeqDBSequence {
  328. public:
  329.     CSeqDBSequence(CSeqDB * db, Uint4 oid)
  330.         : m_DB    (db),
  331.           m_Data  (0),
  332.           m_Length(0)
  333.     {
  334.         m_Length = m_DB->GetSequence(oid, & m_Data);
  335.     }
  336.     
  337.     ~CSeqDBSequence()
  338.     {
  339.         if (m_Data) {
  340.             m_DB->RetSequence(& m_Data);
  341.         }
  342.     }
  343.     
  344.     const char * GetData(void)
  345.     {
  346.         return m_Data;
  347.     }
  348.     
  349.     Uint4 GetLength(void)
  350.     {
  351.         return m_Length;
  352.     }
  353.     
  354. private:
  355.     // Prevent copy for now - would be easy to fix.
  356.     CSeqDBSequence(const CSeqDBSequence &);
  357.     CSeqDBSequence & operator=(const CSeqDBSequence &);
  358.     
  359.     CRef<CSeqDB> m_DB;
  360.     const char * m_Data;
  361.     Uint4        m_Length;
  362. };
  363. // Inline methods for CSeqDBIter
  364. void CSeqDBIter::x_GetSeq(void)
  365. {
  366.     m_Length = m_DB->GetSequence(m_OID, & m_Data);
  367. }
  368. void CSeqDBIter::x_RetSeq(void)
  369. {
  370.     if (m_Data)
  371.         m_DB->RetSequence(& m_Data);
  372. }
  373. END_NCBI_SCOPE
  374. #endif // OBJTOOLS_READERS_SEQDB__SEQDB_HPP