# extinction¶

*Fast interstellar dust extinction laws in Python*

Cython-optimized implementations of empirical dust exitinction laws found in the literature.

## Installation¶

Using conda:

```
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

## Usage¶

**Functions:**

`extinction.ccm89` (wave, a_v, r_v[, unit, out]) |
Cardelli, Clayton & Mathis (1989) extinction function. |

`extinction.odonnell94` (wave, a_v, r_v[, ...]) |
O’Donnell (1994) extinction function. |

`extinction.calzetti00` (wave, a_v, r_v[, ...]) |
Calzetti (2000) extinction function. |

`extinction.fitzpatrick99` (wave, a_v[, r_v, unit]) |
Fitzpatrick (1999) dust extinction function. |

`extinction.fm07` (wave, a_v[, unit]) |
Fitzpatrick & Massa (2007) extinction model for R_V = 3.1. |

`extinction.apply` (extinction, flux[, inplace]) |
Apply extinction to flux values (optionally in-place). |

**Classes:**

`extinction.Fitzpatrick99` |
Fitzpatrick (1999) dust extinction function for arbitrary R_V. |

**Examples:**

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
`apply`

convenience function:

```
>>> 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
>>> apply(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
is: `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.