Hide keyboard shortcuts

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* 

5 

6:Author: 

7 David Young 

8 

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 

19 

20 

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 

28 

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* 

35 

36 **Return:** 

37 - ``filename`` -- stanardised name to for the input frame 

38 

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') 

42 

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') 

52 

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 

62 

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) 

72 

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 = "" 

85 

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") 

95 

96 filename = f"{dateStamp}_{arm}{binning}{romode}" 

97 

98 ttype = None 

99 obsmode = None 

100 

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" 

121 

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 = "" 

128 

129 if ttype is None: 

130 print(repr(frame.header)) 

131 print() 

132 

133 print(frame.header[kw("DPR_TYPE")].lower()) 

134 print(frame.header[kw("DPR_TECH")].lower()) 

135 print(frame.header[kw("DPR_CATG")].lower()) 

136 

137 message = "Frame type can't be determined - exiting" 

138 log.error(message) 

139 raise TypeError(message) 

140 

141 filename = f"{filename}{lamp}_{ttype}" 

142 

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" 

148 

149 if frame.header[kw("DPR_TECH")].upper() == "ECHELLE,SLIT" and ttype in ("mflat", "flat"): 

150 maskSlit = "slit" 

151 

152 # EXTRA PARAMETERS NEEDED FOR SPECTRUM 

153 if frame.header[kw("DPR_TECH")].upper() != "IMAGE": 

154 

155 if maskSlit is None: 

156 print(repr(frame.header)) 

157 print() 

158 

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) 

165 

166 if maskSlit: 

167 filename = f"{filename}_{maskSlit}" 

168 

169 filename = filename.upper() 

170 filename += ".fits" 

171 

172 log.debug('completed the ``filenamer`` function') 

173 return filename