This is a major refactor to allow for multiple datasets (i.e. multiple spectra) with different noise models and instrument parameters to constrain a single galaxy model. Other updates may include cleaner stored outputs, interfaces with additional nested samplers, and improved tretments of smoothing.
Work to do includes:
- Convert to/from old style observation dictionaries
- Put responsibility for Noise Models including outlier modeling in individual Observation instances
- Make predictions even when there is no fittable data (e.g. model spectra when fitting photometry only)
- Store Observation objects in HDF5, FITS, etc as structured arrays with metadata
- Catch (and handle) emission line marginalization if spectra overlap.
- Structured ndarray for output chains and lnlikehoods
- Update docs
- Update demo scripts
- Account for undersampled spectra via explicit rebinning.
- Account for undersampled spectra via a square convolution in pixel space.
- Update notebooks
- Update plotting module
- Test i/o with structured arrays
- Test multi-spectral calibration, smoothing, and noise modeling
- Test smoothing accounting for library, instrumental & physical smoothing
- Structured ndarray for derived parameters
- Store samples of spectra, photometry, and mfrac (blobs)
- Implement an emulator-based SpecModel class
- Implement UltraNest and Nautilus backends
For many users the primary difference from v1.X will be that the data to predict
and fit a model to is now specified as a list of
prospect.observation.Observation()
instances, instead of a single 'obs'
dictionary. There is a new convenience method to convert from the old 'obs'
dictionary format to the new specification. This can be used with existing
scripts as follows:
# old build_obs function giving a dictionary
obs_dict = build_obs(**run_params)
# get convenience method
from prospect.observation import from_oldstyle
# make a new list of Observation instances from the dictionary
observations = from_oldstyle(obs_dict)
# verify and prepare for fitting; similar to 'obsutils.fix_obs()'
[obs.rectify() for obs in observations]
print(observations)
It is recommended to do the conversion within the build_obs()
method, if
possible. This list of observations is then supplied to fit_model
. Because
noise models are now attached explicitly to each observation, they do not need
to be generated separately or supplied to fit_model()
, which no longer accepts
a noise=
argument.
from prospect.fitting import fit_model
output = fit_model(observations, model, sps, **config)
Another change is that spectral response functions (i.e. calibration vectors) are now handled by specialized sub-classes of these Observation
classes. See the spectroscopy docs for details.
Finally, the output chain or samples is now stored as a structured array, where each row corresponds to a sample, and each column is a parameter (possibly multidimensional). Additional information (such as sample weights, likelihoods, and poster probabilities) are stored as additional datasets in the output.
Conduct principled inference of stellar population properties from photometric and/or spectroscopic data. Prospector allows you to:
-
Infer high-dimensional stellar population properties using parametric or highly flexible SFHs (with nested or ensemble Monte Carlo sampling)
-
Combine multiple photometric, spectroscopic, and/or line flux datasets from the UV to Far-IR rigorously using a flexible spectroscopic calibration model and forward modeling many aspects of spectroscopic data analysis.
Read the documentation and the code paper.
See installation for requirements and dependencies. The documentation includes a tutorial and demos.
To install to a conda environment with dependencies, see conda_install.sh
.
To install just Prospector (stable release):
python -m pip install astro-prospector
To install the latest development version:
cd <install_dir>
git clone https://github.com/bd-j/prospector
cd prospector
python -m pip install .
Then, in Python
import prospect
If you use this code, please reference this paper:
@ARTICLE{2021ApJS..254...22J,
author = {{Johnson}, Benjamin D. and {Leja}, Joel and {Conroy}, Charlie and {Speagle}, Joshua S.},
title = "{Stellar Population Inference with Prospector}",
journal = {\apjs},
keywords = {Galaxy evolution, Spectral energy distribution, Astronomy data modeling, 594, 2129, 1859, Astrophysics - Astrophysics of Galaxies, Astrophysics - Instrumentation and Methods for Astrophysics},
year = 2021,
month = jun,
volume = {254},
number = {2},
eid = {22},
pages = {22},
doi = {10.3847/1538-4365/abef67},
archivePrefix = {arXiv},
eprint = {2012.01426},
primaryClass = {astro-ph.GA},
adsurl = {https://ui.adsabs.harvard.edu/abs/2021ApJS..254...22J},
adsnote = {Provided by the SAO/NASA Astrophysics Data System}
}
and make sure to cite the dependencies as listed in installation
Inference with mock broadband data, showing the change in posteriors as the number of photometric bands is increased.