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

23 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2022-09-03 04:03 -0700

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

27from .isrFunctions import checkFilter 

28from .calibType import IsrCalib 

29 

30 

31class StrayLightConfig(Config): 

32 doRotatorAngleCorrection = Field( 

33 dtype=bool, 

34 doc="", 

35 default=False, 

36 ) 

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

38 filters = ListField( 

39 dtype=str, 

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

41 default=[], 

42 ) 

43 

44 

45class StrayLightTask(Task): 

46 """Remove stray light from instruments. 

47 

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

49 """ 

50 ConfigClass = StrayLightConfig 

51 _DefaultName = "isrStrayLight" 

52 

53 def check(self, exposure): 

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

55 

56 Parameters 

57 ---------- 

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

59 Exposure to correct. 

60 """ 

61 return False 

62 

63 def run(self, exposure, strayLightData): 

64 """Correct stray light. 

65 

66 Parameters 

67 ---------- 

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

69 Exposure to correct. 

70 strayLightData : `object`, optional 

71 An opaque object that contains any calibration data used to 

72 correct for stray light. 

73 """ 

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

75 

76 def checkFilter(self, exposure): 

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

78 

79 Parameters 

80 ---------- 

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

82 Exposure to check the filter of. 

83 

84 Returns 

85 ------- 

86 needsFringe : `bool` 

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

88 configuration, and should have the fringe applied. 

89 """ 

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

91 

92 

93class StrayLightData(IsrCalib): 

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

95 """ 

96 

97 @abstractmethod 

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

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

100 

101 Parameters 

102 ---------- 

103 angle_begin : `float` 

104 Instrument rotation angle at the start of the exposure. 

105 angle_end : `float`, optional 

106 Instrument rotation angle at the end of the exposure. 

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

108 `angle_start`. 

109 

110 Returns 

111 ------- 

112 array : `numpy.ndarray` 

113 A stray-light background image for this exposure. 

114 """ 

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