From 7fbcd7483933689fa98a634958586dcea3c70d8a Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Mon, 19 Jan 2026 14:37:10 -0700 Subject: [PATCH 1/8] update swapi --- imap_processing/ialirt/l0/process_swapi.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/imap_processing/ialirt/l0/process_swapi.py b/imap_processing/ialirt/l0/process_swapi.py index 65b8e0d10..d7e4fa438 100644 --- a/imap_processing/ialirt/l0/process_swapi.py +++ b/imap_processing/ialirt/l0/process_swapi.py @@ -15,6 +15,7 @@ find_groups, ) from imap_processing.ialirt.utils.time import calculate_time +from imap_processing.spice.time import met_to_ttj2000ns, met_to_utc from imap_processing.swapi.l1.swapi_l1 import process_sweep_data from imap_processing.swapi.l2.swapi_l2 import SWAPI_LIVETIME @@ -163,9 +164,15 @@ def process_swapi_ialirt( seq_values = grouped_dataset["swapi_seq_number"][ (grouped_dataset["group"] == group) ] - met = grouped_dataset["met"][(grouped_dataset["group"] == group).values] + measurement_time = ( + grouped_dataset["swapi_acq"] + .where(grouped_dataset["swapi_seq_number"] == 0, drop=True) + .values + ) + mid_measurement = (measurement_time[0] + measurement_time[-1]) // 2 + # Ensure no duplicates and all values from 0 to 11 are present if not np.array_equal(seq_values.values.astype(int), np.arange(12)): incomplete_groups.append(group) @@ -209,6 +216,7 @@ def process_swapi_ialirt( _populate_instrument_header_items(met) | { "instrument": "swapi", + "swapi_epoch": int(mid_measurement), "swapi_pseudo_proton_speed": Decimal(f"{pseudo_speed:.3f}"), "swapi_pseudo_proton_density": Decimal(f"{pseudo_density:.3f}"), "swapi_pseudo_proton_temperature": Decimal(f"{pseudo_temperature:.3f}"), From 29656993f94d38126b527f0332fb3684bb329c71 Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Mon, 19 Jan 2026 14:57:37 -0700 Subject: [PATCH 2/8] add hit mid measurement --- imap_processing/ialirt/l0/process_hit.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/imap_processing/ialirt/l0/process_hit.py b/imap_processing/ialirt/l0/process_hit.py index 77a51a1c7..b0df430cd 100644 --- a/imap_processing/ialirt/l0/process_hit.py +++ b/imap_processing/ialirt/l0/process_hit.py @@ -10,6 +10,7 @@ find_groups, ) from imap_processing.ialirt.utils.time import calculate_time +from imap_processing.spice.time import met_to_ttj2000ns, met_to_utc logger = logging.getLogger(__name__) @@ -163,13 +164,18 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]: slow_rate = grouped_data["hit_slow_rate"][ (grouped_data["group"] == group).values ] - met = grouped_data["met"][(grouped_data["group"] == group).values] + met = int(grouped_data["met"][(grouped_data["group"] == group).values][0]) + mid_measurement = ( + grouped_data["hit_met"][0] + grouped_data["hit_met"][-1] + ) // 2 + l1 = create_l1(fast_rate_1, fast_rate_2, slow_rate) hit_data.append( _populate_instrument_header_items(met) | { "instrument": "hit", + "hit_epoch": int(mid_measurement), "hit_e_a_side_low_en": int(l1["IALRT_RATE_1"] + l1["IALRT_RATE_2"]), "hit_e_a_side_med_en": int(l1["IALRT_RATE_5"] + l1["IALRT_RATE_6"]), "hit_e_a_side_high_en": int(l1["IALRT_RATE_7"]), From 31d7e989d23828bb690ed16a140a3b780443c5ac Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Mon, 19 Jan 2026 15:32:55 -0700 Subject: [PATCH 3/8] update codice --- imap_processing/ialirt/l0/process_codice.py | 1 + imap_processing/ialirt/l0/process_hit.py | 2 +- imap_processing/ialirt/l0/process_swapi.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/imap_processing/ialirt/l0/process_codice.py b/imap_processing/ialirt/l0/process_codice.py index d22bd8682..a9e0ce9fb 100644 --- a/imap_processing/ialirt/l0/process_codice.py +++ b/imap_processing/ialirt/l0/process_codice.py @@ -497,6 +497,7 @@ def process_codice( _populate_instrument_header_items(met) | { "instrument": f"{sensor}", + "codice_lo_epoch": int(l1a_lo["epoch"]), f"{sensor}_c_over_o_abundance": l2_lo.c_over_o_abundance, f"{sensor}_mg_over_o_abundance": l2_lo.mg_over_o_abundance, f"{sensor}_fe_over_o_abundance": l2_lo.fe_over_o_abundance, diff --git a/imap_processing/ialirt/l0/process_hit.py b/imap_processing/ialirt/l0/process_hit.py index b0df430cd..c2df94970 100644 --- a/imap_processing/ialirt/l0/process_hit.py +++ b/imap_processing/ialirt/l0/process_hit.py @@ -175,7 +175,7 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]: _populate_instrument_header_items(met) | { "instrument": "hit", - "hit_epoch": int(mid_measurement), + "hit_epoch": int(met_to_ttj2000ns(mid_measurement)), "hit_e_a_side_low_en": int(l1["IALRT_RATE_1"] + l1["IALRT_RATE_2"]), "hit_e_a_side_med_en": int(l1["IALRT_RATE_5"] + l1["IALRT_RATE_6"]), "hit_e_a_side_high_en": int(l1["IALRT_RATE_7"]), diff --git a/imap_processing/ialirt/l0/process_swapi.py b/imap_processing/ialirt/l0/process_swapi.py index d7e4fa438..dacecdc33 100644 --- a/imap_processing/ialirt/l0/process_swapi.py +++ b/imap_processing/ialirt/l0/process_swapi.py @@ -216,7 +216,7 @@ def process_swapi_ialirt( _populate_instrument_header_items(met) | { "instrument": "swapi", - "swapi_epoch": int(mid_measurement), + "swapi_epoch": int(met_to_ttj2000ns(mid_measurement)), "swapi_pseudo_proton_speed": Decimal(f"{pseudo_speed:.3f}"), "swapi_pseudo_proton_density": Decimal(f"{pseudo_density:.3f}"), "swapi_pseudo_proton_temperature": Decimal(f"{pseudo_temperature:.3f}"), From 087a9d81204acbfb0bc9a3718d7a66b4a613d33b Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Tue, 20 Jan 2026 13:20:12 -0700 Subject: [PATCH 4/8] update test --- imap_processing/tests/ialirt/unit/test_process_hit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imap_processing/tests/ialirt/unit/test_process_hit.py b/imap_processing/tests/ialirt/unit/test_process_hit.py index aa687940e..401b1db8c 100644 --- a/imap_processing/tests/ialirt/unit/test_process_hit.py +++ b/imap_processing/tests/ialirt/unit/test_process_hit.py @@ -66,7 +66,7 @@ def test_process_spacecraft_packet(sc_packet_path): )[478] hit_product = process_hit(sc_xarray_data) - assert len(hit_product[0].keys()) == 17 + assert len(hit_product[0].keys()) == 18 def generate_prefixes(prefixes): From 1c6b40366aae348a3d39b31a88bc5b9335432105 Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Thu, 22 Jan 2026 11:22:30 -0700 Subject: [PATCH 5/8] add quality flags --- imap_processing/ialirt/l0/process_hit.py | 14 +++++++++++--- imap_processing/ialirt/l0/process_swapi.py | 7 +++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/imap_processing/ialirt/l0/process_hit.py b/imap_processing/ialirt/l0/process_hit.py index c2df94970..25e2ff91a 100644 --- a/imap_processing/ialirt/l0/process_hit.py +++ b/imap_processing/ialirt/l0/process_hit.py @@ -155,6 +155,17 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]: incomplete_groups.append(group) continue + hit_met = grouped_data["hit_met"][(grouped_data["group"] == group).values] + mid_measurement = int((hit_met[0] + hit_met[-1]) // 2) + + status_values = grouped_data["hit_status"][ + (grouped_data["group"] == group).values + ] + + if np.any(status_values == 0): + logger.info(f"Off-nominal value detected at {met_to_utc(mid_measurement)}") + continue + fast_rate_1 = grouped_data["hit_fast_rate_1"][ (grouped_data["group"] == group).values ] @@ -165,9 +176,6 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]: (grouped_data["group"] == group).values ] met = int(grouped_data["met"][(grouped_data["group"] == group).values][0]) - mid_measurement = ( - grouped_data["hit_met"][0] + grouped_data["hit_met"][-1] - ) // 2 l1 = create_l1(fast_rate_1, fast_rate_2, slow_rate) diff --git a/imap_processing/ialirt/l0/process_swapi.py b/imap_processing/ialirt/l0/process_swapi.py index dacecdc33..b900c0ff5 100644 --- a/imap_processing/ialirt/l0/process_swapi.py +++ b/imap_processing/ialirt/l0/process_swapi.py @@ -173,6 +173,13 @@ def process_swapi_ialirt( ) mid_measurement = (measurement_time[0] + measurement_time[-1]) // 2 + status_values = grouped_dataset["swapi_flag"][ + (grouped_dataset["group"] == group).values + ] + if np.any(status_values == 0): + logger.info(f"Off-nominal value detected at {met_to_utc(mid_measurement)}") + continue + # Ensure no duplicates and all values from 0 to 11 are present if not np.array_equal(seq_values.values.astype(int), np.arange(12)): incomplete_groups.append(group) From 00eaac90a092acc5498d14316ca3515a8ece5d38 Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Thu, 22 Jan 2026 16:10:31 -0700 Subject: [PATCH 6/8] minor updates --- imap_processing/ialirt/l0/process_hit.py | 2 +- imap_processing/ialirt/l0/process_swapi.py | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/imap_processing/ialirt/l0/process_hit.py b/imap_processing/ialirt/l0/process_hit.py index 25e2ff91a..ce2d90f7a 100644 --- a/imap_processing/ialirt/l0/process_hit.py +++ b/imap_processing/ialirt/l0/process_hit.py @@ -175,7 +175,7 @@ def process_hit(xarray_data: xr.Dataset) -> list[dict]: slow_rate = grouped_data["hit_slow_rate"][ (grouped_data["group"] == group).values ] - met = int(grouped_data["met"][(grouped_data["group"] == group).values][0]) + met = grouped_data["met"][(grouped_data["group"] == group).values] l1 = create_l1(fast_rate_1, fast_rate_2, slow_rate) diff --git a/imap_processing/ialirt/l0/process_swapi.py b/imap_processing/ialirt/l0/process_swapi.py index b900c0ff5..628bb8c67 100644 --- a/imap_processing/ialirt/l0/process_swapi.py +++ b/imap_processing/ialirt/l0/process_swapi.py @@ -166,12 +166,10 @@ def process_swapi_ialirt( ] met = grouped_dataset["met"][(grouped_dataset["group"] == group).values] - measurement_time = ( - grouped_dataset["swapi_acq"] - .where(grouped_dataset["swapi_seq_number"] == 0, drop=True) - .values - ) - mid_measurement = (measurement_time[0] + measurement_time[-1]) // 2 + swapi_met = grouped_dataset["swapi_acq"][ + (grouped_dataset["group"] == group).values + ] + mid_measurement = int((swapi_met[0] + swapi_met[-1]) // 2) status_values = grouped_dataset["swapi_flag"][ (grouped_dataset["group"] == group).values From 3590212df541cce51cc3fa22c8dee7ab726ba3cf Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Thu, 22 Jan 2026 17:09:07 -0700 Subject: [PATCH 7/8] fix test --- .../tests/ialirt/unit/test_process_hit.py | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/imap_processing/tests/ialirt/unit/test_process_hit.py b/imap_processing/tests/ialirt/unit/test_process_hit.py index 401b1db8c..e187843b7 100644 --- a/imap_processing/tests/ialirt/unit/test_process_hit.py +++ b/imap_processing/tests/ialirt/unit/test_process_hit.py @@ -172,34 +172,14 @@ def test_process_hit(xarray_data, caplog): # Tests that it functions normally hit_product = process_hit(xarray_data) - assert len(hit_product) == 15 - - # Make a subset of data that has values to check the calculations of process hit. - indices = (xarray_data["hit_met"] != 0).values.nonzero()[0] - xarray_data["hit_slow_rate"].values[indices[0] : indices[0] + 60] = 2 - subset = xarray_data.isel(epoch=slice(indices[0], indices[0] + 60)) - - hit_product = process_hit(subset) - - assert hit_product[0]["hit_e_a_side_low_en"] == 4 - assert hit_product[0]["hit_e_a_side_med_en"] == 4 - assert hit_product[0]["hit_e_b_side_low_en"] == 4 - assert hit_product[0]["hit_e_b_side_high_en"] == 2 - assert hit_product[0]["hit_e_b_side_med_en"] == 4 - assert hit_product[0]["hit_he_omni_high_en"] == 2 - - # Create a scrambled set of subcom values. - xarray_data["hit_subcom"].values[indices[0] : indices[0] + 60] = [ - i for i in range(29) for _ in range(2) - ] + [59, 59] - - with caplog.at_level("INFO"): - process_hit(subset) - - assert any( - "skipped due to missing or duplicate pkt_counter values" in message - for message in caplog.text.splitlines() - ) + assert len(hit_product) == 1 + + assert hit_product[0]["hit_e_a_side_low_en"] == 0 + assert hit_product[0]["hit_e_a_side_med_en"] == 0 + assert hit_product[0]["hit_e_b_side_low_en"] == 0 + assert hit_product[0]["hit_e_b_side_high_en"] == 0 + assert hit_product[0]["hit_e_b_side_med_en"] == 1 + assert hit_product[0]["hit_he_omni_high_en"] == 0 def test_decom_packets(xarray_data, hit_test_data): From 035f66e49ad9f795125e3f4973b591beb2067a36 Mon Sep 17 00:00:00 2001 From: Laura Sandoval Date: Fri, 23 Jan 2026 10:06:06 -0700 Subject: [PATCH 8/8] quick update --- imap_processing/ialirt/l0/process_swapi.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/imap_processing/ialirt/l0/process_swapi.py b/imap_processing/ialirt/l0/process_swapi.py index 628bb8c67..06653a5c2 100644 --- a/imap_processing/ialirt/l0/process_swapi.py +++ b/imap_processing/ialirt/l0/process_swapi.py @@ -15,7 +15,7 @@ find_groups, ) from imap_processing.ialirt.utils.time import calculate_time -from imap_processing.spice.time import met_to_ttj2000ns, met_to_utc +from imap_processing.spice.time import met_to_ttj2000ns from imap_processing.swapi.l1.swapi_l1 import process_sweep_data from imap_processing.swapi.l2.swapi_l2 import SWAPI_LIVETIME @@ -171,13 +171,6 @@ def process_swapi_ialirt( ] mid_measurement = int((swapi_met[0] + swapi_met[-1]) // 2) - status_values = grouped_dataset["swapi_flag"][ - (grouped_dataset["group"] == group).values - ] - if np.any(status_values == 0): - logger.info(f"Off-nominal value detected at {met_to_utc(mid_measurement)}") - continue - # Ensure no duplicates and all values from 0 to 11 are present if not np.array_equal(seq_values.values.astype(int), np.arange(12)): incomplete_groups.append(group)