}
}
//***************************************************************************************************************
-ChimeraSlayer::ChimeraSlayer(string file, string temp, bool trim, string name, string mode, int k, int ms, int mms, int win, float div,
+ChimeraSlayer::ChimeraSlayer(string file, string temp, bool trim, map<string, int>& prior, string mode, int k, int ms, int mms, int win, float div,
int minsim, int mincov, int minbs, int minsnp, int par, int it, int inc, int numw, bool r) : Chimera() {
try {
fastafile = file; templateSeqs = readSeqs(fastafile);
numWanted = numw;
realign = r;
trimChimera = trim;
+ priority = prior;
decalc = new DeCalculator();
createFilter(templateSeqs, 0.0); //just removed columns where all seqs have a gap
//run filter on template
- for (int i = 0; i < templateSeqs.size(); i++) { delete templateSeqs[i]; } templateSeqs.clear();
-
+ for (int i = 0; i < templateSeqs.size(); i++) { if (m->control_pressed) { break; } runFilter(templateSeqs[i]); }
+
+
}
catch(exception& e) {
m->errorOut(e, "ChimeraSlayer", "ChimeraSlayer");
}
}
//***************************************************************************************************************
-int ChimeraSlayer::getTemplate(Sequence* q) {
+vector<Sequence*> ChimeraSlayer::getTemplate(Sequence* q) {
try {
+ //when template=self, the query file is sorted from most abundance to least abundant
+ //userTemplate grows as the query file is processed by adding sequences that are not chimeric and more abundant
+ vector<Sequence*> userTemplate;
+
+ int myAbund = priority[q->getName()];
+
+ for (int i = 0; i < templateSeqs.size(); i++) {
+
+ if (m->control_pressed) { return userTemplate; }
+
+ //have I reached a sequence with the same abundance as myself?
+ if (!(priority[templateSeqs[i]->getName()] > myAbund)) { break; }
+
+ //if its am not chimeric add it
+ if (chimericSeqs.count(templateSeqs[i]->getName()) == 0) { userTemplate.push_back(templateSeqs[i]); }
+ }
+
string kmerDBNameLeft;
string kmerDBNameRight;
#ifdef USE_MPI
for (int i = 0; i < userTemplate.size(); i++) {
- if (m->control_pressed) { return 0; }
+ if (m->control_pressed) { return userTemplate; }
string leftFrag = userTemplate[i]->getUnaligned();
leftFrag = leftFrag.substr(0, int(leftFrag.length() * 0.33));
databaseLeft->setNumSeqs(userTemplate.size());
for (int i = 0; i < userTemplate.size(); i++) {
- if (m->control_pressed) { return 0; }
+ if (m->control_pressed) { return userTemplate; }
string rightFrag = userTemplate[i]->getUnaligned();
rightFrag = rightFrag.substr(int(rightFrag.length() * 0.66));
for (int i = 0; i < userTemplate.size(); i++) {
- if (m->control_pressed) { return 0; }
+ if (m->control_pressed) { return userTemplate; }
string leftFrag = userTemplate[i]->getUnaligned();
leftFrag = leftFrag.substr(0, int(leftFrag.length() * 0.33));
databaseLeft->setNumSeqs(userTemplate.size());
for (int i = 0; i < userTemplate.size(); i++) {
- if (m->control_pressed) { return 0; }
+ if (m->control_pressed) { return userTemplate; }
string rightFrag = userTemplate[i]->getUnaligned();
rightFrag = rightFrag.substr(int(rightFrag.length() * 0.66));
//generate blastdb
databaseLeft = new BlastDB(-1.0, -1.0, 1, -3);
- for (int i = 0; i < userTemplate.size(); i++) { if (m->control_pressed) { return 0; } databaseLeft->addSequence(*userTemplate[i]); }
+ for (int i = 0; i < userTemplate.size(); i++) { if (m->control_pressed) { return userTemplate; } databaseLeft->addSequence(*userTemplate[i]); }
databaseLeft->generateDB();
databaseLeft->setNumSeqs(userTemplate.size());
}
- return 0;
+ return userTemplate;
}
catch(exception& e) {
if (templateFileName != "self") {
if (searchMethod == "kmer") { delete databaseRight; delete databaseLeft; }
else if (searchMethod == "blast") { delete databaseLeft; }
- }else {
- //delete userTemplate
- for (int i = 0; i < userTemplate.size(); i++) {
- delete userTemplate[i];
- }
- userTemplate.clear();
}
}
//***************************************************************************************************************
m->mothurOut(querySeq->getName() + "\tyes"); m->mothurOutEndLine();
outAcc << querySeq->getName() << endl;
+ if (templateFileName == "self") { chimericSeqs.insert(querySeq->getName()); }
+
if (trimChimera) {
int lengthLeft = spotMap[chimeraResults[0].winLEnd] - spotMap[chimeraResults[0].winLStart];
int lengthRight = spotMap[chimeraResults[0].winREnd] - spotMap[chimeraResults[0].winRStart];
out << endl;
}else {
out << querySeq->getName() << "\tno" << endl;
- if (templateFileName == "self") {
- Sequence* temp = new Sequence(trimQuery.getName(), trimQuery.getAligned());
- runFilter(temp);
- userTemplate.push_back(temp);
- }
}
return trim;
m->mothurOut(querySeq->getName() + "\tyes"); m->mothurOutEndLine();
outAcc << querySeq->getName() << endl;
+ if (templateFileName == "self") { chimericSeqs.insert(querySeq->getName()); }
+
if (trimChimera) {
string newAligned = trim->getAligned();
out << endl;
}else {
out << querySeq->getName() << "\tno" << endl;
- if (templateFileName == "self") {
- Sequence* temp = new Sequence(trimQuery.getName(), trimQuery.getAligned());
- runFilter(temp);
- userTemplate.push_back(temp);
- }
}
return trim;
outAccString += querySeq->getName() + "\n";
results = true;
+ if (templateFileName == "self") { chimericSeqs.insert(querySeq->getName()); }
+
//write to accnos file
int length = outAccString.length();
char* buf2 = new char[length];
MPI_File_write_shared(out, buf, length, MPI_CHAR, &status);
delete buf;
-
- if (template == "self") {
- Sequence temp = new Sequence(trimQuery.getName(), trimQuery.getAligned());
- runFilter(temp);
- userTemplate.push_back(temp);
- }
}
outAccString += querySeq->getName() + "\n";
results = true;
+ if (templateFileName == "self") { chimericSeqs.insert(querySeq->getName()); }
+
//write to accnos file
int length = outAccString.length();
char* buf2 = new char[length];
MPI_File_write_shared(out, buf, length, MPI_CHAR, &status);
delete buf;
-
- if (template == "self") {
- Sequence temp = new Sequence(trimQuery.getName(), trimQuery.getAligned());
- runFilter(temp);
- userTemplate.push_back(temp);
- }
}
return trim;
//you must create a template
vector<Sequence*> thisTemplate;
if (templateFileName != "self") { thisTemplate = templateSeqs; }
- else { getTemplate(query); thisTemplate = userTemplate; } //fills this template and creates the databases
+ else { thisTemplate = getTemplate(query); } //fills this template and creates the databases
if (m->control_pressed) { return 0; }