source: tags/initial/GDE/MOLPHY/njproc.c

Last change on this file was 2, checked in by oldcode, 24 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.8 KB
Line 
1/*
2 * njproc.c   Adachi, J.   1995.10.30
3 * Copyright (C) 1993-1995 J. Adachi & M. Hasegawa. All rights reserved.
4 */
5
6#include "tridist.h"
7
8#define REV 0
9
10#define DMIN -1.0e300
11
12void
13distantree(tr, dmat, numspc)
14Tree *tr;
15dmatrix dmat;
16int numspc;
17{
18        int i, j, ii, jj, kk, otui, otuj, nsp2, cinode, restsp;
19        double dij, bix, bjx, bkx, sij, smax, dnsp2, dij2;
20        ivector otu;
21        dvector r;
22        Node **psotu, *cp, *ip, *jp, *kp;
23
24        cinode = numspc;
25        nsp2 = numspc - 2;
26        dnsp2 = 1.0 / nsp2;
27        r = new_dvector(numspc);
28        otu = new_ivector(numspc);
29        psotu = (Node **)new_npvector(numspc);
30        for (i = 0; i < numspc; i++) {
31                otu[i] = i;
32                psotu[i] = tr->brnchp[i]->kinp;
33        }
34
35        for (restsp = numspc; restsp > 3; restsp--) {
36
37                if (Upgma_optn) {
38                        for (i = 0, smax = DMIN; i < restsp-1; i++) {
39                                ii = otu[i];
40                                for (j = i + 1; j < restsp; j++) {
41                                        jj = otu[j];
42                                        sij = - dmat[ii][jj];
43                                        /*      printf("%3d%3d %10.5f\n",ii+1,jj+1,sij); */
44#if                                     REV
45                                        sij = - sij;
46#endif                          /* REV */
47                                        if (sij > smax) {
48                                                smax = sij; otui = i; otuj = j;
49                                        }
50                                }
51                        }
52                } else { /* NJ */
53                        for (i = 0; i < restsp; i++) {
54                                ii = otu[i];
55                                for (j = 0, sij = 0.0; j < restsp; j++) sij += dmat[ii][otu[j]];
56                                r[ii] = sij;
57                        }
58                        for (i = 0, smax = DMIN; i < restsp-1; i++) {
59                                ii = otu[i];
60                                for (j = i + 1; j < restsp; j++) {
61                                        jj = otu[j];
62                                        sij = ( r[ii] + r[jj] ) * dnsp2 - dmat[ii][jj]; /* max */
63                                        /* printf("%3d%3d %9.3f %9.3f %9.3f\n",
64                                                ii+1,jj+1,sij,r[ii],r[jj]); */
65#if                                     REV
66                                        sij = - sij;
67#endif                          /* REV */
68                                        if (sij > smax) {
69                                                smax = sij; otui = i; otuj = j;
70                                        }
71                                }
72                        }
73                } /* Upgma_optn */
74
75                ii = otu[otui];
76                jj = otu[otuj];
77                dij = dmat[ii][jj];
78                dij2 = dij * 0.5;
79                if (Upgma_optn) {
80                        bix = dij2;
81                        bjx = dij2;
82                } else {
83                        bix = (dij + r[ii]/nsp2 - r[jj]/nsp2) * 0.5;
84                        bjx = dij - bix;
85                }
86                cp = tr->brnchp[cinode];
87                ip = psotu[ii];
88                jp = psotu[jj];
89                cp->isop = ip;
90                ip->isop = jp;
91                jp->isop = cp;
92                ip->length += bix;
93                jp->length += bjx;
94                ip->kinp->length = ip->length;
95                jp->kinp->length = jp->length;
96                cp = cp->kinp;
97                cp->length = - dij2;
98                psotu[ii] = cp;
99                psotu[jj] = NULL;
100                for (j = 0; j < restsp; j++) {
101                        kk = otu[j];
102                        if (kk != ii && kk != jj) {
103                                dij = (dmat[ii][kk] + dmat[jj][kk]) * 0.5;
104                                dmat[ii][kk] = dij;
105                                dmat[kk][ii] = dij;
106                        }
107                        dmat[jj][kk] = 0.0;
108                        dmat[kk][jj] = 0.0;
109                }
110                Numbrnch = ++cinode;
111                dnsp2 = 1.0 / --nsp2;
112                if (Debug_optn) {
113                        for (putchar('\n'), j = 0; j < restsp; j++) printf("%6d",otu[j]+1);
114                        for (putchar('\n'), i = 0; i < restsp; i++, putchar('\n')) {
115                                for (j = 0, ii = otu[i]; j < restsp; j++) {
116                                        printf("%6.0f", dmat[ii][otu[j]]*100);
117                                }
118                        }
119                }
120                for (j = otuj; j < restsp - 1; j++) otu[j] = otu[j + 1];
121
122        } /* for restsp */
123
124        ii = otu[0];
125        jj = otu[1];
126        kk = otu[2];
127        if (Upgma_optn) {
128                if (dmat[ii][jj] < dmat[ii][kk]) {
129                        if (dmat[jj][kk] < dmat[ii][jj]) {
130                                i = ii; ii = jj; jj = kk; kk = i;
131                        }
132                } else {
133                        if (dmat[ii][kk] < dmat[jj][kk]) {
134                                j = jj; jj = kk; kk = j;
135                        } else {
136                                i = ii; ii = jj; jj = kk; kk = i;
137                        }
138                }
139                bix = dmat[ii][jj] * 0.5;
140                bjx = dmat[ii][jj] * 0.5;
141                bkx = (dmat[ii][kk] + dmat[jj][kk] - dmat[ii][jj]) * 0.5;
142        } else { /* NJ */
143                bix = (dmat[ii][jj] + dmat[ii][kk] - dmat[jj][kk]) * 0.5;
144                bjx = dmat[ii][jj] - bix;
145                bkx = dmat[ii][kk] - bix;
146        }
147        ip = psotu[ii];
148        jp = psotu[jj];
149        kp = psotu[kk];
150        ip->isop = jp;
151        jp->isop = kp;
152        kp->isop = ip;
153        ip->length += bix;
154        jp->length += bjx;
155        kp->length += bkx;
156        ip->kinp->length = ip->length;
157        jp->kinp->length = jp->length;
158        kp->kinp->length = kp->length;
159        tr->ablength = sij;
160        if (Upgma_optn) {
161                tr->rootp = kp;
162        } else {
163                if (Outgr_optn) {
164                        reroot(tr, tr->brnchp[Outgroup]->kinp);
165                } else {
166                        reroot(tr, tr->brnchp[numspc-1]->kinp); /* tr->rootp = kp; */
167                }
168        }
169        free_dvector(r);
170        free_ivector(otu);
171        free_npvector(psotu);
172} /*_ distantree */
Note: See TracBrowser for help on using the repository browser.