2323import numpy as np
2424
2525from lsst .pex .config import Config , Field , ListField , ConfigurableField
26- from lsst .pipe .base import Task , Struct
26+ from lsst .pipe .base import Task , Struct , AlgorithmError
2727from . import SubtractBackgroundTask
2828
29- __all__ = ["ScaleVarianceConfig" , "ScaleVarianceTask" ]
29+ __all__ = ["ScaleVarianceConfig" , "ScaleVarianceTask" , "ExceedsMaxVarianceScaleError" ]
30+
31+
32+ class ExceedsMaxVarianceScaleError (AlgorithmError ):
33+ """Raised if ScaleVariance exceeds a specified threshold.
34+
35+ Parameters
36+ ----------
37+ maxScaling: `float`
38+ Maximum variance scaling.
39+ """
40+ def __init__ (self , scaleVarianceValue , scaleVarianceLimit , ** kwargs ):
41+ msg = (f"Variance rescaling factor ({ scaleVarianceValue } ) exceeds configured limit "
42+ f"({ scaleVarianceLimit } )" )
43+
44+ self .msg = msg
45+ self ._metadata = kwargs
46+ super ().__init__ (msg , ** kwargs )
47+ self ._metadata ["scaleVarianceValue" ] = scaleVarianceValue
48+ self ._metadata ["scaleVarianceLimit" ] = scaleVarianceLimit
49+
50+ def __str__ (self ):
51+ # Exception doesn't handle **kwargs, so we need a custom str.
52+ return f"{ self .msg } : { self .metadata } "
53+
54+ @property
55+ def metadata (self ):
56+ for key , value in self ._metadata .items ():
57+ if not (isinstance (value , int ) or isinstance (value , float ) or isinstance (value , str )):
58+ raise TypeError (f"{ key } is of type { type (value )} , but only (int, float, str) are allowed." )
59+ return self ._metadata
3060
3161
3262class ScaleVarianceConfig (Config ):
@@ -108,7 +138,7 @@ def run(self, maskedImage):
108138
109139 Raises
110140 ------
111- RuntimeError
141+ ExceedsMaxVarianceScaleError
112142 If the estimated variance rescaling factor by both methods exceed the
113143 configured limit.
114144
@@ -125,8 +155,7 @@ def run(self, maskedImage):
125155 "trying image-based method" , factor , self .config .limit )
126156 factor = self .imageBased (maskedImage )
127157 if factor > self .config .limit :
128- raise RuntimeError ("Variance rescaling factor (%f) exceeds configured limit (%f)" %
129- (factor , self .config .limit ))
158+ raise ExceedsMaxVarianceScaleError (factor , self .config .limit )
130159 self .log .info ("Renormalizing variance by %f" , factor )
131160 maskedImage .variance *= factor
132161 return factor
0 commit comments