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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_lookup.h,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:03:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blast_lookup.h,v 1000.2 2004/06/01 18:03:34 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 offical 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. /** @file blast_lookup.h
  35.  * @todo FIXME: Need description (protein/rps lookup structures & word finding
  36.  * routines?)
  37.  */
  38. #include <algo/blast/core/blast_def.h>
  39. #include <algo/blast/core/blast_options.h>
  40. #include <algo/blast/core/blast_rps.h>
  41. #include <algo/blast/core/lookup_wrap.h>
  42. #ifndef BLAST_LOOKUP__H
  43. #define BLAST_LOOKUP__H
  44. #ifdef __cplusplus
  45. extern "C" {
  46. #endif
  47. /* some defines for the pv_array, as this changes from 32-bit to 64-bit systems. */
  48. #if defined(LONG_BIT) && LONG_BIT==64
  49. #define PV_ARRAY_TYPE Uint8     /* The pv_array 'native' type. */
  50. #define PV_ARRAY_BYTES 8        /* number of BYTES in 'native' type. */
  51. #define PV_ARRAY_BTS 6          /* bits-to-shift from lookup_index to pv_array index. */
  52. #define PV_ARRAY_MASK 63        /* amount to mask off. */
  53. #else
  54. #define PV_ARRAY_TYPE Uint4     /* The pv_array 'native' type. */
  55. #define PV_ARRAY_BYTES 4        /* number of BYTES in 'native' type. */
  56. #define PV_ARRAY_BTS 5          /* bits-to-shift from lookup_index to pv_array index. */
  57. #define PV_ARRAY_MASK 31        /* amount to mask off. */
  58. #endif
  59. #define PV_SET(lookup, index) ( (lookup)->pv[(index)>>PV_ARRAY_BTS] |= 1 << ((index) & PV_ARRAY_MASK) )
  60. #define PV_TEST(lookup, index) ( (lookup)->pv[(index)>>PV_ARRAY_BTS] & 1 << ((index) & PV_ARRAY_MASK) )
  61. /* Number of bits to shift in lookup index calculation when scanning compressed
  62.  * nucleotide sequence
  63.  */
  64. #define FULL_BYTE_SHIFT 8
  65.   /* structure defining one cell of the compacted lookup table */
  66.   /* stores the number of hits and
  67.       up to three hits if the total number of hits is <= 3
  68.         or
  69.       a pointer to more hits if the total number of hits is > 3
  70.   */
  71. #define HITS_ON_BACKBONE 3
  72.   typedef struct LookupBackboneCell {
  73.     Int4 num_used;       /* num valid positions */
  74.     union {
  75.       Int4 overflow_cursor;
  76.       Int4 entries[HITS_ON_BACKBONE];
  77.     } payload;
  78.   } LookupBackboneCell;
  79.     
  80.   typedef struct LookupTable {
  81.     Int4 threshold; /* the score threshold for neighboring words */
  82.     Int4 neighbor_matches; /* the number of neighboring words found while indexing the queries, used for informational/debugging purposes */
  83.     Int4 exact_matches; /* the number of exact matches found while indexing the queries, used for informational/debugging purposes */
  84.     Int4 mask; /* part of index to mask off, that is, top (wordsize*charsize) bits should be discarded. */
  85.     Int4 word_length; /* Length in bases of the full word match required to 
  86.   trigger extension */
  87.     Int4 wordsize; /* number of full bytes in a full word */
  88.     Int4 reduced_wordsize; /* number of bytes in a word stored in the LT */
  89.     Int4 charsize; /* number of bits for a base/residue */
  90.     Int4 scan_step; /* number of bases between successive words */
  91.     Int4 alphabet_size; /* number of letters in the alphabet */
  92.     Int4 backbone_size; /* number of cells in the backbone */
  93.     Int4 longest_chain; /* length of the longest chain on the backbone */
  94.     Int4 ** thin_backbone; /* the "thin" backbone. for each index cell, maintain a pointer to a dynamically-allocated chain of hits. */
  95.     LookupBackboneCell * thick_backbone; /* the "thick" backbone. after queries are indexed, compact the backbone to put at most HITS_ON_BACKBONE hits on the backbone, otherwise point to some overflow storage */
  96.     Int4 * overflow; /* the overflow array for the compacted lookup table */
  97.     Int4  overflow_size; /* Number of elements in the overflow array (above). */
  98.     PV_ARRAY_TYPE *pv; /* presence vector. a bit vector indicating which cells are occupied */
  99.     Uint1* neighbors; /* neighboring word array */
  100.     Int4 neighbors_length; /* length of neighboring word array */
  101.     Boolean use_pssm; /* if True use PSSM rather than (protein) sequence to construct lookup table. */
  102.   } LookupTable;
  103.   
  104.   /** Create a mapping from word w to the supplied query offset
  105.  *
  106.  * @param lookup the lookup table [in]
  107.  * @param w pointer to the beginning of the word [in]
  108.  * @param query_offset the offset in the query where the word occurs [in]
  109.  * @return Zero.
  110.  */
  111. Int4 BlastAaLookupAddWordHit(LookupTable* lookup,
  112.                              Uint1* w,
  113.                              Int4 query_offset);
  114. /** Convert the chained lookup table to the pv_array and thick_backbone.
  115.  *
  116.  * @param lookup the lookup table [in]
  117.  * @return Zero.
  118.  */
  119. Int4 _BlastAaLookupFinalize(LookupTable* lookup);
  120. /**
  121.  * Scans the subject sequence from "offset" to the end of the sequence.
  122.  * Copies at most array_size hits.
  123.  * Returns the number of hits found.
  124.  * If there isn't enough room to copy all the hits, return early, and update
  125.  * "offset". 
  126.  *
  127.  * @param lookup_wrap the lookup table [in]
  128.  * @param subject the subject sequence [in]
  129.  * @param offset the offset in the subject at which to begin scanning [in/out]
  130.  * @param query_offsets array to which hits will be copied [out]
  131.  * @param subject_offsets array to which hits will be copied [out]
  132.  * @param array_size length of the offset arrays [in]
  133.  * @return The number of hits found.
  134.  */
  135. Int4 BlastAaScanSubject(const LookupTableWrap* lookup_wrap, /* in: the LUT */
  136.                         const BLAST_SequenceBlk *subject,
  137.                         Int4* offset,
  138.                         Uint4 * NCBI_RESTRICT query_offsets, /* out: pointer to the array to which hits will be copied */
  139.                         Uint4 * NCBI_RESTRICT subject_offsets, /* out : pointer to the array where offsets will be stored */
  140.                         Int4 array_size);
  141. /**
  142.  * Scans the RPS query sequence from "offset" to the end of the sequence.
  143.  * Copies at most array_size hits.
  144.  * Returns the number of hits found.
  145.  * If there isn't enough room to copy all the hits, return early, and update
  146.  * "offset". 
  147.  *
  148.  * @param lookup_wrap the lookup table [in]
  149.  * @param sequence the subject sequence [in]
  150.  * @param offset the offset in the subject at which to begin scanning [in/out]
  151.  * @param table_offsets array to which hits will be copied [out]
  152.  * @param sequence_offsets array to which hits will be copied [out]
  153.  * @param array_size length of the offset arrays [in]
  154.  * @return The number of hits found.
  155.  */
  156. Int4 BlastRPSScanSubject(const LookupTableWrap* lookup_wrap, /* in: the LUT */
  157.                         const BLAST_SequenceBlk *sequence,
  158.                         Int4* offset,
  159.         Uint4 * table_offsets, /* out : pointer to the array where offsets will be stored */
  160.                         Uint4 * sequence_offsets, /* out: pointer to the array to which hits will be copied */
  161.         Int4 array_size);
  162. /** Create a new protein lookup table.
  163.   * @param opt pointer to lookup table options structure [in]
  164.   * @param lut handle to lookup table structure [in/modified]
  165.   */
  166.   
  167. Int4 BlastAaLookupNew(const LookupTableOptions* opt, LookupTable* * lut);
  168. /** Create a new lookup table.
  169.   * @param opt pointer to lookup table options structure [in]
  170.   * @param lut handle to lookup table [in/modified]
  171.   * @param is_protein boolean indicating protein or nucleotide [in]
  172.   */
  173.   
  174. Int4 LookupTableNew(const LookupTableOptions* opt, LookupTable* * lut, 
  175.     Boolean is_protein);
  176. /** Free the lookup table. */
  177. LookupTable* LookupTableDestruct(LookupTable* lookup);
  178. /** Index an array of queries.
  179.  *
  180.  * @param lookup the lookup table [in/modified]
  181.  * @param matrix the substitution matrix [in]
  182.  * @param query the array of queries to index
  183.  * @param unmasked_regions an array of ListNode*s, each of which points to a (list of) integer pair(s) which specify the unmasked region(s) of the query [in]
  184.  * @param num_queries the number of queries [in]
  185.  * @return Zero.
  186.  */
  187. Int4 BlastAaLookupIndexQueries(LookupTable* lookup,
  188.        Int4 ** matrix,
  189.        BLAST_SequenceBlk* query,
  190.        ListNode* unmasked_regions,
  191.        Int4 num_queries);
  192. /** Index a single query.
  193.  *
  194.  * @param lookup the lookup table [in/modified]
  195.  * @param matrix the substitution matrix [in]
  196.  * @param query the array of queries to index
  197.  * @param unmasked_regions a ListNode* which points to a (list of) integer pair(s) which specify the unmasked region(s) of the query [in]
  198.  * @param query_bias number added to each offset put into lookup table (only used for RPS blast database creation, otherwise 0) [in]
  199.  * @return Zero.
  200.  */
  201. Int4 _BlastAaLookupIndexQuery(LookupTable* lookup,
  202.       Int4 ** matrix,
  203.       BLAST_SequenceBlk* query,
  204.       ListNode* unmasked_regions,
  205.                               Int4 query_bias);
  206. /** Create a sequence containing all possible words as subsequences.
  207.  *
  208.  * @param lookup the lookup table [in]
  209.  * @return Zero.
  210.  */
  211. Int4 MakeAllWordSequence(LookupTable* lookup);
  212. /**
  213.  * Find the words in the neighborhood of w, that is, those whose
  214.  * score is greater than t.
  215.  *
  216.  * For typical searches against a database, a sequence containing
  217.  * all possible words (as created by MakeAllWordSequence() is used.
  218.  *
  219.  * For blast-two-sequences type applications, it is not necessary to
  220.  * find all neighboring words; it is sufficient to use the words
  221.  * occurring in the subject sequence.
  222.  *
  223.  * @param lookup the lookup table [in/modified]
  224.  * @param matrix the substitution matrix [in]
  225.  * @param query the query sequence [in]
  226.  * @param offset the offset of the word
  227.  * @param query_bias number added to each offset put into lookup table (only used for RPS blast database creation, otherwise 0) [in]
  228.  * @return Zero.
  229.  */
  230. Int4 AddNeighboringWords(LookupTable* lookup,
  231.  Int4 ** matrix,
  232.  BLAST_SequenceBlk* query,
  233.  Int4 offset,
  234.                          Int4 query_bias);
  235. /* RPS blast structures and functions */
  236. #define RPS_HITS_PER_CELL 3
  237. typedef struct RPSBackboneCell {
  238.     Int4 num_used;
  239.     Int4 entries[RPS_HITS_PER_CELL];
  240. } RPSBackboneCell;
  241. typedef struct RPSLookupTable {
  242.     Int4 wordsize; /* number of full bytes in a full word */
  243.     Int4 longest_chain; /* length of the longest chain on the backbone */
  244.     Int4 mask; /* part of index to mask off, that is, top (wordsize*charsize) bits should be discarded. */
  245.     Int4 alphabet_size; /* number of letters in the alphabet */
  246.     Int4 charsize; /* number of bits for a base/residue */
  247.     Int4 backbone_size; /* number of cells in the backbone */
  248.     RPSBackboneCell * rps_backbone; /* the lookup table used for RPS blast */
  249.     Int4 ** rps_pssm; /* Pointer to memory-mapped RPS Blast profile file */
  250.     Int4 * rps_seq_offsets; /* array of start offsets for each RPS DB seq. */
  251.     RPSAuxInfo* rps_aux_info; /* RPS Blast auxiliary information */
  252.     Int4 * overflow; /* the overflow array for the compacted lookup table */
  253.     Int4  overflow_size; /* Number of elements in the overflow array (above). */
  254.     PV_ARRAY_TYPE *pv; /* presence vector. a bit vector indicating which cells are occupied */
  255. } RPSLookupTable;
  256.   
  257. /** Create a new RPS blast lookup table.
  258.   * @param rps_info pointer to structure with RPS setup information [in]
  259.   * @param lut handle to lookup table [in/modified]
  260.   */
  261.   
  262. Int4 RPSLookupTableNew(const RPSInfo *rps_info, RPSLookupTable* * lut);
  263. /** Free the lookup table. */
  264. RPSLookupTable* RPSLookupTableDestruct(RPSLookupTable* lookup);
  265. /*********************************
  266.  * 
  267.  * Nucleotide functions
  268.  *
  269.  *********************************/
  270. /* Macro to test the presence vector array value for a lookup table index */
  271. #define NA_PV_TEST(pv_array, index, pv_array_bts) (pv_array[(index)>>pv_array_bts]&(((PV_ARRAY_TYPE) 1)<<((index)&PV_ARRAY_MASK)))
  272. /** Scan the compressed subject sequence, returning all word hits, using the 
  273.  *  old BLASTn approach - looking up words at every byte (4 bases) of the 
  274.  *  sequence. Lookup table is presumed to have a traditional BLASTn structure.
  275.  * @param lookup_wrap Pointer to the (wrapper to) lookup table [in]
  276.  * @param subject The (compressed) sequence to be scanned for words [in]
  277.  * @param start_offset The offset into the sequence in actual coordinates [in]
  278.  * @param q_offsets Array of query positions where words are found [out]
  279.  * @param s_offsets Array of subject positions where words are found [out]
  280.  * @param max_hits The allocated size of the above arrays - how many offsets 
  281.  *        can be returned [in]
  282.  * @param end_offset Where the scanning should stop [in], has stopped [out]
  283. */
  284. Int4 BlastNaScanSubject(const LookupTableWrap* lookup_wrap,
  285.                         const BLAST_SequenceBlk* subject,
  286.                         Int4 start_offset,
  287.                         Uint4* NCBI_RESTRICT q_offsets,
  288.                         Uint4* NCBI_RESTRICT s_offsets,
  289.                         Int4 max_hits, 
  290.                         Int4* end_offset);
  291. /** Scan the compressed subject sequence, returning all word hits, using the 
  292.  *  arbitrary stride. Lookup table is presumed to have a traditional BLASTn 
  293.  *  structure. 
  294.  * @param lookup_wrap Pointer to the (wrapper to) lookup table [in]
  295.  * @param subject The (compressed) sequence to be scanned for words [in]
  296.  * @param start_offset The offset into the sequence in actual coordinates [in]
  297.  * @param q_offsets Array of query positions where words are found [out]
  298.  * @param s_offsets Array of subject positions where words are found [out]
  299.  * @param max_hits The allocated size of the above arrays - how many offsets 
  300.  *        can be returned [in]
  301.  * @param end_offset Where the scanning should stop [in], has stopped [out]
  302. */
  303. Int4 BlastNaScanSubject_AG(const LookupTableWrap* lookup_wrap,
  304.                         const BLAST_SequenceBlk* subject,
  305.                         Int4 start_offset,
  306.                         Uint4* NCBI_RESTRICT q_offsets,
  307.                         Uint4* NCBI_RESTRICT s_offsets,
  308.                         Int4 max_hits, 
  309.                         Int4* end_offset);
  310. /** Fill the lookup table for a given query sequence or partial sequence.
  311.  * @param lookup Pointer to the lookup table structure [in] [out]
  312.  * @param query The query sequence [in]
  313.  * @param location What locations on the query sequence to index? [in]
  314.  */
  315. Int4 BlastNaLookupIndexQuery(LookupTable* lookup, BLAST_SequenceBlk* query,
  316.                              ListNode* location);
  317. #ifdef __cplusplus
  318. }
  319. #endif
  320. #endif /* BLAST_LOOKUP__H */