LSST Applications g0265f82a02+0e5473021a,g02d81e74bb+bd2ed33bd6,g1470d8bcf6+c6d6eb38e2,g14a832a312+9d12ad093c,g2079a07aa2+86d27d4dc4,g2305ad1205+91a32aca49,g295015adf3+88246b6574,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g3ddfee87b4+c34e8be1fa,g487adcacf7+85dcfbcc36,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+ea1711114f,g5a732f18d5+53520f316c,g64a986408d+bd2ed33bd6,g858d7b2824+bd2ed33bd6,g8a8a8dda67+585e252eca,g99cad8db69+016a06b37a,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+ef4e3a5875,gb0e22166c9+60f28cb32d,gb6a65358fc+0e5473021a,gba4ed39666+c2a2e4ac27,gbb8dafda3b+b6d7b42999,gc120e1dc64+f745648b3a,gc28159a63d+0e5473021a,gcf0d15dbbd+c34e8be1fa,gdaeeff99f8+f9a426f77a,ge6526c86ff+508d0e0a30,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gf18bd8381d+8d59551888,gf1cff7945b+bd2ed33bd6,w.2024.16
LSST Data Management Base Package
Loading...
Searching...
No Matches
Functions
lsst.pipe.tasks.read_curated_calibs Namespace Reference

Functions

 read_one_chip (root, chip_name, chip_id)
 
 check_metadata (obj, valid_start, instrument, chip_id, filepath, data_name)
 
 read_all (root, camera)
 

Function Documentation

◆ check_metadata()

lsst.pipe.tasks.read_curated_calibs.check_metadata ( obj,
valid_start,
instrument,
chip_id,
filepath,
data_name )
Check that the metadata is complete and self consistent

Parameters
----------
obj : object of same type as the factory
    Object to retrieve metadata from in order to compare with
    metadata inferred from the path.
valid_start : `datetime`
    Start of the validity range for data
instrument : `str`
    Name of the instrument in question
chip_id : `int`
    Identifier of the sensor in question
filepath : `str`
    Path of the file read to construct the data
data_name : `str`
    Name of the type of data being read

Returns
-------
None

Raises
------
ValueError
    If the metadata from the path and the metadata encoded
    in the path do not match for any reason.

Definition at line 75 of file read_curated_calibs.py.

75def check_metadata(obj, valid_start, instrument, chip_id, filepath, data_name):
76 """Check that the metadata is complete and self consistent
77
78 Parameters
79 ----------
80 obj : object of same type as the factory
81 Object to retrieve metadata from in order to compare with
82 metadata inferred from the path.
83 valid_start : `datetime`
84 Start of the validity range for data
85 instrument : `str`
86 Name of the instrument in question
87 chip_id : `int`
88 Identifier of the sensor in question
89 filepath : `str`
90 Path of the file read to construct the data
91 data_name : `str`
92 Name of the type of data being read
93
94 Returns
95 -------
96 None
97
98 Raises
99 ------
100 ValueError
101 If the metadata from the path and the metadata encoded
102 in the path do not match for any reason.
103 """
104 md = obj.getMetadata()
105 finst = md['INSTRUME']
106 fchip_id = md['DETECTOR']
107 fdata_name = md['OBSTYPE']
108 if not ((finst.lower(), int(fchip_id), fdata_name.lower())
109 == (instrument.lower(), chip_id, data_name.lower())):
110 raise ValueError(f"Path and file metadata do not agree:\n"
111 f"Path metadata: {instrument} {chip_id} {data_name}\n"
112 f"File metadata: {finst} {fchip_id} {fdata_name}\n"
113 f"File read from : %s\n"%(filepath)
114 )
115
116
117@deprecated(reason="Curated calibration ingest now handled by obs_base Instrument classes."
118 " Will be removed after v25.0.",
119 version="v25.0", category=FutureWarning)

◆ read_all()

lsst.pipe.tasks.read_curated_calibs.read_all ( root,
camera )
Read all data from the standard format at a particular root.

Parameters
----------
root : `str`
    Path to the top level of the data tree.  This is expected to hold directories
    named after the sensor names.  They are expected to be lower case.
camera : `lsst.afw.cameraGeom.Camera`
    The camera that goes with the data being read.

Returns
-------
dict
    A dictionary of dictionaries of objects constructed with the appropriate factory class.
    The first key is the sensor name lowered, and the second is the validity
    start time as a `datetime` object.

Notes
-----
Each leaf object in the constructed dictionary has metadata associated with it.
The detector ID may be retrieved from the DETECTOR entry of that metadata.

Definition at line 120 of file read_curated_calibs.py.

120def read_all(root, camera):
121 """Read all data from the standard format at a particular root.
122
123 Parameters
124 ----------
125 root : `str`
126 Path to the top level of the data tree. This is expected to hold directories
127 named after the sensor names. They are expected to be lower case.
128 camera : `lsst.afw.cameraGeom.Camera`
129 The camera that goes with the data being read.
130
131 Returns
132 -------
133 dict
134 A dictionary of dictionaries of objects constructed with the appropriate factory class.
135 The first key is the sensor name lowered, and the second is the validity
136 start time as a `datetime` object.
137
138 Notes
139 -----
140 Each leaf object in the constructed dictionary has metadata associated with it.
141 The detector ID may be retrieved from the DETECTOR entry of that metadata.
142 """
143 root = os.path.normpath(root)
144 dirs = os.listdir(root) # assumes all directories contain data
145 dirs = [d for d in dirs if os.path.isdir(os.path.join(root, d))]
146 data_by_chip = {}
147 name_map = {det.getName().lower(): det.getName() for
148 det in camera} # we assume the directories have been lowered
149
150 if not dirs:
151 raise RuntimeError(f"No data found on path {root}")
152
153 calib_types = set()
154 for d in dirs:
155 chip_name = os.path.basename(d)
156 # Give informative error message if the detector name is not known
157 # rather than a simple KeyError
158 if chip_name not in name_map:
159 detectors = [det for det in camera.getNameIter()]
160 max_detectors = 10
161 note_str = "knows"
162 if len(detectors) > max_detectors:
163 # report example subset
164 note_str = "examples"
165 detectors = detectors[:max_detectors]
166 raise RuntimeError(f"Detector {chip_name} not known to supplied camera "
167 f"{camera.getName()} ({note_str}: {','.join(detectors)})")
168 chip_id = camera[name_map[chip_name]].getId()
169 data_by_chip[chip_name], calib_type = read_one_chip(root, chip_name, chip_id)
170 calib_types.add(calib_type)
171 if len(calib_types) != 1: # set.add(None) has length 1 so None is OK here.
172 raise ValueError(f'Error mixing calib types: {calib_types}')
173
174 no_data = all([v == {} for v in data_by_chip.values()])
175 if no_data:
176 raise RuntimeError("No data to ingest")
177
178 return data_by_chip, calib_type
daf::base::PropertySet * set
Definition fits.cc:931

◆ read_one_chip()

lsst.pipe.tasks.read_curated_calibs.read_one_chip ( root,
chip_name,
chip_id )
Read data for a particular sensor from the standard format at a particular root.

Parameters
----------
root : `str`
    Path to the top level of the data tree.  This is expected to hold directories
    named after the sensor names.  They are expected to be lower case.
chip_name : `str`
    The name of the sensor for which to read data.
chip_id : `int`
    The identifier for the sensor in question.

Returns
-------
`dict`
    A dictionary of objects constructed from the appropriate factory class.
    The key is the validity start time as a `datetime` object.

Definition at line 33 of file read_curated_calibs.py.

33def read_one_chip(root, chip_name, chip_id):
34 """Read data for a particular sensor from the standard format at a particular root.
35
36 Parameters
37 ----------
38 root : `str`
39 Path to the top level of the data tree. This is expected to hold directories
40 named after the sensor names. They are expected to be lower case.
41 chip_name : `str`
42 The name of the sensor for which to read data.
43 chip_id : `int`
44 The identifier for the sensor in question.
45
46 Returns
47 -------
48 `dict`
49 A dictionary of objects constructed from the appropriate factory class.
50 The key is the validity start time as a `datetime` object.
51 """
52 factory_map = {'qe_curve': Curve, 'defects': Defects, 'linearizer': Linearizer,
53 'crosstalk': CrosstalkCalib, 'bfk': BrighterFatterKernel,
54 'photodiode': PhotodiodeCalib, }
55 files = []
56 extensions = (".ecsv", ".yaml")
57 for ext in extensions:
58 files.extend(glob.glob(os.path.join(root, chip_name, f"*{ext}")))
59 parts = os.path.split(root)
60 instrument = os.path.split(parts[0])[1] # convention is that these reside at <instrument>/<data_name>
61 data_name = parts[1]
62 if data_name not in factory_map:
63 raise ValueError(f"Unknown calibration data type, '{data_name}' found. "
64 f"Only understand {','.join(k for k in factory_map)}")
65 factory = factory_map[data_name]
66 data_dict = {}
67 for f in files:
68 date_str = os.path.splitext(os.path.basename(f))[0]
69 valid_start = dateutil.parser.parse(date_str)
70 data_dict[valid_start] = factory.readText(f)
71 check_metadata(data_dict[valid_start], valid_start, instrument, chip_id, f, data_name)
72 return data_dict, data_name
73
74