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
genericAssembler.py
Go to the documentation of this file.
1#!/usr/bin/env python
2
3#
4# LSST Data Management System
5# Copyright 2016 LSST Corporation.
6#
7# This product includes software developed by the
8# LSST Project (http://www.lsst.org/).
9#
10# This program is free software: you can redistribute it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation, either version 3 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the LSST License Statement and
21# the GNU General Public License along with this program. If not,
22# see <http://www.lsstcorp.org/LegalNotices/>.
23#
24
25
26def genericAssembler(dataId, componentInfo, cls):
27 """A generic assembler for butler composite datasets, that can be used when the component names match the
28 argument names in the __init__ signature, or the setter name for component objects is specified or can be
29 inferred by component name.
30
31 When determining setter names: If the setter name is specified by the policy then the genericAssembler
32 will use that to set the component into the python object. If the policy does not specify setter names the
33 genericAssembler will see if the __init__ func input argument names match the policy argument names. If
34 that does not work, and the python object has setter names that match the component name of all the object
35 then the setter name can be inferred; it will first try 'set' + <componentName>, and if that does not
36 exist it will try 'set' + <componentName>.capitalize (e.g. for component name 'foo', it will try setfoo
37 and then setFoo.) If no setter can be found for a component object, it will raise a runtime error.
38 """
39 initArgs = {k: v.obj for k, v in componentInfo.items()}
40 try:
41 obj = cls(**initArgs)
42 except TypeError:
43 obj = None
44
45 if not obj:
46 obj = cls()
47 for componentName, componentInfo in componentInfo.items():
48 if componentInfo.setter is not None:
49 setter = getattr(obj, componentInfo.setter)
50 elif hasattr(obj, 'set_' + componentName):
51 setter = getattr(obj, 'set_' + componentName)
52 elif hasattr(obj, 'set' + componentName.capitalize()):
53 setter = getattr(obj, 'set' + componentName.capitalize())
54 else:
55 raise RuntimeError("No setter for datasetType:%s class:%s" %
56 (componentInfo.datasetType, cls))
57 setter(componentInfo.obj)
58 return obj
59
60
61def genericDisassembler(obj, dataId, componentInfo):
62 """A generic disassembler for butler composite datasets, that can be used when the getter name for
63 component objects is specified or can be inferred by component name.
64
65 When determining getter names: If the getter name is specified by the policy then the genericAssembler
66 will use that to get the component from the python object. If the policy does not specify getter names and
67 the python object has getter names that match the component name of all the object then the getter name
68 can be inferred; it will first try 'get' + <componentName>, and if that does not exist it will try 'get' +
69 <componentName>.capitalize (e.g. for component name 'foo', it will try getfoo and then getFoo.) If no
70 getter can be found for a component object, it will raise a runtime error.
71 """
72 for componentName, componentInfo in componentInfo.items():
73 if componentInfo.getter is not None:
74 getter = getattr(obj, componentInfo.getter)
75 elif hasattr(obj, 'get_' + componentName):
76 getter = getattr(obj, 'get_' + componentName)
77 elif hasattr(obj, 'get' + componentName.capitalize()):
78 getter = getattr(obj, 'get' + componentName.capitalize())
79 else:
80 raise RuntimeError("No getter for componentName:%s" % componentName)
81 componentInfo.obj = getter()
def genericAssembler(dataId, componentInfo, cls)
def genericDisassembler(obj, dataId, componentInfo)