X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=summaryqualcommand.cpp;h=5a073677804ae2e3176f08a3d4ff1e26a1bc5c03;hb=e10c72304ee071c0c40e0218a06d89dc4731cbc2;hp=a0d786f47518290bd71b88d15f386326d61acd64;hpb=b302d221847b504388ec044c6929e9dde42f9bb1;p=mothur.git diff --git a/summaryqualcommand.cpp b/summaryqualcommand.cpp index a0d786f..5a07367 100644 --- a/summaryqualcommand.cpp +++ b/summaryqualcommand.cpp @@ -8,13 +8,14 @@ */ #include "summaryqualcommand.h" - +#include "counttable.h" //********************************************************************************************************************** vector SummaryQualCommand::setParameters(){ try { CommandParameter pqual("qfile", "InputTypes", "", "", "none", "none", "none",false,true); parameters.push_back(pqual); - CommandParameter pname("name", "InputTypes", "", "", "none", "none", "none",false,false); parameters.push_back(pname); + CommandParameter pname("name", "InputTypes", "", "", "namecount", "none", "none",false,false); parameters.push_back(pname); + CommandParameter pcount("count", "InputTypes", "", "", "namecount", "none", "none",false,false); parameters.push_back(pcount); CommandParameter pprocessors("processors", "Number", "", "1", "", "", "",false,false); parameters.push_back(pprocessors); CommandParameter pinputdir("inputdir", "String", "", "", "", "", "",false,false); parameters.push_back(pinputdir); CommandParameter poutputdir("outputdir", "String", "", "", "", "", "",false,false); parameters.push_back(poutputdir); @@ -32,9 +33,10 @@ vector SummaryQualCommand::setParameters(){ string SummaryQualCommand::getHelpString(){ try { string helpString = ""; - helpString += "The summary.qual command reads a quality file and an optional name file, and summarizes the quality information.\n"; - helpString += "The summary.tax command parameters are qfile, name and processors. qfile is required, unless you have a valid current quality file.\n"; + helpString += "The summary.qual command reads a quality file and an optional name or count file, and summarizes the quality information.\n"; + helpString += "The summary.tax command parameters are qfile, name, count and processors. qfile is required, unless you have a valid current quality file.\n"; helpString += "The name parameter allows you to enter a name file associated with your quality file. \n"; + helpString += "The count parameter allows you to enter a count file associated with your quality file. \n"; helpString += "The summary.qual command should be in the following format: \n"; helpString += "summary.qual(qfile=yourQualityFile) \n"; helpString += "Note: No spaces between parameter labels (i.e. qfile), '=' and parameters (i.e.yourQualityFile).\n"; @@ -45,7 +47,26 @@ string SummaryQualCommand::getHelpString(){ exit(1); } } - +//********************************************************************************************************************** +string SummaryQualCommand::getOutputFileNameTag(string type, string inputName=""){ + try { + string outputFileName = ""; + map >::iterator it; + + //is this a type this command creates + it = outputTypes.find(type); + if (it == outputTypes.end()) { m->mothurOut("[ERROR]: this command doesn't create a " + type + " output file.\n"); } + else { + if (type == "summary") { outputFileName = "qual.summary"; } + else { m->mothurOut("[ERROR]: No definition for type " + type + " output file tag.\n"); m->control_pressed = true; } + } + return outputFileName; + } + catch(exception& e) { + m->errorOut(e, "SummaryQualCommand", "getOutputFileNameTag"); + exit(1); + } +} //********************************************************************************************************************** SummaryQualCommand::SummaryQualCommand(){ try { @@ -103,6 +124,14 @@ SummaryQualCommand::SummaryQualCommand(string option) { //if the user has not given a path then, add inputdir. else leave path alone. if (path == "") { parameters["name"] = inputDir + it->second; } } + + it = parameters.find("count"); + //user has given a template file + if(it != parameters.end()){ + path = m->hasPath(it->second); + //if the user has not given a path then, add inputdir. else leave path alone. + if (path == "") { parameters["count"] = inputDir + it->second; } + } } //initialize outputTypes @@ -122,6 +151,13 @@ SummaryQualCommand::SummaryQualCommand(string option) { if (namefile == "not open") { namefile = ""; abort = true; } else if (namefile == "not found") { namefile = ""; } else { m->setNameFile(namefile); } + + countfile = validParameter.validFile(parameters, "count", true); + if (countfile == "not open") { abort = true; countfile = ""; } + else if (countfile == "not found") { countfile = ""; } + else { m->setCountTableFile(countfile); } + + if ((countfile != "") && (namefile != "")) { m->mothurOut("You must enter ONLY ONE of the following: count or name."); m->mothurOutEndLine(); abort = true; } //if the user changes the output directory command factory will send this info to us in the output parameter outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){ @@ -133,10 +169,13 @@ SummaryQualCommand::SummaryQualCommand(string option) { m->setProcessors(temp); m->mothurConvert(temp, processors); - if (namefile == "") { - vector files; files.push_back(qualfile); - parser.getNameFile(files); - } + + if (countfile == "") { + if (namefile == "") { + vector files; files.push_back(qualfile); + parser.getNameFile(files); + } + } } } catch(exception& e) { @@ -160,9 +199,14 @@ int SummaryQualCommand::execute(){ if (m->control_pressed) { return 0; } if (namefile != "") { nameMap = m->readNames(namefile); } - + else if (countfile != "") { + CountTable ct; + ct.readTable(countfile); + nameMap = ct.getNameMap(); + } + 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 @@ -170,6 +214,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; @@ -188,7 +233,7 @@ int SummaryQualCommand::execute(){ if (m->control_pressed) { return 0; } //print summary file - string summaryFile = outputDir + m->getRootName(m->getSimpleName(qualfile)) + "qual.summary"; + string summaryFile = outputDir + m->getRootName(m->getSimpleName(qualfile)) + getOutputFileNameTag("summary"); printQual(summaryFile, position, averageQ, scores); if (m->control_pressed) { m->mothurRemove(summaryFile); return 0; } @@ -237,7 +282,7 @@ int SummaryQualCommand::driverCreateSummary(vector& position, vector& if (current.getName() != "") { int num = 1; - if (namefile != "") { + if ((namefile != "") || (countfile != "")) { //make sure this sequence is in the namefile, else error map::iterator it = nameMap.find(current.getName()); @@ -267,7 +312,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 @@ -291,7 +336,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) { @@ -380,11 +425,14 @@ int SummaryQualCommand::createProcessesCreateSummary(vector& position, vect DWORD dwThreadIdArray[processors]; HANDLE hThreadArray[processors]; + bool hasNameMap = false; + if ((namefile !="") || (countfile != "")) { hasNameMap = true; } + //Create processor worker threads. for( int i=0; i& position, vector< if (m->control_pressed) { out.close(); return 0; } - float average = averageQ[i] / (float) position[i]; + double average = averageQ[i] / (float) position[i]; out << i << '\t' << position[i] << '\t' << average << '\t'; for (int j = 0; j < 41; j++) {