X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=summaryqualcommand.cpp;h=5c175106ecb2584d07ca15a06c71f27284a3571c;hb=d205e70ae86dbee2efc2df02f2717975854de6ba;hp=0969a1216f3f2152ef21d0e453a6920dff1d663a;hpb=0718c426add1df69adcc24444ef45550fb262ca7;p=mothur.git diff --git a/summaryqualcommand.cpp b/summaryqualcommand.cpp index 0969a12..5c17510 100644 --- a/summaryqualcommand.cpp +++ b/summaryqualcommand.cpp @@ -111,7 +111,7 @@ SummaryQualCommand::SummaryQualCommand(string option) { //check for required parameters qualfile = validParameter.validFile(parameters, "qfile", true); - if (qualfile == "not open") { abort = true; } + if (qualfile == "not open") { qualfile = ""; abort = true; } else if (qualfile == "not found") { qualfile = m->getQualFile(); if (qualfile != "") { m->mothurOut("Using " + qualfile + " as input file for the qfile parameter."); m->mothurOutEndLine(); } @@ -131,7 +131,12 @@ SummaryQualCommand::SummaryQualCommand(string option) { string temp = validParameter.validFile(parameters, "processors", false); if (temp == "not found"){ temp = m->getProcessors(); } m->setProcessors(temp); - convert(temp, processors); + m->mothurConvert(temp, processors); + + if (namefile == "") { + vector files; files.push_back(qualfile); + parser.getNameFile(files); + } } } catch(exception& e) { @@ -157,7 +162,7 @@ int SummaryQualCommand::execute(){ if (namefile != "") { nameMap = m->readNames(namefile); } vector positions; -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) positions = m->divideFile(qualfile, processors); for (int i = 0; i < (positions.size()-1); i++) { lines.push_back(linePair(positions[i], positions[(i+1)])); } #else @@ -165,6 +170,7 @@ int SummaryQualCommand::execute(){ lines.push_back(linePair(0, 1000)); }else { positions = m->setFilePosFasta(qualfile, numSeqs); + if (positions.size() < processors) { processors = positions.size(); } //figure out how many sequences you have to process int numSeqsPerProcessor = numSeqs / processors; @@ -262,7 +268,7 @@ int SummaryQualCommand::driverCreateSummary(vector& position, vector& count += num; } -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) unsigned long long pos = in.tellg(); if ((pos == -1) || (pos >= filePos.end)) { break; } #else @@ -286,7 +292,7 @@ int SummaryQualCommand::createProcessesCreateSummary(vector& position, vect int numSeqs = 0; processIDS.clear(); -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) //loop through and create all the processes you want while (process != processors) { @@ -368,7 +374,7 @@ int SummaryQualCommand::createProcessesCreateSummary(vector& position, vect ////////////////////////////////////////////////////////////////////////////////////////////////////// //Windows version shared memory, so be careful when passing variables through the seqSumQualData struct. //Above fork() will clone, so memory is separate, but that's not the case with windows, - //Taking advantage of shared memory to allow both threads to add info to vectors. + //Taking advantage of shared memory to pass results vectors. ////////////////////////////////////////////////////////////////////////////////////////////////////// vector pDataArray; @@ -379,12 +385,10 @@ int SummaryQualCommand::createProcessesCreateSummary(vector& position, vect for( int i=0; i& position, vect //Close all thread handles and free memory allocations. for(int i=0; i < pDataArray.size(); i++){ numSeqs += pDataArray[i]->count; + int tempNum = pDataArray[i]->position.size(); + if (position.size() < tempNum) { position.resize(tempNum, 0); } + if (averageQ.size() < tempNum) { averageQ.resize(tempNum, 0); } + if (scores.size() < tempNum) { + scores.resize(tempNum); + for (int i = 0; i < scores.size(); i++) { scores[i].resize(41, 0); } + } + + for (int k = 0; k < tempNum; k++) { position[k] += pDataArray[i]->position[k]; } + for (int k = 0; k < tempNum; k++) { averageQ[k] += pDataArray[i]->averageQ[k]; } + for (int k = 0; k < tempNum; k++) { for (int j = 0; j < 41; j++) { scores[k][j] += pDataArray[i]->scores[k][j]; } } + CloseHandle(hThreadArray[i]); delete pDataArray[i]; }