LSSTApplications  19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
butler_tests.py
Go to the documentation of this file.
1 # This file is part of obs_base.
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 import abc
23 import inspect
24 import unittest
25 import collections
26 
27 __all__ = ["ButlerGetTests"]
28 
29 
30 class ButlerGetTests(metaclass=abc.ABCMeta):
31  """Tests of obs_* Butler get() functionality.
32 
33  In the subclasses's setUp():
34  * Call setUp_butler_get() to fill in required parameters.
35  """
36 
37  def setUp_butler_get(self,
38  ccdExposureId_bits=None,
39  exposureIds=None,
40  filters=None,
41  exptimes=None,
42  detectorIds=None,
43  detector_names=None,
44  detector_serials=None,
45  dimensions=None,
46  sky_origin=None,
47  raw_subsets=None,
48  good_detectorIds=None,
49  bad_detectorIds=None,
50  linearizer_type=None,
51  raw_header_wcs=None
52  ):
53  """
54  Set up the necessary variables for butlerGet tests.
55 
56  All "exposure name" entries below should correspond to an entry in
57  self.dataIds.
58 
59  Parameters
60  ----------
61 
62  ccdExposureId_bits : `int`
63  expected value of ccdExposureId_bits
64  exposureIds : `dict`
65  dict of exposure name : ccdExposureId (the number as returned by
66  the butler)
67  filters : `dict`
68  dict of exposure name : filter name
69  exptimes : `dict`
70  dict of exposure name : exposure time
71  detector_names : `dict`
72  dict of exposure name : detector name
73  detectorIds : `dict`
74  dict of exposure name : detectorId
75  detector_serials : `dict`
76  dict of exposure name : detector serial
77  dimensions : `dict`
78  dict of exposure name : dimensions (as a geom.Extent2I)
79  sky_origin : `tuple` of `float`
80  Longitude, Latitude of 'raw' exposure
81  raw_subsets : `tuple` of (kwargs, `int`)
82  keyword args and expected number of subsets for
83  ``butler.subset('raw', **kwargs)``
84  good_detectorIds : `list` of `int`
85  list of valid ccd numbers
86  bad_detectorIds : `list` of `int`
87  list of invalid ccd numbers
88  linearizer_type : `dict`
89  dict of detectorId (usually `int`): LinearizerType
90  (e.g. lsst.ip.isr.LinearizeLookupTable.LinearityType),
91  or unittest.SkipTest to skip all linearizer tests.
92  raw_header_wcs : `lsst.afw.geom.SkyWcs`
93  The SkyWcs object that should be returned by
94  ``butler.get("raw_header_wcs", dataId=self.dataIds["raw"])``
95  """
96 
97  fields = ['ccdExposureId_bits',
98  'exposureIds',
99  'filters',
100  'exptimes',
101  'detector_names',
102  'detectorIds',
103  'detector_serials',
104  'dimensions',
105  'sky_origin',
106  'raw_subsets',
107  'good_detectorIds',
108  'bad_detectorIds',
109  'linearizer_type',
110  'raw_header_wcs'
111  ]
112  ButlerGet = collections.namedtuple("ButlerGetData", fields)
113 
114  self.butler_get_data = ButlerGet(ccdExposureId_bits=ccdExposureId_bits,
115  exposureIds=exposureIds,
116  filters=filters,
117  exptimes=exptimes,
118  detectorIds=detectorIds,
119  detector_names=detector_names,
120  detector_serials=detector_serials,
121  dimensions=dimensions,
122  sky_origin=sky_origin,
123  raw_subsets=raw_subsets,
124  good_detectorIds=good_detectorIds,
125  bad_detectorIds=bad_detectorIds,
126  linearizer_type=linearizer_type,
127  raw_header_wcs=raw_header_wcs
128  )
129 
131  bits = self.butler.get('ccdExposureId_bits')
132  self.assertEqual(bits, self.butler_get_data.ccdExposureId_bits)
133 
134  def _test_exposure(self, name):
135  if self.dataIds[name] is unittest.SkipTest:
136  self.skipTest('Skipping %s as requested' % (inspect.currentframe().f_code.co_name))
137  exp = self.butler.get(name, self.dataIds[name])
138 
139  exp_md = self.butler.get(name + "_md", self.dataIds[name])
140  self.assertEqual(type(exp_md), type(exp.getMetadata()))
141 
142  self.assertEqual(exp.getDimensions(), self.butler_get_data.dimensions[name])
143  self.assertEqual(exp.getDetector().getId(), self.butler_get_data.detectorIds[name])
144  self.assertEqual(exp.getDetector().getName(), self.butler_get_data.detector_names[name])
145  self.assertEqual(exp.getDetector().getSerial(), self.butler_get_data.detector_serials[name])
146  self.assertEqual(exp.getFilter().getName(), self.butler_get_data.filters[name])
147  exposureId = self.butler.get('ccdExposureId', dataId=self.dataIds[name])
148  self.assertEqual(exposureId, self.butler_get_data.exposureIds[name])
149  self.assertEqual(exp.getInfo().getVisitInfo().getExposureTime(), self.butler_get_data.exptimes[name])
150  return exp
151 
152  def test_raw(self):
153  exp = self._test_exposure('raw')
154  # We only test the existence of WCS in the raw files, since it's only
155  # well-defined for raw, and other exposure types could have or not
156  # have a WCS depending on various implementation details.
157  # Even for raw, there are data that do not have a WCS, e.g. teststand
158  # data
159  if self.butler_get_data.sky_origin is not unittest.SkipTest:
160  self.assertEqual(exp.hasWcs(), True)
161  origin = exp.getWcs().getSkyOrigin()
162  self.assertAlmostEqual(origin.getLongitude().asDegrees(), self.butler_get_data.sky_origin[0])
163  self.assertAlmostEqual(origin.getLatitude().asDegrees(), self.butler_get_data.sky_origin[1])
164 
165  def test_bias(self):
166  self._test_exposure('bias')
167 
168  def test_dark(self):
169  self._test_exposure('dark')
170 
171  def test_flat(self):
172  self._test_exposure('flat')
173 
175  """Test that `raw_header_wcs` returns the unmodified raw image header.
176  """
177  if self.butler_get_data.raw_header_wcs is not None:
178  wcs = self.butler.get('raw_header_wcs', self.dataIds['raw'])
179  self.assertEqual(wcs, self.butler_get_data.raw_header_wcs)
180 
181  @unittest.skip('Cannot test this, as there is a bug in the butler! DM-8097')
182  def test_raw_sub_bbox(self):
183  exp = self.butler.get('raw', self.dataIds['raw'], immediate=True)
184  bbox = exp.getBBox()
185  bbox.grow(-1)
186  sub = self.butler.get("raw_sub", self.dataIds['raw'], bbox=bbox, immediate=True)
187  self.assertEqual(sub.getImage().getBBox(), bbox)
188  self.assertImagesEqual(sub, exp.Factory(exp, bbox))
189 
190  def test_subset_raw(self):
191  for kwargs, expect in self.butler_get_data.raw_subsets:
192  subset = self.butler.subset("raw", **kwargs)
193  self.assertEqual(len(subset), expect, msg="Failed for kwargs: {}".format(kwargs))
194 
196  """Test that we can get a linearizer for good detectorIds."""
197  if self.butler_get_data.linearizer_type is unittest.SkipTest:
198  self.skipTest('Skipping %s as requested' % (inspect.currentframe().f_code.co_name))
199 
200  camera = self.butler.get("camera")
201  for detectorId in self.butler_get_data.good_detectorIds:
202  detector = camera[detectorId]
203  linearizer = self.butler.get("linearizer", dataId=dict(ccd=detectorId), immediate=True)
204  self.assertEqual(linearizer.LinearityType, self.butler_get_data.linearizer_type[detectorId])
205  linearizer.checkDetector(detector)
206 
208  """Do bad detectorIds raise?"""
209  if self.butler_get_data.linearizer_type is unittest.SkipTest:
210  self.skipTest('Skipping %s as requested' % (inspect.currentframe().f_code.co_name))
211 
212  for badccd in self.butler_get_data.bad_detectorIds:
213  with self.assertRaises(RuntimeError):
214  self.butler.get("linearizer", dataId=dict(ccd=badccd), immediate=True)
lsst.obs.base.butler_tests.ButlerGetTests.test_exposureId_bits
def test_exposureId_bits(self)
Definition: butler_tests.py:130
lsst.obs.base.butler_tests.ButlerGetTests.test_bias
def test_bias(self)
Definition: butler_tests.py:165
lsst.obs.base.butler_tests.ButlerGetTests.test_subset_raw
def test_subset_raw(self)
Definition: butler_tests.py:190
lsst.obs.base.butler_tests.ButlerGetTests.test_raw_header_wcs
def test_raw_header_wcs(self)
Definition: butler_tests.py:174
lsst.pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
lsst.obs.base.butler_tests.ButlerGetTests.test_get_linearizer_bad_detectorIds
def test_get_linearizer_bad_detectorIds(self)
Definition: butler_tests.py:207
lsst.obs.base.butler_tests.ButlerGetTests.test_flat
def test_flat(self)
Definition: butler_tests.py:171
lsst.obs.base.butler_tests.ButlerGetTests
Definition: butler_tests.py:30
lsst.obs.base.butler_tests.ButlerGetTests.test_raw
def test_raw(self)
Definition: butler_tests.py:152
lsst.obs.base.butler_tests.ButlerGetTests.setUp_butler_get
def setUp_butler_get(self, ccdExposureId_bits=None, exposureIds=None, filters=None, exptimes=None, detectorIds=None, detector_names=None, detector_serials=None, dimensions=None, sky_origin=None, raw_subsets=None, good_detectorIds=None, bad_detectorIds=None, linearizer_type=None, raw_header_wcs=None)
Definition: butler_tests.py:37
lsst.obs.base.butler_tests.ButlerGetTests.test_dark
def test_dark(self)
Definition: butler_tests.py:168
lsst.obs.base.butler_tests.ButlerGetTests.test_raw_sub_bbox
def test_raw_sub_bbox(self)
Definition: butler_tests.py:182
type
table::Key< int > type
Definition: Detector.cc:163
lsst.obs.base.butler_tests.ButlerGetTests._test_exposure
def _test_exposure(self, name)
Definition: butler_tests.py:134
lsst.obs.base.butler_tests.ButlerGetTests.butler_get_data
butler_get_data
Definition: butler_tests.py:99
lsst.obs.base.butler_tests.ButlerGetTests.test_get_linearizer
def test_get_linearizer(self)
Definition: butler_tests.py:195