In [1]:
from ete3 import Tree, TreeStyle, NodeStyle
import sys

In [2]:
treeFile = "FAM023481.orig_reconciliation.lean.nhx"

In [3]:
def readNHXTreeFromFile(file):
    try:
        f=open(file, 'r')
    except IOError:
        print ("Unknown file: "+file)
        sys.exit()

    line = ""
    for l in f:
        line += l.strip()
    
    f.close()
    t = Tree( line )
    return t

nhxTree = readNHXTreeFromFile(treeFile)

In [4]:
print(nhxTree)


   /-GHM2|m.34692
  |
  |            /-PKK|m.35404
  |           |
  |         /-|   /-PHeZ|m.25367
  |        |  |  |
  |        |   \-|   /-PPvN2|m.31660
  |        |     |  |
  |        |     |  |      /-PCoB|m.26315
  |        |      \-|   /-|
  |        |        |  |  |   /-PCoZa5|m.30389
  |        |        |  |   \-|
  |        |         \-|     |   /-PCoCd9|m.27842
  |        |           |      \-|
  |        |           |         \-PCoAx5_loss
  |        |           |
  |        |            \-PPrS_loss
  |        |
  |        |            /-PCoiP|m.33044
  |        |           |
  |        |         /-|   /-ancestral_loss
  |        |        |  |  |
  |        |        |   \-|   /-ancestral_loss
  |        |        |     |  |
  |        |        |     |  |      /-PStB|m.40623
  |        |        |      \-|   /-|
  |        |        |        |  |   \-PStN|m.28765
  |        |        |        |  |
  |        |        |        |  |         /-PCG6|m.37499
  |        |        |         \-|      /-|
  |        |        |           |     |   \-PCBo_loss
  |        |        |           |   /-|
  |        |        |           |  |  |   /-PCBF|m.34700
  |        |      /-|           |  |   \-|
  |      /-|     |  |            \-|      \-PCMt5|m.64600
  |     |  |     |  |              |
  |     |  |     |  |              |      /-PCBo|m.38533
  |     |  |     |  |              |   /-|
  |     |  |     |  |               \-|   \-PCG6_loss
  |     |  |     |  |                 |
  |     |  |     |  |                  \-ancestral_loss
  |     |  |     |  |
  |     |  |     |  |   /-PCoiP_loss
  |     |  |     |  |  |
  |     |  |     |  |  |      /-ISPB|m.25523
  |     |  |     |  |  |   /-|
  |     |  |     |   \-|  |   \-PspVi|m.33243
  |     |  |     |     |  |
  |     |  |   /-|     |  |      /-PWRo5|m.37307
  |     |  |  |  |     |  |     |
  |     |  |  |  |      \-|     |      /-PWM5|m.26654
  |     |  |  |  |        |   /-|   /-|
  |     |  |  |  |        |  |  |  |  |   /-PWVi6|m.35610
  |     |  |  |  |        |  |  |  |   \-|
  |     |  |  |  |        |  |   \-|      \-PWH13_loss
  |     |  |  |  |        |  |     |
  |     |  |  |  |         \-|     |   /-PWM5_loss
  |     |  |  |  |           |      \-|
  |     |  |  |  |           |        |   /-PWH13|m.40687
  |     |  |  |  |           |         \-|
  |     |  |  |  |           |            \-PWVi6_loss
  |     |  |  |  |           |
  |     |  |  |  |            \-ancestral_loss
  |     |  |  |  |
  |     |   \-|   \-PSloP5_loss
--|     |     |
  |     |     |   /-ancestral_loss
  |     |     |  |
  |     |     |  |      /-PGC|m.33862
  |     |     |  |   /-|
  |     |     |  |  |  |   /-POJ_loss
  |     |     |  |  |   \-|
  |     |     |  |  |     |   /-PCanC|m.48198
  |     |     |  |  |      \-|
  |     |     |  |  |         \-PEF_loss
  |     |     |  |  |
  |     |     |  |  |               /-PArE|m.26113
  |     |     |  |  |            /-|
  |     |     |  |  |           |   \-PSSE|m.24570
  |     |     |  |  |           |
  |     |      \-|  |         /-|   /-ancestral_loss
  |     |        |  |        |  |  |
  |     |        |  |        |  |  |      /-PIbB_loss
  |     |        |  |        |   \-|   /-|
  |     |        |  |        |     |  |  |   /-PAtL_loss
  |     |        |  |        |     |  |   \-|
  |     |        |  |        |      \-|     |   /-PAsA|m.17393
  |     |        |  |      /-|        |      \-|
  |     |        |  |     |  |        |         \-PRuE_loss
  |     |        |  |     |  |        |
  |     |        |  |     |  |         \-ancestral_loss
  |     |        |  |     |  |
  |   /-|        |  |     |  |   /-ancestral_loss
  |  |  |        |  |     |  |  |
  |  |  |        |  |     |   \-|   /-ancestral_loss
  |  |  |         \-|     |     |  |
  |  |  |           |     |     |  |   /-ancestral_loss
  |  |  |           |     |      \-|  |
  |  |  |           |     |        |  |      /-PRBe_loss
  |  |  |           |     |        |  |     |
  |  |  |           |     |         \-|   /-|      /-PBtS|m.34411
  |  |  |           |     |           |  |  |   /-|
  |  |  |           |     |           |  |  |  |   \-PJJ|m.24955
  |  |  |           |     |           |  |   \-|
  |  |  |           |   /-|           |  |     |   /-PEcD|m.36208
  |  |  |           |  |  |            \-|      \-|
  |  |  |           |  |  |              |        |   /-PGrP|m.36371
  |  |  |           |  |  |              |         \-|
  |  |  |           |  |  |              |            \-PSoG|m.21561
  |  |  |           |  |  |              |
  |  |  |           |  |  |              |   /-PMaF_loss
  |  |  |           |  |  |               \-|
  |  |  |           |  |  |                 |   /-PMC_loss
  |  |  |           |  |  |                  \-|
  |  |  |           |  |  |                    |   /-PMLL_loss
  |  |  |           |  |  |                     \-|
  |  |  |           |  |  |                       |   /-PMB|m.48981
  |  |  |           |  |  |                        \-|
  |  |  |           |  |  |                           \-PMAx_loss
  |  |  |           |  |  |
  |  |  |           |  |  |   /-ancestral_loss
  |  |  |           |  |  |  |
  |  |  |            \-|   \-|      /-PIsS|m.52893
  |  |  |              |     |   /-|
  |  |  |              |     |  |   \-PMiM|m.34542
  |  |  |              |      \-|
  |  |  |              |        |   /-ancestral_loss
  |  |  |              |         \-|
  |  |  |              |           |   /-ancestral_loss
  |  |  |              |            \-|
   \-|  |              |              |   /-PMaF_loss
     |  |              |               \-|
     |  |              |                 |   /-PMC|m.57482
     |  |              |                  \-|
     |  |              |                    |   /-PMLL|m.39896
     |  |              |                     \-|
     |  |              |                        \-ancestral_loss
     |  |              |
     |  |              |   /-ancestral_loss
     |  |              |  |
     |  |               \-|   /-ancestral_loss
     |  |                 |  |
     |  |                  \-|      /-PIbB|m.27259
     |  |                    |   /-|
     |  |                     \-|   \-ancestral_loss
     |  |                       |
     |  |                        \-ancestral_loss
     |  |
     |  |      /-PBF5|m.35929
     |  |   /-|
     |   \-|   \-PSlRo11|m.26045
     |     |
     |      \-PBS4_loss
     |
     |         /-BMoV|m.31229
     |      /-|
     |     |  |   /-BFA_loss
     |     |   \-|
     |     |     |   /-BPM|m.26069
     |     |      \-|
     |   /-|         \-BCoP_loss
     |  |  |
     |  |  |   /-BMoV_loss
     |  |  |  |
     |  |  |  |      /-BFA|m.48628
     |  |   \-|   /-|
     |  |     |  |  |   /-BPM|m.25963
     |  |     |  |   \-|
      \-|      \-|      \-BCoP_loss
        |        |
        |        |   /-BFA_loss
        |         \-|
        |           |   /-BCoP|m.69168
        |            \-|
        |               \-BPM_loss
        |
         \-SyspA_loss

In [5]:
# Now we remove "loss" tips.
toKeep = []
for leaf in nhxTree.traverse():
    if "loss" not in leaf.name and leaf.name != "":
        toKeep.append(leaf.name)
        
print(toKeep)


['GHM2|m.34692', 'PKK|m.35404', 'PBF5|m.35929', 'PSlRo11|m.26045', 'BMoV|m.31229', 'PHeZ|m.25367', 'PPvN2|m.31660', 'BPM|m.26069', 'BFA|m.48628', 'PCoiP|m.33044', 'PGC|m.33862', 'BPM|m.25963', 'BCoP|m.69168', 'PCoB|m.26315', 'PCoZa5|m.30389', 'ISPB|m.25523', 'PspVi|m.33243', 'PCanC|m.48198', 'PCoCd9|m.27842', 'PWRo5|m.37307', 'PStB|m.40623', 'PStN|m.28765', 'PArE|m.26113', 'PSSE|m.24570', 'PIsS|m.52893', 'PMiM|m.34542', 'PIbB|m.27259', 'PWM5|m.26654', 'PCG6|m.37499', 'PCBF|m.34700', 'PCMt5|m.64600', 'PCBo|m.38533', 'PWVi6|m.35610', 'PWH13|m.40687', 'PMC|m.57482', 'PAsA|m.17393', 'PMLL|m.39896', 'PBtS|m.34411', 'PJJ|m.24955', 'PEcD|m.36208', 'PGrP|m.36371', 'PSoG|m.21561', 'PMB|m.48981']

In [6]:
nhxTree.prune(toKeep)
print(nhxTree)


   /-GHM2|m.34692
  |
  |            /-PKK|m.35404
  |         /-|
  |        |  |   /-PHeZ|m.25367
  |        |   \-|
  |        |     |   /-PPvN2|m.31660
  |        |      \-|
  |        |        |   /-PCoB|m.26315
  |        |         \-|
  |        |           |   /-PCoZa5|m.30389
  |        |            \-|
  |        |               \-PCoCd9|m.27842
  |        |
  |        |         /-PCoiP|m.33044
  |        |        |
  |        |        |      /-PStB|m.40623
  |        |      /-|   /-|
  |        |     |  |  |   \-PStN|m.28765
  |        |     |  |  |
  |      /-|     |   \-|         /-PCBF|m.34700
  |     |  |     |     |      /-|
  |     |  |     |     |   /-|   \-PCMt5|m.64600
  |     |  |     |     |  |  |
  |     |  |   /-|      \-|   \-PCG6|m.37499
  |     |  |  |  |        |
  |     |  |  |  |         \-PCBo|m.38533
  |     |  |  |  |
  |     |  |  |  |      /-ISPB|m.25523
  |     |  |  |  |   /-|
  |     |  |  |  |  |   \-PspVi|m.33243
--|     |  |  |   \-|
  |     |  |  |     |   /-PWRo5|m.37307
  |     |  |  |     |  |
  |     |  |  |      \-|      /-PWM5|m.26654
  |     |  |  |        |   /-|
  |     |  |  |         \-|   \-PWVi6|m.35610
  |     |  |  |           |
  |     |   \-|            \-PWH13|m.40687
  |     |     |
  |     |     |      /-PGC|m.33862
  |     |     |   /-|
  |     |     |  |   \-PCanC|m.48198
  |     |     |  |
  |     |     |  |               /-PArE|m.26113
  |     |     |  |            /-|
  |   /-|     |  |         /-|   \-PSSE|m.24570
  |  |  |     |  |        |  |
  |  |  |     |  |        |   \-PAsA|m.17393
  |  |  |     |  |        |
  |  |  |     |  |        |         /-PBtS|m.34411
  |  |  |     |  |      /-|      /-|
  |  |  |      \-|     |  |     |   \-PJJ|m.24955
  |  |  |        |     |  |   /-|
  |  |  |        |     |  |  |  |   /-PEcD|m.36208
  |  |  |        |     |  |  |   \-|
  |  |  |        |     |   \-|     |   /-PGrP|m.36371
  |  |  |        |     |     |      \-|
  |  |  |        |   /-|     |         \-PSoG|m.21561
  |  |  |        |  |  |     |
  |  |  |        |  |  |      \-PMB|m.48981
  |  |  |        |  |  |
   \-|  |        |  |  |      /-PIsS|m.52893
     |  |        |  |  |   /-|
     |  |         \-|  |  |   \-PMiM|m.34542
     |  |           |   \-|
     |  |           |     |   /-PMC|m.57482
     |  |           |      \-|
     |  |           |         \-PMLL|m.39896
     |  |           |
     |  |            \-PIbB|m.27259
     |  |
     |  |   /-PBF5|m.35929
     |   \-|
     |      \-PSlRo11|m.26045
     |
     |      /-BMoV|m.31229
     |   /-|
     |  |   \-BPM|m.26069
      \-|
        |      /-BFA|m.48628
        |   /-|
         \-|   \-BPM|m.25963
           |
            \-BCoP|m.69168

In [7]:
print (nhxTree.write(features=[]))


(GHM2|m.34692:1[&&NHX:D=N:ND=0:S=GHM2:dist=1.0:name=GHM2|m.34692:support=1.0],((((PKK|m.35404:1[&&NHX:D=N:ND=1:S=PKK:dist=1.0:name=PKK|m.35404:support=1.0],(PHeZ|m.25367:1[&&NHX:D=N:ND=2:S=PHeZ:dist=1.0:name=PHeZ|m.25367:support=1.0],(PPvN2|m.31660:1[&&NHX:D=N:ND=3:S=PPvN2:dist=1.0:name=PPvN2|m.31660:support=1.0],(PCoB|m.26315:1[&&NHX:D=N:ND=4:S=PCoB:dist=1.0:name=PCoB|m.26315:support=1.0],(PCoZa5|m.30389:1[&&NHX:D=N:ND=5:S=PCoZa5:dist=1.0:name=PCoZa5|m.30389:support=1.0],PCoCd9|m.27842:1[&&NHX:D=N:ND=6:S=PCoCd9:dist=1.0:name=PCoCd9|m.27842:support=1.0])1:1[&&NHX:D=N:ND=9:S=10:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=10:S=11:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=13:S=13:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=14:S=14:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=15:S=15:dist=1.0:name=:support=1.0],(((PCoiP|m.33044:1[&&NHX:D=N:ND=16:S=PCoiP:dist=1.0:name=PCoiP|m.33044:support=1.0],((PStB|m.40623:1[&&NHX:D=N:ND=19:S=PStB:dist=1.0:name=PStB|m.40623:support=1.0],PStN|m.28765:1[&&NHX:D=N:ND=20:S=PStN:dist=1.0:name=PStN|m.28765:support=1.0])1:1[&&NHX:D=N:ND=21:S=20:dist=1.0:name=:support=1.0],(((PCBF|m.34700:1[&&NHX:D=N:ND=25:S=PCBF:dist=1.0:name=PCBF|m.34700:support=1.0],PCMt5|m.64600:1[&&NHX:D=N:ND=26:S=PCMt5:dist=1.0:name=PCMt5|m.64600:support=1.0])1:1[&&NHX:D=N:ND=27:S=22:dist=1.0:name=:support=1.0],PCG6|m.37499:1[&&NHX:D=N:ND=22:S=PCG6:dist=1.0:name=PCG6|m.37499:support=1.0])1:1[&&NHX:D=N:ND=28:S=23:dist=1.0:name=:support=1.0],PCBo|m.38533:1[&&NHX:D=N:ND=29:S=PCBo:dist=1.0:name=PCBo|m.38533:support=1.0])1:1[&&NHX:D=Y:ND=34:S=23:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=35:S=24:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=38:S=27:dist=1.0:name=:support=1.0],((ISPB|m.25523:1[&&NHX:D=N:ND=40:S=ISPB:dist=1.0:name=ISPB|m.25523:support=1.0],PspVi|m.33243:1[&&NHX:D=N:ND=41:S=PspVi:dist=1.0:name=PspVi|m.33243:support=1.0])1:1[&&NHX:D=N:ND=42:S=16:dist=1.0:name=:support=1.0],(PWRo5|m.37307:1[&&NHX:D=N:ND=43:S=PWRo5:dist=1.0:name=PWRo5|m.37307:support=1.0],((PWM5|m.26654:1[&&NHX:D=N:ND=44:S=PWM5:dist=1.0:name=PWM5|m.26654:support=1.0],PWVi6|m.35610:1[&&NHX:D=N:ND=45:S=PWVi6:dist=1.0:name=PWVi6|m.35610:support=1.0])1:1[&&NHX:D=N:ND=48:S=18:dist=1.0:name=:support=1.0],PWH13|m.40687:1[&&NHX:D=N:ND=50:S=PWH13:dist=1.0:name=PWH13|m.40687:support=1.0])1:1[&&NHX:D=Y:ND=54:S=18:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=55:S=19:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=58:S=26:dist=1.0:name=:support=1.0])1:1[&&NHX:D=Y:ND=60:S=27:dist=1.0:name=:support=1.0],((PGC|m.33862:1[&&NHX:D=N:ND=64:S=PGC:dist=1.0:name=PGC|m.33862:support=1.0],PCanC|m.48198:1[&&NHX:D=N:ND=66:S=PCanC:dist=1.0:name=PCanC|m.48198:support=1.0])1:1[&&NHX:D=N:ND=70:S=32:dist=1.0:name=:support=1.0],(((((PArE|m.26113:1[&&NHX:D=N:ND=71:S=PArE:dist=1.0:name=PArE|m.26113:support=1.0],PSSE|m.24570:1[&&NHX:D=N:ND=72:S=PSSE:dist=1.0:name=PSSE|m.24570:support=1.0])1:1[&&NHX:D=N:ND=73:S=33:dist=1.0:name=:support=1.0],PAsA|m.17393:1[&&NHX:D=N:ND=77:S=PAsA:dist=1.0:name=PAsA|m.17393:support=1.0])1:1[&&NHX:D=N:ND=85:S=50:dist=1.0:name=:support=1.0],(((PBtS|m.34411:1[&&NHX:D=N:ND=90:S=PBtS:dist=1.0:name=PBtS|m.34411:support=1.0],PJJ|m.24955:1[&&NHX:D=N:ND=91:S=PJJ:dist=1.0:name=PJJ|m.24955:support=1.0])1:1[&&NHX:D=N:ND=92:S=38:dist=1.0:name=:support=1.0],(PEcD|m.36208:1[&&NHX:D=N:ND=93:S=PEcD:dist=1.0:name=PEcD|m.36208:support=1.0],(PGrP|m.36371:1[&&NHX:D=N:ND=94:S=PGrP:dist=1.0:name=PGrP|m.36371:support=1.0],PSoG|m.21561:1[&&NHX:D=N:ND=95:S=PSoG:dist=1.0:name=PSoG|m.21561:support=1.0])1:1[&&NHX:D=N:ND=96:S=39:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=97:S=40:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=98:S=41:dist=1.0:name=:support=1.0],PMB|m.48981:1[&&NHX:D=N:ND=103:S=PMB:dist=1.0:name=PMB|m.48981:support=1.0])1:1[&&NHX:D=N:ND=109:S=47:dist=1.0:name=:support=1.0])1:1[&&NHX:D=Y:ND=113:S=50:dist=1.0:name=:support=1.0],((PIsS|m.52893:1[&&NHX:D=N:ND=115:S=PIsS:dist=1.0:name=PIsS|m.52893:support=1.0],PMiM|m.34542:1[&&NHX:D=N:ND=116:S=PMiM:dist=1.0:name=PMiM|m.34542:support=1.0])1:1[&&NHX:D=N:ND=117:S=34:dist=1.0:name=:support=1.0],(PMC|m.57482:1[&&NHX:D=N:ND=121:S=PMC:dist=1.0:name=PMC|m.57482:support=1.0],PMLL|m.39896:1[&&NHX:D=N:ND=122:S=PMLL:dist=1.0:name=PMLL|m.39896:support=1.0])1:1[&&NHX:D=N:ND=125:S=45:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=129:S=49:dist=1.0:name=:support=1.0])1:1[&&NHX:D=Y:ND=131:S=50:dist=1.0:name=:support=1.0],PIbB|m.27259:1[&&NHX:D=N:ND=134:S=PIbB:dist=1.0:name=PIbB|m.27259:support=1.0])1:1[&&NHX:D=Y:ND=141:S=50:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=142:S=51:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=144:S=53:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=145:S=54:dist=1.0:name=:support=1.0],(PBF5|m.35929:1[&&NHX:D=N:ND=146:S=PBF5:dist=1.0:name=PBF5|m.35929:support=1.0],PSlRo11|m.26045:1[&&NHX:D=N:ND=147:S=PSlRo11:dist=1.0:name=PSlRo11|m.26045:support=1.0])1:1[&&NHX:D=N:ND=148:S=7:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=151:S=55:dist=1.0:name=:support=1.0],((BMoV|m.31229:1[&&NHX:D=N:ND=152:S=BMoV:dist=1.0:name=BMoV|m.31229:support=1.0],BPM|m.26069:1[&&NHX:D=N:ND=154:S=BPM:dist=1.0:name=BPM|m.26069:support=1.0])1:1[&&NHX:D=N:ND=158:S=5:dist=1.0:name=:support=1.0],((BFA|m.48628:1[&&NHX:D=N:ND=160:S=BFA:dist=1.0:name=BFA|m.48628:support=1.0],BPM|m.25963:1[&&NHX:D=N:ND=161:S=BPM:dist=1.0:name=BPM|m.25963:support=1.0])1:1[&&NHX:D=N:ND=164:S=4:dist=1.0:name=:support=1.0],BCoP|m.69168:1[&&NHX:D=N:ND=166:S=BCoP:dist=1.0:name=BCoP|m.69168:support=1.0])1:1[&&NHX:D=Y:ND=170:S=4:dist=1.0:name=:support=1.0])1:1[&&NHX:D=Y:ND=172:S=5:dist=1.0:name=:support=1.0])1:1[&&NHX:D=N:ND=175:S=56:dist=1.0:name=:support=1.0]);

In [ ]: