From faa1b00ac32c5bce32f440141556fa80132ca4fe Mon Sep 17 00:00:00 2001 From: Tim Jenness Date: Tue, 31 Oct 2023 16:28:10 -0700 Subject: [PATCH] Add support for day_obs/seq_num to Butler.find_dataset --- python/lsst/daf/butler/direct_butler.py | 8 ++++++++ python/lsst/daf/butler/remote_butler/server/_server.py | 9 ++++++--- tests/test_server.py | 9 +++++++++ tests/test_simpleButler.py | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/python/lsst/daf/butler/direct_butler.py b/python/lsst/daf/butler/direct_butler.py index b38a7a8aaf..25817658a6 100644 --- a/python/lsst/daf/butler/direct_butler.py +++ b/python/lsst/daf/butler/direct_butler.py @@ -1334,6 +1334,14 @@ def find_dataset( datastore_records: bool = False, **kwargs: Any, ) -> DatasetRef | None: + # Handle any parts of the dataID that are not using primary dimension + # keys. + if isinstance(dataset_type, str): + actual_type = self.get_dataset_type(dataset_type) + else: + actual_type = dataset_type + data_id, kwargs = self._rewrite_data_id(data_id, actual_type, **kwargs) + return self._registry.findDataset( dataset_type, data_id, diff --git a/python/lsst/daf/butler/remote_butler/server/_server.py b/python/lsst/daf/butler/remote_butler/server/_server.py index a425d21dea..0e036ab67a 100644 --- a/python/lsst/daf/butler/remote_butler/server/_server.py +++ b/python/lsst/daf/butler/remote_butler/server/_server.py @@ -144,8 +144,11 @@ def find_dataset( ) -> SerializedDatasetRef | None: collection_query = query.collections if query.collections else None + # Get the simple dict from the SerializedDataCoordinate. We do not know + # if it is a well-defined DataCoordinate or needs some massaging first. + # find_dataset will use dimension record queries if necessary. + data_id = query.data_id.dataId + butler = factory.create_butler() - ref = butler.find_dataset( - dataset_type, data_id=unpack_dataId(butler, query.data_id), collections=collection_query - ) + ref = butler.find_dataset(dataset_type, None, collections=collection_query, **data_id) return ref.to_simple() if ref else None diff --git a/tests/test_server.py b/tests/test_server.py index 3fb388eabb..05daac7e06 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -129,6 +129,15 @@ def test_find_dataset(self): ref2 = self.butler.get_dataset(ref.id) self.assertEqual(ref2, ref) + # Use detector name to find it. + ref3 = self.butler.find_dataset( + ref.datasetType, + collections="imported_g", + instrument="Cam1", + full_name="Aa", + ) + self.assertEqual(ref2, ref3) + # Unknown dataset should not fail. self.assertIsNone(self.butler.get_dataset(uuid.uuid4())) diff --git a/tests/test_simpleButler.py b/tests/test_simpleButler.py index 951652b59f..e14370fc0a 100644 --- a/tests/test_simpleButler.py +++ b/tests/test_simpleButler.py @@ -278,7 +278,7 @@ def testButlerGet(self): # Find the DatasetRef for a flat coll = "imported_g" flat2g = butler.find_dataset( - "flat", instrument="Cam1", detector=2, physical_filter="Cam1-G", collections=coll + "flat", instrument="Cam1", full_name="Ab", physical_filter="Cam1-G", collections=coll ) # Create a numpy integer to check that works fine