X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothurout.cpp;h=1920221fd8c64a0c98e21c8ba71c19e7e49e906b;hb=192b4636345c51d962d4711206535e34cb2fd97c;hp=aab9945230f680e4ce106e4266ff66ba5ee7c34e;hpb=cea46f0830d8d1a6dc26e3410fc283d26c355831;p=mothur.git diff --git a/mothurout.cpp b/mothurout.cpp index aab9945..1920221 100644 --- a/mothurout.cpp +++ b/mothurout.cpp @@ -9,6 +9,7 @@ #include "mothurout.h" + /******************************************************/ MothurOut* MothurOut::getInstance() { if( _uniqueInstance == 0) { @@ -17,6 +18,103 @@ MothurOut* MothurOut::getInstance() { return _uniqueInstance; } /*********************************************************************************************/ +void MothurOut::printCurrentFiles() { + try { + if (accnosfile != "") { mothurOut("accnos=" + accnosfile); mothurOutEndLine(); } + if (columnfile != "") { mothurOut("column=" + columnfile); mothurOutEndLine(); } + if (designfile != "") { mothurOut("design=" + designfile); mothurOutEndLine(); } + if (fastafile != "") { mothurOut("fasta=" + fastafile); mothurOutEndLine(); } + if (groupfile != "") { mothurOut("group=" + groupfile); mothurOutEndLine(); } + if (listfile != "") { mothurOut("list=" + listfile); mothurOutEndLine(); } + if (namefile != "") { mothurOut("name=" + namefile); mothurOutEndLine(); } + if (oligosfile != "") { mothurOut("oligos=" + oligosfile); mothurOutEndLine(); } + if (orderfile != "") { mothurOut("order=" + orderfile); mothurOutEndLine(); } + if (ordergroupfile != "") { mothurOut("ordergroup=" + ordergroupfile); mothurOutEndLine(); } + if (phylipfile != "") { mothurOut("phylip=" + phylipfile); mothurOutEndLine(); } + if (qualfile != "") { mothurOut("qfile=" + qualfile); mothurOutEndLine(); } + if (rabundfile != "") { mothurOut("rabund=" + rabundfile); mothurOutEndLine(); } + if (relabundfile != "") { mothurOut("relabund=" + relabundfile); mothurOutEndLine(); } + if (sabundfile != "") { mothurOut("sabund=" + sabundfile); mothurOutEndLine(); } + if (sfffile != "") { mothurOut("sff=" + sfffile); mothurOutEndLine(); } + if (sharedfile != "") { mothurOut("shared=" + sharedfile); mothurOutEndLine(); } + if (taxonomyfile != "") { mothurOut("taxonomy=" + taxonomyfile); mothurOutEndLine(); } + if (treefile != "") { mothurOut("tree=" + treefile); mothurOutEndLine(); } + if (flowfile != "") { mothurOut("flow=" + flowfile); mothurOutEndLine(); } + if (processors != "1") { mothurOut("processors=" + processors); mothurOutEndLine(); } + + } + catch(exception& e) { + errorOut(e, "MothurOut", "printCurrentFiles"); + exit(1); + } +} +/*********************************************************************************************/ +bool MothurOut::hasCurrentFiles() { + try { + bool hasCurrent = false; + + if (accnosfile != "") { return true; } + if (columnfile != "") { return true; } + if (designfile != "") { return true; } + if (fastafile != "") { return true; } + if (groupfile != "") { return true; } + if (listfile != "") { return true; } + if (namefile != "") { return true; } + if (oligosfile != "") { return true; } + if (orderfile != "") { return true; } + if (ordergroupfile != "") { return true; } + if (phylipfile != "") { return true; } + if (qualfile != "") { return true; } + if (rabundfile != "") { return true; } + if (relabundfile != "") { return true; } + if (sabundfile != "") { return true; } + if (sfffile != "") { return true; } + if (sharedfile != "") { return true; } + if (taxonomyfile != "") { return true; } + if (treefile != "") { return true; } + if (flowfile != "") { return true; } + if (processors != "1") { return true; } + + return hasCurrent; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "hasCurrentFiles"); + exit(1); + } +} + +/*********************************************************************************************/ +void MothurOut::clearCurrentFiles() { + try { + phylipfile = ""; + columnfile = ""; + listfile = ""; + rabundfile = ""; + sabundfile = ""; + namefile = ""; + groupfile = ""; + designfile = ""; + orderfile = ""; + treefile = ""; + sharedfile = ""; + ordergroupfile = ""; + relabundfile = ""; + fastafile = ""; + qualfile = ""; + sfffile = ""; + oligosfile = ""; + accnosfile = ""; + taxonomyfile = ""; + flowfile = ""; + processors = "1"; + } + catch(exception& e) { + errorOut(e, "MothurOut", "clearCurrentFiles"); + exit(1); + } +} +/*********************************************************************************************/ void MothurOut::setFileName(string filename) { try { logFileName = filename; @@ -60,6 +158,16 @@ void MothurOut::setDefaultPath(string pathname) { } } /*********************************************************************************************/ +void MothurOut::setOutputDir(string pathname) { + try { + outputDir = pathname; + } + catch(exception& e) { + errorOut(e, "MothurOut", "setOutputDir"); + exit(1); + } +} +/*********************************************************************************************/ void MothurOut::closeLog() { try { @@ -139,6 +247,53 @@ void MothurOut::mothurOutEndLine() { } } /*********************************************************************************************/ +void MothurOut::mothurOut(string output, ofstream& outputFile) { + try { + +#ifdef USE_MPI + int pid; + MPI_Comm_rank(MPI_COMM_WORLD, &pid); + + if (pid == 0) { //only one process should output to screen +#endif + + cout << output; + out << output; + outputFile << output; + +#ifdef USE_MPI + } +#endif + } + catch(exception& e) { + errorOut(e, "MothurOut", "MothurOut"); + exit(1); + } +} +/*********************************************************************************************/ +void MothurOut::mothurOutEndLine(ofstream& outputFile) { + try { +#ifdef USE_MPI + int pid; + MPI_Comm_rank(MPI_COMM_WORLD, &pid); + + if (pid == 0) { //only one process should output to screen +#endif + + cout << endl; + out << endl; + outputFile << endl; + +#ifdef USE_MPI + } +#endif + } + catch(exception& e) { + errorOut(e, "MothurOut", "MothurOutEndLine"); + exit(1); + } +} +/*********************************************************************************************/ void MothurOut::mothurOutJustToLog(string output) { try { #ifdef USE_MPI @@ -330,12 +485,12 @@ string MothurOut::getline(ifstream& fileHandle) { string line = ""; - while (!fileHandle.eof()) { + while (fileHandle) { //get next character char c = fileHandle.get(); //are you at the end of the line - if ((c == '\n') || (c == '\r') || (c == '\f')){ break; } + if ((c == '\n') || (c == '\r') || (c == '\f') || (c == EOF)){ break; } else { line += c; } } @@ -349,18 +504,21 @@ string MothurOut::getline(ifstream& fileHandle) { } /***********************************************************************/ +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) #ifdef USE_COMPRESSION inline bool endsWith(string s, const char * suffix){ size_t suffixLength = strlen(suffix); return s.size() >= suffixLength && s.substr(s.size() - suffixLength, suffixLength).compare(suffix) == 0; } #endif +#endif string MothurOut::getRootName(string longName){ try { string rootName = longName; +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) #ifdef USE_COMPRESSION if (endsWith(rootName, ".gz") || endsWith(rootName, ".bz2")) { int pos = rootName.find_last_of('.'); @@ -368,7 +526,7 @@ string MothurOut::getRootName(string longName){ cerr << "shortening " << longName << " to " << rootName << "\n"; } #endif - +#endif if(rootName.find_last_of(".") != rootName.npos){ int pos = rootName.find_last_of('.')+1; rootName = rootName.substr(0, pos); @@ -404,6 +562,21 @@ string MothurOut::getSimpleName(string longName){ /***********************************************************************/ +int MothurOut::getRandomIndex(int highest){ + try { + + int random = (int) ((float)(highest+1) * (float)(rand()) / ((float)RAND_MAX+1.0)); + + return random; + } + catch(exception& e) { + errorOut(e, "MothurOut", "getRandomIndex"); + exit(1); + } + +} +/**********************************************************************/ + string MothurOut::getPathName(string longName){ try { string rootPathName = longName; @@ -475,6 +648,7 @@ bool MothurOut::isBlank(string fileName){ //check for blank file gobble(fileHandle); if (fileHandle.eof()) { fileHandle.close(); return true; } + fileHandle.close(); } return false; } @@ -502,19 +676,29 @@ string MothurOut::getFullPathName(string fileName){ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) if (path.find("~") != -1) { //go to home directory - string homeDir = getenv ("HOME"); + string homeDir; + + char *homepath = NULL; + homepath = getenv ("HOME"); + if ( homepath != NULL) { homeDir = homepath; } + else { homeDir = ""; } + newFileName = homeDir + fileName.substr(fileName.find("~")+1); return newFileName; }else { //find path - if (path.rfind("./") == -1) { return fileName; } //already complete name + if (path.rfind("./") == string::npos) { return fileName; } //already complete name else { newFileName = fileName.substr(fileName.rfind("./")+2); } //save the complete part of the name - char* cwdpath = new char[1024]; + //char* cwdpath = new char[1024]; + //size_t size; + //cwdpath=getcwd(cwdpath,size); + //cwd = cwdpath; + + char *cwdpath = NULL; + cwdpath = getcwd(NULL, 0); // or _getcwd + if ( cwdpath != NULL) { cwd = cwdpath; } + else { cwd = ""; } - size_t size; - cwdpath=getcwd(cwdpath,size); - - cwd = cwdpath; //rip off first '/' string simpleCWD; @@ -522,7 +706,7 @@ string MothurOut::getFullPathName(string fileName){ //break apart the current working directory vector dirs; - while (simpleCWD.find_first_of('/') != -1) { + while (simpleCWD.find_first_of('/') != string::npos) { string dir = simpleCWD.substr(0,simpleCWD.find_first_of('/')); simpleCWD = simpleCWD.substr(simpleCWD.find_first_of('/')+1, simpleCWD.length()); dirs.push_back(dir); @@ -533,7 +717,7 @@ string MothurOut::getFullPathName(string fileName){ int index = dirs.size()-1; - while((pos = path.rfind("./")) != -1) { //while you don't have a complete path + while((pos = path.rfind("./")) != string::npos) { //while you don't have a complete path if (pos == 0) { break; //you are at the end }else if (path[(pos-1)] == '.') { //you want your parent directory ../ path = path.substr(0, pos-1); @@ -553,12 +737,12 @@ string MothurOut::getFullPathName(string fileName){ return newFileName; } #else - if (path.find("~") != -1) { //go to home directory + if (path.find("~") != string::npos) { //go to home directory string homeDir = getenv ("HOMEPATH"); newFileName = homeDir + fileName.substr(fileName.find("~")+1); return newFileName; }else { //find path - if (path.rfind(".\\") == -1) { return fileName; } //already complete name + if (path.rfind(".\\") == string::npos) { return fileName; } //already complete name else { newFileName = fileName.substr(fileName.rfind(".\\")+2); } //save the complete part of the name char *cwdpath = NULL; @@ -579,7 +763,7 @@ string MothurOut::getFullPathName(string fileName){ int index = dirs.size()-1; - while((pos = path.rfind(".\\")) != -1) { //while you don't have a complete path + while((pos = path.rfind(".\\")) != string::npos) { //while you don't have a complete path if (pos == 0) { break; //you are at the end }else if (path[(pos-1)] == '.') { //you want your parent directory ../ path = path.substr(0, pos-1); @@ -612,7 +796,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ try { //get full path name string completeFileName = getFullPathName(fileName); - +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) #ifdef USE_COMPRESSION // check for gzipped or bzipped file if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { @@ -627,7 +811,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; system(command.c_str()); cerr << "Done decompressing " << completeFileName << "\n"; - remove(tempName.c_str()); + mothurRemove(tempName); exit(EXIT_SUCCESS); } else { cerr << "waiting on child process " << fork_result << "\n"; @@ -635,9 +819,10 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ } } #endif - +#endif fileHandle.open(completeFileName.c_str()); if(!fileHandle) { + //mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine(); return 1; }else { //check for blank file @@ -657,7 +842,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){ //get full path name string completeFileName = getFullPathName(fileName); - +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) #ifdef USE_COMPRESSION // check for gzipped or bzipped file if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { @@ -672,7 +857,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){ cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; system(command.c_str()); cerr << "Done decompressing " << completeFileName << "\n"; - remove(tempName.c_str()); + mothurRemove(tempName); exit(EXIT_SUCCESS); } else { cerr << "waiting on child process " << fork_result << "\n"; @@ -680,7 +865,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){ } } #endif - +#endif fileHandle.open(completeFileName.c_str()); if(!fileHandle) { @@ -706,10 +891,10 @@ int MothurOut::renameFile(string oldName, string newName){ try { ifstream inTest; int exist = openInputFile(newName, inTest, ""); + inTest.close(); #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) if (exist == 0) { //you could open it so you want to delete it - inTest.close(); string command = "rm " + newName; system(command.c_str()); } @@ -717,7 +902,7 @@ int MothurOut::renameFile(string oldName, string newName){ string command = "mv " + oldName + " " + newName; system(command.c_str()); #else - remove(newName.c_str()); + mothurRemove(newName); int renameOk = rename(oldName.c_str(), newName.c_str()); #endif return 0; @@ -735,7 +920,7 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ try { string completeFileName = getFullPathName(fileName); - +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) #ifdef USE_COMPRESSION // check for gzipped file if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { @@ -755,7 +940,7 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ } } #endif - +#endif fileHandle.open(completeFileName.c_str(), ios::trunc); if(!fileHandle) { mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine(); @@ -773,7 +958,7 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ } /**************************************************************************************************/ -void MothurOut::appendFiles(string temp, string filename) { +int MothurOut::appendFiles(string temp, string filename) { try{ ofstream output; ifstream input; @@ -781,16 +966,20 @@ void MothurOut::appendFiles(string temp, string filename) { //open output file in append mode openOutputFileAppend(filename, output); int ableToOpen = openInputFile(temp, input, "no error"); + //int ableToOpen = openInputFile(temp, input); + int numLines = 0; if (ableToOpen == 0) { //you opened it while(char c = input.get()){ if(input.eof()) { break; } - else { output << c; } + else { output << c; if (c == '\n') {numLines++;} } } input.close(); } output.close(); + + return numLines; } catch(exception& e) { errorOut(e, "MothurOut", "appendFiles"); @@ -852,8 +1041,8 @@ string MothurOut::sortFile(string distFile, string outputDir){ output.close(); //remove temp files - remove(tempDistFile.c_str()); - remove(tempOutfile.c_str()); + mothurRemove(tempDistFile); + mothurRemove(tempOutfile); #endif return outfile; @@ -864,19 +1053,27 @@ string MothurOut::sortFile(string distFile, string outputDir){ } } /**************************************************************************************************/ -vector MothurOut::setFilePosFasta(string filename, int& num) { +vector MothurOut::setFilePosFasta(string filename, int& num) { try { - vector positions; + vector positions; ifstream inFASTA; - openInputFile(filename, inFASTA); + //openInputFile(filename, inFASTA); + inFASTA.open(filename.c_str(), ios::binary); string input; + unsigned long long count = 0; while(!inFASTA.eof()){ - input = getline(inFASTA); - if (input.length() != 0) { - if(input[0] == '>'){ unsigned long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1); } + //input = getline(inFASTA); + //cout << input << '\t' << inFASTA.tellg() << endl; + //if (input.length() != 0) { + // if(input[0] == '>'){ unsigned long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1); cout << (pos - input.length() - 1) << endl; } + //} + //gobble(inFASTA); //has to be here since windows line endings are 2 characters and mess up the positions + char c = inFASTA.get(); count++; + if (c == '>') { + positions.push_back(count-1); + //cout << count << endl; } - gobble(inFASTA); //has to be here since windows line endings are 2 characters and mess up the positions } inFASTA.close(); @@ -894,19 +1091,20 @@ vector MothurOut::setFilePosFasta(string filename, int& num) fclose (pFile); }*/ - unsigned long int size = positions[(positions.size()-1)]; + unsigned long long size = positions[(positions.size()-1)]; ifstream in; openInputFile(filename, in); in.seekg(size); - while(char c = in.get()){ + while(in.get()){ if(in.eof()) { break; } else { size++; } } in.close(); positions.push_back(size); + positions[0] = 0; return positions; } @@ -916,31 +1114,51 @@ vector MothurOut::setFilePosFasta(string filename, int& num) } } /**************************************************************************************************/ -vector MothurOut::setFilePosEachLine(string filename, int& num) { +vector MothurOut::setFilePosEachLine(string filename, int& num) { try { filename = getFullPathName(filename); - vector positions; + vector positions; ifstream in; - openInputFile(filename, in); - + //openInputFile(filename, in); + in.open(filename.c_str(), ios::binary); + string input; + unsigned long long count = 0; + positions.push_back(0); + while(!in.eof()){ - unsigned long int lastpos = in.tellg(); - input = getline(in); - if (input.length() != 0) { - unsigned long int pos = in.tellg(); - if (pos != -1) { positions.push_back(pos - input.length() - 1); } - else { positions.push_back(lastpos); } + //unsigned long long lastpos = in.tellg(); + //input = getline(in); + //if (input.length() != 0) { + //unsigned long long pos = in.tellg(); + //if (pos != -1) { positions.push_back(pos - input.length() - 1); } + //else { positions.push_back(lastpos); } + //} + //gobble(in); //has to be here since windows line endings are 2 characters and mess up the positions + + + //getline counting reads + char d = in.get(); count++; + while ((d != '\n') && (d != '\r') && (d != '\f') && (d != in.eof())) { + //get next character + d = in.get(); + count++; } - gobble(in); //has to be here since windows line endings are 2 characters and mess up the positions + + if (!in.eof()) { + d=in.get(); count++; + while(isspace(d) && (d != in.eof())) { d=in.get(); count++;} + } + positions.push_back(count-1); + cout << count-1 << endl; } in.close(); - num = positions.size(); + num = positions.size()-1; FILE * pFile; - unsigned long int size; + unsigned long long size; //get num bytes in file pFile = fopen (filename.c_str(),"rb"); @@ -951,7 +1169,7 @@ vector MothurOut::setFilePosEachLine(string filename, int& nu fclose (pFile); } - positions.push_back(size); + positions[(positions.size()-1)] = size; return positions; } @@ -962,14 +1180,14 @@ vector MothurOut::setFilePosEachLine(string filename, int& nu } /**************************************************************************************************/ -vector MothurOut::divideFile(string filename, int& proc) { +vector MothurOut::divideFile(string filename, int& proc) { try{ - vector filePos; + vector filePos; filePos.push_back(0); FILE * pFile; - unsigned long int size; + unsigned long long size; filename = getFullPathName(filename); @@ -983,7 +1201,7 @@ vector MothurOut::divideFile(string filename, int& proc) { } //estimate file breaks - unsigned long int chunkSize = 0; + unsigned long long chunkSize = 0; chunkSize = size / proc; //file to small to divide by processors @@ -991,21 +1209,21 @@ vector MothurOut::divideFile(string filename, int& proc) { //for each process seekg to closest file break and search for next '>' char. make that the filebreak for (int i = 0; i < proc; i++) { - unsigned long int spot = (i+1) * chunkSize; + unsigned long long spot = (i+1) * chunkSize; ifstream in; openInputFile(filename, in); in.seekg(spot); //look for next '>' - unsigned long int newSpot = spot; + unsigned long long newSpot = spot; while (!in.eof()) { char c = in.get(); if (c == '>') { in.putback(c); newSpot = in.tellg(); break; } } //there was not another sequence before the end of the file - unsigned long int sanityPos = in.tellg(); + unsigned long long sanityPos = in.tellg(); if (sanityPos == -1) { break; } else { filePos.push_back(newSpot); } @@ -1018,7 +1236,7 @@ vector MothurOut::divideFile(string filename, int& proc) { //sanity check filePos for (int i = 0; i < (filePos.size()-1); i++) { - if (filePos[(i+1)] <= filePos[i]) { cout << "erasing " << (i+1) << endl; filePos.erase(filePos.begin()+(i+1)); i--; } + if (filePos[(i+1)] <= filePos[i]) { filePos.erase(filePos.begin()+(i+1)); i--; } } proc = (filePos.size() - 1); @@ -1030,7 +1248,43 @@ vector MothurOut::divideFile(string filename, int& proc) { exit(1); } } - +/**************************************************************************************************/ +int MothurOut::divideFile(string filename, int& proc, vector& files) { + try{ + + vector filePos = divideFile(filename, proc); + + for (int i = 0; i < (filePos.size()-1); i++) { + + //read file chunk + ifstream in; + openInputFile(filename, in); + in.seekg(filePos[i]); + unsigned long long size = filePos[(i+1)] - filePos[i]; + char* chunk = new char[size]; + in.read(chunk, size); + in.close(); + + //open new file + string fileChunkName = filename + "." + toString(i) + ".tmp"; + ofstream out; + openOutputFile(fileChunkName, out); + + out << chunk << endl; + out.close(); + delete[] chunk; + + //save name + files.push_back(fileChunkName); + } + + return 0; + } + catch(exception& e) { + errorOut(e, "MothurOut", "divideFile"); + exit(1); + } +} /***********************************************************************/ bool MothurOut::isTrue(string f){ @@ -1069,6 +1323,127 @@ float MothurOut::ceilDist(float dist, int precision){ exit(1); } } +/**********************************************************************************************************************/ +int MothurOut::readNames(string namefile, map& nameMap) { + try { + + //open input file + ifstream in; + openInputFile(namefile, in); + + while (!in.eof()) { + if (control_pressed) { break; } + + string firstCol, secondCol; + in >> firstCol >> secondCol; gobble(in); + + nameMap[firstCol] = secondCol; + } + in.close(); + + return 0; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "readNames"); + exit(1); + } +} +/**********************************************************************************************************************/ +int MothurOut::readNames(string namefile, map >& nameMap) { + try { + + //open input file + ifstream in; + openInputFile(namefile, in); + + while (!in.eof()) { + if (control_pressed) { break; } + + string firstCol, secondCol; + in >> firstCol >> secondCol; gobble(in); + + vector temp; + splitAtComma(secondCol, temp); + + nameMap[firstCol] = temp; + } + in.close(); + + return 0; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "readNames"); + exit(1); + } +} +/**********************************************************************************************************************/ +map MothurOut::readNames(string namefile) { + try { + + map nameMap; + + //open input file + ifstream in; + openInputFile(namefile, in); + + while (!in.eof()) { + if (control_pressed) { break; } + + string firstCol, secondCol; + in >> firstCol >> secondCol; gobble(in); + + int num = getNumNames(secondCol); + + nameMap[firstCol] = num; + } + in.close(); + + return nameMap; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "readNames"); + exit(1); + } +} +/**********************************************************************************************************************/ +int MothurOut::readNames(string namefile, vector& nameVector, map& fastamap) { + try { + int error = 0; + + //open input file + ifstream in; + openInputFile(namefile, in); + + while (!in.eof()) { + if (control_pressed) { break; } + + string firstCol, secondCol; + in >> firstCol >> secondCol; gobble(in); + + int num = getNumNames(secondCol); + + map::iterator it = fastamap.find(firstCol); + if (it == fastamap.end()) { + error = 1; + mothurOut("[ERROR]: " + firstCol + " is not in your fastafile, but is in your namesfile, please correct."); mothurOutEndLine(); + }else { + seqPriorityNode temp(num, it->second, firstCol); + nameVector.push_back(temp); + } + } + in.close(); + + return error; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "readNames"); + exit(1); + } +} /***********************************************************************/ @@ -1092,7 +1467,18 @@ int MothurOut::getNumNames(string names){ exit(1); } } +/***********************************************************************/ +void MothurOut::mothurRemove(string filename){ + try { + filename = getFullPathName(filename); + remove(filename.c_str()); + } + catch(exception& e) { + errorOut(e, "MothurOut", "mothurRemove"); + exit(1); + } +} /**************************************************************************************************/ vector > MothurOut::binomial(int maxOrder){ @@ -1129,7 +1515,90 @@ vector > MothurOut::binomial(int maxOrder){ exit(1); } } - +/**************************************************************************************************/ +unsigned int MothurOut::fromBase36(string base36){ + try { + unsigned int num = 0; + + map converts; + converts['A'] = 0; + converts['a'] = 0; + converts['B'] = 1; + converts['b'] = 1; + converts['C'] = 2; + converts['c'] = 2; + converts['D'] = 3; + converts['d'] = 3; + converts['E'] = 4; + converts['e'] = 4; + converts['F'] = 5; + converts['f'] = 5; + converts['G'] = 6; + converts['g'] = 6; + converts['H'] = 7; + converts['h'] = 7; + converts['I'] = 8; + converts['i'] = 8; + converts['J'] = 9; + converts['j'] = 9; + converts['K'] = 10; + converts['k'] = 10; + converts['L'] = 11; + converts['l'] = 11; + converts['M'] = 12; + converts['m'] = 12; + converts['N'] = 13; + converts['n'] = 13; + converts['O'] = 14; + converts['o'] = 14; + converts['P'] = 15; + converts['p'] = 15; + converts['Q'] = 16; + converts['q'] = 16; + converts['R'] = 17; + converts['r'] = 17; + converts['S'] = 18; + converts['s'] = 18; + converts['T'] = 19; + converts['t'] = 19; + converts['U'] = 20; + converts['u'] = 20; + converts['V'] = 21; + converts['v'] = 21; + converts['W'] = 22; + converts['w'] = 22; + converts['X'] = 23; + converts['x'] = 23; + converts['Y'] = 24; + converts['y'] = 24; + converts['Z'] = 25; + converts['z'] = 25; + converts['0'] = 26; + converts['1'] = 27; + converts['2'] = 28; + converts['3'] = 29; + converts['4'] = 30; + converts['5'] = 31; + converts['6'] = 32; + converts['7'] = 33; + converts['8'] = 34; + converts['9'] = 35; + + int i = 0; + while (i < base36.length()) { + char c = base36[i]; + num = 36 * num + converts[c]; + i++; + } + + return num; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "fromBase36"); + exit(1); + } +} /***********************************************************************/ int MothurOut::factorial(int num){ @@ -1195,17 +1664,6 @@ void MothurOut::splitAtChar(string& estim, vector& container, char symbo } container.push_back(individual); - /* - - while (estim.find_first_of(symbol) != -1) { - individual = estim.substr(0,estim.find_first_of(symbol)); - if ((estim.find_first_of(symbol)+1) <= estim.length()) { //checks to make sure you don't have dash at end of string - estim = estim.substr(estim.find_first_of(symbol)+1, estim.length()); - container.push_back(individual); - } - } - //get last one - container.push_back(estim); */ } catch(exception& e) { errorOut(e, "MothurOut", "splitAtChar"); @@ -1440,20 +1898,21 @@ bool MothurOut::anyLabelsToProcess(string label, set& userLabels, string } //go through users set and make them floats - for(it = userLabels.begin(); it != userLabels.end(); ++it) { + for(it = userLabels.begin(); it != userLabels.end();) { float temp; if ((*it != "unique") && (convertTestFloat(*it, temp) == true)){ convert(*it, temp); orderFloat.push_back(temp); userMap[*it] = temp; + it++; }else if (*it == "unique") { orderFloat.push_back(-1.0); userMap["unique"] = -1.0; + it++; }else { - if (errorOff == "") { cout << *it << " is not a valid label." << endl; } - userLabels.erase(*it); - it--; + if (errorOff == "") { mothurOut(*it + " is not a valid label."); mothurOutEndLine(); } + userLabels.erase(it++); } } @@ -1469,11 +1928,11 @@ bool MothurOut::anyLabelsToProcess(string label, set& userLabels, string if (orderFloat[i] < labelFloat) { smaller = true; if (orderFloat[i] == -1) { - if (errorOff == "") { cout << "Your file does not include the label unique." << endl; } + if (errorOff == "") { mothurOut("Your file does not include the label unique."); mothurOutEndLine(); } userLabels.erase("unique"); } else { - if (errorOff == "") { cout << "Your file does not include the label " << endl; } + if (errorOff == "") { mothurOut("Your file does not include the label "); mothurOutEndLine(); } string s = ""; for (it2 = userMap.begin(); it2!= userMap.end(); it2++) { if (it2->second == orderFloat[i]) { @@ -1483,7 +1942,7 @@ bool MothurOut::anyLabelsToProcess(string label, set& userLabels, string break; } } - if (errorOff == "") {cout << s << ". I will use the next smallest distance. " << endl; } + if (errorOff == "") {mothurOut( s + ". I will use the next smallest distance. "); mothurOutEndLine(); } } //since they are sorted once you find a bigger one stop looking }else { break; } @@ -1544,6 +2003,23 @@ bool MothurOut::checkReleaseVersion(ifstream& file, string version) { } } /**************************************************************************************************/ +bool MothurOut::isContainingOnlyDigits(string input) { + try{ + + //are you a digit in ascii code + for (int i = 0;i < input.length(); i++){ + if( input[i]>47 && input[i]<58){} + else { return false; } + } + + return true; + } + catch(exception& e) { + errorOut(e, "MothurOut", "isContainingOnlyDigits"); + exit(1); + } +} +/**************************************************************************************************/