--- /dev/null
+#include "muscle.h"\r
+#include "seqvect.h"\r
+#include "distfunc.h"\r
+#include "clust.h"\r
+#include "clustsetdf.h"\r
+#include "tree.h"\r
+#include "clust.h"\r
+#include "distcalc.h"\r
+#include <math.h>\r
+\r
+static void TreeFromSeqVect_NJ(const DistFunc &DF, CLUSTER Cluster, Tree &tree)\r
+ {\r
+ ClustSetDF CSD(DF);\r
+\r
+ Clust C;\r
+ C.Create(CSD, Cluster);\r
+\r
+ tree.FromClust(C);\r
+ }\r
+\r
+static void TreeFromSeqVect_UPGMA(const DistFunc &DF, CLUSTER Cluster, Tree &tree)\r
+ {\r
+ LINKAGE Linkage = LINKAGE_Undefined;\r
+ switch (Cluster)\r
+ {\r
+ case CLUSTER_UPGMA:\r
+ Linkage = LINKAGE_Avg;\r
+ break;\r
+ case CLUSTER_UPGMAMin:\r
+ Linkage = LINKAGE_Min;\r
+ break;\r
+ case CLUSTER_UPGMAMax:\r
+ Linkage = LINKAGE_Max;\r
+ break;\r
+ case CLUSTER_UPGMB:\r
+ Linkage = LINKAGE_Biased;\r
+ break;\r
+ default:\r
+ Quit("TreeFromSeqVect_UPGMA, CLUSTER_%u not supported", Cluster);\r
+ }\r
+ \r
+ DistCalcDF DC;\r
+ DC.Init(DF);\r
+ UPGMA2(DC, tree, Linkage);\r
+ }\r
+\r
+static void SaveDF(const SeqVect &v, DistFunc &d, const char *FileName)\r
+ {\r
+ FILE *f = fopen(FileName, "w");\r
+ if (f == 0)\r
+ Quit("Cannot create %s", FileName);\r
+\r
+ unsigned n = v.GetSeqCount();\r
+ fprintf(f, "%u\n", n);\r
+ for (unsigned i = 0; i < n; ++i)\r
+ {\r
+ fprintf(f, "%10.10s ", v.GetSeqName(i));\r
+ for (unsigned j = 0; j < i; ++j)\r
+ fprintf(f, " %9g", d.GetDist(i, j));\r
+ fprintf(f, "\n");\r
+ }\r
+ fclose(f);\r
+ }\r
+\r
+void TreeFromSeqVect(const SeqVect &v, Tree &tree, CLUSTER Cluster,\r
+ DISTANCE Distance, ROOT Root, const char *SaveFileName)\r
+ {\r
+ DistFunc DF;\r
+ DistUnaligned(v, Distance, DF);\r
+ if (SaveFileName != 0)\r
+ SaveDF(v, DF, SaveFileName);\r
+ if (CLUSTER_NeighborJoining == Cluster)\r
+ TreeFromSeqVect_NJ(DF, Cluster, tree);\r
+ else\r
+ TreeFromSeqVect_UPGMA(DF, Cluster, tree);\r
+ FixRoot(tree, Root);\r
+ }\r