Source code for punchbowl.level2.finalize

from datetime import UTC, datetime

from ndcube import NDCube

from punchbowl.data.meta import check_moon_in_fov, set_spacecraft_location_to_earth
from punchbowl.util import find_first_existing_file

SPACECRAFT_OBSCODE = {"1": "WFI1",
                      "2": "WFI2",
                      "3": "WFI3",
                      "4": "NFI4"}


[docs] def finalize_output(output_cube: NDCube, input_cubes: list[NDCube]) -> None: """Do metadata updates common to L2 *TM merged files and L3 *IM re-merged files.""" output_cube.meta["DATE"] = datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] set_spacecraft_location_to_earth(output_cube) _, angle_sun, _, _, _, xpix, ypix = check_moon_in_fov( output_cube.meta["DATE-OBS"].value, wcs=output_cube.wcs, image_shape=output_cube.data.shape[-2:]) output_cube.meta["MOONDIST"] = angle_sun[0] output_cube.meta["MOON_X"] = xpix[0] output_cube.meta["MOON_Y"] = ypix[0] # Put cubes in a deterministic order input_cubes = [c for c in input_cubes if c is not None] if not input_cubes: return input_cubes.sort(key=lambda cube: cube.meta.datetime) sample_cube = find_first_existing_file(input_cubes) output_cube.meta.provenance = sorted([fname for d in input_cubes if d is not None and (fname := d.meta.get("FILENAME").value)]) output_cube.meta["FILEVRSN"] = sample_cube.meta["FILEVRSN"].value for d in filter(None, input_cubes): spacecraft = SPACECRAFT_OBSCODE[d.meta["OBSCODE"].value] output_cube.meta[f"HAS_{spacecraft}"] = 1 output_cube.meta["ALL_INPT"] = {output_cube.meta["HAS_WFI1"].value, output_cube.meta["HAS_WFI2"].value, output_cube.meta["HAS_WFI3"].value, output_cube.meta["HAS_NFI4"].value} == {1}