#!/usr/bin/python from PIPRes.tree import * from PIPRes.testing import silentAssertRaises import unittest, re, random, sys class TreeTest(unittest.TestCase): def testSimpleFromSplits(self): silentAssertRaises(self, ValueError, Tree, splits=[1L]) orig = numberedLeafTree('(1,2,3,4)') self.assertEqual(orig, TreeWithSplits(nTaxa=4)) orig = numberedLeafTree('(1,(2,4),3)') fromSplits = TreeWithSplits(splits=[10L], taxLabels= ['a', 'b', 'c', 'd']) self.assertEqual(orig, fromSplits) self.assertEqual(orig, TreeWithSplits(splits=[10L], taxaNamingStyle=TaxaNamingEnum.numbersOnly, nTaxa=4)) def testMoreFromSplits(self): orig = numberedLeafTree('(1,(2,(5,6,4)),3)') fromSplits = TreeWithSplits(splits=[58L, 56L], taxLabels= list('abcdef')) self.assertEqual(orig, fromSplits) self.assertEqual('(a,c,(b,(d,e,f)))', str(fromSplits)) def testPickle(self): from cPickle import dumps, loads orig = numberedLeafTree('(1,(2,(5,6,4)),3)') s = dumps(orig) un = loads(s) self.assertEqual(orig, un) orig = Tree('(a,c,(b,(d,e,f)))') s = dumps(orig) un = loads(s) self.assertEqual(orig, un) # def testRepr(self): # orig = numberedLeafTree('(1,(2,(5,6,4)),3)') # ro = eval(repr(orig)) # self.assertEqual(orig, ro) def testPathLengths(self): orig = numberedLeafTree('(7:1,13:2.5,(8:.5,1:1.5):.5)') self.assertEqual(orig.calcPathLengthMatrix(), [ [0.0], [3.0, 0.0], [2.0, 2.0, 0.0], [4.5, 3.5, 3.5, 0.0]]) #adhTree = numberedLeafTree('(((36:0.110203,35:0.081319):0.034504,21:0.049565):0.035282,(((16:0.175245,25:0.126721):0.035646,((((24:0.079168,22:0.012776):0.092414,((((((19:0.14557,26:0.025517):0.175884,23:0.051321):0.023885,(39:0.066691,11:0.131974):0.008929):0.064732,29:0.204652):0.023569,((((32:0.125502,(33:0.066852,(15:0.074469,8:0.109872):0.091932):0.00181):0.163261,(40:0.139446,9:0.16129):0.027101):0.049767,((41:0.042208,45:0.213429):0.118047,((38:0.093484,34:0.090968):0.024185,31:0.107797):0.0215):0.061184):0.03479,20:0.077868):0.025949):0.038312,(46:0.163153,(14:0.214416,(49:0.056863,(30:0.156199,(53:0.026217,42:0.041076):0.003262):0.011979):0.073526):0.001193):0.12132):0.000218):0.002418,((18:0.170003,17:0.256476):0.066581,(47:0.124598,((43:0.060007,(37:0.118875,(28:0.15417,(6:0.008217,7:0.104564):0.191722):0.034):0.054086):0.039409,(48:0.041529,50:0.070146):0.038896):0.025267):0.165737):0.116465):0.021764,(27:0.204108,((51:0.11746,52:0.106519):0.038002,(54:0.22647,(((12:0.079554,(13:0.111606,(4:0.001334,5:0.099728):0.123663):0.056247):0.000255,10:0.026549):0.092511,(3:0.007347,2:0.036031):0.076107):0.040769):0.04055):0.05365):0.038637):0.000504):0.004369,44:0.106954):0.056133,1:0.25756);') #c #expected = [[0.0], [0.095240, 0.0], [0.095240, 0.019050, 0.0], [0.12381, 0.06667, 0.06667, 0.0], [0.12381, 0.06667, 0.06667, 0.019050, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.019050, 0.0], [0.14286, 0.1619, 0.1619, 0.190480, 0.190480, 0.17143, 0.17143, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.057140, 0.0], [0.095240, 0.03810, 0.03810, 0.047620, 0.047620, 0.14286, 0.14286, 0.1619, 0.14286, 0.0], [0.11429, 0.13333, 0.13333, 0.1619, 0.1619, 0.14286, 0.14286, 0.104760, 0.08571, 0.13333, 0.0], [0.104760, 0.047620, 0.047620, 0.03810, 0.03810, 0.15238, 0.15238, 0.17143, 0.15238, 0.028570, 0.14286, 0.0], [0.11429, 0.057140, 0.057140, 0.028570, 0.028570, 0.1619, 0.1619, 0.18095, 0.1619, 0.03810, 0.15238, 0.028570, 0.0], [0.095240, 0.11429, 0.11429, 0.14286, 0.14286, 0.12381, 0.12381, 0.104760, 0.08571, 0.11429, 0.07619, 0.12381, 0.13333, 0.0], [0.14286, 0.1619, 0.1619, 0.190480, 0.190480, 0.17143, 0.17143, 0.019050, 0.057140, 0.1619, 0.104760, 0.17143, 0.18095, 0.104760, 0.0], [0.047620, 0.08571, 0.08571, 0.11429, 0.11429, 0.11429, 0.11429, 0.13333, 0.11429, 0.08571, 0.104760, 0.095240, 0.104760, 0.08571, 0.13333, 0.0], [0.07619, 0.095240, 0.095240, 0.12381, 0.12381, 0.08571, 0.08571, 0.12381, 0.104760, 0.095240, 0.095240, 0.104760, 0.11429, 0.07619, 0.12381, 0.06667, 0.0], [0.07619, 0.095240, 0.095240, 0.12381, 0.12381, 0.08571, 0.08571, 0.12381, 0.104760, 0.095240, 0.095240, 0.104760, 0.11429, 0.07619, 0.12381, 0.06667, 0.019050, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.11429, 0.095240, 0.14286, 0.047620, 0.15238, 0.1619, 0.08571, 0.11429, 0.11429, 0.104760, 0.104760, 0.0], [0.095240, 0.11429, 0.11429, 0.14286, 0.14286, 0.12381, 0.12381, 0.06667, 0.047620, 0.11429, 0.057140, 0.12381, 0.13333, 0.057140, 0.06667, 0.08571, 0.07619, 0.07619, 0.06667, 0.0], [0.028570, 0.104760, 0.104760, 0.13333, 0.13333, 0.13333, 0.13333, 0.15238, 0.13333, 0.104760, 0.12381, 0.11429, 0.12381, 0.104760, 0.15238, 0.057140, 0.08571, 0.08571, 0.13333, 0.104760, 0.0], [0.07619, 0.095240, 0.095240, 0.12381, 0.12381, 0.104760, 0.104760, 0.104760, 0.08571, 0.095240, 0.07619, 0.104760, 0.11429, 0.057140, 0.104760, 0.06667, 0.057140, 0.057140, 0.08571, 0.057140, 0.08571, 0.0], [0.11429, 0.13333, 0.13333, 0.1619, 0.1619, 0.14286, 0.14286, 0.104760, 0.08571, 0.13333, 0.03810, 0.14286, 0.15238, 0.07619, 0.104760, 0.104760, 0.095240, 0.095240, 0.028570, 0.057140, 0.12381, 0.07619, 0.0], [0.07619, 0.095240, 0.095240, 0.12381, 0.12381, 0.104760, 0.104760, 0.104760, 0.08571, 0.095240, 0.07619, 0.104760, 0.11429, 0.057140, 0.104760, 0.06667, 0.057140, 0.057140, 0.08571, 0.057140, 0.08571, 0.019050, 0.07619, 0.0], [0.047620, 0.08571, 0.08571, 0.11429, 0.11429, 0.11429, 0.11429, 0.13333, 0.11429, 0.08571, 0.104760, 0.095240, 0.104760, 0.08571, 0.13333, 0.019050, 0.06667, 0.06667, 0.11429, 0.08571, 0.057140, 0.06667, 0.104760, 0.06667, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.11429, 0.095240, 0.14286, 0.047620, 0.15238, 0.1619, 0.08571, 0.11429, 0.11429, 0.104760, 0.104760, 0.019050, 0.06667, 0.13333, 0.08571, 0.028570, 0.08571, 0.11429, 0.0], [0.057140, 0.057140, 0.057140, 0.08571, 0.08571, 0.104760, 0.104760, 0.12381, 0.104760, 0.057140, 0.095240, 0.06667, 0.07619, 0.07619, 0.12381, 0.047620, 0.057140, 0.057140, 0.104760, 0.07619, 0.06667, 0.057140, 0.095240, 0.057140, 0.047620, 0.104760, 0.0], [0.11429, 0.13333, 0.13333, 0.1619, 0.1619, 0.028570, 0.028570, 0.1619, 0.14286, 0.13333, 0.13333, 0.14286, 0.15238, 0.11429, 0.1619, 0.104760, 0.07619, 0.07619, 0.14286, 0.11429, 0.12381, 0.095240, 0.13333, 0.095240, 0.104760, 0.14286, 0.095240, 0.0], [0.095240, 0.11429, 0.11429, 0.14286, 0.14286, 0.12381, 0.12381, 0.08571, 0.06667, 0.11429, 0.03810, 0.12381, 0.13333, 0.057140, 0.08571, 0.08571, 0.07619, 0.07619, 0.047620, 0.03810, 0.104760, 0.057140, 0.03810, 0.057140, 0.08571, 0.047620, 0.07619, 0.11429, 0.0], [0.11429, 0.13333, 0.13333, 0.1619, 0.1619, 0.14286, 0.14286, 0.12381, 0.104760, 0.13333, 0.095240, 0.14286, 0.15238, 0.03810, 0.12381, 0.104760, 0.095240, 0.095240, 0.104760, 0.07619, 0.12381, 0.07619, 0.095240, 0.07619, 0.104760, 0.104760, 0.095240, 0.13333, 0.07619, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.07619, 0.057140, 0.14286, 0.08571, 0.15238, 0.1619, 0.08571, 0.07619, 0.11429, 0.104760, 0.104760, 0.095240, 0.047620, 0.13333, 0.08571, 0.08571, 0.08571, 0.11429, 0.095240, 0.104760, 0.14286, 0.06667, 0.104760, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.03810, 0.03810, 0.14286, 0.08571, 0.15238, 0.1619, 0.08571, 0.03810, 0.11429, 0.104760, 0.104760, 0.095240, 0.047620, 0.13333, 0.08571, 0.08571, 0.08571, 0.11429, 0.095240, 0.104760, 0.14286, 0.06667, 0.104760, 0.057140, 0.0], [0.13333, 0.15238, 0.15238, 0.18095, 0.18095, 0.1619, 0.1619, 0.028570, 0.047620, 0.15238, 0.095240, 0.1619, 0.17143, 0.095240, 0.028570, 0.12381, 0.11429, 0.11429, 0.104760, 0.057140, 0.14286, 0.095240, 0.095240, 0.095240, 0.12381, 0.104760, 0.11429, 0.15238, 0.07619, 0.11429, 0.06667, 0.028570, 0.0], [0.13333, 0.15238, 0.15238, 0.18095, 0.18095, 0.1619, 0.1619, 0.08571, 0.06667, 0.15238, 0.095240, 0.1619, 0.17143, 0.095240, 0.08571, 0.12381, 0.11429, 0.11429, 0.104760, 0.057140, 0.14286, 0.095240, 0.095240, 0.095240, 0.12381, 0.104760, 0.11429, 0.15238, 0.07619, 0.11429, 0.028570, 0.06667, 0.07619, 0.0], [0.03810, 0.11429, 0.11429, 0.14286, 0.14286, 0.14286, 0.14286, 0.1619, 0.14286, 0.11429, 0.13333, 0.12381, 0.13333, 0.11429, 0.1619, 0.06667, 0.095240, 0.095240, 0.14286, 0.11429, 0.028570, 0.095240, 0.13333, 0.095240, 0.06667, 0.14286, 0.07619, 0.13333, 0.11429, 0.13333, 0.14286, 0.14286, 0.15238, 0.15238, 0.0], [0.03810, 0.11429, 0.11429, 0.14286, 0.14286, 0.14286, 0.14286, 0.1619, 0.14286, 0.11429, 0.13333, 0.12381, 0.13333, 0.11429, 0.1619, 0.06667, 0.095240, 0.095240, 0.14286, 0.11429, 0.028570, 0.095240, 0.13333, 0.095240, 0.06667, 0.14286, 0.07619, 0.13333, 0.11429, 0.13333, 0.14286, 0.14286, 0.15238, 0.15238, 0.019050, 0.0], [0.104760, 0.12381, 0.12381, 0.15238, 0.15238, 0.03810, 0.03810, 0.15238, 0.13333, 0.12381, 0.12381, 0.13333, 0.14286, 0.104760, 0.15238, 0.095240, 0.06667, 0.06667, 0.13333, 0.104760, 0.11429, 0.08571, 0.12381, 0.08571, 0.095240, 0.13333, 0.08571, 0.028570, 0.104760, 0.12381, 0.13333, 0.13333, 0.14286, 0.14286, 0.12381, 0.12381, 0.0], [0.13333, 0.15238, 0.15238, 0.18095, 0.18095, 0.1619, 0.1619, 0.08571, 0.06667, 0.15238, 0.095240, 0.1619, 0.17143, 0.095240, 0.08571, 0.12381, 0.11429, 0.11429, 0.104760, 0.057140, 0.14286, 0.095240, 0.095240, 0.095240, 0.12381, 0.104760, 0.11429, 0.15238, 0.07619, 0.11429, 0.028570, 0.06667, 0.07619, 0.019050, 0.15238, 0.15238, 0.14286, 0.0], [0.11429, 0.13333, 0.13333, 0.1619, 0.1619, 0.14286, 0.14286, 0.104760, 0.08571, 0.13333, 0.019050, 0.14286, 0.15238, 0.07619, 0.104760, 0.104760, 0.095240, 0.095240, 0.047620, 0.057140, 0.12381, 0.07619, 0.03810, 0.07619, 0.104760, 0.047620, 0.095240, 0.13333, 0.03810, 0.095240, 0.08571, 0.08571, 0.095240, 0.095240, 0.13333, 0.13333, 0.12381, 0.095240, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.057140, 0.019050, 0.14286, 0.08571, 0.15238, 0.1619, 0.08571, 0.057140, 0.11429, 0.104760, 0.104760, 0.095240, 0.047620, 0.13333, 0.08571, 0.08571, 0.08571, 0.11429, 0.095240, 0.104760, 0.14286, 0.06667, 0.104760, 0.057140, 0.03810, 0.047620, 0.06667, 0.14286, 0.14286, 0.13333, 0.06667, 0.08571, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.07619, 0.057140, 0.14286, 0.08571, 0.15238, 0.1619, 0.08571, 0.07619, 0.11429, 0.104760, 0.104760, 0.095240, 0.047620, 0.13333, 0.08571, 0.08571, 0.08571, 0.11429, 0.095240, 0.104760, 0.14286, 0.06667, 0.104760, 0.03810, 0.057140, 0.06667, 0.047620, 0.14286, 0.14286, 0.13333, 0.047620, 0.08571, 0.057140, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.13333, 0.11429, 0.14286, 0.104760, 0.15238, 0.1619, 0.047620, 0.13333, 0.11429, 0.104760, 0.104760, 0.11429, 0.08571, 0.13333, 0.08571, 0.104760, 0.08571, 0.11429, 0.11429, 0.104760, 0.14286, 0.08571, 0.028570, 0.11429, 0.11429, 0.12381, 0.12381, 0.14286, 0.14286, 0.13333, 0.12381, 0.104760, 0.11429, 0.11429, 0.0], [0.095240, 0.11429, 0.11429, 0.14286, 0.14286, 0.047620, 0.047620, 0.14286, 0.12381, 0.11429, 0.11429, 0.12381, 0.13333, 0.095240, 0.14286, 0.08571, 0.057140, 0.057140, 0.12381, 0.095240, 0.104760, 0.07619, 0.11429, 0.07619, 0.08571, 0.12381, 0.07619, 0.03810, 0.095240, 0.11429, 0.12381, 0.12381, 0.13333, 0.13333, 0.11429, 0.11429, 0.028570, 0.13333, 0.11429, 0.12381, 0.12381, 0.12381, 0.0], [0.028570, 0.08571, 0.08571, 0.11429, 0.11429, 0.11429, 0.11429, 0.13333, 0.11429, 0.08571, 0.104760, 0.095240, 0.104760, 0.08571, 0.13333, 0.03810, 0.06667, 0.06667, 0.11429, 0.08571, 0.03810, 0.06667, 0.104760, 0.06667, 0.03810, 0.11429, 0.047620, 0.104760, 0.08571, 0.104760, 0.11429, 0.11429, 0.12381, 0.12381, 0.047620, 0.047620, 0.095240, 0.12381, 0.104760, 0.11429, 0.11429, 0.11429, 0.08571, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.07619, 0.057140, 0.14286, 0.08571, 0.15238, 0.1619, 0.08571, 0.07619, 0.11429, 0.104760, 0.104760, 0.095240, 0.047620, 0.13333, 0.08571, 0.08571, 0.08571, 0.11429, 0.095240, 0.104760, 0.14286, 0.06667, 0.104760, 0.03810, 0.057140, 0.06667, 0.047620, 0.14286, 0.14286, 0.13333, 0.047620, 0.08571, 0.057140, 0.019050, 0.11429, 0.12381, 0.11429, 0.0], [0.08571, 0.104760, 0.104760, 0.13333, 0.13333, 0.11429, 0.11429, 0.095240, 0.07619, 0.104760, 0.06667, 0.11429, 0.12381, 0.028570, 0.095240, 0.07619, 0.06667, 0.06667, 0.07619, 0.047620, 0.095240, 0.047620, 0.06667, 0.047620, 0.07619, 0.07619, 0.06667, 0.104760, 0.047620, 0.047620, 0.07619, 0.07619, 0.08571, 0.08571, 0.104760, 0.104760, 0.095240, 0.08571, 0.06667, 0.07619, 0.07619, 0.057140, 0.08571, 0.07619, 0.07619, 0.0], [0.07619, 0.095240, 0.095240, 0.12381, 0.12381, 0.06667, 0.06667, 0.12381, 0.104760, 0.095240, 0.095240, 0.104760, 0.11429, 0.07619, 0.12381, 0.06667, 0.03810, 0.03810, 0.104760, 0.07619, 0.08571, 0.057140, 0.095240, 0.057140, 0.06667, 0.104760, 0.057140, 0.057140, 0.07619, 0.095240, 0.104760, 0.104760, 0.11429, 0.11429, 0.095240, 0.095240, 0.047620, 0.11429, 0.095240, 0.104760, 0.104760, 0.104760, 0.03810, 0.06667, 0.104760, 0.06667, 0.0], [0.095240, 0.11429, 0.11429, 0.14286, 0.14286, 0.06667, 0.06667, 0.14286, 0.12381, 0.11429, 0.11429, 0.12381, 0.13333, 0.095240, 0.14286, 0.08571, 0.057140, 0.057140, 0.12381, 0.095240, 0.104760, 0.07619, 0.11429, 0.07619, 0.08571, 0.12381, 0.07619, 0.057140, 0.095240, 0.11429, 0.12381, 0.12381, 0.13333, 0.13333, 0.11429, 0.11429, 0.047620, 0.13333, 0.11429, 0.12381, 0.12381, 0.12381, 0.03810, 0.08571, 0.12381, 0.08571, 0.03810, 0.0], [0.104760, 0.12381, 0.12381, 0.15238, 0.15238, 0.13333, 0.13333, 0.11429, 0.095240, 0.12381, 0.08571, 0.13333, 0.14286, 0.028570, 0.11429, 0.095240, 0.08571, 0.08571, 0.095240, 0.06667, 0.11429, 0.06667, 0.08571, 0.06667, 0.095240, 0.095240, 0.08571, 0.12381, 0.06667, 0.028570, 0.095240, 0.095240, 0.104760, 0.104760, 0.12381, 0.12381, 0.11429, 0.104760, 0.08571, 0.095240, 0.095240, 0.03810, 0.104760, 0.095240, 0.095240, 0.03810, 0.08571, 0.104760, 0.0], [0.095240, 0.11429, 0.11429, 0.14286, 0.14286, 0.06667, 0.06667, 0.14286, 0.12381, 0.11429, 0.11429, 0.12381, 0.13333, 0.095240, 0.14286, 0.08571, 0.057140, 0.057140, 0.12381, 0.095240, 0.104760, 0.07619, 0.11429, 0.07619, 0.08571, 0.12381, 0.07619, 0.057140, 0.095240, 0.11429, 0.12381, 0.12381, 0.13333, 0.13333, 0.11429, 0.11429, 0.047620, 0.13333, 0.11429, 0.12381, 0.12381, 0.12381, 0.03810, 0.08571, 0.12381, 0.08571, 0.03810, 0.019050, 0.104760, 0.0], [0.07619, 0.057140, 0.057140, 0.08571, 0.08571, 0.12381, 0.12381, 0.14286, 0.12381, 0.057140, 0.11429, 0.06667, 0.07619, 0.095240, 0.14286, 0.06667, 0.07619, 0.07619, 0.12381, 0.095240, 0.08571, 0.07619, 0.11429, 0.07619, 0.06667, 0.12381, 0.03810, 0.11429, 0.095240, 0.11429, 0.12381, 0.12381, 0.13333, 0.13333, 0.095240, 0.095240, 0.104760, 0.13333, 0.11429, 0.12381, 0.12381, 0.12381, 0.095240, 0.06667, 0.12381, 0.08571, 0.07619, 0.095240, 0.104760, 0.095240, 0.0], [0.07619, 0.057140, 0.057140, 0.08571, 0.08571, 0.12381, 0.12381, 0.14286, 0.12381, 0.057140, 0.11429, 0.06667, 0.07619, 0.095240, 0.14286, 0.06667, 0.07619, 0.07619, 0.12381, 0.095240, 0.08571, 0.07619, 0.11429, 0.07619, 0.06667, 0.12381, 0.03810, 0.11429, 0.095240, 0.11429, 0.12381, 0.12381, 0.13333, 0.13333, 0.095240, 0.095240, 0.104760, 0.13333, 0.11429, 0.12381, 0.12381, 0.12381, 0.095240, 0.06667, 0.12381, 0.08571, 0.07619, 0.095240, 0.104760, 0.095240, 0.019050, 0.0], [0.12381, 0.14286, 0.14286, 0.17143, 0.17143, 0.15238, 0.15238, 0.13333, 0.11429, 0.14286, 0.104760, 0.15238, 0.1619, 0.047620, 0.13333, 0.11429, 0.104760, 0.104760, 0.11429, 0.08571, 0.13333, 0.08571, 0.104760, 0.08571, 0.11429, 0.11429, 0.104760, 0.14286, 0.08571, 0.028570, 0.11429, 0.11429, 0.12381, 0.12381, 0.14286, 0.14286, 0.13333, 0.12381, 0.104760, 0.11429, 0.11429, 0.019050, 0.12381, 0.11429, 0.11429, 0.057140, 0.104760, 0.12381, 0.03810, 0.12381, 0.12381, 0.12381, 0.0], [0.07619, 0.03810, 0.03810, 0.06667, 0.06667, 0.12381, 0.12381, 0.14286, 0.12381, 0.03810, 0.11429, 0.047620, 0.057140, 0.095240, 0.14286, 0.06667, 0.07619, 0.07619, 0.12381, 0.095240, 0.08571, 0.07619, 0.11429, 0.07619, 0.06667, 0.12381, 0.03810, 0.11429, 0.095240, 0.11429, 0.12381, 0.12381, 0.13333, 0.13333, 0.095240, 0.095240, 0.104760, 0.13333, 0.11429, 0.12381, 0.12381, 0.12381, 0.095240, 0.06667, 0.12381, 0.08571, 0.07619, 0.095240, 0.104760, 0.095240, 0.03810, 0.03810, 0.12381, 0.0]] expected = [ [0.0], [5.0, 0.0], [18.0, 17.0, 0.0], [19.0, 18.0, 7.0, 0.0], [13.0, 12.0, 15.0, 16.0, 0.0], [19.0, 22.0, 35.0, 36.0, 30.0, 0.0], [20.0, 23.0, 36.0, 37.0, 31.0, 17.0, 0.0], ] orig = numberedLeafTree('(1:1,(2:2,((3:3,4:4):7,5:5):5):2,(6:8,7:9):10)') cpl = orig.calcPathLengthMatrix() for c, e in zip(cpl, expected): self.assertEqual(c, e) def testSumEdges(self): orig = numberedLeafTree('((7,(13,8)),(11,(5,17)),(((15,19),6),(16,(9,33))),22,3,((14,(10,((4,2),30))),(18,12)))') silentAssertRaises(self, TypeError, orig, Tree.edgeLengthSum) t = Tree('(a:1,(b:2, (c:2.5):1):1)') tol = 0.000001 self.assertEquals(abs(t.edgeLengthSum - 7.5) < tol, True) def testHasSplit(self): orig = numberedLeafTree('((7,(13,8)),(11,(5,17)),(((15,19),6),(16,(9,33))),22,3,((14,(10,((4,2),30))),(18,12)))') clade = numberedLeafTree('(7,13,8,11,5,17,(15,19),6,16,9,33,22,3,14,10,4,2,30,18,12)') self.assertEqual(True, orig.hasSplit(clade.root.lChild.split)) for internal in iterInternals(clade.root): self.assertEqual(True, orig.hasSplit(internal.split)) clade = numberedLeafTree('(7,13,8,11,5,17,(15,19,6),16,9,33,22,3,14,10,4,2,30,18,12)') self.assertEqual(True, orig.hasSplit(clade.root.lChild.split)) for internal in iterInternals(clade.root): self.assertEqual(True, orig.hasSplit(internal.split)) clade = numberedLeafTree('(7,13,8,11,5,17,(15,19,16),6,9,33,22,3,14,10,4,2,30,18,12)') for n, internal in enumerate(iterInternals(clade.root)): self.assertEqual(not bool(n), orig.hasSplit(internal.split)) def testStandardize(self): orig = numberedLeafTree('((7,(13,8)),(11,(5,17)),(((15,19),6),(16,(9,33))),22,3,((14,(10,((4,2),30))),(18,12)))') orig.standardizeOrientation() self.assertEqual('(2,(((((3,((5,17),11),((6,(15,19)),((9,33),16)),(7,(8,13)),22),(12,18)),14),10),30),4)', str(orig)) orig = numberedLeafTree('(((7,(13,8)),(11,(5,17))),(((15,19),6),(16,(9,3))),((14,(10,((4,2),1))),(18,12)))') orig.standardizeOrientation() self.assertEqual('(1,(2,4),(((((((3,9),16),(6,(15,19))),(((5,17),11),(7,(8,13)))),(12,18)),14),10))', str(orig)) def testRefine(self): poly = numberedLeafTree('(%s)' % ','.join(map(str,range(1,20)))) rng = random.Random() rng.seed(10) poly.randomRefine(2, rng=rng) self.assertEqual('(((7,(13,8)),(11,(5,17))),(((15,19),6),(16,(9,3))),((14,(10,((4,2),1))),(18,12)))', str(poly)) poly = numberedLeafTree('(%s)' % ','.join(map(str,range(1,20)))) poly.randomRefine(3, rng=rng) self.assertEqual('((18,3,1),((10,7,4),(11,8),(15,6)),(19,16,(9,12,14)),(2,(5,17),13))', str(poly)) def testMapLeaves(self): tr = numberedLeafTree('(4,(42,7),1)') orig = copy.deepcopy(tr) condensed = numberedLeafTree('(2,(4,3),1)') condenseMapping, reverseMapping = createMappingFuncs(map(lambda x: x-1, tr.getLeafSet())) tr.mapLeaves(condenseMapping) self.assertEqual(True, condensed == tr) silentAssertRaises(self, ValueError, Tree.__eq__, tr, orig) tr.mapLeaves(reverseMapping) self.assertEqual(True, orig == tr) silentAssertRaises(self, ValueError, Tree.__eq__, tr, condensed) def testIsRefinementOf(self): poly = numberedLeafTree('(1,2,3,4)') treeA = numberedLeafTree('(1,2,(3,4))') treeAFull = numberedLeafTree('((1,2),(3,4))') treeAOpp = numberedLeafTree('((1,2),3,4)') treeB = numberedLeafTree('(1,(2,3),4)') treeC = numberedLeafTree('((1,3),4,2)') for a in [treeA, treeAFull, treeAOpp]: for t in [a, treeB, treeC]: self.assertEqual(False, poly.isRefinementOf(t)) self.assertEqual(True, t.isRefinementOf(poly)) self.assertEqual(True, t.isRefinementOf(t)) for s in [treeA, treeB, treeC]: if s != t: self.assertEqual(False, t.isRefinementOf(s)) self.assertEqual(False, s.isRefinementOf(t)) self.assertEqual(True, t.isRefinementOf(t)) def testMakeBinary(self): treePairs = [ [numberedLeafTree('(1,2,3,4)'), '(1,2,(3,4))'], [numberedLeafTree('(1,2,3,4,5,6)'), '(1,2,(3,(4,(5,6))))'], [numberedLeafTree('(1,(2,3),4,5,6)'), '(1,(2,3),(4,(5,6)))'], [numberedLeafTree('((1:1,2:1,3:1):1,4:1,5:1,6:1,7:1)'), '((1:1.0,(2:1.0,3:1.0):0):1.0,4:1.0,(5:1.0,(6:1.0,7:1.0):0):0)'], ] for poly, binary in treePairs: poly.makeBinary() self.assertEqual(poly.newick, binary) def testDetectBadTreeDefs(self): silentAssertRaises(self, BadTreeDefError, Tree, newick = '(a:1,(d, b:2, c:3.5)') silentAssertRaises(self, BadTreeDefError, Tree, '(a:1(b:2, c:3.5):1)') silentAssertRaises(self, BadTreeDefError, Tree, newick = '()') silentAssertRaises(self, BadTreeDefError, Tree, newick = 'a:2') silentAssertRaises(self, BadTreeDefError, Tree, newick = '((a:2))', collapseDegreeTwo = False) silentAssertRaises(self, BadTreeDefError, numberedLeafTree, '((1,4),3,4)') def testInstantiate(self): self.assertEqual(str(Tree()), '') self.assertEqual(str(Tree('(a:1,b:2)')), '(a:1.0,b:2.0)') self.assertEqual(str(Tree('(a:1,b:2, c:3.5)')), '(a:1.0,b:2.0,c:3.5)') self.assertEqual(str(Tree('(a:1,(b:2, c:3.5):1)', rooted = True)), '(a:1.0,(b:2.0,c:3.5):1.0)') self.assertEqual(str(Tree('(a:1,(b:2, (c:2.5):1):1)', rooted = True)), '(a:1.0,(b:2.0,c:3.5):1.0)') self.assertEqual(str(numberedLeafTree('(1:1,2:2)')), '(1:1.0,2:2.0)') self.assertEqual(str(numberedLeafTree('(1:1,2:2, 3:3.5)')), '(1:1.0,2:2.0,3:3.5)') self.assertEqual(str(numberedLeafTree('(1:1,(2:2, 3:3.5):1)', rooted = True)), '(1:1.0,(2:2.0,3:3.5):1.0)') self.assertEqual(str(numberedLeafTree('(1:1,(3:2, (2:2.5):1):1)', rooted = True)), '(1:1.0,(3:2.0,2:3.5):1.0)') self.assertEqual(str(Tree('(0,((2,1),3))', rooted = False, taxaNamingStyle = TaxaNamingEnum.indicesOnly )), '(0,(2,1),3)') def testCmdComment(self): self.assertEqual(str(Tree()), '') self.assertEqual(str(Tree('[&U](a:1,b:2)')), '(a:1.0,b:2.0)') self.assertEqual(str(Tree('[&U](a:1,b:2, c:3.5)')), '(a:1.0,b:2.0,c:3.5)') self.assertEqual(str(Tree('[&R](a:1,(b:2, c:3.5):1)')), '(a:1.0,(b:2.0,c:3.5):1.0)') self.assertEqual(str(Tree('[&U](a:1,(b:2, c:3.5):1)')), '(a:2.0,b:2.0,c:3.5)') def testVerifyTaxaLabels(self): absNTM = NexusTaxaManager(['a', 'c', 'b']) absNTM.finalizeTaxa() t = Tree(taxaManager = absNTM, newick = '(a:1,b:2, c:3.5)') self.assertEqual(str(t), '(a:1.0,b:2.0,c:3.5)') self.assertEqual(str(t.root), '(1,3,2)') self.assertEqual(str(Tree(taxaManager = absNTM, newick = '(1,2,3)')), '(a,c,b)') silentAssertRaises(self, NexusUnknownTaxonError, Tree, taxaManager = absNTM, newick = '(a:1,b:2, d:3.5)') silentAssertRaises(self, NexusUnknownTaxonError, Tree, taxaManager = absNTM, newick = '(1, 2, 4)') def testIterChildern(self): t = Tree(newick = '(a,b,c)') self.assertEqual([str(i) for i in iterChildren(t.root)], ['1', '2', '3']) t = Tree('(a,(b,c))', rooted = True) self.assertEqual([str(i) for i in iterChildren(t.root)], ['1', '(2,3)']) def testIterTraversals(self): t = numberedLeafTree('((1,(2,3)),(4,(5,(6,7))))', rooted = True) self.assertEqual([str(i) for i in iterPostorder(t.root, Node.isLeaf)], ['1', '2', '3', '4', '5', '6', '7']) self.assertEqual([str(i) for i in iterPreorder(t.root, Node.isLeaf)], ['1', '2', '3', '4', '5', '6', '7']) self.assertEqual([str(i) for i in iterPostorder(t.root, Node.isInternal)], ['(2,3)', '(1,(2,3))', '(6,7)', '(5,(6,7))', '(4,(5,(6,7)))', '((1,(2,3)),(4,(5,(6,7))))']) self.assertEqual([str(i) for i in iterPreorder(t.root, Node.isInternal)], ['((1,(2,3)),(4,(5,(6,7))))', '(1,(2,3))', '(2,3)', '(4,(5,(6,7)))', '(5,(6,7))', '(6,7)']) self.assertEqual([str(i) for i in iterPostorder(t.root)], ['1', '2', '3', '(2,3)', '(1,(2,3))', '4', '5', '6', '7', '(6,7)', '(5,(6,7))', '(4,(5,(6,7)))', '((1,(2,3)),(4,(5,(6,7))))']) self.assertEqual([str(i) for i in iterPreorder(t.root)], ['((1,(2,3)),(4,(5,(6,7))))', '(1,(2,3))', '1', '(2,3)', '2', '3', '(4,(5,(6,7)))', '4', '(5,(6,7))', '5', '(6,7)', '6', '7' ]) def testIterTips(self): t = numberedLeafTree('((1,(2,3)),(4,(5,(6,7))))', rooted = True) self.assertEqual([str(i) for i in iterTips(t.root)], ['1', '2', '3', '4', '5', '6', '7']) self.assertEqual([str(i) for i in iterTips(t.root.lChild)], ['1', '2', '3']) self.assertEqual([str(i) for i in iterTips(t.root.lChild.lChild)], ['1']) def testFilterIterators(self): t = numberedLeafTree('((1,(2,3)),(4,(5,(6,7))))', rooted = True) def firstTipOdd(i): s =str(i) firstDigit = re.compile(r'^\D*(\d+)') m = firstDigit.search(s) return m and (int(m.group(1)) % 2 == 1) self.assertEqual([str(i) for i in iterChildren(t.root, firstTipOdd)], ['(1,(2,3))']) self.assertEqual([str(i) for i in iterPostorder(t.root, firstTipOdd)], ['1', '3', '(1,(2,3))', '5', '7', '(5,(6,7))', '((1,(2,3)),(4,(5,(6,7))))']) self.assertEqual([str(i) for i in iterPreorder(t.root, firstTipOdd)], ['((1,(2,3)),(4,(5,(6,7))))', '(1,(2,3))', '1', '3', '(5,(6,7))', '5', '7' ]) self.assertEqual([str(i) for i in iterTips(t.root, firstTipOdd)], ['1', '3', '5', '7']) def testSplitInfo(self): t = numberedLeafTree('((1,(2,3)),(4,(5,(6,7))))', rooted = True) self.assertEqual(t.getSplits(), [127L, 7L, 1L, 6L, 2L, 4L, 120L, 8L, 112L, 16L, 96L, 32L, 64L]) self.assertEqual(t.getSplits(False), [7L, 6L, 120L, 112L, 96L]) self.assertEqual(t.taxonMask, 127) self.assertEqual([invertSplit(i, mask = t.taxonMask) for i in t.getSplits()], [0L, 120L, 126L, 121L, 125L, 123L, 7L, 119L, 15L, 111L, 31L, 95L, 63L]) self.assertEqual(t.getSplits(orient = -1), [127L, 7L, 1L, 121L, 125L, 123L, 7L, 119L, 15L, 111L, 31L, 95L, 63L]) self.assertEqual(t.hasSplit(1L), True) self.assertEqual(t.hasSplit(128L), False) self.assertEqual(t.hasSplit(126L), True) self.assertEqual(t.hasSplit(15L), True) t = numberedLeafTree('((1,(2,3)),(4,(5,(8,7))))', rooted = True) self.assertEqual(t.getSplits(), [223L, 7L, 1L, 6L, 2L, 4L, 216L, 8L, 208L, 16L, 192L, 128L, 64L]) def testUnroot(self): t = Tree(newick = '[&R](a:1,(b:2, c:3.5):1)') self.assertEqual(t.nexusStr(), '[&R](a:1.0,(b:2.0,c:3.5):1.0)') t.deroot() self.assertEqual(t.nexusStr(), '[&U](a:2.0,b:2.0,c:3.5)') def testSymDiff(self): t = numberedLeafTree('(1,2,(3,4))') s = copy.copy(t) self.assertEqual(s == t, True) s = numberedLeafTree('(3,2,(1,4))') self.assertEqual(s == t, False) self.assertEqual(numberedLeafTree('(1,2,(3,4,5))').symmetric_difference(numberedLeafTree('(1,2,(3,4,5))')), 0) self.assertEqual(numberedLeafTree('(1,2,(3,4,5))').symmetric_difference(numberedLeafTree('(1,2,((3,4),5))')), 1) self.assertEqual(numberedLeafTree('(1,2,(3,(4,5)))').symmetric_difference(numberedLeafTree('(1,2,((3,4),5))')), 2) self.assertEqual(numberedLeafTree('(4,2,(3,(1,5)))').symmetric_difference(numberedLeafTree('(1,2,((3,4),5))')), 4) treeA = numberedLeafTree('(1,2,(3,4))') treeAFull = numberedLeafTree('((1,2),(3,4))') treeAOpp = numberedLeafTree('((1,2),3,4)') self.assertEqual(treeA.symmetric_difference(treeAFull), 0) self.assertEqual(treeA.symmetric_difference(treeAOpp), 0) self.assertEqual(treeAOpp.symmetric_difference(treeAFull), 0) self.assertEqual(treeA, treeAFull) self.assertEqual(treeA, treeAOpp) self.assertEqual(treeAFull, treeAOpp) def testReRoot(self): t = numberedLeafTree('((1,(2,3)),(4,(5,(6,7))))', rooted = True) orig = copy.deepcopy(t) for i in [2,1,0,4,6,2,4,6,5,3,5,1]: t.attachAtLeafByIndex(i) self.assertEqual(t.root.lChild.index, i) self.assertEqual(t.symmetric_difference(orig, True), 0) if __name__ == '__main__': unittest.main()