4 void WriteChimeFileHdr(FILE *f)
\r
30 void WriteChimeHit(FILE *f, const ChimeHit2 &Hit)
\r
37 fprintf(f, "0.0000"); // 0
\r
40 "\t%s", Hit.QLabel.c_str()); // 1
\r
63 fprintf(f, "%.4f", Hit.Score); // 0
\r
66 fputs(Hit.QLabel.c_str(), f); // 1
\r
69 fputs(Hit.ALabel.c_str(), f); // 2
\r
72 fputs(Hit.BLabel.c_str(), f); // 3
\r
74 fprintf(f, "\t%.1f", Hit.PctIdQM); // 4
\r
75 fprintf(f, "\t%.1f", Hit.PctIdQA); // 5
\r
76 fprintf(f, "\t%.1f", Hit.PctIdQB); // 6
\r
77 fprintf(f, "\t%.1f", Hit.PctIdAB); // 7
\r
78 fprintf(f, "\t%.1f", Hit.PctIdQT); // 8
\r
80 fprintf(f, "\t%u", Hit.CS_LY); // 9
\r
81 fprintf(f, "\t%u", Hit.CS_LN); // 10
\r
82 fprintf(f, "\t%u", Hit.CS_LA); // 11
\r
84 fprintf(f, "\t%u", Hit.CS_RY); // 12
\r
85 fprintf(f, "\t%u", Hit.CS_RN); // 13
\r
86 fprintf(f, "\t%u", Hit.CS_RA); // 14
\r
88 fprintf(f, "\t%.2f", Hit.Div); // 15
\r
90 fprintf(f, "\t%c", yon(Hit.Accept())); // 16
\r
94 unsigned GetUngappedLength(const byte *Seq, unsigned L)
\r
97 for (unsigned i = 0; i < L; ++i)
\r
103 void WriteChimeHitX(FILE *f, const ChimeHit2 &Hit)
\r
108 if (Hit.Div <= 0.0)
\r
111 const string &Q3 = Hit.Q3;
\r
112 const string &A3 = Hit.A3;
\r
113 const string &B3 = Hit.B3;
\r
115 const byte *Q3Seq = (const byte *) Q3.c_str();
\r
116 const byte *A3Seq = (const byte *) A3.c_str();
\r
117 const byte *B3Seq = (const byte *) B3.c_str();
\r
120 unsigned ColCount = SIZE(Q3);
\r
121 asserta(SIZE(A3) == ColCount && SIZE(B3) == ColCount);
\r
123 unsigned LQ = GetUngappedLength(Q3Seq, ColCount);
\r
124 unsigned LA = GetUngappedLength(A3Seq, ColCount);
\r
125 unsigned LB = GetUngappedLength(B3Seq, ColCount);
\r
128 fprintf(f, "------------------------------------------------------------------------\n");
\r
129 fprintf(f, "Query (%5u nt) %s\n", LQ, Hit.QLabel.c_str());
\r
130 fprintf(f, "ParentA (%5u nt) %s\n", LA, Hit.ALabel.c_str());
\r
131 fprintf(f, "ParentB (%5u nt) %s\n", LB, Hit.BLabel.c_str());
\r
133 // Strip terminal gaps in query
\r
134 unsigned FromCol = UINT_MAX;
\r
135 unsigned ToCol = UINT_MAX;
\r
136 for (unsigned Col = 0; Col < ColCount; ++Col)
\r
138 if (!isgap(Q3Seq[Col]))
\r
140 if (FromCol == UINT_MAX)
\r
149 for (unsigned Col = 0; Col < FromCol; ++Col)
\r
151 if (!isgap(A3Seq[Col]))
\r
153 if (!isgap(B3Seq[Col]))
\r
157 unsigned Range = ToCol - FromCol + 1;
\r
158 unsigned RowCount = (Range + 79)/80;
\r
159 unsigned RowFromCol = FromCol;
\r
160 for (unsigned RowIndex = 0; RowIndex < RowCount; ++RowIndex)
\r
163 unsigned RowToCol = RowFromCol + 79;
\r
164 if (RowToCol > ToCol)
\r
168 fprintf(f, "A %5u ", APos + 1);
\r
169 for (unsigned Col = RowFromCol; Col <= RowToCol; ++Col)
\r
171 char q = Q3Seq[Col];
\r
172 char a = A3Seq[Col];
\r
175 fprintf(f, "%c", a);
\r
179 fprintf(f, " %u\n", APos);
\r
182 fprintf(f, "Q %5u ", QPos + 1);
\r
183 for (unsigned Col = RowFromCol; Col <= RowToCol; ++Col)
\r
185 char q = Q3Seq[Col];
\r
186 fprintf(f, "%c", q);
\r
190 fprintf(f, " %u\n", QPos);
\r
193 fprintf(f, "B %5u ", BPos + 1);
\r
194 for (unsigned Col = RowFromCol; Col <= RowToCol; ++Col)
\r
196 char q = Q3Seq[Col];
\r
197 char b = B3Seq[Col];
\r
200 fprintf(f, "%c", b);
\r
204 fprintf(f, " %u\n", BPos);
\r
207 fprintf(f, "Diffs ");
\r
208 for (unsigned Col = RowFromCol; Col <= RowToCol; ++Col)
\r
210 char q = Q3Seq[Col];
\r
211 char a = A3Seq[Col];
\r
212 char b = B3Seq[Col];
\r
215 if (isgap(q) || isgap(a) || isgap(b))
\r
217 else if (Col < Hit.ColXLo)
\r
219 if (q == a && q == b)
\r
221 else if (q == a && q != b)
\r
223 else if (q == b && q != a)
\r
225 else if (a == b && q != a)
\r
230 else if (Col > Hit.ColXHi)
\r
232 if (q == a && q == b)
\r
234 else if (q == b && q != a)
\r
236 else if (q == a && q != b)
\r
238 else if (a == b && q != a)
\r
244 fprintf(f, "%c", c);
\r
249 fprintf(f, "Votes ");
\r
250 for (unsigned Col = RowFromCol; Col <= RowToCol; ++Col)
\r
252 char q = Q3Seq[Col];
\r
253 char a = A3Seq[Col];
\r
254 char b = B3Seq[Col];
\r
256 bool PrevGap = Col > 0 && (isgap(Q3Seq[Col-1]) || isgap(A3Seq[Col-1]) || isgap(B3Seq[Col-1]));
\r
257 bool NextGap = Col+1 < ColCount && (isgap(Q3Seq[Col+1]) || isgap(A3Seq[Col+1]) || isgap(B3Seq[Col+1]));
\r
260 if (isgap(q) || isgap(a) || isgap(b) || PrevGap || NextGap)
\r
262 else if (Col < Hit.ColXLo)
\r
264 if (q == a && q == b)
\r
266 else if (q == a && q != b)
\r
268 else if (q == b && q != a)
\r
273 else if (Col > Hit.ColXHi)
\r
275 if (q == a && q == b)
\r
277 else if (q == b && q != a)
\r
279 else if (q == a && q != b)
\r
285 fprintf(f, "%c", c);
\r
290 fprintf(f, "Model ");
\r
291 for (unsigned Col = RowFromCol; Col <= RowToCol; ++Col)
\r
293 if (Col < Hit.ColXLo)
\r
295 else if (Col >= Hit.ColXLo && Col <= Hit.ColXHi)
\r
307 double PctIdBestP = max(Hit.PctIdQA, Hit.PctIdQB);
\r
308 double Div = (Hit.PctIdQM - PctIdBestP)*100.0/PctIdBestP;
\r
310 unsigned LTot = Hit.CS_LY + Hit.CS_LN + Hit.CS_LA;
\r
311 unsigned RTot = Hit.CS_RY + Hit.CS_RN + Hit.CS_RA;
\r
313 double PctL = Pct(Hit.CS_LY, LTot);
\r
314 double PctR = Pct(Hit.CS_RY, RTot);
\r
317 "Ids. QA %.1f%%, QB %.1f%%, AB %.1f%%, QModel %.1f%%, Div. %+.1f%%\n",
\r
325 "Diffs Left %u: N %u, A %u, Y %u (%.1f%%); Right %u: N %u, A %u, Y %u (%.1f%%), Score %.4f\n",
\r
326 LTot, Hit.CS_LN, Hit.CS_LA, Hit.CS_LY, PctL,
\r
327 RTot, Hit.CS_RN, Hit.CS_RA, Hit.CS_RY, PctR,
\r