1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#include "muscle.h"
#include "profile.h"
// Original:
//HYDROPHILIC_CONTEXT 0 6 -0.3969495574
//HYDROPHILIC_CONTEXT 1 6 -0.9407126603
//HYDROPHILIC_CONTEXT 2 6 -0.4968150972
//HYDROPHILIC_CONTEXT 3 6 -0.271646023
//HYDROPHILIC_CONTEXT 4 6 0.006990406416
//HYDROPHILIC_CONTEXT 5 6 0.1381111256
//HYDROPHILIC_CONTEXT 6 6 0.2541439872
// Blosum62:
//HYDROPHILIC_CONTEXT 0 6 -0.2448419585
//HYDROPHILIC_CONTEXT 1 6 -0.8734889946
//HYDROPHILIC_CONTEXT 2 6 -0.5724336598
//HYDROPHILIC_CONTEXT 3 6 -0.2670439975
//HYDROPHILIC_CONTEXT 4 6 0.004844647323
//HYDROPHILIC_CONTEXT 5 6 0.1812057148
//HYDROPHILIC_CONTEXT 6 6 0.1036540864
static SCORE Factors[7] =
{
(SCORE) -0.2448419585,
(SCORE) -0.8734889946,
(SCORE) -0.5724336598,
(SCORE) -0.2670439975,
(SCORE) 0.004844647323,
(SCORE) 0.1812057148,
(SCORE) 0.1036540864
};
static bool Hydrophilic[20] =
{
false, // A
false, // C
true, // D
true, // E
false, // F
true, // G
false, // H
false, // I
true, // K
false, // L
false, // M
true, // N
true, // P
true, // Q
true, // R
true, // S
false, // T
false, // V
false, // Y
false, // W
};
bool IsHydrophilic(const FCOUNT fcCounts[])
{
for (unsigned uLetter = 0; uLetter < 20; ++uLetter)
if (fcCounts[uLetter] > 0.0 && Hydrophilic[uLetter])
return false;
return true;
}
static double HydrophilicFraction(const FCOUNT fcCounts[])
{
double TotalAll = 0.0;
double TotalHydrophilic = 0.0;
for (unsigned uLetter = 0; uLetter < 20; ++uLetter)
{
FCOUNT Freq = fcCounts[uLetter];
TotalAll += Freq;
if (Hydrophilic[uLetter])
TotalHydrophilic += Freq;
}
return TotalHydrophilic / TotalAll;
}
void TomHydro(ProfPos *Prof, unsigned uLength)
{
if (ALPHA_Amino != g_Alpha)
return;
if (uLength < 6)
return;
for (unsigned uColIndex = 3; uColIndex < uLength - 2; ++uColIndex)
{
// 6-residue window:
// xxxxxx
// AARNCARNGTAGCATNAC
// AARN----------TNAC
double dCount = 0.0;
for (unsigned uColIndexW = uColIndex - 3; uColIndexW < uColIndex + 3;
++uColIndexW)
{
const ProfPos &PP = Prof[uColIndexW];
dCount += HydrophilicFraction(PP.m_fcCounts);
}
// Round to nearest integer
unsigned uCount = (unsigned) (dCount + 0.5);
if (uCount > 6)
uCount = 6;
SCORE dFactor = Factors[uCount];
ProfPos &PP = Prof[uColIndex];
PP.m_scoreGapOpen += dFactor;
PP.m_scoreGapClose += dFactor;
}
}
|