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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_options.c,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 18:07:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.111
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blast_options.c,v 1000.6 2004/06/01 18:07:31 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_options.c
  35.  * @todo FIXME needs file description & doxygen comments
  36.  */
  37. static char const rcsid[] = 
  38.     "$Id: blast_options.c,v 1000.6 2004/06/01 18:07:31 gouriano Exp $";
  39. #include <algo/blast/core/blast_options.h>
  40. #include <algo/blast/core/blast_filter.h>
  41. #include <algo/blast/core/blast_encoding.h>
  42. QuerySetUpOptions*
  43. BlastQuerySetUpOptionsFree(QuerySetUpOptions* options)
  44. {
  45.    sfree(options->filter_string);
  46.    sfree(options);
  47.    return NULL;
  48. }
  49. Int2
  50. BlastQuerySetUpOptionsNew(QuerySetUpOptions* *options)
  51. {
  52.    *options = (QuerySetUpOptions*) calloc(1, sizeof(QuerySetUpOptions));
  53.    
  54.    if (*options == NULL)
  55.       return 1;
  56.    
  57.    (*options)->genetic_code = BLAST_GENETIC_CODE;
  58.    return 0;
  59. }
  60. Int2 BLAST_FillQuerySetUpOptions(QuerySetUpOptions* options,
  61.         Uint1 program, const char *filter_string, Uint1 strand_option)
  62. {
  63.    if (options == NULL)
  64.       return 1;
  65.    
  66.    if (strand_option && 
  67.        (program == blast_type_blastn || program == blast_type_blastx ||
  68.        program == blast_type_tblastx)) {
  69.       options->strand_option = strand_option;
  70.    }
  71.    /* "L" indicates low-complexity (seg for proteins, 
  72.       dust for nucleotides). */
  73.    if (!filter_string || !strcasecmp(filter_string, "T")) {
  74.       if (program == blast_type_blastn)
  75.          options->filter_string = strdup("D");
  76.       else
  77.          options->filter_string = strdup("S");
  78.    } else {
  79.       options->filter_string = strdup(filter_string); 
  80.    }
  81.    return 0;
  82. }
  83. BlastInitialWordOptions*
  84. BlastInitialWordOptionsFree(BlastInitialWordOptions* options)
  85. {
  86. sfree(options);
  87. return NULL;
  88. }
  89. Int2
  90. BlastInitialWordOptionsNew(Uint1 program, 
  91.    BlastInitialWordOptions* *options)
  92. {
  93.    *options = 
  94.       (BlastInitialWordOptions*) calloc(1, sizeof(BlastInitialWordOptions));
  95.    if (*options == NULL)
  96.       return 1;
  97.    if (program != blast_type_blastn) { /* protein-protein options. */
  98.       (*options)->window_size = BLAST_WINDOW_SIZE_PROT;
  99.       (*options)->x_dropoff = BLAST_UNGAPPED_X_DROPOFF_PROT;
  100.    } else {
  101.       (*options)->window_size = BLAST_WINDOW_SIZE_NUCL;
  102.    }
  103.    return 0;
  104. }
  105. Int2
  106. BLAST_FillInitialWordOptions(BlastInitialWordOptions* options, 
  107.    Uint1 program, Boolean greedy, Int4 window_size, 
  108.    Boolean variable_wordsize, Boolean ag_blast, Boolean mb_lookup,
  109.    double xdrop_ungapped)
  110. {
  111.    if (!options)
  112.       return 1;
  113.    /* Ungapped extension is performed in all cases except when greedy
  114.       gapped extension is used */
  115.    if (program != blast_type_blastn) {
  116.       options->ungapped_extension = TRUE;
  117.       options->x_dropoff = BLAST_UNGAPPED_X_DROPOFF_PROT;
  118.    } else if (!greedy) {
  119.       options->ungapped_extension = TRUE;
  120.       options->x_dropoff = BLAST_UNGAPPED_X_DROPOFF_NUCL;
  121.    } else {
  122.       options->ungapped_extension = FALSE;
  123.    }
  124.    if (window_size != 0)
  125.       options->window_size = window_size;
  126.    if (xdrop_ungapped != 0)
  127.       options->x_dropoff = xdrop_ungapped;
  128.    options->variable_wordsize = variable_wordsize;
  129.    if (ag_blast) {
  130.       options->extension_method = eRightAndLeft;
  131.    } else {
  132.       options->extension_method = eRight;
  133.       if (mb_lookup)
  134.          options->container_type = eMbStacks;
  135.       else
  136.          options->container_type = eDiagArray;
  137.    }
  138.    return 0;
  139. }
  140. BlastInitialWordParameters*
  141. BlastInitialWordParametersFree(BlastInitialWordParameters* parameters)
  142. {
  143. sfree(parameters);
  144. return NULL;
  145. }
  146. /** Compute the default cutoff expect value for ungapped extensions
  147.  * @param program The blast program type
  148.  * @return The default per-program expect value
  149.  */
  150. static double GetUngappedCutoff(Uint1 program)
  151. {
  152.    switch(program) {
  153.    case blast_type_blastn:
  154.       return UNGAPPED_CUTOFF_E_BLASTN;
  155.    case blast_type_blastp: 
  156.    case blast_type_rpsblast: 
  157.       return UNGAPPED_CUTOFF_E_BLASTP;
  158.    case blast_type_blastx: 
  159.       return UNGAPPED_CUTOFF_E_BLASTX;
  160.    case blast_type_tblastn:
  161.    case blast_type_rpstblastn:
  162.       return UNGAPPED_CUTOFF_E_TBLASTN;
  163.    case blast_type_tblastx:
  164.       return UNGAPPED_CUTOFF_E_TBLASTX;
  165.    }
  166.    return 0;
  167. }
  168. Int2
  169. BlastInitialWordParametersNew(Uint1 program_number, 
  170.    const BlastInitialWordOptions* word_options, 
  171.    const BlastHitSavingParameters* hit_params, 
  172.    const BlastExtensionParameters* ext_params, BlastScoreBlk* sbp, 
  173.    BlastQueryInfo* query_info, 
  174.    Uint4 subject_length,
  175.    BlastInitialWordParameters* *parameters)
  176. {
  177.    Int2 status = 0;
  178.    /* If parameters pointer is NULL, there is nothing to fill, 
  179.       so don't do anything */
  180.    if (!parameters)
  181.       return 0;
  182.    ASSERT(sbp);
  183.    ASSERT(word_options);
  184.    *parameters = (BlastInitialWordParameters*) 
  185.       calloc(1, sizeof(BlastInitialWordParameters));
  186.    (*parameters)->options = (BlastInitialWordOptions *) word_options;
  187.    ASSERT(sbp->kbp_std[query_info->first_context]);
  188.    (*parameters)->x_dropoff = (Int4)
  189.       ceil(sbp->scale_factor * word_options->x_dropoff * NCBIMATH_LN2/
  190.            sbp->kbp_std[query_info->first_context]->Lambda);
  191.    status = BlastInitialWordParametersUpdate(program_number,
  192.                hit_params, ext_params, sbp, query_info,
  193.                subject_length, *parameters);
  194.    return status;
  195. }
  196. Int2
  197. BlastInitialWordParametersUpdate(Uint1 program_number, 
  198.    const BlastHitSavingParameters* hit_params, 
  199.    const BlastExtensionParameters* ext_params, BlastScoreBlk* sbp, 
  200.    BlastQueryInfo* query_info, Uint4 subj_length,
  201.    BlastInitialWordParameters* parameters)
  202. {
  203.    Blast_KarlinBlk* kbp;
  204.    Boolean gapped_calculation = TRUE;
  205.    ASSERT(sbp);
  206.    ASSERT(hit_params);
  207.    ASSERT(ext_params);
  208.    ASSERT(query_info);
  209.    /* kbp_gap is only non-NULL for gapped searches! */
  210.    if (sbp->kbp_gap) {
  211.       kbp = sbp->kbp_gap[query_info->first_context];
  212.    } else {
  213.       kbp = sbp->kbp_std[query_info->first_context];
  214.       gapped_calculation = FALSE;
  215.    }
  216.    ASSERT(kbp);
  217.    /* For non-blastn programs cutoff score should not be larger than 
  218.       gap trigger. */
  219.    if (gapped_calculation && program_number != blast_type_blastn) {
  220.       parameters->cutoff_score = 
  221.          MIN(ext_params->gap_trigger, hit_params->cutoff_score);
  222.    } else {
  223.       Int4 s2 = 0;
  224.       double e2;
  225.       Int4 qlen;
  226.       /* Calculate score cutoff corresponding to a fixed e-value (0.05);
  227.          If it is smaller, then use this one */
  228.       qlen = query_info->context_offsets[query_info->last_context+1] - 1;
  229.       
  230.       e2 = GetUngappedCutoff(program_number);
  231.       BLAST_Cutoffs(&s2, &e2, kbp, MIN(subj_length, (Uint4) qlen)*subj_length, TRUE, 
  232.                     hit_params->gap_decay_rate);
  233.       s2 *= (Int4)sbp->scale_factor;
  234.       parameters->cutoff_score = MIN(hit_params->cutoff_score, s2);
  235.       if (parameters->x_dropoff != 0 && parameters->cutoff_score != 0) {
  236.          parameters->x_dropoff = 
  237.             MIN(parameters->x_dropoff, parameters->cutoff_score);
  238.       } else if (parameters->cutoff_score != 0) {
  239.          parameters->x_dropoff = parameters->cutoff_score;
  240.       }
  241.    }
  242.    return 0;
  243. }
  244. BlastExtensionOptions*
  245. BlastExtensionOptionsFree(BlastExtensionOptions* options)
  246. {
  247. sfree(options);
  248. return NULL;
  249. }
  250. Int2
  251. BlastExtensionOptionsNew(Uint1 program, BlastExtensionOptions* *options)
  252. {
  253. *options = (BlastExtensionOptions*) 
  254.            calloc(1, sizeof(BlastExtensionOptions));
  255. if (*options == NULL)
  256. return 1;
  257. if (program != blast_type_blastn) /* protein-protein options. */
  258. {
  259. (*options)->gap_x_dropoff = BLAST_GAP_X_DROPOFF_PROT;
  260. (*options)->gap_x_dropoff_final = 
  261.                    BLAST_GAP_X_DROPOFF_FINAL_PROT;
  262. (*options)->gap_trigger = BLAST_GAP_TRIGGER_PROT;
  263. (*options)->ePrelimGapExt = eDynProgExt;
  264. }
  265. else
  266. {
  267. (*options)->gap_trigger = BLAST_GAP_TRIGGER_NUCL;
  268. }
  269. return 0;
  270. }
  271. Int2
  272. BLAST_FillExtensionOptions(BlastExtensionOptions* options, 
  273.    Uint1 program, Boolean greedy, double x_dropoff, double x_dropoff_final)
  274. {
  275.    if (!options)
  276.       return 1;
  277.    if (program == blast_type_blastn) {
  278.       if (greedy) {
  279.          options->gap_x_dropoff = BLAST_GAP_X_DROPOFF_GREEDY;
  280.          options->ePrelimGapExt = eGreedyWithTracebackExt;
  281.          options->eTbackExt = eGreedyTbck;
  282.       } else {
  283.          options->gap_x_dropoff = BLAST_GAP_X_DROPOFF_NUCL;
  284.          options->gap_x_dropoff_final = BLAST_GAP_X_DROPOFF_FINAL_NUCL;
  285.          options->ePrelimGapExt = eDynProgExt;
  286.          options->eTbackExt = eDynProgTbck;
  287.       }
  288.    }
  289.    if (x_dropoff)
  290.       options->gap_x_dropoff = x_dropoff;
  291.    if (x_dropoff_final) {
  292.       options->gap_x_dropoff_final = x_dropoff_final;
  293.    } else {
  294.       /* Final X-dropoff can't be smaller than preliminary X-dropoff */
  295.       options->gap_x_dropoff_final = 
  296.          MAX(options->gap_x_dropoff_final, x_dropoff);
  297.    }
  298.    return 0;
  299. }
  300. Int2 
  301. BlastExtensionOptionsValidate(Uint1 program_number, 
  302.    const BlastExtensionOptions* options, Blast_Message* *blast_msg)
  303. {
  304. if (options == NULL)
  305. return 1;
  306. if (program_number != blast_type_blastn)
  307. {
  308. if (options->ePrelimGapExt == eGreedyWithTracebackExt || 
  309.              options->ePrelimGapExt == eGreedyExt)
  310. {
  311. Int4 code=2;
  312. Int4 subcode=1;
  313. Blast_MessageWrite(blast_msg, BLAST_SEV_WARNING, code, subcode, 
  314.                             "Greedy extension only supported for BLASTN");
  315. return (Int2) code;
  316. }
  317. }
  318. return 0;
  319. }
  320. Int2 BlastExtensionParametersNew(Uint1 program_number, 
  321.         const BlastExtensionOptions* options, BlastScoreBlk* sbp,
  322.         BlastQueryInfo* query_info, BlastExtensionParameters* *parameters)
  323. {
  324.    Blast_KarlinBlk* kbp,* kbp_gap;
  325.    BlastExtensionParameters* params;
  326.    /* If parameters pointer is NULL, there is nothing to fill, 
  327.       so don't do anything */
  328.    if (!parameters)
  329.       return 0;
  330.    if (sbp->kbp) {
  331.       kbp = sbp->kbp[query_info->first_context];
  332.    } else {
  333.       /* The Karlin block is not found, can't do any calculations */
  334.       *parameters = NULL;
  335.       return -1;
  336.    }
  337.    if (sbp->kbp_gap) {
  338.       kbp_gap = sbp->kbp_gap[query_info->first_context];
  339.    } else {
  340.       kbp_gap = kbp;
  341.    }
  342.    
  343.    *parameters = params = (BlastExtensionParameters*) 
  344.       malloc(sizeof(BlastExtensionParameters));
  345.    params->options = (BlastExtensionOptions *) options;
  346.    params->gap_x_dropoff = 
  347.       (Int4) (options->gap_x_dropoff*NCBIMATH_LN2 / kbp_gap->Lambda);
  348.    params->gap_x_dropoff_final = (Int4) 
  349.       (options->gap_x_dropoff_final*NCBIMATH_LN2 / kbp_gap->Lambda);
  350.    params->gap_trigger = (Int4)
  351.       ((options->gap_trigger*NCBIMATH_LN2 + kbp->logK) / kbp->Lambda);
  352.    if (sbp->scale_factor > 1.0) {
  353.       params->gap_trigger *= (Int4)sbp->scale_factor;
  354.       params->gap_x_dropoff *= (Int4)sbp->scale_factor;
  355.       params->gap_x_dropoff_final *= (Int4)sbp->scale_factor;
  356.    }
  357.    return 0;
  358. }
  359. BlastExtensionParameters*
  360. BlastExtensionParametersFree(BlastExtensionParameters* parameters)
  361. {
  362.   sfree(parameters);
  363.   return NULL;
  364. }
  365. BlastScoringOptions*
  366. BlastScoringOptionsFree(BlastScoringOptions* options)
  367. {
  368. if (options == NULL)
  369. return NULL;
  370. sfree(options->matrix);
  371.    sfree(options->matrix_path);
  372. sfree(options);
  373. return NULL;
  374. }
  375. Int2 
  376. BlastScoringOptionsNew(Uint1 program_number, BlastScoringOptions* *options)
  377. {
  378.    *options = (BlastScoringOptions*) calloc(1, sizeof(BlastScoringOptions));
  379.    if (*options == NULL)
  380.       return 1;
  381.    
  382.    if (program_number != blast_type_blastn) { /* protein-protein options. */
  383.       (*options)->shift_pen = INT2_MAX;
  384.       (*options)->is_ooframe = FALSE;
  385.       (*options)->gap_open = BLAST_GAP_OPEN_PROT;
  386.       (*options)->gap_extend = BLAST_GAP_EXTN_PROT;
  387.    } else { /* nucleotide-nucleotide options. */
  388.       (*options)->penalty = BLAST_PENALTY;
  389.       (*options)->reward = BLAST_REWARD;
  390.    }
  391.    (*options)->decline_align = INT2_MAX;
  392.    (*options)->gapped_calculation = TRUE;
  393.    
  394.    return 0;
  395. }
  396. Int2 
  397. BLAST_FillScoringOptions(BlastScoringOptions* options, 
  398.    Uint1 program_number, Boolean greedy_extension, Int4 penalty, Int4 reward, 
  399.    const char *matrix, Int4 gap_open, Int4 gap_extend)
  400. {
  401.    if (!options)
  402.       return 1;
  403.    if (program_number != blast_type_blastn) { /* protein-protein options. */
  404.       if (matrix) {
  405.          unsigned int i;
  406.          options->matrix = strdup(matrix);
  407.          /* Make it all upper case */
  408.          for (i=0; i<strlen(options->matrix); ++i)
  409.             options->matrix[i] = toupper(options->matrix[i]);
  410.       } else {
  411.          options->matrix = strdup("BLOSUM62");
  412.       }
  413.    } else { /* nucleotide-nucleotide options. */
  414.       if (penalty)
  415.          options->penalty = penalty;
  416.       if (reward)
  417.          options->reward = reward;
  418.       if (greedy_extension) {
  419.          options->gap_open = BLAST_GAP_OPEN_MEGABLAST;
  420.          options->gap_extend = BLAST_GAP_EXTN_MEGABLAST;
  421.       } else {
  422.          options->gap_open = BLAST_GAP_OPEN_NUCL;
  423.          options->gap_extend = BLAST_GAP_EXTN_NUCL;
  424.       }
  425.    }
  426.    if (gap_open)
  427.       options->gap_open = gap_open;
  428.    if (gap_extend)
  429.       options->gap_extend = gap_extend;
  430.    return 0;
  431. }
  432. Int2 
  433. BlastScoringOptionsValidate(Uint1 program_number, 
  434.    const BlastScoringOptions* options, Blast_Message* *blast_msg)
  435. {
  436. if (options == NULL)
  437. return 1;
  438.    if (program_number == blast_type_tblastx && 
  439.               options->gapped_calculation)
  440.    {
  441. Int4 code=2;
  442. Int4 subcode=1;
  443.       Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  444.          "Gapped search is not allowed for tblastx");
  445. return (Int2) code;
  446.    }
  447. if (program_number == blast_type_blastn)
  448. {
  449. if (options->penalty >= 0)
  450. {
  451. Int4 code=2;
  452. Int4 subcode=1;
  453. Blast_MessageWrite(blast_msg, BLAST_SEV_WARNING, code, subcode, 
  454.                             "BLASTN penalty must be negative");
  455. return (Int2) code;
  456. }
  457.                 if (options->gap_open > 0 && options->gap_extend == 0) 
  458.                 {
  459.                         Int4 code=2;
  460.                         Int4 subcode=1;
  461.                         Blast_MessageWrite(blast_msg, BLAST_SEV_WARNING, 
  462.                            code, subcode, 
  463.                            "BLASTN gap extension penalty cannot be 0");
  464.                         return (Int2) code;
  465.                 }
  466. }
  467. else
  468. {
  469. Int2 status=0;
  470. if ((status=Blast_KarlinkGapBlkFill(NULL, options->gap_open, 
  471.                      options->gap_extend, options->decline_align, 
  472.                      options->matrix)) != 0)
  473. {
  474. if (status == 1)
  475. {
  476. char* buffer;
  477. Int4 code=2;
  478. Int4 subcode=1;
  479. buffer = BLAST_PrintMatrixMessage(options->matrix); 
  480.             Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR,
  481.                                code, subcode, buffer);
  482. sfree(buffer);
  483. return (Int2) code;
  484. }
  485. else if (status == 2)
  486. {
  487. char* buffer;
  488. Int4 code=2;
  489. Int4 subcode=1;
  490. buffer = BLAST_PrintAllowedValues(options->matrix, 
  491.                         options->gap_open, options->gap_extend, 
  492.                         options->decline_align); 
  493.             Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  494.                                buffer);
  495. sfree(buffer);
  496. return (Int2) code;
  497. }
  498. }
  499. }
  500. if (program_number != blast_type_blastx && 
  501.        program_number != blast_type_tblastn && options->is_ooframe)
  502. {
  503.       Int4 code=2;
  504.       Int4 subcode=1;
  505.       Blast_MessageWrite(blast_msg, BLAST_SEV_WARNING, code, subcode, 
  506.          "Out-of-frame only permitted for blastx and tblastn");
  507.       return (Int2) code;
  508. }
  509. return 0;
  510. }
  511. Int2 
  512. BlastScoringOptionsDup(BlastScoringOptions* *new_opt, const BlastScoringOptions* old_opt)
  513. {
  514.     if (old_opt == NULL || new_opt == NULL)
  515.        return -1;
  516.     *new_opt = (BlastScoringOptions*) BlastMemDup(old_opt, sizeof(BlastScoringOptions));
  517.     if (*new_opt == NULL)
  518.        return -1;
  519.     if (old_opt->matrix)
  520.        (*new_opt)->matrix = strdup(old_opt->matrix);
  521.     if (old_opt->matrix_path)
  522.        (*new_opt)->matrix_path = strdup(old_opt->matrix_path);
  523.     return 0;
  524. }
  525. BlastScoringParameters*
  526. BlastScoringParametersFree(BlastScoringParameters* parameters)
  527. {
  528. sfree(parameters);
  529. return NULL;
  530. }
  531. Int2
  532. BlastScoringParametersNew(const BlastScoringOptions* score_options, 
  533.                           BlastScoreBlk* sbp, 
  534.                           BlastScoringParameters* *parameters)
  535. {
  536.    BlastScoringParameters *params;
  537.    double scale_factor;
  538.    if (score_options == NULL)
  539.       return 1;
  540.    *parameters = params = (BlastScoringParameters*) 
  541.                         calloc(1, sizeof(BlastScoringParameters));
  542.    if (params == NULL)
  543.       return 2;
  544.    params->options = (BlastScoringOptions *)score_options;
  545.    scale_factor = sbp->scale_factor;
  546.    params->scale_factor = scale_factor;
  547.    params->reward = score_options->reward;
  548.    params->penalty = score_options->penalty;
  549.    params->gap_open = score_options->gap_open * (Int4)scale_factor;
  550.    params->gap_extend = score_options->gap_extend * (Int4)scale_factor;
  551.    params->decline_align = score_options->decline_align * (Int4)scale_factor;
  552.    params->shift_pen = score_options->shift_pen * (Int4)scale_factor;
  553.    return 0;
  554. }
  555. BlastEffectiveLengthsOptions*
  556. BlastEffectiveLengthsOptionsFree(BlastEffectiveLengthsOptions* options)
  557. {
  558. sfree(options);
  559. return NULL;
  560. }
  561. Int2 
  562. BlastEffectiveLengthsOptionsNew(BlastEffectiveLengthsOptions* *options)
  563. {
  564.    *options = (BlastEffectiveLengthsOptions*)
  565.       calloc(1, sizeof(BlastEffectiveLengthsOptions));
  566.    if (*options == NULL)
  567.       return 1;
  568.    
  569.    return 0;
  570. }
  571. BlastEffectiveLengthsParameters*
  572. BlastEffectiveLengthsParametersFree(BlastEffectiveLengthsParameters* parameters)
  573. {
  574. sfree(parameters);
  575. return NULL;
  576. }
  577. Int2 
  578. BlastEffectiveLengthsParametersNew(const BlastEffectiveLengthsOptions* options, 
  579.                                Int8 db_length, Int4 num_seqs,
  580.                                BlastEffectiveLengthsParameters* *parameters)
  581. {
  582.    *parameters = (BlastEffectiveLengthsParameters*) 
  583.       calloc(1, sizeof(BlastEffectiveLengthsParameters));
  584.    (*parameters)->options = (BlastEffectiveLengthsOptions*) options;
  585.    (*parameters)->real_db_length = db_length;
  586.    (*parameters)->real_num_seqs = num_seqs;
  587.    return 0;
  588. }
  589. Int2 
  590. BLAST_FillEffectiveLengthsOptions(BlastEffectiveLengthsOptions* options, 
  591.    Int4 dbseq_num, Int8 db_length, Int8 searchsp_eff)
  592. {
  593.    if (!options)
  594.       return 1;
  595.    if (searchsp_eff) {
  596.       /* dbnum_seq and dblen are used to calculate effective search space, so 
  597.          if it is already set don't bother with those. */
  598.       options->searchsp_eff = searchsp_eff;
  599.       return 0;
  600.    }
  601.    options->dbseq_num = dbseq_num;
  602.    options->db_length = db_length;
  603.    return 0;
  604. }
  605. LookupTableOptions*
  606. LookupTableOptionsFree(LookupTableOptions* options)
  607. {
  608.       sfree(options->phi_pattern);
  609.    
  610. sfree(options);
  611. return NULL;
  612. }
  613. Int2 
  614. LookupTableOptionsNew(Uint1 program_number, LookupTableOptions* *options)
  615. {
  616.    *options = (LookupTableOptions*) calloc(1, sizeof(LookupTableOptions));
  617.    
  618.    if (*options == NULL)
  619.       return 1;
  620.    
  621.    if (program_number != blast_type_blastn) {
  622.       (*options)->word_size = BLAST_WORDSIZE_PROT;
  623.       (*options)->alphabet_size = BLASTAA_SIZE;
  624.       (*options)->lut_type = AA_LOOKUP_TABLE;
  625.       
  626.       if (program_number == blast_type_blastp ||
  627.           program_number == blast_type_rpsblast)
  628.          (*options)->threshold = BLAST_WORD_THRESHOLD_BLASTP;
  629.       else if (program_number == blast_type_blastx)
  630.          (*options)->threshold = BLAST_WORD_THRESHOLD_BLASTX;
  631.       else if (program_number == blast_type_tblastn ||
  632.                program_number == blast_type_rpstblastn)
  633.          (*options)->threshold = BLAST_WORD_THRESHOLD_TBLASTN;
  634.       else if (program_number == blast_type_tblastx)
  635.          (*options)->threshold = BLAST_WORD_THRESHOLD_TBLASTX;
  636.       
  637.    } else {
  638.       (*options)->alphabet_size = BLASTNA_SIZE;
  639.    }
  640.    return 0;
  641. }
  642. Int4 CalculateBestStride(Int4 word_size, Boolean var_words, Int4 lut_type)
  643. {
  644.    Int4 lut_width;
  645.    Int4 extra = 1;
  646.    Uint1 remainder;
  647.    Int4 stride;
  648.    if (lut_type == MB_LOOKUP_TABLE)
  649.       lut_width = 12;
  650.    else if (word_size >= 8)
  651.       lut_width = 8;
  652.    else
  653.       lut_width = 4;
  654.    remainder = word_size % COMPRESSION_RATIO;
  655.    if (var_words && (remainder == 0) )
  656.       extra = COMPRESSION_RATIO;
  657.    stride = word_size - lut_width + extra;
  658.    remainder = stride % 4;
  659.    if (stride > 8 || (stride > 4 && remainder == 1) ) 
  660.       stride -= remainder;
  661.    return stride;
  662. }
  663. Int2 
  664. BLAST_FillLookupTableOptions(LookupTableOptions* options, 
  665.    Uint1 program_number, Boolean is_megablast, Int4 threshold,
  666.    Int2 word_size, Boolean ag_blast, Boolean variable_wordsize,
  667.    Boolean use_pssm)
  668. {
  669.    if (!options)
  670.       return 1;
  671.    if (program_number == blast_type_blastn) {
  672.       if (is_megablast) {
  673.          options->word_size = BLAST_WORDSIZE_MEGABLAST;
  674.          options->lut_type = MB_LOOKUP_TABLE;
  675.          options->max_positions = INT4_MAX;
  676.       } else {
  677.          options->lut_type = NA_LOOKUP_TABLE;
  678.          options->word_size = BLAST_WORDSIZE_NUCL;
  679.       }
  680.    } else {
  681.       options->lut_type = AA_LOOKUP_TABLE;
  682.    }
  683.    /* if the supplied threshold is -1, disable neighboring words */
  684.    if (threshold == -1)
  685.       options->threshold = 0;
  686.    /* if the supplied threshold is > 0, use it */
  687.    if (threshold > 0)
  688.       options->threshold = threshold;
  689.    /* otherwise, use the default */
  690.    if (use_pssm)
  691.       options->use_pssm = use_pssm;
  692.    if (program_number == blast_type_rpsblast ||
  693.        program_number == blast_type_rpstblastn)
  694.       options->lut_type = RPS_LOOKUP_TABLE;
  695.    if (word_size)
  696.       options->word_size = word_size;
  697.    if (program_number == blast_type_blastn) {
  698.       if (!ag_blast) {
  699.          options->scan_step = COMPRESSION_RATIO;
  700.       } else {
  701.          options->scan_step = CalculateBestStride(options->word_size, variable_wordsize,
  702.                                                   options->lut_type);
  703.       }
  704.    }
  705.    return 0;
  706. }
  707. /** Validate options for the discontiguous word megablast
  708.  * Word size must be 11 or 12; template length 16, 18 or 21; 
  709.  * template type 0, 1 or 2.
  710.  * @param word_size Word size option [in]
  711.  * @param template_length Discontiguous template length [in]
  712.  * @param template_type Discontiguous template type [in]
  713.  * @return TRUE if options combination valid.
  714.  */
  715. static Boolean 
  716. DiscWordOptionsValidate(Int2 word_size, Uint1 template_length,
  717.                         Uint1 template_type)
  718. {
  719.    if (template_length == 0)
  720.       return TRUE;
  721.    if (word_size != 11 && word_size != 12)
  722.       return FALSE;
  723.    if (template_length != 16 && template_length != 18 && 
  724.        template_length != 21)
  725.       return FALSE;
  726.    if (template_type > 2)
  727.       return FALSE;
  728.    return TRUE;
  729. }
  730. Int2 
  731. LookupTableOptionsValidate(Uint1 program_number, 
  732.    const LookupTableOptions* options, Blast_Message* *blast_msg)
  733. {
  734.    Int4 code=2;
  735.    Int4 subcode=1;
  736. if (options == NULL)
  737. return 1;
  738.         if (program_number == blast_type_rpsblast ||
  739.             program_number == blast_type_rpstblastn)
  740.                 return 0;
  741. if (program_number != blast_type_blastn && options->threshold <= 0)
  742. {
  743. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  744.                          "Non-zero threshold required");
  745. return (Int2) code;
  746. }
  747. if (options->word_size <= 0)
  748. {
  749. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  750.                          "Word-size must be greater than zero");
  751. return (Int2) code;
  752. } else if (program_number == blast_type_blastn && options->word_size < 7)
  753. {
  754. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  755.                          "Word-size must be 7" 
  756.                          "or greater for nucleotide comparison");
  757. return (Int2) code;
  758. } else if (program_number != blast_type_blastn && options->word_size > 5)
  759. {
  760. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  761.                          "Word-size must be less"
  762.                          "than 6 for protein comparison");
  763. return (Int2) code;
  764. }
  765. if (program_number != blast_type_blastn && 
  766.        options->lut_type == MB_LOOKUP_TABLE)
  767. {
  768. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  769.                          "Megablast lookup table only supported with blastn");
  770. return (Int2) code;
  771. }
  772.    if (options->lut_type == MB_LOOKUP_TABLE && options->word_size < 12 && 
  773.        options->mb_template_length == 0) {
  774.       Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  775.                          "Word size must be 12 or greater with megablast"
  776.                          " lookup table");
  777.       return (Int2) code;
  778.    }
  779.    if (program_number == blast_type_blastn && 
  780.        options->mb_template_length > 0) {
  781.       if (!DiscWordOptionsValidate(options->word_size,
  782.             options->mb_template_length, options->mb_template_type)) {
  783.          Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  784.             "Invalid discontiguous template parameters");
  785.          return (Int2) code;
  786.       } else if (options->lut_type != MB_LOOKUP_TABLE) {
  787.          Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  788.             "Invalid lookup table type for discontiguous Mega BLAST");
  789.          return (Int2) code;
  790.       } else if (options->scan_step != 1 && 
  791.                  options->scan_step != COMPRESSION_RATIO) {
  792.          Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  793.             "Invalid scanning stride for discontiguous Mega BLAST");
  794.          return (Int2) code;
  795.       }
  796.    }
  797. return 0;
  798. }
  799. BlastHitSavingOptions*
  800. BlastHitSavingOptionsFree(BlastHitSavingOptions* options)
  801. {
  802.   sfree(options);
  803.   return NULL;
  804. }
  805. Int2 BlastHitSavingOptionsNew(Uint1 program_number, 
  806.         BlastHitSavingOptions* *options)
  807. {
  808.    *options = (BlastHitSavingOptions*) calloc(1, sizeof(BlastHitSavingOptions));
  809.    
  810.    if (*options == NULL)
  811.       return 1;
  812.    (*options)->hitlist_size = 500;
  813.    (*options)->prelim_hitlist_size = 500;
  814.    (*options)->expect_value = BLAST_EXPECT_VALUE;
  815.    /* other stuff?? */
  816.    
  817.    return 0;
  818. }
  819. Int2
  820. BLAST_FillHitSavingOptions(BlastHitSavingOptions* options, 
  821.                            double evalue, Int4 hitlist_size)
  822. {
  823.    if (!options)
  824.       return 1;
  825.    if (hitlist_size)
  826.       options->hitlist_size = options->prelim_hitlist_size = hitlist_size;
  827.    if (evalue)
  828.       options->expect_value = evalue;
  829.    return 0;
  830. }
  831. Int2
  832. BlastHitSavingOptionsValidate(Uint1 program_number,
  833.    const BlastHitSavingOptions* options, Blast_Message* *blast_msg)
  834. {
  835. if (options == NULL)
  836. return 1;
  837. if (options->hitlist_size < 1 || options->prelim_hitlist_size < 1)
  838. {
  839. Int4 code=1;
  840. Int4 subcode=1;
  841. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  842.                          "No hits are being saved");
  843. return (Int2) code;
  844. }
  845. if (options->expect_value <= 0.0 && options->cutoff_score <= 0)
  846. {
  847. Int4 code=2;
  848. Int4 subcode=1;
  849. Blast_MessageWrite(blast_msg, BLAST_SEV_ERROR, code, subcode, 
  850.          "expect value or cutoff score must be greater than zero");
  851. return (Int2) code;
  852. }
  853. return 0;
  854. }
  855. BlastHitSavingParameters*
  856. BlastHitSavingParametersFree(BlastHitSavingParameters* parmameters)
  857. {
  858.   sfree(parmameters);
  859.   return NULL;
  860. }
  861. Int2
  862. BlastHitSavingParametersNew(Uint1 program_number, 
  863.    const BlastHitSavingOptions* options, 
  864.    const BlastExtensionParameters* ext_params, 
  865.    BlastScoreBlk* sbp, BlastQueryInfo* query_info, 
  866.    BlastHitSavingParameters* *parameters)
  867. {
  868.    Boolean gapped_calculation = TRUE;
  869.    Int2 status = 0;
  870.    BlastHitSavingParameters* params;
  871.    /* If parameters pointer is NULL, there is nothing to fill, 
  872.       so don't do anything */
  873.    if (!parameters)
  874.       return 0;
  875.    ASSERT(options);
  876.    ASSERT(sbp);
  877.    
  878.    if (!sbp->kbp_gap)
  879.       gapped_calculation = FALSE;
  880.    /* If parameters have not yet been created, allocate and fill all
  881.       parameters that are constant throughout the search */
  882.    *parameters = params = (BlastHitSavingParameters*) 
  883.       calloc(1, sizeof(BlastHitSavingParameters));
  884.    if (params == NULL)
  885.       return 1;
  886.    params->options = (BlastHitSavingOptions *) options;
  887.    /* If sum statistics use is forced by the options, 
  888.       set it in the paramters */
  889.    params->do_sum_stats = options->do_sum_stats;
  890.    /* Sum statistics is used anyway for all ungapped searches and all 
  891.       translated gapped searches (except RPS translated searches) */
  892.    if (!gapped_calculation || 
  893.        (program_number != blast_type_blastn && 
  894.         program_number != blast_type_blastp &&
  895.         program_number != blast_type_rpsblast &&
  896.         program_number != blast_type_rpstblastn))
  897.       params->do_sum_stats = TRUE;
  898.    if (program_number == blast_type_blastn || !gapped_calculation) {
  899.       params->gap_prob = BLAST_GAP_PROB;
  900.       params->gap_decay_rate = BLAST_GAP_DECAY_RATE;
  901.    } else {
  902.       params->gap_prob = BLAST_GAP_PROB_GAPPED;
  903.       params->gap_decay_rate = BLAST_GAP_DECAY_RATE_GAPPED;
  904.    }
  905.    params->gap_size = BLAST_GAP_SIZE;
  906.    params->cutoff_big_gap = 0;
  907.    status = BlastHitSavingParametersUpdate(program_number, 
  908.                ext_params, sbp, query_info, params);
  909.    return status;
  910. }
  911. Int2
  912. BlastHitSavingParametersUpdate(Uint1 program_number, 
  913.    const BlastExtensionParameters* ext_params, 
  914.    BlastScoreBlk* sbp, BlastQueryInfo* query_info, 
  915.    BlastHitSavingParameters* params)
  916. {
  917.    BlastHitSavingOptions* options;
  918.    Blast_KarlinBlk* kbp;
  919.    double evalue;
  920.    double scale_factor = sbp->scale_factor;
  921.    ASSERT(params);
  922.    ASSERT(query_info);
  923.    ASSERT(ext_params);
  924.    options = params->options;
  925.    evalue = options->expect_value;
  926.    /* Scoring options are not available here, but we can determine whether
  927.       this is a gapped or ungapped search by checking whether gapped
  928.       Karlin blocks have been set. */
  929.    if (sbp->kbp_gap) {
  930.       kbp = sbp->kbp_gap[query_info->first_context];
  931.    } else {
  932.       kbp = sbp->kbp[query_info->first_context];
  933.    }
  934.    /* Calculate cutoffs based on the current effective lengths information */
  935.    if (options->cutoff_score > 0) {
  936.       params->cutoff_score = options->cutoff_score * (Int4) sbp->scale_factor;
  937.    } else if (!options->phi_align) {
  938.       Int4 context = query_info->first_context;
  939.       Int8 searchsp = query_info->eff_searchsp_array[context];
  940.       /* translated RPS searches must scale the search space down */
  941.       if (program_number == blast_type_rpstblastn)
  942.          searchsp = searchsp / NUM_FRAMES;
  943.       params->cutoff_score = 0;
  944.       BLAST_Cutoffs(&params->cutoff_score, &evalue, kbp, searchsp, FALSE, 0);
  945.       params->cutoff_score *= (Int4) scale_factor;
  946.       /* When sum statistics is used, all HSPs above the gap trigger 
  947.          cutoff are saved until the sum statistics is applied to potentially
  948.          link them with other HSPs and improve their e-values. 
  949.          However this does not apply to the ungapped search! */
  950.       if (params->do_sum_stats) {
  951.          params->cutoff_score = 
  952.             MIN(params->cutoff_score, ext_params->gap_trigger);
  953.       }
  954.    } else {
  955.       params->cutoff_score = 0;
  956.    }
  957.    
  958.    params->cutoff_small_gap = 
  959.       MIN(params->cutoff_score, ext_params->gap_trigger);
  960.       
  961.    return 0;
  962. }
  963. Int2 PSIBlastOptionsNew(PSIBlastOptions** psi_options)
  964. {
  965.    PSIBlastOptions* options;
  966.    if (!psi_options)
  967.       return 0;
  968.    options = (PSIBlastOptions*)calloc(1, sizeof(PSIBlastOptions));
  969.    *psi_options = options;
  970.    options->inclusion_ethresh = PSI_INCLUSION_ETHRESH;
  971.    options->pseudo_count = PSI_PSEUDO_COUNT_CONST;
  972.    
  973.    return 0;
  974. }
  975. PSIBlastOptions* PSIBlastOptionsFree(PSIBlastOptions* psi_options)
  976. {
  977.    sfree(psi_options);
  978.    return NULL;
  979. }
  980. Int2 BlastDatabaseOptionsNew(BlastDatabaseOptions** db_options)
  981. {
  982.    BlastDatabaseOptions* options = (BlastDatabaseOptions*)
  983.       calloc(1, sizeof(BlastDatabaseOptions));
  984.    options->genetic_code = BLAST_GENETIC_CODE;
  985.    *db_options = options;
  986.    return 0;
  987. }
  988. BlastDatabaseOptions* 
  989. BlastDatabaseOptionsFree(BlastDatabaseOptions* db_options)
  990. {
  991.    sfree(db_options->gen_code_string);
  992.    sfree(db_options);
  993.    return NULL;
  994. }
  995. Int2 BLAST_InitDefaultOptions(Uint1 program_number,
  996.    LookupTableOptions** lookup_options,
  997.    QuerySetUpOptions** query_setup_options, 
  998.    BlastInitialWordOptions** word_options,
  999.    BlastExtensionOptions** ext_options,
  1000.    BlastHitSavingOptions** hit_options,
  1001.    BlastScoringOptions** score_options,
  1002.    BlastEffectiveLengthsOptions** eff_len_options,
  1003.    PSIBlastOptions** psi_options,
  1004.    BlastDatabaseOptions** db_options)
  1005. {
  1006.    Int2 status;
  1007.    if ((status = LookupTableOptionsNew(program_number, lookup_options)))
  1008.       return status;
  1009.    if ((status=BlastQuerySetUpOptionsNew(query_setup_options)))
  1010.       return status;
  1011.    if ((status=BlastInitialWordOptionsNew(program_number, word_options)))
  1012.       return status;
  1013.    if ((status = BlastExtensionOptionsNew(program_number, ext_options)))
  1014.       return status;
  1015.    if ((status=BlastHitSavingOptionsNew(program_number, hit_options)))
  1016.       return status;
  1017.    if ((status=BlastScoringOptionsNew(program_number, score_options)))
  1018.       return status;
  1019.    if ((status=BlastEffectiveLengthsOptionsNew(eff_len_options)))
  1020.       return status;
  1021.    
  1022.    if ((status=PSIBlastOptionsNew(psi_options)))
  1023.       return status;
  1024.    if ((status=BlastDatabaseOptionsNew(db_options)))
  1025.       return status;
  1026.    return 0;
  1027. }
  1028. Int2 BLAST_ValidateOptions(Uint1 program_number,
  1029.                            const BlastExtensionOptions* ext_options,
  1030.                            const BlastScoringOptions* score_options, 
  1031.                            const LookupTableOptions* lookup_options, 
  1032.                            const BlastHitSavingOptions* hit_options,
  1033.                            Blast_Message* *blast_msg)
  1034. {
  1035.    Int2 status = 0;
  1036.    if ((status = BlastExtensionOptionsValidate(program_number, ext_options,
  1037.                                                blast_msg)) != 0)
  1038.        return status;
  1039.    if ((status = BlastScoringOptionsValidate(program_number, score_options,
  1040.                                                blast_msg)) != 0)
  1041.        return status;
  1042.    if ((status = LookupTableOptionsValidate(program_number, 
  1043.                     lookup_options, blast_msg)) != 0)   
  1044.        return status;
  1045.    if ((status = BlastHitSavingOptionsValidate(program_number, hit_options,
  1046.                                                blast_msg)) != 0)
  1047.        return status;
  1048.    return status;
  1049. }
  1050. /** machine epsilon assumed by CalculateLinkHSPCutoffs */
  1051. #define MY_EPS 1.0e-9
  1052. void
  1053. CalculateLinkHSPCutoffs(Uint1 program, BlastQueryInfo* query_info, 
  1054.    BlastScoreBlk* sbp, BlastHitSavingParameters* hit_params, 
  1055.    BlastExtensionParameters* ext_params,
  1056.    Int8 db_length, Int4 subject_length)
  1057. {
  1058. double gap_prob, gap_decay_rate, x_variable, y_variable;
  1059. Blast_KarlinBlk* kbp;
  1060. Int4 expected_length, gap_size, query_length;
  1061. Int8 search_sp;
  1062.         Boolean translated_subject = (program == blast_type_tblastn || 
  1063.                                  program == blast_type_rpstblastn || 
  1064.                                  program == blast_type_tblastx);
  1065. /* Do this for the first context, should this be changed?? */
  1066. kbp = sbp->kbp[query_info->first_context];
  1067. gap_size = hit_params->gap_size;
  1068. gap_prob = hit_params->gap_prob;
  1069. gap_decay_rate = hit_params->gap_decay_rate;
  1070.    /* Use average query length */
  1071. query_length = query_info->context_offsets[query_info->last_context+1] /
  1072.       (query_info->last_context + 1);
  1073.    if (translated_subject) {
  1074.       /* Lengths in subsequent calculations should be on the protein scale */
  1075.       subject_length /= CODON_LENGTH;
  1076.       db_length /= CODON_LENGTH;
  1077.    }
  1078. /* Subtract off the expected score. */
  1079.    expected_length = BLAST_Nint(log(kbp->K*((double) query_length)*
  1080.                                     ((double) subject_length))/(kbp->H));
  1081.    query_length = query_length - expected_length;
  1082.    subject_length = subject_length - expected_length;
  1083.    query_length = MAX(query_length, 1);
  1084.    subject_length = MAX(subject_length, 1);
  1085.    /* If this is a database search, use database length, else the single 
  1086.       subject sequence length */
  1087.    if (db_length > subject_length) {
  1088.       y_variable = log((double) (db_length)/(double) subject_length)*(kbp->K)/
  1089.          (gap_decay_rate);
  1090.    } else {
  1091.       y_variable = log((double) (subject_length + expected_length)/
  1092.                        (double) subject_length)*(kbp->K)/(gap_decay_rate);
  1093.    }
  1094.    search_sp = ((Int8) query_length)* ((Int8) subject_length);
  1095.    x_variable = 0.25*y_variable*((double) search_sp);
  1096.    /* To use "small" gaps the query and subject must be "large" compared to
  1097.       the gap size. If small gaps may be used, then the cutoff values must be
  1098.       adjusted for the "bayesian" possibility that both large and small gaps 
  1099.       are being checked for. */
  1100.    if (search_sp > 8*gap_size*gap_size) {
  1101.       x_variable /= (1.0 - gap_prob + MY_EPS);
  1102.       hit_params->cutoff_big_gap = 
  1103.          (Int4) floor((log(x_variable)/kbp->Lambda)) + 1;
  1104.       x_variable = y_variable*(gap_size*gap_size);
  1105.       x_variable /= (gap_prob + MY_EPS);
  1106.       hit_params->cutoff_small_gap = 
  1107.          MAX(ext_params->gap_trigger, 
  1108.              (Int4) floor((log(x_variable)/kbp->Lambda)) + 1);
  1109.       hit_params->ignore_small_gaps = FALSE;
  1110.    } else {
  1111.       hit_params->cutoff_big_gap = 
  1112.          (Int4) floor((log(x_variable)/kbp->Lambda)) + 1;
  1113.       hit_params->cutoff_small_gap = hit_params->cutoff_big_gap;
  1114.       hit_params->ignore_small_gaps = TRUE;
  1115.    }
  1116.    hit_params->cutoff_big_gap *= (Int4)sbp->scale_factor;
  1117.    hit_params->cutoff_small_gap *= (Int4)sbp->scale_factor;
  1118. }
  1119. /*
  1120.  * ===========================================================================
  1121.  *
  1122.  * $Log: blast_options.c,v $
  1123.  * Revision 1000.6  2004/06/01 18:07:31  gouriano
  1124.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.111
  1125.  *
  1126.  * Revision 1.111  2004/05/26 16:04:54  papadopo
  1127.  * fix doxygen errors
  1128.  *
  1129.  * Revision 1.110  2004/05/24 17:26:21  camacho
  1130.  * Fix PC warning
  1131.  *
  1132.  * Revision 1.109  2004/05/20 16:29:30  madden
  1133.  * Make searchsp an Int8 consistent with rest of blast
  1134.  *
  1135.  * Revision 1.108  2004/05/19 14:52:02  camacho
  1136.  * 1. Added doxygen tags to enable doxygen processing of algo/blast/core
  1137.  * 2. Standardized copyright, CVS $Id string, $Log and rcsid formatting and i
  1138.  *    location
  1139.  * 3. Added use of @todo doxygen keyword
  1140.  *
  1141.  * Revision 1.107  2004/05/17 15:30:20  madden
  1142.  * Int algorithm_type replaced with enum EBlastPrelimGapExt, removed include for blast_gapalign.h
  1143.  *
  1144.  * Revision 1.106  2004/05/14 17:11:03  dondosha
  1145.  * Minor correction in setting X-dropoffs
  1146.  *
  1147.  * Revision 1.105  2004/05/14 13:14:15  camacho
  1148.  * Use correct definition for inclusion threshold
  1149.  *
  1150.  * Revision 1.104  2004/05/12 12:18:06  madden
  1151.  * Clean out PSIBlast options, add fields to ExtensionOptions to support smith-waterman and composition-based stats
  1152.  *
  1153.  * Revision 1.103  2004/05/10 14:27:23  madden
  1154.  * Correction to CalculateLinkHSPCutoffs to use gap_trigger in calculation of small cutoff
  1155.  *
  1156.  * Revision 1.102  2004/05/07 15:22:15  papadopo
  1157.  * 1. add functions to allocate and free BlastScoringParameters structures
  1158.  * 2. apply a scaling factor to all cutoffs generated in HitSavingParameters
  1159.  *    or ExtentionParameters structures
  1160.  *
  1161.  * Revision 1.101  2004/04/29 17:41:05  papadopo
  1162.  * Scale down the search space when calculating the S2 cutoff score for a translated RPS search
  1163.  *
  1164.  * Revision 1.100  2004/04/29 15:08:43  madden
  1165.  * Add BlastScoringOptionsDup
  1166.  *
  1167.  * Revision 1.99  2004/04/23 14:02:25  papadopo
  1168.  * ignore validation of LookupTableOptions if performing an RPS search
  1169.  *
  1170.  * Revision 1.98  2004/04/22 22:18:03  dondosha
  1171.  * Set lookup table type correctly in BLAST_FillLookupTableOptions - needed for C driver only
  1172.  *
  1173.  * Revision 1.97  2004/04/21 17:00:59  madden
  1174.  * Removed set but not read variable
  1175.  *
  1176.  * Revision 1.96  2004/04/19 12:58:44  madden
  1177.  * Changed BLAST_KarlinBlk to Blast_KarlinBlk to avoid conflict with blastkar.h structure, renamed some functions to start with Blast_Karlin, made Blast_KarlinBlkDestruct public
  1178.  *
  1179.  * Revision 1.95  2004/04/16 14:17:06  papadopo
  1180.  * add use of RPS-specific defines, remove RPS argument to FillLookupTableOptions
  1181.  *
  1182.  * Revision 1.94  2004/04/07 03:06:16  camacho
  1183.  * Added blast_encoding.[hc], refactoring blast_stat.[hc]
  1184.  *
  1185.  * Revision 1.93  2004/03/26 20:46:00  dondosha
  1186.  * Made gap_trigger parameter an integer, as in the old code
  1187.  *
  1188.  * Revision 1.92  2004/03/22 20:11:37  dondosha
  1189.  * Do not allow small gaps cutoff to be less than gap trigger
  1190.  *
  1191.  * Revision 1.91  2004/03/17 15:19:10  camacho
  1192.  * Add missing casts
  1193.  *
  1194.  * Revision 1.90  2004/03/11 23:58:10  dondosha
  1195.  * Set cutoff_score to 0 before calling BLAST_Cutoffs, so it knows what to calculate
  1196.  *
  1197.  * Revision 1.89  2004/03/11 20:41:49  camacho
  1198.  * Remove dead code
  1199.  *
  1200.  * Revision 1.88  2004/03/10 17:33:10  papadopo
  1201.  * Make a separate lookup table type for RPS blast
  1202.  *
  1203.  * Revision 1.87  2004/03/09 22:37:26  dondosha
  1204.  * Added const qualifiers to parameter arguments wherever relevant
  1205.  *
  1206.  * Revision 1.86  2004/03/09 18:46:24  dondosha
  1207.  * Corrected how cutoffs are calculated
  1208.  *
  1209.  * Revision 1.85  2004/03/04 21:07:48  papadopo
  1210.  * add RPS BLAST functionality
  1211.  *
  1212.  * Revision 1.84  2004/02/27 15:56:33  papadopo
  1213.  * Mike Gertz' modifications to unify handling of gapped Karlin blocks for protein and nucleotide searches. Also modified BLAST_MainSetUp to allocate gapped Karlin blocks last
  1214.  *
  1215.  * Revision 1.83  2004/02/24 17:57:14  dondosha
  1216.  * Added function to combine all options validation functions for the C engine
  1217.  *
  1218.  * Revision 1.82  2004/02/19 21:16:48  dondosha
  1219.  * Use enum type for severity argument in Blast_MessageWrite
  1220.  *
  1221.  * Revision 1.81  2004/02/17 22:10:30  dondosha
  1222.  * Set preliminary hitlist size in options initialization
  1223.  *
  1224.  * Revision 1.80  2004/02/07 15:48:30  ucko
  1225.  * PSIBlastOptionsNew: rearrange slightly so that declarations come first.
  1226.  *
  1227.  * Revision 1.79  2004/02/06 22:49:30  dondosha
  1228.  * Check for NULL pointer in PSIBlastOptionsNew
  1229.  *
  1230.  * Revision 1.78  2004/02/03 18:33:39  dondosha
  1231.  * Correction to previous change: word size can be 11 if discontiguous words
  1232.  *
  1233.  * Revision 1.77  2004/02/03 16:17:33  dondosha
  1234.  * Require word size to be >= 12 with megablast lookup table
  1235.  *
  1236.  * Revision 1.76  2004/02/02 18:49:32  dondosha
  1237.  * Fixes for minor compiler warnings
  1238.  *
  1239.  * Revision 1.75  2003/12/31 20:04:47  dondosha
  1240.  * Round best stride to a number divisible by 4 for all values except 6 and 7
  1241.  *
  1242.  * Revision 1.74  2003/12/31 16:04:37  coulouri
  1243.  * use -1 to disable protein neighboring words
  1244.  *
  1245.  * Revision 1.73  2003/12/08 16:03:05  coulouri
  1246.  * Propagate protein neighboring threshold even if it is zero
  1247.  *
  1248.  * Revision 1.72  2003/11/24 23:18:32  dondosha
  1249.  * Added gap_decay_rate argument to BLAST_Cutoffs; removed BLAST_Cutoffs_simple
  1250.  *
  1251.  * Revision 1.71  2003/11/12 18:17:46  dondosha
  1252.  * Correction in calculating scanning stride
  1253.  *
  1254.  * Revision 1.70  2003/11/04 23:22:47  dondosha
  1255.  * Do not calculate hit saving cutoff score for PHI BLAST
  1256.  *
  1257.  * Revision 1.69  2003/10/30 19:34:01  dondosha
  1258.  * Removed gapped_calculation from BlastHitSavingOptions structure
  1259.  *
  1260.  * Revision 1.68  2003/10/24 20:55:10  camacho
  1261.  * Rename GetDefaultStride
  1262.  *
  1263.  * Revision 1.67  2003/10/22 16:44:33  dondosha
  1264.  * Added function to calculate default stride value for AG method
  1265.  *
  1266.  * Revision 1.66  2003/10/21 22:15:34  camacho
  1267.  * Rearranging of C options structures, fix seed extension method
  1268.  *
  1269.  * Revision 1.65  2003/10/17 18:20:20  dondosha
  1270.  * Use separate variables for different initial word extension options
  1271.  *
  1272.  * Revision 1.64  2003/10/15 16:59:43  coulouri
  1273.  * type correctness fixes
  1274.  *
  1275.  * Revision 1.63  2003/10/07 17:26:11  dondosha
  1276.  * Lower case mask moved from options to the sequence block
  1277.  *
  1278.  * Revision 1.62  2003/10/02 22:08:34  dondosha
  1279.  * Corrections for one-strand translated searches
  1280.  *
  1281.  * Revision 1.61  2003/10/01 22:36:52  dondosha
  1282.  * Correction of setting of e2 in revision 1.57 was wrong
  1283.  *
  1284.  * Revision 1.60  2003/09/24 19:28:20  dondosha
  1285.  * Correction in setting extend word method: unset options that are set by default but overridden
  1286.  *
  1287.  * Revision 1.59  2003/09/12 17:26:01  dondosha
  1288.  * Added check that gap extension option cannot be 0 when gap open is not 0
  1289.  *
  1290.  * Revision 1.58  2003/09/10 19:48:08  dondosha
  1291.  * Removed dependency on mb_lookup.h
  1292.  *
  1293.  * Revision 1.57  2003/09/09 22:12:02  dondosha
  1294.  * Minor correction for ungapped cutoff calculation; added freeing of PHI pattern
  1295.  *
  1296.  * Revision 1.56  2003/09/08 12:55:57  madden
  1297.  * Allow use of PSSM to construct lookup table
  1298.  *
  1299.  * Revision 1.55  2003/08/27 15:05:37  camacho
  1300.  * Use symbolic name for alphabet sizes
  1301.  *
  1302.  * Revision 1.54  2003/08/26 21:53:33  madden
  1303.  * Protein alphabet is 26 chars, not 25
  1304.  *
  1305.  * Revision 1.53  2003/08/11 15:01:59  dondosha
  1306.  * Added algo/blast/core to all #included headers
  1307.  *
  1308.  * Revision 1.52  2003/08/01 17:26:19  dondosha
  1309.  * Use renamed versions of functions from local blastkar.h
  1310.  *
  1311.  * Revision 1.51  2003/07/31 17:45:17  dondosha
  1312.  * Made use of const qualifier consistent throughout the library
  1313.  *
  1314.  * Revision 1.50  2003/07/31 14:31:41  camacho
  1315.  * Replaced Char for char
  1316.  *
  1317.  * Revision 1.49  2003/07/31 14:19:28  camacho
  1318.  * Replaced FloatHi for double
  1319.  *
  1320.  * Revision 1.48  2003/07/31 00:32:37  camacho
  1321.  * Eliminated Ptr notation
  1322.  *
  1323.  * Revision 1.47  2003/07/30 22:06:25  dondosha
  1324.  * Convert matrix name to upper case when filling scoring options
  1325.  *
  1326.  * Revision 1.46  2003/07/30 19:39:14  camacho
  1327.  * Remove PNTRs
  1328.  *
  1329.  * Revision 1.45  2003/07/30 18:58:10  dondosha
  1330.  * Removed unused member matrixname from lookup table options
  1331.  *
  1332.  * Revision 1.44  2003/07/30 17:15:00  dondosha
  1333.  * Minor fixes for very strict compiler warnings
  1334.  *
  1335.  * Revision 1.43  2003/07/30 16:32:02  madden
  1336.  * Use ansi functions when possible
  1337.  *
  1338.  * Revision 1.42  2003/07/29 14:42:31  coulouri
  1339.  * use strdup() instead of StringSave()
  1340.  *
  1341.  * Revision 1.41  2003/07/28 19:04:15  camacho
  1342.  * Replaced all MemNews for calloc
  1343.  *
  1344.  * Revision 1.40  2003/07/25 21:12:28  coulouri
  1345.  * remove constructions of the form "return sfree();" and "a=sfree(a);"
  1346.  *
  1347.  * Revision 1.39  2003/07/25 17:25:43  coulouri
  1348.  * in progres:
  1349.  *  * use malloc/calloc/realloc instead of Malloc/Calloc/Realloc
  1350.  *  * add sfree() macro and __sfree() helper function to util.[ch]
  1351.  *  * use sfree() instead of MemFree()
  1352.  *
  1353.  * Revision 1.38  2003/07/23 17:31:10  camacho
  1354.  * BlastDatabaseParameters struct is deprecated
  1355.  *
  1356.  * Revision 1.37  2003/07/23 16:42:01  dondosha
  1357.  * Formatting options moved from blast_options.c to blast_format.c
  1358.  *
  1359.  * Revision 1.36  2003/07/22 20:26:16  dondosha
  1360.  * Initialize BlastDatabaseParameters structure outside engine
  1361.  *
  1362.  * Revision 1.35  2003/07/22 15:32:55  dondosha
  1363.  * Removed dependence on readdb API
  1364.  *
  1365.  * Revision 1.34  2003/07/21 20:31:47  dondosha
  1366.  * Added BlastDatabaseParameters structure with genetic code string
  1367.  *
  1368.  * Revision 1.33  2003/06/26 21:38:05  dondosha
  1369.  * Program number is removed from options structures, and passed explicitly as a parameter to functions that need it
  1370.  *
  1371.  * Revision 1.32  2003/06/26 20:24:06  camacho
  1372.  * Do not free options structure in BlastExtensionParametersFree
  1373.  *
  1374.  * Revision 1.31  2003/06/23 21:49:11  dondosha
  1375.  * Possibility of linking HSPs for tblastn activated
  1376.  *
  1377.  * Revision 1.30  2003/06/20 21:40:21  dondosha
  1378.  * Added parameters for linking HSPs
  1379.  *
  1380.  * Revision 1.29  2003/06/20 15:20:21  dondosha
  1381.  * Memory leak fixes
  1382.  *
  1383.  * Revision 1.28  2003/06/18 12:21:01  camacho
  1384.  * Added proper return value
  1385.  *
  1386.  * Revision 1.27  2003/06/17 20:42:43  camacho
  1387.  * Moved comments to header file, fixed includes
  1388.  *
  1389.  * Revision 1.26  2003/06/11 16:14:53  dondosha
  1390.  * Added initialization of PSI-BLAST and database options
  1391.  *
  1392.  * Revision 1.25  2003/06/09 20:13:17  dondosha
  1393.  * Minor type casting compiler warnings fixes
  1394.  *
  1395.  * Revision 1.24  2003/06/06 17:02:30  dondosha
  1396.  * Typo fix
  1397.  *
  1398.  * Revision 1.23  2003/06/04 20:16:51  coulouri
  1399.  * make prototypes and definitions agree
  1400.  *
  1401.  * Revision 1.22  2003/06/03 15:50:39  coulouri
  1402.  * correct function pointer argument
  1403.  *
  1404.  * Revision 1.21  2003/05/30 15:52:11  coulouri
  1405.  * various lint-induced cleanups
  1406.  *
  1407.  * Revision 1.20  2003/05/21 22:31:53  dondosha
  1408.  * Added forcing of ungapped search for tblastx to option validation
  1409.  *
  1410.  * Revision 1.19  2003/05/18 21:57:37  camacho
  1411.  * Use Uint1 for program name whenever possible
  1412.  *
  1413.  * Revision 1.18  2003/05/15 22:01:22  coulouri
  1414.  * add rcsid string to sources
  1415.  *
  1416.  * Revision 1.17  2003/05/13 20:41:48  dondosha
  1417.  * Correction in assigning of number of db sequences for 2 sequence case
  1418.  *
  1419.  * Revision 1.16  2003/05/13 15:11:34  dondosha
  1420.  * Changed some char * arguments to const char *
  1421.  *
  1422.  * Revision 1.15  2003/05/07 17:44:31  dondosha
  1423.  * Assign ungapped xdropoff default correctly for protein programs
  1424.  *
  1425.  * Revision 1.14  2003/05/06 20:29:57  dondosha
  1426.  * Fix in filling effective length options
  1427.  *
  1428.  * Revision 1.13  2003/05/06 14:34:51  dondosha
  1429.  * Fix in comment
  1430.  *
  1431.  * Revision 1.12  2003/05/01 16:56:30  dondosha
  1432.  * Fixed strict compiler warnings
  1433.  *
  1434.  * Revision 1.11  2003/05/01 15:33:39  dondosha
  1435.  * Reorganized the setup of BLAST search
  1436.  *
  1437.  * Revision 1.10  2003/04/24 14:27:35  dondosha
  1438.  * Correction for latest changes
  1439.  *
  1440.  * Revision 1.9  2003/04/23 20:04:49  dondosha
  1441.  * Added a function BLAST_InitAllDefaultOptions to initialize all various options structures with only default values
  1442.  *
  1443.  * Revision 1.8  2003/04/17 21:14:41  dondosha
  1444.  * Added cutoff score hit parameters that is calculated from e-value
  1445.  *
  1446.  * Revision 1.7  2003/04/16 22:25:37  dondosha
  1447.  * Correction to previous change
  1448.  *
  1449.  * Revision 1.6  2003/04/16 22:20:24  dondosha
  1450.  * Correction in calculation of cutoff score for ungapped extensions
  1451.  *
  1452.  * Revision 1.5  2003/04/11 22:35:48  dondosha
  1453.  * Minor corrections for blastn
  1454.  *
  1455.  * Revision 1.4  2003/04/03 22:57:50  dondosha
  1456.  * Uninitialized variable fix
  1457.  *
  1458.  * Revision 1.3  2003/04/02 17:20:41  dondosha
  1459.  * Added calculation of ungapped cutoff score in correct place
  1460.  *
  1461.  * Revision 1.2  2003/04/01 17:42:33  dondosha
  1462.  * Added arguments to BlastExtensionParametersNew
  1463.  *
  1464.  * Revision 1.1  2003/03/31 18:22:30  camacho
  1465.  * Moved from parent directory
  1466.  *
  1467.  * Revision 1.30  2003/03/28 23:12:34  dondosha
  1468.  * Added program argument to BlastFormattingOptionsNew
  1469.  *
  1470.  * Revision 1.29  2003/03/27 20:54:19  dondosha
  1471.  * Moved ungapped cutoff from hit options to word options
  1472.  *
  1473.  * Revision 1.28  2003/03/25 16:30:25  dondosha
  1474.  * Strict compiler warning fixes
  1475.  *
  1476.  * Revision 1.27  2003/03/24 20:39:17  dondosha
  1477.  * Added BlastExtensionParameters structure to hold raw gapped X-dropoff values
  1478.  *
  1479.  * Revision 1.26  2003/03/19 19:52:42  dondosha
  1480.  * 1. Added strand option argument to BlastQuerySetUpOptionsNew
  1481.  * 2. Added check of discontiguous template parameters in LookupTableOptionsValidate
  1482.  *
  1483.  * Revision 1.25  2003/03/14 19:08:53  dondosha
  1484.  * Added arguments to various OptionsNew functions, so all initialization can be done inside
  1485.  *
  1486.  * Revision 1.24  2003/03/12 17:03:41  dondosha
  1487.  * Set believe_query in formatting options to FALSE by default
  1488.  *
  1489.  * Revision 1.23  2003/03/11 20:40:32  dondosha
  1490.  * Correction in assigning gap_x_dropoff_final
  1491.  *
  1492.  * Revision 1.22  2003/03/10 16:44:42  dondosha
  1493.  * Added functions for initialization and freeing of formatting options structure
  1494.  *
  1495.  * Revision 1.21  2003/03/07 20:41:08  dondosha
  1496.  * Small corrections in option initialization functions
  1497.  *
  1498.  * Revision 1.20  2003/03/06 19:25:52  madden
  1499.  * Include blast_util.h
  1500.  *
  1501.  * Revision 1.19  2003/03/05 21:19:09  coulouri
  1502.  * set NA_LOOKUP_TABLE flag
  1503.  *
  1504.  * Revision 1.18  2003/03/05 20:58:50  dondosha
  1505.  * Corrections for handling effective search space for multiple queries
  1506.  *
  1507.  * Revision 1.17  2003/03/05 15:36:34  madden
  1508.  * Moved BlastNumber2Program and BlastProgram2Number from blast_options to blast_util
  1509.  *
  1510.  * Revision 1.16  2003/03/03 14:43:21  madden
  1511.  * Use BlastKarlinkGapBlkFill, PrintMatrixMessage, and PrintAllowedValuesMessage
  1512.  *
  1513.  * Revision 1.15  2003/02/26 15:42:50  madden
  1514.  * const charPtr becomes const char *, add BlastExtensionOptionsValidate
  1515.  *
  1516.  * Revision 1.14  2003/02/14 16:30:19  dondosha
  1517.  * Get rid of a compiler warning for type mismatch
  1518.  *
  1519.  * Revision 1.13  2003/02/13 21:42:25  madden
  1520.  * Added validation functions
  1521.  *
  1522.  * Revision 1.12  2003/02/04 13:14:36  dondosha
  1523.  * Changed the macro definitions for 
  1524.  *
  1525.  * Revision 1.11  2003/01/31 17:00:32  dondosha
  1526.  * Do not set the scan step in LookupTableOptionsNew
  1527.  *
  1528.  * Revision 1.10  2003/01/28 15:13:25  madden
  1529.  * Added functions and structures for parameters
  1530.  *
  1531.  * Revision 1.9  2003/01/22 20:49:31  dondosha
  1532.  * Set decline_align for blastn too
  1533.  *
  1534.  * Revision 1.8  2003/01/22 15:09:55  dondosha
  1535.  * Correction for default penalty assignment
  1536.  *
  1537.  * Revision 1.7  2003/01/17 22:10:45  madden
  1538.  * Added functions for BlastExtensionOptions, BlastInitialWordOptions as well as defines for default values
  1539.  *
  1540.  * Revision 1.6  2003/01/10 18:36:40  madden
  1541.  * Change call to BlastEffectiveLengthsOptionsNew
  1542.  *
  1543.  * Revision 1.5  2003/01/02 17:09:35  dondosha
  1544.  * Fill alphabet size when creating lookup table options structure
  1545.  *
  1546.  * Revision 1.4  2002/12/24 14:49:00  madden
  1547.  * Set defaults for LookupTableOptions for protein-protein searches
  1548.  *
  1549.  * Revision 1.3  2002/12/04 13:38:21  madden
  1550.  * Add function LookupTableOptionsNew
  1551.  *
  1552.  * Revision 1.2  2002/10/17 15:45:17  madden
  1553.  * Make BLOSUM62 default
  1554.  *
  1555.  * Revision 1.1  2002/10/07 21:05:12  madden
  1556.  * Sets default option values
  1557.  *
  1558.  * ===========================================================================
  1559.  */