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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqdbimpl.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:46:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: seqdbimpl.cpp,v 1000.1 2004/06/01 19:46:46 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Kevin Bealer
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include "seqdbimpl.hpp"
  39. #include <iostream>
  40. BEGIN_NCBI_SCOPE
  41. CSeqDBImpl::CSeqDBImpl(const string & db_name_list,
  42.                        char           prot_nucl,
  43.                        Uint4          oid_begin,
  44.                        Uint4          oid_end,
  45.                        bool           use_mmap)
  46.     : m_DBNames      (db_name_list),
  47.       m_Aliases      (db_name_list, prot_nucl, use_mmap),
  48.       m_VolSet       (m_MemPool,
  49.                       m_Aliases.GetVolumeNames(),
  50.                       prot_nucl,
  51.                       use_mmap),
  52.       m_RestrictBegin(oid_begin),
  53.       m_RestrictEnd  (oid_end)
  54. {
  55.     m_Aliases.SetMasks(m_VolSet);
  56.     
  57.     if ( m_VolSet.HasMask() ) {
  58.         m_OIDList.Reset( new CSeqDBOIDList(m_VolSet, use_mmap) );
  59.     }
  60.     
  61.     if ((oid_begin == oid_end) || (m_RestrictEnd > GetNumSeqs())) {
  62.         m_RestrictEnd = GetNumSeqs();
  63.     }
  64. }
  65. CSeqDBImpl::~CSeqDBImpl(void)
  66. {
  67. }
  68. bool CSeqDBImpl::CheckOrFindOID(Uint4 & next_oid) const
  69. {
  70.     bool success = true;
  71.     
  72.     if (next_oid < m_RestrictBegin) {
  73.         next_oid = m_RestrictBegin;
  74.     }
  75.     
  76.     if (next_oid >= m_RestrictEnd) {
  77.         success = false;
  78.     }
  79.     
  80.     if (success && m_OIDList.NotEmpty()) {
  81.         success = m_OIDList->CheckOrFindOID(next_oid);
  82.         
  83.         if (next_oid > m_RestrictEnd) {
  84.             success = false;
  85.         }
  86.     }
  87.     
  88.     return success;
  89. }
  90. Uint4 CSeqDBImpl::GetSeqLength(Uint4 oid) const
  91. {
  92.     Uint4 vol_oid = 0;
  93.     
  94.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  95.         return vol->GetSeqLength(vol_oid, false);
  96.     }
  97.     
  98.     NCBI_THROW(CSeqDBException,
  99.                eArgErr,
  100.                "OID not in valid range.");
  101. }
  102. Uint4 CSeqDBImpl::GetSeqLengthApprox(Uint4 oid) const
  103. {
  104.     Uint4 vol_oid = 0;
  105.     
  106.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  107.         return vol->GetSeqLength(vol_oid, true);
  108.     }
  109.     
  110.     NCBI_THROW(CSeqDBException,
  111.                eArgErr,
  112.                "OID not in valid range.");
  113. }
  114. CRef<CBioseq>
  115. CSeqDBImpl::GetBioseq(Uint4 oid,
  116.                       bool  use_objmgr,
  117.                       bool  insert_ctrlA) const
  118. {
  119.     Uint4 vol_oid = 0;
  120.     
  121.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  122.         return vol->GetBioseq(vol_oid, use_objmgr, insert_ctrlA);
  123.     }
  124.     
  125.     NCBI_THROW(CSeqDBException,
  126.                eArgErr,
  127.                "OID not in valid range.");
  128. }
  129. void CSeqDBImpl::RetSequence(const char ** buffer) const
  130. {
  131.     m_MemPool.Free((void*) *buffer);
  132. }
  133. Uint4 CSeqDBImpl::GetSequence(Uint4 oid, const char ** buffer) const
  134. {
  135.     Uint4 vol_oid = 0;
  136.     
  137.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  138.         return vol->GetSequence(vol_oid, buffer);
  139.     }
  140.     
  141.     NCBI_THROW(CSeqDBException,
  142.                eArgErr,
  143.                "OID not in valid range.");
  144. }
  145. Uint4 CSeqDBImpl::GetAmbigSeq(Uint4           oid,
  146.                               char         ** buffer,
  147.                               Uint4           nucl_code,
  148.                               ESeqDBAllocType alloc_type) const
  149. {
  150.     Uint4 vol_oid = 0;
  151.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  152.         return vol->GetAmbigSeq(vol_oid, buffer, nucl_code, alloc_type);
  153.     }
  154.     
  155.     NCBI_THROW(CSeqDBException,
  156.                eArgErr,
  157.                "OID not in valid range.");
  158. }
  159. list< CRef<CSeq_id> > CSeqDBImpl::GetSeqIDs(Uint4 oid) const
  160. {
  161.     Uint4 vol_oid = 0;
  162.     
  163.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  164.         return vol->GetSeqIDs(vol_oid);
  165.     }
  166.     
  167.     NCBI_THROW(CSeqDBException,
  168.                eArgErr,
  169.                "OID not in valid range.");
  170. }
  171. Uint4 CSeqDBImpl::GetNumSeqs(void) const
  172. {
  173.     return m_Aliases.GetNumSeqs(m_VolSet);
  174. }
  175. Uint8 CSeqDBImpl::GetTotalLength(void) const
  176. {
  177.     return m_Aliases.GetTotalLength(m_VolSet);
  178. }
  179. string CSeqDBImpl::GetTitle(void) const
  180. {
  181.     return x_FixString( m_Aliases.GetTitle(m_VolSet) );
  182. }
  183. char CSeqDBImpl::GetSeqType(void) const
  184. {
  185.     if (const CSeqDBVol * vol = m_VolSet.GetVol(0)) {
  186.         return vol->GetSeqType();
  187.     }
  188.     return kSeqTypeUnkn;
  189. }
  190. string CSeqDBImpl::GetDate(void) const
  191. {
  192.     if (const CSeqDBVol * vol = m_VolSet.GetVol(0)) {
  193.         return x_FixString( vol->GetDate() );
  194.     }
  195.     return string();
  196. }
  197. CRef<CBlast_def_line_set> CSeqDBImpl::GetHdr(Uint4 oid) const
  198. {
  199.     Uint4 vol_oid = 0;
  200.     
  201.     if (const CSeqDBVol * vol = m_VolSet.FindVol(oid, vol_oid)) {
  202.         return vol->GetHdr(vol_oid);
  203.     }
  204.     
  205.     NCBI_THROW(CSeqDBException,
  206.                eArgErr,
  207.                "OID not in valid range.");
  208. }
  209. Uint4 CSeqDBImpl::GetMaxLength(void) const
  210. {
  211.     Uint4 max_len = 0;
  212.     
  213.     for(Uint4 i = 0; i < m_VolSet.GetNumVols(); i++) {
  214.         Uint4 new_max = m_VolSet.GetVol(i)->GetMaxLength();
  215.         
  216.         if (new_max > max_len)
  217.             max_len = new_max;
  218.     }
  219.     
  220.     return max_len;
  221. }
  222. const string & CSeqDBImpl::GetDBNameList(void) const
  223. {
  224.     return m_DBNames;
  225. }
  226. // This is a work-around for bad data in the database; probably the
  227. // fault of formatdb.  The problem is that the database date field has
  228. // an incorrect length - possibly a general problem with string
  229. // handling in formatdb?  In any case, this method trims a string to
  230. // the minimum of its length and the position of the first NULL.  This
  231. // technique will not work if the date field is null terminated, but
  232. // apparently it usually is, in spite of the length bug.
  233. string CSeqDBImpl::x_FixString(const string & s) const
  234. {
  235.     for(Uint4 i = 0; i < s.size(); i++) {
  236.         if (s[i] == char(0)) {
  237.             return string(s,0,i);
  238.         }
  239.     }
  240.     return s;
  241. }
  242. END_NCBI_SCOPE