22 """Gen3 Butler Formatters for Dark Energy Camera raw data.
25 import astro_metadata_translator
32 from .
import DarkEnergyCamera
34 __all__ = (
"DarkEnergyCameraRawFormatter",
"DarkEnergyCameraCPCalibFormatter")
39 detector_to_hdu = {25: 1, 26: 2, 27: 3, 32: 4, 33: 5, 34: 6, 19: 7, 20: 8, 13: 9,
40 14: 10, 8: 11, 4: 12, 39: 13, 40: 14, 45: 15, 46: 16, 51: 17, 56: 18, 21: 19,
41 22: 20, 23: 21, 24: 22, 17: 23, 18: 24, 15: 25, 16: 26, 9: 27, 10: 28, 11: 29,
42 12: 30, 5: 31, 6: 32, 7: 33, 1: 34, 2: 35, 3: 36, 35: 37, 36: 38, 37: 39,
43 38: 40, 28: 41, 29: 42, 30: 43, 31: 44, 41: 45, 42: 46, 43: 47, 44: 48, 49: 49,
44 50: 50, 47: 51, 48: 52, 52: 53, 53: 54, 54: 55, 55: 56, 57: 57, 58: 58, 59: 59,
45 60: 60, 61: 61, 62: 62, 72: 63, 71: 64, 64: 65, 63: 66, 73: 67, 74: 68, 70: 69,
51 translatorClass = astro_metadata_translator.DecamTranslator
52 filterDefinitions = DarkEnergyCamera.filterDefinitions
60 return DarkEnergyCamera().getCamera()[id]
62 def _scanHdus(self, filename, detectorId):
63 """Scan through a file for the HDU containing data from one detector.
68 The file to search through.
70 The detector id to search for.
75 The index of the HDU with the requested data.
76 metadata: `lsst.daf.base.PropertyList`
77 The metadata read from the header for that detector id.
82 Raised if detectorId is not found in any of the file HDUs
85 log.debug(
"Did not find detector=%s at expected HDU=%s in %s: scanning through all HDUs.",
86 detectorId, detector_to_hdu[detectorId], filename)
90 for i
in range(1, fitsData.countHdus()):
92 metadata = fitsData.readMetadata()
93 if metadata[
'CCDNUM'] == detectorId:
96 raise ValueError(f
"Did not find detectorId={detectorId} as CCDNUM in any HDU of {filename}.")
98 def _determineHDU(self, detectorId):
99 """Determine the correct HDU number for a given detector id.
104 The detector id to search for.
109 The index of the HDU with the requested data.
110 metadata : `lsst.daf.base.PropertyList`
111 The metadata read from the header for that detector id.
116 Raised if detectorId is not found in any of the file HDUs
118 filename = self.fileDescriptor.location.path
120 index = detector_to_hdu[detectorId]
122 if metadata[
'CCDNUM'] != detectorId:
124 return self.
_scanHdus(filename, detectorId)
127 fitsData.setHdu(index)
128 return index, metadata
131 return self.
_scanHdus(filename, detectorId)
134 index, metadata = self.
_determineHDU(self.dataId[
'detector'])
135 astro_metadata_translator.fix_header(metadata)
139 index, metadata = self.
_determineHDU(self.dataId[
'detector'])
140 return lsst.afw.image.ImageI(self.fileDescriptor.location.path, index)
144 """DECam Community Pipeline calibrations (bias, dark, flat, fringe) are
145 multi-extension FITS files with detector=index+1.
148 def _determineHDU(self, detectorId):
149 """The HDU to read is the same as the detector number."""
150 filename = self.fileDescriptor.location.path
152 if metadata[
'CCDNUM'] != detectorId:
153 msg = f
"Found CCDNUM={metadata['CCDNUM']} instead of {detectorId} in {filename} HDU={detectorId}."
154 raise ValueError(msg)
155 return detectorId, metadata
158 index, metadata = self.
_determineHDU(self.dataId[
'detector'])
159 return lsst.afw.image.ImageF(self.fileDescriptor.location.path, index)