Skip to content

Spectra

Spectrum

Bases: SimpleSpectrum

A simple spectrum class using wavelengths and weights.

UML

UML

Attributes:

Name Type Description
wavelengths (Array, metres)

The array of wavelengths at which the spectrum is defined.

weights Array

The relative weights of each wavelength.

Source code in src/dLux/spectra.py
 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
class Spectrum(SimpleSpectrum):
    """
    A simple spectrum class using wavelengths and weights.


    ??? abstract "UML"
        ![UML](../../assets/uml/Spectrum.png)

    Attributes
    ----------
    wavelengths : Array, metres
        The array of wavelengths at which the spectrum is defined.
    weights : Array
        The relative weights of each wavelength.
    """

    weights: Array

    def __init__(self: Spectrum, wavelengths: Array, weights: Array = None):
        """
        Parameters
        ----------
        wavelengths : Array, metres
            The array of wavelengths at which the spectrum is defined.
        weights : Array = None
            The relative weights of each wavelength. Input weights
            are automatically normalised to a sum of 1.
        """
        super().__init__(wavelengths)
        if weights is None:
            in_shape = self.wavelengths.shape
            weights = np.ones(in_shape) / in_shape[-1]

        weights = np.asarray(weights, dtype=float)
        if weights.ndim == 2:
            self.weights = weights / weights.sum(-1)[:, None]
        else:
            self.weights = weights / weights.sum()

        if self.weights.ndim == 1:
            if self.wavelengths.shape != self.weights.shape:
                raise ValueError(
                    "wavelengths and weights must have the same " "shape."
                )
        else:
            if self.wavelengths.shape != self.weights.shape[-1:]:
                raise ValueError(
                    "wavelengths and weights must have the same " "shape."
                )

    def normalise(self: Spectrum) -> Spectrum:
        """
        Returns a normalised spectrum object, where the weights are normalised to a
        sum of 1.

        Returns
        -------
        spectrum : Spectrum
            The spectrum object with the normalised spectrum.
        """
        if self.weights.ndim == 2:
            weight_sum = self.weights.sum(-1)[:, None]
        else:
            weight_sum = self.weights.sum()
        return self.divide("weights", weight_sum)

__init__(wavelengths, weights=None)

Parameters:

Name Type Description Default
wavelengths (Array, metres)

The array of wavelengths at which the spectrum is defined.

required
weights Array = None

The relative weights of each wavelength. Input weights are automatically normalised to a sum of 1.

None
Source code in src/dLux/spectra.py
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
def __init__(self: Spectrum, wavelengths: Array, weights: Array = None):
    """
    Parameters
    ----------
    wavelengths : Array, metres
        The array of wavelengths at which the spectrum is defined.
    weights : Array = None
        The relative weights of each wavelength. Input weights
        are automatically normalised to a sum of 1.
    """
    super().__init__(wavelengths)
    if weights is None:
        in_shape = self.wavelengths.shape
        weights = np.ones(in_shape) / in_shape[-1]

    weights = np.asarray(weights, dtype=float)
    if weights.ndim == 2:
        self.weights = weights / weights.sum(-1)[:, None]
    else:
        self.weights = weights / weights.sum()

    if self.weights.ndim == 1:
        if self.wavelengths.shape != self.weights.shape:
            raise ValueError(
                "wavelengths and weights must have the same " "shape."
            )
    else:
        if self.wavelengths.shape != self.weights.shape[-1:]:
            raise ValueError(
                "wavelengths and weights must have the same " "shape."
            )

normalise()

Returns a normalised spectrum object, where the weights are normalised to a sum of 1.

Returns:

Name Type Description
spectrum Spectrum

The spectrum object with the normalised spectrum.

Source code in src/dLux/spectra.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
def normalise(self: Spectrum) -> Spectrum:
    """
    Returns a normalised spectrum object, where the weights are normalised to a
    sum of 1.

    Returns
    -------
    spectrum : Spectrum
        The spectrum object with the normalised spectrum.
    """
    if self.weights.ndim == 2:
        weight_sum = self.weights.sum(-1)[:, None]
    else:
        weight_sum = self.weights.sum()
    return self.divide("weights", weight_sum)

PolySpectrum

Bases: SimpleSpectrum

Implements a generic polynomial spectrum, such as a linear spectrum.

This implements a polynomial as follows: f(x) = c0 + c1x + c2x^2 + ... + cn*x^n

UML

UML

Attributes:

Name Type Description
wavelengths (Array, metres)

The array of wavelengths at which the spectrum is defined.

coefficients Array

The array of polynomial coefficient values.

Source code in src/dLux/spectra.py
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
class PolySpectrum(SimpleSpectrum):
    """
    Implements a generic polynomial spectrum, such as a linear spectrum.

    This implements a polynomial as follows: f(x) = c0 + c1*x + c2*x^2 + ... + cn*x^n

    ??? abstract "UML"
        ![UML](../../assets/uml/PolySpectrum.png)

    Attributes
    ----------
    wavelengths : Array, metres
        The array of wavelengths at which the spectrum is defined.
    coefficients : Array
        The array of polynomial coefficient values.
    """

    coefficients: Array

    def __init__(self: Spectrum, wavelengths: Array, coefficients: Array):
        """
        Parameters
        ----------
        wavelengths : Array, metres
            The array of wavelengths at which the spectrum is defined.
        coefficients : Array
            The array of polynomial coefficient values.
        """
        super().__init__(wavelengths)
        self.coefficients = np.asarray(coefficients, dtype=float)

        if self.coefficients.ndim != 1:
            raise ValueError("Coefficients must be a 1d array.")

    def _eval_weight(self: Spectrum, wavelength: Array) -> Array:
        """
        Evaluates the polynomial function at the supplied wavelength.

        Parameters
        ----------
        wavelength : Array, metres
            The wavelength at which to evaluate the polynomial function.

        Returns
        -------
        weight : Array
            The relative weight of the supplied wavelength.
        """
        return np.array(
            [
                self.coefficients[i] * wavelength**i
                for i in range(len(self.coefficients))
            ]
        ).sum()

    @property
    def weights(self: Spectrum) -> Array:
        """
        Gets the relative spectral weights by evaluating the polynomial function at the
        internal wavelengths. Output weights are automatically normalised to a sum of
        1.

        Returns
        -------
        weights : Array
            The normalised relative weights of each wavelength.
        """
        weights = vmap(self._eval_weight)(self.wavelengths)
        return weights / weights.sum()

    def normalise(self: Spectrum) -> Spectrum:
        """
        Calculated weights are automatically normalised, so this method simply returns
        an unmodified object.

        Returns
        --------
        spectrum : Spectrum
            The unmodified spectrum object
        """
        return self

weights: Array property

Gets the relative spectral weights by evaluating the polynomial function at the internal wavelengths. Output weights are automatically normalised to a sum of 1.

Returns:

Name Type Description
weights Array

The normalised relative weights of each wavelength.

__init__(wavelengths, coefficients)

Parameters:

Name Type Description Default
wavelengths (Array, metres)

The array of wavelengths at which the spectrum is defined.

required
coefficients Array

The array of polynomial coefficient values.

required
Source code in src/dLux/spectra.py
125
126
127
128
129
130
131
132
133
134
135
136
137
138
def __init__(self: Spectrum, wavelengths: Array, coefficients: Array):
    """
    Parameters
    ----------
    wavelengths : Array, metres
        The array of wavelengths at which the spectrum is defined.
    coefficients : Array
        The array of polynomial coefficient values.
    """
    super().__init__(wavelengths)
    self.coefficients = np.asarray(coefficients, dtype=float)

    if self.coefficients.ndim != 1:
        raise ValueError("Coefficients must be a 1d array.")

normalise()

Calculated weights are automatically normalised, so this method simply returns an unmodified object.

Returns:

Name Type Description
spectrum Spectrum

The unmodified spectrum object

Source code in src/dLux/spectra.py
176
177
178
179
180
181
182
183
184
185
186
def normalise(self: Spectrum) -> Spectrum:
    """
    Calculated weights are automatically normalised, so this method simply returns
    an unmodified object.

    Returns
    --------
    spectrum : Spectrum
        The unmodified spectrum object
    """
    return self