Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / clustalw / src / general / Utility.cpp
diff --git a/website/archive/binaries/mac/src/clustalw/src/general/Utility.cpp b/website/archive/binaries/mac/src/clustalw/src/general/Utility.cpp
new file mode 100644 (file)
index 0000000..619d62a
--- /dev/null
@@ -0,0 +1,533 @@
+/**
+ * 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 <iostream> 
+#include <algorithm> 
+#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)<strlen(code))
+     n=strlen(line);
+   else
+     n=strlen(code);
+   
+   return (strncmp(line, code, strlen(code)) == 0);
+}
+
+/**
+ * 
+ * @param line 
+ * @return 
+ */
+bool Utility::blankLine(char *line)
+{
+    int i;
+
+    for (i = 0; line[i] != '\n' && line[i] != EOS; i++)
+    {
+        if (isdigit(line[i]) || isspace(line[i]) || (line[i] == '*') ||
+            (line[i] == ':') || (line[i] == '.'))
+            ;
+        else
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
+/**
+ * 
+ * @param str 
+ * @param path 
+ */
+void Utility::getPath(string str, string *path)
+{
+    int i;
+    string _temp;
+    _temp = str;
+    
+    for (i = _temp.length() - 1; i >  - 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<double>& v)
+{
+    double tmp = 0.0;
+    std::vector<double>::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<double>& v)
+{
+    std::vector<double>::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<double> v)
+{
+    // From Moo & Koenig, "Accelerated C++:
+    typedef vector<double>::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];
+}
+
+}
+