Delete unneeded directory
[jabaws.git] / website / archive / binaries / mac / src / clustalw / src / substitutionMatrix / SubMatrix.cpp
diff --git a/website/archive/binaries/mac/src/clustalw/src/substitutionMatrix/SubMatrix.cpp b/website/archive/binaries/mac/src/clustalw/src/substitutionMatrix/SubMatrix.cpp
deleted file mode 100644 (file)
index 5f03739..0000000
+++ /dev/null
@@ -1,1896 +0,0 @@
-/**
- * Author: Mark Larkin
- * 
- * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.  
- */
-#ifdef HAVE_CONFIG_H
-    #include "config.h"
-#endif
-#include <stdio.h>
-#include <string>
-#include <cstdlib>
-#include <exception>
-#include <iostream>
-#include <sstream>
-#include "SubMatrix.h"
-#include "matrices.h"
-#include "../general/InvalidCombination.cpp"
-#include "../general/debuglogObject.h"
-
-namespace clustalw
-{
-using namespace std;
-
-/**
- * 
- * @param log 
- */
-SubMatrix::SubMatrix()
-: sizenAAMatrix(276),
-  sizeDNAMatrix(153),
-  matrixAvgScore(0),
-  QTDNAHistMatNum(DNAIUB),
-  QTAAHistMatNum(AAHISTGONNETPAM250),
-  QTsegmentDNAMatNum(DNAIUB),
-  QTsegmentAAMatNum(QTAASEGGONNETPAM250)
-{
-    userSeries = false;
-         
-    setUpCrossReferences();
-
-    #if DEBUGFULL 
-        if(logObject && DEBUGLOG)
-        {
-            logObject->logMsg("Creating the SubMatrix object\n");
-        }
-    #endif
-    
-    try
-    {              
-        /* Set up the vectors with the matrices defined in matrices.h 
-         * The matrices are intially defined as a short array, as there is no way
-         * to intiailize a vector with a {....} list.  
-         */
-        blosum30mtVec = new Matrix(blosum30mt, blosum30mt + sizenAAMatrix);
-        blosum40mtVec = new Matrix(blosum40mt, blosum40mt + sizenAAMatrix);
-        blosum45mtVec = new Matrix(blosum45mt, blosum45mt + sizenAAMatrix);
-        blosum62mt2Vec = new Matrix(blosum62mt2, blosum62mt2 + sizenAAMatrix);
-        blosum80mtVec = new Matrix(blosum80mt, blosum80mt + sizenAAMatrix);
-        pam20mtVec = new Matrix(pam20mt, pam20mt + sizenAAMatrix);
-        pam60mtVec = new Matrix(pam60mt, pam60mt + sizenAAMatrix);
-        pam120mtVec = new Matrix(pam120mt, pam120mt + sizenAAMatrix);
-        pam350mtVec = new Matrix(pam350mt, pam350mt + sizenAAMatrix);
-        idmatVec = new Matrix(idmat, idmat + sizenAAMatrix);
-        gon40mtVec = new Matrix(gon40mt, gon40mt + sizenAAMatrix);
-        gon80mtVec = new Matrix(gon80mt, gon80mt + sizenAAMatrix);
-        gon120mtVec = new Matrix(gon120mt, gon120mt + sizenAAMatrix);
-        gon160mtVec = new Matrix(gon160mt, gon160mt + sizenAAMatrix);
-        gon250mtVec = new Matrix(gon250mt, gon250mt + sizenAAMatrix);
-        gon350mtVec = new Matrix(gon350mt, gon350mt + sizenAAMatrix);
-        clustalvdnamtVec = new Matrix(clustalvdnamt, clustalvdnamt + sizeDNAMatrix);
-        swgapdnamtVec = new Matrix(swgapdnamt, swgapdnamt + sizeDNAMatrix);
-        
-        /*
-         * Set up the vectors for user defined types.
-         * Probably dont need to do this, as they may not be used. It would be better
-         * to initialise their size if thye are used.
-         */
-        userMat.resize(NUMRES * NUMRES);
-        pwUserMat.resize(NUMRES * NUMRES);
-        userDNAMat.resize(NUMRES * NUMRES);
-        pwUserDNAMat.resize(NUMRES * NUMRES);
-        QTscoreUserMatrix.resize(NUMRES * NUMRES);
-        QTscoreUserDNAMatrix.resize(NUMRES * NUMRES);
-        QTsegmentDNAMatrix.resize(NUMRES * NUMRES);
-        QTsegmentAAMatrix.resize(NUMRES * NUMRES);
-        
-        userMatSeries.resize(MAXMAT); // Maximum number of matrices        
-        vector<Matrix>::iterator firstM = userMatSeries.begin();
-        vector<Matrix>::iterator lastM = userMatSeries.end();
-
-        while(firstM != lastM)
-        {
-            firstM->resize(NUMRES * NUMRES);
-            firstM++;
-        }
-        
-        // Maybe I should put this in with the other xref intialisations!
-        AAXrefseries.resize(MAXMAT);
-        vector<Xref>::iterator firstX = AAXrefseries.begin();
-        vector<Xref>::iterator lastX = AAXrefseries.end();
-        
-        while(firstX != lastX)
-        {
-            firstX->resize(NUMRES + 1);
-            firstX++;
-        }
-        
-        // Set the defaults.
-        matrixNum = 3;
-        matrixName = new string("gonnet");
-        DNAMatrixNum = 1;
-        DNAMatrixName = new string("iub");
-        pwMatrixNum = 3;
-        pwMatrixName = new string("gonnet");
-        pwDNAMatrixNum = 1;
-        pwDNAMatrixName = new string("iub");
-    }
-    catch(const exception &ex)
-    {
-        cerr << ex.what() << endl;
-        cerr << "Terminating program. Cannot continue\n";
-        exit(1);
-    }  
-}
-
-void SubMatrix::setValuesToDefault()
-{
-    matrixAvgScore = 0;
-    QTDNAHistMatNum = DNAIUB;
-    QTAAHistMatNum = AAHISTGONNETPAM250;
-    QTsegmentDNAMatNum = DNAIUB;
-    QTsegmentAAMatNum = QTAASEGGONNETPAM250;
-    userSeries = false;
-    matrixNum = 3;
-    DNAMatrixNum = 1;
-    pwMatrixNum = 3;
-    pwDNAMatrixNum = 1;      
-}
-
-/**
- * The destructor frees up any dynamically allocated memory.
- */
-SubMatrix::~SubMatrix()
-{
-    delete blosum30mtVec;
-    delete blosum40mtVec;
-    delete blosum45mtVec;
-    delete blosum62mt2Vec;
-    delete blosum80mtVec;
-    delete pam20mtVec;
-    delete pam60mtVec;
-    delete pam120mtVec;
-    delete pam350mtVec;
-    delete idmatVec;
-    delete gon40mtVec;
-    delete gon80mtVec;
-    delete gon120mtVec;
-    delete gon160mtVec;
-    delete gon250mtVec;
-    delete gon350mtVec;
-    delete clustalvdnamtVec;
-    delete swgapdnamtVec;
-    delete matrixName;
-    delete DNAMatrixName;
-    delete pwMatrixName;
-    delete pwDNAMatrixName;
-}
-
-/**
- * This function sets up the initial cross references. 
- */
-void SubMatrix::setUpCrossReferences()
-{
-    char c1, c2;
-    short i, j, maxRes;  
-    defaultAAXref.resize(NUMRES + 1);
-    defaultDNAXref.resize(NUMRES + 1);
-
-    string aminoAcidOrder = "ABCDEFGHIKLMNPQRSTVWXYZ";
-    string nucleicAcidOrder = "ABCDGHKMNRSTUVWXY"; 
-    /* 
-     * I also need to resize the user defined xrefs.
-     */
-    DNAXref.resize(NUMRES + 1);
-    AAXref.resize(NUMRES + 1);
-    pwAAXref.resize(NUMRES + 1);
-    pwDNAXref.resize(NUMRES + 1);
-    QTscoreXref.resize(NUMRES + 1);
-    QTscoreDNAXref.resize(NUMRES + 1);
-    QTsegmentDNAXref.resize(NUMRES + 1);
-    QTsegmentAAXref.resize(NUMRES + 1);
-    /*
-     * set up cross-reference for default matrices hard-coded in matrices.h
-     */
-    for (i = 0; i < NUMRES; i++)
-    {
-        defaultAAXref[i] = -1;
-    }
-    for (i = 0; i < NUMRES; i++)
-    {
-        defaultDNAXref[i] = -1;
-    }
-
-    maxRes = 0;
-
-    for (i = 0; (c1 = aminoAcidOrder[i]); i++)
-    {
-        for (j = 0; (c2 = userParameters->getAminoAcidCode(j)); j++)
-        {
-            if (c1 == c2)
-            {
-                defaultAAXref[i] = j;
-
-                maxRes++;
-                break;
-            }
-        }
-        if ((defaultAAXref[i] ==  - 1) && (aminoAcidOrder[i] != '*'))
-        {
-            utilityObject->error("residue %c in matrices.h is not recognised",
-                aminoAcidOrder[i]);
-        }
-    } 
-
-    maxRes = 0;
-    for (i = 0; (c1 = nucleicAcidOrder[i]); i++)
-    {
-        for (j = 0; (c2 = userParameters->getAminoAcidCode(j)); j++)
-        {
-            if (c1 == c2)
-            {
-                defaultDNAXref[i] = j;
-                maxRes++;
-                break;
-            }
-        }
-        if ((defaultDNAXref[i] ==  - 1) && (nucleicAcidOrder[i] != '*'))
-        {
-            utilityObject->error("nucleic acid %c in matrices.h is not recognised",
-                nucleicAcidOrder[i]);
-        }
-    }
-    
-}
-
-/**
- * The function getPairwiseMatrix is called by the user to get the correct sub matrix for the
- * pairwise alignment stage. It calls getMatrix to actually calculate the matrix.
- * This function provides an interface for the user. It allows the user to get the matrix 
- * they wish to use for the pairwise alignment part. 
- * @param matrix[][] 
- * @param scale 
- * @param matAvg 
- * @return 
- */
-int SubMatrix::getPairwiseMatrix(int matrix[NUMRES][NUMRES], PairScaleValues& scale,
-                                 int& matAvg)
-{
-    int _maxRes; // Local copy.
-    /* Pointers to Matrix and xref to use in calculation */
-    Matrix* _matPtr;
-    Xref* _matXref;
-    
-    #if DEBUGFULL 
-        if(logObject && DEBUGLOG)
-        {
-            logObject->logMsg("In the function getPairwiseMatrix: \n");
-        }    
-    #endif
-    
-    string matrixPointer;
-    string xrefPointer;
-        
-    #ifdef OS_MAC
-        scale.intScale = 10;
-    #else
-        scale.intScale = 100;
-    #endif
-    scale.gapOpenScale = scale.gapExtendScale = 1.0;
-    
-    if (userParameters->getDNAFlag())
-    {
-        #if DEBUGFULL 
-            if(logObject && DEBUGLOG)
-            {
-                string msg = "    (DNA AND Pairwise) " + *pwDNAMatrixName + "\n";
-                logObject->logMsg(msg);
-            }
-        #endif
-        if (pwDNAMatrixName->compare("iub") == 0)
-        {
-            matrixPointer = "swgapdnamtVec"; xrefPointer = "defaultDNAXref";
-            _matPtr = swgapdnamtVec;
-            _matXref = &defaultDNAXref;
-        }
-        else if (pwDNAMatrixName->compare("clustalw") == 0)
-        {
-            matrixPointer = "clustalvdnamtVec"; xrefPointer = "defaultDNAXref";
-            _matPtr = clustalvdnamtVec;
-            _matXref = &defaultDNAXref;
-            scale.gapOpenScale = 0.6667;
-            scale.gapExtendScale = 0.751;
-        }
-        else
-        {
-            matrixPointer = "pwUserDNAMat"; xrefPointer = "pwDNAXref";
-            _matPtr = &pwUserDNAMat;
-            _matXref = &pwDNAXref;
-        }
-        _maxRes = getMatrix(_matPtr, _matXref, matrix, true, scale.intScale);
-        
-        if (_maxRes == 0)
-        {
-            return ((int) -1);
-        }
-        float _transitionWeight = userParameters->getTransitionWeight();
-        // Mark change 17-5-07
-        matrix[0][4] = static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[4][0] = static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[2][11] = static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[11][2] = static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[2][12] = static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[12][2] = static_cast<int>(_transitionWeight * matrix[0][0]);
-        
-    }
-    else
-    {
-        #if DEBUGFULL 
-            if(logObject && DEBUGLOG)
-            {
-                string msg = "    (Protein AND Pairwise) " + *pwMatrixName + "\n";
-                logObject->logMsg(msg);
-            }
-        #endif
-        
-        if (pwMatrixName->compare("blosum") == 0)
-        {
-            matrixPointer = "blosum30mtVec"; xrefPointer = "defaultAAXref";
-            _matPtr = blosum30mtVec;
-            _matXref = &defaultAAXref;
-        }
-        else if (pwMatrixName->compare("pam") == 0)
-        {
-            matrixPointer = "pam350mtVec"; xrefPointer = "defaultAAXref";
-            _matPtr = pam350mtVec;
-            _matXref = &defaultAAXref;
-        }
-        else if (pwMatrixName->compare("gonnet") == 0)
-        {
-            matrixPointer = "gon250mtVec"; xrefPointer = "defaultAAXref";
-            _matPtr = gon250mtVec;
-            scale.intScale /= 10;
-            _matXref = &defaultAAXref;
-        }
-        else if (pwMatrixName->compare("id") == 0)
-        {
-            matrixPointer = "idmatVec"; xrefPointer = "defaultAAXref";
-            _matPtr = idmatVec;
-            _matXref = &defaultAAXref;
-        }
-        else
-        {
-            matrixPointer = "pwUserMat"; xrefPointer = "pwAAXref";
-            _matPtr = &pwUserMat;
-            _matXref = &pwAAXref;
-        }
-
-        _maxRes = getMatrix(_matPtr, _matXref, matrix, true, scale.intScale);
-        
-        if (_maxRes == 0)
-        {
-            return ((int) -1);
-        }
-    }
-    
-    #if DEBUGFULL 
-        if(logObject && DEBUGLOG)
-        {
-            ostringstream outs;
-            outs << "    Called getMatrix with "
-                 << matrixPointer << " and " << xrefPointer << ".\n"
-                 << "    intScale = " << scale.intScale << ", gapOpenScale = "
-                 << scale.gapOpenScale << ", gapExtendScale = " << scale.gapExtendScale 
-                 << "\n\n";
-            logObject->logMsg(outs.str());
-        }
-    #endif
-    matAvg = matrixAvgScore;  
-    return _maxRes; 
-}
-
-/**
- * The function getProfileAlignMatrix provides an interface for the user to get
- * the matrix to be used in the profile alignment. This depends on the matrix series
- * that was chosen, and also on the percent identity.
- * @param matrix[][] 
- * @param pcid 
- * @param minLen 
- * @param scaleParam 
- * @param matAvg 
- * @return 
- */
-int SubMatrix::getProfileAlignMatrix(int matrix[NUMRES][NUMRES], double pcid, int minLen, 
-                                  PrfScaleValues& scaleParam, int& matAvg)
-{
-    bool found = false;
-    bool errorGiven = false;
-    bool _negMatrix = userParameters->getUseNegMatrix();
-    int i = 0, j = 0;
-    int _maxRes = 0;
-    scaleParam.intScale = 100;
-    string matrixPointer;
-    string xrefPointer;
-    
-    #if DEBUGFULL 
-        if(logObject && DEBUGLOG)
-        {
-            logObject->logMsg("In the function getProfileAlignMatrix: \n");
-        }    
-    #endif    
-    if (userParameters->getDNAFlag())
-    {
-        #if DEBUGFULL 
-            if(logObject && DEBUGLOG)
-            {
-                ostringstream outs;
-                outs << "    (DNA AND Multiple align) "<< DNAMatrixName->c_str() << "\n";
-                logObject->logMsg(outs.str());
-            }    
-        #endif        
-        scaleParam.scale = 1.0;
-        if (DNAMatrixName->compare("iub") == 0)
-        {
-            _matPtr = swgapdnamtVec;
-            _matXref = &defaultDNAXref;
-            matrixPointer = "swgapdnamtVec"; xrefPointer = "defaultDNAXref";
-        }
-        else if (DNAMatrixName->compare("clustalw") == 0)
-        {
-            _matPtr = clustalvdnamtVec;
-            _matXref = &defaultDNAXref;
-            scaleParam.scale = 0.66;
-            matrixPointer = "clustalvdnamtVec"; xrefPointer = "defaultDNAXref";
-        }
-        else
-        {
-            _matPtr = &userDNAMat;
-            _matXref = &DNAXref;
-            matrixPointer = "userDNAMat"; xrefPointer = "DNAXref";
-        }
-        
-        _maxRes = getMatrix(_matPtr, _matXref, matrix, _negMatrix,
-                            static_cast<int>(scaleParam.intScale)); // Mark change 17-5-07
-        if (_maxRes == 0)
-        {
-            return ((int) - 1);
-        }
-        
-        float _transitionWeight = userParameters->getTransitionWeight();
-        // fix suggested by Chanan Rubin at Compugen 
-        matrix[(*_matXref)[0]][(*_matXref)[4]] = 
-                            static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[(*_matXref)[4]][(*_matXref)[0]] = 
-                            static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[(*_matXref)[2]][(*_matXref)[11]] = 
-                            static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[(*_matXref)[11]][(*_matXref)[2]] = 
-                            static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[(*_matXref)[2]][(*_matXref)[12]] = 
-                            static_cast<int>(_transitionWeight * matrix[0][0]);
-        matrix[(*_matXref)[12]][(*_matXref)[2]] = 
-                            static_cast<int>(_transitionWeight * matrix[0][0]);
-
-    }
-    else // Amino acid alignment!!!!
-    {   
-        #if DEBUGFULL 
-            if(logObject && DEBUGLOG)
-            {
-                ostringstream outs;
-                outs << "    (Protein AND Multiple align) "<< matrixName->c_str() << "\n";
-                logObject->logMsg(outs.str());
-            }    
-        #endif   
-             
-        scaleParam.scale = 0.75;
-        if (matrixName->compare("blosum") == 0)
-        {
-            scaleParam.scale = 0.75;
-            if (_negMatrix || userParameters->getDistanceTree() == false)
-            {
-                _matPtr = blosum40mtVec;
-                matrixPointer = "blosum40mtVec";
-            }
-            else if (pcid > 80.0)
-            {
-                _matPtr = blosum80mtVec;
-                matrixPointer = "blosum80mtVec";
-            }
-            else if (pcid > 60.0)
-            {
-                _matPtr = blosum62mt2Vec;
-                matrixPointer = "blosum62mt2Vec";
-            }
-            else if (pcid > 40.0)
-            {
-                _matPtr = blosum45mtVec;
-                matrixPointer = "blosum45mtVec";
-            }
-            else if (pcid > 30.0)
-            {
-                scaleParam.scale = 0.5;
-                _matPtr = blosum45mtVec;
-                matrixPointer = "blosum45mtVec";
-            }
-            else if (pcid > 20.0)
-            {
-                scaleParam.scale = 0.6;
-                _matPtr = blosum45mtVec;
-                matrixPointer = "blosum45mtVec";
-            }
-            else
-            {
-                scaleParam.scale = 0.6;
-                _matPtr = blosum30mtVec;
-                matrixPointer = "blosum30mtVec";
-            }
-            _matXref = &defaultAAXref;
-            xrefPointer = "defaultAAXref";
-        }
-        else if (matrixName->compare("pam") == 0)
-        {
-            scaleParam.scale = 0.75;
-            if (_negMatrix || userParameters->getDistanceTree() == false)
-            {
-                _matPtr = pam120mtVec;
-                matrixPointer = "pam120mtVec";
-            }
-            else if (pcid > 80.0)
-            {
-                _matPtr = pam20mtVec;
-                matrixPointer = "pam20mtVec";
-            }
-            else if (pcid > 60.0)
-            {
-                _matPtr = pam60mtVec;
-                matrixPointer = "pam60mtVec";
-            }
-            else if (pcid > 40.0)
-            {
-                _matPtr = pam120mtVec;
-                matrixPointer = "pam120mtVec";
-            }
-            else
-            {
-                _matPtr = pam350mtVec;
-                matrixPointer = "pam350mtVec";
-            }
-            _matXref = &defaultAAXref;
-            xrefPointer = "defaultAAXref";
-        }
-        else if (matrixName->compare("gonnet") == 0)
-        {
-            scaleParam.scale /= 2.0;
-            if (_negMatrix || userParameters->getDistanceTree() == false)
-            {
-                _matPtr = gon250mtVec;
-                matrixPointer = "gon250mtVec";
-            }
-            else if (pcid > 35.0)
-            {
-                _matPtr = gon80mtVec;
-                scaleParam.scale /= 2.0;
-                matrixPointer = "gon80mtVec";
-            }
-            else if (pcid > 25.0)
-            {
-                if (minLen < 100)
-                {
-                    _matPtr = gon250mtVec;
-                    matrixPointer = "gon250mtVec";
-                }
-                else
-                {
-                    _matPtr = gon120mtVec;
-                    matrixPointer = "gon120mtVec";
-                }
-            }
-            else
-            {
-                if (minLen < 100)
-                {
-                    _matPtr = gon350mtVec;
-                    matrixPointer = "gon350mtVec";
-                }
-                else
-                {
-                    _matPtr = gon160mtVec;
-                    matrixPointer = "gon160mtVec";
-                }
-            }
-            _matXref = &defaultAAXref;
-            xrefPointer = "defaultAAXref";
-            scaleParam.intScale /= 10;
-        }
-        else if (matrixName->compare("id") == 0)
-        {
-            _matPtr = idmatVec;
-            _matXref = &defaultAAXref;
-            xrefPointer = "defaultAAXref";
-            matrixPointer = "idmatVec";
-        }
-        else if (userSeries)
-        {
-            _matPtr = NULL;
-            found = false;
-            for (i = 0; i < matSeries.nmat; i++)
-            {
-                if (pcid >= matSeries.mat[i].llimit && pcid <=
-                    matSeries.mat[i].ulimit)
-                {
-                    j = i;
-                    found = true;
-                    break;
-                }
-            }
-            if (found == false)
-            {
-                if (!errorGiven)
-                {
-                    utilityObject->warning(
-                        "\nSeries matrix not found for sequence percent identity = %d.\n""(Using first matrix in series as a default.)\n""This alignment may not be optimal!\n""SUGGESTION: Check your matrix series input file and try again.", (int)pcid);
-                }
-                errorGiven = true;
-                j = 0;
-            }
-
-            _matPtr = matSeries.mat[j].matptr;
-            _matXref = matSeries.mat[j].AAXref;
-            // this gives a scale of 0.5 for pcid=llimit and 1.0 for pcid=ulimit 
-            scaleParam.scale = 0.5 + (pcid - matSeries.mat[j].llimit) / (
-                (matSeries.mat[j].ulimit - matSeries.mat[j].llimit) *2.0);
-            xrefPointer = "matSeries.mat[j].AAXref";
-            matrixPointer = "matSeries.mat[j].matptr";
-        }
-        else
-        {
-            _matPtr = &userMat;
-            _matXref = &AAXref;
-            xrefPointer = "AAXref";
-            matrixPointer = "userMat";
-        }
-        
-        _maxRes = getMatrix(_matPtr, _matXref, matrix, _negMatrix,
-                            static_cast<int>(scaleParam.intScale));
-        if (_maxRes == 0)
-        {
-            cerr << "Error: matrix " << matrixName << " not found\n";
-            return ( - 1);
-        }       
-    }
-    
-    #if DEBUGFULL 
-        if(logObject && DEBUGLOG)
-        {
-            ostringstream outs;
-            outs << "    Called getMatrix with "
-                 << matrixPointer << " and " << xrefPointer << ".\n"
-                 << "    intScale = " << scaleParam.intScale << ", scale = "
-                 << scaleParam.scale << ", pcid = " << pcid << "\n\n";
-            logObject->logMsg(outs.str());
-        }    
-    #endif    
-    
-    matAvg = matrixAvgScore;
-    return _maxRes;
-}
-
-/**
- * The function getMatrix is what the other parts of the code call to get a useable 
- * substitution matrix. This is stored in matrix[NUMRES][NUMRES].
- * @param matptr 
- * @param xref 
- * @param matrix[][] 
- * @param negFlag 
- * @param scale 
- * @return 
- */
-int SubMatrix::getMatrix(Matrix* matptr, Xref* xref, int matrix[NUMRES][NUMRES], 
-                         bool negFlag, int scale, bool minimise)
-{
-    int ggScore = 0;
-    int grScore = 0;
-    int i, j, k, ix = 0;
-    int ti, tj;
-    int maxRes;
-    int av1, av2, av3, min, max;  
-
-    for (i = 0; i < NUMRES; i++)
-    {
-        for (j = 0; j < NUMRES; j++)
-        {
-            matrix[i][j] = 0;
-        }
-    }
-    
-    ix = 0;
-    maxRes = 0;
-    for (i = 0; i <= userParameters->getMaxAA(); i++)
-    {
-        ti = (*xref)[i];
-        for (j = 0; j <= i; j++)
-        {
-            tj = (*xref)[j];
-            if ((ti !=  - 1) && (tj !=  - 1))
-            {
-                k = (*matptr)[ix];
-                if (ti == tj)
-                {
-                    matrix[ti][ti] = k * scale;
-                    maxRes++;
-                }
-                else
-                {
-                    matrix[ti][tj] = k * scale;
-                    matrix[tj][ti] = k * scale;
-                }
-                ix++;
-            }
-        }
-    }
-
-    --maxRes;
-
-    av1 = av2 = av3 = 0;
-    for (i = 0; i <= userParameters->getMaxAA(); i++)
-    {
-        for (j = 0; j <= i; j++)
-        {
-            av1 += matrix[i][j];
-            if (i == j)
-            {
-                av2 += matrix[i][j];
-            }
-            else
-            {
-                av3 += matrix[i][j];
-            }
-        }
-    }
-
-    av1 /= (maxRes * maxRes) / 2;
-    av2 /= maxRes;
-    av3 = static_cast<int>(av3 / (((float)(maxRes * maxRes - maxRes)) / 2));
-    matrixAvgScore =  - av3;
-
-    min = max = matrix[0][0];
-    for (i = 0; i <= userParameters->getMaxAA(); i++)
-    for (j = 1; j <= i; j++)
-    {
-        if (matrix[i][j] < min)
-        {
-            min = matrix[i][j];
-        }
-        if (matrix[i][j] > max)
-        {
-            max = matrix[i][j];
-        }
-    }
-    //cout << "MAX = " << max << "\n";
-    if(!minimise)
-    {
-        /*
-            if requested, make a positive matrix - add -(lowest score) to every entry
-        */
-        if (negFlag == false)
-        {
-            if (min < 0)
-            {
-                for (i = 0; i <= userParameters->getMaxAA(); i++)
-                {
-                    ti = (*xref)[i];
-                    if (ti !=  - 1)
-                    {
-                        for (j = 0; j <= userParameters->getMaxAA(); j++)
-                        {
-                            tj = (*xref)[j];
-
-                            if (tj !=  - 1)
-                            {
-                                matrix[ti][tj] -= min;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    
-        // local copies of the gap positions
-        int _gapPos1 = userParameters->getGapPos1();
-        int _gapPos2 = userParameters->getGapPos2();
-
-        for (i = 0; i < userParameters->getGapPos1(); i++)
-        {
-            matrix[i][_gapPos1] = grScore;
-            matrix[_gapPos1][i] = grScore;
-            matrix[i][_gapPos2] = grScore;
-            matrix[_gapPos2][i] = grScore;
-        }
-        matrix[_gapPos1][_gapPos1] = ggScore;
-        matrix[_gapPos2][_gapPos2] = ggScore;
-        matrix[_gapPos2][_gapPos1] = ggScore;
-        matrix[_gapPos1][_gapPos2] = ggScore;
-    }
-    else
-    {
-        // DO THE SAGA MATRIX
-        for (i = 0; i <= userParameters->getMaxAA(); i++)
-        {
-            for (j = 0; j <= userParameters->getMaxAA(); j++)
-            {
-                matrix[i][j] = max - matrix[i][j];
-            }
-        }    
-    }
-    maxRes += 2;
-
-    return (maxRes);
-}
-
-/**
- * The function getUserMatFromFile is used to read in a user defined matrix.
- * @param str 
- * @param alignResidueType 
- * @param alignType 
- * @return 
- */
-bool SubMatrix::getUserMatFromFile(char *str, int alignResidueType, int alignType)
-{
-    int maxRes;
-
-    FILE *infile;
-    // Need to check if the values are a valid combination!
-    checkResidueAndAlignType(alignResidueType, alignType);
-     
-    if(userParameters->getMenuFlag())
-    {
-        utilityObject->getStr(string("Enter name of the matrix file"), line2);
-    }
-    else
-    {
-        line2 = string(str);
-    }
-
-    if(line2.size() == 0)
-    {
-        return false;
-    }
-
-    if((infile = fopen(line2.c_str(), "r")) == NULL) 
-    {
-        utilityObject->error("Cannot find matrix file [%s]", line2.c_str());
-        return false;
-    }
-
-    strcpy(str, line2.c_str());
-    // Find out which part of the code we are reading the matrix in for.
-    mat = getUserMatAddress(alignResidueType, alignType);
-    xref = getUserXrefAddress(alignResidueType, alignType);
-    
-    if ((alignResidueType == Protein) && (alignType == MultipleAlign))
-    {
-        // Try read in a matrix series.
-        maxRes = readMatrixSeries(str, userMat, AAXref);
-    }
-    else // Read in a single matrix!!!
-    {
-        maxRes = readUserMatrix(str, *mat, *xref);
-    }
-    
-    if (maxRes <= 0) return false;
-
-    return true;
-}
-
-/**
- * The function compareMatrices is used to compare 2 matrices that have been read in.
- * It will compare them in a given region. It will not compare all of them, as some of it
- * will be random memory.
- * @param mat1[][] 
- * @param mat2[][] 
- */
-void SubMatrix::compareMatrices(int mat1[NUMRES][NUMRES], int mat2[NUMRES][NUMRES])
-{
-    int same = 1;
-    for(int row = 0; row < NUMRES; row++)
-    {
-        for(int col = 0; col < NUMRES; col++)
-        {
-            if(mat1[row][col] != mat2[row][col])
-            {
-                same = 0;
-                cout << "The row is " << row << ". The column is " << col << endl;
-                break; // It is not the same. End the loop.
-            }
-        }
-    }
-    
-    if(same == 0)
-    {
-        cout << "It was not the same\n";
-    }
-    else
-    {
-        cout << "It is the same\n";
-    }
-}
-
-/**
- * This function is simply to display the results of the getMatrix function.
- * This is so that I can compare it to the original clustal version of it.
- * @param mat[][] 
- */
-void SubMatrix::printGetMatrixResults(int mat[NUMRES][NUMRES])
-{
-    ofstream outfile("getmatrix.out");
-    
-    if(!outfile)
-        cerr<<"oops failed to open !!!\n";
-    
-    for(int row = 0; row < NUMRES; row++)
-    {
-        for(int col = 0; col < NUMRES; col++)
-        {
-            if((mat[row][col] > 9) || (mat[row][col] < 0))
-            {
-                outfile <<" "<< mat[row][col]<<",";
-            }
-            else
-            {
-                outfile <<"  "<< mat[row][col]<<",";
-            }
-        }
-        outfile<<"\n";
-    }
-}
-
-/**
- * This function is from the old interface. It simply calls the readMatrixSeries
- * function. It seems to only be called from the commandline part.
- * @param str 
- * @return 
- */
-bool SubMatrix::getUserMatSeriesFromFile(char *str)
-{
-    int maxRes;
-
-    FILE *infile;
-
-    if(userParameters->getMenuFlag()) // Check if we are using menu!
-    {
-        utilityObject->getStr(string("Enter name of the matrix file"), line2);
-    }
-    else
-    {
-        //strcpy(lin2,str);
-        line2 = string(str);
-    }
-    
-    if(line2.size() == 0) return false;
-
-    if((infile = fopen(line2.c_str(), "r"))==NULL) 
-    {
-        utilityObject->error("Cannot find matrix file [%s]",line2.c_str());
-        return false;
-    }
-
-    strcpy(str, line2.c_str());
-
-    maxRes = readMatrixSeries(str, userMat, AAXref);
-    if (maxRes <= 0) return false;
-
-    return true;
-}
-
-/*
- * The function readMatrixSeries is used to read in a series of matrices from a file.
- * It calls readUserMatrix to read in the individual matrices. The matrices are stored
- * in userMatSeries. 
- */
-int SubMatrix::readMatrixSeries(const char *fileName, Matrix& userMat, Xref& xref)
-{
-    FILE *fd = NULL;
-    char mat_fileName[FILENAMELEN];
-    char inline1[1024];
-    int maxRes = 0;
-    int nmat;
-    int n, llimit, ulimit;
-
-    if (fileName[0] == '\0')
-    {
-        utilityObject->error("comparison matrix not specified");
-        return ((int)0);
-    }
-    if ((fd = fopen(fileName, "r")) == NULL)
-    {
-        utilityObject->error("cannot open %s", fileName);
-        return ((int)0);
-    }
-
-    /* check the first line to see if it's a series or a single matrix */
-    while (fgets(inline1, 1024, fd) != NULL)
-    {
-        if (commentline(inline1))
-        {
-            continue;
-        }
-        if (utilityObject->lineType(inline1, "CLUSTAL_SERIES"))
-        {
-            userSeries = true;
-        }
-        else
-        {
-            userSeries = false;
-        }
-        break;
-    }
-
-    /* it's a single matrix */
-    if (userSeries == false)
-    {
-        fclose(fd);
-        maxRes = readUserMatrix(fileName, userMat, xref);
-        return (maxRes);
-    }
-
-    /* it's a series of matrices, find the next MATRIX line */
-    nmat = 0;
-    matSeries.nmat = 0;
-    while (fgets(inline1, 1024, fd) != NULL)
-    {
-        if (commentline(inline1))
-        {
-            continue;
-        }
-        if (utilityObject->lineType(inline1, "MATRIX")) // Have found a matrix
-        {
-            if (sscanf(inline1 + 6, "%d %d %s", &llimit, &ulimit, mat_fileName)
-                != 3)
-            {
-                utilityObject->error("Bad format in file %s\n", fileName);
-                fclose(fd);
-                return ((int)0);
-            }
-            if (llimit < 0 || llimit > 100 || ulimit < 0 || ulimit > 100)
-            {
-                utilityObject->error("Bad format in file %s\n", fileName);
-                fclose(fd);
-                return ((int)0);
-            }
-            if (ulimit <= llimit)
-            {
-                utilityObject->error("in file %s: lower limit is greater than upper (%d-%d)\n",
-                    fileName, llimit, ulimit);
-                fclose(fd);
-                return ((int)0);
-            }
-            
-            n = readUserMatrix(mat_fileName, userMatSeries[nmat],
-                AAXrefseries[nmat]);
-            
-            //cout << "Read in matrix number " << nmat << "\n"; // NOTE Testing!!!!! 
-            char nameOfFile[] = "matrix"; 
-            printInFormat(userMatSeries[nmat], nameOfFile);
-            if (n <= 0)
-            {
-                utilityObject->error("Bad format in matrix file %s\n", mat_fileName);
-                fclose(fd);
-                return ((int)0);
-            }
-            matSeries.mat[nmat].llimit = llimit;
-            matSeries.mat[nmat].ulimit = ulimit;
-            matSeries.mat[nmat].matptr = &userMatSeries[nmat];
-            matSeries.mat[nmat].AAXref = &AAXrefseries[nmat];
-            nmat++;
-            
-            if(nmat >= MAXMAT)
-            {
-               // We have read in all the matrices that we can read into this vector
-               // Write a message to the screen, and break out of loop.
-               cerr << "The matrix series file has more entries than allowed in \n"
-                    << "a user defined series. The most that are allowed is "
-                    << MAXMAT << ".\n"
-                    << "The first " << MAXMAT << " have been read in and will be used.\n";
-               break; // Get out of the loop! 
-            }
-        }
-    }
-    fclose(fd);
-    matSeries.nmat = nmat;
-
-    maxRes = n;
-    return (maxRes);
-}
-
-/*
- * This function is used to read a single user matrix from a file.
- * It can be called repeatedly if there are multiple matrices in the file.
- */
-int SubMatrix::readUserMatrix(const char *fileName, Matrix& userMat, Xref& xref)
-{
-    double f;
-    FILE *fd;
-    int numargs, farg;
-    int i, j, k = 0;
-    char codes[NUMRES];
-    char inline1[1024];
-    char *args[NUMRES + 4];
-    char c1, c2;
-    int ix1, ix = 0;
-    int maxRes = 0;
-    float scale;
-
-    if (fileName[0] == '\0')
-    {
-        utilityObject->error("comparison matrix not specified");
-        return ((int)0);
-    }
-
-    if ((fd = fopen(fileName, "r")) == NULL)
-    {
-        utilityObject->error("cannot open %s", fileName);
-        return ((int)0);
-    }
-    maxRes = 0;
-    while (fgets(inline1, 1024, fd) != NULL)
-    {
-        if (commentline(inline1))
-        {
-            continue;
-        }
-        if (utilityObject->lineType(inline1, "CLUSTAL_SERIES"))
-        {
-            utilityObject->error("in %s - single matrix expected.", fileName);
-            fclose(fd);
-            return ((int)0);
-        }
-        /*
-        read residue characters.
-         */
-        k = 0;
-        for (j = 0; j < (int)strlen(inline1); j++)
-        {
-            if (isalpha((int)inline1[j]))
-            {
-                codes[k++] = inline1[j];
-            }
-            if (k > NUMRES)
-            {
-                utilityObject->error("too many entries in matrix %s", fileName);
-                fclose(fd);
-                return ((int)0);
-            }
-        }
-        codes[k] = '\0';
-        break;
-    }
-
-    if (k == 0)
-    {
-        utilityObject->error("wrong format in matrix %s", fileName);
-        fclose(fd);
-        return ((int)0);
-    }
-
-    /*
-    cross-reference the residues
-     */
-    for (i = 0; i < NUMRES; i++)
-    {
-        xref[i] =  - 1;
-    }
-
-    maxRes = 0;
-    for (i = 0; (c1 = codes[i]); i++)
-    {
-        for (j = 0; (c2 = userParameters->getAminoAcidCode(j)); j++)
-        if (c1 == c2)
-        {
-            xref[i] = j;
-            maxRes++;
-            break;
-        }
-        if ((xref[i] ==  - 1) && (codes[i] != '*'))
-        {
-            utilityObject->warning("residue %c in matrix %s not recognised", codes[i],
-                fileName);
-        }
-    }
-
-
-    /*
-    get the weights
-     */
-
-    ix = ix1 = 0;
-    while (fgets(inline1, 1024, fd) != NULL)
-    {
-        if (inline1[0] == '\n')
-        {
-            continue;
-        }
-        if (inline1[0] == '#' || inline1[0] == '!')
-        {
-            break;
-        }
-        numargs = getArgs(inline1, args, (int)(k + 1));
-        if (numargs < maxRes)
-        {
-            utilityObject->error("wrong format in matrix %s", fileName);
-            fclose(fd);
-            return ((int)0);
-        }
-        if (isalpha(args[0][0]))
-        {
-            farg = 1;
-        }
-        else
-        {
-            farg = 0;
-        }
-
-        /* decide whether the matrix values are float or decimal */
-        scale = 1.0;
-        for (i = 0; i < (int)strlen(args[farg]); i++)
-        if (args[farg][i] == '.')
-        {
-            /* we've found a float value */
-            scale = 10.0;
-            break;
-        }
-
-        for (i = 0; i <= ix; i++)
-        {
-            if (xref[i] !=  - 1)
-            {
-                f = atof(args[i + farg]);
-                userMat[ix1++] = (short)(f *scale);
-            }
-        }
-        ix++;
-    }
-    if (ix != k + 1)
-    {
-        utilityObject->error("wrong format in matrix %s", fileName);
-        fclose(fd);
-        return ((int)0);
-    }
-
-    userMat.resize(ix1 + 1);
-    
-    maxRes += 2;
-    fclose(fd);
-
-    return (maxRes);
-}
-
-/**
- * 
- * @param inline1 
- * @param args[] 
- * @param max 
- * @return 
- */
-int SubMatrix::getArgs(char *inline1,char *args[],int max)
-{
-    char *inptr;
-    int i;
-
-    inptr = inline1;
-    for (i = 0; i <= max; i++)
-    {
-        if ((args[i] = strtok(inptr, " \t\n")) == NULL)
-        {
-            break;
-        }
-        inptr = NULL;
-    }
-
-    return (i);
-}
-
-
-/**
- * 
- * @return 
- */
-int SubMatrix::getMatrixNum()
-{
-    return matrixNum;
-}
-
-/**
- * 
- * @return 
- */
-int SubMatrix::getDNAMatrixNum()
-{
-    return DNAMatrixNum;
-}
-
-/**
- * 
- * @return 
- */
-int SubMatrix::getPWMatrixNum()
-{
-    return pwMatrixNum;
-}
-
-/**
- * 
- * @return 
- */
-int SubMatrix::getPWDNAMatrixNum()
-{
-    return pwDNAMatrixNum;
-}
-
-/**
- * The function setCurrentNameAndNum is used to select a matrix series.
- * This will then be used for the alignment. The matrices will change, but the
- * series remains the same. We can set the series for pairwise/full for both 
- * protein and DNA. NOTE: The default can be set to user defined matrices.
- * @param _matrixName 
- * @param _matrixNum 
- * @param alignResidueType 
- * @param alignType 
- */
-void SubMatrix::setCurrentNameAndNum(string _matrixName, int _matrixNum, 
-                                          int alignResidueType,int alignType)
-{       
-    // Check if the values are valid.
-    checkResidueAndAlignType(alignResidueType, alignType);
-    
-    string residue;
-    string align;
-    if((alignResidueType == Protein) && (alignType == Pairwise))
-    {
-        residue = "Protein"; align = "Pairwise";
-        pwMatrixNum = _matrixNum;
-        pwMatrixName = new string(_matrixName);
-    }
-    else if((alignResidueType == Protein) && (alignType == MultipleAlign))
-    {
-        residue = "Protein"; align = "MultipleAlign";
-        matrixNum = _matrixNum;
-        matrixName = new string(_matrixName); 
-    }
-    else if((alignResidueType == DNA) && (alignType == Pairwise))
-    {
-        residue = "DNA"; align = "Pairwise";
-        pwDNAMatrixNum = _matrixNum;
-        pwDNAMatrixName = new string(_matrixName);     
-    }
-    else if((alignResidueType == DNA) && (alignType == MultipleAlign))
-    {
-        residue = "DNA"; align = "MultipleAlign";    
-        DNAMatrixNum = _matrixNum;
-        DNAMatrixName = new string(_matrixName);
-            
-    }
-    
-    #if DEBUGFULL 
-        if(logObject && DEBUGLOG)
-        {
-            ostringstream outs;
-            outs << "The matrix/matrix series has been changed for "
-                 << "(" << residue << " AND " << align << ")."
-                 << " New value: " << _matrixName << "\n\n";           
-            logObject->logMsg(outs.str());
-        }
-    #endif    
-}
-
-/**
- * 
- * @param alignResidueType 
- * @param alignType 
- * @return 
- */
-int SubMatrix::getMatrixNumForMenu(int alignResidueType, int alignType)
-{
-    checkResidueAndAlignType(alignResidueType, alignType);
-    
-    if((alignResidueType == Protein) && (alignType == Pairwise))
-    {
-        return pwMatrixNum;
-    }
-    else if((alignResidueType == Protein) && (alignType == MultipleAlign))
-    {
-        return matrixNum;  
-    }
-    else if((alignResidueType == DNA) && (alignType == Pairwise))
-    {
-        return pwDNAMatrixNum;   
-    }
-    else if((alignResidueType == DNA) && (alignType == MultipleAlign))
-    {
-        return DNAMatrixNum;   
-    }
-    else
-        return -100; // NOTE NONE of these. I need to put in better error checking
-}
-
-/**
- * 
- * @param line 
- * @return 
- */
-bool SubMatrix::commentline(char* line)
-{
-    int i;
-
-    if (line[0] == '#')
-    {
-        return true;
-    }
-    for (i = 0; line[i] != '\n' && line[i] != EOS; i++)
-    {
-        if (!isspace(line[i]))
-        {
-            return false;
-        }
-    }
-    return true;
-}
-
-/**
- * This function prints out the vector to the file specified by name. 
- * The vector is printed out in a triangular format, the same as the way
- * the arrays are displayed in matrices.h. This function is for testing purposes.
- * @param temp 
- * @param name 
- */
-void SubMatrix::printInFormat(vector<short>& temp, char* name)
-{
-    char nameOfFile[30];
-    strcpy(nameOfFile, name);
-    strcat(nameOfFile, ".out");
-
-    ofstream outfile(nameOfFile);
-    
-    if(!outfile)
-        cerr<<"oops failed to open !!!\n";
-    
-    outfile<<"short "<<name<<"[]{\n";
-            
-    int numOnCurrentLine = 1;
-    int soFar = 0;
-    for(int i = 0; i < (int)temp.size(); i++)
-    {
-        if(soFar == numOnCurrentLine)
-        {
-            outfile<<"\n";
-            soFar = 0;
-            numOnCurrentLine++;            
-        }
-        if((temp[i] > 9) || (temp[i] < 0))
-        {
-            outfile <<" "<< temp[i]<<",";
-        }
-        else
-        {
-            outfile <<"  "<< temp[i]<<",";
-        }
-        
-        // Now increment so far
-        soFar++;
-        // Check to see if the next element is the last element
-        if((i + 1) == (int)temp.size() - 1)
-        {
-            // Print out the last element. Then a curly brace, and break.
-            if((temp[i+1] > 9) || (temp[i+1] < 0))
-            {
-                outfile <<" "<< temp[i + 1]<<"};\n";
-            }
-            else
-            {
-                outfile <<"  "<< temp[i + 1]<<"};\n";
-            }
-            break;
-        }  
-    }
-    
-    ofstream outfile2("temp.out");
-    for(int i = 0; i < (int)temp.size(); i++)
-    {
-        outfile2 << temp[i] << " ";
-    }   
-}
-
-
-/**
- * 
- * @param temp 
- * @param name 
- */
-void SubMatrix::printVectorToFile(vector<short>& temp, char* name)
-{
-    char nameOfFile[30];
-    strcpy(nameOfFile, name);
-    strcat(nameOfFile, ".out");
-
-    ofstream outfile(nameOfFile);
-    
-    if(!outfile)
-        cerr<<"oops failed to open !!!\n";
-    
-    for(int i = 0; i < (int)temp.size(); i++)
-    {
-        if((temp[i] > 9) || (temp[i] < 0))
-        {
-            outfile <<" "<< temp[i]<<",";
-        }
-        else
-        {
-            outfile <<"  "<< temp[i]<<",";
-        }
-    }
-    outfile.close();
-}
-
-
-/**
- * 
- * @param alignResidueType 
- * @param alignType 
- * @return 
- */
-Matrix* SubMatrix::getUserMatAddress(int alignResidueType, int alignType)
-{
-    if((alignResidueType == Protein) && (alignType == Pairwise))
-    {
-        return &pwUserMat;
-    }
-    else if((alignResidueType == Protein) && (alignType == MultipleAlign))
-    {
-        return &userMat; 
-    }
-    else if((alignResidueType == DNA) && (alignType == Pairwise))
-    {
-        return &pwUserDNAMat; 
-    }
-    else if((alignResidueType == DNA) && (alignType == MultipleAlign))
-    {
-        return &userDNAMat;  
-    }
-    return NULL;
-}
-
-
-/**
- * 
- * @param alignResidueType 
- * @param alignType 
- * @return 
- */
-Xref* SubMatrix::getUserXrefAddress(int alignResidueType, int alignType)
-{
-    if((alignResidueType == Protein) && (alignType == Pairwise))
-    {
-        return &pwAAXref;
-    }
-    else if((alignResidueType == Protein) && (alignType == MultipleAlign))
-    {
-        return &AAXref; 
-    }
-    else if((alignResidueType == DNA) && (alignType == Pairwise))
-    {
-        return &pwDNAXref;  
-    }
-    else if((alignResidueType == DNA) && (alignType == MultipleAlign))
-    {
-        return &DNAXref;   
-    }
-    return NULL;
-}
-
-/**
- * This is an error handling routine. If an incorrect combination of values
- * is given, it will terminate the program.
- * @param alignResidueType 
- * @param alignType 
- */
-void SubMatrix::checkResidueAndAlignType(int alignResidueType, int alignType)
-{
-    if(((alignResidueType != 0) && (alignResidueType != 1))
-           || ((alignType != 0) && (alignType != 1)))
-    {
-        InvalidCombination ex(alignResidueType, alignType);
-        ex.whatHappened();
-        exit(1);
-    }
-}
-
-/**
- * The function tempInterface is used to call the SubMatrix in the way it is
- * supposed to be used. It is for testing purposes.
- * @param alignResidueType 
- * @param alignType 
- */
-void SubMatrix::tempInterface(int alignResidueType, int alignType)
-{
-    char userFile[FILENAMELEN + 1];
-
-    userParameters->setDNAFlag(true);
-    strcpy(userFile, "mat1");
-    userParameters->setMenuFlag(false);   
-    getUserMatFromFile(userFile, DNA, Pairwise);
-    setCurrentNameAndNum(userFile, 4, 3, Pairwise);
-    
-    setCurrentNameAndNum("gonnet", 4, Protein, Pairwise);
-}
-
-/**
- * A single matrix is used in scoring the alignment. This is Blosum45. This is the 
- * function to get it.
- * @param matrix[][] 
- * @return 
- */
-int SubMatrix::getAlnScoreMatrix(int matrix[NUMRES][NUMRES])
-{
-    int _maxNumRes;
-    /* 
-       //_maxNumRes = getMatrix(blosum45mtVec, &defaultAAXref, matrix, true, 100);
-       _maxNumRes = getMatrix(blosum45mtVec, &defaultAAXref, matrix, false, 1, true);
-       //_maxNumRes = getMatrix(blosum62mt2Vec, &defaultAAXref, matrix, true, 100);
-    */
-    // 1.83 style
-    _maxNumRes = getMatrix(blosum45mtVec, &defaultAAXref, matrix, true, 100);
-
-    return _maxNumRes;
-}
-
-/**
- * This function is used to get the matrix that will be used for the calculation of 
- * the histogram. The histogram values are used in ClustalQt. 
- * @param matrix[][] 
- * @param matNum 
- * @param dnaMatNum 
- */
-void SubMatrix::getQTMatrixForHistogram(int matrix[NUMRES][NUMRES])
-{
-    Matrix* _matPtrLocal;
-    Xref* _matXrefLocal;
-    int maxRes;
-    if(userParameters->getDNAFlag())
-    {
-        if (QTDNAHistMatNum == DNAUSERDEFINED)
-        {
-            _matPtrLocal = &QTscoreUserDNAMatrix;
-            _matXrefLocal = &QTscoreDNAXref;
-        }
-        else if (QTDNAHistMatNum == DNACLUSTALW)
-        {
-            _matPtrLocal = clustalvdnamtVec;
-            _matXrefLocal = &defaultDNAXref;
-        }
-        else
-        {
-            _matPtrLocal = swgapdnamtVec;
-            _matXrefLocal = &defaultDNAXref;            
-        }
-    }
-    else 
-    {
-        if (QTAAHistMatNum == AAHISTIDENTITY)
-        {
-            _matPtrLocal = idmatVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else if (QTAAHistMatNum == AAHISTGONNETPAM80)
-        {
-            _matPtrLocal = gon80mtVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else if (QTAAHistMatNum == AAHISTGONNETPAM120)
-        {
-            _matPtrLocal = gon120mtVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else if (QTAAHistMatNum == AAHISTUSER)
-        {
-            _matPtrLocal = &QTscoreUserMatrix;
-            _matXrefLocal = &QTscoreXref;
-        }
-        else if (QTAAHistMatNum == AAHISTGONNETPAM350)
-        {
-            _matPtrLocal = gon350mtVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else // Default
-        {
-            _matPtrLocal = gon250mtVec;
-            _matXrefLocal = &defaultAAXref;            
-        }
-    }
-    maxRes = getMatrix(_matPtrLocal, _matXrefLocal, matrix, false, 100);
-
-}
-
-void SubMatrix::getQTMatrixForLowScoreSeg(int matrix[NUMRES][NUMRES])
-{
-    Matrix* _matPtrLocal;
-    Xref* _matXrefLocal;
-    int maxRes;
-    int _maxAA = userParameters->getMaxAA();
-    int max = 0;
-    int offset;
-        
-    if(userParameters->getDNAFlag())
-    {
-        if (QTsegmentDNAMatNum == DNAUSERDEFINED)
-        {
-            _matPtrLocal = &QTsegmentDNAMatrix;
-            _matXrefLocal = &QTsegmentDNAXref;            
-        }
-        else if (QTsegmentDNAMatNum == DNACLUSTALW)
-        {
-            _matPtrLocal = clustalvdnamtVec;
-            _matXrefLocal = &defaultDNAXref;
-        }
-        else
-        {
-            _matPtrLocal = swgapdnamtVec;
-            _matXrefLocal = &defaultDNAXref;
-        }
-        /* get a positive matrix - then adjust it according to scale */
-        maxRes = getMatrix(_matPtrLocal, _matXrefLocal, matrix, false, 100);
-        /* find the maximum value */
-        for(int i = 0; i <= _maxAA; i++)
-        {
-            for(int j = 0; j <= _maxAA; j++)
-            {
-                if(matrix[i][j] > max)
-                { 
-                    max = matrix[i][j];
-                }
-            }
-        }
-        /* subtract max * scale / 2 from each matrix value */
-        offset = static_cast<int>(static_cast<float>(max *
-                                  userParameters->getQTlowScoreDNAMarkingScale()) / 20.0);
-
-        for(int i = 0; i <= _maxAA; i++)
-        {
-            for(int j = 0; j <= _maxAA; j++)
-            {
-                matrix[i][j] -= offset;
-            }
-        }
-    }
-    else
-    {
-        if (QTsegmentAAMatNum == QTAASEGGONNETPAM80)
-        {
-            _matPtrLocal = gon80mtVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else if (QTsegmentAAMatNum == QTAASEGGONNETPAM120)
-        {
-            _matPtrLocal = gon120mtVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else if (QTsegmentAAMatNum == QTAASEGUSER)
-        {
-            _matPtrLocal = &QTsegmentAAMatrix;
-            _matXrefLocal = &QTsegmentAAXref;
-        }
-        else if (QTsegmentAAMatNum == QTAASEGGONNETPAM350)
-        {
-            _matPtrLocal = gon350mtVec;
-            _matXrefLocal = &defaultAAXref;
-        }
-        else
-        {
-            _matPtrLocal = gon250mtVec;
-            _matXrefLocal = &defaultAAXref;            
-        }
-        /* get a negative matrix */
-        maxRes = getMatrix(_matPtrLocal, _matXrefLocal, matrix, true, 100);
-    }
-}
-
-bool SubMatrix::getQTLowScoreMatFromFile(char* fileName, bool dna)
-{
-    int maxRes;
-
-    FILE *infile;
-     
-    line2 = string(fileName);
-
-    if(line2.size() == 0)
-    {
-        return false;
-    }
-
-    if((infile = fopen(line2.c_str(), "r")) == NULL) 
-    {
-        utilityObject->error("Cannot find matrix file [%s]", line2.c_str());
-        return false;
-    }
-
-    strcpy(fileName, line2.c_str());
-    
-    if(dna)
-    {
-        maxRes = readUserMatrix(fileName, QTsegmentDNAMatrix, QTsegmentDNAXref);
-    }
-    else
-    {
-        maxRes = readUserMatrix(fileName, QTsegmentAAMatrix, QTsegmentAAXref);
-    }
-    
-    if (maxRes <= 0) 
-    {
-        return false;
-    }
-
-    return true;
-}
-
-bool SubMatrix::getAAScoreMatFromFile(char *str)
-{
-    int maxRes;
-
-    FILE *infile;
-     
-    line2 = string(str);
-
-    if(line2.size() == 0)
-    {
-        return false;
-    }
-
-    if((infile = fopen(line2.c_str(), "r")) == NULL) 
-    {
-        utilityObject->error("Cannot find matrix file [%s]", line2.c_str());
-        return false;
-    }
-
-    strcpy(str, line2.c_str());
-    
-    maxRes = readUserMatrix(str, QTscoreUserMatrix, QTscoreXref);
-    
-    if (maxRes <= 0) 
-    {
-        return false;
-    }
-
-    return true;
-}
-
-bool SubMatrix::getDNAScoreMatFromFile(char *str)
-{
-    int maxRes;
-
-    FILE *infile;
-     
-    line2 = string(str);
-
-    if(line2.size() == 0)
-    {
-        return false;
-    }
-
-    if((infile = fopen(line2.c_str(), "r")) == NULL) 
-    {
-        utilityObject->error("Cannot find matrix file [%s]", line2.c_str());
-        return false;
-    }
-
-    strcpy(str, line2.c_str());
-    
-    maxRes = readUserMatrix(str, QTscoreUserDNAMatrix, QTscoreDNAXref);
-    
-    if (maxRes <= 0) 
-    {
-        return false;
-    }
-
-    return true;
-}
-
-}