296 """Make a `BrightStarStamps` object from a FITS file, with options.
301 Name of the FITS file to read.
302 options : `~lsst.daf.base.PropertyList`, optional
303 Options for reading the FITS file. Not currently used.
307 brightStarStamps : `BrightStarStamps`
308 The constructed `BrightStarStamps` instance.
310 with Fits(filename,
"r")
as fits_file:
317 for hdu_num
in range(1, fits_file.countHdus()):
318 metadata = readMetadata(filename, hdu=hdu_num)
319 extname = metadata[
"EXTNAME"]
320 stamp_id: int |
None = metadata.get(
"EXTVER",
None)
323 if metadata[
"XTENSION"] ==
"BINTABLE" and not metadata.get(
"ZIMAGE",
False):
324 if extname !=
"ARCHIVE_INDEX":
328 if extname ==
"ARCHIVE_INDEX":
329 fits_file.setHdu(hdu_num)
330 archive = InputArchive.readFits(fits_file)
332 elif metadata.get(
"EXTTYPE") ==
"ARCHIVE_DATA":
336 if extname ==
"IMAGE":
338 dtype = np.dtype(MaskedImageF.dtype)
339 stamp_psf_ids[stamp_id] = metadata.pop(
"PSF",
None)
340 stamp_wcs_ids[stamp_id] = metadata.pop(
"WCS",
None)
341 stamp_metadata[stamp_id] = metadata
342 elif extname ==
"MASK":
345 elif extname ==
"VARIANCE":
347 dtype = np.dtype(
"float32")
349 raise ValueError(f
"Unknown extension type: {extname}")
351 if stamp_id
is not None:
352 stamp_planes.setdefault(stamp_id, {})[extname.lower()] = reader.read(dtype=dtype)
354 primary_metadata = readMetadata(filename, hdu=0)
355 num_stamps = primary_metadata[
"N_STAMPS"]
357 if len(stamp_planes) != num_stamps:
359 f
"Number of stamps read ({len(stamp_planes)}) does not agree with the "
360 f
"number of stamps recorded in the primary HDU metadata ({num_stamps})."
363 raise ValueError(
"No archive index was found in the FITS file; cannot read PSF or WCS.")
365 brightStarStamps = []
366 for stamp_id
in range(1, num_stamps + 1):
367 stamp = MaskedImageF(**stamp_planes[stamp_id])
368 psf = archive.get(stamp_psf_ids[stamp_id])
369 wcs = archive.get(stamp_wcs_ids[stamp_id])
370 brightStarStamps.append(BrightStarStamp.factory(stamp, psf, wcs, stamp_metadata[stamp_id]))
372 return cls(brightStarStamps, primary_metadata)
375 """Write this `BrightStarStamps` object to a FITS file.
380 Name of the FITS file to write.
385 metadata[
"N_STAMPS"] = len(self.
_stamps)
386 metadata[
"VERSION"] = 2
387 metadata[
"STAMPCLS"] = get_full_type_name(self)
390 with Fits(filename,
"w")
as fits_file:
391 fits_file.createEmpty()
398 stamp_psf_ids.append(output_archive.put(stamp.psf))
399 stamp_wcs_ids.append(output_archive.put(stamp.wcs))
402 fits_file.writeMetadata(metadata)
404 output_archive.writeFits(fits_file)
407 for stamp_id, (stamp, stamp_psf_id, stamp_wcs_id)
in enumerate(
408 zip(self.
_stamps, stamp_psf_ids, stamp_wcs_ids),
412 metadata.update({
"EXTVER": stamp_id,
"EXTNAME":
"IMAGE"})
413 if stamp_metadata := stamp._getMetadata():
414 metadata.update(stamp_metadata)
415 metadata[
"PSF"] = stamp_psf_id
416 metadata[
"WCS"] = stamp_wcs_id
417 stamp.stamp_im.getImage().
writeFits(filename, metadata=metadata, mode=
"a")
420 metadata.update({
"EXTVER": stamp_id,
"EXTNAME":
"MASK"})
421 stamp.stamp_im.getMask().
writeFits(filename, metadata=metadata, mode=
"a")
424 metadata.update({
"EXTVER": stamp_id,
"EXTNAME":
"VARIANCE"})
425 stamp.stamp_im.getVariance().
writeFits(filename, metadata=metadata, mode=
"a")