284 """Make a `BrightStarStamps` object from a FITS file, with options.
289 Name of the FITS file to read.
290 options : `~lsst.daf.base.PropertyList`, optional
291 Options for reading the FITS file. Not currently used.
295 brightStarStamps : `BrightStarStamps`
296 The constructed `BrightStarStamps` instance.
298 with Fits(filename,
"r")
as fits_file:
305 for hdu_num
in range(1, fits_file.countHdus()):
306 metadata = readMetadata(filename, hdu=hdu_num)
307 extname = metadata[
"EXTNAME"]
308 stamp_id: int |
None = metadata.get(
"EXTVER",
None)
311 if metadata[
"XTENSION"] ==
"BINTABLE" and not metadata.get(
"ZIMAGE",
False):
312 if extname !=
"ARCHIVE_INDEX":
316 if extname ==
"ARCHIVE_INDEX":
317 fits_file.setHdu(hdu_num)
318 archive = InputArchive.readFits(fits_file)
320 elif metadata.get(
"EXTTYPE") ==
"ARCHIVE_DATA":
324 if extname ==
"IMAGE":
326 dtype = np.dtype(MaskedImageF.dtype)
327 stamp_psf_ids[stamp_id] = metadata.pop(
"PSF",
None)
328 stamp_wcs_ids[stamp_id] = metadata.pop(
"WCS",
None)
329 stamp_metadata[stamp_id] = metadata
330 elif extname ==
"MASK":
333 elif extname ==
"VARIANCE":
335 dtype = np.dtype(
"float32")
337 raise ValueError(f
"Unknown extension type: {extname}")
339 if stamp_id
is not None:
340 stamp_planes.setdefault(stamp_id, {})[extname.lower()] = reader.read(dtype=dtype)
342 primary_metadata = readMetadata(filename, hdu=0)
343 num_stamps = primary_metadata[
"N_STAMPS"]
345 if len(stamp_planes) != num_stamps:
347 f
"Number of stamps read ({len(stamp_planes)}) does not agree with the "
348 f
"number of stamps recorded in the primary HDU metadata ({num_stamps})."
351 raise ValueError(
"No archive index was found in the FITS file; cannot read PSF or WCS.")
353 brightStarStamps = []
354 for stamp_id
in range(1, num_stamps + 1):
355 stamp = MaskedImageF(**stamp_planes[stamp_id])
356 psf = archive.get(stamp_psf_ids[stamp_id])
357 wcs = archive.get(stamp_wcs_ids[stamp_id])
358 brightStarStamps.append(BrightStarStamp.factory(stamp, psf, wcs, stamp_metadata[stamp_id]))
360 return cls(brightStarStamps, primary_metadata)
363 """Write this `BrightStarStamps` object to a FITS file.
368 Name of the FITS file to write.
373 metadata[
"N_STAMPS"] = len(self.
_stamps)
374 metadata[
"VERSION"] = 2
375 metadata[
"STAMPCLS"] = get_full_type_name(self)
378 with Fits(filename,
"w")
as fits_file:
379 fits_file.createEmpty()
386 stamp_psf_ids.append(output_archive.put(stamp.psf))
387 stamp_wcs_ids.append(output_archive.put(stamp.wcs))
390 fits_file.writeMetadata(metadata)
392 output_archive.writeFits(fits_file)
395 for stamp_id, (stamp, stamp_psf_id, stamp_wcs_id)
in enumerate(
396 zip(self.
_stamps, stamp_psf_ids, stamp_wcs_ids),
400 metadata.update({
"EXTVER": stamp_id,
"EXTNAME":
"IMAGE"})
401 if stamp_metadata := stamp._getMetadata():
402 metadata.update(stamp_metadata)
403 metadata[
"PSF"] = stamp_psf_id
404 metadata[
"WCS"] = stamp_wcs_id
405 stamp.stamp_im.getImage().
writeFits(filename, metadata=metadata, mode=
"a")
408 metadata.update({
"EXTVER": stamp_id,
"EXTNAME":
"MASK"})
409 stamp.stamp_im.getMask().
writeFits(filename, metadata=metadata, mode=
"a")
412 metadata.update({
"EXTVER": stamp_id,
"EXTNAME":
"VARIANCE"})
413 stamp.stamp_im.getVariance().
writeFits(filename, metadata=metadata, mode=
"a")