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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: mb_lookup.h,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:04:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: mb_lookup.h,v 1000.2 2004/06/01 18:04:16 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.  * Author: Ilya Dondoshansky
  35.  *
  36.  */
  37. /** @file mb_lookup.h
  38.  * Functions responsible for the creation of a lookup table
  39.  * @todo FIXME: shouldn't file description read megablast lookup table? ; use
  40.  * doxygen comments
  41.  */
  42. #ifndef MBLOOKUP__H
  43. #define MBLOOKUP__H
  44. #ifdef __cplusplus
  45. extern "C" {
  46. #endif
  47. #include <algo/blast/core/blast_def.h>
  48. #include <algo/blast/core/blast_options.h>
  49. #include <algo/blast/core/blast_lookup.h>
  50. /* The fraction of sites that must have at least one hit to not use 
  51.     PV_ARRAY. */
  52. #define PV_ARRAY_FACTOR 0.5
  53. /* Mask to determine whether a residue is an ambiguity */
  54. #define NUC_MASK 0xfc
  55. /* Pack a nucleotide value into an integer index */
  56. #define PACK_EXTRA_CODE(ecode,val,mask) {ecode = ((ecode<<2) & mask) | val;}
  57. /* Get the 2 bit base starting from the n-th bit in a sequence byte; advance 
  58.    the base; advance sequence when last base in a byte is retrieved */
  59. #define GET_NEXT_PACKED_NUCL(s,n,val) { val = ((*s)>>(n)) & 0x00000003; n = (n-2)&0x07; s = s + ((n>>1)&(n>>2)&0x01); }
  60. /* OPTIMAL templates */
  61.   
  62. /*   1,110,110,110,110,111 - 12 of 16 */ 
  63. /*   1,110,010,110,110,111 - 11 of 16 */ 
  64. #define MASK1_OPT       0x0000003f
  65. #define MASK2_OPT       0x00000f00
  66. #define MASK3_OPT       0x0003c000
  67. #define MASK4_12_OPT    0x00f00000
  68. #define MASK4_11_OPT    0x00300000
  69. #define MASK5_OPT       0xfc000000
  70. /* 12 of 16 */ 
  71. #define GET_WORD_INDEX_12_16_OPT(n) (((n)&MASK1_OPT) | (((n)&MASK2_OPT)>>2) | (((n)&MASK3_OPT)>>4) | (((n)&MASK4_12_OPT)>>6) | (((n)&MASK5_OPT)>>8))
  72. /* 11 of 16 */ 
  73. #define GET_WORD_INDEX_11_16_OPT(n) (((n)&MASK1_OPT) | (((n)&MASK2_OPT)>>2) | (((n)&MASK3_OPT)>>4) | (((n)&MASK4_11_OPT)>>6) | (((n)&MASK5_OPT)>>10))
  74.   
  75. /* 111,010,110,010,110,111 - 12 of 18 */ 
  76. /* 111,010,010,110,010,111 - 11 of 18 */ 
  77. #define MASK1_18_OPT    0x00000003
  78. #define MASK2_12_18_OPT 0x000000f0
  79. #define MASK2_11_18_OPT 0x00000030
  80. #define MASK3_11_18_OPT 0x00003c00
  81. #define MASK3_12_18_OPT 0x00000c00
  82. #define MASK4_11_18_OPT 0x00030000
  83. #define MASK4_12_18_OPT 0x000f0000
  84. #define MASK5_18_OPT    0x00c00000
  85. #define MASK6_18_OPT    0xfc000000
  86. /* 12 of 18 */
  87. #define GET_WORD_INDEX_12_18_OPT(n) ((((n)&MASK1_18_OPT)<<4) | (((n)&MASK2_12_18_OPT)<<2) | ((n)&MASK3_12_18_OPT) | (((n)&MASK4_12_18_OPT)>>4) | (((n)&MASK5_18_OPT)>>6) | (((n)&MASK6_18_OPT)>>8))
  88. /* 11 of 18 */
  89. #define GET_WORD_INDEX_11_18_OPT(n) ((((n)&MASK1_18_OPT)<<4) | (((n)&MASK2_11_18_OPT)<<2) | (((n)&MASK3_11_18_OPT)>>2) | (((n)&MASK4_11_18_OPT)>>4) | (((n)&MASK5_18_OPT)>>8) | (((n)&MASK6_18_OPT)>>10))
  90. #define MASK_EXTRA_OPT 0x0000000f
  91. #define GET_EXTRA_CODE_18_OPT(s) (((*(s+1))<<2) | (*(s+2))) & MASK_EXTRA_OPT
  92. #define GET_EXTRA_CODE_PACKED_4_18_OPT(s) ((*(s))>>4)
  93. #define GET_EXTRA_CODE_PACKED_18_OPT(s,b,val,ecode) {GET_NEXT_PACKED_NUCL(s,b,ecode); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode, val,MASK_EXTRA_OPT);}
  94. #define GET_AMBIG_CONDITION_18_OPT(s) (((*(s+1))&NUC_MASK) | (((*(s+2))&NUC_MASK)))
  95. /* 111,010,010,110,010,010,111 - 12 of 21 */
  96. /* 111,010,010,100,010,010,111 - 11 of 21 */
  97. #define MASK1_21_OPT    0x00000030
  98. #define MASK2_12_21_OPT 0x00003c00
  99. #define MASK2_11_21_OPT 0x00003000
  100. #define MASK3_21_OPT    0x00030000
  101. #define MASK4_21_OPT    0x00c00000
  102. #define MASK5_21_OPT    0xfc000000
  103. #define GET_WORD_INDEX_12_21_OPT(n) ((((n)&MASK1_21_OPT)<<4) | ((n)&MASK2_12_21_OPT) | (((n)&MASK3_21_OPT)>>2) | (((n)&MASK4_21_OPT)>>6) | (((n)&MASK5_21_OPT)>>8))
  104. #define GET_WORD_INDEX_11_21_OPT(n) ((((n)&MASK1_21_OPT)<<4) | (((n)&MASK2_11_21_OPT)>>2) | (((n)&MASK3_21_OPT)>>4) | (((n)&MASK4_21_OPT)>>8) | (((n)&MASK5_21_OPT)>>10))
  105. #define MASK_EXTRA_21_OPT 0x000000ff
  106. #define GET_EXTRA_CODE_21_OPT(s) ((((*(s+1))<<6) | ((*(s+3))<<4) | ((*(s+4))<<2) | (*(s+5))) & MASK_EXTRA_21_OPT)
  107. #define GET_AMBIG_CONDITION_21_OPT(s) (((*(s+1))&NUC_MASK) | ((*(s+3))&NUC_MASK) | ((*(s+4))&NUC_MASK) | ((*(s+5))&NUC_MASK))
  108. #define GET_EXTRA_CODE_PACKED_4_21_OPT(s) ((((*(s))&0x0f)<<2)|((*(s))&0xc0)|((*(s+1))>>6))
  109. #define GET_EXTRA_CODE_PACKED_21_OPT(s,b,val,ecode) {GET_NEXT_PACKED_NUCL(s,b,ecode); GET_NEXT_PACKED_NUCL(s,b,val); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21_OPT); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21_OPT); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21_OPT);}
  110. /* CODING TEMPLATES */
  111. /*    111,110,110,110,110,1 - 12 of 16 */
  112. /*    110,110,110,110,110,1 - 11 of 16 */
  113. #define MASK1    0x00000003
  114. #define MASK2    0x000000f0
  115. #define MASK3    0x00003c00
  116. #define MASK4    0x000f0000
  117. #define MASK5_12 0xffc00000
  118. #define MASK5_11 0x03c00000
  119. #define MASK6    0xf0000000
  120. /* 12 of 16 */
  121. #define GET_WORD_INDEX_12_16(n) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3)>>4) | (((n)&MASK4)>>6) | (((n)&MASK5_12)>>8))
  122. /* 11 of 16 */
  123. #define GET_WORD_INDEX_11_16(n) (((n)&MASK1) | (((n)&MASK2)>>2) | (((n)&MASK3)>>4) | (((n)&MASK4)>>6) | (((n)&MASK5_11)>>8) | (((n)&MASK6)>>10))
  124. /* 10,110,110,110,110,110,1 - 12 of 18 */
  125. /* 10,110,110,010,110,110,1 - 11 of 18 */
  126. #define MASK1_18    0x0000000f
  127. #define MASK2_18    0x000003c0
  128. #define MASK3_11_18 0x00003000
  129. #define MASK3_12_18 0x0000f000
  130. #define MASK4_18    0x003c0000
  131. #define MASK5_18    0x0f000000
  132. #define MASK6_18    0xc0000000
  133. /* 12 of 18 */
  134. #define GET_WORD_INDEX_12_18(n) ((((n)&MASK1_18)<<2) | ((n)&MASK2_18) | (((n)&MASK3_12_18)>>2) | (((n)&MASK4_18)>>4) | (((n)&MASK5_18)>>6) | (((n)&MASK6_18)>>8))
  135. /* 11 of 18 */
  136. #define GET_WORD_INDEX_11_18(n) ((((n)&MASK1_18)<<2) | ((n)&MASK2_18) | (((n)&MASK3_11_18)>>2) | (((n)&MASK4_18)>>6) | (((n)&MASK5_18)>>8) | (((n)&MASK6_18)>>10))
  137. #define MASK_EXTRA_18 0x00000003
  138. #define GET_EXTRA_CODE_18(s) ((*(s+2)) & MASK_EXTRA_18)
  139. #define GET_EXTRA_CODE_PACKED_4_18(s) (((*(s))>>4) & MASK_EXTRA_18)
  140. #define GET_EXTRA_CODE_PACKED_18(s,b,val,ecode) {GET_NEXT_PACKED_NUCL(s,b,val); GET_NEXT_PACKED_NUCL(s,b,ecode);}
  141. #define GET_AMBIG_CONDITION_18(s) ((*(s+2))&NUC_MASK)
  142. /* 10,010,110,110,110,010,110,1 - 12 of 21 */
  143. /* 10,010,110,010,110,010,110,1 - 11 of 21 */
  144. #define MASK1_21    0x00000003
  145. #define MASK2_21    0x000003c0
  146. #define MASK3_12_21 0x0000f000
  147. #define MASK3_11_21 0x00003000
  148. #define MASK4_21    0x003c0000
  149. #define MASK5_21    0x03000000
  150. #define MASK6_21    0xc0000000
  151. #define GET_WORD_INDEX_12_21(n) ((((n)&MASK1_21)<<6) | (((n)&MASK2_21)<<2) | ((n)&MASK3_12_21) | (((n)&MASK4_21)>>2) | (((n)&MASK5_21)>>4) | (((n)&MASK6_21)>>8))
  152. #define GET_WORD_INDEX_11_21(n) ((((n)&MASK1_21)<<6) | (((n)&MASK2_21)<<2) | ((n)&MASK3_11_21) | (((n)&MASK4_21)>>4) | (((n)&MASK5_21)>>6) | (((n)&MASK6_21)>>10))
  153. #define MASK_EXTRA_21 0x0000003f
  154. #define GET_EXTRA_CODE_21(s) ((((*(s+2))<<4) | ((*(s+3))<<2) | (*(s+5))) & MASK_EXTRA_21)
  155. #define GET_AMBIG_CONDITION_21(s) (((*(s+2))&NUC_MASK) | ((*(s+3))&NUC_MASK) | ((*(s+5))&NUC_MASK))
  156. #define GET_EXTRA_CODE_PACKED_4_21(s) (((*(s))&0x3c)|((*(s+1))>>6))
  157. #define GET_EXTRA_CODE_PACKED_21(s,b,val,ecode) {GET_NEXT_PACKED_NUCL(s,b,val); GET_NEXT_PACKED_NUCL(s,b,ecode); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21); GET_NEXT_PACKED_NUCL(s,b,val); GET_NEXT_PACKED_NUCL(s,b,val); PACK_EXTRA_CODE(ecode,val,MASK_EXTRA_21);}
  158. /** The lookup table structure used for Mega BLAST, generally with width 12 */
  159. typedef struct MBLookupTable {
  160.    Int4 hashsize;       /**< = 2^(8*width) */ 
  161.    Int4 mask;           /**< hashsize - 1 */
  162.    Int2 compressed_wordsize;/**< Number of bytes in intersection between 
  163.                                consecutive words */
  164.    Int2 word_length;      /**< The length of the initial word without the 
  165.                              extra part */
  166.    Boolean discontiguous; /**< Are discontiguous words used? */
  167.    Uint1 template_length; /**< Length of the discontiguous word template */
  168.    Uint1 template_type; /**< Type of the discontiguous word template */
  169.    Boolean two_templates; /**< Use two templates simultaneously */
  170.    Uint1 second_template_type; /**< Type of the second discontiguous word 
  171.                                   template */
  172.    Int4 scan_step;     /**< Step size for scanning the database */
  173.    Boolean full_byte_scan; 
  174.    Int4* hashtable;   /**< Array of positions              */
  175.    Int4* hashtable2;  /**< Array of positions for second template */
  176.    Int4* next_pos;    /**< Extra positions stored here     */
  177.    Int4* next_pos2;   /**< Extra positions for the second template */
  178.    Int4 num_unique_pos_added; /**< Number of positions added to the l.t. */
  179.    PV_ARRAY_TYPE *pv_array;/**< Presence vector, used for quick presence 
  180.                               check */
  181.    Int4 pv_array_bts; /**< The exponent of 2 by which pv_array is smaller than
  182.                           the backbone */
  183.    Int4 longest_chain; /**< Largest number of query positions for a given 
  184.                           word */
  185. } MBLookupTable;
  186. /**
  187.  * Create the lookup table for Mega BLAST 
  188.  * @param query The query sequence block (if concatenated sequence, the 
  189.  *        individual strands/sequences must be separated by a 0x0f byte)[in]
  190.  * @param location The locations to be included in the lookup table,
  191.  *        e.g. [0,length-1] for full sequence. NULL means no sequence. [in]
  192.  * @param mb_lt_ptr Pointer to the lookup table to be created [out]
  193.  * @param lookup_options Options for lookup table creation [in]
  194.  */
  195. Int2 MB_LookupTableNew(BLAST_SequenceBlk* query, ListNode* location,
  196.                        MBLookupTable** mb_lt_ptr,
  197.                        const LookupTableOptions* lookup_options);
  198. /** 
  199.  * Deallocate memory used by the Mega BLAST lookup table
  200.  */
  201. MBLookupTable* MBLookupTableDestruct(MBLookupTable* mb_lt);
  202. /* General types of discontiguous word templates */   
  203. typedef enum {
  204.    MB_WORD_CODING = 0,
  205.    MB_WORD_OPTIMAL = 1,
  206.    MB_TWO_TEMPLATES = 2
  207. } DiscWordType;
  208. /* Enumeration of all discontiguous word templates; the enumerated values 
  209.  *  encode the weight, template length and type information 
  210.  */
  211. typedef enum {
  212.    TEMPL_CONTIGUOUS = 0,
  213.    TEMPL_11_16 = 1,
  214.    TEMPL_11_16_OPT = 2,
  215.    TEMPL_12_16 = 3,
  216.    TEMPL_12_16_OPT = 4,
  217.    TEMPL_11_18 = 5,
  218.    TEMPL_11_18_OPT = 6,
  219.    TEMPL_12_18 = 7,
  220.    TEMPL_12_18_OPT = 8,
  221.    TEMPL_11_21 = 9,
  222.    TEMPL_11_21_OPT = 10,
  223.    TEMPL_12_21 = 11,
  224.    TEMPL_12_21_OPT = 12
  225. } DiscTemplateType;
  226. /** Scan the compressed subject sequence, returning all word hits, using the
  227.  * old MegaBLAST approach - looking up words at every byte (4 bases) of the 
  228.  * sequence. Lookup table is presumed to have a traditional MegaBLAST 
  229.  * structure.
  230.  * @param lookup Pointer to the (wrapper to) lookup table [in]
  231.  * @param subject The (compressed) sequence to be scanned for words [in]
  232.  * @param start_offset The offset into the sequence in actual coordinates [in]
  233.  * @param q_offsets Array of query positions where words are found [out]
  234.  * @param s_offsets Array of subject positions where words are found [out]
  235.  * @param max_hits The allocated size of the above arrays - how many offsets 
  236.  *        can be returned [in]
  237.  * @param end_offset Where the scanning should stop [in], has stopped [out]
  238. */
  239. Int4 MB_ScanSubject(const LookupTableWrap* lookup,
  240.        const BLAST_SequenceBlk* subject, Int4 start_offset,
  241.        Uint4* q_offsets, Uint4* s_offsets, Int4 max_hits,
  242.        Int4* end_offset);
  243. /** Scan the compressed subject sequence, returning all word hits, looking up 
  244.  * discontiguous words. Lookup table is presumed to have a traditional 
  245.  * MegaBLAST structure containing discontiguous word positions.
  246.  * @param lookup Pointer to the (wrapper to) lookup table [in]
  247.  * @param subject The (compressed) sequence to be scanned for words [in]
  248.  * @param start_offset The offset into the sequence in actual coordinates [in]
  249.  * @param q_offsets Array of query positions where words are found [out]
  250.  * @param s_offsets Array of subject positions where words are found [out]
  251.  * @param max_hits The allocated size of the above arrays - how many offsets 
  252.  *        can be returned [in]
  253.  * @param end_offset Where the scanning should stop [in], has stopped [out]
  254. */
  255. Int4 MB_DiscWordScanSubject(const LookupTableWrap* lookup,
  256.        const BLAST_SequenceBlk* subject, Int4 start_offset, 
  257.        Uint4* q_offsets, Uint4* s_offsets, Int4 max_hits,     
  258.        Int4* end_offset);
  259. /** Scan the compressed subject sequence, returning all word hits, using the 
  260.  * arbitrary stride. Lookup table is presumed to have a traditional MegaBLAST 
  261.  * structure.
  262.  * @param lookup Pointer to the (wrapper to) lookup table [in]
  263.  * @param subject The (compressed) sequence to be scanned for words [in]
  264.  * @param start_offset The offset into the sequence in actual coordinates [in]
  265.  * @param q_offsets Array of query positions where words are found [out]
  266.  * @param s_offsets Array of subject positions where words are found [out]
  267.  * @param max_hits The allocated size of the above arrays - how many offsets 
  268.  *        can be returned [in]
  269.  * @param end_offset Where the scanning should stop [in], has stopped [out]
  270. */
  271. Int4 MB_AG_ScanSubject(const LookupTableWrap* lookup,
  272.        const BLAST_SequenceBlk* subject, Int4 start_offset,
  273.        Uint4* q_offsets, Uint4* s_offsets, Int4 max_hits,
  274.        Int4* end_offset); 
  275. #ifdef __cplusplus
  276. }
  277. #endif
  278. #endif /* MBLOOKUP__H */