Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / clustalw / src / interface / CommandLineParser.cpp
diff --git a/website/archive/binaries/mac/src/clustalw/src/interface/CommandLineParser.cpp b/website/archive/binaries/mac/src/clustalw/src/interface/CommandLineParser.cpp
new file mode 100644 (file)
index 0000000..3d58c58
--- /dev/null
@@ -0,0 +1,2796 @@
+/**
+ * Author: Mark Larkin
+ * 
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.  
+ */
+#ifdef HAVE_CONFIG_H
+    #include "config.h"
+#endif
+#include <cctype>
+#include <cstdio>
+#include <iostream>
+#include <fstream>
+#include "CommandLineParser.h"
+#include "../substitutionMatrix/globalmatrix.h"
+#include "general/Utility.h"
+#include "general/statsObject.h"
+
+
+
+using namespace std;
+
+namespace clustalw
+{
+
+CommandLineParser::CommandLineParser(StringArray* args, bool xmenus)
+   :setOptions(-1),
+    setHelp(-1),
+    setFullHelp(-1),
+    setQuiet(-1),
+    setInteractive(-1),
+    setBatch(-1),
+    setGapOpen(-1),
+    setGapExtend(-1),
+    setPWGapOpen(-1),
+    setPWGapExtend(-1),
+    setOutOrder(-1),
+    setBootLabels(-1),
+    setPWMatrix(-1),
+    setMatrix(-1),
+    setPWDNAMatrix(-1),
+    setDNAMatrix(-1),
+    setNegative(-1),
+    setNoWeights(-1),
+    setOutput(-1),
+    setOutputTree(-1),
+    setQuickTree(-1),
+    setType(-1),
+    setCase(-1),
+    setSeqNo(-1),
+    setSeqNoRange(-1),
+    setRange(-1),
+    setTransWeight(-1),
+    setSeed(-1),
+    setScore(-1),
+    setWindow(-1),
+    setKtuple(-1),
+    setKimura(-1),
+    setTopDiags(-1),
+    setPairGap(-1),
+    setTossGaps(-1),
+    setNoPGap(-1),
+    setNoHGap(-1),
+    setNoVGap(-1),
+    setHGapRes(-1),
+    setUseEndGaps(-1),
+    setMaxDiv(-1),
+    setGapDist(-1),
+    setDebug(-1),
+    setOutfile(-1),
+    setInfile(-1),
+    setProfile1(-1),
+    setProfile2(-1),
+    setAlign(-1),
+    setConvert(-1),
+    setNewTree(-1),
+    setUseTree(-1),
+    setNewTree1(-1),
+    setUseTree1(-1),
+    setNewTree2(-1),
+    setUseTree2(-1),
+    setBootstrap(-1),
+    setTree(-1),
+    setProfile(-1),
+    setSequences(-1),
+    setSecStruct1(-1),
+    setSecStruct2(-1),
+    setSecStructOutput(-1),
+    setHelixGap(-1),
+    setStrandGap(-1),
+    setLoopGap(-1),
+    setTerminalGap(-1),
+    setHelixEndIn(-1),
+    setHelixEndOut(-1),
+    setStrandEndIn(-1),
+    setStrandEndOut(-1),
+    profileType(PROFILE),
+    setDoIteration(-1),
+    setNumIterations(-1),
+    setTreeAlgorithm(-1),
+    setMaxSeqLen(-1),
+    setStatsFile(-1),
+    setOutputPim(-1)
+{
+    int ctr=0;
+    
+    // The rest of the variables are arrays!
+    try
+    {
+        clustalObj = new Clustal();
+        
+        // selecting the size prevents the resizing of the vector which is expensive. 
+        typeArg = new StringArray(3);
+        bootLabelsArg = new StringArray(3);
+        outOrderArg = new StringArray(3);
+        caseArg = new StringArray(3);
+        seqNoArg = new StringArray(3);
+        seqNoRangeArg = new StringArray(3);
+        scoreArg = new StringArray(3);
+        outputArg = new StringArray(7);
+        outputTreeArg = new StringArray(5);
+        outputSecStrArg = new StringArray(5);
+        cmdLineType = new StringArray(6);
+        clusterAlgorithm = new StringArray(3);
+        iterationArg = new StringArray(4);
+        
+        params = new StringArray; // Wait until I need it!!!!!!!!!
+        paramArg = new StringArray;
+    }
+    catch(const exception &ex)
+    {
+        cerr << ex.what() << endl;
+        cerr << "Terminating program. Cannot continue" << std::endl;
+        exit(1);
+    }
+                           
+    (*typeArg)[0] = "protein";
+    (*typeArg)[1] = "dna";
+    (*typeArg)[2] = "";
+        
+    (*bootLabelsArg)[0] = "node";
+    (*bootLabelsArg)[1] = "branch";
+    (*bootLabelsArg)[2] = "";
+    
+    (*outOrderArg)[0] = "input";
+    (*outOrderArg)[1] = "aligned";
+    (*outOrderArg)[2] = "";
+    
+    (*caseArg)[0] = "lower";
+    (*caseArg)[1] = "upper";
+    (*caseArg)[2] = "";
+    
+    (*seqNoArg)[0] = "off";
+    (*seqNoArg)[1] = "on";
+    (*seqNoArg)[2] = "";
+    
+    (*seqNoRangeArg)[0] = "off";
+    (*seqNoRangeArg)[1] = "on";
+    (*seqNoRangeArg)[2] = "";
+        
+    (*scoreArg)[0] = "percent";
+    (*scoreArg)[1] = "absolute";
+    (*scoreArg)[2] = "";
+    
+    (*outputArg)[0] = "gcg";
+    (*outputArg)[1] = "gde";
+    (*outputArg)[2] = "pir";
+    (*outputArg)[3] = "phylip";
+    (*outputArg)[4] = "nexus";
+    (*outputArg)[5] = "fasta";
+    (*outputArg)[6] = "";
+    
+    (*outputTreeArg)[0] = "nj";
+    (*outputTreeArg)[1] = "phylip";
+    (*outputTreeArg)[2] = "dist";
+    (*outputTreeArg)[3] = "nexus";
+    (*outputTreeArg)[4] = "";
+    
+    (*outputSecStrArg)[0] = "structure";
+    (*outputSecStrArg)[1] = "mask";
+    (*outputSecStrArg)[2] = "both";
+    (*outputSecStrArg)[3] = "none";
+    (*outputSecStrArg)[4] = "";
+    
+    (*cmdLineType)[0] = " ";
+    (*cmdLineType)[1] = "=n ";
+    (*cmdLineType)[2] = "=f ";
+    (*cmdLineType)[3] = "=string ";
+    (*cmdLineType)[4] = "=filename ";
+    (*cmdLineType)[5] = "";
+    
+    (*clusterAlgorithm)[0] = "nj";
+    (*clusterAlgorithm)[1] = "upgma";
+    (*clusterAlgorithm)[2] = "";
+
+    (*iterationArg)[0] = "tree";
+    (*iterationArg)[1] = "alignment";
+    (*iterationArg)[2] = "none";
+    (*iterationArg)[3] = "";
+        
+    userMatrixName = "";
+    pwUserMatrixName = "";
+    DNAUserMatrixName = "";
+    pwDNAUserMatrixName = "";
+    
+    clustalTreeName = "";
+    distTreeName = "";
+    phylipTreeName = "";
+    nexusTreeName = "";
+    p1TreeName = "";
+    p2TreeName = "";
+    pimName = "";
+
+    // NOTE there were only 3 params for the last one, so I put in NULL for the 4th.
+    ctr=0;
+    cmdLineFile[ctr++] = getCmdLineDataStruct("infile", &setInfile, FILARG, NULL);
+    cmdLineFile[ctr++] = getCmdLineDataStruct("profile1", &setProfile1, FILARG, NULL);
+    cmdLineFile[ctr++] = getCmdLineDataStruct("profile2", &setProfile2, FILARG, NULL);
+    cmdLineFile[ctr++] = getCmdLineDataStruct("", NULL, -1, NULL);
+    // FIXME: final ctr index is hardcoded in CommandLineParser
+    
+    ctr=0;
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("help", &setHelp, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("fullhelp", &setFullHelp, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("quiet", &setQuiet, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("check", &setHelp, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("options", &setOptions, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("align", &setAlign, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("newtree", &setNewTree, FILARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("usetree", &setUseTree, FILARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("newtree1", &setNewTree1, FILARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("usetree1", &setUseTree1, FILARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("newtree2", &setNewTree2, FILARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("usetree2", &setUseTree2, FILARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("bootstrap", &setBootstrap, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("tree", &setTree, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("quicktree", &setQuickTree, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("convert", &setConvert, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("interactive", &setInteractive, NOARG, NULL);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("batch", &setBatch, NOARG, NULL);
+    // Mark change 16-feb-2007 I added options for doing LE and iteration
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("iteration", &setDoIteration, 
+                                           OPTARG, iterationArg);
+    cmdLineVerb[ctr++] = getCmdLineDataStruct("", NULL, -1, NULL);
+    // FIXME: final ctr index is hardcoded in CommandLineParser.h
+    
+    // NOTE Start back here!!!!!!!!!!!!
+    ctr=0;
+    cmdLinePara[ctr++] = getCmdLineDataStruct("type", &setType, OPTARG, typeArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("profile", &setProfile, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("sequences", &setSequences, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("matrix", &setMatrix, FILARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("dnamatrix", &setDNAMatrix, FILARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("negative", &setNegative, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("noweights", &setNoWeights, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("gapopen", &setGapOpen, FLTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("gapext", &setGapExtend, FLTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("endgaps", &setUseEndGaps, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("nopgap", &setNoPGap, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("nohgap", &setNoHGap, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("novgap", &setNoVGap, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("hgapresidues", &setHGapRes, STRARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("maxdiv", &setMaxDiv, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("gapdist", &setGapDist, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("pwmatrix", &setPWMatrix, FILARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("pwdnamatrix", &setPWDNAMatrix, FILARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("pwgapopen", &setPWGapOpen, FLTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("pwgapext", &setPWGapExtend, FLTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("ktuple", &setKtuple, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("window", &setWindow, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("pairgap", &setPairGap, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("topdiags", &setTopDiags, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("score", &setScore, OPTARG, scoreArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("transweight", &setTransWeight, FLTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("seed", &setSeed, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("kimura", &setKimura, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("tossgaps", &setTossGaps, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("bootlabels", &setBootLabels, OPTARG,
+                                             bootLabelsArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("debug", &setDebug, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("output", &setOutput, OPTARG, outputArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("outputtree", &setOutputTree, OPTARG,
+                                             outputTreeArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("outfile", &setOutfile, FILARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("outorder", &setOutOrder, OPTARG, outOrderArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("case", &setCase, OPTARG, caseArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("seqnos", &setSeqNo, OPTARG, seqNoArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("seqno_range", &setSeqNoRange, OPTARG,
+                                             seqNoRangeArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("range", &setRange, STRARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("nosecstr1", &setSecStruct1, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("nosecstr2", &setSecStruct2, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("secstrout", &setSecStructOutput, OPTARG,
+                                             outputSecStrArg);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("helixgap", &setHelixGap, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("strandgap", &setStrandGap, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("loopgap", &setLoopGap, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("terminalgap", &setTerminalGap, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("helixendin", &setHelixEndIn, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("helixendout", &setHelixEndOut, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("strandendin", &setStrandEndIn, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("strandendout",&setStrandEndOut, INTARG, NULL);
+    // NOTE these one was added to test the new LE scoring and iterations
+    cmdLinePara[ctr++] = getCmdLineDataStruct("numiter",&setNumIterations, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("clustering", &setTreeAlgorithm, OPTARG,
+                                           clusterAlgorithm);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("maxseqlen", &setMaxSeqLen, INTARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("stats", &setStatsFile, FILARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("pim", &setOutputPim, NOARG, NULL);
+    cmdLinePara[ctr++] = getCmdLineDataStruct("", NULL, -1, NULL);
+    // FIXME: final ctr index is hardcoded in CommandLineParser
+    
+    parseParams(args, xmenus);
+}
+
+CommandLineParser::~CommandLineParser()
+{
+    // Free up menory used here!
+    // NOTE any dynamically allocated memory (new) must be deleted.
+    delete clustalObj;
+    delete typeArg;
+    delete bootLabelsArg;
+    delete outOrderArg;
+    delete caseArg;
+    delete seqNoArg;
+    delete seqNoRangeArg;
+    delete scoreArg;
+    delete outputArg;
+    delete outputTreeArg;
+    delete outputSecStrArg;
+    delete cmdLineType;        
+    delete params;
+    delete paramArg;   
+    delete clusterAlgorithm;
+    delete iterationArg;
+}
+
+void CommandLineParser::parseParams(StringArray* args, bool xmenus)
+{
+    #if DEBUGFULL 
+        if(logObject && DEBUGLOG)
+        {
+            logObject->logMsg("Parsing Command line Parameters!\n");
+        }
+    #endif
+        
+    int i, j, temp;
+    //int len;
+    //static int cl_error_code = 0;
+    //char path[FILENAMELEN];
+    int numparams = 0;
+
+    bool doAlign, doConvert, doAlignUseOldTree, doGuideTreeOnly, doTreeFromAlign, 
+         doBootstrap, doProfileAlign, doSomething;
+
+    if (!xmenus && userParameters->getDisplayInfo())
+    {
+        cout <<  std::endl << std::endl << std::endl;
+        cout << " CLUSTAL " << userParameters->getRevisionLevel() 
+             << " Multiple Sequence Alignments" << std::endl << std::endl << std::endl;
+    }
+
+    doAlign = doConvert = doAlignUseOldTree = doGuideTreeOnly = doTreeFromAlign = false;
+    doBootstrap = doProfileAlign = doSomething = false; 
+    
+    numparams = checkParam(args, params, paramArg);
+    
+    if (numparams < 0) 
+    {
+        exit(1);
+    }
+
+//**********************************************************************
+//*** Note: This part of the code is to print out the options with  ****
+//*** their expected value types/ranges                             ****
+//**********************************************************************
+    
+    if(setHelp != -1) 
+    {
+        userParameters->setHelpFlag(true);
+        if (xmenus) {
+            // gui will display help
+            // but parse rest of args anyway and don't return
+        } else {
+            clustalObj->getHelp('9');
+            exit(1);
+        }
+    }
+
+    if(setFullHelp != -1) 
+    {
+        userParameters->setFullHelpFlag(true);
+        if (xmenus) {
+            // gui will handle this
+            // but parse rest of args anyway and don't return
+        } else {
+            clustalObj->getFullHelp();
+            exit(1);
+        }
+    }
+
+    if(setQuiet != -1) 
+    {
+        userParameters->setDisplayInfo(false);
+        utilityObject->beQuiet(true);
+    } else {
+        userParameters->setDisplayInfo(true);
+        utilityObject->beQuiet(false);
+    }
+
+        
+    // need to check maxseqlen before reading input file
+    if (setMaxSeqLen != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting max allowed sequence length.");
+            }    
+        #endif      
+        temp = 0;
+        if((*paramArg)[setMaxSeqLen].length() > 0)
+        {
+            if (sscanf((*paramArg)[setMaxSeqLen].c_str(),"%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("maxseqlen", "integer");
+            }
+        }
+        if(temp > 0)
+        {
+            userParameters->setMaxAllowedSeqLength(temp);
+        }
+        else
+        {
+            cerr << "Cannot use a negative value for maximum sequence length. Using default"  << std::endl;
+        }
+        
+    }
+
+    if (setStatsFile != -1)
+    {
+        if((*paramArg)[setStatsFile].length() > 0) 
+        {
+            statsObject->setEnabled(true);
+            statsObject->setStatsFile((*paramArg)[setStatsFile]);
+        }
+    }
+
+
+    if (setOutputPim != -1)
+    {
+            userParameters->setOutputPim(true);
+    }
+
+
+    /*if(setDoIteration != -1)
+    {
+        userParameters->setDoRemoveFirstIteration(true);
+    }*/
+    
+    if(setDoIteration != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting iteration parameter.");
+            }
+        #endif
+        if((*paramArg)[setDoIteration].length() > 0) 
+        { 
+            temp = findMatch((*paramArg)[setDoIteration], iterationArg, 3);
+            if(temp == 0)
+            {
+                userParameters->setDoRemoveFirstIteration(TREE);
+            }
+            else if(temp == 1)
+            {
+                userParameters->setDoRemoveFirstIteration(ALIGNMENT);
+            }
+            else if(temp == 2)
+            {               
+                userParameters->setDoRemoveFirstIteration(NONE);
+            }
+            else
+            {
+                cerr << "Unknown option for iteration. Setting to NONE"  << std::endl;
+                userParameters->setDoRemoveFirstIteration(NONE);
+            }
+        }
+    }    
+    if(setOptions != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("Displaying options!\n");
+            }
+        #endif
+                
+        cout << "clustalw option list:-" << std::endl;
+        
+        for (i = 0; cmdLineVerb[i].str[0] != '\0'; i++) 
+        {
+            cout << "\t\t" << default_commandsep << cmdLineVerb[i].str 
+                 << (*cmdLineType)[cmdLineVerb[i].type];
+
+            if (cmdLineVerb[i].type == OPTARG) 
+            {
+                if (cmdLineVerb[i].arg !=  NULL)
+                {     
+                    cout << "=" << cmdLineVerb[i].arg->at(0);
+                    for(j = 1; j < (int)cmdLineVerb[i].arg->size() - 1; j++)
+                    {
+                        cout << " OR " << cmdLineVerb[i].arg->at(j);
+                    }
+                }
+            }
+            cout << std::endl;
+        }
+        for (i = 0; cmdLineFile[i].str[0] != '\0'; i++) 
+        {
+            cout<<"\t\t" << default_commandsep << cmdLineFile[i].str 
+                << (*cmdLineType)[cmdLineFile[i].type];
+                
+            if (cmdLineFile[i].type == OPTARG) 
+            {
+                if (cmdLineFile[i].arg !=  NULL)
+                {
+                    
+                    cout << "=" << cmdLineFile[i].arg->at(0);
+                    for(j = 1; j < (int)cmdLineFile[i].arg->size() - 1; j++)
+                    {
+                        cout << " OR " << cmdLineFile[i].arg->at(j);
+                    }
+                }
+            }
+            cout << std::endl;
+        }
+        for (i = 0; cmdLinePara[i].str[0] != '\0'; i++) 
+        {
+            cout <<"\t\t" << default_commandsep << cmdLinePara[i].str 
+                 << (*cmdLineType)[cmdLinePara[i].type];
+     
+            if (cmdLinePara[i].type == OPTARG) 
+            {
+                if (cmdLinePara[i].arg !=  NULL)
+                {
+                    
+                    cout << "=" << cmdLinePara[i].arg->at(0);
+                    for(j = 1; j < (int)cmdLinePara[i].arg->size() - 1; j++)
+                    {
+                        cout << " OR " << cmdLinePara[i].arg->at(j);
+                    }
+                }
+            }
+            cout << std::endl;
+        }
+        exit(1);
+    }
+
+
+//*****************************************************************************
+//  Check to see if sequence type is explicitely stated..override ************
+// the automatic checking (DNA or Protein).   /type=d or /type=p *************
+//****************************************************************************
+
+    if(setType != -1)
+    {
+        string msg;
+        if(((*paramArg)[setType].length()) > 0) 
+        {
+            temp = findMatch((*paramArg)[setType], typeArg, 2);
+            if(temp == 0) 
+            { 
+                userParameters->setDNAFlag(false);
+                userParameters->setExplicitDNAFlag(true);
+                msg = "Sequence type explicitly set to Protein";
+                cout << msg << std::endl;
+            }
+            else if(temp == 1) 
+            {
+                msg = "Sequence type explicitly set to DNA";
+                cout << msg << std::endl;
+                userParameters->setDNAFlag(true);
+                userParameters->setExplicitDNAFlag(true);
+            }
+            else
+            {
+                msg = "Unknown sequence type " + (*paramArg)[setType];
+                cerr << std::endl << msg << endl;
+            }
+            #if DEBUGFULL 
+                if(logObject && DEBUGLOG)
+                {
+                    logObject->logMsg(msg);
+                }
+            #endif            
+        }
+    }
+
+
+//***************************************************************************
+//   check to see if 1st parameter does not start with '/' i.e. look for an *
+//   input file as first parameter.   The input file can also be specified  *
+//   by /infile=fname.                                                      *
+//***************************************************************************
+// JULIE - moved to checkParam()
+  //  if(paramstr[0] != '/') 
+  //  {
+  //      strcpy(seqName, params[0]);
+  //  }
+
+
+//*************************************************
+//  Look for /infile=file.ext on the command line *
+//*************************************************
+
+    if(setInfile != -1) 
+    {
+        if((*paramArg)[setInfile].length() <= 0) 
+        {
+            exitWithErrorMsg("Bad sequence file name");
+        }
+        userParameters->setSeqName((*paramArg)[setInfile]);
+
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                string msg = "Sequence file name (seqName) has been set to ";
+                msg += userParameters->getSeqName();             
+                logObject->logMsg(msg);
+            }
+        #endif        
+    }
+    
+    // NOTE keep an eye on this part to see if it works.
+    if(userParameters->getSeqName() != "") 
+    {
+        // NOTE I will need to cheack if it has been successful before setting
+        // doSomething to true.
+        int code;
+        code = clustalObj->commandLineReadSeq(1);
+        if(code == OK)
+        {
+            doSomething = true;
+        }
+        else
+        {
+            doSomething = false;
+            exit(1);
+        }
+    }
+
+    // NOTE call the other function to set the parameter values!!
+    setOptionalParam();
+
+//*********************************************************
+// Look for /profile1=file.ext  AND  /profile2=file2.ext *
+// You must give both file names OR neither.             *
+//********************************************************
+
+
+    if(setProfile1 != -1) 
+    {
+        if((*paramArg)[setProfile1].length() <= 0) 
+        {
+            exitWithErrorMsg("Bad profile 1 file name");
+        }
+                
+        clustalObj->profile1Input((*paramArg)[setProfile1]);
+    }
+
+    if(setProfile2 != -1) 
+    {
+        if((*paramArg)[setProfile2].length() <= 0) 
+        {
+            exitWithErrorMsg("Bad profile 2 file name");
+        }
+        if(userParameters->getProfile1Empty()) 
+        {
+            exitWithErrorMsg("Only 1 profile file (profile 2) specified.");
+        }
+        
+        clustalObj->profile2Input((*paramArg)[setProfile2]);
+        doSomething = doProfileAlign = true; 
+    }
+
+//************************************************************************
+// Look for /tree or /bootstrap or /align or /usetree ******************
+//************************************************************************
+
+    if (setBatch != -1)
+    {
+        userParameters->setInteractive(false);
+    }
+
+    if (setInteractive != -1)
+    {
+        userParameters->setInteractive(true);
+        if (setQuiet!=-1) {
+            cout << "interactive menu: overriding " << default_commandsep << "quiet" << std::endl;
+            userParameters->setDisplayInfo(true);
+            utilityObject->beQuiet(false);
+        }
+    }
+
+    if (userParameters->getInteractive()) 
+    {
+        setTree = -1;
+        setBootstrap = -1;
+        setAlign = -1;
+        setUseTree = -1;
+        setUseTree1 = -1;
+        setUseTree2 = -1;
+        setNewTree = -1;
+        setConvert = -1;
+    }
+
+    if(setTree != -1 )
+    {
+        if(userParameters->getEmpty()) 
+        {
+            exitWithErrorMsg("Cannot draw tree.  No input alignment file");
+        }
+        else
+        { 
+            doTreeFromAlign = true;
+        }
+    }
+
+    if(setBootstrap != -1)
+    {
+        if(userParameters->getEmpty()) 
+        {
+            exitWithErrorMsg("Cannot bootstrap tree. No input alignment file");
+        }
+        else 
+        {
+            temp = 0;
+            // Check if there is anything in the string!
+            if((*paramArg)[setBootstrap].length() > 0)
+            {
+                if (sscanf((*paramArg)[setBootstrap].c_str(), "%d", &temp) != 1) 
+                {
+                    reportBadOptionAndExit("bootstrap", "integer");
+                }
+            }
+            if(temp > 0)
+            {    
+                userParameters->setBootNumTrials(temp);
+            }
+            doBootstrap = true;
+        }
+    }
+
+    if(setAlign != -1)
+    {
+        if(userParameters->getEmpty()) 
+        {
+            exitWithErrorMsg("Cannot align sequences.  No input file");
+        }
+        else
+        { 
+            doAlign = true;
+        }
+    }
+
+    if(setConvert != -1)
+    {
+        if(userParameters->getEmpty()) 
+        {
+            exitWithErrorMsg("Cannot convert sequences.  No input file");
+        }
+        else
+        { 
+            doConvert = true;
+        }
+    }
+    if(setUseTree != -1)
+    {
+        if(userParameters->getEmpty()) 
+        {
+            exitWithErrorMsg("Cannot align sequences.  No input file");
+        }
+        else  
+        {
+           if((*paramArg)[setUseTree].length() == 0) 
+           {
+               exitWithErrorMsg("Cannot align sequences.  No tree file specified");
+           }
+           else 
+           {
+               phylipTreeName = (*paramArg)[setUseTree];
+           }
+           userParameters->setUseTreeFile(true);
+           doAlignUseOldTree = true;
+        }
+    }
+
+    if(setNewTree != -1)
+    {
+        if(userParameters->getEmpty()) 
+        {
+            exitWithErrorMsg("Cannot align sequences.  No input file");
+        }
+        else  
+        {
+            if((*paramArg)[setNewTree].length() == 0) 
+            {
+                exitWithErrorMsg("Cannot align sequences.  No tree file specified");
+            }
+            else 
+            {
+                phylipTreeName = (*paramArg)[setNewTree];
+            }
+            userParameters->setNewTreeFile(true);
+            doGuideTreeOnly = true;
+        }
+    }
+    if(setUseTree1 != -1)
+    {
+        if(userParameters->getProfile1Empty()) 
+        {
+            exitWithErrorMsg("Cannot align profiles.  No input file");
+        }
+        else if(profileType == SEQUENCE) 
+        {
+            reportInvalidOptionAndExit("usetree1");
+        }
+        else  
+        {
+            if((*paramArg)[setUseTree1].length() == 0) 
+            {
+                exitWithErrorMsg("Cannot align profiles.  No tree file specified");
+            }
+            else 
+            {
+                p1TreeName = (*paramArg)[setUseTree1];
+            }
+            userParameters->setUseTree1File(true);
+            doAlignUseOldTree = true;
+        }
+    }
+
+    if(setNewTree1 != -1)
+    {
+        if(userParameters->getProfile1Empty()) 
+        {
+            exitWithErrorMsg("Cannot align profiles.  No input file");
+        }
+        else if(profileType == SEQUENCE) 
+        {
+            reportInvalidOptionAndExit("newtree1");
+        }
+        else  
+        {
+           if((*paramArg)[setNewTree1].length() == 0) 
+           {
+               exitWithErrorMsg("Cannot align profiles. No tree file specified");
+           }
+           else 
+           {
+                p1TreeName = (*paramArg)[setNewTree1];
+           }
+           userParameters->setNewTree1File(true);
+        }
+    }
+    if(setUseTree2 != -1)
+    {
+        if(userParameters->getProfile2Empty()) 
+        {
+            exitWithErrorMsg("Cannot align profiles.  No input file");
+        }
+        else if(profileType == SEQUENCE) 
+        {
+            reportInvalidOptionAndExit("usetree2");
+        }
+        else  
+        {
+            if((*paramArg)[setUseTree2].length() == 0) 
+            {
+                exitWithErrorMsg("Cannot align profiles.  No tree file specified");
+            }
+            else 
+            {
+                p2TreeName = (*paramArg)[setUseTree2];
+            }
+            userParameters->setUseTree2File(true);
+            doAlignUseOldTree = true;
+        }
+    }
+
+    if(setNewTree2 != -1)
+    {
+        if(userParameters->getProfile2Empty()) 
+        {
+            exitWithErrorMsg("Cannot align profiles.  No input file");
+        }
+        else if(profileType == SEQUENCE) 
+        {
+            reportInvalidOptionAndExit("newtree2");
+        }
+        else  
+        {
+            if((*paramArg)[setNewTree2].length() == 0) 
+            {
+                exitWithErrorMsg("Cannot align profiles.  No tree file specified");
+            }
+            else 
+            {
+                p2TreeName = (*paramArg)[setNewTree2];
+            }
+            userParameters->setNewTree2File(true);
+        }
+    }
+
+
+    if( (!doTreeFromAlign) && (!doBootstrap) && (!userParameters->getEmpty()) && (!doProfileAlign) && 
+      (!doAlignUseOldTree) && (!doGuideTreeOnly) && (!doConvert))
+    { 
+        doAlign = true;
+    }
+
+//** ? /quicktree 
+    if(setQuickTree != -1)
+    {
+        userParameters->setQuickPairAlign(true);
+    }
+
+    // NOTE 
+    if(userParameters->getDNAFlag()) 
+    {
+        userParameters->setDNAParams();
+    }
+    else 
+    {
+        userParameters->setProtParams();
+    }
+    
+    if(userParameters->getInteractive()) 
+    {
+        if (!xmenus)
+        { 
+            userParameters->setMenuFlag(true);
+        }
+        return;
+    }
+
+
+    if(!doSomething) 
+    {
+        exitWithErrorMsg("No input file(s) specified");
+    }
+
+
+    
+
+//***************************************************************************
+// Now do whatever has been requested ***************************************
+//***************************************************************************
+// NOTE This part is obviously not done yet! Functions not working in Clustal!!!!
+    #if DEBUGFULL 
+        if(logObject && DEBUGLOG)
+        {
+            logObject->logMsg("Now doing the requested task(s)");
+        }
+    #endif
+        
+    if(doProfileAlign) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Doing profile align");
+            }
+        #endif        
+        if (profileType == PROFILE)
+        {
+            #if DEBUGFULL 
+                if(logObject && DEBUGLOG)
+                {
+                    logObject->logMsg("        Calling Profile_align in clustal obj!");
+                }
+            #endif            
+            clustalObj->profileAlign(&p1TreeName, &p2TreeName);
+        }
+        else
+        {
+            #if DEBUGFULL 
+                if(logObject && DEBUGLOG)
+                {
+                logObject->logMsg("        Calling sequencesAlignToProfile in clustal obj!");
+                }
+            #endif
+            clustalObj->sequencesAlignToProfile(&phylipTreeName);
+        }
+    }
+
+    else if(doAlign)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Doing Alignment");
+            }
+        #endif               
+        clustalObj->align(&phylipTreeName);
+    }
+
+    else if(doConvert) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Doing filetype conversion");
+            }
+        #endif                  
+        clustalObj->outputNow();
+    }
+
+    else if (doAlignUseOldTree)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Doing Alignment only");
+            }
+        #endif                 
+        clustalObj->doAlignUseOldTree(&phylipTreeName);
+    }
+
+    else if(doGuideTreeOnly)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Doing tree only");
+            }
+        #endif               
+        clustalObj->doGuideTreeOnly(&phylipTreeName);
+    }
+
+    else if(doTreeFromAlign)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {   
+                logObject->logMsg("    Doing tree");
+            }
+        #endif                  
+        clustalObj->phylogeneticTree(&phylipTreeName, &clustalTreeName, &distTreeName,
+                                     &nexusTreeName, pimName);
+    }
+
+    else if(doBootstrap)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Doing Bootstrap");
+            }
+        #endif            
+            clustalObj->bootstrapTree(&phylipTreeName, &clustalTreeName, &nexusTreeName);
+    }
+
+    cout << std::endl;
+    
+}
+
+
+
+int CommandLineParser::checkParam(StringArray* args, StringArray* params,
+                                  StringArray* paramArg)
+{
+    int len, i, j, nameFirst, num;
+    //int k;
+    vector<int> match;
+    match.resize(MAXARGS);
+    bool name1 = false;
+    
+    #if DEBUGFULL 
+        if(logObject && DEBUGLOG)
+        {
+            logObject->logMsg("Checking Parameters!");
+        }
+    #endif
+        
+    if(args->size() == 0) // NOTE I think this will work better!
+    {
+        cout << "The argument list is empty\n";
+        return 0;
+    }
+
+    // AW: first arg is an input file if it doesnt start with commandsep
+    if (VALID_COMMAND_SEP.find((*args)[0][0], 0) == string::npos)
+    {
+        name1 = true;
+        params->push_back((*args)[0]); // Put the string at the back of this vector.
+        paramArg->push_back(""); // Push a blank string onto the first element.
+    }
+    else // It is not a file name
+    {
+        params->push_back((*args)[0].substr(1));
+    }
+    
+    for (i = 1; i < (int)args->size(); i++) 
+    {
+        params->push_back(""); // Empty string!
+
+        for(j = 0; j < (int)(*args)[i].length() - 1; j++)
+        {
+            if(isprint((*args)[i][j + 1])) // Character printable?
+            {
+                // We start at j + 1 because each option should begin with commandsep
+                (*params)[i].append((*args)[i].substr(j + 1, 1));
+            }
+        }
+    }
+    num = i;
+
+
+    // AW:
+    // params are now setup
+    // extract paramArgs in next step
+
+    
+    if ((int)args->size() > MAXARGS)
+    {
+        cerr << "Error: too many command line arguments\n";
+        return(-1);
+    }
+    /*
+      special case - first parameter is input fileName
+    */
+    nameFirst = 0;
+    if(name1 == true) // If name of file is first argument
+    {
+        userParameters->setSeqName((*params)[0]);
+        /* Andreas Wilm (UCD) 2008-03-19:
+           conversion nowadays unnecessary and makes trouble
+           
+           /@  JULIE
+           convert to lower case now
+           @/
+           #ifndef UNIX
+           if(logObject && DEBUGLOG)
+           {
+           logObject->logMsg("Converting seqName to lower case.\n");
+           }         
+           string temp = ConvertStringToLower(userParameters->getSeqName());
+           userParameters->setSeqName(temp);
+           #endif
+        */
+        nameFirst = 1;
+    }
+  
+    // NOTE if name first we should start at the 2nd element in paramArg
+    // This loop is used to set up the paramArg vector!
+    for (i = nameFirst; i < num; i++) 
+    {
+        bool has_arg=false;
+        paramArg->push_back(""); // Push a new empty string on.
+        len = (*params)[i].length();
+        for(j = 0; j < len; j++)
+        {
+            if((*params)[i][j] == '=') 
+            {
+                has_arg=true;
+                (*paramArg)[i].assign((*params)[i].substr(j + 1, len - j -1));               
+                // Trim off the bit from the '=' to the end, and put all in lower case!
+                (*params)[i].assign(ConvertStringToLower((*params)[i].substr(0, j)));
+                break;
+            }
+        }
+        // Andreas Wilm (UCD): 2008-03-19:
+        // this convert nonarg params to lowercase (-QuIcKtReE etc)
+        if (!has_arg) {
+            (*params)[i].assign(ConvertStringToLower((*params)[i]));          
+        }
+    }
+
+    if(paramArg->size() != params->size())
+    {
+        cerr << "There is something wrong with arguments. Lengths different\n";
+        return -1;
+    }
+    
+    /*
+      for each parameter given on the command line, first search the list of recognised
+      optional parameters....
+    */
+    for (i = 0; i < num; i++) 
+    {
+        if ((i == 0) && (name1 == true))
+        { 
+            continue;
+        }
+        j = 0;
+        match[i] = -1;
+        for(;;) 
+        {
+            if (cmdLinePara[j].str[0] == '\0')
+            { 
+                // Think this means we have not found it!
+                break;
+            }
+            if (!(*params)[i].compare(cmdLinePara[j].str))
+            {
+                match[i] = j; // Match has been found!
+                *cmdLinePara[match[i]].flag = i;
+                
+                if ((cmdLinePara[match[i]].type != NOARG) && ((*paramArg)[i] == "")) 
+                {
+                    cerr <<  "Error: parameter required for " << default_commandsep << (*params)[i] << endl;
+                    return -1;
+                
+                /* Andreas Wilm (UCD) 2008-03-19:
+                 *  conversion nowadays unnecessary and breaks things
+                 *  
+                 * //  JULIE
+                 * //    convert parameters to lower case now, unless the parameter is a fileName
+                 * #ifdef UNIX
+                 * else if (cmdLinePara[match[i]].type != FILARG && (*paramArg)[i] != "")
+                 * #endif
+                */
+
+                } else if (cmdLinePara[match[i]].type != FILARG && (*paramArg)[i] != "") {
+                    if ((*paramArg)[i] != "") 
+                    {
+                        // lowercase arg if not a filename to support mixed case
+                        (*paramArg)[i].assign(ConvertStringToLower((*paramArg)[i]));
+                    }
+                }
+                break;
+            }
+            j++;
+        }
+    }
+    
+    /*
+      ....then the list of recognised input files,.... 
+    */
+    for (i = 0; i < num; i++) 
+    {
+        if ((i == 0) && (name1 == true)) 
+        {
+            continue;
+        }
+        if (match[i] != -1) 
+        {
+            continue;
+        }
+        j = 0;
+        for(;;) 
+        {
+            if (cmdLineFile[j].str[0] == '\0') 
+            {
+                // Have not found a match!
+                break;
+            }
+            if (!(*params)[i].compare(cmdLineFile[j].str)) 
+            {
+                match[i] = j;
+                *cmdLineFile[match[i]].flag = i;
+                if ((cmdLineFile[match[i]].type != NOARG) &&
+                                    ((*paramArg)[i] == "")) 
+                {
+                    cerr << "Error: parameter required for " << default_commandsep << (*params)[i] << endl;
+                    return -1;
+                }
+                break;
+            }
+            j++;
+        }
+    }
+    
+    /*
+      ....and finally the recognised verbs. 
+    */
+    for (i = 0; i < num; i++) 
+    {
+        if ((i == 0) && (name1 == true)) 
+        {
+            continue;
+        }
+        if (match[i] != -1) 
+        {
+            continue;
+        }
+        j = 0;
+        for(;;) 
+        {
+            if (cmdLineVerb[j].str[0] == '\0') 
+            {
+                // Havent found it!
+                break;
+            }
+            if (!(*params)[i].compare(cmdLineVerb[j].str)) 
+            {
+                match[i] = j;
+                *cmdLineVerb[match[i]].flag = i;
+                if ((cmdLineVerb[match[i]].type != NOARG) && ((*paramArg)[i] == "")) 
+                {
+                    cerr << "Error: parameter required for " << default_commandsep << (*params)[i] << endl;
+                    return -1;
+                }
+                break;
+            }
+            j++;
+        }
+    }
+
+    /*
+      check for any unrecognised parameters.
+    */
+    for (i = 0; i < num; i++) 
+    {
+        if (match[i] == -1) 
+        {
+            cerr << "Error: unknown option " << default_commandsep << (*params)[i] << endl;
+            return -1;
+        }
+    }
+    return(num);
+}
+
+void CommandLineParser::setOptionalParam()
+{
+    int temp;
+    int _ktup, _windgap, _signif, _window = 0;
+    string _matrixname;
+    //int c, i;
+    float ftemp;
+    //char tstr[100];
+
+    #if DEBUGFULL 
+        if(logObject && DEBUGLOG)
+        {
+            logObject->logMsg("Setting optional parameters.");
+        }
+    #endif      
+    //****************************************************************************
+    //* look for parameters on command line  e.g. gap penalties, k-tuple etc.    *
+    //****************************************************************************
+  
+    // Mark change 16-2-2007. 
+    
+    if(setNumIterations != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting num iterations parameter.");
+            }    
+        #endif      
+        temp = 0;
+        if((*paramArg)[setNumIterations].length() > 0)
+        {
+            if (sscanf((*paramArg)[setNumIterations].c_str(),"%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("numiter", "int");
+                temp = 0;
+            }
+        }
+        if(temp > 0)
+        {
+            userParameters->setNumIterations(temp);
+        }
+        else
+        {
+            exitWithErrorMsg("Cannot use a negative value for number of iterations.");
+        }
+    }
+
+    
+    //** ? /score=percent or /score=absolute *
+    if(setScore != -1)
+    {    
+        if((*paramArg)[setScore].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setScore], scoreArg, 2);
+            if(temp == 0)
+            {
+                userParameters->setPercent(true);
+                #if DEBUGFULL 
+                    if(logObject && DEBUGLOG)
+                    {
+                        logObject->logMsg("    Setting score parameter = percent");
+                    }
+                #endif                 
+            }
+            else if(temp == 1)
+            {
+                userParameters->setPercent(false);
+                #if DEBUGFULL 
+                    if(logObject && DEBUGLOG)
+                    {
+                        logObject->logMsg("    Setting score parameter = absolute");
+                    }
+                #endif                 
+            }
+            else
+            {
+                cerr << "\nUnknown SCORE type: " << (*paramArg)[setScore] << endl;
+                #if DEBUGFULL 
+                    if(logObject && DEBUGLOG)
+                    {
+                        logObject->logMsg("    problem setting score type!!!!!");
+                    }
+                #endif                
+            }
+        }
+    }
+    // NOTE I decided to stay with sscanf for getting the int. Options in c++ no better.
+    //** ? /seed=n *
+    if(setSeed != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting seed parameter.");
+            }    
+        #endif      
+        temp = 0;
+        if((*paramArg)[setSeed].length() > 0)
+        {
+            if (sscanf((*paramArg)[setSeed].c_str(),"%d",&temp) != 1) 
+            {
+                reportBadOptionAndExit("seed", "integer");
+            }
+        }
+        if(temp > 0)
+        {
+            userParameters->setBootRanSeed(temp);
+        }
+        cout<< "\ntemp = " << temp << "; seed = " << userParameters->getBootRanSeed() 
+            << ";\n";
+    }
+  
+    if(setTreeAlgorithm != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting clustering algorithm parameter.");
+            }
+        #endif
+        if((*paramArg)[setTreeAlgorithm].length() > 0) 
+        { 
+            temp = findMatch((*paramArg)[setTreeAlgorithm], clusterAlgorithm, 2);
+            if(temp == 0)
+            {
+                userParameters->setClusterAlgorithm(NJ);
+            }
+            else if(temp == 1)
+            {
+                userParameters->setClusterAlgorithm(UPGMA);
+            }
+            else
+            {
+                cerr << "Unknown option for clustering algorithm. Using default\n";
+                userParameters->setClusterAlgorithm(NJ);
+            }
+        }
+    }
+    
+    
+    //** ? /output=PIR, GCG, GDE or PHYLIP *
+    if(setOutput != -1)
+    {
+        
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting output parameter.");
+            }
+        #endif          
+        if((*paramArg)[setOutput].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setOutput], outputArg, 6);
+            if (temp >= 0 && temp <= 5) 
+            {
+                userParameters->setOutputClustal(false);
+                userParameters->setOutputGCG(false);
+                userParameters->setOutputPhylip(false);
+                userParameters->setOutputNbrf(false);
+                userParameters->setOutputGde(false);
+                userParameters->setOutputNexus(false);
+                userParameters->setOutputFasta(false);
+            }
+            switch (temp) 
+            {
+                case 0: // GCG 
+                    userParameters->setOutputGCG(true);
+                    break;
+                case 1: // GDE 
+                    userParameters->setOutputGde(true);
+                    break;
+                case 2: // PIR 
+                    userParameters->setOutputNbrf(true);
+                    break;
+                case 3: // PHYLIP
+                    userParameters->setOutputPhylip(true);
+                    break;
+                case 4: // NEXUS
+                    userParameters->setOutputNexus(true);
+                    break;
+                case 5: // NEXUS
+                    userParameters->setOutputFasta(true);
+                    break;
+                default:
+                    // FIXME AW: 1.83 behaves the same, but shouldnt
+                    // we exit here?
+                    exitWithErrorMsg("Unknown OUTPUT type: " + (*paramArg)[setOutput]);
+            }
+        }
+    }
+    //** ? /outputtree=NJ or PHYLIP or DIST or NEXUS 
+    if(setOutputTree != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting outputtree parameter.");
+            }   
+        #endif           
+        if((*paramArg)[setOutputTree].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setOutputTree], outputTreeArg, 4);
+            switch (temp) 
+            {
+                case 0: // NJ 
+                    userParameters->setOutputTreeClustal(true);
+                    break;
+                case 1: // PHYLIP
+                    userParameters->setOutputTreePhylip(true);
+                    break;
+                case 2: // DIST
+                    userParameters->setOutputTreeDistances(true);
+                    break;
+                case 3: // NEXUS 
+                    userParameters->setOutputTreeNexus(true);
+                    break;
+                default:
+                    cerr << "\nUnknown OUTPUT TREE type: " 
+                         << (*paramArg)[setOutputTree] << endl;
+            }
+        }
+    }
+    
+    //** ? /profile (sets type of second input file to profile) 
+    if(setProfile != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting profileType = PROFILE.");
+            }         
+        #endif 
+        profileType = PROFILE;
+    }
+  
+    //** ? /sequences (sets type of second input file to list of sequences)
+    if(setSequences != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting profileType = SEQUENCE.");
+            }         
+        #endif
+        profileType = SEQUENCE;
+    } 
+  
+  
+    //** ? /ktuple=n
+    if(setKtuple != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting ktup parameter.");
+            }
+        #endif         
+        _ktup = 0;
+        if((*paramArg)[setKtuple].length() > 0)
+        {
+            if (sscanf((*paramArg)[setKtuple].c_str(),"%d",&_ktup)!=1) 
+            {
+                reportBadOptionAndExit("ktuple", "integer");
+                _ktup = 0;
+            }
+        }
+        
+        if(_ktup > 0) 
+        {
+            if(userParameters->getDNAFlag()) 
+            {
+                if(_ktup <= 4) 
+                {
+                    userParameters->setKtup(_ktup);
+                    userParameters->setDNAKtup(_ktup);
+                    userParameters->setWindowGap(_ktup + 4);
+                    userParameters->setDNAWindowGap(_ktup + 4);
+                } else {
+                    // see comment in bug 185
+                    cerr << "WARNING: Ignoring invalid ktuple of " << _ktup <<  " (must be <=4)" << std::endl;
+                }
+            }
+            else 
+            {
+                if(_ktup <= 2) 
+                {
+                    userParameters->setKtup(_ktup);
+                    userParameters->setAAKtup(_ktup);
+                    userParameters->setWindowGap(_ktup + 3);
+                    userParameters->setAAWindowGap(_ktup + 3);
+                    // AW: why set setDNAWindowGap? we are in AA mode
+                    // userParameters->setDNAWindowGap(_ktup + 4);
+                } else {
+                    // see comment in bug 185
+                   cerr << "WARNING: Ignoring invalid ktuple of " << _ktup << " (must be <=2)" << std::endl;
+                }
+            }
+        }
+    }
+    
+    //** ? /pairgap=n 
+    if(setPairGap != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting pairgap parameter.");
+            }
+        #endif         
+        _windgap = 0;
+        if((*paramArg)[setPairGap].length() > 0)
+        {
+            if (sscanf((*paramArg)[setPairGap].c_str(),"%d",&_windgap)!=1) 
+            {
+                reportBadOptionAndExit("pairgap", "integer");
+                _windgap = 0;
+            }
+            if(_windgap > 0)
+            {
+                if(userParameters->getDNAFlag()) 
+                {
+                    if(_windgap > userParameters->getKtup()) 
+                    {
+                        userParameters->setWindowGap(_windgap);
+                        userParameters->setDNAWindowGap(_windgap);
+                    }
+                }
+                else 
+                {
+                    if(_windgap > userParameters->getKtup()) 
+                    {
+                        userParameters->setWindowGap(_windgap);
+                        userParameters->setAAWindowGap(_windgap);
+                    }
+                }
+            }
+        }
+    } 
+  
+    //** ? /topdiags=n  
+    if(setTopDiags != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting topdiags parameter.");
+            }
+        #endif          
+        _signif = 0;
+        if((*paramArg)[setTopDiags].length() > 0)
+        {
+            if (sscanf((*paramArg)[setTopDiags].c_str(),"%d",&_signif)!=1) 
+            {
+                reportBadOptionAndExit("topdiags", "integer");
+            }
+        }
+        if(_signif > 0)
+        {
+            if(userParameters->getDNAFlag()) 
+            {
+                if(_signif > userParameters->getKtup()) 
+                {
+                    userParameters->setSignif(_signif);
+                    userParameters->setDNASignif(_signif);
+                }
+            }
+            else 
+            {
+                if(_signif > userParameters->getKtup()) 
+                {
+                    userParameters->setSignif(_signif);
+                    userParameters->setAASignif(_signif);
+                }
+            }
+        }
+    }
+    
+
+    //** ? /window=n 
+    if(setWindow != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting window parameter.");
+            }
+        #endif        
+        _window = 0;
+        if((*paramArg)[setWindow].length() > 0)
+        {
+            if (sscanf((*paramArg)[setWindow].c_str(),"%d",&_window)!=1) 
+            {
+                reportBadOptionAndExit("window", "integer");
+                _window = 0;
+            }
+        }
+        if(_window > 0)
+        {
+            if(userParameters->getDNAFlag()) 
+            {
+                if(_window > userParameters->getKtup()) 
+                {
+                    userParameters->setWindow(_window);
+                    userParameters->setDNAWindow(_window);
+                }
+            }
+            else 
+            {
+                if(_window > userParameters->getKtup()) 
+                {
+                    userParameters->setWindow(_window);
+                    userParameters->setAAWindow(_window);
+                }
+            }
+        }
+    }
+  
+    //** ? /kimura 
+    if(setKimura != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting kimura=true");
+            }
+        #endif        
+        userParameters->setKimura(true);
+    }
+  
+    //** ? /tossgaps 
+    if(setTossGaps != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting tossgaps=true");
+            }
+        #endif        
+        userParameters->setTossGaps(true);
+    }
+    
+    //** ? /negative  
+    if(setNegative != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting useNegMatrix=true");
+            }         
+        #endif 
+        userParameters->setUseNegMatrix(true);
+    }
+  
+    //** ? /noweights
+    if(setNoWeights!= -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting noweights=true");
+            }       
+        #endif 
+        userParameters->setNoWeights(true);
+    }
+  
+  
+    //** ? /pwmatrix=ID (user's file) 
+    if(setPWMatrix != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting pwmatrix parameter.");
+            }        
+        #endif
+        temp = (*paramArg)[setPWMatrix].length();
+        if(temp > 0) 
+        {
+            _matrixname = ConvertStringToLower((*paramArg)[setPWMatrix]);
+            if (_matrixname.compare("blosum") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 1, Protein, Pairwise);
+            }
+            else if (_matrixname.compare("pam") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 2, Protein, Pairwise);
+            }
+            else if (_matrixname.compare("gonnet") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 3, Protein, Pairwise);
+            }
+            else if (_matrixname.compare("id") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 4, Protein, Pairwise);
+            }
+            else 
+            {
+                char hackTempName[FILENAMELEN + 1];
+                strcpy(hackTempName, (*paramArg)[setPWMatrix].c_str());
+                
+                if(subMatrix->getUserMatFromFile(hackTempName, Protein, Pairwise))
+                {                      
+                    subMatrix->setCurrentNameAndNum((*paramArg)[setPWMatrix], 5, 
+                                                     Protein, Pairwise);
+                    pwUserMatrixName = (*paramArg)[setPWMatrix];
+                }
+                else 
+                    exit(1);
+            }
+        }
+    }
+
+        
+    //** ? /matrix=ID (user's file)
+    if(setMatrix != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting matrix parameter.");
+            }       
+        #endif 
+        temp = (*paramArg)[setMatrix].length();
+        if(temp > 0) 
+        {
+            _matrixname = ConvertStringToLower((*paramArg)[setMatrix]);
+
+            if (_matrixname.compare("blosum")==0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 1, Protein, MultipleAlign);
+            }
+            else if (_matrixname.compare("pam")==0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 2, Protein, MultipleAlign);
+            }
+            else if (_matrixname.compare("gonnet")==0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 3, Protein, MultipleAlign);
+            }
+            else if (_matrixname.compare("id")==0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 4, Protein, MultipleAlign);
+            }
+            else 
+            {
+                char hackTempName[FILENAMELEN + 1];
+                strcpy(hackTempName, (*paramArg)[setMatrix].c_str());
+                                    
+                if(subMatrix->getUserMatSeriesFromFile(hackTempName))
+                {
+                    subMatrix->setCurrentNameAndNum((*paramArg)[setMatrix], 4, 
+                                                     Protein, MultipleAlign);
+                    userMatrixName = (*paramArg)[setMatrix];
+                }
+                else 
+                    exit(1);
+            }
+        }
+    }
+
+    //** ? /pwdnamatrix=ID (user's file)
+    if(setPWDNAMatrix != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting pwdnamatrix parameter.");
+            }       
+        #endif 
+        temp = (*paramArg)[setPWDNAMatrix].length();
+        if(temp > 0) 
+        {
+            _matrixname = ConvertStringToLower((*paramArg)[setPWDNAMatrix]);
+
+            if (_matrixname.compare("iub") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 1, DNA, Pairwise);
+            }
+            else if (_matrixname.compare("clustalw") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 2, DNA, Pairwise);
+            }
+            else 
+            {
+                char hackTempName[FILENAMELEN + 1];
+                strcpy(hackTempName, (*paramArg)[setPWDNAMatrix].c_str());
+                    
+                if(subMatrix->getUserMatFromFile(hackTempName, DNA, Pairwise))
+                {
+                    subMatrix->setCurrentNameAndNum((*paramArg)[setPWDNAMatrix], 3, 
+                                                     Protein, Pairwise);
+                    pwDNAUserMatrixName = (*paramArg)[setPWDNAMatrix];
+                }
+                else 
+                    exit(1);
+            }
+        }
+    }
+
+    //** ? /dnamatrix=ID (user's file)
+    if(setDNAMatrix != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting dnamatrix parameter.");
+            }        
+        #endif 
+        temp = (*paramArg)[setDNAMatrix].length();
+        if(temp > 0) 
+        {
+            _matrixname = ConvertStringToLower((*paramArg)[setDNAMatrix]);
+
+            if (_matrixname.compare("iub") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 1, DNA, MultipleAlign);
+            }
+            else if (_matrixname.compare("clustalw") == 0) 
+            {
+                subMatrix->setCurrentNameAndNum(_matrixname, 2, DNA, MultipleAlign);
+            }
+            else 
+            {
+                char hackTempName[FILENAMELEN + 1];
+                strcpy(hackTempName, (*paramArg)[setDNAMatrix].c_str());
+                    
+                if(subMatrix->getUserMatFromFile(hackTempName, DNA, MultipleAlign))
+                {
+                    subMatrix->setCurrentNameAndNum((*paramArg)[setDNAMatrix], 3, 
+                                                     Protein, MultipleAlign);
+                    DNAUserMatrixName = (*paramArg)[setDNAMatrix];
+                }
+                else 
+                    exit(1);
+            }
+        }
+    }
+       
+    //** ? /maxdiv= n
+    if(setMaxDiv != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting maxdiv parameter.");
+            }       
+        #endif 
+        temp = 0;
+        if((*paramArg)[setMaxDiv].length() > 0)
+        {
+            if (sscanf((*paramArg)[setMaxDiv].c_str(),"%d",&temp)!=1) 
+            {
+                reportBadOptionAndExit("maxdiv", "integer");
+                temp = 0;
+            }
+        }
+        if (temp >= 0)
+        {
+            userParameters->setDivergenceCutoff(temp);
+        }
+    }
+
+    //** ? /gapdist= n
+    if(setGapDist != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting gapdist parameter.");
+            }       
+        #endif
+         
+        temp = 0;
+        if((*paramArg)[setGapDist].length() > 0)
+            if (sscanf((*paramArg)[setGapDist].c_str(),"%d",&temp)!=1) 
+            {
+                reportBadOptionAndExit("gapdist", "integer");
+            }
+        if (temp >= 0)
+        {
+            userParameters->setGapDist(temp);
+        }
+    }
+
+    //** ? /debug= n 
+    if(setDebug != -1) 
+    {
+        temp = 0;
+        if((*paramArg)[setDebug].length() > 0)
+            if (sscanf((*paramArg)[setDebug].c_str(),"%d",&temp)!=1) 
+            {
+                reportBadOptionAndExit("debug", "integer");
+            }
+        if (temp >= 0)
+        {
+            userParameters->setDebug(temp);
+        }
+    }
+
+    //** ? /outfile= (user's file) 
+    if(setOutfile != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting outfile parameter.");
+            }        
+        #endif
+        if((*paramArg)[setOutfile].length() > 0) 
+        {
+            userParameters->setOutfileName((*paramArg)[setOutfile]);
+        }
+    }
+
+    //*** ? /case= lower/upper 
+    if(setCase != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting case parameter.");
+            }       
+        #endif 
+        if((*paramArg)[setCase].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setCase], caseArg, 2);
+            if(temp == 0) 
+            {
+                userParameters->setLowercase(true);
+            }
+            else if(temp == 1) 
+            {
+                userParameters->setLowercase(false);
+            }
+            else
+            {
+                cerr << "\nUnknown case " <<  (*paramArg)[setCase] << endl;
+            }
+        }
+    }
+
+    //*** ? /seqnos=off/on 
+    if(setSeqNo != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting seqnos parameter.");
+            }         
+        #endif
+        if((*paramArg)[setSeqNo].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setSeqNo], seqNoArg, 2);
+            if(temp == 0) 
+            {
+                userParameters->setClSeqNumbers(false);
+            }
+            else if(temp == 1) 
+            {
+                userParameters->setClSeqNumbers(true);
+            }
+            else
+            {
+                cerr << "\nUnknown SEQNO option " << (*paramArg)[setSeqNo] << endl;
+            }
+        }
+    }
+
+
+    if(setSeqNoRange != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting seqno range parameter.");
+            }        
+        #endif
+        if((*paramArg)[setSeqNoRange].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setSeqNoRange], seqNoRangeArg, 2);
+            cout << "\n comparing  " 
+                 << "\nparamArg[setSeqNoRange]= " << (*paramArg)[setSeqNoRange]
+                 << "\n comparing \n "; 
+
+            if(temp == 0) 
+            {
+                userParameters->setSeqRange(false);
+            }
+            else if(temp == 1) 
+            {
+                userParameters->setSeqRange(true);
+            }
+            else
+            {
+                cerr << "\nUnknown Sequence range  option " 
+                     << (*paramArg)[setSeqNoRange] << endl;
+            }
+        }
+    }
+
+    //*** ? /range=n:m
+    if(setRange != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting range parameter.");
+            }        
+        #endif
+        temp = 0;
+        if((*paramArg)[setRange].length() > 0)
+        {
+            // NOTE I have made a big change here! Mark march 14th 2006. This was being done
+            // in the Alignment output functions. 
+            int iFirstRes = -1; 
+            int iLastRes = -1;
+            char ignore;
+            
+            if (sscanf((*paramArg)[setRange].c_str(), "%d%[ :,-]%d", &iFirstRes,
+                        &ignore, &iLastRes) != 3) 
+            {
+                cerr << "setRange:  Syntax Error: Cannot set range, should be from:to \n";
+            }
+            else
+            {
+                userParameters->setRangeFrom(iFirstRes);
+                userParameters->setRangeTo(iLastRes);
+            }
+        }
+    }
+
+    //*** ? /gapopen=n 
+    if(setGapOpen != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting gapopen parameter.");
+            }        
+        #endif
+        ftemp = 0.0;
+        if((*paramArg)[setGapOpen].length() > 0)
+        {
+            if (sscanf((*paramArg)[setGapOpen].c_str(),"%f",&ftemp) != 1) 
+            {
+                reportBadOptionAndExit("gapopen", "real number");
+                ftemp = 0.0;
+            }
+            if(ftemp >= 0.0)
+            {
+                if( userParameters->getDNAFlag()) 
+                {
+                    userParameters->setGapOpen(ftemp);
+                    userParameters->setDNAGapOpen(ftemp);
+                }
+                else 
+                {
+                    userParameters->setGapOpen(ftemp);
+                    userParameters->setProteinGapOpen(ftemp);
+                }
+            }
+        }
+    }
+
+    //*** ? /gapext=n
+    if(setGapExtend != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting gap extention parameter.");
+            }        
+        #endif
+        
+        ftemp = 0.0;
+        if((*paramArg)[setGapExtend].length() > 0)
+        {
+            if (sscanf((*paramArg)[setGapExtend].c_str(),"%f",&ftemp) != 1) 
+            {
+                reportBadOptionAndExit("gapext", "real number");
+               ftemp = 0.0;
+            }
+            if(ftemp >= 0)
+            {
+                if(userParameters->getDNAFlag()) 
+                {
+                    userParameters->setGapExtend(ftemp);
+                    userParameters->setDNAGapExtend(ftemp);
+                }
+                else 
+                {
+                    userParameters->setGapExtend(ftemp);
+                    userParameters->setProteinGapExtend(ftemp);
+                }
+            }
+        }
+    }
+
+    //*** ? /transweight=n
+    if(setTransWeight != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting transweight parameter.");
+            }        
+        #endif
+        
+        ftemp = 0.0;
+        if((*paramArg)[setTransWeight].length() > 0)
+        {
+            if (sscanf((*paramArg)[setTransWeight].c_str(), "%f", &ftemp) != 1) 
+            {
+                reportBadOptionAndExit("transweight", "real number");
+            }
+        }
+        userParameters->setTransitionWeight(ftemp);
+    }
+
+    //*** ? /pwgapopen=n 
+    if(setPWGapOpen != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting pwgapopen parameter.");
+            }        
+        #endif
+        
+        ftemp = 0.0;
+        if((*paramArg)[setPWGapOpen].length() > 0)
+        {
+            if (sscanf((*paramArg)[setPWGapOpen].c_str(), "%f", &ftemp) != 1) 
+            {
+                reportBadOptionAndExit("pwgapopen", "real number");
+            }
+        }
+        if(ftemp >= 0.0)
+        {
+            if(userParameters->getDNAFlag()) 
+            {
+                userParameters->setPWGapOpen(ftemp);
+                userParameters->setDNAPWGapOpenPenalty(ftemp);
+            }
+            else 
+            {
+                userParameters->setPWGapOpen(ftemp);
+                userParameters->setProteinPWGapOpenPenalty(ftemp);
+            }
+        }
+    }
+
+
+    //*** ? /gapext=n 
+    if(setPWGapExtend != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting pwgapext parameter.");
+            }        
+        #endif
+        
+        ftemp = 0.0;
+        if((*paramArg)[setPWGapExtend].length() > 0)
+        {
+            if (sscanf((*paramArg)[setPWGapExtend].c_str(), "%f", &ftemp) != 1) 
+            {
+                reportBadOptionAndExit("pwgapext", "real number");
+            }
+        }
+        if(ftemp >= 0)
+        {
+            if(userParameters->getDNAFlag()) 
+            {
+                userParameters->setPWGapExtend(ftemp);
+                userParameters->setDNAPWGapExtendPenalty(ftemp);
+            }
+            else 
+            {
+                userParameters->setPWGapExtend(ftemp);
+                userParameters->setProteinPWGapExtendPenalty(ftemp);
+            }
+        }
+    }
+
+
+
+    //*** ? /outorder=n 
+    if(setOutOrder != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting outorder parameter.");
+            }        
+        #endif
+        
+        if((*paramArg)[setOutOrder].length() > 0)
+        {
+            temp = findMatch((*paramArg)[setOutOrder],outOrderArg,2);
+        }
+
+        if(temp == 0) 
+        {    
+            userParameters->setOutputOrder(INPUT);
+        }
+        else if(temp == 1) 
+        {    
+            userParameters->setOutputOrder(ALIGNED);
+        }
+        else
+        {
+            cerr << "\nUnknown OUTPUT ORDER type " <<  (*paramArg)[setOutOrder] << endl;
+        }
+    }
+
+    //*** ? /bootlabels=n 
+    if(setBootLabels != -1) 
+    {
+
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting bootlabels parameter.");
+            }        
+        #endif
+        
+        if((*paramArg)[setBootLabels].length() > 0)
+        {
+            temp = findMatch((*paramArg)[setBootLabels], bootLabelsArg, 2);
+        }
+
+        if(temp == 0)  
+        {    
+            userParameters->setBootstrapFormat(BS_NODE_LABELS);
+        }
+        else if(temp == 1)  
+        {    
+            userParameters->setBootstrapFormat(BS_BRANCH_LABELS);
+        }
+        else
+        {
+            cerr << "\nUnknown bootlabels type " << (*paramArg)[setBootLabels] << endl;
+        }
+    }
+
+    //*** ? /endgaps 
+    if(setUseEndGaps != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting useendgaps=true");
+            }        
+        #endif
+        
+        userParameters->setUseEndGaps(false);
+    }
+
+    //*** ? /nopgap 
+    if(setNoPGap != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting noPrefPenalties=true");
+            }        
+        #endif
+        
+        userParameters->setNoPrefPenalties(true);
+    }
+
+    //*** ? /nohgap 
+    if(setNoHGap != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting nohgap=true");
+            }        
+        #endif
+        
+        userParameters->setNoHydPenalties(true);
+    }
+
+    //*** ? /novgap 
+    if(setNoVGap != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting novgap=false");
+            }        
+        #endif
+        
+        userParameters->setNoVarPenalties(false);
+    }
+
+    //*** ? /hgapresidues="string" 
+    // NOTE I have made some big changes here. It looks as if there was an error here!
+    if(setHGapRes != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting hgapresidues parameter.");
+            }        
+        #endif
+        
+        userParameters->setHydResidues((*paramArg)[setHGapRes]);
+        
+    }
+              
+    //*** ? /nosecstr1 
+    if(setSecStruct1 != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting useSS1=false");
+            }        
+        #endif
+        
+        userParameters->setUseSS1(false);
+    }
+
+    //*** ? /nosecstr2 
+    if(setSecStruct2 != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting useSS2=false");
+            }        
+        #endif
+        
+        userParameters->setUseSS2(false);
+    }
+
+    //*** ? /secstroutput
+    if(setSecStructOutput != -1)
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting secstroutput parameter.");
+            }        
+        #endif
+        
+        if((*paramArg)[setSecStructOutput].length() > 0) 
+        {
+            temp = findMatch((*paramArg)[setSecStructOutput], outputSecStrArg, 4);
+            if(temp >= 0 && temp <= 3)
+            {
+                userParameters->setOutputStructPenalties(temp);
+            }
+            else
+            {
+                cerr << "\nUnknown case " << (*paramArg)[setSecStructOutput] << endl;
+            }
+        }
+    }
+
+
+    //*** ? /helixgap= n
+    if(setHelixGap != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting helixgap parameter.");
+            }        
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setHelixGap].length() > 0)
+        {
+            if (sscanf((*paramArg)[setHelixGap].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("helixgap", "integer");
+            }
+        }
+        if (temp >= 1 && temp <= 9)
+        {
+            userParameters->setHelixPenalty(temp);
+        }
+    }
+    
+    //*** ? /strandgap= n 
+    if(setStrandGap != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting strandgap parameter.");
+            }         
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setStrandGap].length() > 0)
+        {
+            if (sscanf((*paramArg)[setStrandGap].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("strandgap", "integer");
+            }
+        }
+        if (temp >= 1 && temp <= 9)
+        {
+            userParameters->setStrandPenalty(temp);
+        }
+    }
+    
+    //*** ? /loopgap= n 
+    if(setLoopGap != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting loopgap parameter.");
+            }        
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setLoopGap].length() > 0)
+        {
+            if (sscanf((*paramArg)[setLoopGap].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("loopgap", "integer");
+            }
+        }
+        if (temp >= 1 && temp <= 9)
+        {
+            userParameters->setLoopPenalty(temp);
+        }
+    }
+
+    //*** ? /terminalgap= n
+    if(setTerminalGap != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting terminalgap parameter.");
+            }        
+        #endif
+        temp = 0;
+        if((*paramArg)[setTerminalGap].length() > 0)
+        {
+            if (sscanf((*paramArg)[setTerminalGap].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("terminalgap", "integer");
+                temp = 0;
+            }
+        }
+        if (temp >= 1 && temp <= 9) 
+        {
+            userParameters->setHelixEndPenalty(temp);
+            userParameters->setStrandEndPenalty(temp);
+        }
+    }
+   
+    //*** ? /helixendin= n
+    if(setHelixEndIn != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting helixendin parameter.");
+            }        
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setHelixEndIn].length() > 0)
+        {
+            if (sscanf((*paramArg)[setHelixEndIn].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("helixendin", "integer");
+                temp = 0;
+            }
+        }
+        if (temp >= 0 && temp <= 3)
+        {
+            userParameters->setHelixEndMinus(temp);
+        }
+    }
+
+    //*** ? /helixendout= n
+    if(setHelixEndOut != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting helixendout parameter.");
+            }        
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setHelixEndOut].length() > 0)
+        {
+            if (sscanf((*paramArg)[setHelixEndOut].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("helixendout", "integer");
+                temp = 0;
+            }
+        }
+        if (temp >= 0 && temp <= 3)
+        {
+            userParameters->setHelixEndPlus(temp);
+        }
+    }
+
+    //*** ? /strandendin= n 
+    if(setStrandEndIn != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting strandendin parameter.");
+            }        
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setStrandEndIn].length() > 0)
+        {
+            if (sscanf((*paramArg)[setStrandEndIn].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("strandendin", "integer");
+            }
+        }
+        if (temp >= 0 && temp <= 3)
+        {
+            userParameters->setStrandEndMinus(temp);
+        }
+    }
+
+    //*** ? /strandendout= n 
+    if(setStrandEndOut != -1) 
+    {
+        #if DEBUGFULL 
+            if(logObject && DEBUGLOG)
+            {
+                logObject->logMsg("    Setting strandendout parameter.");
+            }        
+        #endif
+        
+        temp = 0;
+        if((*paramArg)[setStrandEndOut].length() > 0)
+        {
+            if (sscanf((*paramArg)[setStrandEndOut].c_str(), "%d", &temp) != 1) 
+            {
+                reportBadOptionAndExit("strandendout", "integer");
+            }
+        }
+        if (temp >= 0 && temp <= 3)
+        {
+            userParameters->setStrandEndPlus(temp);
+        }
+    }
+}
+
+int CommandLineParser::findMatch(string probe, StringArray* list, int n)
+{
+    int i, j, len;
+    int count, match=0;
+  
+    len = probe.length();
+    for (i = 0; i < len; i++) 
+    {
+        count = 0;
+        for (j = 0; j < n; j++) 
+        { 
+            if (probe[i] == (*list)[j][i]) 
+            {
+                match = j;
+                count++;
+            }
+        }
+        if (count == 0)
+        { 
+            return((int)-1);
+        }
+        if (count == 1) 
+        {
+            return(match);
+        }
+    }
+    return((int)-1);
+
+}
+
+/*
+ * The function getCmdLineDataStruct is used to return a struct with the values
+ * specified. It returns it by value. I cant return by reference or else the object will
+ * be destroyed.
+ */
+CmdLineData CommandLineParser::getCmdLineDataStruct(const char *str, int *flag, int type, 
+                                                      StringArray* arg)
+{
+    CmdLineData tempStruct = {str, flag, type, arg};
+    return tempStruct;
+}
+
+void CommandLineParser::printCmdLineData(const CmdLineData& temp)
+{
+    std::cout << "The str is: " << temp.str << std::endl;
+    std::cout << "The int* is: " << *(temp.flag) << std::endl;
+    std::cout << "The type is: " << temp.type << std::endl;
+    std::cout << "The StringArray is: " << std::endl;
+    
+    if(temp.arg == NULL)
+    {
+        std::cout << "    NULL" << std::endl;
+    }
+    else
+    {
+        cout << "The number of elements is " << temp.arg->size() << std::endl;
+        for(int i = 0; i < (int)temp.arg->size(); i++)
+        {
+            cout << "The " << i << "th element is: " << temp.arg->at(i) << endl;
+        }
+    }
+}
+
+/*
+ * Helper function to change string to lower case.
+ *
+ */
+string CommandLineParser::ConvertStringToLower(string strToConvert)
+{
+   for(unsigned int i=0;i<strToConvert.length();i++)
+   {
+      strToConvert[i] = tolower(strToConvert[i]);
+   }
+   return strToConvert;
+}
+
+
+
+
+void  CommandLineParser::exitWithErrorMsg(string msg)
+{
+    cerr << "ERROR: " << msg << std::endl;
+    exit(1);
+}
+
+void CommandLineParser::reportBadOptionAndExit(string option, string expectedType)
+{
+    string msg;
+    msg = "Bad option for ";
+    msg += default_commandsep;// has to be added separately
+    msg += option + ": expected " +  expectedType;
+    exitWithErrorMsg(msg);
+}
+
+void CommandLineParser::reportInvalidOptionAndExit(string option)
+{
+    string msg = "Invalid option ";
+    msg += default_commandsep;// has to be added separately
+    msg += option;
+    exitWithErrorMsg(msg);
+}
+
+
+}
+