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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_seqsrc.h,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:03:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast_seqsrc.h,v 1000.2 2004/06/01 18:03: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:  Christiam Camacho
  35.  *
  36.  */
  37. /** @file blast_seqsrc.h
  38.  * Declaration of ADT to retrieve sequences for the BLAST engine.
  39.  */
  40. #ifndef BLAST_SEQSRC_H
  41. #define BLAST_SEQSRC_H
  42. #include <algo/blast/core/blast_def.h>
  43. #ifdef __cplusplus
  44. extern "C" {
  45. #endif
  46. /** The BlastSeqSrc ADT is an opaque data type that defines an interface which
  47.  *  is used by the core BLAST code to retrieve sequences.
  48.  *  The interface currently provides the following services:
  49.  *  - Retrieving number of sequences in set
  50.  *  - Retrieving the total length (in bases/residues) of sequences in set.
  51.  *  - Retrieving the length of the longest sequence in set
  52.  *  - Retrieving an individual sequence in a user-specified encoding by ordinal
  53.  *    id (index into the set)
  54.  *  - Retrieving a sequence identifier for a given ordinal id
  55.  *  - Retrieving the length of a given sequence in set by ordinal id
  56.  *  - Allow MT-safe iteration over sequences in set through the
  57.  *    BlastSeqSrcIterator abstraction
  58.  *  .
  59.  *  Implementations of this interface should provide functions for all
  60.  *  the functions listed above.
  61.  */
  62. typedef struct BlastSeqSrc BlastSeqSrc;
  63. /** Function pointer typedef to create a new BlastSeqSrc structure.
  64.  * First argument is a pointer to the structure to be populated (allocated for
  65.  * client implementations), second argument should be typecast'd to the 
  66.  * correct type by user-defined constructor function */
  67. typedef BlastSeqSrc* (*BlastSeqSrcConstructor) (BlastSeqSrc*, void*);
  68. /** Function pointer typedef to deallocate a BlastSeqSrc structure.
  69.  * Argument is the BlastSeqSrc structure to free, always returns NULL. */
  70. typedef BlastSeqSrc* (*BlastSeqSrcDestructor) (BlastSeqSrc*);
  71. /** Function pointer typedef to return a 4-byte integer.
  72.  * First argument is the BlastSeqSrc structure used, second argument is
  73.  * passed to user-defined implementation */
  74. typedef Int4 (*GetInt4FnPtr) (void*, void*);
  75. /** Function pointer typedef to return a 8-byte integer.
  76.  * First argument is the BlastSeqSrc structure used, second argument is
  77.  * passed to user-defined implementation */
  78. typedef Int8 (*GetInt8FnPtr) (void*, void*);
  79. /** Function pointer typedef to return a null terminated string. 
  80.  * First argument is the BlastSeqSrc structure used, second
  81.  * argument is passed to user-defined implementation. */
  82. typedef char* (*GetStrFnPtr) (void*, void*);
  83. /** Function pointer typedef to return a boolean value. 
  84.  * First argument is the BlastSeqSrc structure used, second
  85.  * argument is passed to user-defined implementation. */
  86. typedef Boolean (*GetBoolFnPtr) (void*, void*);
  87. /** Types of objects returned by generic data functions */
  88. typedef enum {
  89.    BLAST_SEQSRC_C_SEQID = 0,  /**< C ASN.1 generated SeqId structure */
  90.    BLAST_SEQSRC_CPP_SEQID,    /**< C++ ASN.1 generated CSeq_id class */ 
  91.    BLAST_SEQSRC_CPP_SEQID_REF,/**< Pointer to a CRef wrapper over CSeq_id
  92.                                   object */
  93.    BLAST_SEQSRC_C_SEQLOC,     /**< Pointer to a C ASN.1 generated SeqLoc 
  94.                                  structure */
  95.    BLAST_SEQSRC_CPP_SEQLOC,   /**< Pointer to a C++ ASN.1 generated CSeq_loc 
  96.                                  structure */
  97.    BLAST_SEQSRC_MESSAGE       /**< Pointer to a Blast_Message structure */
  98. } BlastSeqSrcDataType;
  99. /** Function pointer typedef to return pointer to some generic data. 
  100.  * The data is wrapped in a ListNode structure, whose 'choice' field is set 
  101.  * to one of the BlastSeqSrcDataType values defined above, and indicates what 
  102.  * data is being returned.
  103.  * First argument is the BlastSeqSrc structure used, second argument is 
  104.  * passed to user-defined implementation. 
  105.  */
  106. typedef ListNode* (*GetGenDataFnPtr) (void*, void*);
  107. /** Function pointer typedef to retrieve sequences from data structure embedded
  108.  * in the BlastSeqSrc structure.
  109.  * First argument is the BlastSeqSrc structure used, second argument is
  110.  * passed to user-defined implementation.
  111.  * (currently, the GetSeqArg structure defined below is used in the engine) */
  112. typedef Int2 (*GetSeqBlkFnPtr) (void*, void*); 
  113. /** Second argument to GetSeqBlkFnPtr */
  114. typedef struct GetSeqArg {
  115.     /** Oid in BLAST database, index in an array of sequences, etc [in] */
  116.     Int4 oid;
  117.     /** Encoding of sequence, ie: BLASTP_ENCODING, NCBI4NA_ENCODING, etc [in] */
  118.     Uint1 encoding;
  119.     /** Sequence to return, if NULL, it should allocated by GetSeqBlkFnPtr, else
  120.      * its contents are freed and the structure is reused [out]*/
  121.     BLAST_SequenceBlk* seq;
  122. } GetSeqArg;
  123. /* Return values from GetSeqBlkFnPtr */
  124. #define BLAST_SEQSRC_ERROR      -2  /**< Error while retrieving sequence */
  125. #define BLAST_SEQSRC_EOF        -1  /**< No more sequences available */
  126. #define BLAST_SEQSRC_SUCCESS     0  /**< Successful sequence retrieval */
  127. /******************** BlastSeqSrcIterator API *******************************/
  128. /** Defines the type of data contained in the BlastSeqSrcIterator structure */
  129. typedef enum BlastSeqSrcItrType {
  130.     eOidList,   /**< Data is a list of discontiguous ordinal ids (indices) */
  131.     eOidRange   /**< Data is a range of contiguous ordinal ids (indices) */
  132. } BlastSeqSrcItrType;
  133. /** Definition of Blast Sequence Source Iterator */
  134. typedef struct BlastSeqSrcIterator {
  135.     /** Indicates which member to access: oid_list or oid_range */
  136.     BlastSeqSrcItrType  itr_type;
  137.     /** Array of ordinal ids used when itr_type is eOidList */
  138.     unsigned int* oid_list;
  139.     /** This is a half-closed interval [a,b) */
  140.     unsigned int  oid_range[2];
  141.     /** Keep track of this iterator's current position */
  142.     unsigned int  current_pos;
  143.     /** Size of the chunks to advance over the BlastSeqSrc, also size of 
  144.       * oid_list member */
  145.     unsigned int  chunk_sz;
  146.     /* Starting oid for the next chunk/range */
  147.     unsigned int next_oid;
  148. } BlastSeqSrcIterator;
  149. /** Allocated and initialized an iterator over a BlastSeqSrc. 
  150.  * @param chunk_sz sets the chunk size of the iterator. [in]
  151.  */
  152. BlastSeqSrcIterator* BlastSeqSrcIteratorNew(unsigned int chunk_sz);
  153. /** Frees the BlastSeqSrcIterator structure. 
  154.  * @param itr BlastSeqSrcIterator to free [in]
  155.  * @return NULL
  156.  */
  157. BlastSeqSrcIterator* BlastSeqSrcIteratorFree(BlastSeqSrcIterator* itr);
  158. Int4 BlastSeqSrcIteratorNext(const BlastSeqSrc* bssp, BlastSeqSrcIterator* itr);
  159. /** Function pointer typedef to obtain the next ordinal id to fetch from the
  160.  * BlastSeqSrc structure. First argument is the BlastSeqSrc structure used,
  161.  * second argument is the iterator structure. This structure should allow
  162.  * multi-threaded iteration over sequence sources such as a BLAST database.
  163.  * Return value is the next ordinal id, or BLAST_SEQSRC_EOF if no more
  164.  * sequences are available.
  165.  */
  166. typedef Int4 (*AdvanceIteratorFnPtr) (void*, BlastSeqSrcIterator*);
  167. /** Function pointer typedef to obtain the next chunk of ordinal ids for the
  168.  * BLAST engine to search. By calling this function with a give chunk size
  169.  * (stored in the iterator structure), one reduces the number of calls which
  170.  * have to be guarded by a mutex in a multi-threaded environment by examining
  171.  * the BlastSeqSrc structure infrequently.
  172.  * First argument is the BlastSeqSrc structure used, second argument is the 
  173.  * iterator structure which is updated with the next chunk of ordinal ids to
  174.  * retrieve.
  175.  * Return value is one of the BLAST_SEQSRC_* defines
  176.  */
  177. typedef Int2 (*GetNextChunkFnPtr) (void*, BlastSeqSrcIterator*);
  178. /*****************************************************************************/
  179. /** Structure that contains the information needed for BlastSeqSrcNew to fully
  180.  * populate the BlastSeqSrc structure it returns */
  181. typedef struct BlastSeqSrcNewInfo {
  182.     BlastSeqSrcConstructor constructor; /**< User-defined function to initialize
  183.                                           a BlastSeqSrc structure */
  184.     void* ctor_argument;                /**< Argument to the above function */
  185. } BlastSeqSrcNewInfo;
  186. /** Allocates memory for a BlastSeqSrc structure and then invokes the
  187.  * constructor function defined in its first argument, passing the 
  188.  * ctor_argument member of that same structure. If the constructor function
  189.  * pointer is not set, NULL is returned.
  190.  * @param bssn_info Structure defining constructor and its argument to be
  191.  *        invoked from this function [in]
  192.  */
  193. BlastSeqSrc* BlastSeqSrcNew(const BlastSeqSrcNewInfo* bssn_info);
  194. /** Frees the BlastSeqSrc structure by invoking the destructor function set by
  195.  * the user-defined constructor function when the structure is initialized
  196.  * (indirectly, by BlastSeqSrcNew). If the destructor function pointer is not
  197.  * set, a memory leak could occur.
  198.  * @param bssp BlastSeqSrc to free [in]
  199.  * @return NULL
  200.  */
  201. BlastSeqSrc* BlastSeqSrcFree(BlastSeqSrc* bssp);
  202. /** Convenience macros call function pointers (TODO: needs to be more robust)
  203.  * Currently, this defines the API */
  204. #define BLASTSeqSrcGetNumSeqs(bssp) 
  205.     (*GetGetNumSeqs(bssp))(GetDataStructure(bssp), NULL)
  206. #define BLASTSeqSrcGetMaxSeqLen(bssp) 
  207.     (*GetGetMaxSeqLen(bssp))(GetDataStructure(bssp), NULL)
  208. #define BLASTSeqSrcGetAvgSeqLen(bssp) 
  209.     (*GetGetAvgSeqLen(bssp))(GetDataStructure(bssp), NULL)
  210. #define BLASTSeqSrcGetTotLen(bssp) 
  211.     (*GetGetTotLen(bssp))(GetDataStructure(bssp), NULL)
  212. #define BLASTSeqSrcGetName(bssp) 
  213.     (*GetGetName(bssp))(GetDataStructure(bssp), NULL)
  214. #define BLASTSeqSrcGetDefinition(bssp) 
  215.     (*GetGetDefinition(bssp))(GetDataStructure(bssp), NULL)
  216. #define BLASTSeqSrcGetDate(bssp) 
  217.     (*GetGetDate(bssp))(GetDataStructure(bssp), NULL)
  218. #define BLASTSeqSrcGetIsProt(bssp) 
  219.     (*GetGetIsProt(bssp))(GetDataStructure(bssp), NULL)
  220. #define BLASTSeqSrcGetSequence(bssp, arg) 
  221.     (*GetGetSequence(bssp))(GetDataStructure(bssp), arg)
  222. #define BLASTSeqSrcGetSeqIdStr(bssp, arg) 
  223.     (*GetGetSeqIdStr(bssp))(GetDataStructure(bssp), arg)
  224. #define BLASTSeqSrcGetSeqId(bssp, arg) 
  225.     (*GetGetSeqId(bssp))(GetDataStructure(bssp), arg)
  226. #define BLASTSeqSrcGetSeqLoc(bssp, arg) 
  227.     (*GetGetSeqLoc(bssp))(GetDataStructure(bssp), arg)
  228. #define BLASTSeqSrcGetSeqLen(bssp, arg) 
  229.     (*GetGetSeqLen(bssp))(GetDataStructure(bssp), arg)
  230. #define BLASTSeqSrcGetNextChunk(bssp, iterator) 
  231.     (*GetGetNextChunk(bssp))(GetDataStructure(bssp), iterator)
  232. #define BLASTSeqSrcGetError(bssp) 
  233.     (*GetGetError(bssp))(GetDataStructure(bssp), NULL)
  234. #define BLASTSeqSrcRetSequence(bssp, arg) 
  235.     (*GetRetSequence(bssp))(GetDataStructure(bssp), arg)
  236. #define DECLARE_MEMBER_FUNCTIONS(member_type, member, data_structure_type) 
  237. DECLARE_ACCESSOR(member_type, member, data_structure_type); 
  238. DECLARE_MUTATOR(member_type, member, data_structure_type)
  239. #define DECLARE_ACCESSOR(member_type, member, data_structure_type) 
  240. member_type Get##member(const data_structure_type var)
  241. #define DECLARE_MUTATOR(member_type, member, data_structure_type) 
  242. void Set##member(data_structure_type var, member_type arg) 
  243. DECLARE_MEMBER_FUNCTIONS(BlastSeqSrcConstructor, NewFnPtr, BlastSeqSrc*);
  244. DECLARE_MEMBER_FUNCTIONS(BlastSeqSrcDestructor, DeleteFnPtr, BlastSeqSrc*);
  245. DECLARE_MEMBER_FUNCTIONS(void*, DataStructure, BlastSeqSrc*);
  246. DECLARE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetNumSeqs, BlastSeqSrc*);
  247. DECLARE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetMaxSeqLen, BlastSeqSrc*);
  248. DECLARE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetAvgSeqLen, BlastSeqSrc*);
  249. DECLARE_MEMBER_FUNCTIONS(GetInt8FnPtr, GetTotLen, BlastSeqSrc*);
  250. DECLARE_MEMBER_FUNCTIONS(GetStrFnPtr, GetName, BlastSeqSrc*);
  251. DECLARE_MEMBER_FUNCTIONS(GetStrFnPtr, GetDefinition, BlastSeqSrc*);
  252. DECLARE_MEMBER_FUNCTIONS(GetStrFnPtr, GetDate, BlastSeqSrc*);
  253. DECLARE_MEMBER_FUNCTIONS(GetBoolFnPtr, GetIsProt, BlastSeqSrc*);
  254. DECLARE_MEMBER_FUNCTIONS(GetSeqBlkFnPtr, GetSequence, BlastSeqSrc*);
  255. DECLARE_MEMBER_FUNCTIONS(GetStrFnPtr, GetSeqIdStr, BlastSeqSrc*);
  256. DECLARE_MEMBER_FUNCTIONS(GetGenDataFnPtr, GetSeqId, BlastSeqSrc*);
  257. DECLARE_MEMBER_FUNCTIONS(GetGenDataFnPtr, GetSeqLoc, BlastSeqSrc*);
  258. DECLARE_MEMBER_FUNCTIONS(GetInt4FnPtr, GetSeqLen, BlastSeqSrc*);
  259. DECLARE_MEMBER_FUNCTIONS(GetNextChunkFnPtr, GetNextChunk, BlastSeqSrc*);
  260. DECLARE_MEMBER_FUNCTIONS(AdvanceIteratorFnPtr, IterNext, BlastSeqSrc*);
  261. DECLARE_MEMBER_FUNCTIONS(GetGenDataFnPtr, GetError, BlastSeqSrc*);
  262. DECLARE_MEMBER_FUNCTIONS(GetSeqBlkFnPtr, RetSequence, BlastSeqSrc*);
  263. #ifdef __cplusplus
  264. }
  265. #endif
  266. #endif /* BLAST_SEQSRC_H */