Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / clustalw / src / tree / UPGMA / RootedTreeOutput.cpp
diff --git a/website/archive/binaries/mac/src/clustalw/src/tree/UPGMA/RootedTreeOutput.cpp b/website/archive/binaries/mac/src/clustalw/src/tree/UPGMA/RootedTreeOutput.cpp
new file mode 100644 (file)
index 0000000..f7d50ec
--- /dev/null
@@ -0,0 +1,152 @@
+/**
+ * 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();
+            }
+        }
+    }
+
+}
+
+}