Skip to content

Commit 5b4e1f3

Browse files
authored
CoDICE: L1A bug that caused l1b to fail for CoDICE Lo (#3281)
1 parent 888cf80 commit 5b4e1f3

7 files changed

Lines changed: 98 additions & 49 deletions

File tree

imap_processing/codice/codice_l1a.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@
2727
)
2828
from imap_processing.codice.codice_l1a_lo_priority import l1a_lo_priority
2929
from imap_processing.codice.codice_l1a_lo_species import l1a_lo_species
30-
from imap_processing.codice.utils import (
31-
CODICEAPID,
32-
process_by_table_id,
33-
)
30+
from imap_processing.codice.constants import CODICEAPID
31+
from imap_processing.codice.utils import process_by_table_id
3432
from imap_processing.utils import packet_file_to_datasets
3533

3634
logger = logging.getLogger(__name__)

imap_processing/codice/codice_l1a_de.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
99
from imap_processing.codice import constants
10+
from imap_processing.codice.constants import CODICEAPID
1011
from imap_processing.codice.decompress import decompress
1112
from imap_processing.codice.utils import (
12-
CODICEAPID,
1313
CoDICECompression,
1414
ViewTabInfo,
1515
apply_replacements_to_attrs,

imap_processing/codice/codice_l1a_lo_priority.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@
88

99
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
1010
from imap_processing.codice import constants
11-
from imap_processing.codice.constants import HALF_SPIN_FILLVAL
11+
from imap_processing.codice.constants import CODICEAPID, HALF_SPIN_FILLVAL
1212
from imap_processing.codice.decompress import decompress
1313
from imap_processing.codice.utils import (
14-
CODICEAPID,
1514
CoDICECompression,
1615
calculate_acq_time_per_step,
1716
get_codice_epoch_time,

imap_processing/codice/codice_l1a_lo_species.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
1010
from imap_processing.codice import constants
1111
from imap_processing.codice.constants import (
12+
CODICEAPID,
1213
HALF_SPIN_FILLVAL,
1314
LO_IALIRT_VARIABLE_NAMES,
1415
LO_SW_SPECIES_VARIABLE_NAMES,
1516
)
1617
from imap_processing.codice.decompress import decompress
1718
from imap_processing.codice.utils import (
18-
CODICEAPID,
1919
CoDICECompression,
2020
calculate_acq_time_per_step,
2121
get_codice_epoch_time,

imap_processing/codice/constants.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,50 @@
1313
ESA = ElectroStatic Analyzer
1414
"""
1515

16+
from enum import IntEnum
1617
from typing import Any
1718

1819
import numpy as np
1920

20-
from imap_processing.codice.utils import CODICEAPID
21+
22+
class CODICEAPID(IntEnum):
23+
"""Create ENUM for CoDICE APIDs."""
24+
25+
COD_AUT = 1120
26+
COD_BOOT_HK = 1121
27+
COD_BOOT_MEMDMP = 1122
28+
COD_COUNTS_COMMON = 1135
29+
COD_NHK = 1136
30+
COD_EVTMSG = 1137
31+
COD_MEMDMP = 1138
32+
COD_SHK = 1139
33+
COD_RTS = 1141
34+
COD_DIAG_CDHFPGA = 1144
35+
COD_DIAG_SNSR_HV = 1145
36+
COD_DIAG_OPTC_HV = 1146
37+
COD_DIAG_APDFPGA = 1147
38+
COD_DIAG_SSDFPGA = 1148
39+
COD_DIAG_FSW = 1149
40+
COD_DIAG_SYSVARS = 1150
41+
COD_LO_IAL = 1152
42+
COD_LO_PHA = 1153
43+
COD_LO_SW_PRIORITY_COUNTS = 1155
44+
COD_LO_SW_SPECIES_COUNTS = 1156
45+
COD_LO_NSW_SPECIES_COUNTS = 1157
46+
COD_LO_SW_ANGULAR_COUNTS = 1158
47+
COD_LO_NSW_ANGULAR_COUNTS = 1159
48+
COD_LO_NSW_PRIORITY_COUNTS = 1160
49+
COD_LO_INST_COUNTS_AGGREGATED = 1161
50+
COD_LO_INST_COUNTS_SINGLES = 1162
51+
COD_HI_IAL = 1168
52+
COD_HI_PHA = 1169
53+
COD_HI_INST_COUNTS_AGGREGATED = 1170
54+
COD_HI_INST_COUNTS_SINGLES = 1171
55+
COD_HI_OMNI_SPECIES_COUNTS = 1172
56+
COD_HI_SECT_SPECIES_COUNTS = 1173
57+
COD_HI_INST_COUNTS_PRIORITIES = 1174
58+
COD_CSTOL_CONFIG = 2457
59+
2160

2261
# -------L1A Constants-------
2362
# Numerical constants

imap_processing/codice/utils.py

Lines changed: 12 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import xarray as xr
1616

1717
from imap_processing.codice import constants
18+
from imap_processing.codice.constants import CODICEAPID
1819

1920

2021
@dataclass
@@ -46,45 +47,6 @@ class ViewTabInfo:
4647
view_id: int
4748

4849

49-
class CODICEAPID(IntEnum):
50-
"""Create ENUM for CoDICE APIDs."""
51-
52-
COD_AUT = 1120
53-
COD_BOOT_HK = 1121
54-
COD_BOOT_MEMDMP = 1122
55-
COD_COUNTS_COMMON = 1135
56-
COD_NHK = 1136
57-
COD_EVTMSG = 1137
58-
COD_MEMDMP = 1138
59-
COD_SHK = 1139
60-
COD_RTS = 1141
61-
COD_DIAG_CDHFPGA = 1144
62-
COD_DIAG_SNSR_HV = 1145
63-
COD_DIAG_OPTC_HV = 1146
64-
COD_DIAG_APDFPGA = 1147
65-
COD_DIAG_SSDFPGA = 1148
66-
COD_DIAG_FSW = 1149
67-
COD_DIAG_SYSVARS = 1150
68-
COD_LO_IAL = 1152
69-
COD_LO_PHA = 1153
70-
COD_LO_SW_PRIORITY_COUNTS = 1155
71-
COD_LO_SW_SPECIES_COUNTS = 1156
72-
COD_LO_NSW_SPECIES_COUNTS = 1157
73-
COD_LO_SW_ANGULAR_COUNTS = 1158
74-
COD_LO_NSW_ANGULAR_COUNTS = 1159
75-
COD_LO_NSW_PRIORITY_COUNTS = 1160
76-
COD_LO_INST_COUNTS_AGGREGATED = 1161
77-
COD_LO_INST_COUNTS_SINGLES = 1162
78-
COD_HI_IAL = 1168
79-
COD_HI_PHA = 1169
80-
COD_HI_INST_COUNTS_AGGREGATED = 1170
81-
COD_HI_INST_COUNTS_SINGLES = 1171
82-
COD_HI_OMNI_SPECIES_COUNTS = 1172
83-
COD_HI_SECT_SPECIES_COUNTS = 1173
84-
COD_HI_INST_COUNTS_PRIORITIES = 1174
85-
COD_CSTOL_CONFIG = 2457
86-
87-
8850
class CoDICECompression(IntEnum):
8951
"""Create ENUM for CoDICE compression algorithms."""
9052

@@ -246,7 +208,17 @@ def process_by_table_id(
246208
]
247209
if len(processed) == 1:
248210
return processed[0]
249-
return xr.concat(processed, dim="epoch").sortby("epoch")
211+
# Keep non-epoch support variables as it is, 1-D arrays,
212+
# instead of expanding them along the epoch dimension.
213+
# Eg. voltage_table and k_factor are 1-D arrays that apply to all
214+
# epochs in the same way.
215+
return xr.concat(
216+
processed,
217+
dim="epoch",
218+
data_vars="minimal",
219+
coords="minimal",
220+
compat="equals",
221+
).sortby("epoch")
250222

251223

252224
def get_collapse_pattern_shape(
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""Unit tests for CoDICE table-id grouping helpers."""
2+
3+
from pathlib import Path
4+
5+
import numpy as np
6+
import xarray as xr
7+
8+
from imap_processing.codice.utils import process_by_table_id
9+
10+
11+
def test_process_by_table_id_keeps_voltage_table_1d():
12+
"""Shared support data should not be expanded across epoch groups."""
13+
14+
unpacked_dataset = xr.Dataset(
15+
data_vars={
16+
"view_id": ("epoch", np.array([0, 0], dtype=np.int16)),
17+
"pkt_apid": ("epoch", np.array([1156, 1156], dtype=np.int16)),
18+
"plan_id": ("epoch", np.array([7, 7], dtype=np.int16)),
19+
"plan_step": ("epoch", np.array([3, 3], dtype=np.int16)),
20+
"table_id": ("epoch", np.array([1, 2], dtype=np.int16)),
21+
"sample": ("epoch", np.array([11, 22], dtype=np.int16)),
22+
},
23+
coords={"epoch": np.array([20, 10], dtype=np.int64)},
24+
)
25+
26+
voltage_table = np.array([1.0, 2.0, 3.0], dtype=np.float64)
27+
28+
def _process_fn(group_ds, lut_file, table_id, view_id, apid, plan_id, plan_step):
29+
return xr.Dataset(
30+
data_vars={
31+
"sample": ("epoch", group_ds["sample"].values),
32+
"voltage_table": ("esa_step", voltage_table),
33+
},
34+
coords={"epoch": group_ds["epoch"].values, "esa_step": np.arange(3)},
35+
)
36+
37+
processed = process_by_table_id(unpacked_dataset, Path("unused.json"), _process_fn)
38+
39+
assert processed["epoch"].values.tolist() == [10, 20]
40+
assert processed["voltage_table"].dims == ("esa_step",)
41+
np.testing.assert_array_equal(processed["voltage_table"].values, voltage_table)

0 commit comments

Comments
 (0)