LSSTApplications  18.1.0
LSSTDataManagementBasePackage
decamCpIsr.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 #
4 # Copyright 2016 AURA/LSST.
5 #
6 # This product includes software developed by the
7 # LSST Project (http://www.lsst.org/).
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the LSST License Statement and
20 # the GNU General Public License along with this program. If not,
21 # see <https://www.lsstcorp.org/LegalNotices/>.
22 #
23 
24 from lsst.afw.image import LOCAL
25 from lsst.ip.isr import biasCorrection, flatCorrection
26 from lsst.meas.algorithms.detection import SourceDetectionTask
27 from .isr import DecamIsrTask, DecamIsrConfig
28 
29 __all__ = ["DecamCpIsrConfig", "DecamCpIsrTask"]
30 
31 
32 def _computeEdgeSize(rawExposure, calibExposure):
33  """Compute the number of edge trim pixels of the calibration product.
34 
35  Some Community Pipeline Calibration products are trimmed on their edges
36  and are smaller than the raw data. Use the dimension difference between
37  raw exposure and the calibration product to compute the edge trim pixels.
38 
39  Parameters
40  ----------
41  rawExposure : `lsst.afw.image.Exposure`
42  The input raw exposure.
43  calibExposure : `lsst.afw.image.Exposure`
44  Calibration bias or flat exposure, known to be smaller than raw data.
45 
46  Returns
47  -------
48  result : `int`
49  An integer as the number of trimmed pixels on each edge.
50  """
51  nx, ny = rawExposure.getBBox().getDimensions() - calibExposure.getBBox().getDimensions()
52  assert nx == ny, "Exposure is trimmed differently in X and Y"
53  assert nx % 2 == 0, "Exposure is trimmed unevenly in X"
54  assert nx >= 0, "Calibration image is larger than raw data"
55  return nx//2
56 
57 
58 class DecamCpIsrConfig(DecamIsrConfig):
59 
60  def setDefaults(self):
61  self.biasDataProductName = "cpBias"
62  self.flatDataProductName = "cpFlat"
63 
64 
65 class DecamCpIsrTask(DecamIsrTask):
66  """Perform ISR task using Community Pipeline Calibration Products MasterCal.
67 
68  The CP MasterCal products have butler dataset types cpBias and cpFlat,
69  different from the LSST-generated calibration products (bias/flat).
70  """
71  ConfigClass = DecamCpIsrConfig
72 
73  def biasCorrection(self, exposure, biasExposure):
74  """Apply bias correction in place
75 
76  DECam bias products have been trimmed and are smaller than
77  the raw exposure. The size of edge trim is computed based
78  on the dimensions of the input data. Only process the inner
79  part of the raw exposure, and mask the outer pixels as EDGE.
80 
81  Parameters
82  ----------
83  exposure : `lsst.afw.image.Exposure`
84  Exposure to process.
85  biasExposure : `lsst.afw.image.Exposure`
86  Bias exposure.
87  """
88  nEdge = _computeEdgeSize(exposure, biasExposure)
89  if nEdge > 0:
90  rawMaskedImage = exposure.maskedImage[nEdge:-nEdge, nEdge:-nEdge, LOCAL]
91  else:
92  rawMaskedImage = exposure.getMaskedImage()
93  biasCorrection(rawMaskedImage, biasExposure.getMaskedImage())
94  # Mask the unprocessed edge pixels as EDGE
95  SourceDetectionTask.setEdgeBits(
96  exposure.getMaskedImage(),
97  rawMaskedImage.getBBox(),
98  exposure.getMaskedImage().getMask().getPlaneBitMask("EDGE")
99  )
100 
101  def flatCorrection(self, exposure, flatExposure):
102  """Apply flat correction in place.
103 
104  DECam flat products have been trimmed and are smaller than
105  the raw exposure. The size of edge trim is computed based
106  on the dimensions of the input data. Only process the inner
107  part of the raw exposure, and mask the outer pixels as EDGE.
108 
109  Parameters
110  ----------
111  exposure : `lsst.afw.image.Exposure`
112  Exposure to process.
113  flatExposure : `lsst.afw.image.Exposure`
114  Flatfield exposure.
115  """
116  nEdge = _computeEdgeSize(exposure, flatExposure)
117  if nEdge > 0:
118  rawMaskedImage = exposure.maskedImage[nEdge:-nEdge, nEdge:-nEdge, LOCAL]
119  else:
120  rawMaskedImage = exposure.getMaskedImage()
122  rawMaskedImage,
123  flatExposure.getMaskedImage(),
124  self.config.flatScalingType,
125  self.config.flatUserScale
126  )
127  # Mask the unprocessed edge pixels as EDGE
128  SourceDetectionTask.setEdgeBits(
129  exposure.getMaskedImage(),
130  rawMaskedImage.getBBox(),
131  exposure.getMaskedImage().getMask().getPlaneBitMask("EDGE")
132  )
def flatCorrection(self, exposure, flatExposure)
Definition: decamCpIsr.py:101
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...
def biasCorrection(self, exposure, biasExposure)
Definition: decamCpIsr.py:73