Skip to content

PSFs

PSF

Bases: Base

A simple class that holds the state of some PSF as it it transformed by detector layers.

Attributes:

Name Type Description
data Array

The psf as it is transformed by the detector.

pixel_scale Array

The pixel scale of the psf.

Source code in src/dLux/psfs.py
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
class PSF(Base):
    """
    A simple class that holds the state of some PSF as it it transformed by detector
    layers.

    Attributes
    ----------
    data : Array
        The psf as it is transformed by the detector.
    pixel_scale : Array
        The pixel scale of the psf.
    """

    data: Array
    pixel_scale: Array

    def __init__(self: PSF, data: Array, pixel_scale: Array):
        """
        Parameters
        ----------
        data : Array
            The psf to be transformed by the detector.
        pixel_scale : Array
            The pixel scale of the psf.
        """
        self.data = np.asarray(data, dtype=float)
        self.pixel_scale = np.asarray(pixel_scale, dtype=float)

    @property
    def npixels(self: PSF) -> int:
        """
        Returns the side length of the arrays currently representing the psf.

        Returns
        -------
        npixels : int
            The number of pixels that represent the `PSF`.
        """
        return self.data.shape[-1]

    @property
    def ndim(self: PSF) -> int:
        """
        Returns the number of 'dimensions' of the psf. This is used to track the
        vectorised version of the psf returned from vmapping.

        Returns
        -------
        ndim : int
            The 'dimensionality' of dimensions of the psf.
        """
        return self.pixel_scale.ndim

    def downsample(self: PSF, n: int) -> PSF:
        """
        Downsamples the psf by a factor of n. This is done by summing the psf pixels in
        n x n blocks.

        Parameters
        ----------
        n : int
            The factor by which to downsample the psf.

        Returns
        -------
        psf : PSF
            The downsampled psf.
        """
        return self.set("data", dlu.downsample(self.data, n, mean=False))

    def convolve(self: PSF, other: Array, method: str = "auto") -> PSF:
        """
        Convolves the psf with some input array.

        Parameters
        ----------
        other : Array
            The psf to convolve with.
        method : str = "auto"
            The method to use for the convolution. Can be "auto", "direct",
            or "fft". Is "auto" by default, which calls "direct".

        Returns
        -------
        psf : PSF
            The convolved psf.
        """
        return self.set(
            "data", convolve(self.data, other, mode="same", method=method)
        )

    def rotate(self: PSF, angle: float, order: int = 1) -> PSF:
        """
        Rotates the psf by a given angle via interpolation.

        Parameters
        ----------
        angle : float
            The angle by which to rotate the psf.
        order : int = 1
            The order of the interpolation method to use.

        Returns
        -------
        psf : PSF
            The rotated psf.
        """
        return self.set("data", dlu.rotate(self.data, angle, order=order))

    def resize(self: PSF, npixels: int) -> PSF:
        """
        Resizes the psf via a zero-padding or cropping operation.

        Parameters
        ----------
        npixels : int
            The size to resize the psf to.

        Returns
        -------
        psf : PSF
            The resized psf.
        """
        return self.set("data", dlu.resize(self.data, npixels))

    def flip(self: PSF, axis: tuple) -> PSF:
        """
        Flips the psf along the specified axes. Note we use 'ij' indexing, so axis 0 is
        the y-axis and axis 1 is the x-axis.

        Parameters
        ----------
        axis : tuple
            The axes along which to flip the PSF.

        Returns
        -------
        psf : PSF
            The new flipped PSF.
        """
        return self.set("data", np.flip(self.data, axis))

    def __mul__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the multiplication operator. This allows for the
        multiplication of the psf by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to multiply the psf by.

        Returns
        -------
        psf : PSF
            The multiplied psf.
        """
        return self.multiply("data", other)

    def __imul__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the inplace multiplication operator. This allows for the
        inplace multiplication of the psf by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to multiply the psf by.

        Returns
        -------
        psf : PSF
            The multiplied psf.
        """
        return self.__mul__(other)

    def __add__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the addition operator. This allows for the addition of the psf
        by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to add to the psf.

        Returns
        -------
        psf : PSF
            The added psf.
        """
        return self.add("data", other)

    def __iadd__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the inplace addition operator. This allows for the inplace
        addition of the psf by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to add to the psf.

        Returns
        -------
        psf : PSF
            The added psf.
        """
        return self.__add__(other)

    def __sub__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the subtraction operator. This allows for the subtraction of
        the psf by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to subtract from the psf.

        Returns
        -------
        psf : PSF
            The subtracted psf.
        """
        return self.add("data", -other)

    def __isub__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the inplace subtraction operator. This allows for the inplace
        subtraction of the psf by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to subtract from the psf.

        Returns
        -------
        psf : PSF
            The subtracted psf.
        """
        return self.__sub__(other)

    def __truediv__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the division operator. This allows for the division of the psf
        by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to divide the psf by.

        Returns
        -------
        psf : PSF
            The divided psf.
        """
        return self.divide("data", other)

    def __itruediv__(self: PSF, other: Array) -> PSF:
        """
        Magic method for the inplace division operator. This allows for the inplace
        division of the psf by a scalar or another psf.

        Parameters
        ----------
        other : Array
            The scalar or psf to divide the psf by.

        Returns
        -------
        psf : PSF
            The divided psf.
        """
        return self.__truediv__(other)

ndim: int property

Returns the number of 'dimensions' of the psf. This is used to track the vectorised version of the psf returned from vmapping.

Returns:

Name Type Description
ndim int

The 'dimensionality' of dimensions of the psf.

npixels: int property

Returns the side length of the arrays currently representing the psf.

Returns:

Name Type Description
npixels int

The number of pixels that represent the PSF.

__add__(other)

Magic method for the addition operator. This allows for the addition of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to add to the psf.

required

Returns:

Name Type Description
psf PSF

The added psf.

Source code in src/dLux/psfs.py
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
def __add__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the addition operator. This allows for the addition of the psf
    by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to add to the psf.

    Returns
    -------
    psf : PSF
        The added psf.
    """
    return self.add("data", other)

__iadd__(other)

Magic method for the inplace addition operator. This allows for the inplace addition of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to add to the psf.

required

Returns:

Name Type Description
psf PSF

The added psf.

Source code in src/dLux/psfs.py
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
def __iadd__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the inplace addition operator. This allows for the inplace
    addition of the psf by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to add to the psf.

    Returns
    -------
    psf : PSF
        The added psf.
    """
    return self.__add__(other)

__imul__(other)

Magic method for the inplace multiplication operator. This allows for the inplace multiplication of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to multiply the psf by.

required

Returns:

Name Type Description
psf PSF

The multiplied psf.

Source code in src/dLux/psfs.py
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
def __imul__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the inplace multiplication operator. This allows for the
    inplace multiplication of the psf by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to multiply the psf by.

    Returns
    -------
    psf : PSF
        The multiplied psf.
    """
    return self.__mul__(other)

__init__(data, pixel_scale)

Parameters:

Name Type Description Default
data Array

The psf to be transformed by the detector.

required
pixel_scale Array

The pixel scale of the psf.

required
Source code in src/dLux/psfs.py
28
29
30
31
32
33
34
35
36
37
38
def __init__(self: PSF, data: Array, pixel_scale: Array):
    """
    Parameters
    ----------
    data : Array
        The psf to be transformed by the detector.
    pixel_scale : Array
        The pixel scale of the psf.
    """
    self.data = np.asarray(data, dtype=float)
    self.pixel_scale = np.asarray(pixel_scale, dtype=float)

__isub__(other)

Magic method for the inplace subtraction operator. This allows for the inplace subtraction of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to subtract from the psf.

required

Returns:

Name Type Description
psf PSF

The subtracted psf.

Source code in src/dLux/psfs.py
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
def __isub__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the inplace subtraction operator. This allows for the inplace
    subtraction of the psf by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to subtract from the psf.

    Returns
    -------
    psf : PSF
        The subtracted psf.
    """
    return self.__sub__(other)

__itruediv__(other)

Magic method for the inplace division operator. This allows for the inplace division of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to divide the psf by.

required

Returns:

Name Type Description
psf PSF

The divided psf.

Source code in src/dLux/psfs.py
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
def __itruediv__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the inplace division operator. This allows for the inplace
    division of the psf by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to divide the psf by.

    Returns
    -------
    psf : PSF
        The divided psf.
    """
    return self.__truediv__(other)

__mul__(other)

Magic method for the multiplication operator. This allows for the multiplication of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to multiply the psf by.

required

Returns:

Name Type Description
psf PSF

The multiplied psf.

Source code in src/dLux/psfs.py
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
def __mul__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the multiplication operator. This allows for the
    multiplication of the psf by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to multiply the psf by.

    Returns
    -------
    psf : PSF
        The multiplied psf.
    """
    return self.multiply("data", other)

__sub__(other)

Magic method for the subtraction operator. This allows for the subtraction of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to subtract from the psf.

required

Returns:

Name Type Description
psf PSF

The subtracted psf.

Source code in src/dLux/psfs.py
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
def __sub__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the subtraction operator. This allows for the subtraction of
    the psf by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to subtract from the psf.

    Returns
    -------
    psf : PSF
        The subtracted psf.
    """
    return self.add("data", -other)

__truediv__(other)

Magic method for the division operator. This allows for the division of the psf by a scalar or another psf.

Parameters:

Name Type Description Default
other Array

The scalar or psf to divide the psf by.

required

Returns:

Name Type Description
psf PSF

The divided psf.

Source code in src/dLux/psfs.py
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
def __truediv__(self: PSF, other: Array) -> PSF:
    """
    Magic method for the division operator. This allows for the division of the psf
    by a scalar or another psf.

    Parameters
    ----------
    other : Array
        The scalar or psf to divide the psf by.

    Returns
    -------
    psf : PSF
        The divided psf.
    """
    return self.divide("data", other)

convolve(other, method='auto')

Convolves the psf with some input array.

Parameters:

Name Type Description Default
other Array

The psf to convolve with.

required
method str = "auto"

The method to use for the convolution. Can be "auto", "direct", or "fft". Is "auto" by default, which calls "direct".

'auto'

Returns:

Name Type Description
psf PSF

The convolved psf.

Source code in src/dLux/psfs.py
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
def convolve(self: PSF, other: Array, method: str = "auto") -> PSF:
    """
    Convolves the psf with some input array.

    Parameters
    ----------
    other : Array
        The psf to convolve with.
    method : str = "auto"
        The method to use for the convolution. Can be "auto", "direct",
        or "fft". Is "auto" by default, which calls "direct".

    Returns
    -------
    psf : PSF
        The convolved psf.
    """
    return self.set(
        "data", convolve(self.data, other, mode="same", method=method)
    )

downsample(n)

Downsamples the psf by a factor of n. This is done by summing the psf pixels in n x n blocks.

Parameters:

Name Type Description Default
n int

The factor by which to downsample the psf.

required

Returns:

Name Type Description
psf PSF

The downsampled psf.

Source code in src/dLux/psfs.py
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
def downsample(self: PSF, n: int) -> PSF:
    """
    Downsamples the psf by a factor of n. This is done by summing the psf pixels in
    n x n blocks.

    Parameters
    ----------
    n : int
        The factor by which to downsample the psf.

    Returns
    -------
    psf : PSF
        The downsampled psf.
    """
    return self.set("data", dlu.downsample(self.data, n, mean=False))

flip(axis)

Flips the psf along the specified axes. Note we use 'ij' indexing, so axis 0 is the y-axis and axis 1 is the x-axis.

Parameters:

Name Type Description Default
axis tuple

The axes along which to flip the PSF.

required

Returns:

Name Type Description
psf PSF

The new flipped PSF.

Source code in src/dLux/psfs.py
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
def flip(self: PSF, axis: tuple) -> PSF:
    """
    Flips the psf along the specified axes. Note we use 'ij' indexing, so axis 0 is
    the y-axis and axis 1 is the x-axis.

    Parameters
    ----------
    axis : tuple
        The axes along which to flip the PSF.

    Returns
    -------
    psf : PSF
        The new flipped PSF.
    """
    return self.set("data", np.flip(self.data, axis))

resize(npixels)

Resizes the psf via a zero-padding or cropping operation.

Parameters:

Name Type Description Default
npixels int

The size to resize the psf to.

required

Returns:

Name Type Description
psf PSF

The resized psf.

Source code in src/dLux/psfs.py
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
def resize(self: PSF, npixels: int) -> PSF:
    """
    Resizes the psf via a zero-padding or cropping operation.

    Parameters
    ----------
    npixels : int
        The size to resize the psf to.

    Returns
    -------
    psf : PSF
        The resized psf.
    """
    return self.set("data", dlu.resize(self.data, npixels))

rotate(angle, order=1)

Rotates the psf by a given angle via interpolation.

Parameters:

Name Type Description Default
angle float

The angle by which to rotate the psf.

required
order int = 1

The order of the interpolation method to use.

1

Returns:

Name Type Description
psf PSF

The rotated psf.

Source code in src/dLux/psfs.py
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
def rotate(self: PSF, angle: float, order: int = 1) -> PSF:
    """
    Rotates the psf by a given angle via interpolation.

    Parameters
    ----------
    angle : float
        The angle by which to rotate the psf.
    order : int = 1
        The order of the interpolation method to use.

    Returns
    -------
    psf : PSF
        The rotated psf.
    """
    return self.set("data", dlu.rotate(self.data, angle, order=order))