def setUp(self): self.config = MakeDiscreteSkyMapConfig() self.task = MakeDiscreteSkyMapTask(config=self.config) self.cd_matrix = afwGeom.makeCdMatrix(scale=0.2*lsst.geom.arcseconds) self.crpix = lsst.geom.Point2D(100, 100) self.crval1 = lsst.geom.SpherePoint(10.0*lsst.geom.degrees, 0.0*lsst.geom.degrees) self.wcs1 = afwGeom.makeSkyWcs(crpix=self.crpix, crval=self.crval1, cdMatrix=self.cd_matrix) self.bbox = lsst.geom.Box2I(corner=lsst.geom.Point2I(0, 0), dimensions=lsst.geom.Extent2I(200, 200)) self.crval2 = lsst.geom.SpherePoint(11.0*lsst.geom.degrees, 1.0*lsst.geom.degrees) self.wcs2 = afwGeom.makeSkyWcs(crpix=self.crpix, crval=self.crval2, cdMatrix=self.cd_matrix) self.crval3 = lsst.geom.SpherePoint(20.0*lsst.geom.degrees, 10.0*lsst.geom.degrees) self.wcs3 = afwGeom.makeSkyWcs(crpix=self.crpix, crval=self.crval3, cdMatrix=self.cd_matrix)
def testBasics(self): """Test construction of a discrete sky map """ butler = Butler(inputs=self.inPath, outputs={ 'root': self.outPath, 'mode': 'rw' }) coordList = [] # list of sky coords of all corners of all calexp for dataId in ( dict(visit=1, filter="g"), dict(visit=2, filter="g"), dict(visit=3, filter="r"), ): # TODO: pybind11 remove `immediate=True` once DM-9112 is resolved rawImage = butler.get("raw", dataId, immediate=True) # fake calexp by simply copying raw data; the task just cares about its bounding box # (which is slightly larger for raw, but that doesn't matter for this test) calexp = rawImage butler.put(calexp, "calexp", dataId) calexpWcs = calexp.getWcs() calexpBoxD = Box2D(calexp.getBBox()) coordList += [ calexpWcs.pixelToSky(corner) for corner in calexpBoxD.getCorners() ] # use the calexp to make a sky map retVal = MakeDiscreteSkyMapTask.parseAndRun( args=[self.inPath, "--output", self.outPath, "--id", "filter=g^r"], config=self.config, doReturnResults=True, ) self.assertEqual(len(retVal.resultList), 1) skyMap = retVal.resultList[0].result.skyMap self.assertEqual(type(skyMap), DiscreteSkyMap) self.assertEqual(len(skyMap), 1) tractInfo = skyMap[0] self.assertEqual(tractInfo.getId(), 0) self.assertEqual(tractInfo.getNumPatches(), Extent2I(3, 3)) tractWcs = tractInfo.getWcs() tractBoxD = Box2D(tractInfo.getBBox()) for skyPoint in coordList: self.assertTrue(tractBoxD.contains(tractWcs.skyToPixel(skyPoint)))
def testBasics(self): """Test construction of a discrete sky map """ butler = Butler(inputs=self.inPath, outputs={'root': self.outPath, 'mode': 'rw'}) coordList = [] # list of sky coords of all corners of all calexp for dataId in ( dict(visit=1, filter="g"), dict(visit=2, filter="g"), dict(visit=3, filter="r"), ): rawImage = butler.get("raw", dataId) # fake calexp by simply copying raw data; the task just cares about its bounding box # (which is slightly larger for raw, but that doesn't matter for this test) calexp = rawImage butler.put(calexp, "calexp", dataId) calexpWcs = calexp.getWcs() calexpBoxD = Box2D(calexp.getBBox()) coordList += [calexpWcs.pixelToSky(corner) for corner in calexpBoxD.getCorners()] # use the calexp to make a sky map retVal = MakeDiscreteSkyMapTask.parseAndRun( args=[self.inPath, "--output", self.outPath, "--id", "filter=g^r"], config=self.config, doReturnResults=True, ) self.assertEqual(len(retVal.resultList), 1) skyMap = retVal.resultList[0].result.skyMap self.assertEqual(type(skyMap), DiscreteSkyMap) self.assertEqual(len(skyMap), 1) tractInfo = skyMap[0] self.assertEqual(tractInfo.getId(), 0) self.assertEqual(tractInfo.getNumPatches(), Extent2I(3, 3)) tractWcs = tractInfo.getWcs() tractBoxD = Box2D(tractInfo.getBBox()) for skyPoint in coordList: self.assertTrue(tractBoxD.contains(tractWcs.skyToPixel(skyPoint)))
def setUp(self): self.inPath = os.path.join(getPackageDir("obs_test"), "data", "input") self.outPath = os.path.join(os.path.dirname(__file__), "testMakeDiscreteSkyMapOutput") self.config = MakeDiscreteSkyMapTask.ConfigClass() self.config.doWrite = False # repo has no place to put the data
def makeDiscreteSkyMap(repo, config_file, collections, instrument, skymap_id='discrete', old_skymap_id=None): """Implements the command line interface `butler make-discrete-skymap` subcommand, should only be called by command line tools and unit test code that tests this function. Constructs a skymap from calibrated exposure in the butler repository Parameters ---------- repo : `str` URI to the location to read the repo. config_file : `str` or `None` Path to a config file that contains overrides to the skymap config. collections : `list` [`str`] An expression specifying the collections to be searched (in order) when reading datasets, and optionally dataset type restrictions on them. At least one collection must be specified. This is the collection with the calibrated exposures. instrument : `str` The name or fully-qualified class name of an instrument. skymap_id : `str`, optional The identifier of the skymap to save. Default is 'discrete'. old_skymap_id : `str`, optional The identifer of the skymap to append to. Must differ from ``skymap_id``. Ignored unless ``config.doAppend=True``. """ butler = Butler(repo, collections=collections, writeable=True) instr = getInstrument(instrument, butler.registry) config = MakeDiscreteSkyMapConfig() instr.applyConfigOverrides(MakeDiscreteSkyMapTask._DefaultName, config) if config_file is not None: config.load(config_file) # The coaddName for a SkyMap is only relevant in Gen2, and we completely # ignore it here; once Gen2 is gone it can be removed. oldSkyMap = None if config.doAppend: if old_skymap_id is None: raise ValueError( "old_skymap_id must be provided if config.doAppend is True.") dataId = {'skymap': old_skymap_id} try: oldSkyMap = butler.get(BaseSkyMap.SKYMAP_DATASET_TYPE_NAME, collections=collections, dataId=dataId) except LookupError as e: msg = ( f"Could not find seed skymap with dataId {dataId} " f"in collections {collections} but doAppend is {config.doAppend}. Aborting..." ) raise LookupError(msg, *e.args[1:]) datasets = butler.registry.queryDatasets('calexp', collections=collections) wcs_md_tuple_list = [(butler.getDirect('calexp.metadata', ref), butler.getDirect('calexp.wcs', ref)) for ref in datasets] task = MakeDiscreteSkyMapTask(config=config) result = task.run(wcs_md_tuple_list, oldSkyMap) result.skyMap.register(skymap_id, butler) butler.put(result.skyMap, BaseSkyMap.SKYMAP_DATASET_TYPE_NAME, dataId={'skymap': skymap_id}, run=BaseSkyMap.SKYMAP_RUN_COLLECTION_NAME)
#!/usr/bin/env python # # LSST Data Management System # Copyright 2008, 2009, 2010 LSST Corporation. # # This product includes software developed by the # LSST Project (http://www.lsst.org/). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the LSST License Statement and # the GNU General Public License along with this program. If not, # see <http://www.lsstcorp.org/LegalNotices/>. # from lsst.pipe.tasks.makeDiscreteSkyMap import MakeDiscreteSkyMapTask MakeDiscreteSkyMapTask.parseAndRun()
class MakeDiscreteSkyMapTestCase(unittest.TestCase): """Test MakeDiscreteSkyMapTask.""" def setUp(self): self.config = MakeDiscreteSkyMapConfig() self.task = MakeDiscreteSkyMapTask(config=self.config) self.cd_matrix = afwGeom.makeCdMatrix(scale=0.2*lsst.geom.arcseconds) self.crpix = lsst.geom.Point2D(100, 100) self.crval1 = lsst.geom.SpherePoint(10.0*lsst.geom.degrees, 0.0*lsst.geom.degrees) self.wcs1 = afwGeom.makeSkyWcs(crpix=self.crpix, crval=self.crval1, cdMatrix=self.cd_matrix) self.bbox = lsst.geom.Box2I(corner=lsst.geom.Point2I(0, 0), dimensions=lsst.geom.Extent2I(200, 200)) self.crval2 = lsst.geom.SpherePoint(11.0*lsst.geom.degrees, 1.0*lsst.geom.degrees) self.wcs2 = afwGeom.makeSkyWcs(crpix=self.crpix, crval=self.crval2, cdMatrix=self.cd_matrix) self.crval3 = lsst.geom.SpherePoint(20.0*lsst.geom.degrees, 10.0*lsst.geom.degrees) self.wcs3 = afwGeom.makeSkyWcs(crpix=self.crpix, crval=self.crval3, cdMatrix=self.cd_matrix) def test_run(self): """Test running the MakeDiscreteSkyMapTask.""" wcs_bbox_tuple_list = [ (self.wcs1, self.bbox), (self.wcs2, self.bbox) ] results = self.task.run(wcs_bbox_tuple_list) skymap = results.skyMap self.assertIsInstance(skymap, lsst.skymap.DiscreteSkyMap) self.assertEqual(len(skymap), 1) tract_info = skymap[0] # Ensure that the tract contains our points. self.assertTrue(tract_info.contains(self.crval1)) self.assertTrue(tract_info.contains(self.crval2)) def test_append(self): wcs_bbox_tuple_list = [ (self.wcs1, self.bbox), (self.wcs2, self.bbox) ] results = self.task.run(wcs_bbox_tuple_list) skymap = results.skyMap wcs_bbox_tuple_list2 = [ (self.wcs3, self.bbox) ] results2 = self.task.run(wcs_bbox_tuple_list2, oldSkyMap=skymap) skymap = results2.skyMap self.assertIsInstance(skymap, lsst.skymap.DiscreteSkyMap) self.assertEqual(len(skymap), 2) tract_info1 = skymap[0] # Ensure that the tract contains our points. self.assertTrue(tract_info1.contains(self.crval1)) self.assertTrue(tract_info1.contains(self.crval2)) tract_info2 = skymap[1] # Ensure that the tract contains our points. self.assertTrue(tract_info2.contains(self.crval3))