LSSTApplications  11.0-13-gbb96280,12.1+18,12.1+7,12.1-1-g14f38d3+72,12.1-1-g16c0db7+5,12.1-1-g5961e7a+84,12.1-1-ge22e12b+23,12.1-11-g06625e2+4,12.1-11-g0d7f63b+4,12.1-19-gd507bfc,12.1-2-g7dda0ab+38,12.1-2-gc0bc6ab+81,12.1-21-g6ffe579+2,12.1-21-gbdb6c2a+4,12.1-24-g941c398+5,12.1-3-g57f6835+7,12.1-3-gf0736f3,12.1-37-g3ddd237,12.1-4-gf46015e+5,12.1-5-g06c326c+20,12.1-5-g648ee80+3,12.1-5-gc2189d7+4,12.1-6-ga608fc0+1,12.1-7-g3349e2a+5,12.1-7-gfd75620+9,12.1-9-g577b946+5,12.1-9-gc4df26a+10
LSSTDataManagementBasePackage
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__
Construct an ExposureIdInfo.