From c7bc7574df1b0469aad1226887495ce013b615f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Deuchnord?= Date: Fri, 6 Mar 2020 22:08:09 +0100 Subject: [PATCH] fix(events): prevent false detection of conjunctions --- kosmorrolib/events.py | 19 +++++++++---------- test/events.py | 15 ++++++++++----- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/kosmorrolib/events.py b/kosmorrolib/events.py index 352e3b0..41e0e2d 100644 --- a/kosmorrolib/events.py +++ b/kosmorrolib/events.py @@ -20,6 +20,7 @@ from datetime import date as date_type from skyfield.timelib import Time from skyfield.searchlib import find_discrete, find_maxima +from numpy import pi from .data import Event, Planet, ASTERS from .core import get_timescale, get_skf_objects, flatten_list @@ -32,15 +33,12 @@ def _search_conjunction(start_time: Time, end_time: Time) -> [Event]: def is_in_conjunction(time: Time): earth_pos = earth.at(time) - aster1_pos = earth_pos.observe(get_skf_objects()[aster1.skyfield_name]).apparent() - aster2_pos = earth_pos.observe(get_skf_objects()[aster2.skyfield_name]).apparent() + _, aster1_lon, _ = earth_pos.observe(aster1.get_skyfield_object()).apparent().ecliptic_latlon() + _, aster2_lon, _ = earth_pos.observe(aster2.get_skyfield_object()).apparent().ecliptic_latlon() - aster_1_right_ascension, _, _ = aster1_pos.radec() - aster_2_right_ascension, _, _ = aster2_pos.radec() + return ((aster1_lon.radians - aster2_lon.radians) / pi % 2.0).astype('int8') == 0 - return aster_1_right_ascension.hours - aster_2_right_ascension.hours < 0 - - is_in_conjunction.rough_period = 1.0 + is_in_conjunction.rough_period = 60.0 computed = [] conjunctions = [] @@ -54,10 +52,11 @@ def _search_conjunction(start_time: Time, end_time: Time) -> [Event]: if not isinstance(aster2, Planet) or aster2 == aster1 or aster2 in computed: continue - times, _ = find_discrete(start_time, end_time, is_in_conjunction) + times, is_conjs = find_discrete(start_time, end_time, is_in_conjunction) - for time in times: - conjunctions.append(Event('CONJUNCTION', [aster1, aster2], time.utc_datetime())) + for i, time in enumerate(times): + if is_conjs[i]: + conjunctions.append(Event('CONJUNCTION', [aster1, aster2], time.utc_datetime())) computed.append(aster1) diff --git a/test/events.py b/test/events.py index 0e1a1dd..1de895e 100644 --- a/test/events.py +++ b/test/events.py @@ -29,11 +29,16 @@ class MyTestCase(unittest.TestCase): self.assertEqual('Mars is in opposition', o[0].get_description()) def test_find_conjunctions(self): - # Test case: Mars opposition - # Source of the information: https://promenade.imcce.fr/en/pages6/887.html#mar - c1 = (events.search_events(date(2020, 1, 2)), [(['MERCURY', 'JUPITER BARYCENTER'], '^2020-01-02T15:20')]) - c2 = (events.search_events(date(2020, 1, 12)), [(['MERCURY', 'SATURN BARYCENTER'], '^2020-01-12T04:34'), - (['MERCURY', 'PLUTO BARYCENTER'], '^2020-01-12T06:56')]) + MERCURY = 'MERCURY' + JUPITER = 'JUPITER BARYCENTER' + SATURN = 'SATURN BARYCENTER' + PLUTO = 'PLUTO BARYCENTER' + + c1 = (events.search_events(date(2020, 1, 2)), [([MERCURY, JUPITER], '^2020-01-02T16:41')]) + c2 = (events.search_events(date(2020, 1, 12)), [([MERCURY, SATURN], '^2020-01-12T09:51'), + ([MERCURY, PLUTO], '^2020-01-12T10:13'), + ([SATURN, PLUTO], '^2020-01-12T16:57')]) + c3 = (events.search_events(date(2020, 2, 7)), []) for (c, expected_dates) in [c1, c2]: self.assertEqual(len(expected_dates), len(c),