From a6ab26d4ef6031acccc721c9b414e6bb25cc8f80 Mon Sep 17 00:00:00 2001 From: Matteo Bachetti Date: Fri, 1 Sep 2023 13:36:07 +0200 Subject: [PATCH 1/3] Update tstart and tseg when truncating the lc --- stingray/lightcurve.py | 7 +++++-- stingray/tests/test_lightcurve.py | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/stingray/lightcurve.py b/stingray/lightcurve.py index 2edc06490..9617e3e0a 100644 --- a/stingray/lightcurve.py +++ b/stingray/lightcurve.py @@ -1243,9 +1243,12 @@ def truncate(self, start=0, stop=None, method="index"): raise ValueError("Unknown method type " + method + ".") if method.lower() == "index": - return self._truncate_by_index(start, stop) + new_lc = self._truncate_by_index(start, stop) else: - return self._truncate_by_time(start, stop) + new_lc = self._truncate_by_time(start, stop) + new_lc.tstart = new_lc.gti[0, 0] + new_lc.tseg = new_lc.gti[-1, 1] - new_lc.gti[0, 0] + return new_lc def _truncate_by_index(self, start, stop): """Private method for truncation using index values.""" diff --git a/stingray/tests/test_lightcurve.py b/stingray/tests/test_lightcurve.py index a75c35e72..865fe746b 100644 --- a/stingray/tests/test_lightcurve.py +++ b/stingray/tests/test_lightcurve.py @@ -814,6 +814,8 @@ def test_truncate_by_index(self): assert np.allclose(lc1.frac_exp, np.array([1, 1, 1])) np.testing.assert_almost_equal(lc1.gti[0][0], 1.5) assert lc1.mjdref == lc.mjdref + assert lc1.tstart == 1.5 + assert lc1.tseg == 3 lc2 = lc.truncate(stop=2) assert np.allclose(lc2.time, np.array([1, 2])) @@ -824,6 +826,9 @@ def test_truncate_by_index(self): np.testing.assert_almost_equal(lc2.gti[-1][-1], 2.5) assert lc2.mjdref == lc.mjdref + assert lc2.tstart == lc.tstart + assert lc2.tseg == 2 + def test_truncate_by_time_stop_less_than_start(self): lc = Lightcurve(self.times, self.counts) @@ -843,12 +848,16 @@ def test_truncate_by_time(self): assert np.allclose(lc1.counts, np.array([2, 2, 2, 2])) np.testing.assert_almost_equal(lc1.gti[0][0], 0.5) assert lc1.mjdref == lc.mjdref + assert lc1.tstart == 0.5 + assert lc1.tseg == 4.0 lc2 = lc.truncate(stop=3, method="time") assert np.allclose(lc2.time, np.array([1, 2])) assert np.allclose(lc2.counts, np.array([2, 2])) np.testing.assert_almost_equal(lc2.gti[-1][-1], 2.5) assert lc2.mjdref == lc.mjdref + assert lc2.tstart == 0.5 + assert lc2.tseg == 2 def test_split_with_two_segments(self): test_time = np.array([1, 2, 3, 6, 7, 8]) From 7f9ac5549c32914866d252ba738a9af4e48f06b1 Mon Sep 17 00:00:00 2001 From: Matteo Bachetti Date: Sat, 2 Sep 2023 01:22:31 +0200 Subject: [PATCH 2/3] Add changelog --- docs/changes/753.bugfix.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/753.bugfix.rst diff --git a/docs/changes/753.bugfix.rst b/docs/changes/753.bugfix.rst new file mode 100644 index 000000000..6cc0235e7 --- /dev/null +++ b/docs/changes/753.bugfix.rst @@ -0,0 +1 @@ +Update tstart and tseg when using Lightcurve.truncate() \ No newline at end of file From c3790bc3f791a95e2f262433993bdd70446261e1 Mon Sep 17 00:00:00 2001 From: Matteo Bachetti Date: Wed, 6 Sep 2023 11:41:23 +0200 Subject: [PATCH 3/3] Setup tests to verify correct update of meancounts and many other attributes --- stingray/tests/test_lightcurve.py | 57 ++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/stingray/tests/test_lightcurve.py b/stingray/tests/test_lightcurve.py index 865fe746b..5b8dc66d8 100644 --- a/stingray/tests/test_lightcurve.py +++ b/stingray/tests/test_lightcurve.py @@ -308,8 +308,8 @@ class TestLightcurve(object): @classmethod def setup_class(cls): cls.times = np.array([1, 2, 3, 4]) - cls.counts = np.array([2, 2, 2, 2]) - cls.counts_err = np.array([0.2, 0.2, 0.2, 0.2]) + cls.counts = np.array([2, 4, 6, 8]) + cls.counts_err = np.array([0.2, 0.4, 0.6, 0.8]) cls.bg_counts = np.array([1, 0, 0, 1]) cls.bg_ratio = np.array([1, 1, 0.5, 1]) cls.frac_exp = np.array([1, 1, 1, 1]) @@ -632,7 +632,7 @@ def test_subtraction(self): lc = lc2 - lc1 - expected_counts = np.array([1, 2, 3, 4]) + expected_counts = np.array([1, 0, -1, -2]) assert np.allclose(lc.counts, expected_counts) assert lc1.mjdref == lc.mjdref @@ -658,7 +658,9 @@ def test_indexing_with_unexpected_type(self): def test_indexing(self): lc = Lightcurve(self.times, self.counts) - assert lc[0] == lc[1] == lc[2] == lc[3] == 2 + assert lc[0] == 2 + assert lc[1] == 4 + assert lc[3] == 8 def test_slicing(self): lc = Lightcurve( @@ -669,20 +671,20 @@ def test_slicing(self): err=self.counts / 10, err_dist="gauss", ) - assert np.allclose(lc[1:3].counts, np.array([2, 2])) - assert np.allclose(lc[:2].counts, np.array([2, 2])) + assert np.allclose(lc[1:3].counts, np.array([4, 6])) + assert np.allclose(lc[:2].counts, np.array([2, 4])) assert np.allclose(lc[:2].gti, [[0.5, 2.5]]) - assert np.allclose(lc[2:].counts, np.array([2, 2])) + assert np.allclose(lc[2:].counts, np.array([6, 8])) assert np.allclose(lc[2:].gti, [[2.5, 4.5]]) - assert np.allclose(lc[:].counts, np.array([2, 2, 2, 2])) + assert np.allclose(lc[:].counts, np.array([2, 4, 6, 8])) assert np.allclose(lc[::2].gti, [[0.5, 1.5], [2.5, 3.5]]) assert np.allclose(lc[:].gti, lc.gti) assert lc[:].mjdref == lc.mjdref assert lc[::2].n == 2 - assert np.allclose(lc[1:3].counts_err, np.array([2, 2]) / 10) - assert np.allclose(lc[:2].counts_err, np.array([2, 2]) / 10) - assert np.allclose(lc[2:].counts_err, np.array([2, 2]) / 10) - assert np.allclose(lc[:].counts_err, np.array([2, 2, 2, 2]) / 10) + assert np.allclose(lc[1:3].counts_err, np.array([0.4, 0.6])) + assert np.allclose(lc[:2].counts_err, np.array([0.2, 0.4])) + assert np.allclose(lc[2:].counts_err, np.array([0.6, 0.8])) + assert np.allclose(lc[:].counts_err, np.array([0.2, 0.4, 0.6, 0.8])) assert lc[:].err_dist == lc.err_dist def test_index(self): @@ -751,7 +753,8 @@ def test_join_disjoint_time_arrays(self): lc = lc1.join(lc2) assert len(lc.counts) == len(lc.time) == 8 - assert np.allclose(lc.counts, 2) + assert np.allclose(lc.counts[4:], 2) + assert np.allclose(lc.counts[:4], self.counts) assert lc.mjdref == lc1.mjdref def test_join_overlapping_time_arrays(self): @@ -765,7 +768,7 @@ def test_join_overlapping_time_arrays(self): lc = lc1.join(lc2) assert len(lc.counts) == len(lc.time) == 6 - assert np.allclose(lc.counts, np.array([2, 2, 3, 3, 4, 4])) + assert np.allclose(lc.counts, np.array([2, 4, 5, 6, 4, 4])) def test_join_different_err_dist_disjoint_times(self): _times = [5, 6, 7, 8] @@ -808,7 +811,8 @@ def test_truncate_by_index(self): lc1 = lc.truncate(start=1) assert np.allclose(lc1.time, np.array([2, 3, 4])) - assert np.allclose(lc1.counts, np.array([2, 2, 2])) + assert np.allclose(lc1.counts, np.array([4, 6, 8])) + assert np.allclose(lc1.countrate, np.array([4, 6, 8])) assert np.allclose(lc1.bg_counts, np.array([0, 0, 1])) assert np.allclose(lc1.bg_ratio, np.array([1, 0.5, 1])) assert np.allclose(lc1.frac_exp, np.array([1, 1, 1])) @@ -816,15 +820,18 @@ def test_truncate_by_index(self): assert lc1.mjdref == lc.mjdref assert lc1.tstart == 1.5 assert lc1.tseg == 3 + assert lc1.n == 3 lc2 = lc.truncate(stop=2) assert np.allclose(lc2.time, np.array([1, 2])) - assert np.allclose(lc2.counts, np.array([2, 2])) + assert np.allclose(lc2.counts, np.array([2, 4])) + assert np.allclose(lc2.countrate, np.array([2, 4])) assert np.allclose(lc2.bg_counts, np.array([1, 0])) assert np.allclose(lc2.bg_ratio, np.array([1, 1])) assert np.allclose(lc2.frac_exp, np.array([1, 1])) np.testing.assert_almost_equal(lc2.gti[-1][-1], 2.5) assert lc2.mjdref == lc.mjdref + assert lc2.n == 2 assert lc2.tstart == lc.tstart assert lc2.tseg == 2 @@ -841,23 +848,35 @@ def test_truncate_fails_with_incorrect_method(self): lc1 = lc.truncate(start=1, method="wrong") def test_truncate_by_time(self): - lc = Lightcurve(self.times, self.counts, gti=self.gti) + lc = Lightcurve(self.times, self.counts, err=self.counts_err, gti=self.gti) + # make sure they are initialized + lc.meancounts, lc.meanrate, lc.n lc1 = lc.truncate(start=1, method="time") assert np.allclose(lc1.time, np.array([1, 2, 3, 4])) - assert np.allclose(lc1.counts, np.array([2, 2, 2, 2])) + assert np.allclose(lc1.counts, np.array([2, 4, 6, 8])) + assert np.allclose(lc1.counts_err, np.array([0.2, 0.4, 0.6, 0.8])) + assert np.allclose(lc1.countrate, np.array([2, 4, 6, 8])) np.testing.assert_almost_equal(lc1.gti[0][0], 0.5) assert lc1.mjdref == lc.mjdref assert lc1.tstart == 0.5 assert lc1.tseg == 4.0 + assert lc1.meancounts == 5 + assert lc1.meanrate == 5 + assert lc1.n == 4 lc2 = lc.truncate(stop=3, method="time") assert np.allclose(lc2.time, np.array([1, 2])) - assert np.allclose(lc2.counts, np.array([2, 2])) + assert np.allclose(lc2.counts, np.array([2, 4])) + assert np.allclose(lc2.counts_err, np.array([0.2, 0.4])) + assert np.allclose(lc2.countrate, np.array([2, 4])) np.testing.assert_almost_equal(lc2.gti[-1][-1], 2.5) assert lc2.mjdref == lc.mjdref assert lc2.tstart == 0.5 assert lc2.tseg == 2 + assert lc2.meancounts == 3 + assert lc2.meanrate == 3 + assert lc2.n == 2 def test_split_with_two_segments(self): test_time = np.array([1, 2, 3, 6, 7, 8])