Coverage for soxspipe/commonutils/filenamer.py : 78%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#!/usr/bin/env python
2# encoding: utf-8
3"""
4*Given a FITS object, use the SOXS file-naming scheme to return a filename to be used to save the FITS object to disk*
6:Author:
7 David Young
9:Date Created:
10 March 9, 2021
11"""
12from builtins import object
13import sys
14import os
15os.environ['TERM'] = 'vt100'
16from fundamentals import tools
17from soxspipe.commonutils import keyword_lookup
18from soxspipe.commonutils import detector_lookup
21def filenamer(
22 log,
23 frame,
24 keywordLookup=False,
25 detectorLookup=False,
26 settings=False):
27 """Given a FITS object, use the SOXS file-naming scheme to return a filename to be used to save the FITS object to disk
29 **Key Arguments:**
30 - ``log`` -- logger
31 - ``frame`` -- the CCDData object frame
32 - ``keywordLookup`` -- the keyword lookup dictionary (needed if `settings` not provided). Default *False*
33 - ``detectorLookup`` -- the detector parameters (needed if `settings` not provided). Default *False*
34 - ``settings`` -- the soxspipe settings dictionary (needed if `keywordLookup` and `detectorLookup` not provided). Default *False*
36 **Return:**
37 - ``filename`` -- stanardised name to for the input frame
39 ```python
40 frame = CCDData.read(filepath, hdu=0, unit=u.electron, hdu_uncertainty='ERRS',
41 du_mask='QUAL', hdu_flags='FLAGS', key_uncertainty_type='UTYPE')
43 from soxspipe.commonutils import filenamer
44 filename = filenamer(
45 log=log,
46 frame=frame,
47 settings=settings
48 )
49 ```
50 """
51 log.debug('starting the ``filenamer`` function')
53 # GENERATE A FILENAME FOR THE FRAME BASED ON THE FILENAMING
54 # CONVENTION
55 if keywordLookup:
56 kw = keywordLookup
57 else:
58 kw = keyword_lookup(
59 log=log,
60 settings=settings
61 ).get
63 if detectorLookup:
64 dp = detectorLookup
65 else:
66 arm = frame.header[kw("SEQ_ARM")]
67 # DETECTOR PARAMETERS LOOKUP OBJECT
68 dp = detector_lookup(
69 log=log,
70 settings=settings
71 ).get(arm)
73 dateStamp = frame.header[kw("DATE_OBS")].replace(
74 "-", "").replace(":", "").split(".")[0]
75 obid = frame.header[kw("OBS_ID")]
76 arm = frame.header[kw("SEQ_ARM")].lower()
77 # x = int(dp["binning"][1])
78 # y = int(dp["binning"][0])
79 if frame.wcs:
80 x = int(frame.wcs.to_header(relax=True)["CDELT1"])
81 y = int(frame.wcs.to_header(relax=True)["CDELT2"])
82 binning = f"_{x}x{y}"
83 else:
84 binning = ""
86 romode = ""
87 if kw("DET_READ_SPEED") in frame.header:
88 if "100k" in frame.header[kw("DET_READ_SPEED")].lower():
89 romode = "_slow"
90 elif "400k" in frame.header[kw("DET_READ_SPEED")].lower():
91 romode = "_fast"
92 else:
93 print(frame.header[kw("DET_READ_SPEED")])
94 raise LookupError(f"Cound not parse readout mode")
96 filename = f"{dateStamp}_{arm}{binning}{romode}"
98 ttype = None
99 obsmode = None
101 # DETERMINE THE TYPE
102 if frame.header[kw("DPR_TYPE")].upper() == "BIAS":
103 if "SXSPRE" in frame.header:
104 ttype = "mbias"
105 else:
106 ttype = "bias"
107 elif frame.header[kw("DPR_TYPE")].upper() == "DARK":
108 if "SXSPRE" in frame.header:
109 ttype = "mdark"
110 else:
111 ttype = "dark"
112 elif "LAMP" in frame.header[kw("DPR_TYPE")].upper() and "FLAT" in frame.header[kw("DPR_TYPE")].upper():
113 if "SXSPRE" in frame.header:
114 ttype = "mflat"
115 else:
116 ttype = "flat"
117 elif frame.header[kw("DPR_TYPE")].upper() == "LAMP,FMTCHK" or frame.header[kw("DPR_TYPE")].upper() == "LAMP,WAVE":
118 ttype = "arc"
119 elif "LAMP" in frame.header[kw("DPR_TYPE")].upper() and "ORDERDEF" in frame.header[kw("DPR_TYPE")].upper():
120 ttype = "flat"
122 if ",Q" in frame.header[kw("DPR_TYPE")].upper():
123 lamp = "_QLAMP"
124 elif ",D" in frame.header[kw("DPR_TYPE")].upper():
125 lamp = "_DLAMP"
126 else:
127 lamp = ""
129 if ttype is None:
130 print(repr(frame.header))
131 print()
133 print(frame.header[kw("DPR_TYPE")].lower())
134 print(frame.header[kw("DPR_TECH")].lower())
135 print(frame.header[kw("DPR_CATG")].lower())
137 message = "Frame type can't be determined - exiting"
138 log.error(message)
139 raise TypeError(message)
141 filename = f"{filename}{lamp}_{ttype}"
143 maskSlit = None
144 if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,PINHOLE":
145 maskSlit = "onepin"
146 if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,MULTI-PINHOLE":
147 maskSlit = "multipin"
149 if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,SLIT" and ttype in ("mflat", "flat"):
150 maskSlit = "slit"
152 # EXTRA PARAMETERS NEEDED FOR SPECTRUM
153 if frame.header[kw("DPR_TECH")].upper() != "IMAGE":
155 if maskSlit is None:
156 print(repr(frame.header))
157 print()
159 print(frame.header[kw("DPR_TYPE")].lower())
160 print(frame.header[kw("DPR_TECH")].lower())
161 print(frame.header[kw("DPR_CATG")].lower())
162 message = "Frame mask/slit can't be determined - exiting"
163 log.error(message)
164 raise TypeError(message)
166 if maskSlit:
167 filename = f"{filename}_{maskSlit}"
169 filename = filename.upper()
170 filename += ".fits"
172 log.debug('completed the ``filenamer`` function')
173 return filename