+vector<Sequence*> Maligner::getBlastSeqs(Sequence* q, int num) {
+ try {
+cout << q->getName() << endl;
+ //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 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
+
+ Sequence* queryLeft = new Sequence(q->getName(), leftQuery);
+ Sequence* queryRight = new Sequence(q->getName(), rightQuery);
+
+ map<int, float> tempIndexesRight = database->findClosest(queryRight, num);
+ map<int, float> tempIndexesLeft = database->findClosest(queryLeft, num);
+
+ //merge results
+ vector<rank> mergedResults;
+
+ map<int, float>::iterator it;
+ map<int, float>::iterator it2;
+
+ //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);
+
+ }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 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<Sequence*> refResults;
+ for (int i = 0; i < numWanted; i++) {
+ Sequence* temp = new Sequence(db[mergedResults[i].num]->getName(), db[mergedResults[i].num]->getAligned());
+ refResults.push_back(temp);
+cout << db[mergedResults[i].num]->getName() << endl;
+ }
+
+ delete queryRight;
+ delete queryLeft;
+ delete database;
+
+ return refResults;
+ }
+ catch(exception& e) {
+ errorOut(e, "Maligner", "getBlastSeqs");
+ exit(1);
+ }
+}
+
+//***************************************************************************************************************