Hide keyboard shortcuts

Hot-keys 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

1from __future__ import with_statement 

2from builtins import next 

3from builtins import object 

4import os 

5import numpy as np 

6import unittest 

7import lsst.utils.tests 

8 

9from lsst.utils import getPackageDir 

10from lsst.sims.catalogs.db import fileDBObject 

11from lsst.sims.utils import ObservationMetaData 

12from lsst.sims.catalogs.definitions import InstanceCatalog 

13from lsst.sims.catalogs.decorators import compound 

14from lsst.sims.catUtils.mixins import PhotometryStars 

15from lsst.sims.photUtils import BandpassDict, Bandpass, Sed, PhotometricParameters, calcMagError_m5 

16 

17 

18def setup_module(module): 

19 lsst.utils.tests.init() 

20 

21 

22class PhotometryCartoon(object): 

23 

24 @compound('cartoon_u', 'cartoon_g', 'cartoon_r', 'cartoon_i', 'cartoon_z') 

25 def get_cartoon_mags(self): 

26 if not hasattr(self, 'cartoonBandpassDict'): 

27 

28 bandpassDir = os.path.join(getPackageDir('sims_photUtils'), 'tests', 'cartoonSedTestData') 

29 

30 self.cartoonBandpassDict = \ 

31 BandpassDict.loadTotalBandpassesFromFiles(bandpassNames = ['u', 'g', 'r', 'i', 'z'], 

32 bandpassDir = bandpassDir, 

33 bandpassRoot = 'test_bandpass_') 

34 

35 return self._quiescentMagnitudeGetter(self.cartoonBandpassDict, self.get_cartoon_mags._colnames) 

36 

37 @compound('sigma_cartoon_u', 'sigma_cartoon_g', 'sigma_cartoon_r', 'sigma_cartoon_i', 'sigma_cartoon_z') 

38 def get_cartoon_uncertainty(self): 

39 return self._magnitudeUncertaintyGetter(['cartoon_u', 'cartoon_g', 'cartoon_r', 

40 'cartoon_i', 'cartoon_z'], 

41 ['c_u', 'c_g', 'c_r', 'c_i', 'c_z', 'c_y'], 

42 'cartoonBandpassDict') 

43 

44 

45class CartoonStars(InstanceCatalog, PhotometryStars, PhotometryCartoon): 

46 catalog_type = __file__ + 'cartoon_stars' 

47 column_outputs = ['cartoon_u', 'cartoon_g', 

48 'sigma_cartoon_u', 'sigma_cartoon_g'] 

49 

50 default_formats = {'f': '%.13f'} 

51 

52 

53class CartoonUncertaintyTestCase(unittest.TestCase): 

54 """ 

55 This unit test suite will verify that our 'arbitrarily extensible' framework 

56 for writing magnitude uncertainty getters actually behaves as advertised 

57 """ 

58 

59 def setUp(self): 

60 self.normband = Bandpass() 

61 self.normband.imsimBandpass() 

62 self.uband = Bandpass() 

63 self.uband.readThroughput(os.path.join(getPackageDir('sims_photUtils'), 'tests', 

64 'cartoonSedTestData', 'test_bandpass_u.dat')) 

65 self.gband = Bandpass() 

66 self.gband.readThroughput(os.path.join(getPackageDir('sims_photUtils'), 'tests', 

67 'cartoonSedTestData', 'test_bandpass_g.dat')) 

68 

69 def test_stars(self): 

70 obs = ObservationMetaData(bandpassName=['c_u', 'c_g'], m5=[25.0, 26.0]) 

71 

72 db_dtype = np.dtype([('id', np.int), 

73 ('raJ2000', np.float), 

74 ('decJ2000', np.float), 

75 ('sedFilename', str, 100), 

76 ('magNorm', np.float), 

77 ('galacticAv', np.float)]) 

78 

79 inputDir = os.path.join(getPackageDir('sims_catUtils'), 'tests', 'testData') 

80 inputFile = os.path.join(inputDir, 'IndicesTestCatalogStars.txt') 

81 db = fileDBObject(inputFile, dtype=db_dtype, runtable='test', idColKey='id') 

82 cat = CartoonStars(db, obs_metadata=obs) 

83 with lsst.utils.tests.getTempFilePath('.txt') as catName: 

84 cat.write_catalog(catName) 

85 dtype = np.dtype([(name, np.float) for name in cat.column_outputs]) 

86 controlData = np.genfromtxt(catName, dtype=dtype, delimiter=',') 

87 

88 db_columns = db.query_columns(['id', 'raJ2000', 'decJ2000', 'sedFilename', 'magNorm', 'galacticAv']) 

89 

90 sedDir = os.path.join(getPackageDir('sims_sed_library'), 'starSED', 'kurucz') 

91 

92 for ix, line in enumerate(next(db_columns)): 

93 spectrum = Sed() 

94 spectrum.readSED_flambda(os.path.join(sedDir, line[3])) 

95 fnorm = spectrum.calcFluxNorm(line[4], self.normband) 

96 spectrum.multiplyFluxNorm(fnorm) 

97 a_x, b_x = spectrum.setupCCM_ab() 

98 spectrum.addDust(a_x, b_x, A_v=line[5]) 

99 umag = spectrum.calcMag(self.uband) 

100 self.assertAlmostEqual(umag, controlData['cartoon_u'][ix], 3) 

101 gmag = spectrum.calcMag(self.gband) 

102 self.assertAlmostEqual(gmag, controlData['cartoon_g'][ix], 3) 

103 umagError, gamma = calcMagError_m5(umag, self.uband, obs.m5['c_u'], PhotometricParameters()) 

104 gmagError, gamma = calcMagError_m5(gmag, self.gband, obs.m5['c_g'], PhotometricParameters()) 

105 self.assertAlmostEqual(umagError, controlData['sigma_cartoon_u'][ix], 3) 

106 self.assertAlmostEqual(gmagError, controlData['sigma_cartoon_g'][ix], 3) 

107 

108 def test_mixed_stars(self): 

109 """ 

110 Here we will test the (somewhat absurd) case of a catalog with two different bandpasses 

111 (lsst_ and cartoon_) in order to verify that gamma values are being cached correctly 

112 """ 

113 

114 lsst_u_band = Bandpass() 

115 lsst_u_band.readThroughput(os.path.join(getPackageDir('throughputs'), 'baseline', 'total_u.dat')) 

116 lsst_g_band = Bandpass() 

117 lsst_g_band.readThroughput(os.path.join(getPackageDir('throughputs'), 'baseline', 'total_g.dat')) 

118 

119 obs = ObservationMetaData(bandpassName=['c_u', 'c_g', 'u', 'g'], 

120 m5=[25.0, 26.0, 15.0, 16.0]) 

121 # make the difference in m5 between the two bandpass systems extreme 

122 # so that, in the unit test, we can be sure that the correct values 

123 # are being used for the correct getters 

124 

125 db_dtype = np.dtype([('id', np.int), 

126 ('raJ2000', np.float), 

127 ('decJ2000', np.float), 

128 ('sedFilename', str, 100), 

129 ('magNorm', np.float), 

130 ('galacticAv', np.float)]) 

131 

132 inputDir = os.path.join(getPackageDir('sims_catUtils'), 'tests', 'testData') 

133 inputFile = os.path.join(inputDir, 'IndicesTestCatalogStars.txt') 

134 db = fileDBObject(inputFile, dtype=db_dtype, runtable='test', idColKey='id') 

135 cat = CartoonStars(db, obs_metadata=obs, column_outputs=['lsst_u', 'lsst_g', 

136 'sigma_lsst_u', 'sigma_lsst_g']) 

137 with lsst.utils.tests.getTempFilePath('.txt') as catName: 

138 cat.write_catalog(catName) 

139 dtype = np.dtype([(name, np.float) for name in cat._column_outputs]) 

140 controlData = np.genfromtxt(catName, dtype=dtype, delimiter=',') 

141 

142 db_columns = db.query_columns(['id', 'raJ2000', 'decJ2000', 'sedFilename', 'magNorm', 'galacticAv']) 

143 

144 sedDir = os.path.join(getPackageDir('sims_sed_library'), 'starSED', 'kurucz') 

145 

146 for ix, line in enumerate(next(db_columns)): 

147 spectrum = Sed() 

148 spectrum.readSED_flambda(os.path.join(sedDir, line[3])) 

149 fnorm = spectrum.calcFluxNorm(line[4], self.normband) 

150 spectrum.multiplyFluxNorm(fnorm) 

151 a_x, b_x = spectrum.setupCCM_ab() 

152 spectrum.addDust(a_x, b_x, A_v=line[5]) 

153 umag = spectrum.calcMag(self.uband) 

154 self.assertAlmostEqual(umag, controlData['cartoon_u'][ix], 3) 

155 gmag = spectrum.calcMag(self.gband) 

156 self.assertAlmostEqual(gmag, controlData['cartoon_g'][ix], 3) 

157 lsst_umag = spectrum.calcMag(lsst_u_band) 

158 self.assertAlmostEqual(lsst_umag, controlData['lsst_u'][ix], 3) 

159 lsst_gmag = spectrum.calcMag(lsst_g_band) 

160 self.assertAlmostEqual(lsst_gmag, controlData['lsst_g'][ix], 3) 

161 umagError, gamma = calcMagError_m5(umag, self.uband, obs.m5['c_u'], PhotometricParameters()) 

162 gmagError, gamma = calcMagError_m5(gmag, self.gband, obs.m5['c_g'], PhotometricParameters()) 

163 self.assertAlmostEqual(umagError, controlData['sigma_cartoon_u'][ix], 3) 

164 self.assertAlmostEqual(gmagError, controlData['sigma_cartoon_g'][ix], 3) 

165 

166 lsst_umagError, gamma = calcMagError_m5(lsst_umag, lsst_u_band, 

167 obs.m5['u'], PhotometricParameters()) 

168 lsst_gmagError, gamma = calcMagError_m5(lsst_gmag, lsst_g_band, 

169 obs.m5['g'], PhotometricParameters()) 

170 

171 self.assertAlmostEqual(lsst_umagError, controlData['sigma_lsst_u'][ix], 3) 

172 self.assertAlmostEqual(lsst_gmagError, controlData['sigma_lsst_g'][ix], 3) 

173 self.assertGreater(np.abs(lsst_umagError-umagError), 0.01) 

174 self.assertGreater(np.abs(lsst_gmagError-gmagError), 0.01) 

175 

176 

177class MemoryTestClass(lsst.utils.tests.MemoryTestCase): 

178 pass 

179 

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

181 lsst.utils.tests.init() 

182 unittest.main()