LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Classes | Functions
lsst.meas.algorithms.stamps Namespace Reference

Classes

class  AbstractStamp
 
class  Stamp
 
class  StampsBase
 
class  Stamps
 

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.

101 def 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.

42 def 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