X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=aligncommand.cpp;h=a68fbfcba365207d7847c7eeaff12d9e4a4914e2;hb=ce8794490ab1d83adcdb2b92e0302a1e43e17adf;hp=389235a034918aa556d95e40bd05d98e95cc49ed;hpb=e8c014de33edac1fb91d7593e143bf1f5107ffce;p=mothur.git diff --git a/aligncommand.cpp b/aligncommand.cpp index 389235a..a68fbfc 100644 --- a/aligncommand.cpp +++ b/aligncommand.cpp @@ -16,7 +16,7 @@ #include "aligncommand.h" #include "referencedb.h" -//test comm + //********************************************************************************************************************** vector AlignCommand::setParameters(){ try { @@ -75,6 +75,29 @@ string AlignCommand::getHelpString(){ exit(1); } } +//********************************************************************************************************************** +string AlignCommand::getOutputFileNameTag(string type, string inputName=""){ + try { + string tag = ""; + map >::iterator it; + + //is this a type this command creates + it = outputTypes.find(type); + if (it == outputTypes.end()) { m->mothurOut("[ERROR]: this command doesn't create a " + type + " output file.\n"); } + else { + if (type == "fasta") { tag = "align"; } + else if (type == "alignreport") { tag = "align.report"; } + else if (type == "accnos") { tag = "flip.accnos"; } + else { m->mothurOut("[ERROR]: No definition for type " + type + " output file tag.\n"); m->control_pressed = true; } + } + return tag; + } + catch(exception& e) { + m->errorOut(e, "AlignCommand", "getOutputFileName"); + exit(1); + } +} + //********************************************************************************************************************** AlignCommand::AlignCommand(){ try { @@ -305,9 +328,9 @@ int AlignCommand::execute(){ m->mothurOut("Aligning sequences from " + candidateFileNames[s] + " ..." ); m->mothurOutEndLine(); if (outputDir == "") { outputDir += m->hasPath(candidateFileNames[s]); } - string alignFileName = outputDir + m->getRootName(m->getSimpleName(candidateFileNames[s])) + "align"; - string reportFileName = outputDir + m->getRootName(m->getSimpleName(candidateFileNames[s])) + "align.report"; - string accnosFileName = outputDir + m->getRootName(m->getSimpleName(candidateFileNames[s])) + "flip.accnos"; + string alignFileName = outputDir + m->getRootName(m->getSimpleName(candidateFileNames[s])) + getOutputFileNameTag("fasta"); + string reportFileName = outputDir + m->getRootName(m->getSimpleName(candidateFileNames[s])) + getOutputFileNameTag("alignreport"); + string accnosFileName = outputDir + m->getRootName(m->getSimpleName(candidateFileNames[s])) + getOutputFileNameTag("accnos"); bool hasAccnos = true; int numFastaSeqs = 0; @@ -422,7 +445,7 @@ int AlignCommand::execute(){ #else vector positions; - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) positions = m->divideFile(candidateFileNames[s], processors); for (int i = 0; i < (positions.size()-1); i++) { lines.push_back(new linePair(positions[i], positions[(i+1)])); } #else @@ -430,7 +453,8 @@ int AlignCommand::execute(){ lines.push_back(new linePair(0, 1000)); }else { positions = m->setFilePosFasta(candidateFileNames[s], numFastaSeqs); - + if (positions.size() < processors) { processors = positions.size(); } + //figure out how many sequences you have to process int numSeqsPerProcessor = numFastaSeqs / processors; for (int i = 0; i < processors; i++) { @@ -617,7 +641,7 @@ int AlignCommand::driver(linePair* filePos, string alignFName, string reportFNam } delete candidateSeq; - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) unsigned long long pos = inFASTA.tellg(); if ((pos == -1) || (pos >= filePos->end)) { break; } #else @@ -826,7 +850,7 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s try { int num = 0; processIDS.resize(0); -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) int process = 1; //loop through and create all the processes you want @@ -874,7 +898,7 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s if (!in.eof()) { int tempNum = 0; in >> tempNum; num += tempNum; } in.close(); m->mothurRemove(tempFile); - appendAlignFiles((alignFileName + toString(processIDS[i]) + ".temp"), alignFileName); + m->appendFiles((alignFileName + toString(processIDS[i]) + ".temp"), alignFileName); m->mothurRemove((alignFileName + toString(processIDS[i]) + ".temp")); appendReportFiles((reportFileName + toString(processIDS[i]) + ".temp"), reportFileName); @@ -891,7 +915,7 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s rename(nonBlankAccnosFiles[0].c_str(), accnosFName.c_str()); for (int h=1; h < nonBlankAccnosFiles.size(); h++) { - appendAlignFiles(nonBlankAccnosFiles[h], accnosFName); + m->appendFiles(nonBlankAccnosFiles[h], accnosFName); m->mothurRemove(nonBlankAccnosFiles[h]); } }else { //recreate the accnosfile if needed @@ -956,7 +980,7 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s else { m->mothurRemove(accnosFName); } //remove so other files can be renamed to it for (int i = 1; i < processors; i++) { - appendAlignFiles((alignFileName + toString(i) + ".temp"), alignFileName); + m->appendFiles((alignFileName + toString(i) + ".temp"), alignFileName); m->mothurRemove((alignFileName + toString(i) + ".temp")); appendReportFiles((reportFileName + toString(i) + ".temp"), reportFileName); @@ -972,7 +996,7 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s rename(nonBlankAccnosFiles[0].c_str(), accnosFName.c_str()); for (int h=1; h < nonBlankAccnosFiles.size(); h++) { - appendAlignFiles(nonBlankAccnosFiles[h], accnosFName); + m->appendFiles(nonBlankAccnosFiles[h], accnosFName); m->mothurRemove(nonBlankAccnosFiles[h]); } }else { //recreate the accnosfile if needed @@ -989,29 +1013,6 @@ int AlignCommand::createProcesses(string alignFileName, string reportFileName, s exit(1); } } -/**************************************************************************************************/ - -void AlignCommand::appendAlignFiles(string temp, string filename) { - try{ - - ofstream output; - ifstream input; - m->openOutputFileAppend(filename, output); - m->openInputFile(temp, input); - - while(char c = input.get()){ - if(input.eof()) { break; } - else { output << c; } - } - - input.close(); - output.close(); - } - catch(exception& e) { - m->errorOut(e, "AlignCommand", "appendAlignFiles"); - exit(1); - } -} //********************************************************************************************************************** void AlignCommand::appendReportFiles(string temp, string filename) { @@ -1024,10 +1025,11 @@ void AlignCommand::appendReportFiles(string temp, string filename) { while (!input.eof()) { char c = input.get(); if (c == 10 || c == 13){ break; } } // get header line - while(char c = input.get()){ - if(input.eof()) { break; } - else { output << c; } - } + char buffer[4096]; + while (!input.eof()) { + input.read(buffer, 4096); + output.write(buffer, input.gcount()); + } input.close(); output.close();