X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancedb.cpp;h=b5c22b35bf7a58addcff79651e6841b9506ec8e2;hb=d04f948b1a2a1a2984fc4a45d04403b8c121c5bc;hp=0c1aeebe43af3ca586bfd6416f95db924a047054;hpb=74844a60d80c6dd06e3fb02ee9b928424f9019b0;p=mothur.git diff --git a/distancedb.cpp b/distancedb.cpp index 0c1aeeb..b5c22b3 100644 --- a/distancedb.cpp +++ b/distancedb.cpp @@ -47,28 +47,55 @@ vector DistanceDB::findClosestSequences(Sequence* query, int numWanted){ vector topMatches; bool templateSameLength = true; string sequence = query->getAligned(); - vector dists; + vector dists; - if (numWanted > data.size()) { m->mothurOut("numwanted is larger than the number of template sequences, using 10."); m->mothurOutEndLine(); numWanted = 10; } + searchScore = -1.0; + + if (numWanted > data.size()) { m->mothurOut("numwanted is larger than the number of template sequences, using "+ toString(data.size()) + "."); m->mothurOutEndLine(); numWanted = data.size(); } if (sequence.length() != templateSeqsLength) { templateSameLength = false; } if (templateSameLength && templateAligned) { - //calc distance from this sequence to every sequence in the template - for (int i = 0; i < data.size(); i++) { - distCalculator->calcDist(*query, data[i]); - float dist = distCalculator->getDist(); + if (numWanted != 1) { - //save distance to each template sequence - seqDist temp(-1, i, dist); - dists.push_back(temp); - } - - sort(dists.begin(), dists.end(), compareSequenceDistance); //sorts by distance lowest to highest - - //fill topmatches with numwanted closest sequences indexes - for (int i = 0; i < numWanted; i++) { - topMatches.push_back(dists[i].seq2); + dists.resize(data.size()); + + //calc distance from this sequence to every sequence in the template + for (int i = 0; i < data.size(); i++) { + distCalculator->calcDist(*query, data[i]); + float dist = distCalculator->getDist(); + + //save distance to each template sequence + dists[i].seq1 = -1; + dists[i].seq2 = i; + dists[i].dist = dist; + } + + sort(dists.begin(), dists.end(), compareSequenceDistance); //sorts by distance lowest to highest + + //save distance of best match + searchScore = dists[0].dist; + + //fill topmatches with numwanted closest sequences indexes + for (int i = 0; i < numWanted; i++) { + topMatches.push_back(dists[i].seq2); + } + }else { + int bestIndex = 0; + float smallDist = 100000; + for (int i = 0; i < data.size(); i++) { + distCalculator->calcDist(*query, data[i]); + float dist = distCalculator->getDist(); + + //are you smaller? + if (dist < smallDist) { + bestIndex = i; + smallDist = dist; + } + } + + searchScore = smallDist; + topMatches.push_back(bestIndex); } }else{