X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancecommand.cpp;h=79b8fe7c10544dafd2675a963a2229eb2e3e7046;hb=ee8403d4eb5760187d62b42a9cf4272de8fc0ec4;hp=b69b93d85c44c1fa89d08d49c0fb478b2f0cb242;hpb=19fcbbdba99658f5eca244803280f9ee7f9f6607;p=mothur.git diff --git a/distancecommand.cpp b/distancecommand.cpp index b69b93d..79b8fe7 100644 --- a/distancecommand.cpp +++ b/distancecommand.cpp @@ -8,11 +8,6 @@ */ #include "distancecommand.h" -#include "ignoregaps.h" -#include "eachgapdist.h" -#include "eachgapignore.h" -#include "onegapdist.h" -#include "onegapignore.h" //********************************************************************************************************************** vector DistanceCommand::setParameters(){ @@ -184,11 +179,11 @@ DistanceCommand::DistanceCommand(string option) { convert(temp, countends); temp = validParameter.validFile(parameters, "cutoff", false); if(temp == "not found"){ temp = "1.0"; } - convert(temp, cutoff); + m->mothurConvert(temp, cutoff); temp = validParameter.validFile(parameters, "processors", false); if (temp == "not found"){ temp = m->getProcessors(); } m->setProcessors(temp); - convert(temp, processors); + m->mothurConvert(temp, processors); temp = validParameter.validFile(parameters, "compress", false); if(temp == "not found"){ temp = "F"; } convert(temp, compress); @@ -200,26 +195,6 @@ DistanceCommand::DistanceCommand(string option) { if ((column != "") && (oldfastafile != "") && (output != "column")) { m->mothurOut("You have provided column and oldfasta, indicating you want to append distances to your column file. Your output must be in column format to do so."); m->mothurOutEndLine(); abort=true; } if ((output != "column") && (output != "lt") && (output != "square")) { m->mothurOut(output + " is not a valid output form. Options are column, lt and square. I will use column."); m->mothurOutEndLine(); output = "column"; } - - ValidCalculators validCalculator; - - if (m->isTrue(countends) == true) { - for (int i=0; icontrol_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); return 0; } //wait on chidren for(int i = 1; i < processors; i++) { - if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); return 0; } char buf[5]; MPI_Recv(buf, 5, MPI_CHAR, i, tag, MPI_COMM_WORLD, &status); @@ -327,7 +302,7 @@ int DistanceCommand::execute(){ //do your part driverMPI(start, end, outMPI, cutoff); - if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); return 0; } char buf[5]; strcpy(buf, "done"); @@ -342,12 +317,12 @@ int DistanceCommand::execute(){ //do your part string outputMyPart; - unsigned long int mySize; + unsigned long long mySize; if (output != "square"){ driverMPI(start, end, outputFile, mySize); } else { driverMPI(start, end, outputFile, mySize, output); } - if (m->control_pressed) { outputTypes.clear(); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); return 0; } int amode=MPI_MODE_APPEND|MPI_MODE_WRONLY|MPI_MODE_CREATE; // MPI_File outMPI; @@ -364,9 +339,9 @@ int DistanceCommand::execute(){ //wait on chidren for(int b = 1; b < processors; b++) { - unsigned long int fileSize; + unsigned long long fileSize; - if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); delete distCalculator; return 0; } + if (m->control_pressed) { outputTypes.clear(); MPI_File_close(&outMPI); return 0; } MPI_Recv(&fileSize, 1, MPI_LONG, b, tag, MPI_COMM_WORLD, &status); @@ -392,11 +367,11 @@ int DistanceCommand::execute(){ MPI_File_close(&outMPI); }else { //you are a child process //do your part - unsigned long int size; + unsigned long long size; if (output != "square"){ driverMPI(start, end, (outputFile + toString(pid) + ".temp"), size); } else { driverMPI(start, end, (outputFile + toString(pid) + ".temp"), size, output); } - if (m->control_pressed) { delete distCalculator; return 0; } + if (m->control_pressed) { return 0; } //tell parent you are done. MPI_Send(&size, 1, MPI_LONG, 0, tag, MPI_COMM_WORLD); @@ -405,14 +380,14 @@ int DistanceCommand::execute(){ MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case #else - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + //#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) //if you don't need to fork anything if(processors == 1){ if (output != "square") { driver(0, numSeqs, outputFile, cutoff); } else { driver(0, numSeqs, outputFile, "square"); } }else{ //you have multiple processors - unsigned long int numDists = 0; + unsigned long long numDists = 0; if (output == "square") { numDists = numSeqs * numSeqs; @@ -442,14 +417,14 @@ int DistanceCommand::execute(){ createProcesses(outputFile); } - #else + //#else //ifstream inFASTA; - if (output != "square") { driver(0, numSeqs, outputFile, cutoff); } - else { driver(0, numSeqs, outputFile, "square"); } - #endif + //if (output != "square") { driver(0, numSeqs, outputFile, cutoff); } + //else { driver(0, numSeqs, outputFile, "square"); } + //#endif #endif - if (m->control_pressed) { outputTypes.clear(); delete distCalculator; m->mothurRemove(outputFile); return 0; } + if (m->control_pressed) { outputTypes.clear(); m->mothurRemove(outputFile); return 0; } #ifdef USE_MPI MPI_Comm_rank(MPI_COMM_WORLD, &pid); @@ -492,9 +467,7 @@ int DistanceCommand::execute(){ } #endif - if (m->control_pressed) { outputTypes.clear(); delete distCalculator; m->mothurRemove(outputFile); return 0; } - - delete distCalculator; + if (m->control_pressed) { outputTypes.clear(); m->mothurRemove(outputFile); return 0; } //set phylip file as new current phylipfile string current = ""; @@ -534,7 +507,7 @@ int DistanceCommand::execute(){ /**************************************************************************************************/ void DistanceCommand::createProcesses(string filename) { try { -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) int process = 1; processIDS.clear(); @@ -567,25 +540,80 @@ void DistanceCommand::createProcesses(string filename) { int temp = processIDS[i]; wait(&temp); } +#else + ////////////////////////////////////////////////////////////////////////////////////////////////////// + //Windows version shared memory, so be careful when passing variables through the distanceData struct. + //Above fork() will clone, so memory is separate, but that's not the case with windows, + //that's why the distance calculator was moved inside of the driver to make separate copies. + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + vector pDataArray; //[processors-1]; + DWORD dwThreadIdArray[processors-1]; + HANDLE hThreadArray[processors-1]; + + //Create processor-1 worker threads. + for( int i=0; iappendFiles((filename + toString(processIDS[i]) + ".temp"), filename); m->mothurRemove((filename + toString(processIDS[i]) + ".temp")); } -#endif + } catch(exception& e) { m->errorOut(e, "DistanceCommand", "createProcesses"); exit(1); } } - /**************************************************************************************************/ /////// need to fix to work with calcs and sequencedb int DistanceCommand::driver(int startLine, int endLine, string dFileName, float cutoff){ try { - + ValidCalculators validCalculator; + Dist* distCalculator; + if (m->isTrue(countends) == true) { + for (int i=0; icontrol_pressed) { outFile.close(); return 0; } + if (m->control_pressed) { delete distCalculator; outFile.close(); return 0; } //if there was a column file given and we are appending, we don't want to calculate the distances that are already in the column file //the alignDB contains the new sequences and then the old, so if i an oldsequence and j is an old sequence then break out of this loop @@ -630,6 +658,7 @@ int DistanceCommand::driver(int startLine, int endLine, string dFileName, float m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); outFile.close(); + delete distCalculator; return 1; } @@ -642,7 +671,26 @@ int DistanceCommand::driver(int startLine, int endLine, string dFileName, float /////// need to fix to work with calcs and sequencedb int DistanceCommand::driver(int startLine, int endLine, string dFileName, string square){ try { - + ValidCalculators validCalculator; + Dist* distCalculator; + if (m->isTrue(countends) == true) { + for (int i=0; icontrol_pressed) { outFile.close(); return 0; } + if (m->control_pressed) { delete distCalculator; outFile.close(); return 0; } distCalculator->calcDist(alignDB.get(i), alignDB.get(j)); double dist = distCalculator->getDist(); @@ -680,6 +728,7 @@ int DistanceCommand::driver(int startLine, int endLine, string dFileName, string m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); outFile.close(); + delete distCalculator; return 1; } @@ -693,6 +742,28 @@ int DistanceCommand::driver(int startLine, int endLine, string dFileName, string /////// need to fix to work with calcs and sequencedb int DistanceCommand::driverMPI(int startLine, int endLine, MPI_File& outMPI, float cutoff){ try { + + ValidCalculators validCalculator; + Dist* distCalculator; + if (m->isTrue(countends) == true) { + for (int i=0; icontrol_pressed) { return 0; } + if (m->control_pressed) { delete distCalculator; return 0; } //if there was a column file given and we are appending, we don't want to calculate the distances that are already in the column file //the alignDB contains the new sequences and then the old, so if i an oldsequence and j is an old sequence then break out of this loop @@ -735,7 +806,8 @@ int DistanceCommand::driverMPI(int startLine, int endLine, MPI_File& outMPI, flo } //m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); - cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl; + cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl; + delete distCalculator; return 1; } catch(exception& e) { @@ -745,8 +817,29 @@ int DistanceCommand::driverMPI(int startLine, int endLine, MPI_File& outMPI, flo } /**************************************************************************************************/ /////// need to fix to work with calcs and sequencedb -int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned long int& size){ +int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned long long& size){ try { + ValidCalculators validCalculator; + Dist* distCalculator; + if (m->isTrue(countends) == true) { + for (int i=0; icontrol_pressed) { return 0; } + if (m->control_pressed) { delete distCalculator; return 0; } distCalculator->calcDist(alignDB.get(i), alignDB.get(j)); double dist = distCalculator->getDist(); @@ -809,6 +902,7 @@ int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned //m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl; MPI_File_close(&outMPI); + delete distCalculator; return 1; } @@ -819,8 +913,28 @@ int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned } /**************************************************************************************************/ /////// need to fix to work with calcs and sequencedb -int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned long int& size, string square){ +int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned long long& size, string square){ try { + ValidCalculators validCalculator; + Dist* distCalculator; + if (m->isTrue(countends) == true) { + for (int i=0; icontrol_pressed) { return 0; } + if (m->control_pressed) { delete distCalculator; return 0; } distCalculator->calcDist(alignDB.get(i), alignDB.get(j)); double dist = distCalculator->getDist(); @@ -883,7 +997,7 @@ int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned //m->mothurOut(toString(endLine-1) + "\t" + toString(time(NULL) - startTime)); m->mothurOutEndLine(); cout << (endLine-1) << '\t' << (time(NULL) - startTime) << endl; MPI_File_close(&outMPI); - + delete distCalculator; return 1; } catch(exception& e) { @@ -900,7 +1014,7 @@ int DistanceCommand::convertMatrix(string outputFile) { string outfile = m->getRootName(outputFile) + "sorted.dist.temp"; //use the unix sort - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) string command = "sort -n " + outputFile + " -o " + outfile; system(command.c_str()); #else //sort using windows sort @@ -980,7 +1094,7 @@ int DistanceCommand::convertMatrix(string outputFile) { exit(1); } } -/************************************************************************************************** +************************************************************************************************** int DistanceCommand::convertToLowerTriangle(string outputFile) { try{ @@ -988,7 +1102,7 @@ int DistanceCommand::convertToLowerTriangle(string outputFile) { string outfile = m->getRootName(outputFile) + "sorted.dist.temp"; //use the unix sort - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) string command = "sort -n " + outputFile + " -o " + outfile; system(command.c_str()); #else //sort using windows sort @@ -1074,7 +1188,7 @@ int DistanceCommand::convertToLowerTriangle(string outputFile) { exit(1); } } -/**************************************************************************************************/ +**************************************************************************************************/ //its okay if the column file does not contain all the names in the fasta file, since some distance may have been above a cutoff, //but no sequences can be in the column file that are not in oldfasta. also, if a distance is above the cutoff given then remove it. //also check to make sure the 2 files have the same alignment length.