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) {
//fills outputResults
chimera = chimeraMaligner(chimeraPenalty, decalc);
-
+
+ if (m->control_pressed) { return chimera; }
//free memory
delete query;
vector< vector<score_struct> > matrix = buildScoreMatrix(query->getAligned().length(), refSeqs.size()); //builds and initializes
+ if (m->control_pressed) { return chimera; }
+
fillScoreMatrix(matrix, refSeqs, chimeraPenalty);
vector<score_struct> path = extractHighestPath(matrix);
+ if (m->control_pressed) { return chimera; }
+
vector<trace_struct> trace = mapTraceRegionsToAlignment(path, refSeqs);
if (trace.size() > 1) { chimera = "yes"; }
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;
try {
indexes.clear();
vector<Sequence*> 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<int> tempIndexesRight = database->findClosestMegaBlast(queryRight, num+1);
- vector<int> 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<int> tempIndexesRight = databaseLeft->findClosestMegaBlast(queryRight, num+1);
+ vector<int> 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<int> smaller;
vector<int> larger;
//cout << endl;
delete queryRight;
delete queryLeft;
- delete database;
-
+
return refResults;
}
catch(exception& e) {