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

24 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-04-15 10:19 +0000

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

21 

22__all__ = ["StrayLightConfig", "StrayLightTask", "StrayLightData"] 

23 

24from abc import abstractmethod 

25from typing import Optional 

26 

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

28from lsst.pipe.base import Task 

29from lsst.geom import Angle 

30from .isrFunctions import checkFilter 

31from .calibType import IsrCalib 

32 

33 

34class StrayLightConfig(Config): 

35 doRotatorAngleCorrection = Field( 

36 dtype=bool, 

37 doc="", 

38 default=False, 

39 ) 

40 # TODO DM-28093: change the doc to specify that these are physical labels 

41 filters = ListField( 

42 dtype=str, 

43 doc="Filters that need straylight correction.", 

44 default=[], 

45 ) 

46 

47 

48class StrayLightTask(Task): 

49 """Remove stray light from instruments. 

50 

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

52 """ 

53 ConfigClass = StrayLightConfig 

54 _DefaultName = "isrStrayLight" 

55 

56 def check(self, exposure): 

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

58 

59 Parameters 

60 ---------- 

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

62 Exposure to correct. 

63 """ 

64 return False 

65 

66 def run(self, exposure, strayLightData): 

67 """Correct stray light. 

68 

69 Parameters 

70 ---------- 

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

72 Exposure to correct. 

73 strayLightData : `object`, optional 

74 An opaque object that contains any calibration data used to 

75 correct for stray light. 

76 """ 

77 raise NotImplementedError("Must be implemented by subclasses.") 

78 

79 def checkFilter(self, exposure): 

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

81 

82 Parameters 

83 ---------- 

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

85 Exposure to check the filter of. 

86 

87 Returns 

88 ------- 

89 needsFringe : `bool` 

90 If True, then the exposure has a filter listed in the 

91 configuration, and should have the fringe applied. 

92 """ 

93 return checkFilter(exposure, self.config.filters, log=self.log) 

94 

95 

96class StrayLightData(IsrCalib): 

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

98 """ 

99 

100 @abstractmethod 

101 def evaluate(self, angle_start: Angle, angle_end: Optional[Angle] = None): 

102 """Get a stray light array for a range of rotator angles. 

103 

104 Parameters 

105 ---------- 

106 angle_begin : `float` 

107 Instrument rotation angle at the start of the exposure. 

108 angle_end : `float`, optional 

109 Instrument rotation angle at the end of the exposure. 

110 If not provided, the returned array will reflect a snapshot at 

111 `angle_start`. 

112 

113 Returns 

114 ------- 

115 array : `numpy.ndarray` 

116 A stray-light background image for this exposure. 

117 """ 

118 raise NotImplementedError("Must be implemented by subclasses.")