lsst.obs.base  14.0-20-g4a17216
exposureIdInfo.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2016 LSST Corporation.
4 #
5 # This product includes software developed by the
6 # LSST Project (http://www.lsst.org/).
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the LSST License Statement and
19 # the GNU General Public License along with this program. If not,
20 # see <http://www.lsstcorp.org/LegalNotices/>.
21 #
22 
23 from builtins import object
24 from past.builtins import long
25 
26 __all__ = ["ExposureIdInfo"]
27 
28 
29 class ExposureIdInfo(object):
30  """!Exposure ID and number of bits used
31 
32  Attributes include:
33  - expId exposure ID as a long int
34  - expBits maximum number of bits allowed for exposure IDs
35  - maxBits maximum number of bits available for values that combine exposure ID
36  with other information, such as source ID
37  - unusedBits maximum number of bits available for non-exposure info (maxBits - expBits)
38 
39  One common use is creating an ID factory for making a source table.
40  For example, given a data butler `butler` and a data ID `dataId`:
41 
42  from lsst.afw.table import IdFactory, SourceTable
43  exposureIdInfo = butler.get("expIdInfo", dataId)
44  sourceIdFactory = IdFactory.makeSource(exposureIdInfo.expId, exposureIdInfo.unusedBits)
45  schema = SourceTable.makeMinimalSchema()
46  #...add fields to schema as desired, then...
47  sourceTable = SourceTable.make(self.schema, sourceIdFactory)
48 
49  At least one bit must be reserved, even if there is no exposure ID, for reasons
50  that are not entirely clear (this is DM-6664).
51  """
52 
53  def __init__(self, expId=0, expBits=1, maxBits=64):
54  """!Construct an ExposureIdInfo
55 
56  See the class doc string for an explanation of the arguments.
57  """
58  expId = long(expId)
59  expBits = int(expBits)
60  maxBits = int(maxBits)
61 
62  if expId.bit_length() > expBits:
63  raise RuntimeError("expId=%s uses %s bits > expBits=%s" % (expId, expId.bit_length(), expBits))
64  if maxBits < expBits:
65  raise RuntimeError("expBits=%s > maxBits=%s" % (expBits, maxBits))
66 
67  self.expId = expId
68  self.expBits = expBits
69  self.maxBits = maxBits
70 
71  @property
72  def unusedBits(self):
73  return self.maxBits - self.expBits
Exposure ID and number of bits used.
def __init__(self, expId=0, expBits=1, maxBits=64)
Construct an ExposureIdInfo.