X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=maligner.cpp;h=b393194bbc3a4c89fd2ae8ea3f7f7ba67f84b927;hb=9ada98592a54c82d08f3d46c9b1d8c3e472a922d;hp=de6004d7e387d0e241dfbc205695d359dbcf6dda;hpb=5a1e62397b91f57d0d3aff635891df04b8999a88;p=mothur.git diff --git a/maligner.cpp b/maligner.cpp index de6004d..b393194 100644 --- a/maligner.cpp +++ b/maligner.cpp @@ -32,28 +32,8 @@ string Maligner::getResults(Sequence* q, DeCalculator* decalc) { refSeqs = getBlastSeqs(query, numWanted); } -//ofstream out; -//string name = toString(numi+1); -//cout << name << endl; -//name = name.substr(name.find_first_of("|")+1); -//cout << name << endl; -//name = name.substr(name.find_first_of("|")+1); -//cout << name << endl; -//name = name.substr(0, name.find_last_of("|")); -//cout << name << endl; -//string filename = name + ".seqsformaligner"; -//openOutputFile(filename, out); -//for (int u = 0; u < refSeqs.size(); u++) { refSeqs[u]->printSequence(out); } -//out.close(); -//filename = name + ".fasta"; -//openOutputFile(filename, out); -//query->printSequence(out); -//out.close(); - -//for (int i = 0; i < refSeqs.size(); i++) { cout << refSeqs[i]->getName() << endl; } -//cout << "before = " << refSeqs.size() << endl; refSeqs = minCoverageFilter(refSeqs); -//cout << "after = " << refSeqs.size() << endl; + if (refSeqs.size() < 2) { for (int i = 0; i < refSeqs.size(); i++) { delete refSeqs[i]; } percentIdenticalQueryChimera = 0.0; @@ -61,7 +41,7 @@ string Maligner::getResults(Sequence* q, DeCalculator* decalc) { } int chimeraPenalty = computeChimeraPenalty(); -//cout << chimeraPenalty << endl; + //fills outputResults chimera = chimeraMaligner(chimeraPenalty, decalc); @@ -500,8 +480,7 @@ float Maligner::computePercentID(string queryAlign, string chimera) { } //*************************************************************************************************************** vector Maligner::getBlastSeqs(Sequence* q, int num) { - try { -cout << q->getName() << endl; + try { //generate blastdb Database* database = new BlastDB(-2.0, -1.0, matchScore, misMatchPenalty); for (int i = 0; i < db.size(); i++) { database->addSequence(*db[i]); } @@ -509,55 +488,42 @@ cout << q->getName() << endl; database->setNumSeqs(db.size()); //get parts of query - string queryAligned = q->getAligned(); - string leftQuery = queryAligned.substr(0, (queryAligned.length() / 3)); //first 1/3 of the sequence - string rightQuery = queryAligned.substr(((queryAligned.length() / 3)*2)); //last 1/3 of the sequence - + 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); - map tempIndexesRight = database->findClosest(queryRight, num); - map tempIndexesLeft = database->findClosest(queryLeft, num); - - //merge results - vector mergedResults; + vector tempIndexesRight = database->findClosestMegaBlast(queryRight, num+1); + vector tempIndexesLeft = database->findClosestMegaBlast(queryLeft, num+1); - map::iterator it; - map::iterator it2; + //merge results + map seen; + map::iterator it; - //add in right guys merging common finds - for (it = tempIndexesRight.begin(); it != tempIndexesRight.end(); it++) { - it2 = tempIndexesLeft.find(it->first); - - if (it2 == tempIndexesLeft.end()) { //result only present in right - rank temp(it->first, it->second); - mergedResults.push_back(temp); + vector mergedResults; + for (int i = 0; i < tempIndexesLeft.size(); i++) { + //add left if you havent already + it = seen.find(tempIndexesLeft[i]); + if (it == seen.end()) { + mergedResults.push_back(tempIndexesLeft[i]); + seen[tempIndexesLeft[i]] = tempIndexesLeft[i]; + } - }else { //result present in both save best score - float bestscore; - if (it->second > it2->second) { bestscore = it->second; } - else { bestscore = it2->second; } - - rank temp(it->first, bestscore); - mergedResults.push_back(temp); - - tempIndexesLeft.erase(it2); + //add right if you havent already + it = seen.find(tempIndexesRight[i]); + if (it == seen.end()) { + mergedResults.push_back(tempIndexesRight[i]); + seen[tempIndexesRight[i]] = tempIndexesRight[i]; } } - //add in unique left guys - for (it = tempIndexesLeft.begin(); it != tempIndexesLeft.end(); it++) { - rank temp(it->first, it->second); - mergedResults.push_back(temp); - } - - sort(mergedResults.begin(), mergedResults.end(), compareMembers); vector refResults; for (int i = 0; i < numWanted; i++) { - Sequence* temp = new Sequence(db[mergedResults[i].num]->getName(), db[mergedResults[i].num]->getAligned()); + Sequence* temp = new Sequence(db[mergedResults[i]]->getName(), db[mergedResults[i]]->getAligned()); refResults.push_back(temp); -cout << db[mergedResults[i].num]->getName() << endl; } delete queryRight;