/** * Author: Mark Larkin * * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson. * * @author Mark Larkin, Conway Institute, UCD. mark.larkin@ucd.ie * * Changes: * * 2007-12-03, Andreas Wilm (UCD): replaced gets with fgets, and * got rid of some compiler warning * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "Utility.h" #include "general/userparams.h" namespace clustalw { /** constructor */ Utility::Utility() { quiet=false; } /** * Removes trailing blanks from a string */ void Utility::rTrim(string *str) { string::reverse_iterator rit = str->rbegin(); while(rit != str->rend() && isspace(*rit)) { str->erase((++rit).base()); } } /** * Removes trailing blanks from a string * @param str String to remove trailing blanks from. * @return Pointer to the processed string */ char * Utility::rTrim(char *str) { register int p; p = strlen(str) - 1; while (isspace(str[p])) { p--; } str[p + 1] = EOS; return str; } /** * Replace blanks in a string with underscores. Also replaces , ; : ( or ) with _. * @param str String to process. * @return Pointer to the processed string */ char * Utility::blankToUnderscore(char *str) { int i, p; p = strlen(str) - 1; for (i = 0; i <= p; i++) if ((str[i] == ' ') || (str[i] == ';') || (str[i] == ',') || (str[i] == '(') || (str[i] == ')') || (str[i] == ':')) { str[i] = '_'; } return str; } /** * Replace blanks in a string with underscores. Also replaces , ; : ( or ) with _. * @param str String to process. * @return Pointer to the processed string */ string Utility::blankToUnderscore(string str) { int i, p; p = str.size() - 1; for (i = 0; i <= p; i++) if ((str[i] == ' ') || (str[i] == ';') || (str[i] == ',') || (str[i] == '(') || (str[i] == ')') || (str[i] == ':')) { str[i] = '_'; } return str; } /** * * @param instr * @return */ char Utility::getChoice(string instr) { cout << instr << ": "; cout.flush(); char choice; cin.get(choice); // We only want one character, so we ignore the rest. if(choice != '\n') { cin.ignore(150, '\n'); } cin.clear(); if(isalpha(choice) || isNumeric(choice)) { return choice; } else if(choice == '\n') { return '\n'; } else { return ' '; } } bool Utility::isNumeric(char ch) { if(ch >= '0' && ch <= '9') { return true; } return false; } /** * * @param instr * @param outstr */ void Utility::getStr(string instr, string& outstr) { cout << instr << ": "; cout.flush(); string temp; getline(cin, temp, '\n'); outstr = temp; cin.clear(); } /** * * @param instr * @param minx * @param maxx * @param def * @return */ double Utility::getReal(const char *instr, double minx, double maxx, double def) { int status; float ret; char line[MAXLINE]; while (true) { fprintf(stdout, "%s (%.1f-%.1f) [%.1f]: ", instr, minx, maxx, def); //gets(line); fgets(line, MAXLINE, stdin); status = sscanf(line, "%f", &ret); if (status == EOF) { return def; } if (ret > maxx) { fprintf(stderr, "ERROR: Max. value=%.1f\n\n", maxx); continue; } if (ret < minx) { fprintf(stderr, "ERROR: Min. value=%.1f\n\n", minx); continue; } break; } return (double)ret; } /** * * @param instr * @param minx * @param maxx * @param def * @return */ int Utility::getInt(const char *instr, int minx, int maxx, int def) { int ret, status; char line[MAXLINE]; while (true) { fprintf(stdout, "%s (%d..%d) [%d]: ", instr, minx, maxx, def); //gets(line); fgets(line, MAXLINE, stdin); status = sscanf(line, "%d", &ret); if (status == EOF) { return def; } if (ret > maxx) { fprintf(stderr, "ERROR: Max. value=%d\n\n", maxx); continue; } if (ret < minx) { fprintf(stderr, "ERROR: Min. value=%d\n\n", minx); continue; } break; } return ret; } /** * * @param line * @param code * @return */ bool Utility::lineType(char *line, const char *code) { // AW: introduced sanity check int n; if (strlen(line) - 1; --i) { if (str[i] == DIRDELIM) { i = - 1; break; } if (str[i] == '.') { break; } } if (i < 0) { _temp += "."; } else { _temp = _temp.substr(0, i + 1); } *path = _temp; } /** * * @param title * @param prompt * @return * * */ char Utility::promptForYesNo(char *title, const char *prompt) { cout << "\n" << title << "\n"; string promptMessage = string(prompt) + "(y/n) ? [y]"; string answer; getStr(promptMessage, answer); if(!answer.empty()) { if ((answer[0] != 'n') && (answer[0] != 'N')) { return ('y'); } } return ('n'); } /** * * @param title * @param prompt * @return * */ char Utility::promptForYesNo(const char *title, const char *prompt) { cout << "\n" << title << "\n"; string promptMessage = string(prompt) + "(y/n) ? [y]"; string answer; getStr(promptMessage, answer); if(!answer.empty()) { if ((answer[0] != 'n') && (answer[0] != 'N')) { return ('y'); } } return ('n'); } /** * * @param msg */ void Utility::error( char *msg,...) { va_list ap; va_start(ap, msg); fprintf(stderr, "\n\nERROR: "); vfprintf(stderr, msg, ap); fprintf(stderr, "\n\n"); va_end(ap); } /** * * @param msg */ void Utility::warning( char *msg,...) { va_list ap; va_start(ap, msg); fprintf(stderr, "\n\nWARNING: "); vfprintf(stderr, msg, ap); fprintf(stderr, "\n\n"); va_end(ap); } /** * * @param msg */ void Utility::error( const char *msg,...) { va_list ap; va_start(ap, msg); fprintf(stderr, "\n\nERROR: "); vfprintf(stderr, msg, ap); fprintf(stderr, "\n\n"); va_end(ap); } /** * * @param msg */ void Utility::warning( const char *msg,...) { va_list ap; va_start(ap, msg); fprintf(stderr, "\n\nWARNING: "); vfprintf(stderr, msg, ap); fprintf(stderr, "\n\n"); va_end(ap); } /** * * @param msg */ void Utility::info( char *msg,...) { va_list ap; va_start(ap, msg); if(! quiet) { fprintf(stdout, "\n"); vfprintf(stdout, msg, ap); va_end(ap); } } /** * * @param msg */ void Utility::info(const char *msg,...) { va_list ap; if(! quiet) { va_start(ap, msg); fprintf(stdout, "\n"); vfprintf(stdout, msg, ap); va_end(ap); } } /** * */ void Utility::myname( char *myname) { strcpy(myname, "clustalw\0"); } /** * Change: * Mark 25-1-2007. I made this change to get around the problem of having to keep track * of output indexes in the alignment stage. This function returns the next unique id. */ unsigned long Utility::getUniqueSequenceIdentifier() { static unsigned long nextSequenceIdentifier = MinIdentifier; return nextSequenceIdentifier++; } void Utility::setInfoLabelPtr(QLabel* ptrToLabelObj) { // Dont do anything. This is here to allow the function to be added to QTUtility. // Polymorphism wont work with different functions in the classes. } double Utility::average(std::vector& v) { double tmp = 0.0; std::vector::iterator i; if (v.size() == 0) return 0.0; for (i=v.begin(); i != v.end(); i++) tmp += *i; return (tmp / v.size()); } double Utility::stdDev(std::vector& v) { std::vector::iterator i; double tmp = 0.0; double avg = average(v); if (v.size() == 0) return 0.0; for(i=v.begin(); i != v.end(); ++i) tmp += (*i - avg) * (*i - avg); return sqrt(tmp / v.size()); } double Utility::median(std::vector v) { // From Moo & Koenig, "Accelerated C++: typedef vector::size_type vec_sz; vec_sz size = v.size(); if (v.size() == 0) return 0.0; std::sort(v.begin(), v.end()); vec_sz mid = size/2; return size % 2 == 0 ? (v[mid] + v[mid-1]) / 2 : v[mid]; } }