Browse Source

Merge pull request #59 from Deuchnord/fix-conjunctions

Prevent false detection of conjunctions
tags/v0.6.1
Jérôme Deuchnord 4 years ago
committed by GitHub
parent
commit
7a9f1ff3ce
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 15 deletions
  1. +9
    -10
      kosmorrolib/events.py
  2. +10
    -5
      test/events.py

+ 9
- 10
kosmorrolib/events.py View File

@@ -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)



+ 10
- 5
test/events.py View File

@@ -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),


Loading…
Cancel
Save