X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sharedcommand.cpp;h=213fd49588bbf8a9278bc04c14d474bd11ccb278;hb=aa9238c0a9e6e7aa0ed8b8b606b08ad4fd7dcfe3;hp=aba07b2a8d97503913cff85fedde5d8562ca4f5c;hpb=462fca6d24fd15ca035358ff70bcfae52c3281c3;p=mothur.git diff --git a/sharedcommand.cpp b/sharedcommand.cpp index aba07b2..213fd49 100644 --- a/sharedcommand.cpp +++ b/sharedcommand.cpp @@ -11,37 +11,50 @@ //********************************************************************************************************************** -SharedCommand::SharedCommand(){ +SharedCommand::SharedCommand(string o) : outputDir(o) { try { globaldata = GlobalData::getInstance(); //getting output filename filename = globaldata->inputFileName; - filename = getRootName(filename); + if (outputDir == "") { outputDir += hasPath(filename); } + + filename = outputDir + getRootName(getSimpleName(filename)); filename = filename + "shared"; + openOutputFile(filename, out); + pickedGroups = false; groupMap = globaldata->gGroupmap; + //if hte user has not specified any groups then use them all + if (globaldata->Groups.size() == 0) { + groups = groupMap->namesOfGroups; + }else{ //they have specified groups + groups = globaldata->Groups; + pickedGroups = true; + } + //fill filehandles with neccessary ofstreams int i; ofstream* temp; - for (i=0; igetNumGroups(); i++) { + for (i=0; inamesOfGroups[i]] = temp; + filehandles[groups[i]] = temp; } //set fileroot - fileroot = getRootName(globaldata->getListFile()); + fileroot = outputDir + getRootName(getSimpleName(globaldata->getListFile())); //clears file before we start to write to it below - for (int i=0; igetNumGroups(); i++) { - remove((fileroot + groupMap->namesOfGroups[i] + ".rabund").c_str()); + for (int i=0; ierrorOut(e, "SharedCommand", "SharedCommand"); exit(1); } } @@ -51,9 +64,9 @@ int SharedCommand::execute(){ try { //lookup.clear(); - int count = 1; string errorOff = "no error"; - + //errorOff = ""; + //read in listfile read = new ReadOTUFile(globaldata->inputFileName); read->read(&*globaldata); @@ -64,8 +77,19 @@ int SharedCommand::execute(){ string lastLabel = SharedList->getLabel(); vector lookup; - if (SharedList->getNumSeqs() != groupMap->getNumSeqs()) { - mothurOut("Your group file contains " + toString(groupMap->getNumSeqs()) + " sequences and list file contains " + toString(SharedList->getNumSeqs()) + " sequences. Please correct."); mothurOutEndLine(); + 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 + 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 createMisMatchFile(); @@ -73,46 +97,103 @@ int SharedCommand::execute(){ for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { delete it3->second; } + delete input; + globaldata->ginput = NULL; delete SharedList; globaldata->gSharedList = NULL; return 1; } + //if user has specified groups make new groupfile for them + if (globaldata->Groups.size() != 0) { //make new group file + string groups = ""; + for (int i = 0; i < globaldata->Groups.size(); i++) { + groups += globaldata->Groups[i] + "."; + } + + string newGroupFile = outputDir + getRootName(getSimpleName(globaldata->inputFileName)) + groups + "groups"; + ofstream outGroups; + openOutputFile(newGroupFile, outGroups); + + vector names = groupMap->getNamesSeqs(); + string groupName; + for (int i = 0; i < names.size(); i++) { + groupName = groupMap->getGroup(names[i]); + if (isValidGroup(groupName, globaldata->Groups)) { + outGroups << names[i] << '\t' << groupName << endl; + } + } + outGroups.close(); + } + //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label. set processedLabels; - set userLabels = globaldata->labels; - set userLines = globaldata->lines; - + 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) || (userLabels.size() != 0) || (userLines.size() != 0))) { - - - if(globaldata->allLines == 1 || globaldata->lines.count(count) == 1 || globaldata->labels.count(SharedList->getLabel()) == 1){ + if(globaldata->allLines == 1 || globaldata->labels.count(SharedList->getLabel()) == 1){ lookup = SharedList->getSharedRAbundVector(); - mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); + m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); + if (pickedGroups) { //check for otus with no seqs in them + eliminateZeroOTUS(lookup); + } + + 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; igetLabel()); userLabels.erase(SharedList->getLabel()); - userLines.erase(count); } if ((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(); - mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); + m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); + if (pickedGroups) { //check for otus with no seqs in them + eliminateZeroOTUS(lookup); + } + + + 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; igetLabel()); userLabels.erase(SharedList->getLabel()); + + //restore real lastlabel to save below + SharedList->setLabel(saveLabel); } @@ -120,8 +201,6 @@ int SharedCommand::execute(){ delete SharedList; SharedList = input->getSharedListVector(); //get new list vector to process - - count++; } //output error messages about any remaining user labels @@ -133,13 +212,24 @@ int SharedCommand::execute(){ } } - //run last line if you need to + //run last label if you need to if (needToRun == true) { if (SharedList != NULL) { delete SharedList; } SharedList = input->getSharedListVector(lastLabel); //get new list vector to process lookup = SharedList->getSharedRAbundVector(); - mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); + m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); + if (pickedGroups) { //check for otus with no seqs in them + eliminateZeroOTUS(lookup); + } + + 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; isetFormat("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); } } @@ -168,6 +277,7 @@ void SharedCommand::printSharedData(vector thislookup) { //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); @@ -179,25 +289,71 @@ void SharedCommand::printSharedData(vector thislookup) { } catch(exception& e) { - errorOut(e, "SharedCommand", "printSharedData"); + m->errorOut(e, "SharedCommand", "printSharedData"); exit(1); } } //********************************************************************************************************************** -void SharedCommand::createMisMatchFile() { +int SharedCommand::eliminateZeroOTUS(vector& thislookup) { + try { + + vector newLookup; + for (int i = 0; i < thislookup.size(); i++) { + SharedRAbundVector* temp = new SharedRAbundVector(); + temp->setLabel(thislookup[i]->getLabel()); + temp->setGroup(thislookup[i]->getGroup()); + newLookup.push_back(temp); + } + + //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; + for (int j = 0; j < thislookup.size(); j++) { + if (thislookup[j]->getAbundance(i) != 0) { allZero = false; break; } + } + + //if they are not all zero add this bin + if (!allZero) { + for (int j = 0; j < thislookup.size(); j++) { + newLookup[j]->push_back(thislookup[j]->getAbundance(i), thislookup[j]->getGroup()); + } + } + //else{ cout << "bin # " << i << " is all zeros" << endl; } + } + + for (int j = 0; j < thislookup.size(); j++) { delete thislookup[j]; } + thislookup = newLookup; + + return 0; + + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "eliminateZeroOTUS"); + exit(1); + } +} +//********************************************************************************************************************** +int SharedCommand::createMisMatchFile() { try { ofstream outMisMatch; - string outputMisMatchName = getRootName(globaldata->inputFileName); + string outputMisMatchName = outputDir + getRootName(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(); 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); @@ -207,11 +363,20 @@ void SharedCommand::createMisMatchFile() { 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(); @@ -220,22 +385,32 @@ 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->getNumSeqs(); i++) { + for (int i = 0; i < SharedList->getNumBins(); i++) { + if (m->control_pressed) { return 0; } + string names = SharedList->get(i); - + while (names.find_first_of(',') != -1) { 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; } @@ -249,6 +424,7 @@ void SharedCommand::createMisMatchFile() { //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]); @@ -259,10 +435,11 @@ void SharedCommand::createMisMatchFile() { } outMisMatch.close(); } - + + return 0; } catch(exception& e) { - errorOut(e, "SharedCommand", "createMisMatchFile"); + m->errorOut(e, "SharedCommand", "createMisMatchFile"); exit(1); } } @@ -276,3 +453,20 @@ SharedCommand::~SharedCommand(){ } //********************************************************************************************************************** + +bool SharedCommand::isValidGroup(string groupname, vector groups) { + try { + for (int i = 0; i < groups.size(); i++) { + if (groupname == groups[i]) { return true; } + } + + return false; + } + catch(exception& e) { + m->errorOut(e, "SharedCommand", "isValidGroup"); + exit(1); + } +} +/************************************************************/ + +