X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=maligner.cpp;h=1d5258964650cad8c2e90d39414022e7dc2f0455;hb=bd93b1a6f9fe9a6a4a7ac2e9f106e5c83a438856;hp=76689e9f11bf1ab3547ef9a33053830a7b436d14;hpb=74844a60d80c6dd06e3fb02ee9b928424f9019b0;p=mothur.git diff --git a/maligner.cpp b/maligner.cpp index 76689e9..1d52589 100644 --- a/maligner.cpp +++ b/maligner.cpp @@ -34,6 +34,8 @@ string Maligner::getResults(Sequence* q, DeCalculator* decalc) { refSeqs = getKmerSeqs(query, numWanted); //fills indexes }else { m->mothurOut("not valid search."); exit(1); } //should never get here + if (m->control_pressed) { return chimera; } + refSeqs = minCoverageFilter(refSeqs); if (refSeqs.size() < 2) { @@ -46,7 +48,8 @@ string Maligner::getResults(Sequence* q, DeCalculator* decalc) { //fills outputResults chimera = chimeraMaligner(chimeraPenalty, decalc); - + + if (m->control_pressed) { return chimera; } //free memory delete query; @@ -77,10 +80,14 @@ string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator* decalc) { vector< vector > matrix = buildScoreMatrix(query->getAligned().length(), refSeqs.size()); //builds and initializes + if (m->control_pressed) { return chimera; } + fillScoreMatrix(matrix, refSeqs, chimeraPenalty); vector path = extractHighestPath(matrix); + if (m->control_pressed) { return chimera; } + vector trace = mapTraceRegionsToAlignment(path, refSeqs); if (trace.size() > 1) { chimera = "yes"; } @@ -95,6 +102,8 @@ string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator* decalc) { percentIdenticalQueryChimera = computePercentID(queryInRange, chimeraSeq); + if (m->control_pressed) { return chimera; } + //save output results for (int i = 0; i < trace.size(); i++) { int regionStart = trace[i].col; @@ -487,24 +496,19 @@ vector Maligner::getBlastSeqs(Sequence* q, int num) { try { indexes.clear(); vector refResults; - //generate blastdb - Database* database = new BlastDB(-2.0, -1.0, matchScore, misMatchPenalty); - for (int i = 0; i < db.size(); i++) { database->addSequence(*db[i]); } - database->generateDB(); - database->setNumSeqs(db.size()); - + //get parts of query string queryUnAligned = q->getUnaligned(); string leftQuery = queryUnAligned.substr(0, int(queryUnAligned.length() * 0.33)); //first 1/3 of the sequence string rightQuery = queryUnAligned.substr(int(queryUnAligned.length() * 0.66)); //last 1/3 of the sequence - Sequence* queryLeft = new Sequence(q->getName(), leftQuery); - Sequence* queryRight = new Sequence(q->getName(), rightQuery); - - vector tempIndexesRight = database->findClosestMegaBlast(queryRight, num+1); - vector tempIndexesLeft = database->findClosestMegaBlast(queryLeft, num+1); + Sequence* queryLeft = new Sequence(q->getName()+"left", leftQuery); + Sequence* queryRight = new Sequence(q->getName()+"right", rightQuery); - //if ((tempIndexesRight.size() != (num+1)) || (tempIndexesLeft.size() != (num+1))) { m->mothurOut("megablast returned " + toString(tempIndexesRight.size()) + " results for the right end, and " + toString(tempIndexesLeft.size()) + " for the left end. Needed " + toString(num+1) + ". Unable to porcess sequence " + q->getName()); m->mothurOutEndLine(); return refResults; } + vector tempIndexesRight = databaseLeft->findClosestMegaBlast(queryRight, num+1); + vector tempIndexesLeft = databaseLeft->findClosestMegaBlast(queryLeft, num+1); + + //if ((tempIndexesRight.size() == 0) && (tempIndexesLeft.size() == 0)) { m->mothurOut("megablast returned " + toString(tempIndexesRight.size()) + " results for the right end, and " + toString(tempIndexesLeft.size()) + " for the left end. Needed " + toString(num+1) + ". Unable to process sequence " + q->getName()); m->mothurOutEndLine(); return refResults; } vector smaller; vector larger; @@ -555,8 +559,7 @@ vector Maligner::getBlastSeqs(Sequence* q, int num) { //cout << endl; delete queryRight; delete queryLeft; - delete database; - + return refResults; } catch(exception& e) {