Coverage for /home/deng/Projects/ete4/hackathon/ete4/ete4/smartview/renderer/layouts/seq_layouts.py: 28%

36 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2024-03-21 09:19 +0100

1from ete4.core.seqgroup import SeqGroup 

2from ..treelayout import TreeLayout 

3from ..faces import AlignmentFace, SeqMotifFace, ScaleFace 

4 

5 

6__all__ = [ "LayoutAlignment" ] 

7 

8 

9class LayoutAlignment(TreeLayout): 

10 def __init__(self, name="Alignment", 

11 alignment=None, format='seq', width=700, height=15, 

12 column=0, range=None, summarize_inner_nodes=False): 

13 super().__init__(name) 

14 self.alignment = SeqGroup(alignment) if alignment else None 

15 self.width = width 

16 self.height = height 

17 self.column = column 

18 self.aligned_faces = True 

19 self.format = format 

20 

21 self.length = len(next(self.alignment.iter_entries())[1]) if self.alignment else None 

22 self.scale_range = range or (0, self.length) 

23 self.summarize_inner_nodes = summarize_inner_nodes 

24 

25 def set_tree_style(self, tree, tree_style): 

26 if self.length: 

27 face = ScaleFace(width=self.width, scale_range=self.scale_range, padding_y=10) 

28 tree_style.aligned_panel_header.add_face(face, column=self.column) 

29 

30 def _get_seq(self, node): 

31 if self.alignment: 

32 return self.alignment.get_seq(node.name) 

33 return node.props.get("seq", None) 

34 

35 def get_seq(self, node): 

36 if node.is_leaf: 

37 return self._get_seq(node) 

38 

39 if self.summarize_inner_nodes: 

40 # TODO: summarize inner node's seq 

41 return None 

42 else: 

43 first_leaf = next(node.iter_leaves()) 

44 return self._get_seq(first_leaf) 

45 

46 def set_node_style(self, node): 

47 seq = self.get_seq(node) 

48 

49 if seq: 

50 seqFace = AlignmentFace(seq, seq_format=self.format, bgcolor='grey', 

51 width=self.width, height=self.height) 

52 node.add_face(seqFace, column=self.column, position='aligned', 

53 collapsed_only=(not node.is_leaf))