Coverage for tests/test_formatter.py : 36%

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/>.
22"""Unit tests for gen3 DECam raw formatter, which has to determine which
23HDU a given detector is in in a multi-extension FITS file.
24"""
26import astro_metadata_translator
27import unittest
28import os
30import lsst.utils.tests
31import lsst.obs.decam
32import lsst.daf.butler
33import lsst.afw.image
35testDataPackage = "testdata_decam"
36try:
37 testDataDirectory = lsst.utils.getPackageDir(testDataPackage)
38except LookupError:
39 testDataDirectory = None
41try:
42 hitsDirectory = lsst.utils.getPackageDir("ap_verify_ci_hits2015")
43except LookupError:
44 hitsDirectory = None
47@unittest.skipIf(testDataDirectory is None, "testdata_decam must be set up")
48class DarkEnergyCameraRawFormatterTestCase(lsst.utils.tests.TestCase):
49 def setUp(self):
50 path = 'rawData/2013-09-01/z/decam0229388.fits.fz'
51 self.filename = os.path.join(testDataDirectory, path)
52 location = lsst.daf.butler.Location(testDataDirectory, path)
53 self.fileDescriptor = lsst.daf.butler.FileDescriptor(location, None)
55 def check_readMetadata(self, dataId, expected):
56 formatter = lsst.obs.decam.DarkEnergyCameraRawFormatter(self.fileDescriptor, dataId)
57 metadata = formatter.readMetadata()
58 self.assertEqual(metadata, expected)
60 def test_readMetadata(self):
61 dataId = {'detector': 25}
62 # detector 25 is in HDU 1
63 expected = lsst.afw.image.readMetadata(self.filename, 1)
64 self.assertEqual(expected['CCDNUM'], 25) # sanity check
65 self.check_readMetadata(dataId, expected)
67 dataId = {'detector': 1}
68 # detector 1 is in HDU 2
69 expected = lsst.afw.image.readMetadata(self.filename, 2)
70 astro_metadata_translator.fix_header(expected)
71 self.assertEqual(expected['CCDNUM'], 1) # sanity check
72 self.check_readMetadata(dataId, expected)
74 def test_readMetadata_raises(self):
75 dataId = {'detector': 70}
76 formatter = lsst.obs.decam.DarkEnergyCameraRawFormatter(self.fileDescriptor, dataId)
77 with self.assertRaisesRegex(ValueError, "detectorId=70"):
78 formatter.readMetadata()
80 def check_readImage(self, dataId, expected):
81 formatter = lsst.obs.decam.DarkEnergyCameraRawFormatter(self.fileDescriptor, dataId)
82 image = formatter.readImage()
83 self.assertImagesEqual(image, expected)
85 def test_readImage(self):
86 dataId = {'detector': 25}
87 # detector 25 is in HDU 1
88 expected = lsst.afw.image.ImageI(self.filename, 1)
89 self.check_readImage(dataId, expected)
91 dataId = {'detector': 1}
92 # detector 1 is in HDU 2
93 expected = lsst.afw.image.ImageI(self.filename, 2)
94 self.check_readImage(dataId, expected)
96 def test_readMetadata_full_file(self):
97 """Test reading a file with all HDUs, and with all HDUs in a shuffled
98 order.
99 """
101 full_file = 'rawData/raw/c4d_150227_012718_ori-stripped.fits.fz'
102 full_location = lsst.daf.butler.Location(testDataDirectory, full_file)
103 full_fileDescriptor = lsst.daf.butler.FileDescriptor(full_location, None)
105 shuffled_file = 'rawData/raw/c4d_150227_012718_ori-stripped-shuffled.fits.fz'
106 shuffled_location = lsst.daf.butler.Location(testDataDirectory, shuffled_file)
107 shuffled_fileDescriptor = lsst.daf.butler.FileDescriptor(shuffled_location, None)
109 for detector in range(1, 63):
110 formatter = lsst.obs.decam.DarkEnergyCameraRawFormatter(full_fileDescriptor, detector)
111 full_index, full_metadata = formatter._determineHDU(detector)
112 formatter = lsst.obs.decam.DarkEnergyCameraRawFormatter(shuffled_fileDescriptor, detector)
113 shuffled_index, shuffled_metadata = formatter._determineHDU(detector)
115 # The shuffled file should have different indices,
116 self.assertNotEqual(full_index, shuffled_index)
117 # but the metadata should be the same in both files.
118 self.assertEqual(shuffled_metadata, full_metadata)
121@unittest.skipIf(hitsDirectory is None, "ap_verify_ci_hits2015 must be set up")
122class DarkEnergyCameraCPCalibFormatterTestCase(lsst.utils.tests.TestCase):
123 """DECam Community Pipeline calibrations have one detector per HDU.
125 Note: this test uses the ap_verify_ci_hits2015 dataset, which has complete
126 calibrations, whereas the testdata_decam package has only one detector in
127 its bias and flat files.
128 """
129 def setUp(self):
130 path = 'calib/c4d_150218_191721_zci_v1.fits.fz'
131 self.biasFile = os.path.join(hitsDirectory, path)
132 location = lsst.daf.butler.Location(hitsDirectory, path)
133 self.biasDescriptor = lsst.daf.butler.FileDescriptor(location, None)
135 path = 'calib/c4d_150218_200522_fci_g_v1.fits.fz'
136 self.flatFile = os.path.join(hitsDirectory, path)
137 location = lsst.daf.butler.Location(hitsDirectory, path)
138 self.flatDescriptor = lsst.daf.butler.FileDescriptor(location, None)
140 def check_readMetadata(self, dataId, expected, fileDescriptor):
141 formatter = lsst.obs.decam.DarkEnergyCameraCPCalibFormatter(fileDescriptor, dataId)
142 metadata = formatter.readMetadata()
143 self.assertEqual(metadata['CCDNUM'], dataId['detector'], dataId)
144 self.assertEqual(metadata, expected, msg=dataId)
146 def test_readMetadata(self):
147 for i in range(1, 63):
148 dataId = {'detector': i}
149 expected = lsst.afw.image.readMetadata(self.biasFile, i)
150 self.check_readMetadata(dataId, expected, self.biasDescriptor)
152 expected = lsst.afw.image.readMetadata(self.flatFile, i)
153 self.check_readMetadata(dataId, expected, self.flatDescriptor)
156def setup_module(module):
157 lsst.utils.tests.init()
160if __name__ == "__main__": 160 ↛ 161line 160 didn't jump to line 161, because the condition on line 160 was never true
161 lsst.utils.tests.init()
162 unittest.main()