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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_setup.c,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 18:07:47  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.87
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blast_setup.c,v 1000.3 2004/06/01 18:07:47 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 official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Tom Madden
  35.  *
  36.  */
  37. /** @file blast_setup.c
  38.  * Utilities initialize/setup BLAST.
  39.  */
  40. static char const rcsid[] =
  41.     "$Id: blast_setup.c,v 1000.3 2004/06/01 18:07:47 gouriano Exp $";
  42. #include <algo/blast/core/blast_setup.h>
  43. #include <algo/blast/core/blast_util.h>
  44. #include <algo/blast/core/blast_filter.h>
  45. #include <algo/blast/core/blast_encoding.h>
  46. /* See description in blast_setup.h */
  47. Int2
  48. BlastScoreBlkGappedFill(BlastScoreBlk * sbp,
  49.                         const BlastScoringOptions * scoring_options,
  50.                         Uint1 program, BlastQueryInfo * query_info)
  51. {
  52.     Int2 tmp_index;
  53.     if (sbp == NULL || scoring_options == NULL)
  54.         return 1;
  55.     /* At this stage query sequences are nucleotide only for blastn */
  56.     if (program == blast_type_blastn) {
  57.         /* for blastn, duplicate the ungapped Karlin 
  58.            structures for use in gapped alignments */
  59.         for (tmp_index = query_info->first_context;
  60.              tmp_index <= query_info->last_context; tmp_index++) {
  61.             if (sbp->kbp_std[tmp_index] != NULL) {
  62.                 Blast_KarlinBlk *kbp_gap;
  63.                 Blast_KarlinBlk *kbp;
  64.  
  65.                 sbp->kbp_gap_std[tmp_index] = Blast_KarlinBlkCreate();
  66.                 kbp_gap = sbp->kbp_gap_std[tmp_index];
  67.                 kbp     = sbp->kbp_std[tmp_index];
  68.                 kbp_gap->Lambda = kbp->Lambda;
  69.                 kbp_gap->K      = kbp->K;
  70.                 kbp_gap->logK   = kbp->logK;
  71.                 kbp_gap->H      = kbp->H;
  72.                 kbp_gap->paramC = kbp->paramC;
  73.             }
  74.         }
  75.     } else {
  76.         for (tmp_index = query_info->first_context;
  77.              tmp_index <= query_info->last_context; tmp_index++) {
  78.             sbp->kbp_gap_std[tmp_index] = Blast_KarlinBlkCreate();
  79.             Blast_KarlinBlkGappedCalc(sbp->kbp_gap_std[tmp_index],
  80.                                       scoring_options->gap_open,
  81.                                       scoring_options->gap_extend,
  82.                                       scoring_options->decline_align,
  83.                                       sbp->name, NULL);
  84.         }
  85.     }
  86.     sbp->kbp_gap = sbp->kbp_gap_std;
  87.     return 0;
  88. }
  89. static Int2
  90. PHIScoreBlkFill(BlastScoreBlk* sbp, const BlastScoringOptions* options,
  91.    Blast_Message** blast_message)
  92. {
  93.    Blast_KarlinBlk* kbp;
  94.    char buffer[1024];
  95.    Int2 status = 0;
  96.    sbp->read_in_matrix = TRUE;
  97.    sbp->name = strdup(options->matrix);
  98.    if ((status = BLAST_ScoreBlkMatFill(sbp, options->matrix_path)) != 0)
  99.       return status;
  100.    kbp = sbp->kbp_gap_std[0] = Blast_KarlinBlkCreate();
  101.    sbp->kbp_std = sbp->kbp_gap_std;
  102.    if (0 == strcmp("BLOSUM62", options->matrix)) {
  103.       kbp->paramC = 0.50;
  104.       if ((11 == options->gap_open) && (1 == options->gap_extend)) {
  105.          kbp->Lambda = 0.270;
  106.          kbp->K = 0.047;
  107.          return status;
  108.       }
  109.       if ((9 == options->gap_open) && (2 == options->gap_extend)) {
  110.          kbp->Lambda = 0.285;
  111.          kbp->K = 0.075;
  112.          return status;
  113.       }
  114.       if ((8 == options->gap_open) && (2 == options->gap_extend)) {
  115.          kbp->Lambda = 0.265;
  116.          kbp->K = 0.046;
  117.          return status;
  118.       }
  119.       if ((7 == options->gap_open) && (2 == options->gap_extend)) {
  120.          kbp->Lambda = 0.243;
  121.          kbp->K = 0.032;
  122.          return status;
  123.       }
  124.       if ((12 == options->gap_open) && (1 == options->gap_extend)) {
  125.          kbp->Lambda = 0.281;
  126.          kbp->K = 0.057;
  127.          return status;
  128.       }
  129.       if ((10 == options->gap_open) && (1 == options->gap_extend)) {
  130.          kbp->Lambda = 0.250;
  131.          kbp->K = 0.033;
  132.          return status;
  133.       }
  134.       sprintf(buffer, "The combination %d for gap opening cost and %d for gap extension is not supported in PHI-BLAST with matrix %sn", options->gap_open, options->gap_extend, options->matrix);
  135.       Blast_MessageWrite(blast_message, BLAST_SEV_WARNING, 2, 1, buffer);
  136.    }
  137.    else {
  138.       if (0 == strcmp("PAM30", options->matrix)) { 
  139.          kbp->paramC = 0.30;
  140.          if ((9 == options->gap_open) && (1 == options->gap_extend)) {
  141.             kbp->Lambda = 0.295;
  142.             kbp->K = 0.13;
  143.             return status;
  144.          }
  145.          if ((7 == options->gap_open) && (2 == options->gap_extend)) {
  146.             kbp->Lambda = 0.306;
  147.             kbp->K = 0.15;
  148.             return status;
  149.          }
  150.          if ((6 == options->gap_open) && (2 == options->gap_extend)) {
  151.             kbp->Lambda = 0.292;
  152.             kbp->K = 0.13;
  153.             return status;
  154.          }
  155.          if ((5 == options->gap_open) && (2 == options->gap_extend)) {
  156.             kbp->Lambda = 0.263;
  157.             kbp->K = 0.077;
  158.             return status;
  159.          }
  160.          if ((10 == options->gap_open) && (1 == options->gap_extend)) {
  161.             kbp->Lambda = 0.309;
  162.             kbp->K = 0.15;
  163.             return status;
  164.          }
  165.          if ((8 == options->gap_open) && (1 == options->gap_extend)) {
  166.             kbp->Lambda = 0.270;
  167.             kbp->K = 0.070;
  168.             return status;
  169.          }
  170.          sprintf(buffer, "The combination %d for gap opening cost and %d for gap extension is not supported in PHI-BLAST with matrix %sn", options->gap_open, options->gap_extend, options->matrix);
  171.          Blast_MessageWrite(blast_message, BLAST_SEV_WARNING, 2, 1, buffer);
  172.       }
  173.       else {
  174.          if (0 == strcmp("PAM70", options->matrix)) { 
  175.             kbp->paramC = 0.35;
  176.             if ((10 == options->gap_open) && (1 == options->gap_extend)) {
  177.                kbp->Lambda = 0.291;
  178.                kbp->K = 0.089;
  179.                return status;
  180.             }
  181.             if ((8 == options->gap_open) && (2 == options->gap_extend)) {
  182.                kbp->Lambda = 0.303;
  183.                kbp->K = 0.13;
  184.                return status;
  185.             }
  186.             if ((7 == options->gap_open) && (2 == options->gap_extend)) {
  187.                kbp->Lambda = 0.287;
  188.                kbp->K = 0.095;
  189.                return status;
  190.             }
  191.             if ((6 == options->gap_open) && (2 == options->gap_extend)) {
  192.                kbp->Lambda = 0.269;
  193.                kbp->K = 0.079;
  194.                return status;
  195.             }
  196.             if ((11 == options->gap_open) && (1 == options->gap_extend)) {
  197.                kbp->Lambda = 0.307;
  198.                kbp->K = 0.13;
  199.                return status;
  200.             }
  201.             if ((9 == options->gap_open) && (1 == options->gap_extend)) {
  202.                kbp->Lambda = 0.269;
  203.                kbp->K = 0.058;
  204.                return status;
  205.             }
  206.             sprintf(buffer, "The combination %d for gap opening cost and %d for gap extension is not supported in PHI-BLAST with matrix %sn", options->gap_open, options->gap_extend, options->matrix);
  207.             Blast_MessageWrite(blast_message, BLAST_SEV_WARNING, 2, 1, buffer);
  208.          }
  209.          else {
  210.             if (0 == strcmp("BLOSUM80", options->matrix)) { 
  211.                kbp->paramC = 0.40;
  212.                if ((10 == options->gap_open) && (1 == options->gap_extend)) {
  213.                   kbp->Lambda = 0.300;
  214.                   kbp->K = 0.072;
  215.                   return status;
  216.                }
  217.                if ((8 == options->gap_open) && (2 == options->gap_extend)) {
  218.                   kbp->Lambda = 0.308;
  219.                   kbp->K = 0.089;
  220.                   return status;
  221.                }
  222.                if ((7 == options->gap_open) && (2 == options->gap_extend)) {
  223.                   kbp->Lambda = 0.295;
  224.                   kbp->K = 0.077;
  225.                   return status;
  226.                }
  227.                if ((6 == options->gap_open) && (2 == options->gap_extend)) {
  228.                   kbp->Lambda = 0.271;
  229.                   kbp->K = 0.051;
  230.                   return status;
  231.                }
  232.                if ((11 == options->gap_open) && (1 == options->gap_extend)) {
  233.                   kbp->Lambda = 0.314;
  234.                   kbp->K = 0.096;
  235.                   return status;
  236.                }
  237.                if ((9 == options->gap_open) && (1 == options->gap_extend)) {
  238.                   kbp->Lambda = 0.277;
  239.                   kbp->K = 0.046;
  240.                   return status;
  241.                }
  242.                sprintf(buffer, "The combination %d for gap opening cost and %d for gap extension is not supported in PHI-BLAST with matrix %sn", options->gap_open, options->gap_extend, options->matrix);
  243.                Blast_MessageWrite(blast_message, BLAST_SEV_WARNING, 2, 1, buffer);
  244.             }
  245.             else {
  246.                if (0 == strcmp("BLOSUM45", options->matrix)) { 
  247.                   kbp->paramC = 0.60;
  248.                   if ((14 == options->gap_open) && (2 == options->gap_extend)) {
  249.                      kbp->Lambda = 0.199;
  250.                      kbp->K = 0.040;
  251.                      return status;
  252.                   }
  253.                   if ((13 == options->gap_open) && (3 == options->gap_extend)) {
  254.                      kbp->Lambda = 0.209;
  255.                      kbp->K = 0.057;
  256.                      return status;
  257.                   }
  258.                   if ((12 == options->gap_open) && (3 == options->gap_extend)) {
  259.                      kbp->Lambda = 0.203;
  260.                      kbp->K = 0.049;
  261.                      return status;
  262.                   }
  263.                   if ((11 == options->gap_open) && (3 == options->gap_extend)) {
  264.                      kbp->Lambda = 0.193;
  265.                      kbp->K = 0.037;
  266.                      return status;
  267.                   }
  268.                   if ((10 == options->gap_open) && (3 == options->gap_extend)) {
  269.                      kbp->Lambda = 0.182;
  270.                      kbp->K = 0.029;
  271.                      return status;
  272.                   }
  273.                   if ((15 == options->gap_open) && (2 == options->gap_extend)) {
  274.                      kbp->Lambda = 0.206;
  275.                      kbp->K = 0.049;
  276.                      return status;
  277.                   }
  278.                   if ((13 == options->gap_open) && (2 == options->gap_extend)) {
  279.                      kbp->Lambda = 0.190;
  280.                      kbp->K = 0.032;
  281.                      return status;
  282.                   }
  283.                   if ((12 == options->gap_open) && (2 == options->gap_extend)) {
  284.                      kbp->Lambda = 0.177;
  285.                      kbp->K = 0.023;
  286.                      return status;
  287.                   }
  288.                   if ((19 == options->gap_open) && (1 == options->gap_extend)) {
  289.                      kbp->Lambda = 0.209;
  290.                      kbp->K = 0.049;
  291.                      return status;
  292.                   }
  293.                   if ((18 == options->gap_open) && (1 == options->gap_extend)) {
  294.                      kbp->Lambda = 0.202;
  295.                      kbp->K = 0.041;
  296.                      return status;
  297.                   }
  298.                   if ((17 == options->gap_open) && (1 == options->gap_extend)) {
  299.                      kbp->Lambda = 0.195;
  300.                      kbp->K = 0.034;
  301.                      return status;
  302.                   }
  303.                   if ((16 == options->gap_open) && (1 == options->gap_extend)) {
  304.                      kbp->Lambda = 0.183;
  305.                      kbp->K = 0.024;
  306.                      return status;
  307.                   }
  308.                   sprintf(buffer, "The combination %d for gap opening cost and %d for gap extension is not supported in PHI-BLAST with matrix %sn", options->gap_open, options->gap_extend, options->matrix);
  309.                   Blast_MessageWrite(blast_message, BLAST_SEV_WARNING, 2, 1, buffer);
  310.                }
  311.                else {
  312.                   sprintf(buffer, "Matrix %s not allowed in PHI-BLASTn", options->matrix);
  313.                   Blast_MessageWrite(blast_message, BLAST_SEV_WARNING, 2, 1, buffer);
  314.                }
  315.             }
  316.          }
  317.       }
  318.    }
  319. return status;
  320. }
  321. Int2
  322. BlastScoreBlkMatrixInit(Uint1 program_number, 
  323.                   const BlastScoringOptions* scoring_options,
  324.                   BlastScoreBlk* sbp)
  325. {
  326.    if (!sbp || !scoring_options)
  327.       return 1;
  328.    if (program_number == blast_type_blastn) {
  329.       BLAST_ScoreSetAmbigRes(sbp, 'N');
  330.       sbp->penalty = scoring_options->penalty;
  331.       sbp->reward = scoring_options->reward;
  332.       if (scoring_options->matrix_path &&
  333.           *scoring_options->matrix_path != NULLB &&
  334.           scoring_options->matrix && *scoring_options->matrix != NULLB) {
  335.           sbp->read_in_matrix = TRUE;
  336.           sbp->name = strdup(scoring_options->matrix);
  337.        } else {
  338.           char buffer[50];
  339.           sbp->read_in_matrix = FALSE;
  340.           sprintf(buffer, "blastn matrix:%ld %ld",
  341.                   (long) sbp->reward, (long) sbp->penalty);
  342.           sbp->name = strdup(buffer);
  343.        }
  344.     } else {
  345.        char* p = NULL;
  346.        sbp->read_in_matrix = TRUE;
  347.        BLAST_ScoreSetAmbigRes(sbp, 'X');
  348.        sbp->name = strdup(scoring_options->matrix);
  349.        /* protein matrices are in all caps by convention */
  350.        for (p = sbp->name; *p != NULLB; p++)
  351.           *p = toupper(*p);
  352.    }
  353.    return BLAST_ScoreBlkMatFill(sbp, scoring_options->matrix_path);
  354. }
  355. Int2 
  356. BlastSetup_GetScoreBlock(BLAST_SequenceBlk* query_blk, 
  357.                          BlastQueryInfo* query_info, 
  358.                          const BlastScoringOptions* scoring_options, 
  359.                          Uint1 program_number, 
  360.                          Boolean phi_align, 
  361.                          BlastScoreBlk* *sbpp, 
  362.                          double scale_factor, 
  363.                          Blast_Message* *blast_message)
  364. {
  365.     BlastScoreBlk* sbp;
  366.     Int2 status=0;      /* return value. */
  367.     Int4 context; /* loop variable. */
  368.     if (sbpp == NULL)
  369.        return 1;
  370.     if (program_number == blast_type_blastn)
  371.        sbp = BlastScoreBlkNew(BLASTNA_SEQ_CODE, query_info->last_context + 1);
  372.     else
  373.        sbp = BlastScoreBlkNew(BLASTAA_SEQ_CODE, query_info->last_context + 1);
  374.     if (!sbp)
  375.        return 1;
  376.     *sbpp = sbp;
  377.     sbp->scale_factor = scale_factor;
  378.     status = BlastScoreBlkMatrixInit(program_number, scoring_options, sbp);
  379.     if (status != 0)
  380.        return status;
  381.     for (context = query_info->first_context;
  382.          context <= query_info->last_context; ++context) {
  383.       
  384.         Int4 context_offset;
  385.         Int4 query_length;
  386.         Uint1 *buffer;              /* holds sequence */
  387.         /* For each query, check if forward strand is present */
  388.         if ((query_length = BLAST_GetQueryLength(query_info, context)) < 0)
  389.             continue;
  390.         context_offset = query_info->context_offsets[context];
  391.         buffer = &query_blk->sequence[context_offset];
  392.         if (!phi_align &&
  393.            (status = BLAST_ScoreBlkFill(sbp, (char *) buffer,
  394.                                         query_length, context))) {
  395.             Blast_MessageWrite(blast_message, BLAST_SEV_ERROR, 2, 1, 
  396.                    "Query completely filtered; nothing left to search");
  397.             return status;
  398.         }
  399.     }
  400.     /* Fills in block for gapped blast. */
  401.     if (phi_align) {
  402.        PHIScoreBlkFill(sbp, scoring_options, blast_message);
  403.     } else if (scoring_options->gapped_calculation) {
  404.        status = BlastScoreBlkGappedFill(sbp, scoring_options, 
  405.                                         program_number, query_info);
  406.        if (status) {
  407.           Blast_MessageWrite(blast_message, BLAST_SEV_ERROR, 2, 1, 
  408.                              "Unable to initialize scoring block");
  409.           return status;
  410.        }
  411.     }
  412.    
  413.     /* Get "ideal" values if the calculated Karlin-Altschul params bad. */
  414.     if (program_number == blast_type_blastx ||
  415.         program_number == blast_type_tblastx ||
  416.         program_number == blast_type_rpstblastn) {
  417.         /* Adjust the ungapped Karlin parameters */
  418.         sbp->kbp = sbp->kbp_std;
  419.         Blast_KarlinBlkStandardCalc(sbp, query_info->first_context,
  420.                                     query_info->last_context);
  421.     }
  422.     if (program_number == blast_type_blastx ||
  423.         program_number == blast_type_tblastx) {
  424.         /* Adjust the gapped Karlin parameters, if it is a gapped search */
  425.         if (scoring_options->gapped_calculation) {
  426.            sbp->kbp = sbp->kbp_gap_std;
  427.           Blast_KarlinBlkStandardCalc(sbp, query_info->first_context,
  428.                                        query_info->last_context);
  429.         }
  430.     }
  431.     /* Why are there so many Karlin block names?? */
  432.     sbp->kbp = sbp->kbp_std;
  433.     if (scoring_options->gapped_calculation)
  434.        sbp->kbp_gap = sbp->kbp_gap_std;
  435.     return 0;
  436. }
  437. Int2 BLAST_MainSetUp(Uint1 program_number,
  438.     const QuerySetUpOptions *qsup_options,
  439.     const BlastScoringOptions *scoring_options,
  440.     const BlastHitSavingOptions *hit_options,
  441.     BLAST_SequenceBlk *query_blk,
  442.     BlastQueryInfo *query_info,
  443.     double scale_factor,
  444.     BlastSeqLoc **lookup_segments, 
  445.     BlastMaskLoc **filter_out,
  446.     BlastScoreBlk **sbpp, 
  447.     Blast_Message **blast_message)
  448. {
  449.     Boolean mask_at_hash = FALSE; /* mask only for making lookup table? */
  450.     Int2 status = 0;            /* return value */
  451.     BlastMaskLoc *filter_maskloc = NULL;   /* Local variable for mask locs. */
  452.     status = BlastSetUp_GetFilteringLocations(query_blk, 
  453.                                               query_info, 
  454.                                               program_number, 
  455.                                               qsup_options->filter_string, 
  456.                                               &filter_maskloc, 
  457.                                               &mask_at_hash, 
  458.                                               blast_message);
  459.     if (status) {
  460.         return status;
  461.     } 
  462.     if (!mask_at_hash)
  463.     {
  464.         status = BlastSetUp_MaskQuery(query_blk, query_info, filter_maskloc, 
  465.                                       program_number);
  466.         if (status != 0) {
  467.             return status;
  468.         }
  469.     }
  470.     /* If there was a lower case mask, its contents have now been moved to 
  471.      * filter_maskloc and are no longer needed in the query block.
  472.     */
  473.     query_blk->lcase_mask = NULL;
  474.     if (filter_out)
  475.        *filter_out = filter_maskloc;
  476.     else 
  477.         filter_maskloc = BlastMaskLocFree(filter_maskloc);
  478.     if (program_number == blast_type_blastx && scoring_options->is_ooframe) {
  479.         BLAST_InitDNAPSequence(query_blk, query_info);
  480.     }
  481.     BLAST_ComplementMaskLocations(program_number, query_info, filter_maskloc, 
  482.                                   lookup_segments);
  483.     status = BlastSetup_GetScoreBlock(query_blk, query_info, scoring_options, 
  484.                                       program_number, hit_options->phi_align, 
  485.                                       sbpp, scale_factor, blast_message);
  486.     if (status > 0) {
  487.         return status;
  488.     }
  489.     return 0;
  490. }
  491. Int2 BLAST_CalcEffLengths (Uint1 program_number, 
  492.    const BlastScoringOptions* scoring_options,
  493.    const BlastEffectiveLengthsParameters* eff_len_params, 
  494.    const BlastScoreBlk* sbp, BlastQueryInfo* query_info)
  495. {
  496.    double alpha=0, beta=0; /*alpha and beta for new scoring system */
  497.    Int4 length_adjustment = 0;  /* length adjustment for current iteration. */
  498.    Int4 index; /* loop index. */
  499.    Int4 db_num_seqs; /* number of sequences in database. */
  500.    Int8 db_length; /* total length of database. */
  501.    Blast_KarlinBlk* *kbp_ptr; /* Array of Karlin block pointers */
  502.    Int4 query_length;   /* length of an individual query sequence */
  503.    Int8 effective_search_space = 0; /* Effective search space for a given 
  504.                                    sequence/strand/frame */
  505.    const BlastEffectiveLengthsOptions* eff_len_options = eff_len_params->options;
  506.    if (sbp == NULL)
  507.       return 1;
  508.    /* use overriding value from effective lengths options or the real value
  509.       from effective lengths parameters. */
  510.    if (eff_len_options->db_length > 0)
  511.       db_length = eff_len_options->db_length;
  512.    else
  513.       db_length = eff_len_params->real_db_length;
  514.    /* If database (subject) length is not available at this stage, 
  515.       do nothing */
  516.    if (db_length == 0)
  517.       return 0;
  518.    if (program_number == blast_type_tblastn || 
  519.        program_number == blast_type_tblastx)
  520.       db_length = db_length/3;
  521.    if (eff_len_options->dbseq_num > 0)
  522.       db_num_seqs = eff_len_options->dbseq_num;
  523.    else
  524.       db_num_seqs = eff_len_params->real_num_seqs;
  525.    
  526.    if (program_number != blast_type_blastn) {
  527.       if (scoring_options->gapped_calculation) {
  528.          BLAST_GetAlphaBeta(sbp->name,&alpha,&beta,TRUE, 
  529.             scoring_options->gap_open, scoring_options->gap_extend);
  530.       }
  531.    }
  532.    
  533.    if (scoring_options->gapped_calculation) 
  534.       kbp_ptr = sbp->kbp_gap_std;
  535.    else
  536.       kbp_ptr = sbp->kbp_std; 
  537.    
  538.    for (index = query_info->first_context;
  539.         index <= query_info->last_context;
  540.         index++) {
  541.        Blast_KarlinBlk * kbp;   /* statistical parameters for the
  542.                                    current context */
  543.        kbp = kbp_ptr[index];
  544.        if ( (query_length = BLAST_GetQueryLength(query_info, index)) > 0) {
  545.           /* Use the correct Karlin block. For blastn, two identical Karlin
  546.              blocks are allocated for each sequence (one per strand), but we
  547.              only need one of them.
  548.           */
  549.           if (program_number != blast_type_blastn &&
  550.               scoring_options->gapped_calculation) {
  551.              BLAST_ComputeLengthAdjustment(kbp->K, kbp->logK,
  552.                                            alpha/kbp->Lambda, beta,
  553.                                            query_length, db_length,
  554.                                            db_num_seqs, &length_adjustment);
  555.           } else {
  556.              BLAST_ComputeLengthAdjustment(kbp->K, kbp->logK, 1/kbp->H, 0,
  557.                                            query_length, db_length,
  558.                                            db_num_seqs, &length_adjustment);
  559.           }        
  560.           /* If overriding search space value is provided in options, 
  561.              do not calculate it. */
  562.           if (eff_len_options->searchsp_eff) {
  563.              effective_search_space = eff_len_options->searchsp_eff;
  564.           } else {
  565.              effective_search_space =
  566.                 (query_length - length_adjustment) * 
  567.                 (db_length - db_num_seqs*length_adjustment);
  568.              /* For translated RPS blast, the DB size is left unchanged
  569.                 and the query size is divided by 3 (for conversion to 
  570.                 a protein sequence) and multiplied by 6 (for 6 frames) */
  571.              if (program_number == blast_type_rpstblastn)
  572.                 effective_search_space *= (Int8)(NUM_FRAMES / CODON_LENGTH);
  573.           }
  574.        }
  575.        query_info->eff_searchsp_array[index] = effective_search_space;
  576.        query_info->length_adjustments[index] = length_adjustment;
  577.    }
  578.    return 0;
  579. }
  580. Int2 
  581. BLAST_GapAlignSetUp(Uint1 program_number,
  582.     const BlastSeqSrc* seq_src,
  583.     const BlastScoringOptions* scoring_options,
  584.     const BlastEffectiveLengthsOptions* eff_len_options,
  585.     const BlastExtensionOptions* ext_options,
  586.     const BlastHitSavingOptions* hit_options,
  587.     BlastQueryInfo* query_info, 
  588.     BlastScoreBlk* sbp, 
  589.     BlastScoringParameters** score_params,
  590.     BlastExtensionParameters** ext_params,
  591.     BlastHitSavingParameters** hit_params,
  592.     BlastEffectiveLengthsParameters** eff_len_params,
  593.     BlastGapAlignStruct** gap_align)
  594. {
  595.    Int2 status = 0;
  596.    Uint4 max_subject_length;
  597.    Int8 total_length;
  598.    Int4 num_seqs;
  599.    total_length = BLASTSeqSrcGetTotLen(seq_src);
  600.    
  601.    if (total_length > 0) {
  602.       num_seqs = BLASTSeqSrcGetNumSeqs(seq_src);
  603.    } else {
  604.       /* Not a database search; each subject sequence is considered
  605.          individually */
  606.       num_seqs = 1;
  607.    }
  608.    /* Initialize the effective length parameters with real values of
  609.       database length and number of sequences */
  610.    BlastEffectiveLengthsParametersNew(eff_len_options, total_length, num_seqs, 
  611.                                       eff_len_params);
  612.    if ((status = BLAST_CalcEffLengths(program_number, scoring_options, 
  613.                     *eff_len_params, sbp, query_info)) != 0)
  614.       return status;
  615.    BlastScoringParametersNew(scoring_options, sbp, score_params);
  616.    BlastExtensionParametersNew(program_number, ext_options, sbp, 
  617.                                query_info, ext_params);
  618.    BlastHitSavingParametersNew(program_number, hit_options, *ext_params, 
  619.                                sbp, query_info, hit_params);
  620.    /* To initialize the gapped alignment structure, we need to know the 
  621.       maximal subject sequence length */
  622.    max_subject_length = BLASTSeqSrcGetMaxSeqLen(seq_src);
  623.    if ((status = BLAST_GapAlignStructNew(*score_params, *ext_params, 
  624.                     max_subject_length, query_info->max_length, sbp, 
  625.                     gap_align)) != 0) {
  626.       return status;
  627.    }
  628.    return status;
  629. }
  630. Int2 BLAST_OneSubjectUpdateParameters(Uint1 program_number,
  631.                     Uint4 subject_length,
  632.                     const BlastScoringOptions* scoring_options,
  633.                     BlastQueryInfo* query_info, 
  634.                     BlastScoreBlk* sbp, 
  635.                     const BlastExtensionParameters* ext_params,
  636.                     BlastHitSavingParameters* hit_params,
  637.                     BlastInitialWordParameters* word_params,
  638.                     BlastEffectiveLengthsParameters* eff_len_params)
  639. {
  640.    Int2 status = 0;
  641.    eff_len_params->real_db_length = subject_length;
  642.    if ((status = BLAST_CalcEffLengths(program_number, scoring_options, 
  643.                                       eff_len_params, sbp, query_info)) != 0)
  644.       return status;
  645.    /* Update cutoff scores in hit saving parameters */
  646.    BlastHitSavingParametersUpdate(program_number, ext_params,
  647.                                   sbp, query_info, 
  648.                                   hit_params);
  649.    
  650.    if (word_params) {
  651.       /* Update cutoff scores in initial word parameters */
  652.       BlastInitialWordParametersUpdate(program_number, hit_params, ext_params,
  653.          sbp, query_info, subject_length, word_params);
  654.    }
  655.    return status;
  656. }