From 0a93a80b5c0f4911e66875aa062b3dfeb6405e64 Mon Sep 17 00:00:00 2001 From: Edward Molter Date: Sat, 16 Aug 2025 14:59:21 -0700 Subject: [PATCH] Read date from input files in order to choose correct kw mapping for nirc2 data --- nirc2_reduce/image.py | 4 ++++ nirc2_reduce/observation.py | 30 ++++++++++++++++++-------- nirc2_reduce/tests/test_observation.py | 4 ++-- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/nirc2_reduce/image.py b/nirc2_reduce/image.py index a270a24..578a472 100755 --- a/nirc2_reduce/image.py +++ b/nirc2_reduce/image.py @@ -44,6 +44,10 @@ def __init__(self, fname): self.hdulist = fits.open(fname, ignore_missing_end=True) self.header = self.hdulist[0].header self.data = self.hdulist[0].data + try: + self.date = self.header["DATE-OBS"] + except KeyError: + self.date = None try: targ = self.header["OBJECT"] self.target = targ.split()[0].strip(", \n").capitalize() diff --git a/nirc2_reduce/observation.py b/nirc2_reduce/observation.py index 49f1c97..634e772 100755 --- a/nirc2_reduce/observation.py +++ b/nirc2_reduce/observation.py @@ -3,17 +3,18 @@ from matplotlib import cm from astropy.io import fits from .image import Image -from .prettycolors import make_colormap, get_colormap +from .prettycolors import get_colormap from scipy.signal import medfilt from scipy.interpolate import RectBivariateSpline from scipy.ndimage import rotate, center_of_mass import astroscrappy from image_registration.chi2_shifts import chi2_shift -from image_registration.fft_tools.shift import shiftnd, shift2d +from image_registration.fft_tools.shift import shift2d import importlib.resources import warnings import yaml import nirc2_reduce.data.header_kw_dicts as inst_info +from datetime import datetime ''' @@ -69,17 +70,28 @@ def __init__(self, fnames, instrument): subc : int. size of the subarray target : str. the object you observed, scrubbed from the header. """ + if isinstance(fnames, str): + fnames = [fnames,] + self.dummy_fits = Image(fnames[0]) # used to hijack header info + date = self.dummy_fits.date self.instrument = instrument.lower() - with importlib.resources.open_binary(inst_info, f"{self.instrument}.yaml") as file: + if instrument == "nirc2" and date is None: + raise ValueError( + "Instrument is nirc2, but DATE-OBS could not be read from header." + "Either choose instrument nirc2_pre_oct23 or nirc2_post_oct23, " + "or ensure the date can be read from the header." + ) + if instrument == "nirc2": + date = datetime.strptime(date, "%Y-%m-%d") + controller_update_date = datetime.strptime("2023-10-15", "%Y-%m-%d") + if date >= controller_update_date: + instrument = "nirc2_post_oct23" + else: + instrument = "nirc2_pre_oct23" + with importlib.resources.open_binary(inst_info, f"{instrument}.yaml") as file: yaml_bytes = file.read() self.header_kw_dict = yaml.safe_load(yaml_bytes) - - if type(fnames) == str: - fnames = [ - fnames, - ] # needed to make pass through all the for loops - self.dummy_fits = Image(fnames[0]) # used to hijack header info self.frames = np.asarray([Image(f).data for f in fnames]) self.subc = int(self.dummy_fits.header[self.header_kw_dict['subc']]) self.target = self.dummy_fits.header[self.header_kw_dict['object']] diff --git a/nirc2_reduce/tests/test_observation.py b/nirc2_reduce/tests/test_observation.py index c2acec3..a5d847b 100644 --- a/nirc2_reduce/tests/test_observation.py +++ b/nirc2_reduce/tests/test_observation.py @@ -35,7 +35,7 @@ def test_bxy3(datadir, rawdir): os.path.join(rawdir, "bxy3_2.fits"), os.path.join(rawdir, "bxy3_3.fits"), ] - obs = observation.Bxy3(fnames, "nirc2_pre_oct23") + obs = observation.Bxy3(fnames, "nirc2") obs.make_sky(os.path.join(datadir, "sky_test.fits")) obs.apply_sky(os.path.join(datadir, "sky_expected.fits")) obs.apply_flat(os.path.join(datadir, "flat_expected.fits")) @@ -92,7 +92,7 @@ def test_nod(datadir, rawdir): def test_raises(datadir, rawdir): obs = observation.Nod( - os.path.join(rawdir, "bxy3_2.fits"), os.path.join(datadir, "sky_expected.fits"), "nirc2_pre_oct23" + os.path.join(rawdir, "bxy3_2.fits"), os.path.join(datadir, "sky_expected.fits"), "nirc2" ) obs.frames = np.empty(obs.frames.shape) obs.frames[:] = np.nan