LSST Applications  21.0.0-131-g8cabc107+528f53ee53,22.0.0+00495a2688,22.0.0+0ef2527977,22.0.0+11a2aa21cd,22.0.0+269b7e55e3,22.0.0+2c6b6677a3,22.0.0+64c1bc5aa5,22.0.0+7b3a3f865e,22.0.0+e1b6d2281c,22.0.0+ff3c34362c,22.0.1-1-g1b65d06+c95cbdf3df,22.0.1-1-g7058be7+1cf78af69b,22.0.1-1-g7dab645+2a65e40b06,22.0.1-1-g8760c09+64c1bc5aa5,22.0.1-1-g949febb+64c1bc5aa5,22.0.1-1-ga324b9c+269b7e55e3,22.0.1-1-gf9d8b05+ff3c34362c,22.0.1-10-g781e53d+9b51d1cd24,22.0.1-10-gba590ab+b9624b875d,22.0.1-13-g76f9b8d+2c6b6677a3,22.0.1-14-g22236948+57af756299,22.0.1-18-g3db9cf4b+9b7092c56c,22.0.1-18-gb17765a+2264247a6b,22.0.1-2-g8ef0a89+2c6b6677a3,22.0.1-2-gcb770ba+c99495d3c6,22.0.1-24-g2e899d296+4206820b0d,22.0.1-3-g7aa11f2+2c6b6677a3,22.0.1-3-g8c1d971+f253ffa91f,22.0.1-3-g997b569+ff3b2f8649,22.0.1-4-g1930a60+6871d0c7f6,22.0.1-4-g5b7b756+6b209d634c,22.0.1-6-ga02864e+6871d0c7f6,22.0.1-7-g3402376+a1a2182ac4,22.0.1-7-g65f59fa+54b92689ce,master-gcc5351303a+e1b6d2281c,w.2021.32
LSST Data Management Base Package
cpDarkTask.py
Go to the documentation of this file.
1 # This file is part of cp_pipe.
2 #
3 # Developed for the LSST Data Management System.
4 # This product includes software developed by the LSST Project
5 # (https://www.lsst.org).
6 # See the COPYRIGHT file at the top-level directory of this distribution
7 # for details of code ownership.
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 GNU General Public License
20 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 import math
22 import numpy as np
23 
24 import lsst.pex.config as pexConfig
25 import lsst.pipe.base as pipeBase
26 import lsst.pipe.base.connectionTypes as cT
27 from lsst.pipe.tasks.repair import RepairTask
28 import lsst.meas.algorithms as measAlg
29 import lsst.afw.geom as afwGeom
30 
31 
32 __all__ = ["CpDarkTask", "CpDarkTaskConfig"]
33 
34 
35 class CpDarkConnections(pipeBase.PipelineTaskConnections,
36  dimensions=("instrument", "exposure", "detector")):
37  inputExp = cT.Input(
38  name="cpDarkISR",
39  doc="Input pre-processed exposures to combine.",
40  storageClass="Exposure",
41  dimensions=("instrument", "exposure", "detector"),
42  )
43 
44  outputExp = cT.Output(
45  name="cpDarkProc",
46  doc="Output combined proposed calibration.",
47  storageClass="Exposure",
48  dimensions=("instrument", "exposure", "detector"),
49  )
50 
51 
52 class CpDarkTaskConfig(pipeBase.PipelineTaskConfig,
53  pipelineConnections=CpDarkConnections):
54  psfFwhm = pexConfig.Field(
55  dtype=float,
56  default=3.0,
57  doc="Repair PSF FWHM (pixels).",
58  )
59  psfSize = pexConfig.Field(
60  dtype=int,
61  default=21,
62  doc="Repair PSF size (pixels).",
63  )
64  crGrow = pexConfig.Field(
65  dtype=int,
66  default=2,
67  doc="Grow radius for CR (pixels).",
68  )
69  repair = pexConfig.ConfigurableField(
70  target=RepairTask,
71  doc="Repair task to use.",
72  )
73 
74 
75 class CpDarkTask(pipeBase.PipelineTask,
76  pipeBase.CmdLineTask):
77  """Combine pre-processed dark frames into a proposed master calibration.
78 
79  """
80  ConfigClass = CpDarkTaskConfig
81  _DefaultName = "cpDark"
82 
83  def __init__(self, **kwargs):
84  super().__init__(**kwargs)
85  self.makeSubtask("repair")
86 
87  def run(self, inputExp):
88  """Preprocess input exposures prior to DARK combination.
89 
90  This task detects and repairs cosmic rays strikes.
91 
92  Parameters
93  ----------
94  inputExp : `lsst.afw.image.Exposure`
95  Pre-processed dark frame data to combine.
96 
97  Returns
98  -------
99  outputExp : `lsst.afw.image.Exposure`
100  CR rejected, ISR processed Dark Frame."
101  """
102  psf = measAlg.SingleGaussianPsf(self.config.psfSize,
103  self.config.psfSize,
104  self.config.psfFwhm/(2*math.sqrt(2*math.log(2))))
105  inputExp.setPsf(psf)
106  scaleExp = inputExp.clone()
107  mi = scaleExp.getMaskedImage()
108 
109  # DM-23680:
110  # Darktime scaling necessary for repair.run() to ID CRs correctly.
111  scale = inputExp.getInfo().getVisitInfo().getDarkTime()
112  if np.isfinite(scale) and scale != 0.0:
113  mi /= scale
114 
115  self.repair.run(scaleExp, keepCRs=False)
116  if self.config.crGrow > 0:
117  crMask = inputExp.getMaskedImage().getMask().getPlaneBitMask("CR")
118  spans = afwGeom.SpanSet.fromMask(inputExp.mask, crMask)
119  spans = spans.dilated(self.config.crGrow)
120  spans.setMask(inputExp.mask, crMask)
121 
122  # Undo scaling; as above, DM-23680.
123  if np.isfinite(scale) and scale != 0.0:
124  mi *= scale
125 
126  return pipeBase.Struct(
127  outputExp=inputExp,
128  )
def __init__(self, **kwargs)
Definition: cpDarkTask.py:83
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations.