Source code for threeML.test.test_time_interval

from __future__ import print_function
from builtins import zip
import pytest

from threeML.utils.time_interval import TimeInterval, TimeIntervalSet
from threeML.utils.interval import IntervalsDoNotOverlap, IntervalsNotContiguous


[docs] def test_time_interval_constructor(): t = TimeInterval(-10.0, 10.0) assert t.start_time == -10.0 assert t.stop_time == 10.0 assert t.duration == 20.0 assert t.half_time == 0.0 with pytest.raises(RuntimeError): _ = TimeInterval(10.0, -10.0, swap_if_inverted=False) _ = TimeInterval(-10.0, 10.0, swap_if_inverted=True)
[docs] def test_time_interval_repr(): t = TimeInterval(-10.0, 10.0) print(t)
[docs] def test_time_interval_overlaps_with(): t1 = TimeInterval(-10.0, 10.0) t2 = TimeInterval(0.0, 30.0) t3 = TimeInterval(-100, 100.0) t4 = TimeInterval(-100, -10) t5 = TimeInterval(100.0, 200.0) assert t1.overlaps_with(t2) == True assert t1.overlaps_with(t3) == True assert t1.overlaps_with(t4) == False assert t1.overlaps_with(t5) == False
[docs] def test_time_interval_intersect(): t1 = TimeInterval(-10.0, 10.0) t2 = TimeInterval(0.0, 30.0) t = t1.intersect(t2) assert t.start_time == 0.0 assert t.stop_time == 10.0 with pytest.raises(IntervalsDoNotOverlap): t1 = TimeInterval(-10.0, 10.0) t2 = TimeInterval(20.0, 30.0) _ = t1.intersect(t2)
[docs] def test_time_interval_merge(): t1 = TimeInterval(-10.0, 10.0) t2 = TimeInterval(0.0, 30.0) t = t1.merge(t2) assert t.start_time == -10.0 assert t.stop_time == 30.0 with pytest.raises(IntervalsDoNotOverlap): t1 = TimeInterval(-10.0, 10.0) t2 = TimeInterval(20.0, 30.0) _ = t1.merge(t2)
[docs] def test_time_interval_add(): t = TimeInterval(-10.0, 10.0) new_t = t + 10.0 # type: TimeInterval assert new_t.start_time == 0 assert new_t.stop_time == 20.0
[docs] def test_time_interval_sub(): t = TimeInterval(-10.0, 10.0) new_t = t - 10.0 # type: TimeInterval assert new_t.start_time == -20.0 assert new_t.stop_time == 0.0
[docs] def test_time_interval_constructor_set(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) ts = TimeIntervalSet([t1, t2]) assert ts[0] == t1 assert ts[1] == t2 # Use strings ts2 = TimeIntervalSet.from_strings("-10 - -5", "10 - 20", "20-30", "-10--5") assert ts2[0].start_time == -10 assert ts2[0].stop_time == -5 assert ts2[-1].start_time == -10 assert ts2[-1].stop_time == -5 assert ts2[1].start_time == 10 assert ts2[1].stop_time == 20 assert ts2[2].start_time == 20 assert ts2[2].stop_time == 30 # Use edges ts3 = TimeIntervalSet.from_list_of_edges([-2, -1, 0, 1, 2]) assert ts3[0].start_time == -2 assert ts3[0].stop_time == -1 assert ts3[-1].start_time == 1 assert ts3[-1].stop_time == 2 assert ts3[1].start_time == -1 assert ts3[1].stop_time == 0 assert ts3[2].start_time == 0 assert ts3[2].stop_time == 1 # Use start and stops ts5 = TimeIntervalSet.from_starts_and_stops([-2, -1, 0, 1], [-1, 0, 1, 2]) assert ts5[0].start_time == -2 assert ts5[0].stop_time == -1 assert ts5[-1].start_time == 1 assert ts5[-1].stop_time == 2 assert ts5[1].start_time == -1 assert ts5[1].stop_time == 0 assert ts5[2].start_time == 0 assert ts5[2].stop_time == 1 with pytest.raises(AssertionError): ts6 = TimeIntervalSet.from_starts_and_stops([-2, -1, 0, 1], [-1, 0, 1]) # test display ts5.display()
[docs] def test_time_interval_iterator_set(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) ts = TimeIntervalSet([t1, t2]) for i, tt in enumerate(ts): if i == 0: assert tt == t1 else: assert tt == t2
[docs] def test_time_interval_extend_set(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) ts = TimeIntervalSet([t1, t2]) t3 = TimeInterval(30.0, 40.0) t4 = TimeInterval(40.0, 50.0) ts.extend([t3, t4]) assert len(ts) == 4 ts.extend(TimeIntervalSet([t3, t4])) assert len(ts) == 6
[docs] def test_time_interval_add_sub_set(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) ts = TimeIntervalSet([t1, t2]) ts2 = ts + 10.0 # type: TimeIntervalSet assert ts2[0].start_time == 0.0 assert ts2[1].stop_time == 40.0 ts3 = ts - 10.0 # type: TimeIntervalSet assert ts3[0].start_time == -20.0 assert ts3[1].stop_time == 20.0
[docs] def test_time_interval_argsort_set(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) t3 = TimeInterval(-30.0, 50.0) ts = TimeIntervalSet([t1, t2, t3]) idx = ts.argsort() assert idx == [2, 0, 1]
[docs] def test_time_interval_sort_set(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) t3 = TimeInterval(-30.0, 50.0) ts = TimeIntervalSet([t1, t2, t3]) ts2 = ts.sort() assert ts2[0] == t3 assert ts2[1] == t1 assert ts2[2] == t2
[docs] def test_time_interval_equivalence(): t1 = TimeInterval(10.523, 20.32) assert t1 == TimeInterval(10.523, 20.32) assert not t1 == None
[docs] def test_time_interval_set_pop(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) t3 = TimeInterval(-30.0, 50.0) ts = TimeIntervalSet([t1, t2, t3]) popped = ts.pop(1) assert popped == t2
[docs] def test_time_interval_set_is_contiguous(): t1 = TimeInterval(-10.0, 20.0) t2 = TimeInterval(10.0, 30.0) t3 = TimeInterval(-30.0, 50.0) ts = TimeIntervalSet([t1, t2, t3]) assert ts.is_contiguous() == False t1 = TimeInterval(0.0, 1.0) t2 = TimeInterval(1.0, 2.0) t3 = TimeInterval(2.0, 3.0) ts = TimeIntervalSet([t1, t2, t3]) assert ts.is_contiguous() == True t1 = TimeInterval(0.0, 1.0) t2 = TimeInterval(1.1, 2.0) t3 = TimeInterval(2.0, 3.0) ts = TimeIntervalSet([t1, t2, t3]) assert ts.is_contiguous() == False t1 = TimeInterval(0.0, 1.0) t2 = TimeInterval(2.0, 3.0) t3 = TimeInterval(1.0, 2.0) ts = TimeIntervalSet([t1, t2, t3]) assert ts.is_contiguous() == False new_ts = ts.sort() assert new_ts.is_contiguous() == True
[docs] def test_merging_set_intervals(): # test that non overlapping intervals # do not result in a merge t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(5.0, 10.0) t3 = TimeInterval(15.0, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 3 assert t1 == ts2[0] assert t2 == ts2[1] assert t3 == ts2[2] # end merge works t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(5.0, 10.0) t3 = TimeInterval(7.0, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 2 assert t1 == ts2[0] assert TimeInterval(5.0, 20.0) == ts2[1] # begin merge works t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(-5.0, 10.0) t3 = TimeInterval(15, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 2 assert TimeInterval(-10.0, 10.0) == ts2[0] assert TimeInterval(15.0, 20.0) == ts2[1] # middle merge works t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(5.0, 10.0) t3 = TimeInterval(7.0, 20.0) t4 = TimeInterval(35.0, 40.0) ts1 = TimeIntervalSet([t1, t2, t3, t4]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 3 assert t1 == ts2[0] assert TimeInterval(5.0, 20.0) == ts2[1] assert t4 == ts2[2] # both end merge works t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(-5.0, 10.0) t3 = TimeInterval(15.0, 20.0) t4 = TimeInterval(35.0, 45.0) t5 = TimeInterval(40.0, 50.0) ts1 = TimeIntervalSet([t1, t2, t3, t4, t5]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 3 assert TimeInterval(-10.0, 10.0) == ts2[0] assert t3 == ts2[1] assert TimeInterval(35.0, 50.0) == ts2[2] # multi merge works t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(-5.0, 10.0) t3 = TimeInterval(7, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 1 assert TimeInterval(-10.0, 20.0) == ts2[0] # complete overlap merge works t1 = TimeInterval(-10.0, 25.0) t2 = TimeInterval(-5.0, 10.0) t3 = TimeInterval(7, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) ts2 = ts1.merge_intersecting_intervals(in_place=False) assert len(ts2) == 1 assert TimeInterval(-10.0, 25.0) == ts2[0] # tests the inplace operation t1 = TimeInterval(-10.0, 25.0) t2 = TimeInterval(-5.0, 10.0) t3 = TimeInterval(7, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) ts1.merge_intersecting_intervals(in_place=True) assert len(ts1) == 1 assert TimeInterval(-10.0, 25.0) == ts1[0]
[docs] def test_interval_set_to_string(): # also tests the time interval to string t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(5.0, 10.0) t3 = TimeInterval(15.0, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) strings = ts1.to_string() strings_split = strings.split(",") assert t1.to_string() == strings_split[0] assert t2.to_string() == strings_split[1] assert t3.to_string() == strings_split[2] ts2 = TimeIntervalSet.from_strings(t1.to_string()) assert ts2[0] == t1
[docs] def test_time_interval_sets_starts_stops(): t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(5.0, 10.0) t3 = TimeInterval(15.0, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) for start, stop, interval in zip(ts1.start_times, ts1.stop_times, [t1, t2, t3]): assert interval.start_time == start assert interval.stop_time == stop
[docs] def test_time_edges(): t1 = TimeInterval(-10.0, 0.0) t2 = TimeInterval(0.0, 10.0) t3 = TimeInterval(10.0, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) assert ts1.time_edges[0] == -10.0 assert ts1.time_edges[1] == 0.0 assert ts1.time_edges[2] == 10.0 assert ts1.time_edges[3] == 20.0 with pytest.raises(IntervalsNotContiguous): t1 = TimeInterval(-10.0, -5.0) t2 = TimeInterval(0.0, 10.0) t3 = TimeInterval(10.0, 20.0) ts1 = TimeIntervalSet([t1, t2, t3]) _ = ts1.time_edges