21 from abc 
import ABC, abstractmethod
 
   22 from typing 
import Optional
 
   24 from lsst.pex.config 
import Config, Field, ListField
 
   30     doRotatorAngleCorrection = Field(
 
   37         doc=
"Filters that need straylight correction.",
 
   43     """Remove stray light from instruments. 
   45     This is a dummy task to be retargeted with an camera-specific version. 
   47     ConfigClass = StrayLightConfig
 
   48     _DefaultName = 
"isrStrayLight" 
   51         """Read and return calibration products relevant for correcting 
   52         stray light in the given exposure. 
   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 
   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. 
   74         This method will be called only when `IsrTask` is run by the Gen2 
   75         Middleware (i.e. CmdLineTask). 
   80         """Check if stray light correction should be run. 
   84         exposure : `lsst.afw.image.Exposure` 
   89     def run(self, exposure, strayLightData):
 
   90         """Correct stray light. 
   94         exposure : `lsst.afw.image.Exposure` 
   96         strayLightData : `object`, optional 
   97             An opaque object that contains any calibration data used to 
   98             correct for stray light. 
  100         raise NotImplementedError(
"Must be implemented by subclasses.")
 
  103         """Check whether we should fringe-subtract the science exposure. 
  107         exposure : `lsst.afw.image.Exposure` 
  108             Exposure to check the filter of. 
  113             If True, then the exposure has a filter listed in the 
  114             configuration, and should have the fringe applied. 
  120     """An abstract base class for rotator-dependent stray light information. 
  124     def evaluate(self, angle_start: Angle, angle_end: Optional[Angle] = 
None):
 
  125         """Get a stray light array for a range of rotator angles. 
  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 
  138         array : `numpy.ndarray` 
  139             A stray-light background image for this exposure. 
  141         raise NotImplementedError(
"Must be implemented by subclasses.")