]> git.donarmstrong.com Git - mothur.git/blobdiff - distancecommand.cpp
working on windows paralellization, added trimOligos class to be used by trim.flows...
[mothur.git] / distancecommand.cpp
index 34206a9460bf21eac543ee3d91031f8fe4af96ad..beea1bf915fccffa6b1f92e212e8125db6010af9 100644 (file)
@@ -8,11 +8,6 @@
  */
 
 #include "distancecommand.h"
-#include "ignoregaps.h"
-#include "eachgapdist.h"
-#include "eachgapignore.h"
-#include "onegapdist.h"
-#include "onegapignore.h"
 
 //**********************************************************************************************************************
 vector<string> 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; i<Estimators.size(); i++) {
-                                       if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
-                                               if (Estimators[i] == "nogaps")                  {       distCalculator = new ignoreGaps();      }
-                                               else if (Estimators[i] == "eachgap")    {       distCalculator = new eachGapDist();     }
-                                               else if (Estimators[i] == "onegap")             {       distCalculator = new oneGapDist();      }
-                                       }
-                               }
-                       }else {
-                               for (int i=0; i<Estimators.size(); i++) {
-                                       if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
-                                               if (Estimators[i] == "nogaps")          {       distCalculator = new ignoreGaps();                                      }
-                                               else if (Estimators[i] == "eachgap"){   distCalculator = new eachGapIgnoreTermGapDist();        }
-                                               else if (Estimators[i] == "onegap")     {       distCalculator = new oneGapIgnoreTermGapDist();         }
-                                       }
-                               }
-                       }
 
                }
                                
@@ -247,11 +224,13 @@ int DistanceCommand::execute(){
                int numSeqs = alignDB.getNumSeqs();
                cutoff += 0.005;
                
+               if (!alignDB.sameLength()) {  m->mothurOut("[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<distanceData*> pDataArray; //[processors-1];
+               DWORD   dwThreadIdArray[processors-1];
+               HANDLE  hThreadArray[processors-1]; 
+               
+               //Create processor-1 worker threads.
+               for( int i=0; i<processors-1; i++ ){
+                       
+                       // Allocate memory for thread data.
+                       distanceData* tempDist = new distanceData(lines[i+1].start, lines[i+1].end, (filename + toString(i) + ".temp"), cutoff, alignDB, Estimators, m, output, numNewFasta, countends);
+                       pDataArray.push_back(tempDist);
+                       processIDS.push_back(i);
+                       
+                       //MyDistThreadFunction is in header. It must be global or static to work with the threads.
+                       //default security attributes, thread function name, argument to thread function, use default creation flags, returns the thread identifier
+                       hThreadArray[i] = CreateThread(NULL, 0, MyDistThreadFunction, pDataArray[i], 0, &dwThreadIdArray[i]);   
+               }
+               
+               //do your part
+               if (output != "square") {  driver(lines[0].start, lines[0].end, filename, cutoff); }
+               else { driver(lines[0].start, lines[0].end, filename, "square"); }
+               
+               //Wait until all threads have terminated.
+               WaitForMultipleObjects(processors-1, hThreadArray, TRUE, INFINITE);
+               
+               //Close all thread handles and free memory allocations.
+               for(int i=0; i < pDataArray.size(); i++){
+                       CloseHandle(hThreadArray[i]);
+                       delete pDataArray[i];
+               }
+#endif
                
                //append and remove temp files
                for (int i=0;i<processIDS.size();i++) { 
                        m->appendFiles((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; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")                  {       distCalculator = new ignoreGaps();      }
+                                       else if (Estimators[i] == "eachgap")    {       distCalculator = new eachGapDist();     }
+                                       else if (Estimators[i] == "onegap")             {       distCalculator = new oneGapDist();      }
+                               }
+                       }
+               }else {
+                       for (int i=0; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")          {       distCalculator = new ignoreGaps();                                      }
+                                       else if (Estimators[i] == "eachgap"){   distCalculator = new eachGapIgnoreTermGapDist();        }
+                                       else if (Estimators[i] == "onegap")     {       distCalculator = new oneGapIgnoreTermGapDist();         }
+                               }
+                       }
+               }
+               
                int startTime = time(NULL);
                
                //column file
@@ -601,7 +633,7 @@ int DistanceCommand::driver(int startLine, int endLine, string dFileName, float
                        }
                        for(int j=0;j<i;j++){
                                
-                               if (m->control_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; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")                  {       distCalculator = new ignoreGaps();      }
+                                       else if (Estimators[i] == "eachgap")    {       distCalculator = new eachGapDist();     }
+                                       else if (Estimators[i] == "onegap")             {       distCalculator = new oneGapDist();      }
+                               }
+                       }
+               }else {
+                       for (int i=0; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")          {       distCalculator = new ignoreGaps();                                      }
+                                       else if (Estimators[i] == "eachgap"){   distCalculator = new eachGapIgnoreTermGapDist();        }
+                                       else if (Estimators[i] == "onegap")     {       distCalculator = new oneGapIgnoreTermGapDist();         }
+                               }
+                       }
+               }
+               
                int startTime = time(NULL);
                
                //column file
@@ -658,7 +710,7 @@ int DistanceCommand::driver(int startLine, int endLine, string dFileName, string
                        
                        for(int j=0;j<alignDB.getNumSeqs();j++){
                                
-                               if (m->control_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; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")                  {       distCalculator = new ignoreGaps();      }
+                                       else if (Estimators[i] == "eachgap")    {       distCalculator = new eachGapDist();     }
+                                       else if (Estimators[i] == "onegap")             {       distCalculator = new oneGapDist();      }
+                               }
+                       }
+               }else {
+                       for (int i=0; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")          {       distCalculator = new ignoreGaps();                                      }
+                                       else if (Estimators[i] == "eachgap"){   distCalculator = new eachGapIgnoreTermGapDist();        }
+                                       else if (Estimators[i] == "onegap")     {       distCalculator = new oneGapIgnoreTermGapDist();         }
+                               }
+                       }
+               }
+               
+               
                MPI_Status status;
                int startTime = time(NULL);
                
@@ -698,7 +773,7 @@ int DistanceCommand::driverMPI(int startLine, int endLine, MPI_File& outMPI, flo
        
                        for(int j=0;j<i;j++){
                                
-                               if (m->control_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; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")                  {       distCalculator = new ignoreGaps();      }
+                                       else if (Estimators[i] == "eachgap")    {       distCalculator = new eachGapDist();     }
+                                       else if (Estimators[i] == "onegap")             {       distCalculator = new oneGapDist();      }
+                               }
+                       }
+               }else {
+                       for (int i=0; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")          {       distCalculator = new ignoreGaps();                                      }
+                                       else if (Estimators[i] == "eachgap"){   distCalculator = new eachGapIgnoreTermGapDist();        }
+                                       else if (Estimators[i] == "onegap")     {       distCalculator = new oneGapIgnoreTermGapDist();         }
+                               }
+                       }
+               }
+               
+               
                MPI_Status status;
                
                MPI_File outMPI;
@@ -774,7 +871,7 @@ int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned
                        
                        for(int j=0;j<i;j++){
                                
-                               if (m->control_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; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")                  {       distCalculator = new ignoreGaps();      }
+                                       else if (Estimators[i] == "eachgap")    {       distCalculator = new eachGapDist();     }
+                                       else if (Estimators[i] == "onegap")             {       distCalculator = new oneGapDist();      }
+                               }
+                       }
+               }else {
+                       for (int i=0; i<Estimators.size(); i++) {
+                               if (validCalculator.isValidCalculator("distance", Estimators[i]) == true) { 
+                                       if (Estimators[i] == "nogaps")          {       distCalculator = new ignoreGaps();                                      }
+                                       else if (Estimators[i] == "eachgap"){   distCalculator = new eachGapIgnoreTermGapDist();        }
+                                       else if (Estimators[i] == "onegap")     {       distCalculator = new oneGapIgnoreTermGapDist();         }
+                               }
+                       }
+               }
+               
                MPI_Status status;
                
                MPI_File outMPI;
@@ -848,7 +966,7 @@ int DistanceCommand::driverMPI(int startLine, int endLine, string file, unsigned
                        
                        for(int j=0;j<alignDB.getNumSeqs();j++){
                                
-                               if (m->control_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;