Coverage for python/lsst/ip/isr/straylight.py : 78%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of ip_isr.
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 <https://www.gnu.org/licenses/>.
21from abc import ABC, abstractmethod
22from typing import Optional
24from lsst.pex.config import Config, Field, ListField
25from lsst.pipe.base import Task
26from lsst.geom import Angle
29class StrayLightConfig(Config):
30 doRotatorAngleCorrection = Field(
31 dtype=bool,
32 doc="",
33 default=False,
34 )
35 filters = ListField(
36 dtype=str,
37 doc="Filters that need straylight correction.",
38 default=[],
39 )
42class StrayLightTask(Task):
43 """Remove stray light from instruments.
45 This is a dummy task to be retargeted with an camera-specific version.
46 """
47 ConfigClass = StrayLightConfig
48 _DefaultName = "isrStrayLight"
50 def readIsrData(self, dataRef, rawExposure):
51 """Read and return calibration products relevant for correcting
52 stray light in the given exposure.
54 Parameters
55 ----------
56 dataRef : `daf.persistence.butlerSubset.ButlerDataRef`
57 Butler reference of the detector data to be processed
58 rawExposure : `afw.image.Exposure`
59 The raw exposure that will later be corrected with the
60 retrieved calibration data; should not be modified in this
61 method.
63 Returns
64 -------
65 straylightData : `object`, optional
66 An opaque object that should be passed as the second argument to
67 the `run` method. If `None`, no stray light correction will be
68 performed for the given image. Any other object (e.g. `True`)
69 may be used to signal that stray light correction should be
70 performed even if there is nothing to read.
72 Notes
73 -----
74 This method will be called only when `IsrTask` is run by the Gen2
75 Middleware (i.e. CmdLineTask).
76 """
77 return None
79 def check(self, exposure):
80 """Check if stray light correction should be run.
82 Parameters
83 ----------
84 exposure : `lsst.afw.image.Exposure`
85 Exposure to correct.
86 """
87 return False
89 def run(self, exposure, strayLightData):
90 """Correct stray light.
92 Parameters
93 ----------
94 exposure : `lsst.afw.image.Exposure`
95 Exposure to correct.
96 strayLightData : `object`, optional
97 An opaque object that contains any calibration data used to
98 correct for stray light.
99 """
100 raise NotImplementedError("Must be implemented by subclasses.")
102 def checkFilter(self, exposure):
103 """Check whether we should fringe-subtract the science exposure.
105 Parameters
106 ----------
107 exposure : `lsst.afw.image.Exposure`
108 Exposure to check the filter of.
110 Returns
111 -------
112 needsFringe : `bool`
113 If True, then the exposure has a filter listed in the
114 configuration, and should have the fringe applied.
115 """
116 return exposure.getFilter().getName() in self.config.filters
119class StrayLightData(ABC):
120 """An abstract base class for rotator-dependent stray light information.
121 """
123 @abstractmethod
124 def evaluate(self, angle_start: Angle, angle_end: Optional[Angle] = None):
125 """Get a stray light array for a range of rotator angles.
127 Parameters
128 ----------
129 angle_begin : `float`
130 Instrument rotation angle at the start of the exposure.
131 angle_end : `float`, optional
132 Instrument rotation angle at the end of the exposure.
133 If not provided, the returned array will reflect a snapshot at
134 `angle_start`.
136 Returns
137 -------
138 array : `numpy.ndarray`
139 A stray-light background image for this exposure.
140 """
141 raise NotImplementedError("Must be implemented by subclasses.")