X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancecommand.cpp;h=3d667227ae2219347f2523ee1ff8286988299423;hb=74d3aaf0f85080ea3cfb1f1871e706bab9f48392;hp=f09aa997a506076b99584228c2b2272a6530a6fc;hpb=8f909cf6870cc2e4d8ed8cff69a203f6f83a160b;p=mothur.git diff --git a/distancecommand.cpp b/distancecommand.cpp index f09aa99..3d66722 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -14,6 +14,7 @@ #include "onegapdist.h" #include "onegapignore.h" + //********************************************************************************************************************** vector DistanceCommand::getValidParameters(){ try { @@ -29,7 +30,7 @@ vector DistanceCommand::getValidParameters(){ //********************************************************************************************************************** DistanceCommand::DistanceCommand(){ try { - //initialize outputTypes + abort = true; calledHelp = true; vector tempOutNames; outputTypes["phylip"] = tempOutNames; outputTypes["column"] = tempOutNames; @@ -47,7 +48,7 @@ vector DistanceCommand::getRequiredParameters(){ return myArray; } catch(exception& e) { - m->errorOut(e, "ChopSeqsCommand", "getRequiredParameters"); + m->errorOut(e, "DistanceCommand", "getRequiredParameters"); exit(1); } } @@ -65,11 +66,11 @@ vector DistanceCommand::getRequiredFiles(){ //********************************************************************************************************************** DistanceCommand::DistanceCommand(string option) { try { - abort = false; + abort = false; calledHelp = false; Estimators.clear(); //allow user to run help - if(option == "help") { help(); abort = true; } + if(option == "help") { help(); abort = true; calledHelp = true; } else { //valid paramters for this command @@ -209,13 +210,7 @@ DistanceCommand::DistanceCommand(string option) { //********************************************************************************************************************** -DistanceCommand::~DistanceCommand(){ - - for(int i=0;i processors) { break; } + } + } + } + + if (numDists < processors) { processors = numDists; } + for (int i = 0; i < processors; i++) { - lines.push_back(new linePair()); + distlinePair tempLine; + lines.push_back(tempLine); if (output != "square") { - lines[i]->start = int (sqrt(float(i)/float(processors)) * numSeqs); - lines[i]->end = int (sqrt(float(i+1)/float(processors)) * numSeqs); + lines[i].start = int (sqrt(float(i)/float(processors)) * numSeqs); + lines[i].end = int (sqrt(float(i+1)/float(processors)) * numSeqs); }else{ - lines[i]->start = int ((float(i)/float(processors)) * numSeqs); - lines[i]->end = int ((float(i+1)/float(processors)) * numSeqs); + lines[i].start = int ((float(i)/float(processors)) * numSeqs); + lines[i].end = int ((float(i+1)/float(processors)) * numSeqs); } + } - - createProcesses(outputFile); - - map::iterator it = processIDS.begin(); - rename((outputFile + toString(it->second) + ".temp").c_str(), outputFile.c_str()); - it++; - //append and remove temp files - for (; it != processIDS.end(); it++) { - m->appendFiles((outputFile + toString(it->second) + ".temp"), outputFile); - remove((outputFile + toString(it->second) + ".temp").c_str()); - } + createProcesses(outputFile); } #else //ifstream inFASTA; @@ -525,7 +527,7 @@ int DistanceCommand::execute(){ void DistanceCommand::createProcesses(string filename) { try { #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - int process = 0; + int process = 1; processIDS.clear(); //loop through and create all the processes you want @@ -533,20 +535,36 @@ void DistanceCommand::createProcesses(string filename) { int pid = fork(); if (pid > 0) { - processIDS[lines[process]->end] = pid; //create map from line number to pid so you can append files in correct order later + processIDS.push_back(pid); //create map from line number to pid so you can append files in correct order later process++; }else if (pid == 0){ - if (output != "square") { driver(lines[process]->start, lines[process]->end, filename + toString(getpid()) + ".temp", cutoff); } - else { driver(lines[process]->start, lines[process]->end, filename + toString(getpid()) + ".temp", "square"); } + if (output != "square") { driver(lines[process].start, lines[process].end, filename + toString(getpid()) + ".temp", cutoff); } + else { driver(lines[process].start, lines[process].end, filename + toString(getpid()) + ".temp", "square"); } + exit(0); + }else { + m->mothurOut("[ERROR]: unable to spawn the necessary processes. Error code: " + toString(pid)); m->mothurOutEndLine(); + perror(" : "); + for (int i=0;imothurOut("unable to spawn the necessary processes."); m->mothurOutEndLine(); exit(0); } + } } - + + //parent does its part + if (output != "square") { driver(lines[0].start, lines[0].end, filename, cutoff); } + else { driver(lines[0].start, lines[0].end, filename, "square"); } + + //force parent to wait until all the processes are done - for (map::iterator it = processIDS.begin(); it != processIDS.end(); it++) { - int temp = it->second; + for (int i=0;iappendFiles((filename + toString(processIDS[i]) + ".temp"), filename); + remove((filename + toString(processIDS[i]) + ".temp").c_str()); + } #endif } catch(exception& e) { @@ -1132,9 +1150,11 @@ bool DistanceCommand::sanityCheck() { remove(outputFile.c_str()); //temp file is bad because file mismatch above } + return good; + } catch(exception& e) { - m->errorOut(e, "DistanceCommand", "m->appendFiles"); + m->errorOut(e, "DistanceCommand", "sanityCheck"); exit(1); } }