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
Classes | Functions
lsst.meas.algorithms.stamps Namespace Reference

Classes

class  AbstractStamp
 
class  Stamp
 
class  Stamps
 
class  StampsBase
 

Functions

def writeFits (filename, stamps, metadata, type_name, write_mask, write_variance, write_archive=False)
 
def readFitsWithOptions (filename, stamp_factory, options)
 

Function Documentation

◆ readFitsWithOptions()

def lsst.meas.algorithms.stamps.readFitsWithOptions (   filename,
  stamp_factory,
  options 
)
Read stamps from FITS file, allowing for only a
subregion of the stamps to be read.

Parameters
----------
filename : `str`
    A string indicating the file to read
stamp_factory : classmethod
    A factory function defined on a dataclass for constructing
    stamp objects a la `lsst.meas.alrogithm.Stamp`
options : `PropertyList` or `dict`
    A collection of parameters. If it contains a bounding box
    (``bbox`` key), or if certain other keys (``llcX``, ``llcY``,
    ``width``, ``height``) are available for one to be  constructed,
    the bounding box is passed to the ``FitsReader`` in order to
    return a sub-image.

Returns
-------
stamps : `list` of dataclass objects like `Stamp`, PropertyList
    A tuple of a list of `Stamp`-like objects
metadata : `PropertyList`
    The metadata

Definition at line 101 of file stamps.py.

101def readFitsWithOptions(filename, stamp_factory, options):
102 """Read stamps from FITS file, allowing for only a
103 subregion of the stamps to be read.
104
105 Parameters
106 ----------
107 filename : `str`
108 A string indicating the file to read
109 stamp_factory : classmethod
110 A factory function defined on a dataclass for constructing
111 stamp objects a la `lsst.meas.alrogithm.Stamp`
112 options : `PropertyList` or `dict`
113 A collection of parameters. If it contains a bounding box
114 (``bbox`` key), or if certain other keys (``llcX``, ``llcY``,
115 ``width``, ``height``) are available for one to be constructed,
116 the bounding box is passed to the ``FitsReader`` in order to
117 return a sub-image.
118
119 Returns
120 -------
121 stamps : `list` of dataclass objects like `Stamp`, PropertyList
122 A tuple of a list of `Stamp`-like objects
123 metadata : `PropertyList`
124 The metadata
125 """
126 # extract necessary info from metadata
127 metadata = afwFits.readMetadata(filename, hdu=0)
128 nStamps = metadata["N_STAMPS"]
129 has_archive = metadata["HAS_ARCHIVE"]
130 if has_archive:
131 archive_ids = metadata.getArray("ARCHIVE_IDS")
132 with afwFits.Fits(filename, 'r') as f:
133 nExtensions = f.countHdus()
134 # check if a bbox was provided
135 kwargs = {}
136 if options:
137 # gen3 API
138 if "bbox" in options.keys():
139 kwargs["bbox"] = options["bbox"]
140 # gen2 API
141 elif "llcX" in options.keys():
142 llcX = options["llcX"]
143 llcY = options["llcY"]
144 width = options["width"]
145 height = options["height"]
146 bbox = Box2I(Point2I(llcX, llcY), Extent2I(width, height))
147 kwargs["bbox"] = bbox
148 stamp_parts = {}
149 # We need to be careful because nExtensions includes the primary
150 # header data unit
151 for idx in range(nExtensions-1):
152 md = afwFits.readMetadata(filename, hdu=idx+1)
153 if md['EXTNAME'] in ('IMAGE', 'VARIANCE'):
154 reader = afwImage.ImageFitsReader(filename, hdu=idx+1)
155 elif md['EXTNAME'] == 'MASK':
156 reader = afwImage.MaskFitsReader(filename, hdu=idx+1)
157 elif md['EXTNAME'] == 'ARCHIVE_INDEX':
158 f.setHdu(idx+1)
159 archive = afwTable.io.InputArchive.readFits(f)
160 continue
161 elif md['EXTTYPE'] == 'ARCHIVE_DATA':
162 continue
163 else:
164 raise ValueError(f"Unknown extension type: {md['EXTNAME']}")
165 stamp_parts.setdefault(md['EXTVER'], {})[md['EXTNAME'].lower()] = reader.read(**kwargs)
166 if len(stamp_parts) != nStamps:
167 raise ValueError(f'Number of stamps read ({len(stamp_parts)}) does not agree with the '
168 f'number of stamps recorded in the metadata ({nStamps}).')
169 # construct stamps themselves
170 stamps = []
171 for k in range(nStamps):
172 # Need to increment by one since EXTVER starts at 1
173 maskedImage = afwImage.MaskedImageF(**stamp_parts[k+1])
174 archive_element = archive.get(archive_ids[k]) if has_archive else None
175 stamps.append(stamp_factory(maskedImage, metadata, k, archive_element))
176
177 return stamps, metadata
178
179
180@dataclass
A FITS reader class for regular Images.
A FITS reader class for Masks.
Extent< int, 2 > Extent2I
Definition: Extent.h:397
Point< int, 2 > Point2I
Definition: Point.h:321
def readFitsWithOptions(filename, stamp_factory, options)
Definition: stamps.py:101

◆ writeFits()

def lsst.meas.algorithms.stamps.writeFits (   filename,
  stamps,
  metadata,
  type_name,
  write_mask,
  write_variance,
  write_archive = False 
)
Write a single FITS file containing all stamps.

Parameters
----------
filename : `str`
    A string indicating the output filename
stamps : iterable of `BaseStamp`
    An iterable of Stamp objects
metadata : `PropertyList`
    A collection of key, value metadata pairs to be
    written to the primary header
type_name : `str`
    Python type name of the StampsBase subclass to use
write_mask : `bool`
    Write the mask data to the output file?
write_variance : `bool`
    Write the variance data to the output file?
write_archive : `bool`, optional
    Write an archive to store Persistables along with each stamp?
    Default: ``False``.

Definition at line 42 of file stamps.py.

42def writeFits(filename, stamps, metadata, type_name, write_mask, write_variance, write_archive=False):
43 """Write a single FITS file containing all stamps.
44
45 Parameters
46 ----------
47 filename : `str`
48 A string indicating the output filename
49 stamps : iterable of `BaseStamp`
50 An iterable of Stamp objects
51 metadata : `PropertyList`
52 A collection of key, value metadata pairs to be
53 written to the primary header
54 type_name : `str`
55 Python type name of the StampsBase subclass to use
56 write_mask : `bool`
57 Write the mask data to the output file?
58 write_variance : `bool`
59 Write the variance data to the output file?
60 write_archive : `bool`, optional
61 Write an archive to store Persistables along with each stamp?
62 Default: ``False``.
63 """
64 metadata['HAS_MASK'] = write_mask
65 metadata['HAS_VARIANCE'] = write_variance
66 metadata['HAS_ARCHIVE'] = write_archive
67 metadata['N_STAMPS'] = len(stamps)
68 metadata['STAMPCLS'] = type_name
69 # Record version number in case of future code changes
70 metadata['VERSION'] = 1
71 # create primary HDU with global metadata
72 fitsFile = afwFits.Fits(filename, "w")
73 fitsFile.createEmpty()
74 # Store Persistables in an OutputArchive and write it
75 if write_archive:
76 oa = afwTable.io.OutputArchive()
77 archive_ids = [oa.put(stamp.archive_element) for stamp in stamps]
78 metadata["ARCHIVE_IDS"] = archive_ids
79 fitsFile.writeMetadata(metadata)
80 oa.writeFits(fitsFile)
81 else:
82 fitsFile.writeMetadata(metadata)
83 fitsFile.closeFile()
84 # add all pixel data optionally writing mask and variance information
85 for i, stamp in enumerate(stamps):
86 metadata = PropertyList()
87 # EXTVER should be 1-based, the index from enumerate is 0-based
88 metadata.update({'EXTVER': i+1, 'EXTNAME': 'IMAGE'})
89 stamp.stamp_im.getImage().writeFits(filename, metadata=metadata, mode='a')
90 if write_mask:
91 metadata = PropertyList()
92 metadata.update({'EXTVER': i+1, 'EXTNAME': 'MASK'})
93 stamp.stamp_im.getMask().writeFits(filename, metadata=metadata, mode='a')
94 if write_variance:
95 metadata = PropertyList()
96 metadata.update({'EXTVER': i+1, 'EXTNAME': 'VARIANCE'})
97 stamp.stamp_im.getVariance().writeFits(filename, metadata=metadata, mode='a')
98 return None
99
100
def writeFits(filename, stamps, metadata, type_name, write_mask, write_variance, write_archive=False)
Definition: stamps.py:42