Coverage for python/lsst/meas/astrom/sip/sourceMatchStatistics.py: 8%

31 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-13 17:00 -0700

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010 LSST Corporation. 

4# 

5# This product includes software developed by the 

6# LSST Project (http://www.lsst.org/). 

7# 

8# This program is free software: you can redistribute it and/or modify 

9# it under the terms of the GNU General Public License as published by 

10# the Free Software Foundation, either version 3 of the License, or 

11# (at your option) any later version. 

12# 

13# This program is distributed in the hope that it will be useful, 

14# but WITHOUT ANY WARRANTY; without even the implied warranty of 

15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

16# GNU General Public License for more details. 

17# 

18# You should have received a copy of the LSST License Statement and 

19# the GNU General Public License along with this program. If not, 

20# see <http://www.lsstcorp.org/LegalNotices/>. 

21# 

22 

23__all__ = ["sourceMatchStatistics"] 

24 

25import numpy as np 

26 

27 

28def sourceMatchStatistics(matchList, log=None): 

29 """Compute statistics on the accuracy of a wcs solution, using a 

30 precomputed list of matches between an image and a catalog. 

31 

32 Parameters 

33 ---------- 

34 matchList : `lsst.afw.detection.SourceMatch` 

35 List of matches between sources and references to compute statistics 

36 on. 

37 

38 Returns 

39 ------- 

40 values : `dict 

41 Value dictionary with fields: 

42 

43 - diffInPixels_mean : Average distance between image and 

44 catalog position in pixels (`float`). 

45 - diffInPixels_std : Root mean square of distribution of distances 

46 (`float`). 

47 - diffInPixels_Q25 : 25% quantile boundary of the match dist 

48 distribution (`float`). 

49 - diffInPixels_Q50 : 50% quantile boundary of the match dist 

50 distribution (`float`). 

51 - diffInPixels_Q75 : 75% quantile boundary of the match 

52 dist distribution (`float`). 

53 """ 

54 

55 size = len(matchList) 

56 if size == 0: 

57 raise ValueError("matchList contains no elements") 

58 

59 dist = np.zeros(size) 

60 i = 0 

61 for match in matchList: 

62 catObj = match.first 

63 srcObj = match.second 

64 

65 cx = catObj.getXAstrom() 

66 cy = catObj.getYAstrom() 

67 

68 sx = srcObj.getXAstrom() 

69 sy = srcObj.getYAstrom() 

70 

71 dist[i] = np.hypot(cx-sx, cy-sy) 

72 i = i+1 

73 

74 dist.sort() 

75 

76 quartiles = [] 

77 for f in (0.25, 0.50, 0.75): 

78 i = int(f*size + 0.5) 

79 if i >= size: 

80 i = size - 1 

81 quartiles.append(dist[i]) 

82 

83 values = {} 

84 values['diffInPixels_Q25'] = quartiles[0] 

85 values['diffInPixels_Q50'] = quartiles[1] 

86 values['diffInPixels_Q75'] = quartiles[2] 

87 values['diffInPixels_mean'] = dist.mean() 

88 values['diffInPixels_std'] = dist.std() 

89 

90 return values