X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=classifyotucommand.cpp;h=3469c82c0c1507604e87ea05efc30ca74927e09f;hb=1d5962b46d9e72a2b855b4176d1c47df9a163fac;hp=00f04b08d6a6d42437faced7e76c736e6075d5cb;hpb=b4f80c1d2be78a8743a408a2b6d462b07f9f71ff;p=mothur.git diff --git a/classifyotucommand.cpp b/classifyotucommand.cpp index 00f04b0..3469c82 100644 --- a/classifyotucommand.cpp +++ b/classifyotucommand.cpp @@ -10,7 +10,54 @@ #include "classifyotucommand.h" #include "phylotree.h" - +//********************************************************************************************************************** +vector ClassifyOtuCommand::getValidParameters(){ + try { + string AlignArray[] = {"list","label","name","taxonomy","cutoff","probs","outputdir","inputdir"}; + vector myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string))); + return myArray; + } + catch(exception& e) { + m->errorOut(e, "ClassifyOtuCommand", "getValidParameters"); + exit(1); + } +} +//********************************************************************************************************************** +ClassifyOtuCommand::ClassifyOtuCommand(){ + try { + abort = true; + //initialize outputTypes + vector tempOutNames; + outputTypes["constaxonomy"] = tempOutNames; + } + catch(exception& e) { + m->errorOut(e, "ClassifyOtuCommand", "ClassifyOtuCommand"); + exit(1); + } +} +//********************************************************************************************************************** +vector ClassifyOtuCommand::getRequiredParameters(){ + try { + string Array[] = {"list","taxonomy"}; + vector myArray (Array, Array+(sizeof(Array)/sizeof(string))); + return myArray; + } + catch(exception& e) { + m->errorOut(e, "ClassifyOtuCommand", "getRequiredParameters"); + exit(1); + } +} +//********************************************************************************************************************** +vector ClassifyOtuCommand::getRequiredFiles(){ + try { + vector myArray; + return myArray; + } + catch(exception& e) { + m->errorOut(e, "ClassifyOtuCommand", "getRequiredFiles"); + exit(1); + } +} //********************************************************************************************************************** ClassifyOtuCommand::ClassifyOtuCommand(string option) { try{ @@ -37,6 +84,10 @@ ClassifyOtuCommand::ClassifyOtuCommand(string option) { if (validParameter.isValidParameter(it->first, myArray, it->second) != true) { abort = true; } } + //initialize outputTypes + vector tempOutNames; + outputTypes["constaxonomy"] = tempOutNames; + //if the user changes the input directory command factory will send this info to us in the output parameter string inputDir = validParameter.validFile(parameters, "inputdir", false); if (inputDir == "not found"){ inputDir = ""; } @@ -45,7 +96,7 @@ ClassifyOtuCommand::ClassifyOtuCommand(string option) { it = parameters.find("list"); //user has given a template file if(it != parameters.end()){ - path = hasPath(it->second); + path = m->hasPath(it->second); //if the user has not given a path then, add inputdir. else leave path alone. if (path == "") { parameters["list"] = inputDir + it->second; } } @@ -53,7 +104,7 @@ ClassifyOtuCommand::ClassifyOtuCommand(string option) { it = parameters.find("name"); //user has given a template file if(it != parameters.end()){ - path = hasPath(it->second); + path = m->hasPath(it->second); //if the user has not given a path then, add inputdir. else leave path alone. if (path == "") { parameters["name"] = inputDir + it->second; } } @@ -61,7 +112,7 @@ ClassifyOtuCommand::ClassifyOtuCommand(string option) { it = parameters.find("taxonomy"); //user has given a template file if(it != parameters.end()){ - path = hasPath(it->second); + path = m->hasPath(it->second); //if the user has not given a path then, add inputdir. else leave path alone. if (path == "") { parameters["taxonomy"] = inputDir + it->second; } } @@ -89,7 +140,7 @@ ClassifyOtuCommand::ClassifyOtuCommand(string option) { label = validParameter.validFile(parameters, "label", false); if (label == "not found") { label = ""; allLines = 1; } else { - if(label != "all") { splitAtDash(label, labels); allLines = 0; } + if(label != "all") { m->splitAtDash(label, labels); allLines = 0; } else { allLines = 1; } } @@ -97,7 +148,7 @@ ClassifyOtuCommand::ClassifyOtuCommand(string option) { convert(temp, cutoff); temp = validParameter.validFile(parameters, "probs", false); if (temp == "not found"){ temp = "true"; } - probs = isTrue(temp); + probs = m->isTrue(temp); if ((cutoff < 51) || (cutoff > 100)) { m->mothurOut("cutoff must be above 50, and no greater than 100."); m->mothurOutEndLine(); abort = true; } @@ -157,7 +208,7 @@ int ClassifyOtuCommand::execute(){ set processedLabels; set userLabels = labels; - if (m->control_pressed) { delete input; delete list; for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } return 0; } + if (m->control_pressed) { outputTypes.clear(); delete input; delete list; for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } return 0; } while((list != NULL) && ((allLines == 1) || (userLabels.size() != 0))) { @@ -165,13 +216,13 @@ int ClassifyOtuCommand::execute(){ m->mothurOut(list->getLabel() + "\t" + toString(list->size())); m->mothurOutEndLine(); process(list); - if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } delete input; delete list; return 0; } + if (m->control_pressed) { outputTypes.clear(); for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } delete input; delete list; return 0; } processedLabels.insert(list->getLabel()); userLabels.erase(list->getLabel()); } - if ((anyLabelsToProcess(list->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { + if ((m->anyLabelsToProcess(list->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = list->getLabel(); delete list; @@ -180,7 +231,7 @@ int ClassifyOtuCommand::execute(){ process(list); - if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } delete input; delete list; return 0; } + if (m->control_pressed) { outputTypes.clear(); for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } delete input; delete list; return 0; } processedLabels.insert(list->getLabel()); userLabels.erase(list->getLabel()); @@ -216,12 +267,12 @@ int ClassifyOtuCommand::execute(){ process(list); delete list; - if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } delete input; delete list; return 0; } + if (m->control_pressed) { outputTypes.clear(); for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } delete input; delete list; return 0; } } delete input; - if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } return 0; } + if (m->control_pressed) { outputTypes.clear(); for (int i = 0; i < outputNames.size(); i++) { remove(outputNames[i].c_str()); } return 0; } m->mothurOutEndLine(); m->mothurOut("Output File Names: "); m->mothurOutEndLine(); @@ -241,18 +292,18 @@ int ClassifyOtuCommand::readNamesFile() { try { ifstream inNames; - openInputFile(namefile, inNames); + m->openInputFile(namefile, inNames); string name, names; - while(inNames){ + while(!inNames.eof()){ inNames >> name; //read from first column A inNames >> names; //read from second column A,B,C,D - gobble(inNames); + m->gobble(inNames); //parse names into vector vector theseNames; - splitAtComma(names, theseNames); + m->splitAtComma(names, theseNames); for (int i = 0; i < theseNames.size(); i++) { nameMap[theseNames[i]] = name; } @@ -272,13 +323,13 @@ int ClassifyOtuCommand::readTaxonomyFile() { try { ifstream in; - openInputFile(taxfile, in); + m->openInputFile(taxfile, in); string name, tax; while(!in.eof()){ in >> name >> tax; - gobble(in); + m->gobble(in); //are there confidence scores, if so remove them if (tax.find_first_of('(') != -1) { removeConfidences(tax); } @@ -306,16 +357,17 @@ string ClassifyOtuCommand::findConsensusTaxonomy(int bin, ListVector* thisList, //parse names into vector string binnames = thisList->get(bin); - splitAtComma(binnames, names); + m->splitAtComma(binnames, names); //create a tree containing sequences from this bin PhyloTree* phylo = new PhyloTree(); size = 0; for (int i = 0; i < names.size(); i++) { - + //if namesfile include the names if (namefile != "") { + //is this sequence in the name file - namemap maps seqName -> repSeqName it2 = nameMap.find(names[i]); @@ -327,7 +379,8 @@ string ClassifyOtuCommand::findConsensusTaxonomy(int bin, ListVector* thisList, it = taxMap.find(it2->second); if (it == taxMap.end()) { //this name is not in taxonomy file, skip it - if (names[i] != it->second) { m->mothurOut(names[i] + " is represented by " + it2->second + " and is not in your taxonomy file. I will not include it in the consensus."); m->mothurOutEndLine(); } + + if (names[i] != it2->second) { m->mothurOut(names[i] + " is represented by " + it2->second + " and is not in your taxonomy file. I will not include it in the consensus."); m->mothurOutEndLine(); } else { m->mothurOut(names[i] + " is not in your taxonomy file. I will not include it in the consensus."); m->mothurOutEndLine(); } }else{ @@ -397,7 +450,7 @@ string ClassifyOtuCommand::findConsensusTaxonomy(int bin, ListVector* thisList, } - if (conTax == "") { conTax = "unclassified;"; } + if (conTax == "") { conTax = "no_consensus;"; } delete phylo; @@ -417,17 +470,20 @@ int ClassifyOtuCommand::process(ListVector* processList) { int size; //create output file - if (outputDir == "") { outputDir += hasPath(listfile); } + if (outputDir == "") { outputDir += m->hasPath(listfile); } ofstream out; - string outputFile = outputDir + getRootName(getSimpleName(listfile)) + processList->getLabel() + ".cons.taxonomy"; - openOutputFile(outputFile, out); - outputNames.push_back(outputFile); + string outputFile = outputDir + m->getRootName(m->getSimpleName(listfile)) + processList->getLabel() + ".cons.taxonomy"; + m->openOutputFile(outputFile, out); + outputNames.push_back(outputFile); outputTypes["constaxonomy"].push_back(outputFile); + + out << "OTU\tSize\tTaxonomy" << endl; //for each bin in the list vector for (int i = 0; i < processList->getNumBins(); i++) { + conTax = findConsensusTaxonomy(i, processList, size); - + if (m->control_pressed) { out.close(); return 0; } //output to new names file