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
« 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
6__all__ = [ "LayoutAlignment" ]
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
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
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)
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)
35 def get_seq(self, node):
36 if node.is_leaf:
37 return self._get_seq(node)
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)
46 def set_node_style(self, node):
47 seq = self.get_seq(node)
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))