29 meshX = pexConfig.Field(
31 doc=
"Mesh size in X for flatness statistics",
34 meshY = pexConfig.Field(
36 doc=
"Mesh size in Y for flatness statistics",
39 doClip = pexConfig.Field(
41 doc=
"Clip outliers for flatness statistics?",
44 clipSigma = pexConfig.Field(
46 doc=
"Number of sigma deviant a pixel must be to be clipped from flatness statistics.",
49 nIter = pexConfig.Field(
51 doc=
"Number of iterations used for outlier clipping in flatness statistics.",
57 saveStats = pexConfig.Field(
59 doc=
"Calculate ISR statistics while processing?",
63 flatness = pexConfig.ConfigField(
64 dtype=IsrQaFlatnessConfig,
65 doc=
"Flatness statistics configuration.",
68 doWriteOss = pexConfig.Field(
70 doc=
"Write overscan subtracted image?",
73 doThumbnailOss = pexConfig.Field(
75 doc=
"Write overscan subtracted thumbnail?",
79 doWriteFlattened = pexConfig.Field(
81 doc=
"Write image after flat-field correction?",
84 doThumbnailFlattened = pexConfig.Field(
86 doc=
"Write thumbnail after flat-field correction?",
90 thumbnailBinning = pexConfig.Field(
92 doc=
"Thumbnail binning factor.",
95 thumbnailStdev = pexConfig.Field(
97 doc=
"Number of sigma below the background to set the thumbnail minimum.",
100 thumbnailRange = pexConfig.Field(
102 doc=
"Total range in sigma for thumbnail mapping.",
105 thumbnailQ = pexConfig.Field(
107 doc=
"Softening parameter for thumbnail mapping.",
110 thumbnailSatBorder = pexConfig.Field(
112 doc=
"Width of border around saturated pixels in thumbnail.",
118 """Create a snapshot thumbnail from input exposure.
120 The output thumbnail image is constructed based on the parameters
121 in the configuration file. Currently, the asinh mapping
is the
122 only mapping method used.
127 The exposure to be converted into a thumbnail.
128 isrQaConfig : `Config`
129 Configuration object containing all parameters to control the
130 thumbnail generation.
134 rgbImage : `numpy.ndarray`
135 Binned
and scaled version of the exposure, converted to an
136 integer array to allow it to be written
as PNG.
138 if isrQaConfig
is not None:
139 binning = isrQaConfig.thumbnailBinning
140 binnedImage = afwMath.binImage(exposure.getMaskedImage(), binning, binning, afwMath.MEAN)
142 statsCtrl = afwMath.StatisticsControl()
143 statsCtrl.setAndMask(binnedImage.getMask().getPlaneBitMask([
"SAT",
"BAD",
"INTRP"]))
144 stats = afwMath.makeStatistics(binnedImage,
145 afwMath.MEDIAN | afwMath.STDEVCLIP | afwMath.MAX, statsCtrl)
147 low = stats.getValue(afwMath.MEDIAN) - isrQaConfig.thumbnailStdev*stats.getValue(afwMath.STDEVCLIP)
149 if isrQaConfig.thumbnailSatBorder:
150 afwRGB.replaceSaturatedPixels(binnedImage, binnedImage, binnedImage,
151 isrQaConfig.thumbnailSatBorder, stats.getValue(afwMath.MAX))
153 asinhMap = afwRGB.AsinhMapping(low, isrQaConfig.thumbnailRange, Q=isrQaConfig.thumbnailQ)
154 rgbImage = asinhMap.makeRgbImage(binnedImage)
def makeThumbnail(exposure, isrQaConfig=None)