5 #include "clustsetmsa.h"
\r
6 #include "distcalc.h"
\r
8 static void SaveMSADist(const MSA &msa, MSADist &d, const char *FileName)
\r
10 FILE *f = fopen(FileName, "w");
\r
12 Quit("Cannot create %s", FileName);
\r
14 unsigned n = msa.GetSeqCount();
\r
15 for (unsigned i = 0; i < n; ++i)
\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
25 static void TreeFromMSA_NJ(const MSA &msa, Tree &tree, CLUSTER Cluster,
\r
26 DISTANCE Distance, const char *SaveFileName)
\r
28 MSADist MD(Distance);
\r
29 ClustSetMSA Set(msa, MD);
\r
31 if (SaveFileName != 0)
\r
32 SaveMSADist(msa, MD, SaveFileName);
\r
35 C.Create(Set, Cluster);
\r
40 static void SaveDC(const DistCalcMSA &DC, const char *FileName)
\r
42 FILE *f = fopen(FileName, "w");
\r
44 Quit("Cannot create %s", FileName);
\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
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
60 static void TreeFromMSA_UPGMA(const MSA &msa, Tree &tree, CLUSTER Cluster,
\r
61 DISTANCE Distance, const char *SaveFileName)
\r
63 LINKAGE Linkage = LINKAGE_Undefined;
\r
67 Linkage = LINKAGE_Avg;
\r
69 case CLUSTER_UPGMAMin:
\r
70 Linkage = LINKAGE_Min;
\r
72 case CLUSTER_UPGMAMax:
\r
73 Linkage = LINKAGE_Max;
\r
76 Linkage = LINKAGE_Biased;
\r
79 Quit("TreeFromMSA_UPGMA, CLUSTER_%u not supported", Cluster);
\r
83 DC.Init(msa, Distance);
\r
84 if (SaveFileName != 0)
\r
85 SaveDC(DC, SaveFileName);
\r
86 UPGMA2(DC, tree, Linkage);
\r
89 void TreeFromMSA(const MSA &msa, Tree &tree, CLUSTER Cluster,
\r
90 DISTANCE Distance, ROOT Root, const char *SaveFileName)
\r
92 if (CLUSTER_NeighborJoining == Cluster)
\r
93 TreeFromMSA_NJ(msa, tree, Cluster, Distance, SaveFileName);
\r
95 TreeFromMSA_UPGMA(msa, tree, Cluster, Distance, SaveFileName);
\r
96 FixRoot(tree, Root);
\r