Next version of JABA
[jabaws.git] / binaries / src / muscle / fastscorepath2.cpp
1 #include "muscle.h"\r
2 #include "profile.h"\r
3 #include "pwpath.h"\r
4 \r
5 SCORE FastScorePath2(const ProfPos *PA, unsigned uLengthA,\r
6   const ProfPos *PB, unsigned uLengthB, const PWPath &Path)\r
7         {\r
8         const unsigned uEdgeCount = Path.GetEdgeCount();\r
9         Log("Edge  SS     PLA   PLB   Match     Gap    Total\n");\r
10         Log("----  --     ---   ---   -----     ---    -----\n");\r
11         char cType = 'S';\r
12         SCORE scoreTotal = 0;\r
13         for (unsigned uEdgeIndex = 0; uEdgeIndex < uEdgeCount; ++uEdgeIndex)\r
14                 {\r
15                 const PWEdge &Edge = Path.GetEdge(uEdgeIndex);\r
16                 const char cPrevType = cType;\r
17                 cType = Edge.cType;\r
18                 const unsigned uPrefixLengthA = Edge.uPrefixLengthA;\r
19                 const unsigned uPrefixLengthB = Edge.uPrefixLengthB;\r
20                 bool bGap = false;\r
21                 bool bMatch = false;\r
22                 SCORE scoreGap = 0;\r
23                 SCORE scoreMatch = 0;\r
24 \r
25                 switch (cType)\r
26                         {\r
27                 case 'M':\r
28                         {\r
29                         if (0 == uPrefixLengthA || 0 == uPrefixLengthB)\r
30                                 Quit("FastScorePath2, M zero length");\r
31 \r
32                         const ProfPos &PPA = PA[uPrefixLengthA - 1];\r
33                         const ProfPos &PPB = PB[uPrefixLengthB - 1];\r
34 \r
35                         bMatch = true;\r
36                         scoreMatch = ScoreProfPos2(PPA, PPB);\r
37 \r
38                         if ('D' == cPrevType)\r
39                                 {\r
40                                 bGap = true;\r
41                                 assert(uPrefixLengthA > 1);\r
42                                 scoreGap = PA[uPrefixLengthA-2].m_scoreGapClose;\r
43                                 }\r
44                         else if ('I' == cPrevType)\r
45                                 {\r
46                                 bGap = true;\r
47                                 assert(uPrefixLengthB > 1);\r
48                                 scoreGap = PB[uPrefixLengthB-2].m_scoreGapClose;\r
49                                 }\r
50                         break;\r
51                         }\r
52 \r
53                 case 'D':\r
54                         {\r
55                         if (0 == uPrefixLengthA)\r
56                                 Quit("FastScorePath2, D zero length");\r
57 \r
58                         const ProfPos &PPA = PA[uPrefixLengthA - 1];\r
59                         bGap = true;\r
60                         switch (cPrevType)\r
61                                 {\r
62                         case 'S':\r
63                                 scoreGap = PPA.m_scoreGapOpen;\r
64                                 break;\r
65                         case 'M':\r
66                                 scoreGap = PPA.m_scoreGapOpen;\r
67                                 break;\r
68                         case 'D':\r
69 //                              scoreGap = g_scoreGapExtend;\r
70                                 scoreGap = 0;\r
71                                 break;\r
72                         case 'I':\r
73                                 Quit("FastScorePath2 DI");\r
74                                 }\r
75                         break;\r
76                         }\r
77 \r
78                 case 'I':\r
79                         {\r
80                         if (0 == uPrefixLengthB)\r
81                                 Quit("FastScorePath2, I zero length");\r
82 \r
83                         const ProfPos &PPB = PB[uPrefixLengthB - 1];\r
84                         bGap = true;\r
85                         switch (cPrevType)\r
86                                 {\r
87                         case 'S':\r
88                                 scoreGap = PPB.m_scoreGapOpen;\r
89                                 break;\r
90                         case 'M':\r
91                                 scoreGap = PPB.m_scoreGapOpen;\r
92                                 break;\r
93                         case 'I':\r
94                                 scoreGap = 0;\r
95 //                              scoreGap = g_scoreGapExtend;\r
96                                 break;\r
97                         case 'D':\r
98                                 Quit("FastScorePath2 DI");\r
99                                 }\r
100                         break;\r
101                         }\r
102 \r
103                 case 'U':\r
104                         {\r
105                         Quit("FastScorePath2 U");\r
106                         }\r
107 \r
108                 default:\r
109                         Quit("FastScorePath2: invalid type %c", cType);\r
110                         }\r
111 \r
112                 Log("%4u  %c%c  %4u  %4u  ", uEdgeIndex, cPrevType, cType,\r
113                   uPrefixLengthA, uPrefixLengthB);\r
114                 if (bMatch)\r
115                         Log("%7.1f  ", scoreMatch);\r
116                 else\r
117                         Log("         ");\r
118                 if (bGap)\r
119                         Log("%7.1f  ", scoreGap);\r
120                 else\r
121                         Log("         ");\r
122                 SCORE scoreEdge = scoreMatch + scoreGap;\r
123                 scoreTotal += scoreEdge;\r
124                 Log("%7.1f  %7.1f", scoreEdge, scoreTotal);\r
125                 Log("\n");\r
126                 }\r
127 \r
128         SCORE scoreGap = 0;\r
129 //      if (!g_bTermGapsHalf)\r
130                 switch (cType)\r
131                         {\r
132                 case 'M':\r
133                         scoreGap = 0;\r
134                         break;\r
135 \r
136                 case 'D':\r
137                         {\r
138                         const ProfPos &LastPPA = PA[uLengthA - 1];\r
139                         scoreGap = LastPPA.m_scoreGapClose;\r
140                         break;\r
141                         }\r
142 \r
143                 case 'I':\r
144                         {\r
145                         const ProfPos &LastPPB = PB[uLengthB - 1];\r
146                         scoreGap = LastPPB.m_scoreGapClose;\r
147                         break;\r
148                         }\r
149 \r
150                 case 'U':\r
151                         Quit("Unaligned regions not supported");\r
152 \r
153                 case 'S':\r
154                         break;\r
155 \r
156                 default:\r
157                         Quit("Invalid type %c", cType);\r
158                         }\r
159 \r
160         Log("      %cE  %4u  %4u           %7.1f\n", cType, uLengthA, uLengthB, scoreGap);\r
161         scoreTotal += scoreGap;\r
162 \r
163         Log("Total = %g\n", scoreTotal);\r
164         return scoreTotal;\r
165         }\r