5 /* version 3.6. (c) Copyright 1993-2004 by the University of Washington.
6 Written by Joseph Felsenstein, Akiko Fuseki, Sean Lamont, and Andrew Keeffe.
7 Permission is granted to copy and use this program provided no fee is
8 charged for it and provided that this copyright notice is not removed. */
10 long nonodes, endsite, outgrno, nextree, which;
11 boolean interleaved, printdata, outgropt, treeprint, dotdiff, transvp;
12 steptr weight, category, alias, location, ally;
16 void fix_x(node* p,long site, double maxx, long rcategs)
19 p->underflows[site] += log(maxx);
21 for ( i = 0 ; i < rcategs ; i++ ) {
22 for ( j = 0 ; j < ((long)T - (long)A + 1) ; j++)
23 p->x[site][i][j] /= maxx;
28 void fix_protx(node* p,long site, double maxx, long rcategs)
32 p->underflows[site] += log(maxx);
34 for ( i = 0 ; i < rcategs ; i++ )
35 for (m = 0; m <= 19; m++)
36 p->protx[site][i][m] /= maxx;
40 void alloctemp(node **temp, long *zeros, long endsite)
42 /*used in dnacomp and dnapenny */
43 *temp = (node *)Malloc(sizeof(node));
44 (*temp)->numsteps = (steptr)Malloc(endsite*sizeof(long));
45 (*temp)->base = (baseptr)Malloc(endsite*sizeof(long));
46 (*temp)->numnuc = (nucarray *)Malloc(endsite*sizeof(nucarray));
47 memcpy((*temp)->base, zeros, endsite*sizeof(long));
48 memcpy((*temp)->numsteps, zeros, endsite*sizeof(long));
49 zeronumnuc(*temp, endsite);
53 void freetemp(node **temp)
55 /* used in dnacomp, dnapars, & dnapenny */
56 free((*temp)->numsteps);
58 free((*temp)->numnuc);
63 void freetree2 (pointarray treenode, long nonodes)
65 /* The natural complement to alloctree2. Free all elements of all
66 the rings (normally triads) in treenode */
70 /* The first spp elements are just nodes, not rings */
71 for (i = 0; i < spp; i++)
74 /* The rest are rings */
75 for (i = spp; i < nonodes; i++) {
76 p = treenode[i]->next;
77 while (p != treenode[i]) {
82 /* p should now point to treenode[i], which has yet to be freed */
89 void inputdata(long chars)
91 /* input the names and sequences for each species */
92 /* used by dnacomp, dnadist, dnainvar, dnaml, dnamlk, dnapars, & dnapenny */
93 long i, j, k, l, basesread, basesnew=0;
95 boolean allread, done;
98 headings(chars, "Sequences", "---------");
102 /* eat white space -- if the separator line has spaces on it*/
104 charstate = gettc(infile);
105 } while (charstate == ' ' || charstate == '\t');
106 ungetc(charstate, infile);
111 if ((interleaved && basesread == 0) || !interleaved)
113 j = (interleaved) ? basesread : 0;
115 while (!done && !eoff(infile)) {
118 while (j < chars && !(eoln(infile) || eoff(infile))) {
119 charstate = gettc(infile);
120 if (charstate == '\n' || charstate == '\t')
122 if (charstate == ' ' || (charstate >= '0' && charstate <= '9'))
124 uppercase(&charstate);
125 if ((strchr("ABCDGHKMNRSTUVWXY?O-",charstate)) == NULL){
126 printf("ERROR: bad base: %c at site %5ld of species %3ld\n",
128 if (charstate == '.') {
129 printf(" Periods (.) may not be used as gap characters.\n");
130 printf(" The correct gap character is (-)\n");
135 y[i - 1][j - 1] = charstate;
144 if (interleaved && i == 1)
149 if ((interleaved && j != basesnew) ||
150 (!interleaved && j != chars)) {
151 printf("\nERROR: sequences out of alignment at position %ld", j+1);
152 printf(" of species %ld\n\n", i);
159 basesread = basesnew;
160 allread = (basesread == chars);
166 for (i = 1; i <= ((chars - 1) / 60 + 1); i++) {
167 for (j = 1; j <= spp; j++) {
168 for (k = 0; k < nmlngth; k++)
169 putc(nayme[j - 1][k], outfile);
170 fprintf(outfile, " ");
174 for (k = (i - 1) * 60 + 1; k <= l; k++) {
175 if (dotdiff && (j > 1 && y[j - 1][k - 1] == y[0][k - 1]))
178 charstate = y[j - 1][k - 1];
179 putc(charstate, outfile);
180 if (k % 10 == 0 && k % 60 != 0)
191 void alloctree(pointarray *treenode, long nonodes, boolean usertree)
193 /* allocate treenode dynamically */
194 /* used in dnapars, dnacomp, dnapenny & dnamove */
198 *treenode = (pointarray)Malloc(nonodes*sizeof(node *));
199 for (i = 0; i < spp; i++) {
200 (*treenode)[i] = (node *)Malloc(sizeof(node));
201 (*treenode)[i]->tip = true;
202 (*treenode)[i]->index = i+1;
203 (*treenode)[i]->iter = true;
204 (*treenode)[i]->branchnum = 0;
205 (*treenode)[i]->initialized = true;
208 for (i = spp; i < nonodes; i++) {
210 for (j = 1; j <= 3; j++) {
211 p = (node *)Malloc(sizeof(node));
216 p->initialized = false;
220 p->next->next->next = p;
226 void allocx(long nonodes, long rcategs, pointarray treenode, boolean usertree)
228 /* allocate x dynamically */
229 /* used in dnaml & dnamlk */
233 for (i = 0; i < spp; i++){
234 treenode[i]->x = (phenotype)Malloc(endsite*sizeof(ratelike));
235 treenode[i]->underflows = Malloc(endsite * sizeof (double));
236 for (j = 0; j < endsite; j++)
237 treenode[i]->x[j] = (ratelike)Malloc(rcategs*sizeof(sitelike));
240 for (i = spp; i < nonodes; i++) {
242 for (j = 1; j <= 3; j++) {
243 p->underflows = Malloc (endsite * sizeof (double));
244 p->x = (phenotype)Malloc(endsite*sizeof(ratelike));
245 for (k = 0; k < endsite; k++)
246 p->x[k] = (ratelike)Malloc(rcategs*sizeof(sitelike));
254 void prot_allocx(long nonodes, long rcategs, pointarray treenode,
257 /* allocate x dynamically */
262 for (i = 0; i < spp; i++){
263 treenode[i]->protx = (pphenotype)Malloc(endsite*sizeof(pratelike));
264 treenode[i]->underflows = Malloc(endsite*sizeof(double));
265 for (j = 0; j < endsite; j++)
266 treenode[i]->protx[j] = (pratelike)Malloc(rcategs*sizeof(psitelike));
269 for (i = spp; i < nonodes; i++) {
271 for (j = 1; j <= 3; j++) {
272 p->protx = (pphenotype)Malloc(endsite*sizeof(pratelike));
273 p->underflows = Malloc(endsite*sizeof(double));
274 for (k = 0; k < endsite; k++)
275 p->protx[k] = (pratelike)Malloc(rcategs*sizeof(psitelike));
283 void allocx2(long nonodes, long endsite, long sitelength, pointarray treenode,
286 /* allocate x2 dynamically */
291 for (i = 0; i < spp; i++) {
292 treenode[i]->x2 = (phenotype2)Malloc(endsite*sizeof(sitelike2));
293 for ( j = 0 ; j < endsite ; j++ )
294 treenode[i]->x2[j] = Malloc((sitelength + 1) * sizeof(double));
297 for (i = spp; i < nonodes; i++) {
299 for (j = 1; j <= 3; j++) {
300 p->x2 = (phenotype2)Malloc(endsite*sizeof(sitelike2));
301 for (k = 0; k < endsite; k++) {
302 p->x2[k] = Malloc((sitelength + 1) * sizeof(double));
303 for (l = 0; l < sitelength; l++)
313 void setuptree(pointarray treenode, long nonodes, boolean usertree)
315 /* initialize treenodes */
319 for (i = 1; i <= nonodes; i++) {
320 if (i <= spp || !usertree) {
321 treenode[i-1]->back = NULL;
322 treenode[i-1]->tip = (i <= spp);
323 treenode[i-1]->index = i;
324 treenode[i-1]->numdesc = 0;
325 treenode[i-1]->iter = true;
326 treenode[i-1]->initialized = true;
327 treenode[i-1]->tyme = 0.0;
331 for (i = spp + 1; i <= nonodes; i++) {
332 p = treenode[i-1]->next;
333 while (p != treenode[i-1]) {
339 p->initialized = false;
348 void setuptree2(tree a)
350 /* initialize a tree */
351 /* used in dnaml, dnamlk, & restml */
353 a.likelihood = -999999.0;
354 a.start = a.nodep[0]->back;
359 void alloctip(node *p, long *zeros)
360 { /* allocate a tip node */
361 /* used by dnacomp, dnapars, & dnapenny */
363 p->numsteps = (steptr)Malloc(endsite*sizeof(long));
364 p->oldnumsteps = (steptr)Malloc(endsite*sizeof(long));
365 p->base = (baseptr)Malloc(endsite*sizeof(long));
366 p->oldbase = (baseptr)Malloc(endsite*sizeof(long));
367 memcpy(p->base, zeros, endsite*sizeof(long));
368 memcpy(p->numsteps, zeros, endsite*sizeof(long));
369 memcpy(p->oldbase, zeros, endsite*sizeof(long));
370 memcpy(p->oldnumsteps, zeros, endsite*sizeof(long));
374 void freetrans(transptr *trans, long nonodes,long sitelength)
377 for ( i = 0 ; i < nonodes ; i++ ) {
378 for ( j = 0 ; j < sitelength + 1; j++) {
379 free ((*trans)[i][j]);
387 void getbasefreqs(double freqa, double freqc, double freqg, double freqt,
388 double *freqr, double *freqy, double *freqar, double *freqcy,
389 double *freqgr, double *freqty, double *ttratio, double *xi,
390 double *xv, double *fracchange, boolean freqsfrom,
393 /* used by dnadist, dnaml, & dnamlk */
399 fprintf(outfile, "Empirical ");
400 fprintf(outfile, "Base Frequencies:\n\n");
401 fprintf(outfile, " A %10.5f\n", freqa);
402 fprintf(outfile, " C %10.5f\n", freqc);
403 fprintf(outfile, " G %10.5f\n", freqg);
404 fprintf(outfile, " T(U) %10.5f\n", freqt);
406 *freqr = freqa + freqg;
407 *freqy = freqc + freqt;
408 *freqar = freqa / *freqr;
409 *freqcy = freqc / *freqy;
410 *freqgr = freqg / *freqr;
411 *freqty = freqt / *freqy;
412 aa = *ttratio * (*freqr) * (*freqy) - freqa * freqg - freqc * freqt;
413 bb = freqa * (*freqgr) + freqc * (*freqty);
414 *xi = aa / (aa + bb);
417 printf("\n WARNING: This transition/transversion ratio\n");
418 printf(" is impossible with these base frequencies!\n");
421 (*ttratio) = (freqa*freqg+freqc*freqt)/((*freqr)*(*freqy));
422 printf(" Transition/transversion parameter reset\n");
423 printf(" so transition/transversion ratio is %10.6f\n\n", (*ttratio));
433 *fracchange = (*xi) * (2 * freqa * (*freqgr) + 2 * freqc * (*freqty)) +
434 (*xv) * (1.0 - freqa * freqa - freqc * freqc - freqg * freqg
439 void empiricalfreqs(double *freqa, double *freqc, double *freqg,
440 double *freqt, steptr weight, pointarray treenode)
442 /* Get empirical base frequencies from the data */
443 /* used in dnaml & dnamlk */
445 double sum, suma, sumc, sumg, sumt, w;
451 for (k = 1; k <= 8; k++) {
456 for (i = 0; i < spp; i++) {
457 for (j = 0; j < endsite; j++) {
459 sum = (*freqa) * treenode[i]->x[j][0][0];
460 sum += (*freqc) * treenode[i]->x[j][0][(long)C - (long)A];
461 sum += (*freqg) * treenode[i]->x[j][0][(long)G - (long)A];
462 sum += (*freqt) * treenode[i]->x[j][0][(long)T - (long)A];
463 suma += w * (*freqa) * treenode[i]->x[j][0][0] / sum;
464 sumc += w * (*freqc) * treenode[i]->x[j][0][(long)C - (long)A] / sum;
465 sumg += w * (*freqg) * treenode[i]->x[j][0][(long)G - (long)A] / sum;
466 sumt += w * (*freqt) * treenode[i]->x[j][0][(long)T - (long)A] / sum;
469 sum = suma + sumc + sumg + sumt;
483 } /* empiricalfreqs */
486 void sitesort(long chars, steptr weight)
488 /* Shell sort keeping sites, weights in same order */
489 /* used in dnainvar, dnapars, dnacomp & dnapenny */
490 long gap, i, j, jj, jg, k, itemp;
495 for (i = gap + 1; i <= chars; i++) {
498 while (j > 0 && flip) {
500 jg = alias[j + gap - 1];
503 while (k <= spp && tied) {
504 flip = (y[k - 1][jj - 1] > y[k - 1][jg - 1]);
505 tied = (tied && y[k - 1][jj - 1] == y[k - 1][jg - 1]);
510 itemp = alias[j - 1];
511 alias[j - 1] = alias[j + gap - 1];
512 alias[j + gap - 1] = itemp;
513 itemp = weight[j - 1];
514 weight[j - 1] = weight[j + gap - 1];
515 weight[j + gap - 1] = itemp;
524 void sitecombine(long chars)
526 /* combine sites that have identical patterns */
527 /* used in dnapars, dnapenny, & dnacomp */
535 while (j <= chars && tied) {
537 while (k <= spp && tied) {
539 y[k - 1][alias[i - 1] - 1] == y[k - 1][alias[j - 1] - 1]);
543 weight[i - 1] += weight[j - 1];
545 ally[alias[j - 1] - 1] = alias[i - 1];
554 void sitescrunch(long chars)
556 /* move so one representative of each pattern of
558 /* used in dnapars & dnacomp */
566 if (ally[alias[i - 1] - 1] != alias[i - 1]) {
571 found = (ally[alias[j - 1] - 1] == alias[j - 1]);
573 } while (!(found || j > chars));
576 itemp = alias[i - 1];
577 alias[i - 1] = alias[j - 1];
578 alias[j - 1] = itemp;
579 itemp = weight[i - 1];
580 weight[i - 1] = weight[j - 1];
581 weight[j - 1] = itemp;
588 done = (done || i >= chars);
593 void sitesort2(long sites, steptr aliasweight)
595 /* Shell sort keeping sites, weights in same order */
596 /* used in dnaml & dnamnlk */
597 long gap, i, j, jj, jg, k, itemp;
598 boolean flip, tied, samewt;
602 for (i = gap + 1; i <= sites; i++) {
605 while (j > 0 && flip) {
607 jg = alias[j + gap - 1];
608 samewt = ((weight[jj - 1] != 0) && (weight[jg - 1] != 0))
609 || ((weight[jj - 1] == 0) && (weight[jg - 1] == 0));
610 tied = samewt && (category[jj - 1] == category[jg - 1]);
611 flip = ((!samewt) && (weight[jj - 1] == 0))
612 || (samewt && (category[jj - 1] > category[jg - 1]));
614 while (k <= spp && tied) {
615 flip = (y[k - 1][jj - 1] > y[k - 1][jg - 1]);
616 tied = (tied && y[k - 1][jj - 1] == y[k - 1][jg - 1]);
621 itemp = alias[j - 1];
622 alias[j - 1] = alias[j + gap - 1];
623 alias[j + gap - 1] = itemp;
624 itemp = aliasweight[j - 1];
625 aliasweight[j - 1] = aliasweight[j + gap - 1];
626 aliasweight[j + gap - 1] = itemp;
635 void sitecombine2(long sites, steptr aliasweight)
637 /* combine sites that have identical patterns */
638 /* used in dnaml & dnamlk */
640 boolean tied, samewt;
646 while (j <= sites && tied) {
647 samewt = ((aliasweight[i - 1] != 0) && (aliasweight[j - 1] != 0))
648 || ((aliasweight[i - 1] == 0) && (aliasweight[j - 1] == 0));
650 && (category[alias[i - 1] - 1] == category[alias[j - 1] - 1]);
652 while (k <= spp && tied) {
654 y[k - 1][alias[i - 1] - 1] == y[k - 1][alias[j - 1] - 1]);
659 aliasweight[i - 1] += aliasweight[j - 1];
660 aliasweight[j - 1] = 0;
661 ally[alias[j - 1] - 1] = alias[i - 1];
669 void sitescrunch2(long sites, long i, long j, steptr aliasweight)
671 /* move so positively weighted sites come first */
672 /* used by dnainvar, dnaml, dnamlk, & restml */
678 if (aliasweight[i - 1] > 0)
685 found = (aliasweight[j - 1] > 0);
687 } while (!(found || j > sites));
690 itemp = alias[i - 1];
691 alias[i - 1] = alias[j - 1];
692 alias[j - 1] = itemp;
693 itemp = aliasweight[i - 1];
694 aliasweight[i - 1] = aliasweight[j - 1];
695 aliasweight[j - 1] = itemp;
701 done = (done || i >= sites);
706 void makevalues(pointarray treenode, long *zeros, boolean usertree)
708 /* set up fractional likelihoods at tips */
709 /* used by dnacomp, dnapars, & dnapenny */
714 setuptree(treenode, nonodes, usertree);
715 for (i = 0; i < spp; i++)
716 alloctip(treenode[i], zeros);
718 for (i = spp; i < nonodes; i++) {
721 allocnontip(p, zeros, endsite);
723 } while (p != treenode[i]);
726 for (j = 0; j < endsite; j++) {
727 for (i = 0; i < spp; i++) {
728 switch (y[i][alias[j] - 1]) {
751 ns = (1 << A) | (1 << C);
755 ns = (1 << A) | (1 << G);
759 ns = (1 << A) | (1 << T);
763 ns = (1 << C) | (1 << G);
767 ns = (1 << C) | (1 << T);
771 ns = (1 << G) | (1 << T);
775 ns = (1 << C) | (1 << G) | (1 << T);
779 ns = (1 << A) | (1 << G) | (1 << T);
783 ns = (1 << A) | (1 << C) | (1 << T);
787 ns = (1 << A) | (1 << C) | (1 << G);
791 ns = (1 << A) | (1 << C) | (1 << G) | (1 << T);
795 ns = (1 << A) | (1 << C) | (1 << G) | (1 << T);
799 ns = (1 << A) | (1 << C) | (1 << G) | (1 << T) | (1 << O);
810 treenode[i]->base[j] = ns;
811 treenode[i]->numsteps[j] = 0;
817 void makevalues2(long categs, pointarray treenode, long endsite,
818 long spp, sequence y, steptr alias)
820 /* set up fractional likelihoods at tips */
821 /* used by dnaml & dnamlk */
825 for (k = 0; k < endsite; k++) {
827 for (i = 0; i < spp; i++) {
828 for (l = 0; l < categs; l++) {
829 for (b = A; (long)b <= (long)T; b = (bases)((long)b + 1))
830 treenode[i]->x[k][l][(long)b - (long)A] = 0.0;
831 switch (y[i][j - 1]) {
834 treenode[i]->x[k][l][0] = 1.0;
838 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
842 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
846 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
850 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
854 treenode[i]->x[k][l][0] = 1.0;
855 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
859 treenode[i]->x[k][l][0] = 1.0;
860 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
864 treenode[i]->x[k][l][0] = 1.0;
865 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
869 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
870 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
874 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
875 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
879 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
880 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
884 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
885 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
886 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
890 treenode[i]->x[k][l][0] = 1.0;
891 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
892 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
896 treenode[i]->x[k][l][0] = 1.0;
897 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
898 treenode[i]->x[k][l][(long)T - (long)A] = 1.0;
902 treenode[i]->x[k][l][0] = 1.0;
903 treenode[i]->x[k][l][(long)C - (long)A] = 1.0;
904 treenode[i]->x[k][l][(long)G - (long)A] = 1.0;
908 for (b = A; (long)b <= (long)T; b = (bases)((long)b + 1))
909 treenode[i]->x[k][l][(long)b - (long)A] = 1.0;
913 for (b = A; (long)b <= (long)T; b = (bases)((long)b + 1))
914 treenode[i]->x[k][l][(long)b - (long)A] = 1.0;
918 for (b = A; (long)b <= (long)T; b = (bases)((long)b + 1))
919 treenode[i]->x[k][l][(long)b - (long)A] = 1.0;
923 for (b = A; (long)b <= (long)T; b = (bases)((long)b + 1))
924 treenode[i]->x[k][l][(long)b - (long)A] = 1.0;
928 for (b = A; (long)b <= (long)T; b = (bases)((long)b + 1))
929 treenode[i]->x[k][l][(long)b - (long)A] = 1.0;
938 void fillin(node *p, node *left, node *rt)
940 /* sets up for each node in the tree the base sequence
941 at that point and counts the changes. */
942 long i, j, k, n, purset, pyrset;
945 purset = (1 << (long)A) + (1 << (long)G);
946 pyrset = (1 << (long)C) + (1 << (long)T);
948 memcpy(p->base, rt->base, endsite*sizeof(long));
949 memcpy(p->numsteps, rt->numsteps, endsite*sizeof(long));
952 memcpy(p->base, left->base, endsite*sizeof(long));
953 memcpy(p->numsteps, left->numsteps, endsite*sizeof(long));
956 for (i = 0; i < endsite; i++) {
957 p->base[i] = left->base[i] & rt->base[i];
958 p->numsteps[i] = left->numsteps[i] + rt->numsteps[i];
959 if (p->base[i] == 0) {
960 p->base[i] = left->base[i] | rt->base[i];
962 if (!((p->base[i] == purset) || (p->base[i] == pyrset)))
963 p->numsteps[i] += weight[i];
965 else p->numsteps[i] += weight[i];
970 if (left && rt) n = 2;
972 for (i = 0; i < endsite; i++)
973 for (j = (long)A; j <= (long)O; j++)
975 for (k = 1; k <= n; k++) {
976 if (k == 2) q = left;
977 for (i = 0; i < endsite; i++) {
978 for (j = (long)A; j <= (long)O; j++) {
979 if (q->base[i] & (1 << j))
987 long getlargest(long *numnuc)
989 /* find the largest in array numnuc */
993 for (i = (long)A; i <= (long)O; i++)
994 if (numnuc[i] > largest)
1000 void multifillin(node *p, node *q, long dnumdesc)
1002 /* sets up for each node in the tree the base sequence
1003 at that point and counts the changes according to the
1004 changes in q's base */
1005 long i, j, b, largest, descsteps, purset, pyrset;
1007 memcpy(p->oldbase, p->base, endsite*sizeof(long));
1008 memcpy(p->oldnumsteps, p->numsteps, endsite*sizeof(long));
1009 purset = (1 << (long)A) + (1 << (long)G);
1010 pyrset = (1 << (long)C) + (1 << (long)T);
1011 for (i = 0; i < endsite; i++) {
1013 for (j = (long)A; j <= (long)O; j++) {
1015 if ((descsteps == 0) && (p->base[i] & b))
1016 descsteps = p->numsteps[i]
1017 - (p->numdesc - dnumdesc - p->numnuc[i][j]) * weight[i];
1020 descsteps -= q->oldnumsteps[i];
1021 else if (dnumdesc == 0)
1022 descsteps += (q->numsteps[i] - q->oldnumsteps[i]);
1024 descsteps += q->numsteps[i];
1025 if (q->oldbase[i] != q->base[i]) {
1026 for (j = (long)A; j <= (long)O; j++) {
1029 if (b & purset) b = purset;
1030 if (b & pyrset) b = pyrset;
1032 if ((q->oldbase[i] & b) && !(q->base[i] & b))
1034 else if (!(q->oldbase[i] & b) && (q->base[i] & b))
1038 largest = getlargest(p->numnuc[i]);
1039 if (q->oldbase[i] != q->base[i]) {
1041 for (j = (long)A; j <= (long)O; j++) {
1042 if (p->numnuc[i][j] == largest)
1043 p->base[i] |= (1 << j);
1046 p->numsteps[i] = (p->numdesc - largest) * weight[i] + descsteps;
1051 void sumnsteps(node *p, node *left, node *rt, long a, long b)
1053 /* sets up for each node in the tree the base sequence
1054 at that point and counts the changes. */
1056 long ns, rs, ls, purset, pyrset;
1059 memcpy(p->numsteps, rt->numsteps, endsite*sizeof(long));
1060 memcpy(p->base, rt->base, endsite*sizeof(long));
1062 memcpy(p->numsteps, left->numsteps, endsite*sizeof(long));
1063 memcpy(p->base, left->base, endsite*sizeof(long));
1065 purset = (1 << (long)A) + (1 << (long)G);
1066 pyrset = (1 << (long)C) + (1 << (long)T);
1067 for (i = a; i < b; i++) {
1071 p->numsteps[i] = left->numsteps[i] + rt->numsteps[i];
1075 if (!((ns == purset) || (ns == pyrset)))
1076 p->numsteps[i] += weight[i];
1078 else p->numsteps[i] += weight[i];
1086 void sumnsteps2(node *p,node *left,node *rt,long a,long b,long *threshwt)
1088 /* counts the changes at each node. */
1090 long ns, rs, ls, purset, pyrset;
1093 if (a == 0) p->sumsteps = 0.0;
1095 memcpy(p->numsteps, rt->numsteps, endsite*sizeof(long));
1097 memcpy(p->numsteps, left->numsteps, endsite*sizeof(long));
1099 purset = (1 << (long)A) + (1 << (long)G);
1100 pyrset = (1 << (long)C) + (1 << (long)T);
1101 for (i = a; i < b; i++) {
1105 p->numsteps[i] = left->numsteps[i] + rt->numsteps[i];
1109 if (!((ns == purset) || (ns == pyrset)))
1110 p->numsteps[i] += weight[i];
1112 else p->numsteps[i] += weight[i];
1116 for (i = a; i < b; i++) {
1117 steps = p->numsteps[i];
1118 if ((long)steps <= threshwt[i])
1122 p->sumsteps += (double)term;
1127 void multisumnsteps(node *p, node *q, long a, long b, long *threshwt)
1129 /* computes the number of steps between p and q */
1130 long i, j, steps, largest, descsteps, purset, pyrset, b1;
1133 if (a == 0) p->sumsteps = 0.0;
1134 purset = (1 << (long)A) + (1 << (long)G);
1135 pyrset = (1 << (long)C) + (1 << (long)T);
1136 for (i = a; i < b; i++) {
1138 for (j = (long)A; j <= (long)O; j++) {
1139 if ((descsteps == 0) && (p->base[i] & (1 << j)))
1140 descsteps = p->numsteps[i] -
1141 (p->numdesc - 1 - p->numnuc[i][j]) * weight[i];
1143 descsteps += q->numsteps[i];
1145 for (j = (long)A; j <= (long)O; j++) {
1148 if (b1 & purset) b1 = purset;
1149 if (b1 & pyrset) b1 = pyrset;
1151 if (q->base[i] & b1)
1153 if (p->numnuc[i][j] > largest)
1154 largest = p->numnuc[i][j];
1156 steps = (p->numdesc - largest) * weight[i] + descsteps;
1157 if ((long)steps <= threshwt[i])
1161 p->sumsteps += (double)term;
1163 } /* multisumnsteps */
1166 void multisumnsteps2(node *p)
1168 /* counts the changes at each multi-way node. Sums up
1169 steps of all descendants */
1170 long i, j, largest, purset, pyrset, b1;
1174 purset = (1 << (long)A) + (1 << (long)G);
1175 pyrset = (1 << (long)C) + (1 << (long)T);
1176 for (i = 0; i < endsite; i++) {
1181 p->numsteps[i] += q->back->numsteps[i];
1183 for (j = (long)A; j <= (long)O; j++) {
1186 if (b1 & purset) b1 = purset;
1187 if (b1 & pyrset) b1 = pyrset;
1189 if (b[i] & b1) p->numnuc[i][j]++;
1194 largest = getlargest(p->numnuc[i]);
1196 for (j = (long)A; j <= (long)O; j++) {
1197 if (p->numnuc[i][j] == largest)
1198 p->base[i] |= (1 << j);
1200 p->numsteps[i] += ((p->numdesc - largest) * weight[i]);
1202 } /* multisumnsteps2 */
1204 boolean alltips(node *forknode, node *p)
1206 /* returns true if all descendants of forknode except p are tips;
1215 if (q->back && q->back != p && !q->back->tip)
1218 } while (tips && q != r);
1223 void gdispose(node *p, node **grbg, pointarray treenode)
1225 /* go through tree throwing away nodes */
1231 treenode[p->index - 1] = NULL;
1234 gdispose(q->back, grbg, treenode);
1238 chucktreenode(grbg, r);
1240 chucktreenode(grbg, q);
1244 void preorder(node *p, node *r, node *root, node *removing, node *adding,
1245 node *changing, long dnumdesc)
1247 /* recompute number of steps in preorder taking both ancestoral and
1248 descendent steps into account. removing points to a node being
1252 if (p && !p->tip && p != adding) {
1256 if (p->numdesc > 2) {
1258 multifillin (p, r, dnumdesc);
1260 multifillin (p, r, 0);
1267 while (!p1->back || p1->back == removing)
1274 while (!p2->back || p2->back == removing)
1278 if (p->back == p1) p1 = NULL;
1279 else if (p->back == p2) p2 = NULL;
1280 memcpy(p->oldbase, p->base, endsite*sizeof(long));
1281 memcpy(p->oldnumsteps, p->numsteps, endsite*sizeof(long));
1289 preorder(p->next->back, p->next, root, removing, adding, NULL, 0);
1291 } while (p->next != q);
1296 void updatenumdesc(node *p, node *root, long n)
1298 /* set p's numdesc to n. If p is the root, numdesc of p's
1299 descendants are set to n-1. */
1303 if (p == root && n > 0) {
1312 } /* updatenumdesc */
1315 void add(node *below,node *newtip,node *newfork,node **root,
1316 boolean recompute,pointarray treenode,node **grbg,long *zeros)
1318 /* inserts the nodes newfork and its left descendant, newtip,
1319 to the tree. below becomes newfork's right descendant.
1320 if newfork is NULL, newtip is added as below's sibling */
1321 /* used in dnacomp & dnapars */
1324 if (below != treenode[below->index - 1])
1325 below = treenode[below->index - 1];
1327 if (below->back != NULL)
1328 below->back->back = newfork;
1329 newfork->back = below->back;
1330 below->back = newfork->next->next;
1331 newfork->next->next->back = below;
1332 newfork->next->back = newtip;
1333 newtip->back = newfork->next;
1336 updatenumdesc(newfork, *root, 2);
1338 gnutreenode(grbg, &p, below->index, endsite, zeros);
1341 p->next = below->next;
1343 updatenumdesc(below, *root, below->numdesc + 1);
1346 updatenumdesc(newtip, *root, newtip->numdesc);
1347 (*root)->back = NULL;
1351 memcpy(newtip->back->base, below->base, endsite*sizeof(long));
1352 memcpy(newtip->back->numsteps, below->numsteps, endsite*sizeof(long));
1353 memcpy(newtip->back->numnuc, below->numnuc, endsite*sizeof(nucarray));
1354 if (below != *root) {
1355 memcpy(below->back->oldbase, zeros, endsite*sizeof(long));
1356 memcpy(below->back->oldnumsteps, zeros, endsite*sizeof(long));
1357 multifillin(newtip->back, below->back, 1);
1360 memcpy(newtip->back->oldbase, zeros, endsite*sizeof(long));
1361 memcpy(newtip->back->oldnumsteps, zeros, endsite*sizeof(long));
1362 preorder(newtip, newtip->back, *root, NULL, NULL, below, 1);
1364 memcpy(newtip->oldbase, zeros, endsite*sizeof(long));
1365 memcpy(newtip->oldnumsteps, zeros, endsite*sizeof(long));
1366 preorder(below, newtip, *root, NULL, newtip, below, 1);
1368 preorder(below->back, below, *root, NULL, NULL, NULL, 0);
1370 fillin(newtip->back, newtip->back->next->back,
1371 newtip->back->next->next->back);
1373 memcpy(newtip->back->oldbase, zeros, endsite*sizeof(long));
1374 memcpy(newtip->back->oldnumsteps, zeros, endsite*sizeof(long));
1375 preorder(newtip, newtip->back, *root, NULL, NULL, newfork, 1);
1377 if (newfork != *root) {
1378 memcpy(below->back->base, newfork->back->base, endsite*sizeof(long));
1379 memcpy(below->back->numsteps, newfork->back->numsteps, endsite*sizeof(long));
1380 preorder(newfork, newtip, *root, NULL, newtip, NULL, 0);
1382 fillin(below->back, newtip, NULL);
1383 fillin(newfork, newtip, below);
1384 memcpy(below->back->oldbase, zeros, endsite*sizeof(long));
1385 memcpy(below->back->oldnumsteps, zeros, endsite*sizeof(long));
1386 preorder(below, below->back, *root, NULL, NULL, newfork, 1);
1388 if (newfork != *root) {
1389 memcpy(newfork->oldbase, below->base, endsite*sizeof(long));
1390 memcpy(newfork->oldnumsteps, below->numsteps, endsite*sizeof(long));
1391 preorder(newfork->back, newfork, *root, NULL, NULL, NULL, 0);
1397 void findbelow(node **below, node *item, node *fork)
1399 /* decide which of fork's binary children is below */
1401 if (fork->next->back == item)
1402 *below = fork->next->next->back;
1404 *below = fork->next->back;
1408 void re_move(node *item, node **fork, node **root, boolean recompute,
1409 pointarray treenode, node **grbg, long *zeros)
1411 /* removes nodes item and its ancestor, fork, from the tree.
1412 the new descendant of fork's ancestor is made to be
1413 fork's second descendant (other than item). Also
1414 returns pointers to the deleted nodes, item and fork.
1415 If item belongs to a node with more than 2 descendants,
1416 fork will not be deleted */
1417 /* used in dnacomp & dnapars */
1418 node *p, *q, *other = NULL, *otherback = NULL;
1420 if (item->back == NULL) {
1424 *fork = treenode[item->back->index - 1];
1425 if ((*fork)->numdesc == 2) {
1426 updatenumdesc(*fork, *root, 0);
1427 findbelow(&other, item, *fork);
1428 otherback = other->back;
1429 if (*root == *fork) {
1432 updatenumdesc(other, *root, other->numdesc);
1434 p = item->back->next->back;
1435 q = item->back->next->next->back;
1440 (*fork)->back = NULL;
1442 while (p != *fork) {
1447 updatenumdesc(*fork, *root, (*fork)->numdesc - 1);
1449 while (p->next != item->back)
1451 p->next = item->back->next;
1454 updatenumdesc(item, item, item->numdesc);
1456 memcpy(item->back->oldbase, item->back->base, endsite*sizeof(long));
1457 memcpy(item->back->oldnumsteps, item->back->numsteps, endsite*sizeof(long));
1458 memcpy(item->back->base, zeros, endsite*sizeof(long));
1459 memcpy(item->back->numsteps, zeros, endsite*sizeof(long));
1460 preorder(item, item->back, *root, item->back, NULL, item, -1);
1463 if ((*fork)->numdesc >= 2)
1464 chucktreenode(grbg, item->back);
1468 if ((*fork)->numdesc == 0) {
1469 memcpy(otherback->oldbase, otherback->base, endsite*sizeof(long));
1470 memcpy(otherback->oldnumsteps, otherback->numsteps, endsite*sizeof(long));
1471 if (other == *root) {
1472 memcpy(otherback->base, zeros, endsite*sizeof(long));
1473 memcpy(otherback->numsteps, zeros, endsite*sizeof(long));
1475 memcpy(otherback->base, other->back->base, endsite*sizeof(long));
1476 memcpy(otherback->numsteps, other->back->numsteps, endsite*sizeof(long));
1479 other->back = otherback;
1481 preorder(other, otherback, *root, otherback, NULL, other, -1);
1483 preorder(other, otherback, *root, NULL, NULL, NULL, 0);
1485 if (other != *root) {
1486 memcpy(other->oldbase,(*fork)->base, endsite*sizeof(long));
1487 memcpy(other->oldnumsteps,(*fork)->numsteps, endsite*sizeof(long));
1488 preorder(other->back, other, *root, NULL, NULL, NULL, 0);
1491 memcpy(item->oldbase, item->base, endsite*sizeof(long));
1492 memcpy(item->oldnumsteps, item->numsteps, endsite*sizeof(long));
1493 memcpy(item->base, zeros, endsite*sizeof(long));
1494 memcpy(item->numsteps, zeros, endsite*sizeof(long));
1495 preorder(*fork, item, *root, NULL, NULL, *fork, -1);
1497 preorder((*fork)->back, *fork, *root, NULL, NULL, NULL, 0);
1498 memcpy(item->base, item->oldbase, endsite*sizeof(long));
1499 memcpy(item->numsteps, item->oldnumsteps, endsite*sizeof(long));
1504 void postorder(node *p)
1506 /* traverses an n-ary tree, suming up steps at a node's descendants */
1507 /* used in dnacomp, dnapars, & dnapenny */
1517 zeronumnuc(p, endsite);
1521 fillin(p, p->next->back, p->next->next->back);
1525 void getnufork(node **nufork,node **grbg,pointarray treenode,long *zeros)
1527 /* find a fork not used currently */
1531 while (treenode[i] && treenode[i]->numdesc > 0) i++;
1533 gnutreenode(grbg, &treenode[i], i, endsite, zeros);
1534 *nufork = treenode[i];
1538 void reroot(node *outgroup, node *root)
1540 /* reorients tree, putting outgroup in desired position. used if
1541 the root is binary. */
1542 /* used in dnacomp & dnapars */
1545 if (outgroup->back->index == root->index)
1548 q = root->next->next;
1549 p->back->back = q->back;
1550 q->back->back = p->back;
1552 q->back = outgroup->back;
1553 outgroup->back->back = q;
1558 void reroot2(node *outgroup, node *root)
1560 /* reorients tree, putting outgroup in desired position. */
1561 /* used in dnacomp & dnapars */
1564 p = outgroup->back->next;
1565 while (p->next != outgroup->back)
1567 root->next = outgroup->back;
1572 void reroot3(node *outgroup, node *root, node *root2, node *lastdesc,
1575 /* reorients tree, putting back outgroup in original position. */
1576 /* used in dnacomp & dnapars */
1580 while (p->next != root)
1582 chucktreenode(grbg, root);
1583 p->next = outgroup->back;
1584 root2->next = lastdesc->next;
1585 lastdesc->next = root2;
1589 void savetraverse(node *p)
1591 /* sets BOOLEANs that indicate which way is down */
1600 savetraverse(q->back);
1603 } /* savetraverse */
1606 void newindex(long i, node *p)
1608 /* assigns index i to node p */
1610 while (p->index != i) {
1617 void flipindexes(long nextnode, pointarray treenode)
1619 /* flips index of nodes between nextnode and last node. */
1624 while (treenode[last - 1]->numdesc == 0)
1626 if (last > nextnode) {
1627 temp = treenode[nextnode - 1];
1628 treenode[nextnode - 1] = treenode[last - 1];
1629 treenode[last - 1] = temp;
1630 newindex(nextnode, treenode[nextnode - 1]);
1631 newindex(last, treenode[last - 1]);
1636 boolean parentinmulti(node *anode)
1638 /* sees if anode's parent has more than 2 children */
1641 while (!anode->bottom) anode = anode->next;
1645 return (p->numdesc > 2);
1646 } /* parentinmulti */
1649 long sibsvisited(node *anode, long *place)
1651 /* computes the number of nodes which are visited earlier than anode among
1656 while (!anode->bottom) anode = anode->next;
1657 p = anode->back->next;
1660 if (!p->bottom && place[p->back->index - 1] != 0)
1663 } while (p != anode->back);
1668 long smallest(node *anode, long *place)
1670 /* finds the smallest index of sibling of anode */
1674 while (!anode->bottom) anode = anode->next;
1675 p = anode->back->next;
1676 if (p->bottom) p = p->next;
1679 if (p->back && place[p->back->index - 1] != 0) {
1680 if (p->back->index <= spp) {
1681 if (p->back->index < min)
1682 min = p->back->index;
1684 if (place[p->back->index - 1] < min)
1685 min = place[p->back->index - 1];
1689 if (p->bottom) p = p->next;
1690 } while (p != anode->back);
1695 void bintomulti(node **root, node **binroot, node **grbg, long *zeros)
1696 { /* attaches root's left child to its right child and makes
1697 the right child new root */
1698 node *left, *right, *newnode, *temp;
1700 right = (*root)->next->next->back;
1701 left = (*root)->next->back;
1703 (*root)->next = right->back;
1704 (*root)->next->next = left->back;
1708 right->back->next = *root;
1710 gnutreenode(grbg, &newnode, right->index, endsite, zeros);
1711 newnode->next = right->next;
1712 newnode->back = left;
1713 left->back = newnode;
1714 right->next = newnode;
1715 (*root)->next->back = (*root)->next->next->back = NULL;
1717 (*binroot)->numdesc = 0;
1720 (*root)->back = NULL;
1724 void backtobinary(node **root, node *binroot, node **grbg)
1725 { /* restores binary root */
1728 binroot->next->back = (*root)->next->back;
1729 (*root)->next->back->back = binroot->next;
1731 (*root)->next = p->next;
1732 binroot->next->next->back = *root;
1733 (*root)->back = binroot->next->next;
1734 chucktreenode(grbg, p);
1737 (*root)->numdesc = 2;
1738 } /* backtobinary */
1741 boolean outgrin(node *root, node *outgrnode)
1742 { /* checks if outgroup node is a child of root */
1747 if (p->back == outgrnode)
1755 void flipnodes(node *nodea, node *nodeb)
1757 node *backa, *backb;
1759 backa = nodea->back;
1760 backb = nodeb->back;
1761 backa->back = nodeb;
1762 backb->back = nodea;
1763 nodea->back = backb;
1764 nodeb->back = backa;
1768 void moveleft(node *root, node *outgrnode, node **flipback)
1769 { /* makes outgroup node to leftmost child of root */
1775 while (p != root && !done) {
1776 if (p->back == outgrnode) {
1778 flipnodes(root->next->back, p->back);
1786 void savetree(node *root, long *place, pointarray treenode,
1787 node **grbg, long *zeros)
1788 { /* record in place where each species has to be
1789 added to reconstruct this tree */
1790 /* used by dnacomp & dnapars */
1791 long i, j, nextnode, nvisited;
1792 node *p, *q, *r = NULL, *root2, *lastdesc,
1793 *outgrnode, *binroot, *flipback;
1794 boolean done, newfork;
1800 outgrnode = treenode[outgrno - 1];
1801 if (root->numdesc == 2)
1802 bintomulti(&root, &binroot, grbg, zeros);
1803 if (outgrin(root, outgrnode)) {
1804 if (outgrnode != root->next->back)
1805 moveleft(root, outgrnode, &flipback);
1808 lastdesc = root->next;
1809 while (lastdesc->next != root)
1810 lastdesc = lastdesc->next;
1811 lastdesc->next = root->next;
1812 gnutreenode(grbg, &root, outgrnode->back->index, endsite, zeros);
1813 root->numdesc = root2->numdesc;
1814 reroot2(outgrnode, root);
1818 for (i = nextnode; i <= nonodes; i++)
1819 if (treenode[i - 1]->numdesc == 0)
1820 flipindexes(i, treenode);
1821 for (i = 0; i < nonodes; i++)
1823 place[root->index - 1] = 1;
1824 for (i = 1; i <= spp; i++) {
1825 p = treenode[i - 1];
1826 while (place[p->index - 1] == 0) {
1827 place[p->index - 1] = i;
1834 q = treenode[i - 1];
1836 nvisited = sibsvisited(q, place);
1837 if (nvisited == 0) {
1838 if (parentinmulti(r)) {
1839 nvisited = sibsvisited(r, place);
1841 place[i - 1] = place[p->index - 1];
1842 else if (nvisited == 1)
1843 place[i - 1] = smallest(r, place);
1845 place[i - 1] = -smallest(r, place);
1849 place[i - 1] = place[p->index - 1];
1850 } else if (nvisited == 1) {
1851 place[i - 1] = place[p->index - 1];
1853 place[i - 1] = -smallest(q, place);
1857 j = place[p->index - 1];
1860 place[p->index - 1] = nextnode;
1866 done = (place[p->index - 1] != j);
1875 flipnodes(outgrnode, flipback->back);
1878 reroot3(outgrnode, root, root2, lastdesc, grbg);
1883 backtobinary(&root, binroot, grbg);
1887 void addnsave(node *p, node *item, node *nufork, node **root, node **grbg,
1888 boolean multf, pointarray treenode, long *place, long *zeros)
1889 { /* adds item to tree and save it. Then removes item. */
1893 add(p, item, nufork, root, false, treenode, grbg, zeros);
1895 add(p, item, NULL, root, false, treenode, grbg, zeros);
1896 savetree(*root, place, treenode, grbg, zeros);
1898 re_move(item, &nufork, root, false, treenode, grbg, zeros);
1900 re_move(item, &dummy, root, false, treenode, grbg, zeros);
1904 void addbestever(long *pos, long *nextree, long maxtrees, boolean collapse,
1905 long *place, bestelm *bestrees)
1906 { /* adds first best tree */
1910 initbestrees(bestrees, maxtrees, true);
1911 initbestrees(bestrees, maxtrees, false);
1912 addtree(*pos, nextree, collapse, place, bestrees);
1916 void addtiedtree(long pos, long *nextree, long maxtrees, boolean collapse,
1917 long *place, bestelm *bestrees)
1918 { /* add tied tree */
1920 if (*nextree <= maxtrees)
1921 addtree(pos, nextree, collapse, place, bestrees);
1925 void clearcollapse(pointarray treenode)
1927 /* clears collapse status at a node */
1931 for (i = 0; i < nonodes; i++) {
1932 treenode[i]->collapse = undefined;
1933 if (!treenode[i]->tip) {
1934 p = treenode[i]->next;
1935 while (p != treenode[i]) {
1936 p->collapse = undefined;
1941 } /* clearcollapse */
1944 void clearbottom(pointarray treenode)
1946 /* clears boolean bottom at a node */
1950 for (i = 0; i < nonodes; i++) {
1951 treenode[i]->bottom = false;
1952 if (!treenode[i]->tip) {
1953 p = treenode[i]->next;
1954 while (p != treenode[i]) {
1963 void collabranch(node *collapfrom, node *tempfrom, node *tempto)
1964 { /* collapse branch from collapfrom */
1965 long i, j, b, largest, descsteps;
1968 for (i = 0; i < endsite; i++) {
1970 for (j = (long)A; j <= (long)O; j++) {
1972 if ((descsteps == 0) && (collapfrom->base[i] & b))
1973 descsteps = tempfrom->oldnumsteps[i]
1974 - (collapfrom->numdesc - collapfrom->numnuc[i][j])
1978 for (j = (long)A; j <= (long)O; j++) {
1980 if (!done && (tempto->base[i] & b)) {
1981 descsteps += (tempto->numsteps[i]
1982 - (tempto->numdesc - collapfrom->numdesc
1983 - tempto->numnuc[i][j]) * weight[i]);
1987 for (j = (long)A; j <= (long)O; j++)
1988 tempto->numnuc[i][j] += collapfrom->numnuc[i][j];
1989 largest = getlargest(tempto->numnuc[i]);
1990 tempto->base[i] = 0;
1991 for (j = (long)A; j <= (long)O; j++) {
1992 if (tempto->numnuc[i][j] == largest)
1993 tempto->base[i] |= (1 << j);
1995 tempto->numsteps[i] = (tempto->numdesc - largest) * weight[i] + descsteps;
2000 boolean allcommonbases(node *a, node *b, boolean *allsame)
2001 { /* see if bases are common at all sites for nodes a and b */
2007 for (i = 0; i < endsite; i++) {
2008 if ((a->base[i] & b->base[i]) == 0)
2010 else if (a->base[i] != b->base[i])
2014 } /* allcommonbases */
2017 void findbottom(node *p, node **bottom)
2018 { /* find a node with field bottom set at node p */
2025 while(!q->bottom && q != p)
2032 boolean moresteps(node *a, node *b)
2033 { /* see if numsteps of node a exceeds those of node b */
2036 for (i = 0; i < endsite; i++)
2037 if (a->numsteps[i] > b->numsteps[i])
2043 boolean passdown(node *desc, node *parent, node *start, node *below,
2044 node *item, node *added, node *total, node *tempdsc,
2045 node *tempprt, boolean multf)
2046 { /* track down to node start to see if an ancestor branch can be collapsed */
2048 boolean done, allsame;
2050 done = (parent == start);
2053 findbottom(parent->back, &parent);
2054 if (multf && start == below && parent == below)
2056 memcpy(tempdsc->base, tempprt->base, endsite*sizeof(long));
2057 memcpy(tempdsc->numsteps, tempprt->numsteps, endsite*sizeof(long));
2058 memcpy(tempdsc->oldbase, desc->base, endsite*sizeof(long));
2059 memcpy(tempdsc->oldnumsteps, desc->numsteps, endsite*sizeof(long));
2060 memcpy(tempprt->base, parent->base, endsite*sizeof(long));
2061 memcpy(tempprt->numsteps, parent->numsteps, endsite*sizeof(long));
2062 memcpy(tempprt->numnuc, parent->numnuc, endsite*sizeof(nucarray));
2063 tempprt->numdesc = parent->numdesc;
2064 multifillin(tempprt, tempdsc, 0);
2065 if (!allcommonbases(tempprt, parent, &allsame))
2067 else if (moresteps(tempprt, parent))
2071 if (parent == added)
2073 done = (parent == start);
2074 if (done && ((start == item) || (!multf && start == below))) {
2075 memcpy(tempdsc->base, tempprt->base, endsite*sizeof(long));
2076 memcpy(tempdsc->numsteps, tempprt->numsteps, endsite*sizeof(long));
2077 memcpy(tempdsc->oldbase, start->base, endsite*sizeof(long));
2078 memcpy(tempdsc->oldnumsteps, start->numsteps, endsite*sizeof(long));
2079 multifillin(added, tempdsc, 0);
2084 if (start == below || start == item)
2085 fillin(temp, tempprt, below->back);
2087 fillin(temp, tempprt, added);
2088 return !moresteps(temp, total);
2092 boolean trycollapdesc(node *desc, node *parent, node *start,
2093 node *below, node *item, node *added, node *total,
2094 node *tempdsc, node *tempprt, boolean multf, long *zeros)
2095 { /* see if branch between nodes desc and parent can be collapsed */
2098 if (desc->numdesc == 1)
2100 if (multf && start == below && parent == below)
2102 memcpy(tempdsc->base, zeros, endsite*sizeof(long));
2103 memcpy(tempdsc->numsteps, zeros, endsite*sizeof(long));
2104 memcpy(tempdsc->oldbase, desc->base, endsite*sizeof(long));
2105 memcpy(tempdsc->oldnumsteps, desc->numsteps, endsite*sizeof(long));
2106 memcpy(tempprt->base, parent->base, endsite*sizeof(long));
2107 memcpy(tempprt->numsteps, parent->numsteps, endsite*sizeof(long));
2108 memcpy(tempprt->numnuc, parent->numnuc, endsite*sizeof(nucarray));
2109 tempprt->numdesc = parent->numdesc - 1;
2110 multifillin(tempprt, tempdsc, -1);
2111 tempprt->numdesc += desc->numdesc;
2112 collabranch(desc, tempdsc, tempprt);
2113 if (!allcommonbases(tempprt, parent, &allsame) ||
2114 moresteps(tempprt, parent)) {
2115 if (parent != added) {
2116 desc->collapse = nocollap;
2117 parent->collapse = nocollap;
2120 } else if (allsame) {
2121 if (parent != added) {
2122 desc->collapse = tocollap;
2123 parent->collapse = tocollap;
2127 if (parent == added)
2129 if ((start == item && parent == item) ||
2130 (!multf && start == below && parent == below)) {
2131 memcpy(tempdsc->base, tempprt->base, endsite*sizeof(long));
2132 memcpy(tempdsc->numsteps, tempprt->numsteps, endsite*sizeof(long));
2133 memcpy(tempdsc->oldbase, start->base, endsite*sizeof(long));
2134 memcpy(tempdsc->oldnumsteps, start->numsteps, endsite*sizeof(long));
2135 memcpy(tempprt->base, added->base, endsite*sizeof(long));
2136 memcpy(tempprt->numsteps, added->numsteps, endsite*sizeof(long));
2137 memcpy(tempprt->numnuc, added->numnuc, endsite*sizeof(nucarray));
2138 tempprt->numdesc = added->numdesc;
2139 multifillin(tempprt, tempdsc, 0);
2140 if (!allcommonbases(tempprt, added, &allsame))
2142 else if (moresteps(tempprt, added))
2147 return passdown(desc, parent, start, below, item, added, total, tempdsc,
2149 } /* trycollapdesc */
2152 void setbottom(node *p)
2153 { /* set field bottom at node p */
2164 boolean zeroinsubtree(node *subtree, node *start, node *below, node *item,
2165 node *added, node *total, node *tempdsc, node *tempprt,
2166 boolean multf, node* root, long *zeros)
2167 { /* sees if subtree contains a zero length branch */
2170 if (!subtree->tip) {
2174 if (p->back && !p->back->tip &&
2175 !((p->back->collapse == nocollap) && (subtree->collapse == nocollap))
2176 && (subtree->numdesc != 1)) {
2177 if ((p->back->collapse == tocollap) && (subtree->collapse == tocollap)
2178 && multf && (subtree != below))
2180 /* when root->numdesc == 2
2181 * there is no mandatory step at the root,
2182 * instead of checking at the root we check around it
2183 * we only need to check p because the first if
2184 * statement already gets rid of it for the subtree */
2185 else if ((p->back->index != root->index || root->numdesc > 2) &&
2186 trycollapdesc(p->back, subtree, start, below, item, added, total,
2187 tempdsc, tempprt, multf, zeros))
2189 else if ((p->back->index == root->index && root->numdesc == 2) &&
2190 !(root->next->back->tip) && !(root->next->next->back->tip) &&
2191 trycollapdesc(root->next->back, root->next->next->back, start,
2192 below, item,added, total, tempdsc, tempprt, multf, zeros))
2196 } while (p != subtree);
2199 if (p->back && !p->back->tip) {
2200 if (zeroinsubtree(p->back, start, below, item, added, total,
2201 tempdsc, tempprt, multf, root, zeros))
2205 } while (p != subtree);
2208 } /* zeroinsubtree */
2211 boolean collapsible(node *item, node *below, node *temp, node *temp1,
2212 node *tempdsc, node *tempprt, node *added, node *total,
2213 boolean multf, node *root, long *zeros, pointarray treenode)
2215 /* sees if any branch can be collapsed */
2220 memcpy(tempdsc->base, item->base, endsite*sizeof(long));
2221 memcpy(tempdsc->numsteps, item->numsteps, endsite*sizeof(long));
2222 memcpy(tempdsc->oldbase, zeros, endsite*sizeof(long));
2223 memcpy(tempdsc->oldnumsteps, zeros, endsite*sizeof(long));
2224 memcpy(added->base, below->base, endsite*sizeof(long));
2225 memcpy(added->numsteps, below->numsteps, endsite*sizeof(long));
2226 memcpy(added->numnuc, below->numnuc, endsite*sizeof(nucarray));
2227 added->numdesc = below->numdesc + 1;
2228 multifillin(added, tempdsc, 1);
2230 fillin(added, item, below);
2233 fillin(total, added, below->back);
2234 clearbottom(treenode);
2236 if (zeroinsubtree(below->back, below->back, below, item, added, total,
2237 tempdsc, tempprt, multf, root, zeros))
2241 if (zeroinsubtree(below, below, below, item, added, total,
2242 tempdsc, tempprt, multf, root, zeros))
2244 } else if (!below->tip) {
2245 if (zeroinsubtree(below, below, below, item, added, total,
2246 tempdsc, tempprt, multf, root, zeros))
2250 if (zeroinsubtree(item, item, below, item, added, total,
2251 tempdsc, tempprt, multf, root, zeros))
2254 if (multf && below->back && !below->back->tip) {
2255 memcpy(tempdsc->base, zeros, endsite*sizeof(long));
2256 memcpy(tempdsc->numsteps, zeros, endsite*sizeof(long));
2257 memcpy(tempdsc->oldbase, added->base, endsite*sizeof(long));
2258 memcpy(tempdsc->oldnumsteps, added->numsteps, endsite*sizeof(long));
2259 if (below->back == treenode[below->back->index - 1])
2260 belowbk = below->back->next;
2262 belowbk = treenode[below->back->index - 1];
2263 memcpy(tempprt->base, belowbk->base, endsite*sizeof(long));
2264 memcpy(tempprt->numsteps, belowbk->numsteps, endsite*sizeof(long));
2265 memcpy(tempprt->numnuc, belowbk->numnuc, endsite*sizeof(nucarray));
2266 tempprt->numdesc = belowbk->numdesc - 1;
2267 multifillin(tempprt, tempdsc, -1);
2268 tempprt->numdesc += added->numdesc;
2269 collabranch(added, tempdsc, tempprt);
2270 if (!allcommonbases(tempprt, belowbk, &allsame))
2272 else if (allsame && !moresteps(tempprt, belowbk))
2274 else if (belowbk->back) {
2275 fillin(temp, tempprt, belowbk->back);
2276 fillin(temp1, belowbk, belowbk->back);
2277 return !moresteps(temp, temp1);
2284 void replaceback(node **oldback, node *item, node *forknode,
2285 node **grbg, long *zeros)
2286 { /* replaces back node of item with another */
2290 while (p->next->back != item)
2293 gnutreenode(grbg, &p->next, forknode->index, endsite, zeros);
2294 p->next->next = (*oldback)->next;
2295 p->next->back = (*oldback)->back;
2296 p->next->back->back = p->next;
2297 (*oldback)->next = (*oldback)->back = NULL;
2301 void putback(node *oldback, node *item, node *forknode, node **grbg)
2302 { /* restores node to back of item */
2306 while (p->next != item->back)
2309 oldback->next = p->next->next;
2311 oldback->back = item;
2312 item->back = oldback;
2313 oldback->index = forknode->index;
2314 chucktreenode(grbg, q);
2318 void savelocrearr(node *item, node *forknode, node *below, node *tmp,
2319 node *tmp1, node *tmp2, node *tmp3, node *tmprm, node *tmpadd,
2320 node **root, long maxtrees, long *nextree, boolean multf,
2321 boolean bestever, boolean *saved, long *place,
2322 bestelm *bestrees, pointarray treenode, node **grbg,
2324 { /* saves tied or better trees during local rearrangements by removing
2325 item from forknode and adding to below */
2326 node *other, *otherback = NULL, *oldfork, *nufork, *oldback;
2328 boolean found, collapse;
2330 if (forknode->numdesc == 2) {
2331 findbelow(&other, item, forknode);
2332 otherback = other->back;
2336 replaceback(&oldback, item, forknode, grbg, zeros);
2338 re_move(item, &oldfork, root, false, treenode, grbg, zeros);
2340 getnufork(&nufork, grbg, treenode, zeros);
2343 addnsave(below, item, nufork, root, grbg, multf, treenode, place, zeros);
2345 findtree(&found, &pos, *nextree, place, bestrees);
2347 add(other, item, oldfork, root, false, treenode, grbg, zeros);
2348 if (otherback->back != other)
2349 flipnodes(item, other);
2351 add(forknode, item, NULL, root, false, treenode, grbg, zeros);
2355 putback(oldback, item, forknode, grbg);
2358 chucktreenode(grbg, oldback);
2359 re_move(item, &oldfork, root, true, treenode, grbg, zeros);
2360 collapse = collapsible(item, below, tmp, tmp1, tmp2, tmp3, tmprm,
2361 tmpadd, multf, *root, zeros, treenode);
2364 addbestever(&pos, nextree, maxtrees, collapse, place, bestrees);
2366 addtiedtree(pos, nextree, maxtrees, collapse, place, bestrees);
2369 add(other, item, oldfork, root, true, treenode, grbg, zeros);
2371 add(forknode, item, NULL, root, true, treenode, grbg, zeros);
2374 } /* savelocrearr */
2377 void clearvisited(pointarray treenode)
2379 /* clears boolean visited at a node */
2383 for (i = 0; i < nonodes; i++) {
2384 treenode[i]->visited = false;
2385 if (!treenode[i]->tip) {
2386 p = treenode[i]->next;
2387 while (p != treenode[i]) {
2393 } /* clearvisited */
2396 void hyprint(long b1, long b2, struct LOC_hyptrav *htrav,
2397 pointarray treenode, Char *basechar)
2399 /* print out states in sites b1 through b2 at node */
2404 if (htrav->bottom) {
2406 fprintf(outfile, " ");
2408 fprintf(outfile, "root ");
2410 fprintf(outfile, "%4ld ", htrav->r->back->index - spp);
2411 if (htrav->r->tip) {
2412 for (i = 0; i < nmlngth; i++)
2413 putc(nayme[htrav->r->index - 1][i], outfile);
2415 fprintf(outfile, "%4ld ", htrav->r->index - spp);
2417 fprintf(outfile, " ");
2418 else if (htrav->nonzero)
2419 fprintf(outfile, " yes ");
2420 else if (htrav->maybe)
2421 fprintf(outfile, " maybe ");
2423 fprintf(outfile, " no ");
2424 for (i = b1; i <= b2; i++) {
2425 j = location[ally[i - 1] - 1];
2426 htrav->tempset = htrav->r->base[j - 1];
2427 htrav->anc = htrav->hypset[j - 1];
2429 htrav->anc = treenode[htrav->r->back->index - 1]->base[j - 1];
2430 dot = dotdiff && (htrav->tempset == htrav->anc && !htrav->bottom);
2433 else if (htrav->tempset == (1 << A))
2435 else if (htrav->tempset == (1 << C))
2437 else if (htrav->tempset == (1 << G))
2439 else if (htrav->tempset == (1 << T))
2441 else if (htrav->tempset == (1 << O))
2446 for (b = A; b <= O; b = b + 1) {
2447 if (((1 << b) & htrav->tempset) != 0)
2451 putc(basechar[n - 1], outfile);
2456 putc('\n', outfile);
2460 void gnubase(gbases **p, gbases **garbage, long endsite)
2462 /* this and the following are do-it-yourself garbage collectors.
2463 Make a new node or pull one off the garbage list */
2464 if (*garbage != NULL) {
2466 *garbage = (*garbage)->next;
2468 *p = (gbases *)Malloc(sizeof(gbases));
2469 (*p)->base = (baseptr)Malloc(endsite*sizeof(long));
2475 void chuckbase(gbases *p, gbases **garbage)
2477 /* collect garbage on p -- put it on front of garbage list */
2483 void hyptrav(node *r_, long *hypset_, long b1, long b2, boolean bottom_,
2484 pointarray treenode, gbases **garbage, Char *basechar)
2486 /* compute, print out states at one interior node */
2487 struct LOC_hyptrav Vars;
2494 Vars.bottom = bottom_;
2496 Vars.hypset = hypset_;
2497 gnubase(&ancset, garbage, endsite);
2498 tempnuc = (nucarray *)Malloc(endsite*sizeof(nucarray));
2500 Vars.nonzero = false;
2502 zeronumnuc(Vars.r, endsite);
2503 for (i = b1 - 1; i < b2; i++) {
2504 j = location[ally[i] - 1];
2505 Vars.anc = Vars.hypset[j - 1];
2508 for (k = (long)A; k <= (long)O; k++)
2509 if (Vars.anc & (1 << k))
2510 Vars.r->numnuc[j - 1][k]++;
2512 for (k = (long)A; k <= (long)O; k++)
2513 if (p->back->base[j - 1] & (1 << k))
2514 Vars.r->numnuc[j - 1][k]++;
2516 } while (p != Vars.r);
2517 largest = getlargest(Vars.r->numnuc[j - 1]);
2519 for (k = (long)A; k <= (long)O; k++) {
2520 if (Vars.r->numnuc[j - 1][k] == largest)
2521 Vars.tempset |= (1 << k);
2523 Vars.r->base[j - 1] = Vars.tempset;
2526 Vars.anc = treenode[Vars.r->back->index - 1]->base[j - 1];
2527 Vars.nonzero = (Vars.nonzero || (Vars.r->base[j - 1] & Vars.anc) == 0);
2528 Vars.maybe = (Vars.maybe || Vars.r->base[j - 1] != Vars.anc);
2530 hyprint(b1, b2, &Vars, treenode, basechar);
2531 Vars.bottom = false;
2533 memcpy(tempnuc, Vars.r->numnuc, endsite*sizeof(nucarray));
2536 memcpy(Vars.r->numnuc, tempnuc, endsite*sizeof(nucarray));
2537 for (i = b1 - 1; i < b2; i++) {
2538 j = location[ally[i] - 1];
2539 for (k = (long)A; k <= (long)O; k++)
2540 if (q->back->base[j - 1] & (1 << k))
2541 Vars.r->numnuc[j - 1][k]--;
2542 largest = getlargest(Vars.r->numnuc[j - 1]);
2543 ancset->base[j - 1] = 0;
2544 for (k = (long)A; k <= (long)O; k++)
2545 if (Vars.r->numnuc[j - 1][k] == largest)
2546 ancset->base[j - 1] |= (1 << k);
2548 Vars.anc = ancset->base[j - 1];
2550 hyptrav(q->back, ancset->base, b1, b2, Vars.bottom,
2551 treenode, garbage, basechar);
2553 } while (q != Vars.r);
2555 chuckbase(ancset, garbage);
2559 void hypstates(long chars, node *root, pointarray treenode,
2560 gbases **garbage, Char *basechar)
2562 /* fill in and describe states at interior nodes */
2563 /* used in dnacomp, dnapars, & dnapenny */
2567 fprintf(outfile, "\nFrom To Any Steps? State at upper node\n");
2568 fprintf(outfile, " ");
2570 fprintf(outfile, " ( . means same as in the node below it on tree)\n");
2571 nothing = (baseptr)Malloc(endsite*sizeof(long));
2572 for (i = 0; i < endsite; i++)
2574 for (i = 1; i <= ((chars - 1) / 40 + 1); i++) {
2575 putc('\n', outfile);
2579 hyptrav(root, nothing, i * 40 - 39, n, true, treenode, garbage, basechar);
2585 void initbranchlen(node *p)
2596 initbranchlen(q->back);
2604 } /* initbranchlen */
2607 void initmin(node *p, long sitei, boolean internal)
2612 for (i = (long)A; i <= (long)O; i++) {
2613 p->cumlengths[i] = 0;
2614 p->numreconst[i] = 1;
2617 for (i = (long)A; i <= (long)O; i++) {
2618 if (p->base[sitei - 1] & (1 << i)) {
2619 p->cumlengths[i] = 0;
2620 p->numreconst[i] = 1;
2622 p->cumlengths[i] = -1;
2623 p->numreconst[i] = 0;
2630 void initbase(node *p, long sitei)
2632 /* traverse tree to initialize base at internal nodes */
2641 memcpy(q->numnuc, p->numnuc, endsite*sizeof(nucarray));
2642 for (i = (long)A; i <= (long)O; i++) {
2643 if (q->back->base[sitei - 1] & (1 << i))
2644 q->numnuc[sitei - 1][i]--;
2647 for (i = (long)A; i <= (long)O; i++) {
2648 if (p->back->base[sitei - 1] & (1 << i))
2649 q->numnuc[sitei - 1][i]++;
2652 largest = getlargest(q->numnuc[sitei - 1]);
2653 q->base[sitei - 1] = 0;
2654 for (i = (long)A; i <= (long)O; i++) {
2655 if (q->numnuc[sitei - 1][i] == largest)
2656 q->base[sitei - 1] |= (1 << i);
2663 initbase(q->back, sitei);
2669 void inittreetrav(node *p, long sitei)
2671 /* traverse tree to clear boolean initialized and set up base */
2675 initmin(p, sitei, false);
2676 p->initialized = true;
2681 inittreetrav(q->back, sitei);
2684 initmin(p, sitei, true);
2685 p->initialized = false;
2688 initmin(q, sitei, true);
2689 q->initialized = false;
2692 } /* inittreetrav */
2695 void compmin(node *p, node *desc)
2697 /* computes minimum lengths up to p */
2698 long i, j, minn, cost, desclen, descrecon=0, maxx;
2701 for (i = (long)A; i <= (long)O; i++) {
2703 for (j = (long)A; j <= (long)O; j++) {
2707 ((i == (long)A) || (i == (long)G))
2708 && ((j == (long)A) || (j == (long)G))
2711 ((j == (long)C) || (j == (long)T))
2712 && ((i == (long)C) || (i == (long)T))
2724 if (desc->cumlengths[j] == -1) {
2727 desclen = desc->cumlengths[j];
2729 if (minn > cost + desclen) {
2730 minn = cost + desclen;
2733 if (minn == cost + desclen) {
2734 descrecon += desc->numreconst[j];
2737 p->cumlengths[i] += minn;
2738 p->numreconst[i] *= descrecon;
2740 p->initialized = true;
2744 void minpostorder(node *p, pointarray treenode)
2746 /* traverses an n-ary tree, computing minimum steps at each node */
2755 minpostorder(q->back, treenode);
2758 if (!p->initialized) {
2762 compmin(p, q->back);
2766 } /* minpostorder */
2769 void branchlength(node *subtr1, node *subtr2, double *brlen,
2770 pointarray treenode)
2772 /* computes a branch length between two subtrees for a given site */
2773 long i, j, minn, cost, nom, denom;
2781 if (subtr1->index == outgrno) {
2786 minpostorder(subtr1, treenode);
2787 minpostorder(subtr2, treenode);
2791 for (i = (long)A; i <= (long)O; i++) {
2792 for (j = (long)A; j <= (long)O; j++) {
2796 ((i == (long)A) || (i == (long)G))
2797 && ((j == (long)A) || (j == (long)G))
2800 ((j == (long)C) || (j == (long)T))
2801 && ((i == (long)C) || (i == (long)T))
2813 if (subtr1->cumlengths[i] != -1 && (subtr2->cumlengths[j] != -1)) {
2814 if (subtr1->cumlengths[i] + cost + subtr2->cumlengths[j] < minn) {
2815 minn = subtr1->cumlengths[i] + cost + subtr2->cumlengths[j];
2819 if (subtr1->cumlengths[i] + cost + subtr2->cumlengths[j] == minn) {
2820 nom += subtr1->numreconst[i] * subtr2->numreconst[j] * cost;
2821 denom += subtr1->numreconst[i] * subtr2->numreconst[j];
2826 *brlen = (double)nom/(double)denom;
2827 } /* branchlength */
2830 void printbranchlengths(node *p)
2839 fprintf(outfile, "%6ld ",q->index - spp);
2841 for (i = 0; i < nmlngth; i++)
2842 putc(nayme[q->back->index - 1][i], outfile);
2844 fprintf(outfile, "%6ld ", q->back->index - spp);
2845 fprintf(outfile, " %f\n",q->v);
2847 printbranchlengths(q->back);
2850 } /* printbranchlengths */
2853 void branchlentrav(node *p, node *root, long sitei, long chars,
2854 double *brlen, pointarray treenode)
2856 /* traverses the tree computing tree length at each branch */
2861 if (p->index == outgrno)
2866 branchlength(q, q->back, brlen, treenode);
2867 q->v += ((weight[sitei - 1] / 10.0) * (*brlen)/chars);
2868 q->back->v += ((weight[sitei - 1] / 10.0) * (*brlen)/chars);
2870 branchlentrav(q->back, root, sitei, chars, brlen, treenode);
2874 } /* branchlentrav */
2877 void treelength(node *root, long chars, pointarray treenode)
2879 /* calls branchlentrav at each site */
2883 initbranchlen(root);
2884 for (sitei = 1; sitei <= endsite; sitei++) {
2886 initbase(root, sitei);
2887 inittreetrav(root, sitei);
2888 branchlentrav(root, root, sitei, chars, &trlen, treenode);
2893 void coordinates(node *p, long *tipy, double f, long *fartemp)
2895 /* establishes coordinates of nodes for display without lengths */
2896 node *q, *first, *last;
2897 node *mid1 = NULL, *mid2 = NULL;
2898 long numbranches, numb2;
2911 coordinates(q->back, tipy, f, fartemp);
2915 first = p->next->back;
2917 while (q->next != p)
2923 if (numb2 == (long)(numbranches + 1)/2)
2925 if (numb2 == (long)(numbranches/2 + 1))
2930 p->xcoord = (long)((double)(last->ymax - first->ymin) * f);
2931 p->ycoord = (long)((mid1->ycoord + mid2->ycoord) / 2);
2932 p->ymin = first->ymin;
2933 p->ymax = last->ymax;
2934 if (p->xcoord > *fartemp)
2935 *fartemp = p->xcoord;
2939 void drawline(long i, double scale, node *root)
2941 /* draws one row of the tree diagram by moving up tree */
2942 node *p, *q, *r, *first =NULL, *last =NULL;
2944 boolean extra, done, noplus;
2950 if (i == (long)p->ycoord && p == root) {
2951 if (p->index - spp >= 10)
2952 fprintf(outfile, " %2ld", p->index - spp);
2954 fprintf(outfile, " %ld", p->index - spp);
2958 fprintf(outfile, " ");
2964 if (i >= r->back->ymin && i <= r->back->ymax) {
2969 } while (!(done || r == p));
2970 first = p->next->back;
2972 while (r->next != p)
2977 n = (long)(scale * (p->xcoord - q->xcoord) + 0.5);
2978 if (n < 3 && !q->tip)
2984 if ((long)q->ycoord == i && !done) {
2992 for (j = 1; j <= n - 2; j++)
2994 if (q->index - spp >= 10)
2995 fprintf(outfile, "%2ld", q->index - spp);
2997 fprintf(outfile, "-%ld", q->index - spp);
3001 for (j = 1; j < n; j++)
3004 } else if (!p->tip) {
3005 if ((long)last->ycoord > i && (long)first->ycoord < i
3006 && i != (long)p->ycoord) {
3008 for (j = 1; j < n; j++)
3011 for (j = 1; j <= n; j++)
3016 for (j = 1; j <= n; j++)
3023 if ((long)p->ycoord == i && p->tip) {
3024 for (j = 0; j < nmlngth; j++)
3025 putc(nayme[p->index - 1][j], outfile);
3027 putc('\n', outfile);
3031 void printree(node *root, double f)
3033 /* prints out diagram of the tree */
3034 /* used in dnacomp, dnapars, & dnapenny */
3035 long i, tipy, dummy;
3038 putc('\n', outfile);
3041 putc('\n', outfile);
3044 coordinates(root, &tipy, f, &dummy);
3046 putc('\n', outfile);
3047 for (i = 1; i <= (tipy - down); i++)
3048 drawline(i, scale, root);
3049 fprintf(outfile, "\n remember:");
3051 fprintf(outfile, " (although rooted by outgroup)");
3052 fprintf(outfile, " this is an unrooted tree!\n\n");
3056 void writesteps(long chars, boolean weights, steptr oldweight, node *root)
3058 /* used in dnacomp, dnapars, & dnapenny */
3061 putc('\n', outfile);
3063 fprintf(outfile, "weighted ");
3064 fprintf(outfile, "steps in each site:\n");
3065 fprintf(outfile, " ");
3066 for (i = 0; i <= 9; i++)
3067 fprintf(outfile, "%4ld", i);
3068 fprintf(outfile, "\n *------------------------------------");
3069 fprintf(outfile, "-----\n");
3070 for (i = 0; i <= (chars / 10); i++) {
3071 fprintf(outfile, "%5ld", i * 10);
3073 for (j = 0; j <= 9; j++) {
3075 if (k == 0 || k > chars)
3076 fprintf(outfile, " ");
3078 l = location[ally[k - 1] - 1];
3079 if (oldweight[k - 1] > 0)
3080 fprintf(outfile, "%4ld",
3082 (root->numsteps[l - 1] / weight[l - 1]));
3084 fprintf(outfile, " 0");
3087 putc('\n', outfile);
3092 void treeout(node *p, long nextree, long *col, node *root)
3094 /* write out file with representation of final tree */
3095 /* used in dnacomp, dnamove, dnapars, & dnapenny */
3102 for (i = 1; i <= nmlngth; i++) {
3103 if (nayme[p->index - 1][i - 1] != ' ')
3106 for (i = 0; i < n; i++) {
3107 c = nayme[p->index - 1][i];
3118 treeout(q->back, nextree, col, root);
3125 putc('\n', outtree);
3135 fprintf(outtree, "[%6.4f];\n", 1.0 / (nextree - 1));
3137 fprintf(outtree, ";\n");
3141 void treeout3(node *p, long nextree, long *col, node *root)
3143 /* write out file with representation of final tree */
3144 /* used in dnapars -- writes branch lengths */
3152 for (i = 1; i <= nmlngth; i++) {
3153 if (nayme[p->index - 1][i - 1] != ' ')
3156 for (i = 0; i < n; i++) {
3157 c = nayme[p->index - 1][i];
3168 treeout3(q->back, nextree, col, root);
3175 putc('\n', outtree);
3184 w = (long)(0.43429448222 * log(x));
3188 w = (long)(0.43429448222 * log(-x)) + 1;
3192 fprintf(outtree, ":%*.5f", (int)(w + 7), x);
3198 fprintf(outtree, "[%6.4f];\n", 1.0 / (nextree - 1));
3200 fprintf(outtree, ";\n");
3204 void drawline2(long i, double scale, tree curtree)
3206 /* draws one row of the tree diagram by moving up tree */
3207 /* used in dnaml, proml, & restml */
3211 node *r, *first =NULL, *last =NULL;
3217 if (i == (long)p->ycoord && p == curtree.start) {
3218 if (p->index - spp >= 10)
3219 fprintf(outfile, " %2ld", p->index - spp);
3221 fprintf(outfile, " %ld", p->index - spp);
3224 fprintf(outfile, " ");
3230 if (i >= r->back->ymin && i <= r->back->ymax) {
3235 } while (!(done || (p != curtree.start && r == p) ||
3236 (p == curtree.start && r == p->next)));
3237 first = p->next->back;
3239 while (r->next != p)
3242 if (p == curtree.start)
3245 done = (p->tip || p == q);
3246 n = (long)(scale * (q->xcoord - p->xcoord) + 0.5);
3247 if (n < 3 && !q->tip)
3253 if ((long)q->ycoord == i && !done) {
3254 if ((long)p->ycoord != (long)q->ycoord)
3259 for (j = 1; j <= n - 2; j++)
3261 if (q->index - spp >= 10)
3262 fprintf(outfile, "%2ld", q->index - spp);
3264 fprintf(outfile, "-%ld", q->index - spp);
3267 for (j = 1; j < n; j++)
3270 } else if (!p->tip) {
3271 if ((long)last->ycoord > i && (long)first->ycoord < i &&
3272 (i != (long)p->ycoord || p == curtree.start)) {
3274 for (j = 1; j < n; j++)
3277 for (j = 1; j <= n; j++)
3281 for (j = 1; j <= n; j++)
3287 if ((long)p->ycoord == i && p->tip) {
3288 for (j = 0; j < nmlngth; j++)
3289 putc(nayme[p->index-1][j], outfile);
3291 putc('\n', outfile);
3295 void drawline3(long i, double scale, node *start)
3297 /* draws one row of the tree diagram by moving up tree */
3298 /* used in dnapars */
3302 node *r, *first =NULL, *last =NULL;
3308 if (i == (long)p->ycoord) {
3309 if (p->index - spp >= 10)
3310 fprintf(outfile, " %2ld", p->index - spp);
3312 fprintf(outfile, " %ld", p->index - spp);
3315 fprintf(outfile, " ");
3321 if (i >= r->back->ymin && i <= r->back->ymax) {
3326 } while (!(done || (r == p)));
3327 first = p->next->back;
3329 while (r->next != p)
3333 done = (p->tip || p == q);
3334 n = (long)(scale * (q->xcoord - p->xcoord) + 0.5);
3335 if (n < 3 && !q->tip)
3341 if ((long)q->ycoord == i && !done) {
3342 if ((long)p->ycoord != (long)q->ycoord)
3347 for (j = 1; j <= n - 2; j++)
3349 if (q->index - spp >= 10)
3350 fprintf(outfile, "%2ld", q->index - spp);
3352 fprintf(outfile, "-%ld", q->index - spp);
3355 for (j = 1; j < n; j++)
3358 } else if (!p->tip) {
3359 if ((long)last->ycoord > i && (long)first->ycoord < i &&
3360 (i != (long)p->ycoord || p == start)) {
3362 for (j = 1; j < n; j++)
3365 for (j = 1; j <= n; j++)
3369 for (j = 1; j <= n; j++)
3375 if ((long)p->ycoord == i && p->tip) {
3376 for (j = 0; j < nmlngth; j++)
3377 putc(nayme[p->index-1][j], outfile);
3379 putc('\n', outfile);
3383 void copynode(node *c, node *d, long categs)
3387 for (i = 0; i < endsite; i++)
3388 for (j = 0; j < categs; j++)
3389 memcpy(d->x[i][j], c->x[i][j], sizeof(sitelike));
3390 memcpy(d->underflows,c->underflows,sizeof(double) * endsite);
3393 d->xcoord = c->xcoord;
3394 d->ycoord = c->ycoord;
3397 d->iter = c->iter; /* iter used in dnaml only */
3398 d->haslength = c->haslength; /* haslength used in dnamlk only */
3399 d->initialized = c->initialized; /* initialized used in dnamlk only */
3403 void prot_copynode(node *c, node *d, long categs)
3405 /* a version of copynode for proml */
3408 for (i = 0; i < endsite; i++)
3409 for (j = 0; j < categs; j++)
3410 memcpy(d->protx[i][j], c->protx[i][j], sizeof(psitelike));
3411 memcpy(d->underflows,c->underflows,sizeof(double) * endsite);
3414 d->xcoord = c->xcoord;
3415 d->ycoord = c->ycoord;
3418 d->iter = c->iter; /* iter used in dnaml only */
3419 d->haslength = c->haslength; /* haslength used in dnamlk only */
3420 d->initialized = c->initialized; /* initialized used in dnamlk only */
3421 } /* prot_copynode */
3424 void copy_(tree *a, tree *b, long nonodes, long categs)
3426 /* used in dnamlk */
3428 node *p, *q, *r, *s, *t;
3430 for (i = 0; i < spp; i++) {
3431 copynode(a->nodep[i], b->nodep[i], categs);
3432 if (a->nodep[i]->back) {
3433 if (a->nodep[i]->back == a->nodep[a->nodep[i]->back->index - 1])
3434 b->nodep[i]->back = b->nodep[a->nodep[i]->back->index - 1];
3435 else if (a->nodep[i]->back == a->nodep[a->nodep[i]->back->index - 1]->next)
3436 b->nodep[i]->back = b->nodep[a->nodep[i]->back->index - 1]->next;
3438 b->nodep[i]->back = b->nodep[a->nodep[i]->back->index - 1]->next->next;
3440 else b->nodep[i]->back = NULL;
3442 for (i = spp; i < nonodes; i++) {
3448 copynode(p, q, categs);
3450 s = a->nodep[p->back->index - 1];
3451 t = b->nodep[p->back->index - 1];
3461 } while (s != a->nodep[p->back->index - 1]);
3471 b->likelihood = a->likelihood;
3472 b->start = a->start; /* start used in dnaml only */
3473 b->root = a->root; /* root used in dnamlk only */
3477 void prot_copy_(tree *a, tree *b, long nonodes, long categs)
3479 /* used in promlk */
3480 /* identical to copy_() except for calls to prot_copynode rather */
3481 /* than copynode. */
3483 node *p, *q, *r, *s, *t;
3485 for (i = 0; i < spp; i++) {
3486 prot_copynode(a->nodep[i], b->nodep[i], categs);
3487 if (a->nodep[i]->back) {
3488 if (a->nodep[i]->back == a->nodep[a->nodep[i]->back->index - 1])
3489 b->nodep[i]->back = b->nodep[a->nodep[i]->back->index - 1];
3490 else if (a->nodep[i]->back == a->nodep[a->nodep[i]->back->index - 1]->next
3492 b->nodep[i]->back = b->nodep[a->nodep[i]->back->index - 1]->next;
3494 b->nodep[i]->back = b->nodep[a->nodep[i]->back->index - 1]->next->next;
3496 else b->nodep[i]->back = NULL;
3498 for (i = spp; i < nonodes; i++) {
3504 prot_copynode(p, q, categs);
3506 s = a->nodep[p->back->index - 1];
3507 t = b->nodep[p->back->index - 1];
3518 } while (s != a->nodep[p->back->index - 1]);
3528 b->likelihood = a->likelihood;
3529 b->start = a->start; /* start used in dnaml only */
3530 b->root = a->root; /* root used in dnamlk only */
3534 void standev(long chars, long numtrees, long minwhich, double minsteps,
3535 double *nsteps, long **fsteps, longer seed)
3536 { /* do paired sites test (KHT or SH test) on user-defined trees */
3537 /* used in dnapars & protpars */
3539 double wt, sumw, sum, sum2, sd;
3541 double **covar, *P, *f, *r;
3543 #define SAMPLES 1000
3544 if (numtrees == 2) {
3545 fprintf(outfile, "Kishino-Hasegawa-Templeton test\n\n");
3546 fprintf(outfile, "Tree Steps Diff Steps Its S.D.");
3547 fprintf(outfile, " Significantly worse?\n\n");
3549 while (which <= numtrees) {
3550 fprintf(outfile, "%3ld%10.1f", which, nsteps[which - 1] / 10);
3551 if (minwhich == which)
3552 fprintf(outfile, " <------ best\n");
3557 for (i = 0; i < endsite; i++) {
3558 if (weight[i] > 0) {
3559 wt = weight[i] / 10.0;
3561 temp = (fsteps[which - 1][i] - fsteps[minwhich - 1][i]) / 10.0;
3563 sum2 += wt * temp * temp;
3566 sd = sqrt(sumw / (sumw - 1.0) * (sum2 - sum * sum / sumw));
3567 fprintf(outfile, "%10.1f%12.4f",
3568 (nsteps[which - 1] - minsteps) / 10, sd);
3569 if ((sum > 0.0) && (sum > 1.95996 * sd))
3570 fprintf(outfile, " Yes\n");
3572 fprintf(outfile, " No\n");
3576 fprintf(outfile, "\n\n");
3577 } else { /* Shimodaira-Hasegawa test using normal approximation */
3578 if(numtrees > MAXSHIMOTREES){
3579 fprintf(outfile, "Shimodaira-Hasegawa test on first %d of %ld trees\n\n"
3580 , MAXSHIMOTREES, numtrees);
3581 numtrees = MAXSHIMOTREES;
3583 fprintf(outfile, "Shimodaira-Hasegawa test\n\n");
3585 covar = (double **)Malloc(numtrees*sizeof(double *));
3587 for (i = 0; i < endsite; i++)
3588 sumw += weight[i] / 10.0;
3589 for (i = 0; i < numtrees; i++)
3590 covar[i] = (double *)Malloc(numtrees*sizeof(double));
3591 for (i = 0; i < numtrees; i++) { /* compute covariances of trees */
3592 sum = nsteps[i]/(10.0*sumw);
3593 for (j = 0; j <=i; j++) {
3594 sum2 = nsteps[j]/(10.0*sumw);
3596 for (k = 0; k < endsite; k++) {
3597 if (weight[k] > 0) {
3598 wt = weight[k]/10.0;
3599 temp = temp + wt*(fsteps[i][k]/10.0-sum)
3600 *(fsteps[j][k]/10.0-sum2);
3608 for (i = 0; i < numtrees; i++) { /* in-place Cholesky decomposition
3609 of trees x trees covariance matrix */
3611 for (j = 0; j <= i-1; j++)
3612 sum = sum + covar[i][j] * covar[i][j];
3613 if (covar[i][i] <= sum)
3616 temp = sqrt(covar[i][i] - sum);
3618 for (j = i+1; j < numtrees; j++) {
3620 for (k = 0; k < i; k++)
3621 sum = sum + covar[i][k] * covar[j][k];
3622 if (fabs(temp) < 1.0E-12)
3625 covar[j][i] = (covar[j][i] - sum)/temp;
3628 f = (double *)Malloc(numtrees*sizeof(double)); /* resampled sums */
3629 P = (double *)Malloc(numtrees*sizeof(double)); /* vector of P's of trees */
3630 r = (double *)Malloc(numtrees*sizeof(double)); /* store Normal variates */
3631 for (i = 0; i < numtrees; i++)
3633 sum2 = nsteps[0]/10.0; /* sum2 will be smallest # of steps */
3634 for (i = 1; i < numtrees; i++)
3635 if (sum2 > nsteps[i]/10.0)
3636 sum2 = nsteps[i]/10.0;
3637 for (i = 1; i <= SAMPLES; i++) { /* loop over resampled trees */
3638 for (j = 0; j < numtrees; j++) /* draw Normal variates */
3639 r[j] = normrand(seed);
3640 for (j = 0; j < numtrees; j++) { /* compute vectors */
3642 for (k = 0; k <= j; k++)
3643 sum += covar[j][k]*r[k];
3647 for (j = 1; j < numtrees; j++) /* get min of vector */
3650 for (j = 0; j < numtrees; j++) /* accumulate P's */
3651 if (nsteps[j]/10.0-sum2 <= f[j] - sum)
3652 P[j] += 1.0/SAMPLES;
3654 fprintf(outfile, "Tree Steps Diff Steps P value");
3655 fprintf(outfile, " Significantly worse?\n\n");
3656 for (i = 0; i < numtrees; i++) {
3657 fprintf(outfile, "%3ld%10.1f", i+1, nsteps[i]/10);
3658 if ((minwhich-1) == i)
3659 fprintf(outfile, " <------ best\n");
3661 fprintf(outfile, " %9.1f %10.3f", nsteps[i]/10.0-sum2, P[i]);
3663 fprintf(outfile, " Yes\n");
3665 fprintf(outfile, " No\n");
3668 fprintf(outfile, "\n");
3669 free(P); /* free the variables we Malloc'ed */
3672 for (i = 0; i < numtrees; i++)
3679 void standev2(long numtrees, long maxwhich, long a, long b, double maxlogl,
3680 double *l0gl, double **l0gf, steptr aliasweight, longer seed)
3681 { /* do paired sites test (KHT or SH) for user-defined trees */
3682 /* used in dnaml, dnamlk, proml, promlk, and restml */
3683 double **covar, *P, *f, *r;
3685 double wt, sumw, sum, sum2, sd;
3688 #define SAMPLES 1000
3689 if (numtrees == 2) {
3690 fprintf(outfile, "Kishino-Hasegawa-Templeton test\n\n");
3691 fprintf(outfile, "Tree logL Diff logL Its S.D.");
3692 fprintf(outfile, " Significantly worse?\n\n");
3694 while (which <= numtrees) {
3695 fprintf(outfile, "%3ld %9.1f", which, l0gl[which - 1]);
3696 if (maxwhich == which)
3697 fprintf(outfile, " <------ best\n");
3702 for (i = a; i <= b; i++) {
3703 if (aliasweight[i] > 0) {
3704 wt = aliasweight[i];
3706 temp = l0gf[which - 1][i] - l0gf[maxwhich - 1][i];
3708 sum2 += wt * temp * temp;
3712 sd = sqrt(sumw / (sumw - 1.0) * (sum2 - sum * sum / sumw ));
3713 fprintf(outfile, "%10.1f %11.4f", (l0gl[which - 1])-maxlogl, sd);
3714 if ((sum < 0.0) && ((-sum) > 1.95996 * sd))
3715 fprintf(outfile, " Yes\n");
3717 fprintf(outfile, " No\n");
3721 fprintf(outfile, "\n\n");
3722 } else { /* Shimodaira-Hasegawa test using normal approximation */
3723 if(numtrees > MAXSHIMOTREES){
3724 fprintf(outfile, "Shimodaira-Hasegawa test on first %d of %ld trees\n\n"
3725 , MAXSHIMOTREES, numtrees);
3726 numtrees = MAXSHIMOTREES;
3728 fprintf(outfile, "Shimodaira-Hasegawa test\n\n");
3730 covar = (double **)Malloc(numtrees*sizeof(double *));
3732 for (i = a; i <= b; i++)
3733 sumw += aliasweight[i];
3734 for (i = 0; i < numtrees; i++)
3735 covar[i] = (double *)Malloc(numtrees*sizeof(double));
3736 for (i = 0; i < numtrees; i++) { /* compute covariances of trees */
3738 for (j = 0; j <=i; j++) {
3739 sum2 = l0gl[j]/sumw;
3741 for (k = a; k <= b ; k++) {
3742 if (aliasweight[k] > 0) {
3743 wt = aliasweight[k];
3744 temp = temp + wt*(l0gf[i][k]-sum)
3753 for (i = 0; i < numtrees; i++) { /* in-place Cholesky decomposition
3754 of trees x trees covariance matrix */
3756 for (j = 0; j <= i-1; j++)
3757 sum = sum + covar[i][j] * covar[i][j];
3758 if (covar[i][i] <= sum)
3761 temp = sqrt(covar[i][i] - sum);
3763 for (j = i+1; j < numtrees; j++) {
3765 for (k = 0; k < i; k++)
3766 sum = sum + covar[i][k] * covar[j][k];
3767 if (fabs(temp) < 1.0E-12)
3770 covar[j][i] = (covar[j][i] - sum)/temp;
3773 f = (double *)Malloc(numtrees*sizeof(double)); /* resampled likelihoods */
3774 P = (double *)Malloc(numtrees*sizeof(double)); /* vector of P's of trees */
3775 r = (double *)Malloc(numtrees*sizeof(double)); /* store Normal variates */
3776 for (i = 0; i < numtrees; i++)
3778 for (i = 1; i <= SAMPLES; i++) { /* loop over resampled trees */
3779 for (j = 0; j < numtrees; j++) /* draw Normal variates */
3780 r[j] = normrand(seed);
3781 for (j = 0; j < numtrees; j++) { /* compute vectors */
3783 for (k = 0; k <= j; k++)
3784 sum += covar[j][k]*r[k];
3788 for (j = 1; j < numtrees; j++) /* get max of vector */
3791 for (j = 0; j < numtrees; j++) /* accumulate P's */
3792 if (maxlogl-l0gl[j] <= sum-f[j])
3793 P[j] += 1.0/SAMPLES;
3795 fprintf(outfile, "Tree logL Diff logL P value");
3796 fprintf(outfile, " Significantly worse?\n\n");
3797 for (i = 0; i < numtrees; i++) {
3798 fprintf(outfile, "%3ld%10.1f", i+1, l0gl[i]);
3799 if ((maxwhich-1) == i)
3800 fprintf(outfile, " <------ best\n");
3802 fprintf(outfile, " %9.1f %10.3f", l0gl[i]-maxlogl, P[i]);
3804 fprintf(outfile, " Yes\n");
3806 fprintf(outfile, " No\n");
3809 fprintf(outfile, "\n");
3810 free(P); /* free the variables we Malloc'ed */
3813 for (i = 0; i < numtrees; i++)
3820 void freetip(node *anode)
3822 /* used in dnacomp, dnapars, & dnapenny */
3824 free(anode->numsteps);
3825 free(anode->oldnumsteps);
3827 free(anode->oldbase);
3831 void freenontip(node *anode)
3833 /* used in dnacomp, dnapars, & dnapenny */
3835 free(anode->numsteps);
3836 free(anode->oldnumsteps);
3838 free(anode->oldbase);
3839 free(anode->numnuc);
3843 void freenodes(long nonodes, pointarray treenode)
3845 /* used in dnacomp, dnapars, & dnapenny */
3849 for (i = 0; i < spp; i++)
3850 freetip(treenode[i]);
3851 for (i = spp; i < nonodes; i++) {
3852 if (treenode[i] != NULL) {
3853 p = treenode[i]->next;
3857 } while (p != treenode[i]);
3864 void freenode(node **anode)
3866 /* used in dnacomp, dnapars, & dnapenny */
3873 void freetree(long nonodes, pointarray treenode)
3875 /* used in dnacomp, dnapars, & dnapenny */
3879 for (i = 0; i < spp; i++)
3881 for (i = spp; i < nonodes; i++) {
3882 if (treenode[i] != NULL) {
3883 p = treenode[i]->next;
3888 } while (p != treenode[i]);
3896 void prot_freex_notip(long nonodes, pointarray treenode)
3902 for (i = spp; i < nonodes; i++) {
3904 if ( p == NULL ) continue;
3906 for (j = 0; j < endsite; j++){
3913 } while (p != treenode[i]);
3915 } /* prot_freex_notip */
3918 void prot_freex(long nonodes, pointarray treenode)
3924 for (i = 0; i < spp; i++) {
3925 for (j = 0; j < endsite; j++)
3926 free(treenode[i]->protx[j]);
3927 free(treenode[i]->protx);
3929 for (i = spp; i < nonodes; i++) {
3932 for (j = 0; j < endsite; j++)
3936 } while (p != treenode[i]);
3941 void freex_notip(long nonodes, pointarray treenode)
3943 /* used in dnaml & dnamlk */
3947 for (i = spp; i < nonodes; i++) {
3949 if ( p == NULL ) continue;
3951 for (j = 0; j < endsite; j++)
3955 } while (p != treenode[i]);
3960 void freex(long nonodes, pointarray treenode)
3962 /* used in dnaml & dnamlk */
3966 for (i = 0; i < spp; i++) {
3967 for (j = 0; j < endsite; j++)
3968 free(treenode[i]->x[j]);
3969 free(treenode[i]->x);
3971 for (i = spp; i < nonodes; i++) {
3975 for (j = 0; j < endsite; j++)
3979 } while (p != treenode[i]);
3985 void freex2(long nonodes, pointarray treenode)
3987 /* used in restml */
3991 for (i = 0; i < spp; i++)
3992 free(treenode[i]->x2);
3993 for (i = spp; i < nonodes; i++) {
3995 for (j = 1; j <= 3; j++) {
4003 void freegarbage(gbases **garbage)
4005 /* used in dnacomp, dnapars, & dnapenny */
4010 *garbage = (*garbage)->next;
4017 void freegrbg(node **grbg)
4019 /* used in dnacomp, dnapars, & dnapenny */
4024 *grbg = (*grbg)->next;
4031 void collapsetree(node *p, node *root, node **grbg, pointarray treenode,
4034 /* Recurse through tree searching for zero length brances between */
4035 /* nodes (not to tips). If one exists, collapse the nodes together, */
4036 /* removing the branch. */
4037 node *q, *x1, *y1, *x2, *y2;
4038 long i, j, index, index2, numd;
4043 if (!q->back->tip && q->v == 0.000000) {
4044 /* merge the two nodes. */
4046 x2 = y1 = q->back->next;
4047 while(x1->next != q)
4049 while(y1->next != q->back)
4055 index2 = q->back->index;
4056 numd = treenode[index-1]->numdesc + q->back->numdesc -1;
4057 chucktreenode(grbg, q->back);
4058 chucktreenode(grbg, q);
4061 /* update the indicies around the node circle */
4063 if(q->index != index){
4068 updatenumdesc(treenode[index-1], root, numd);
4070 /* Alter treenode to point to real nodes, and update indicies */
4073 for(i = (index2-1); i < nonodes-1 && treenode[i+1]; i++){
4074 treenode[i]=treenode[i+1];
4075 treenode[i+1] = NULL;
4083 /* Create a new empty fork in the blank spot of treenode */
4085 for(i=1; i <=3 ; i++){
4086 gnutreenode(grbg, &x2, index2, endsite, zeros);
4090 x2->next->next->next = x2;
4091 treenode[nonodes-1]=x2;
4093 collapsetree(q->back, root, grbg, treenode, zeros);
4096 collapsetree(q->back, root, grbg, treenode, zeros);
4100 } /* collapsetree */
4103 void collapsebestrees(node **root, node **grbg, pointarray treenode,
4104 bestelm *bestrees, long *place, long *zeros,
4105 long chars, boolean recompute, boolean progress)
4108 /* Goes through all best trees, collapsing trees where possible, and */
4109 /* deleting trees that are not unique. */
4110 long i,j, k, pos, nextnode, oldnextree;
4114 oldnextree = nextree;
4115 for(i = 0 ; i < (oldnextree - 1) ; i++){
4116 bestrees[i].collapse = true;
4120 printf("Collapsing best trees\n ");
4122 for(i = 0 ; i < (oldnextree - 1) ; i++){
4124 if(i % (((oldnextree-1) / 72) + 1) == 0)
4128 while(!bestrees[k].collapse)
4130 /* Reconstruct tree. */
4131 *root = treenode[0];
4132 add(treenode[0], treenode[1], treenode[spp], root, recompute,
4133 treenode, grbg, zeros);
4135 for (j = 3; j <= spp; j++) {
4136 if (bestrees[k].btree[j - 1] > 0)
4137 add(treenode[bestrees[k].btree[j - 1] - 1], treenode[j - 1],
4138 treenode[nextnode++ - 1], root, recompute, treenode, grbg,
4141 add(treenode[treenode[-bestrees[k].btree[j - 1]-1]->back->index-1],
4142 treenode[j - 1], NULL, root, recompute, treenode, grbg, zeros);
4144 reroot(treenode[outgrno - 1], *root);
4146 treelength(*root, chars, treenode);
4147 collapsetree(*root, *root, grbg, treenode, zeros);
4148 savetree(*root, place, treenode, grbg, zeros);
4149 /* move everything down in the bestree list */
4150 for(j = k ; j < (nextree - 2) ; j++){
4151 memcpy(bestrees[j].btree, bestrees[j + 1].btree, spp * sizeof(long));
4152 bestrees[j].gloreange = bestrees[j + 1].gloreange;
4153 bestrees[j + 1].gloreange = false;
4154 bestrees[j].locreange = bestrees[j + 1].locreange;
4155 bestrees[j + 1].locreange = false;
4156 bestrees[j].collapse = bestrees[j + 1].collapse;
4159 findtree(&found, &pos, nextree-1, place, bestrees);
4161 /* put the new tree at the end of the list if it wasn't found */
4164 addtree(pos, &nextree, false, place, bestrees);
4166 /* Deconstruct the tree */
4167 for (j = 1; j < spp; j++){
4168 re_move(treenode[j], &dummy, root, recompute, treenode,
4175 phyFillScreenColor();