Hide keyboard shortcuts

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 

23 

24from lsst.pex.config import Config, Field, ListField 

25from lsst.pipe.base import Task 

26from lsst.geom import Angle 

27 

28 

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 ) 

40 

41 

42class StrayLightTask(Task): 

43 """Remove stray light from instruments. 

44 

45 This is a dummy task to be retargeted with an camera-specific version. 

46 """ 

47 ConfigClass = StrayLightConfig 

48 _DefaultName = "isrStrayLight" 

49 

50 def readIsrData(self, dataRef, rawExposure): 

51 """Read and return calibration products relevant for correcting 

52 stray light in the given exposure. 

53 

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. 

62 

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. 

71 

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 

78 

79 def check(self, exposure): 

80 """Check if stray light correction should be run. 

81 

82 Parameters 

83 ---------- 

84 exposure : `lsst.afw.image.Exposure` 

85 Exposure to correct. 

86 """ 

87 return False 

88 

89 def run(self, exposure, strayLightData): 

90 """Correct stray light. 

91 

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.") 

101 

102 def checkFilter(self, exposure): 

103 """Check whether we should fringe-subtract the science exposure. 

104 

105 Parameters 

106 ---------- 

107 exposure : `lsst.afw.image.Exposure` 

108 Exposure to check the filter of. 

109 

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 

117 

118 

119class StrayLightData(ABC): 

120 """An abstract base class for rotator-dependent stray light information. 

121 """ 

122 

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. 

126 

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`. 

135 

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.")