3 #include "distfunc.h"
\r
5 #include "clustsetdf.h"
\r
8 #include "distcalc.h"
\r
11 static void TreeFromSeqVect_NJ(const DistFunc &DF, CLUSTER Cluster, Tree &tree)
\r
16 C.Create(CSD, Cluster);
\r
21 static void TreeFromSeqVect_UPGMA(const DistFunc &DF, CLUSTER Cluster, Tree &tree)
\r
23 LINKAGE Linkage = LINKAGE_Undefined;
\r
27 Linkage = LINKAGE_Avg;
\r
29 case CLUSTER_UPGMAMin:
\r
30 Linkage = LINKAGE_Min;
\r
32 case CLUSTER_UPGMAMax:
\r
33 Linkage = LINKAGE_Max;
\r
36 Linkage = LINKAGE_Biased;
\r
39 Quit("TreeFromSeqVect_UPGMA, CLUSTER_%u not supported", Cluster);
\r
44 UPGMA2(DC, tree, Linkage);
\r
47 static void SaveDF(const SeqVect &v, DistFunc &d, const char *FileName)
\r
49 FILE *f = fopen(FileName, "w");
\r
51 Quit("Cannot create %s", FileName);
\r
53 unsigned n = v.GetSeqCount();
\r
54 fprintf(f, "%u\n", n);
\r
55 for (unsigned i = 0; i < n; ++i)
\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
65 void TreeFromSeqVect(const SeqVect &v, Tree &tree, CLUSTER Cluster,
\r
66 DISTANCE Distance, ROOT Root, const char *SaveFileName)
\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
75 TreeFromSeqVect_UPGMA(DF, Cluster, tree);
\r
76 FixRoot(tree, Root);
\r