X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sharedcommand.cpp;h=c252b4fecc9cebad935e0970fa88aaf5d43e7ac0;hb=e99751591aa21705e58edda87383457b9738dd9e;hp=efc45c191482cc191fa204e526758a81af4bf910;hpb=315e38cf393c82be238da5b32574f225a020d25c;p=mothur.git diff --git a/sharedcommand.cpp b/sharedcommand.cpp index efc45c1..c252b4f 100644 --- a/sharedcommand.cpp +++ b/sharedcommand.cpp @@ -8,21 +8,78 @@ */ #include "sharedcommand.h" +//******************************************************************************************************************** +//sorts lowest to highest +inline bool compareSharedRabunds(SharedRAbundVector* left, SharedRAbundVector* right){ + return (left->getGroup() < right->getGroup()); +} +//********************************************************************************************************************** +vector SharedCommand::getValidParameters(){ + try { + vector myArray; + return myArray; + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "getValidParameters"); + exit(1); + } +} +//********************************************************************************************************************** +SharedCommand::SharedCommand(){ + try { + //initialize outputTypes + vector tempOutNames; + outputTypes["rabund"] = tempOutNames; + outputTypes["shared"] = tempOutNames; + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "SharedCommand"); + exit(1); + } +} +//********************************************************************************************************************** +vector SharedCommand::getRequiredParameters(){ + try { + vector myArray; + return myArray; + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "getRequiredParameters"); + exit(1); + } +} +//********************************************************************************************************************** +vector SharedCommand::getRequiredFiles(){ + try { + vector myArray; + return myArray; + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "getRequiredFiles"); + exit(1); + } +} //********************************************************************************************************************** SharedCommand::SharedCommand(string o) : outputDir(o) { try { globaldata = GlobalData::getInstance(); + //initialize outputTypes + vector tempOutNames; + outputTypes["rabund"] = tempOutNames; + outputTypes["shared"] = tempOutNames; + //getting output filename filename = globaldata->inputFileName; - if (outputDir == "") { outputDir += hasPath(filename); } + if (outputDir == "") { outputDir += m->hasPath(filename); } - filename = outputDir + getRootName(getSimpleName(filename)); + filename = outputDir + m->getRootName(m->getSimpleName(filename)); filename = filename + "shared"; + outputTypes["shared"].push_back(filename); - openOutputFile(filename, out); + m->openOutputFile(filename, out); pickedGroups = false; groupMap = globaldata->gGroupmap; @@ -44,16 +101,18 @@ SharedCommand::SharedCommand(string o) : outputDir(o) { } //set fileroot - fileroot = outputDir + getRootName(getSimpleName(globaldata->getListFile())); + fileroot = outputDir + m->getRootName(m->getSimpleName(globaldata->getListFile())); //clears file before we start to write to it below for (int i=0; ierrorOut(e, "SharedCommand", "SharedCommand"); exit(1); } } @@ -65,7 +124,10 @@ int SharedCommand::execute(){ //lookup.clear(); string errorOff = "no error"; //errorOff = ""; -cout << globaldata->inputFileName << endl; + + //if user provided an order file containing the order the shared file should be in read it + if (globaldata->getOrderGroupFile() != "") { readOrderFile(); } + //read in listfile read = new ReadOTUFile(globaldata->inputFileName); read->read(&*globaldata); @@ -76,8 +138,16 @@ cout << globaldata->inputFileName << endl; string lastLabel = SharedList->getLabel(); vector lookup; + if (m->control_pressed) { + delete input; delete SharedList; globaldata->ginput = NULL; globaldata->gSharedList = NULL; + for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + out.close(); remove(filename.c_str()); + for (int i=0; iGroups.size() == 0) && (SharedList->getNumSeqs() != groupMap->getNumSeqs())) { //if the user has not specified any groups and their files don't match exit with error - mothurOut("Your group file contains " + toString(groupMap->getNumSeqs()) + " sequences and list file contains " + toString(SharedList->getNumSeqs()) + " sequences. Please correct."); mothurOutEndLine(); + m->mothurOut("Your group file contains " + toString(groupMap->getNumSeqs()) + " sequences and list file contains " + toString(SharedList->getNumSeqs()) + " sequences. Please correct."); m->mothurOutEndLine(); out.close(); remove(filename.c_str()); //remove blank shared file you made @@ -88,6 +158,8 @@ cout << globaldata->inputFileName << endl; for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + delete input; + globaldata->ginput = NULL; delete SharedList; globaldata->gSharedList = NULL; @@ -101,9 +173,9 @@ cout << globaldata->inputFileName << endl; groups += globaldata->Groups[i] + "."; } - string newGroupFile = getRootName(globaldata->inputFileName) + groups + "groups"; + string newGroupFile = outputDir + m->getRootName(m->getSimpleName(globaldata->inputFileName)) + groups + "groups"; ofstream outGroups; - openOutputFile(newGroupFile, outGroups); + m->openOutputFile(newGroupFile, outGroups); vector names = groupMap->getNamesSeqs(); string groupName; @@ -121,14 +193,31 @@ cout << globaldata->inputFileName << endl; set userLabels = globaldata->labels; while((SharedList != NULL) && ((globaldata->allLines == 1) || (userLabels.size() != 0))) { + if (m->control_pressed) { + delete input; delete SharedList; globaldata->ginput = NULL; globaldata->gSharedList = NULL; + for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + out.close(); remove(filename.c_str()); + for (int i=0; iallLines == 1 || globaldata->labels.count(SharedList->getLabel()) == 1){ - + lookup = SharedList->getSharedRAbundVector(); + + m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); if (pickedGroups) { //check for otus with no seqs in them eliminateZeroOTUS(lookup); } - mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); + + if (m->control_pressed) { + delete input; delete SharedList; globaldata->ginput = NULL; globaldata->gSharedList = NULL; + for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } + for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + out.close(); remove(filename.c_str()); + for (int i=0; iinputFileName << endl; userLabels.erase(SharedList->getLabel()); } - if ((anyLabelsToProcess(SharedList->getLabel(), userLabels, errorOff) == true) && (processedLabels.count(lastLabel) != 1)) { + if ((m->anyLabelsToProcess(SharedList->getLabel(), userLabels, errorOff) == true) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = SharedList->getLabel(); delete SharedList; SharedList = input->getSharedListVector(lastLabel); //get new list vector to process lookup = SharedList->getSharedRAbundVector(); + m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); if (pickedGroups) { //check for otus with no seqs in them eliminateZeroOTUS(lookup); } - mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); + + + if (m->control_pressed) { + delete input; delete SharedList; globaldata->ginput = NULL; globaldata->gSharedList = NULL; + for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } + for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + out.close(); remove(filename.c_str()); + for (int i=0; iinputFileName << endl; SharedList = input->getSharedListVector(lastLabel); //get new list vector to process lookup = SharedList->getSharedRAbundVector(); + m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); if (pickedGroups) { //check for otus with no seqs in them eliminateZeroOTUS(lookup); } - mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); + + if (m->control_pressed) { + delete input; globaldata->ginput = NULL; + for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + out.close(); remove(filename.c_str()); + for (int i=0; iinputFileName << endl; delete it3->second; } + + //change format to shared to speed up commands + globaldata->setFormat("sharedfile"); + globaldata->setListFile(""); + globaldata->setGroupFile(""); globaldata->setSharedFile(filename); + + if (m->control_pressed) { + delete input; globaldata->ginput = NULL; + remove(filename.c_str()); + for (int i=0; imothurOutEndLine(); + m->mothurOut("Output File Names: "); m->mothurOutEndLine(); + for (int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); } + m->mothurOut(filename); m->mothurOutEndLine(); + m->mothurOutEndLine(); + return 0; } catch(exception& e) { - errorOut(e, "SharedCommand", "execute"); + m->errorOut(e, "SharedCommand", "execute"); exit(1); } } @@ -212,26 +338,63 @@ cout << globaldata->inputFileName << endl; void SharedCommand::printSharedData(vector thislookup) { try { - //initialize bin values - for (int i = 0; i < thislookup.size(); i++) { -//cout << "in printData " << thislookup[i]->getLabel() << '\t' << thislookup[i]->getGroup() << endl; - out << thislookup[i]->getLabel() << '\t' << thislookup[i]->getGroup() << '\t'; - thislookup[i]->print(out); + if (order.size() == 0) { //user has not specified an order so do aplabetically + sort(thislookup.begin(), thislookup.end(), compareSharedRabunds); + + globaldata->Groups.clear(); + + //initialize bin values + for (int i = 0; i < thislookup.size(); i++) { + out << thislookup[i]->getLabel() << '\t' << thislookup[i]->getGroup() << '\t'; + thislookup[i]->print(out); + + globaldata->Groups.push_back(thislookup[i]->getGroup()); + + RAbundVector rav = thislookup[i]->getRAbundVector(); + m->openOutputFileAppend(fileroot + thislookup[i]->getGroup() + ".rabund", *(filehandles[thislookup[i]->getGroup()])); + rav.print(*(filehandles[thislookup[i]->getGroup()])); + (*(filehandles[thislookup[i]->getGroup()])).close(); + } + }else{ + //create a map from groupName to each sharedrabund + map myMap; + map::iterator myIt; + + for (int i = 0; i < thislookup.size(); i++) { + myMap[thislookup[i]->getGroup()] = thislookup[i]; + } + + globaldata->Groups.clear(); - RAbundVector rav = thislookup[i]->getRAbundVector(); - openOutputFileAppend(fileroot + thislookup[i]->getGroup() + ".rabund", *(filehandles[thislookup[i]->getGroup()])); - rav.print(*(filehandles[thislookup[i]->getGroup()])); - (*(filehandles[thislookup[i]->getGroup()])).close(); + //loop through ordered list and print the rabund + for (int i = 0; i < order.size(); i++) { + myIt = myMap.find(order[i]); + + if(myIt != myMap.end()) { //we found it + out << (myIt->second)->getLabel() << '\t' << (myIt->second)->getGroup() << '\t'; + (myIt->second)->print(out); + + globaldata->Groups.push_back((myIt->second)->getGroup()); + + RAbundVector rav = (myIt->second)->getRAbundVector(); + m->openOutputFileAppend(fileroot + (myIt->second)->getGroup() + ".rabund", *(filehandles[(myIt->second)->getGroup()])); + rav.print(*(filehandles[(myIt->second)->getGroup()])); + (*(filehandles[(myIt->second)->getGroup()])).close(); + }else{ + m->mothurOut("Can't find shared info for " + order[i] + ", skipping."); m->mothurOutEndLine(); + } + } + } } catch(exception& e) { - errorOut(e, "SharedCommand", "printSharedData"); + m->errorOut(e, "SharedCommand", "printSharedData"); exit(1); } } //********************************************************************************************************************** -void SharedCommand::eliminateZeroOTUS(vector& thislookup) { +int SharedCommand::eliminateZeroOTUS(vector& thislookup) { try { vector newLookup; @@ -244,6 +407,7 @@ void SharedCommand::eliminateZeroOTUS(vector& thislookup) { //for each bin for (int i = 0; i < thislookup[0]->getNumBins(); i++) { + if (m->control_pressed) { for (int j = 0; j < newLookup.size(); j++) { delete newLookup[j]; } return 0; } //look at each sharedRabund and make sure they are not all zero bool allZero = true; @@ -262,29 +426,34 @@ void SharedCommand::eliminateZeroOTUS(vector& thislookup) { for (int j = 0; j < thislookup.size(); j++) { delete thislookup[j]; } thislookup = newLookup; - + + return 0; } catch(exception& e) { - errorOut(e, "SharedCommand", "eliminateZeroOTUS"); + m->errorOut(e, "SharedCommand", "eliminateZeroOTUS"); exit(1); } } //********************************************************************************************************************** -void SharedCommand::createMisMatchFile() { +int SharedCommand::createMisMatchFile() { try { ofstream outMisMatch; - string outputMisMatchName = getRootName(globaldata->inputFileName); + string outputMisMatchName = outputDir + m->getRootName(m->getSimpleName(globaldata->inputFileName)); //you have sequences in your list file that are not in your group file if (SharedList->getNumSeqs() > groupMap->getNumSeqs()) { outputMisMatchName += "missing.group"; - mothurOut("For a list of names that are in your list file and not in your group file, please refer to " + outputMisMatchName + "."); mothurOutEndLine(); + m->mothurOut("For a list of names that are in your list file and not in your group file, please refer to " + outputMisMatchName + "."); m->mothurOutEndLine(); + + m->openOutputFile(outputMisMatchName, outMisMatch); - openOutputFile(outputMisMatchName, outMisMatch); + map listNames; + map::iterator itList; //go through list and if group returns "not found" output it for (int i = 0; i < SharedList->getNumBins(); i++) { + if (m->control_pressed) { outMisMatch.close(); remove(outputMisMatchName.c_str()); return 0; } string names = SharedList->get(i); @@ -292,13 +461,22 @@ void SharedCommand::createMisMatchFile() { string name = names.substr(0,names.find_first_of(',')); names = names.substr(names.find_first_of(',')+1, names.length()); string group = groupMap->getGroup(name); - + if(group == "not found") { outMisMatch << name << endl; } + + itList = listNames.find(name); + if (itList != listNames.end()) { m->mothurOut(name + " is in your list file more than once. Sequence names must be unique. please correct."); m->mothurOutEndLine(); } + else { listNames[name] = name; } } //get last name string group = groupMap->getGroup(names); - if(group == "not found") { outMisMatch << names << endl; } + if(group == "not found") { outMisMatch << names << endl; } + + itList = listNames.find(names); + if (itList != listNames.end()) { m->mothurOut(names + " is in your list file more than once. Sequence names must be unique. please correct."); m->mothurOutEndLine(); } + else { listNames[names] = names; } + } outMisMatch.close(); @@ -307,12 +485,15 @@ void SharedCommand::createMisMatchFile() { }else {//you have sequences in your group file that are not in you list file outputMisMatchName += "missing.name"; - mothurOut("For a list of names that are in your group file and not in your list file, please refer to " + outputMisMatchName + "."); mothurOutEndLine(); + m->mothurOut("For a list of names that are in your group file and not in your list file, please refer to " + outputMisMatchName + "."); m->mothurOutEndLine(); map namesInList; + map::iterator itList; //go through listfile and get names for (int i = 0; i < SharedList->getNumBins(); i++) { + if (m->control_pressed) { return 0; } + string names = SharedList->get(i); @@ -320,9 +501,16 @@ void SharedCommand::createMisMatchFile() { string name = names.substr(0,names.find_first_of(',')); names = names.substr(names.find_first_of(',')+1, names.length()); + itList = namesInList.find(name); + if (itList != namesInList.end()) { m->mothurOut(name + " is in your list file more than once. Sequence names must be unique. please correct."); m->mothurOutEndLine(); } + namesInList[name] = name; + } + itList = namesInList.find(names); + if (itList != namesInList.end()) { m->mothurOut(names + " is in your list file more than once. Sequence names must be unique. please correct."); m->mothurOutEndLine(); } + //get last name namesInList[names] = names; } @@ -332,10 +520,11 @@ void SharedCommand::createMisMatchFile() { map::iterator itMatch; - openOutputFile(outputMisMatchName, outMisMatch); + m->openOutputFile(outputMisMatchName, outMisMatch); //loop through names in seqNames and if they aren't in namesIn list output them for (int i = 0; i < seqNames.size(); i++) { + if (m->control_pressed) { outMisMatch.close(); remove(outputMisMatchName.c_str()); return 0; } itMatch = namesInList.find(seqNames[i]); @@ -346,10 +535,11 @@ void SharedCommand::createMisMatchFile() { } outMisMatch.close(); } - + + return 0; } catch(exception& e) { - errorOut(e, "SharedCommand", "createMisMatchFile"); + m->errorOut(e, "SharedCommand", "createMisMatchFile"); exit(1); } } @@ -361,7 +551,32 @@ SharedCommand::~SharedCommand(){ } - +//********************************************************************************************************************** +int SharedCommand::readOrderFile() { + try { + //remove old names + order.clear(); + + ifstream in; + m->openInputFile(globaldata->getOrderGroupFile(), in); + string thisGroup; + + while(!in.eof()){ + in >> thisGroup; m->gobble(in); + + order.push_back(thisGroup); + + if (m->control_pressed) { order.clear(); break; } + } + in.close(); + + return 0; + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "readOrderFile"); + exit(1); + } +} //********************************************************************************************************************** bool SharedCommand::isValidGroup(string groupname, vector groups) { @@ -373,7 +588,7 @@ bool SharedCommand::isValidGroup(string groupname, vector groups) { return false; } catch(exception& e) { - errorOut(e, "SharedCommand", "isValidGroup"); + m->errorOut(e, "SharedCommand", "isValidGroup"); exit(1); } }