Source code for punchbowl.levelq.f_corona_model

from datetime import UTC, datetime

import numpy as np
from dateutil.parser import parse as parse_datetime_str
from ndcube import NDCube
from prefect import get_run_logger

from punchbowl.data import NormalizedMetadata, load_ndcube_from_fits
from punchbowl.data.wcs import load_quickpunch_mosaic_wcs
from punchbowl.level3.f_corona_model import fill_nans_with_interpolation, model_fcorona_for_cube
from punchbowl.prefect import punch_flow


[docs] @punch_flow(log_prints=True) def construct_qp_f_corona_model(filenames: list[str], smooth_level: float = 3.0, reference_time: str | None = None) -> list[NDCube]: """Construct QuickPUNCH F corona model.""" logger = get_run_logger() if reference_time is None: reference_time = datetime.now(UTC) elif isinstance(reference_time, str): reference_time = parse_datetime_str(reference_time) trefoil_wcs, trefoil_shape = load_quickpunch_mosaic_wcs() logger.info("construct_f_corona_background started") if len(filenames) == 0: msg = "Require at least one input file" raise ValueError(msg) filenames.sort() data_shape = trefoil_shape number_of_data_frames = len(filenames) data_cube = np.empty((number_of_data_frames, *data_shape), dtype=float) uncertainty_cube = np.empty((number_of_data_frames, *data_shape), dtype=float) meta_list = [] obs_times = [] logger.info("beginning data loading") for i, address_out in enumerate(filenames): data_object = load_ndcube_from_fits(address_out) data_cube[i, ...] = data_object.data uncertainty_cube[i, ...] = data_object.uncertainty.array obs_times.append(data_object.meta.datetime.timestamp()) meta_list.append(data_object.meta) logger.info("ending data loading") reference_xt = reference_time.timestamp() model_fcorona, _ = model_fcorona_for_cube(obs_times, reference_xt, data_cube, clip_factor=smooth_level) model_fcorona[model_fcorona<=0] = np.nan model_fcorona = fill_nans_with_interpolation(model_fcorona) meta = NormalizedMetadata.load_template("CFM", "Q") meta["DATE-OBS"] = str(reference_time) output_cube = NDCube(data=model_fcorona.squeeze(), meta=meta, wcs=trefoil_wcs) return [output_cube]