Coverage for python/lsst/meas/astrom/exceptions.py: 43%

24 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2024-04-25 18:23 +0000

1# This file is part of meas_astrom. 

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__ = ["AstrometryError", "AstrometryFitFailure", "BadAstrometryFit", "MatcherFailure"] 

23 

24import lsst.pipe.base 

25 

26 

27class AstrometryError(lsst.pipe.base.AlgorithmError): 

28 """Parent class for failures in astrometric fitting. 

29 

30 Parameters 

31 ---------- 

32 msg : `str` 

33 Informative message about the nature of the error. 

34 **kwargs 

35 All other arguments are added to a ``_metadata`` attribute, which is 

36 used to generate the metadata property for Task annotation. 

37 """ 

38 def __init__(self, msg, **kwargs): 

39 self.msg = msg 

40 self._metadata = kwargs 

41 super().__init__(msg, kwargs) 

42 

43 def __str__(self): 

44 # Exception doesn't handle **kwargs, so we need a custom str. 

45 return f"{self.msg}: {self.metadata}" 

46 

47 @property 

48 def metadata(self): 

49 for key, value in self._metadata.items(): 

50 if not (isinstance(value, int) or isinstance(value, float) or isinstance(value, str)): 

51 raise TypeError(f"{key} is of type {type(value)}, but only (int, float, str) are allowed.") 

52 return self._metadata 

53 

54 

55class BadAstrometryFit(AstrometryError): 

56 """Raised if the quality of the astrometric fit is worse than some 

57 threshold. 

58 

59 Parameters 

60 ---------- 

61 distMean : `float` 

62 Mean on-sky separation of matched sources, in arcseconds. 

63 distMedian : `float` 

64 Median on-sky separation of matched sources, in arcseconds. 

65 """ 

66 def __init__(self, distMean, maxMeanDist, distMedian, **kwargs): 

67 msg = f'Poor quality astrometric fit, {distMean}" > {maxMeanDist}"' 

68 super().__init__(msg, **kwargs) 

69 self._metadata["distMean"] = distMean 

70 self._metadata["maxMeanDist"] = distMean 

71 self._metadata["distMedian"] = distMedian 

72 

73 

74class AstrometryFitFailure(AstrometryError): 

75 """Raised if the astrometry fitter fails.""" 

76 

77 

78class MatcherFailure(AstrometryError): 

79 """Raised if the matcher fails."""