fit_generic_continuum compatibility with Astropy BlackBody model
- Dominant language
- Python
- Stars
- 204
- Forks
- 134
- Avg merge
- 12h 55m
- Merged PRs (30d)
- 1
Description
Hi,
I am trying to use specutils to fit the continuum of some spectrum with a black body model. I think the appropriate way to do that is initialise the model and pass it into the fit_generic_continuum function, as below. However, somehow specutils or Astropy do not recognise the temperature parameter as a Quantity, even though it is passed in as a Quantity. I'm using Astropy version=4.2 and specutils version=1.1.1.
Thanks in advance,
Ben
```
import numpy as np
import astropy.units as u
from specutils import Spectrum1D
from specutils.fitting import fit_generic_continuum
from astropy.modeling.models import BlackBody
dat = np.loadtxt('some/spectrum/file.dat')
wav = (dat[:,0] / (1 + 0.032)) * u.AA
flux = dat[:,1] * u.Unit('erg cm-2 s-1 AA-1')
temp = 10000*u.K
spec = Spectrum1D(spectral_axis=wav, flux=flux)
continuum_model = fit_generic_continuum(spec, model=BlackBody(temperature=temp))
---------------------------------------------------------------------------
UnitsError Traceback (most recent call last)
~/Documents/postdoc/het/analysis/SN2020wnt/flatten/flatten_templates.py in
34
35 spec = Spectrum1D(spectral_axis=wav, flux=flux)
---> 36 continuum_model = fit_generic_continuum(spec,model=[BlackBody(temperature=temp)])
37 continuum_flux = continuum_model(spec.spectral_axis)
38
~/anaconda3/lib/python3.7/site-packages/specutils/fitting/continuum.py in fit_generic_continuum(spectrum, median_window, model, fitter, exclude_regions, weights)
57 #
58
---> 59 return fit_continuum(spectrum_smoothed, model, fitter, exclude_regions, weights)
60
61
~/anaconda3/lib/python3.7/site-packages/specutils/fitting/continuum.py in fit_continuum(spectrum, model, fitter, exclude_regions, window, weights)
102
103 continuum_spectrum = fit_lines(spectrum, model, fitter, exclude_regions,
--> 104 weights, w)
105
106 return continuum_spectrum
~/anaconda3/lib/python3.7/site-packages/specutils/fitting/fitmodels.py in fit_lines(spectrum, model, fitter, exclude_regions, weights, window, **kwargs)
362 fit_model = _fit_lines(spectrum, model_guess, fitter,
363 exclude_regions, weights, model_window,
--> 364 ignore_units, **kwargs)
365 if model_guess.name is not None:
366 fit_model.name = model_guess.name
~/anaconda3/lib/python3.7/site-packages/specutils/fitting/fitmodels.py in _fit_lines(spectrum, model, fitter, exclude_regions, weights, window, ignore_units, **kwargs)
493
494 model_unitless, dispersion_unitless, flux_unitless = \
--> 495 _strip_units_from_model(model, spectrum, convert=not ignore_units)
496
497 #
~/anaconda3/lib/python3.7/site-packages/specutils/fitting/fitmodels.py in _strip_units_from_model(model_in, spectrum, convert)
654 # new sub model.
655 #
--> 656 setattr(new_sub_model, pn, v)
657
658 #
~/anaconda3/lib/python3.7/site-packages/astropy/modeling/core.py in __setattr__(self, attr, value)
899 else:
900 if not isinstance(value, Quantity):
--> 901 raise UnitsError(f"The '{param.name}' parameter should be given as a"
902 " Quantity because it was originally "
903 "initialized as a Quantity")
UnitsError: The 'temperature' parameter should be given as a Quantity because it was originally initialized as a Quantity
```
Contributor guide
Research direction
Start in specutils/fitting/continuum.py and follow the fit_continuum path into specutils/fitting/fitmodels.py, especially _strip_units_from_model. Reproduce the failure with the supplied Spectrum1D and BlackBody example using the reported Astropy and specutils versions. Done means the model can be passed to fit_generic_continuum without losing the Quantity required by its temperature parameter.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100