Skip to content

Commit 0a8614e

Browse files
committed
replace RuntimeError with AlgorithmError
1 parent 8c0b9db commit 0a8614e

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

python/lsst/meas/algorithms/scaleVariance.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,40 @@
2323
import numpy as np
2424

2525
from 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
2727
from . 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

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

Comments
 (0)