source: branches/stable/GDE/MUSCLE/src/treefrommsa.cpp

Last change on this file was 10390, checked in by aboeckma, 11 years ago

added muscle sourcles amd makefile

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