libera_utils.obsids#

ICIE software ObsID catalog for NOM-HK trimming and calibration pipelines.

Radiometer and camera ObsID numeric values are not globally unique: the same integer can mean different events depending on whether it appears in ICIE__SW_OBSID_RAD or ICIE__SW_OBSID_WFOV. Registry keys are therefore (NomHkObsidSource, obsid).

Several ObsIDs share one TRIMMED product. A TRIMMED product names a calibration dependency familyNOM-HK-SWC-FAMILY-TRIMMED covers all six shortwave LED ObsIDs — and one processing step is deployed per family, not per ObsID. The trimmed file carries the source NOM-HK ObsID field, so a consumer recovers the exact ObsID from the data rather than from the ProductID. Each ObsID keeps its own CAL product, which is what a family step dispatches on.

The catalog itself lives in OBSID_REGISTRY_CSV (libera_utils/data) rather than in this module. Product columns hold DataProductIdentifier member names (e.g. cal_gain), which are resolved and validated when this module is imported. An unknown member name, a product named at the wrong data level, a kind that disagrees with source, a duplicate (source, obsid) key, a CAL product claimed by more than one ObsID, or a TRIMMED family spanning more than one NOM-HK ObsID field all raise ValueError at import time.

A companion file, TRIM_FAMILY_INPUTS_CSV, records the L1A products each family’s cal step consumes besides its own TRIMMED product, exposed as FAMILY_INPUTS / get_family_inputs(). The two files must cover exactly the same set of families, which is checked at import; an empty required_inputs cell means the dependency set is still undecided. A cal step is expected to take its family’s NOM-HK already trimmed as the family product, so required_inputs normally names only the other APIDs. Trimming is not applied to those inputs here: a cal container reads its run’s time range off the TRIMMED NOM-HK filename it was handed and subsets the full daily L1A products itself.

The list of ObsIDs in this repo is meant for practical purposes of science data processing and is a subset of the instrument level source of truth of all ObsIDs, which is owned by the engineering team and available in internal team documentation. That documentation is the authority: when calibration ObsIDs are added, removed, or renamed upstream, this registry has to be reconciled against it.

Module Attributes

OBSID_REGISTRY

Sole source of truth for ObsID → CAL / TRIMMED ProductIDs and catalog metadata.

TRIM_FAMILIES

each calibration dependency family ProductID mapped to the ObsIDs it covers.

FAMILY_INPUTS

L1A products each calibration dependency family's cal step consumes besides its own TRIMMED product, loaded from TRIM_FAMILY_INPUTS_CSV.

Functions

get_family_inputs(trimmed_product)

Return the L1A products a calibration dependency family's cal step consumes.

get_family_specs(trimmed_product)

Return every ObsID belonging to a TRIMMED calibration dependency family.

get_obsid_spec(source, obsid)

Return the registry entry for (source, obsid).

iter_trim_eligible([source])

Yield registry entries that produce TRIMMED NOM-HK products.

Classes

NomHkObsidSource(value)

Which NOM-HK ObsID variable to use for run detection / trimming.

ObsIdKind(value)

Category of a known ObsID entry.

ObsIdSpec(obsid, source, kind, description, ...)

One known ICIE software ObsID and its product / telemetry binding.

libera_utils.obsids.FAMILY_INPUTS: dict[DataProductIdentifier, tuple[DataProductIdentifier, ...]] = {DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: (), DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: (), DataProductIdentifier.l1a_icie_nom_hk_gain_family_trimmed: (DataProductIdentifier.l1a_icie_rad_full_decoded, DataProductIdentifier.l1a_icie_cal_full_decoded), DataProductIdentifier.l1a_icie_nom_hk_lunar_family_trimmed: (), DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: (DataProductIdentifier.l1a_pev_sw_stat_decoded, DataProductIdentifier.l1a_pec_sw_stat_decoded, DataProductIdentifier.l1a_icie_rad_sample_decoded, DataProductIdentifier.l1a_icie_axis_sample_decoded), DataProductIdentifier.l1a_icie_nom_hk_rad_viirs_lunar_family_trimmed: (), DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: (), DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: (DataProductIdentifier.l1a_pev_sw_stat_decoded, DataProductIdentifier.l1a_icie_rad_sample_decoded, DataProductIdentifier.l1a_icie_axis_sample_decoded), DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: (DataProductIdentifier.l1a_pev_sw_stat_decoded, DataProductIdentifier.l1a_pec_sw_stat_decoded, DataProductIdentifier.l1a_icie_rad_sample_decoded, DataProductIdentifier.l1a_icie_cal_sample_decoded, DataProductIdentifier.l1a_icie_axis_sample_decoded), DataProductIdentifier.l1a_icie_nom_hk_wfov_viirs_lunar_family_trimmed: ()}#

L1A products each calibration dependency family’s cal step consumes besides its own TRIMMED product, loaded from TRIM_FAMILY_INPUTS_CSV. Together with the family product these are the dependency set a family step is deployed against; an empty tuple means it has not been settled yet. Cal containers subset these daily products themselves using the time range on the TRIMMED NOM-HK filename they are handed.

class libera_utils.obsids.NomHkObsidSource(value)#

Which NOM-HK ObsID variable to use for run detection / trimming.

Methods

capitalize(/)

Return a capitalized version of the string.

casefold(/)

Return a version of the string suitable for caseless comparisons.

center(width[, fillchar])

Return a centered string of length width.

count(sub[, start[, end]])

Return the number of non-overlapping occurrences of substring sub in string S[start:end].

encode(/[, encoding, errors])

Encode the string using the codec registered for encoding.

endswith(suffix[, start[, end]])

Return True if S ends with the specified suffix, False otherwise.

expandtabs(/[, tabsize])

Return a copy where all tab characters are expanded using spaces.

find(sub[, start[, end]])

Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].

format(*args, **kwargs)

Return a formatted version of S, using substitutions from args and kwargs.

format_map(mapping)

Return a formatted version of S, using substitutions from mapping.

index(sub[, start[, end]])

Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].

isalnum(/)

Return True if the string is an alpha-numeric string, False otherwise.

isalpha(/)

Return True if the string is an alphabetic string, False otherwise.

isascii(/)

Return True if all characters in the string are ASCII, False otherwise.

isdecimal(/)

Return True if the string is a decimal string, False otherwise.

isdigit(/)

Return True if the string is a digit string, False otherwise.

isidentifier(/)

Return True if the string is a valid Python identifier, False otherwise.

islower(/)

Return True if the string is a lowercase string, False otherwise.

isnumeric(/)

Return True if the string is a numeric string, False otherwise.

isprintable(/)

Return True if the string is printable, False otherwise.

isspace(/)

Return True if the string is a whitespace string, False otherwise.

istitle(/)

Return True if the string is a title-cased string, False otherwise.

isupper(/)

Return True if the string is an uppercase string, False otherwise.

join(iterable, /)

Concatenate any number of strings.

ljust(width[, fillchar])

Return a left-justified string of length width.

lower(/)

Return a copy of the string converted to lowercase.

lstrip([chars])

Return a copy of the string with leading whitespace removed.

maketrans

partition(sep, /)

Partition the string into three parts using the given separator.

removeprefix(prefix, /)

Return a str with the given prefix string removed if present.

removesuffix(suffix, /)

Return a str with the given suffix string removed if present.

replace(old, new[, count])

Return a copy with all occurrences of substring old replaced by new.

rfind(sub[, start[, end]])

Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].

rindex(sub[, start[, end]])

Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].

rjust(width[, fillchar])

Return a right-justified string of length width.

rpartition(sep, /)

Partition the string into three parts using the given separator.

rsplit(/[, sep, maxsplit])

Return a list of the substrings in the string, using sep as the separator string.

rstrip([chars])

Return a copy of the string with trailing whitespace removed.

split(/[, sep, maxsplit])

Return a list of the substrings in the string, using sep as the separator string.

splitlines(/[, keepends])

Return a list of the lines in the string, breaking at line boundaries.

startswith(prefix[, start[, end]])

Return True if S starts with the specified prefix, False otherwise.

strip([chars])

Return a copy of the string with leading and trailing whitespace removed.

swapcase(/)

Convert uppercase characters to lowercase and lowercase characters to uppercase.

title(/)

Return a version of the string where each word is titlecased.

translate(table, /)

Replace each character in the string using the given translation table.

upper(/)

Return a copy of the string converted to uppercase.

zfill(width, /)

Pad a numeric string with zeros on the left, to fill a field of the given width.

libera_utils.obsids.OBSID_REGISTRY: dict[tuple[NomHkObsidSource, int], ObsIdSpec] = {(NomHkObsidSource.RAD, 0): ObsIdSpec(obsid=0, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Instrument Boot-Up from Power Off', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 1): ObsIdSpec(obsid=1, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Instrument Safe Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 2): ObsIdSpec(obsid=2, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Mechanisms are in the Stowed Position', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 128): ObsIdSpec(obsid=128, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Cross Track Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 132): ObsIdSpec(obsid=132, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='RAP Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 136): ObsIdSpec(obsid=136, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Along Track Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 137): ObsIdSpec(obsid=137, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Earth Target Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 138): ObsIdSpec(obsid=138, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Geo Scan of the Libyan Desert (Arid/Meteosat)', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 139): ObsIdSpec(obsid=139, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Geo Scan of Papua New Guinea (Shoreline/Himawari)', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 140): ObsIdSpec(obsid=140, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Geo Scan of the Pacific Ocean (Ocean/GOES West)', trimmed_product=None, cal_product=None), (NomHkObsidSource.RAD, 256): ObsIdSpec(obsid=256, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 365 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_365nm: 'SWC-365NM'>), (NomHkObsidSource.RAD, 257): ObsIdSpec(obsid=257, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 405 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_405nm: 'SWC-405NM'>), (NomHkObsidSource.RAD, 258): ObsIdSpec(obsid=258, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 520 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_520nm: 'SWC-520NM'>), (NomHkObsidSource.RAD, 259): ObsIdSpec(obsid=259, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 635 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_635nm: 'SWC-635NM'>), (NomHkObsidSource.RAD, 260): ObsIdSpec(obsid=260, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 840 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_840nm: 'SWC-840NM'>), (NomHkObsidSource.RAD, 261): ObsIdSpec(obsid=261, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 1550 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_1550nm: 'SWC-1550NM'>), (NomHkObsidSource.RAD, 320): ObsIdSpec(obsid=320, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 1 - 310 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_310k: 'LWC-310K'>), (NomHkObsidSource.RAD, 321): ObsIdSpec(obsid=321, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 2 - 320 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_320k: 'LWC-320K'>), (NomHkObsidSource.RAD, 322): ObsIdSpec(obsid=322, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 3 - 335 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_335k: 'LWC-335K'>), (NomHkObsidSource.RAD, 323): ObsIdSpec(obsid=323, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 4 - 300 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_300k: 'LWC-300K'>), (NomHkObsidSource.RAD, 324): ObsIdSpec(obsid=324, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 5 - 305 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_305k: 'LWC-305K'>), (NomHkObsidSource.RAD, 384): ObsIdSpec(obsid=384, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Split Shortwave channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_ssw_pri: 'SOLAR-SSW-PRI'>), (NomHkObsidSource.RAD, 385): ObsIdSpec(obsid=385, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Total channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_tot_pri: 'SOLAR-TOT-PRI'>), (NomHkObsidSource.RAD, 386): ObsIdSpec(obsid=386, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Longwave channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_lw_pri: 'SOLAR-LW-PRI'>), (NomHkObsidSource.RAD, 387): ObsIdSpec(obsid=387, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Shortwave channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_sw_pri: 'SOLAR-SW-PRI'>), (NomHkObsidSource.RAD, 388): ObsIdSpec(obsid=388, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Split Shortwave channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_ssw_sec: 'SOLAR-SSW-SEC'>), (NomHkObsidSource.RAD, 389): ObsIdSpec(obsid=389, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Total channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_tot_sec: 'SOLAR-TOT-SEC'>), (NomHkObsidSource.RAD, 390): ObsIdSpec(obsid=390, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Longwave channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_lw_sec: 'SOLAR-LW-SEC'>), (NomHkObsidSource.RAD, 391): ObsIdSpec(obsid=391, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Shortwave channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_sw_sec: 'SOLAR-SW-SEC'>), (NomHkObsidSource.RAD, 392): ObsIdSpec(obsid=392, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Split Shortwave channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_ssw_ter: 'SOLAR-SSW-TER'>), (NomHkObsidSource.RAD, 393): ObsIdSpec(obsid=393, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Total channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_tot_ter: 'SOLAR-TOT-TER'>), (NomHkObsidSource.RAD, 394): ObsIdSpec(obsid=394, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Longwave channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_lw_ter: 'SOLAR-LW-TER'>), (NomHkObsidSource.RAD, 395): ObsIdSpec(obsid=395, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Shortwave channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_sw_ter: 'SOLAR-SW-TER'>), (NomHkObsidSource.RAD, 448): ObsIdSpec(obsid=448, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Lunar Calibration #1 South Pole - Monthly, Azimuth scans from 57 to 69 degrees and Elevation scans from 62.5 to 73 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lunar_family_trimmed: 'NOM-HK-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lunar_south_pole: 'LUNAR-SOUTH-POLE'>), (NomHkObsidSource.RAD, 449): ObsIdSpec(obsid=449, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Lunar Calibration #2 North Pole - Quarterly, Azimuth scans from -67 to -57 degrees and Elevation scans from 62.5 to 73 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lunar_family_trimmed: 'NOM-HK-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lunar_north_pole: 'LUNAR-NORTH-POLE'>), (NomHkObsidSource.RAD, 512): ObsIdSpec(obsid=512, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Gain calibration', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_gain_family_trimmed: 'NOM-HK-GAIN-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_gain: 'GAIN'>), (NomHkObsidSource.RAD, 513): ObsIdSpec(obsid=513, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='VIIRS lunar calibration several times a year with a positive azimuth position start. Azimuth scans from 110 to -5 and back to 110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_rad_viirs_lunar_family_trimmed: 'NOM-HK-RAD-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_rad_viirs_lunar_pos_start: 'RAD-VIIRS-LUNAR-POS-START'>), (NomHkObsidSource.RAD, 514): ObsIdSpec(obsid=514, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='VIIRS lunar calibration several times a year with a negative azimuth position start. Azimuth scans from -110 to 5 and back to -110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_rad_viirs_lunar_family_trimmed: 'NOM-HK-RAD-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_rad_viirs_lunar_neg_start: 'RAD-VIIRS-LUNAR-NEG-START'>), (NomHkObsidSource.RAD, 515): ObsIdSpec(obsid=515, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Noise calibration', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_gain_family_trimmed: 'NOM-HK-GAIN-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_noise: 'NOISE'>), (NomHkObsidSource.WFOV, 0): ObsIdSpec(obsid=0, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Instrument Boot-Up from Power Off', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 1): ObsIdSpec(obsid=1, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Instrument Safe Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 2): ObsIdSpec(obsid=2, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Mechanisms are in the Stowed Position', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 128): ObsIdSpec(obsid=128, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Cross Track Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 129): ObsIdSpec(obsid=129, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Cross track mode with video - 6 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: 'NOM-HK-CT-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_ct_video_6min: 'CT-VIDEO-6MIN'>), (NomHkObsidSource.WFOV, 130): ObsIdSpec(obsid=130, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Cross track mode with video - 12 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: 'NOM-HK-CT-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_ct_video_12min: 'CT-VIDEO-12MIN'>), (NomHkObsidSource.WFOV, 131): ObsIdSpec(obsid=131, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Cross track mode with video - 18 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: 'NOM-HK-CT-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_ct_video_18min: 'CT-VIDEO-18MIN'>), (NomHkObsidSource.WFOV, 132): ObsIdSpec(obsid=132, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='RAP Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 133): ObsIdSpec(obsid=133, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='RAPS mode with video - 6 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: 'NOM-HK-RAPS-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_raps_video_6min: 'RAPS-VIDEO-6MIN'>), (NomHkObsidSource.WFOV, 134): ObsIdSpec(obsid=134, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='RAPS mode with video - 12 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: 'NOM-HK-RAPS-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_raps_video_12min: 'RAPS-VIDEO-12MIN'>), (NomHkObsidSource.WFOV, 135): ObsIdSpec(obsid=135, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='RAPS mode with video - 18 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: 'NOM-HK-RAPS-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_raps_video_18min: 'RAPS-VIDEO-18MIN'>), (NomHkObsidSource.WFOV, 136): ObsIdSpec(obsid=136, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Along Track Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 137): ObsIdSpec(obsid=137, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Earth Target Scan Mode', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 138): ObsIdSpec(obsid=138, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Geo Scan of the Libyan Desert (Arid/Meteosat)', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 139): ObsIdSpec(obsid=139, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Geo Scan of Papua New Guinea (Shoreline/Himawari)', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 140): ObsIdSpec(obsid=140, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.SCIENCE: 'science'>, description='Geo Scan of the Pacific Ocean (Ocean/GOES West)', trimmed_product=None, cal_product=None), (NomHkObsidSource.WFOV, 256): ObsIdSpec(obsid=256, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Monthly WFOVC calibration-LED darks for dark current sampling and detector linearity/stability tracking', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: 'NOM-HK-DARKS-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_darks_of_darks: 'DARKS-OF-DARKS'>), (NomHkObsidSource.WFOV, 257): ObsIdSpec(obsid=257, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Monthly WFOVC calibration-LED measurements for dark current sampling and detector linearity/stability tracking', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: 'NOM-HK-DARKS-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_led_of_dark: 'LED-OF-DARK'>), (NomHkObsidSource.WFOV, 258): ObsIdSpec(obsid=258, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Monthly dark images at 1 ms and 12 ms integration times', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: 'NOM-HK-DARKS-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_nominal_darks: 'NOMINAL-DARKS'>), (NomHkObsidSource.WFOV, 513): ObsIdSpec(obsid=513, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='VIIRS lunar calibration several times a year with a positive azimuth position start. Azimuth scans from 110 to -5 and back to 110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_wfov_viirs_lunar_family_trimmed: 'NOM-HK-WFOV-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_wfov_viirs_lunar_pos_start: 'WFOV-VIIRS-LUNAR-POS-START'>), (NomHkObsidSource.WFOV, 514): ObsIdSpec(obsid=514, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='VIIRS lunar calibration several times a year with a negative azimuth position start. Azimuth scans from -110 to 5 and back to -110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_wfov_viirs_lunar_family_trimmed: 'NOM-HK-WFOV-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_wfov_viirs_lunar_neg_start: 'WFOV-VIIRS-LUNAR-NEG-START'>)}#

Sole source of truth for ObsID → CAL / TRIMMED ProductIDs and catalog metadata. Keyed by (source, obsid) because RAD and WFOV namespaces overlap. Loaded from OBSID_REGISTRY_CSV; edit that file to register a new ObsID.

class libera_utils.obsids.ObsIdKind(value)#

Category of a known ObsID entry.

Methods

capitalize(/)

Return a capitalized version of the string.

casefold(/)

Return a version of the string suitable for caseless comparisons.

center(width[, fillchar])

Return a centered string of length width.

count(sub[, start[, end]])

Return the number of non-overlapping occurrences of substring sub in string S[start:end].

encode(/[, encoding, errors])

Encode the string using the codec registered for encoding.

endswith(suffix[, start[, end]])

Return True if S ends with the specified suffix, False otherwise.

expandtabs(/[, tabsize])

Return a copy where all tab characters are expanded using spaces.

find(sub[, start[, end]])

Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].

format(*args, **kwargs)

Return a formatted version of S, using substitutions from args and kwargs.

format_map(mapping)

Return a formatted version of S, using substitutions from mapping.

index(sub[, start[, end]])

Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].

isalnum(/)

Return True if the string is an alpha-numeric string, False otherwise.

isalpha(/)

Return True if the string is an alphabetic string, False otherwise.

isascii(/)

Return True if all characters in the string are ASCII, False otherwise.

isdecimal(/)

Return True if the string is a decimal string, False otherwise.

isdigit(/)

Return True if the string is a digit string, False otherwise.

isidentifier(/)

Return True if the string is a valid Python identifier, False otherwise.

islower(/)

Return True if the string is a lowercase string, False otherwise.

isnumeric(/)

Return True if the string is a numeric string, False otherwise.

isprintable(/)

Return True if the string is printable, False otherwise.

isspace(/)

Return True if the string is a whitespace string, False otherwise.

istitle(/)

Return True if the string is a title-cased string, False otherwise.

isupper(/)

Return True if the string is an uppercase string, False otherwise.

join(iterable, /)

Concatenate any number of strings.

ljust(width[, fillchar])

Return a left-justified string of length width.

lower(/)

Return a copy of the string converted to lowercase.

lstrip([chars])

Return a copy of the string with leading whitespace removed.

maketrans

partition(sep, /)

Partition the string into three parts using the given separator.

removeprefix(prefix, /)

Return a str with the given prefix string removed if present.

removesuffix(suffix, /)

Return a str with the given suffix string removed if present.

replace(old, new[, count])

Return a copy with all occurrences of substring old replaced by new.

rfind(sub[, start[, end]])

Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].

rindex(sub[, start[, end]])

Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].

rjust(width[, fillchar])

Return a right-justified string of length width.

rpartition(sep, /)

Partition the string into three parts using the given separator.

rsplit(/[, sep, maxsplit])

Return a list of the substrings in the string, using sep as the separator string.

rstrip([chars])

Return a copy of the string with trailing whitespace removed.

split(/[, sep, maxsplit])

Return a list of the substrings in the string, using sep as the separator string.

splitlines(/[, keepends])

Return a list of the lines in the string, breaking at line boundaries.

startswith(prefix[, start[, end]])

Return True if S starts with the specified prefix, False otherwise.

strip([chars])

Return a copy of the string with leading and trailing whitespace removed.

swapcase(/)

Convert uppercase characters to lowercase and lowercase characters to uppercase.

title(/)

Return a version of the string where each word is titlecased.

translate(table, /)

Replace each character in the string using the given translation table.

upper(/)

Return a copy of the string converted to uppercase.

zfill(width, /)

Pad a numeric string with zeros on the left, to fill a field of the given width.

class libera_utils.obsids.ObsIdSpec(obsid: int, source: NomHkObsidSource, kind: ObsIdKind, description: str, trimmed_product: DataProductIdentifier | None, cal_product: DataProductIdentifier | None)#

One known ICIE software ObsID and its product / telemetry binding.

libera_utils.obsids.TRIM_FAMILIES: dict[DataProductIdentifier, tuple[ObsIdSpec, ...]] = {DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: (ObsIdSpec(obsid=129, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Cross track mode with video - 6 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: 'NOM-HK-CT-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_ct_video_6min: 'CT-VIDEO-6MIN'>), ObsIdSpec(obsid=130, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Cross track mode with video - 12 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: 'NOM-HK-CT-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_ct_video_12min: 'CT-VIDEO-12MIN'>), ObsIdSpec(obsid=131, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Cross track mode with video - 18 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_ct_video_family_trimmed: 'NOM-HK-CT-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_ct_video_18min: 'CT-VIDEO-18MIN'>)), DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: (ObsIdSpec(obsid=256, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Monthly WFOVC calibration-LED darks for dark current sampling and detector linearity/stability tracking', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: 'NOM-HK-DARKS-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_darks_of_darks: 'DARKS-OF-DARKS'>), ObsIdSpec(obsid=257, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Monthly WFOVC calibration-LED measurements for dark current sampling and detector linearity/stability tracking', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: 'NOM-HK-DARKS-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_led_of_dark: 'LED-OF-DARK'>), ObsIdSpec(obsid=258, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='Monthly dark images at 1 ms and 12 ms integration times', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_darks_family_trimmed: 'NOM-HK-DARKS-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_nominal_darks: 'NOMINAL-DARKS'>)), DataProductIdentifier.l1a_icie_nom_hk_gain_family_trimmed: (ObsIdSpec(obsid=512, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Gain calibration', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_gain_family_trimmed: 'NOM-HK-GAIN-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_gain: 'GAIN'>), ObsIdSpec(obsid=515, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Noise calibration', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_gain_family_trimmed: 'NOM-HK-GAIN-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_noise: 'NOISE'>)), DataProductIdentifier.l1a_icie_nom_hk_lunar_family_trimmed: (ObsIdSpec(obsid=448, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Lunar Calibration #1 South Pole - Monthly, Azimuth scans from 57 to 69 degrees and Elevation scans from 62.5 to 73 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lunar_family_trimmed: 'NOM-HK-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lunar_south_pole: 'LUNAR-SOUTH-POLE'>), ObsIdSpec(obsid=449, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Lunar Calibration #2 North Pole - Quarterly, Azimuth scans from -67 to -57 degrees and Elevation scans from 62.5 to 73 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lunar_family_trimmed: 'NOM-HK-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lunar_north_pole: 'LUNAR-NORTH-POLE'>)), DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: (ObsIdSpec(obsid=320, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 1 - 310 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_310k: 'LWC-310K'>), ObsIdSpec(obsid=321, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 2 - 320 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_320k: 'LWC-320K'>), ObsIdSpec(obsid=322, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 3 - 335 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_335k: 'LWC-335K'>), ObsIdSpec(obsid=323, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 4 - 300 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_300k: 'LWC-300K'>), ObsIdSpec(obsid=324, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Longwave blackbody calibration temperature 5 - 305 K', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_lwc_family_trimmed: 'NOM-HK-LWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_lwc_305k: 'LWC-305K'>)), DataProductIdentifier.l1a_icie_nom_hk_rad_viirs_lunar_family_trimmed: (ObsIdSpec(obsid=513, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='VIIRS lunar calibration several times a year with a positive azimuth position start. Azimuth scans from 110 to -5 and back to 110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_rad_viirs_lunar_family_trimmed: 'NOM-HK-RAD-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_rad_viirs_lunar_pos_start: 'RAD-VIIRS-LUNAR-POS-START'>), ObsIdSpec(obsid=514, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='VIIRS lunar calibration several times a year with a negative azimuth position start. Azimuth scans from -110 to 5 and back to -110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_rad_viirs_lunar_family_trimmed: 'NOM-HK-RAD-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_rad_viirs_lunar_neg_start: 'RAD-VIIRS-LUNAR-NEG-START'>)), DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: (ObsIdSpec(obsid=133, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='RAPS mode with video - 6 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: 'NOM-HK-RAPS-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_raps_video_6min: 'RAPS-VIDEO-6MIN'>), ObsIdSpec(obsid=134, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='RAPS mode with video - 12 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: 'NOM-HK-RAPS-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_raps_video_12min: 'RAPS-VIDEO-12MIN'>), ObsIdSpec(obsid=135, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='RAPS mode with video - 18 minute sequence', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_raps_video_family_trimmed: 'NOM-HK-RAPS-VIDEO-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_raps_video_18min: 'RAPS-VIDEO-18MIN'>)), DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: (ObsIdSpec(obsid=384, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Split Shortwave channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_ssw_pri: 'SOLAR-SSW-PRI'>), ObsIdSpec(obsid=385, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Total channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_tot_pri: 'SOLAR-TOT-PRI'>), ObsIdSpec(obsid=386, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Longwave channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_lw_pri: 'SOLAR-LW-PRI'>), ObsIdSpec(obsid=387, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Shortwave channel using the primary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_sw_pri: 'SOLAR-SW-PRI'>), ObsIdSpec(obsid=388, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Split Shortwave channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_ssw_sec: 'SOLAR-SSW-SEC'>), ObsIdSpec(obsid=389, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Total channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_tot_sec: 'SOLAR-TOT-SEC'>), ObsIdSpec(obsid=390, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Longwave channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_lw_sec: 'SOLAR-LW-SEC'>), ObsIdSpec(obsid=391, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Shortwave channel using the secondary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_sw_sec: 'SOLAR-SW-SEC'>), ObsIdSpec(obsid=392, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Split Shortwave channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_ssw_ter: 'SOLAR-SSW-TER'>), ObsIdSpec(obsid=393, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Total channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_tot_ter: 'SOLAR-TOT-TER'>), ObsIdSpec(obsid=394, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Longwave channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_lw_ter: 'SOLAR-LW-TER'>), ObsIdSpec(obsid=395, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Solar diffuser for the Shortwave channel using the tertiary face of the solar diffuser', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_solar_family_trimmed: 'NOM-HK-SOLAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_solar_sw_ter: 'SOLAR-SW-TER'>)), DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: (ObsIdSpec(obsid=256, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 365 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_365nm: 'SWC-365NM'>), ObsIdSpec(obsid=257, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 405 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_405nm: 'SWC-405NM'>), ObsIdSpec(obsid=258, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 520 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_520nm: 'SWC-520NM'>), ObsIdSpec(obsid=259, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 635 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_635nm: 'SWC-635NM'>), ObsIdSpec(obsid=260, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 840 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_840nm: 'SWC-840NM'>), ObsIdSpec(obsid=261, source=<NomHkObsidSource.RAD: 'ICIE__SW_OBSID_RAD'>, kind=<ObsIdKind.RAD_CAL: 'rad_cal'>, description='Shortwave LED calibration at 1550 nm', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_swc_family_trimmed: 'NOM-HK-SWC-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_swc_1550nm: 'SWC-1550NM'>)), DataProductIdentifier.l1a_icie_nom_hk_wfov_viirs_lunar_family_trimmed: (ObsIdSpec(obsid=513, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='VIIRS lunar calibration several times a year with a positive azimuth position start. Azimuth scans from 110 to -5 and back to 110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_wfov_viirs_lunar_family_trimmed: 'NOM-HK-WFOV-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_wfov_viirs_lunar_pos_start: 'WFOV-VIIRS-LUNAR-POS-START'>), ObsIdSpec(obsid=514, source=<NomHkObsidSource.WFOV: 'ICIE__SW_OBSID_WFOV'>, kind=<ObsIdKind.CAM_CAL: 'cam_cal'>, description='VIIRS lunar calibration several times a year with a negative azimuth position start. Azimuth scans from -110 to 5 and back to -110 degrees', trimmed_product=<DataProductIdentifier.l1a_icie_nom_hk_wfov_viirs_lunar_family_trimmed: 'NOM-HK-WFOV-VIIRS-LUNAR-FAMILY-TRIMMED'>, cal_product=<DataProductIdentifier.cal_wfov_viirs_lunar_neg_start: 'WFOV-VIIRS-LUNAR-NEG-START'>))}#

each calibration dependency family ProductID mapped to the ObsIDs it covers. This is the membership a downstream cal step dispatches over.

Type:

Inverse view of the TRIMMED column

libera_utils.obsids._CAL_KINDS = (ObsIdKind.RAD_CAL, ObsIdKind.CAM_CAL)#

Kinds that must carry both a TRIMMED and a CAL ProductID.

libera_utils.obsids._COLUMNS = ('source', 'obsid', 'kind', 'trimmed_product', 'cal_product', 'description')#

Columns every ObsID catalog row must provide.

libera_utils.obsids._EXTRA_COLUMNS_KEY = '_extra_columns'#

Key that csv.DictReader parks surplus cells under (a row with too many columns).

libera_utils.obsids._FAMILY_INPUT_COLUMNS = ('trimmed_product', 'required_inputs')#

Columns every family-inputs catalog row must provide.

libera_utils.obsids._INPUT_SEPARATOR = ';'#

Separator between product names inside the required_inputs cell.

libera_utils.obsids._SOURCE_BY_CAL_KIND = {ObsIdKind.CAM_CAL: NomHkObsidSource.WFOV, ObsIdKind.RAD_CAL: NomHkObsidSource.RAD}#

NOM-HK ObsID field each calibration kind must be registered against. The camera cal ObsIDs (CT video 129-131, RAPS video 133-135, darks 256-258) are asserted only on ICIE__SW_OBSID_WFOV, so get_obsid_spec(RAD, 129) raises KeyError.

libera_utils.obsids._load_family_inputs(families: Collection[DataProductIdentifier]) dict[DataProductIdentifier, tuple[DataProductIdentifier, ...]]#

Read and validate the per-family calibration input catalog.

Parameters:

families (collection of DataProductIdentifier) – TRIMMED family ProductIDs registered in OBSID_REGISTRY_CSV. The two catalogs must cover exactly the same families.

Returns:

Mapping of each TRIMMED family ProductID to the L1A products a cal step for that family consumes, in catalog order. An empty tuple means the dependency set has not been settled yet.

Return type:

dict

Raises:

ValueError – If the catalog is malformed, if a family is listed twice, if a cell names something other than an L1A DataProductIdentifier member, or if the families listed here do not exactly match families.

libera_utils.obsids._load_registry() tuple[dict[tuple[NomHkObsidSource, int], ObsIdSpec], dict[DataProductIdentifier, tuple[ObsIdSpec, ...]]]#

Read and validate the ObsID catalog CSV.

Returns:

  • registry (dict) – Mapping of (source, obsid) to ObsIdSpec, in catalog order.

  • families (dict) – Mapping of each TRIMMED family ProductID to the ObsIDs that belong to it, in catalog order.

Raises:

ValueError – If the catalog is malformed, if two rows share a (source, obsid) key, if two rows claim the same CAL product, or if one TRIMMED family spans both NOM-HK ObsID fields.

libera_utils.obsids._parse_row(row: dict[str, str], line: int) ObsIdSpec#

Build an ObsIdSpec from one catalog row.

Parameters:
  • row (dict) – Mapping of column name to raw cell value.

  • line (int) – Line number in the catalog, used in error messages.

Returns:

Validated catalog entry.

Return type:

ObsIdSpec

Raises:

ValueError – If the row has the wrong number of columns, if any cell fails to parse, or if the products or source are inconsistent with kind.

libera_utils.obsids._resolve_product(name: str, column: str, level: DataLevel, line: int, catalog: str = 'obsid_registry.csv') DataProductIdentifier | None#

Resolve a DataProductIdentifier member name from a catalog cell.

Parameters:
  • name (str) – Member name of DataProductIdentifier, or an empty cell for entries with no such product.

  • column (str) – Column name, used in error messages.

  • level (DataLevel) – Data level the resolved product must be at, so a value in the wrong column (e.g. a CAL ProductID under trimmed_product) is rejected.

  • line (int) – Line number in the catalog, used in error messages.

  • catalog (str) – Name of the catalog file being read, used in error messages.

Returns:

The resolved ProductID, or None if the cell was empty.

Return type:

DataProductIdentifier or None

Raises:

ValueError – If the cell is non-empty but names no DataProductIdentifier member, or names one at the wrong data level.

libera_utils.obsids.get_family_inputs(trimmed_product: DataProductIdentifier) tuple[DataProductIdentifier, ...]#

Return the L1A products a calibration dependency family’s cal step consumes.

These are the other L1A products a family’s algorithm needs: a step’s full input-products set is trimmed_product itself plus this tuple. The family’s NOM-HK is expected to arrive already trimmed as trimmed_product, so the full-day NOM-HK-DECODED granule is normally not listed here. The cal container subsets these to the calibration run itself, using the time range carried by the TRIMMED NOM-HK filename it was handed; no other APID is trimmed by the L1A preprocessor.

Parameters:

trimmed_product (DataProductIdentifier) – A TRIMMED family ProductID from the registry.

Returns:

L1A input products in catalog order. Empty for families whose dependency set is still undecided.

Return type:

tuple of DataProductIdentifier

Raises:

KeyError – If trimmed_product is not a registered TRIMMED family ProductID.

libera_utils.obsids.get_family_specs(trimmed_product: DataProductIdentifier) tuple[ObsIdSpec, ...]#

Return every ObsID belonging to a TRIMMED calibration dependency family.

A TRIMMED ProductID covers a family of ObsIDs that downstream algorithms process the same way (NOM-HK-SWC-FAMILY-TRIMMED covers all six shortwave LED ObsIDs), so this is how a cal step enumerates the ObsIDs — and the CAL products — it is responsible for.

Parameters:

trimmed_product (DataProductIdentifier) – A TRIMMED family ProductID from the registry.

Returns:

Family members in catalog order. Always at least one entry.

Return type:

tuple of ObsIdSpec

Raises:

KeyError – If trimmed_product is not a registered TRIMMED family ProductID.

libera_utils.obsids.get_obsid_spec(source: NomHkObsidSource, obsid: int) ObsIdSpec#

Return the registry entry for (source, obsid).

Parameters:
  • source (NomHkObsidSource) – NOM-HK ObsID field that owns this ObsID namespace.

  • obsid (int) – Software ObsID value.

Returns:

Matching catalog entry.

Return type:

ObsIdSpec

Raises:

KeyError – If the pair is not in OBSID_REGISTRY.

libera_utils.obsids.iter_trim_eligible(source: NomHkObsidSource | None = None) Iterator[ObsIdSpec]#

Yield registry entries that produce TRIMMED NOM-HK products.

Parameters:

source (NomHkObsidSource or None) – If set, only yield entries for that NOM-HK ObsID field.

Yields:

ObsIdSpec – Entries with a non-null trimmed_product.