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 family — NOM-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
Sole source of truth for ObsID → CAL / TRIMMED ProductIDs and catalog metadata. |
|
each calibration dependency family ProductID mapped to the ObsIDs it covers. |
|
L1A products each calibration dependency family's cal step consumes besides its own TRIMMED product, loaded from |
Functions
|
Return the L1A products a calibration dependency family's cal step consumes. |
|
Return every ObsID belonging to a TRIMMED calibration dependency family. |
|
Return the registry entry for |
|
Yield registry entries that produce TRIMMED NOM-HK products. |
Classes
|
Which NOM-HK ObsID variable to use for run detection / trimming. |
|
Category of a known ObsID entry. |
|
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.
maketranspartition(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.
maketranspartition(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.DictReaderparks 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_inputscell.
- 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, soget_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:
- 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)toObsIdSpec, 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:
- Returns:
Validated catalog entry.
- Return type:
- Raises:
ValueError – If the row has the wrong number of columns, if any cell fails to parse, or if the products or
sourceare inconsistent withkind.
- 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-productsset istrimmed_productitself plus this tuple. The family’s NOM-HK is expected to arrive already trimmed astrimmed_product, so the full-dayNOM-HK-DECODEDgranule 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:
- Raises:
KeyError – If
trimmed_productis 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-TRIMMEDcovers 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:
- Raises:
KeyError – If
trimmed_productis 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:
- 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.