]> git.donarmstrong.com Git - mothur.git/blobdiff - blastdb.cpp
fixed bug with blastdb.cpp
[mothur.git] / blastdb.cpp
index 48ae1686a35aae2f1a19e980c8b057c827c40021..a54c9bd135df7b5dc449d0dd435c551c60a99aeb 100644 (file)
 
 /**************************************************************************************************/
 
-BlastDB::BlastDB(string tag, float gO, float gE, float m, float mM) : Database(), 
-gapOpen(gO), gapExtend(gE), match(m), misMatch(mM) {
-       
-       count = 0;
-
-       int randNumber = rand();
-       //int randNumber = 12345;
-       dbFileName = tag + toString(randNumber) + ".template.unaligned.fasta";
-       queryFileName = tag + toString(randNumber) + ".candidate.unaligned.fasta";
-       blastFileName = tag + toString(randNumber) + ".blast";
+BlastDB::BlastDB(string tag, float gO, float gE, float mm, float mM) : Database(), 
+gapOpen(gO), gapExtend(gE), match(mm), misMatch(mM) {
+       try {
+               count = 0;
 
+               int randNumber = rand();
+               //int randNumber = 12345;
+               dbFileName = tag + toString(getpid()) + toString(randNumber) + ".template.unaligned.fasta";
+               queryFileName = tag + toString(getpid()) + toString(randNumber) + ".candidate.unaligned.fasta";
+               blastFileName = tag + toString(getpid()) + toString(randNumber) + ".blast";
+               
+               //make sure blast exists in the write place
+               path = m->argv;
+               string tempPath = path;
+               for (int i = 0; i < path.length(); i++) { tempPath[i] = tolower(path[i]); }
+               path = path.substr(0, (tempPath.find_last_of('m')));
+               
+               string formatdbCommand;
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+               formatdbCommand = path + "blast/bin/formatdb";  //      format the database, -o option gives us the ability
+#else
+               formatdbCommand = path + "blast\\bin\\formatdb.exe";
+               //wrap entire string in ""
+               //formatdbCommand = "\"" + formatdbCommand + "\"";
+#endif
+               
+               //test to make sure formatdb exists
+               ifstream in;
+               formatdbCommand = m->getFullPathName(formatdbCommand);
+               int ableToOpen = m->openInputFile(formatdbCommand, in, "no error"); in.close();
+               if(ableToOpen == 1) {   m->mothurOut("[ERROR]: " + formatdbCommand + " file does not exist. mothur requires formatdb.exe to be in the ./blast/bin folder relative to the mothur.exe location."); m->mothurOutEndLine(); m->control_pressed = true; }
+               
+               string blastCommand;
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+               blastCommand = path + "blast/bin/blastall";     //      format the database, -o option gives us the ability
+#else
+               blastCommand = path + "blast\\bin\\blastall.exe";
+               //wrap entire string in ""
+               //blastCommand = "\"" + blastCommand + "\"";
+#endif
+               
+               //test to make sure formatdb exists
+               ifstream in2;
+               blastCommand = m->getFullPathName(blastCommand);
+               ableToOpen = m->openInputFile(blastCommand, in2, "no error"); in2.close();
+               if(ableToOpen == 1) {   m->mothurOut("[ERROR]: " + blastCommand + " file does not exist. mothur requires blastall.exe to be in the ./blast/bin folder relative to the mothur.exe location."); m->mothurOutEndLine(); m->control_pressed = true; }
+               
+               
+               string megablastCommand;
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+               megablastCommand = path + "blast/bin/megablast";        //      format the database, -o option gives us the ability
+#else
+               megablastCommand = path + "blast\\bin\\megablast.exe";
+               //wrap entire string in ""
+               //megablastCommand = "\"" + megablastCommand + "\"";
+#endif
+               
+               //test to make sure formatdb exists
+               ifstream in3;
+               megablastCommand = m->getFullPathName(megablastCommand);
+               ableToOpen = m->openInputFile(megablastCommand, in3, "no error"); in3.close();
+               if(ableToOpen == 1) {   m->mothurOut("[ERROR]: " +  megablastCommand + " file does not exist. mothur requires megablast.exe to be in the ./blast/bin folder relative to the mothur.exe location."); m->mothurOutEndLine(); m->control_pressed = true; }
+               
+       }
+       catch(exception& e) {
+               m->errorOut(e, "BlastDB", "BlastDB");
+               exit(1);
+       }
 }
 /**************************************************************************************************/
 
@@ -34,9 +91,63 @@ BlastDB::BlastDB() : Database() {
 
                int randNumber = rand();
                //int randNumber = 12345;
-               dbFileName = toString(randNumber) + ".template.unaligned.fasta";
-               queryFileName = toString(randNumber) + ".candidate.unaligned.fasta";
-               blastFileName = toString(randNumber) + ".blast";
+               dbFileName = toString(randNumber) + toString(getpid()) + ".template.unaligned.fasta";
+               queryFileName = toString(randNumber) + toString(getpid()) + ".candidate.unaligned.fasta";
+               blastFileName = toString(randNumber) + toString(getpid()) + ".blast";
+               
+               //make sure blast exists in the write place
+               path = m->argv;
+               string tempPath = path;
+               for (int i = 0; i < path.length(); i++) { tempPath[i] = tolower(path[i]); }
+               path = path.substr(0, (tempPath.find_last_of('m')));
+               
+               string formatdbCommand;
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+               formatdbCommand = path + "blast/bin/formatdb";  //      format the database, -o option gives us the ability
+#else
+               formatdbCommand = path + "blast\\bin\\formatdb.exe";
+               //wrap entire string in ""
+               //formatdbCommand = "\"" + formatdbCommand + "\"";
+#endif
+               
+               //test to make sure formatdb exists
+               ifstream in;
+               formatdbCommand = m->getFullPathName(formatdbCommand);
+               int ableToOpen = m->openInputFile(formatdbCommand, in, "no error"); in.close();
+               if(ableToOpen == 1) {   m->mothurOut("[ERROR]: " +  formatdbCommand + " file does not exist. mothur requires formatdb.exe to be in the ./blast/bin folder relative to the mothur.exe location."); m->mothurOutEndLine(); m->control_pressed = true; }
+               
+               string blastCommand;
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+               blastCommand = path + "blast/bin/blastall";     //      format the database, -o option gives us the ability
+#else
+               blastCommand = path + "blast\\bin\\blastall.exe";
+               //wrap entire string in ""
+               //blastCommand = "\"" + blastCommand + "\"";
+#endif
+               
+               //test to make sure formatdb exists
+               ifstream in2;
+               blastCommand = m->getFullPathName(blastCommand);
+               ableToOpen = m->openInputFile(blastCommand, in2, "no error"); in2.close();
+               if(ableToOpen == 1) {   m->mothurOut("[ERROR]: " + blastCommand + " file does not exist. mothur requires blastall.exe to be in the ./blast/bin folder relative to the mothur.exe location."); m->mothurOutEndLine(); m->control_pressed = true; }
+               
+               
+               string megablastCommand;
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+               megablastCommand = path + "blast/bin/megablast";        //      format the database, -o option gives us the ability
+#else
+               megablastCommand = path + "blast\\bin\\megablast.exe";
+               //wrap entire string in ""
+               //megablastCommand = "\"" + megablastCommand + "\"";
+#endif
+               
+               //test to make sure formatdb exists
+               ifstream in3;
+               megablastCommand = m->getFullPathName(megablastCommand);
+               ableToOpen = m->openInputFile(megablastCommand, in3, "no error"); in3.close();
+               if(ableToOpen == 1) {   m->mothurOut("[ERROR]: " + megablastCommand + " file does not exist. mothur requires megablast.exe to be in the ./blast/bin folder relative to the mothur.exe location."); m->mothurOutEndLine(); m->control_pressed = true; }
+               
+               
        }
        catch(exception& e) {
                m->errorOut(e, "BlastDB", "BlastDB");
@@ -70,7 +181,7 @@ vector<int> BlastDB::findClosestSequences(Sequence* seq, int n) {
                
                ofstream queryFile;
                int randNumber = rand();
-               m->openOutputFile((queryFileName+toString(randNumber)), queryFile);
+               m->openOutputFile((queryFileName+toString(getpid())+toString(randNumber)), queryFile);
                queryFile << '>' << seq->getName() << endl;
                queryFile << seq->getUnaligned() << endl;
                queryFile.close();
@@ -84,10 +195,10 @@ vector<int> BlastDB::findClosestSequences(Sequence* seq, int n) {
                #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
                
                        blastCommand = path + "blast/bin/blastall -p blastn -d " + dbFileName + " -m 8 -W 28 -v " + toString(n) + " -b " + toString(n);
-                       blastCommand += (" -i " + (queryFileName+toString(randNumber)) + " -o " + blastFileName+toString(randNumber));
+                       blastCommand += (" -i " + (queryFileName+toString(getpid())+toString(randNumber)) + " -o " + blastFileName+toString(getpid())+toString(randNumber));
                #else
                        blastCommand =  "\"" + path + "blast\\bin\\blastall\" -p blastn -d " + "\"" + dbFileName + "\"" + " -m 8 -W 28 -v " + toString(n) + " -b " + toString(n);
-                       blastCommand += (" -i " + (queryFileName+toString(randNumber)) + " -o " + blastFileName+toString(randNumber));
+                       blastCommand += (" -i " + (queryFileName+toString(getpid())+toString(randNumber)) + " -o " + blastFileName+toString(getpid())+toString(randNumber));
                        //wrap entire string in ""
                        blastCommand = "\"" + blastCommand + "\"";
                #endif
@@ -95,7 +206,7 @@ vector<int> BlastDB::findClosestSequences(Sequence* seq, int n) {
                system(blastCommand.c_str());
                
                ifstream m8FileHandle;
-               m->openInputFile(blastFileName+toString(randNumber), m8FileHandle, "no error");
+               m->openInputFile(blastFileName+toString(getpid())+toString(randNumber), m8FileHandle, "no error");
                
                string dummy;
                int templateAccession;
@@ -111,8 +222,8 @@ vector<int> BlastDB::findClosestSequences(Sequence* seq, int n) {
                        topMatches.push_back(templateAccession);
                }
                m8FileHandle.close();
-               remove((queryFileName+toString(randNumber)).c_str());
-               remove((blastFileName+toString(randNumber)).c_str());
+               remove((queryFileName+toString(getpid())+toString(randNumber)).c_str());
+               remove((blastFileName+toString(getpid())+toString(randNumber)).c_str());
 
                return topMatches;
        }
@@ -133,7 +244,7 @@ vector<int> BlastDB::findClosestMegaBlast(Sequence* seq, int n, int minPerID) {
                ofstream queryFile;
                int randNumber = rand();
                //int randNumber = 12345;
-               m->openOutputFile((queryFileName+toString(randNumber)), queryFile);
+               m->openOutputFile((queryFileName+toString(getpid())+toString(randNumber)), queryFile);
                queryFile << '>' << seq->getName() << endl;
                queryFile << seq->getUnaligned() << endl;
                queryFile.close();
@@ -145,22 +256,21 @@ vector<int> BlastDB::findClosestMegaBlast(Sequence* seq, int n, int minPerID) {
                string blastCommand;
                #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
                        blastCommand = path + "blast/bin/megablast -e 1e-10 -d " + dbFileName + " -m 8 -b " + toString(n) + " -v " + toString(n); //-W 28 -p blastn
-                       blastCommand += (" -i " + (queryFileName+toString(randNumber)) + " -o " + blastFileName+toString(randNumber));
+                       blastCommand += (" -i " + (queryFileName+toString(getpid())+toString(randNumber)) + " -o " + blastFileName+toString(getpid())+toString(randNumber));
                #else
                //blastCommand = path + "blast\\bin\\megablast -e 1e-10 -d " + dbFileName + " -m 8 -b " + toString(n) + " -v " + toString(n); //-W 28 -p blastn
                //blastCommand += (" -i " + (queryFileName+toString(randNumber)) + " -o " + blastFileName+toString(randNumber));
 
                        blastCommand =  "\"" + path + "blast\\bin\\megablast\" -e 1e-10 -d " + "\"" + dbFileName + "\"" + " -m 8 -b " + toString(n) + " -v " + toString(n); //-W 28 -p blastn
-                       blastCommand += (" -i " + (queryFileName+toString(randNumber)) + " -o " + blastFileName+toString(randNumber));
+                       blastCommand += (" -i " + (queryFileName+toString(getpid())+toString(randNumber)) + " -o " + blastFileName+toString(getpid())+toString(randNumber));
                        //wrap entire string in ""
                        blastCommand = "\"" + blastCommand + "\"";
 
                #endif
-               //cout << blastCommand << endl;
                system(blastCommand.c_str());
 
                ifstream m8FileHandle;
-               m->openInputFile(blastFileName+toString(randNumber), m8FileHandle, "no error");
+               m->openInputFile(blastFileName+toString(getpid())+toString(randNumber), m8FileHandle, "no error");
        
                string dummy, eScore;
                int templateAccession;
@@ -181,8 +291,8 @@ vector<int> BlastDB::findClosestMegaBlast(Sequence* seq, int n, int minPerID) {
 //cout << templateAccession << endl;
                }
                m8FileHandle.close();
-               remove((queryFileName+toString(randNumber)).c_str());
-               remove((blastFileName+toString(randNumber)).c_str());
+               remove((queryFileName+toString(getpid())+toString(randNumber)).c_str());
+               remove((blastFileName+toString(getpid())+toString(randNumber)).c_str());
 //cout << "\n" ;               
                return topMatches;
        }