Source code for soxspipe.commonutils.filenamer

#!/usr/bin/env python
# encoding: utf-8
"""
*Given a FITS object, use the SOXS file-naming scheme to return a filename to be used to save the FITS object to disk*

Author
: David Young

Date Created
: March  9, 2021
"""
from soxspipe.commonutils import detector_lookup
from soxspipe.commonutils import keyword_lookup
from fundamentals import tools
from builtins import object
import sys
import os
os.environ['TERM'] = 'vt100'


[docs] def filenamer( log, frame, keywordLookup=False, detectorLookup=False, settings=False): """Given a FITS object, use the SOXS file-naming scheme to return a filename to be used to save the FITS object to disk **Key Arguments:** - ``log`` -- logger - ``frame`` -- the CCDData object frame - ``keywordLookup`` -- the keyword lookup dictionary (needed if `settings` not provided). Default *False* - ``detectorLookup`` -- the detector parameters (needed if `settings` not provided). Default *False* - ``settings`` -- the soxspipe settings dictionary (needed if `keywordLookup` and `detectorLookup` not provided). Default *False* **Return:** - ``filename`` -- stanardised name to for the input frame ```python frame = CCDData.read(filepath, hdu=0, unit=u.electron, hdu_uncertainty='ERRS', du_mask='QUAL', hdu_flags='FLAGS', key_uncertainty_type='UTYPE') from soxspipe.commonutils import filenamer filename = filenamer( log=log, frame=frame, settings=settings ) ``` """ log.debug('starting the ``filenamer`` function') # GENERATE A FILENAME FOR THE FRAME BASED ON THE FILENAMING # CONVENTION if keywordLookup: kw = keywordLookup else: kw = keyword_lookup( log=log, settings=settings ).get if detectorLookup: dp = detectorLookup else: arm = frame.header[kw("SEQ_ARM")] # DETECTOR PARAMETERS LOOKUP OBJECT dp = detector_lookup( log=log, settings=settings ).get(arm) dateStamp = frame.header[kw("DATE_OBS")].replace( "-", ".").replace(":", ".") obid = frame.header[kw("OBS_ID")] arm = frame.header[kw("SEQ_ARM")].lower() # x = int(dp["binning"][1]) # y = int(dp["binning"][0]) if frame.wcs: x = int(frame.wcs.to_header(relax=True)["CDELT1"]) y = int(frame.wcs.to_header(relax=True)["CDELT2"]) binning = f"_{x}x{y}" else: binning = "" romode = "" if kw("DET_READ_SPEED") in frame.header: if frame.header[kw("INSTRUME")].strip().upper() == "SOXS": romode = "_ro" + str(frame.header[kw("DET_READ_SPEED")]) else: if frame.header[kw("DET_READ_SPEED")] == 1: romode = "_rospeed1" elif "100k" in frame.header[kw("DET_READ_SPEED")].lower(): romode = "_slow" elif "400k" in frame.header[kw("DET_READ_SPEED")].lower(): romode = "_fast" else: log.print(frame.header[kw("DET_READ_SPEED")]) raise LookupError(f"Cound not parse readout mode") filename = f"{dateStamp}_{arm}{binning}{romode}" ttype = None obsmode = None # DETERMINE THE TYPE if kw("DPR_TYPE") not in frame.header and kw("PRO_TYPE") in frame.header: return None if frame.header[kw("DPR_TYPE")].upper() == "BIAS": if "SXSPRE" in frame.header: ttype = "mbias" else: ttype = "bias" elif frame.header[kw("DPR_TYPE")].upper() == "DARK": if "SXSPRE" in frame.header: ttype = "mdark" else: ttype = "dark" elif "LAMP" in frame.header[kw("DPR_TYPE")].upper() and "FLAT" in frame.header[kw("DPR_TYPE")].upper(): if "SXSPRE" in frame.header: ttype = "mflat" else: ttype = "flat" elif frame.header[kw("DPR_TYPE")].upper() == "LAMP,FMTCHK" or frame.header[kw("DPR_TYPE")].upper() == "LAMP,WAVE": ttype = "arc" elif "LAMP" in frame.header[kw("DPR_TYPE")].upper() and "ORDERDEF" in frame.header[kw("DPR_TYPE")].upper(): ttype = "flat" elif "OBJECT" in frame.header[kw("DPR_TYPE")].upper() and ("STARE" in frame.header[kw("DPR_TECH")].upper() or "NODDING" in frame.header[kw("DPR_TECH")].upper()): object = frame.header[kw("OBJECT")].upper() ttype = f"object_stare_{object}".replace(" ", "_").replace("-", "_").replace("__", "_").replace("__", "_") elif "STD,FLUX" in frame.header[kw("DPR_TYPE")].upper() and ("STARE" in frame.header[kw("DPR_TECH")].upper() or "NODDING" in frame.header[kw("DPR_TECH")].upper()): object = frame.header[kw("OBJECT")].upper() ttype = f"std_flux_stare_{object}".replace(" ", "_").replace("-", "_").replace("__", "_").replace("__", "_") if ",Q" in frame.header[kw("DPR_TYPE")].upper(): lamp = "_QLAMP" elif ",D" in frame.header[kw("DPR_TYPE")].upper(): lamp = "_DLAMP" else: lamp = "" if ttype is None: print(repr(frame.header)) print() print(frame.header[kw("DPR_TYPE")].lower()) print(frame.header[kw("DPR_TECH")].lower()) print(frame.header[kw("DPR_CATG")].lower()) message = "Frame type can't be determined - exiting" log.error(message) raise TypeError(message) filename = f"{filename}{lamp}_{ttype}" maskSlit = None if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,PINHOLE": maskSlit = "onepin" if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,MULTI-PINHOLE": maskSlit = "multipin" if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,SLIT" and ttype in ("mflat", "flat"): maskSlit = "slit" if frame.header[kw("DPR_TECH")].upper() in ("ECHELLE,SLIT,STARE", "ECHELLE,SLIT,NODDING") and ("object" in ttype or 'std_flux' in ttype): maskSlit = "slit" # EXTRA PARAMETERS NEEDED FOR SPECTRUM if frame.header[kw("DPR_TECH")].upper() != "IMAGE": if maskSlit is None: print(repr(frame.header)) print() print(frame.header[kw("DPR_TYPE")].lower()) print(frame.header[kw("DPR_TECH")].lower()) print(frame.header[kw("DPR_CATG")].lower()) message = "Frame mask/slit can't be determined - exiting" log.error(message) raise TypeError(message) if maskSlit: filename = f"{filename}_{maskSlit}" filename = filename.upper() filename += ".fits" log.debug('completed the ``filenamer`` function') return filename