/* $Id: blast_parameters.h,v 1.20 2007/10/25 15:55:36 kazimird Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Tom Madden * */ /** @file blast_parameters.h * Structure and function definitions for BLAST parameter structures, which are * internal to the CORE of BLAST. * *
 * These parameters are normally set by:
 *    1.) reading the options in blast_options.[ch] to find user preferences
 *    2.) making intelligent choices based upon the program, user preferences, 
 *        and other data such as the sequence's length.
 *
 * NOTE: These parameters should be set by calls in algo/blast/core, 
 *       preferrably to functions in this file. User preferences should be 
 *       controlled by the structures and functions in blast_options.[ch]. 
 *       The parameter structures belong to algo/blast/core, the options
 *       structures belong to the user.
 * 
*/ #ifndef ALGO_BLAST_CORE__BLASTPARAMETERS__H #define ALGO_BLAST_CORE__BLASTPARAMETERS__H #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** Default parameters for linking HSPs */ #define BLAST_GAP_PROB 0.5 /**< Gap probability for ungapped search */ #define BLAST_GAP_PROB_GAPPED 1.0 /**< Gap probability for gapped search */ #define BLAST_GAP_DECAY_RATE 0.5 /**< Gap decay rate for ungapped search */ #define BLAST_GAP_DECAY_RATE_GAPPED 0.1/**< Gap decay rate for gapped search */ #define BLAST_GAP_SIZE 40 /**< Default gap size */ #define BLAST_OVERLAP_SIZE 9 /**< Default overlap size */ /** Expect values corresponding to the default cutoff * scores for all ungapped and gapped blastn alignments. */ #define CUTOFF_E_BLASTN 0.05 /**< default evalue (blastn) */ #define CUTOFF_E_BLASTP 1e-300 /**< default evalue (ungapped blastp) */ #define CUTOFF_E_BLASTX 1.0 /**< default evalue (ungapped blastx) */ #define CUTOFF_E_TBLASTN 1.0 /**< default evalue (ungapped tblastn) */ #define CUTOFF_E_TBLASTX 1e-300/**< default evalue (tblastx) */ /** specifies the data structures used for bookkeeping * during computation of ungapped extensions */ typedef enum ESeedContainerType { eDiagArray, /**< use diagonal structures with array of last hits and levels. */ eDiagHash, /**< use hash table (blastn only) */ eMaxContainerType /**< maximum value for this enumeration */ } ESeedContainerType; /** All the ungapped cutoff values that can change * from context to context */ typedef struct BlastUngappedCutoffs { Int4 x_dropoff_init; /**< Raw X-dropoff value specified by the bit score in BlastInitialWordOptions */ Int4 x_dropoff; /**< Raw X-dropoff value used in the ungapped extension */ Int4 cutoff_score; /**< Cutoff score for saving ungapped hits. */ Int4 reduced_nucl_cutoff_score; /**< for blastn, a reduced cutoff score for use with approximate ungapped alignments */ } BlastUngappedCutoffs; /** Parameter block that contains a pointer to BlastInitialWordOptions * and the values derived from it. */ typedef struct BlastInitialWordParameters { BlastInitialWordOptions* options; /**< The original (unparsed) options. */ Int4 x_dropoff_max; /**< largest X-drop cutoff across all contexts */ Int4 cutoff_score_min; /**< smallest cutoff score across all contexts */ BlastUngappedCutoffs *cutoffs; /**< cutoff values (one per context) */ ESeedContainerType container_type; /**< How to store offset pairs for initial seeds? */ Int4 nucl_score_table[256]; /**< the combined score of all match/mismatch combinations for aligning four bases */ Boolean ungapped_extension; /**< Should an ungapped extension be performed? */ } BlastInitialWordParameters; /** Computed values used as parameters for gapped alignments. * Note that currently the value of the X-dropoff parameter * is fixed for all search contexts */ typedef struct BlastExtensionParameters { BlastExtensionOptions* options; /**< The original (unparsed) options. */ Int4 gap_x_dropoff; /**< X-dropoff value for gapped extension (raw) */ Int4 gap_x_dropoff_final;/**< X-dropoff value for the final gapped extension (raw) */ } BlastExtensionParameters; /** Parameter block for linking HSPs with sum statistics. */ typedef struct BlastLinkHSPParameters { double gap_prob; /**< Probability of decay for linking HSPs */ Int4 gap_size; /**< Small gap size for linking HSPs */ Int4 overlap_size; /**< Maximal overlap allowed in successive linked HSPs */ double gap_decay_rate; /**< Decay rate for linking HSPs and calculating cutoff scores. */ Int4 cutoff_small_gap; /**< Cutoff sum score for linked HSPs with small gaps. Small gap calculations are ignored if this value is set to 0. */ Int4 cutoff_big_gap; /**< Cutoff sum score for linked HSPs with big gaps. */ Int4 longest_intron; /**< Length of a longest intron for uneven gap linking of HSPs. */ } BlastLinkHSPParameters; /** All the gapped cutoff values that can change * from context to context */ typedef struct BlastGappedCutoffs { Int4 cutoff_score; /**< Raw cutoff score corresponding to the e-value provided by the user if no sum stats, the lowest score to attempt linking on if sum stats are used. */ Int4 cutoff_score_max; /**< Raw cutoff score corresponding to the e-value provided by user, cutoff_score must be <= this. */ } BlastGappedCutoffs; /** Parameter block that contains a pointer to BlastHitSavingOptions * and the values derived from it. */ typedef struct BlastHitSavingParameters { BlastHitSavingOptions* options; /**< The original (unparsed) options. */ Int4 cutoff_score_min; /**< smallest cutoff score across all contexts */ BlastGappedCutoffs *cutoffs; /**< per-context gapped cutoff information */ BlastLinkHSPParameters* link_hsp_params; /**< Parameters for linking HSPs with sum statistics; linking is not done if NULL. */ Boolean restricted_align; /**< TRUE if approximate score-only gapped alignment is used */ Boolean do_sum_stats; /**< TRUE if sum stats will be used. Can override the do_sum_stats Boolean in the options if criteria for doing sum stats are not met. */ } BlastHitSavingParameters; /** Because approximate gapped alignment adds extra overhead, * it should be avoided if there is no performance benefit * to using it. To be benficial, most score-only gapped alignments * should be the restricted kind, and we can only assure that * if the e-value cutoff is not too generous */ #define RESTRICTED_ALIGNMENT_WORST_EVALUE 10.0 /** Scoring parameters block * Contains scoring-related information that is actually used * for the blast search */ typedef struct BlastScoringParameters { BlastScoringOptions *options; /**< User-provided values for these params */ Int2 reward; /**< Reward for a match */ Int2 penalty; /**< Penalty for a mismatch */ Int4 gap_open; /**< Extra penalty for starting a gap (scaled version) */ Int4 gap_extend; /**< Penalty for each gap residue (scaled version) */ Int4 shift_pen; /**< Penalty for shifting a frame in out-of-frame gapping (scaled version) */ double scale_factor; /**< multiplier for all cutoff scores */ } BlastScoringParameters; /** Parameters for setting up effective lengths and search spaces. * The real database size values to be used for statistical calculations, if * there are no overriding values in options. */ typedef struct BlastEffectiveLengthsParameters { BlastEffectiveLengthsOptions* options; /**< User provided values for these parameters */ Int8 real_db_length; /**< Total database length to use in search space calculations. */ Int4 real_num_seqs; /**< Number of subject sequences to use for search space calculations */ } BlastEffectiveLengthsParameters; /******************************************************************************** Functions to create options blocks with default values and free them after use. *********************************************************************************/ /** Deallocate memory for BlastInitialWordParameters. * @param parameters Structure to free [in] */ NCBI_XBLAST_EXPORT BlastInitialWordParameters* BlastInitialWordParametersFree(BlastInitialWordParameters* parameters); /** Allocate memory for BlastInitialWordParameters and set x_dropoff. * Calling BlastInitialWordParametersNew calculates the * raw x_dropoff from the bit x_dropoff and puts it into * the x_dropoff field of BlastInitialWordParameters*. * The container type is also set. For blastn queries over a certain * length eDiagHash is set, otherwise it's eDiagArray. * The extension method is also set via a call to s_GetBestExtensionMethod * * @param program_number Type of BLAST program [in] * @param word_options The initial word options [in] * @param hit_params The hit saving options (needed to calculate cutoff score * for ungapped extensions) [in] * @param lookup_wrap contains lookup table so the proper extension * method can be set [in] * @param sbp Statistical (Karlin-Altschul) information [in] * @param query_info Query information [in] * @param subject_length Average subject sequence length [in] * @param parameters Resulting parameters [out] */ NCBI_XBLAST_EXPORT Int2 BlastInitialWordParametersNew(EBlastProgramType program_number, const BlastInitialWordOptions* word_options, const BlastHitSavingParameters* hit_params, const LookupTableWrap* lookup_wrap, const BlastScoreBlk* sbp, BlastQueryInfo* query_info, Uint4 subject_length, BlastInitialWordParameters* *parameters); /** Update cutoff scores in BlastInitialWordParameters structure. * @param program_number Type of BLAST program [in] * @param hit_params The hit saving parameters, needed to calculate cutoff * score for ungapped extensions. The HSP linking cutoff * might have to be adjusted here. [in] [out] * @param sbp Statistical (Karlin-Altschul) information [in] * @param query_info Query information [in] * @param subject_length Average subject sequence length [in] * @param parameters Preallocated parameters [in] [out] */ NCBI_XBLAST_EXPORT Int2 BlastInitialWordParametersUpdate(EBlastProgramType program_number, const BlastHitSavingParameters* hit_params, const BlastScoreBlk* sbp, BlastQueryInfo* query_info, Uint4 subject_length, BlastInitialWordParameters* parameters); /** Calculate the raw values for the X-dropoff parameters * @param blast_program Program number [in] * @param options Already allocated extension options [in] * @param sbp Structure containing statistical information [in] * @param query_info Query information, needed only for determining the first * context [in] * @param parameters Extension parameters [out] */ NCBI_XBLAST_EXPORT Int2 BlastExtensionParametersNew(EBlastProgramType blast_program, const BlastExtensionOptions* options, BlastScoreBlk* sbp, BlastQueryInfo* query_info, BlastExtensionParameters* *parameters); /** Deallocate memory for BlastExtensionParameters. * @param parameters Structure to free [in] */ NCBI_XBLAST_EXPORT BlastExtensionParameters* BlastExtensionParametersFree(BlastExtensionParameters* parameters); /** Deallocate memory for BlastScoringParameters. * @param parameters Structure to free [in] */ NCBI_XBLAST_EXPORT BlastScoringParameters* BlastScoringParametersFree( BlastScoringParameters* parameters); /** Calculate scaled cutoff scores and gap penalties * @param options Already allocated scoring options [in] * @param sbp Structure containing scale factor [in] * @param parameters Scoring parameters [out] */ NCBI_XBLAST_EXPORT Int2 BlastScoringParametersNew(const BlastScoringOptions *options, BlastScoreBlk* sbp, BlastScoringParameters* *parameters); /** Deallocate memory for BlastEffectiveLengthsParameters*. * @param parameters Structure to free [in] */ NCBI_XBLAST_EXPORT BlastEffectiveLengthsParameters* BlastEffectiveLengthsParametersFree(BlastEffectiveLengthsParameters* parameters); /** Allocate memory for BlastEffectiveLengthsParameters * @param options The user provided options [in] * @param db_length The database length [in] * @param num_seqs Number of sequences in database [in] * @param parameters The parameters structure returned [out] */ NCBI_XBLAST_EXPORT Int2 BlastEffectiveLengthsParametersNew(const BlastEffectiveLengthsOptions* options, Int8 db_length, Int4 num_seqs, BlastEffectiveLengthsParameters* *parameters); /** Deallocate memory for BlastLinkHSPParameters; * @param parameters Structure to free [in] */ NCBI_XBLAST_EXPORT BlastLinkHSPParameters* BlastLinkHSPParametersFree(BlastLinkHSPParameters* parameters); /** Initialize the linking HSPs parameters with default values. * @param program_number Type of BLAST program [in] * @param gapped_calculation Is this a gapped search? [in] * @param link_hsp_params Initialized parameters structure [out] */ NCBI_XBLAST_EXPORT Int2 BlastLinkHSPParametersNew(EBlastProgramType program_number, Boolean gapped_calculation, BlastLinkHSPParameters** link_hsp_params); /** Update BlastLinkHSPParameters, using calculated values of other parameters. * @param word_params Initial word parameters [in] * @param hit_params Hit saving parameters, including the link HSP * parameters [in] [out] * @param gapped_calculation Is this a gapped search? [in] */ NCBI_XBLAST_EXPORT Int2 BlastLinkHSPParametersUpdate(const BlastInitialWordParameters* word_params, const BlastHitSavingParameters* hit_params, Boolean gapped_calculation); /** Deallocate memory for BlastHitSavingOptions*. * @param parameters Structure to free [in] */ NCBI_XBLAST_EXPORT BlastHitSavingParameters* BlastHitSavingParametersFree(BlastHitSavingParameters* parameters); /** Allocate memory and initialize the BlastHitSavingParameters structure. * Calculates the (raw) score cutoff given an expect value and puts * it in the "cutoff_score" field of the returned BlastHitSavingParameters* * * @param program_number Number of the BLAST program [in] * @param options The given hit saving options [in] * @param sbp Scoring block, needed for calculating score cutoff from * e-value [in] * @param query_info Query information, needed for calculating score cutoff * from e-value [in] * @param avg_subject_length average length of subject sequence [in] * @param parameters Resulting parameters [out] */ NCBI_XBLAST_EXPORT Int2 BlastHitSavingParametersNew(EBlastProgramType program_number, const BlastHitSavingOptions* options, const BlastScoreBlk* sbp, const BlastQueryInfo* query_info, Int4 avg_subject_length, BlastHitSavingParameters* *parameters); /** Updates cutoff scores in hit saving parameters. * @param program_number Number of the BLAST program [in] * @param sbp Scoring block, needed for calculating score cutoff from * e-value [in] * @param query_info Query information, needed for calculating score cutoff * from e-value [in] * @param avg_subject_length average length of subject sequence, used in sum_stats * mode [in] * @param parameters Preallocated parameters [in] [out] */ NCBI_XBLAST_EXPORT Int2 BlastHitSavingParametersUpdate(EBlastProgramType program_number, const BlastScoreBlk* sbp, const BlastQueryInfo* query_info, Int4 avg_subject_length, BlastHitSavingParameters* parameters); /** Calculates cutoff scores and returns them. * Equations provided by Stephen Altschul. * @param program BLAST program type [in] * @param query_info Query(ies) information [in] * @param sbp Scoring statistical parameters [in] * @param link_hsp_params Parameters for linking HSPs [in] [out] * @param word_params InitialWordParameters (cutoff_score used for small gaps) [in] * @param db_length Total length of database (non-database search if 0) [in] * @param subject_length Length of the subject sequence. [in] * */ NCBI_XBLAST_EXPORT void CalculateLinkHSPCutoffs(EBlastProgramType program, BlastQueryInfo* query_info, const BlastScoreBlk* sbp, BlastLinkHSPParameters* link_hsp_params, const BlastInitialWordParameters* word_params, Int8 db_length, Int4 subject_length); #ifdef __cplusplus } #endif #endif /* !ALGO_BLAST_CORE__BLASTPARAMETERS__H */