44
55#include < chrono>
66#include < functional>
7+ #include < tbb/parallel_for.h>
78
89
910void msa::progressive::getProgressivePairs (std::vector<std::pair<NodePair,int >>& alnOrder, std::stack<Node*> postStack, int grpID, int mode) {
@@ -190,6 +191,43 @@ void msa::progressive::progressiveAlignment(Tree *T, SequenceDB *database, Optio
190191 }
191192}
192193
194+ void msa::progressive::updateAlignment (Node* node, SequenceDB *database) {
195+ std::vector<int > new_seqsIncludes;
196+ tbb::this_task_arena::isolate ([&] {
197+ tbb::parallel_for (tbb::blocked_range<int >(0 , database->sequences .size ()), [&](tbb::blocked_range<int > range) {
198+ for (int idx = range.begin (); idx < range.end (); ++idx) {
199+ auto seq = database->sequences [idx];
200+ auto sIdx = seq->id ;
201+ if (seq->subtreeIdx < -1 ) {
202+ auto aln = database->subtreeAln [seq->subtreeIdx ];
203+ database->id_map [sIdx ]->memCheck (aln.size ());
204+ int orgIdx = 0 ;
205+ int storeFrom = database->id_map [sIdx ]->storage ;
206+ int storeTo = 1 - storeFrom;
207+ for (int k = 0 ; k < aln.size (); ++k) {
208+ if (aln[k] == 0 ) {
209+ database->id_map [sIdx ]->alnStorage [storeTo][k] = database->id_map [sIdx ]->alnStorage [storeFrom][orgIdx];
210+ orgIdx++;
211+ }
212+ else {
213+ database->id_map [sIdx ]->alnStorage [storeTo][k] = ' -' ;
214+ }
215+ }
216+ database->id_map [sIdx ]->len = aln.size ();
217+ database->id_map [sIdx ]->changeStorage ();
218+ }
219+ }
220+ });
221+ });
222+ for (auto sIdx : node->seqsIncluded ) {
223+ if (sIdx >= 0 ) new_seqsIncludes.push_back (sIdx );
224+ }
225+ for (auto seq: database->sequences ) {
226+ if (seq->subtreeIdx < 0 ) new_seqsIncludes.push_back (seq->id );
227+ }
228+ node->seqsIncluded = new_seqsIncludes;
229+ return ;
230+ }
193231
194232void msa::progressive::msaOnSubtree (Tree *T, SequenceDB *database, Option *option, Params ¶m, alnFunction alignmentKernel, int subtree) {
195233 auto progressiveStart = std::chrono::high_resolution_clock::now ();
@@ -228,8 +266,11 @@ void msa::progressive::msaOnSubtree(Tree *T, SequenceDB *database, Option *optio
228266 if (database->currentTask != 2 ) std::cerr << " Alignment (length: " << T->root ->alnLen << " ) completed in " << progressiveTime.count () / 1000000000 << " s\n " ;
229267 else std::cerr<< " Alignment on " << T->allNodes .size () << " subalignments (length: " << T->root ->getAlnLen (database->currentTask ) << " ) in " << progressiveTime.count () / 1000000 << " ms\n " ;
230268 }
231- if (database->fallback_nodes .empty ())
269+ if (database->fallback_nodes .empty ()) {
270+ if (option->alnMode == DEFAULT_ALN || option->alnMode == PLACE_W_TREE) updateAlignment (T->root , database);
232271 return ;
272+ }
273+
233274
234275 // Adding bad sequences back
235276 auto badStart = std::chrono::high_resolution_clock::now ();
@@ -248,6 +289,7 @@ void msa::progressive::msaOnSubtree(Tree *T, SequenceDB *database, Option *optio
248289 std::cerr << " Realign profiles that have been deferred. Total profiles/sequences: " << database->fallback_nodes .size () << " / " << badSeqBefore << ' \n ' ;
249290 database->fallback_nodes .clear ();
250291 progressiveAlignment (T, database, option, alnPairsPerLevel,param, cpu::alignmentKernel_CPU);
292+ if (option->alnMode == DEFAULT_ALN || option->alnMode == PLACE_W_TREE) updateAlignment (T->root , database);
251293 // Reset currentTask
252294 database->currentTask = 0 ;
253295 auto badEnd = std::chrono::high_resolution_clock::now ();
0 commit comments