X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=decalc.cpp;h=3b3740bcea6682e14b21300a48e07fdb9f7079a3;hb=1cf188b912d6da8f2cd03dd71cecef664a699c1a;hp=def8097745a576681717c7443340d9af5bb62d81;hpb=8c1196586860f830fc9c813f2a79abab7434dc4b;p=mothur.git diff --git a/decalc.cpp b/decalc.cpp index def8097..3b3740b 100644 --- a/decalc.cpp +++ b/decalc.cpp @@ -12,7 +12,7 @@ #include "dist.h" #include "eachgapdist.h" #include "ignoregaps.h" -#include "eachgapdistignorens.h" +#include "eachgapdist.h" //*************************************************************************************************************** void DeCalculator::setMask(string ms) { @@ -683,7 +683,7 @@ float DeCalculator::getCoef(vector obs, vector qav) { } //*************************************************************************************************************** //gets closest matches to each end, since chimeras will most likely have different parents on each end -vector DeCalculator::findClosest(Sequence* querySeq, vector& thisTemplate, vector& thisFilteredTemplate, int& numWanted) { +vector DeCalculator::findClosest(Sequence* querySeq, vector& thisTemplate, vector& thisFilteredTemplate, int numWanted, int minSim) { try { //indexes.clear(); @@ -692,7 +692,7 @@ vector DeCalculator::findClosest(Sequence* querySeq, vector distsLeft; vector distsRight; - Dist* distcalculator = new eachGapDistIgnoreNs(); + Dist* distcalculator = new eachGapDist(); string queryUnAligned = querySeq->getUnaligned(); int numBases = int(queryUnAligned.length() * 0.33); @@ -790,6 +790,9 @@ vector DeCalculator::findClosest(Sequence* querySeq, vectorcontrol_pressed) { return seqsMatches; } + //add left if you havent already it = seen.find(thisTemplate[distsLeft[i].index]->getName()); if (it == seen.end()) { @@ -810,14 +813,32 @@ vector DeCalculator::findClosest(Sequence* querySeq, vector= minSim) || (lastRight >= minSim)) { + //add in ties from left + int i = numWanted; + while (i < distsLeft.size()) { + if (distsLeft[i].dist == lastLeft) { dists.push_back(distsLeft[i]); } + else { break; } + i++; + } + + //add in ties from right + i = numWanted; + while (i < distsRight.size()) { + if (distsRight[i].dist == lastRight) { dists.push_back(distsRight[i]); } + else { break; } + i++; + } + } + - //numWanted = dists.size(); //cout << numWanted << endl; for (int i = 0; i < dists.size(); i++) { // cout << db[dists[i].index]->getName() << '\t' << dists[i].dist << endl; - if (thisTemplate[dists[i].index]->getName() != querySeq->getName()) { + if ((thisTemplate[dists[i].index]->getName() != querySeq->getName()) && (dists[i].dist >= minSim)) { Sequence* temp = new Sequence(thisTemplate[dists[i].index]->getName(), thisTemplate[dists[i].index]->getAligned()); //have to make a copy so you can trim and filter without stepping on eachother. seqsMatches.push_back(temp); @@ -838,7 +859,7 @@ Sequence* DeCalculator::findClosest(Sequence* querySeq, vector db) { Sequence* seqsMatch; - Dist* distcalculator = new eachGapDistIgnoreNs(); + Dist* distcalculator = new eachGapDist(); int index = 0; int smallest = 1000000;