1 //uchime by Robert C. Edgar http://drive5.com/uchime This code is donated to the public domain.
\r
8 void Make3Way(const SeqData &QSD, const SeqData &ASD, const SeqData &BSD,
\r
9 const string &PathQA, const string &PathQB,
\r
10 string &Q3, string &A3, string &B3)
\r
20 for (unsigned i = 0; i < SIZE(PathQA); ++i)
\r
23 if (c == 'M' || c == 'D')
\r
25 if (c == 'M' || c == 'I')
\r
28 asserta(QLen == QSD.L);
\r
29 asserta(ALen == ASD.L);
\r
34 for (unsigned i = 0; i < SIZE(PathQB); ++i)
\r
37 if (c == 'M' || c == 'D')
\r
39 if (c == 'M' || c == 'I')
\r
42 asserta(QLen == QSD.L);
\r
43 asserta(BLen == BSD.L);
\r
47 const byte *Q = QSD.Seq;
\r
48 const byte *A = ASD.Seq;
\r
49 const byte *B = BSD.Seq;
\r
51 unsigned LQ = QSD.L;
\r
52 unsigned LA = ASD.L;
\r
53 unsigned LB = BSD.L;
\r
55 vector<unsigned> InsertCountsA(LQ+1, 0);
\r
57 for (unsigned i = 0; i < SIZE(PathQA); ++i)
\r
60 if (c == 'M' || c == 'D')
\r
65 asserta(QPos <= LQ);
\r
66 ++(InsertCountsA[QPos]);
\r
70 vector<unsigned> InsertCountsB(LQ+1, 0);
\r
72 for (unsigned i = 0; i < SIZE(PathQB); ++i)
\r
75 if (c == 'M' || c == 'D')
\r
80 asserta(QPos <= LQ);
\r
81 ++(InsertCountsB[QPos]);
\r
85 vector<unsigned> InsertCounts;
\r
86 for (unsigned i = 0; i <= LQ; ++i)
\r
88 unsigned is = max(InsertCountsA[i], InsertCountsB[i]);
\r
89 InsertCounts.push_back(is);
\r
92 for (unsigned i = 0; i < LQ; ++i)
\r
94 for (unsigned k = 0; k < InsertCounts[i]; ++k)
\r
97 Q3.push_back(toupper(Q[i]));
\r
99 for (unsigned k = 0; k < InsertCounts[LQ]; ++k)
\r
106 for (unsigned i = 0; i < SIZE(PathQA); ++i)
\r
108 char c = PathQA[i];
\r
109 if (c == 'M' || c == 'D')
\r
111 unsigned isq = InsertCounts[QPos];
\r
112 asserta(is <= isq);
\r
113 for (unsigned i = 0; i < InsertCounts[QPos]-is; ++i)
\r
120 asserta(APos < LA);
\r
121 A3.push_back(toupper(A[APos++]));
\r
128 asserta(APos < LA);
\r
129 A3.push_back(toupper(A[APos++]));
\r
132 asserta(is <= InsertCounts[LQ]);
\r
133 for (unsigned k = 0; k < InsertCounts[LQ]-is; ++k)
\r
135 asserta(QPos == LQ);
\r
136 asserta(APos == LA);
\r
142 for (unsigned i = 0; i < SIZE(PathQB); ++i)
\r
144 char c = PathQB[i];
\r
145 if (c == 'M' || c == 'D')
\r
147 asserta(is <= InsertCounts[QPos]);
\r
148 for (unsigned i = 0; i < InsertCounts[QPos]-is; ++i)
\r
155 asserta(BPos < LB);
\r
156 B3.push_back(toupper(B[BPos++]));
\r
163 asserta(BPos < LB);
\r
164 B3.push_back(toupper(B[BPos++]));
\r
167 asserta(is <= InsertCounts[LQ]);
\r
168 for (unsigned k = 0; k < InsertCounts[LQ]-is; ++k)
\r
170 asserta(APos == LA);
\r
171 asserta(BPos == LB);
\r
173 asserta(SIZE(Q3) == SIZE(A3));
\r
174 asserta(SIZE(Q3) == SIZE(B3));
\r