Skip to content

Commit 5657583

Browse files
committed
update check_unit
1 parent b9c9887 commit 5657583

2 files changed

Lines changed: 23 additions & 57 deletions

File tree

src/pst/observables.py

Lines changed: 13 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -291,54 +291,6 @@ def interpolate(self, wavelength=None):
291291
self.wavelength= wavelength
292292
return self.response
293293

294-
def _check_spectra(self, spectra, default_unit=u.Lsun / u.angstrom / u.cm**2):
295-
"""
296-
Ensure that ``spectra`` is an astropy Quantity and return it as flux density
297-
per wavelength (F_lambda), using `self.wavelength` for conversions if
298-
necessary.
299-
300-
Parameters
301-
----------
302-
spectra : array-like or ~astropy.units.Quantity
303-
Spectrum values. If array-like (dimensionless), it will be multiplied by
304-
`default_unit`. If a Quantity, it may be either F_nu (per frequency) or
305-
F_lambda (per wavelength).
306-
default_unit : ~astropy.units.Unit, optional
307-
Target per-wavelength flux-density unit to return, e.g. Lsun / Å / cm²
308-
(must be equivalent to power / area / length).
309-
310-
Returns
311-
-------
312-
astropy.units.Quantity
313-
Spectrum expressed in `default_unit` (per-wavelength flux density).
314-
315-
Notes
316-
-----
317-
- Requires `self.wavelength` to be defined as an astropy Quantity with
318-
length units.
319-
- If `spectra` is already per wavelength, only a unit conversion is applied.
320-
- If `spectra` is per frequency, the conversion uses
321-
`equivalencies=u.spectral_density(self.wavelength)`.
322-
"""
323-
if spectra is None:
324-
return None
325-
326-
if not isinstance(spectra, u.Quantity):
327-
spectra = u.Quantity(spectra, default_unit)
328-
# Check flux density units
329-
if spectra.unit.is_equivalent(u.W / (u.m**2 * u.m)):
330-
return spectra
331-
elif spectra.unit.is_equivalent(u.W / (u.m**2 * u.Hz)):
332-
if self.wavelength is None:
333-
raise AttributeError("Attribute `self.wavelength` must be defined"
334-
+ " to convert spectra to Flam units.")
335-
return spectra.to(default_unit, equivalencies=u.spectral_density(self.wavelength))
336-
else:
337-
raise ValueError(
338-
f"Cannot interpret spectral flux units {spectra.unit}. "
339-
"Expected per-frequency or per-wavelength flux density."
340-
)
341-
342294
def get_photons(self, spectra, spectra_err=None, mask_nan=True):
343295
r"""Compute the photon flux from an input spectra.
344296
@@ -367,8 +319,9 @@ def get_photons(self, spectra, spectra_err=None, mask_nan=True):
367319
photon_flux_err : :class:``astropy.units.Quantity``
368320
Filter photon flux associated error.
369321
"""
370-
spectra = self._check_spectra(spectra)
371-
spectra_err = self._check_spectra(spectra_err)
322+
spectra = utils.check_unit(spectra, default_unit=u.Lsun / u.angstrom / u.cm**2,
323+
equivalence=u.spectral_density, wav=self.wavelength)
324+
372325
if mask_nan:
373326
mask = np.isfinite(spectra)
374327
photon_flux = np.trapz(
@@ -382,6 +335,10 @@ def get_photons(self, spectra, spectra_err=None, mask_nan=True):
382335
x=self.wavelength)
383336

384337
if spectra_err is not None:
338+
339+
spectra_err = utils.check_unit(spectra_err,
340+
default_unit=u.Lsun / u.angstrom / u.cm**2,
341+
equivalence=u.spectral_density, wav=self.wavelength)
385342
if mask_nan:
386343
mask = mask & np.isfinite(spectra_err)
387344
else:
@@ -497,8 +454,9 @@ def get_flambda_vegamag(self, spectra, spectra_err=None, mask_nan=True):
497454
--------
498455
:func:`get_photons`
499456
"""
500-
spectra = self._check_spectra(spectra)
501-
spectra_err = self._check_spectra(spectra_err)
457+
spectra = spectra = utils.check_unit(spectra, default_unit=u.Lsun / u.angstrom / u.cm**2,
458+
equivalence=u.spectral_density, wav=self.wavelength)
459+
502460
if mask_nan:
503461
mask = np.isfinite(spectra)
504462
else:
@@ -508,6 +466,9 @@ def get_flambda_vegamag(self, spectra, spectra_err=None, mask_nan=True):
508466
) / np.trapz(self.response[mask] * self.wavelength[mask], x=self.wavelength[mask])
509467

510468
if spectra_err is not None:
469+
470+
spectra_err = utils.check_unit(spectra_err, default_unit=u.Lsun / u.angstrom / u.cm**2,
471+
equivalence=u.spectral_density, wav=self.wavelength)
511472
if mask_nan:
512473
mask = mask & np.isfinite(spectra_err)
513474
else:

src/pst/utils.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def gaussian1d_conv(f, sigma, deltax):
6767
f_convolved[pixel] = np.sum(f * g)
6868
return f_convolved
6969

70-
def check_unit(quantity, default_unit=None):
70+
def check_unit(quantity, default_unit=None, equivalence=None, **equiv_kwargs):
7171
"""Check the units of an input quantity.
7272
7373
Parameters
@@ -81,12 +81,17 @@ def check_unit(quantity, default_unit=None):
8181
isq = isinstance(quantity, u.Quantity)
8282
if isq and default_unit is not None:
8383
if not quantity.unit.is_equivalent(default_unit):
84-
raise u.UnitTypeError(
85-
"Input quantity does not have the appropriate units")
84+
if equivalence is not None:
85+
return quantity.to(default_unit,
86+
equivalencies=equivalence(**equiv_kwargs))
87+
else:
88+
raise u.UnitTypeError(
89+
"Input quantity does not have the appropriate units")
8690
else:
87-
return quantity
91+
return quantity.to(default_unit)
92+
8893
elif not isq and default_unit is not None:
89-
return quantity * default_unit
94+
return quantity << default_unit
9095
elif not isq and default_unit is None:
9196
raise ValueError("Input value must be a astropy.units.Quantity")
9297
else:

0 commit comments

Comments
 (0)