LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
packers.py
Go to the documentation of this file.
1# This file is part of skymap.
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__all__ = ("SkyMapDimensionPacker",)
23
24from lsst.daf.butler import DimensionPacker, DimensionGraph, DataCoordinate
25
26
27class SkyMapDimensionPacker(DimensionPacker):
28 """A `DimensionPacker` for tract, patch and optionally band,
29 given a SkyMap.
30
31 Parameters
32 ----------
33 fixed : `lsst.daf.butler.DataCoordinate`
34 Expanded data ID that must include at least the skymap dimension.
35 dimensions : `lsst.daf.butler.DimensionGraph`
36 The dimensions of data IDs packed by this instance. Must include
37 skymap, tract, and patch, and may include band.
38 """
39
40 SUPPORTED_FILTERS = (
41 [None]
42 + list("ugrizyUBGVRIZYJHK") # split string into single chars
43 + [f"N{d}" for d in (387, 515, 656, 816, 921, 1010)] # HSC narrow-bands
44 + [f"N{d}" for d in (419, 540, 708, 964)] # DECam narrow-bands
45 )
46 """band names supported by this packer.
47
48 New filters should be added to the end of the list to maximize
49 compatibility with existing IDs.
50 """
51
52 @classmethod
53 def getIntFromFilter(cls, name):
54 """Return an integer that represents the band with the given
55 name.
56 """
57 try:
58 return cls.SUPPORTED_FILTERSSUPPORTED_FILTERS.index(name)
59 except ValueError:
60 raise NotImplementedError(f"band '{name}' not supported by this ID packer.")
61
62 @classmethod
63 def getFilterNameFromInt(cls, num):
64 """Return an band name from its integer representation.
65 """
66 return cls.SUPPORTED_FILTERSSUPPORTED_FILTERS[num]
67
68 @classmethod
70 return len(cls.SUPPORTED_FILTERSSUPPORTED_FILTERS)
71
72 @classmethod
73 def configure(cls, dimensions):
74 # Docstring inherited from DataIdPacker.configure
75 assert dimensions.given == ["skymap"]
76 assert dimensions.required.issuperset(["tract", "patch"])
77 metadata = {"skymap": ["tract_max", "patch_nx_max", "patch_ny_max"]}
78 kwds = {}
79 return metadata, kwds
80
81 def __init__(self, fixed: DataCoordinate, dimensions: DimensionGraph):
82 super().__init__(fixed, dimensions)
83 record = fixed.records["skymap"]
84 self._skyMapName_skyMapName = record.name
85 self._patchMax_patchMax = record.patch_nx_max * record.patch_ny_max
86 self._tractPatchMax_tractPatchMax = self._patchMax_patchMax*record.tract_max
87 if "band" in dimensions:
88 self._filterMax_filterMax = self.getMaxIntForFiltersgetMaxIntForFilters()
89 else:
90 self._filterMax_filterMax = None
91
92 @property
93 def maxBits(self) -> int:
94 # Docstring inherited from DataIdPacker.maxBits
95 packedMax = self._tractPatchMax_tractPatchMax
96 if self._filterMax_filterMax is not None:
97 packedMax *= self._filterMax_filterMax
98 return packedMax.bit_length()
99
100 def _pack(self, dataId: DataCoordinate) -> int:
101 # Docstring inherited from DataIdPacker.pack
102 packed = dataId["patch"] + self._patchMax_patchMax*dataId["tract"]
103 if self._filterMax_filterMax is not None:
104 packed += self.getIntFromFiltergetIntFromFilter(dataId["band"])*self._tractPatchMax_tractPatchMax
105 return packed
106
107 def unpack(self, packedId: int) -> DataCoordinate:
108 # Docstring inherited from DataIdPacker.unpack
109 d = {"skymap": self._skyMapName_skyMapName}
110 if self._filterMax_filterMax is not None:
111 d["band"] = self.getFilterNameFromIntgetFilterNameFromInt(packedId // self._tractPatchMax_tractPatchMax)
112 packedId %= self._tractPatchMax_tractPatchMax
113 d["tract"] = packedId // self._patchMax_patchMax
114 d["patch"] = packedId % self._patchMax_patchMax
115 return DataCoordinate.standardize(d, graph=self.dimensions)
def __init__(self, DataCoordinate fixed, DimensionGraph dimensions)
Definition: packers.py:81
DataCoordinate unpack(self, int packedId)
Definition: packers.py:107
daf::base::PropertyList * list
Definition: fits.cc:913