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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_stat.c,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 18:07:50  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.77
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: blast_stat.c,v 1000.6 2004/06/01 18:07:50 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_stat.c
  38.  * Functions to calculate BLAST probabilities etc.
  39.  * Detailed Contents:
  40.  *
  41.  * - allocate and deallocate structures used by BLAST to calculate
  42.  * probabilities etc.
  43.  *
  44.  * - calculate residue frequencies for query and "average" database.
  45.  *
  46.  * - read in matrix or load it from memory.
  47.  *
  48.  *  - calculate sum-p from a collection of HSP's, for both the case
  49.  *   of a "small" gap and a "large" gap, when give a total score and the
  50.  *   number of HSP's.
  51.  *
  52.  * - calculate expect values for p-values.
  53.  *
  54.  * - calculate pseuod-scores from p-values.
  55.  *
  56.  * @todo FIXME needs doxygen comments
  57.  */
  58. static char const rcsid[] = 
  59.     "$Id: blast_stat.c,v 1000.6 2004/06/01 18:07:50 gouriano Exp $";
  60. #include <algo/blast/core/blast_stat.h>
  61. #include <algo/blast/core/blast_util.h>
  62. #include <util/tables/raw_scoremat.h>
  63. #include <algo/blast/core/blast_encoding.h>
  64. #include "blast_psi_priv.h"
  65. /* OSF1 apparently doesn't like this. */
  66. #if defined(HUGE_VAL) && !defined(OS_UNIX_OSF1)
  67. #define BLASTKAR_HUGE_VAL HUGE_VAL
  68. #else
  69. #define BLASTKAR_HUGE_VAL 1.e30
  70. #endif
  71. /* Allocates and Deallocates the two-dimensional matrix. */
  72. static SBLASTMatrixStructure* BlastMatrixAllocate (Int2 alphabet_size);
  73. /* performs sump calculation, used by BlastSumPStd */
  74. static double BlastSumPCalc (int r, double s);
  75. #define COMMENT_CHR '#'
  76. #define TOKSTR " tnr"
  77. #define BLAST_MAX_ALPHABET 40 /* ncbistdaa is only 26, this should be enough */
  78. /*
  79. How many of the first bases are not ambiguous
  80. (it's four, of course).
  81. */
  82. #define NUMBER_NON_AMBIG_BP 4
  83. /* Used in BlastKarlinBlkGappedCalc */
  84. typedef double array_of_8[8];
  85. /* Used to temporarily store matrix values for retrieval. */
  86. typedef struct MatrixInfo {
  87. char* name; /* name of matrix (e.g., BLOSUM90). */
  88. array_of_8  *values; /* The values (below). */
  89. Int4 *prefs; /* Preferences for display. */
  90. Int4 max_number_values; /* number of values (e.g., BLOSUM90_VALUES_MAX). */
  91. } MatrixInfo;
  92. /**************************************************************************************
  93. How the statistical parameters for the matrices are stored:
  94. -----------------------------------------------------------
  95. They parameters are stored in a two-dimensional array double (i.e., 
  96. doubles, which has as it's first dimensions the number of different 
  97. gap existence and extension combinations and as it's second dimension 8.
  98. The eight different columns specify:
  99. 1.) gap existence penalty (INT2_MAX denotes infinite).
  100. 2.) gap extension penalty (INT2_MAX denotes infinite).
  101. 3.) decline to align penalty (INT2_MAX denotes infinite).
  102. 4.) Lambda
  103. 5.) K
  104. 6.) H
  105. 7.) alpha
  106. 8.) beta
  107. (Items 4-8 are explained in:
  108. Altschul SF, Bundschuh R, Olsen R, Hwa T.
  109. The estimation of statistical parameters for local alignment score distributions.
  110. Nucleic Acids Res. 2001 Jan 15;29(2):351-61.).
  111. Take BLOSUM45 (below) as an example.  Currently (5/17/02) there are
  112. 14 different allowed combinations (specified by "#define BLOSUM45_VALUES_MAX 14").
  113. The first row in the array "blosum45_values" has INT2_MAX (i.e., 32767) for gap 
  114. existence, extension, and decline-to-align penalties.  For all practical purposes
  115. this value is large enough to be infinite, so the alignments will be ungapped.
  116. BLAST may also use this value (INT2_MAX) as a signal to skip gapping, so a
  117. different value should not be used if the intent is to have gapless extensions.
  118. The next row is for the gap existence penalty 13 and the extension penalty 3.
  119. The decline-to-align penalty is only supported in a few cases, so it is normally
  120. set to INT2_MAX.
  121. How to add a new matrix to blast_stat.c:
  122. --------------------------------------
  123. To add a new matrix to blast_stat.c it is necessary to complete 
  124. four steps.  As an example consider adding the matrix
  125. called TESTMATRIX
  126. 1.) add a define specifying how many different existence and extensions
  127. penalties are allowed, so it would be necessary to add the line:
  128. #define TESTMATRIX_VALUES_MAX 14
  129. if 14 values were to be allowed.
  130. 2.) add a two-dimensional array to contain the statistical parameters:
  131. static double testmatrix_values[TESTMATRIX_VALUES_MAX][8] ={ ...
  132. 3.) add a "prefs" array that should hint about the "optimal" 
  133. gap existence and extension penalties:
  134. static Int4 testmatrix_prefs[TESTMATRIX_VALUES_MAX] = {
  135. BLAST_MATRIX_NOMINAL,
  136. ...
  137. };
  138. 4.) Go to the function BlastLoadMatrixValues (in this file) and
  139. add two lines before the return at the end of the function: 
  140.         matrix_info = MatrixInfoNew("TESTMATRIX", testmatrix_values, testmatrix_prefs, TESTMATRIX_VALUES_MAX);
  141.         ListNodeAddPointer(&retval, 0, matrix_info);
  142. ***************************************************************************************/
  143. #define BLOSUM45_VALUES_MAX 14
  144. static double  blosum45_values[BLOSUM45_VALUES_MAX][8] = {
  145.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.2291, 0.0924, 0.2514, 0.9113, -5.7},
  146.     {13, 3, (double) INT2_MAX, 0.207, 0.049, 0.14, 1.5, -22},
  147.     {12, 3, (double) INT2_MAX, 0.199, 0.039, 0.11, 1.8, -34},
  148.     {11, 3, (double) INT2_MAX, 0.190, 0.031, 0.095, 2.0, -38},
  149.     {10, 3, (double) INT2_MAX, 0.179, 0.023, 0.075, 2.4, -51},
  150.     {16, 2, (double) INT2_MAX, 0.210, 0.051, 0.14, 1.5, -24},
  151.     {15, 2, (double) INT2_MAX, 0.203, 0.041, 0.12, 1.7, -31},
  152.     {14, 2, (double) INT2_MAX, 0.195, 0.032, 0.10, 1.9, -36},
  153.     {13, 2, (double) INT2_MAX, 0.185, 0.024, 0.084, 2.2, -45},
  154.     {12, 2, (double) INT2_MAX, 0.171, 0.016, 0.061, 2.8, -65},
  155.     {19, 1, (double) INT2_MAX, 0.205, 0.040, 0.11, 1.9, -43},
  156.     {18, 1, (double) INT2_MAX, 0.198, 0.032, 0.10, 2.0, -43},
  157.     {17, 1, (double) INT2_MAX, 0.189, 0.024, 0.079, 2.4, -57},
  158.     {16, 1, (double) INT2_MAX, 0.176, 0.016, 0.063, 2.8, -67},
  159. };
  160. static Int4 blosum45_prefs[BLOSUM45_VALUES_MAX] = {
  161. BLAST_MATRIX_NOMINAL,
  162. BLAST_MATRIX_NOMINAL,
  163. BLAST_MATRIX_NOMINAL,
  164. BLAST_MATRIX_NOMINAL,
  165. BLAST_MATRIX_NOMINAL,
  166. BLAST_MATRIX_NOMINAL,
  167. BLAST_MATRIX_NOMINAL,
  168. BLAST_MATRIX_BEST,
  169. BLAST_MATRIX_NOMINAL,
  170. BLAST_MATRIX_NOMINAL,
  171. BLAST_MATRIX_NOMINAL,
  172. BLAST_MATRIX_NOMINAL,
  173. BLAST_MATRIX_NOMINAL,
  174. BLAST_MATRIX_NOMINAL
  175. };
  176. #define BLOSUM50_VALUES_MAX 16
  177. static double  blosum50_values[BLOSUM50_VALUES_MAX][8] = {
  178.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.2318, 0.112, 0.3362, 0.6895, -4.0},
  179.     {13, 3, (double) INT2_MAX, 0.212, 0.063, 0.19, 1.1, -16},
  180.     {12, 3, (double) INT2_MAX, 0.206, 0.055, 0.17, 1.2, -18},
  181.     {11, 3, (double) INT2_MAX, 0.197, 0.042, 0.14, 1.4, -25},
  182.     {10, 3, (double) INT2_MAX, 0.186, 0.031, 0.11, 1.7, -34},
  183.     {9, 3, (double) INT2_MAX, 0.172, 0.022, 0.082, 2.1, -48},
  184.     {16, 2, (double) INT2_MAX, 0.215, 0.066, 0.20, 1.05, -15},
  185.     {15, 2, (double) INT2_MAX, 0.210, 0.058, 0.17, 1.2, -20},
  186.     {14, 2, (double) INT2_MAX, 0.202, 0.045, 0.14, 1.4, -27},
  187.     {13, 2, (double) INT2_MAX, 0.193, 0.035, 0.12, 1.6, -32},
  188.     {12, 2, (double) INT2_MAX, 0.181, 0.025, 0.095, 1.9, -41},
  189.     {19, 1, (double) INT2_MAX, 0.212, 0.057, 0.18, 1.2, -21},
  190.     {18, 1, (double) INT2_MAX, 0.207, 0.050, 0.15, 1.4, -28},
  191.     {17, 1, (double) INT2_MAX, 0.198, 0.037, 0.12, 1.6, -33},
  192.     {16, 1, (double) INT2_MAX, 0.186, 0.025, 0.10, 1.9, -42},
  193.     {15, 1, (double) INT2_MAX, 0.171, 0.015, 0.063, 2.7, -76},
  194. };
  195. static Int4 blosum50_prefs[BLOSUM50_VALUES_MAX] = {
  196. BLAST_MATRIX_NOMINAL,
  197. BLAST_MATRIX_NOMINAL,
  198. BLAST_MATRIX_NOMINAL,
  199. BLAST_MATRIX_NOMINAL,
  200. BLAST_MATRIX_NOMINAL,
  201. BLAST_MATRIX_NOMINAL,
  202. BLAST_MATRIX_NOMINAL,
  203. BLAST_MATRIX_NOMINAL,
  204. BLAST_MATRIX_NOMINAL,
  205. BLAST_MATRIX_BEST,
  206. BLAST_MATRIX_NOMINAL,
  207. BLAST_MATRIX_NOMINAL,
  208. BLAST_MATRIX_NOMINAL,
  209. BLAST_MATRIX_NOMINAL,
  210. BLAST_MATRIX_NOMINAL,
  211. BLAST_MATRIX_NOMINAL
  212. };
  213. #define BLOSUM62_VALUES_MAX 12
  214. static double  blosum62_values[BLOSUM62_VALUES_MAX][8] = {
  215.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.3176, 0.134, 0.4012, 0.7916, -3.2},
  216.     {11, 2, (double) INT2_MAX, 0.297, 0.082, 0.27, 1.1, -10},
  217.     {10, 2, (double) INT2_MAX, 0.291, 0.075, 0.23, 1.3, -15},
  218.     {9, 2, (double) INT2_MAX, 0.279, 0.058, 0.19, 1.5, -19},
  219.     {8, 2, (double) INT2_MAX, 0.264, 0.045, 0.15, 1.8, -26},
  220.     {7, 2, (double) INT2_MAX, 0.239, 0.027, 0.10, 2.5, -46},
  221.     {6, 2, (double) INT2_MAX, 0.201, 0.012, 0.061, 3.3, -58},
  222.     {13, 1, (double) INT2_MAX, 0.292, 0.071, 0.23, 1.2, -11},
  223.     {12, 1, (double) INT2_MAX, 0.283, 0.059, 0.19, 1.5, -19},
  224.     {11, 1, (double) INT2_MAX, 0.267, 0.041, 0.14, 1.9, -30},
  225.     {10, 1, (double) INT2_MAX, 0.243, 0.024, 0.10, 2.5, -44},
  226.     {9, 1, (double) INT2_MAX, 0.206, 0.010, 0.052, 4.0, -87},
  227. };
  228. static Int4 blosum62_prefs[BLOSUM62_VALUES_MAX] = {
  229.     BLAST_MATRIX_NOMINAL,
  230.     BLAST_MATRIX_NOMINAL,
  231.     BLAST_MATRIX_NOMINAL,
  232.     BLAST_MATRIX_NOMINAL,
  233.     BLAST_MATRIX_NOMINAL,
  234.     BLAST_MATRIX_NOMINAL,
  235.     BLAST_MATRIX_NOMINAL,
  236.     BLAST_MATRIX_NOMINAL,
  237.     BLAST_MATRIX_NOMINAL,
  238.     BLAST_MATRIX_BEST,
  239.     BLAST_MATRIX_NOMINAL,
  240.     BLAST_MATRIX_NOMINAL,
  241. };
  242. #define BLOSUM80_VALUES_MAX 10
  243. static double  blosum80_values[BLOSUM80_VALUES_MAX][8] = {
  244.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.3430, 0.177, 0.6568, 0.5222, -1.6},
  245.     {25, 2, (double) INT2_MAX, 0.342, 0.17, 0.66, 0.52, -1.6},
  246.     {13, 2, (double) INT2_MAX, 0.336, 0.15, 0.57, 0.59, -3},
  247.     {9, 2, (double) INT2_MAX, 0.319, 0.11, 0.42, 0.76, -6},
  248.     {8, 2, (double) INT2_MAX, 0.308, 0.090, 0.35, 0.89, -9},
  249.     {7, 2, (double) INT2_MAX, 0.293, 0.070, 0.27, 1.1, -14},
  250.     {6, 2, (double) INT2_MAX, 0.268, 0.045, 0.19, 1.4, -19},
  251.     {11, 1, (double) INT2_MAX, 0.314, 0.095, 0.35, 0.90, -9},
  252.     {10, 1, (double) INT2_MAX, 0.299, 0.071, 0.27, 1.1, -14},
  253.     {9, 1, (double) INT2_MAX, 0.279, 0.048, 0.20, 1.4, -19},
  254. };
  255. static Int4 blosum80_prefs[BLOSUM80_VALUES_MAX] = {
  256.     BLAST_MATRIX_NOMINAL,
  257.     BLAST_MATRIX_NOMINAL,
  258.     BLAST_MATRIX_NOMINAL,
  259.     BLAST_MATRIX_NOMINAL,
  260.     BLAST_MATRIX_NOMINAL,
  261.     BLAST_MATRIX_NOMINAL,
  262.     BLAST_MATRIX_NOMINAL,
  263.     BLAST_MATRIX_BEST,
  264.     BLAST_MATRIX_NOMINAL
  265. };
  266. #define BLOSUM90_VALUES_MAX 8
  267. static double  blosum90_values[BLOSUM90_VALUES_MAX][8] = {
  268.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.3346, 0.190, 0.7547, 0.4434, -1.4},
  269.     {9, 2, (double) INT2_MAX, 0.310, 0.12, 0.46, 0.67, -6},
  270.     {8, 2, (double) INT2_MAX, 0.300, 0.099, 0.39, 0.76, -7},
  271.     {7, 2, (double) INT2_MAX, 0.283, 0.072, 0.30, 0.93, -11},
  272.     {6, 2, (double) INT2_MAX, 0.259, 0.048, 0.22, 1.2, -16},
  273.     {11, 1, (double) INT2_MAX, 0.302, 0.093, 0.39, 0.78, -8},
  274.     {10, 1, (double) INT2_MAX, 0.290, 0.075, 0.28, 1.04, -15},
  275.     {9, 1, (double) INT2_MAX, 0.265, 0.044, 0.20, 1.3, -19},
  276. };
  277. static Int4 blosum90_prefs[BLOSUM90_VALUES_MAX] = {
  278. BLAST_MATRIX_NOMINAL,
  279. BLAST_MATRIX_NOMINAL,
  280. BLAST_MATRIX_NOMINAL,
  281. BLAST_MATRIX_NOMINAL,
  282. BLAST_MATRIX_NOMINAL,
  283. BLAST_MATRIX_NOMINAL,
  284. BLAST_MATRIX_BEST,
  285. BLAST_MATRIX_NOMINAL
  286. };
  287. #define PAM250_VALUES_MAX 16
  288. static double  pam250_values[PAM250_VALUES_MAX][8] = {
  289.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.2252, 0.0868, 0.2223, 0.98, -5.0},
  290.     {15, 3, (double) INT2_MAX, 0.205, 0.049, 0.13, 1.6, -23},
  291.     {14, 3, (double) INT2_MAX, 0.200, 0.043, 0.12, 1.7, -26},
  292.     {13, 3, (double) INT2_MAX, 0.194, 0.036, 0.10, 1.9, -31},
  293.     {12, 3, (double) INT2_MAX, 0.186, 0.029, 0.085, 2.2, -41},
  294.     {11, 3, (double) INT2_MAX, 0.174, 0.020, 0.070, 2.5, -48},
  295.     {17, 2, (double) INT2_MAX, 0.204, 0.047, 0.12, 1.7, -28},
  296.     {16, 2, (double) INT2_MAX, 0.198, 0.038, 0.11, 1.8, -29},
  297.     {15, 2, (double) INT2_MAX, 0.191, 0.031, 0.087, 2.2, -44},
  298.     {14, 2, (double) INT2_MAX, 0.182, 0.024, 0.073, 2.5, -53},
  299.     {13, 2, (double) INT2_MAX, 0.171, 0.017, 0.059, 2.9, -64},
  300.     {21, 1, (double) INT2_MAX, 0.205, 0.045, 0.11, 1.8, -34},
  301.     {20, 1, (double) INT2_MAX, 0.199, 0.037, 0.10, 1.9, -35},
  302.     {19, 1, (double) INT2_MAX, 0.192, 0.029, 0.083, 2.3, -52},
  303.     {18, 1, (double) INT2_MAX, 0.183, 0.021, 0.070, 2.6, -60},
  304.     {17, 1, (double) INT2_MAX, 0.171, 0.014, 0.052, 3.3, -86},
  305. };
  306. static Int4 pam250_prefs[PAM250_VALUES_MAX] = {
  307. BLAST_MATRIX_NOMINAL,
  308. BLAST_MATRIX_NOMINAL,
  309. BLAST_MATRIX_NOMINAL,
  310. BLAST_MATRIX_NOMINAL,
  311. BLAST_MATRIX_NOMINAL,
  312. BLAST_MATRIX_NOMINAL,
  313. BLAST_MATRIX_NOMINAL,
  314. BLAST_MATRIX_NOMINAL,
  315. BLAST_MATRIX_BEST,
  316. BLAST_MATRIX_NOMINAL,
  317. BLAST_MATRIX_NOMINAL,
  318. BLAST_MATRIX_NOMINAL,
  319. BLAST_MATRIX_NOMINAL,
  320. BLAST_MATRIX_NOMINAL,
  321. BLAST_MATRIX_NOMINAL,
  322. BLAST_MATRIX_NOMINAL
  323. };
  324. #define PAM30_VALUES_MAX 7
  325. static double  pam30_values[PAM30_VALUES_MAX][8] = {
  326.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.3400, 0.283, 1.754, 0.1938, -0.3},
  327.     {7, 2, (double) INT2_MAX, 0.305, 0.15, 0.87, 0.35, -3},
  328.     {6, 2, (double) INT2_MAX, 0.287, 0.11, 0.68, 0.42, -4},
  329.     {5, 2, (double) INT2_MAX, 0.264, 0.079, 0.45, 0.59, -7},
  330.     {10, 1, (double) INT2_MAX, 0.309, 0.15, 0.88, 0.35, -3},
  331.     {9, 1, (double) INT2_MAX, 0.294, 0.11, 0.61, 0.48, -6},
  332.     {8, 1, (double) INT2_MAX, 0.270, 0.072, 0.40, 0.68, -10},
  333. };
  334. static Int4 pam30_prefs[PAM30_VALUES_MAX] = {
  335. BLAST_MATRIX_NOMINAL,
  336. BLAST_MATRIX_NOMINAL,
  337. BLAST_MATRIX_NOMINAL,
  338. BLAST_MATRIX_NOMINAL,
  339. BLAST_MATRIX_NOMINAL,
  340. BLAST_MATRIX_BEST,
  341. BLAST_MATRIX_NOMINAL,
  342. };
  343. #define PAM70_VALUES_MAX 7
  344. static double  pam70_values[PAM70_VALUES_MAX][8] = {
  345.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.3345, 0.229, 1.029, 0.3250,   -0.7},
  346.     {8, 2, (double) INT2_MAX, 0.301, 0.12, 0.54, 0.56, -5},
  347.     {7, 2, (double) INT2_MAX, 0.286, 0.093, 0.43, 0.67, -7},
  348.     {6, 2, (double) INT2_MAX, 0.264, 0.064, 0.29, 0.90, -12},
  349.     {11, 1, (double) INT2_MAX, 0.305, 0.12, 0.52, 0.59, -6},
  350.     {10, 1, (double) INT2_MAX, 0.291, 0.091, 0.41, 0.71, -9},
  351.     {9, 1, (double) INT2_MAX, 0.270, 0.060, 0.28, 0.97, -14},
  352. };
  353. static Int4 pam70_prefs[PAM70_VALUES_MAX] = {
  354. BLAST_MATRIX_NOMINAL,
  355. BLAST_MATRIX_NOMINAL,
  356. BLAST_MATRIX_NOMINAL,
  357. BLAST_MATRIX_NOMINAL,
  358. BLAST_MATRIX_NOMINAL,
  359. BLAST_MATRIX_BEST,
  360. BLAST_MATRIX_NOMINAL
  361. };
  362. #define BLOSUM62_20_VALUES_MAX 65
  363. static double  blosum62_20_values[BLOSUM62_20_VALUES_MAX][8] = {
  364.     {(double) INT2_MAX, (double) INT2_MAX, (double) INT2_MAX, 0.03391, 0.125, 0.4544, 0.07462, -3.2},
  365.     {100, 12, (double) INT2_MAX, 0.0300, 0.056, 0.21, 0.14, -15},
  366.     {95, 12, (double) INT2_MAX, 0.0291, 0.047, 0.18, 0.16, -20},
  367.     {90, 12, (double) INT2_MAX, 0.0280, 0.038, 0.15, 0.19, -28},
  368.     {85, 12, (double) INT2_MAX, 0.0267, 0.030, 0.13, 0.21, -31},
  369.     {80, 12, (double) INT2_MAX, 0.0250, 0.021, 0.10, 0.25, -39},
  370.     {105, 11, (double) INT2_MAX, 0.0301, 0.056, 0.22, 0.14, -16},
  371.     {100, 11, (double) INT2_MAX, 0.0294, 0.049, 0.20, 0.15, -17},
  372.     {95, 11, (double) INT2_MAX, 0.0285, 0.042, 0.16, 0.18, -25},
  373.     {90, 11, (double) INT2_MAX, 0.0271, 0.031, 0.14, 0.20, -28},
  374.     {85, 11, (double) INT2_MAX, 0.0256, 0.023, 0.10, 0.26, -46},
  375.     {115, 10, (double) INT2_MAX, 0.0308, 0.062, 0.22, 0.14, -20},
  376.     {110, 10, (double) INT2_MAX, 0.0302, 0.056, 0.19, 0.16, -26},
  377.     {105, 10, (double) INT2_MAX, 0.0296, 0.050, 0.17, 0.17, -27},
  378.     {100, 10, (double) INT2_MAX, 0.0286, 0.041, 0.15, 0.19, -32},
  379.     {95, 10, (double) INT2_MAX, 0.0272, 0.030, 0.13, 0.21, -35},
  380.     {90, 10, (double) INT2_MAX, 0.0257, 0.022, 0.11, 0.24, -40},
  381.     {85, 10, (double) INT2_MAX, 0.0242, 0.017, 0.083, 0.29, -51},
  382.     {115, 9, (double) INT2_MAX, 0.0306, 0.061, 0.24, 0.13, -14},
  383.     {110, 9, (double) INT2_MAX, 0.0299, 0.053, 0.19, 0.16, -23},
  384.     {105, 9, (double) INT2_MAX, 0.0289, 0.043, 0.17, 0.17, -23},
  385.     {100, 9, (double) INT2_MAX, 0.0279, 0.036, 0.14, 0.20, -31},
  386.     {95, 9, (double) INT2_MAX, 0.0266, 0.028, 0.12, 0.23, -37},
  387.     {120, 8, (double) INT2_MAX, 0.0307, 0.062, 0.22, 0.14, -18},
  388.     {115, 8, (double) INT2_MAX, 0.0300, 0.053, 0.20, 0.15, -19},
  389.     {110, 8, (double) INT2_MAX, 0.0292, 0.046, 0.17, 0.17, -23},
  390.     {105, 8, (double) INT2_MAX, 0.0280, 0.035, 0.14, 0.20, -31},
  391.     {100, 8, (double) INT2_MAX, 0.0266, 0.026, 0.12, 0.23, -37},
  392.     {125, 7, (double) INT2_MAX, 0.0306, 0.058, 0.22, 0.14, -18},
  393.     {120, 7, (double) INT2_MAX, 0.0300, 0.052, 0.19, 0.16, -23},
  394.     {115, 7, (double) INT2_MAX, 0.0292, 0.044, 0.17, 0.17, -24},
  395.     {110, 7, (double) INT2_MAX, 0.0279, 0.032, 0.14, 0.20, -31},
  396.     {105, 7, (double) INT2_MAX, 0.0267, 0.026, 0.11, 0.24, -41},
  397.     {120,10,5, 0.0298, 0.049, 0.19, 0.16, -21},
  398.     {115,10,5, 0.0290, 0.042, 0.16, 0.18, -25},
  399.     {110,10,5, 0.0279, 0.033, 0.13, 0.21, -32},
  400.     {105,10,5, 0.0264, 0.024, 0.10, 0.26, -46},
  401.     {100,10,5, 0.0250, 0.018, 0.081, 0.31, -56},
  402.     {125,10,4, 0.0301, 0.053, 0.18, 0.17, -25},
  403.     {120,10,4, 0.0292, 0.043, 0.15, 0.20, -33},
  404.     {115,10,4, 0.0282, 0.035, 0.13, 0.22, -36},
  405.     {110,10,4, 0.0270, 0.027, 0.11, 0.25, -41},
  406.     {105,10,4, 0.0254, 0.020, 0.079, 0.32, -60},
  407.     {130,10,3, 0.0300, 0.051, 0.17, 0.18, -27},
  408.     {125,10,3, 0.0290, 0.040, 0.13, 0.22, -38},
  409.     {120,10,3, 0.0278, 0.030, 0.11, 0.25, -44},
  410.     {115,10,3, 0.0267, 0.025, 0.092, 0.29, -52},
  411.     {110,10,3, 0.0252, 0.018, 0.070, 0.36, -70},
  412.     {135,10,2, 0.0292, 0.040, 0.13, 0.22, -35},
  413.     {130,10,2, 0.0283, 0.034, 0.10, 0.28, -51},
  414.     {125,10,2, 0.0269, 0.024, 0.077, 0.35, -71},
  415.     {120,10,2, 0.0253, 0.017, 0.059, 0.43, -90},
  416.     {115,10,2, 0.0234, 0.011, 0.043, 0.55, -121},
  417.     {100,14,3, 0.0258, 0.023, 0.087, 0.33, -59},
  418.     {105,13,3, 0.0263, 0.024, 0.085, 0.31, -57},
  419.     {110,12,3, 0.0271, 0.028, 0.093, 0.29, -54},
  420.     {115,11,3, 0.0275, 0.030, 0.10, 0.27, -49},
  421.     {125,9,3, 0.0283, 0.034, 0.12, 0.23, -38},
  422.     {130,8,3, 0.0287, 0.037, 0.12, 0.23, -40},
  423.     {125,7,3, 0.0287, 0.036, 0.12, 0.24, -44},
  424.     {140,6,3, 0.0285, 0.033, 0.12, 0.23, -40},
  425.     {105,14,3, 0.0270, 0.028, 0.10, 0.27, -46},
  426.     {110,13,3, 0.0279, 0.034, 0.10, 0.27, -50},
  427.     {115,12,3, 0.0282, 0.035, 0.12, 0.24, -42},
  428.     {120,11,3, 0.0286, 0.037, 0.12, 0.24, -44},
  429. };
  430. static Int4 blosum62_20_prefs[BLOSUM62_20_VALUES_MAX] = {
  431. BLAST_MATRIX_NOMINAL,
  432. BLAST_MATRIX_NOMINAL,
  433. BLAST_MATRIX_NOMINAL,
  434. BLAST_MATRIX_NOMINAL,
  435. BLAST_MATRIX_NOMINAL,
  436. BLAST_MATRIX_NOMINAL,
  437. BLAST_MATRIX_NOMINAL,
  438. BLAST_MATRIX_NOMINAL,
  439. BLAST_MATRIX_NOMINAL,
  440. BLAST_MATRIX_NOMINAL,
  441. BLAST_MATRIX_NOMINAL,
  442. BLAST_MATRIX_NOMINAL,
  443. BLAST_MATRIX_NOMINAL,
  444. BLAST_MATRIX_NOMINAL,
  445. BLAST_MATRIX_NOMINAL,
  446. BLAST_MATRIX_NOMINAL,
  447. BLAST_MATRIX_NOMINAL,
  448. BLAST_MATRIX_NOMINAL,
  449. BLAST_MATRIX_NOMINAL,
  450. BLAST_MATRIX_NOMINAL,
  451. BLAST_MATRIX_NOMINAL,
  452. BLAST_MATRIX_NOMINAL,
  453. BLAST_MATRIX_NOMINAL,
  454. BLAST_MATRIX_NOMINAL,
  455. BLAST_MATRIX_NOMINAL,
  456. BLAST_MATRIX_NOMINAL,
  457. BLAST_MATRIX_NOMINAL,
  458. BLAST_MATRIX_NOMINAL,
  459. BLAST_MATRIX_NOMINAL,
  460. BLAST_MATRIX_NOMINAL,
  461. BLAST_MATRIX_NOMINAL,
  462. BLAST_MATRIX_NOMINAL,
  463. BLAST_MATRIX_NOMINAL,
  464. BLAST_MATRIX_NOMINAL,
  465. BLAST_MATRIX_NOMINAL,
  466. BLAST_MATRIX_NOMINAL,
  467. BLAST_MATRIX_NOMINAL,
  468. BLAST_MATRIX_NOMINAL,
  469. BLAST_MATRIX_NOMINAL,
  470. BLAST_MATRIX_NOMINAL,
  471. BLAST_MATRIX_NOMINAL,
  472. BLAST_MATRIX_NOMINAL,
  473. BLAST_MATRIX_NOMINAL,
  474. BLAST_MATRIX_NOMINAL,
  475. BLAST_MATRIX_NOMINAL,
  476. BLAST_MATRIX_BEST,
  477. BLAST_MATRIX_NOMINAL,
  478. BLAST_MATRIX_NOMINAL,
  479. BLAST_MATRIX_NOMINAL,
  480. BLAST_MATRIX_NOMINAL,
  481. BLAST_MATRIX_NOMINAL,
  482. BLAST_MATRIX_NOMINAL,
  483. BLAST_MATRIX_NOMINAL,
  484. BLAST_MATRIX_NOMINAL,
  485. BLAST_MATRIX_NOMINAL,
  486. BLAST_MATRIX_NOMINAL,
  487. BLAST_MATRIX_NOMINAL,
  488. BLAST_MATRIX_NOMINAL,
  489. BLAST_MATRIX_NOMINAL,
  490. BLAST_MATRIX_NOMINAL,
  491. BLAST_MATRIX_NOMINAL,
  492. BLAST_MATRIX_NOMINAL,
  493. BLAST_MATRIX_NOMINAL,
  494. BLAST_MATRIX_NOMINAL,
  495. BLAST_MATRIX_NOMINAL
  496. };
  497. /*
  498. Allocates memory for the BlastScoreBlk*.
  499. */
  500. BlastScoreBlk*
  501. BlastScoreBlkNew(Uint1 alphabet, Int4 number_of_contexts)
  502. {
  503. BlastScoreBlk* sbp;
  504. sbp = (BlastScoreBlk*) calloc(1, sizeof(BlastScoreBlk));
  505. if (sbp != NULL)
  506. {
  507. sbp->alphabet_code = alphabet;
  508. if (alphabet != BLASTNA_SEQ_CODE)
  509. sbp->alphabet_size = BLASTAA_SIZE;
  510. else
  511. sbp->alphabet_size = BLASTNA_SIZE;
  512. /* set the alphabet type (protein or not). */
  513. switch (alphabet) {
  514. case BLASTAA_SEQ_CODE:
  515. sbp->protein_alphabet = TRUE;
  516. break;
  517. case BLASTNA_SEQ_CODE:
  518. sbp->protein_alphabet = FALSE;
  519. break;
  520. default:
  521. break;
  522. }
  523. sbp->matrix_struct = BlastMatrixAllocate(sbp->alphabet_size);
  524. if (sbp->matrix_struct == NULL)
  525. {
  526. sbp = BlastScoreBlkFree(sbp);
  527. return sbp;
  528. }
  529. sbp->matrix = sbp->matrix_struct->matrix;
  530. sbp->maxscore = (Int4 *) calloc(BLAST_MATRIX_SIZE, sizeof(Int4));
  531.         sbp->scale_factor = 1.0;
  532. sbp->number_of_contexts = number_of_contexts;
  533. sbp->sfp = (Blast_ScoreFreq**) 
  534.          calloc(sbp->number_of_contexts, sizeof(Blast_ScoreFreq*));
  535. sbp->kbp_std = (Blast_KarlinBlk**)
  536.          calloc(sbp->number_of_contexts, sizeof(Blast_KarlinBlk*));
  537. sbp->kbp_gap_std = (Blast_KarlinBlk**)
  538.          calloc(sbp->number_of_contexts, sizeof(Blast_KarlinBlk*));
  539. sbp->kbp_psi = (Blast_KarlinBlk**)
  540.          calloc(sbp->number_of_contexts, sizeof(Blast_KarlinBlk*));
  541. sbp->kbp_gap_psi = (Blast_KarlinBlk**)
  542.          calloc(sbp->number_of_contexts, sizeof(Blast_KarlinBlk*));
  543. }
  544. return sbp;
  545. }
  546. Blast_ScoreFreq*
  547. Blast_ScoreFreqDestruct(Blast_ScoreFreq* sfp)
  548. {
  549. if (sfp == NULL)
  550. return NULL;
  551. if (sfp->sprob0 != NULL)
  552. sfree(sfp->sprob0);
  553. sfree(sfp);
  554. return sfp;
  555. }
  556. /*
  557. Deallocates the Karlin Block.
  558. */
  559. Blast_KarlinBlk*
  560. Blast_KarlinBlkDestruct(Blast_KarlinBlk* kbp)
  561. {
  562. sfree(kbp);
  563. return kbp;
  564. }
  565. static SBLASTMatrixStructure*
  566. BlastMatrixDestruct(SBLASTMatrixStructure* matrix_struct)
  567. {
  568. if (matrix_struct == NULL)
  569. return NULL;
  570. sfree(matrix_struct);
  571. return matrix_struct;
  572. }
  573. BlastScoreBlk*
  574. BlastScoreBlkFree(BlastScoreBlk* sbp)
  575. {
  576.     Int4 index, rows;
  577.     if (sbp == NULL)
  578.         return NULL;
  579.     
  580.     for (index=0; index<sbp->number_of_contexts; index++) {
  581.         if (sbp->sfp)
  582.             sbp->sfp[index] = Blast_ScoreFreqDestruct(sbp->sfp[index]);
  583.         if (sbp->kbp_std)
  584.             sbp->kbp_std[index] = Blast_KarlinBlkDestruct(sbp->kbp_std[index]);
  585.         if (sbp->kbp_gap_std)
  586.             sbp->kbp_gap_std[index] = Blast_KarlinBlkDestruct(sbp->kbp_gap_std[index]);
  587.         if (sbp->kbp_psi)
  588.             sbp->kbp_psi[index] = Blast_KarlinBlkDestruct(sbp->kbp_psi[index]);
  589.         if (sbp->kbp_gap_psi)
  590.             sbp->kbp_gap_psi[index] = Blast_KarlinBlkDestruct(sbp->kbp_gap_psi[index]);
  591.     }
  592.     if (sbp->kbp_ideal)
  593.         sbp->kbp_ideal = Blast_KarlinBlkDestruct(sbp->kbp_ideal);
  594.     sfree(sbp->sfp);
  595.     sfree(sbp->kbp_std);
  596.     sfree(sbp->kbp_psi);
  597.     sfree(sbp->kbp_gap_std);
  598.     sfree(sbp->kbp_gap_psi);
  599.     sbp->matrix_struct = BlastMatrixDestruct(sbp->matrix_struct);
  600.     sfree(sbp->maxscore);
  601.     sbp->comments = ListNodeFreeData(sbp->comments);
  602.     sfree(sbp->name);
  603.     sfree(sbp->ambiguous_res);
  604.     
  605.     /* Removing posMatrix and posFreqs if any */
  606.     rows = sbp->query_length + 1;
  607.     if(sbp->posMatrix != NULL) {
  608.         for (index=0; index < rows; index++) {
  609.             sfree(sbp->posMatrix[index]);
  610.         }
  611.         sfree(sbp->posMatrix);
  612.     }
  613.     
  614.     if(sbp->posFreqs != NULL) {
  615.         for (index = 0; index < rows; index++) {
  616.             sfree(sbp->posFreqs[index]);
  617.         }
  618.         sfree(sbp->posFreqs);
  619.     }
  620.     
  621.     sfree(sbp);
  622.     
  623.     return NULL;
  624. }
  625. /* 
  626. Set the ambiguous residue (e.g, 'N', 'X') in the BlastScoreBlk*.
  627. Convert from ncbieaa to sbp->alphabet_code (i.e., ncbistdaa) first.
  628. */
  629. Int2
  630. BLAST_ScoreSetAmbigRes(BlastScoreBlk* sbp, char ambiguous_res)
  631. {
  632. Int2 index;
  633. Uint1* ambig_buffer;
  634. if (sbp == NULL)
  635. return 1;
  636. if (sbp->ambig_occupy >= sbp->ambig_size)
  637. {
  638. sbp->ambig_size += 5;
  639. ambig_buffer = (Uint1 *) calloc(sbp->ambig_size, sizeof(Uint1));
  640. for (index=0; index<sbp->ambig_occupy; index++)
  641. {
  642. ambig_buffer[index] = sbp->ambiguous_res[index];
  643. }
  644. sfree(sbp->ambiguous_res);
  645. sbp->ambiguous_res = ambig_buffer;
  646. }
  647. if (sbp->alphabet_code == BLASTAA_SEQ_CODE)
  648. {
  649. sbp->ambiguous_res[sbp->ambig_occupy] = 
  650.          AMINOACID_TO_NCBISTDAA[toupper(ambiguous_res)];
  651. }
  652. else {
  653.       if (sbp->alphabet_code == BLASTNA_SEQ_CODE)
  654.          sbp->ambiguous_res[sbp->ambig_occupy] = 
  655.             IUPACNA_TO_BLASTNA[toupper(ambiguous_res)];
  656.       else if (sbp->alphabet_code == NCBI4NA_SEQ_CODE)
  657.          sbp->ambiguous_res[sbp->ambig_occupy] = 
  658.             IUPACNA_TO_NCBI4NA[toupper(ambiguous_res)];
  659.    }
  660. (sbp->ambig_occupy)++;
  661. return 0;
  662. }
  663. /* 
  664. Fill in the matrix for blastn using the penaly and rewards
  665. The query sequence alphabet is blastna, the subject sequence
  666. is ncbi2na.  The alphabet blastna is defined in blastkar.h
  667. and the first four elements of blastna are identical to ncbi2na.
  668. The query is in the first index, the subject is the second.
  669.         if matrix==NULL, it is allocated and returned.
  670. */
  671. static Int4 **BlastScoreBlkMatCreateEx(Int4 **matrix,Int4 penalty, 
  672.                                        Int4 reward)
  673. {
  674. Int2 index1, index2, degen;
  675. Int2 degeneracy[BLASTNA_SIZE+1];
  676.         if(!matrix) {
  677.             SBLASTMatrixStructure* matrix_struct;
  678.             matrix_struct =BlastMatrixAllocate((Int2) BLASTNA_SIZE);
  679.             matrix = matrix_struct->matrix;
  680.         }
  681. for (index1 = 0; index1<BLASTNA_SIZE; index1++) /* blastna */
  682. for (index2 = 0; index2<BLASTNA_SIZE; index2++) /* blastna */
  683. matrix[index1][index2] = 0;
  684. /* In blastna the 1st four bases are A, C, G, and T, exactly as it is ncbi2na. */
  685. /* ncbi4na gives them the value 1, 2, 4, and 8.  */
  686. /* Set the first four bases to degen. one */
  687. for (index1=0; index1<NUMBER_NON_AMBIG_BP; index1++)
  688. degeneracy[index1] = 1;
  689. for (index1=NUMBER_NON_AMBIG_BP; index1<BLASTNA_SIZE; index1++) /* blastna */
  690. {
  691. degen=0;
  692. for (index2=0; index2<NUMBER_NON_AMBIG_BP; index2++) /* ncbi2na */
  693. {
  694. if (BLASTNA_TO_NCBI4NA[index1] & BLASTNA_TO_NCBI4NA[index2])
  695. degen++;
  696. }
  697. degeneracy[index1] = degen;
  698. }
  699. for (index1=0; index1<BLASTNA_SIZE; index1++) /* blastna */
  700. {
  701. for (index2=index1; index2<BLASTNA_SIZE; index2++) /* blastna */
  702. {
  703. if (BLASTNA_TO_NCBI4NA[index1] & BLASTNA_TO_NCBI4NA[index2])
  704. { /* round up for positive scores, down for negatives. */
  705. matrix[index1][index2] = BLAST_Nint( (double) ((degeneracy[index2]-1)*penalty + reward))/degeneracy[index2];
  706. if (index1 != index2)
  707. {
  708.       matrix[index2][index1] = matrix[index1][index2];
  709. }
  710. }
  711. else
  712. {
  713. matrix[index1][index2] = penalty;
  714. matrix[index2][index1] = penalty;
  715. }
  716. }
  717. }
  718.         /* The value of 15 is a gap, which is a sentinel between strands in 
  719.            the ungapped extension algorithm */
  720. for (index1=0; index1<BLASTNA_SIZE; index1++) /* blastna */
  721.            matrix[BLASTNA_SIZE-1][index1] = INT4_MIN / 2;
  722. for (index1=0; index1<BLASTNA_SIZE; index1++) /* blastna */
  723.            matrix[index1][BLASTNA_SIZE-1] = INT4_MIN / 2;
  724. return matrix;
  725. }
  726. /* 
  727. Fill in the matrix for blastn using the penaly and rewards on
  728. the BlastScoreBlk*.
  729. The query sequence alphabet is blastna, the subject sequence
  730. is ncbi2na.  The alphabet blastna is defined in blastkar.h
  731. and the first four elements of blastna are identical to ncbi2na.
  732. The query is in the first index, the subject is the second.
  733. */
  734. static Int2 BlastScoreBlkMatCreate(BlastScoreBlk* sbp)
  735. {
  736.    sbp->matrix = BlastScoreBlkMatCreateEx(sbp->matrix,sbp->penalty, sbp->reward);
  737. sbp->mat_dim1 = BLASTNA_SIZE;
  738. sbp->mat_dim2 = BLASTNA_SIZE;
  739. return 0;
  740. }
  741. /* 
  742. Read in the matrix from the FILE *fp.
  743. This function ASSUMES that the matrices are in the ncbistdaa
  744. format.  BLAST should be able to use any alphabet, though it
  745. is expected that ncbistdaa will be used.
  746. */
  747. static Int2
  748. BlastScoreBlkMatRead(BlastScoreBlk* sbp, FILE *fp)
  749. {
  750.     char buf[512+3];
  751.     char temp[512];
  752.     char* cp,* lp;
  753.     char ch;
  754.     Int4 ** matrix;
  755.     Int4 * m;
  756.     Int4 score;
  757.     Uint4 a1cnt = 0, a2cnt = 0;
  758.     char    a1chars[BLAST_MAX_ALPHABET], a2chars[BLAST_MAX_ALPHABET];
  759.     long lineno = 0;
  760.     double xscore;
  761.     register int index1, index2;
  762.     Int2 status;
  763.     
  764.     matrix = sbp->matrix;
  765.     
  766.     if (sbp->alphabet_code != BLASTNA_SEQ_CODE) {
  767.         for (index1 = 0; index1 < sbp->alphabet_size; index1++)
  768.             for (index2 = 0; index2 < sbp->alphabet_size; index2++)
  769.                 matrix[index1][index2] = BLAST_SCORE_MIN;
  770.     } else {
  771.         /* Fill-in all the defaults ambiguity and normal codes */
  772.         status=BlastScoreBlkMatCreate(sbp); 
  773.         if(status != 0)
  774. {
  775.          return status;
  776. }
  777.     }
  778.     
  779.     /* Read the residue names for the second alphabet */
  780.     while (fgets(buf, sizeof(buf), fp) != NULL) {
  781.         ++lineno;
  782.         if (strchr(buf, 'n') == NULL) {
  783.             return 2;
  784.         }
  785.         if (buf[0] == COMMENT_CHR) {
  786.             /* save the comment line in a linked list */
  787.             *strchr(buf, 'n') = NULLB;
  788.             ListNodeCopyStr(&sbp->comments, 0, buf+1);
  789.             continue;
  790.         }
  791.         if ((cp = strchr(buf, COMMENT_CHR)) != NULL)
  792.             *cp = NULLB;
  793.         lp = (char*)strtok(buf, TOKSTR);
  794.         if (lp == NULL) /* skip blank lines */
  795.             continue;
  796.         while (lp != NULL) {
  797.            if (sbp->alphabet_code == BLASTAA_SEQ_CODE)
  798.               ch = AMINOACID_TO_NCBISTDAA[toupper(*lp)];
  799.            else if (sbp->alphabet_code == BLASTNA_SEQ_CODE) {
  800.               ch = IUPACNA_TO_BLASTNA[toupper(*lp)];
  801.            } else {
  802.               ch = *lp;
  803.            }
  804.             a2chars[a2cnt++] = ch;
  805.             lp = (char*)strtok(NULL, TOKSTR);
  806.         }
  807.         
  808.         break; /* Exit loop after reading one line. */
  809.     }
  810.     
  811.     if (a2cnt <= 1) { 
  812.         return 2;
  813.     }
  814.     if (sbp->alphabet_code != BLASTNA_SEQ_CODE) {
  815.         sbp->mat_dim2 = a2cnt;
  816.     }
  817.     while (fgets(buf, sizeof(buf), fp) != NULL)  {
  818.         ++lineno;
  819.         if ((cp = strchr(buf, 'n')) == NULL) {
  820.             return 2;
  821.         }
  822.         if ((cp = strchr(buf, COMMENT_CHR)) != NULL)
  823.             *cp = NULLB;
  824.         if ((lp = (char*)strtok(buf, TOKSTR)) == NULL)
  825.             continue;
  826.         ch = *lp;
  827.         cp = (char*) lp;
  828.         if ((cp = strtok(NULL, TOKSTR)) == NULL) {
  829.             return 2;
  830.         }
  831.         if (a1cnt >= DIM(a1chars)) {
  832.             return 2;
  833.         }
  834.         if (sbp->alphabet_code == BLASTAA_SEQ_CODE) {
  835.            ch = AMINOACID_TO_NCBISTDAA[toupper(ch)];
  836.         } else {
  837.             if (sbp->alphabet_code == BLASTNA_SEQ_CODE) {
  838.                 ch = IUPACNA_TO_BLASTNA[toupper(ch)];
  839.             }
  840.         }
  841.         a1chars[a1cnt++] = ch;
  842.         m = &matrix[(int)ch][0];
  843.         index2 = 0;
  844.         while (cp != NULL) {
  845.             if (index2 >= (int) a2cnt) {
  846.                 return 2;
  847.             }
  848.             strcpy(temp, cp);
  849.             
  850.             if (strcasecmp(temp, "na") == 0)  {
  851.                 score = BLAST_SCORE_1MIN;
  852.             } else  {
  853.                 if (sscanf(temp, "%lg", &xscore) != 1) {
  854.                     return 2;
  855.                 }
  856. /*xscore = MAX(xscore, BLAST_SCORE_1MIN);*/
  857.                 if (xscore > BLAST_SCORE_1MAX || xscore < BLAST_SCORE_1MIN) {
  858.                     return 2;
  859.                 }
  860.                 xscore += (xscore >= 0. ? 0.5 : -0.5);
  861.                 score = (Int4)xscore;
  862.             }
  863.             
  864.             m[(int)a2chars[index2++]] = score;
  865.             
  866.             cp = strtok(NULL, TOKSTR);
  867.         }
  868.     }
  869.     
  870.     if (a1cnt <= 1) {
  871.         return 2;
  872.     }
  873.     
  874.     if (sbp->alphabet_code != BLASTNA_SEQ_CODE) {
  875.         sbp->mat_dim1 = a1cnt;
  876.     }
  877.     
  878.     return 0;
  879. }
  880. static Int2
  881. BlastScoreBlkMaxScoreSet(BlastScoreBlk* sbp)
  882. {
  883. Int4 score, maxscore;
  884. Int4 ** matrix; 
  885. Int2 index1, index2;
  886. sbp->loscore = BLAST_SCORE_1MAX;
  887.         sbp->hiscore = BLAST_SCORE_1MIN;
  888. matrix = sbp->matrix;
  889. for (index1=0; index1<sbp->alphabet_size; index1++)
  890. {
  891. maxscore=BLAST_SCORE_MIN;
  892. for (index2=0; index2<sbp->alphabet_size; index2++)
  893. {
  894. score = matrix[index1][index2];
  895. if (score <= BLAST_SCORE_MIN || score >= BLAST_SCORE_MAX)
  896. continue;
  897. if (score > maxscore)
  898. {
  899. maxscore = score;
  900. }
  901. if (sbp->loscore > score)
  902. sbp->loscore = score;
  903. if (sbp->hiscore < score)
  904. sbp->hiscore = score;
  905. }
  906. sbp->maxscore[index1] = maxscore;
  907. }
  908. /* If the lo/hi-scores are BLAST_SCORE_MIN/BLAST_SCORE_MAX, (i.e., for
  909. gaps), then use other scores. */
  910. if (sbp->loscore < BLAST_SCORE_1MIN)
  911. sbp->loscore = BLAST_SCORE_1MIN;
  912. if (sbp->hiscore > BLAST_SCORE_1MAX)
  913. sbp->hiscore = BLAST_SCORE_1MAX;
  914. return 0;
  915. }
  916. Int2
  917. BlastScoreBlkMatrixLoad(BlastScoreBlk* sbp)
  918. {
  919.     Int2 status = 0;
  920.     SNCBIPackedScoreMatrix* psm;
  921.     Int4** matrix = sbp->matrix;
  922.     int i, j;   /* loop indices */
  923.     ASSERT(sbp);
  924.     if (strcasecmp(sbp->name, "BLOSUM62") == 0) {
  925.         psm = (SNCBIPackedScoreMatrix*) &NCBISM_Blosum62;
  926.     } else if (strcasecmp(sbp->name, "BLOSUM45") == 0) {
  927.         psm = (SNCBIPackedScoreMatrix*) &NCBISM_Blosum45;
  928.     } else if (strcasecmp(sbp->name, "BLOSUM80") == 0) {
  929.         psm = (SNCBIPackedScoreMatrix*) &NCBISM_Blosum80;
  930.     } else if (strcasecmp(sbp->name, "PAM30") == 0) {
  931.         psm = (SNCBIPackedScoreMatrix*) &NCBISM_Pam30;
  932.     } else if (strcasecmp(sbp->name, "PAM70") == 0) {
  933.         psm = (SNCBIPackedScoreMatrix*) &NCBISM_Pam70;
  934.     } else {
  935.         return -1;
  936.     }
  937.     /* Initialize with BLAST_SCORE_MIN */
  938.     for (i = 0; i < sbp->alphabet_size; i++) {
  939.         for (j = 0; j < sbp->alphabet_size; j++) {
  940.             matrix[i][j] = BLAST_SCORE_MIN;
  941.         }
  942.     }
  943.     for (i = 0; i < sbp->alphabet_size; i++) {
  944.         for (j = 0; j < sbp->alphabet_size; j++) {
  945.             /* skip selenocysteine and gap */
  946.             if (i == AMINOACID_TO_NCBISTDAA['U'] || 
  947.                 i == AMINOACID_TO_NCBISTDAA['-'] ||
  948.                 j == AMINOACID_TO_NCBISTDAA['U'] || 
  949.                 j == AMINOACID_TO_NCBISTDAA['-']) {
  950.                 continue;
  951.             }
  952.             matrix[i][j] = NCBISM_GetScore((const SNCBIPackedScoreMatrix*) psm,
  953.                                            i, j);
  954.         }
  955.     }
  956.     /* Sets dimensions of matrix. */
  957.     sbp->mat_dim1 = sbp->mat_dim2 = sbp->alphabet_size;
  958.     return status;
  959. }
  960. Int2
  961. BLAST_ScoreBlkMatFill(BlastScoreBlk* sbp, char* matrix_path)
  962. {
  963.     Int2 status = 0;
  964.     
  965.     if (sbp->read_in_matrix) {
  966.         
  967.         if (matrix_path && *matrix_path != NULLB) {
  968.             FILE *fp = NULL;
  969.             char* full_matrix_path = NULL;
  970.             int path_len = strlen(matrix_path);
  971.             int buflen = path_len + strlen(sbp->name);
  972.             full_matrix_path = (char*) malloc((buflen + 1) * sizeof(char));
  973.             if (!full_matrix_path) {
  974.                 return -1;
  975.             }
  976.             strncpy(full_matrix_path, matrix_path, buflen);
  977.             strncat(full_matrix_path, sbp->name, buflen - path_len);
  978.             if ( (fp=fopen(full_matrix_path, "r")) == NULL) {
  979.                return -1;
  980.             }
  981.             sfree(full_matrix_path);
  982.             if ( (status=BlastScoreBlkMatRead(sbp, fp)) != 0) {
  983.                fclose(fp);
  984.                return status;
  985.             }
  986.             fclose(fp);
  987.         } else {
  988.             if ( (status = BlastScoreBlkMatrixLoad(sbp)) !=0) {
  989.                 return status;
  990.             }
  991.         }
  992.     } else {
  993.        /* Nucleotide BLAST only! */
  994.        if ( (status=BlastScoreBlkMatCreate(sbp)) != 0)
  995.           return status;
  996.     }
  997.     
  998.     if ( (status=BlastScoreBlkMaxScoreSet(sbp)) != 0)
  999.        return status;
  1000.     return status;
  1001. }
  1002. Blast_ResFreq*
  1003. Blast_ResFreqDestruct(Blast_ResFreq* rfp)
  1004. {
  1005. if (rfp == NULL)
  1006. return NULL;
  1007. if (rfp->prob0 != NULL)
  1008. sfree(rfp->prob0);
  1009. sfree(rfp);
  1010. return rfp;
  1011. }
  1012. /*
  1013. Allocates the Blast_ResFreq* and then fills in the frequencies
  1014. in the probabilities.
  1015. */ 
  1016. Blast_ResFreq*
  1017. Blast_ResFreqNew(const BlastScoreBlk* sbp)
  1018. {
  1019. Blast_ResFreq* rfp;
  1020. if (sbp == NULL)
  1021. {
  1022. return NULL;
  1023. }
  1024. rfp = (Blast_ResFreq*) calloc(1, sizeof(Blast_ResFreq));
  1025. if (rfp == NULL)
  1026. return NULL;
  1027. rfp->alphabet_code = sbp->alphabet_code;
  1028. rfp->prob0 = (double*) calloc(sbp->alphabet_size, sizeof(double));
  1029. if (rfp->prob0 == NULL) 
  1030. {
  1031. rfp = Blast_ResFreqDestruct(rfp);
  1032. return rfp;
  1033. }
  1034. rfp->prob = rfp->prob0 - sbp->alphabet_start;
  1035. return rfp;
  1036. }
  1037. typedef struct BLAST_LetterProb {
  1038. char ch;
  1039. double p;
  1040. } BLAST_LetterProb;
  1041. #if 0
  1042. /* Unused for right now, but do not remove */
  1043. /*  M. O. Dayhoff amino acid background frequencies   */
  1044. static BLAST_LetterProb Dayhoff_prob[] = {
  1045. { 'A', 87.13 },
  1046. { 'C', 33.47 },
  1047. { 'D', 46.87 },
  1048. { 'E', 49.53 },
  1049. { 'F', 39.77 },
  1050. { 'G', 88.61 },
  1051. { 'H', 33.62 },
  1052. { 'I', 36.89 },
  1053. { 'K', 80.48 },
  1054. { 'L', 85.36 },
  1055. { 'M', 14.75 },
  1056. { 'N', 40.43 },
  1057. { 'P', 50.68 },
  1058. { 'Q', 38.26 },
  1059. { 'R', 40.90 },
  1060. { 'S', 69.58 },
  1061. { 'T', 58.54 },
  1062. { 'V', 64.72 },
  1063. { 'W', 10.49 },
  1064. { 'Y', 29.92 }
  1065. };
  1066. /* Stephen Altschul amino acid background frequencies */
  1067. static BLAST_LetterProb Altschul_prob[] = {
  1068. { 'A', 81.00 },
  1069. { 'C', 15.00 },
  1070. { 'D', 54.00 },
  1071. { 'E', 61.00 },
  1072. { 'F', 40.00 },
  1073. { 'G', 68.00 },
  1074. { 'H', 22.00 },
  1075. { 'I', 57.00 },
  1076. { 'K', 56.00 },
  1077. { 'L', 93.00 },
  1078. { 'M', 25.00 },
  1079. { 'N', 45.00 },
  1080. { 'P', 49.00 },
  1081. { 'Q', 39.00 },
  1082. { 'R', 57.00 },
  1083. { 'S', 68.00 },
  1084. { 'T', 58.00 },
  1085. { 'V', 67.00 },
  1086. { 'W', 13.00 },
  1087. { 'Y', 32.00 }
  1088. };
  1089. #endif
  1090. /* amino acid background frequencies from Robinson and Robinson */
  1091. static BLAST_LetterProb Robinson_prob[] = {
  1092. { 'A', 78.05 },
  1093. { 'C', 19.25 },
  1094. { 'D', 53.64 },
  1095. { 'E', 62.95 },
  1096. { 'F', 38.56 },
  1097. { 'G', 73.77 },
  1098. { 'H', 21.99 },
  1099. { 'I', 51.42 },
  1100. { 'K', 57.44 },
  1101. { 'L', 90.19 },
  1102. { 'M', 22.43 },
  1103. { 'N', 44.87 },
  1104. { 'P', 52.03 },
  1105. { 'Q', 42.64 },
  1106. { 'R', 51.29 },
  1107. { 'S', 71.20 },
  1108. { 'T', 58.41 },
  1109. { 'V', 64.41 },
  1110. { 'W', 13.30 },
  1111. { 'Y', 32.16 }
  1112. };
  1113. #define STD_AMINO_ACID_FREQS Robinson_prob
  1114. static BLAST_LetterProb nt_prob[] = {
  1115. { 'A', 25.00 },
  1116. { 'C', 25.00 },
  1117. { 'G', 25.00 },
  1118. { 'T', 25.00 }
  1119. };
  1120. /*
  1121. Normalize the frequencies to "norm".
  1122. */
  1123. static Int2
  1124. Blast_ResFreqNormalize(const BlastScoreBlk* sbp, Blast_ResFreq* rfp, double norm)
  1125. {
  1126. Int2 alphabet_stop, index;
  1127. double sum = 0., p;
  1128. if (norm == 0.)
  1129. return 1;
  1130. alphabet_stop = sbp->alphabet_start + sbp->alphabet_size;
  1131. for (index=sbp->alphabet_start; index<alphabet_stop; index++)
  1132. {
  1133. p = rfp->prob[index];
  1134. if (p < 0.)
  1135. return 1;
  1136. sum += p;
  1137. }
  1138. if (sum <= 0.)
  1139. return 0;
  1140. for (index=sbp->alphabet_start; index<alphabet_stop; index++)
  1141. {
  1142. rfp->prob[index] /= sum;
  1143. rfp->prob[index] *= norm;
  1144. }
  1145. return 0;
  1146. }
  1147. Int2
  1148. Blast_GetStdAlphabet(Uint1 alphabet_code, Uint1* residues, Uint4 residues_size)
  1149. {
  1150. Int2 index;
  1151. if (residues_size < DIM(STD_AMINO_ACID_FREQS))
  1152. return -2;
  1153. for (index=0; index<(int)DIM(STD_AMINO_ACID_FREQS); index++) 
  1154. {
  1155. if (alphabet_code == BLASTAA_SEQ_CODE)
  1156. {
  1157.   residues[index] = 
  1158.             AMINOACID_TO_NCBISTDAA[toupper(STD_AMINO_ACID_FREQS[index].ch)];
  1159. }
  1160. else
  1161. {
  1162. residues[index] = STD_AMINO_ACID_FREQS[index].ch;
  1163. }
  1164. }
  1165. return index;
  1166. }
  1167. Int2
  1168. Blast_ResFreqStdComp(const BlastScoreBlk* sbp, Blast_ResFreq* rfp)
  1169. {
  1170. Int2 retval;
  1171.         Uint4 index;
  1172. Uint1* residues;
  1173. if (sbp->protein_alphabet == TRUE)
  1174. {
  1175. residues = (Uint1*) calloc(DIM(STD_AMINO_ACID_FREQS), sizeof(Uint1));
  1176. retval = Blast_GetStdAlphabet(sbp->alphabet_code, residues, DIM(STD_AMINO_ACID_FREQS));
  1177. if (retval < 1)
  1178. return retval;
  1179. for (index=0; index<DIM(STD_AMINO_ACID_FREQS); index++) 
  1180. {
  1181. rfp->prob[residues[index]] = STD_AMINO_ACID_FREQS[index].p;
  1182. }
  1183. sfree(residues);
  1184. }
  1185. else
  1186. { /* beginning of blastna and ncbi2na are the same. */
  1187. /* Only blastna used  for nucleotides. */
  1188. for (index=0; index<DIM(nt_prob); index++) 
  1189. {
  1190. rfp->prob[index] = nt_prob[index].p;
  1191. }
  1192. }
  1193. Blast_ResFreqNormalize(sbp, rfp, 1.0);
  1194. return 0;
  1195. }
  1196. typedef struct Blast_ResComp {
  1197.     Uint1 alphabet_code;
  1198.     Int4* comp;  /* composition of alphabet, array starts at beginning of alphabet. */
  1199.     Int4*   comp0; /* Same array as above, starts at zero. */
  1200. } Blast_ResComp;
  1201. static Blast_ResComp*
  1202. BlastResCompDestruct(Blast_ResComp* rcp)
  1203. {
  1204. if (rcp == NULL)
  1205. return NULL;
  1206. if (rcp->comp0 != NULL)
  1207. sfree(rcp->comp0);
  1208. sfree(rcp);
  1209. return NULL;
  1210. }
  1211. /* 
  1212. Allocated the Blast_ResComp* for a given alphabet.  Only the
  1213. alphabets ncbistdaa and ncbi4na should be used by BLAST.
  1214. */
  1215. static Blast_ResComp*
  1216. BlastResCompNew(BlastScoreBlk* sbp)
  1217. {
  1218. Blast_ResComp* rcp;
  1219. rcp = (Blast_ResComp*) calloc(1, sizeof(Blast_ResComp));
  1220. if (rcp == NULL)
  1221. return NULL;
  1222. rcp->alphabet_code = sbp->alphabet_code;
  1223. /* comp0 has zero offset, comp starts at 0, only one 
  1224. array is allocated.  */
  1225. rcp->comp0 = (Int4*) calloc(BLAST_MATRIX_SIZE, sizeof(Int4));
  1226. if (rcp->comp0 == NULL) 
  1227. {
  1228. rcp = BlastResCompDestruct(rcp);
  1229. return rcp;
  1230. }
  1231. rcp->comp = rcp->comp0 - sbp->alphabet_start;
  1232. return rcp;
  1233. }
  1234. /*
  1235. Store the composition of a (query) string.  
  1236. */
  1237. static Int2
  1238. BlastResCompStr(BlastScoreBlk* sbp, Blast_ResComp* rcp, char* str, Int4 length)
  1239. {
  1240. char* lp,* lpmax;
  1241. Int2 index;
  1242.         Uint1 mask;
  1243. if (sbp == NULL || rcp == NULL || str == NULL)
  1244. return 1;
  1245. if (rcp->alphabet_code != sbp->alphabet_code)
  1246. return 1;
  1247.         /* For megablast, check only the first 4 bits of the sequence values */
  1248.         mask = (sbp->protein_alphabet ? 0xff : 0x0f);
  1249. /* comp0 starts at zero and extends for "num", comp is the same array, but 
  1250. "start_at" offset. */
  1251. for (index=0; index<(sbp->alphabet_size); index++)
  1252. rcp->comp0[index] = 0;
  1253. for (lp = str, lpmax = lp+length; lp < lpmax; lp++)
  1254. {
  1255. ++rcp->comp[(int)(*lp & mask)];
  1256. }
  1257. /* Don't count ambig. residues. */
  1258. for (index=0; index<sbp->ambig_occupy; index++)
  1259. {
  1260. rcp->comp[sbp->ambiguous_res[index]] = 0;
  1261. }
  1262. return 0;
  1263. }
  1264. static Int2
  1265. Blast_ResFreqClr(const BlastScoreBlk* sbp, Blast_ResFreq* rfp)
  1266. {
  1267. Int2 alphabet_max, index;
  1268.  
  1269. alphabet_max = sbp->alphabet_start + sbp->alphabet_size;
  1270. for (index=sbp->alphabet_start; index<alphabet_max; index++)
  1271.                 rfp->prob[index] = 0.0;
  1272.  
  1273.         return 0;
  1274. }
  1275. /*
  1276. Calculate the residue frequencies associated with the provided ResComp
  1277. */
  1278. static Int2
  1279. Blast_ResFreqResComp(BlastScoreBlk* sbp, Blast_ResFreq* rfp, 
  1280.                      Blast_ResComp* rcp)
  1281. {
  1282. Int2 alphabet_max, index;
  1283. double sum = 0.;
  1284. if (rfp == NULL || rcp == NULL)
  1285. return 1;
  1286. if (rfp->alphabet_code != rcp->alphabet_code)
  1287. return 1;
  1288. alphabet_max = sbp->alphabet_start + sbp->alphabet_size;
  1289. for (index=sbp->alphabet_start; index<alphabet_max; index++)
  1290. sum += rcp->comp[index];
  1291. if (sum == 0.) {
  1292. Blast_ResFreqClr(sbp, rfp);
  1293. return 0;
  1294. }
  1295. for (index=sbp->alphabet_start; index<alphabet_max; index++)
  1296. rfp->prob[index] = rcp->comp[index] / sum;
  1297. return 0;
  1298. }
  1299. static Int2
  1300. Blast_ResFreqString(BlastScoreBlk* sbp, Blast_ResFreq* rfp, char* string, Int4 length)
  1301. {
  1302. Blast_ResComp* rcp;
  1303. rcp = BlastResCompNew(sbp);
  1304. BlastResCompStr(sbp, rcp, string, length);
  1305. Blast_ResFreqResComp(sbp, rfp, rcp);
  1306. rcp = BlastResCompDestruct(rcp);
  1307. return 0;
  1308. }
  1309. static Int2
  1310. BlastScoreChk(Int4 lo, Int4 hi)
  1311. {
  1312. if (lo >= 0 || hi <= 0 ||
  1313. lo < BLAST_SCORE_1MIN || hi > BLAST_SCORE_1MAX)
  1314. return 1;
  1315. if (hi - lo > BLAST_SCORE_RANGE_MAX)
  1316. return 1;
  1317. return 0;
  1318. }
  1319. Blast_ScoreFreq*
  1320. Blast_ScoreFreqNew(Int4 score_min, Int4 score_max)
  1321. {
  1322. Blast_ScoreFreq* sfp;
  1323. Int4 range;
  1324. if (BlastScoreChk(score_min, score_max) != 0)
  1325. return NULL;
  1326. sfp = (Blast_ScoreFreq*) calloc(1, sizeof(Blast_ScoreFreq));
  1327. if (sfp == NULL)
  1328. return NULL;
  1329. range = score_max - score_min + 1;
  1330. sfp->sprob = (double*) calloc(range, sizeof(double));
  1331. if (sfp->sprob == NULL) 
  1332. {
  1333. Blast_ScoreFreqDestruct(sfp);
  1334. return NULL;
  1335. }
  1336. sfp->sprob0 = sfp->sprob;
  1337. sfp->sprob -= score_min;        /* center around 0 */
  1338. sfp->score_min = score_min;
  1339. sfp->score_max = score_max;
  1340. sfp->obs_min = sfp->obs_max = 0;
  1341. sfp->score_avg = 0.0;
  1342. return sfp;
  1343. }
  1344. static Int2
  1345. BlastScoreFreqCalc(BlastScoreBlk* sbp, Blast_ScoreFreq* sfp, Blast_ResFreq* rfp1, Blast_ResFreq* rfp2)
  1346. {
  1347. Int4 ** matrix;
  1348. Int4 score, obs_min, obs_max;
  1349. double score_sum, score_avg;
  1350. Int2  alphabet_start, alphabet_end, index1, index2;
  1351. if (sbp == NULL || sfp == NULL)
  1352. return 1;
  1353. if (sbp->loscore < sfp->score_min || sbp->hiscore > sfp->score_max)
  1354. return 1;
  1355. for (score = sfp->score_min; score <= sfp->score_max; score++)
  1356. sfp->sprob[score] = 0.0;
  1357. matrix = sbp->matrix;
  1358. alphabet_start = sbp->alphabet_start;
  1359. alphabet_end = alphabet_start + sbp->alphabet_size;
  1360. for (index1=alphabet_start; index1<alphabet_end; index1++)
  1361. {
  1362. for (index2=alphabet_start; index2<alphabet_end; index2++)
  1363. {
  1364. score = matrix[index1][index2];
  1365. if (score >= sbp->loscore) 
  1366. {
  1367. sfp->sprob[score] += rfp1->prob[index1] * rfp2->prob[index2];
  1368. }
  1369. }
  1370. }
  1371. score_sum = 0.;
  1372. obs_min = obs_max = BLAST_SCORE_MIN;
  1373. for (score = sfp->score_min; score <= sfp->score_max; score++)
  1374. {
  1375. if (sfp->sprob[score] > 0.) 
  1376. {
  1377. score_sum += sfp->sprob[score];
  1378. obs_max = score;
  1379. if (obs_min == BLAST_SCORE_MIN)
  1380. obs_min = score;
  1381. }
  1382. }
  1383. sfp->obs_min = obs_min;
  1384. sfp->obs_max = obs_max;
  1385. score_avg = 0.0;
  1386. if (score_sum > 0.0001 || score_sum < -0.0001)
  1387. {
  1388. for (score = obs_min; score <= obs_max; score++) 
  1389. {
  1390. sfp->sprob[score] /= score_sum;
  1391. score_avg += score * sfp->sprob[score];
  1392. }
  1393. }
  1394. sfp->score_avg = score_avg;
  1395. return 0;
  1396. }
  1397. #define DIMOFP0 (iterlimit*range + 1)
  1398. #define DIMOFP0_MAX (BLAST_KARLIN_K_ITER_MAX*BLAST_SCORE_RANGE_MAX+1)
  1399. #define SMALL_LAMBDA_THRESHOLD 20 /*defines special case in K computation*/
  1400.                                 /*threshold is on exp(-Lambda)*/
  1401. /*The following procedure computes K. The input includes Lambda, H,
  1402.  *  and an array of probabilities for each score.
  1403.  *  There are distinct closed form for three cases:
  1404.  *  1. high score is 1 low score is -1
  1405.  *  2. high score is 1 low score is not -1
  1406.  *  3. low score is -1, high score is not 1
  1407.  *
  1408.  * Otherwise, in most cases the value is computed as:
  1409.  * -exp(-2.0*outerSum) / ((H/lambda)*(exp(-lambda) - 1)
  1410.  * The last term (exp(-lambda) - 1) can be computed in two different
  1411.  * ways depending on whether lambda is small or not.
  1412.  * outerSum is a sum of the terms
  1413.  * innerSum/j, where j is denoted by iterCounter in the code.
  1414.  * The sum is truncated when the new term innersum/j i sufficiently small.
  1415.  * innerSum is a weighted sum of the probabilities of
  1416.  * of achieving a total score i in a gapless alignment,
  1417.  * which we denote by P(i,j).
  1418.  * of exactly j characters. innerSum(j) has two parts
  1419.  * Sum over i < 0  P(i,j)exp(-i * lambda) +
  1420.  * Sum over i >=0  P(i,j)
  1421.  * The terms P(i,j) are computed by dynamic programming.
  1422.  * An earlier version was flawed in that ignored the special case 1
  1423.  * and tried to replace the tail of the computation of outerSum
  1424.  * by a geometric series, but the base of the geometric series
  1425.  * was not accurately estimated in some cases.
  1426.  */
  1427. static double
  1428. BlastKarlinLHtoK(Blast_ScoreFreq* sfp, double lambda, double H)
  1429. {
  1430.     /*The next array stores the probabilities of getting each possible
  1431.       score in an alignment of fixed length; the array is shifted
  1432.       during part of the computation, so that
  1433.       entry 0 is for score 0.  */
  1434.     double         *alignmentScoreProbabilities = NULL;
  1435.     Int4            low;    /* Lowest score (must be negative) */
  1436.     Int4            high;   /* Highest score (must be positive) */
  1437.     Int4            range;  /* range of scores, computed as high - low*/
  1438.     double          K;      /* local copy of K  to return*/
  1439.     int             i;   /*loop index*/
  1440.     int             iterCounter; /*counter on iterations*/
  1441.     Int4            divisor; /*candidate divisor of all scores with
  1442.                                non-zero probabilities*/
  1443.     /*highest and lowest possible alignment scores for current length*/
  1444.     Int4            lowAlignmentScore, highAlignmentScore;
  1445.     Int4            first, last; /*loop indices for dynamic program*/
  1446.     register double innerSum;
  1447.     double          oldsum, oldsum2;  /* values of innerSum on previous
  1448.                                          iterations*/
  1449.     double          outerSum;        /* holds sum over j of (innerSum
  1450.                                         for iteration j/j)*/
  1451.     double          score_avg; /*average score*/
  1452.     /*first term to use in the closed form for the case where
  1453.       high == 1 or low == -1, but not both*/
  1454.     double          firstTermClosedForm;  /*usually store H/lambda*/
  1455.     int             iterlimit; /*upper limit on iterations*/
  1456.     double          sumlimit; /*lower limit on contributions
  1457.                                 to sum over scores*/
  1458.     /*array of score probabilities reindexed so that low is at index 0*/
  1459.     double         *probArrayStartLow;
  1460.     /*pointers used in dynamic program*/
  1461.     double         *ptrP, *ptr1, *ptr2, *ptr1e;
  1462.     double          expMinusLambda; /*e^^(-Lambda) */
  1463.     if (lambda <= 0. || H <= 0.) {
  1464.         /* Theory dictates that H and lambda must be positive, so
  1465.          * return -1 to indicate an error */
  1466.         return -1.;
  1467.     }
  1468.     /*Karlin-Altschul theory works only if the expected score
  1469.       is negative*/
  1470.     if (sfp->score_avg >= 0.0) {
  1471.         return -1.;
  1472.     }
  1473.     low   = sfp->obs_min;
  1474.     high  = sfp->obs_max;
  1475.     range = high - low;
  1476.     probArrayStartLow = &sfp->sprob[low];
  1477.     /* Look for the greatest common divisor ("delta" in Appendix of PNAS 87 of
  1478.        Karlin&Altschul (1990) */
  1479.     for (i = 1, divisor = -low; i <= range && divisor > 1; ++i) {
  1480.         if (probArrayStartLow[i])
  1481.             divisor = BLAST_Gcd(divisor, i);
  1482.     }
  1483.     high   /= divisor;
  1484.     low    /= divisor;
  1485.     lambda *= divisor;
  1486.     range = high - low;
  1487.     firstTermClosedForm = H/lambda;
  1488.     expMinusLambda      = exp((double) -lambda);
  1489.     if (low == -1 && high == 1) {
  1490.         K = (sfp->sprob[low] - sfp->sprob[high]) *
  1491.             (sfp->sprob[low] - sfp->sprob[high]) / sfp->sprob[low];
  1492.         return(K);
  1493.     }
  1494.     if (low == -1 || high == 1) {
  1495.         if (high == 1)
  1496.             ;
  1497.         else {
  1498.             score_avg = sfp->score_avg / divisor;
  1499.             firstTermClosedForm
  1500.                 = (score_avg * score_avg) / firstTermClosedForm;
  1501.         }
  1502.         return firstTermClosedForm * (1.0 - expMinusLambda);
  1503.     }
  1504.     sumlimit  = BLAST_KARLIN_K_SUMLIMIT_DEFAULT;
  1505.     iterlimit = BLAST_KARLIN_K_ITER_MAX;
  1506.     if (DIMOFP0 > DIMOFP0_MAX) {
  1507.         return -1.;
  1508.     }
  1509.     alignmentScoreProbabilities =
  1510.         (double *)calloc(DIMOFP0, sizeof(*alignmentScoreProbabilities));
  1511.     if (alignmentScoreProbabilities == NULL)
  1512.         return -1.;
  1513.     outerSum = 0.;
  1514.     lowAlignmentScore = highAlignmentScore = 0;
  1515.     alignmentScoreProbabilities[0] = innerSum = oldsum = oldsum2 = 1.;
  1516.     for (iterCounter = 0;
  1517.          ((iterCounter < iterlimit) && (innerSum > sumlimit));
  1518.          outerSum += innerSum /= ++iterCounter) {
  1519.         first = last = range;
  1520.         lowAlignmentScore  += low;
  1521.         highAlignmentScore += high;
  1522.         /*dynamic program to compute P(i,j)*/
  1523.         for (ptrP = alignmentScoreProbabilities +
  1524.                  (highAlignmentScore-lowAlignmentScore);
  1525.              ptrP >= alignmentScoreProbabilities;
  1526.              *ptrP-- =innerSum) {
  1527.             ptr1  = ptrP - first;
  1528.             ptr1e = ptrP - last;
  1529.             ptr2  = probArrayStartLow + first;
  1530.             for (innerSum = 0.; ptr1 >= ptr1e; )
  1531.                 innerSum += *ptr1--  *  *ptr2++;
  1532.             if (first)
  1533.                 --first;
  1534.             if (ptrP - alignmentScoreProbabilities <= range)
  1535.                 --last;
  1536.         }
  1537.         /* Horner's rule */
  1538.         innerSum = *++ptrP;
  1539.         for( i = lowAlignmentScore + 1; i < 0; i++ ) {
  1540.             innerSum = *++ptrP + innerSum * expMinusLambda;
  1541.         }
  1542.         innerSum *= expMinusLambda;
  1543.         for (; i <= highAlignmentScore; ++i)
  1544.             innerSum += *++ptrP;
  1545.         oldsum2 = oldsum;
  1546.         oldsum  = innerSum;
  1547.     }
  1548. #ifdef ADD_GEOMETRIC_TERMS_TO_K
  1549.     /*old code assumed that the later terms in sum were
  1550.       asymptotically comparable to those of a geometric
  1551.       progression, and tried to speed up convergence by
  1552.       guessing the estimated ratio between sucessive terms
  1553.       and using the explicit terms of a geometric progression
  1554.       to speed up convergence. However, the assumption does not
  1555.       always hold, and convergenece of the above code is fast
  1556.       enough in practice*/
  1557.     /* Terms of geometric progression added for correction */
  1558.     {
  1559.         double     ratio;  /* fraction used to generate the
  1560.                                    geometric progression */
  1561.         ratio = oldsum / oldsum2;
  1562.         if (ratio >= (1.0 - sumlimit*0.001)) {
  1563.             K = -1.;
  1564.             if (alignmentScoreProbabilities != NULL)
  1565.                 sfree(alignmentScoreProbabilities);
  1566.             return K;
  1567.         }
  1568.         sumlimit *= 0.01;
  1569.         while (innerSum > sumlimit) {
  1570.             oldsum   *= ratio;
  1571.             outerSum += innerSum = oldsum / ++iterCounter;
  1572.         }
  1573.     }
  1574. #endif
  1575.     if (expMinusLambda <  SMALL_LAMBDA_THRESHOLD ) {
  1576.         K = -exp((double)-2.0*outerSum) /
  1577.             (firstTermClosedForm*(expMinusLambda - 1.0));
  1578.     } else {
  1579.         K = -exp((double)-2.0*outerSum) /
  1580.             (firstTermClosedForm*BLAST_Expm1(-(double)lambda));
  1581.     }
  1582.     if (alignmentScoreProbabilities != NULL)
  1583.         sfree(alignmentScoreProbabilities);
  1584.     return K;
  1585. }
  1586. /**
  1587.  * Find positive solution to sum_{i=low}^{high} exp(i lambda) = 1.
  1588.  * 
  1589.  * @param probs probabilities of a score occurring 
  1590.  * @param d the gcd of the possible scores. This equals 1 if the scores
  1591.  * are not a lattice
  1592.  * @param low the lowest possible score
  1593.  * @param high the highest possible score
  1594.  * @param lambda0 an initial value for lambda
  1595.  * @param tolx the tolerance to which lambda must be computed
  1596.  * @param itmax the maximum number of times the function may be
  1597.  * evaluated
  1598.  * @param maxNewton the maximum permissible number of Newton
  1599.  * iteration. After that the computation will proceed by bisection.
  1600.  * @param itn a pointer to an integer that will receive the actually
  1601.  * number of iterations performed.
  1602.  *
  1603.  * Let phi(lambda) =  sum_{i=low}^{high} exp(i lambda) - 1. Then phi(lambda)
  1604.  * may be written
  1605.  *
  1606.  *     phi(lamdba) = exp(u lambda) p( exp(-lambda) )
  1607.  *
  1608.  * where p(x) is a polynomial that has exactly two zeros, one at x = 1
  1609.  * and one at y = exp(-lamdba). It is simpler, more numerically
  1610.  * efficient and stable to apply Newton's method to p(x) than to
  1611.  * phi(lambda).
  1612.  *
  1613.  * We define a safeguarded Newton iteration as follows. Let the
  1614.  * initial interval of uncertainty be [0,1]. If p'(x) >= 0, we bisect
  1615.  * the interval. Otherwise we try a Newton step. If the Newton iterate
  1616.  * lies in the current interval of uncertainty and it reduces the
  1617.  * value of | p(x) | by at least 10%, we accept the new
  1618.  * point. Otherwise, we bisect the current interval of uncertainty.
  1619.  * It is clear that this method converges to a zero of p(x).  Since
  1620.  * p'(x) > 0 in an interval containing x = 1, the method cannot
  1621.  * converge to x = 1 and therefore converges to the only other zero,
  1622.  * y.
  1623.  */
  1624. static double 
  1625. NlmKarlinLambdaNR( double* probs, Int4 d, Int4 low, Int4 high, double lambda0, double tolx,
  1626.  Int4 itmax, Int4 maxNewton, Int4 * itn ) 
  1627. {
  1628.   Int4 k;
  1629.   double x0, x, a = 0, b = 1;
  1630.   double f = 4;  /* Larger than any possible value of the poly in [0,1] */
  1631.   Int4 isNewton = 0; /* we haven't yet taken a Newton step. */
  1632.   assert( d > 0 );
  1633. x0 = exp( -lambda0 );
  1634.   x = ( 0 < x0 && x0 < 1 ) ? x0 : .5;
  1635.   
  1636.   for( k = 0; k < itmax; k++ ) { /* all iteration indices k */
  1637.     Int4 i;
  1638.     double g, fold = f;
  1639.     Int4 wasNewton = isNewton; /* If true, then the previous step was a */
  1640.                               /* Newton step */
  1641.     isNewton  = 0;            /* Assume that this step is not */
  1642.     
  1643.     /* Horner's rule for evaluating a polynomial and its derivative */
  1644.     g = 0;
  1645.     f = probs[low];
  1646.     for( i = low + d; i < 0; i += d ) {
  1647.       g = x * g + f;
  1648.       f = f * x + probs[i];
  1649.     }
  1650.     g = x * g + f;
  1651.     f = f * x + probs[0] - 1;
  1652.     for( i = d; i <= high; i += d ) {
  1653.       g = x * g + f;
  1654.       f = f * x + probs[i];
  1655.     }
  1656.     /* End Horner's rule */
  1657.     if( f > 0 ) {
  1658.       a = x; /* move the left endpoint */
  1659.     } else if( f < 0 ) { 
  1660.       b = x; /* move the right endpoint */
  1661.     } else { /* f == 0 */
  1662.       break; /* x is an exact solution */
  1663.     }
  1664.     if( b - a < 2 * a * ( 1 - b ) * tolx ) {
  1665.       /* The midpoint of the interval converged */
  1666.       x = (a + b) / 2; break;
  1667.     }
  1668.     if( k >= maxNewton ||
  1669.         /* If convergence of Newton's method appears to be failing; or */
  1670. ( wasNewton && fabs( f ) > .9 * fabs(fold) ) ||  
  1671.         /* if the previous iteration was a Newton step but didn't decrease 
  1672.          * f sufficiently; or */
  1673.         g >= 0 
  1674.         /* if a Newton step will move us away from the desired solution */
  1675.         ) { /* then */
  1676.       /* bisect */
  1677.       x = (a + b)/2;
  1678.     } else {
  1679.       /* try a Newton step */
  1680.       double p = - f/g;
  1681.       double y = x + p;
  1682.       if( y <= a || y >= b ) { /* The proposed iterate is not in (a,b) */
  1683.         x = (a + b)/2;
  1684.       } else { /* The proposed iterate is in (a,b). Accept it. */
  1685.         isNewton = 1;
  1686.         x = y;
  1687.         if( fabs( p ) < tolx * x * (1-x) ) break; /* Converged */
  1688.       } /* else the proposed iterate is in (a,b) */
  1689.     } /* else try a Newton step. */ 
  1690.   } /* end for all iteration indices k */
  1691. *itn = k; 
  1692.   return -log(x)/d;
  1693. }
  1694. double
  1695. Blast_KarlinLambdaNR(Blast_ScoreFreq* sfp, double initialLambdaGuess)
  1696. {
  1697. Int4 low; /* Lowest score (must be negative)  */
  1698. Int4 high; /* Highest score (must be positive) */
  1699. Int4 itn;
  1700. Int4 i, d;
  1701. double*  sprob;
  1702. double returnValue;
  1703. low = sfp->obs_min;
  1704. high = sfp->obs_max;
  1705. if (sfp->score_avg >= 0.) { /* Expected score must be negative */
  1706. return -1.0;
  1707. }
  1708. if (BlastScoreChk(low, high) != 0) return -1.;
  1709. sprob = sfp->sprob;
  1710. /* Find greatest common divisor of all scores */
  1711. for (i = 1, d = -low; i <= high-low && d > 1; ++i) {
  1712. if (sprob[i+low] != 0) {
  1713. d = BLAST_Gcd(d, i);
  1714. }
  1715. }
  1716. returnValue =
  1717. NlmKarlinLambdaNR( sprob, d, low, high,
  1718.                            initialLambdaGuess,
  1719.                            BLAST_KARLIN_LAMBDA_ACCURACY_DEFAULT,
  1720.    20, 20 + BLAST_KARLIN_LAMBDA_ITER_DEFAULT, &itn );
  1721. return returnValue;
  1722. }
  1723. /*
  1724. BlastKarlinLtoH
  1725. Calculate H, the relative entropy of the p's and q's
  1726. */
  1727. static double 
  1728. BlastKarlinLtoH(Blast_ScoreFreq* sfp, double lambda)
  1729. {
  1730. Int4 score;
  1731. double H, etonlam, sum, scale;
  1732. double *probs = sfp->sprob;
  1733. Int4 low   = sfp->obs_min,  high  = sfp->obs_max;
  1734. if (lambda < 0.) {
  1735. return -1.;
  1736. }
  1737. if (BlastScoreChk(low, high) != 0) return -1.;
  1738. etonlam = exp( - lambda );
  1739.   sum = low * probs[low];
  1740.   for( score = low + 1; score <= high; score++ ) {
  1741.     sum = score * probs[score] + etonlam * sum;
  1742.   }
  1743.   scale = BLAST_Powi( etonlam, high );
  1744.   if( scale > 0 ) {
  1745.     H = lambda * sum/scale;
  1746.   } else { /* Underflow of exp( -lambda * high ) */
  1747.     H = lambda * exp( lambda * high + log(sum) );
  1748.   }
  1749. return H;
  1750. }
  1751. /**************** Statistical Significance Parameter Subroutine ****************
  1752.     Version 1.0     February 2, 1990
  1753.     Version 1.2     July 6,     1990
  1754.     Program by:     Stephen Altschul
  1755.     Address:        National Center for Biotechnology Information
  1756.                     National Library of Medicine
  1757.                     National Institutes of Health
  1758.                     Bethesda, MD  20894
  1759.     Internet:       altschul@ncbi.nlm.nih.gov
  1760. See:  Karlin, S. & Altschul, S.F. "Methods for Assessing the Statistical
  1761.     Significance of Molecular Sequence Features by Using General Scoring
  1762.     Schemes,"  Proc. Natl. Acad. Sci. USA 87 (1990), 2264-2268.
  1763.     Computes the parameters lambda and K for use in calculating the
  1764.     statistical significance of high-scoring segments or subalignments.
  1765.     The scoring scheme must be integer valued.  A positive score must be
  1766.     possible, but the expected (mean) score must be negative.
  1767.     A program that calls this routine must provide the value of the lowest
  1768.     possible score, the value of the greatest possible score, and a pointer
  1769.     to an array of probabilities for the occurrence of all scores between
  1770.     these two extreme scores.  For example, if score -2 occurs with
  1771.     probability 0.7, score 0 occurs with probability 0.1, and score 3
  1772.     occurs with probability 0.2, then the subroutine must be called with
  1773.     low = -2, high = 3, and pr pointing to the array of values
  1774.     { 0.7, 0.0, 0.1, 0.0, 0.0, 0.2 }.  The calling program must also provide
  1775.     pointers to lambda and K; the subroutine will then calculate the values
  1776.     of these two parameters.  In this example, lambda=0.330 and K=0.154.
  1777.     The parameters lambda and K can be used as follows.  Suppose we are
  1778.     given a length N random sequence of independent letters.  Associated
  1779.     with each letter is a score, and the probabilities of the letters
  1780.     determine the probability for each score.  Let S be the aggregate score
  1781.     of the highest scoring contiguous segment of this sequence.  Then if N
  1782.     is sufficiently large (greater than 100), the following bound on the
  1783.     probability that S is greater than or equal to x applies:
  1784.             P( S >= x )   <=   1 - exp [ - KN exp ( - lambda * x ) ].
  1785.     In other words, the p-value for this segment can be written as
  1786.     1-exp[-KN*exp(-lambda*S)].
  1787.     This formula can be applied to pairwise sequence comparison by assigning
  1788.     scores to pairs of letters (e.g. amino acids), and by replacing N in the
  1789.     formula with N*M, where N and M are the lengths of the two sequences
  1790.     being compared.
  1791.     In addition, letting y = KN*exp(-lambda*S), the p-value for finding m
  1792.     distinct segments all with score >= S is given by:
  1793.                            2             m-1           -y
  1794.             1 - [ 1 + y + y /2! + ... + y   /(m-1)! ] e
  1795.     Notice that for m=1 this formula reduces to 1-exp(-y), which is the same
  1796.     as the previous formula.
  1797. *******************************************************************************/
  1798. Int2
  1799. Blast_KarlinBlkCalc(Blast_KarlinBlk* kbp, Blast_ScoreFreq* sfp)
  1800. {
  1801. if (kbp == NULL || sfp == NULL)
  1802. return 1;
  1803. /* Calculate the parameter Lambda */
  1804. kbp->Lambda = Blast_KarlinLambdaNR(sfp, BLAST_KARLIN_LAMBDA0_DEFAULT);
  1805. if (kbp->Lambda < 0.)
  1806. goto ErrExit;
  1807. /* Calculate H */
  1808. kbp->H = BlastKarlinLtoH(sfp, kbp->Lambda);
  1809. if (kbp->H < 0.)
  1810. goto ErrExit;
  1811. /* Calculate K and log(K) */
  1812. kbp->K = BlastKarlinLHtoK(sfp, kbp->Lambda, kbp->H);
  1813. if (kbp->K < 0.)
  1814. goto ErrExit;
  1815. kbp->logK = log(kbp->K);
  1816. /* Normal return */
  1817. return 0;
  1818. ErrExit:
  1819. kbp->Lambda = kbp->H = kbp->K = -1.;
  1820. #ifdef BLASTKAR_HUGE_VAL
  1821. kbp->logK = BLASTKAR_HUGE_VAL;
  1822. #else
  1823. kbp->logK = 1.e30;
  1824. #endif
  1825. return 1;
  1826. }
  1827. /*
  1828.   Calculate the Karlin parameters.  This function should be called once
  1829.   for each context, or frame translated.
  1830.   
  1831.   The rfp and stdrfp are calculated for each context, this should be
  1832.   fixed. 
  1833. */
  1834. Int2
  1835. BLAST_ScoreBlkFill(BlastScoreBlk* sbp, char* query, Int4 query_length, Int4 context_number)
  1836. {
  1837. Blast_ResFreq* rfp,* stdrfp;
  1838. Int2 retval=0;
  1839. rfp = Blast_ResFreqNew(sbp);
  1840. stdrfp = Blast_ResFreqNew(sbp);
  1841. Blast_ResFreqStdComp(sbp, stdrfp);
  1842. Blast_ResFreqString(sbp, rfp, query, query_length);
  1843. sbp->sfp[context_number] = Blast_ScoreFreqNew(sbp->loscore, sbp->hiscore);
  1844. BlastScoreFreqCalc(sbp, sbp->sfp[context_number], rfp, stdrfp);
  1845. sbp->kbp_std[context_number] = Blast_KarlinBlkCreate();
  1846. retval = Blast_KarlinBlkCalc(sbp->kbp_std[context_number], sbp->sfp[context_number]);
  1847. if (retval)
  1848. {
  1849. rfp = Blast_ResFreqDestruct(rfp);
  1850. stdrfp = Blast_ResFreqDestruct(stdrfp);
  1851. return retval;
  1852. }
  1853. sbp->kbp_psi[context_number] = Blast_KarlinBlkCreate();
  1854. retval = Blast_KarlinBlkCalc(sbp->kbp_psi[context_number], sbp->sfp[context_number]);
  1855. rfp = Blast_ResFreqDestruct(rfp);
  1856. stdrfp = Blast_ResFreqDestruct(stdrfp);
  1857. return retval;
  1858. }
  1859. /*
  1860. Calculates the standard Karlin parameters.  This is used
  1861. if the query is translated and the calculated (real) Karlin
  1862. parameters are bad, as they're calculated for non-coding regions.
  1863. */
  1864. Blast_KarlinBlk*
  1865. Blast_KarlinBlkIdealCalc(BlastScoreBlk* sbp)
  1866. {
  1867. Blast_KarlinBlk* kbp_ideal;
  1868. Blast_ResFreq* stdrfp;
  1869. Blast_ScoreFreq* sfp;
  1870. stdrfp = Blast_ResFreqNew(sbp);
  1871. Blast_ResFreqStdComp(sbp, stdrfp);
  1872. sfp = Blast_ScoreFreqNew(sbp->loscore, sbp->hiscore);
  1873. BlastScoreFreqCalc(sbp, sfp, stdrfp, stdrfp);
  1874. kbp_ideal = Blast_KarlinBlkCreate();
  1875. Blast_KarlinBlkCalc(kbp_ideal, sfp);
  1876. stdrfp = Blast_ResFreqDestruct(stdrfp);
  1877. sfp = Blast_ScoreFreqDestruct(sfp);
  1878. return kbp_ideal;
  1879. }
  1880. Int2
  1881. Blast_KarlinBlkStandardCalc(BlastScoreBlk* sbp, Int4 context_start, Int4 context_end)
  1882. {
  1883. Blast_KarlinBlk* kbp_ideal,* kbp;
  1884. Int4 index;
  1885. kbp_ideal = Blast_KarlinBlkIdealCalc(sbp);
  1886. /* Replace the calculated values with ideal ones for blastx, tblastx. */
  1887. for (index=context_start; index<=context_end; index++)
  1888. {
  1889. kbp = sbp->kbp[index];
  1890.       if (!kbp)
  1891.          continue;
  1892. if (kbp->Lambda >= kbp_ideal->Lambda)
  1893. {
  1894. kbp->Lambda = kbp_ideal->Lambda;
  1895. kbp->K = kbp_ideal->K;
  1896. kbp->logK = kbp_ideal->logK;
  1897. kbp->H = kbp_ideal->H;
  1898. }
  1899. }
  1900. kbp_ideal = Blast_KarlinBlkDestruct(kbp_ideal);
  1901. return 0;
  1902. }
  1903. /*
  1904. Creates the Karlin Block.
  1905. */
  1906. Blast_KarlinBlk*
  1907. Blast_KarlinBlkCreate(void)
  1908. {
  1909. Blast_KarlinBlk* kbp;
  1910. kbp = (Blast_KarlinBlk*) calloc(1, sizeof(Blast_KarlinBlk));
  1911. return kbp;
  1912. }
  1913. static SBLASTMatrixStructure*
  1914. BlastMatrixAllocate(Int2 alphabet_size)
  1915. {
  1916. SBLASTMatrixStructure* matrix_struct;
  1917. Int2 index;
  1918. if (alphabet_size <= 0 || alphabet_size >= BLAST_MATRIX_SIZE)
  1919. return NULL;
  1920. matrix_struct = (SBLASTMatrixStructure*) calloc(1, sizeof(SBLASTMatrixStructure));
  1921. if (matrix_struct == NULL)
  1922. return NULL;
  1923. for (index=0; index<BLAST_MATRIX_SIZE-1; index++)
  1924. {
  1925. matrix_struct->matrix[index] = matrix_struct->long_matrix + index*BLAST_MATRIX_SIZE;
  1926. }
  1927. return matrix_struct;
  1928. }
  1929. /*
  1930. Deallocates MatrixInfo*
  1931. */
  1932. static MatrixInfo*
  1933. MatrixInfoDestruct(MatrixInfo* matrix_info)
  1934. {
  1935. if (matrix_info == NULL)
  1936. return NULL;
  1937. sfree(matrix_info->name);
  1938. sfree(matrix_info);
  1939. return NULL;
  1940. }
  1941. /*
  1942. Makes New MatrixInfo*
  1943. */
  1944. static MatrixInfo*
  1945. MatrixInfoNew(char* name, array_of_8 *values, Int4* prefs, Int4 max_number)
  1946. {
  1947. MatrixInfo* matrix_info;
  1948. matrix_info = (MatrixInfo*) calloc(1, sizeof(MatrixInfo));
  1949. matrix_info->name = strdup(name);
  1950. matrix_info->values = values;
  1951. matrix_info->prefs = prefs;
  1952. matrix_info->max_number_values = max_number;
  1953. return matrix_info;
  1954. }
  1955. static ListNode*
  1956. BlastMatrixValuesDestruct(ListNode* vnp)
  1957. {
  1958. ListNode* head;
  1959. head = vnp;
  1960. while (vnp)
  1961. {
  1962. MatrixInfoDestruct((MatrixInfo*) vnp->ptr);
  1963. vnp = vnp->next;
  1964. }
  1965. head = ListNodeFree(head);
  1966. return head;
  1967. }
  1968. /*
  1969. ListNode* BlastLoadMatrixValues (void)
  1970. Loads all the matrix values, returns a ListNode* chain that contains
  1971. MatrixInfo*'s.
  1972. */
  1973. static ListNode* 
  1974. BlastLoadMatrixValues (void)
  1975. {
  1976. MatrixInfo* matrix_info;
  1977. ListNode* retval=NULL;
  1978. matrix_info = MatrixInfoNew("BLOSUM80", blosum80_values, blosum80_prefs, BLOSUM80_VALUES_MAX);
  1979. ListNodeAddPointer(&retval, 0, matrix_info);
  1980. matrix_info = MatrixInfoNew("BLOSUM62", blosum62_values, blosum62_prefs, BLOSUM62_VALUES_MAX);
  1981. ListNodeAddPointer(&retval, 0, matrix_info);
  1982. matrix_info = MatrixInfoNew("BLOSUM50", blosum50_values, blosum50_prefs, BLOSUM50_VALUES_MAX);
  1983. ListNodeAddPointer(&retval, 0, matrix_info);
  1984. matrix_info = MatrixInfoNew("BLOSUM45", blosum45_values, blosum45_prefs, BLOSUM45_VALUES_MAX);
  1985. ListNodeAddPointer(&retval, 0, matrix_info);
  1986. matrix_info = MatrixInfoNew("PAM250", pam250_values, pam250_prefs, PAM250_VALUES_MAX);
  1987. ListNodeAddPointer(&retval, 0, matrix_info);
  1988. matrix_info = MatrixInfoNew("BLOSUM62_20", blosum62_20_values, blosum62_20_prefs, BLOSUM62_20_VALUES_MAX);
  1989. ListNodeAddPointer(&retval, 0, matrix_info);
  1990. matrix_info = MatrixInfoNew("BLOSUM90", blosum90_values, blosum90_prefs, BLOSUM90_VALUES_MAX);
  1991. ListNodeAddPointer(&retval, 0, matrix_info);
  1992. matrix_info = MatrixInfoNew("PAM30", pam30_values, pam30_prefs, PAM30_VALUES_MAX);
  1993. ListNodeAddPointer(&retval, 0, matrix_info);
  1994. matrix_info = MatrixInfoNew("PAM70", pam70_values, pam70_prefs, PAM70_VALUES_MAX);
  1995. ListNodeAddPointer(&retval, 0, matrix_info);
  1996. return retval;
  1997. }
  1998. /*
  1999. Int2
  2000. BlastKarlinGetMatrixValuesEx2(char* matrix, Int4* open, Int4* extension, Int4* decline_align, double* lambda, double* K, double* H)
  2001. Obtains arrays of the allowed opening and extension penalties for gapped BLAST for
  2002. the given matrix.  Also obtains arrays of Lambda, K, and H.  Any of these fields that
  2003. are not required should be set to NULL.  The Int2 return value is the length of the
  2004. arrays.
  2005. */
  2006. static Int2
  2007. BlastKarlinGetMatrixValuesEx2(char* matrix, Int4** open, Int4** extension, Int4** decline_align, double** lambda, double** K, double** H, double** alpha, double** beta, Int4** pref_flags)
  2008. {
  2009. array_of_8 *values = NULL;
  2010. Boolean found_matrix=FALSE;
  2011. Int4 index, max_number_values=0;
  2012. Int4* open_array=NULL,* extension_array=NULL,* decline_align_array=NULL,* pref_flags_array=NULL,* prefs=NULL;
  2013. double* lambda_array=NULL,* K_array=NULL,* H_array=NULL,* alpha_array=NULL,* beta_array=NULL;
  2014. MatrixInfo* matrix_info;
  2015. ListNode* vnp,* head;
  2016. if (matrix == NULL)
  2017. return 0;
  2018. vnp = head = BlastLoadMatrixValues();
  2019. while (vnp)
  2020. {
  2021. matrix_info = vnp->ptr;
  2022. if (strcasecmp(matrix_info->name, matrix) == 0)
  2023. {
  2024. values = matrix_info->values;
  2025. max_number_values = matrix_info->max_number_values;
  2026. prefs = matrix_info->prefs;
  2027. found_matrix = TRUE;
  2028. break;
  2029. }
  2030. vnp = vnp->next;
  2031. }
  2032. if (found_matrix)
  2033. {
  2034. if (open)
  2035. *open = open_array = (Int4 *) calloc(max_number_values, sizeof(Int4));
  2036. if (extension)
  2037. *extension = extension_array = 
  2038.             (Int4 *) calloc(max_number_values, sizeof(Int4));
  2039. if (decline_align)
  2040. *decline_align = decline_align_array = 
  2041.             (Int4 *) calloc(max_number_values, sizeof(Int4));
  2042. if (lambda)
  2043. *lambda = lambda_array = 
  2044.             (double*) calloc(max_number_values, sizeof(double));
  2045. if (K)
  2046. *K = K_array = (double*) calloc(max_number_values, sizeof(double));
  2047. if (H)
  2048. *H = H_array = (double*) calloc(max_number_values, sizeof(double));
  2049. if (alpha)
  2050. *alpha = alpha_array = (double*) calloc(max_number_values, sizeof(double));
  2051. if (beta)
  2052. *beta = beta_array = (double*) calloc(max_number_values, sizeof(double));
  2053. if (pref_flags)
  2054. *pref_flags = pref_flags_array = 
  2055.             (Int4 *) calloc(max_number_values, sizeof(Int4));
  2056. for (index=0; index<max_number_values; index++)
  2057. {
  2058. if (open)
  2059. open_array[index] = (Int4) values[index][0];
  2060. if (extension)
  2061. extension_array[index] = (Int4) values[index][1];
  2062. if (decline_align)
  2063. decline_align_array[index] = (Int4) values[index][2];
  2064. if (lambda)
  2065. lambda_array[index] = values[index][3];
  2066. if (K)
  2067. K_array[index] = values[index][4];
  2068. if (H)
  2069. H_array[index] = values[index][5];
  2070. if (alpha)
  2071. alpha_array[index] = values[index][6];
  2072. if (beta)
  2073. beta_array[index] = values[index][7];
  2074. if (pref_flags)
  2075. pref_flags_array[index] = prefs[index];
  2076. }
  2077. }
  2078. BlastMatrixValuesDestruct(head);
  2079. return max_number_values;
  2080. }
  2081. /*Extract the alpha and beta settings for this matrixName, and these
  2082.   gap open and gap extension costs*/
  2083. void BLAST_GetAlphaBeta(char* matrixName, double *alpha,
  2084. double *beta, Boolean gapped, Int4 gap_open, Int4 gap_extend)
  2085. {
  2086.    Int4* gapOpen_arr,* gapExtend_arr,* pref_flags;
  2087.    double* alpha_arr,* beta_arr;
  2088.    Int2 num_values;
  2089.    Int4 i; /*loop index*/
  2090.    num_values = BlastKarlinGetMatrixValuesEx2(matrixName, &gapOpen_arr, 
  2091.      &gapExtend_arr, NULL, NULL, NULL, NULL,  &alpha_arr, &beta_arr, 
  2092.      &pref_flags);
  2093.    if (gapped) {
  2094.      if ((0 == gap_open) && (0 == gap_extend)) {
  2095.        for(i = 1; i < num_values; i++) {
  2096.  if(pref_flags[i]==BLAST_MATRIX_BEST) {
  2097.    (*alpha) = alpha_arr[i];
  2098.    (*beta) = beta_arr[i];
  2099.    break;
  2100.  }
  2101.        }
  2102.      }
  2103.      else {
  2104.        for(i = 1; i < num_values; i++) {
  2105.  if ((gapOpen_arr[i] == gap_open) &&
  2106.      (gapExtend_arr[i] == gap_extend)) {
  2107.    (*alpha) = alpha_arr[i];
  2108.    (*beta) = beta_arr[i];
  2109.    break;
  2110.  }
  2111.        }
  2112.      }
  2113.    }
  2114.    else if (num_values > 0) {
  2115.      (*alpha) = alpha_arr[0];
  2116.      (*beta) = beta_arr[0];
  2117.    }
  2118.    sfree(gapOpen_arr);
  2119.    sfree(gapExtend_arr);
  2120.    sfree(pref_flags);
  2121.    sfree(alpha_arr);
  2122.    sfree(beta_arr);
  2123. }
  2124. static Int2
  2125. BlastKarlinReportAllowedValues(const char *matrix_name, 
  2126.    Blast_Message** error_return)
  2127. {
  2128. array_of_8 *values = NULL;
  2129. Boolean found_matrix=FALSE;
  2130. char buffer[256];
  2131. Int4 index, max_number_values=0;
  2132. MatrixInfo* matrix_info;
  2133. ListNode* vnp,* head;
  2134. vnp = head = BlastLoadMatrixValues();
  2135. while (vnp)
  2136. {
  2137. matrix_info = vnp->ptr;
  2138. if (strcasecmp(matrix_info->name, matrix_name) == 0)
  2139. {
  2140. values = matrix_info->values;
  2141. max_number_values = matrix_info->max_number_values;
  2142. found_matrix = TRUE;
  2143. break;
  2144. }
  2145. vnp = vnp->next;
  2146. }
  2147. if (found_matrix)
  2148. {
  2149. for (index=0; index<max_number_values; index++)
  2150. {
  2151. if (BLAST_Nint(values[index][2]) == INT2_MAX)
  2152. sprintf(buffer, "Gap existence and extension values of %ld and %ld are supported", (long) BLAST_Nint(values[index][0]), (long) BLAST_Nint(values[index][1]));
  2153. else
  2154. sprintf(buffer, "Gap existence, extension and decline-to-align values of %ld, %ld and %ld are supported", (long) BLAST_Nint(values[index][0]), (long) BLAST_Nint(values[index][1]), (long) BLAST_Nint(values[index][2]));
  2155. Blast_MessageWrite(error_return, BLAST_SEV_ERROR, 0, 0, buffer);
  2156. }
  2157. }
  2158. BlastMatrixValuesDestruct(head);
  2159. return 0;
  2160. }
  2161. /*
  2162. Supplies lambda, H, and K values, as calcualted by Stephen Altschul 
  2163. in Methods in Enzy. (vol 266, page 474).
  2164. if kbp is NULL, then a validation is perfomed.
  2165. */
  2166. Int2
  2167. Blast_KarlinBlkGappedCalc(Blast_KarlinBlk* kbp, Int4 gap_open, Int4 gap_extend, Int4 decline_align, char* matrix_name, Blast_Message** error_return)
  2168. {
  2169. char buffer[256];
  2170. Int2 status = Blast_KarlinkGapBlkFill(kbp, gap_open, gap_extend, decline_align, matrix_name);
  2171. if (status && error_return)
  2172. {
  2173. if (status == 1)
  2174. {
  2175. MatrixInfo* matrix_info;
  2176. ListNode* vnp,* head; 
  2177. vnp = head = BlastLoadMatrixValues();
  2178. sprintf(buffer, "%s is not a supported matrix", matrix_name);
  2179. Blast_MessageWrite(error_return, BLAST_SEV_ERROR, 0, 0, buffer);
  2180. while (vnp)
  2181. {
  2182. matrix_info = vnp->ptr;
  2183. sprintf(buffer, "%s is a supported matrix", matrix_info->name);
  2184.             Blast_MessageWrite(error_return, BLAST_SEV_ERROR, 0, 0, buffer);
  2185. vnp = vnp->next;
  2186. }
  2187. BlastMatrixValuesDestruct(head);
  2188. }
  2189. else if (status == 2)
  2190. {
  2191. if (decline_align == INT2_MAX)
  2192. sprintf(buffer, "Gap existence and extension values of %ld and %ld not supported for %s", (long) gap_open, (long) gap_extend, matrix_name);
  2193. else
  2194. sprintf(buffer, "Gap existence, extension and decline-to-align values of %ld, %ld and %ld not supported for %s", (long) gap_open, (long) gap_extend, (long) decline_align, matrix_name);
  2195. Blast_MessageWrite(error_return, BLAST_SEV_ERROR, 0, 0, buffer);
  2196. BlastKarlinReportAllowedValues(matrix_name, error_return);
  2197. }
  2198. }
  2199. return status;
  2200. }
  2201. /*
  2202. Attempts to fill KarlinBlk for given gap opening, extensions etc.  
  2203. Will return non-zero status if that fails.
  2204. return values: -1 if matrix_name is NULL;
  2205. 1 if matrix not found
  2206. 2 if matrix found, but open, extend etc. values not supported.
  2207. */
  2208. Int2
  2209. Blast_KarlinkGapBlkFill(Blast_KarlinBlk* kbp, Int4 gap_open, Int4 gap_extend, Int4 decline_align, char* matrix_name)
  2210. {
  2211. Boolean found_matrix=FALSE, found_values=FALSE;
  2212. array_of_8 *values;
  2213. Int2 status=0;
  2214. Int4 index, max_number_values=0;
  2215. MatrixInfo* matrix_info;
  2216. ListNode* vnp,* head;
  2217. if (matrix_name == NULL)
  2218. return -1;
  2219. values = NULL;
  2220. vnp = head = BlastLoadMatrixValues();
  2221. while (vnp)
  2222. {
  2223. matrix_info = vnp->ptr;
  2224. if (strcasecmp(matrix_info->name, matrix_name) == 0)
  2225. {
  2226. values = matrix_info->values;
  2227. max_number_values = matrix_info->max_number_values;
  2228. found_matrix = TRUE;
  2229. break;
  2230. }
  2231. vnp = vnp->next;
  2232. }
  2233. if (found_matrix)
  2234. {
  2235. for (index=0; index<max_number_values; index++)
  2236. {
  2237. if (BLAST_Nint(values[index][0]) == gap_open &&
  2238. BLAST_Nint(values[index][1]) == gap_extend &&
  2239. (BLAST_Nint(values[index][2]) == INT2_MAX || BLAST_Nint(values[index][2]) == decline_align))
  2240. {
  2241. if (kbp)
  2242. {
  2243. kbp->Lambda = values[index][3];
  2244. kbp->K = values[index][4];
  2245. kbp->logK = log(kbp->K);
  2246. kbp->H = values[index][5];
  2247. }
  2248. found_values = TRUE;
  2249. break;
  2250. }
  2251. }
  2252. if (found_values == TRUE)
  2253. {
  2254. status = 0;
  2255. }
  2256. else
  2257. {
  2258. status = 2;
  2259. }
  2260. }
  2261. else
  2262. {
  2263. status = 1;
  2264. }
  2265. BlastMatrixValuesDestruct(head);
  2266. return status;
  2267. }
  2268. char*
  2269. BLAST_PrintMatrixMessage(const char *matrix_name)
  2270. {
  2271. char* buffer= (char *) calloc(1024, sizeof(char));
  2272. char* ptr;
  2273. MatrixInfo* matrix_info;
  2274.         ListNode* vnp,* head;
  2275. ptr = buffer;
  2276.         sprintf(ptr, "%s is not a supported matrix, supported matrices are:n", matrix_name);
  2277. ptr += strlen(ptr);
  2278.         vnp = head = BlastLoadMatrixValues();
  2279.         while (vnp)
  2280.         {
  2281.          matrix_info = vnp->ptr;
  2282.          sprintf(ptr, "%s n", matrix_info->name);
  2283. ptr += strlen(ptr);
  2284. vnp = vnp->next;
  2285.         }
  2286.         BlastMatrixValuesDestruct(head);
  2287. return buffer;
  2288. }
  2289. char*
  2290. BLAST_PrintAllowedValues(const char *matrix_name, Int4 gap_open, Int4 gap_extend, Int4 decline_align) 
  2291. {
  2292. array_of_8 *values = NULL;
  2293. Boolean found_matrix=FALSE;
  2294. char* buffer,* ptr;
  2295. Int4 index, max_number_values=0;
  2296. MatrixInfo* matrix_info;
  2297. ListNode* vnp,* head;
  2298. ptr = buffer = (char *) calloc(2048, sizeof(char));
  2299.         if (decline_align == INT2_MAX)
  2300.               sprintf(ptr, "Gap existence and extension values of %ld and %ld not supported for %snsupported values are:n", 
  2301. (long) gap_open, (long) gap_extend, matrix_name);
  2302.         else
  2303.                sprintf(ptr, "Gap existence, extension and decline-to-align values of %ld, %ld and %ld not supported for %sn supported values are:n", 
  2304. (long) gap_open, (long) gap_extend, (long) decline_align, matrix_name);
  2305. ptr += strlen(ptr);
  2306. vnp = head = BlastLoadMatrixValues();
  2307. while (vnp)
  2308. {
  2309. matrix_info = vnp->ptr;
  2310. if (strcasecmp(matrix_info->name, matrix_name) == 0)
  2311. {
  2312. values = matrix_info->values;
  2313. max_number_values = matrix_info->max_number_values;
  2314. found_matrix = TRUE;
  2315. break;
  2316. }
  2317. vnp = vnp->next;
  2318. }
  2319. if (found_matrix)
  2320. {
  2321. for (index=0; index<max_number_values; index++)
  2322. {
  2323. if (BLAST_Nint(values[index][2]) == INT2_MAX)
  2324. sprintf(ptr, "%ld, %ldn", (long) BLAST_Nint(values[index][0]), (long) BLAST_Nint(values[index][1]));
  2325. else
  2326. sprintf(ptr, "%ld, %ld, %ldn", (long) BLAST_Nint(values[index][0]), (long) BLAST_Nint(values[index][1]), (long) BLAST_Nint(values[index][2]));
  2327. ptr += strlen(ptr);
  2328. }
  2329. }
  2330. BlastMatrixValuesDestruct(head);
  2331. return buffer;
  2332. }
  2333. /* Smallest float that might not cause a floating point exception in
  2334. S = (Int4) (ceil( log((double)(K * searchsp / E)) / Lambda ));
  2335. below.
  2336. */
  2337. #define BLASTKAR_SMALL_FLOAT 1.0e-297
  2338. static Int4
  2339. BlastKarlinEtoS_simple(double E, /* Expect value */
  2340. Blast_KarlinBlk* kbp,
  2341. Int8 searchsp) /* size of search space */
  2342. {
  2343. double Lambda, K, H; /* parameters for Karlin statistics */
  2344. Int4 S;
  2345. Lambda = kbp->Lambda;
  2346. K = kbp->K;
  2347. H = kbp->H;
  2348. if (Lambda < 0. || K < 0. || H < 0.) 
  2349. {
  2350. return BLAST_SCORE_MIN;
  2351. }
  2352. E = MAX(E, BLASTKAR_SMALL_FLOAT);
  2353. S = (Int4) (ceil( log((double)(K * searchsp / E)) / Lambda ));
  2354. return S;
  2355. }
  2356. /* Compute a divisor used to weight the evalue of a collection of
  2357.  * "nsegs" distinct alignments.  These divisors are used to compensate
  2358.  * for the effect of choosing the best among multiple collections of
  2359.  * alignments.  See
  2360.  *
  2361.  * Stephen F. Altschul. Evaluating the statitical significance of
  2362.  * multiple distinct local alignments. In Suhai, editior, Theoretical
  2363.  * and Computational Methods in Genome Research, pages 1-14. Plenum
  2364.  * Press, New York, 1997.
  2365.  *
  2366.  * The "decayrate" parameter of this routine is a value in the
  2367.  * interval (0,1). Typical values of decayrate are .1 and .5. */
  2368. double
  2369. BLAST_GapDecayDivisor(double decayrate, unsigned nsegs )
  2370. {
  2371.     return (1. - decayrate) * BLAST_Powi(decayrate, nsegs - 1);
  2372. }
  2373. /*
  2374. BlastCutoffs
  2375. Calculate the cutoff score, S, and the highest expected score.
  2376. */
  2377. Int2
  2378. BLAST_Cutoffs(Int4 *S, /* cutoff score */
  2379. double* E, /* expected no. of HSPs scoring at or above S */
  2380. Blast_KarlinBlk* kbp,
  2381. Int8 searchsp, /* size of search space. */
  2382. Boolean dodecay,  /* TRUE ==> use gapdecay feature */
  2383.    double gap_decay_rate)
  2384. {
  2385. Int4 s = *S, es;
  2386. double e = *E, esave;
  2387. Boolean s_changed = FALSE;
  2388. if (kbp->Lambda == -1. || kbp->K == -1. || kbp->H == -1.)
  2389. return 1;
  2390. /*
  2391. Calculate a cutoff score, S, from the Expected
  2392. (or desired) number of reported HSPs, E.
  2393. */
  2394. es = 1;
  2395. esave = e;
  2396. if (e > 0.) 
  2397. {
  2398.         if (dodecay) {
  2399.             /* Invert the adjustment to the e-value that will be applied
  2400.              * to compensate for the effect of choosing the best among
  2401.              * multiple alignments */
  2402.             if( gap_decay_rate > 0 && gap_decay_rate < 1 ) {
  2403.                 e *= BLAST_GapDecayDivisor(gap_decay_rate, 1);
  2404.             }
  2405.         }
  2406.         es = BlastKarlinEtoS_simple(e, kbp, searchsp);
  2407. }
  2408. /*
  2409. Pick the larger cutoff score between the user's choice
  2410. and that calculated from the value of E.
  2411. */
  2412. if (es > s) {
  2413. s_changed = TRUE;
  2414. *S = s = es;
  2415. }
  2416. /*
  2417. Re-calculate E from the cutoff score, if E going in was too high
  2418. */
  2419. if (esave <= 0. || !s_changed) 
  2420. {
  2421. e = BLAST_KarlinStoE_simple(s, kbp, searchsp);
  2422. if (dodecay) {
  2423.             /* Weight the e-value to compensate for the effect of
  2424.              * choosing the best of more than one collection of
  2425.              * distinct alignments */
  2426.             if( gap_decay_rate > 0 && gap_decay_rate < 1 ) {
  2427.                 e /= BLAST_GapDecayDivisor(gap_decay_rate, 1);
  2428.             }
  2429.         }
  2430. *E = e;
  2431. }
  2432. return 0;
  2433. }
  2434. /*
  2435. BlastKarlinStoE() -- given a score, return the associated Expect value
  2436. Error return value is -1.
  2437. */
  2438. double
  2439. BLAST_KarlinStoE_simple(Int4 S,
  2440. Blast_KarlinBlk* kbp,
  2441. Int8 searchsp) /* size of search space. */
  2442. {
  2443. double Lambda, K, H; /* parameters for Karlin statistics */
  2444. Lambda = kbp->Lambda;
  2445. K = kbp->K;
  2446. H = kbp->H;
  2447. if (Lambda < 0. || K < 0. || H < 0.) {
  2448. return -1.;
  2449. }
  2450. return (double) searchsp * exp((double)(-Lambda * S) + kbp->logK);
  2451. }
  2452. /*
  2453. BlastKarlinPtoE -- convert a P-value to an Expect value
  2454. */
  2455. static double
  2456. BlastKarlinPtoE(double p)
  2457. {
  2458.         if (p < 0. || p > 1.0) 
  2459. {
  2460.                 return INT4_MIN;
  2461.         }
  2462. if (p == 1)
  2463. return INT4_MAX;
  2464.         return -BLAST_Log1p(-p);
  2465. }
  2466. static double tab2[] = { /* table for r == 2 */
  2467. 0.01669,  0.0249,   0.03683,  0.05390,  0.07794,  0.1111,   0.1559,   0.2146,   
  2468. 0.2890,   0.3794,   0.4836,   0.5965,   0.7092,   0.8114,   0.8931,   0.9490,   
  2469. 0.9806,   0.9944,   0.9989
  2470. };
  2471. static double tab3[] = { /* table for r == 3 */
  2472. 0.9806,   0.9944,   0.9989,   0.0001682,0.0002542,0.0003829,0.0005745,0.0008587,
  2473. 0.001278, 0.001893, 0.002789, 0.004088, 0.005958, 0.008627, 0.01240,  0.01770,  
  2474. 0.02505,  0.03514,  0.04880,  0.06704,  0.09103,  0.1220,   0.1612,   0.2097,   
  2475. 0.2682,   0.3368,   0.4145,   0.4994,   0.5881,   0.6765,   0.7596,   0.8326,   
  2476. 0.8922,   0.9367,   0.9667,   0.9846,   0.9939,   0.9980
  2477. };
  2478. static double tab4[] = { /* table for r == 4 */
  2479. 2.658e-07,4.064e-07,6.203e-07,9.450e-07,1.437e-06,2.181e-06,3.302e-06,4.990e-06,
  2480. 7.524e-06,1.132e-05,1.698e-05,2.541e-05,3.791e-05,5.641e-05,8.368e-05,0.0001237,
  2481. 0.0001823,0.0002677,0.0003915,0.0005704,0.0008275,0.001195, 0.001718, 0.002457,
  2482. 0.003494, 0.004942, 0.006948, 0.009702, 0.01346,  0.01853,  0.02532,  0.03431,
  2483. 0.04607,  0.06128,  0.08068,  0.1051,   0.1352,   0.1719,   0.2157,   0.2669,
  2484. 0.3254,   0.3906,   0.4612,   0.5355,   0.6110,   0.6849,   0.7544,   0.8168,
  2485. 0.8699,   0.9127,   0.9451,   0.9679,   0.9827,   0.9915,   0.9963
  2486. };
  2487. static double* table[] = { tab2, tab3, tab4 };
  2488. static short tabsize[] = { DIM(tab2)-1, DIM(tab3)-1, DIM(tab4)-1 };
  2489. static double f (double,void*);
  2490. static double g (double,void*);
  2491. /*
  2492.     Estimate the Sum P-value by calculation or interpolation, as appropriate.
  2493. Approx. 2-1/2 digits accuracy minimum throughout the range of r, s.
  2494. r = number of segments
  2495. s = total score (in nats), adjusted by -r*log(KN)
  2496. */
  2497. static double
  2498. BlastSumP(Int4 r, double s)
  2499. {
  2500. Int4 i, r1, r2;
  2501. double a;
  2502. if (r == 1)
  2503. return -BLAST_Expm1(-exp(-s));
  2504. if (r <= 4) {
  2505. if (r < 1)
  2506. return 0.;
  2507. r1 = r - 1;
  2508. if (s >= r*r+r1) {
  2509. a = BLAST_LnGammaInt(r+1);
  2510. return r * exp(r1*log(s)-s-a-a);
  2511. }
  2512. if (s > -2*r) {
  2513. /* interpolate */
  2514. i = (Int4) (a = s+s+(4*r));
  2515. a -= i;
  2516. i = tabsize[r2 = r - 2] - i;
  2517. return a*table[r2][i-1] + (1.-a)*table[r2][i];
  2518. }
  2519. return 1.;
  2520. }
  2521. return BlastSumPCalc(r, s);
  2522. }
  2523. /*
  2524.     BlastSumPCalc
  2525.     Evaluate the following double integral, where r = number of segments
  2526.     and s = the adjusted score in nats:
  2527.                     (r-2)         oo           oo
  2528.      Prob(r,s) =   r              -            -   (r-2)
  2529.                  -------------   |   exp(-y)  |   x   exp(-exp(x - y/r)) dx dy
  2530.                  (r-1)! (r-2)!  U            U
  2531.                                 s            0
  2532. */
  2533. static double
  2534. BlastSumPCalc(int r, double s)
  2535. {
  2536. int r1, itmin;
  2537. double t, d, epsilon;
  2538. double est_mean, mean, stddev, stddev4;
  2539. double xr, xr1, xr2, logr;
  2540. double args[6];
  2541. epsilon = BLAST_SUMP_EPSILON_DEFAULT; /* accuracy for SumP calcs. */
  2542. if (r == 1) {
  2543. if (s > 8.)
  2544. return exp(-s);
  2545. return -BLAST_Expm1(-exp(-s));
  2546. }
  2547. if (r < 1)
  2548. return 0.;
  2549. xr = r;
  2550. if (r < 8) {
  2551. if (s <= -2.3*xr)
  2552. return 1.;
  2553. }
  2554. else if (r < 15) {
  2555. if (s <= -2.5*xr)
  2556. return 1.;
  2557. }
  2558. else if (r < 27) {
  2559. if (s <= -3.0*xr)
  2560. return 1.;
  2561. }
  2562. else if (r < 51) {
  2563. if (s <= -3.4*xr)
  2564. return 1.;
  2565. }
  2566. else if (r < 101) {
  2567. if (s <= -4.0*xr)
  2568. return 1.;
  2569. }
  2570. /* stddev in the limit of infinite r, but quite good for even small r */
  2571. stddev = sqrt(xr);
  2572. stddev4 = 4.*stddev;
  2573. xr1 = r1 = r - 1;
  2574. if (r > 100) {
  2575. /* Calculate lower bound on the mean using inequality log(r) <= r */
  2576. est_mean = -xr * xr1;
  2577. if (s <= est_mean - stddev4)
  2578. return 1.;
  2579. }
  2580. /* mean is rather close to the mode, and the mean is readily calculated */
  2581. /* mean in the limit of infinite r, but quite good for even small r */
  2582. logr = log(xr);
  2583. mean = xr * (1. - logr) - 0.5;
  2584. if (s <= mean - stddev4)
  2585. return 1.;
  2586. if (s >= mean) {
  2587. t = s + 6.*stddev;
  2588. itmin = 1;
  2589. }
  2590. else {
  2591. t = mean + 6.*stddev;
  2592. itmin = 2;
  2593. }
  2594. #define ARG_R args[0]
  2595. #define ARG_R2 args[1]
  2596. #define ARG_ADJ1 args[2]
  2597. #define ARG_ADJ2 args[3]
  2598. #define ARG_SDIVR args[4]
  2599. #define ARG_EPS args[5]
  2600. ARG_R = xr;
  2601. ARG_R2 = xr2 = r - 2;
  2602. ARG_ADJ1 = xr2*logr - BLAST_LnGammaInt(r1) - BLAST_LnGammaInt(r);
  2603. ARG_EPS = epsilon;
  2604. do {
  2605. d = BLAST_RombergIntegrate(g, args, s, t, epsilon, 0, itmin);
  2606. #ifdef BLASTKAR_HUGE_VAL
  2607. if (d == BLASTKAR_HUGE_VAL)
  2608. return d;
  2609. #endif
  2610. } while (s < mean && d < 0.4 && itmin++ < 4);
  2611. return (d < 1. ? d : 1.);
  2612. }
  2613. static double
  2614. g(double s, void* vp)
  2615. {
  2616. register double* args = vp;
  2617. double mx;
  2618. ARG_ADJ2 = ARG_ADJ1 - s;
  2619. ARG_SDIVR = s / ARG_R; /* = s / r */
  2620. mx = (s > 0. ? ARG_SDIVR + 3. : 3.);
  2621. return BLAST_RombergIntegrate(f, vp, 0., mx, ARG_EPS, 0, 1);
  2622. }
  2623. static double
  2624. f(double x, void* vp)
  2625. {
  2626. register double* args = vp;
  2627. register double y;
  2628. y = exp(x - ARG_SDIVR);
  2629. #ifdef BLASTKAR_HUGE_VAL
  2630. if (y == BLASTKAR_HUGE_VAL)
  2631. return 0.;
  2632. #endif
  2633. if (ARG_R2 == 0.)
  2634. return exp(ARG_ADJ2 - y);
  2635. if (x == 0.)
  2636. return 0.;
  2637. return exp(ARG_R2*log(x) + ARG_ADJ2 - y);
  2638. }
  2639. /*
  2640.     Calculates the e-value for alignments with "small" gaps (typically
  2641.     under fifty residues/basepairs) following ideas of Stephen Altschul's.
  2642. */
  2643. double
  2644. BLAST_SmallGapSumE(
  2645.     Blast_KarlinBlk * kbp,     /* statistical parameters */
  2646.     Int4 gap,                   /* maximum size of gaps between alignments */
  2647.     Int2 num,                   /* the number of distinct alignments in this
  2648.                                  * collection */
  2649.     double score_prime,         /* the sum of the scores of these alignments
  2650.                                  * each weighted by an appropriate value of
  2651.                                  * Lambda */
  2652.     Int4 query_length,          /* the effective len of the query seq */
  2653.     Int4 subject_length,        /* the effective len of the database seq */
  2654.     double weight_divisor)      /* a divisor used to weight the e-value
  2655.                                  * when multiple collections of alignments
  2656.                                  * are being considered by the calling
  2657.                                  * routine */
  2658. {
  2659.     double search_space;        /* The effective size of the search space */
  2660.     double sum_p;               /* The p-value of this set of alignments */
  2661.     double sum_e;               /* The e-value of this set of alignments */
  2662.     search_space = (double)subject_length*(double)query_length;
  2663.     score_prime -= kbp->logK +
  2664.         log(search_space) + (num-1)*(kbp->logK + 2*log((double)gap));
  2665.     score_prime -= BLAST_LnFactorial((double) num);
  2666.     sum_p = BlastSumP(num, score_prime);
  2667.     sum_e = BlastKarlinPtoE(sum_p);
  2668.     if( weight_divisor == 0 || (sum_e /= weight_divisor) > INT4_MAX ) {
  2669.         sum_e = INT4_MAX;
  2670.     }
  2671.     return sum_e;
  2672. }
  2673. /*
  2674.     Calculates the e-value of a collection multiple distinct
  2675.     alignments with asymmetric gaps between the alignments. The gaps
  2676.     in one (protein) sequence are typically small (like in
  2677.     BLAST_SmallGapSumE) gap an the gaps in the other (translated DNA)
  2678.     sequence are possibly large (up to 4000 bp.)  This routine is used
  2679.     for linking HSPs representing exons in the DNA sequence that are
  2680.     separated by introns.
  2681. */
  2682. double
  2683. BLAST_UnevenGapSumE(
  2684.     Blast_KarlinBlk * kbp,      /* statistical parameters */
  2685.     Int4 p_gap,                 /* maximum size of gaps between alignments,
  2686.                                  * in one sequence */
  2687.     Int4 n_gap,                 /* maximum size of gaps between alignments,
  2688.                                  * in the other sequence */
  2689.     Int2 num,                   /* the number of distinct alignments in this
  2690.                                  * collection */
  2691.     double score_prime,         /* the sum of the scores of these alignments
  2692.                                  * each weighted by an appropriate value of
  2693.                                  * Lambda */
  2694.     Int4 query_length,          /* the effective len of the query seq */
  2695.     Int4 subject_length,        /* the effective len of the database seq */
  2696.     double weight_divisor)      /* a divisor used to weight the e-value
  2697.                                  * when multiple collections of alignments
  2698.                                  * are being considered by the calling
  2699.                                  * routine */
  2700. {
  2701.     double search_space;   /* The effective size of the search space */
  2702.     double sum_p;          /* The p-value of this set of alignments */
  2703.     double sum_e;          /* The e-value of this set of alignments */
  2704.     search_space = (double)subject_length*(double)query_length;
  2705.     score_prime -=
  2706.         kbp->logK + log(search_space) +
  2707.         (num-1)*(kbp->logK + log((double)p_gap) + log((double)n_gap));
  2708.     score_prime -= BLAST_LnFactorial((double) num);
  2709.     sum_p = BlastSumP(num, score_prime);
  2710.     sum_e = BlastKarlinPtoE(sum_p);
  2711.     if( weight_divisor == 0 || (sum_e /= weight_divisor) > INT4_MAX ) {
  2712.         sum_e = INT4_MAX;
  2713.     }
  2714.     return sum_e;
  2715. }
  2716. /*
  2717.     Calculates the e-value if a collection of distinct alignments with
  2718.     arbitrarily large gaps between the alignments
  2719. */
  2720. double
  2721. BLAST_LargeGapSumE(
  2722.     Blast_KarlinBlk * kbp,      /* statistical parameters */
  2723.     Int2 num,                   /* the number of distinct alignments in this
  2724.                                  * collection */
  2725.     double      score_prime,    /* the sum of the scores of these alignments
  2726.                                  * each weighted by an appropriate value of
  2727.                                  * Lambda */
  2728.     Int4 query_length,          /* the effective len of the query seq */
  2729.     Int4 subject_length,        /* the effective len of the database seq */
  2730.     double weight_divisor)      /* a divisor used to weight the e-value
  2731.                                  * when multiple collections of alignments
  2732.                                  * are being considered by the calling
  2733.                                  * routine */
  2734. {
  2735.     double sum_p;               /* The p-value of this set of alignments */
  2736.     double sum_e;               /* The e-value of this set of alignments */
  2737. /* The next two variables are for compatability with Warren's code. */
  2738.     double lcl_subject_length;     /* query_length as a float */
  2739.     double lcl_query_length;       /* subject_length as a float */
  2740.     lcl_query_length = (double) query_length;
  2741.     lcl_subject_length = (double) subject_length;
  2742.     score_prime -= num*(kbp->logK + log(lcl_subject_length*lcl_query_length))
  2743.         - BLAST_LnFactorial((double) num);
  2744.     sum_p = BlastSumP(num, score_prime);
  2745.     sum_e = BlastKarlinPtoE(sum_p);
  2746.     if( weight_divisor == 0 || (sum_e /= weight_divisor) > INT4_MAX ) {
  2747.         sum_e = INT4_MAX;
  2748.     }
  2749.     return sum_e;
  2750. }
  2751. /*------------------- RPS BLAST functions --------------------*/
  2752. static double
  2753. RPSfindUngappedLambda(Char *matrixName)
  2754. {
  2755.     if (0 == strcmp(matrixName, "BLOSUM62"))
  2756.         return 0.3176;
  2757.     if (0 == strcmp(matrixName, "BLOSUM90"))
  2758.         return 0.3346;
  2759.     if (0 == strcmp(matrixName, "BLOSUM80"))
  2760.         return 0.3430;
  2761.     if (0 == strcmp(matrixName, "BLOSUM50"))
  2762.         return 0.232;
  2763.     if (0 == strcmp(matrixName, "BLOSUM45"))
  2764.         return 0.2291;
  2765.     if (0 == strcmp(matrixName, "PAM30"))
  2766.         return 0.340;
  2767.     if (0 == strcmp(matrixName, "PAM70"))
  2768.         return 0.3345;
  2769.     if (0 == strcmp(matrixName, "PAM250"))
  2770.         return 0.229;
  2771.     return(0);
  2772. }
  2773. /* matrix is a position-specific score matrix with matrixLength positions
  2774.    queryProbArray is an array containing the probability of occurrence
  2775.         of each residue in the query
  2776.    scoreArray is an array of probabilities for each score that is
  2777.         to be used as a field in return_sfp
  2778.    return_sfp is a the structure to be filled in and returned
  2779.    range is the size of scoreArray and is an upper bound on the
  2780.         difference between maximum score and minimum score in the matrix
  2781.    the routine fillSfp computes the probability of each score weighted
  2782.         by the probability of each query residue and fills those probabilities
  2783.         into scoreArray and puts scoreArray as a field in
  2784.         that in the structure that is returned
  2785.    for indexing convenience the field storing scoreArray points to the
  2786.         entry for score 0, so that referring to the -k index corresponds to
  2787.         score -k 
  2788. */
  2789. static void
  2790. RPSFillScores(Int4 **matrix, Int4 matrixLength, 
  2791.               double *queryProbArray, double *scoreArray,  
  2792.               Blast_ScoreFreq* return_sfp, Int4 range)
  2793. {
  2794.     Int4 minScore, maxScore;    /*observed minimum and maximum scores */
  2795.     Int4 i,j;                   /* indices */
  2796.     double recipLength;        /* 1/matrix length as a double */
  2797.     minScore = maxScore = 0;
  2798.     for (i = 0; i < matrixLength; i++) {
  2799.         for (j = 0 ; j < PSI_ALPHABET_SIZE; j++) {
  2800.             if (j == AMINOACID_TO_NCBISTDAA['X'])
  2801.                 continue;
  2802.             if ((matrix[i][j] > BLAST_SCORE_MIN) && 
  2803.                 (matrix[i][j] < minScore))
  2804.                 minScore = matrix[i][j];
  2805.             if (matrix[i][j] > maxScore)
  2806.                 maxScore = matrix[i][j];
  2807.         }
  2808.     }
  2809.     return_sfp->obs_min = minScore;
  2810.     return_sfp->obs_max = maxScore;
  2811.     for (i = 0; i < range; i++)
  2812.         scoreArray[i] = 0.0;
  2813.     return_sfp->sprob = &(scoreArray[-minScore]); /*center around 0*/
  2814.     recipLength = 1.0 / (double) matrixLength;
  2815.     for(i = 0; i < matrixLength; i++) {
  2816.         for (j = 0; j < PSI_ALPHABET_SIZE; j++) {
  2817.             if (j == AMINOACID_TO_NCBISTDAA['X'])
  2818.                 continue;
  2819.             if(matrix[i][j] >= minScore)
  2820.                 return_sfp->sprob[matrix[i][j]] += recipLength * 
  2821.                                                 queryProbArray[j];
  2822.         }
  2823.     }
  2824.     return_sfp->score_avg = 0;
  2825.     for(i = minScore; i <= maxScore; i++)
  2826.         return_sfp->score_avg += i * return_sfp->sprob[i];
  2827. }
  2828. /*  Given a sequence of 'length' amino acid residues, compute the
  2829.     probability of each residue and put that in the array resProb*/
  2830. static void 
  2831. RPSFillResidueProbability(Uint1 * sequence, Int4 length, double * resProb)
  2832. {
  2833.     Int4 frequency[PSI_ALPHABET_SIZE];  /*frequency of each letter*/
  2834.     Int4 i;                             /*index*/
  2835.     Int4 denominator;                   /*length not including X's*/
  2836.     denominator = length;
  2837.     for(i = 0; i < PSI_ALPHABET_SIZE; i++)
  2838.         frequency[i] = 0;
  2839.     for(i = 0; i < length; i++) {
  2840.         if (sequence[i] != AMINOACID_TO_NCBISTDAA['X'])
  2841.             frequency[sequence[i]]++;
  2842.         else
  2843.             denominator--;
  2844.     }
  2845.     for(i = 0; i < PSI_ALPHABET_SIZE; i++) {
  2846.         if (frequency[i] == 0)
  2847.             resProb[i] = 0.0;
  2848.         else
  2849.             resProb[i] = ((double) frequency[i]) /((double) denominator);
  2850.     }
  2851. }
  2852. /* Calculate a new PSSM, using composition-based statistics, for use
  2853.    with RPS BLAST. This function produces a PSSM for a single RPS DB
  2854.    sequence (of size db_seq_length) and incorporates information from 
  2855.    the RPS blast query. Each individual database sequence must call this
  2856.    function to retrieve its own PSSM. The matrix is returned (and must
  2857.    be freed elsewhere). posMatrix is the portion of the complete 
  2858.    concatenated PSSM that is specific to this DB sequence */
  2859. Int4 **
  2860. RPSCalculatePSSM(double scalingFactor, Int4 rps_query_length, 
  2861.                    Uint1 * rps_query_seq, Int4 db_seq_length, 
  2862.                    Int4 **posMatrix)
  2863. {
  2864.     double *scoreArray;         /*array of score probabilities*/
  2865.     double *resProb;            /*array of probabilities for each residue*/
  2866.     Blast_ScoreFreq * return_sfp;/*score frequency pointers to compute lambda*/
  2867.     Int4* * returnMatrix;        /*the PSSM to return */
  2868.     double initialUngappedLambda; 
  2869.     double scaledInitialUngappedLambda; 
  2870.     double correctUngappedLambda;
  2871.     double finalLambda;
  2872.     double temp;               /*intermediate variable for adjusting matrix*/
  2873.     Int4 index, inner_index; 
  2874.     resProb = (double *)malloc(PSI_ALPHABET_SIZE * sizeof(double));
  2875.     scoreArray = (double *)malloc(BLAST_SCORE_RANGE_MAX * sizeof(double));
  2876.     return_sfp = (Blast_ScoreFreq *)malloc(sizeof(Blast_ScoreFreq));
  2877.     RPSFillResidueProbability(rps_query_seq, rps_query_length, resProb);
  2878.     RPSFillScores(posMatrix, db_seq_length, resProb, scoreArray, 
  2879.                  return_sfp, BLAST_SCORE_RANGE_MAX);
  2880.     initialUngappedLambda = RPSfindUngappedLambda("BLOSUM62");
  2881.     scaledInitialUngappedLambda = initialUngappedLambda / scalingFactor;
  2882.     correctUngappedLambda = Blast_KarlinLambdaNR(return_sfp, 
  2883.                                               scaledInitialUngappedLambda);
  2884.     sfree(resProb);
  2885.     sfree(scoreArray);
  2886.     sfree(return_sfp);
  2887.     if(correctUngappedLambda == -1.0)
  2888.         return NULL;
  2889.     finalLambda = correctUngappedLambda/scaledInitialUngappedLambda;
  2890.     returnMatrix = (Int4 **)_PSIAllocateMatrix((db_seq_length+1),
  2891.                                                PSI_ALPHABET_SIZE,
  2892.                                                sizeof(Int4));
  2893.     for (index = 0; index < db_seq_length+1; index++) {
  2894.         for (inner_index = 0; inner_index < PSI_ALPHABET_SIZE; inner_index++) {
  2895.             if (posMatrix[index][inner_index] <= BLAST_SCORE_MIN || 
  2896.                 inner_index == AMINOACID_TO_NCBISTDAA['X']) {
  2897.                 returnMatrix[index][inner_index] = 
  2898.                     posMatrix[index][inner_index];
  2899.             }
  2900.             else {
  2901.                temp = ((double)(posMatrix[index][inner_index])) * finalLambda;
  2902.                returnMatrix[index][inner_index] = BLAST_Nint(temp);
  2903.            }
  2904.         }
  2905.     }
  2906.     return returnMatrix;
  2907. }
  2908. /** 
  2909.  * Computes the adjustment to the lengths of the query and database sequences
  2910.  * that is used to compensate for edge effects when computing evalues. 
  2911.  *
  2912.  * The length adjustment is an integer-valued approximation to the fixed
  2913.  * point of the function
  2914.  *
  2915.  *    f(ell) = beta + 
  2916.  *               (alpha/lambda) * (log K + log((m - ell)*(n - N ell)))
  2917.  *
  2918.  * where m is the query length n is the length of the database and N is the
  2919.  * number of sequences in the database. The values beta, alpha, lambda and
  2920.  * K are statistical, Karlin-Altschul parameters.
  2921.  * 
  2922.  * The value of the length adjustment computed by this routine, A, 
  2923.  * will always be an integer smaller than the fixed point of
  2924.  * f(ell). Usually, it will be the largest such integer.  However, the
  2925.  * computed length adjustment, A, will also be so small that 
  2926.  *
  2927.  *    K * (m - A) * (n - N * A) > MAX(m,n).
  2928.  *
  2929.  * Moreover, an iterative method is used to compute A, and under
  2930.  * unusual circumstances the iterative method may not converge. 
  2931.  *
  2932.  * @param K      the statistical parameter K
  2933.  * @param logK   the natural logarithm of K
  2934.  * @param alpha_d_lambda    the ratio of the statistical parameters 
  2935.  *                          alpha and lambda (for ungapped alignments, the
  2936.  *                          value 1/H should be used)
  2937.  * @param beta              the statistical parameter beta (for ungapped
  2938.  *                          alignments, beta == 0)
  2939.  * @param query_length      the length of the query sequence
  2940.  * @param db_length         the length of the database
  2941.  * @param db_num_seqs       the number of sequences in the database
  2942.  * @param length_adjustment the computed value of the length adjustment [out]
  2943.  *
  2944.  * @return   0 if length_adjustment is known to be the largest integer less
  2945.  *           than the fixed point of f(ell); 1 otherwise.
  2946.  */
  2947. Int4
  2948. BLAST_ComputeLengthAdjustment(double K,
  2949.                              double logK,
  2950.                              double alpha_d_lambda,
  2951.                              double beta,
  2952.                              Int4 query_length,
  2953.                              Int8 db_length,
  2954.                              Int4 db_num_seqs,
  2955.                              Int4 * length_adjustment)
  2956. {
  2957.     Int4 i;                     /* iteration index */
  2958.     const Int4 maxits = 20;     /* maximum allowed iterations */
  2959.     double m = (double) query_length;
  2960.     double n = (double) db_length;
  2961.     double N = (double) db_num_seqs;
  2962.     double ell;                 /* A float value of the length adjustment */
  2963.     double ss;                  /* effective size of the search space */
  2964.     double ell_min = 0, ell_max;   /* At each iteration i,
  2965.                                          * ell_min <= ell <= ell_max. */
  2966.     Boolean converged    = FALSE;       /* True if the iteration converged */
  2967.     double ell_next = 0;        /* Value the variable ell takes at iteration
  2968.                                  * i + 1 */
  2969.     /* Choose ell_max to be the largest nonnegative value that satisfies
  2970.      *
  2971.      *    K * (m - ell) * (n - N * ell) > MAX(m,n)
  2972.      *
  2973.      * Use quadratic formula: 2 c /( - b + sqrt( b*b - 4 * a * c )) */
  2974.     { /* scope of a, mb, and c, the coefficients in the quadratic formula
  2975.        * (the variable mb is -b) */
  2976.         double a  = N;
  2977.         double mb = m * N + n;
  2978.         double c  = n * m - MAX(m, n) / K;
  2979.         if(c < 0) {
  2980.             *length_adjustment = 0;
  2981.             return 1;
  2982.         } else {
  2983.             ell_max = 2 * c / (mb + sqrt(mb * mb - 4 * a * c));
  2984.         }
  2985.     } /* end scope of a, mb and c */
  2986.     for(i = 1; i <= maxits; i++) {      /* for all iteration indices */
  2987.         double ell_bar;         /* proposed next value of ell */
  2988.         ell      = ell_next;
  2989.         ss       = (m - ell) * (n - N * ell);
  2990.         ell_bar  = alpha_d_lambda * (logK + log(ss)) + beta;
  2991.         if(ell_bar >= ell) { /* ell is no bigger than the true fixed point */
  2992.             ell_min = ell;
  2993.             if(ell_bar - ell_min <= 1.0) {
  2994.                 converged = TRUE;
  2995.                 break;
  2996.             }
  2997.             if(ell_min == ell_max) { /* There are no more points to check */
  2998.                 break;
  2999.             }
  3000.         } else { /* else ell is greater than the true fixed point */
  3001.             ell_max = ell;
  3002.         }
  3003.         if(ell_min <= ell_bar && ell_bar <= ell_max) { 
  3004.           /* ell_bar is in range. Accept it */
  3005.             ell_next = ell_bar;
  3006.         } else { /* else ell_bar is not in range. Reject it */
  3007.             ell_next = (i == 1) ? ell_max : (ell_min + ell_max) / 2;
  3008.         }
  3009.     } /* end for all iteration indices */
  3010.     if(converged) { /* the iteration converged */
  3011.         /* If ell_fixed is the (unknown) true fixed point, then we
  3012.          * wish to set (*length_adjustment) to floor(ell_fixed).  We
  3013.          * assume that floor(ell_min) = floor(ell_fixed) */
  3014.         *length_adjustment = (Int4) ell_min;
  3015.         /* But verify that ceil(ell_min) != floor(ell_fixed) */
  3016.         ell = ceil(ell_min);
  3017.         if( ell <= ell_max ) {
  3018.           ss = (m - ell) * (n - N * ell);
  3019.           if(alpha_d_lambda * (logK + log(ss)) + beta >= ell) {
  3020.             /* ceil(ell_min) == floor(ell_fixed) */
  3021.             *length_adjustment = (Int4) ell;
  3022.           }
  3023.         }
  3024.     } else { /* else the iteration did not converge. */
  3025.         /* Use the best value seen so far */
  3026.         *length_adjustment = (Int4) ell_min;
  3027.     }
  3028.     return converged ? 0 : 1;
  3029. }
  3030. /*
  3031.  * ===========================================================================
  3032.  *
  3033.  * $Log: blast_stat.c,v $
  3034.  * Revision 1000.6  2004/06/01 18:07:50  gouriano
  3035.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.77
  3036.  *
  3037.  * Revision 1.77  2004/05/24 15:09:40  camacho
  3038.  * Fixed conflict
  3039.  *
  3040.  * Revision 1.76  2004/05/24 13:26:27  madden
  3041.  * Fix PC compiler warnings
  3042.  *
  3043.  * Revision 1.75  2004/05/20 16:29:30  madden
  3044.  * Make searchsp an Int8 consistent with rest of blast
  3045.  *
  3046.  * Revision 1.74  2004/05/19 15:34:38  dondosha
  3047.  * Moved Blast_ResComp definition from header file
  3048.  *
  3049.  * Revision 1.73  2004/05/19 14:52:03  camacho
  3050.  * 1. Added doxygen tags to enable doxygen processing of algo/blast/core
  3051.  * 2. Standardized copyright, CVS $Id string, $Log and rcsid formatting and i
  3052.  *    location
  3053.  * 3. Added use of @todo doxygen keyword
  3054.  *
  3055.  * Revision 1.72  2004/05/17 10:37:38  camacho
  3056.  * Rename BLAST_ScoreFreq, BLASTMatrixStructure and BLAST_ResComp to avoid conflicts with C toolkit
  3057.  *
  3058.  * Revision 1.71  2004/05/07 15:23:47  papadopo
  3059.  * add initialization of scale factor to ScoreBlkNew
  3060.  *
  3061.  * Revision 1.70  2004/05/06 15:59:29  camacho
  3062.  * Made Blast_KarlinBlkCalc non-static
  3063.  *
  3064.  * Revision 1.69  2004/05/06 15:05:13  camacho
  3065.  * Fix to previous commit
  3066.  *
  3067.  * Revision 1.68  2004/05/06 14:44:27  camacho
  3068.  * Made Blast_ScoreFreqDestruct non-static
  3069.  *
  3070.  * Revision 1.67  2004/05/05 21:16:24  camacho
  3071.  * Make Blast_GetStdAlphabet and Blast_ScoreFreqNew non-static
  3072.  *
  3073.  * Revision 1.66  2004/05/04 13:00:02  madden
  3074.  * Change BlastKarlinBlkStandardCalcEx to more descriptive Blast_KarlinBlkIdealCalc, make public
  3075.  *
  3076.  * Revision 1.65  2004/04/30 14:39:44  papadopo
  3077.  * 1. Remove unneeded #defines
  3078.  * 2. use BLAST_SCORE_RANGE_MAX during RPS PSSM creation instead of
  3079.  *  (possibly incompatible) RPS_SCORE_MAX
  3080.  * 3. return NULL instead of FALSE on an error
  3081.  *
  3082.  * Revision 1.64  2004/04/30 12:58:49  camacho
  3083.  * Replace RPSKarlinLambdaNR by Blast_KarlinLambdaNR
  3084.  *
  3085.  * Revision 1.63  2004/04/29 20:32:38  papadopo
  3086.  * remove RPS_SCORE_MIN, since it turned out to be a workaround for a bug that has since been fixed
  3087.  *
  3088.  * Revision 1.62  2004/04/29 19:58:03  camacho
  3089.  * Use generic matrix allocator/deallocator from blast_psi_priv.h
  3090.  *
  3091.  * Revision 1.61  2004/04/28 14:40:23  madden
  3092.  * Changes from Mike Gertz:
  3093.  * - I created the new routine BLAST_GapDecayDivisor that computes a
  3094.  *   divisor used to weight the evalue of a collection of distinct
  3095.  *   alignments.
  3096.  * - I removed  BLAST_GapDecay and BLAST_GapDecayInverse which had become
  3097.  *   redundant.
  3098.  * - I modified the BLAST_Cutoffs routine so that it uses the value
  3099.  *   returned by BLAST_GapDecayDivisor to weight evalues.
  3100.  * - I modified BLAST_SmallGapSumE, BLAST_LargeGapSumE and
  3101.  *   BLAST_UnevenGapSumE no longer refer to the gap_prob parameter.
  3102.  *   Replaced the gap_decay_rate parameter of each of these routines with
  3103.  *   a weight_divisor parameter.  Added documentation.
  3104.  *
  3105.  * Revision 1.60  2004/04/23 19:06:33  camacho
  3106.  * Do NOT use lowercase names for #defines
  3107.  *
  3108.  * Revision 1.59  2004/04/23 13:49:20  madden
  3109.  * Cleaned up ifndef in BlastKarlinLHtoK
  3110.  *
  3111.  * Revision 1.58  2004/04/23 13:21:25  madden
  3112.  * Rewrote BlastKarlinLHtoK to do the following and more:
  3113.  * 1. fix a bug whereby the wrong formula was used when high score == 1
  3114.  *    and low score == -1;
  3115.  * 2. fix a methodological error of truncating the first sum
  3116.  *    and trying to make it converge quickly by adding terms
  3117.  *    of a geometric progression, even though the geometric progression
  3118.  *    estimate is not correct in all cases;
  3119.  *    the old adjustment code is left in for historical purposes but
  3120.  *    #ifdef'd out
  3121.  * 3. Eliminate the Boolean bi_modal_score variable.  The old test that
  3122.  *    set the value of bi_modal_score would frequently fail to choose the
  3123.  *    correct value due to rounding error.
  3124.  * 4. changed numerous local variable names to make them more meaningful;
  3125.  * 5. added substantial comments to explain what the procedure
  3126.  *    is doing and what each variable represents
  3127.  *
  3128.  * Revision 1.57  2004/04/19 12:58:18  madden
  3129.  * 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
  3130.  *
  3131.  * Revision 1.56  2004/04/12 18:57:31  madden
  3132.  * Rename BLAST_ResFreq to Blast_ResFreq, make Blast_ResFreqNew, Blast_ResFreqDestruct, and Blast_ResFreqStdComp non-static
  3133.  *
  3134.  * Revision 1.55  2004/04/08 13:53:10  papadopo
  3135.  * fix doxygen warning
  3136.  *
  3137.  * Revision 1.54  2004/04/07 03:06:16  camacho
  3138.  * Added blast_encoding.[hc], refactoring blast_stat.[hc]
  3139.  *
  3140. v * Revision 1.53  2004/04/05 18:53:35  madden
  3141.  * Set dimensions if matrix from memory
  3142.  *
  3143.  * Revision 1.52  2004/04/01 14:14:02  lavr
  3144.  * Spell "occurred", "occurrence", and "occurring"
  3145.  *
  3146.  * Revision 1.51  2004/03/31 17:50:09  papadopo
  3147.  * Mike Gertz' changes for length adjustment calculations
  3148.  *
  3149.  * Revision 1.50  2004/03/11 18:52:41  camacho
  3150.  * Remove THREADS_IMPLEMENTED
  3151.  *
  3152.  * Revision 1.49  2004/03/10 18:00:06  camacho
  3153.  * Remove outdated references to blastkar
  3154.  *
  3155.  * Revision 1.48  2004/03/05 17:52:33  papadopo
  3156.  * Allow 32-bit context numbers for queries
  3157.  *
  3158.  * Revision 1.47  2004/03/04 21:07:51  papadopo
  3159.  * add RPS BLAST functionality
  3160.  *
  3161.  * Revision 1.46  2004/02/19 21:16:48  dondosha
  3162.  * Use enum type for severity argument in Blast_MessageWrite
  3163.  *
  3164.  * Revision 1.45  2003/12/05 16:03:57  camacho
  3165.  * Remove compiler warnings
  3166.  *
  3167.  * Revision 1.44  2003/11/28 22:39:11  camacho
  3168.  * + static keyword to BlastKarlinLtoH
  3169.  *
  3170.  * Revision 1.43  2003/11/28 15:03:48  camacho
  3171.  * Added static keyword to BlastKarlinLtoH
  3172.  *
  3173.  * Revision 1.42  2003/11/26 19:12:13  madden
  3174.  * code to simplify some routines and use NlmKarlinLambdaNR in place of BlastKarlinLambdaBis (following Mike Gertzs changes to blastkar.c )
  3175.  *
  3176.  * Revision 1.41  2003/11/24 23:18:32  dondosha
  3177.  * Added gap_decay_rate argument to BLAST_Cutoffs; removed BLAST_Cutoffs_simple
  3178.  *
  3179.  * Revision 1.40  2003/11/19 15:17:42  dondosha
  3180.  * Removed unused members from Karlin block structure
  3181.  *
  3182.  * Revision 1.39  2003/10/16 15:55:22  coulouri
  3183.  * fix uninitialized variables
  3184.  *
  3185.  * Revision 1.38  2003/10/16 15:52:08  coulouri
  3186.  * fix uninitialized variables
  3187.  *
  3188.  * Revision 1.37  2003/10/15 16:59:43  coulouri
  3189.  * type correctness fixes
  3190.  *
  3191.  * Revision 1.36  2003/10/02 22:08:34  dondosha
  3192.  * Corrections for one-strand translated searches
  3193.  *
  3194.  * Revision 1.35  2003/09/26 19:01:59  madden
  3195.  * Prefix ncbimath functions with BLAST_
  3196.  *
  3197.  * Revision 1.34  2003/09/09 14:21:39  coulouri
  3198.  * change blastkar.h to blast_stat.h
  3199.  *
  3200.  * Revision 1.33  2003/09/02 21:12:07  camacho
  3201.  * Fix small memory leak
  3202.  *
  3203.  * Revision 1.32  2003/08/26 15:23:51  dondosha
  3204.  * Rolled back previous change as it is not necessary any more
  3205.  *
  3206.  * Revision 1.31  2003/08/25 22:29:07  dondosha
  3207.  * Default matrix loading is defined only in C++ toolkit
  3208.  *
  3209.  * Revision 1.30  2003/08/25 18:05:41  dondosha
  3210.  * Moved assert statement after variables declarations
  3211.  *
  3212.  * Revision 1.29  2003/08/25 16:23:33  camacho
  3213.  * +Loading protein scoring matrices from utils/tables
  3214.  *
  3215.  * Revision 1.28  2003/08/11 15:01:59  dondosha
  3216.  * Added algo/blast/core to all #included headers
  3217.  *
  3218.  * Revision 1.27  2003/08/01 17:27:04  dondosha
  3219.  * Renamed external functions to avoid collisions with ncbitool library; made other functions static
  3220.  *
  3221.  * Revision 1.26  2003/07/31 18:48:49  dondosha
  3222.  * Use Int4 instead of BLAST_Score
  3223.  *
  3224.  * Revision 1.25  2003/07/31 17:48:06  madden
  3225.  * Remove call to FileLength
  3226.  *
  3227.  * Revision 1.24  2003/07/31 14:31:41  camacho
  3228.  * Replaced Char for char
  3229.  *
  3230.  * Revision 1.23  2003/07/31 14:19:28  camacho
  3231.  * Replaced FloatHi for double
  3232.  *
  3233.  * Revision 1.22  2003/07/31 00:32:37  camacho
  3234.  * Eliminated Ptr notation
  3235.  *
  3236.  * Revision 1.21  2003/07/30 22:08:09  dondosha
  3237.  * Process of finding path to the matrix is moved out of the blast library
  3238.  *
  3239.  * Revision 1.20  2003/07/30 21:52:41  camacho
  3240.  * Follow conventional structure definition
  3241.  *
  3242.  * Revision 1.19  2003/07/30 19:39:14  camacho
  3243.  * Remove PNTRs
  3244.  *
  3245.  * Revision 1.18  2003/07/30 17:58:25  dondosha
  3246.  * Changed ValNode to ListNode
  3247.  *
  3248.  * Revision 1.17  2003/07/30 17:15:00  dondosha
  3249.  * Minor fixes for very strict compiler warnings
  3250.  *
  3251.  * Revision 1.16  2003/07/30 17:06:40  camacho
  3252.  * Removed old cvs log
  3253.  *
  3254.  * Revision 1.15  2003/07/30 16:32:02  madden
  3255.  * Use ansi functions when possible
  3256.  *
  3257.  * Revision 1.14  2003/07/30 15:29:37  madden
  3258.  * Removed MemSets
  3259.  *
  3260.  * Revision 1.13  2003/07/29 14:42:31  coulouri
  3261.  * use strdup() instead of StringSave()
  3262.  *
  3263.  * Revision 1.12  2003/07/28 19:04:15  camacho
  3264.  * Replaced all MemNews for calloc
  3265.  *
  3266.  * Revision 1.11  2003/07/28 03:41:49  camacho
  3267.  * Use f{open,close,gets} instead of File{Open,Close,Gets}
  3268.  *
  3269.  * Revision 1.10  2003/07/25 21:12:28  coulouri
  3270.  * remove constructions of the form "return sfree();" and "a=sfree(a);"
  3271.  *
  3272.  * Revision 1.9  2003/07/25 18:58:43  camacho
  3273.  * Avoid using StrUpper and StringHasNoText
  3274.  *
  3275.  * Revision 1.8  2003/07/25 17:25:43  coulouri
  3276.  * in progres:
  3277.  *  * use malloc/calloc/realloc instead of Malloc/Calloc/Realloc
  3278.  *  * add sfree() macro and __sfree() helper function to util.[ch]
  3279.  *  * use sfree() instead of MemFree()
  3280.  *
  3281.  * Revision 1.7  2003/07/24 22:37:33  dondosha
  3282.  * Removed some unused function parameters
  3283.  *
  3284.  * Revision 1.6  2003/07/24 22:01:44  camacho
  3285.  * Removed unused variables
  3286.  *
  3287.  * Revision 1.5  2003/07/24 21:31:06  dondosha
  3288.  * Changed to calls to BlastConstructErrorMessage to API from blast_message.h
  3289.  *
  3290.  * Revision 1.4  2003/07/24 20:38:30  dondosha
  3291.  * Removed LIBCALL etc. macros
  3292.  *
  3293.  * Revision 1.3  2003/07/24 17:37:46  dondosha
  3294.  * Removed MakeBlastScore function that is dependent on objalign.h
  3295.  *
  3296.  * Revision 1.2  2003/07/24 15:50:49  dondosha
  3297.  * Commented out mutex operations
  3298.  *
  3299.  * Revision 1.1  2003/07/24 15:18:09  dondosha
  3300.  * Copy of blastkar.h from ncbitools library, stripped of dependency on ncbiobj
  3301.  *
  3302.  * ===========================================================================
  3303.  */