int TreeGroupCommand::makeSimsShared(InputData& input, SharedRAbundVectors*& lookup, CountTable& ct) { try { if (subsample) { if (subsampleSize == -1) { //user has not set size, set size = smallest samples size subsampleSize = lookup->getNumSeqsSmallestGroup(); }else { lookup->removeGroups(subsampleSize); Groups = lookup->getNamesGroups(); Treenames = Groups; } if (lookup->size() < 2) { m->mothurOut("You have not provided enough valid groups. I cannot run the command.\n"); m->setControl_pressed(true); return 0; } } numGroups = lookup->size(); set<string> processedLabels; set<string> userLabels = labels; //as long as you are not at the end of the file or done wih the lines you want while((lookup != NULL) && ((allLines == 1) || (userLabels.size() != 0))) { if (m->getControl_pressed()) { delete lookup; return 1; } if(allLines == 1 || labels.count(lookup->getLabel()) == 1){ m->mothurOut(lookup->getLabel()+"\n"); createProcesses(lookup, ct); processedLabels.insert(lookup->getLabel()); userLabels.erase(lookup->getLabel()); } if ((util.anyLabelsToProcess(lookup->getLabel(), userLabels, "") ) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = lookup->getLabel(); delete lookup; lookup = input.getSharedRAbundVectors(lastLabel); m->mothurOut(lookup->getLabel()+"\n"); createProcesses(lookup, ct); processedLabels.insert(lookup->getLabel()); userLabels.erase(lookup->getLabel()); //restore real lastlabel to save below lookup->setLabels(saveLabel); } lastLabel = lookup->getLabel(); //get next line to process delete lookup; lookup = input.getSharedRAbundVectors(); } if (m->getControl_pressed()) { return 1; } //output error messages about any remaining user labels set<string>::iterator it; bool needToRun = false; for (it = userLabels.begin(); it != userLabels.end(); it++) { m->mothurOut("Your file does not include the label " + *it); if (processedLabels.count(lastLabel) != 1) { m->mothurOut(". I will use " + lastLabel + ".\n"); needToRun = true; }else { m->mothurOut(". Please refer to " + lastLabel + ".\n"); } } //run last label if you need to if (needToRun ) { delete lookup; lookup = input.getSharedRAbundVectors(lastLabel); m->mothurOut(lookup->getLabel()+"\n"); createProcesses(lookup, ct); delete lookup; } return 0; } catch(exception& e) { m->errorOut(e, "TreeGroupCommand", "makeSimsShared"); exit(1); } }
//********************************************************************************************************************** int RemoveGroupsCommand::readShared(){ try { string thisOutputDir = outputDir; if (outputDir == "") { thisOutputDir += m->hasPath(sharedfile); } //get group names from sharedfile so we can set Groups to the groupNames we want to keep //that way we can take advantage of the reads in inputdata and sharedRabundVector InputData* tempInput = new InputData(sharedfile, "sharedfile"); vector<SharedRAbundVector*> lookup = tempInput->getSharedRAbundVectors(); map<string, string> variables; variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(sharedfile)); variables["[extension]"] = m->getExtension(sharedfile); //save m->Groups vector<string> allGroupsNames = m->getAllGroups(); vector<string> mothurOutGroups = m->getGroups(); vector<string> groupsToKeep; for (int i = 0; i < allGroupsNames.size(); i++) { if (!m->inUsersGroups(allGroupsNames[i], m->getGroups())) { groupsToKeep.push_back(allGroupsNames[i]); } } if (allGroupsNames.size() == groupsToKeep.size()) { m->mothurOut("Your file does not contain any groups you wish to remove."); m->mothurOutEndLine(); m->setGroups(mothurOutGroups); delete tempInput; for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } return 0; } //reset read for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } delete tempInput; m->setGroups(groupsToKeep); m->clearAllGroups(); m->saveNextLabel = ""; m->printedSharedHeaders = false; m->currentSharedBinLabels.clear(); m->sharedBinLabelsInFile.clear(); InputData input(sharedfile, "sharedfile"); lookup = input.getSharedRAbundVectors(); bool wroteSomething = false; while(lookup[0] != NULL) { variables["[tag]"] = lookup[0]->getLabel(); string outputFileName = getOutputFileName("shared", variables); ofstream out; m->openOutputFile(outputFileName, out); outputTypes["shared"].push_back(outputFileName); outputNames.push_back(outputFileName); if (m->control_pressed) { out.close(); m->mothurRemove(outputFileName); for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } return 0; } lookup[0]->printHeaders(out); for (int i = 0; i < lookup.size(); i++) { out << lookup[i]->getLabel() << '\t' << lookup[i]->getGroup() << '\t'; lookup[i]->print(out); wroteSomething = true; } //get next line to process //prevent memory leak for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } lookup = input.getSharedRAbundVectors(); out.close(); } m->setGroups(mothurOutGroups); if (wroteSomething == false) { m->mothurOut("Your file contains only the groups you wish to remove."); m->mothurOutEndLine(); } string groupsString = ""; for (int i = 0; i < Groups.size()-1; i++) { groupsString += Groups[i] + ", "; } groupsString += Groups[Groups.size()-1]; m->mothurOut("Removed groups: " + groupsString + " from your shared file."); m->mothurOutEndLine(); return 0; } catch(exception& e) { m->errorOut(e, "RemoveGroupsCommand", "readShared"); exit(1); } }
int CooccurrenceCommand::execute(){ try { if (abort == true) { if (calledHelp) { return 0; } return 2; } InputData* input = new InputData(sharedfile, "sharedfile"); vector<SharedRAbundVector*> lookup = input->getSharedRAbundVectors(); string lastLabel = lookup[0]->getLabel(); //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label. set<string> processedLabels; set<string> userLabels = labels; ofstream out; map<string, string> variables; variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(sharedfile)); string outputFileName = getOutputFileName("summary", variables); m->openOutputFile(outputFileName, out); outputNames.push_back(outputFileName); outputTypes["summary"].push_back(outputFileName); out.setf(ios::fixed, ios::floatfield); out.setf(ios::showpoint); out << "metric\tlabel\tScore\tzScore\tstandardDeviation\tnp_Pvalue\n"; //as long as you are not at the end of the file or done wih the lines you want while((lookup[0] != NULL) && ((allLines == 1) || (userLabels.size() != 0))) { if (m->control_pressed) { for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } delete input; out.close(); m->mothurRemove(outputFileName); return 0; } if(allLines == 1 || labels.count(lookup[0]->getLabel()) == 1){ m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); getCooccurrence(lookup, out); processedLabels.insert(lookup[0]->getLabel()); userLabels.erase(lookup[0]->getLabel()); } if ((m->anyLabelsToProcess(lookup[0]->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = lookup[0]->getLabel(); for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } lookup = input->getSharedRAbundVectors(lastLabel); m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); getCooccurrence(lookup, out); processedLabels.insert(lookup[0]->getLabel()); userLabels.erase(lookup[0]->getLabel()); //restore real lastlabel to save below lookup[0]->setLabel(saveLabel); } lastLabel = lookup[0]->getLabel(); //prevent memory leak for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; lookup[i] = NULL; } if (m->control_pressed) { outputTypes.clear(); delete input; out.close(); m->mothurRemove(outputFileName); return 0; } //get next line to process lookup = input->getSharedRAbundVectors(); } if (m->control_pressed) { delete input; out.close(); m->mothurRemove(outputFileName); return 0; } //output error messages about any remaining user labels set<string>::iterator it; bool needToRun = false; for (it = userLabels.begin(); it != userLabels.end(); it++) { m->mothurOut("Your file does not include the label " + *it); if (processedLabels.count(lastLabel) != 1) { m->mothurOut(". I will use " + lastLabel + "."); m->mothurOutEndLine(); needToRun = true; }else { m->mothurOut(". Please refer to " + lastLabel + "."); m->mothurOutEndLine(); } } //run last label if you need to if (needToRun == true) { for (int i = 0; i < lookup.size(); i++) { if (lookup[i] != NULL) { delete lookup[i]; } } lookup = input->getSharedRAbundVectors(lastLabel); m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine(); getCooccurrence(lookup, out); for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } } out.close(); //reset groups parameter delete input; m->clearGroups(); m->mothurOutEndLine(); m->mothurOut("Output File Names: "); m->mothurOutEndLine(); m->mothurOut(outputFileName); m->mothurOutEndLine(); m->mothurOutEndLine(); return 0; } catch(exception& e) { m->errorOut(e, "CooccurrenceCommand", "execute"); exit(1); } }