Mac binaries
[jabaws.git] / website / archive / binaries / mac / src / muscle / treefrommsa.cpp
1 #include "muscle.h"\r
2 #include "msa.h"\r
3 #include "tree.h"\r
4 #include "clust.h"\r
5 #include "clustsetmsa.h"\r
6 #include "distcalc.h"\r
7 \r
8 static void SaveMSADist(const MSA &msa, MSADist &d, const char *FileName)\r
9         {\r
10         FILE *f = fopen(FileName, "w");\r
11         if (f == 0)\r
12                 Quit("Cannot create %s", FileName);\r
13 \r
14         unsigned n = msa.GetSeqCount();\r
15         for (unsigned i = 0; i < n; ++i)\r
16                 {\r
17                 fprintf(f, "%10.10s  ", msa.GetSeqName(i));\r
18                 for (unsigned j = 0; j < n; ++j)\r
19                         fprintf(f, "  %9g", d.ComputeDist(msa, i, j));\r
20                 fprintf(f, "\n");\r
21                 }\r
22         fclose(f);\r
23         }\r
24 \r
25 static void TreeFromMSA_NJ(const MSA &msa, Tree &tree, CLUSTER Cluster,\r
26   DISTANCE Distance, const char *SaveFileName)\r
27         {\r
28         MSADist MD(Distance);\r
29         ClustSetMSA Set(msa, MD);\r
30 \r
31         if (SaveFileName != 0)\r
32                 SaveMSADist(msa, MD, SaveFileName);\r
33 \r
34         Clust C;\r
35         C.Create(Set, Cluster);\r
36 \r
37         tree.FromClust(C);\r
38         }\r
39 \r
40 static void SaveDC(const DistCalcMSA &DC, const char *FileName)\r
41         {\r
42         FILE *f = fopen(FileName, "w");\r
43         if (f == 0)\r
44                 Quit("Cannot create %s", FileName);\r
45 \r
46         unsigned n = DC.GetCount();\r
47         fprintf(f, "%u\n", n);\r
48         float *Dist = new float[n];\r
49         for (unsigned i = 0; i < n; ++i)\r
50                 {\r
51                 fprintf(f, "%10.10s  ", DC.GetName(i));\r
52                 DC.CalcDistRange(i, Dist);\r
53                 for (unsigned j = 0; j < i; ++j)\r
54                         fprintf(f, "  %9g", Dist[j]);\r
55                 fprintf(f, "\n");\r
56                 }\r
57         fclose(f);\r
58         }\r
59 \r
60 static void TreeFromMSA_UPGMA(const MSA &msa, Tree &tree, CLUSTER Cluster,\r
61   DISTANCE Distance, const char *SaveFileName)\r
62         {\r
63         LINKAGE Linkage = LINKAGE_Undefined;\r
64         switch (Cluster)\r
65                 {\r
66         case CLUSTER_UPGMA:\r
67                 Linkage = LINKAGE_Avg;\r
68                 break;\r
69         case CLUSTER_UPGMAMin:\r
70                 Linkage = LINKAGE_Min;\r
71                 break;\r
72         case CLUSTER_UPGMAMax:\r
73                 Linkage = LINKAGE_Max;\r
74                 break;\r
75         case CLUSTER_UPGMB:\r
76                 Linkage = LINKAGE_Biased;\r
77                 break;\r
78         default:\r
79                 Quit("TreeFromMSA_UPGMA, CLUSTER_%u not supported", Cluster);\r
80                 }\r
81         \r
82         DistCalcMSA DC;\r
83         DC.Init(msa, Distance);\r
84         if (SaveFileName != 0)\r
85                 SaveDC(DC, SaveFileName);\r
86         UPGMA2(DC, tree, Linkage);\r
87         }\r
88 \r
89 void TreeFromMSA(const MSA &msa, Tree &tree, CLUSTER Cluster,\r
90   DISTANCE Distance, ROOT Root, const char *SaveFileName)\r
91         {\r
92         if (CLUSTER_NeighborJoining == Cluster)\r
93                 TreeFromMSA_NJ(msa, tree, Cluster, Distance, SaveFileName);\r
94         else\r
95                 TreeFromMSA_UPGMA(msa, tree, Cluster, Distance, SaveFileName);\r
96         FixRoot(tree, Root);\r
97         }\r