+++ /dev/null
-/**
- * Author: Mark Larkin
- *
- * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
- */
-#ifdef HAVE_CONFIG_H
- #include "config.h"
-#endif
-#include "RootedTreeOutput.h"
-
-namespace clustalw
-{
-
-RootedTreeOutput::RootedTreeOutput(SeqInfo* seqInfo)
-{
- firstSeq = seqInfo->firstSeq;
- lastSeq = seqInfo->lastSeq;
- numSeqs = seqInfo->numSeqs;
-}
-
-void RootedTreeOutput::printPhylipTree(RootedGuideTree* tree, ofstream* ptrToFile, Alignment *alignPtr,
- DistMatrix* distMat)
-{
- if(!ptrToFile || !ptrToFile->is_open())
- {
- return;
- }
-
- //cerr << "\n******************* DEBUG AW RootedTreeOutput::printPhylipTree: we only get here when using UPGMA with >2 seqs. Why?\n";
-
-
- // If we have only 2 sequences, use the distances in the distMat
- if (lastSeq - firstSeq + 1 == 2)
- {
- (*ptrToFile) << "(" << alignPtr->getName(firstSeq) << ":" << fixed << setprecision(5)
- << (*distMat)(firstSeq, firstSeq + 1) << "," << alignPtr->getName(firstSeq + 1)
- << ":" << fixed << setprecision(5) << (*distMat)(firstSeq, firstSeq + 1)
- ;
- // << ")";
- // AW 2009-05-15: final ")" added here, but not tested
- // when is this ever used? tried
- // infile=test.aln -clustering=nj|upgma
- // on pairwise input, but this is only called for multiple
- // input. why?
- } else {
- // AW 2009-05-08: fixed bug 155 by removing unnecessary, extra
- // outer parenthesis from output
- phylipTraverse(ptrToFile, alignPtr, tree->getRoot());
- }
- (*ptrToFile) << ";\n";
-}
-
-void RootedTreeOutput::printNexusTree(RootedGuideTree* tree, ofstream* ptrToFile,
- Alignment *alignPtr, DistMatrix* distMat)
-{
- if(!ptrToFile || !ptrToFile->is_open())
- {
- return;
- }
-
- (*ptrToFile) << "#NEXUS\n\n";
-
- (*ptrToFile) << "BEGIN TREES;\n\n";
- (*ptrToFile) << "\tTRANSLATE\n";
-
- for(int j = 1; j < numSeqs; j++)
- {
- (*ptrToFile) << "\t\t" << j << "\t" << alignPtr->getName(j) <<",\n";
- }
- (*ptrToFile) << "\t\t" << numSeqs << "\t" << alignPtr->getName(numSeqs) << "\n";
- (*ptrToFile) << "\t\t;\n";
-
- (*ptrToFile) << "\tUTREE PAUP_1= ";
-
- // IF we have only 2 seqs
- if (lastSeq - firstSeq + 1 == 2)
- {
- (*ptrToFile) << "(" << alignPtr->getName(firstSeq) << ":" << fixed << setprecision(5)
- << (*distMat)(firstSeq, firstSeq + 1) << "," << alignPtr->getName(firstSeq + 1)
- << ":" << fixed << setprecision(5) << (*distMat)(firstSeq, firstSeq + 1);
- }
- else
- {
- (*ptrToFile) << "(";
- nexusTraverse(ptrToFile, alignPtr, tree->getRoot());
- }
- (*ptrToFile) << ");\n";
- (*ptrToFile) << "\nENDBLOCK;\n";
-}
-
-/**
- * PRIVATE FUNCTIONS
- */
-
-void RootedTreeOutput::phylipTraverse(ofstream* ptrToFile, Alignment *alignPtr, Node* t)
-{
- if(!ptrToFile)
- {
- return;
- }
- if(t != 0)
- {
- if(t->isLeafNode())
- {
- if(alignPtr)
- {
- (*ptrToFile) << alignPtr->getName(t->getSeqNum()) << ":" << t->getHeight();
- }
- else
- {
- (*ptrToFile) << t->getSeqNum() << ":" << t->getHeight();
- }
- }
- else // Internal node
- {
- (*ptrToFile) << "(\n";
- phylipTraverse(ptrToFile, alignPtr, t->getLeft());
- (*ptrToFile) << ",\n";
- phylipTraverse(ptrToFile, alignPtr, t->getRight());
- (*ptrToFile) << "):" << t->getHeight();
- }
- }
-}
-
-void RootedTreeOutput::nexusTraverse(ofstream* ptrToFile, Alignment *alignPtr, Node* t)
-{
- if(t != 0)
- {
- if(!t->isLeafNode()) // Internal node
- {
- (*ptrToFile) << "(";
- nexusTraverse(ptrToFile, alignPtr, t->getLeft());
- (*ptrToFile) << ",";
- nexusTraverse(ptrToFile, alignPtr, t->getRight());
- (*ptrToFile) << "):" << t->getHeight();
- }
- else // Leaf node
- {
- if(alignPtr)
- {
- (*ptrToFile) << alignPtr->getName(t->getSeqNum()) << ":" << t->getHeight();
- }
- else
- {
- (*ptrToFile) << t->getSeqNum() << ":" << t->getHeight();
- }
- }
- }
-
-}
-
-}