34from .crosstalk
import CrosstalkCalib
35from .defects
import Defects
37__all__ = [
"IsrMockConfig",
"IsrMock",
"RawMock",
"TrimmedRawMock",
"RawDictMock",
38 "CalibratedRawMock",
"MasterMock",
39 "BiasMock",
"DarkMock",
"FlatMock",
"FringeMock",
"UntrimmedFringeMock",
40 "BfKernelMock",
"DefectMock",
"CrosstalkCoeffMock",
"TransmissionMock",
45 """Configuration parameters for isrMock.
47 These parameters produce generic fixed position signals from
48 various sources,
and combine them
in a way that matches how those
49 signals are combined to create real data. The camera used
is the
50 test camera defined by the afwUtils code.
53 isLsstLike = pexConfig.Field(
56 doc=
"If True, products have one raw image per amplifier, otherwise, one raw image per detector.",
58 plateScale = pexConfig.Field(
61 doc=
"Plate scale used in constructing mock camera.",
63 radialDistortion = pexConfig.Field(
66 doc=
"Radial distortion term used in constructing mock camera.",
68 isTrimmed = pexConfig.Field(
71 doc=
"If True, amplifiers have been trimmed and mosaicked to remove regions outside the data BBox.",
73 detectorIndex = pexConfig.Field(
76 doc=
"Index for the detector to use. The default value uses a standard 2x4 array of amps.",
78 rngSeed = pexConfig.Field(
81 doc=
"Seed for random number generator used to add noise.",
84 gain = pexConfig.Field(
87 doc=
"Gain for simulated data in e^-/DN.",
89 readNoise = pexConfig.Field(
92 doc=
"Read noise of the detector in e-.",
94 expTime = pexConfig.Field(
97 doc=
"Exposure time for simulated data.",
101 skyLevel = pexConfig.Field(
104 doc=
"Background contribution to be generated from 'the sky' in DN.",
106 sourceFlux = pexConfig.ListField(
109 doc=
"Peak flux level (in DN) of simulated 'astronomical sources'.",
111 sourceAmp = pexConfig.ListField(
114 doc=
"Amplifier to place simulated 'astronomical sources'.",
116 sourceX = pexConfig.ListField(
119 doc=
"Peak position (in amplifier coordinates) of simulated 'astronomical sources'.",
121 sourceY = pexConfig.ListField(
124 doc=
"Peak position (in amplifier coordinates) of simulated 'astronomical sources'.",
126 overscanScale = pexConfig.Field(
129 doc=
"Amplitude (in DN) of the ramp function to add to overscan data.",
131 biasLevel = pexConfig.Field(
134 doc=
"Background contribution to be generated from the bias offset in DN.",
136 darkRate = pexConfig.Field(
139 doc=
"Background level contribution (in e-/s) to be generated from dark current.",
141 darkTime = pexConfig.Field(
144 doc=
"Exposure time for the dark current contribution.",
146 flatDrop = pexConfig.Field(
149 doc=
"Fractional flux drop due to flat from center to edge of detector along x-axis.",
151 fringeScale = pexConfig.ListField(
154 doc=
"Peak fluxes for the components of the fringe ripple in DN.",
156 fringeX0 = pexConfig.ListField(
159 doc=
"Center position for the fringe ripples.",
161 fringeY0 = pexConfig.ListField(
164 doc=
"Center position for the fringe ripples.",
168 doAddSky = pexConfig.Field(
171 doc=
"Apply 'sky' signal to output image.",
173 doAddSource = pexConfig.Field(
176 doc=
"Add simulated source to output image.",
178 doAddCrosstalk = pexConfig.Field(
181 doc=
"Apply simulated crosstalk to output image. This cannot be corrected by ISR, "
182 "as detector.hasCrosstalk()==False.",
184 doAddOverscan = pexConfig.Field(
187 doc=
"If untrimmed, add overscan ramp to overscan and data regions.",
189 doAddBias = pexConfig.Field(
192 doc=
"Add bias signal to data.",
194 doAddDark = pexConfig.Field(
197 doc=
"Add dark signal to data.",
199 doAddFlat = pexConfig.Field(
202 doc=
"Add flat signal to data.",
204 doAddFringe = pexConfig.Field(
207 doc=
"Add fringe signal to data.",
211 doTransmissionCurve = pexConfig.Field(
214 doc=
"Return a simulated transmission curve.",
216 doDefects = pexConfig.Field(
219 doc=
"Return a simulated defect list.",
221 doBrighterFatter = pexConfig.Field(
224 doc=
"Return a simulated brighter-fatter kernel.",
226 doCrosstalkCoeffs = pexConfig.Field(
229 doc=
"Return the matrix of crosstalk coefficients.",
231 doDataRef = pexConfig.Field(
234 doc=
"Return a simulated gen2 butler dataRef.",
236 doGenerateImage = pexConfig.Field(
239 doc=
"Return the generated output image if True.",
241 doGenerateData = pexConfig.Field(
244 doc=
"Return a non-image data structure if True.",
246 doGenerateAmpDict = pexConfig.Field(
249 doc=
"Return a dict of exposure amplifiers instead of an afwImage.Exposure.",
254 """Class to generate consistent mock images for ISR testing.
256 ISR testing currently relies on one-off fake images that do not
257 accurately mimic the full set of detector effects. This
class
258 uses the test camera/detector/amplifier structure defined
in
260 dependent on any of the actual obs package formats.
262 ConfigClass = IsrMockConfig
263 _DefaultName = "isrMock"
267 self.
rngrng = np.random.RandomState(self.config.rngSeed)
268 self.
crosstalkCoeffscrosstalkCoeffs = np.array([[0.0, 0.0, 0.0, 0.0, 0.0, -1e-3, 0.0, 0.0],
269 [1e-2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
270 [1e-2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
271 [1e-2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
272 [1e-2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
273 [1e-2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
274 [1e-2, 0.0, 0.0, 2.2e-2, 0.0, 0.0, 0.0, 0.0],
275 [1e-2, 5e-3, 5e-4, 3e-3, 4e-2, 5e-3, 5e-3, 0.0]])
277 self.
bfKernelbfKernel = np.array([[1., 4., 7., 4., 1.],
278 [4., 16., 26., 16., 4.],
279 [7., 26., 41., 26., 7.],
280 [4., 16., 26., 16., 4.],
281 [1., 4., 7., 4., 1.]]) / 273.0
284 """Generate a mock ISR product, and return it.
289 Simulated ISR image with signals added.
291 Simulated ISR data products.
293 Returned
if no valid configuration was found.
298 Raised
if both doGenerateImage
and doGenerateData are specified.
300 if self.config.doGenerateImage
and self.config.doGenerateData:
301 raise RuntimeError(
"Only one of doGenerateImage and doGenerateData may be specified.")
302 elif self.config.doGenerateImage:
304 elif self.config.doGenerateData:
310 """Generate simulated ISR data.
313 matrix, brighter-fatter kernel, a constant unity transmission
314 curve,
or a simple single-entry defect list can be generated.
319 Simulated ISR data product.
321 if sum(map(bool, [self.config.doBrighterFatter,
322 self.config.doDefects,
323 self.config.doTransmissionCurve,
324 self.config.doCrosstalkCoeffs])) != 1:
325 raise RuntimeError(
"Only one data product can be generated at a time.")
326 elif self.config.doBrighterFatter
is True:
328 elif self.config.doDefects
is True:
330 elif self.config.doTransmissionCurve
is True:
332 elif self.config.doCrosstalkCoeffs
is True:
338 """Generate a simple Gaussian brighter-fatter kernel.
342 kernel : `numpy.ndarray`
343 Simulated brighter-fatter kernel.
348 """Generate a simple single-entry defect list.
352 defectList : `lsst.meas.algorithms.Defects`
353 Simulated defect list
359 """Generate the simulated crosstalk coefficients.
363 coeffs : `numpy.ndarray`
364 Simulated crosstalk coefficients.
370 """Generate a simulated flat transmission curve.
375 Simulated transmission curve.
378 return afwImage.TransmissionCurve.makeIdentity()
381 """Generate a simulated ISR image.
386 Simulated ISR image data.
390 This method currently constructs a
"raw" data image by:
391 * Generating a simulated sky
with noise
392 * Adding a single Gaussian
"star"
393 * Adding the fringe signal
394 * Multiplying the frame by the simulated flat
395 * Adding dark current (
and noise)
396 * Adding a bias offset (
and noise)
397 * Adding an overscan gradient parallel to the pixel y-axis
398 * Simulating crosstalk by adding a scaled version of each
399 amplifier to each other amplifier.
401 The exposure
with image data constructed this way
is in one of
403 * A single image,
with overscan
and prescan regions retained
404 * A single image,
with overscan
and prescan regions trimmed
405 * A `dict`, containing the amplifer data indexed by the
408 The nonlinearity, CTE,
and brighter fatter are currently
not
411 Note that this method generates an image
in the reverse
412 direction
as the ISR processing,
as the output image here has
413 had a series of instrument effects added to an idealized
418 for idx, amp
in enumerate(exposure.getDetector()):
420 if self.config.isTrimmed
is True:
423 bbox = amp.getRawDataBBox()
425 ampData = exposure.image[bbox]
427 if self.config.doAddSky
is True:
428 self.
amplifierAddNoiseamplifierAddNoise(ampData, self.config.skyLevel, np.sqrt(self.config.skyLevel))
430 if self.config.doAddSource
is True:
431 for sourceAmp, sourceFlux, sourceX, sourceY
in zip(self.config.sourceAmp,
432 self.config.sourceFlux,
434 self.config.sourceY):
438 if self.config.doAddFringe
is True:
439 self.
amplifierAddFringeamplifierAddFringe(amp, ampData, np.array(self.config.fringeScale),
440 x0=np.array(self.config.fringeX0),
441 y0=np.array(self.config.fringeY0))
443 if self.config.doAddFlat
is True:
444 if ampData.getArray().sum() == 0.0:
446 u0 = exposure.getDimensions().getX()
447 v0 = exposure.getDimensions().getY()
450 if self.config.doAddDark
is True:
452 self.config.darkRate * self.config.darkTime / self.config.gain,
453 np.sqrt(self.config.darkRate
454 * self.config.darkTime / self.config.gain))
456 if self.config.doAddCrosstalk
is True:
458 for idxS, ampS
in enumerate(exposure.getDetector()):
459 for idxT, ampT
in enumerate(exposure.getDetector()):
460 ampDataT = exposure.image[ampT.getBBox()
461 if self.config.isTrimmed
else ampT.getRawDataBBox()]
462 outAmp = ctCalib.extractAmp(exposure.getImage(), ampS, ampT,
463 isTrimmed=self.config.isTrimmed)
466 for amp
in exposure.getDetector():
468 if self.config.isTrimmed
is True:
471 bbox = amp.getRawDataBBox()
473 ampData = exposure.image[bbox]
475 if self.config.doAddBias
is True:
477 self.config.readNoise / self.config.gain)
479 if self.config.doAddOverscan
is True:
480 oscanBBox = amp.getRawHorizontalOverscanBBox()
481 oscanData = exposure.image[oscanBBox]
483 self.config.readNoise / self.config.gain)
486 1.0 * self.config.overscanScale)
488 1.0 * self.config.overscanScale)
490 if self.config.doGenerateAmpDict
is True:
492 for amp
in exposure.getDetector():
493 expDict[amp.getName()] = exposure
500 """Construct a test camera object.
504 camera : `lsst.afw.cameraGeom.camera`
507 cameraWrapper = afwTestUtils.CameraWrapper(
508 plateScale=self.config.plateScale,
509 radialDistortion=self.config.radialDistortion,
510 isLsstLike=self.config.isLsstLike,
512 camera = cameraWrapper.camera
516 """Construct a test exposure.
518 The test exposure has a simple WCS set, as well
as a list of
519 unlikely header keywords that can be removed during ISR
520 processing to exercise that code.
524 exposure : `lsst.afw.exposure.Exposure`
525 Construct exposure containing masked image of the
529 detector = camera[self.config.detectorIndex]
530 image = afwUtils.makeImageFromCcd(detector,
531 isTrimmed=self.config.isTrimmed,
535 imageFactory=afwImage.ImageF)
537 var = afwImage.ImageF(image.getDimensions())
543 exposure.setDetector(detector)
544 exposure.setWcs(self.
getWcsgetWcs())
546 visitInfo =
afwImage.VisitInfo(exposureTime=self.config.expTime, darkTime=self.config.darkTime)
547 exposure.getInfo().setVisitInfo(visitInfo)
549 metadata = exposure.getMetadata()
550 metadata.add(
"SHEEP", 7.3,
"number of sheep on farm")
551 metadata.add(
"MONKEYS", 155,
"monkeys per tree")
552 metadata.add(
"VAMPIRES", 4,
"How scary are vampires.")
554 ccd = exposure.getDetector()
555 newCcd = ccd.rebuild()
558 newAmp = amp.rebuild()
559 newAmp.setLinearityCoeffs((0., 1., 0., 0.))
560 newAmp.setLinearityType(
"Polynomial")
561 newAmp.setGain(self.config.gain)
562 newAmp.setSuspectLevel(25000.0)
563 newAmp.setSaturation(32000.0)
564 newCcd.append(newAmp)
565 exposure.setDetector(newCcd.finish())
567 exposure.image.array[:] = np.zeros(exposure.getImage().getDimensions()).transpose()
568 exposure.mask.array[:] = np.zeros(exposure.getMask().getDimensions()).transpose()
569 exposure.variance.array[:] = np.zeros(exposure.getVariance().getDimensions()).transpose()
574 """Construct a dummy WCS object.
576 Taken from the deprecated ip_isr/examples/exampleUtils.py.
578 This
is not guaranteed, given the distortion
and pixel scale
579 listed
in the afwTestUtils camera definition.
591 """Convert between a local amplifier coordinate and the full
596 ampData : `lsst.afw.image.ImageF`
597 Amplifier image to use for conversions.
599 X-coordinate of the point to transform.
601 Y-coordinate of the point to transform.
606 Transformed x-coordinate.
608 Transformed y-coordinate.
612 The output
is transposed intentionally here, to match the
613 internal transpose between numpy
and afw.image coordinates.
615 u = x + ampData.getBBox().getBeginX()
616 v = y + ampData.getBBox().getBeginY()
622 """Add Gaussian noise to an amplifier's image data.
624 This method operates in the amplifier coordinate frame.
628 ampData : `lsst.afw.image.ImageF`
629 Amplifier image to operate on.
631 Mean value of the Gaussian noise.
633 Sigma of the Gaussian noise.
635 ampArr = ampData.array
636 ampArr[:] = ampArr[:] + self.rngrng.normal(mean, sigma,
637 size=ampData.getDimensions()).transpose()
640 """Add a y-axis linear gradient to an amplifier's image data.
642 This method operates in the amplifier coordinate frame.
646 ampData : `lsst.afw.image.ImageF`
647 Amplifier image to operate on.
649 Start value of the gradient (at y=0).
651 End value of the gradient (at y=ymax).
653 nPixY = ampData.getDimensions().getY()
654 ampArr = ampData.array
655 ampArr[:] = ampArr[:] + (np.interp(range(nPixY), (0, nPixY - 1), (start, end)).reshape(nPixY, 1)
656 + np.zeros(ampData.getDimensions()).transpose())
659 """Add a single Gaussian source to an amplifier.
661 This method operates in the amplifier coordinate frame.
665 ampData : `lsst.afw.image.ImageF`
666 Amplifier image to operate on.
668 Peak flux of the source to add.
670 X-coordinate of the source peak.
672 Y-coordinate of the source peak.
674 for x
in range(0, ampData.getDimensions().getX()):
675 for y
in range(0, ampData.getDimensions().getY()):
676 ampData.array[y][x] = (ampData.array[y][x]
677 + scale * np.exp(-0.5 * ((x - x0)**2 + (y - y0)**2) / 3.0**2))
680 """Add a scaled copy of an amplifier to another, simulating crosstalk.
682 This method operates in the amplifier coordinate frame.
686 ampDataSource : `lsst.afw.image.ImageF`
687 Amplifier image to add scaled copy
from.
688 ampDataTarget : `lsst.afw.image.ImageF`
689 Amplifier image to add scaled copy to.
691 Flux scale of the copy to add to the target.
695 This simulates simple crosstalk between amplifiers.
697 ampDataTarget.array[:] = (ampDataTarget.array[:]
698 + scale * ampDataSource.array[:])
702 """Add a fringe-like ripple pattern to an amplifier's image data.
706 amp : `~lsst.afw.ampInfo.AmpInfoRecord`
707 Amplifier to operate on. Needed for amp<->exp coordinate
709 ampData : `lsst.afw.image.ImageF`
710 Amplifier image to operate on.
711 scale : `numpy.array`
or `float`
712 Peak intensity scaling
for the ripple.
713 x0 : `numpy.array`
or `float`, optional
715 y0 : `numpy.array`
or `float`, optional
720 This uses an offset sinc function to generate a ripple
721 pattern.
True fringes have much finer structure, but this
722 pattern should be visually identifiable. The (x, y)
723 coordinates are
in the frame of the amplifier,
and (u, v)
in
724 the frame of the full trimmed image.
726 for x
in range(0, ampData.getDimensions().getX()):
727 for y
in range(0, ampData.getDimensions().getY()):
729 ampData.getArray()[y][x] = np.sum((ampData.getArray()[y][x]
730 + scale * np.sinc(((u - x0) / 50)**2
731 + ((v - y0) / 50)**2)))
734 """Multiply an amplifier's image data by a flat-like pattern.
738 amp : `lsst.afw.ampInfo.AmpInfoRecord`
739 Amplifier to operate on. Needed for amp<->exp coordinate
741 ampData : `lsst.afw.image.ImageF`
742 Amplifier image to operate on.
744 Fractional drop
from center to edge of detector along x-axis.
746 Peak location
in detector coordinates.
748 Peak location
in detector coordinates.
752 This uses a 2-d Gaussian to simulate an illumination pattern
753 that falls off towards the edge of the detector. The (x, y)
754 coordinates are
in the frame of the amplifier,
and (u, v)
in
755 the frame of the full trimmed image.
758 raise RuntimeError(
"Flat fractional drop cannot be greater than 1.0")
760 sigma = u0 / np.sqrt(-2.0 * np.log(fracDrop))
762 for x
in range(0, ampData.getDimensions().getX()):
763 for y
in range(0, ampData.getDimensions().getY()):
765 f = np.exp(-0.5 * ((u - u0)**2 + (v - v0)**2) / sigma**2)
766 ampData.array[y][x] = (ampData.array[y][x] * f)
770 """Generate a raw exposure suitable for ISR.
774 self.config.isTrimmed =
False
775 self.config.doGenerateImage =
True
776 self.config.doGenerateAmpDict =
False
777 self.config.doAddOverscan =
True
778 self.config.doAddSky =
True
779 self.config.doAddSource =
True
780 self.config.doAddCrosstalk =
False
781 self.config.doAddBias =
True
782 self.config.doAddDark =
True
786 """Generate a trimmed raw exposure.
790 self.config.isTrimmed =
True
791 self.config.doAddOverscan =
False
795 """Generate a trimmed raw exposure.
799 self.config.isTrimmed =
True
800 self.config.doGenerateImage =
True
801 self.config.doAddOverscan =
False
802 self.config.doAddSky =
True
803 self.config.doAddSource =
True
804 self.config.doAddCrosstalk =
False
806 self.config.doAddBias =
False
807 self.config.doAddDark =
False
808 self.config.doAddFlat =
False
809 self.config.doAddFringe =
True
811 self.config.biasLevel = 0.0
812 self.config.readNoise = 10.0
816 """Generate a raw exposure dict suitable for ISR.
820 self.config.doGenerateAmpDict =
True
824 """Parent class for those that make master calibrations.
828 self.config.isTrimmed =
True
829 self.config.doGenerateImage =
True
830 self.config.doAddOverscan =
False
831 self.config.doAddSky =
False
832 self.config.doAddSource =
False
833 self.config.doAddCrosstalk =
False
835 self.config.doAddBias =
False
836 self.config.doAddDark =
False
837 self.config.doAddFlat =
False
838 self.config.doAddFringe =
False
842 """Simulated master bias calibration.
846 self.config.doAddBias =
True
847 self.config.readNoise = 10.0
851 """Simulated master dark calibration.
855 self.config.doAddDark =
True
856 self.config.darkTime = 1.0
860 """Simulated master flat calibration.
864 self.config.doAddFlat =
True
868 """Simulated master fringe calibration.
872 self.config.doAddFringe =
True
876 """Simulated untrimmed master fringe calibration.
880 self.config.isTrimmed =
False
884 """Simulated brighter-fatter kernel.
888 self.config.doGenerateImage =
False
889 self.config.doGenerateData =
True
890 self.config.doBrighterFatter =
True
891 self.config.doDefects =
False
892 self.config.doCrosstalkCoeffs =
False
893 self.config.doTransmissionCurve =
False
897 """Simulated defect list.
901 self.config.doGenerateImage =
False
902 self.config.doGenerateData =
True
903 self.config.doBrighterFatter =
False
904 self.config.doDefects =
True
905 self.config.doCrosstalkCoeffs =
False
906 self.config.doTransmissionCurve =
False
910 """Simulated crosstalk coefficient matrix.
914 self.config.doGenerateImage =
False
915 self.config.doGenerateData =
True
916 self.config.doBrighterFatter =
False
917 self.config.doDefects =
False
918 self.config.doCrosstalkCoeffs =
True
919 self.config.doTransmissionCurve =
False
923 """Simulated transmission curve.
927 self.config.doGenerateImage =
False
928 self.config.doGenerateData =
True
929 self.config.doBrighterFatter =
False
930 self.config.doDefects =
False
931 self.config.doCrosstalkCoeffs =
False
932 self.config.doTransmissionCurve =
True
936 """Simulated gen2 butler data ref.
938 Currently only supports get and put operations, which are most
939 likely to be called
for data
in ISR processing.
942 dataId = "isrMock Fake Data"
950 if 'config' in kwargs.keys():
956 if self.
configconfig
is None:
958 self.
configconfig.doGenerateImage =
True
959 self.
configconfig.doGenerateData =
False
962 if self.
configconfig
is None:
964 self.
configconfig.doGenerateImage =
False
965 self.
configconfig.doGenerateData =
True
967 def get(self, dataType, **kwargs):
968 """Return an appropriate data product.
973 Type of data product to return.
977 mock : IsrMock.run() result
980 if "_filename" in dataType:
982 return tempfile.mktemp(),
"mock"
983 elif 'transmission_' in dataType:
986 elif dataType ==
'ccdExposureId':
989 elif dataType ==
'camera':
992 elif dataType ==
'raw':
995 elif dataType ==
'bias':
998 elif dataType ==
'dark':
1001 elif dataType ==
'flat':
1004 elif dataType ==
'fringe':
1007 elif dataType ==
'defects':
1010 elif dataType ==
'bfKernel':
1013 elif dataType ==
'linearizer':
1015 elif dataType ==
'crosstalkSources':
1018 raise RuntimeError(
"ISR DataRefMock cannot return %s.", dataType)
1020 def put(self, exposure, filename):
1021 """Write an exposure to a FITS file.
1026 Image data to write out.
1028 Base name of the output file.
1030 exposure.writeFits(filename+".fits")
1034 """Simulated gen2 butler data ref.
1036 Currently only supports get and put operations, which are most
1037 likely to be called
for data
in ISR processing.
1040 dataId = "isrMock Fake Data"
1048 if 'config' in kwargs.keys():
1052 self.
configconfig.isTrimmed =
True
1053 self.
configconfig.doAddFringe =
True
1054 self.
configconfig.readNoise = 10.0
1056 def get(self, dataType, **kwargs):
1057 """Return an appropriate data product.
1062 Type of data product to return.
1066 mock : IsrMock.run() result
1069 if "_filename" in dataType:
1070 return tempfile.mktemp(),
"mock"
1071 elif 'transmission_' in dataType:
1073 elif dataType ==
'ccdExposureId':
1075 elif dataType ==
'camera':
1077 elif dataType ==
'raw':
1079 elif dataType ==
'bias':
1081 elif dataType ==
'dark':
1083 elif dataType ==
'flat':
1085 elif dataType ==
'fringe':
1087 configCopy = copy.deepcopy(self.
configconfig)
1088 for scale, x, y
in zip(self.
configconfig.fringeScale, self.
configconfig.fringeX0, self.
configconfig.fringeY0):
1089 configCopy.fringeScale = [1.0]
1090 configCopy.fringeX0 = [x]
1091 configCopy.fringeY0 = [y]
1094 elif dataType ==
'defects':
1096 elif dataType ==
'bfKernel':
1098 elif dataType ==
'linearizer':
1100 elif dataType ==
'crosstalkSources':
1105 def put(self, exposure, filename):
1106 """Write an exposure to a FITS file.
1111 Image data to write out.
1113 Base name of the output file.
1115 exposure.writeFits(filename+".fits")
table::Key< table::Array< float > > crosstalk
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
A class to contain the data, WCS, and other information needed to describe an image of the sky.
Represent a 2-dimensional array of bitmask pixels.
A spatially-varying transmission curve as a function of wavelength.
Information about a single exposure of an imaging camera.
An integer coordinate rectangle.
Point in an unspecified spherical coordinate system.
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def put(self, exposure, filename)
def get(self, dataType, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def put(self, exposure, filename)
def __init__(self, **kwargs)
def get(self, dataType, **kwargs)
def __init__(self, **kwargs)
def amplifierAddSource(self, ampData, scale, x0, y0)
def __init__(self, **kwargs)
def amplifierAddNoise(self, ampData, mean, sigma)
def amplifierAddYGradient(self, ampData, start, end)
def makeTransmissionCurve(self)
def amplifierAddCT(self, ampDataSource, ampDataTarget, scale)
def amplifierMultiplyFlat(self, amp, ampData, fracDrop, u0=100.0, v0=100.0)
def makeCrosstalkCoeff(self)
def amplifierAddFringe(self, amp, ampData, scale, x0=100, y0=0)
def localCoordToExpCoord(self, ampData, x, y)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
def __init__(self, **kwargs)
std::shared_ptr< SkyWcs > makeSkyWcs(daf::base::PropertySet &metadata, bool strip=false)
Construct a SkyWcs from FITS keywords.
Eigen::Matrix2d makeCdMatrix(lsst::geom::Angle const &scale, lsst::geom::Angle const &orientation=0 *lsst::geom::degrees, bool flipX=false)
Make a WCS CD matrix.
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
MaskedImage< ImagePixelT, MaskPixelT, VariancePixelT > * makeMaskedImage(typename std::shared_ptr< Image< ImagePixelT > > image, typename std::shared_ptr< Mask< MaskPixelT > > mask=Mask< MaskPixelT >(), typename std::shared_ptr< Image< VariancePixelT > > variance=Image< VariancePixelT >())
A function to return a MaskedImage of the correct type (cf.
std::shared_ptr< Exposure< ImagePixelT, MaskPixelT, VariancePixelT > > makeExposure(MaskedImage< ImagePixelT, MaskPixelT, VariancePixelT > &mimage, std::shared_ptr< geom::SkyWcs const > wcs=std::shared_ptr< geom::SkyWcs const >())
A function to return an Exposure of the correct type (cf.
def run(self, coaddExposures, bbox, wcs, dataIds, **kwargs)