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

1import os 

2import json 

3 

4from ..treelayout import TreeLayout 

5from ..faces import RectFace 

6 

7from ete4.config import ETE_DATA_HOME, update_ete_data 

8 

9__all__ = [ "LayoutLastCommonAncestor" ] 

10 

11 

12def get_level(node, level=0): 

13 if node.is_root: 

14 return level 

15 else: 

16 return get_level(node.up, level + 1) 

17 

18 

19 

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) 

29 

30 self.active = True 

31 

32 self.rect_width = rect_width 

33 self.column = column 

34 

35 def get_color(self, node): 

36 color = node.props.get('sci_name_color') 

37 if color: 

38 return color 

39 

40 # Make sure we have the big file with all the colors. 

41 taxid2color_file = ETE_DATA_HOME + '/taxid2color.json' 

42 

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) 

47 

48 with open(taxid2color_file) as handle: 

49 _taxid2color = json.load(handle) 

50 

51 # Use it to colorize according to taxid. 

52 taxid = node.props.get('taxid') 

53 return _taxid2color.get(taxid, 'lightgray') 

54 

55 

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) 

60 

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)