3 #include "objscore.h"
\r
7 #define COMPARE_3_52 0
\r
8 #define BRUTE_LETTERS 0
\r
10 static SCORE ScoreColLetters(const MSA &msa, unsigned uColIndex)
\r
12 SCOREMATRIX &Mx = *g_ptrScoreMatrix;
\r
13 const unsigned uSeqCount = msa.GetSeqCount();
\r
16 SCORE BruteScore = 0;
\r
17 for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1)
\r
19 unsigned uLetter1 = msa.GetLetterEx(uSeqIndex1, uColIndex);
\r
20 if (uLetter1 >= g_AlphaSize)
\r
22 WEIGHT w1 = msa.GetSeqWeight(uSeqIndex1);
\r
23 for (unsigned uSeqIndex2 = uSeqIndex1 + 1; uSeqIndex2 < uSeqCount; ++uSeqIndex2)
\r
25 unsigned uLetter2 = msa.GetLetterEx(uSeqIndex2, uColIndex);
\r
26 if (uLetter2 >= g_AlphaSize)
\r
28 WEIGHT w2 = msa.GetSeqWeight(uSeqIndex2);
\r
29 BruteScore += w1*w2*Mx[uLetter1][uLetter2];
\r
35 for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1)
\r
37 WEIGHT w = msa.GetSeqWeight(uSeqIndex1);
\r
44 memset(Freqs, 0, sizeof(Freqs));
\r
46 for (unsigned uSeqIndex1 = 0; uSeqIndex1 < uSeqCount; ++uSeqIndex1)
\r
48 unsigned uLetter = msa.GetLetterEx(uSeqIndex1, uColIndex);
\r
49 if (uLetter >= g_AlphaSize)
\r
51 WEIGHT w = msa.GetSeqWeight(uSeqIndex1);
\r
52 Freqs[uLetter] += w;
\r
53 Score -= w*w*Mx[uLetter][uLetter];
\r
56 for (unsigned uLetter1 = 0; uLetter1 < g_AlphaSize; ++uLetter1)
\r
58 const FCOUNT f1 = Freqs[uLetter1];
\r
59 Score += f1*f1*Mx[uLetter1][uLetter1];
\r
60 for (unsigned uLetter2 = uLetter1 + 1; uLetter2 < g_AlphaSize; ++uLetter2)
\r
62 const FCOUNT f2 = Freqs[uLetter2];
\r
63 Score += 2*f1*f2*Mx[uLetter1][uLetter2];
\r
68 assert(BTEq(BruteScore, Score));
\r
73 static SCORE ScoreLetters(const MSA &msa, const unsigned Edges[],
\r
74 unsigned uEdgeCount)
\r
76 const unsigned uSeqCount = msa.GetSeqCount();
\r
77 const unsigned uColCount = msa.GetColCount();
\r
81 for (unsigned uEdgeIndex = 0; uEdgeIndex < uEdgeCount; ++uEdgeIndex)
\r
83 const unsigned uColIndex = Edges[uEdgeIndex];
\r
84 assert(uColIndex < uColCount);
\r
85 Score += ScoreColLetters(msa, uColIndex);
\r
90 void GetLetterScores(const MSA &msa, SCORE Scores[])
\r
92 const unsigned uColCount = msa.GetColCount();
\r
93 for (unsigned uColIndex = 0; uColIndex < uColCount; ++uColIndex)
\r
94 Scores[uColIndex] = ScoreColLetters(msa, uColIndex);
\r
98 const MSA &msa1, const PWPath &Path1, const unsigned Edges1[], unsigned uEdgeCount1,
\r
99 const MSA &msa2, const PWPath &Path2, const unsigned Edges2[], unsigned uEdgeCount2)
\r
103 Log("============DiffObjScore===========\n");
\r
108 for (unsigned i = 0; i < uEdgeCount1; ++i)
\r
109 Log(" %u", Edges1[i]);
\r
114 for (unsigned i = 0; i < uEdgeCount2; ++i)
\r
115 Log(" %u", Edges2[i]);
\r
121 extern SCORE g_SPScoreLetters;
\r
122 extern SCORE g_SPScoreGaps;
\r
123 SCORE SP1 = ObjScoreSP(msa1);
\r
124 SCORE SPLetters1 = g_SPScoreLetters;
\r
125 SCORE SPGaps1 = g_SPScoreGaps;
\r
127 SCORE SP2 = ObjScoreSP(msa2);
\r
128 SCORE SPLetters2 = g_SPScoreLetters;
\r
129 SCORE SPGaps2 = g_SPScoreGaps;
\r
130 SCORE SPDiffLetters = SPLetters2 - SPLetters1;
\r
131 SCORE SPDiffGaps = SPGaps2 - SPGaps1;
\r
132 SCORE SPDiff = SPDiffLetters + SPDiffGaps;
\r
135 SCORE Letters1 = ScoreLetters(msa1, Edges1, uEdgeCount1);
\r
136 SCORE Letters2 = ScoreLetters(msa2, Edges2, uEdgeCount2);
\r
138 SCORE Gaps1 = ScoreGaps(msa1, Edges1, uEdgeCount1);
\r
139 SCORE Gaps2 = ScoreGaps(msa2, Edges2, uEdgeCount2);
\r
141 SCORE DiffLetters = Letters2 - Letters1;
\r
142 SCORE DiffGaps = Gaps2 - Gaps1;
\r
143 SCORE Diff = DiffLetters + DiffGaps;
\r
146 Log("ObjScoreSP Letters1=%.4g Letters2=%.4g DiffLetters=%.4g\n",
\r
147 SPLetters1, SPLetters2, SPDiffLetters);
\r
149 Log("DiffObjScore Letters1=%.4g Letters2=%.4g DiffLetters=%.4g\n",
\r
150 Letters1, Letters2, DiffLetters);
\r
152 Log("ObjScoreSP Gaps1=%.4g Gaps2=%.4g DiffGaps=%.4g\n",
\r
153 SPGaps1, SPGaps2, SPDiffGaps);
\r
155 Log("DiffObjScore Gaps1=%.4g Gaps2=%.4g DiffGaps=%.4g\n",
\r
156 Gaps1, Gaps2, DiffGaps);
\r
158 Log("SP diff=%.4g DiffObjScore Diff=%.4g\n", SPDiff, Diff);
\r