Coverage for tests/test_diff_matched_tract_catalog.py: 24%

Shortcuts on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

70 statements  

1# This file is part of pipe_tasks. 

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 

23import unittest 

24import lsst.utils.tests 

25 

26import lsst.afw.geom as afwGeom 

27from lsst.meas.astrom import ConvertCatalogCoordinatesConfig 

28from lsst.pipe.tasks.diff_matched_tract_catalog import ( 

29 DiffMatchedTractCatalogConfig, DiffMatchedTractCatalogTask, MatchedCatalogFluxesConfig, 

30) 

31 

32import numpy as np 

33import os 

34import pandas as pd 

35 

36 

37def _error_format(column): 

38 return f'{column}Err' 

39 

40 

41class DiffMatchedTractCatalogTaskTestCase(lsst.utils.tests.TestCase): 

42 """DiffMatchedTractCatalogTask test case.""" 

43 def setUp(self): 

44 ra = np.array([-5.1, -2.2, 0., 3.1, -3.2]) 

45 dec = np.array([-4.15, 1.15, 0, 2.15, -7.15]) 

46 mag_g = np.array([23., 24., 25., 25.5, 26.]) 

47 mag_r = mag_g + [0.5, -0.2, -0.8, -0.5, -1.5] 

48 

49 coord_format = ConvertCatalogCoordinatesConfig 

50 zeropoint = coord_format.mag_zeropoint_ref.default 

51 fluxes = tuple(10**(-0.4*(mag - zeropoint)) for mag in (mag_g, mag_r)) 

52 # Percent error in measurement 

53 err_flux = np.array((0.02, 0.015, -0.035, 0.02, -0.04)) 

54 # Absolute error 

55 eps_coord = np.array((2.3, 0.6, -1.7, 3.6, -2.4)) 

56 err_coord = np.full_like(eps_coord, 0.02) 

57 eps_coord *= err_coord 

58 extended_ref = [True, False, True, False, True] 

59 extended_target = [False, False, True, True, True] 

60 flags = np.ones_like(eps_coord, dtype=bool) 

61 

62 bands = ['g', 'r'] 

63 

64 columns_flux = [f'flux_{band}' for band in bands] 

65 columns_flux_err = [_error_format(column) for column in columns_flux] 

66 

67 column_ra_ref = coord_format.column_ref_coord1.default 

68 column_dec_ref = coord_format.column_ref_coord2.default 

69 column_ra_target = coord_format.column_target_coord1.default 

70 column_dec_target = coord_format.column_target_coord2.default 

71 

72 column_ra_target_err, column_dec_target_err = [ 

73 _error_format(col) for col in (column_ra_target, column_dec_target) 

74 ] 

75 

76 data_ref = { 

77 column_ra_ref: ra[::-1], 

78 column_dec_ref: dec[::-1], 

79 columns_flux[0]: fluxes[0][::-1], 

80 columns_flux[1]: fluxes[1][::-1], 

81 DiffMatchedTractCatalogConfig.column_ref_extended.default: extended_ref, 

82 } 

83 self.catalog_ref = pd.DataFrame(data=data_ref) 

84 

85 data_target = { 

86 column_ra_target: ra + eps_coord, 

87 column_dec_target: dec + eps_coord, 

88 column_ra_target_err: err_coord, 

89 column_dec_target_err: err_coord, 

90 columns_flux[0]: fluxes[0]*(1 + err_flux), 

91 columns_flux[1]: fluxes[1]*(1 + err_flux), 

92 _error_format(columns_flux[0]): np.sqrt(fluxes[0]), 

93 _error_format(columns_flux[1]): np.sqrt(fluxes[1]), 

94 DiffMatchedTractCatalogConfig.columns_target_select_true.default[0]: flags, 

95 DiffMatchedTractCatalogConfig.columns_target_select_false.default[0]: ~flags, 

96 DiffMatchedTractCatalogConfig.column_target_extended.default: extended_target, 

97 } 

98 self.catalog_target = pd.DataFrame(data=data_target) 

99 

100 self.catalog_match_ref = pd.DataFrame(data={ 

101 'match_candidate': flags, 

102 'match_row': np.arange(len(ra))[::-1], 

103 }) 

104 

105 self.catalog_match_target = pd.DataFrame(data={ 

106 'match_candidate': flags, 

107 'match_row': np.arange(len(ra))[::-1], 

108 }) 

109 

110 self.diff_matched = np.loadtxt( 

111 os.path.join(os.path.dirname(__file__), "data", "test_diff_matched.txt") 

112 ) 

113 

114 columns_flux_configs = { 

115 band: MatchedCatalogFluxesConfig( 

116 column_ref_flux=columns_flux[idx], 

117 columns_target_flux=[columns_flux[idx]], 

118 columns_target_flux_err=[columns_flux_err[idx]], 

119 ) 

120 for idx, band in enumerate(bands) 

121 } 

122 

123 self.task = DiffMatchedTractCatalogTask(config=DiffMatchedTractCatalogConfig( 

124 columns_target_coord_err=[column_ra_target_err, column_dec_target_err], 

125 columns_flux=columns_flux_configs, 

126 mag_num_bins=1, 

127 )) 

128 self.wcs = afwGeom.makeSkyWcs(crpix=lsst.geom.Point2D(9000, 9000), 

129 crval=lsst.geom.SpherePoint(180., 0., lsst.geom.degrees), 

130 cdMatrix=afwGeom.makeCdMatrix(scale=0.2*lsst.geom.arcseconds)) 

131 

132 def tearDown(self): 

133 del self.catalog_ref 

134 del self.catalog_target 

135 del self.catalog_match_ref 

136 del self.catalog_match_target 

137 del self.diff_matched 

138 del self.task 

139 del self.wcs 

140 

141 def test_DiffMatchedTractCatalogTask(self): 

142 # These tables will have columns added to them in run 

143 columns_ref, columns_target = (list(x.columns) for x in (self.catalog_ref, self.catalog_target)) 

144 result = self.task.run( 

145 catalog_ref=self.catalog_ref, 

146 catalog_target=self.catalog_target, 

147 catalog_match_ref=self.catalog_match_ref, 

148 catalog_match_target=self.catalog_match_target, 

149 wcs=self.wcs, 

150 ) 

151 columns_expect = columns_target 

152 prefix = DiffMatchedTractCatalogConfig.column_matched_prefix_ref.default 

153 columns_expect.append(f'{prefix}index') 

154 columns_expect.extend((f'{prefix}{col}' for col in columns_ref)) 

155 self.assertEqual(columns_expect, list(result.cat_matched.columns)) 

156 row = result.diff_matched.iloc[0].values 

157 self.assertEqual(len(row), len(self.diff_matched)) 

158 self.assertEqual(np.sum(row.astype(float) != self.diff_matched), 0) 

159 

160 

161class MemoryTester(lsst.utils.tests.MemoryTestCase): 

162 pass 

163 

164 

165def setup_module(module): 

166 lsst.utils.tests.init() 

167 

168 

169if __name__ == "__main__": 169 ↛ 170line 169 didn't jump to line 170, because the condition on line 169 was never true

170 lsst.utils.tests.init() 

171 unittest.main()