Delete unneeded directory
[jabaws.git] / website / archive / binaries / mac / src / clustalw / src / multipleAlign / MyersMillerProfileAlign.cpp
diff --git a/website/archive/binaries/mac/src/clustalw/src/multipleAlign/MyersMillerProfileAlign.cpp b/website/archive/binaries/mac/src/clustalw/src/multipleAlign/MyersMillerProfileAlign.cpp
deleted file mode 100644 (file)
index 086ef00..0000000
+++ /dev/null
@@ -1,1262 +0,0 @@
-/**
- * Author: Mark Larkin
- * 
- * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.  
- * Changes: Mark 20-6-07, I added a call to calculateMaxlengths
- */
-#ifdef HAVE_CONFIG_H
-    #include "config.h"
-#endif
-#include "MyersMillerProfileAlign.h"
-#include "Iteration.h"
-#include <math.h>
-
-namespace clustalw
-{
-
-/**
- * 
- * @return 
- */
-MyersMillerProfileAlign::MyersMillerProfileAlign()
- : _gapPos1(userParameters->getGapPos1()),
-   _gapPos2(userParameters->getGapPos2())
-{
-
-}
-
-/**
- * 
- * @param alnPtr 
- * @param distMat 
- * @param group 
- * @param aligned 
- * @return 
- */
-int MyersMillerProfileAlign::profileAlign(Alignment* alnPtr, DistMatrix* distMat,
-                                          vector<int>* group, int* aligned)
-{
-    bool negative = false;
-    int i = 0, j = 0, count = 0;
-    int numSeq = 0;
-    int seqNum = 0;
-    int len = 0, len1 = 0, len2 = 0, is = 0, minLen = 0;
-    int se1 = 0, se2 = 0, sb1 = 0, sb2 = 0;
-    int maxRes = 0;
-    int c = 0;
-    int score = 0;
-    double logmin = 0.0, logdiff = 0.0;
-    double pcid = 0.0;
-    int matrix[NUMRES][NUMRES];
-    int numSeqsProf1 = 0, numSeqsProf2 = 0;
-    // Initialise the matrix. To get rid of a valgrind error.
-    for(int i = 0; i < NUMRES; i++)
-    {
-        for(int j = 0; j < NUMRES; j++)
-        {
-            matrix[i][j] = 0;
-        }
-    }
-    
-    numSeq = alnPtr->getNumSeqs();
-    seqArray.resize(numSeq);
-    alnWeight.resize(numSeq);
-    
-    for (i = 0; i < numSeq; i++)
-    {
-        if (aligned[i + 1] == 0)
-        {
-            (*group)[i + 1] = 0;
-        }
-    }
-
-    nseqs1 = nseqs2 = 0;
-    for (i = 0; i < numSeq; i++)
-    {
-        if ((*group)[i + 1] == 1)
-        {
-            nseqs1++;
-        }
-        else if ((*group)[i + 1] == 2)
-        {
-            nseqs2++;
-        }
-    }
-
-    if ((nseqs1 == 0) || (nseqs2 == 0))
-    {
-        return (0);
-    }
-    numSeqsProf1 = nseqs1;
-    numSeqsProf2 = nseqs2;
-    
-    if (nseqs2 > nseqs1)
-    {
-        switchProfiles = true;
-        for (i = 0; i < numSeq; i++)
-        {
-            if ((*group)[i + 1] == 1)
-            {
-                (*group)[i + 1] = 2;
-            }
-            else if ((*group)[i + 1] == 2)
-            {
-                (*group)[i + 1] = 1;
-            }
-        }
-    }
-    else
-    {
-        switchProfiles = false;
-    }
-    
-    // calculate the mean of the sequence pc identities between the two groups
-    
-    count = 0;
-    pcid = 0.0;
-    negative = userParameters->getUseNegMatrix();
-    
-    for (i = 0; i < numSeq; i++)
-    {
-        if ((*group)[i + 1] == 1)
-        {
-            for (j = 0; j < numSeq; j++)
-            {
-                if ((*group)[j + 1] == 2)
-                {
-                    count++;
-                    pcid += (*distMat)(i + 1, j + 1);
-                }
-            }
-        }
-    }
-
-    pcid = pcid / (float)count;
-
-    // Make the first profile.
-    
-    prfLength1 = 0;
-    for (i = 0; i < numSeq; i++)
-    {
-        if ((*group)[i + 1] == 1)
-        {    
-            if (alnPtr->getSeqLength(i + 1) > prfLength1)
-            {
-                prfLength1 = alnPtr->getSeqLength(i + 1);
-            }
-        }
-    }
-    nseqs1 = 0;
-
-    for (i = 0; i < numSeq; i++)
-    {
-        if ((*group)[i + 1] == 1)
-        {
-            len = alnPtr->getSeqLength(i + 1);
-            
-            // initialise with the other vector!
-            seqArray[nseqs1] = vector<int>(alnPtr->getSequence(i + 1)->begin() + 1,
-                                            alnPtr->getSequence(i + 1)->end());
-            seqArray[nseqs1].resize(prfLength1 + extraEndElemNum);
-
-            for (j = len; j < prfLength1; j++)
-            {
-                seqArray[nseqs1][j] = userParameters->getGapPos1();
-            }
-            alnWeight[nseqs1] = alnPtr->getSeqWeight(i);
-            nseqs1++;
-        }
-    }
-
-
-    // Make the second profile.
-    
-    prfLength2 = 0;
-    for (i = 0; i < numSeq; i++)
-    {
-        if ((*group)[i + 1] == 2)
-        {
-            if (alnPtr->getSeqLength(i + 1) > prfLength2)
-            {
-                prfLength2 = alnPtr->getSeqLength(i + 1);
-            }
-        }
-    }
-    nseqs2 = 0;
-
-    for (i = 0; i < numSeq; i++)
-    {
-        if ((*group)[i + 1] == 2)
-        {
-            len = alnPtr->getSeqLength(i + 1);
-
-            seqArray[nseqs1 + nseqs2] = vector<int>(alnPtr->getSequence(i + 1)->begin() + 1,
-                                                     alnPtr->getSequence(i + 1)->end());
-            seqArray[nseqs1 + nseqs2].resize(prfLength2 + extraEndElemNum);
-                        
-            for (j = len; j < prfLength2; j++)
-            {
-                seqArray[nseqs1 + nseqs2][j] = userParameters->getGapPos1();
-            }
-            
-            seqArray[nseqs1 + nseqs2][j] = ENDALN;
-            alnWeight[nseqs1 + nseqs2] = alnPtr->getSeqWeight(i);
-            //cout << "weight " << nseqs1 + nseqs2 << alnWeight[nseqs1 + nseqs2] << "\n";
-            nseqs2++;
-        }
-    }
-    
-    // Change the Max alignment length in the Alignment Object! 
-    alnPtr->setMaxAlnLength(prfLength1 + prfLength2 + 2);
-
-    // calculate real length of profiles - removing gaps!
-    
-    len1 = 0;
-    for (i = 0; i < nseqs1; i++)
-    {
-        is = 0;
-        for (j = 0; j < utilityObject->MIN(static_cast<int>(seqArray[i].size()), prfLength1); j++)
-        {
-            c = seqArray[i][j];
-            if ((c != _gapPos1) && (c != _gapPos2))
-            {
-                is++;
-            }
-        }
-        len1 += is;
-    }
-    len1 = static_cast<int>(len1 / (float)nseqs1);
-
-    len2 = 0;
-    for (i = nseqs1; i < nseqs2 + nseqs1; i++)
-    {
-        is = 0;
-        for (j = 0; j < utilityObject->MIN(static_cast<int>(seqArray[i].size()), prfLength2);
-             j++)
-        {
-            c = seqArray[i][j];
-            if ((c != _gapPos1) && (c != _gapPos2))
-            {
-                is++;
-            }
-        }
-        len2 += is;
-    }
-    len2 = static_cast<int>(len2 / (float)nseqs2);
-
-    PrfScaleValues scaleVals;
-    scaleVals.scale = 1.0;
-    scaleVals.intScale = 100.0;
-    
-    int matAvgScore = 0;
-    minLen = utilityObject->MIN(len1, len2);
-    maxRes = 0;
-
-    // Get the substitution matrix that will be stored in 'matrix'
-    maxRes = subMatrix->getProfileAlignMatrix(matrix, pcid, minLen, scaleVals, matAvgScore);
-
-    if (maxRes == 0 || maxRes == -1)
-    {
-        return -1;
-    }    
-    if (userParameters->getDNAFlag())
-    {
-        gapcoef1 = gapcoef2 = static_cast<int>(100.0 * userParameters->getGapOpen() * scaleVals.scale);
-        lencoef1 = lencoef2 = static_cast<int>(100.0 * userParameters->getGapExtend() * scaleVals.scale);
-    }
-    else
-    {
-        if (len1 == 0 || len2 == 0)
-        {
-            logmin = 1.0;
-            logdiff = 1.0;
-        }
-        else
-        {
-            logmin = 1.0 / log10((double)minLen);
-            if (len2 < len1)
-            {
-                logdiff = 1.0 + 0.5 * log10((double)((float)len2 / (float)len1));
-            }
-            else if (len1 < len2)
-            {
-                logdiff = 1.0 + 0.5 * log10((double)((float)len1 / (float)len2));
-            }
-            else
-            {
-                logdiff = 1.0;
-            }
-            if (logdiff < 0.9)
-            {
-                logdiff = 0.9;
-            }
-        }
-
-
-        if (negative)
-        {
-            gapcoef1 = gapcoef2 = static_cast<int>(100.0 *(float)(userParameters->getGapOpen()));
-            lencoef1 = lencoef2 = static_cast<int>(100.0 * userParameters->getGapExtend());
-        }
-        else
-        {
-            if (matAvgScore <= 0)
-            {
-                gapcoef1 = gapcoef2 = static_cast<int>(100.0 *(float)(userParameters->getGapOpen() + logmin));
-            }
-            else
-            {
-                gapcoef1 = gapcoef2 = static_cast<int>(scaleVals.scale * matAvgScore * 
-                            (float)(userParameters->getGapOpen() / (logdiff * logmin)));
-            }
-            lencoef1 = lencoef2 = static_cast<int>(100.0 * userParameters->getGapExtend());
-        }
-    }
-    // We need one profile with substitution matrix information and one without!
-    // But this will change when we have the LE scoring function.
-    profileWithSub = new ProfileWithSub(prfLength1, 0, nseqs1);
-    profileStandard = new ProfileStandard(prfLength2, nseqs1, nseqs1 + nseqs2);
-
-    // Calculate the profile array with Substitution matrix info 
-    // calculate the Gap Coefficients.
-    
-    gaps.resize(alnPtr->getMaxAlnLength() + 1);
-    
-    bool profile1Pen; 
-    if (switchProfiles == false)
-    {
-        profile1Pen = userParameters->getStructPenalties1() && userParameters->getUseSS1();
-        profileWithSub->calcGapCoeff(&seqArray, &gaps, profile1Pen,
-                                     alnPtr->getGapPenaltyMask1(), gapcoef1, lencoef1);
-    }
-    else
-    {
-        profile1Pen = userParameters->getStructPenalties2() && userParameters->getUseSS2();
-        profileWithSub->calcGapCoeff(&seqArray, &gaps, profile1Pen,
-                                     alnPtr->getGapPenaltyMask2(), gapcoef1, lencoef1);
-    }
-    // calculate the profile matrix.
-    profileWithSub->calcProfileWithSub(&seqArray, &gaps, matrix, &alnWeight);
-    profile1 = profileWithSub->getProfilePtr();
-    
-    if (userParameters->getDebug() > 4)
-    {
-        string aminoAcidCodes = userParameters->getAminoAcidCodes();
-        for (j = 0; j <= userParameters->getMaxAA(); j++)
-        {
-            cout << aminoAcidCodes[j] << "    ";
-        }
-        cout << "\n";
-        for (i = 0; i < prfLength1; i++)
-        {
-            for (j = 0; j <= userParameters->getMaxAA(); j++)
-            {
-                cout << (*profile1)[i + 1][j] << " ";
-            }
-            cout << (*profile1)[i + 1][_gapPos1]<< " ";
-            cout << (*profile1)[i + 1][_gapPos2]<< " ";
-            cout << (*profile1)[i + 1][GAPCOL] << " " << (*profile1)[i + 1][LENCOL]
-                 << "\n";
-        }
-    }    
-    // Calculate the standard profile array 
-    // calculate the Gap Coefficients.
-    bool profile2Pen;
-    if (switchProfiles == false)
-    {
-        profile2Pen = userParameters->getStructPenalties2() && userParameters->getUseSS2();
-        profileStandard->calcGapCoeff(&seqArray, &gaps, profile2Pen,
-                                      alnPtr->getGapPenaltyMask2(), gapcoef2, lencoef2);
-    }
-    else
-    {
-        profile2Pen = userParameters->getStructPenalties1() && userParameters->getUseSS1();
-        profileStandard->calcGapCoeff(&seqArray, &gaps, profile2Pen,
-                                      alnPtr->getGapPenaltyMask1(), gapcoef2, lencoef2);
-    }
-
-    // calculate the profile matrix.
-    
-    profileStandard->calcStandardProfile(&seqArray, &alnWeight);
-    profile2 = profileStandard->getProfilePtr();
-    
-    if (userParameters->getDebug() > 4)
-    {
-        string aminoAcidCodes = userParameters->getAminoAcidCodes();
-        for (j = 0; j <= userParameters->getMaxAA(); j++)
-        {
-            cout << aminoAcidCodes[j] << "    ";
-        }
-        cout << "\n";
-        for (i = 0; i < prfLength2; i++)
-        {
-            for (j = 0; j <= userParameters->getMaxAA(); j++)
-            {
-                cout << (*profile2)[i + 1][j] << " ";
-            }
-            cout << (*profile2)[i + 1][_gapPos1]<< " ";
-            cout << (*profile2)[i + 1][_gapPos2]<< " ";
-            cout << (*profile2)[i + 1][GAPCOL] << " " << (*profile2)[i + 1][LENCOL]
-                 << "\n";
-        }
-    }
-    alnWeight.clear();
-
-    int _maxAlnLength = alnPtr->getMaxAlnLength();
-    
-    alnPath1.resize(_maxAlnLength + 1);
-    alnPath2.resize(_maxAlnLength + 1);
-
-    //align the profiles
-    
-    // use Myers and Miller to align two sequences 
-
-    lastPrint = 0;
-    printPtr = 1;
-
-    sb1 = sb2 = 0;
-    se1 = prfLength1;
-    se2 = prfLength2;
-
-    HH.resize(_maxAlnLength + 1);
-    DD.resize(_maxAlnLength + 1);
-    RR.resize(_maxAlnLength + 1);
-    SS.resize(_maxAlnLength + 1);
-    gS.resize(_maxAlnLength + 1);
-    displ.resize(_maxAlnLength + 1);
-
-    score = progDiff(sb1, sb2, se1 - sb1, se2 - sb2, (*profile1)[0][GAPCOL],
-                    (*profile1)[prfLength1][GAPCOL]);
-
-    // May not need if we recreate the Profile every time!
-    HH.clear();
-    DD.clear();
-    RR.clear();
-    SS.clear();
-    gS.clear();
-
-    alignmentLength = progTracepath();
-
-    displ.clear();
-
-    addGGaps(alnPtr, &seqArray);
-
-    profileStandard->resetProfile();
-    profileWithSub->resetProfile();
-    
-    prfLength1 = alignmentLength;
-
-    alnPath1.clear();
-    alnPath2.clear();
-    
-    if(userParameters->getDoRemoveFirstIteration() == TREE)
-    {
-        Iteration iterateObj;
-        iterateObj.iterationOnTreeNode(numSeqsProf1, numSeqsProf2, prfLength1, prfLength2,
-                                       &seqArray);           
-    }
-        
-    //  Now we resize the SeqArray that holds the sequences in the alignment class
-    //    and also update it with the new aligned sequences 
-         
-    SeqArray* newSequences = alnPtr->getSeqArrayForRealloc();
-    seqNum = 0;
-    for (j = 0; j < numSeq; j++)
-    {
-        if ((*group)[j + 1] == 1)
-        {
-            (*newSequences)[j + 1].clear();
-            (*newSequences)[j + 1].resize(prfLength1 + 1);
-            for (i = 0; i < prfLength1; i++)
-            {
-                (*newSequences)[j + 1][i + 1] = seqArray[seqNum][i];
-            }
-            seqNum++;
-        }
-    }
-    for (j = 0; j < numSeq; j++)
-    {
-        if ((*group)[j + 1] == 2)
-        {
-            (*newSequences)[j + 1].clear();
-            (*newSequences)[j + 1].resize(prfLength1 + 1);
-            for (i = 0; i < prfLength1; i++)
-            {
-                (*newSequences)[j + 1][i + 1] = seqArray[seqNum][i];
-            }
-            seqNum++;
-        }
-    }
-    
-    alnPtr->calculateMaxLengths(); // Mark change 20-6-07
-    
-    gaps.clear();
-    seqArray.clear();
-    
-    delete profileWithSub;
-    delete profileStandard;
-
-    int retScore = (score / 100);
-
-    return retScore;
-    
-}
-
-/** ****************************************************************************************
- *                          Private functions                                              *
- *******************************************************************************************/
-
-/**
- * 
- * @param A 
- * @param B 
- * @param M 
- * @param N 
- * @param go1 
- * @param go2 
- * @return 
- */
-int MyersMillerProfileAlign::progDiff(int A, int B, int M, int N, int go1, int go2)
-{
-    int midi, midj, type;
-    int midh;
-
-    static int t, tl, g, h;
-
-    {
-        static int i, j;
-        static int hh, f, e, s;
-
-        /* Boundary cases: M <= 1 or N == 0 */
-        if (userParameters->getDebug() > 2)
-        {
-            cout << "A " << A << " B " << B << " M " << M << " N " << N 
-                 << " midi " << M / 2 << " go1 " << go1 << " go2 " << go2<< "\n";
-        }
-
-        /* if sequence B is empty....                                            */
-
-        if (N <= 0)
-        {
-
-            /* if sequence A is not empty....                                        */
-
-            if (M > 0)
-            {
-
-                /* delete residues A[1] to A[M]                                          */
-
-                progDel(M); 
-            }
-            return ( - gapPenalty1(A, B, M));
-        }
-
-        /* if sequence A is empty....                                            */
-
-        if (M <= 1)
-        {
-            if (M <= 0)
-            {
-
-                /* insert residues B[1] to B[N]                                          */
-
-                progAdd(N);
-                return ( - gapPenalty2(A, B, N));
-            }
-
-            /* if sequence A has just one residue....                                */
-
-            if (go1 == 0)
-            {
-                midh =  - gapPenalty1(A + 1, B + 1, N);
-            }
-            else
-            {
-                midh =  - gapPenalty2(A + 1, B, 1) - gapPenalty1(A + 1, B + 1,
-                    N);
-            }
-            midj = 0;
-            for (j = 1; j <= N; j++)
-            {
-                hh =  - gapPenalty1(A, B + 1, j - 1) + prfScore(A + 1, B + j)
-                    - gapPenalty1(A + 1, B + j + 1, N - j);
-                if (hh > midh)
-                {
-                    midh = hh;
-                    midj = j;
-                }
-            }
-
-            if (midj == 0)
-            {
-                progAdd(N);
-                progDel(1);
-            }
-            else
-            {
-                if (midj > 1)
-                {
-                    progAdd(midj - 1);
-                }
-                progAlign();
-                if (midj < N)
-                {
-                    progAdd(N - midj);
-                }
-            }
-            return midh;
-        }
-
-
-        /* Divide sequence A in half: midi */
-
-        midi = M / 2;
-
-        /* In a forward phase, calculate all HH[j] and HH[j] */
-
-        HH[0] = 0;
-        t =  - openPenalty1(A, B + 1);
-        tl =  - extPenalty1(A, B + 1);
-        for (j = 1; j <= N; j++)
-        {
-            HH[j] = t = t + tl;
-            DD[j] = t - openPenalty2(A + 1, B + j);
-        }
-
-        if (go1 == 0)
-        {
-            t = 0;
-        }
-        else
-        {
-            t =  - openPenalty2(A + 1, B);
-        }
-        tl =  - extPenalty2(A + 1, B);
-        for (i = 1; i <= midi; i++)
-        {
-            s = HH[0];
-            HH[0] = hh = t = t + tl;
-            f = t - openPenalty1(A + i, B + 1);
-
-            for (j = 1; j <= N; j++)
-            {
-                g = openPenalty1(A + i, B + j);
-                h = extPenalty1(A + i, B + j);
-                if ((hh = hh - g - h) > (f = f - h))
-                {
-                    f = hh;
-                }
-                g = openPenalty2(A + i, B + j);
-                h = extPenalty2(A + i, B + j);
-                if ((hh = HH[j] - g - h) > (e = DD[j] - h))
-                {
-                    e = hh;
-                }
-                hh = s + prfScore(A + i, B + j);
-                if (f > hh)
-                {
-                    hh = f;
-                }
-                if (e > hh)
-                {
-                    hh = e;
-                }
-
-                s = HH[j];
-                HH[j] = hh;
-                DD[j] = e;
-
-            }
-        }
-
-        DD[0] = HH[0];
-
-        /* In a reverse phase, calculate all RR[j] and SS[j] */
-
-        RR[N] = 0;
-        tl = 0;
-        for (j = N - 1; j >= 0; j--)
-        {
-            g =  - openPenalty1(A + M, B + j + 1);
-            tl -= extPenalty1(A + M, B + j + 1);
-            RR[j] = g + tl;
-            SS[j] = RR[j] - openPenalty2(A + M, B + j);
-            gS[j] = openPenalty2(A + M, B + j);
-        }
-
-        tl = 0;
-        for (i = M - 1; i >= midi; i--)
-        {
-            s = RR[N];
-            if (go2 == 0)
-            {
-                g = 0;
-            }
-            else
-            {
-                g =  - openPenalty2(A + i + 1, B + N);
-            }
-            tl -= extPenalty2(A + i + 1, B + N);
-            RR[N] = hh = g + tl;
-            t = openPenalty1(A + i, B + N);
-            f = RR[N] - t;
-
-            for (j = N - 1; j >= 0; j--)
-            {
-                g = openPenalty1(A + i, B + j + 1);
-                h = extPenalty1(A + i, B + j + 1);
-                if ((hh = hh - g - h) > (f = f - h - g + t))
-                {
-                    f = hh;
-                }
-                t = g;
-                g = openPenalty2(A + i + 1, B + j);
-                h = extPenalty2(A + i + 1, B + j);
-                hh = RR[j] - g - h;
-                if (i == (M - 1))
-                {
-                    e = SS[j] - h;
-                }
-                else
-                {
-                    e = SS[j] - h - g + openPenalty2(A + i + 2, B + j);
-                    gS[j] = g;
-                }
-                if (hh > e)
-                {
-                    e = hh;
-                }
-                hh = s + prfScore(A + i + 1, B + j + 1);
-                if (f > hh)
-                {
-                    hh = f;
-                }
-                if (e > hh)
-                {
-                    hh = e;
-                }
-
-                s = RR[j];
-                RR[j] = hh;
-                SS[j] = e;
-
-            }
-        }
-        SS[N] = RR[N];
-        gS[N] = openPenalty2(A + midi + 1, B + N);
-
-        /* find midj, such that HH[j]+RR[j] or DD[j]+SS[j]+gap is the maximum */
-
-        midh = HH[0] + RR[0];
-        midj = 0;
-        type = 1;
-        for (j = 0; j <= N; j++)
-        {
-            hh = HH[j] + RR[j];
-            if (hh >= midh)
-            if (hh > midh || (HH[j] != DD[j] && RR[j] == SS[j]))
-            {
-                midh = hh;
-                midj = j;
-            }
-        }
-
-        for (j = N; j >= 0; j--)
-        {
-            hh = DD[j] + SS[j] + gS[j];
-            if (hh > midh)
-            {
-                midh = hh;
-                midj = j;
-                type = 2;
-            }
-        }
-    }
-
-    /* Conquer recursively around midpoint                                   */
-
-
-    if (type == 1)
-    {
-         /* Type 1 gaps  */
-        if (userParameters->getDebug() > 2)
-        {
-            cout << "Type 1,1: midj " << midj << "\n";
-        }
-        progDiff(A, B, midi, midj, go1, 1);
-        if (userParameters->getDebug() > 2)
-        {
-            cout << "Type 1,2: midj " << midj << "\n";
-        }
-        progDiff(A + midi, B + midj, M - midi, N - midj, 1, go2);
-    }
-    else
-    {
-        if (userParameters->getDebug() > 2)
-        {
-            cout << "Type 2,1: midj " << midj << "\n";
-        }
-        progDiff(A, B, midi - 1, midj, go1, 0);
-        progDel(2);
-        if (userParameters->getDebug() > 2)
-        {
-            cout << "Type 2,2: midj " << midj << "\n";
-        }
-        progDiff(A + midi + 1, B + midj, M - midi - 1, N - midj, 0, go2);
-    }
-
-    return midh; /* Return the score of the best alignment */
-} 
-/**
- * 
- * @param alnPtr 
- * @param seqArray 
- */
-void MyersMillerProfileAlign::addGGaps(Alignment* alnPtr, SeqArray* seqArray)
-{
-    int j;
-    int i, ix;
-    int len;
-    vector<int> ta;
-
-    ta.resize(alignmentLength + 1);
-
-    for (j = 0; j < nseqs1; j++)
-    {
-        ix = 0;
-        for (i = 0; i < alignmentLength; i++)
-        {
-            if (alnPath1[i] == 2)
-            {
-                if (ix < ((int)(*seqArray)[j].size() - extraEndElemNum))
-                {
-                    ta[i] = (*seqArray)[j][ix];
-                }
-                else
-                {
-                    ta[i] = ENDALN;
-                }
-                ix++;
-            }
-            else if (alnPath1[i] == 1)
-            {
-                /*
-                insertion in first alignment...
-                 */
-                ta[i] = _gapPos1;
-            }
-            else
-            {
-                cerr << "Error in aln_path\n";
-            }
-        }
-        ta[i] = ENDALN;
-
-        len = alignmentLength;
-
-        (*seqArray)[j].resize(len + 2);
-        
-        for (i = 0; i < len; i++)
-        {
-            (*seqArray)[j][i] = ta[i];
-        }
-        (*seqArray)[j][len] = ENDALN;
-
-    }
-
-    for (j = nseqs1; j < nseqs1 + nseqs2; j++)
-    {
-        ix = 0;
-        for (i = 0; i < alignmentLength; i++)
-        {
-            if (alnPath2[i] == 2)
-            {
-                if (ix < ((int)(*seqArray)[j].size() - extraEndElemNum))
-                {
-                    ta[i] = (*seqArray)[j][ix];
-                }
-                else
-                {
-                    ta[i] = ENDALN;
-                }
-                ix++;
-            }
-            else if (alnPath2[i] == 1)
-            {
-                /*
-                insertion in second alignment...
-                 */
-                ta[i] = _gapPos1;
-            }
-            else
-            {
-                cerr << "Error in alnPath\n";
-            }
-        }
-        ta[i] = ENDALN;
-
-        len = alignmentLength;
-
-        (*seqArray)[j].resize(len + 2);
-        
-        for (i = 0; i < len; i++)
-        {
-            (*seqArray)[j][i] = ta[i];
-        }
-        (*seqArray)[j][len] = ENDALN;
-    }
-
-
-    if (userParameters->getStructPenalties1() != NONE)
-    {
-        addGGapsMask(alnPtr->getGapPenaltyMask1(), alignmentLength,
-                     &alnPath1, &alnPath2);
-    }
-    if (userParameters->getStructPenalties1() == SECST)
-    {
-        addGGapsMask(alnPtr->getSecStructMask1(), alignmentLength,
-                     &alnPath1, &alnPath2);
-    }
-
-    if (userParameters->getStructPenalties2() != NONE)
-    {
-        addGGapsMask(alnPtr->getGapPenaltyMask2(), alignmentLength,
-                     &alnPath2, &alnPath1);
-    }
-    if (userParameters->getStructPenalties2() == SECST)
-    {
-        addGGapsMask(alnPtr->getSecStructMask2(), alignmentLength,
-                     &alnPath2, &alnPath1);
-    }
-}
-
-
-/**
- * 
- * @param mask 
- * @param len 
- * @param path1 
- * @param path2 
- */
-void MyersMillerProfileAlign::addGGapsMask(vector<char>* mask, int len, vector<int>* path1,
-                                           vector<int>* path2)
-{
-    int i, ix;
-    char *ta;
-
-    ta = new char[len + 1];
-
-    ix = 0;
-    if (switchProfiles == false)
-    {
-        for (i = 0; i < len; i++)
-        {
-            if ((*path1)[i] == 2)
-            {
-                ta[i] = (*mask)[ix];
-                ix++;
-            }
-            else if ((*path1)[i] == 1)
-            {
-                ta[i] = _gapPos1;
-            }
-        }
-    }
-    else
-    {
-        for (i = 0; i < len; i++)
-        {
-            if ((*path2)[i] == 2)
-            {
-                ta[i] = (*mask)[ix];
-                ix++;
-            }
-            else if ((*path2)[i] == 1)
-            {
-                ta[i] = _gapPos1;
-            }
-        }
-    }
-    mask->resize(len + 2);
-    
-    for (i = 0; i < len; i++)
-    {
-        (*mask)[i] = ta[i];
-    }
-
-
-    delete [] ta;
-    ta  = NULL;
-}
-
-
-/**
- * 
- * @param n 
- * @param m 
- * @return 
- */
-inline int MyersMillerProfileAlign::prfScore(int n, int m)
-{
-    int ix;
-    int score;
-
-    score = 0;
-    int _maxAA = userParameters->getMaxAA(); // NOTE Change here!
-    for (ix = 0; ix <= _maxAA; ix++)
-    {
-        score += ((*profile1)[n][ix] * (*profile2)[m][ix]);
-    }
-    score += ((*profile1)[n][_gapPos1] * (*profile2)[m][_gapPos1]);
-    score += ((*profile1)[n][_gapPos2] * (*profile2)[m][_gapPos2]);
-    return (score / 10);
-}
-
-
-/**
- * 
- * @return 
- */
-int MyersMillerProfileAlign::progTracepath()
-{
-    int i, j, k, pos, toDo;
-    int alignLen;
-    pos = 0;
-
-    toDo = printPtr - 1;
-
-    for (i = 1; i <= toDo; ++i)
-    {
-        if (userParameters->getDebug() > 1)
-        {
-            cout << displ[i] << " ";
-        }
-        if (displ[i] == 0)
-        {
-            alnPath1[pos] = 2;
-            alnPath2[pos] = 2;
-            ++pos;
-        }
-        else
-        {
-            if ((k = displ[i]) > 0)
-            {
-                for (j = 0; j <= k - 1; ++j)
-                {
-                    alnPath2[pos + j] = 2;
-                    alnPath1[pos + j] = 1;
-                }
-                pos += k;
-            }
-            else
-            {
-                k = (displ[i] < 0) ? displ[i] * - 1: displ[i];
-                for (j = 0; j <= k - 1; ++j)
-                {
-                    alnPath1[pos + j] = 2;
-                    alnPath2[pos + j] = 1;
-                }
-                pos += k;
-            }
-        }
-    }
-    if (userParameters->getDebug() > 1)
-    {
-        cout << "\n";
-    }
-
-    alignLen = pos;
-    return alignLen;
-}
-
-
-/**
- * 
- * @param k 
- */
-void MyersMillerProfileAlign::progDel(int k)
-{
-    if (lastPrint < 0)
-    {
-        lastPrint = displ[printPtr - 1] -= k;
-    }
-    else
-    {
-        lastPrint = displ[printPtr++] =  - (k);
-    }
-}
-
-
-/**
- * 
- * @param k 
- */
-void MyersMillerProfileAlign::progAdd(int k)
-{
-    if (lastPrint < 0)
-    {
-        displ[printPtr - 1] = k;
-        displ[printPtr++] = lastPrint;
-    }
-    else
-    {
-        lastPrint = displ[printPtr++] = k;
-    }
-}
-
-
-/**
- * 
- */
-void MyersMillerProfileAlign::progAlign()
-{
-    displ[printPtr++] = lastPrint = 0;
-}
-
-
-/**
- * 
- * @param i 
- * @param j 
- * @return 
- */
-inline int MyersMillerProfileAlign::openPenalty1(int i, int j) // NOTE Change here!
-{
-    int g;
-    if (!userParameters->getEndGapPenalties() && (i == 0 || i == prfLength1))
-    {
-        return (0);
-    }
-
-    g = (*profile2)[j][GAPCOL] + (*profile1)[i][GAPCOL];
-    return (g);
-}
-
-
-/**
- * 
- * @param i 
- * @param j 
- * @return 
- */
-inline int MyersMillerProfileAlign::extPenalty1(int i, int j) // NOTE Change here!
-{
-    int h;
-
-    if (!userParameters->getEndGapPenalties() && (i == 0 || i == prfLength1))
-    {
-        return (0);
-    }
-
-    h = (*profile2)[j][LENCOL];
-    return (h);
-}
-
-
-/**
- * 
- * @param i 
- * @param j 
- * @param k 
- * @return 
- */
-int MyersMillerProfileAlign::gapPenalty1(int i, int j, int k)
-{
-    int ix;
-    int gp;
-    int g, h = 0;
-
-    if (k <= 0)
-    {
-        return (0);
-    }
-    if (!userParameters->getEndGapPenalties() && (i == 0 || i == prfLength1))
-    {
-        return (0);
-    }
-
-    g = (*profile2)[j][GAPCOL] + (*profile1)[i][GAPCOL];
-    for (ix = 0; ix < k && ix + j < prfLength2; ix++)
-    {
-        h += (*profile2)[ix + j][LENCOL];
-    }
-
-    gp = g + h;
-    return (gp);
-}
-
-
-/**
- * 
- * @param i 
- * @param j 
- * @return 
- */
-inline int MyersMillerProfileAlign::openPenalty2(int i, int j) // NOTE Change here!
-{
-    int g;
-
-    if (!userParameters->getEndGapPenalties() && (j == 0 || j == prfLength2))
-    {
-        return (0);
-    }
-
-    g = (*profile1)[i][GAPCOL] + (*profile2)[j][GAPCOL];
-    return (g);
-}
-
-
-/**
- * 
- * @param i 
- * @param j 
- * @return 
- */
-inline int MyersMillerProfileAlign::extPenalty2(int i, int j) // NOTE Change here!
-{
-    int h;
-
-    if (!userParameters->getEndGapPenalties() && (j == 0 || j == prfLength2))
-    {
-        return (0);
-    }
-
-    h = (*profile1)[i][LENCOL];
-    return (h);
-}
-
-
-/**
- * 
- * @param i 
- * @param j 
- * @param k 
- * @return 
- */
-int MyersMillerProfileAlign::gapPenalty2(int i, int j, int k)
-{
-    int ix;
-    int gp;
-    int g, h = 0;
-
-    if (k <= 0)
-    {
-        return (0);
-    }
-    if (!userParameters->getEndGapPenalties() && (j == 0 || j == prfLength2))
-    {
-        return (0);
-    }
-
-    g = (*profile1)[i][GAPCOL] + (*profile2)[j][GAPCOL];
-    for (ix = 0; ix < k && ix + i < prfLength1; ix++)
-    {
-        h += (*profile1)[ix + i][LENCOL];
-    }
-
-    gp = g + h;
-    return (gp);
-}
-                     
-}