]> git.donarmstrong.com Git - ape.git/blob - src/plot_phylo.c
cleaning of C files and update on simulation of OU process
[ape.git] / src / plot_phylo.c
1 /* plot_phylo.c (2011-06-23) */
2
3 /* Copyright 2004-2011 Emmanuel Paradis
4
5 /* This file is part of the R-package `ape'. */
6 /* See the file ../COPYING for licensing issues. */
7
8 #include <R.h>
9
10 void node_depth_edgelength(int *ntip, int *nnode, int *edge1, int *edge2,
11                            int *nedge, double *edge_length, double *xx)
12 {
13     int i;
14
15     /* We do a preorder tree traversal starting from the bottom */
16     /* of `edge'; we assume `xx' has 0 for the root and the tree */
17     /* is in pruningwise order. */
18     for (i = *nedge - 1; i >= 0; i--)
19       xx[edge2[i] - 1] = xx[edge1[i] - 1] + edge_length[i];
20 }
21
22 void node_depth(int *ntip, int *nnode, int *edge1, int *edge2,
23                 int *nedge, double *xx)
24 {
25     int i;
26
27     /* First set the coordinates for all tips */
28     for (i = 0; i < *ntip; i++) xx[i] = 1;
29
30     /* Then compute recursively for the nodes; we assume `xx' has */
31     /* been initialized with 0's which is true if it has been */
32     /* created in R (the tree must be in pruningwise order) */
33     for (i = 0; i < *nedge; i++)
34       xx[edge1[i] - 1] = xx[edge1[i] - 1] + xx[edge2[i] - 1];
35 }
36
37 void node_height(int *ntip, int *nnode, int *edge1, int *edge2,
38                 int *nedge, double *yy)
39 {
40     int i, n;
41     double S;
42
43     /* The coordinates of the tips have been already computed */
44
45     S = 0;
46     n = 0;
47     for (i = 0; i < *nedge; i++) {
48         S += yy[edge2[i] - 1];
49         n += 1;
50         if (edge1[i + 1] != edge1[i]) {
51             yy[edge1[i] - 1] = S/n;
52             S = 0;
53             n = 0;
54         }
55     }
56 }
57
58 void node_height_clado(int *ntip, int *nnode, int *edge1, int *edge2,
59                        int *nedge, double *xx, double *yy)
60 {
61     int i, n;
62     double S;
63
64     node_depth(ntip, nnode, edge1, edge2, nedge, xx);
65
66     /* The coordinates of the tips have been already computed */
67
68     S = 0;
69     n = 0;
70     for (i = 0; i < *nedge; i++) {
71         S += yy[edge2[i] - 1] * xx[edge2[i] - 1];
72         n += xx[edge2[i] - 1];
73         if (edge1[i + 1] != edge1[i]) {
74             yy[edge1[i] - 1] = S/n;
75             S = 0;
76             n = 0;
77         }
78     }
79 }
80
81 void get_single_index_integer(int *x, int *val, int *index)
82 {
83         while (x[*index] != *val) (*index)++;
84         *index += 1;
85 }
86
87 void get_two_index_integer(int *x, int *val, int *index)
88 {
89         while (x[index[0]] != *val) index[0]++;
90         index[1] = index[0] + 1;
91         while (x[index[1]] != *val) index[1]++;
92         index[0] += 1;
93         index[1] += 1;
94 }