@@ -665,43 +665,39 @@ std::vector<AlnSimple> parseAndScoreExternalHits(
665
665
#pragma omp for schedule(dynamic, 10)
666
666
for (size_t i = 0 ; i < cluDbr->getSize (); ++i) {
667
667
char *data = cluDbr->getData (i, thread_idx);
668
- unsigned int queryKey = cluDbr->getDbKey (i);
669
-
670
- size_t queryId = seqDbrAA.getId (queryKey);
671
- seqQueryAa.mapSequence (queryId, queryKey, seqDbrAA.getData (queryId, thread_idx), seqDbrAA.getSeqLen (queryId));
672
- queryId = seqDbr3Di.getId (queryKey);
673
- seqQuerySs.mapSequence (queryId, queryKey, seqDbr3Di.getData (queryId, thread_idx), seqDbr3Di.getSeqLen (queryId));
674
-
675
- structureSmithWaterman.ssw_init (
676
- &seqQueryAa,
677
- &seqQuerySs,
678
- tinySubMatAA,
679
- tinySubMat3Di,
680
- subMat_aa
681
- );
668
+
669
+ std::vector<unsigned int > memberDbKeys;
682
670
683
671
while (*data != ' \0 ' ) {
684
672
Util::parseKey (data, buffer);
685
- const unsigned int dbKey = (unsigned int ) strtoul (buffer, NULL , 10 );
686
- if (queryKey == dbKey) {
687
- data = Util::skipLine (data);
688
- continue ;
689
- }
690
- size_t dbId = seqDbrAA.getId (dbKey);
691
- seqDbAa.mapSequence (dbId, dbKey, seqDbrAA.getData (dbId, thread_idx), seqDbrAA.getSeqLen (dbId));
692
- dbId = seqDbr3Di.getId (dbKey);
693
- seqDbSs.mapSequence (dbId, dbKey, seqDbr3Di.getData (dbId, thread_idx), seqDbr3Di.getSeqLen (dbId));
694
- AlnSimple aln;
695
- aln.queryId = queryKey;
696
- aln.targetId = dbKey;
697
- aln.score = structureSmithWaterman.ungapped_alignment (
698
- seqDbAa.numSequence ,
699
- seqDbSs.numSequence ,
700
- seqDbAa.L
701
- );
702
- threadAlnResults.push_back (aln);
673
+ unsigned int dbKey = (unsigned int ) strtoul (buffer, NULL , 10 );
674
+ memberDbKeys.push_back (dbKey);
703
675
data = Util::skipLine (data);
704
676
}
677
+
678
+ Debug (Debug::INFO) << " All-vs-all of " << memberDbKeys.size () << " structures (" <<
679
+ memberDbKeys.size ()*(memberDbKeys.size ()+1 )/2 - memberDbKeys.size () << " comparisons)\n " ;
680
+
681
+ for (size_t j = 0 ; j < memberDbKeys.size (); j++) {
682
+ unsigned int queryKey = memberDbKeys[j];
683
+ size_t queryId = seqDbrAA.getId (queryKey);
684
+ seqQueryAa.mapSequence (queryId, queryKey, seqDbrAA.getData (queryId, thread_idx), seqDbrAA.getSeqLen (queryId));
685
+ queryId = seqDbr3Di.getId (queryKey);
686
+ seqQuerySs.mapSequence (queryId, queryKey, seqDbr3Di.getData (queryId, thread_idx), seqDbr3Di.getSeqLen (queryId));
687
+ structureSmithWaterman.ssw_init (&seqQueryAa, &seqQuerySs, tinySubMatAA, tinySubMat3Di, subMat_aa);
688
+ for (size_t k = j + 1 ; k < memberDbKeys.size (); k++) {
689
+ unsigned int dbKey = memberDbKeys[k];
690
+ size_t dbId = seqDbrAA.getId (dbKey);
691
+ seqDbAa.mapSequence (dbId, dbKey, seqDbrAA.getData (dbId, thread_idx), seqDbrAA.getSeqLen (dbId));
692
+ dbId = seqDbr3Di.getId (dbKey);
693
+ seqDbSs.mapSequence (dbId, dbKey, seqDbr3Di.getData (dbId, thread_idx), seqDbr3Di.getSeqLen (dbId));
694
+ AlnSimple aln;
695
+ aln.queryId = queryKey;
696
+ aln.targetId = dbKey;
697
+ aln.score = structureSmithWaterman.ungapped_alignment (seqDbAa.numSequence , seqDbSs.numSequence , seqDbAa.L );
698
+ threadAlnResults.push_back (aln);
699
+ }
700
+ }
705
701
}
706
702
#pragma omp critical
707
703
{
@@ -1280,18 +1276,19 @@ int structuremsa(int argc, const char **argv, const Command& command, bool preCl
1280
1276
par.compBiasCorrection ,
1281
1277
par.compBiasCorrectionScale
1282
1278
);
1279
+ hits.insert (hits.end (), externalHits.begin (), externalHits.end ());
1283
1280
// maybe a bit dangerous because memory of hits might be doubled
1284
- for (size_t i = 0 ; i < externalHits.size (); i++)
1285
- hits.push_back (externalHits[i]);
1286
1281
}
1282
+
1287
1283
sortHitsByScore (hits);
1288
1284
1289
1285
Debug (Debug::INFO) << " Generating guide tree\n " ;
1290
1286
hits = mst (hits, sequenceCnt);
1287
+ // assert(hits.size() == sequenceCnt - 1); // should be n-1 edges
1291
1288
1292
1289
Debug (Debug::INFO) << " Optimising merge order\n " ;
1293
1290
hits = reorderLinkage (hits, merges, sequenceCnt);
1294
-
1291
+
1295
1292
NewickParser::Node* root = NewickParser::buildTree (hits);
1296
1293
NewickParser::addNames (root, &qdbrH);
1297
1294
std::string nw = NewickParser::toNewick (root);
0 commit comments