LSST Applications g0265f82a02+c6dfa2ddaf,g1162b98a3f+ffe7eabc7e,g2079a07aa2+1b2e822518,g2bbee38e9b+c6dfa2ddaf,g337abbeb29+c6dfa2ddaf,g36da64cc00+ea84795170,g3ddfee87b4+955a963fd8,g50ff169b8f+2eb0e556e8,g52b1c1532d+90ebb246c7,g555ede804d+955a963fd8,g591dd9f2cf+bac198a2cb,g5ec818987f+420292cfeb,g858d7b2824+d6c9a0a3b8,g876c692160+aabc49a3c3,g8a8a8dda67+90ebb246c7,g8cdfe0ae6a+4fd9e222a8,g99cad8db69+e6cd765486,g9ddcbc5298+a1346535a5,ga1e77700b3+df8f93165b,ga8c6da7877+acd47f83f4,gae46bcf261+c6dfa2ddaf,gb0e22166c9+8634eb87fb,gb3f2274832+12c8382528,gba4ed39666+1ac82b564f,gbb8dafda3b+0574160a1f,gbeb006f7da+dea2fbb49f,gc28159a63d+c6dfa2ddaf,gc86a011abf+d6c9a0a3b8,gcf0d15dbbd+955a963fd8,gdaeeff99f8+1cafcb7cd4,gdc0c513512+d6c9a0a3b8,ge79ae78c31+c6dfa2ddaf,geb67518f79+ba1859f325,gee10cc3b42+90ebb246c7,gf1cff7945b+d6c9a0a3b8,w.2024.13
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
lsst.pipe.tasks.extended_psf.ExtendedPsf Class Reference

Public Member Functions

 __init__ (self, default_extended_psf=None)
 
 add_regional_extended_psf (self, extended_psf_image, region_name, region_detectors)
 
 __call__ (self, detector=None)
 
 __len__ (self)
 
 get_extended_psf (self, region_name)
 
 write_fits (self, filename)
 
 writeFits (self, filename)
 
 read_fits (cls, filename)
 
 readFits (cls, filename)
 

Public Attributes

 default_extended_psf
 
 focal_plane_regions
 
 detectors_focal_plane_regions
 

Detailed Description

Extended PSF model.

Each instance may contain a default extended PSF, a set of extended PSFs
that correspond to different focal plane regions, or both. At this time,
focal plane regions are always defined as a subset of detectors.

Parameters
----------
default_extended_psf : `lsst.afw.image.MaskedImageF`
    Extended PSF model to be used as default (or only) extended PSF model.

Definition at line 107 of file extended_psf.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.pipe.tasks.extended_psf.ExtendedPsf.__init__ ( self,
default_extended_psf = None )

Definition at line 120 of file extended_psf.py.

120 def __init__(self, default_extended_psf=None):
121 self.default_extended_psf = default_extended_psf
122 self.focal_plane_regions = {}
123 self.detectors_focal_plane_regions = {}
124

Member Function Documentation

◆ __call__()

lsst.pipe.tasks.extended_psf.ExtendedPsf.__call__ ( self,
detector = None )
Return the appropriate extended PSF.

If the instance contains no extended PSF defined over focal plane
regions, the default extended PSF will be returned regardless of
whether a detector ID was passed as argument.

Parameters
----------
detector : `int`, optional
    Detector ID. If focal plane region PSFs are defined, is used to
    determine which model to return.

Returns
-------
extendedPsfImage : `lsst.afw.image.MaskedImageF`
    The extended PSF model. If this instance contains extended PSFs
    defined over focal plane regions, the extended PSF model for the
    region that contains ``detector`` is returned. If not, the default
    extended PSF is returned.

Definition at line 147 of file extended_psf.py.

147 def __call__(self, detector=None):
148 """Return the appropriate extended PSF.
149
150 If the instance contains no extended PSF defined over focal plane
151 regions, the default extended PSF will be returned regardless of
152 whether a detector ID was passed as argument.
153
154 Parameters
155 ----------
156 detector : `int`, optional
157 Detector ID. If focal plane region PSFs are defined, is used to
158 determine which model to return.
159
160 Returns
161 -------
162 extendedPsfImage : `lsst.afw.image.MaskedImageF`
163 The extended PSF model. If this instance contains extended PSFs
164 defined over focal plane regions, the extended PSF model for the
165 region that contains ``detector`` is returned. If not, the default
166 extended PSF is returned.
167 """
168 if detector is None:
169 if self.default_extended_psf is None:
170 raise ValueError("No default extended PSF available; please provide detector number.")
171 return self.default_extended_psf
172 elif not self.focal_plane_regions:
173 return self.default_extended_psf
174 return self.get_extended_psf(region_name=detector)
175

◆ __len__()

lsst.pipe.tasks.extended_psf.ExtendedPsf.__len__ ( self)
Returns the number of extended PSF models present in the instance.

Note that if the instance contains both a default model and a set of
focal plane region models, the length of the instance will be the
number of regional models, plus one (the default). This is true even
in the case where the default model is one of the focal plane
region-specific models.

Definition at line 176 of file extended_psf.py.

176 def __len__(self):
177 """Returns the number of extended PSF models present in the instance.
178
179 Note that if the instance contains both a default model and a set of
180 focal plane region models, the length of the instance will be the
181 number of regional models, plus one (the default). This is true even
182 in the case where the default model is one of the focal plane
183 region-specific models.
184 """
185 n_regions = len(self.focal_plane_regions)
186 if self.default_extended_psf is not None:
187 n_regions += 1
188 return n_regions
189

◆ add_regional_extended_psf()

lsst.pipe.tasks.extended_psf.ExtendedPsf.add_regional_extended_psf ( self,
extended_psf_image,
region_name,
region_detectors )
Add a new focal plane region, along with its extended PSF, to the
ExtendedPsf instance.

Parameters
----------
extended_psf_image : `lsst.afw.image.MaskedImageF`
    Extended PSF model for the region.
region_name : `str`
    Name of the focal plane region. Will be converted to all-uppercase.
region_detectors : `lsst.pipe.tasks.extended_psf.DetectorsInRegion`
    List of detector IDs for the detectors that define a region on the
    focal plane.

Definition at line 125 of file extended_psf.py.

125 def add_regional_extended_psf(self, extended_psf_image, region_name, region_detectors):
126 """Add a new focal plane region, along with its extended PSF, to the
127 ExtendedPsf instance.
128
129 Parameters
130 ----------
131 extended_psf_image : `lsst.afw.image.MaskedImageF`
132 Extended PSF model for the region.
133 region_name : `str`
134 Name of the focal plane region. Will be converted to all-uppercase.
135 region_detectors : `lsst.pipe.tasks.extended_psf.DetectorsInRegion`
136 List of detector IDs for the detectors that define a region on the
137 focal plane.
138 """
139 region_name = region_name.upper()
140 if region_name in self.focal_plane_regions:
141 raise ValueError(f"Region name {region_name} is already used by this ExtendedPsf instance.")
142 self.focal_plane_regions[region_name] = FocalPlaneRegionExtendedPsf(
143 extended_psf_image=extended_psf_image, region_detectors=region_detectors
144 )
145 self.detectors_focal_plane_regions[region_name] = region_detectors
146

◆ get_extended_psf()

lsst.pipe.tasks.extended_psf.ExtendedPsf.get_extended_psf ( self,
region_name )
Returns the extended PSF for a focal plane region or detector.

This method takes either a region name or a detector ID as input. If
the input is a `str` type, it is assumed to be the region name and if
the input is a `int` type it is assumed to be the detector ID.

Parameters
----------
region_name : `str` or `int`
    Name of the region (str) or detector (int) for which the extended
    PSF should be retrieved.

Returns
-------
extended_psf_image: `lsst.afw.image.MaskedImageF`
    The extended PSF model for the requested region or detector.

Raises
------
ValueError
    Raised if the input is not in the correct type.

Definition at line 190 of file extended_psf.py.

190 def get_extended_psf(self, region_name):
191 """Returns the extended PSF for a focal plane region or detector.
192
193 This method takes either a region name or a detector ID as input. If
194 the input is a `str` type, it is assumed to be the region name and if
195 the input is a `int` type it is assumed to be the detector ID.
196
197 Parameters
198 ----------
199 region_name : `str` or `int`
200 Name of the region (str) or detector (int) for which the extended
201 PSF should be retrieved.
202
203 Returns
204 -------
205 extended_psf_image: `lsst.afw.image.MaskedImageF`
206 The extended PSF model for the requested region or detector.
207
208 Raises
209 ------
210 ValueError
211 Raised if the input is not in the correct type.
212 """
213 if isinstance(region_name, str):
214 return self.focal_plane_regions[region_name].extended_psf_image
215 elif isinstance(region_name, int):
216 region_name = find_region_for_detector(region_name, self.detectors_focal_plane_regions)
217 return self.focal_plane_regions[region_name].extended_psf_image
218 else:
219 raise ValueError("A region name with `str` type or detector number with `int` must be provided")
220

◆ read_fits()

lsst.pipe.tasks.extended_psf.ExtendedPsf.read_fits ( cls,
filename )
Build an instance of this class from a file.

Parameters
----------
filename : `str`
    Name of the file to read.

Definition at line 263 of file extended_psf.py.

263 def read_fits(cls, filename):
264 """Build an instance of this class from a file.
265
266 Parameters
267 ----------
268 filename : `str`
269 Name of the file to read.
270 """
271 # Extract info from metadata.
272 global_metadata = readMetadata(filename, hdu=0)
273 has_default = global_metadata.getBool("HAS_DEFAULT")
274 if global_metadata.getBool("HAS_REGIONS"):
275 focal_plane_region_names = global_metadata.getArray("REGION_NAMES")
276 else:
277 focal_plane_region_names = []
278 f = Fits(filename, "r")
279 n_extensions = f.countHdus()
280 extended_psf_parts = {}
281 for j in range(1, n_extensions):
282 md = readMetadata(filename, hdu=j)
283 if has_default and md["REGION"] == "DEFAULT":
284 if md["EXTNAME"] == "IMAGE":
285 default_image = ImageF(filename, hdu=j)
286 elif md["EXTNAME"] == "MASK":
287 default_mask = MaskX(filename, hdu=j)
288 continue
289 if md["EXTNAME"] == "IMAGE":
290 extended_psf_part = ImageF(filename, hdu=j)
291 elif md["EXTNAME"] == "MASK":
292 extended_psf_part = MaskX(filename, hdu=j)
293 extended_psf_parts.setdefault(md["REGION"], {})[md["EXTNAME"].lower()] = extended_psf_part
294 # Handle default if present.
295 if has_default:
296 extended_psf = cls(MaskedImageF(default_image, default_mask))
297 else:
298 extended_psf = cls()
299 # Ensure we recovered an extended PSF for all focal plane regions.
300 if len(extended_psf_parts) != len(focal_plane_region_names):
301 raise ValueError(
302 f"Number of per-region extended PSFs read ({len(extended_psf_parts)}) does not "
303 "match with the number of regions recorded in the metadata "
304 f"({len(focal_plane_region_names)})."
305 )
306 # Generate extended PSF regions mappings.
307 for r_name in focal_plane_region_names:
308 extended_psf_image = MaskedImageF(**extended_psf_parts[r_name])
309 region_detectors = DetectorsInRegion()
310 region_detectors.detectors = global_metadata.getArray(r_name)
311 extended_psf.add_regional_extended_psf(extended_psf_image, r_name, region_detectors)
312 # Instantiate ExtendedPsf.
313 return extended_psf
314

◆ readFits()

lsst.pipe.tasks.extended_psf.ExtendedPsf.readFits ( cls,
filename )
Alias for ``readFits``; exists for compatibility with the Butler.

Definition at line 316 of file extended_psf.py.

316 def readFits(cls, filename):
317 """Alias for ``readFits``; exists for compatibility with the Butler."""
318 return cls.read_fits(filename)
319
320

◆ write_fits()

lsst.pipe.tasks.extended_psf.ExtendedPsf.write_fits ( self,
filename )
Write this object to a file.

Parameters
----------
filename : `str`
    Name of file to write.

Definition at line 221 of file extended_psf.py.

221 def write_fits(self, filename):
222 """Write this object to a file.
223
224 Parameters
225 ----------
226 filename : `str`
227 Name of file to write.
228 """
229 # Create primary HDU with global metadata.
230 metadata = PropertyList()
231 metadata["HAS_DEFAULT"] = self.default_extended_psf is not None
232 if self.focal_plane_regions:
233 metadata["HAS_REGIONS"] = True
234 metadata["REGION_NAMES"] = list(self.focal_plane_regions.keys())
235 for region, e_psf_region in self.focal_plane_regions.items():
236 metadata[region] = e_psf_region.region_detectors.detectors
237 else:
238 metadata["HAS_REGIONS"] = False
239 fits_primary = Fits(filename, "w")
240 fits_primary.createEmpty()
241 fits_primary.writeMetadata(metadata)
242 fits_primary.closeFile()
243 # Write default extended PSF.
244 if self.default_extended_psf is not None:
245 default_hdu_metadata = PropertyList()
246 default_hdu_metadata.update({"REGION": "DEFAULT", "EXTNAME": "IMAGE"})
247 self.default_extended_psf.image.writeFits(filename, metadata=default_hdu_metadata, mode="a")
248 default_hdu_metadata.update({"REGION": "DEFAULT", "EXTNAME": "MASK"})
249 self.default_extended_psf.mask.writeFits(filename, metadata=default_hdu_metadata, mode="a")
250 # Write extended PSF for each focal plane region.
251 for j, (region, e_psf_region) in enumerate(self.focal_plane_regions.items()):
252 metadata = PropertyList()
253 metadata.update({"REGION": region, "EXTNAME": "IMAGE"})
254 e_psf_region.extended_psf_image.image.writeFits(filename, metadata=metadata, mode="a")
255 metadata.update({"REGION": region, "EXTNAME": "MASK"})
256 e_psf_region.extended_psf_image.mask.writeFits(filename, metadata=metadata, mode="a")
257
std::vector< SchemaItem< Flag > > * items

◆ writeFits()

lsst.pipe.tasks.extended_psf.ExtendedPsf.writeFits ( self,
filename )
Alias for ``write_fits``; for compatibility with the Butler.

Definition at line 258 of file extended_psf.py.

258 def writeFits(self, filename):
259 """Alias for ``write_fits``; for compatibility with the Butler."""
260 self.write_fits(filename)
261

Member Data Documentation

◆ default_extended_psf

lsst.pipe.tasks.extended_psf.ExtendedPsf.default_extended_psf

Definition at line 121 of file extended_psf.py.

◆ detectors_focal_plane_regions

lsst.pipe.tasks.extended_psf.ExtendedPsf.detectors_focal_plane_regions

Definition at line 123 of file extended_psf.py.

◆ focal_plane_regions

lsst.pipe.tasks.extended_psf.ExtendedPsf.focal_plane_regions

Definition at line 122 of file extended_psf.py.


The documentation for this class was generated from the following file: