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