From 5918c57b9f90a3ceeb4d76b8e3d77abc7fc841de Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Wed, 27 Aug 2025 16:16:38 +0200 Subject: [PATCH 1/7] improved clarity --- src/lineagetree/_core/utils.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/lineagetree/_core/utils.py b/src/lineagetree/_core/utils.py index cb7510c..4e0e5b7 100644 --- a/src/lineagetree/_core/utils.py +++ b/src/lineagetree/_core/utils.py @@ -79,7 +79,7 @@ def _find_leaves_and_depths_iterative(lnks_tms: dict, root: int) -> tuple[list[i leaves : list of int List of leaf node ids. depths : dict mapping int to int - Dictionary mapping node ids to their depth in the tree. + Dictionary mapping all node ids to their depth in the tree. """ leaves = [] depths = {} @@ -88,19 +88,18 @@ def _find_leaves_and_depths_iterative(lnks_tms: dict, root: int) -> tuple[list[i stack = [(root, 0)] while stack: - node, parent_depth = stack.pop() + parent_node, parent_depth = stack.pop() + depths[parent_node] = parent_depth - node_depth = parent_depth + lnks_tms["times"].get(node, 0) - depths[node] = parent_depth - - succ = lnks_tms["links"].get(node, []) + child_depth = parent_depth + lnks_tms["times"].get(parent_node, 0) + succ = lnks_tms["links"].get(parent_node, []) if not succ: # This is a leaf - leaves.append(node) + leaves.append(parent_node) else: # Add children to stack (reverse order to maintain left-to-right traversal) for child in reversed(succ): - stack.append((child, node_depth)) + stack.append((child, child_depth)) return leaves, depths From 4209df257e8f04befb57807becbd354e3393dca3 Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Thu, 28 Aug 2025 11:36:08 +0200 Subject: [PATCH 2/7] added todo for later --- src/lineagetree/_core/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lineagetree/_core/utils.py b/src/lineagetree/_core/utils.py index 4e0e5b7..f363afd 100644 --- a/src/lineagetree/_core/utils.py +++ b/src/lineagetree/_core/utils.py @@ -96,7 +96,7 @@ def _find_leaves_and_depths_iterative(lnks_tms: dict, root: int) -> tuple[list[i succ = lnks_tms["links"].get(parent_node, []) if not succ: # This is a leaf leaves.append(parent_node) - else: + else: #TODO solve problem of children at same depth as parent # Add children to stack (reverse order to maintain left-to-right traversal) for child in reversed(succ): stack.append((child, child_depth)) @@ -157,7 +157,7 @@ def _assign_positions_iterative( pos_node[succ[0]][0], ycenter - depths[node] * vert_gap ] - else: + else: #TODO solve problem of children at same depth as parent # Multiple children: place at center of children child_x_positions = [pos_node[child][0] for child in succ] center_x = sum(child_x_positions) / len(child_x_positions) From 4a038e81191dcb8eb60930b6247034d06ff02cf0 Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Fri, 5 Sep 2025 14:19:52 +0200 Subject: [PATCH 3/7] solved plots with 2 lines --- src/lineagetree/plot.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lineagetree/plot.py b/src/lineagetree/plot.py index fc2084b..36a3589 100644 --- a/src/lineagetree/plot.py +++ b/src/lineagetree/plot.py @@ -211,7 +211,7 @@ def plot_all_lineages( lT: LineageTree, nodes: list | None = None, last_time_point_to_consider: int | None = None, - nrows: int = 2, + nrows: int = 1, figsize: tuple[int, int] = (10, 15), dpi: int = 100, fontsize: int = 15, @@ -290,7 +290,7 @@ def plot_all_lineages( raise Exception( f"Not enough axes, they should be at least {len(graphs)}." ) - flat_axes = axes.flatten() + flat_axes = axes.flatten() if hasattr(axes, "flatten") else [axes] ax2root = {} min_width, min_height = float("inf"), float("inf") for ax in flat_axes: @@ -326,8 +326,8 @@ def plot_all_lineages( "edgecolor": "green", }, ) - [figure.delaxes(ax) for ax in axes.flatten() if not ax.has_data()] - return axes.flatten()[0].get_figure(), axes, ax2root + [figure.delaxes(ax) for ax in flat_axes if not ax.has_data()] + return flat_axes[0].get_figure(), flat_axes, ax2root def plot_subtree( From 03c3530760be0d82697b9e16b9dff105ae603c2e Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Fri, 5 Sep 2025 14:20:06 +0200 Subject: [PATCH 4/7] solved incorrect mother/daughter placements --- src/lineagetree/_core/utils.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/lineagetree/_core/utils.py b/src/lineagetree/_core/utils.py index f363afd..b25b85a 100644 --- a/src/lineagetree/_core/utils.py +++ b/src/lineagetree/_core/utils.py @@ -83,20 +83,25 @@ def _find_leaves_and_depths_iterative(lnks_tms: dict, root: int) -> tuple[list[i """ leaves = [] depths = {} + + times = lnks_tms["times"] + links = lnks_tms["links"] - # Stack for DFS: (node, current_depth, parent_depth) + # Stack for DFS: (node, parent_depth) stack = [(root, 0)] while stack: parent_node, parent_depth = stack.pop() depths[parent_node] = parent_depth + succ = links.get(parent_node, []) - child_depth = parent_depth + lnks_tms["times"].get(parent_node, 0) - - succ = lnks_tms["links"].get(parent_node, []) if not succ: # This is a leaf leaves.append(parent_node) else: #TODO solve problem of children at same depth as parent + if len(succ) == 1: # in this case, times[parent_node] is equal to the length of the chain + child_depth = parent_depth + times[parent_node] - 1 + else: # in this case, times[parent_node] is 0 + child_depth = parent_depth + 1 # Add children to stack (reverse order to maintain left-to-right traversal) for child in reversed(succ): stack.append((child, child_depth)) From 9df661dbb57424808d9ff5110fb4189c610eadee Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Fri, 5 Sep 2025 14:31:51 +0200 Subject: [PATCH 5/7] removed comment --- src/lineagetree/_core/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lineagetree/_core/utils.py b/src/lineagetree/_core/utils.py index b25b85a..287e1a4 100644 --- a/src/lineagetree/_core/utils.py +++ b/src/lineagetree/_core/utils.py @@ -97,7 +97,7 @@ def _find_leaves_and_depths_iterative(lnks_tms: dict, root: int) -> tuple[list[i if not succ: # This is a leaf leaves.append(parent_node) - else: #TODO solve problem of children at same depth as parent + else: if len(succ) == 1: # in this case, times[parent_node] is equal to the length of the chain child_depth = parent_depth + times[parent_node] - 1 else: # in this case, times[parent_node] is 0 From f9d1e5aca0ff9a651633c102da136265c9fc6a62 Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Fri, 5 Sep 2025 14:52:14 +0200 Subject: [PATCH 6/7] removed comment --- src/lineagetree/_core/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lineagetree/_core/utils.py b/src/lineagetree/_core/utils.py index 287e1a4..26c9db0 100644 --- a/src/lineagetree/_core/utils.py +++ b/src/lineagetree/_core/utils.py @@ -162,7 +162,7 @@ def _assign_positions_iterative( pos_node[succ[0]][0], ycenter - depths[node] * vert_gap ] - else: #TODO solve problem of children at same depth as parent + else: # Multiple children: place at center of children child_x_positions = [pos_node[child][0] for child in succ] center_x = sum(child_x_positions) / len(child_x_positions) From b29f4f4ead85a591cc551a1b99e98e85444bc544 Mon Sep 17 00:00:00 2001 From: jules-vanaret Date: Mon, 8 Sep 2025 09:52:00 +0200 Subject: [PATCH 7/7] solved bug and modified docstring --- src/lineagetree/plot.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lineagetree/plot.py b/src/lineagetree/plot.py index 36a3589..f644b6f 100644 --- a/src/lineagetree/plot.py +++ b/src/lineagetree/plot.py @@ -232,7 +232,7 @@ def plot_all_lineages( For example if start_time is 10, then all trees that begin on tp 10 or before are calculated. Defaults to None, where it will plot all the roots that exist on `lT.t_b`. - nrows : int, default=2 + nrows : int, default=1 How many rows of plots should be printed. figsize : tuple, default=(10, 15) The size of the figure. @@ -327,7 +327,7 @@ def plot_all_lineages( }, ) [figure.delaxes(ax) for ax in flat_axes if not ax.has_data()] - return flat_axes[0].get_figure(), flat_axes, ax2root + return flat_axes[0].get_figure(), axes, ax2root def plot_subtree(