Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions imap_processing/codice/codice_l1a.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,8 @@
)
from imap_processing.codice.codice_l1a_lo_priority import l1a_lo_priority
from imap_processing.codice.codice_l1a_lo_species import l1a_lo_species
from imap_processing.codice.utils import (
CODICEAPID,
process_by_table_id,
)
from imap_processing.codice.constants import CODICEAPID
from imap_processing.codice.utils import process_by_table_id
from imap_processing.utils import packet_file_to_datasets

logger = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion imap_processing/codice/codice_l1a_de.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
from imap_processing.codice import constants
from imap_processing.codice.constants import CODICEAPID
from imap_processing.codice.decompress import decompress
from imap_processing.codice.utils import (
CODICEAPID,
CoDICECompression,
ViewTabInfo,
apply_replacements_to_attrs,
Expand Down
3 changes: 1 addition & 2 deletions imap_processing/codice/codice_l1a_lo_priority.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@

from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
from imap_processing.codice import constants
from imap_processing.codice.constants import HALF_SPIN_FILLVAL
from imap_processing.codice.constants import CODICEAPID, HALF_SPIN_FILLVAL
from imap_processing.codice.decompress import decompress
from imap_processing.codice.utils import (
CODICEAPID,
CoDICECompression,
calculate_acq_time_per_step,
get_codice_epoch_time,
Expand Down
2 changes: 1 addition & 1 deletion imap_processing/codice/codice_l1a_lo_species.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes
from imap_processing.codice import constants
from imap_processing.codice.constants import (
CODICEAPID,
HALF_SPIN_FILLVAL,
LO_IALIRT_VARIABLE_NAMES,
LO_SW_SPECIES_VARIABLE_NAMES,
)
from imap_processing.codice.decompress import decompress
from imap_processing.codice.utils import (
CODICEAPID,
CoDICECompression,
calculate_acq_time_per_step,
get_codice_epoch_time,
Expand Down
41 changes: 40 additions & 1 deletion imap_processing/codice/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,50 @@
ESA = ElectroStatic Analyzer
"""

from enum import IntEnum
from typing import Any

import numpy as np

from imap_processing.codice.utils import CODICEAPID

class CODICEAPID(IntEnum):
"""Create ENUM for CoDICE APIDs."""

COD_AUT = 1120
COD_BOOT_HK = 1121
COD_BOOT_MEMDMP = 1122
COD_COUNTS_COMMON = 1135
COD_NHK = 1136
COD_EVTMSG = 1137
COD_MEMDMP = 1138
COD_SHK = 1139
COD_RTS = 1141
COD_DIAG_CDHFPGA = 1144
COD_DIAG_SNSR_HV = 1145
COD_DIAG_OPTC_HV = 1146
COD_DIAG_APDFPGA = 1147
COD_DIAG_SSDFPGA = 1148
COD_DIAG_FSW = 1149
COD_DIAG_SYSVARS = 1150
COD_LO_IAL = 1152
COD_LO_PHA = 1153
COD_LO_SW_PRIORITY_COUNTS = 1155
COD_LO_SW_SPECIES_COUNTS = 1156
COD_LO_NSW_SPECIES_COUNTS = 1157
COD_LO_SW_ANGULAR_COUNTS = 1158
COD_LO_NSW_ANGULAR_COUNTS = 1159
COD_LO_NSW_PRIORITY_COUNTS = 1160
COD_LO_INST_COUNTS_AGGREGATED = 1161
COD_LO_INST_COUNTS_SINGLES = 1162
COD_HI_IAL = 1168
COD_HI_PHA = 1169
COD_HI_INST_COUNTS_AGGREGATED = 1170
COD_HI_INST_COUNTS_SINGLES = 1171
COD_HI_OMNI_SPECIES_COUNTS = 1172
COD_HI_SECT_SPECIES_COUNTS = 1173
COD_HI_INST_COUNTS_PRIORITIES = 1174
COD_CSTOL_CONFIG = 2457


# -------L1A Constants-------
# Numerical constants
Expand Down
52 changes: 12 additions & 40 deletions imap_processing/codice/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import xarray as xr

from imap_processing.codice import constants
from imap_processing.codice.constants import CODICEAPID


@dataclass
Expand Down Expand Up @@ -46,45 +47,6 @@ class ViewTabInfo:
view_id: int


class CODICEAPID(IntEnum):
"""Create ENUM for CoDICE APIDs."""

COD_AUT = 1120
COD_BOOT_HK = 1121
COD_BOOT_MEMDMP = 1122
COD_COUNTS_COMMON = 1135
COD_NHK = 1136
COD_EVTMSG = 1137
COD_MEMDMP = 1138
COD_SHK = 1139
COD_RTS = 1141
COD_DIAG_CDHFPGA = 1144
COD_DIAG_SNSR_HV = 1145
COD_DIAG_OPTC_HV = 1146
COD_DIAG_APDFPGA = 1147
COD_DIAG_SSDFPGA = 1148
COD_DIAG_FSW = 1149
COD_DIAG_SYSVARS = 1150
COD_LO_IAL = 1152
COD_LO_PHA = 1153
COD_LO_SW_PRIORITY_COUNTS = 1155
COD_LO_SW_SPECIES_COUNTS = 1156
COD_LO_NSW_SPECIES_COUNTS = 1157
COD_LO_SW_ANGULAR_COUNTS = 1158
COD_LO_NSW_ANGULAR_COUNTS = 1159
COD_LO_NSW_PRIORITY_COUNTS = 1160
COD_LO_INST_COUNTS_AGGREGATED = 1161
COD_LO_INST_COUNTS_SINGLES = 1162
COD_HI_IAL = 1168
COD_HI_PHA = 1169
COD_HI_INST_COUNTS_AGGREGATED = 1170
COD_HI_INST_COUNTS_SINGLES = 1171
COD_HI_OMNI_SPECIES_COUNTS = 1172
COD_HI_SECT_SPECIES_COUNTS = 1173
COD_HI_INST_COUNTS_PRIORITIES = 1174
COD_CSTOL_CONFIG = 2457


class CoDICECompression(IntEnum):
"""Create ENUM for CoDICE compression algorithms."""

Expand Down Expand Up @@ -246,7 +208,17 @@ def process_by_table_id(
]
if len(processed) == 1:
return processed[0]
return xr.concat(processed, dim="epoch").sortby("epoch")
# Keep non-epoch support variables as it is, 1-D arrays,
# instead of expanding them along the epoch dimension.
# Eg. voltage_table and k_factor are 1-D arrays that apply to all
# epochs in the same way.
return xr.concat(
processed,
dim="epoch",
data_vars="minimal",
coords="minimal",
compat="equals",
).sortby("epoch")


def get_collapse_pattern_shape(
Expand Down
41 changes: 41 additions & 0 deletions imap_processing/tests/codice/test_process_by_table_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""Unit tests for CoDICE table-id grouping helpers."""

from pathlib import Path

import numpy as np
import xarray as xr

from imap_processing.codice.utils import process_by_table_id


def test_process_by_table_id_keeps_voltage_table_1d():
"""Shared support data should not be expanded across epoch groups."""

unpacked_dataset = xr.Dataset(
data_vars={
"view_id": ("epoch", np.array([0, 0], dtype=np.int16)),
"pkt_apid": ("epoch", np.array([1156, 1156], dtype=np.int16)),
"plan_id": ("epoch", np.array([7, 7], dtype=np.int16)),
"plan_step": ("epoch", np.array([3, 3], dtype=np.int16)),
"table_id": ("epoch", np.array([1, 2], dtype=np.int16)),
"sample": ("epoch", np.array([11, 22], dtype=np.int16)),
},
coords={"epoch": np.array([20, 10], dtype=np.int64)},
)

voltage_table = np.array([1.0, 2.0, 3.0], dtype=np.float64)

def _process_fn(group_ds, lut_file, table_id, view_id, apid, plan_id, plan_step):
return xr.Dataset(
data_vars={
"sample": ("epoch", group_ds["sample"].values),
"voltage_table": ("esa_step", voltage_table),
},
coords={"epoch": group_ds["epoch"].values, "esa_step": np.arange(3)},
)

processed = process_by_table_id(unpacked_dataset, Path("unused.json"), _process_fn)

assert processed["epoch"].values.tolist() == [10, 20]
assert processed["voltage_table"].dims == ("esa_step",)
np.testing.assert_array_equal(processed["voltage_table"].values, voltage_table)
Loading