77from typing import Optional
88
99
10- ICMECAT_URL = "https://helioforecast.space/static/sync/icmecat/HELIO4CAST_ICMECAT_v23.csv"
11-
12- SPACECRAFT_NAMES = frozenset ([
13- "Ulysses" , "Wind" , "STEREO-A" , "STEREO-B" , "ACE" ,
14- "Solar Orbiter" , "PSP" , "BepiColombo" , "Juno" , "MESSENGER" ,
15- "VEX" , "MAVEN" , "Cassini" ,
16- ])
10+ ICMECAT_URL = (
11+ "https://helioforecast.space/static/sync/icmecat/HELIO4CAST_ICMECAT_v23.csv"
12+ )
13+
14+ SPACECRAFT_NAMES = frozenset (
15+ [
16+ "Ulysses" ,
17+ "Wind" ,
18+ "STEREO-A" ,
19+ "STEREO-B" ,
20+ "ACE" ,
21+ "Solar Orbiter" ,
22+ "PSP" ,
23+ "BepiColombo" ,
24+ "Juno" ,
25+ "MESSENGER" ,
26+ "VEX" ,
27+ "MAVEN" ,
28+ "Cassini" ,
29+ ]
30+ )
1731
1832_DATETIME_COLUMNS = ["icme_start_time" , "mo_start_time" , "mo_end_time" ]
1933
@@ -119,7 +133,9 @@ def __len__(self) -> int:
119133 return len (self ._data ) if self ._data is not None else 0
120134
121135 def __repr__ (self ) -> str :
122- sc_str = f"spacecraft={ self ._spacecraft !r} " if self ._spacecraft else "all spacecraft"
136+ sc_str = (
137+ f"spacecraft={ self ._spacecraft !r} " if self ._spacecraft else "all spacecraft"
138+ )
123139 return f"ICMECAT({ sc_str } , n_events={ len (self )} )"
124140
125141 # -------------------------------------------------------------------------
@@ -147,6 +163,7 @@ def _try_load_cache(self) -> Optional[pd.DataFrame]:
147163
148164 # Check age - re-download if > 30 days old
149165 import time
166+
150167 age_days = (time .time () - cache_path .stat ().st_mtime ) / 86400
151168 if age_days > 30 :
152169 self .logger .info ("Cache stale (%.0f days), re-downloading" , age_days )
@@ -186,7 +203,8 @@ def _filter_by_spacecraft(self, spacecraft: str) -> None:
186203 else :
187204 self .logger .warning (
188205 "Spacecraft '%s' not found. Available: %s" ,
189- spacecraft , sorted (available )
206+ spacecraft ,
207+ sorted (available ),
190208 )
191209 actual_name = spacecraft # Will result in empty filter
192210
@@ -256,12 +274,16 @@ def _prepare_intervals(self) -> None:
256274 # Fallback 1: mo_start_time + 24h
257275 mask_missing = interval_end .isna ()
258276 if "mo_start_time" in result .columns :
259- fallback = result .loc [mask_missing , "mo_start_time" ] + pd .Timedelta (hours = 24 )
277+ fallback = result .loc [mask_missing , "mo_start_time" ] + pd .Timedelta (
278+ hours = 24
279+ )
260280 interval_end .loc [mask_missing ] = fallback
261281
262282 # Fallback 2: icme_start_time + 24h
263283 mask_still_missing = interval_end .isna ()
264- fallback = result .loc [mask_still_missing , "icme_start_time" ] + pd .Timedelta (hours = 24 )
284+ fallback = result .loc [mask_still_missing , "icme_start_time" ] + pd .Timedelta (
285+ hours = 24
286+ )
265287 interval_end .loc [mask_still_missing ] = fallback
266288
267289 result ["interval_end" ] = interval_end
@@ -288,9 +310,8 @@ def get_events_in_range(
288310 pd.DataFrame
289311 Events where icme_start_time <= end AND interval_end >= start.
290312 """
291- mask = (
292- (self ._intervals ["icme_start_time" ] <= end ) &
293- (self ._intervals ["interval_end" ] >= start )
313+ mask = (self ._intervals ["icme_start_time" ] <= end ) & (
314+ self ._intervals ["interval_end" ] >= start
294315 )
295316 return self ._intervals [mask ].copy ()
296317
0 commit comments