33import numpy as np
44import pandas as pd
55import pytest
6+ import xarray as xr
67
78from imap_processing import imap_module_directory
89from imap_processing .ialirt .l0 .process_swapi import (
910 count_rate ,
11+ geometric_mean ,
1012 optimize_pseudo_parameters ,
1113 process_swapi_ialirt ,
1214)
@@ -257,16 +259,114 @@ def test_optimize_parameters():
257259 )
258260
259261
262+ def test_geometric_mean ():
263+ """Test geometric_mean function."""
264+
265+ swapi_met_list = [12 , 24 , 36 , 48 , 60 ]
266+
267+ pseudo_proton_speed_list = [400 , 420 , 440 , 460 , 480 ]
268+ pseudo_proton_density_list = [5.0 , 6.0 , 7.0 , 8.0 , 9.0 ]
269+ pseudo_proton_temperature_list = [60000 , 62000 , 64000 , 66000 , 68000 ]
270+
271+ avg_swapi_met , avg_density , avg_speed , avg_temperature = geometric_mean (
272+ swapi_met_list ,
273+ pseudo_proton_speed_list ,
274+ pseudo_proton_density_list ,
275+ pseudo_proton_temperature_list ,
276+ )
277+
278+ expected_density = np .exp (np .mean (np .log (pseudo_proton_density_list )))
279+ expected_speed = np .exp (np .mean (np .log (pseudo_proton_speed_list )))
280+ expected_temperature = np .exp (np .mean (np .log (pseudo_proton_temperature_list )))
281+ expected_met = np .mean (swapi_met_list )
282+
283+ assert np .isclose (avg_density , expected_density )
284+ assert np .isclose (avg_speed , expected_speed )
285+ assert np .isclose (avg_temperature , expected_temperature )
286+ assert np .isclose (avg_swapi_met , expected_met )
287+
288+
289+ def test_geometric_mean_nan ():
290+ """Test geometric_mean function."""
291+
292+ swapi_met_list = [12 , 24 , 36 , 48 , 60 ]
293+
294+ pseudo_proton_speed_list = [400 , 420 , 440 , 460 , np .nan ]
295+ pseudo_proton_density_list = [5.0 , 6.0 , 7.0 , 8.0 , np .nan ]
296+ pseudo_proton_temperature_list = [60000 , 62000 , 64000 , 66000 , np .nan ]
297+
298+ avg_swapi_met , avg_density , avg_speed , avg_temperature = geometric_mean (
299+ swapi_met_list ,
300+ pseudo_proton_speed_list ,
301+ pseudo_proton_density_list ,
302+ pseudo_proton_temperature_list ,
303+ )
304+
305+ expected_density = np .exp (np .mean (np .log (pseudo_proton_density_list [0 :4 ])))
306+ expected_speed = np .exp (np .mean (np .log (pseudo_proton_speed_list [0 :4 ])))
307+ expected_temperature = np .exp (np .mean (np .log (pseudo_proton_temperature_list [0 :4 ])))
308+ expected_met = np .mean (swapi_met_list [0 :4 ])
309+
310+ assert np .isclose (avg_density , expected_density )
311+ assert np .isclose (avg_speed , expected_speed )
312+ assert np .isclose (avg_temperature , expected_temperature )
313+ assert np .isclose (avg_swapi_met , expected_met )
314+
315+
316+ def test_geometric_gaps ():
317+ """Test geometric_mean function."""
318+
319+ swapi_met_list = [0 , 12 , 24 , 36 , 240 , 252 , 264 , 272 , 284 ]
320+
321+ bool_check = len (swapi_met_list ) >= 5 and np .all (
322+ np .isclose (np .diff (swapi_met_list [- 5 :]), 12.0 , atol = 0.05 )
323+ )
324+ assert not bool_check
325+
326+ pseudo_proton_speed_list = [400 , 420 , 440 , 460 , 480 , 500 , 520 , 540 , 560 ]
327+ pseudo_proton_density_list = [5.0 , 6.0 , 7.0 , 8.0 , 9.0 , 10.0 , 11.0 , 12.0 , 13.0 ]
328+ pseudo_proton_temperature_list = [
329+ 60000 ,
330+ 62000 ,
331+ 64000 ,
332+ 66000 ,
333+ 68000 ,
334+ 70000 ,
335+ 72000 ,
336+ 74000 ,
337+ 76000 ,
338+ ]
339+
340+ avg_swapi_met , avg_density , avg_speed , avg_temperature = geometric_mean (
341+ swapi_met_list [4 ::],
342+ pseudo_proton_speed_list [4 ::],
343+ pseudo_proton_density_list [4 ::],
344+ pseudo_proton_temperature_list [4 ::],
345+ )
346+
347+ expected_density = np .exp (np .mean (np .log (pseudo_proton_density_list [4 ::])))
348+ expected_speed = np .exp (np .mean (np .log (pseudo_proton_speed_list [4 ::])))
349+ expected_temperature = np .exp (np .mean (np .log (pseudo_proton_temperature_list [4 ::])))
350+ expected_met = np .mean (swapi_met_list [4 ::])
351+
352+ assert np .isclose (avg_density , expected_density )
353+ assert np .isclose (avg_speed , expected_speed )
354+ assert np .isclose (avg_temperature , expected_temperature )
355+ assert np .isclose (avg_swapi_met , expected_met )
356+
357+
260358@pytest .mark .external_test_data
261359def test_process_spacecraft_packet (
262360 esa_unit_conversion_table , swapi_postlaunch_sc_packet_path
263361):
264362 """Tests spacecraft packet processing."""
265363
266364 packet_path , xtce_ialirt_path = swapi_postlaunch_sc_packet_path
267- postlaunch_sc_xarray_data = packet_file_to_datasets (
268- packet_path , xtce_ialirt_path , use_derived_value = False
269- )[478 ]
365+ xarray_data = tuple (
366+ packet_file_to_datasets (packet , xtce_ialirt_path , use_derived_value = False )[478 ]
367+ for packet in packet_path
368+ )
369+ postlaunch_sc_xarray_data = xr .concat (xarray_data , dim = "epoch" )
270370
271371 postlaunch_sc_xarray_data ["swapi_version" ].data = np .full_like (
272372 postlaunch_sc_xarray_data ["swapi_version" ].data , 2
@@ -275,19 +375,4 @@ def test_process_spacecraft_packet(
275375 postlaunch_sc_xarray_data , esa_unit_conversion_table
276376 )
277377
278- assert len (swapi_product ) == 4
279-
280- key_names = [
281- "apid" ,
282- "met" ,
283- "met_in_utc" ,
284- "ttj2000ns" ,
285- "swapi_pseudo_proton_density" ,
286- "swapi_pseudo_proton_speed" ,
287- "swapi_pseudo_proton_temperature" ,
288- ]
289-
290- for key in key_names :
291- assert swapi_product [0 ][key ] is not None , (
292- f"The expected attribute { key } was not filled in the result dict."
293- )
378+ assert len (swapi_product ) == 0
0 commit comments