Next version of JABA
[jabaws.git] / binaries / src / muscle / fastclust.cpp
1 #include "muscle.h"\r
2 #include "seqvect.h"\r
3 #include "distfunc.h"\r
4 #include "clust.h"\r
5 #include "clustsetdf.h"\r
6 #include "tree.h"\r
7 #include "clust.h"\r
8 #include "distcalc.h"\r
9 #include <math.h>\r
10 \r
11 static void TreeFromSeqVect_NJ(const DistFunc &DF, CLUSTER Cluster, Tree &tree)\r
12         {\r
13     ClustSetDF CSD(DF);\r
14 \r
15     Clust C;\r
16     C.Create(CSD, Cluster);\r
17 \r
18     tree.FromClust(C);\r
19         }\r
20 \r
21 static void TreeFromSeqVect_UPGMA(const DistFunc &DF, CLUSTER Cluster, Tree &tree)\r
22         {\r
23         LINKAGE Linkage = LINKAGE_Undefined;\r
24         switch (Cluster)\r
25                 {\r
26         case CLUSTER_UPGMA:\r
27                 Linkage = LINKAGE_Avg;\r
28                 break;\r
29         case CLUSTER_UPGMAMin:\r
30                 Linkage = LINKAGE_Min;\r
31                 break;\r
32         case CLUSTER_UPGMAMax:\r
33                 Linkage = LINKAGE_Max;\r
34                 break;\r
35         case CLUSTER_UPGMB:\r
36                 Linkage = LINKAGE_Biased;\r
37                 break;\r
38         default:\r
39                 Quit("TreeFromSeqVect_UPGMA, CLUSTER_%u not supported", Cluster);\r
40                 }\r
41         \r
42         DistCalcDF DC;\r
43         DC.Init(DF);\r
44         UPGMA2(DC, tree, Linkage);\r
45         }\r
46 \r
47 static void SaveDF(const SeqVect &v, DistFunc &d, const char *FileName)\r
48         {\r
49         FILE *f = fopen(FileName, "w");\r
50         if (f == 0)\r
51                 Quit("Cannot create %s", FileName);\r
52 \r
53         unsigned n = v.GetSeqCount();\r
54         fprintf(f, "%u\n", n);\r
55         for (unsigned i = 0; i < n; ++i)\r
56                 {\r
57                 fprintf(f, "%10.10s  ", v.GetSeqName(i));\r
58                 for (unsigned j = 0; j < i; ++j)\r
59                         fprintf(f, "  %9g", d.GetDist(i, j));\r
60                 fprintf(f, "\n");\r
61                 }\r
62         fclose(f);\r
63         }\r
64 \r
65 void TreeFromSeqVect(const SeqVect &v, Tree &tree, CLUSTER Cluster,\r
66   DISTANCE Distance, ROOT Root, const char *SaveFileName)\r
67         {\r
68         DistFunc DF;\r
69         DistUnaligned(v, Distance, DF);\r
70         if (SaveFileName != 0)\r
71                 SaveDF(v, DF, SaveFileName);\r
72         if (CLUSTER_NeighborJoining == Cluster)\r
73                 TreeFromSeqVect_NJ(DF, Cluster, tree);\r
74         else\r
75                 TreeFromSeqVect_UPGMA(DF, Cluster, tree);\r
76         FixRoot(tree, Root);\r
77         }\r