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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_util.h,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:03:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.49
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blast_util.h,v 1000.3 2004/06/01 18:03:57 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 blast_util.h
  38.  * Various auxiliary BLAST utility functions
  39.  */
  40. #ifndef __BLAST_UTIL__
  41. #define __BLAST_UTIL__
  42. #ifdef __cplusplus
  43. extern "C" {
  44. #endif
  45. #include <algo/blast/core/blast_def.h>
  46. #ifdef NCBI_DLL_BUILD
  47. #include <algo/blast/core/blast_export.h>
  48. #endif
  49. #ifndef NCBI_XBLAST_EXPORT
  50. #define NCBI_XBLAST_EXPORT
  51. #endif
  52. /** Different types of sequence encodings for sequence retrieval from the 
  53.  * BLAST database 
  54.  */
  55. #define BLASTP_ENCODING 0
  56. #define BLASTNA_ENCODING 1
  57. #define NCBI4NA_ENCODING 2
  58. #define NCBI2NA_ENCODING 3
  59. #define ERROR_ENCODING 255
  60. #ifndef IS_residue
  61. #define IS_residue(x) (x <= 250)
  62. #endif
  63. /** Bit mask for obtaining a single base from a byte in ncbi2na format */
  64. #define NCBI2NA_MASK 0x03
  65. /** Macro to extract base N from a byte x (N >= 0, N < 4) */
  66. #define NCBI2NA_UNPACK_BASE(x, N) (((x)>>(2*(N))) & NCBI2NA_MASK)
  67. /** Deallocate memory only for the sequence in the sequence block */
  68. Int2 BlastSequenceBlkClean(BLAST_SequenceBlk* seq_blk);
  69.    
  70. /** Deallocate memory for a sequence block */
  71. BLAST_SequenceBlk* BlastSequenceBlkFree(BLAST_SequenceBlk* seq_blk);
  72. /** Copies contents of the source sequence block without copying sequence 
  73.  * buffers; sets all "field_allocated" booleans to FALSE, to make sure 
  74.  * fields are not freed on the call to BlastSequenceBlkFree.
  75.  * @param copy New sequence block [out]
  76.  * @param src Input sequence block [in]
  77.  */
  78. void BlastSequenceBlkCopy(BLAST_SequenceBlk** copy, 
  79.                           BLAST_SequenceBlk* src);
  80. /** Set number for a given program type.  Return is zero on success.
  81.  * @param program string name of program [in]
  82.  * @param number number of program [out]
  83. */
  84. NCBI_XBLAST_EXPORT
  85. Int2 BlastProgram2Number(const char *program, Uint1 *number);
  86. /** Return string name for program given a number.  Return is zero on success.
  87.  * @param number number of program [in]
  88.  * @param program string name of program (memory should be deallocated by called) [out]
  89. */
  90. Int2 BlastNumber2Program(Uint1 number, char* *program);
  91. /** Allocates memory for *sequence_blk and then populates it.
  92.  * @param buffer start of sequence [in]
  93.  * @param length query sequence length [in]
  94.  * @param context context number [in]
  95.  * @param seq_blk SequenceBlk to be allocated and filled in [out]
  96.  * @param buffer_allocated Is the buffer allocated? If yes, 'sequence_start' is
  97.  *        the start of the sequence, otherwise it is 'sequence'. [in]
  98.  * @deprecated Use BlastSeqBlkNew and BlastSeqBlkSet* functions instead
  99. */
  100. Int2
  101. BlastSetUp_SeqBlkNew (const Uint1* buffer, Int4 length, Int4 context,
  102. BLAST_SequenceBlk* *seq_blk, Boolean buffer_allocated);
  103. /** Allocates a new sequence block structure. 
  104.  * @param retval Pointer to where the sequence block structure will be
  105.  * allocated [out]
  106.  */
  107. Int2 BlastSeqBlkNew(BLAST_SequenceBlk** retval);
  108. /** Stores the sequence in the sequence block structure.
  109.  * @param seq_blk The sequence block structure to modify [in/out]
  110.  * @param sequence Actual sequence buffer. The first byte must be a sentinel
  111.  * byte [in]
  112.  * @param seqlen Length of the sequence buffer above [in]
  113.  */
  114. Int2 BlastSeqBlkSetSequence(BLAST_SequenceBlk* seq_blk, 
  115.                             const Uint1* sequence,
  116.                             Int4 seqlen);
  117. /** Stores the compressed nucleotide sequence in the sequence block structure
  118.  * for the subject sequence when BLASTing 2 sequences. This sequence should be
  119.  * encoded in NCBI2NA_ENCODING and NOT have sentinel bytes.
  120.  * @param seq_blk The sequence block structure to modify [in/out]
  121.  * @param sequence Actual sequence buffer. [in]
  122.  */
  123. Int2 BlastSeqBlkSetCompressedSequence(BLAST_SequenceBlk* seq_blk,
  124.                                       const Uint1* sequence);
  125.                             
  126. /** Allocate and initialize the query information structure.
  127.  * @param program_number Type of BLAST program [in]
  128.  * @param num_queries Number of query sequences [in]
  129.  * @param query_info_ptr The initialized structure [out]
  130.  */
  131. Int2 BLAST_QueryInfoInit(Uint1 program_number, 
  132.         Int4 num_queries, BlastQueryInfo* *query_info_ptr);
  133. /** GetTranslation to get the translation of the nucl. sequence in the
  134.  * appropriate frame and with the appropriate GeneticCode.
  135.  * The function return an allocated char*, the caller must delete this.
  136.  * The first and last spaces of this char* contain NULLB's.
  137.  * @param query_seq Forward strand of the nucleotide sequence [in]
  138.  * @param query_seq_rev Reverse strand of the nucleotide sequence [in]
  139.  * @param nt_length Length of the nucleotide sequence [in]
  140.  * @param frame What frame to translate into? [in]
  141.  * @param buffer Preallocated buffer for the translated sequence [in][out]
  142.  * @param genetic_code Genetic code to use for translation, 
  143.  *                     in ncbistdaa encoding [in]
  144.  * @return Length of the traslated protein sequence.
  145. */
  146. Int4 BLAST_GetTranslation(const Uint1* query_seq, 
  147.    const Uint1* query_seq_rev, Int4 nt_length, Int2 frame, Uint1* buffer, 
  148.    const Uint1* genetic_code);
  149. /** Translate a nucleotide sequence without ambiguity codes.
  150.  * This is used for the first-pass translation of the database.
  151.  * The genetic code to be used is determined by the translation_table
  152.  * This function translates a packed (ncbi2na) nucl. alphabet.  It
  153.  * views a basepair as being in one of four sets of 2-bits:
  154.  * |0|1|2|3||0|1|2|3||0|1|2|3||...
  155.  *
  156.  * 1st byte | 2 byte | 3rd byte...
  157.  *
  158.  * A codon that starts at the beginning of the above sequence starts in
  159.  * state "0" and includes basepairs 0, 1, and 2.  The next codon, in the
  160.  * same frame, after that starts in state "3" and includes 3, 0, and 1.
  161.  *
  162.  *** Optimization:
  163.  * changed the single main loop to 
  164.  * - advance to state 0, 
  165.  * - optimized inner loop does two (3 byte->4 codon) translation per iteration
  166.  *   (loads are moved earlier so they can be done in advance.)
  167.  * - do remainder
  168.  *
  169.  * @param translation The translation table [in]
  170.  * @param length Length of the nucleotide sequence [in]
  171.  * @param nt_seq The original nucleotide sequence [in]
  172.  * @param frame What frame to translate to? [in]
  173.  * @param prot_seq Preallocated buffer for the (translated) protein sequence, 
  174.  *                 with NULLB sentinels on either end. [out]
  175. */
  176. Int4 BLAST_TranslateCompressedSequence(Uint1* translation, Int4 length, 
  177.         const Uint1* nt_seq, Int2 frame, Uint1* prot_seq);
  178. /** Reverse a nucleotide sequence in the blastna encoding, adding sentinel 
  179.  * bytes on both ends.
  180.  * @param sequence Forward strand of the sequence [in]
  181.  * @param length Length of the sequence plus 1 for the sentinel byte [in]
  182.  * @param rev_sequence_ptr Reverse strand of the sequence [out]
  183.  */
  184. Int2 GetReverseNuclSequence(const Uint1* sequence, Int4 length, 
  185.                             Uint1** rev_sequence_ptr);
  186. /** This function translates the context number of a context into the frame of 
  187.  * the sequence.
  188.  * @param prog_number Integer corresponding to the BLAST program
  189.  * @param context_number Context number 
  190.  * @return Sequence frame (+-1 for nucleotides, -3..3 for translations)
  191. */
  192. Int2 BLAST_ContextToFrame(Uint1 prog_number, Int4 context_number);
  193. /** Find the length of an individual query within a concatenated set of 
  194.  * queries.
  195.  * @param query_info Queries information structure containing offsets into
  196.  *                   the concatenated sequence [in]
  197.  * @param context Index of the query/strand/frame within the concatenated 
  198.  *                set [in]
  199.  * @return Length of the individual sequence/strand/frame.
  200.  */
  201. Int4 BLAST_GetQueryLength(const BlastQueryInfo* query_info, Int4 context);
  202. /** Deallocate memory for query information structure */
  203. BlastQueryInfo* BlastQueryInfoFree(BlastQueryInfo* query_info);
  204. Int2 BLAST_PackDNA(Uint1* buffer, Int4 length, Uint1 encoding, 
  205.                    Uint1** packed_seq);
  206. /** Initialize the mixed-frame sequence for out-of-frame gapped extension.
  207.  * @param query_blk Sequence block containing the concatenated frames of the 
  208.  *                  query. The mixed-frame sequence is saved here. [in] [out]
  209.  * @param query_info Query information structure containing offsets into the* 
  210.  *                   concatenated sequence. [in]
  211.  */
  212. Int2 BLAST_InitDNAPSequence(BLAST_SequenceBlk* query_blk, 
  213.                        BlastQueryInfo* query_info);
  214. /** Translate nucleotide into 6 frames. All frames are put into a 
  215.  * translation buffer, with sentinel NULLB bytes in between.
  216.  * Array of offsets into the translation buffer is also returned.
  217.  * For out-of-frame gapping option, a mixed frame sequence is created.
  218.  * @param nucl_seq The nucleotide sequence [in] 
  219.  * @param encoding Sequence encoding: ncbi2na or ncbi4na [in]
  220.  * @param nucl_length Length of the nucleotide sequence [in]
  221.  * @param genetic_code The genetic code to be used for translations,
  222.  *                     in ncbistdaa encoding [in]
  223.  * @param translation_buffer_ptr Buffer to hold the frames of the translated 
  224.  *                               sequence. [out]
  225.  * @param frame_offsets_ptr Offsets into the translation buffer for each 
  226.  *                          frame. [out]
  227.  * @param mixed_seq_ptr Pointer to buffer for the mixed frame sequence [out]
  228.  */
  229. Int2 BLAST_GetAllTranslations(const Uint1* nucl_seq, Uint1 encoding,
  230.         Int4 nucl_length, const Uint1* genetic_code, 
  231.         Uint1** translation_buffer_ptr, Int4** frame_offsets_ptr,
  232.         Uint1** mixed_seq_ptr);
  233. /** Get one frame translation - needed when only parts of subject sequences
  234.  * are translated. 
  235.  * @param nucl_seq Pointer to start of nucleotide sequence to be translated [in]
  236.  * @param nucl_length Length of nucleotide sequence to be translated [in]
  237.  * @param frame What frame to translate into [in]
  238.  * @param genetic_code What genetic code to use? [in]
  239.  * @param translation_buffer_ptr Pointer to buffer with translated 
  240.  *                               sequence [out]
  241.  * @param protein_length Length of the translation buffer [out] 
  242.  * @param mixed_seq_ptr Pointer to buffer with mixed frame sequence, in case
  243.  *                      of out-of-frame gapping; buffer filled only if argument
  244.  *                      not NULL. [out]
  245.  */
  246. int GetPartialTranslation(const Uint1* nucl_seq,
  247.         Int4 nucl_length, Int2 frame, const Uint1* genetic_code,
  248.         Uint1** translation_buffer_ptr, Int4* protein_length, 
  249.         Uint1** mixed_seq_ptr);
  250. /** Convert translation frame into a context for the concatenated translation
  251.  * buffer.
  252.  */
  253. Int4 FrameToContext(Int2 frame);
  254. /** The following binary search routine assumes that array A is filled. */
  255. Int4 BSearchInt4(Int4 n, Int4* A, Int4 size);
  256. #ifdef __cplusplus
  257. }
  258. #endif
  259. #endif /* !__BLAST_UTIL__ */