110 """Generate a simulated ISR LSST image.
114 exposure : `lsst.afw.image.Exposure` or `dict`
115 Simulated ISR image data.
119 This method constructs a "raw" data image.
126 for idx, amp
in enumerate(exposure.getDetector()):
130 if self.config.isTrimmed:
133 bbox = amp.getRawDataBBox()
135 ampData = exposure.image[bbox]
138 if self.config.doAddSky:
143 np.sqrt(self.config.skyLevel * self.config.gain))
145 if self.config.doAddSource:
146 for sourceAmp, sourceFlux, sourceX, sourceY
in zip(self.config.sourceAmp,
147 self.config.sourceFlux,
149 self.config.sourceY):
157 if self.config.doAddFringe:
160 self.
amplifierAddFringe(amp, ampData, np.array(self.config.fringeScale) * self.config.gain,
161 x0=np.array(self.config.fringeX0),
162 y0=np.array(self.config.fringeY0))
164 if self.config.doAddFlat:
165 if self.config.calibMode:
170 u0 = exposure.getDetector().getBBox().getDimensions().getX()/2.
171 v0 = exposure.getDetector().getBBox().getDimensions().getY()/2.
177 if self.config.doAddDark:
179 self.config.darkRate * self.config.darkTime,
180 0.
if self.config.calibMode
181 else np.sqrt(self.config.darkRate * self.config.darkTime))
186 if self.config.doApplyGain:
187 self.
applyGain(ampData, self.config.gain)
190 if not self.config.calibMode:
192 self.config.readNoise / self.config.gain)
195 if self.config.doAddCrosstalk:
197 exposureClean = exposure.clone()
198 for idxS, ampS
in enumerate(exposure.getDetector()):
199 for idxT, ampT
in enumerate(exposure.getDetector()):
200 ampDataTarget = exposure.image[ampT.getBBox()
if self.config.isTrimmed
201 else ampT.getRawDataBBox()]
202 ampDataSource = ctCalib.extractAmp(exposureClean.image, ampS, ampT,
203 isTrimmed=self.config.isTrimmed)
207 for amp
in exposure.getDetector():
210 if self.config.isTrimmed:
213 bbox = amp.getRawDataBBox()
214 ampData = exposure.image[bbox]
216 if self.config.doAddParallelOverscan
or self.config.doAddSerialOverscan
or self.config.doAddBias:
220 if self.config.doAddParallelOverscan
or self.config.doAddSerialOverscan:
224 parallelOscanBBox = amp.getRawParallelOverscanBBox()
225 parallelOscanData = exposure.image[parallelOscanBBox]
227 grownImageBBox = bbox.expandedTo(parallelOscanBBox)
229 serialOscanBBox = amp.getRawSerialOverscanBBox()
233 grownImageBBox.getMinY()),
235 grownImageBBox.getHeight()))
236 serialOscanData = exposure.image[serialOscanBBox]
241 self.config.readNoise / self.config.gain)
244 self.config.readNoise / self.config.gain)
246 grownImageBBoxAll = grownImageBBox.expandedTo(serialOscanBBox)
247 allData = exposure.image[grownImageBBoxAll]
249 if self.config.doAddParallelOverscan:
252 1.0 * self.config.overscanScale)
259 self.
addBiasLevel(allData, self.config.biasLevel
if self.config.doAddBias
else 0.0)
261 if self.config.doAddSerialOverscan:
264 1.0 * self.config.overscanScale)
266 if self.config.doGenerateAmpDict:
268 for amp
in exposure.getDetector():
269 expDict[amp.getName()] = exposure