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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_psi_priv.h,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:07:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef ALGO_BLAST_CORE___BLAST_PSI_PRIV__H
  10. #define ALGO_BLAST_CORE___BLAST_PSI_PRIV__H
  11. /*  $Id: blast_psi_priv.h,v 1000.1 2004/06/01 18:07:37 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Alejandro Schaffer, ported by Christiam Camacho
  37.  *
  38.  */
  39. /** @file blast_psi_priv.h
  40.  * Private interface for Position Iterated BLAST API, contains the
  41.  * PSSM generation engine.
  42.  *
  43.  * Calculating PSSMs from Seq-aligns is a multi-stage process. These stages
  44.  * include:
  45.  * 1) Processing the Seq-align
  46.  *      Examine alignment and extract information about aligned characters,
  47.  *      performed at the API level
  48.  * 2) Purge biased sequences: construct M multiple sequence alignment as
  49.  *      described in page 3395[1] - performed at the core level; custom
  50.  *      selection of sequences should be performed at the API level.
  51.  * 3) Compute extents of the alignment: M sub C as described in page 3395[1]
  52.  * 4) Compute sequence weights
  53.  * 5) Compute residue frequencies
  54.  * 6) Convert residue frequencies to PSSM
  55.  * 7) Scale the resulting PSSM
  56.  */
  57. #include <algo/blast/core/blast_psi.h>
  58. #include "matrix_freq_ratios.h"
  59. #ifdef __cplusplus
  60. extern "C" {
  61. #endif
  62. /****************************************************************************/
  63. /* Extern declarations for constants (defined in blast_psi_priv.c) */
  64. /** Index into PsiAlignmentData structure for the query sequence */
  65. extern const unsigned int kQueryIndex;
  66. /** Small constant to test against 0 */
  67. extern const double kEpsilon;
  68. /** FIXME: Should this value be replaced by BLAST_EXPECT_VALUE? */
  69. extern const double kDefaultEvalueForPosition;
  70. /** Successor to POSIT_SCALE_FACTOR  */
  71. extern const int kPsiScaleFactor;
  72. /****************************************************************************/
  73. /* Matrix utility functions */
  74. /** Generic 2 dimensional matrix allocator.
  75.  * Allocates a ncols by nrows matrix with cells of size data_type_sz. Must be
  76.  * freed using x_DeallocateMatrix
  77.  * @param   ncols number of columns in matrix [in]
  78.  * @param   nrows number of rows in matrix [in]
  79.  * @param   data_type_sz size of the data type (in bytes) to allocate for each
  80.  *          element in the matrix [in]
  81.  * @return pointer to allocated memory or NULL in case of failure
  82.  */
  83. void**
  84. _PSIAllocateMatrix(unsigned int ncols, unsigned int nrows, 
  85.                    unsigned int data_type_sz);
  86. /** Generic 2 dimensional matrix deallocator.
  87.  * Deallocates the memory allocated by x_AllocateMatrix
  88.  * @param matrix matrix to deallocate   [in]
  89.  * @param ncols number of columns in the matrix [in]
  90.  * @return NULL
  91.  */
  92. void**
  93. _PSIDeallocateMatrix(void** matrix, unsigned int ncols);
  94. /** Copies src matrix into dest matrix, both of which must be ncols by nrows 
  95.  * matrices 
  96.  * @param dest Destination matrix           [out]
  97.  * @param src Source matrix                 [in]
  98.  * @param ncols Number of columns to copy   [in]
  99.  * @param ncows Number of rows to copy      [in]
  100.  */
  101. void
  102. _PSICopyMatrix(double** dest, const double** src, 
  103.                unsigned int ncols, unsigned int nrows);
  104. /****************************************************************************/
  105. /* Structure declarations */
  106. /* FIXME: Should be renamed to extents? - this is what posExtents was in old 
  107.    code, only using a simpler structure */
  108. /** This structure keeps track of the regions aligned between the query
  109.  * sequence and those that were not purged. It is used when calculating the
  110.  * sequence weights */
  111. typedef struct PsiAlignedBlock {
  112.     SSeqRange* pos_extnt;     /**< Dynamically allocated array of size query_sz
  113.                                   to keep track of the extents of each aligned
  114.                                   position */
  115.     Uint4* size;     /**< Dynamically allocated array of size query_sz
  116.                                  that contains the size of the intervals in the
  117.                                  array above */
  118. } PsiAlignedBlock;
  119. PsiAlignedBlock*
  120. _PSIAlignedBlockNew(Uint4 num_positions);
  121. PsiAlignedBlock*
  122. _PSIAlignedBlockFree(PsiAlignedBlock* aligned_blocks);
  123. /** FIXME: Where are the formulas for these? Need better names */
  124. typedef struct PsiSequenceWeights {
  125.     double** match_weights; /* observed residue frequencies (fi in paper) 
  126.                                dimensions are query_sz+1 by PSI_ALPHABET_SIZE
  127.                              */
  128.     Uint4 match_weights_size;    /* kept for deallocation purposes */
  129.     double* norm_seq_weights;   /**< Stores the normalized sequence weights
  130.                                   (size num_seqs + 1) */
  131.     double* row_sigma;  /**< array of num_seqs + 1 */
  132.     /* Sigma: number of different characters occurring in matches within a
  133.      * multi-alignment block - why is it a double? */
  134.     double* sigma;      /**< array of num_seqs+1 (query_sz) length */
  135.     double* std_prob;   /**< standard amino acid probabilities */
  136.     /* These fields are required for important diagnostic output */
  137.     double* gapless_column_weights; /**< FIXME */
  138.     double* info_content;       /**< position information content (query_sz)*/
  139. } PsiSequenceWeights;
  140. PsiSequenceWeights*
  141. _PSISequenceWeightsNew(const PsiInfo* info, const BlastScoreBlk* sbp);
  142. PsiSequenceWeights*
  143. _PSISequenceWeightsFree(PsiSequenceWeights* seq_weights);
  144. /* Return values for internal PSI-BLAST functions */
  145. #define PSI_SUCCESS             (0)
  146. #define PSIERR_BADPARAM         (-1)   /**< Bad parameter used in function */
  147. #define PSIERR_OUTOFMEM         (-2)   /**< Out of memory */
  148. #define PSIERR_BADSEQWEIGHTS    (-3)   /**< Sequence weights do not add to 1 */
  149. #define PSIERR_NOFREQRATIOS     (-4)   /**< No frequency ratios were found
  150.                                          for the given scoring matrix */
  151. #define PSIERR_POSITIVEAVGSCORE (-5)   /**< Positive average score found
  152.                                          when scaling matrix */
  153. /****************************************************************************/
  154. /* Function prototypes for the various stages of the PSSM generation engine */
  155. /** Main function for keeping only those selected sequences for PSSM
  156.  * construction (stage 2)
  157.  * FIXME: add boolean flag for custom selection of sequences?
  158.  * @retval  PSIERR_BADPARAM if alignment is NULL
  159.  *          PSI_SUCCESS otherwise
  160.  */
  161. int 
  162. PSIPurgeBiasedSegments(PsiAlignmentData* alignment);
  163. /** Main function to compute aligned blocks for each position within multiple 
  164.  * alignment (stage 3) */
  165. int
  166. PSIComputeAlignmentBlocks(const PsiAlignmentData* alignment,    /* [in] */
  167.                           PsiAlignedBlock* aligned_block);      /* [out] */
  168. /** Main function to calculate the sequence weights. Should be called with the
  169.  * return value of PSIComputeAlignmentBlocks (stage 4) */
  170. int
  171. PSIComputeSequenceWeights(const PsiAlignmentData* alignment,        /* [in] */
  172.                           const PsiAlignedBlock* aligned_blocks,    /* [in] */
  173.                           PsiSequenceWeights* seq_weights);         /* [out] */
  174. /** Main function to compute the residue frequencies for the PSSM (stage 5) */
  175. int
  176. PSIComputeResidueFrequencies(const PsiAlignmentData* alignment,     /* [in] */
  177.                              const PsiSequenceWeights* seq_weights, /* [in] */
  178.                              const BlastScoreBlk* sbp,              /* [in] */
  179.                              const PsiAlignedBlock* aligned_blocks, /* [in] */
  180.                              const PSIBlastOptions* opts,           /* [in] */
  181.                              PsiMatrix* score_matrix);              /* [out] */
  182. /** Converts the residue frequencies obtained in the previous stage to a PSSM
  183.  * (stage 6) */
  184. int
  185. PSIConvertResidueFreqsToPSSM(PsiMatrix* score_matrix,           /* [in|out] */
  186.                              const Uint1* query,                /* [in] */
  187.                              const BlastScoreBlk* sbp,          /* [in] */
  188.                              const double* std_probs);          /* [in] */
  189. /** Scales the PSSM (stage 7)
  190.  * @param scaling_factor if not null, use this value to further scale the
  191.  * matrix (default is kPsiScaleFactor). Useful for composition based statistics
  192.  * [in] optional 
  193.  */
  194. int
  195. PSIScaleMatrix(const Uint1* query,              /* [in] */
  196.                Uint4 query_length,              /* [in] */
  197.                const double* std_probs,         /* [in] */
  198.                double* scaling_factor,          /* [in - optional] */
  199.                PsiMatrix* score_matrix,         /* [in|out] */
  200.                BlastScoreBlk* sbp);             /* [in|out] */
  201. /****************************************************************************/
  202. /* Function prototypes for auxiliary functions for the stages above */
  203. /** Marks the (start, stop] region corresponding to sequence seq_index in
  204.  * alignment so that it is not further considered for PSSM calculation.
  205.  * This function is not applicable to the query sequence in the alignment
  206.  * (seq_index == 0)
  207.  * @param   alignment Alignment data  [in|out]
  208.  * @param   seq_index index of the sequence of interested in alignment [in]
  209.  * @param   start start of the region to remove [in]
  210.  * @param   stop stop of the region to remove [in]
  211.  * @return  PSIERR_BADPARAM if no alignment is given, or if seq_index or stop
  212.  *          are invalid, 
  213.  *          PSI_SUCCESS otherwise
  214.  */
  215. int
  216. _PSIPurgeAlignedRegion(PsiAlignmentData* alignment,
  217.                        unsigned int seq_index,
  218.                        unsigned int start,
  219.                        unsigned int stop);
  220. /** Checks for any positions in sequence seq_index still considered for PSSM 
  221.  * construction. If none is found, the entire sequence is marked as unused.
  222.  * @param alignment Alignment data
  223.  * @param seq_idnex index of the sequence of interest
  224.  */
  225. void
  226. _PSIDiscardIfUnused(PsiAlignmentData* alignment, unsigned int seq_index);
  227. /** The the standard residue frequencies for a scoring system specified in the
  228.  * BlastScoreBlk structure. This is a wrapper for Blast_ResFreqStdComp() from
  229.  * blast_stat.c with a more intention-revealing name :) .
  230.  * used in kappa.c?
  231.  * Caller is responsible for deallocating return value via sfree().
  232.  * @param sbp Score block structure [in]
  233.  * @retval NULL if there is not enough memory otherwise an array of lenght
  234.  *         sbp->alphabet_size with the standard background probabilities for 
  235.  *         the scoring system requested.
  236.  */
  237. double*
  238. _PSIGetStandardProbabilities(const BlastScoreBlk* sbp);
  239. /** Calculates the length of the sequence without including any 'X' residues.
  240.  * used in kappa.c
  241.  * @param seq sequence to examine [in]
  242.  * @param length length of the sequence above [in]
  243.  * @retval number of non-X residues in the sequence
  244.  */
  245. Uint4
  246. _PSISequenceLengthWithoutX(const Uint1* seq, Uint4 length);
  247. /* Compute the probabilities for each score in the PSSM.
  248.  * This is only valid for protein sequences.
  249.  * Should this go in blast_stat.[hc]?
  250.  * used in kappa.c in notposfillSfp()
  251.  */
  252. Blast_ScoreFreq*
  253. _PSIComputeScoreProbabilities(const int** pssm,             /* [in] */
  254.                               const Uint1* query,           /* [in] */
  255.                               Uint4 query_length,           /* [in] */
  256.                               const double* std_probs,      /* [in] */
  257.                               const BlastScoreBlk* sbp);    /* [in] */
  258. /** Collects "diagnostic" information from the process of creating the PSSM */
  259. PsiDiagnostics*
  260. _PSISaveDiagnostics(const PsiAlignmentData* alignment,
  261.                     const PsiAlignedBlock* aligned_block,
  262.                     const PsiSequenceWeights* seq_weights);
  263. #ifdef __cplusplus
  264. }
  265. #endif
  266. /*
  267.  * ===========================================================================
  268.  *
  269.  * $Log: blast_psi_priv.h,v $
  270.  * Revision 1000.1  2004/06/01 18:07:37  gouriano
  271.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  272.  *
  273.  * Revision 1.4  2004/05/28 16:00:10  camacho
  274.  * + first port of PSSM generation engine
  275.  *
  276.  * Revision 1.3  2004/05/06 14:01:40  camacho
  277.  * + _PSICopyMatrix
  278.  *
  279.  * Revision 1.2  2004/04/07 21:43:47  camacho
  280.  * Removed unneeded #include directive
  281.  *
  282.  * Revision 1.1  2004/04/07 19:11:17  camacho
  283.  * Initial revision
  284.  *
  285.  *
  286.  * ===========================================================================
  287.  */
  288. #endif /* !ALGO_BLAST_CORE__BLAST_PSI_PRIV__H */