+++ /dev/null
-#include "muscle.h"\r
-#include "msa.h"\r
-#include <math.h>\r
-\r
-// "Standard" NJ distance: the Kimura measure.\r
-// This is defined to be:\r
-//\r
-// log_e(1 - p - p*p/5)\r
-//\r
-// where p is the fraction of residues that differ, i.e.:\r
-//\r
-// p = (1 - fractional_conservation)\r
-//\r
-// This measure is infinite for p = 0.8541 and is considered\r
-// unreliable for p >= 0.75 (according to the ClustalW docs).\r
-// ClustalW uses a table lookup for values > 0.75.\r
-// The following table was copied from the ClustalW file dayhoff.h.\r
-\r
-static int dayhoff_pams[]={\r
- 195, /* 75.0% observed d; 195 PAMs estimated = 195% estimated d */\r
- 196, /* 75.1% observed d; 196 PAMs estimated */\r
- 197, 198, 199, 200, 200, 201, 202, 203, \r
- 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, \r
- 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, \r
- 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, \r
- 234, 236, 237, 238, 239, 240, 241, 243, 244, 245, \r
- 246, 248, 249, 250, /* 250 PAMs = 80.3% observed d */ \r
- 252, 253, 254, 255, 257, 258, \r
- 260, 261, 262, 264, 265, 267, 268, 270, 271, 273, \r
- 274, 276, 277, 279, 281, 282, 284, 285, 287, 289, \r
- 291, 292, 294, 296, 298, 299, 301, 303, 305, 307, \r
- 309, 311, 313, 315, 317, 319, 321, 323, 325, 328, \r
- 330, 332, 335, 337, 339, 342, 344, 347, 349, 352, \r
- 354, 357, 360, 362, 365, 368, 371, 374, 377, 380, \r
- 383, 386, 389, 393, 396, 399, 403, 407, 410, 414, \r
- 418, 422, 426, 430, 434, 438, 442, 447, 451, 456, \r
- 461, 466, 471, 476, 482, 487, 493, 498, 504, 511, \r
- 517, 524, 531, 538, 545, 553, 560, 569, 577, 586, \r
- 595, 605, 615, 626, 637, 649, 661, 675, 688, 703, \r
- 719, 736, 754, 775, 796, 819, 845, 874, 907, 945,\r
- /* 92.9% observed; 945 PAMs */ \r
- 988 /* 93.0% observed; 988 PAMs */\r
-};\r
-static int iTableEntries = sizeof(dayhoff_pams)/sizeof(dayhoff_pams[0]);\r
-\r
-double KimuraDist(double dPctId)\r
- {\r
- double p = 1 - dPctId;\r
-// Typical case: use Kimura's empirical formula\r
- if (p < 0.75)\r
- return -log(1 - p - (p*p)/5);\r
-\r
-// Per ClustalW, return 10.0 for anything over 93%\r
- if (p > 0.93)\r
- return 10.0;\r
-\r
-// If p >= 0.75, use table lookup\r
- assert(p <= 1 && p >= 0.75);\r
-// Thanks for Michael Hoel for pointing out a bug\r
-// in the table index calculation in versions <= 3.52.\r
- int iTableIndex = (int) ((p - 0.75)*1000 + 0.5);\r
- if (iTableIndex < 0 || iTableIndex >= iTableEntries)\r
- Quit("Internal error in MSADistKimura::ComputeDist");\r
-\r
- return dayhoff_pams[iTableIndex] / 100.0;\r
- }\r
-\r
-//double MSADistKimura::ComputeDist(const MSA &msa, unsigned uSeqIndex1,\r
-// unsigned uSeqIndex2)\r
-// {\r
-// double dPctId = msa.GetPctIdentityPair(uSeqIndex1, uSeqIndex2);\r
-// return KimuraDist(dPctId);\r
-// }\r
-\r
-double KimuraDistToPctId(double dKimuraDist)\r
- {\r
-// Solve quadratic equation\r
- const double a = 0.2;\r
- const double b = 1;\r
- const double c = 1.0 - exp(-dKimuraDist);\r
- const double p = (-b + sqrt(b*b + 4*a*c))/(2*a);\r
- return 1 - p;\r
- }\r
-\r
-double PctIdToHeightKimura(double dPctId)\r
- {\r
- return KimuraDist(dPctId);\r
- }\r