From: Sarah Westcott Date: Mon, 28 Jan 2013 16:09:35 +0000 (-0500) Subject: added checks to make sure windows processes completed their tasks. X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=commitdiff_plain;h=14cddf859d97118481161bf3e85a647976020758 added checks to make sure windows processes completed their tasks. --- diff --git a/aligncommand.cpp b/aligncommand.cpp index a871244..fc98c10 100644 --- a/aligncommand.cpp +++ b/aligncommand.cpp @@ -965,6 +965,9 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } num += pDataArray[i]->count; CloseHandle(hThreadArray[i]); delete pDataArray[i]; diff --git a/aligncommand.h b/aligncommand.h index cfded38..e5e9601 100644 --- a/aligncommand.h +++ b/aligncommand.h @@ -144,8 +144,6 @@ static DWORD WINAPI MyAlignThreadFunction(LPVOID lpParam){ inFASTA.seekg(pDataArray->start-1); pDataArray->m->gobble(inFASTA); } - pDataArray->count = pDataArray->end; - AlignmentDB* templateDB = new AlignmentDB(pDataArray->templateFileName, pDataArray->search, pDataArray->kmerSize, pDataArray->gapOpen, pDataArray->gapExtend, pDataArray->match, pDataArray->misMatch, pDataArray->threadID); //moved this into driver to avoid deep copies in windows paralellized version @@ -161,7 +159,7 @@ static DWORD WINAPI MyAlignThreadFunction(LPVOID lpParam){ alignment = new NeedlemanOverlap(pDataArray->gapOpen, pDataArray->match, pDataArray->misMatch, longestBase); } - int count = 0; + pDataArray->count = 0; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process if (pDataArray->m->control_pressed) { break; } @@ -242,16 +240,16 @@ static DWORD WINAPI MyAlignThreadFunction(LPVOID lpParam){ delete nast; if (needToDeleteCopy) { delete copy; } - count++; + pDataArray->count++; } delete candidateSeq; //report progress - if((count) % 100 == 0){ pDataArray->m->mothurOut(toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 100 == 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } } //report progress - if((count) % 100 != 0){ pDataArray->m->mothurOut(toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 100 != 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } delete alignment; delete templateDB; diff --git a/chimeraperseuscommand.cpp b/chimeraperseuscommand.cpp index b4e478c..66889f1 100644 --- a/chimeraperseuscommand.cpp +++ b/chimeraperseuscommand.cpp @@ -1076,6 +1076,9 @@ int ChimeraPerseusCommand::createProcessesGroups(string outputFName, string accn //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } num += pDataArray[i]->count; CloseHandle(hThreadArray[i]); delete pDataArray[i]; diff --git a/chimeraslayercommand.cpp b/chimeraslayercommand.cpp index 576fee9..a1be235 100644 --- a/chimeraslayercommand.cpp +++ b/chimeraslayercommand.cpp @@ -1497,6 +1497,9 @@ int ChimeraSlayerCommand::createProcessesGroups(string outputFName, string accno //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } num += pDataArray[i]->count; CloseHandle(hThreadArray[i]); delete pDataArray[i]; diff --git a/chimeraslayercommand.h b/chimeraslayercommand.h index 0c6ebe2..ee43bcb 100644 --- a/chimeraslayercommand.h +++ b/chimeraslayercommand.h @@ -213,8 +213,6 @@ static DWORD WINAPI MySlayerThreadFunction(LPVOID lpParam){ inFASTA.seekg(pDataArray->start-1); pDataArray->m->gobble(inFASTA); } - pDataArray->count = pDataArray->end; - if (pDataArray->m->control_pressed) { out.close(); out2.close(); if (pDataArray->trim) { out3.close(); } inFASTA.close(); delete chimera; return 0; } if (chimera->getUnaligned()) { @@ -227,7 +225,7 @@ static DWORD WINAPI MySlayerThreadFunction(LPVOID lpParam){ if (pDataArray->start == 0) { chimera->printHeader(out); } - int count = 0; + pDataArray->count = 0; for(int i = 0; i < pDataArray->end; i++){ if (pDataArray->m->control_pressed) { out.close(); out2.close(); if (pDataArray->trim) { out3.close(); } inFASTA.close(); delete chimera; return 1; } @@ -318,18 +316,18 @@ static DWORD WINAPI MySlayerThreadFunction(LPVOID lpParam){ } - count++; + pDataArray->count++; } delete candidateSeq; //report progress - if((count) % 100 == 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 100 == 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } } //report progress - if((count) % 100 != 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 100 != 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } pDataArray->numNoParents = chimera->getNumNoParents(); - if (pDataArray->numNoParents == count) { pDataArray->m->mothurOut("[WARNING]: megablast returned 0 potential parents for all your sequences. This could be due to formatdb.exe not being setup properly, please check formatdb.log for errors.\n"); } + if (pDataArray->numNoParents == pDataArray->count) { pDataArray->m->mothurOut("[WARNING]: megablast returned 0 potential parents for all your sequences. This could be due to formatdb.exe not being setup properly, please check formatdb.log for errors.\n"); } out.close(); out2.close(); diff --git a/chimerauchimecommand.h b/chimerauchimecommand.h index 8861e19..6d9d001 100644 --- a/chimerauchimecommand.h +++ b/chimerauchimecommand.h @@ -546,12 +546,13 @@ static DWORD WINAPI MyUchimeSeqsThreadFunction(LPVOID lpParam){ ofstream out23; pDataArray->m->openOutputFile(outputFileName, out23); + int fcount = 0; while (!in23.eof()) { if (pDataArray->m->control_pressed) { break; } Sequence seq(in23); pDataArray->m->gobble(in23); - if (seq.getName() != "") { seq.printSequence(out23); } + if (seq.getName() != "") { seq.printSequence(out23); fcount++; } } in23.close(); out23.close(); @@ -821,12 +822,15 @@ static DWORD WINAPI MyUchimeSeqsThreadFunction(LPVOID lpParam){ in.close(); out.close(); + if (fcount != totalSeqs) { pDataArray->m->mothurOut("[ERROR]: process " + toString(pDataArray->threadID) + " only processed " + toString(pDataArray->count) + " of " + toString(pDataArray->end) + " sequences assigned to it, quitting. \n"); pDataArray->m->control_pressed = true; } + if (pDataArray->m->control_pressed) { return 0; } pDataArray->m->mothurOutEndLine(); pDataArray->m->mothurOut("It took " + toString(time(NULL) - start) + " secs to check " + toString(totalSeqs) + " sequences."); pDataArray->m->mothurOutEndLine(); pDataArray->count = totalSeqs; pDataArray->numChimeras = numChimeras; + return totalSeqs; } diff --git a/chopseqscommand.cpp b/chopseqscommand.cpp index 0cce69f..80dd856 100644 --- a/chopseqscommand.cpp +++ b/chopseqscommand.cpp @@ -331,6 +331,10 @@ bool ChopSeqsCommand::createProcesses(vector lines, string filename, s for(int i=0; i < pDataArray.size(); i++){ if (pDataArray[i]->wroteAccnos) { wroteAccnos = pDataArray[i]->wroteAccnos; nonBlankAccnosFiles.push_back(outAccnos + toString(processIDS[i]) + ".temp"); } else { m->mothurRemove((outAccnos + toString(processIDS[i]) + ".temp")); } + //check to make sure the process finished + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } CloseHandle(hThreadArray[i]); delete pDataArray[i]; } diff --git a/chopseqscommand.h b/chopseqscommand.h index cd2b2fe..c9a4962 100644 --- a/chopseqscommand.h +++ b/chopseqscommand.h @@ -60,7 +60,7 @@ struct chopData { string outFasta, outAccnos, keep; unsigned long long start; unsigned long long end; - int numbases; + int numbases, count; bool countGaps, Short, wroteAccnos; MothurOut* m; string namefile; @@ -108,7 +108,7 @@ static DWORD WINAPI MyChopThreadFunction(LPVOID lpParam){ bool done = false; bool wroteAccnos = false; - int count = 0; + pDataArray->count = 0; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process @@ -238,14 +238,14 @@ static DWORD WINAPI MyChopThreadFunction(LPVOID lpParam){ outAcc << seq.getName() << endl; pDataArray->wroteAccnos = true; } - count++; + pDataArray->count++; } //report progress - if((count) % 1000 == 0){ pDataArray->m->mothurOut(toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 1000 == 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } } //report progress - if((count) % 1000 != 0){ pDataArray->m->mothurOut(toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 1000 != 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } in.close(); diff --git a/classifyseqscommand.cpp b/classifyseqscommand.cpp index 114036b..147b383 100644 --- a/classifyseqscommand.cpp +++ b/classifyseqscommand.cpp @@ -1044,6 +1044,9 @@ int ClassifySeqsCommand::createProcesses(string taxFileName, string tempTaxFile, //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } CloseHandle(hThreadArray[i]); delete pDataArray[i]; } diff --git a/classifyseqscommand.h b/classifyseqscommand.h index a3328d8..f8a820d 100644 --- a/classifyseqscommand.h +++ b/classifyseqscommand.h @@ -163,8 +163,6 @@ static DWORD WINAPI MyClassThreadFunction(LPVOID lpParam){ inFASTA.seekg(pDataArray->start-1); pDataArray->m->gobble(inFASTA); } - pDataArray->count = pDataArray->end; - //make classify Classify* myclassify; string outputMethodTag = pDataArray->method + "."; @@ -183,7 +181,7 @@ static DWORD WINAPI MyClassThreadFunction(LPVOID lpParam){ if (pDataArray->m->control_pressed) { delete myclassify; return 0; } - int count = 0; + pDataArray->count = 0; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process if (pDataArray->m->control_pressed) { delete myclassify; return 0; } @@ -209,15 +207,15 @@ static DWORD WINAPI MyClassThreadFunction(LPVOID lpParam){ if (myclassify->getFlipped()) { outAcc << candidateSeq->getName() << endl; } - count++; + pDataArray->count++; } delete candidateSeq; //report progress - if((count) % 100 == 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 100 == 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } } //report progress - if((count) % 100 != 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(count)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 100 != 0){ pDataArray->m->mothurOut("Processing sequence: " + toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } delete myclassify; inFASTA.close(); diff --git a/distancecommand.cpp b/distancecommand.cpp index 16fcbf5..19094e9 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -594,6 +594,9 @@ void DistanceCommand::createProcesses(string filename) { //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->endLine-pDataArray[i]->startLine)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->endLine-pDataArray[i]->startLine) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } CloseHandle(hThreadArray[i]); delete pDataArray[i]; } diff --git a/distancecommand.h b/distancecommand.h index ddce044..af55406 100644 --- a/distancecommand.h +++ b/distancecommand.h @@ -33,7 +33,7 @@ struct distanceData { vector Estimators; MothurOut* m; string output; - int numNewFasta; + int numNewFasta, count; string countends; distanceData(){} @@ -86,7 +86,7 @@ static DWORD WINAPI MyDistThreadFunction(LPVOID lpParam){ ofstream outFile(pDataArray->dFileName.c_str(), ios::trunc); outFile.setf(ios::fixed, ios::showpoint); outFile << setprecision(4); - + pDataArray->count = 0; if (pDataArray->output != "square") { if((pDataArray->output == "lt") && (pDataArray->startLine == 0)){ outFile << pDataArray->alignDB.getNumSeqs() << endl; } @@ -121,9 +121,9 @@ static DWORD WINAPI MyDistThreadFunction(LPVOID lpParam){ if(i % 100 == 0){ pDataArray->m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); } - + pDataArray->count++; } - pDataArray->m->mothurOut(toString(pDataArray->endLine-1) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); + pDataArray->m->mothurOut(toString(pDataArray->count) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); }else{ if(pDataArray->startLine == 0){ outFile << pDataArray->alignDB.getNumSeqs() << endl; } @@ -150,9 +150,9 @@ static DWORD WINAPI MyDistThreadFunction(LPVOID lpParam){ if(i % 100 == 0){ pDataArray->m->mothurOut(toString(i) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); } - + pDataArray->count++; } - pDataArray->m->mothurOut(toString(pDataArray->endLine-1) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); + pDataArray->m->mothurOut(toString(pDataArray->count) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); } outFile.close(); diff --git a/filterseqscommand.cpp b/filterseqscommand.cpp index f6ca479..b17d9ed 100644 --- a/filterseqscommand.cpp +++ b/filterseqscommand.cpp @@ -729,6 +729,9 @@ int FilterSeqsCommand::createProcessesRunFilter(string F, string filename, strin //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } CloseHandle(hThreadArray[i]); delete pDataArray[i]; } @@ -1176,6 +1179,9 @@ int FilterSeqsCommand::createProcessesCreateFilter(Filters& F, string filename) //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } F.mergeFilter(pDataArray[i]->F.getFilter()); for (int k = 0; k < alignmentLength; k++) { F.a[k] += pDataArray[i]->F.a[k]; } diff --git a/filterseqscommand.h b/filterseqscommand.h index fc6bcb2..90c13f8 100644 --- a/filterseqscommand.h +++ b/filterseqscommand.h @@ -153,7 +153,7 @@ static DWORD WINAPI MyCreateFilterThreadFunction(LPVOID lpParam){ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); } - pDataArray->count = pDataArray->end; + pDataArray->count = 0; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process if (pDataArray->m->control_pressed) { in.close(); pDataArray->count = 1; return 1; } @@ -166,7 +166,7 @@ static DWORD WINAPI MyCreateFilterThreadFunction(LPVOID lpParam){ if(pDataArray->trump != '*') { pDataArray->F.doTrump(current); } if(pDataArray->m->isTrue(pDataArray->vertical) || pDataArray->soft != 0) { pDataArray->F.getFreqs(current); } } - + pDataArray->count++; //report progress if((i) % 100 == 0){ pDataArray->m->mothurOut(toString(i)); pDataArray->m->mothurOutEndLine(); } } @@ -203,7 +203,7 @@ static DWORD WINAPI MyRunFilterThreadFunction(LPVOID lpParam){ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); } - pDataArray->count = pDataArray->end; + pDataArray->count = 0; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process if (pDataArray->m->control_pressed) { in.close(); out.close(); pDataArray->count = 1; return 1; } @@ -221,7 +221,7 @@ static DWORD WINAPI MyRunFilterThreadFunction(LPVOID lpParam){ out << '>' << seq.getName() << endl << filterSeq << endl; } - + pDataArray->count++; //report progress if((i) % 100 == 0){ pDataArray->m->mothurOut(toString(i)); pDataArray->m->mothurOutEndLine(); } } diff --git a/makecontigscommand.cpp b/makecontigscommand.cpp index 4240699..74133bb 100644 --- a/makecontigscommand.cpp +++ b/makecontigscommand.cpp @@ -824,6 +824,9 @@ int MakeContigsCommand::createProcesses(vector< vector > files, string o //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (!pDataArray[i]->done) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of sequences assigned to it, quitting. \n"); m->control_pressed = true; + } for (map::iterator it = pDataArray[i]->groupCounts.begin(); it != pDataArray[i]->groupCounts.end(); it++) { map::iterator it2 = groupCounts.find(it->first); if (it2 == groupCounts.end()) { groupCounts[it->first] = it->second; } diff --git a/makecontigscommand.h b/makecontigscommand.h index 43105b8..b61ebda 100644 --- a/makecontigscommand.h +++ b/makecontigscommand.h @@ -109,7 +109,7 @@ struct contigsData { MothurOut* m; float match, misMatch, gapOpen, gapExtend; int count, threshold, threadID, pdiffs, bdiffs, tdiffs; - bool allFiles, createGroup; + bool allFiles, createGroup, done; map groupCounts; map groupMap; vector primerNameVector; @@ -145,6 +145,7 @@ struct contigsData { allFiles = all; createGroup = cg; threadID = tid; + done=false; } }; @@ -161,7 +162,7 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ if(pDataArray->align == "gotoh") { alignment = new GotohOverlap(pDataArray->gapOpen, pDataArray->gapExtend, pDataArray->match, pDataArray->misMatch, longestBase); } else if(pDataArray->align == "needleman") { alignment = new NeedlemanOverlap(pDataArray->gapOpen, pDataArray->match, pDataArray->misMatch, longestBase); } - int num = 0; + pDataArray->count = 0; string thisffastafile = pDataArray->files[0]; string thisfqualfile = pDataArray->files[1]; string thisrfastafile = pDataArray->files[2]; @@ -396,14 +397,14 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ outScrapQual << endl; } } - num++; + pDataArray->count++; //report progress - if((num) % 1000 == 0){ pDataArray->m->mothurOut(toString(num)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 1000 == 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } } //report progress - if((num) % 1000 != 0){ pDataArray->m->mothurOut(toString(num)); pDataArray->m->mothurOutEndLine(); } + if((pDataArray->count) % 1000 != 0){ pDataArray->m->mothurOut(toString(pDataArray->count)); pDataArray->m->mothurOutEndLine(); } inFFasta.close(); inRFasta.close(); @@ -418,6 +419,7 @@ static DWORD WINAPI MyContigsThreadFunction(LPVOID lpParam){ } delete alignment; + pDataArray->done = true; if (pDataArray->m->control_pressed) { pDataArray->m->mothurRemove(pDataArray->outputFasta); pDataArray->m->mothurRemove(pDataArray->outputMisMatches); pDataArray->m->mothurRemove(pDataArray->outputScrapFasta); if (thisfqualfile != "") { pDataArray->m->mothurRemove(pDataArray->outputQual); pDataArray->m->mothurRemove(pDataArray->outputScrapQual); } } return 0; diff --git a/matrixoutputcommand.cpp b/matrixoutputcommand.cpp index 3844e18..95b8811 100644 --- a/matrixoutputcommand.cpp +++ b/matrixoutputcommand.cpp @@ -629,6 +629,9 @@ int MatrixOutputCommand::process(vector thisLookup){ //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->end-pDataArray[i]->start)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end-pDataArray[i]->start) + " groups assigned to it, quitting. \n"); m->control_pressed = true; + } for (int j = 0; j < pDataArray[i]->thisLookup.size(); j++) { delete pDataArray[i]->thisLookup[j]; } for (int k = 0; k < calcDists.size(); k++) { diff --git a/matrixoutputcommand.h b/matrixoutputcommand.h index 8a04c96..90f1206 100644 --- a/matrixoutputcommand.h +++ b/matrixoutputcommand.h @@ -121,6 +121,7 @@ struct distSharedData { unsigned long long start; unsigned long long end; MothurOut* m; + int count; distSharedData(){} distSharedData(MothurOut* mout, unsigned long long st, unsigned long long en, vector est, vector lu) { @@ -129,6 +130,7 @@ struct distSharedData { end = en; Estimators = est; thisLookup = lu; + count = 0; } }; /**************************************************************************************************/ @@ -230,7 +232,7 @@ static DWORD WINAPI MyDistSharedThreadFunction(LPVOID lpParam){ vector subset; for (int k = pDataArray->start; k < pDataArray->end; k++) { // pass cdd each set of groups to compare - + pDataArray->count++; for (int l = 0; l < k; l++) { if (k != l) { //we dont need to similiarity of a groups to itself diff --git a/metastatscommand.cpp b/metastatscommand.cpp index 8e61b37..9dff354 100644 --- a/metastatscommand.cpp +++ b/metastatscommand.cpp @@ -431,6 +431,9 @@ int MetaStatsCommand::process(vector& thisLookUp){ //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->num)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->num) + " groups assigned to it, quitting. \n"); m->control_pressed = true; + } for (int j = 0; j < pDataArray[i]->thisLookUp.size(); j++) { delete pDataArray[i]->thisLookUp[j]; } for (int j = 0; j < pDataArray[i]->outputNames.size(); j++) { outputNames.push_back(pDataArray[i]->outputNames[j]); diff --git a/metastatscommand.h b/metastatscommand.h index 7884130..12e0aeb 100644 --- a/metastatscommand.h +++ b/metastatscommand.h @@ -68,7 +68,7 @@ struct metastatsData { vector designMapGroups; vector outputNames; int start; - int num, iters; + int num, iters, count; float threshold; MothurOut* m; string sharedfile; @@ -86,6 +86,7 @@ struct metastatsData { designMapGroups = dg; iters = i; threshold = thr; + count=0; } }; /**************************************************************************************************/ @@ -99,7 +100,7 @@ static DWORD WINAPI MyMetastatsThreadFunction(LPVOID lpParam){ //for each combo for (int c = pDataArray->start; c < (pDataArray->start+pDataArray->num); c++) { - + pDataArray->count++; //get set names string setA = pDataArray->namesOfGroupCombos[c][0]; string setB = pDataArray->namesOfGroupCombos[c][1]; diff --git a/mothurout.cpp b/mothurout.cpp index 54cdd33..1b72137 100644 --- a/mothurout.cpp +++ b/mothurout.cpp @@ -440,10 +440,22 @@ void MothurOut::errorOut(exception& e, string object, string function) { //double vm, rss; //mem_usage(vm, rss); - mothurOut("[ERROR]: "); - mothurOut(toString(e.what())); - mothurOut(" has occurred in the " + object + " class function " + function + ". Please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry."); - mothurOutEndLine(); + string errorType = toString(e.what()); + + int pos = errorType.find("bad_alloc"); + mothurOut("[ERROR]: "); + mothurOut(errorType); + + if (pos == string::npos) { //not bad_alloc + mothurOut(" has occurred in the " + object + " class function " + function + ". Please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry."); + mothurOutEndLine(); + }else { //bad alloc + if (object == "cluster"){ + mothurOut(" has occurred in the " + object + " class function " + function + ". This error indicates your computer is running out of memory. There are two common causes for this, file size and format.\n\nFile Size:\nThe cluster command loads your distance matrix into RAM, and your distance file is most likely too large to fit in RAM. There are two options to help with this. The first is to use a cutoff. By using a cutoff mothur will only load distances that are below the cutoff. If that is still not enough, there is a command called cluster.split, http://www.mothur.org/wiki/cluster.split which divides the distance matrix, and clusters the smaller pieces separately. You may also be able to reduce the size of the original distance matrix by using the commands outlined in the Schloss SOP, http://www.mothur.org/wiki/Schloss_SOP. \n\nWrong Format:\nThis error can be caused by trying to read a column formatted distance matrix using the phylip parameter. By default, the dist.seqs command generates a column formatted distance matrix. To make a phylip formatted matrix set the dist.seqs command parameter output to lt. \n\nIf you are uable to resolve the issue, please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry."); + }else { + mothurOut(" has occurred in the " + object + " class function " + function + ". This error indicates your computer is running out of memory. This is most commonly caused by trying to process a dataset too large, or a file format issue. If you are running our 32bit version, your memory usage is limited to 4G. If you have more than 4G of RAM and are running a 64bit OS, using our 64bit version may resolve your issue. Also, you may be able to reduce the size of your dataset by using the commands outlined in the Schloss SOP, http://www.mothur.org/wiki/Schloss_SOP. If you are uable to resolve the issue, please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry."); + } + } } /*********************************************************************************************/ //The following was originally from http://stackoverflow.com/questions/669438/how-to-get-memory-usage-at-run-time-in-c diff --git a/pairwiseseqscommand.cpp b/pairwiseseqscommand.cpp index 0f86028..767fdb5 100644 --- a/pairwiseseqscommand.cpp +++ b/pairwiseseqscommand.cpp @@ -581,6 +581,9 @@ void PairwiseSeqsCommand::createProcesses(string filename) { //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->end-pDataArray[i]->start)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end-pDataArray[i]->start) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } CloseHandle(hThreadArray[i]); delete pDataArray[i]; } diff --git a/pairwiseseqscommand.h b/pairwiseseqscommand.h index 33fcfca..06dbad9 100644 --- a/pairwiseseqscommand.h +++ b/pairwiseseqscommand.h @@ -128,7 +128,7 @@ static DWORD WINAPI MyPairwiseSquareThreadFunction(LPVOID lpParam){ outFile.setf(ios::fixed, ios::showpoint); outFile << setprecision(4); - pDataArray->count = pDataArray->end; + pDataArray->count = 0; int startTime = time(NULL); @@ -162,6 +162,7 @@ static DWORD WINAPI MyPairwiseSquareThreadFunction(LPVOID lpParam){ if(pDataArray->start == 0){ outFile << pDataArray->alignDB.getNumSeqs() << endl; } for(int i=pDataArray->start;iend;i++){ + pDataArray->count++; string name = pDataArray->alignDB.get(i).getName(); //pad with spaces to make compatible @@ -201,7 +202,7 @@ static DWORD WINAPI MyPairwiseSquareThreadFunction(LPVOID lpParam){ } } - pDataArray->m->mothurOut(toString(pDataArray->end-1) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); + pDataArray->m->mothurOut(toString(pDataArray->count) + "\t" + toString(time(NULL) - startTime)); pDataArray->m->mothurOutEndLine(); outFile.close(); delete alignment; diff --git a/pcrseqscommand.h b/pcrseqscommand.h index 9fc4041..c6f7ff9 100644 --- a/pcrseqscommand.h +++ b/pcrseqscommand.h @@ -132,9 +132,9 @@ static DWORD WINAPI MyPcrThreadFunction(LPVOID lpParam){ } set lengths; - pDataArray->count = pDataArray->fend; + for(int i = 0; i < pDataArray->fend; i++){ //end is the number of sequences to process - + pDataArray->count++; if (pDataArray->m->control_pressed) { break; } Sequence currSeq(inFASTA); pDataArray->m->gobble(inFASTA); diff --git a/prcseqscommand.cpp b/prcseqscommand.cpp index 5fc9f98..4d5b6d9 100644 --- a/prcseqscommand.cpp +++ b/prcseqscommand.cpp @@ -516,6 +516,9 @@ int PcrSeqsCommand::createProcesses(string filename, string goodFileName, string //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->fend) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->fend) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } for (set::iterator it = pDataArray[i]->badSeqNames.begin(); it != pDataArray[i]->badSeqNames.end(); it++) { badSeqNames.insert(*it); } CloseHandle(hThreadArray[i]); delete pDataArray[i]; diff --git a/preclustercommand.cpp b/preclustercommand.cpp index 19616d8..a1d5f48 100644 --- a/preclustercommand.cpp +++ b/preclustercommand.cpp @@ -464,6 +464,9 @@ int PreClusterCommand::createProcessesGroups(string newFName, string newNName, s //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->end-pDataArray[i]->start)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end-pDataArray[i]->start) + " groups assigned to it, quitting. \n"); m->control_pressed = true; + } for (int j = 0; j < pDataArray[i]->mapFileNames.size(); j++) { outputNames.push_back(pDataArray[i]->mapFileNames[j]); outputTypes["map"].push_back(pDataArray[i]->mapFileNames[j]); } diff --git a/preclustercommand.h b/preclustercommand.h index e956886..e076782 100644 --- a/preclustercommand.h +++ b/preclustercommand.h @@ -111,7 +111,7 @@ struct preClusterData { string newFName, newNName, newMName; MothurOut* m; int start; - int end; + int end, count; int diffs, threadID; vector groups; vector mapFileNames; @@ -133,6 +133,7 @@ struct preClusterData { groups = gr; countfile = c; topdown = td; + count=0; } }; @@ -164,6 +165,8 @@ static DWORD WINAPI MyPreclusterThreadFunction(LPVOID lpParam){ //precluster each group for (int k = pDataArray->start; k < pDataArray->end; k++) { + pDataArray->count++; + int start = time(NULL); if (pDataArray->m->control_pressed) { delete parser; return 0; } diff --git a/primerdesigncommand.cpp b/primerdesigncommand.cpp index f6ec7b5..48bb00f 100644 --- a/primerdesigncommand.cpp +++ b/primerdesigncommand.cpp @@ -889,7 +889,9 @@ vector PrimerDesignCommand::createProcessesConSeqs(map& n #else - counts = driverGetCounts(nameMap, fastaCount, otuCounts, 0, 1000); + unsigned long long start = 0; + unsigned long long end = 1000; + counts = driverGetCounts(nameMap, fastaCount, otuCounts, start, end); #endif //you will have a nameMap error if there is a namefile or countfile, but if those aren't given we want to make sure the fasta and list file match. diff --git a/screenseqscommand.cpp b/screenseqscommand.cpp index 2524e65..1e6b5a3 100644 --- a/screenseqscommand.cpp +++ b/screenseqscommand.cpp @@ -934,6 +934,9 @@ int ScreenSeqsCommand::createProcessesCreateSummary(vector& startPosition, //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } for (int k = 0; k < pDataArray[i]->startPosition.size(); k++) { startPosition.push_back(pDataArray[i]->startPosition[k]); } for (int k = 0; k < pDataArray[i]->endPosition.size(); k++) { endPosition.push_back(pDataArray[i]->endPosition[k]); } for (int k = 0; k < pDataArray[i]->seqLength.size(); k++) { seqLength.push_back(pDataArray[i]->seqLength[k]); } @@ -1518,6 +1521,9 @@ int ScreenSeqsCommand::createProcesses(string goodFileName, string badAccnos, st //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } for (set::iterator it = pDataArray[i]->badSeqNames.begin(); it != pDataArray[i]->badSeqNames.end(); it++) { badSeqNames.insert(*it); } CloseHandle(hThreadArray[i]); delete pDataArray[i]; diff --git a/screenseqscommand.h b/screenseqscommand.h index 284c9a5..6f4e8ac 100644 --- a/screenseqscommand.h +++ b/screenseqscommand.h @@ -149,9 +149,11 @@ static DWORD WINAPI MySumThreadFunction(LPVOID lpParam){ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); } - pDataArray->count = pDataArray->end; + for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process + pDataArray->count++; + if (pDataArray->m->control_pressed) { in.close(); pDataArray->count = 1; return 1; } Sequence current(in); pDataArray->m->gobble(in); @@ -213,9 +215,10 @@ static DWORD WINAPI MySumScreenThreadFunction(LPVOID lpParam){ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); } - pDataArray->count = pDataArray->end; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process + pDataArray->count++; + if (pDataArray->m->control_pressed) { in.close(); badAccnosFile.close(); goodFile.close(); pDataArray->count = 1; return 1; } Sequence currSeq(in); pDataArray->m->gobble(in); diff --git a/seqsummarycommand.cpp b/seqsummarycommand.cpp index 8f27b8c..fdf95ee 100644 --- a/seqsummarycommand.cpp +++ b/seqsummarycommand.cpp @@ -675,6 +675,9 @@ int SeqSummaryCommand::createProcessesCreateSummary(vector& startPosition, //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ num += pDataArray[i]->count; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } for (int k = 0; k < pDataArray[i]->startPosition.size(); k++) { startPosition.push_back(pDataArray[i]->startPosition[k]); } for (int k = 0; k < pDataArray[i]->endPosition.size(); k++) { endPosition.push_back(pDataArray[i]->endPosition[k]); } for (int k = 0; k < pDataArray[i]->seqLength.size(); k++) { seqLength.push_back(pDataArray[i]->seqLength[k]); } diff --git a/seqsummarycommand.h b/seqsummarycommand.h index c4e6131..552f4a0 100644 --- a/seqsummarycommand.h +++ b/seqsummarycommand.h @@ -114,9 +114,10 @@ static DWORD WINAPI MySeqSumThreadFunction(LPVOID lpParam){ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); } - pDataArray->count = pDataArray->end; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process + pDataArray->count++; + if (pDataArray->m->control_pressed) { in.close(); outSummary.close(); pDataArray->count = 1; return 1; } Sequence current(in); pDataArray->m->gobble(in); diff --git a/shhhseqscommand.cpp b/shhhseqscommand.cpp index 3e3e586..82d9561 100644 --- a/shhhseqscommand.cpp +++ b/shhhseqscommand.cpp @@ -474,6 +474,9 @@ vector ShhhSeqsCommand::createProcessesGroups(SequenceParser& parser, st //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->end-pDataArray[i]->start)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end-pDataArray[i]->start) + " groups assigned to it, quitting. \n"); m->control_pressed = true; + } for (int j = 0; j < pDataArray[i]->mapfileNames.size(); j++) { mapfileNames.push_back(pDataArray[i]->mapfileNames[j]); } diff --git a/shhhseqscommand.h b/shhhseqscommand.h index 4da1a84..ffd72b9 100644 --- a/shhhseqscommand.h +++ b/shhhseqscommand.h @@ -77,7 +77,7 @@ struct shhhseqsData { MothurOut* m; int start; int end; - int sigma, threadID; + int sigma, threadID, count; vector groups; vector mapfileNames; @@ -95,6 +95,7 @@ struct shhhseqsData { sigma = s; threadID = tid; groups = gr; + count=0; } }; @@ -113,6 +114,8 @@ static DWORD WINAPI MyShhhSeqsThreadFunction(LPVOID lpParam){ //precluster each group for (int k = pDataArray->start; k < pDataArray->end; k++) { + pDataArray->count++; + int start = time(NULL); if (pDataArray->m->control_pressed) { return 0; } diff --git a/summaryqualcommand.cpp b/summaryqualcommand.cpp index ae5b652..0f6f719 100644 --- a/summaryqualcommand.cpp +++ b/summaryqualcommand.cpp @@ -441,7 +441,10 @@ int SummaryQualCommand::createProcessesCreateSummary(vector& position, vect //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ - numSeqs += pDataArray[i]->count; + numSeqs += pDataArray[i]->numSeqs; + if (pDataArray[i]->count != pDataArray[i]->end) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } int tempNum = pDataArray[i]->position.size(); if (position.size() < tempNum) { position.resize(tempNum, 0); } if (averageQ.size() < tempNum) { averageQ.resize(tempNum, 0); } diff --git a/summaryqualcommand.h b/summaryqualcommand.h index 49583b0..b9edc51 100644 --- a/summaryqualcommand.h +++ b/summaryqualcommand.h @@ -66,7 +66,7 @@ struct seqSumQualData { string filename; unsigned long long start; unsigned long long end; - int count; + int count, numSeqs; MothurOut* m; bool hasNameMap; map nameMap; @@ -101,7 +101,8 @@ static DWORD WINAPI MySeqSumQualThreadFunction(LPVOID lpParam){ in.seekg(pDataArray->start-1); pDataArray->m->gobble(in); } - int count = 0; + pDataArray->count = 0; + pDataArray->numSeqs = 0; for(int i = 0; i < pDataArray->end; i++){ //end is the number of sequences to process if (pDataArray->m->control_pressed) { in.close(); pDataArray->count = 1; return 1; } @@ -138,11 +139,11 @@ static DWORD WINAPI MySeqSumQualThreadFunction(LPVOID lpParam){ else { pDataArray->scores.at(i)[thisScores[i]] += num; } } - count += num; + pDataArray->numSeqs += num; + pDataArray->count++; } } - pDataArray->count = count; in.close(); return 0; diff --git a/summarysharedcommand.cpp b/summarysharedcommand.cpp index 9893ea7..e82d1f6 100644 --- a/summarysharedcommand.cpp +++ b/summarysharedcommand.cpp @@ -742,6 +742,9 @@ int SummarySharedCommand::process(vector thisLookup, string //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->end-pDataArray[i]->start)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end-pDataArray[i]->start) + " groups assigned to it, quitting. \n"); m->control_pressed = true; + } m->appendFiles((sumFileName + toString(processIDS[i]) + ".temp"), sumFileName); m->mothurRemove((sumFileName + toString(processIDS[i]) + ".temp")); diff --git a/summarysharedcommand.h b/summarysharedcommand.h index f486d52..8ba9b9f 100644 --- a/summarysharedcommand.h +++ b/summarysharedcommand.h @@ -112,6 +112,7 @@ struct summarySharedData { unsigned long long end; MothurOut* m; string sumFile; + int count; summarySharedData(){} summarySharedData(string sf, MothurOut* mout, unsigned long long st, unsigned long long en, vector est, vector lu) { @@ -121,6 +122,7 @@ struct summarySharedData { end = en; Estimators = est; thisLookup = lu; + count=0; } }; /**************************************************************************************************/ @@ -225,7 +227,7 @@ static DWORD WINAPI MySummarySharedThreadFunction(LPVOID lpParam){ vector subset; for (int k = pDataArray->start; k < pDataArray->end; k++) { // pass cdd each set of groups to compare - + pDataArray->count++; for (int l = 0; l < k; l++) { outputFileHandle << pDataArray->thisLookup[0]->getLabel() << '\t'; diff --git a/treegroupscommand.cpp b/treegroupscommand.cpp index 7803d89..0df53d5 100644 --- a/treegroupscommand.cpp +++ b/treegroupscommand.cpp @@ -890,6 +890,9 @@ int TreeGroupCommand::process(vector thisLookup) { //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != (pDataArray[i]->end-pDataArray[i]->start)) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->end-pDataArray[i]->start) + " groups assigned to it, quitting. \n"); m->control_pressed = true; + } for (int j = 0; j < pDataArray[i]->thisLookup.size(); j++) { delete pDataArray[i]->thisLookup[j]; } for (int k = 0; k < calcDists.size(); k++) { diff --git a/treegroupscommand.h b/treegroupscommand.h index 979612f..36c852b 100644 --- a/treegroupscommand.h +++ b/treegroupscommand.h @@ -139,6 +139,7 @@ struct treeSharedData { unsigned long long start; unsigned long long end; MothurOut* m; + int count; treeSharedData(){} treeSharedData(MothurOut* mout, unsigned long long st, unsigned long long en, vector est, vector lu) { @@ -147,6 +148,7 @@ struct treeSharedData { end = en; Estimators = est; thisLookup = lu; + count=0; } }; /**************************************************************************************************/ @@ -249,6 +251,8 @@ static DWORD WINAPI MyTreeSharedThreadFunction(LPVOID lpParam){ vector subset; for (int k = pDataArray->start; k < pDataArray->end; k++) { // pass cdd each set of groups to compare + pDataArray->count++; + for (int l = 0; l < k; l++) { if (k != l) { //we dont need to similiarity of a groups to itself diff --git a/trimseqscommand.cpp b/trimseqscommand.cpp index 5308407..b208209 100644 --- a/trimseqscommand.cpp +++ b/trimseqscommand.cpp @@ -1152,6 +1152,9 @@ int TrimSeqsCommand::createProcessesCreateTrim(string filename, string qFileName //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ + if (pDataArray[i]->count != pDataArray[i]->lineEnd) { + m->mothurOut("[ERROR]: process " + toString(i) + " only processed " + toString(pDataArray[i]->count) + " of " + toString(pDataArray[i]->lineEnd) + " sequences assigned to it, quitting. \n"); m->control_pressed = true; + } for (map::iterator it = pDataArray[i]->groupCounts.begin(); it != pDataArray[i]->groupCounts.end(); it++) { map::iterator it2 = groupCounts.find(it->first); if (it2 == groupCounts.end()) { groupCounts[it->first] = it->second; } diff --git a/trimseqscommand.h b/trimseqscommand.h index 891b14d..2ab7de3 100644 --- a/trimseqscommand.h +++ b/trimseqscommand.h @@ -254,7 +254,7 @@ static DWORD WINAPI MyTrimThreadFunction(LPVOID lpParam){ TrimOligos trimOligos(pDataArray->pdiffs, pDataArray->bdiffs, pDataArray->ldiffs, pDataArray->sdiffs, pDataArray->primers, pDataArray->barcodes, pDataArray->revPrimer, pDataArray->linker, pDataArray->spacer); - pDataArray->count = pDataArray->lineEnd; + pDataArray->count = 0; for(int i = 0; i < pDataArray->lineEnd; i++){ //end is the number of sequences to process if (pDataArray->m->control_pressed) { @@ -281,6 +281,7 @@ static DWORD WINAPI MyTrimThreadFunction(LPVOID lpParam){ string origSeq = currSeq.getUnaligned(); if (origSeq != "") { + pDataArray->count++; int barcodeIndex = 0; int primerIndex = 0;