Coverage for python / lsst / meas / algorithms / computeExPsf.py: 41%

35 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-18 08:51 +0000

1# This file is part of meas_algorithms. 

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 

23from lsst.meas.algorithms.treecorrUtils import TreecorrConfig 

24from lsst.pex.config import Config, ConfigField 

25from lsst.pipe.base import Task 

26import lsst.pipe.base as pipeBase 

27import treecorr 

28import copy 

29import numpy.typing as npt 

30 

31 

32__all__ = ("ComputeExPsfTask", "ComputeExPsfConfig") 

33 

34 

35class ComputeExPsfConfig(Config): 

36 """Config class of ComputeExPsfTask.""" 

37 

38 treecorr = ConfigField( 

39 dtype=TreecorrConfig, 

40 doc="treecorr config.", 

41 ) 

42 

43 def setDefaults(self): 

44 super().setDefaults() 

45 

46 self.treecorr.min_sep = 1.0 / 60.0 

47 self.treecorr.max_sep = 5.0 / 60.0 

48 self.treecorr.nbins = 1 

49 self.treecorr.bin_type = "Linear" 

50 self.treecorr.sep_units = "degree" 

51 

52 

53class ComputeExPsfTask(Task): 

54 """Compute Ex for PSF. 

55 

56 Compute scalar correlation function from 

57 PSF ellipticity residuals to compute TEx 

58 metrics. 

59 

60 Parameters 

61 ---------- 

62 de1: `np.ndarray` 

63 PSF ellipticity residuals component 1. 

64 de2: `np.ndarray` 

65 PSF ellipticity residuals component 2. 

66 ra: `np.ndarray` 

67 Right ascension coordinate. 

68 dec: `np.ndarray` 

69 Declination coordinate. 

70 units: `str` 

71 In which units are ra and dec. units supported 

72 are the same as the one in treecorr. 

73 

74 Returns 

75 ------- 

76 struct : `lsst.pipe.base.Struct` 

77 The struct contains the following data: 

78 ``E1``: `float` 

79 <de1 de1> scalar correlation function, compute 

80 in an angular bin define in TreecorrConfig. 

81 ``E2``: `float` 

82 <de2 de2> scalar correlation function, compute 

83 in an angular bin define in TreecorrConfig. 

84 ``Ex``: `float` 

85 <de1 de2> scalar cross-correlation function, compute 

86 in an angular bin define in TreecorrConfig. 

87 """ 

88 

89 ConfigClass = ComputeExPsfConfig 

90 _DefaultName = "computeExPsf" 

91 

92 def run( 

93 self, 

94 de1: npt.NDArray, 

95 de2: npt.NDArray, 

96 ra: npt.NDArray, 

97 dec: npt.NDArray, 

98 units: str = "arcmin", 

99 ) -> pipeBase.Struct: 

100 

101 if units != self.config.treecorr.sep_units: 

102 raise ValueError( 

103 "units from ComputeExPsfConfig and" 

104 "ComputeExPsfTask are not the same (%s != %s)" 

105 % ((units, self.config.treecorr.sep_units)) 

106 ) 

107 

108 kwargs_cat = { 

109 "ra": ra, 

110 "dec": dec, 

111 "ra_units": units, 

112 "dec_units": units, 

113 } 

114 

115 cat1 = treecorr.Catalog(k=de1, **kwargs_cat) 

116 cat2 = treecorr.Catalog(k=de2, **kwargs_cat) 

117 

118 config_kk = self.config.treecorr.toDict() 

119 

120 kk = treecorr.KKCorrelation(config_kk) 

121 

122 kk.process(cat1) 

123 kk_E1 = copy.deepcopy(kk.xi[0]) 

124 kk.process(cat2) 

125 kk_E2 = copy.deepcopy(kk.xi[0]) 

126 kk.process(cat1, cat2) 

127 kk_Ex = copy.deepcopy(kk.xi[0]) 

128 

129 return pipeBase.Struct(metric_E1=kk_E1, metric_E2=kk_E2, metric_Ex=kk_Ex)