libera_utils.footprint_matching.product.build_radiometer_footprints#

libera_utils.footprint_matching.product.build_radiometer_footprints(l1b_inputs: dict[str, ndarray]) → list[RadiometerFootprint]#

Build one RadiometerFootprint per L1B pass-through record.

Gives each radiometer-timescale footprint the geographic bounding box the external aggregation path needs: the true ray-traced footprint from compute_footprint_bounding_boxes() (boresight placed from the satellite at the subsatellite point and Radius_of_Satellite_from_Center_of_Earth, projected onto the WGS84 ellipsoid and limb-truncated). The ephemeris and cone_angle_rate are carried onto the footprint so the CERES-faithful AngularPSFWeigher can orient the PSF along the real scan plane.

Exactly one footprint is produced per input record, in input order, so the list stays index-aligned with the product columns: an off-Earth view (a space/calibration view that slipped past the reader’s finite filter) keeps its index with bbox=None and off_limb=True, so aggregation leaves it at fill rather than querying and weighting a region the instrument did not see.

Parameters:

l1b_inputs (dict[str, np.ndarray]) – The L1B pass-through arrays the FMATCH runner reads from L1B Daily (already filtered to finite geolocation), keyed by their L1B names. RADIOMETER_TIME, Latitude, Longitude, Viewing_Zenith_Surface and every name in L1B_SCAN_REFERENCE_VARIABLES are required; Cone_Angle_Rate (L1B_CONE_ANGLE_RATE_VARIABLE) is read when present.

Returns:

One footprint per L1B record, in input order.

Return type:

list[RadiometerFootprint]

Raises: