4 * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
9 #include "RootedTreeOutput.h"
14 RootedTreeOutput::RootedTreeOutput(SeqInfo* seqInfo)
16 firstSeq = seqInfo->firstSeq;
17 lastSeq = seqInfo->lastSeq;
18 numSeqs = seqInfo->numSeqs;
21 void RootedTreeOutput::printPhylipTree(RootedGuideTree* tree, ofstream* ptrToFile, Alignment *alignPtr,
24 if(!ptrToFile || !ptrToFile->is_open())
29 //cerr << "\n******************* DEBUG AW RootedTreeOutput::printPhylipTree: we only get here when using UPGMA with >2 seqs. Why?\n";
32 // If we have only 2 sequences, use the distances in the distMat
33 if (lastSeq - firstSeq + 1 == 2)
35 (*ptrToFile) << "(" << alignPtr->getName(firstSeq) << ":" << fixed << setprecision(5)
36 << (*distMat)(firstSeq, firstSeq + 1) << "," << alignPtr->getName(firstSeq + 1)
37 << ":" << fixed << setprecision(5) << (*distMat)(firstSeq, firstSeq + 1)
40 // AW 2009-05-15: final ")" added here, but not tested
41 // when is this ever used? tried
42 // infile=test.aln -clustering=nj|upgma
43 // on pairwise input, but this is only called for multiple
46 // AW 2009-05-08: fixed bug 155 by removing unnecessary, extra
47 // outer parenthesis from output
48 phylipTraverse(ptrToFile, alignPtr, tree->getRoot());
50 (*ptrToFile) << ";\n";
53 void RootedTreeOutput::printNexusTree(RootedGuideTree* tree, ofstream* ptrToFile,
54 Alignment *alignPtr, DistMatrix* distMat)
56 if(!ptrToFile || !ptrToFile->is_open())
61 (*ptrToFile) << "#NEXUS\n\n";
63 (*ptrToFile) << "BEGIN TREES;\n\n";
64 (*ptrToFile) << "\tTRANSLATE\n";
66 for(int j = 1; j < numSeqs; j++)
68 (*ptrToFile) << "\t\t" << j << "\t" << alignPtr->getName(j) <<",\n";
70 (*ptrToFile) << "\t\t" << numSeqs << "\t" << alignPtr->getName(numSeqs) << "\n";
71 (*ptrToFile) << "\t\t;\n";
73 (*ptrToFile) << "\tUTREE PAUP_1= ";
75 // IF we have only 2 seqs
76 if (lastSeq - firstSeq + 1 == 2)
78 (*ptrToFile) << "(" << alignPtr->getName(firstSeq) << ":" << fixed << setprecision(5)
79 << (*distMat)(firstSeq, firstSeq + 1) << "," << alignPtr->getName(firstSeq + 1)
80 << ":" << fixed << setprecision(5) << (*distMat)(firstSeq, firstSeq + 1);
85 nexusTraverse(ptrToFile, alignPtr, tree->getRoot());
87 (*ptrToFile) << ");\n";
88 (*ptrToFile) << "\nENDBLOCK;\n";
95 void RootedTreeOutput::phylipTraverse(ofstream* ptrToFile, Alignment *alignPtr, Node* t)
107 (*ptrToFile) << alignPtr->getName(t->getSeqNum()) << ":" << t->getHeight();
111 (*ptrToFile) << t->getSeqNum() << ":" << t->getHeight();
114 else // Internal node
116 (*ptrToFile) << "(\n";
117 phylipTraverse(ptrToFile, alignPtr, t->getLeft());
118 (*ptrToFile) << ",\n";
119 phylipTraverse(ptrToFile, alignPtr, t->getRight());
120 (*ptrToFile) << "):" << t->getHeight();
125 void RootedTreeOutput::nexusTraverse(ofstream* ptrToFile, Alignment *alignPtr, Node* t)
129 if(!t->isLeafNode()) // Internal node
132 nexusTraverse(ptrToFile, alignPtr, t->getLeft());
134 nexusTraverse(ptrToFile, alignPtr, t->getRight());
135 (*ptrToFile) << "):" << t->getHeight();
141 (*ptrToFile) << alignPtr->getName(t->getSeqNum()) << ":" << t->getHeight();
145 (*ptrToFile) << t->getSeqNum() << ":" << t->getHeight();