X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sharedcommand.cpp;h=2ce9bbcded2ba51409f9d130489953a3753ea438;hb=05a0195e07c42c996592ee1c8abb63adedb7f493;hp=9afb401014faaf097a1a30c2b1802d82ae8e659f;hpb=ac1da2a793271cb67f2a2155c5558e1fabdd6aba;p=mothur.git diff --git a/sharedcommand.cpp b/sharedcommand.cpp index 9afb401..2ce9bbc 100644 --- a/sharedcommand.cpp +++ b/sharedcommand.cpp @@ -51,38 +51,54 @@ int SharedCommand::execute(){ try { //lookup.clear(); - int count = 1; string errorOff = "no error"; //read in listfile read = new ReadOTUFile(globaldata->inputFileName); read->read(&*globaldata); + delete read; input = globaldata->ginput; SharedList = globaldata->gSharedList; 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(); + + out.close(); + remove(filename.c_str()); //remove blank shared file you made + + createMisMatchFile(); + + //delete memory + for (it3 = filehandles.begin(); it3 != filehandles.end(); it3++) { + delete it3->second; + } + delete SharedList; + globaldata->gSharedList = NULL; + + return 1; + } + //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; - while((SharedList != NULL) && ((globaldata->allLines == 1) || (userLabels.size() != 0) || (userLines.size() != 0))) { + while((SharedList != NULL) && ((globaldata->allLines == 1) || (userLabels.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() + "\t" + toString(count)); mothurOutEndLine(); + mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); printSharedData(lookup); //prints info to the .shared file for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } processedLabels.insert(SharedList->getLabel()); userLabels.erase(SharedList->getLabel()); - userLines.erase(count); } if ((anyLabelsToProcess(SharedList->getLabel(), userLabels, errorOff) == true) && (processedLabels.count(lastLabel) != 1)) { @@ -90,7 +106,7 @@ int SharedCommand::execute(){ SharedList = input->getSharedListVector(lastLabel); //get new list vector to process lookup = SharedList->getSharedRAbundVector(); - mothurOut(lookup[0]->getLabel() + "\t" + toString(count)); mothurOutEndLine(); + mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); printSharedData(lookup); //prints info to the .shared file for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } @@ -104,8 +120,6 @@ int SharedCommand::execute(){ delete SharedList; SharedList = input->getSharedListVector(); //get new list vector to process - - count++; } //output error messages about any remaining user labels @@ -117,13 +131,13 @@ int SharedCommand::execute(){ } } - //run last line if you need to + //run last label if you need to if (needToRun == true) { - delete SharedList; + if (SharedList != NULL) { delete SharedList; } SharedList = input->getSharedListVector(lastLabel); //get new list vector to process lookup = SharedList->getSharedRAbundVector(); - mothurOut(lookup[0]->getLabel() + "\t" + toString(count)); mothurOutEndLine(); + mothurOut(lookup[0]->getLabel()); mothurOutEndLine(); printSharedData(lookup); //prints info to the .shared file for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } @@ -131,7 +145,6 @@ int SharedCommand::execute(){ } globaldata->gSharedList = NULL; - delete read; out.close(); @@ -168,6 +181,89 @@ void SharedCommand::printSharedData(vector thislookup) { exit(1); } } +//********************************************************************************************************************** +void SharedCommand::createMisMatchFile() { + try { + ofstream outMisMatch; + string outputMisMatchName = getRootName(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(); + + openOutputFile(outputMisMatchName, outMisMatch); + + //go through list and if group returns "not found" output it + for (int i = 0; i < SharedList->getNumBins(); i++) { + + 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()); + string group = groupMap->getGroup(name); + + if(group == "not found") { outMisMatch << name << endl; } + } + + //get last name + string group = groupMap->getGroup(names); + if(group == "not found") { outMisMatch << names << endl; } + } + + outMisMatch.close(); + + + }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(); + + map namesInList; + + //go through listfile and get names + for (int i = 0; i < SharedList->getNumSeqs(); i++) { + + 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()); + + namesInList[name] = name; + } + + //get last name + namesInList[names] = names; + } + + //get names of sequences in groupfile + vector seqNames = groupMap->getNamesSeqs(); + + map::iterator itMatch; + + 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++) { + + itMatch = namesInList.find(seqNames[i]); + + if (itMatch == namesInList.end()) { + + outMisMatch << seqNames[i] << endl; + } + } + outMisMatch.close(); + } + + } + catch(exception& e) { + errorOut(e, "SharedCommand", "createMisMatchFile"); + exit(1); + } +} //**********************************************************************************************************************