Fast interstellar dust extinction laws in Python
Cython-optimized implementations of empirical dust exitinction laws found in the literature.
conda install -c conda-forge extinction
Using pip (requires a C compiler):
pip install extinction
Extinction depends on numpy and scipy.
Development version / source code: http://github.com/kbarbary/extinction
||Cardelli, Clayton & Mathis (1989) extinction function.|
||O’Donnell (1994) extinction function.|
||Calzetti (2000) extinction function.|
||Fitzpatrick (1999) dust extinction function.|
||Fitzpatrick & Massa (2007) extinction model for R_V = 3.1.|
||Apply extinction to flux values (optionally in-place).|
||Remove extinction from observed flux values (optionally in-place).|
||Fitzpatrick (1999) dust extinction function for arbitrary R_V.|
Get extinction in magnitudes at a set of wavelengths for various dust laws:
>>> import numpy as np >>> import extinction >>> wave = np.array([2000., 4000., 8000.]) # wavelength in Angstroms # Cardelli, Clayton & Mathis (1989) with A_V = 1 and R_V = 3.1 >>> extinction.ccm89(wave, 1.0, 3.1) array([ 2.84252644, 1.4645557 , 0.59748901]) # extinction in magnitudes # O'Donnell (1994) >>> extinction.odonnell94(wave, 1.0, 3.1) array([ 2.84252644, 1.42617802, 0.60793495]) # Fitzpatrick (1999) >>> extinction.fitzpatrick99(wave, 1.0, 3.1) array([ 2.76225609, 1.79674653, 1.42325373])
The Fitzpatrick & Massa (2007) function has a fixed \(R_V\) of 3.1:
>>> extinction.fm07(wave, 1.0) array([ 2.90478329, 1.42645161, 0.54703201])
All extinction laws accept a
unit keyword to change the interpretation of
the wavelength array from Angstroms to inverse microns:
>>> wave = np.array([5., 2.5, 1.25]) # wavelength in inverse microns >>> extinction.ccm89(wave, 1.0, 3.1, unit='invum') array([ 2.84252644, 1.4645557 , 0.59748901]) # extinction in magnitudes
Redden or deredden¶
To “redden” or “deredden” flux values by some amount, use the
remove convenience functions:
>>> from extinction import ccm89, apply >>> flux = np.ones(3) # "redden" flux by A_V = 1.0 >>> apply(ccm89(wave, 1.0, 3.1), flux) array([ 0.07294397, 0.25952412, 0.5767723 ]) # "deredden" flux by A_V = 1.0 >>> remove(ccm89(wave, 1.0, 3.1), flux) array([ 13.70915145, 3.85320647, 1.73378645])
A note on parameterization¶
Most extinction laws here have two parameters: \(A_V\) and
\(R_V\). \(A_V\) is a simply a linear scaling parameter; that
ccm89(wave, 2.0, 3.1) is the same as
2.0 * ccm89(wave, 1.0,
3.1). \(R_V\) changes the shape of the extinction
curve, rather than just the amplitude.
Traditionally, the meaning ascribed to these parameters was that \(A_V\) is the extinction in the V band, and \(R_V\) describes the ratio of total to selective extinction: \(R_V = A_V / E(B-V)\), where \(E(B-V)\) is the difference in extinction between the B and V bands. While this is approximately correct, the measured extinction of a source in actual B and V bandpasses will generally depend on the source spectrum and the shape of the specific bandpasses. Therefore, the \(A_V\) and \(R_V\) that are parameters in our extinction law will not correspond perfectly to measured B and V extinctions. So, in the context of these extinction laws, it is best to think of \(A_V\) and \(R_V\) as simply parameters that describe the amplitude and shape of the wavelength dependence, rather than corresponding directly to measured magnitudes.
Finally, for a given shape of the extinction curve (described by \(R_V\)), one can equally well use \(E(B-V)\) as a linear scaling parameter in place of \(A_V\), with the equivalence \(E(B-V) = A_V / R_V\). Note that the above caution applies here: \(E(B-V)\) should be considered simply a parameter describing amplitude of extinction; it will not correspond exactly to a difference in measured B and V extinctions.
License and Credits¶
The license is MIT. Part of this code originated in the specutils package.