import os
os.environ['R_HOME'] = '/home/cfriedline/lib64/R'
import rpy2.robjects as robjects
import random
import string
import tempfile
import dendropy
from multiprocessing import Pool
r = robjects.r
ape = r('library(ape)')
def create_tree(num_tips, type):
"""
creates the taxa tree in R
@param num_tips: number of taxa to create
@param type: type for naming (e.g., 'taxa')
@return: a dendropy Tree
@rtype: dendropy.Tree
"""
r = robjects.r
robjects.globalenv['numtips'] = num_tips
robjects.globalenv['treetype'] = type
name = _get_random_string(20)
if type == "T":
r("%s = rtree(numtips, rooted=T, tip.label=paste(treetype, seq(1:(numtips)), sep=''))" % name)
else:
r("%s = rtree(numtips, rooted=F, tip.label=paste(treetype, seq(1:(numtips)), sep=''))" % name)
tree = r[name]
return ape_to_dendropy(tree)
def ape_to_dendropy(phylo):
"""
converts an ape tree to dendropy tree
@param phylo: ape instance from rpy2
@return: a dendropy tree
@rtype: dendropy.Tree
"""
f = tempfile.NamedTemporaryFile()
robjects.r['write.nexus'](phylo, file=f.name)
tree = dendropy.Tree.get_from_path(f.name, "nexus")
f.close()
return tree
def _get_random_string(length):
"""
gets a random string of letters/numbers, ensuring that it does not start with a
number
@param length: length of the string
@return: the random string
@rtype: string
"""
s = ''.join(random.choice(string.letters + string.digits) for i in xrange(length))
if not s[0] in string.letters:
return _get_random_string(length)
return s
tree = create_tree(100, "T")
tree.as_newick_string()[0:80]
'((((((((T82:0.6231970771,(T94:0.4972914483,T65:0.1885578725):0.3080936125):0.260'
def create_tree_mp(num_taxa):
t = create_tree(num_taxa, "T")
return t
def get_taxa_trees(num_trees, num_taxa):
jobs_mp = []
jobs = []
res = []
pool = Pool(num_trees)
for i in xrange(num_trees):
jobs_mp.append(pool.apply_async(create_tree_mp, (num_taxa,)))
jobs.append(create_tree_mp(num_taxa))
pool.close()
pool.join()
res.append(jobs)
res.append([x.get() for x in jobs_mp])
return res
trees = get_taxa_trees(5, 10)
for t in trees[0]:
print t.as_newick_string()[0:80]
(((T3:0.2269473344,((T2:0.1200612716,T5:0.0573881655):0.9391158754,T9:0.94033852 ((T9:0.7055083751,(((T1:0.8150142939,T7:0.2128749883):0.5196571311,T4:0.07766074 ((T6:0.8410235606,(T5:0.01358497259,T2:0.4641908032):0.8032400277):0.6838729084, (((T2:0.8350919618,T4:0.3222864345):0.7693860317,T6:0.08913701377):0.1574694319, ((((T9:0.8485502249,T2:0.6824201567):0.5791750827,(T8:0.4604402625,T5:0.14715224
for t in trees[1]:
print t.as_newick_string()[0:80]
(((T3:0.2269473344,((T2:0.1200612716,T5:0.0573881655):0.9391158754,T9:0.94033852 (((T3:0.2269473344,((T2:0.1200612716,T5:0.0573881655):0.9391158754,T9:0.94033852 (((T3:0.2269473344,((T2:0.1200612716,T5:0.0573881655):0.9391158754,T9:0.94033852 (((T3:0.2269473344,((T2:0.1200612716,T5:0.0573881655):0.9391158754,T9:0.94033852 (((T3:0.2269473344,((T2:0.1200612716,T5:0.0573881655):0.9391158754,T9:0.94033852