Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / fastclust.cpp
diff --git a/website/archive/binaries/mac/src/muscle/fastclust.cpp b/website/archive/binaries/mac/src/muscle/fastclust.cpp
new file mode 100644 (file)
index 0000000..b77d4fc
--- /dev/null
@@ -0,0 +1,77 @@
+#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