Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / clustalw / src / alignment / AlignmentOutput.cpp
diff --git a/website/archive/binaries/mac/src/clustalw/src/alignment/AlignmentOutput.cpp b/website/archive/binaries/mac/src/clustalw/src/alignment/AlignmentOutput.cpp
new file mode 100644 (file)
index 0000000..a0b9de3
--- /dev/null
@@ -0,0 +1,2479 @@
+/**
+ * Author: Mark Larkin
+ * 
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.  
+ */
+/**
+ * Output routines ported from clustalx C code in 'interface.c'.
+ *
+ * Changes:
+ *
+ * 18-04-07,Nigel Brown(EMBL): clustalx code used (firsRes, length) convention
+ * to define output columns, while the port uses (firsRes, lastRes). Fixed
+ * problems in all 7 output routines where the conventions were mixed giving
+ * over-long output blocks.
+ *
+ * 18-7-07: Mark (UCD), made changes to fastaOut, clustalOut, nbrfOut and gdeOut
+ *
+ * 9-2-08: Paul (UCD), changes to clustalOut to make output the same as 1.83
+ *                     added const NAMESWIDTH which is calculated based on the
+ *                     length of the longest sequence name and the upper and lower
+ *                     limits specified in MAXNAMESTODISPLAY and MINNAMESTODISPLAY
+ */
+
+#ifdef HAVE_CONFIG_H
+    #include "config.h"
+#endif
+#include "AlignmentOutput.h"
+
+namespace clustalw
+{
+
+AlignmentOutput::AlignmentOutput()
+: clusSecStructOffset(9),
+  clusSequenceOffset(15+1) // MARK made a change here for test case findRangeValues 10seqs
+{
+    // NOTE in the old clustal these arrays ended with NULL as a value.
+    try
+    {
+        strongGroup.resize(9);
+        strongGroup[0] = string("STA");
+        strongGroup[1] = string("NEQK");
+        strongGroup[2] = string("NHQK");
+        strongGroup[3] = string("NDEQ");
+        strongGroup[4] = string("QHRK");
+        strongGroup[5] = string("MILV");
+        strongGroup[6] = string("MILF");
+        strongGroup[7] = string("HY");
+        strongGroup[8] = string("FYW");
+    
+        weakGroup.resize(11);
+        weakGroup[0] = string("CSA");
+        weakGroup[1] = string("ATV");
+        weakGroup[2] = string("SAG");
+        weakGroup[3] = string("STNK");
+        weakGroup[4] = string("STPA");
+        weakGroup[5] = string("SGND");
+        weakGroup[6] = string("SNDEQK");
+        weakGroup[7] = string("NDEQHK");
+        weakGroup[8] = string("NEQHRK");
+        weakGroup[9] = string("FVLIM");
+        weakGroup[10] = string("HFY");
+    }
+    catch(const exception& e)
+    {
+        cerr << "An exception has occured in the contructor of AlignmentOutput.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+}
+
+/*
+ * The function createAlignmentOutput is used to call all the individual functions
+ * for the different file types. It is possible to output the alignment in all file
+ * types at the same time.
+ */
+void AlignmentOutput::createAlignmentOutput(Alignment* alignPtr, int firstSeq, int lastSeq)
+{
+    int length;  
+    int firstRes; // starting sequence range - Ramu
+    int lastRes; // ending sequence range 
+    bool rangeOK;
+    
+    if((firstSeq <= 0) || (lastSeq < firstSeq))
+    {
+        utilityObject->error("Cannot produce alignment output."
+                " Incorrect call to createAlignmentOutput."
+                " firstSeq = %d"
+                " lastSeq = %d\n", firstSeq, lastSeq);
+        return;
+    }
+    
+    length = 0;
+    firstRes = 1;
+    lastRes = 0;
+    rangeOK = false;
+    
+    try
+    {
+        length = alignPtr->getLengthLongestSequence();
+        lastRes = length;
+
+        if (userParameters->getRangeFromToSet()) 
+        {
+            firstRes = userParameters->getRangeFrom();
+            lastRes = userParameters->getRangeTo();
+            // Check if the numbers are ok.
+            if ((firstRes > lastRes) || (firstRes == -1) || (lastRes == -1)) 
+            {
+                cerr << "seqrange numbers are not set properly, using default....\n";
+                firstRes = 1;
+                lastRes = length;
+            }
+            else
+            {
+                rangeOK = true;
+            }
+        }
+        if (rangeOK && (lastRes > length)) 
+        {
+            lastRes = length;
+            cout << "Seqrange " << lastRes << " is more than the " << length 
+                 << "  setting it to " << length << " \n";
+        }
+
+        if (userParameters->getMenuFlag())
+        {    
+            cout << "Consensus length = " << lastRes << " \n";
+        }
+
+        outputRegion partToOutput;
+        partToOutput._firstSeq = firstSeq;
+        partToOutput._lastSeq = lastSeq;
+        partToOutput._firstRes = firstRes;
+        partToOutput._lastRes = lastRes;
+
+        if(userParameters->getOutputClustal()) 
+        {
+            if(clustalOutFile.get() != 0 && clustalOutFile->is_open())
+            {
+                clustalOut(alignPtr, partToOutput);
+                if(clustalOutFile->is_open())
+                {
+                    clustalOutFile->close();
+                }
+                utilityObject->info("CLUSTAL-Alignment file created  [%s]\n",
+                                    clustalOutName.c_str());
+            }
+        }
+        if(userParameters->getOutputNbrf())  
+        {
+            if(nbrfOutFile.get() != 0 && nbrfOutFile->is_open())
+            {            
+                nbrfOut(alignPtr, partToOutput);
+                if(nbrfOutFile->is_open())
+                {
+                    nbrfOutFile->close();
+                }
+                utilityObject->info("NBRF/PIR-Alignment file created  [%s]\n",
+                                    nbrfOutName.c_str());                
+            }
+        }
+        if(userParameters->getOutputGCG())  
+        {
+            if(gcgOutFile.get() != 0 && gcgOutFile->is_open())
+            {
+                gcgOut(alignPtr, partToOutput);
+                if(gcgOutFile->is_open())
+                {
+                    gcgOutFile->close();
+                }
+                utilityObject->info("GCG-Alignment file created      [%s]\n",
+                                    gcgOutName.c_str());                
+            }
+        }
+        if(userParameters->getOutputPhylip())  
+        {
+            if(phylipOutFile.get() != 0 && phylipOutFile->is_open())
+            {
+                phylipOut(alignPtr, partToOutput);
+                if(phylipOutFile->is_open())
+                {
+                    phylipOutFile->close();
+                }
+                utilityObject->info("PHYLIP-Alignment file created   [%s]\n",
+                                    phylipOutName.c_str());                
+            }
+        }
+        
+        if(userParameters->getOutputGde())  
+        {
+            if(gdeOutFile.get() != 0 && gdeOutFile->is_open())
+            {
+                gdeOut(alignPtr, partToOutput);
+                if(gdeOutFile->is_open())
+                {
+                    gdeOutFile->close();
+                }
+                utilityObject->info("GDE-Alignment file created      [%s]\n",
+                                    gdeOutName.c_str());                
+            }
+        }
+        
+        if(userParameters->getOutputNexus())  
+        {
+            if(nexusOutFile.get() != 0 && nexusOutFile->is_open())
+            {
+                nexusOut(alignPtr, partToOutput);
+                if(nexusOutFile->is_open())
+                {
+                    nexusOutFile->close();
+                }
+                utilityObject->info("NEXUS-Alignment file created    [%s]\n",
+                                    nexusOutName.c_str());                
+            }
+        }
+
+        if(userParameters->getOutputFasta())  
+        {
+            if(fastaOutFile.get() != 0 && fastaOutFile->is_open())
+            {
+                fastaOut(alignPtr, partToOutput);
+                if(fastaOutFile->is_open())
+                {
+                    fastaOutFile->close();
+                }
+                utilityObject->info("Fasta-Alignment file created    [%s]\n",
+                                    fastaOutName.c_str());                
+            }
+        }
+        
+        // Output the alignment to the screen if it is required.
+        if (userParameters->getShowAlign() && userParameters->getMenuFlag()) 
+        {
+            showAlign();
+        }
+    }
+    catch(const exception& e)
+    {
+        cerr << "An exception has occured in the createAlignmentOutput function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+}
+
+bool AlignmentOutput::QTOpenFilesForOutput(AlignmentFileNames fileNames)
+{
+    if(!userParameters->getOutputClustal() && 
+       !userParameters->getOutputNbrf() && !userParameters->getOutputGCG() &&
+       !userParameters->getOutputPhylip() && !userParameters->getOutputGde() &&
+       !userParameters->getOutputNexus() && !userParameters->getOutputFasta()) 
+    {
+         utilityObject->error("You must select an alignment output format\n");
+         return false;
+    }
+        
+    if(fileNames.clustalFile == "" && fileNames.fastaFile == "" && fileNames.gcgFile == ""
+       && fileNames.gdeFile == "" && fileNames.nexusFile == "" && fileNames.nrbfFile == ""
+       && fileNames.phylipFile == "")
+    {
+        utilityObject->error("No names for output files. Cannot output alignment.\n");
+        return false;
+    }
+    
+    if(fileNames.clustalFile != "")
+    {
+        clustalOutName = fileNames.clustalFile;
+        if(!openExplicitFile(clustalOutFile, clustalOutName))
+        { 
+            return false;
+        }
+    }  
+    if(fileNames.fastaFile != "")
+    {
+        fastaOutName = fileNames.fastaFile;
+        if(!openExplicitFile(fastaOutFile, fastaOutName))
+        { 
+            return false;
+        }
+    }
+    if(fileNames.gcgFile != "")
+    {
+        gcgOutName = fileNames.gcgFile;
+        if(!openExplicitFile(gcgOutFile, gcgOutName))
+        { 
+            return false;
+        }
+    }
+    if(fileNames.gdeFile != "")
+    {
+        gdeOutName = fileNames.gdeFile;
+        if(!openExplicitFile(gdeOutFile, gdeOutName))
+        { 
+            return false;
+        }
+    }
+    if(fileNames.nexusFile != "")
+    {
+        nexusOutName = fileNames.nexusFile;
+        if(!openExplicitFile(nexusOutFile, nexusOutName))
+        { 
+            return false;
+        }
+    }
+    if(fileNames.nrbfFile != "")
+    {
+        nbrfOutName = fileNames.nrbfFile;
+        if(!openExplicitFile(nbrfOutFile, nbrfOutName))
+        { 
+            return false;
+        }
+    }
+    if(fileNames.phylipFile != "")
+    {
+        phylipOutName = fileNames.phylipFile;
+        if(!openExplicitFile(phylipOutFile, phylipOutName))
+        { 
+            return false;
+        }
+    } 
+    return true;                         
+}
+/*
+ * The function openAlignmentOutput opens a file for output. It returns true if it
+ * has been successful and false if it has not been successful
+ */
+bool AlignmentOutput::openAlignmentOutput(string path)
+{
+    if(!userParameters->getOutputClustal() && 
+       !userParameters->getOutputNbrf() && !userParameters->getOutputGCG() &&
+       !userParameters->getOutputPhylip() && !userParameters->getOutputGde() &&
+       !userParameters->getOutputNexus() && !userParameters->getOutputFasta()) 
+    {
+         utilityObject->error("You must select an alignment output format\n");
+         return false;
+    }
+    string _fileNameToOutput = path;
+    if(_fileNameToOutput == "")
+    {
+      /*_fileNameToOutput = userParameters->getSeqName();*/
+      /* BUG 166 , file extension, FS, 2009-01-26 */
+      utilityObject->getPath(userParameters->getSeqName(), &_fileNameToOutput);
+    }
+    
+    if(userParameters->getOutputClustal()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            clustalOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(clustalOutFile, clustalOutName))
+            { 
+                return false;
+            }
+        }
+        else 
+        {
+            clustalOutName = openOutputFile(clustalOutFile, 
+                             "\nEnter a name for the CLUSTAL output file ",
+                             _fileNameToOutput, "aln");
+                             
+            if(clustalOutName == "")
+            {
+                return false; // We have not been successful.
+            }
+        }
+    }
+
+    if(userParameters->getOutputNbrf()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            nbrfOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(nbrfOutFile, nbrfOutName))
+            { 
+                return false;
+            }            
+        }
+        else
+        {
+            nbrfOutName = openOutputFile(nbrfOutFile,
+                      "\nEnter a name for the NBRF/PIR output file", _fileNameToOutput,
+                       "pir");
+                      
+            if(nbrfOutName == "")
+            {
+                return false; // We have not been successful.
+            }
+        }
+    }
+
+    if(userParameters->getOutputGCG()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            gcgOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(gcgOutFile, gcgOutName))
+            { 
+                return false;
+            }   
+        }
+        else
+        {
+            gcgOutName = openOutputFile(gcgOutFile,
+                      "\nEnter a name for the GCG output file", _fileNameToOutput, "msf");
+                      
+            if(gcgOutName == "")
+            {
+                return false; // We have not been successful.
+            }
+        }
+    }
+
+    if(userParameters->getOutputPhylip()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            phylipOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(phylipOutFile, phylipOutName))
+            { 
+                return false;
+            }
+        }
+        else
+        {
+            phylipOutName = openOutputFile(phylipOutFile,
+                      "\nEnter a name for the PHYLIP output file", _fileNameToOutput, "phy");
+                      
+            if(phylipOutName == "")
+            {
+                return false; // We have not been successful.
+            }
+        }
+    }
+
+    if(userParameters->getOutputGde()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            gdeOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(gdeOutFile, gdeOutName))
+            { 
+                return false;
+            }
+        }
+        else
+        {
+            gdeOutName = openOutputFile(gdeOutFile, 
+                             "\nEnter a name for the GDE output file     ",
+                             _fileNameToOutput, "gde");
+                 
+            if(gdeOutName == "")
+            {
+                return false; // We have not been successful.
+            }                       
+        }
+    }
+
+    if(userParameters->getOutputNexus()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            nexusOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(nexusOutFile, nexusOutName))
+            { 
+                return false;
+            }
+        }
+        else
+        {
+            nexusOutName = openOutputFile(nexusOutFile, 
+                             "\nEnter a name for the NEXUS output file   ",
+                             _fileNameToOutput, "nxs");
+                 
+            if(nexusOutName == "")
+            {
+                return false; // We have not been successful.
+            }                       
+        }
+    }
+   
+    if(userParameters->getOutputFasta()) 
+    {
+        if (userParameters->getOutfileName() != "") 
+        {
+            fastaOutName = userParameters->getOutfileName();
+            if(!openExplicitFile(fastaOutFile, fastaOutName))
+            { 
+                return false;
+            }
+        }
+        else
+        {
+            fastaOutName = openOutputFile(fastaOutFile, 
+                             "\nEnter a name for the Fasta output file ",
+                             _fileNameToOutput, "fasta");
+                 
+            if(fastaOutName == "")
+            {
+                return false; // We have not been successful.
+            }
+        }
+    }
+  
+    return true;
+
+}
+
+
+/*
+ * The function openExplicitFile is used to open a file when we have the name already.
+ * It returns true if the file has been opened correctly, false otherwise.
+ */
+bool AlignmentOutput::openExplicitFile(auto_ptr<ofstream>& outFile, string fileName)
+{
+    if (fileName == "") 
+    {
+        cerr << "Bad output file [" << fileName << "]\n";
+        utilityObject->error("Bad output file [%s]\n", fileName.c_str());
+        return false;
+    }
+    
+    outFile.reset(new ofstream(fileName.c_str(), ofstream::trunc));
+    if(!outFile->is_open()) 
+    {
+        utilityObject->error("Cannot open output file [%s]\n", fileName.c_str());
+        return false;
+    }
+    return true;
+}
+
+/*
+ * The function openOutputFile is used to open a file when we dont have the name yet.
+ * This function returns the name if it has been successful. If it has not been 
+ * successful it returns a blank string ""
+ */
+string AlignmentOutput::openOutputFile(auto_ptr<ofstream>& outFile, string prompt, 
+                                       string path, string fileExtension)
+{
+    string temp;
+    string _fileName; // Will return this name.
+    string message;
+    _fileName = path + fileExtension;
+
+    if(_fileName.compare(userParameters->getSeqName()) == 0) 
+    {
+        cout << "Output file name is the same as input file.\n";
+        if (userParameters->getMenuFlag()) 
+        {
+            message = "\n\nEnter new name to avoid overwriting  [" + _fileName + "]";
+
+            utilityObject->getStr(message, temp);
+            if(temp != "")
+            {
+                _fileName = temp;
+            }
+        }
+    }
+    else if (userParameters->getMenuFlag()) 
+    {
+
+        message = prompt + " [" + _fileName + "]";
+        utilityObject->getStr(message, temp);
+        if(temp != "")
+        {
+            _fileName = temp;
+        }
+    }
+
+    outFile.reset(new ofstream(_fileName.c_str(), ofstream::trunc));
+    if(!outFile->is_open()) 
+    {
+        utilityObject->error("Cannot open output file [%s]\n", _fileName.c_str());
+        return "";
+    }    
+    return _fileName;
+}
+
+/*
+ * fastaOut: output the alignment in FASTA format
+ */
+void AlignmentOutput::fastaOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    char residue;
+    int val;
+    int i, ii;
+    int j, slen;    
+    int lineLength;
+    int firstRes = partToOutput._firstRes;
+    int lastRes = partToOutput._lastRes;
+    int firstSeq = partToOutput._firstSeq;
+    int lastSeq = partToOutput._lastSeq;
+    rangeNum rnum;  
+    cout << "firstres = " << firstRes << " lastres = " << lastRes << "\n";
+    try
+    {
+        const SeqArray* alignment = alignPtr->getSeqArray(); //NOTE june29
+        vector<char> sequence;
+        sequence.assign(lastRes + 1, '0');     
+    
+        lineLength = PAGEWIDTH - alignPtr->getMaxNames();
+                
+        lineLength = lineLength - lineLength % 10; // round to a multiple of 10
+        if (lineLength > LINELENGTH || lineLength <= 0) // Mark 18-7-07
+        {    
+            lineLength = LINELENGTH;
+        }
+
+
+        for(ii = firstSeq; ii <= lastSeq; ii++) 
+        {
+            i = alignPtr->getOutputIndex(ii - 1);
+            slen = 0;
+            //for(j = firstRes; j < firstRes + lastRes; j++) //- nige
+            for(j = firstRes; j <= lastRes; j++) //- nige
+            {
+                if (j <= alignPtr->getSeqLength(i))
+                {
+                    //val = alignPtr.getResidue(i, j);
+                    val = (*alignment)[i][j]; // NOTE june29
+                }
+                else
+                { 
+                    val = -3;
+                }
+                if((val == -3) || (val == 253))
+                {
+                    break;
+                }
+                else if((val < 0) || (val > userParameters->getMaxAA())) 
+                {
+                    residue = '-';
+                }
+                else 
+                {
+                    residue = userParameters->getAminoAcidCode(val);
+                }
+                if (userParameters->getLowercase())
+                {    
+                    sequence[j - firstRes] = residue;
+                }
+                else
+                {
+                    sequence[j - firstRes] = residue;
+                }
+                slen++;
+            }
+            (*fastaOutFile) << ">" << nameonly(alignPtr->getName(i));
+            if(userParameters->getSeqRange()) 
+            {
+                findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                (*fastaOutFile) << "/" << rnum.start << "-" << rnum.end;
+                
+            }
+            (*fastaOutFile) << "\n";
+            for(j = 1; j <= slen; j++) 
+            {
+                (*fastaOutFile) << sequence[j-1];
+                if((j % lineLength == 0) || (j == slen))
+                { 
+                    (*fastaOutFile) << "\n";
+                }
+            }
+        }
+        fastaOutFile->close();
+        cout << "FASTA file created!\n";
+    }
+    catch(const bad_alloc& e)
+    {
+        fastaOutFile->close();
+        cerr << "A bad_alloc exception has occured in the fastaOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        fastaOutFile->close();
+        cerr << "An exception has occured in the fastaOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        fastaOutFile->close();
+        cerr << "An exception has occured in the fastaOut function.\n";
+        exit(1);    
+    }
+
+}
+
+/* 
+ * gcgOut: output the alignment in gcg file format
+ */
+void AlignmentOutput::gcgOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    char residue;
+    int val;
+    int i, ii, chunks, block;
+    int j, k, pos1, pos2;    
+    long grandChecksum;
+    try
+    {  
+        int firstRes = partToOutput._firstRes;
+        int lastRes = partToOutput._lastRes;
+        int firstSeq = partToOutput._firstSeq;
+        int lastSeq = partToOutput._lastSeq;    
+        rangeNum rnum;
+        vector<char> sequence;
+        vector<int> allChecks;
+        int _maxLength = alignPtr->getMaxAlnLength();
+        sequence.assign(_maxLength + 1, '0');
+        allChecks.assign(lastSeq + 1, 0);
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        
+        for(i = firstSeq; i <= lastSeq; i++) 
+        {
+            //for(j = firstRes; j <= firstRes + lastRes - 1; j++) //- nige
+            for(j = firstRes; j <= lastRes; j++) //- nige
+            {
+                if (j <= alignPtr->getSeqLength(i))
+                {
+                    //val = alignPtr.getResidue(i, j);
+                    val = (*alignment)[i][j]; // NOTE june29
+                }
+                else
+                { 
+                    val = -3;
+                }
+                if((val == -3) || (val == 253)) 
+                {
+                    break;
+                }
+                else if((val < 0) || (val > userParameters->getMaxAA()))
+                {
+                    residue = '.';
+                }
+                else 
+                {
+                    residue = userParameters->getAminoAcidCode(val);
+                }
+                sequence[j - firstRes + 1] = residue;
+            }
+            // pad any short sequences with gaps, to make all sequences the same length 
+            for(; j <= firstRes + lastRes - 1; j++)
+            { 
+                sequence[j - firstRes + 1] = '.';
+            }
+            allChecks[i] = SeqGCGCheckSum(&sequence, lastRes);
+        }    
+        int _index;
+        grandChecksum = 0;
+        for(i = 1; i <= alignPtr->getNumSeqs(); i++)
+        {
+            _index = alignPtr->getOutputIndex(i - 1);
+            grandChecksum += allChecks[_index];
+        }
+        grandChecksum = grandChecksum % 10000;
+        
+        (*gcgOutFile) << "PileUp\n\n";
+        (*gcgOutFile) << "\n\n   MSF:" << setw(5) << lastRes << "  Type: ";
+                        
+        if(userParameters->getDNAFlag())
+        {
+            (*gcgOutFile) << "N";
+        }
+        else
+        {
+            (*gcgOutFile) << "P";
+        }
+
+        (*gcgOutFile) << "    Check:" << setw(6) << grandChecksum << "   .. \n\n";
+        float _seqWeight;
+
+        int length = lastRes - firstRes + 1; //- nige
+
+        for(ii = firstSeq; ii <= lastSeq; ii++)  
+        {
+            i = alignPtr->getOutputIndex(ii - 1);
+            _seqWeight = (alignPtr->getSeqWeight(i - 1) * 100) / (float) INT_SCALE_FACTOR;
+
+            (*gcgOutFile) << " Name: " << alignPtr->getName(i) << " oo  Len:"
+                        //<< setw(5) << lastRes << "  Check:" << setw(6) << allChecks[i]  //- nige
+                          << setw(5) << length << "  Check:" << setw(6) << allChecks[i] 
+                          << "  Weight:  " << fixed << setprecision(1) << _seqWeight << "\n";
+        }  
+        (*gcgOutFile) << "\n//\n";
+        
+        chunks = length / GCG_LINELENGTH; //- nige
+        if(length % GCG_LINELENGTH != 0)  //- nige
+        {
+            ++chunks;
+        }
+  
+        for(block = 1; block <= chunks; block++) 
+        {
+            (*gcgOutFile) << "\n\n";
+            pos1 = ((block - 1) * GCG_LINELENGTH) + 1;
+            pos2 = (length < pos1 + GCG_LINELENGTH - 1)? length : pos1 + GCG_LINELENGTH - 1;//- nige
+            
+            for(ii = firstSeq; ii <= lastSeq; ii++) 
+            {
+                i = alignPtr->getOutputIndex(ii - 1);
+                if (!userParameters->getSeqRange()) 
+                {
+                    (*gcgOutFile) << "\n" << setw(alignPtr->getMaxNames() + 5) << left
+                                  << alignPtr->getName(i) << " ";
+                }
+                else 
+                {
+                    findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                    std::stringstream ss;
+                    std::stringstream ss2;
+                    string rangeStart;
+                    string rangeEnd;
+                    ss << rnum.start;
+                    ss >> rangeStart;
+                    ss2 << rnum.end;
+                    ss2 >> rangeEnd;
+                    string nameAndRange = nameonly(alignPtr->getName(i)) + "/" + rangeStart;
+                    nameAndRange += "-" + rangeEnd;
+                    (*gcgOutFile) << "\n" << setw(alignPtr->getMaxNames() + 15) << left
+                                  << nameAndRange;
+                }
+                for(j = pos1, k = 1; j <= pos2; j++, k++) 
+                {
+            
+                    //JULIE -
+                    //check for int sequences - pad out with '.' characters to end 
+            
+                    if (j + firstRes - 1 <= alignPtr->getSeqLength(i))
+                    {
+                        //val = alignPtr.getResidue(i, j + firstRes - 1);
+                        val = (*alignment)[i][j + firstRes - 1]; // NOTE june29
+                    }
+                    else
+                    {
+                        val = -3;
+                    }
+                    if((val == -3) || (val == 253))
+                    {
+                        residue = '.';
+                    }
+                    else if((val < 0) || (val > userParameters->getMaxAA()))
+                    {
+                        residue = '.';
+                    }
+                    else 
+                    {
+                        residue = userParameters->getAminoAcidCode(val);
+                    }
+                    (*gcgOutFile) << residue;
+                    if(j % 10 == 0)
+                    { 
+                        (*gcgOutFile) << " ";
+                    }
+                }
+            }
+        }
+        (*gcgOutFile) << "\n\n";
+        gcgOutFile->close();   
+    }
+    catch(const bad_alloc& e)
+    {
+        gcgOutFile->close();
+        cerr << "A bad_alloc exception has occured in the gcgOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        gcgOutFile->close();
+        cerr << "An exception has occured in the gcgOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        gcgOutFile->close();
+        cerr << "An exception has occured in the gcgOut function.\n";
+        exit(1);    
+    }    
+}
+
+void AlignmentOutput::phylipOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    int firstRes = partToOutput._firstRes;
+    int lastRes = partToOutput._lastRes;
+    int firstSeq = partToOutput._firstSeq;
+    int lastSeq = partToOutput._lastSeq;    
+    try
+    {
+        char residue;
+        int val;
+        int i, ii, chunks, block;    
+        int j, k, pos1, pos2;    
+        int nameLen;
+        bool warn;
+        vector<string> _seqNames;
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        rangeNum rnum;
+
+        // Push on a blank string. This is because the index starts at 1 for the seqs etc..
+        _seqNames.push_back("");
+
+        nameLen = 0;
+    
+        for(i = firstSeq; i <= lastSeq; i++)  
+        {
+            _seqNames.push_back(alignPtr->getName(i));
+            ii = _seqNames.size();
+            if(nameLen < ii) 
+            {
+                nameLen = ii;
+            }
+        }
+        if(nameLen > 10) 
+        {
+            warn = false;
+            for(i = 0; i < (int)_seqNames.size() - 1; i++)  
+            {
+                for(j = i + 1; j < (int)_seqNames.size(); j++) 
+                {
+                    if (_seqNames[i].compare(_seqNames[j]) == 0) 
+                    {
+                        warn = true;
+                    }
+                }
+            }
+            if(warn)
+            {
+                utilityObject->warning("Truncating sequence names to 10 characters for PHYLIP output.\nNames in the PHYLIP format file are NOT unambiguous.");
+            }
+            else
+            {
+                utilityObject->warning("Truncating sequence names to 10 characters for PHYLIP output.");
+            }
+        }
+  
+        int length = lastRes - firstRes + 1; //- nige
+
+        chunks = length / GCG_LINELENGTH; //- nige
+        if(length % GCG_LINELENGTH != 0)  //- nige
+        {
+            ++chunks;
+        }
+  
+        (*phylipOutFile) << setw(6) << alignPtr->getNumSeqs() << " "
+                         << setw(6) << length; //-nige
+        
+        for(block = 1; block <= chunks; block++) 
+        {
+            pos1 = ((block - 1) * GCG_LINELENGTH) + 1;
+            //pos2 = (lastRes < pos1 + GCG_LINELENGTH - 1)? lastRes : pos1 + GCG_LINELENGTH - 1; //- nige
+            pos2 = (length < pos1 + GCG_LINELENGTH - 1)? length : pos1 + GCG_LINELENGTH - 1;
+            for(ii = firstSeq; ii <= lastSeq; ii++)  
+            {
+                i = alignPtr->getOutputIndex(ii - 1);
+                if(block == 1)  
+                {
+                    if(!userParameters->getSeqRange()) 
+                    {
+                        string name = alignPtr->getName(i);
+                        (*phylipOutFile) << "\n" << setw(10) << left 
+                                             << name.substr(0,10) << " ";
+                    }
+                    else
+                    {
+                        findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                        std::stringstream ss;
+                        std::stringstream ss2;
+                        string rangeStart;
+                        string rangeEnd;
+                        ss << rnum.start;
+                        ss >> rangeStart;
+                        ss2 << rnum.end;
+                        ss2 >> rangeEnd;
+                        string nameAndRange = nameonly(alignPtr->getName(i)) + "/";
+                        nameAndRange += rangeStart + "-" + rangeEnd;
+                        (*phylipOutFile) << "\n" << setw(alignPtr->getMaxNames() + 15)
+                                         << left
+                                         << nameAndRange;
+                    }
+                }
+                else
+                {
+                    (*phylipOutFile) << "\n           ";
+                }
+                for(j = pos1, k = 1; j <= pos2; j++, k++) 
+                {
+                    if (j + firstRes - 1 <= alignPtr->getSeqLength(i))
+                    {
+                        //val = alignPtr.getResidue(i, j + firstRes - 1);
+                        val = (*alignment)[i][j + firstRes - 1]; // NOTE june29
+                    }
+                    else
+                    {
+                        val = -3;
+                    }
+                    if((val == -3) || (val == 253))
+                    {
+                        break;
+                    }
+                    else if((val < 0) || (val > userParameters->getMaxAA()))
+                    {
+                        residue = '-';
+                    }
+                    else 
+                    {
+                        residue = userParameters->getAminoAcidCode(val);
+                    }
+                    (*phylipOutFile) << residue;
+                    if(j % 10 == 0) 
+                    {
+                        (*phylipOutFile) << " ";
+                    }
+                }
+            }
+            (*phylipOutFile) << "\n";
+        }  
+    }
+    catch(const bad_alloc& e)
+    {
+        phylipOutFile->close();
+        cerr << "A bad_alloc exception has occured in the phylipOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        phylipOutFile->close();
+        cerr << "An exception has occured in the phylipOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        phylipOutFile->close();
+        cerr << "An exception has occured in the phylipOut function.\n";
+        exit(1);    
+    }      
+}
+
+void AlignmentOutput::nexusOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    int firstRes = partToOutput._firstRes;
+    int lastRes = partToOutput._lastRes;
+    int firstSeq = partToOutput._firstSeq;
+    int lastSeq = partToOutput._lastSeq;    
+    try
+    {
+        char residue;
+        int val;
+        int i, ii, chunks, block;    
+        int j, k, pos1, pos2;    
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        rangeNum rnum;
+
+        int length = lastRes - firstRes + 1; //- nige
+
+        chunks = length / GCG_LINELENGTH; //- nige
+        if(length % GCG_LINELENGTH != 0) //- nige
+        {
+            ++chunks;
+        }
+  
+        (*nexusOutFile) << "#NEXUS\n";
+        (*nexusOutFile) << "BEGIN DATA;\n";
+        (*nexusOutFile) << "dimensions ntax=" << alignPtr->getNumSeqs() 
+                        << " nchar=" << length << ";\n"; //- nige
+        (*nexusOutFile) << "format missing=?\n";
+        (*nexusOutFile) << "symbols=\"";
+        
+        for(i = 0; i <= userParameters->getMaxAA(); i++)
+        {
+            (*nexusOutFile) << userParameters->getAminoAcidCode(i);
+        }
+        (*nexusOutFile) << "\"\n";
+        (*nexusOutFile) << "interleave datatype=";
+        bool _dnaFlag = userParameters->getDNAFlag();
+        string _type = _dnaFlag ? "DNA " : "PROTEIN ";
+        (*nexusOutFile) << _type;
+        (*nexusOutFile) << "gap= -;\n";
+        (*nexusOutFile) << "\nmatrix";
+  
+        for(block = 1; block <= chunks; block++) 
+        {
+            pos1 = ((block - 1) * GCG_LINELENGTH) + 1;
+            pos2 = (length < pos1 + GCG_LINELENGTH - 1)? length : pos1 + GCG_LINELENGTH - 1; //- nige
+            for(ii = firstSeq; ii <= lastSeq; ii++)  
+            {
+                i = alignPtr->getOutputIndex(ii - 1);
+                if (!userParameters->getSeqRange()) 
+                {
+                    (*nexusOutFile) << "\n" << setw(alignPtr->getMaxNames() + 1) << left
+                                    << alignPtr->getName(i) << " ";
+                }
+                else 
+                {
+                    findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                    
+                    std::stringstream ss;
+                    std::stringstream ss2;
+                    string rangeStart;
+                    string rangeEnd;
+                    ss << rnum.start;
+                    ss >> rangeStart;
+                    ss2 << rnum.end;
+                    ss2 >> rangeEnd;
+                    string nameAndRange = nameonly(alignPtr->getName(i)) + "/";
+                    nameAndRange += rangeStart + "-" + rangeEnd;
+                    (*nexusOutFile) << "\n" << setw(alignPtr->getMaxNames() + 15)
+                                    << left
+                                    << nameAndRange;                    
+                }
+                for(j = pos1, k = 1; j <= pos2; j++, k++) 
+                {
+                    if (j + firstRes - 1 <= alignPtr->getSeqLength(i))
+                    {
+                        //val = alignPtr.getResidue(i, j + firstRes - 1);
+                        val = (*alignment)[i][j + firstRes - 1]; // NOTE june29
+                    }
+                    else
+                    {
+                        val = -3;
+                    }
+                    if((val == -3) || (val == 253))
+                    {
+                        break;
+                    }
+                    else if((val < 0) || (val > userParameters->getMaxAA()))
+                    {
+                        residue = '-';
+                    }
+                    else 
+                    {
+                        residue = userParameters->getAminoAcidCode(val);
+                    }
+                    (*nexusOutFile) << residue;
+                }
+            }
+            (*nexusOutFile) << "\n";
+        }
+        (*nexusOutFile) << ";\nend;\n";   
+    }
+    catch(const bad_alloc& e)
+    {
+        nexusOutFile->close();
+        cerr << "A bad_alloc exception has occured in the nexusOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        nexusOutFile->close();
+        cerr << "An exception has occured in the nexusOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        nexusOutFile->close();
+        cerr << "An exception has occured in the nexusOut function.\n";
+        exit(1);    
+    }      
+}
+
+/*
+ * gdeOut: print out the alignment in gde file format.
+ */
+void AlignmentOutput::gdeOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    int firstRes = partToOutput._firstRes;
+    int lastRes = partToOutput._lastRes;
+    int firstSeq = partToOutput._firstSeq;
+    int lastSeq = partToOutput._lastSeq;    
+
+    int length = lastRes - firstRes + 1; //- nige
+
+    try
+    {
+        char residue;
+        int val;
+        vector<char> _ssMask1, _ssMask2, seq;
+        int i, ii;
+        int j, slen;    
+        int lineLength;
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        rangeNum rnum;
+
+        seq.assign(alignPtr->getMaxAlnLength() + 1, '0');
+        
+        // decide the line length for this alignment - maximum is LINELENGTH 
+        lineLength = PAGEWIDTH - alignPtr->getMaxNames();
+        lineLength = lineLength - lineLength % 10; // round to a multiple of 10
+        if (lineLength > LINELENGTH || lineLength <= 0) 
+        {
+            lineLength = LINELENGTH;
+        }
+  
+        // If we are using the secondary structure info from profile 1, set it up
+        if (userParameters->getStructPenalties1() == SECST && 
+            userParameters->getUseSS1() == true) 
+        {
+            int _lengthSeq1 = alignPtr->getSeqLength(1);
+            vector<char>* _secStructMask1 = alignPtr->getSecStructMask1();
+            _ssMask1.assign(_lengthSeq1 + 10, 0);
+            
+            for (i = 0;i < _lengthSeq1;i++)
+            {
+                _ssMask1[i] = _secStructMask1->at(i);
+            }
+            printSecStructMask(_lengthSeq1, _secStructMask1, &_ssMask1);
+        }
+        
+        // If we are using the secondary structure info from profile 2, set it up
+        if (userParameters->getStructPenalties2() == SECST && 
+            userParameters->getUseSS2() == true) 
+        {
+            int indexProfile2FirstSeq = alignPtr->getProfile1NumSeqs() + 1;
+            int lengthSeqProfile2 = alignPtr->getSeqLength(indexProfile2FirstSeq);
+            _ssMask2.assign(lengthSeqProfile2 + 10, 0);
+            vector<char>* _secStructMask2 = alignPtr->getSecStructMask2();
+            
+            for (i=0;i < lengthSeqProfile2;i++)
+            {
+                _ssMask2[i] = _secStructMask2->at(i);
+            }
+            printSecStructMask(lengthSeqProfile2, _secStructMask2, &_ssMask2);  
+        }
+
+        bool _dnaFlag = userParameters->getDNAFlag();
+        string _prefix = _dnaFlag ? "#" : "%";
+        
+        for(ii = firstSeq; ii <= lastSeq; ii++) 
+        {
+            i = alignPtr->getOutputIndex(ii - 1);
+            
+            (*gdeOutFile) << _prefix;
+            if(!userParameters->getSeqRange()) 
+            {
+                (*gdeOutFile) << alignPtr->getName(i) << "\n";
+            }
+            else 
+            {
+                findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                (*gdeOutFile) << nameonly(alignPtr->getName(i)) << "/"
+                              << rnum.start << "-" << rnum.end << "\n";
+            }
+            slen = 0;
+
+            //for(j = firstRes; j < firstRes + lastRes; j++) //- nige
+            for(j = firstRes; j <= lastRes; j++) //- nige
+            {
+                if (j <= alignPtr->getSeqLength(i))
+                {
+                    //val = alignPtr.getResidue(i, j);
+                    val = (*alignment)[i][j]; // NOTE june29
+                }
+                else
+                { 
+                    val = -3;
+                }
+                if((val == -3) || (val == 253))
+                {
+                    break;
+                }
+                else if((val < 0) || (val > userParameters->getMaxAA()))
+                {
+                    residue = '-';
+                }
+                else 
+                {
+                    residue = userParameters->getAminoAcidCode(val);
+                }
+                if (userParameters->getLowercase())
+                {
+                    seq[j - firstRes] = (char)tolower((int)residue);
+                }
+                else
+                {
+                    seq[j - firstRes] = residue;
+                }
+                slen++;
+            }
+            for(j = 1; j <= slen; j++) 
+            {
+                (*gdeOutFile) << seq[j-1];
+                if((j % lineLength == 0) || (j == slen)) 
+                {
+                    (*gdeOutFile) << "\n";
+                }
+            }
+        }
+  
+        if (userParameters->getOutputStructPenalties() == 0 || 
+            userParameters->getOutputStructPenalties() == 2) 
+        {
+            if (userParameters->getStructPenalties1() == SECST && 
+                userParameters->getUseSS1() == true) 
+            {
+                (*gdeOutFile) << "\"SS_" << setw(alignPtr->getMaxNames()) << left
+                              << alignPtr->getSecStructName1() << "\n";
+                              
+                //for(i = firstRes; i < firstRes + lastRes; i++) //- nige
+                for(i = firstRes; i <= lastRes; i++) //- nige
+                {
+                    val = _ssMask1[i - 1];
+                    if (val == userParameters->getGapPos1() || 
+                        val == userParameters->getGapPos2())
+                    {
+                        seq[i - firstRes] = '-';
+                    }
+                    else
+                    {
+                        seq[i - firstRes] = val;
+                    }
+                }
+
+                for(i = 1; i <= lastRes; i++) 
+                {
+                    (*gdeOutFile) << seq[i-1];
+                    if((i % lineLength == 0) || (i == lastRes)) 
+                    {
+                        (*gdeOutFile) << "\n";
+                    }
+                }
+            }
+    
+            if (userParameters->getStructPenalties2() == SECST && 
+                userParameters->getUseSS2() == true) 
+            {
+                (*gdeOutFile) << "\"SS_" << setw(alignPtr->getMaxNames()) << left
+                              << alignPtr->getSecStructName2() << "\n";
+                                              
+                //for(i = firstRes; i < firstRes + lastRes; i++) //- nige
+                for(i = firstRes; i <= lastRes; i++) //- nige
+                {
+                    val = _ssMask2[i - 1];
+                    if (val == userParameters->getGapPos1() || 
+                        val == userParameters->getGapPos2())
+                    {
+                        seq[i - firstRes] = '-';
+                    }
+                    else
+                    {
+                        seq[i - firstRes] = val;
+                    }
+                }
+
+                //for(i = 1; i <= lastRes; i++) //- nige
+                for(i = 1; i <= length; i++) //- nige
+                {
+                    (*gdeOutFile) << seq[i - 1];
+                    //if((i % lineLength == 0) || (i == lastRes)) //- nige
+                    if((i % lineLength == 0) || (i == length)) //- nige
+                    {
+                        (*gdeOutFile) << "\n";
+                    }
+                }
+            }
+        }
+        if (userParameters->getOutputStructPenalties() == 1 || 
+            userParameters->getOutputStructPenalties() == 2) 
+        {
+            if (userParameters->getStructPenalties1() != NONE && 
+                userParameters->getUseSS1() == true) 
+            {
+                (*gdeOutFile) << "\"GM_" << setw(alignPtr->getMaxNames()) << left
+                              << alignPtr->getSecStructName1() << "\n";
+                
+                vector<char>* _gapPenaltyMask1 = alignPtr->getGapPenaltyMask1();          
+                //for(i = firstRes; i < firstRes + lastRes; i++) //- nige
+                for(i = firstRes; i <= lastRes; i++) //- nige
+                {
+                    val = _gapPenaltyMask1->at(i - 1);
+                    if (val == userParameters->getGapPos1() || 
+                        val == userParameters->getGapPos2())
+                    {
+                        seq[i - firstRes] = '-';
+                    }
+                    else
+                    {
+                        seq[i - firstRes] = val;
+                    }
+                }
+
+                //for(i = 1; i <= lastRes; i++) //- nige
+                for(i = 1; i <= length; i++) //- nige
+                {
+                    (*gdeOutFile) << seq[i - 1];
+                    //if((i % lineLength == 0) || (i == lastRes)) //- nige
+                    if((i % lineLength == 0) || (i == length)) //- nige
+                    {
+                        (*gdeOutFile) << "\n";
+                    }
+                }
+            }
+            if (userParameters->getStructPenalties2() != NONE && 
+                userParameters->getUseSS2() == true) 
+            {
+                (*gdeOutFile) << "\"GM_" << setw(alignPtr->getMaxNames()) << left
+                              << alignPtr->getSecStructName2() << "\n";
+                
+                vector<char>* _gapPenaltyMask2 = alignPtr->getGapPenaltyMask2();    
+                //for(i = firstRes; i < firstRes + lastRes; i++) //- nige
+                for(i = firstRes; i < length; i++) //- nige
+                {
+                    val = _gapPenaltyMask2->at(i-1);
+                    if (val == userParameters->getGapPos1() || 
+                        val == userParameters->getGapPos2())
+                    {
+                        seq[i - firstRes] = '-';
+                    }
+                    else
+                    {
+                        seq[i - firstRes] = val;
+                    }
+                }
+
+                //for(i = 1; i <= lastRes; i++) //- nige
+                for(i = 1; i <= length; i++) //- nige
+                {
+                    (*gdeOutFile) << seq[i - 1];
+                    //if((i % lineLength == 0) || (i == lastRes)) //- nige
+                    if((i % lineLength == 0) || (i == length)) //- nige
+                    {
+                        (*gdeOutFile) << "\n";
+                    }
+                }
+            }
+        }
+        gdeOutFile->close();   
+    }
+    catch(const bad_alloc& e)
+    {
+        gdeOutFile->close();
+        cerr << "A bad_alloc exception has occured in the gdeOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        gdeOutFile->close();
+        cerr << "An exception has occured in the gdeOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        gdeOutFile->close();
+        cerr << "An exception has occured in the gdeOut function.\n";
+        exit(1);    
+    }     
+}
+
+void AlignmentOutput::nbrfOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    char residue;
+    int val;
+    int i, ii;
+    int j, slen;    
+    int lineLength;
+    rangeNum rnum;
+    int firstRes = partToOutput._firstRes;
+    int lastRes = partToOutput._lastRes;
+    int firstSeq = partToOutput._firstSeq;
+    int lastSeq = partToOutput._lastSeq;
+            
+    try
+    {
+        int _maxLength = alignPtr->getMaxAlnLength();
+        vector<char> sequence;
+        sequence.assign(_maxLength + 1, '0');
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        // decide the line length for this alignment - maximum is LINELENGTH 
+        lineLength = PAGEWIDTH - alignPtr->getMaxNames();
+        lineLength = lineLength - lineLength % 10; // round to a multiple of 10
+        if (lineLength > LINELENGTH || lineLength <= 0) // Mark, 18-7-07
+        {
+            lineLength = LINELENGTH;
+        }
+        
+        // Get name prefix. DL if DNA, P1 if protein
+        string namePrefix;
+        bool _dnaFlag = userParameters->getDNAFlag();
+        namePrefix = _dnaFlag ? ">DL;" : ">P1;";
+        
+        //int length = lastRes - firstRes + 1; //- nige
+
+        for(ii = firstSeq; ii <= lastSeq; ii++) 
+        {
+            i = alignPtr->getOutputIndex(ii - 1);
+            
+            (*nbrfOutFile) << namePrefix;
+            
+            if (!userParameters->getSeqRange()) 
+            {
+                (*nbrfOutFile) << alignPtr->getName(i) << "\n"
+                               << alignPtr->getTitle(i) << "\n";
+            }
+            else 
+            {
+                findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                (*nbrfOutFile) << nameonly(alignPtr->getName(i)) << "/" << rnum.start
+                               << "-"<< rnum.end << "\n"
+                               << alignPtr->getTitle(i) << "\n";
+            }
+            slen = 0;
+            //for(j = firstRes; j < firstRes + lastRes; j++) //- nige
+            for(j = firstRes; j <= lastRes; j++) //- nige
+            {
+                // NOTE I changed this here!!!!!
+                if (j <= alignPtr->getSeqLength(i))
+                {
+                    //val = alignPtr.getResidue(i, j);
+                    val = (*alignment)[i][j]; // NOTE june29
+                }
+                else
+                { 
+                    val = -3;
+                }
+                if((val == -3) || (val == 253))
+                {
+                    break;
+                }
+                else if((val < 0) || (val > userParameters->getMaxAA()))
+                {
+                    residue = '-';
+                }
+                else 
+                {
+                    residue = userParameters->getAminoAcidCode(val);
+                }
+                sequence[j - firstRes] = residue;
+                slen++;
+            }
+            for(j = 1; j <= slen; j++) 
+            {
+                (*nbrfOutFile) << sequence[j - 1];
+                if((j % lineLength == 0) || (j == slen))
+                { 
+                    (*nbrfOutFile) << "\n";
+                }
+            }
+            (*nbrfOutFile) << "*\n";
+        }    
+        nbrfOutFile->close();
+    }
+    catch(const bad_alloc& e)
+    {
+        nbrfOutFile->close();
+        cerr << "A bad_alloc exception has occured in the nbrfOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        nbrfOutFile->close();
+        cerr << "An exception has occured in the nbrfOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        nbrfOutFile->close();
+        cerr << "An exception has occured in the nbrfOut function.\n";
+        exit(1);    
+    }    
+}
+
+/* 
+ * The function clustalOut is used to ouput the Alignment into a clustal format
+ * file.
+ */
+void AlignmentOutput::clustalOut(Alignment* alignPtr, outputRegion partToOutput)
+{
+    int firstRes = partToOutput._firstRes;
+    int lastRes = partToOutput._lastRes;
+    int firstSeq = partToOutput._firstSeq;
+    int lastSeq = partToOutput._lastSeq;
+        
+    try
+    {
+        vector<char> seq1;    
+        vector<int> seqNo;
+        vector<int> printSeqNo;    
+        vector<char> ss_mask1, ss_mask2;
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        char  temp[MAXLINE];
+        char c;
+        int val;
+        int ii, lv1, catident1[NUMRES], catident2[NUMRES], ident, chunks;
+        int i, j, k, l;
+        int pos, ptr;
+        int lineLength;
+
+        rangeNum rnum;
+        string tmpStr = "";
+        string sequenceLine = "";
+
+
+        int _numSequences = alignPtr->getNumSeqs();
+        // PMcG revert to Clustalw1.83 output format for name width
+        const int NAMESWIDTH=std::max(std::min(MAXNAMESTODISPLAY,alignPtr->getMaxNames()) , MINNAMESTODISPLAY); 
+
+        seqNo.assign(_numSequences + 1, 0);
+        printSeqNo.assign(_numSequences + 1, 0);
+    
+        // check that lastSeq <= _numSequences
+        if(lastSeq > _numSequences)
+        {
+            lastSeq = _numSequences;
+        }
+    
+        for (i = firstSeq; i <= lastSeq; i++)
+        {
+            printSeqNo[i] = seqNo[i] = 0;
+            for(j = 1; j < firstRes; j++) 
+            {
+                //val = alignPtr.getResidue(i, j);
+                val = (*alignment)[i][j]; // NOTE june29
+                if((val >= 0) || (val <= userParameters->getMaxAA()))
+                { 
+                    seqNo[i]++;
+                }
+            }
+        }
+
+        seq1.assign(alignPtr->getMaxAlnLength() + 1, 0);
+        // Check if we have secondary structure in file 1 and if we want to output it.
+        if (userParameters->getStructPenalties1() == SECST && 
+            userParameters->getUseSS1() == true) 
+        {
+            int lengthSeq1 = alignPtr->getSeqLength(1);
+            ss_mask1.assign(lengthSeq1 + 10, 0);
+            vector<char>* _secStructMask1 = alignPtr->getSecStructMask1();
+        
+            for (i = 0; i < lengthSeq1; i++)
+            {
+                ss_mask1[i] = _secStructMask1->at(i);
+            }
+            printSecStructMask(lengthSeq1, _secStructMask1, &ss_mask1);
+          
+        }
+        
+        // Check if we have secondary structure in file 2 and if we want to output it.
+        if (userParameters->getStructPenalties2() == SECST && 
+            userParameters->getUseSS2() == true &&
+            userParameters->getProfile2Empty() == false)
+        {
+            // AW added test getProfile2Empty was meant to fix bug
+            // 141, but only prevents segfault, output still faulty.
+            // Has to be fixed somewhere else
+            int indexProfile2FirstSeq = alignPtr->getProfile1NumSeqs() + 1;
+            int lengthSeqProfile2 = alignPtr->getSeqLength(indexProfile2FirstSeq);
+            ss_mask2.assign(lengthSeqProfile2 + 10, 0);
+            vector<char>* _secStructMask2 = alignPtr->getSecStructMask2();
+            for (i = 0; i < lengthSeqProfile2; i++)
+            {
+                ss_mask2[i] = _secStructMask2->at(i);
+            }
+            printSecStructMask(lengthSeqProfile2, _secStructMask2, &ss_mask2);
+        }
+    
+        (*clustalOutFile) << "CLUSTAL "<< userParameters->getRevisionLevel() 
+                          << " multiple sequence alignment\n\n";
+    
+        // decide the line length for this alignment - maximum is LINELENGTH
+
+        //PMcG  9-2-2008 make line output same as 1.83
+        //lineLength = PAGEWIDTH - alignPtr->getMaxNames();
+        lineLength = PAGEWIDTH - NAMESWIDTH;
+        lineLength = lineLength - lineLength % 10; // round to a multiple of 10
+        if (lineLength > LINELENGTH || lineLength <= 0) // Mark 18-7-07
+        { 
+            lineLength = LINELENGTH;
+        }
+    
+        int length = lastRes - firstRes + 1; //- nige
+
+        chunks = length / lineLength; //- nige
+        if(length % lineLength != 0) //- nige
+        {
+          ++chunks;
+        }
+        //printf("firstRes=%d,lastRes=%d,length=%d,chunks=%d\n",
+        //       firstRes, lastRes, length, chunks);
+
+        // This will loop through each of the blocks.
+        for(lv1 = 1; lv1 <= chunks; ++lv1) 
+        {
+            // pos is begining of chunk, ptr is the end of the chunk to be displayed.
+            pos = ((lv1 - 1) * lineLength) + 1; 
+            ptr = (length < pos + lineLength - 1) ? length : pos + lineLength - 1; //- nige
+   
+            (*clustalOutFile) << "\n";
+            int _outStructPenalty = userParameters->getOutputStructPenalties();
+            
+            string secStructName1 = alignPtr->getSecStructName1(); // Mark 18-7-07
+            
+            if((int)secStructName1.size() > MAXNAMESTODISPLAY)
+            {
+                //secStructName1 = secStructName1.substr(0, MAXNAMESTODISPLAY);
+                secStructName1 = secStructName1.substr(0, NAMESWIDTH);
+            }            
+            if (_outStructPenalty == 0 || _outStructPenalty == 2) 
+            {
+                if (userParameters->getStructPenalties1() == SECST && 
+                    userParameters->getUseSS1() == true) 
+                {
+                    for(i = pos; i <= ptr; ++i) 
+                    {
+                        // Check if we can access mask position first
+                        if((int)ss_mask1.size() > i + firstRes - 2)  
+                        {
+                            val = ss_mask1[i + firstRes - 2]; 
+                            if (val == userParameters->getGapPos1() || 
+                                val == userParameters->getGapPos2())
+                            {
+                                temp[i - pos] = '-';
+                            }
+                            else
+                            {
+                                temp[i - pos] = val;
+                            }
+                        }
+                        else
+                        {
+                            break;
+                        }
+                    }
+                    temp[i - pos] = EOS;  
+                                      
+                    if(userParameters->getSeqRange())
+                    {
+                        //(*clustalOutFile) << "!SS_" << setw(MAXNAMESTODISPLAY +
+                        (*clustalOutFile) << "!SS_" << setw(NAMESWIDTH +
+                                                            clusSecStructOffset)
+                                          << left << secStructName1 
+                                          << "  " << temp << "\n";
+                    }
+                    else
+                    {
+                        //(*clustalOutFile) << "!SS_" << setw(MAXNAMESTODISPLAY)
+                        (*clustalOutFile) << "!SS_" << setw(NAMESWIDTH)
+                                          << left << secStructName1 << "  " 
+                                          << temp << "\n";
+                    }
+                }
+            }
+            if (_outStructPenalty == 1 || _outStructPenalty == 2) 
+            {
+                if (userParameters->getStructPenalties1() != NONE && 
+                    userParameters->getUseSS1() == true) 
+                {
+                    vector<char>* _gapPenaltyMask1 = alignPtr->getGapPenaltyMask1();       
+                    for(i = pos; i <= ptr; ++i) 
+                    {
+                        if((int)_gapPenaltyMask1->size() > i + firstRes - 2) 
+                        {
+                            val = _gapPenaltyMask1->at(i + firstRes - 2); 
+                            if (val == userParameters->getGapPos1() || 
+                                val == userParameters->getGapPos2())
+                            {
+                                temp[i - pos] = '-';
+                            }
+                            else
+                            {
+                                temp[i - pos] = val;
+                            }
+                        }
+                        else
+                        {
+                            break;
+                        }
+                    }
+                    temp[i - pos] = EOS;
+                    
+                    //(*clustalOutFile) << "!GM_" << setw(MAXNAMESTODISPLAY) << left
+                    (*clustalOutFile) << "!GM_" << setw(NAMESWIDTH) << left
+                                      << secStructName1 << "  "
+                                      << temp << "\n";
+                }
+            }
+            
+            
+            string secStructName2 = alignPtr->getSecStructName2(); // Mark 18-7-07
+            //if((int)secStructName2.size() > MAXNAMESTODISPLAY)
+            if((int)secStructName2.size() > NAMESWIDTH)
+            {
+                //secStructName2 = secStructName2.substr(0, MAXNAMESTODISPLAY);
+                secStructName2 = secStructName2.substr(0, NAMESWIDTH);
+            }
+                                
+            if (_outStructPenalty == 0 || _outStructPenalty == 2) 
+            {
+                if (userParameters->getStructPenalties2() == SECST && 
+                    userParameters->getUseSS2() == true) 
+                {
+                    for(i = pos; i <= ptr; ++i) 
+                    {
+                        if((int)ss_mask2.size() > i + firstRes - 2)
+                        {
+                            val = ss_mask2[i + firstRes - 2]; 
+                            if (val == userParameters->getGapPos1() || 
+                                val == userParameters->getGapPos2())
+                            {
+                                temp[i - pos] = '-';
+                            }
+                            else
+                            {
+                                temp[i - pos] = val;
+                            }
+                        }
+                        else
+                        {
+                            break;
+                        }
+                    }
+                    temp[i - pos] = EOS;
+                    
+                                        
+                    if (userParameters->getSeqRange())
+                    {
+                        //(*clustalOutFile) << "!SS_" << setw(MAXNAMESTODISPLAY +
+                        (*clustalOutFile) << "!SS_" << setw(NAMESWIDTH +
+                                                            clusSecStructOffset)
+                                          << left << secStructName2; 
+                        (*clustalOutFile) << "  " << temp << "\n";
+                    }
+                    else
+                    {
+                        //(*clustalOutFile) << "!SS_" << setw(MAXNAMESTODISPLAY)
+                        (*clustalOutFile) << "!SS_" << setw(NAMESWIDTH)
+                                          << left << secStructName2 << "  " 
+                                          << temp << "\n";
+                    }
+                }
+            }
+            
+            if (_outStructPenalty == 1 || _outStructPenalty == 2) 
+            {
+                if (userParameters->getStructPenalties2() != NONE && 
+                    userParameters->getUseSS2() == true) 
+                {
+                    vector<char>* _gapPenaltyMask2 = alignPtr->getGapPenaltyMask2();
+                    for(i = pos; i <= ptr; ++i) 
+                    {
+                        if((int)_gapPenaltyMask2->size() > i + firstRes - 2)
+                        {
+                            val = _gapPenaltyMask2->at(i + firstRes - 2); 
+                            if (val == userParameters->getGapPos1() || 
+                                val == userParameters->getGapPos2())
+                            {
+                                temp[i - pos] = '-';
+                            }
+                            else
+                            {
+                                temp[i - pos] = val;
+                            }
+                        }
+                        else
+                        {
+                            break;
+                        }
+                    }
+                    temp[i - pos] = EOS;
+                    
+                    //(*clustalOutFile) << "!GM_" << setw(MAXNAMESTODISPLAY) << left
+                    (*clustalOutFile) << "!GM_" << setw(NAMESWIDTH) << left
+                                      << secStructName2 << "  "
+                                      << temp << "\n";
+                }
+            }
+        
+            for(ii = firstSeq; ii <= lastSeq; ++ii) 
+            {
+                i = alignPtr->getOutputIndex(ii - 1); 
+                printSeqNo[i] = 0;
+                for(j = pos; j <= ptr; ++j) 
+                {
+                    if (j + firstRes - 1 <= alignPtr->getSeqLength(i))
+                    {
+                        //val = alignPtr.getResidue(i, j + firstRes - 1);
+                        val = (*alignment)[i][j + firstRes - 1]; // NOTE june29
+                    }
+                    else
+                    { 
+                        val = -3;
+                    }
+                    if((val == -3) || (val == 253)) 
+                    {
+                        break;
+                    }
+                    else if((val < 0) || (val > userParameters->getMaxAA()))
+                    {
+                        seq1[j] = '-';
+                    }
+                    else 
+                    {
+                        seq1[j] = userParameters->getAminoAcidCode(val);
+                        seqNo[i]++;
+                        printSeqNo[i] = 1;
+                    } 
+                }
+                for(; j <= ptr; ++j) 
+                {
+                    seq1[j]='-';
+                }
+            
+                sequenceLine = "";
+
+                for(int index = pos; index < ptr + 1; index++)
+                {
+                    sequenceLine += seq1[index];
+                }
+                
+                string seqName = alignPtr->getName(i);
+                //if((int)seqName.size() > MAXNAMESTODISPLAY)
+                if((int)seqName.size() > NAMESWIDTH)
+                {
+                    //seqName = seqName.substr(0, MAXNAMESTODISPLAY);
+                    seqName = seqName.substr(0, NAMESWIDTH);
+                }
+                
+                if (!userParameters->getSeqRange()) 
+                {
+                    // NOTE I made a change here from + 5, to + 6.
+                    //(*clustalOutFile) << setw(alignPtr->getMaxNames() + 6) << left
+                    //                  << alignPtr->getName(i);
+
+                    //(*clustalOutFile) << setw(MAXNAMESTODISPLAY + 6) << left
+                    //                  << seqName; 
+                    // PMcG changed this to revert to behaviour of clustalw1.83
+                    // 
+                    //(*clustalOutFile) << setw(std::max(std::min(MAXNAMESTODISPLAY,alignPtr->getMaxNames()) , MINNAMESTODISPLAY) + 6)
+                    (*clustalOutFile) << setw(NAMESWIDTH + 6) << left << seqName; 
+
+
+                }
+                else // Put the sequence range information in! 
+                {
+                    findRangeValues(alignPtr, &rnum, firstRes, lastRes, ii);
+                    string nameOnly = nameonly(seqName);
+                    std::stringstream ss;
+                    std::stringstream ss2;
+                    string rangeStart;
+                    string rangeEnd;
+                    ss << rnum.start;
+                    ss >> rangeStart;
+                    ss2 << rnum.end;
+                    ss2 >> rangeEnd;
+                    tmpStr = nameOnly + "/" + rangeStart + "-" + rangeEnd;
+                    //(*clustalOutFile) << setw(MAXNAMESTODISPLAY + clusSequenceOffset) 
+                    (*clustalOutFile) << setw(NAMESWIDTH + clusSequenceOffset) 
+                                      << left << tmpStr;
+                }
+            
+                (*clustalOutFile) << sequenceLine;
+            
+                if (userParameters->getClSeqNumbers() && printSeqNo[i])
+                {
+                    (*clustalOutFile) << " " << seqNo[i];
+                }
+            
+                (*clustalOutFile) << "\n";
+            }
+        
+            // Now print out the conservation information!
+            for(i = pos; i <= ptr; ++i) 
+            {
+                seq1[i] = ' ';
+                ident = 0;
+
+                for(j = 1; j <= (int)strongGroup.size(); j++)
+                {
+                    catident1[j - 1] = 0;
+                }
+                for(j = 1; j <= (int)weakGroup.size(); j++) 
+                {
+                    catident2[j - 1] = 0;
+                }
+                
+                for(j = firstSeq; j <= lastSeq; ++j) 
+                {
+                    if((i + firstRes - 1 <= alignPtr->getSeqLength(j)) &&
+                       (i + firstRes - 1 <= alignPtr->getSeqLength(firstSeq)))
+                    {// NOTE june29
+                        if(((*alignment)[firstSeq][i + firstRes - 1] >= 0) && 
+                            ((*alignment)[firstSeq][i + firstRes - 1] <=
+                            userParameters->getMaxAA())) 
+                        {
+                            // Count how many are identical to the first sequence
+                            if((*alignment)[firstSeq][i + firstRes - 1] == 
+                                (*alignment)[j][i + firstRes - 1])
+                            {
+                                ++ident;
+                            }
+                            // Count how many are in the same category.
+                            for(k = 1; k <= (int)strongGroup.size(); k++) 
+                            {
+                                for(l = 0; (c = strongGroup[k - 1][l]); l++) 
+                                {
+                                    int resCode = (*alignment)[j][i + firstRes - 1];
+                                    if(resCode <= userParameters->getMaxAA() + 1)
+                                    {
+                                        if (userParameters->getAminoAcidCode(resCode) == c)
+                                        {
+                                            catident1[k - 1]++;
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                            for(k = 1; k <= (int)weakGroup.size(); k++) 
+                            {
+                                for(l = 0; (c = weakGroup[k - 1][l]); l++) 
+                                {//NOTE june29
+                                    int resCode = (*alignment)[j][i + firstRes - 1];
+                                    if(resCode <= userParameters->getMaxAA() + 1)
+                                    {
+                                        if (userParameters->getAminoAcidCode(resCode) == c)
+                                        {
+                                            catident2[k - 1]++;
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }    
+                }
+            
+                // Now do the conservation part for each block. 
+                if(ident == lastSeq - firstSeq + 1)
+                {
+                    seq1[i] = '*'; // All residues the same!
+                }
+                else if (!userParameters->getDNAFlag()) 
+                {
+                    for(k = 1; k <= (int)strongGroup.size(); k++) 
+                    {
+                        if (catident1[k - 1] == lastSeq - firstSeq + 1) 
+                        {
+                            seq1[i] = ':'; // All residues member of the same category
+                            break;
+                        }
+                    }
+                    if(seq1[i] == ' ')
+                    {
+                        for(k = 1; k <= (int)weakGroup.size(); k++) 
+                        {
+                            if (catident2[k - 1] == lastSeq - firstSeq + 1) 
+                            {
+                                seq1[i] = '.'; // All residues member of the same category
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+            sequenceLine = "";
+            for(int index = pos; index < ptr + 1; index++)
+            {
+                sequenceLine += seq1[index];
+            }
+
+            //for(k = 0; k < MAXNAMESTODISPLAY + 6; k++)
+            for(k = 0; k < NAMESWIDTH + 6; k++)
+            { 
+                (*clustalOutFile) << " ";
+            }
+            if(userParameters->getSeqRange()) 
+            {
+
+                (*clustalOutFile) << "          ";
+            }
+
+            (*clustalOutFile) << sequenceLine << "\n";
+        }
+        clustalOutFile->close();
+    }
+    catch(const bad_alloc& e)
+    {
+        clustalOutFile->close();
+        cerr << "A bad_alloc exception has occured in the clustalOut function.\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+    catch(VectorOutOfRange e)
+    {
+        clustalOutFile->close();
+        cerr << "An exception has occured in the clustalOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(exception e)
+    {
+        clustalOutFile->close();
+        cerr << "An exception has occured in the clustalOut function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }
+    catch(...)
+    {
+        clustalOutFile->close();
+        cerr << "An exception has occured in the clustalOut function.\n";
+        exit(1);    
+    }    
+}
+
+/*
+ * The function printSecStructMask takes in the 2 mask vectors. It makes changes to 
+ * mask and puts the result in structMask. This is the one that will be printed out.
+ * NOTE I have had to use (*structMask)[i] syntax. This is not good. But there is no
+ * way to do random access setting in vectors otherwise.
+ */
+void AlignmentOutput::printSecStructMask(int prfLength, vector<char>* mask, 
+                                         vector<char>* structMask)
+{
+    int i, j;
+//    calculate the gap penalty mask from the secondary structures
+
+    i = 0;
+    try
+    {
+        while (i < prfLength) 
+        {
+            if (tolower(mask->at(i)) == 'a' || mask->at(i) == '$') 
+            {
+                for (j = 0; j < userParameters->getHelixEndMinus(); j++) 
+                {
+                    if (i + j >= prfLength || (tolower(mask->at(i+j)) != 'a'
+                                    && mask->at(i+j) != '$')) 
+                    {    
+                        break;
+                    }
+                    (*structMask)[i+j] = 'a';
+                }
+                i += j;
+                while (tolower(mask->at(i)) == 'a' || mask->at(i) == '$') 
+                {
+                    if (i >= prfLength) 
+                        break;
+                    if (mask->at(i) == '$') 
+                    {
+                        (*structMask)[i] = 'A';
+                        i++;
+                        break;
+                    }
+                    else 
+                        (*structMask)[i] = (*mask)[i];
+                    i++;
+                }
+                for (j = 0; j < userParameters->getHelixEndMinus(); j++) 
+                {
+                    if ((i-j-1>=0) && (tolower(mask->at(i-j-1)) == 'a'
+                                        || mask->at(i-j-1) == '$'))
+                    {
+                        (*structMask)[i - j - 1] = 'a';
+                    }
+                }
+            }
+            else if (tolower(mask->at(i)) == 'b' || mask->at(i) == '%') 
+            {
+                for (j = 0; j < userParameters->getStrandEndMinus(); j++) 
+                {
+                    if (i + j >= prfLength || (tolower(mask->at(i+j)) != 'b'
+                                        && mask->at(i+j) != '%')) 
+                    {
+                        break;
+                    }
+                    (*structMask)[i+j] = 'b';
+                }
+                i += j;
+                while (tolower(mask->at(i)) == 'b' || mask->at(i) == '%') 
+                {
+                    if (i >= prfLength) 
+                        break;
+                    if (mask->at(i) == '%') 
+                    {
+                        (*structMask)[i] = 'B';
+                        i++;
+                        break;
+                    }
+                    else
+                    { 
+                        (*structMask)[i] = mask->at(i);
+                    }
+                    i++;
+                }
+                for (j = 0; j < userParameters->getStrandEndMinus(); j++) 
+                {
+                    if ((i - j - 1 >= 0) && (tolower(mask->at(i - j - 1)) == 'b' || 
+                        mask->at(i-j-1) == '%'))
+                    {
+                        (*structMask)[i-j-1] = 'b';
+                    }
+                }
+            }
+            else
+            { 
+                i++;
+            }
+        }
+    }
+    catch(const exception& e)
+    {
+        // Catch all the exceptions
+        cerr << "There has been an exception in the function printSecStructMask\n"
+             << e.what() << "\n";
+        exit(1);
+    }
+}
+
+/*
+ * The function findRangeValues is used to find the range to be printed out.
+ *
+ *
+ */
+void AlignmentOutput::findRangeValues(Alignment* alignPtr, rangeNum *rnum, int firstRes, 
+                                int len, int firstSeq)
+{
+    assert(rnum);
+    assert(firstRes > 0);
+    assert(len > 0);
+    assert(firstSeq > 0);
+    
+    try
+    {
+        int val;
+        int i, ii;
+        int j, slen;    
+
+        char tmpName[FILENAMELEN + 15];
+        int iStart = 0;
+        int iEnd = 0; // to print sequence start-end with names
+        int found = 0;
+        int ngaps = 0;
+        int tmpStart = 0; 
+        int tmpEnd = 0;
+        int ntermgaps = 0;
+        int pregaps = 0;
+        int tmpk = 0;
+        int isRange = 0;
+        int formula = 0;
+        const SeqArray* alignment = alignPtr->getSeqArray();
+        
+        tmpName[0] = '\0';
+        slen = 0;
+
+        ii = firstSeq ;
+        i = alignPtr->getOutputIndex(ii - 1); // NOTE Same as elsewhere! 
+        string name = alignPtr->getName(i);
+        
+        if( (sscanf(name.c_str(),"%[^/]/%d-%d",tmpName, &tmpStart, &tmpEnd) == 3)) 
+        {
+            isRange = 1;
+        }
+        
+        for(tmpk = 1; tmpk < firstRes; tmpk++)
+        { 
+            // do this irrespective of above sscanf
+            //val = alignPtr.getResidue(i, tmpk);
+            val = (*alignment)[i][tmpk]; // NOTE june29
+            if ((val < 0) || (val > userParameters->getMaxAA()))
+            { 
+                //it is gap
+                pregaps++;
+            }
+        }
+        
+        for(j = firstRes; j < firstRes + len; j++) 
+        {
+            if(j > alignPtr->getSeqLength(i))
+            {
+                val = -3; // Cant get it so break out.
+            }
+            else
+            {
+                //val = alignPtr.getResidue(i, j);
+                val = (*alignment)[i][j]; // NOTE june29
+            }
+            if((val == -3) || (val == 253))
+            {
+                break;
+            }
+            else if((val < 0) || (val > userParameters->getMaxAA())) 
+            {
+                ngaps++;
+            }
+            else 
+            {
+                found = j;
+            }
+            if ( found && (iStart == 0) ) 
+            {
+                iStart = found;
+                ntermgaps = ngaps;
+            }
+            slen++;
+        }
+        if(userParameters->getSeqRange()) 
+        {
+            cout << "Name : " << alignPtr->getName(i) << " "
+                 << "\n  firstRes = "<< firstRes << " "
+                 << "   len = " << len << " "
+                 << "\n  iStart = " << iStart << " "
+                 << "\n  tmpStart = " << tmpStart << " "
+                 << "\n  ngaps = " << ngaps << " "
+                 << "\n  pregaps = " << pregaps << " ";
+            if (!isRange)
+            {
+                formula = iStart - pregaps;
+            }
+            else
+            {
+                formula = iStart - pregaps +  ( tmpStart == 1 ? 0: tmpStart-1) ;
+            }
+
+            cout << "\n\nsuggestion  iStart - pregaps + tmpStart - ntermgaps = "
+                 << iStart << " - " << pregaps << " + " << tmpStart << " - " << ntermgaps
+                 << " formula " << formula << " ";
+        }
+        else 
+        {
+            cerr << "\n no range found .... strange,  iStart = " << iStart;
+            formula = 1;
+        }
+        if (pregaps == firstRes - 1) // all gaps -  now the conditions........ 
+        {
+            formula = tmpStart ; // keep the previous start... 
+        }
+        formula = (formula <= 0) ? 1: formula;
+        if (pregaps == 0 && tmpStart == 0) 
+        {
+            formula = firstRes;
+        }
+        iEnd = formula + len - ngaps -1;
+        rnum->start = formula;
+        rnum->end = iEnd;
+        cout << "\n check... " << alignPtr->getName(i) << " " << rnum->start 
+             << " - " << rnum->end;
+        cout << " Done checking.........";
+    }
+    catch(VectorOutOfRange e)
+    {
+        cerr << "An exception has occured in the findRangeValues function.\n"
+             << e.what() << "\n";
+        exit(1);    
+    }    
+    catch(...)
+    {
+        cerr << "An exception has occured in findRangeValues function\n";
+        exit(1);
+    }
+}
+
+string AlignmentOutput::nameonly(string s)
+{
+    string tmp;
+    try
+    {
+        int i = 0;
+
+        while (i < (int)s.size()) 
+        {
+            if(s.at(i) != '/')
+            {
+                tmp += s.at(i);
+                i++;
+            }
+            else
+            {
+                break;
+            }
+        }
+    }
+    catch(const exception& e)
+    {
+        cerr << "An exception has occured in the function nameonly\n"
+             << e.what();
+        exit(1);
+    }
+    return tmp;
+}
+
+int AlignmentOutput::SeqGCGCheckSum(vector<char>* seq, int length)
+{
+    int i;
+    long check;
+    int seqResIndex = 1;
+    //int seqLength = seq->size();
+    
+    for (i = 0, check = 0; i < length; i++, seqResIndex++)
+    {
+        char _toUpperCase = (*seq)[seqResIndex];
+        check += ((i % 57) + 1) * toupper(_toUpperCase);
+    }
+
+    return (check % 10000);
+}
+
+void AlignmentOutput::showAlign()
+{
+    //FILE *file;
+    int  numLines;
+    char temp[MAXLINE + 1];
+    temp[0] = '\0';
+    string fileName;
+    string answer;
+    
+    if(userParameters->getOutputClustal()) 
+    {
+        fileName = clustalOutName;
+    }
+    else if(userParameters->getOutputNbrf()) 
+    {
+        fileName = nbrfOutName;
+    }
+    else if(userParameters->getOutputGCG()) 
+    {
+        fileName = gcgOutName;
+    }
+    else if(userParameters->getOutputPhylip()) 
+    {
+        fileName = phylipOutName;
+    }
+    else if(userParameters->getOutputGde()) 
+    {
+        fileName = gdeOutName;
+    }
+    else if(userParameters->getOutputNexus()) 
+    {
+        fileName = nexusOutName;
+    }
+    else if(userParameters->getOutputFasta()) 
+    {
+        fileName = fastaOutName;
+    }
+    else
+    {
+        return; // No file output type!
+    }
+
+    ifstream _fileIn;
+    _fileIn.open(fileName.c_str(), ios::in);        
+    _fileIn.seekg(0, std::ios::beg); // start at the beginning
+    
+    cout << "\n\n";
+    numLines = 0;
+
+    while(_fileIn.getline(temp, MAXLINE + 1, '\n')) 
+    {
+       //fputs(temp,stdout);
+       cout << temp << "\n";
+       ++numLines;
+       if(numLines >= PAGE_LEN) 
+       {
+           cout << "\n";
+           utilityObject->getStr(string("Press [RETURN] to continue or  X  to stop"), answer);
+           if(toupper(answer[0]) == 'X') 
+           {
+               _fileIn.close();
+               return;
+           }
+           else
+           {
+               numLines = 0;
+           }
+       }
+    }
+    _fileIn.close();
+    cout << "\n";
+    utilityObject->getStr(string("Press [RETURN] to continue"), answer);
+}
+
+}
+