-
Notifications
You must be signed in to change notification settings - Fork 4
/
TreeUnit_AutocorrelatedExponential.py
executable file
·48 lines (44 loc) · 1.7 KB
/
TreeUnit_AutocorrelatedExponential.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#! /usr/bin/env python3
'''
Niema Moshiri 2017
"TreeUnit" module, where each branch's length (in time units) is multiplied by
a rate that is sampled from an exponential distribution whose scale parameter is
the mutation rate of the parent branch.
'''
from TreeUnit import TreeUnit
import FAVITES_GlobalContext as GC
class TreeUnit_AutocorrelatedExponential(TreeUnit):
def cite():
return [GC.CITATION_FAVITES, GC.CITATION_NUMPY, GC.CITATION_TREESWIFT]
def init():
try:
global exponential
from numpy.random import exponential
except:
from os import chdir
chdir(GC.START_DIR)
assert False, "Error loading NumPy. Install with: pip3 install numpy"
try:
global read_tree_newick
from treeswift import read_tree_newick
except:
from os import chdir
chdir(GC.START_DIR)
assert False, "Error loading TreeSwift. Install with: pip3 install treeswift"
GC.tree_rate_R0 = float(GC.tree_rate_R0)
assert GC.tree_rate_R0 > 0, "tree_rate_R0 must be positive"
def time_to_mutation_rate(tree):
if not hasattr(GC,"NUMPY_SEEDED"):
from numpy.random import seed as numpy_seed
numpy_seed(seed=GC.random_number_seed)
GC.random_number_seed += 1
GC.NUMPY_SEEDED = True
t = read_tree_newick(tree)
for node in t.traverse_preorder():
if node.is_root():
node.rate = GC.tree_rate_R0
else:
node.rate = exponential(scale=node.parent.rate)
if node.edge_length is not None:
node.edge_length *= node.rate
return str(t)