55"""
66
77from pathlib import Path
8+ from unittest .mock import patch
89
910import numpy as np
1011import pytest
12+ import xarray as xr
1113
1214from imap_processing import imap_module_directory
15+ from imap_processing .cdf .utils import load_cdf
16+ from imap_processing .codice import constants
17+ from imap_processing .codice .codice_l1b import convert_to_rates
1318from imap_processing .ialirt .l0 .process_codice import (
1419 COD_HI_COUNTER ,
1520 COD_HI_RANGE ,
@@ -51,7 +56,7 @@ def cod_lo_test_file():
5156 / "codice"
5257 / "data"
5358 / "l1a_input"
54- / "imap_codice_lo -ialirt_20250814_v001.pkts"
59+ / "imap_codice_l0_lo -ialirt_20250814_v001.pkts"
5560 )
5661
5762
@@ -76,7 +81,7 @@ def cod_hi_test_file():
7681 / "codice"
7782 / "data"
7883 / "l1a_input"
79- / "imap_codice_hi -ialirt_20250814_v001.pkts"
84+ / "imap_codice_l0_hi -ialirt_20250814_v001.pkts"
8085 )
8186
8287
@@ -98,6 +103,97 @@ def codice_test_data(test_datasets):
98103 return test_datasets [478 ]
99104
100105
106+ @pytest .fixture (scope = "session" )
107+ def cod_lo_l1a_test_data ():
108+ """Returns the test data directory."""
109+ data_path = (
110+ imap_module_directory
111+ / "tests"
112+ / "codice"
113+ / "data"
114+ / "l1a_validation"
115+ / "imap_codice_l1a_lo-ialirt_20250814_v007.cdf"
116+ )
117+
118+ data = load_cdf (data_path )
119+
120+ return data
121+
122+
123+ @pytest .fixture (scope = "session" )
124+ def cod_lo_l1b_test_data ():
125+ """Returns the test data directory."""
126+ data_path = (
127+ imap_module_directory
128+ / "tests"
129+ / "codice"
130+ / "data"
131+ / "l1b_validation"
132+ / "imap_codice_l1b_lo-ialirt_20250814_v007.cdf"
133+ )
134+
135+ data = load_cdf (data_path )
136+
137+ return data
138+
139+
140+ def make_codice_lo_ialirt_dataset (cod_lo_l1a_test_data , descriptor ):
141+ coords = {
142+ "epoch" : cod_lo_l1a_test_data ["epoch" ],
143+ "esa_step" : cod_lo_l1a_test_data ["esa_step" ],
144+ "spin_sector" : cod_lo_l1a_test_data ["spin_sector" ],
145+ }
146+
147+ data_vars = {
148+ "k_factor" : ("dim0" , cod_lo_l1a_test_data ["k_factor" ].data ),
149+ "voltage_table" : ("esa_step" , cod_lo_l1a_test_data ["voltage_table" ].data ),
150+ "data_quality" : ("epoch" , cod_lo_l1a_test_data ["data_quality" ].data ),
151+ "acquisition_time_per_step" : (
152+ "esa_step" ,
153+ cod_lo_l1a_test_data ["acquisition_time_per_step" ].data ,
154+ ),
155+ "epoch_delta_minus" : ("epoch" , cod_lo_l1a_test_data ["epoch_delta_minus" ].data ),
156+ "epoch_delta_plus" : ("epoch" , cod_lo_l1a_test_data ["epoch_delta_plus" ].data ),
157+ }
158+
159+ variables_to_convert = getattr (
160+ constants , f"{ descriptor .upper ().replace ('-' , '_' )} _VARIABLE_NAMES"
161+ )
162+
163+ for variable in variables_to_convert :
164+ data_vars [variable ] = (
165+ ("epoch" , "esa_step" , "spin_sector" ),
166+ cod_lo_l1a_test_data [variable ].data ,
167+ )
168+ data_vars [f"unc_{ variable } " ] = (
169+ ("epoch" , "esa_step" , "spin_sector" ),
170+ cod_lo_l1a_test_data [f"unc_{ variable } " ].data ,
171+ )
172+
173+ ds = xr .Dataset (data_vars = data_vars , coords = coords )
174+ return ds
175+
176+
177+ @patch ("xarray.Dataset.drop_vars" , new = lambda self , * args , ** kwargs : self )
178+ @pytest .mark .external_test_data
179+ def test_l1b_ialirt_cod_lo (cod_lo_l1a_test_data , cod_lo_l1b_test_data ):
180+ "Test I-ALiRT CoDICE-Lo l1b data."
181+ descriptor = "lo-ialirt"
182+ dataset = make_codice_lo_ialirt_dataset (cod_lo_l1a_test_data , descriptor )
183+ l1b = convert_to_rates (
184+ dataset ,
185+ descriptor ,
186+ )
187+ variables_to_convert = getattr (
188+ constants , f"{ descriptor .upper ().replace ('-' , '_' )} _VARIABLE_NAMES"
189+ )
190+ for variable in variables_to_convert :
191+ actual = l1b [variable ].data
192+ expected = cod_lo_l1b_test_data [variable ].data
193+
194+ np .testing .assert_allclose (actual , expected , rtol = 1e-5 )
195+
196+
101197@pytest .mark .external_test_data
102198def test_group_and_decompress_ialirt_cod_lo (cod_lo_test_dataset ):
103199 "Test that I-ALiRT CoDICE-Lo data can be grouped properly."
0 commit comments