--- /dev/null
+/**
+ * Author: Mark Larkin
+ *
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
+ */
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+#include "RootedClusterTree.h"
+#include "../../general/OutputFile.h"
+#include "UPGMAAlgorithm.h"
+#include "RootedTreeOutput.h"
+//#include "../RandomGenerator.h"
+namespace clustalw
+{
+
+auto_ptr<AlignmentSteps> RootedClusterTree::treeFromDistMatrix(RootedGuideTree* phyloTree,DistMatrix* distMat, Alignment *alignPtr,
+ int seq1, int nSeqs, string& phylipName)
+{
+ OutputFile phylipPhyTreeFile;
+ auto_ptr<AlignmentSteps> progSteps;
+ try
+ {
+ // Test to see if the inputs are valid
+ if(seq1 < 1 || nSeqs < 1)
+ {
+ cerr << "Invalid inputs into treeFromDistMatrix \n"
+ << "seq1 = " << seq1 << " nSeqs = " << nSeqs << "\n"
+ << "Need to end program!\n";
+ exit(1);
+ return progSteps;
+ }
+
+ float dist;
+ string path;
+ verbose = false;
+ firstSeq = seq1;
+ lastSeq = firstSeq + nSeqs - 1;
+
+ SeqInfo info;
+ info.firstSeq = firstSeq;
+ info.lastSeq = lastSeq;
+ info.numSeqs = nSeqs;
+
+ utilityObject->getPath(userParameters->getSeqName(), &path);
+
+ if(nSeqs >= 2)
+ {
+ string name = phylipName;
+ if(!phylipPhyTreeFile.openFile(&name,
+ "\nEnter name for new GUIDE TREE file ", &path, "dnd",
+ "Guide tree"))
+ {
+ return progSteps;
+ }
+ phylipName = name;
+ }
+ else
+ {
+ return progSteps;
+ }
+
+ RootedTreeOutput outputTree(&info);
+
+ ofstream* ptrToFile = phylipPhyTreeFile.getPtrToFile();
+
+ if (nSeqs == 2)
+ {
+ dist = (*distMat)(firstSeq, firstSeq + 1) / 2.0;
+ if(ptrToFile->is_open())
+ {
+ (*ptrToFile) << "(" << alignPtr->getName(firstSeq) << ":"
+ << setprecision(5)
+ << dist << "," << alignPtr->getName(firstSeq + 1) << ":"
+ << setprecision(5) << dist <<");\n";
+ }
+ progSteps.reset(new AlignmentSteps);
+ vector<int> groups;
+ groups.resize(nSeqs + 1, 0);
+ groups[1] = 1;
+ groups[2] = 2;
+ }
+ else
+ {
+ UPGMAAlgorithm clusAlgorithm;
+ progSteps = clusAlgorithm.generateTree(phyloTree, distMat, &info, false);
+ outputTree.printPhylipTree(phyloTree, ptrToFile, alignPtr, distMat);
+ }
+ return progSteps;
+ }
+ catch(const exception &ex)
+ {
+ cerr << "ERROR: Error has occured in treeFromDistMatrix. "
+ << "Need to terminate program.\n"
+ << ex.what();
+ exit(1);
+ }
+ catch(...)
+ {
+ cerr << "ERROR: Error has occured in treeFromDistMatrix. "
+ << "Need to terminate program.\n";
+ exit(1);
+ }
+}
+
+void RootedClusterTree::treeFromAlignment(TreeNames* treeNames, Alignment *alignPtr)
+{
+ try
+ {
+ OutputFile phylipPhyTreeFile;
+ OutputFile clustalPhyTreeFile;
+ OutputFile distancesPhyTreeFile;
+ OutputFile nexusPhyTreeFile;
+ OutputFile pimFile;
+
+ RootedGuideTree phyloTree;
+
+ string path;
+ int j;
+ int overspill = 0;
+ int totalDists;
+ numSeqs = alignPtr->getNumSeqs(); // NOTE class variable
+
+ /**
+ * Check if numSeqs is ok
+ */
+ if(!checkIfConditionsMet(numSeqs, 2))
+ {
+ return;
+ }
+
+ firstSeq = 1;
+ lastSeq = numSeqs;
+
+ // The SeqInfo struct is passed to reduce the number of parameters passed!
+ SeqInfo info;
+ info.firstSeq = firstSeq;
+ info.lastSeq = lastSeq;
+ info.numSeqs = numSeqs;
+
+ RootedTreeOutput outputTree(&info); // No bootstrap!
+
+ utilityObject->getPath(userParameters->getSeqName(), &path);
+
+ /**
+ * Open the required output files.
+ */
+ if(!openFilesForTreeFromAlignment(&clustalPhyTreeFile, &phylipPhyTreeFile,
+ &distancesPhyTreeFile, &nexusPhyTreeFile, &pimFile, treeNames, &path))
+ {
+ return; // Problem opeing one of the files, cannot continue!
+ }
+
+ int _lenFirstSeq = alignPtr->getSeqLength(firstSeq);
+
+ bootPositions.clear();
+ bootPositions.resize(_lenFirstSeq + 2);
+
+ for (j = 1; j <= _lenFirstSeq; ++j)
+ {
+ bootPositions[j] = j;
+ }
+
+ /**
+ * Calculate quickDist and overspill
+ */
+ overspill = calcQuickDistMatForAll(clustalPhyTreeFile.getPtrToFile(),
+ phylipPhyTreeFile.getPtrToFile(), nexusPhyTreeFile.getPtrToFile(),
+ pimFile.getPtrToFile(), distancesPhyTreeFile.getPtrToFile(), alignPtr);
+
+ // check if any distances overflowed the distance corrections
+ if (overspill > 0)
+ {
+ totalDists = (numSeqs *(numSeqs - 1)) / 2;
+ overspillMessage(overspill, totalDists);
+ }
+
+ if (userParameters->getOutputTreeClustal())
+ {
+ verbose = true;
+ }
+ // Turn on file output
+
+
+ if (userParameters->getOutputTreeClustal() ||
+ userParameters->getOutputTreePhylip()
+ || userParameters->getOutputTreeNexus())
+ {
+ UPGMAAlgorithm clusAlgorithm;
+ clusAlgorithm.setVerbose(true);
+ clusAlgorithm.generateTree(&phyloTree, quickDistMat.get(), &info, false,
+ clustalPhyTreeFile.getPtrToFile());
+ clusAlgorithm.setVerbose(false);
+ }
+
+ if (userParameters->getOutputTreePhylip())
+ {
+ outputTree.printPhylipTree(&phyloTree, phylipPhyTreeFile.getPtrToFile(), alignPtr,
+ quickDistMat.get());
+ }
+
+ if (userParameters->getOutputTreeNexus())
+ {
+ outputTree.printNexusTree(&phyloTree, nexusPhyTreeFile.getPtrToFile(), alignPtr,
+ quickDistMat.get());
+ }
+
+ /** Free up resources!!!!! */
+
+ treeGaps.clear();
+ bootPositions.clear();
+
+ }
+ catch(const exception& ex)
+ {
+ cerr << ex.what() << endl;
+ utilityObject->error("Terminating program. Cannot continue\n");
+ exit(1);
+ }
+}
+
+}