]> git.donarmstrong.com Git - mothur.git/commitdiff
captured stdout from system command, fixed bug in trim.seqs added error checks for...
authorwestcott <westcott>
Fri, 27 May 2011 15:37:04 +0000 (15:37 +0000)
committerwestcott <westcott>
Fri, 27 May 2011 15:37:04 +0000 (15:37 +0000)
blastdb.cpp
chimeraslayer.cpp
systemcommand.cpp
trimseqscommand.cpp

index 48ae1686a35aae2f1a19e980c8b057c827c40021..c7003f4489232b347d6927d718c5d7497d050ae8 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(randNumber) + ".template.unaligned.fasta";
+               queryFileName = tag + toString(randNumber) + ".candidate.unaligned.fasta";
+               blastFileName = tag + 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";
+               //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";
+               //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";
+               //wrap entire string in ""
+               megablastCommand = "\"" + blastCommmegablastCommandand + "\"";
+#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);
+       }
 }
 /**************************************************************************************************/
 
@@ -37,6 +94,60 @@ BlastDB::BlastDB() : Database() {
                dbFileName = toString(randNumber) + ".template.unaligned.fasta";
                queryFileName = toString(randNumber) + ".candidate.unaligned.fasta";
                blastFileName = 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";
+               //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";
+               //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";
+               //wrap entire string in ""
+               megablastCommand = "\"" + blastCommmegablastCommandand + "\"";
+#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");
index 70208607a00373eac0e13cfa4eb639d9025be99d..3f45e17ed5aad1e5007b530b5cb7025688b3b164 100644 (file)
@@ -218,6 +218,8 @@ int ChimeraSlayer::doPrep() {
                
                        //generate blastdb
                        databaseLeft = new BlastDB(m->getRootName(m->getSimpleName(fastafile)), -1.0, -1.0, 1, -3);
+                       
+                       if (m->control_pressed) { return 0; }
 
                        for (int i = 0; i < templateSeqs.size(); i++) {         databaseLeft->addSequence(*templateSeqs[i]);    }
                        databaseLeft->generateDB();
@@ -325,6 +327,8 @@ vector<Sequence*> ChimeraSlayer::getTemplate(Sequence* q, vector<Sequence*>& use
                        
                        //generate blastdb
                        databaseLeft = new BlastDB(m->getRootName(m->getSimpleName(templateFileName)), -1.0, -1.0, 1, -3);
+                       
+                       if (m->control_pressed) { return userTemplate; }
 
                        for (int i = 0; i < userTemplate.size(); i++) { if (m->control_pressed) { return userTemplate; }   databaseLeft->addSequence(*userTemplate[i]); }
                        databaseLeft->generateDB();
index 129ed8012fe92aafe37ec8946a2f3367d3da79ce..e5aeb3e8b73dfb59008f6ddccaa3b0703b25e696 100644 (file)
@@ -91,7 +91,19 @@ int SystemCommand::execute(){
                
                if (abort == true) { if (calledHelp) { return 0; }  return 2;   }
                
-               system(command.c_str());
+               //system(command.c_str());
+               FILE *lsofFile_p = popen(command.c_str(), "r");
+               
+               if (!lsofFile_p) { return 0; }
+               
+               char buffer[1024];
+               while ( fgets(buffer, 1024, lsofFile_p) != NULL ) {
+                       string temp = buffer;
+                       m->mothurOut(temp); 
+               }
+               m->mothurOutEndLine();
+               
+               pclose(lsofFile_p);
                
                return 0;               
        }
index dc87fff99489ebe9ebfc29bec6ff2328875d7030..4d6b45da96664677f61908874d79b8d847f0e74c 100644 (file)
@@ -555,7 +555,6 @@ int TrimSeqsCommand::driverCreateTrim(string filename, string qFileName, string
                        int currentSeqsDiffs = 0;
 
                        Sequence currSeq(inFASTA); m->gobble(inFASTA);
-                       
                        QualityScores currQual;
                        if(qFileName != ""){
                                currQual = QualityScores(qFile);  m->gobble(qFile);
@@ -711,17 +710,18 @@ int TrimSeqsCommand::driverCreateTrim(string filename, string qFileName, string
                        #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
                                unsigned long int pos = inFASTA.tellg();
                                if ((pos == -1) || (pos >= line->end)) { break; }
+                       
                        #else
                                if (inFASTA.eof()) { break; }
                        #endif
-                               
+                       
                        //report progress
                        if((count) % 1000 == 0){        m->mothurOut(toString(count)); m->mothurOutEndLine();           }
                        
                }
                //report progress
                if((count) % 1000 != 0){        m->mothurOut(toString(count)); m->mothurOutEndLine();           }
-
+               
                
                inFASTA.close();
                trimFASTAFile.close();
@@ -798,14 +798,18 @@ int TrimSeqsCommand::createProcessesCreateTrim(string filename, string qFileName
                                                                 qLines[process]);
                                
                                //pass groupCounts to parent
-                               ofstream out;
-                               string tempFile = filename + toString(getpid()) + ".num.temp";
-                               m->openOutputFile(tempFile, out);
-                               for (map<string, int>::iterator it = groupCounts.begin(); it != groupCounts.end(); it++) {
-                                       out << it->first << '\t' << it->second << endl;
+                               if(oligoFile != ""){
+                                       ofstream out;
+                                       string tempFile = filename + toString(getpid()) + ".num.temp";
+                                       m->openOutputFile(tempFile, out);
+                                       
+                                       out << groupCounts.size() << endl;
+                                       
+                                       for (map<string, int>::iterator it = groupCounts.begin(); it != groupCounts.end(); it++) {
+                                               out << it->first << '\t' << it->second << endl;
+                                       }
+                                       out.close();
                                }
-                               out.close();
-                               
                                exit(0);
                        }else { 
                                m->mothurOut("[ERROR]: unable to spawn the necessary processes."); m->mothurOutEndLine(); 
@@ -859,8 +863,10 @@ int TrimSeqsCommand::createProcessesCreateTrim(string filename, string qFileName
                                remove((scrapNameFileName + toString(processIDS[i]) + ".temp").c_str());
                        }
                        
-                       m->appendFiles((groupFile + toString(processIDS[i]) + ".temp"), groupFile);
-                       remove((groupFile + toString(processIDS[i]) + ".temp").c_str());
+                       if(oligoFile != ""){
+                               m->appendFiles((groupFile + toString(processIDS[i]) + ".temp"), groupFile);
+                               remove((groupFile + toString(processIDS[i]) + ".temp").c_str());
+                       }
                        
                        
                        if(allFiles){
@@ -884,19 +890,26 @@ int TrimSeqsCommand::createProcessesCreateTrim(string filename, string qFileName
                                }
                        }
                        
-                       ifstream in;
-                       string tempFile =  filename + toString(processIDS[i]) + ".num.temp";
-                       m->openInputFile(tempFile, in);
-                       int tempNum;
-                       string group;
-                       while (!in.eof()) { 
-                               in >> group >> tempNum; m->gobble(in);
+                       if(oligoFile != ""){
+                               ifstream in;
+                               string tempFile =  filename + toString(processIDS[i]) + ".num.temp";
+                               m->openInputFile(tempFile, in);
+                               int tempNum;
+                               string group;
                                
-                               map<string, int>::iterator it = groupCounts.find(group);
-                               if (it == groupCounts.end()) {  groupCounts[group] = tempNum; }
-                               else { groupCounts[it->first] += tempNum; }
+                               in >> tempNum; m->gobble(in);
+                               
+                               if (tempNum != 0) {
+                                       while (!in.eof()) { 
+                                               in >> group >> tempNum; m->gobble(in);
+                               
+                                               map<string, int>::iterator it = groupCounts.find(group);
+                                               if (it == groupCounts.end()) {  groupCounts[group] = tempNum; }
+                                               else { groupCounts[it->first] += tempNum; }
+                                       }
+                               }
+                               in.close(); remove(tempFile.c_str());
                        }
-                       in.close(); remove(tempFile.c_str());
                        
                }