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

1# This file is part of obs_decam. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (http://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 <http://www.gnu.org/licenses/>. 

21 

22"""Unit tests for gen3 DECam raw data ingest. 

23""" 

24 

25import unittest 

26import os 

27import lsst.utils.tests 

28 

29from lsst.daf.butler import Butler, DataCoordinate 

30from lsst.obs.base.ingest_tests import IngestTestBase 

31import lsst.obs.decam 

32 

33testDataPackage = "testdata_decam" 

34try: 

35 testDataDirectory = lsst.utils.getPackageDir(testDataPackage) 

36except LookupError: 

37 testDataDirectory = None 

38 

39 

40class DecamTestBase(IngestTestBase): 

41 

42 ingestDir = os.path.dirname(__file__) 

43 instrumentClassName = "lsst.obs.decam.DarkEnergyCamera" 

44 rawIngestTask = "lsst.obs.decam.DecamRawIngestTask" 

45 

46 

47@unittest.skipIf(testDataDirectory is None, "testdata_decam must be set up") 

48class DecamIngestTestCase(DecamTestBase, lsst.utils.tests.TestCase): 

49 

50 curatedCalibrationDatasetTypes = ("camera", "defects") 

51 

52 # DecamRawIngestTask ingests every detector in each raw file, so we 

53 # only have to specify one file here, but should get two dataIds 

54 # in the output repo. 

55 @property 

56 def file(self): 

57 return os.path.join(testDataDirectory, "rawData", "raw", "raw.fits") 

58 

59 dataIds = [dict(instrument="DECam", exposure=229388, detector=25), 

60 dict(instrument="DECam", exposure=229388, detector=1)] 

61 filterLabel = lsst.afw.image.FilterLabel(physical="z DECam SDSS c0004 9260.0 1520.0", band="z") 

62 

63 @property 

64 def visits(self): 

65 butler = Butler(self.root, collections=[self.outputRun]) 

66 return { 

67 DataCoordinate.standardize( 

68 instrument="DECam", 

69 visit=229388, 

70 universe=butler.registry.dimensions 

71 ): [ 

72 DataCoordinate.standardize( 

73 instrument="DECam", 

74 exposure=229388, 

75 universe=butler.registry.dimensions 

76 ) 

77 ] 

78 } 

79 

80 

81@unittest.skipIf(testDataDirectory is None, "testdata_decam must be set up") 

82class DecamIngestFullFileTestCase(DecamTestBase, lsst.utils.tests.TestCase): 

83 """Test ingesting a file that contains all "normal" DECam HDUs. 

84 """ 

85 

86 # No need to test writeCuratedCalibrations again 

87 curatedCalibrationDatasetTypes = None 

88 

89 # DecamRawIngestTask ingests every detector in each raw file, so we 

90 # only have to specify one file here, but should get many dataIds 

91 # in the output repo. 

92 @property 

93 def file(self): 

94 return os.path.join(testDataDirectory, "rawData", "raw", "c4d_150227_012718_ori-stripped.fits.fz") 

95 

96 dataIds = [{"instrument": "DECam", "exposure": 415282, "detector": i} for i in range(1, 63)] 

97 filterLabel = lsst.afw.image.FilterLabel(physical="r DECam SDSS c0002 6415.0 1480.0", band="r") 

98 

99 @property 

100 def visits(self): 

101 butler = Butler(self.root, collections=[self.outputRun]) 

102 return { 

103 DataCoordinate.standardize( 

104 instrument="DECam", 

105 visit=415282, 

106 universe=butler.registry.dimensions 

107 ): [ 

108 DataCoordinate.standardize( 

109 instrument="DECam", 

110 exposure=415282, 

111 universe=butler.registry.dimensions 

112 ) 

113 ] 

114 } 

115 

116 def checkRepo(self, files=None): 

117 """Additional tests run on post-ingest repos. 

118 

119 See base class for additional information; note that using this hook 

120 rather than adding a new test_ method saves us from having to (slowly) 

121 run ingest again just to get a useful to repo to test against. 

122 """ 

123 butler = Butler(self.root) 

124 # Test that packing visit+detector data IDs into integers yields 

125 # results consistent with what we have historically gotten (from Gen2). 

126 for dataId in self.dataIds: 

127 expandedDataId = butler.registry.expandDataId(dataId) 

128 packed, bits = expandedDataId.pack("exposure_detector", returnMaxBits=True) 

129 self.assertEqual(packed, int(f"{dataId['exposure']}{dataId['detector']:02}")) 

130 self.assertEqual(bits, 32) 

131 

132 

133@unittest.skipIf(testDataDirectory is None, "testdata_decam must be set up") 

134class DecamIngestShuffledFullFileTestCase(DecamTestBase, lsst.utils.tests.TestCase): 

135 """Test ingesting a file that contains all detectors in a random order. 

136 """ 

137 

138 # No need to test writeCuratedCalibrations again 

139 curatedCalibrationDatasetTypes = None 

140 

141 # DecamRawIngestTask ingests every detector in each raw file, so we 

142 # only have to specify one file here, but should get many dataIds 

143 # in the output repo. 

144 @property 

145 def file(self): 

146 return os.path.join(testDataDirectory, "rawData", "raw", 

147 "c4d_150227_012718_ori-stripped-shuffled.fits.fz") 

148 

149 dataIds = [{"instrument": "DECam", "exposure": 415282, "detector": i} for i in range(1, 63)] 

150 filterLabel = lsst.afw.image.FilterLabel(physical="r DECam SDSS c0002 6415.0 1480.0", band="r") 

151 

152 @property 

153 def visits(self): 

154 butler = Butler(self.root, collections=[self.outputRun]) 

155 return { 

156 DataCoordinate.standardize( 

157 instrument="DECam", 

158 visit=415282, 

159 universe=butler.registry.dimensions 

160 ): [ 

161 DataCoordinate.standardize( 

162 instrument="DECam", 

163 exposure=415282, 

164 universe=butler.registry.dimensions 

165 ) 

166 ] 

167 } 

168 

169 

170def setup_module(module): 

171 lsst.utils.tests.init() 

172 

173 

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

175 lsst.utils.tests.init() 

176 unittest.main()