X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=distancecommand.cpp;h=beea1bf915fccffa6b1f92e212e8125db6010af9;hb=ae57e166b2ed7b475ec3f466106bd76fabadd063;hp=34206a9460bf21eac543ee3d91031f8fe4af96ad;hpb=e150b0b0664caec517485ee6d69dcdade6dcae77;p=mothur.git diff --git a/distancecommand.cpp b/distancecommand.cpp index 34206a9..beea1bf 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(){ @@ -152,6 +147,7 @@ DistanceCommand::DistanceCommand(string option) { m->openInputFile(fastafile, inFASTA); alignDB = SequenceDB(inFASTA); inFASTA.close(); + m->setFastaFile(fastafile); } oldfastafile = validParameter.validFile(parameters, "oldfasta", true); @@ -161,6 +157,7 @@ DistanceCommand::DistanceCommand(string option) { column = validParameter.validFile(parameters, "column", true); if (column == "not found") { column = ""; } else if (column == "not open") { abort = true; } + else { m->setColumnFile(column); } //if the user changes the output directory command factory will send this info to us in the output parameter outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){ @@ -198,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; imothurOut("[ERROR]: your sequences are not the same length, aborting."); m->mothurOutEndLine(); return 0; } + string outputFile; if (output == "lt") { //does the user want lower triangle phylip formatted file outputFile = outputDir + m->getRootName(m->getSimpleName(fastafile)) + "phylip.dist"; - remove(outputFile.c_str()); outputTypes["phylip"].push_back(outputFile); + m->mothurRemove(outputFile); outputTypes["phylip"].push_back(outputFile); //output numSeqs to phylip formatted dist file }else if (output == "column") { //user wants column format @@ -264,10 +243,10 @@ int DistanceCommand::execute(){ rename(column.c_str(), tempcolumn.c_str()); } - remove(outputFile.c_str()); + m->mothurRemove(outputFile); }else { //assume square outputFile = outputDir + m->getRootName(m->getSimpleName(fastafile)) + "square.dist"; - remove(outputFile.c_str()); + m->mothurRemove(outputFile); outputTypes["phylip"].push_back(outputFile); } @@ -338,7 +317,7 @@ 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); } @@ -360,7 +339,7 @@ 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; } @@ -388,7 +367,7 @@ 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); } @@ -401,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) //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; @@ -438,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; remove(outputFile.c_str()); return 0; } + if (m->control_pressed) { outputTypes.clear(); m->mothurRemove(outputFile); return 0; } #ifdef USE_MPI MPI_Comm_rank(MPI_COMM_WORLD, &pid); @@ -468,17 +447,17 @@ int DistanceCommand::execute(){ if (outputFile == column) { string tempcolumn = column + ".old"; m->appendFiles(tempcolumn, outputFile); - remove(tempcolumn.c_str()); + m->mothurRemove(tempcolumn); }else{ m->appendFiles(outputFile, column); - remove(outputFile.c_str()); + m->mothurRemove(outputFile); outputFile = column; } if (outputDir != "") { string newOutputName = outputDir + m->getSimpleName(outputFile); rename(outputFile.c_str(), newOutputName.c_str()); - remove(outputFile.c_str()); + m->mothurRemove(outputFile); outputFile = newOutputName; } } @@ -488,9 +467,7 @@ int DistanceCommand::execute(){ } #endif - if (m->control_pressed) { outputTypes.clear(); delete distCalculator; remove(outputFile.c_str()); return 0; } - - delete distCalculator; + if (m->control_pressed) { outputTypes.clear(); m->mothurRemove(outputFile); return 0; } //set phylip file as new current phylipfile string current = ""; @@ -563,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); - remove((filename + toString(processIDS[i]) + ".temp").c_str()); + 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 @@ -626,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; } @@ -638,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(); @@ -676,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; } @@ -689,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 @@ -731,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) { @@ -741,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(); @@ -805,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; } @@ -815,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(); @@ -879,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) { @@ -931,7 +1049,7 @@ int DistanceCommand::convertMatrix(string outputFile) { //m->openInputFile(outfile, in); while(!in.eof()) { - if (m->control_pressed) { in.close(); remove(outfile.c_str()); out.close(); return 0; } + if (m->control_pressed) { in.close(); m->mothurRemove(outfile); out.close(); return 0; } in >> first >> second >> dist; m->gobble(in); @@ -966,7 +1084,7 @@ int DistanceCommand::convertMatrix(string outputFile) { in.close(); out.close(); - remove(outfile.c_str()); + m->mothurRemove(outfile); return 1; @@ -1021,7 +1139,7 @@ int DistanceCommand::convertToLowerTriangle(string outputFile) { //m->openInputFile(outfile, in); while(!in.eof()) { - if (m->control_pressed) { in.close(); remove(outfile.c_str()); out.close(); return 0; } + if (m->control_pressed) { in.close(); m->mothurRemove(outfile); out.close(); return 0; } in >> first >> second >> dist; m->gobble(in); @@ -1060,7 +1178,7 @@ int DistanceCommand::convertToLowerTriangle(string outputFile) { in.close(); out.close(); - remove(outfile.c_str()); + m->mothurRemove(outfile); return 1; @@ -1131,7 +1249,7 @@ bool DistanceCommand::sanityCheck() { string name1, name2; float dist; while (!inDist.eof()) { - if (m->control_pressed) { inDist.close(); outDist.close(); remove(outputFile.c_str()); return good; } + if (m->control_pressed) { inDist.close(); outDist.close(); m->mothurRemove(outputFile); return good; } inDist >> name1 >> name2 >> dist; m->gobble(inDist); @@ -1148,10 +1266,10 @@ bool DistanceCommand::sanityCheck() { outDist.close(); if (good) { - remove(column.c_str()); + m->mothurRemove(column); rename(outputFile.c_str(), column.c_str()); }else{ - remove(outputFile.c_str()); //temp file is bad because file mismatch above + m->mothurRemove(outputFile); //temp file is bad because file mismatch above } return good;