X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancecommand.cpp;h=3d667227ae2219347f2523ee1ff8286988299423;hb=662c0b60d65f79f672ab199300b7ee4975233465;hp=871e07b65510d33214d78c9efee3b3448d10d405;hpb=7bf581f8c46b08eb3bb40715dac94695edee4a67;p=mothur.git diff --git a/distancecommand.cpp b/distancecommand.cpp index 871e07b..3d66722 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -14,15 +14,63 @@ #include "onegapdist.h" #include "onegapignore.h" -//********************************************************************************************************************** +//********************************************************************************************************************** +vector DistanceCommand::getValidParameters(){ + try { + string Array[] = {"fasta","oldfasta","column", "output", "calc", "countends", "cutoff", "processors", "outputdir","inputdir","compress"}; + vector myArray (Array, Array+(sizeof(Array)/sizeof(string))); + return myArray; + } + catch(exception& e) { + m->errorOut(e, "DistanceCommand", "getValidParameters"); + exit(1); + } +} +//********************************************************************************************************************** +DistanceCommand::DistanceCommand(){ + try { + abort = true; calledHelp = true; + vector tempOutNames; + outputTypes["phylip"] = tempOutNames; + outputTypes["column"] = tempOutNames; + } + catch(exception& e) { + m->errorOut(e, "DistanceCommand", "DistanceCommand"); + exit(1); + } +} +//********************************************************************************************************************** +vector DistanceCommand::getRequiredParameters(){ + try { + string Array[] = {"fasta"}; + vector myArray (Array, Array+(sizeof(Array)/sizeof(string))); + return myArray; + } + catch(exception& e) { + m->errorOut(e, "DistanceCommand", "getRequiredParameters"); + exit(1); + } +} +//********************************************************************************************************************** +vector DistanceCommand::getRequiredFiles(){ + try { + vector myArray; + return myArray; + } + catch(exception& e) { + m->errorOut(e, "DistanceCommand", "getRequiredFiles"); + exit(1); + } +} +//********************************************************************************************************************** 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 @@ -41,6 +89,11 @@ DistanceCommand::DistanceCommand(string option) { if (validParameter.isValidParameter(it2->first, myArray, it2->second) != true) { abort = true; } } + //initialize outputTypes + vector tempOutNames; + outputTypes["phylip"] = tempOutNames; + outputTypes["column"] = tempOutNames; + //if the user changes the input directory command factory will send this info to us in the output parameter string inputDir = validParameter.validFile(parameters, "inputdir", false); if (inputDir == "not found"){ inputDir = ""; } @@ -157,13 +210,7 @@ DistanceCommand::DistanceCommand(string option) { //********************************************************************************************************************** -DistanceCommand::~DistanceCommand(){ - - for(int i=0;igetRootName(m->getSimpleName(fastafile)) + "phylip.dist"; - remove(outputFile.c_str()); + remove(outputFile.c_str()); outputTypes["phylip"].push_back(outputFile); //output numSeqs to phylip formatted dist file }else if (output == "column") { //user wants column format outputFile = outputDir + m->getRootName(m->getSimpleName(fastafile)) + "dist"; + outputTypes["column"].push_back(outputFile); //so we don't accidentally overwrite if (outputFile == column) { @@ -229,6 +277,7 @@ int DistanceCommand::execute(){ }else { //assume square outputFile = outputDir + m->getRootName(m->getSimpleName(fastafile)) + "square.dist"; remove(outputFile.c_str()); + outputTypes["phylip"].push_back(outputFile); } @@ -264,31 +313,31 @@ int DistanceCommand::execute(){ //delete filename; if (pid == 0) { //you are the root process - + //do your part string outputMyPart; driverMPI(start, end, outMPI, cutoff); - if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } //wait on chidren for(int i = 1; i < processors; i++) { - if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } - char buf[4]; - MPI_Recv(buf, 4, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); + char buf[5]; + MPI_Recv(buf, 5, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); } }else { //you are a child process //do your part driverMPI(start, end, outMPI, cutoff); - if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } - char buf[4]; + char buf[5]; strcpy(buf, "done"); //tell parent you are done. - MPI_Send(buf, 4, MPI_CHAR, 0, tag, MPI_COMM_WORLD); + MPI_Send(buf, 5, MPI_CHAR, 0, tag, MPI_COMM_WORLD); } MPI_File_close(&outMPI); @@ -303,7 +352,7 @@ int DistanceCommand::execute(){ if (output != "square"){ driverMPI(start, end, outputFile, mySize); } else { driverMPI(start, end, outputFile, mySize, output); } - if (m->control_pressed) { delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); delete distCalculator; return 0; } int amode=MPI_MODE_APPEND|MPI_MODE_WRONLY|MPI_MODE_CREATE; // MPI_File outMPI; @@ -322,7 +371,7 @@ int DistanceCommand::execute(){ for(int b = 1; b < processors; b++) { unsigned long int fileSize; - if (m->control_pressed) { MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } MPI_Recv(&fileSize, 1, MPI_LONG, b, tag, MPI_COMM_WORLD, &status); @@ -368,28 +417,35 @@ int DistanceCommand::execute(){ else { driver(0, numSeqs, outputFile, "square"); } }else{ //you have multiple processors + unsigned long int numDists = 0; + + if (output == "square") { + numDists = numSeqs * numSeqs; + }else { + 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; @@ -398,7 +454,7 @@ int DistanceCommand::execute(){ #endif #endif - if (m->control_pressed) { delete distCalculator; remove(outputFile.c_str()); return 0; } + if (m->control_pressed) { outputTypes.clear(); delete distCalculator; remove(outputFile.c_str()); return 0; } #ifdef USE_MPI MPI_Comm_rank(MPI_COMM_WORLD, &pid); @@ -441,7 +497,7 @@ int DistanceCommand::execute(){ } #endif - if (m->control_pressed) { delete distCalculator; remove(outputFile.c_str()); return 0; } + if (m->control_pressed) { outputTypes.clear(); delete distCalculator; remove(outputFile.c_str()); return 0; } delete distCalculator; @@ -456,7 +512,8 @@ int DistanceCommand::execute(){ m->mothurOut("Compressing..."); m->mothurOutEndLine(); m->mothurOut("(Replacing " + outputFile + " with " + outputFile + ".gz)"); m->mothurOutEndLine(); system(("gzip -v " + outputFile).c_str()); - } + outputNames.push_back(outputFile + ".gz"); + }else { outputNames.push_back(outputFile); } return 0; @@ -470,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 @@ -478,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("unable to spawn the necessary processes."); m->mothurOutEndLine(); exit(0); } + }else { + m->mothurOut("[ERROR]: unable to spawn the necessary processes. Error code: " + toString(pid)); m->mothurOutEndLine(); + perror(" : "); + for (int i=0;i::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) { @@ -1077,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); } }