From 6367e37a2329cf3b35a838f82a17c78fad96bc0f Mon Sep 17 00:00:00 2001 From: Yan Wong Date: Fri, 28 Aug 2020 09:18:54 +0100 Subject: [PATCH] Set .span property for Interval --- python/CHANGELOG.rst | 3 +++ python/tests/test_highlevel.py | 19 +++++++++++++------ python/tskit/trees.py | 8 +++++++- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/python/CHANGELOG.rst b/python/CHANGELOG.rst index ca12dad7a1..835b1ad77e 100644 --- a/python/CHANGELOG.rst +++ b/python/CHANGELOG.rst @@ -4,6 +4,9 @@ **Features** +- Genomic intervals returned by python functions are now namedtuples, allowing ``.left`` + ``.right`` and ``.span`` usage (:user:`hyanwong`, :issue:`784`, :pr:`786`, :pr:`811`) + - :issue:`832` - Add ``metadata_bytes`` method to allow access to raw TableCollection metadata (:user:`benjeffery`, :pr:`842`) diff --git a/python/tests/test_highlevel.py b/python/tests/test_highlevel.py index 49f1a932c4..6264f78a25 100644 --- a/python/tests/test_highlevel.py +++ b/python/tests/test_highlevel.py @@ -2363,12 +2363,19 @@ def test_seek(self): self.assertRaises(ValueError, tree.seek, bad_position) def test_interval(self): - ts = msprime.simulate(10) - tree = ts.first() - self.assertEqual(tree.interval[0], 0) - self.assertEqual(tree.interval.left, 0) - self.assertEqual(tree.interval[1], 1) - self.assertEqual(tree.interval.right, 1) + ts = msprime.simulate(10, recombination_rate=1, random_seed=1) + self.assertGreater(ts.num_trees, 1) + breakpoints = list(ts.breakpoints()) + self.assertEqual(breakpoints[0], 0) + self.assertEqual(breakpoints[-1], ts.sequence_length) + for i, tree in enumerate(ts.trees()): + self.assertAlmostEqual(tree.interval[0], breakpoints[i]) + self.assertAlmostEqual(tree.interval.left, breakpoints[i]) + self.assertAlmostEqual(tree.interval[1], breakpoints[i + 1]) + self.assertAlmostEqual(tree.interval.right, breakpoints[i + 1]) + self.assertAlmostEqual( + tree.interval.span, breakpoints[i + 1] - breakpoints[i] + ) def verify_empty_tree(self, tree): ts = tree.tree_sequence diff --git a/python/tskit/trees.py b/python/tskit/trees.py index 9d18d5e150..5dd22f6420 100644 --- a/python/tskit/trees.py +++ b/python/tskit/trees.py @@ -58,7 +58,13 @@ "CoalescenceRecord", ["left", "right", "node", "children", "time", "population"] ) -Interval = collections.namedtuple("Interval", ["left", "right"]) +BaseInterval = collections.namedtuple("BaseInterval", ["left", "right"]) + + +class Interval(BaseInterval): + @property + def span(self): + return self.right - self.left # TODO this interface is rubbish. Should have much better printing options.