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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_seqsrc.c,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:07:44  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast_seqsrc.c,v 1000.2 2004/06/01 18:07:44 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:  Christiam Camacho
  35.  *
  36.  *
  37.  */
  38. /** @file blast_seqsrc.c
  39.  * Definition of ADT to retrieve sequences for the BLAST engine
  40.  */
  41. static char const rcsid[] = 
  42.     "$Id: blast_seqsrc.c,v 1000.2 2004/06/01 18:07:44 gouriano Exp $";
  43. #include <algo/blast/core/blast_seqsrc.h>
  44. /** Complete type definition of Blast Sequence Source ADT */
  45. struct BlastSeqSrc {
  46.     BlastSeqSrcConstructor NewFnPtr;       /**< Constructor */
  47.     BlastSeqSrcDestructor  DeleteFnPtr;    /**< Destructor */
  48.    /* Functions to get information about database as a whole */
  49.     GetInt4FnPtr      GetNumSeqs;     /**< Get number of sequences in set */
  50.     GetInt4FnPtr      GetMaxSeqLen;   /**< Get length of longest seq in set */
  51.     GetInt4FnPtr      GetAvgSeqLen;   /**< Get average length of sequences in 
  52.                                          the set */
  53.     GetInt8FnPtr      GetTotLen;      /**< Get tot length of all seqs in set */
  54.     GetStrFnPtr       GetName;        /**< Get the name of the database */
  55.     GetStrFnPtr       GetDefinition;  /**< Get the database definition */
  56.     GetStrFnPtr       GetDate;        /**< Get the date of the database */
  57.     GetBoolFnPtr      GetIsProt;      /**< Find if database is a protein or 
  58.                                          nucleotide */
  59.    /* Functions to get information about individual sequences */
  60.     GetSeqBlkFnPtr    GetSequence;    /**< Retrieve individual sequence */
  61.     GetStrFnPtr       GetSeqIdStr;    /**< Retrieve sequence identifier 
  62.                                          string */
  63.     GetGenDataFnPtr   GetSeqId;       /**< Retrieve sequence identifier */
  64.     GetGenDataFnPtr   GetSeqLoc;      /**< Retrieve sequence identifier */
  65.     GetInt4FnPtr      GetSeqLen;      /**< Retrieve given sequence length */
  66.    /* Functions to iterate over sequences in the database */
  67.     GetNextChunkFnPtr GetNextChunk;   /**< Get next chunk of seq indices */
  68.     AdvanceIteratorFnPtr IterNext;    /**< Gets next oid from the iterator */
  69.     GetGenDataFnPtr   GetError;       /**< Gets a saved error message, if
  70.                                          supported. */
  71.     GetSeqBlkFnPtr    RetSequence;    /**< Deallocate individual sequence 
  72.                                          buffer if necessary. */
  73.    
  74.     void*             DataStructure;  /**< ADT holding the sequence data */
  75. };
  76. BlastSeqSrc* BlastSeqSrcNew(const BlastSeqSrcNewInfo* bssn_info)
  77. {
  78.     BlastSeqSrc* retval = NULL;
  79.     if (!bssn_info) {
  80.         return NULL;
  81.     }
  82.     if ( !(retval = (BlastSeqSrc*) calloc(1, sizeof(BlastSeqSrc)))) {
  83.         return NULL;
  84.     }
  85.     /* Save the constructor and invoke it */
  86.     if ((retval->NewFnPtr = bssn_info->constructor)) {
  87.         retval = (*retval->NewFnPtr)(retval, bssn_info->ctor_argument);
  88.     } else {
  89.       sfree(retval);
  90.     }
  91.     return retval;
  92. }
  93. BlastSeqSrc* BlastSeqSrcFree(BlastSeqSrc* bssp)
  94. {
  95.     BlastSeqSrcDestructor destructor_fnptr = NULL;
  96.     if (!bssp) {
  97.         return (BlastSeqSrc*) NULL;
  98.     }
  99.     /* This could leave a memory leak if destructor function pointer is not
  100.      * initialized! It is the implementation's resposibility to provide this */
  101.     if ( !(destructor_fnptr = (*bssp->DeleteFnPtr))) {
  102.         sfree(bssp);
  103.         return NULL;
  104.     }
  105.     return (BlastSeqSrc*) (*destructor_fnptr)(bssp);
  106. }
  107. /******************** BlastSeqSrcIterator API *******************************/
  108. BlastSeqSrcIterator* BlastSeqSrcIteratorNew(unsigned int chunk_sz)
  109. {
  110.     BlastSeqSrcIterator* itr = NULL;
  111.     itr = (BlastSeqSrcIterator*) calloc(1, sizeof(BlastSeqSrcIterator));
  112.     if (!itr) {
  113.         return NULL;
  114.     }
  115.     /* Should employ lazy initialization? */
  116.     itr->oid_list = (unsigned int*)malloc(chunk_sz * sizeof(unsigned int));
  117.     if (!itr->oid_list) {
  118.         sfree(itr);
  119.         return NULL;
  120.     }
  121.     itr->chunk_sz = chunk_sz;
  122.     itr->current_pos = UINT4_MAX;   /* mark iterator as uninitialized */
  123.     return itr;
  124. }
  125. BlastSeqSrcIterator* BlastSeqSrcIteratorFree(BlastSeqSrcIterator* itr)
  126. {
  127.     if (!itr) {
  128.         return NULL;
  129.     }
  130.     if (itr->oid_list) {
  131.         sfree(itr->oid_list);
  132.     }
  133.     sfree(itr);
  134.     return NULL;
  135. }
  136. Int4 BlastSeqSrcIteratorNext(const BlastSeqSrc* bssp, BlastSeqSrcIterator* itr)
  137. {
  138.     ASSERT(bssp);
  139.     ASSERT(itr);
  140.     ASSERT(bssp->IterNext);
  141.     return (*bssp->IterNext)((void*) bssp, itr);
  142. }
  143. /*****************************************************************************/
  144. #define DEFINE_MEMBER_FUNCTIONS(member_type, member, data_structure_type) 
  145. DEFINE_ACCESSOR(member_type, member, data_structure_type) 
  146. DEFINE_MUTATOR(member_type, member, data_structure_type)
  147. #define DEFINE_ACCESSOR(member_type, member, data_structure_type) 
  148. member_type Get##member(const data_structure_type var) 
  149.     if (var) 
  150.         return var->member; 
  151.     else 
  152.         return (member_type) NULL; 
  153. }
  154. #define DEFINE_MUTATOR(member_type, member, data_structure_type) 
  155. void Set##member(data_structure_type var, member_type arg) 
  156. { if (var) var->member = arg; }
  157. /* Note there's no ; after these macros! */
  158. DEFINE_MEMBER_FUNCTIONS(BlastSeqSrcConstructor, NewFnPtr, BlastSeqSrc*)
  159. DEFINE_MEMBER_FUNCTIONS(BlastSeqSrcDestructor, DeleteFnPtr, BlastSeqSrc*)
  160. DEFINE_MEMBER_FUNCTIONS(void*, DataStructure, BlastSeqSrc*)
  161. DEFINE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetNumSeqs, BlastSeqSrc*)
  162. DEFINE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetMaxSeqLen, BlastSeqSrc*)
  163. DEFINE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetAvgSeqLen, BlastSeqSrc*)
  164. DEFINE_MEMBER_FUNCTIONS(GetInt8FnPtr, GetTotLen, BlastSeqSrc*)
  165. DEFINE_MEMBER_FUNCTIONS(GetStrFnPtr, GetName, BlastSeqSrc*)
  166. DEFINE_MEMBER_FUNCTIONS(GetStrFnPtr, GetDefinition, BlastSeqSrc*)
  167. DEFINE_MEMBER_FUNCTIONS(GetStrFnPtr, GetDate, BlastSeqSrc*)
  168. DEFINE_MEMBER_FUNCTIONS(GetBoolFnPtr, GetIsProt, BlastSeqSrc*)
  169. DEFINE_MEMBER_FUNCTIONS(GetSeqBlkFnPtr, GetSequence, BlastSeqSrc*)
  170. DEFINE_MEMBER_FUNCTIONS(GetStrFnPtr, GetSeqIdStr, BlastSeqSrc*)
  171. DEFINE_MEMBER_FUNCTIONS(GetGenDataFnPtr, GetSeqId, BlastSeqSrc*)
  172. DEFINE_MEMBER_FUNCTIONS(GetGenDataFnPtr, GetSeqLoc, BlastSeqSrc*)
  173. DEFINE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetSeqLen, BlastSeqSrc*)
  174. DEFINE_MEMBER_FUNCTIONS(GetNextChunkFnPtr, GetNextChunk, BlastSeqSrc*)
  175. DEFINE_MEMBER_FUNCTIONS(AdvanceIteratorFnPtr, IterNext, BlastSeqSrc*)
  176. DEFINE_MEMBER_FUNCTIONS(GetGenDataFnPtr, GetError, BlastSeqSrc*)
  177. DEFINE_MEMBER_FUNCTIONS(GetSeqBlkFnPtr, RetSequence, BlastSeqSrc*)