From 43835751a12097ea9d46a4ce68e2671ba7aff9d4 Mon Sep 17 00:00:00 2001 From: westcott Date: Fri, 27 May 2011 15:37:04 +0000 Subject: [PATCH] captured stdout from system command, fixed bug in trim.seqs added error checks for blast exes to blastdb.cpp --- blastdb.cpp | 131 ++++++++++++++++++++++++++++++++++++++++---- chimeraslayer.cpp | 4 ++ systemcommand.cpp | 14 ++++- trimseqscommand.cpp | 59 ++++++++++++-------- 4 files changed, 174 insertions(+), 34 deletions(-) diff --git a/blastdb.cpp b/blastdb.cpp index 48ae168..c7003f4 100644 --- a/blastdb.cpp +++ b/blastdb.cpp @@ -14,17 +14,74 @@ /**************************************************************************************************/ -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"); diff --git a/chimeraslayer.cpp b/chimeraslayer.cpp index 7020860..3f45e17 100644 --- a/chimeraslayer.cpp +++ b/chimeraslayer.cpp @@ -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 ChimeraSlayer::getTemplate(Sequence* q, vector& 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(); diff --git a/systemcommand.cpp b/systemcommand.cpp index 129ed80..e5aeb3e 100644 --- a/systemcommand.cpp +++ b/systemcommand.cpp @@ -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; } diff --git a/trimseqscommand.cpp b/trimseqscommand.cpp index dc87fff..4d6b45d 100644 --- a/trimseqscommand.cpp +++ b/trimseqscommand.cpp @@ -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::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::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::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::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()); } -- 2.39.2