Coverage for /home/deng/Projects/metatree_drawer/metatreedrawer/treeprofiler/layouts/phylosignal_layouts.py: 17%

96 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2024-08-07 10:33 +0200

1from ete4.smartview import TreeStyle, NodeStyle, TreeLayout, PieChartFace 

2from ete4.smartview import RectFace, CircleFace, SeqMotifFace, TextFace, OutlineFace 

3from treeprofiler.layouts.general_layouts import get_piechartface, get_stackedbarface 

4 

5class LayoutACRDiscrete(TreeLayout): 

6 def __init__(self, name, column, color_dict, acr_prop, legend=True, width=70, padding_x=1, padding_y=0): 

7 super().__init__(name) 

8 self.aligned_faces = True 

9 self.acr_prop = acr_prop 

10 self.delta_prop = acr_prop+"_delta" 

11 self.pval_prop = acr_prop+"_pval" 

12 self.column = column 

13 self.color_dict = color_dict 

14 self.legend = legend 

15 self.height = None 

16 self.absence_color = "black" 

17 self.width = width 

18 self.padding_x = padding_x 

19 self.padding_y = padding_y 

20 

21 def set_tree_style(self, tree, tree_style): 

22 super().set_tree_style(tree, tree_style) 

23 text = TextFace(self.acr_prop, min_fsize=5, max_fsize=15, padding_x=self.padding_x, width=self.width, rotation=315) 

24 #tree_style.aligned_panel_header.add_face(text, column=self.column) 

25 if self.legend: 

26 if self.color_dict: 

27 #self.color_dict["Undecided Ancestral Character State"] = self.absence_color  

28 tree_style.add_legend(title=self.name, 

29 variable='discrete', 

30 colormap=self.color_dict 

31 ) 

32 def format_p_value(self, pval): 

33 if pval < 0.001: 

34 return "P < 0.001" 

35 elif pval < 0.01: 

36 return f"P = {pval:.3f}" 

37 else: 

38 # Handle rounding issue for P values greater than .01 

39 if 0.049 <= pval < 0.050 or 0.0049 <= pval < 0.005: 

40 return f"P = {pval:.3f}" 

41 else: 

42 return f"P = {pval:.2f}" 

43 

44 def set_node_style(self, node): 

45 if node.props.get(self.acr_prop): 

46 prop_text = node.props.get(self.acr_prop) 

47 if prop_text: 

48 if type(prop_text) == list: 

49 prop_text = ",".join(prop_text) 

50 else: 

51 pass 

52 if self.color_dict: 

53 node.add_face(TextFace(node.name, color = self.color_dict.get(prop_text,""), 

54 padding_x=self.padding_x),column=0, position="branch_right") 

55 node.sm_style["hz_line_color"] = self.color_dict.get(prop_text,"") 

56 node.sm_style["hz_line_width"] = 3 

57 node.sm_style["vt_line_color"] = self.color_dict.get(prop_text,"") 

58 node.sm_style["vt_line_width"] = 3 

59 node.sm_style["outline_color"] = self.color_dict.get(prop_text, self.absence_color) 

60 node.sm_style["size"] = 4 

61 node.sm_style["fgcolor"] = self.color_dict.get(prop_text, self.absence_color) 

62 

63 # # Delta statistic 

64 if node.props.get(self.delta_prop): 

65 prop_text = "%.2f" % float(node.props.get(self.delta_prop)) 

66 if prop_text: 

67 output = u"\u0394" + f"-{self.acr_prop}: " + prop_text 

68 node.add_face(TextFace(output, color = "red", 

69 padding_x=self.padding_x*5), column=0, position="branch_right") 

70 # p_value 

71 if node.props.get(self.pval_prop) is not None: 

72 pval = float(node.props.get(self.pval_prop)) 

73 

74 prop_text = self.format_p_value(pval) 

75 if prop_text: 

76 node.add_face(TextFace(prop_text, color = "red", 

77 padding_x=self.padding_x*5), column=0, position="branch_right") 

78 

79class LayoutACRContinuous(TreeLayout): 

80 def __init__(self, name, column, color_dict, score_prop, value_range=None, color_range=None, legend=True): 

81 super().__init__(name) 

82 self.aligned_faces = True 

83 self.score_prop = score_prop 

84 self.color_dict = color_dict 

85 self.legend = legend 

86 self.absence_color = "black" 

87 self.value_range = value_range 

88 self.color_range = color_range 

89 self.line_width = 5 

90 

91 def set_tree_style(self, tree, tree_style): 

92 if self.legend: 

93 if self.color_dict: 

94 tree_style.add_legend(title=self.name, 

95 variable='continuous', 

96 value_range=self.value_range, 

97 color_range=self.color_range, 

98 ) 

99 

100 def set_node_style(self, node): 

101 prop_score = node.props.get(self.score_prop) 

102 if prop_score: 

103 prop_score = float(prop_score) 

104 if self.color_dict: 

105 # node.add_face(TextFace(node.name, color = self.color_dict.get(prop_text,""),  

106 # padding_x=self.padding_x),column=0, position="branch_right") 

107 node.sm_style["hz_line_color"] = self.color_dict.get(prop_score,"") 

108 node.sm_style["hz_line_width"] = self.line_width 

109 node.sm_style["vt_line_color"] = self.color_dict.get(prop_score,"") 

110 node.sm_style["vt_line_width"] = self.line_width 

111 node.sm_style["outline_color"] = self.color_dict.get(prop_score, self.absence_color) 

112 

113class LayoutLineageSpecific(TreeLayout): 

114 def __init__(self, name, ls_prop, color, legend=True, active=True): 

115 super().__init__(name) 

116 self.ls_prop = ls_prop 

117 self.color = color 

118 self.legend = legend 

119 self.active = active 

120 def set_tree_style(self, tree, tree_style): 

121 if self.legend: 

122 

123 tree_style.add_legend(title=self.name, 

124 variable='discrete', 

125 colormap={ 

126 self.ls_prop: self.color, 

127 } 

128 ) 

129 

130 def set_node_style(self, node): 

131 if node.props.get(self.ls_prop): 

132 node.sm_style["bgcolor"] = self.color # highligh clade 

133 node.sm_style["outline_color"] = self.color