LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+4b710797af,21.0.0-1-gfc31b0f+3b24369756,21.0.0-10-g2408eff+50e97f2f47,21.0.0-10-g560fb7b+0803ad37c5,21.0.0-10-g5daeb2b+f9b8dc6d5a,21.0.0-10-g8d1d15d+77a6b82ebf,21.0.0-10-gcf60f90+c961be884d,21.0.0-11-g25eff31+7692554667,21.0.0-17-g6590b197+a14a01c114,21.0.0-2-g103fe59+b79afc2051,21.0.0-2-g1367e85+1003a3501c,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+1003a3501c,21.0.0-2-g7f82c8f+c2a1919b98,21.0.0-2-g8f08a60+fd0b970de5,21.0.0-2-ga326454+c2a1919b98,21.0.0-2-gde069b7+ca45a81b40,21.0.0-2-gecfae73+afcaaec585,21.0.0-2-gfc62afb+1003a3501c,21.0.0-21-g5d80ea29e+5e3c9a3766,21.0.0-3-g357aad2+c67f36f878,21.0.0-3-g4be5c26+1003a3501c,21.0.0-3-g65f322c+02b1f88459,21.0.0-3-g7d9da8d+3b24369756,21.0.0-3-ge02ed75+a423c2ae7a,21.0.0-4-g591bb35+a423c2ae7a,21.0.0-4-g65b4814+0803ad37c5,21.0.0-4-g88306b8+199c7497e5,21.0.0-4-gccdca77+a631590478,21.0.0-4-ge8a399c+b923ff878e,21.0.0-5-gd00fb1e+d8b1e95daa,21.0.0-53-ge728e5d5+3cb64fea8e,21.0.0-6-g2d4f3f3+04719a4bac,21.0.0-7-g04766d7+8d320c19d5,21.0.0-7-g98eecf7+205433fbda,21.0.0-9-g39e06b5+a423c2ae7a,master-gac4afde19b+a423c2ae7a,w.2021.11
LSST Data Management Base Package
Public Member Functions | Static Public Member Functions | List of all members
lsst.afw.image.exposure.multiband.MultibandExposure Class Reference
Inheritance diagram for lsst.afw.image.exposure.multiband.MultibandExposure:
lsst.afw.image.image.multiband.MultibandTripleBase lsst.afw.multiband.MultibandBase

Public Member Functions

def __init__ (self, filters, image, mask, variance, psfs=None)
 
def computePsfKernelImage (self, position=None)
 
def computePsfImage (self, position=None)
 
def setXY0 (self, xy0)
 
def shiftedTo (self, xy0)
 
def clone (self, deep=True)
 
def image (self)
 
def mask (self)
 
def variance (self)
 
def getBBox (self, origin=PARENT)
 
def getBBox (self)
 
def filters (self)
 
def singles (self)
 
def getXY0 (self)
 
def x0 (self)
 
def y0 (self)
 
def origin (self)
 
def width (self)
 
def height (self)
 
def __len__ (self)
 
def __getitem__ (self, args)
 
def __iter__ (self)
 
def __next__ (self)
 
def shiftedBy (self, offset)
 
def __repr__ (self)
 
def __str__ (self)
 

Static Public Member Functions

def fromExposures (filters, singles)
 
def fromArrays (filters, image, mask, variance, bbox=None)
 
def fromKwargs (filters, filterKwargs, singleType=ExposureF, **kwargs)
 
def fromButler (butler, filters, filterKwargs, *args, **kwargs)
 

Detailed Description

MultibandExposure class

This class acts as a container for multiple `afw.Exposure` objects.
All exposures must have the same bounding box, and the associated
images must all have the same data type.

See `MultibandTripleBase` for parameter definitions.

Definition at line 33 of file multiband.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.afw.image.exposure.multiband.MultibandExposure.__init__ (   self,
  filters,
  image,
  mask,
  variance,
  psfs = None 
)

Definition at line 42 of file multiband.py.

42  def __init__(self, filters, image, mask, variance, psfs=None):
43  super().__init__(filters, image, mask, variance)
44  if psfs is not None:
45  for psf, exposure in zip(psfs, self.singles):
46  exposure.setPsf(psf)
47 

Member Function Documentation

◆ __getitem__()

def lsst.afw.multiband.MultibandBase.__getitem__ (   self,
  args 
)
inherited
Get a slice of the underlying array

If only a single filter is specified,
return the single band object sliced
appropriately.

Reimplemented in lsst.afw.image.image.multiband.MultibandPixel.

Definition at line 147 of file multiband.py.

147  def __getitem__(self, args):
148  """Get a slice of the underlying array
149 
150  If only a single filter is specified,
151  return the single band object sliced
152  appropriately.
153  """
154  if not isinstance(args, tuple):
155  indices = (args,)
156  else:
157  indices = args
158 
159  # Return the single band object if the first
160  # index is not a list or slice.
161  filters, filterIndex = self._filterNamesToIndex(indices[0])
162  if not isinstance(filterIndex, slice) and len(filterIndex) == 1:
163  if len(indices) > 2:
164  return self.singles[filterIndex[0]][indices[1:]]
165  elif len(indices) == 2:
166  return self.singles[filterIndex[0]][indices[1]]
167  else:
168  return self.singles[filterIndex[0]]
169 
170  return self._slice(filters=filters, filterIndex=filterIndex, indices=indices[1:])
171 

◆ __iter__()

def lsst.afw.multiband.MultibandBase.__iter__ (   self)
inherited

Definition at line 172 of file multiband.py.

172  def __iter__(self):
173  self._filterIndex = 0
174  return self
175 

◆ __len__()

def lsst.afw.multiband.MultibandBase.__len__ (   self)
inherited

Definition at line 144 of file multiband.py.

144  def __len__(self):
145  return len(self.filters)
146 

◆ __next__()

def lsst.afw.multiband.MultibandBase.__next__ (   self)
inherited

Definition at line 176 of file multiband.py.

176  def __next__(self):
177  if self._filterIndex < len(self.filters):
178  result = self.singles[self._filterIndex]
179  self._filterIndex += 1
180  else:
181  raise StopIteration
182  return result
183 

◆ __repr__()

def lsst.afw.multiband.MultibandBase.__repr__ (   self)
inherited

Definition at line 310 of file multiband.py.

310  def __repr__(self):
311  result = "<{0}, filters={1}, bbox={2}>".format(
312  self.__class__.__name__, self.filters, self.getBBox().__repr__())
313  return result
314 
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174

◆ __str__()

def lsst.afw.multiband.MultibandBase.__str__ (   self)
inherited

Definition at line 315 of file multiband.py.

315  def __str__(self):
316  if hasattr(self, "array"):
317  return str(self.array)
318  return self.__repr__()

◆ clone()

def lsst.afw.image.image.multiband.MultibandTripleBase.clone (   self,
  deep = True 
)
inherited
Make a copy of the current instance

Reimplemented from lsst.afw.multiband.MultibandBase.

Definition at line 639 of file multiband.py.

639  def clone(self, deep=True):
640  """Make a copy of the current instance
641  """
642  image = self.image.clone(deep)
643  if self.mask is not None:
644  mask = self.mask.clone(deep)
645  else:
646  mask = None
647  if self.variance is not None:
648  variance = self.variance.clone(deep)
649  else:
650  variance = None
651  return type(self)(self.filters, image, mask, variance)
652 
table::Key< int > type
Definition: Detector.cc:163

◆ computePsfImage()

def lsst.afw.image.exposure.multiband.MultibandExposure.computePsfImage (   self,
  position = None 
)
Get a multiband PSF image

The PSF Kernel Image is computed for each band
and combined into a (filter, y, x) array and stored
as `self._psfImage`.
The result is not cached, so if the same PSF is expected
to be used multiple times it is a good idea to store the
result in another variable.

Parameters
----------
position: `Point2D` or `tuple`
    Coordinates to evaluate the PSF. If `position` is `None`
    then `Psf.getAveragePosition()` is used.

Returns
-------
self._psfImage: array
    The multiband PSF image.

Definition at line 183 of file multiband.py.

183  def computePsfImage(self, position=None):
184  """Get a multiband PSF image
185 
186  The PSF Kernel Image is computed for each band
187  and combined into a (filter, y, x) array and stored
188  as `self._psfImage`.
189  The result is not cached, so if the same PSF is expected
190  to be used multiple times it is a good idea to store the
191  result in another variable.
192 
193  Parameters
194  ----------
195  position: `Point2D` or `tuple`
196  Coordinates to evaluate the PSF. If `position` is `None`
197  then `Psf.getAveragePosition()` is used.
198 
199  Returns
200  -------
201  self._psfImage: array
202  The multiband PSF image.
203  """
204  psfs = []
205  # Make the coordinates into a Point2D (if necessary)
206  if not isinstance(position, Point2D) and position is not None:
207  position = Point2D(position[0], position[1])
208  for single in self.singles:
209  if position is None:
210  psfs.append(single.getPsf().computeImage().array)
211  else:
212  psfs.append(single.getPsf().computeImage(position).array)
213  psfs = np.array(psfs)
214  psfImage = MultibandImage(self.filters, array=psfs)
215  return psfImage
Point< double, 2 > Point2D
Definition: Point.h:324

◆ computePsfKernelImage()

def lsst.afw.image.exposure.multiband.MultibandExposure.computePsfKernelImage (   self,
  position = None 
)
Get a multiband PSF image

The PSF Kernel Image is computed for each band
and combined into a (filter, y, x) array and stored
as `self._psfImage`.
The result is not cached, so if the same PSF is expected
to be used multiple times it is a good idea to store the
result in another variable.

Parameters
----------
position: `Point2D` or `tuple`
    Coordinates to evaluate the PSF. If `position` is `None`
    then `Psf.getAveragePosition()` is used.

Returns
-------
self._psfImage: array
    The multiband PSF image.

Definition at line 149 of file multiband.py.

149  def computePsfKernelImage(self, position=None):
150  """Get a multiband PSF image
151 
152  The PSF Kernel Image is computed for each band
153  and combined into a (filter, y, x) array and stored
154  as `self._psfImage`.
155  The result is not cached, so if the same PSF is expected
156  to be used multiple times it is a good idea to store the
157  result in another variable.
158 
159  Parameters
160  ----------
161  position: `Point2D` or `tuple`
162  Coordinates to evaluate the PSF. If `position` is `None`
163  then `Psf.getAveragePosition()` is used.
164 
165  Returns
166  -------
167  self._psfImage: array
168  The multiband PSF image.
169  """
170  psfs = []
171  # Make the coordinates into a Point2D (if necessary)
172  if not isinstance(position, Point2D) and position is not None:
173  position = Point2D(position[0], position[1])
174  for single in self.singles:
175  if position is None:
176  psfs.append(single.getPsf().computeKernelImage().array)
177  else:
178  psfs.append(single.getPsf().computeKernelImage(position).array)
179  psfs = np.array(psfs)
180  psfImage = MultibandImage(self.filters, array=psfs)
181  return psfImage
182 

◆ filters()

def lsst.afw.multiband.MultibandBase.filters (   self)
inherited
List of filter names for the single band objects

Definition at line 86 of file multiband.py.

86  def filters(self):
87  """List of filter names for the single band objects
88  """
89  return self._filters
90 

◆ fromArrays()

def lsst.afw.image.exposure.multiband.MultibandExposure.fromArrays (   filters,
  image,
  mask,
  variance,
  bbox = None 
)
static
Construct a MultibandExposure from a collection of arrays

see `tripleFromArrays` for a description of parameters

Definition at line 58 of file multiband.py.

58  def fromArrays(filters, image, mask, variance, bbox=None):
59  """Construct a MultibandExposure from a collection of arrays
60 
61  see `tripleFromArrays` for a description of parameters
62  """
63  return tripleFromArrays(MultibandExposure, filters, image, mask, variance, bbox)
64 
def tripleFromArrays(cls, filters, image, mask, variance, bbox=None)
Definition: multiband.py:739

◆ fromButler()

def lsst.afw.image.exposure.multiband.MultibandExposure.fromButler (   butler,
  filters,
  filterKwargs,
args,
**  kwargs 
)
static
Load a multiband exposure from a butler

Because each band is stored in a separate exposure file,
this method can be used to load all of the exposures for
a given set of bands

Parameters
----------
butler: `Butler`
    Butler connection to use to load the single band
    calibrated images
filters: `list` or `str`
    List of filter names for each band
filterKwargs: `dict`
    Keyword arguments to pass to the Butler
    that are different for each filter.
    The keys are the names of the arguments and the values
    should also be dictionaries, with filter names as keys
    and the value of the argument for the given filter as values.
args: `list`
    Arguments to the Butler.
kwargs: `dict`
    Keyword arguments to pass to the Butler
    that are the same in all bands.

Returns
-------
result: `MultibandExposure`
    The new `MultibandExposure` created by combining all of the
    single band exposures.

Definition at line 108 of file multiband.py.

108  def fromButler(butler, filters, filterKwargs, *args, **kwargs):
109  """Load a multiband exposure from a butler
110 
111  Because each band is stored in a separate exposure file,
112  this method can be used to load all of the exposures for
113  a given set of bands
114 
115  Parameters
116  ----------
117  butler: `Butler`
118  Butler connection to use to load the single band
119  calibrated images
120  filters: `list` or `str`
121  List of filter names for each band
122  filterKwargs: `dict`
123  Keyword arguments to pass to the Butler
124  that are different for each filter.
125  The keys are the names of the arguments and the values
126  should also be dictionaries, with filter names as keys
127  and the value of the argument for the given filter as values.
128  args: `list`
129  Arguments to the Butler.
130  kwargs: `dict`
131  Keyword arguments to pass to the Butler
132  that are the same in all bands.
133 
134  Returns
135  -------
136  result: `MultibandExposure`
137  The new `MultibandExposure` created by combining all of the
138  single band exposures.
139  """
140  # Load the Exposure in each band
141  exposures = []
142  for f in filters:
143  if filterKwargs is not None:
144  for key, value in filterKwargs:
145  kwargs[key] = value[f]
146  exposures.append(butler.get(*args, filter=f, **kwargs))
147  return MultibandExposure.fromExposures(filters, exposures)
148 

◆ fromExposures()

def lsst.afw.image.exposure.multiband.MultibandExposure.fromExposures (   filters,
  singles 
)
static
Construct a MultibandImage from a collection of single band images

see `tripleFromExposures` for a description of parameters

Definition at line 49 of file multiband.py.

49  def fromExposures(filters, singles):
50  """Construct a MultibandImage from a collection of single band images
51 
52  see `tripleFromExposures` for a description of parameters
53  """
54  psfs = [s.getPsf() for s in singles]
55  return tripleFromSingles(MultibandExposure, filters, singles, psfs=psfs)
56 
def tripleFromSingles(cls, filters, singles, **kwargs)
Definition: multiband.py:720

◆ fromKwargs()

def lsst.afw.image.exposure.multiband.MultibandExposure.fromKwargs (   filters,
  filterKwargs,
  singleType = ExposureF,
**  kwargs 
)
static
Build a MultibandImage from a set of keyword arguments

see `makeTripleFromKwargs` for a description of parameters

Definition at line 66 of file multiband.py.

66  def fromKwargs(filters, filterKwargs, singleType=ExposureF, **kwargs):
67  """Build a MultibandImage from a set of keyword arguments
68 
69  see `makeTripleFromKwargs` for a description of parameters
70  """
71  return makeTripleFromKwargs(MultibandExposure, filters, filterKwargs, singleType, **kwargs)
72 
def makeTripleFromKwargs(cls, filters, filterKwargs, singleType, **kwargs)
Definition: multiband.py:770

◆ getBBox() [1/2]

def lsst.afw.multiband.MultibandBase.getBBox (   self)
inherited
Bounding box

Definition at line 97 of file multiband.py.

97  def getBBox(self):
98  """Bounding box
99  """
100  return self._bbox
101 

◆ getBBox() [2/2]

def lsst.afw.image.image.multiband.MultibandTripleBase.getBBox (   self,
  origin = PARENT 
)
inherited
Bounding box

Definition at line 710 of file multiband.py.

710  def getBBox(self, origin=PARENT):
711  """Bounding box
712  """
713  if origin == PARENT:
714  return self._bbox
715  elif origin == LOCAL:
716  return Box2I(Point2I(0, 0), self._bbox.getDimensions())
717  raise ValueError("Unrecognized origin, expected either PARENT or LOCAL")
718 
719 
Point< int, 2 > Point2I
Definition: Point.h:321

◆ getXY0()

def lsst.afw.multiband.MultibandBase.getXY0 (   self)
inherited
Minimum coordinate in the bounding box

Definition at line 102 of file multiband.py.

102  def getXY0(self):
103  """Minimum coordinate in the bounding box
104  """
105  return self.getBBox().getMin()
106 

◆ height()

def lsst.afw.multiband.MultibandBase.height (   self)
inherited
Height of the images

Definition at line 139 of file multiband.py.

139  def height(self):
140  """Height of the images
141  """
142  return self.getBBox().getHeight()
143 

◆ image()

def lsst.afw.image.image.multiband.MultibandTripleBase.image (   self)
inherited
The image of the MultibandMaskedImage

Definition at line 696 of file multiband.py.

696  def image(self):
697  """The image of the MultibandMaskedImage"""
698  return self._image
699 
afw::table::Key< afw::table::Array< ImagePixelT > > image

◆ mask()

def lsst.afw.image.image.multiband.MultibandTripleBase.mask (   self)
inherited
The mask of the MultibandMaskedImage

Definition at line 701 of file multiband.py.

701  def mask(self):
702  """The mask of the MultibandMaskedImage"""
703  return self._mask
704 
afw::table::Key< afw::table::Array< MaskPixelT > > mask

◆ origin()

def lsst.afw.multiband.MultibandBase.origin (   self)
inherited
Minimum (y,x) position

This is the position of `self.getBBox().getMin()`,
but available as a tuple for numpy array indexing.

Definition at line 124 of file multiband.py.

124  def origin(self):
125  """Minimum (y,x) position
126 
127  This is the position of `self.getBBox().getMin()`,
128  but available as a tuple for numpy array indexing.
129  """
130  return (self.y0, self.x0)
131 

◆ setXY0()

def lsst.afw.image.image.multiband.MultibandTripleBase.setXY0 (   self,
  xy0 
)
inherited
Shift the bounding box but keep the same Extent
This is different than `MultibandBase.setXY0`
because the multiband `image`, `mask`, and `variance` objects
must all have their bounding boxes updated.
Parameters
----------
xy0 : `Point2I`
   New minimum bounds of the bounding box

Reimplemented from lsst.afw.multiband.MultibandBase.

Definition at line 595 of file multiband.py.

595  def setXY0(self, xy0):
596  """Shift the bounding box but keep the same Extent
597  This is different than `MultibandBase.setXY0`
598  because the multiband `image`, `mask`, and `variance` objects
599  must all have their bounding boxes updated.
600  Parameters
601  ----------
602  xy0 : `Point2I`
603  New minimum bounds of the bounding box
604  """
605  super().setXY0(xy0)
606  self.image.setXY0(xy0)
607  if self.mask is not None:
608  self.mask.setXY0(xy0)
609  if self.variance is not None:
610  self.variance.setXY0(xy0)
611 

◆ shiftedBy()

def lsst.afw.multiband.MultibandBase.shiftedBy (   self,
  offset 
)
inherited
Shift a bounding box by an offset, but keep the same Extent

This method is broken until DM-10781 is completed.

Parameters
----------
offset: `Extent2I`
    Amount to shift the bounding box in x and y.

Returns
-------
result: `MultibandBase`
    A copy of the object, shifted by `offset`

Definition at line 262 of file multiband.py.

262  def shiftedBy(self, offset):
263  """Shift a bounding box by an offset, but keep the same Extent
264 
265  This method is broken until DM-10781 is completed.
266 
267  Parameters
268  ----------
269  offset: `Extent2I`
270  Amount to shift the bounding box in x and y.
271 
272  Returns
273  -------
274  result: `MultibandBase`
275  A copy of the object, shifted by `offset`
276  """
277  raise NotImplementedError("shiftedBy not implemented until DM-10781")
278  xy0 = self._bbox.getMin() + offset
279  return self.shiftedTo(xy0)
280 

◆ shiftedTo()

def lsst.afw.image.image.multiband.MultibandTripleBase.shiftedTo (   self,
  xy0 
)
inherited
Shift the bounding box but keep the same Extent

This is different than `MultibandBase.shiftedTo`
because the multiband `image`, `mask`, and `variance` objects
must all have their bounding boxes updated.

Parameters
----------
xy0 : `Point2I`
   New minimum bounds of the bounding box

Returns
-------
result : `MultibandBase`
   A copy of the object, shifted to `xy0`.

Reimplemented from lsst.afw.multiband.MultibandBase.

Definition at line 612 of file multiband.py.

612  def shiftedTo(self, xy0):
613  """Shift the bounding box but keep the same Extent
614 
615  This is different than `MultibandBase.shiftedTo`
616  because the multiband `image`, `mask`, and `variance` objects
617  must all have their bounding boxes updated.
618 
619  Parameters
620  ----------
621  xy0 : `Point2I`
622  New minimum bounds of the bounding box
623 
624  Returns
625  -------
626  result : `MultibandBase`
627  A copy of the object, shifted to `xy0`.
628  """
629  raise NotImplementedError("shiftedTo not implemented until DM-10781")
630  result = self.clone(False)
631  result._image = result.image.shiftedTo(xy0)
632  if self.mask is not None:
633  result._mask = result.mask.shiftedTo(xy0)
634  if self.variance is not None:
635  result._variance = result.variance.shiftedTo(xy0)
636  result._bbox = result.image.getBBox()
637  return result
638 

◆ singles()

def lsst.afw.multiband.MultibandBase.singles (   self)
inherited
List of single band objects

Definition at line 92 of file multiband.py.

92  def singles(self):
93  """List of single band objects
94  """
95  return self._singles
96 

◆ variance()

def lsst.afw.image.image.multiband.MultibandTripleBase.variance (   self)
inherited
The variance of the MultibandMaskedImage

Definition at line 706 of file multiband.py.

706  def variance(self):
707  """The variance of the MultibandMaskedImage"""
708  return self._variance
709 
afw::table::Key< afw::table::Array< VariancePixelT > > variance

◆ width()

def lsst.afw.multiband.MultibandBase.width (   self)
inherited
Width of the images

Definition at line 133 of file multiband.py.

133  def width(self):
134  """Width of the images
135  """
136  return self.getBBox().getWidth()
137 

◆ x0()

def lsst.afw.multiband.MultibandBase.x0 (   self)
inherited
X0

X component of XY0 `Point2I.getX()`

Definition at line 108 of file multiband.py.

108  def x0(self):
109  """X0
110 
111  X component of XY0 `Point2I.getX()`
112  """
113  return self.getBBox().getMinX()
114 

◆ y0()

def lsst.afw.multiband.MultibandBase.y0 (   self)
inherited
Y0

Y component of XY0 `Point2I.getY()`

Definition at line 116 of file multiband.py.

116  def y0(self):
117  """Y0
118 
119  Y component of XY0 `Point2I.getY()`
120  """
121  return self.getBBox().getMinY()
122 

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