Coverage for /home/deng/Projects/ete4/hackathon/ete4/ete4/smartview/renderer/layouts/ncbi_taxonomy_layouts.py: 30%
37 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-03-21 09:19 +0100
« prev ^ index » next coverage.py v7.2.7, created at 2024-03-21 09:19 +0100
1import os
2import json
4from ..treelayout import TreeLayout
5from ..faces import RectFace
7from ete4.config import ETE_DATA_HOME, update_ete_data
9__all__ = [ "LayoutLastCommonAncestor" ]
12def get_level(node, level=0):
13 if node.is_root:
14 return level
15 else:
16 return get_level(node.up, level + 1)
20class LayoutLastCommonAncestor(TreeLayout):
21 """
22 Node properties needed
23 :taxid: color
24 :sci_name: text shown
25 """
26 def __init__(self, name="Last common ancestor",
27 rect_width=15, column=1000):
28 super().__init__(name, aligned_faces=True)
30 self.active = True
32 self.rect_width = rect_width
33 self.column = column
35 def get_color(self, node):
36 color = node.props.get('sci_name_color')
37 if color:
38 return color
40 # Make sure we have the big file with all the colors.
41 taxid2color_file = ETE_DATA_HOME + '/taxid2color.json'
43 if not os.path.exists(taxid2color_file):
44 url = ('https://github.com/etetoolkit/ete-data/raw/main'
45 '/layouts/taxid2color.json')
46 update_ete_data(taxid2color_file, url)
48 with open(taxid2color_file) as handle:
49 _taxid2color = json.load(handle)
51 # Use it to colorize according to taxid.
52 taxid = node.props.get('taxid')
53 return _taxid2color.get(taxid, 'lightgray')
56 def set_node_style(self, node):
57 if node.props.get('sci_name'):
58 lca = node.props.get('sci_name')
59 color = self.get_color(node)
61 level = get_level(node, level=self.column)
62 lca_face = RectFace(self.rect_width, float('inf'),
63 color = color,
64 text = lca,
65 fgcolor = "white",
66 padding_x = 1, padding_y = 1)
67 lca_face.rotate_text = True
68 node.add_face(lca_face, position='aligned', column=level)
69 node.add_face(lca_face, position='aligned', column=level,
70 collapsed_only=True)