Source code for beast.observationmodel.noisemodel.generic_noisemodel

"""
Generates a generic noise model from artifical star tests (ASTs) results
using the toothpick method.  Using ASTs results in a noise model that
includes contributions from measurement (photon) noise *and* crowding
noise.

Toothpick assumes that all bands are independent - no covariance.
This is a conservative assumption.  If there is true covariance
more accurate results with smaller uncertainties on fit parameters
can be achieved using the trunchen method.  The trunchen method
requires significantly more complicated ASTs and many more of them.
"""
import numpy as np
import h5py
import tables

from beast.observationmodel.noisemodel import toothpick

__all__ = [
    "make_toothpick_noise_model",
    "get_noisemodelcat",
]


[docs]def make_toothpick_noise_model( outname, astfile, sedgrid, vega_fname=None, absflux_a_matrix=None, nfluxbins=50, **kwargs, ): """ toothpick noise model assumes that every filter is independent with any other. Parameters ---------- outname : str path and filename into which save the noise model astfile : str path to the file into which are ASTs results sedgrid : SEDGrid instance sed model grid for everyone of which we will evaluate the model absflux_a_matrix : ndarray absolute calibration a matrix giving the fractional uncertainties including correlated terms (off diagonals) nfluxbins : int (default=50) number of flux bins returns ------- noisefile: str noisemodel file name """ # read in AST results model = toothpick.MultiFilterASTs(astfile, sedgrid.filters, vega_fname=vega_fname) # set the column mappings as the external file is BAND_VEGA or BAND_IN model.set_data_mappings(in_pair=("in", "in"), out_pair=("out", "rate"), upcase=True) # compute binned biases and uncertainties as a function of flux model.fit_bins(nbins=nfluxbins) # evaluate the noise model for all the models in sedgrid bias, sigma, compl = model(sedgrid) # absolute flux calibration uncertainties # currently we are ignoring the off-diagnonal terms if absflux_a_matrix is not None: if absflux_a_matrix.ndim == 1: abs_calib_2 = absflux_a_matrix[:] ** 2 else: # assumes a cov matrix abs_calib_2 = np.diag(absflux_a_matrix) noise = np.sqrt(abs_calib_2 * sedgrid.seds[:] ** 2 + sigma ** 2) # check if the noise model has been extrapolated at the faint or bright flux levels # if so, then set the noise to a negative value (later may be used to # trim the model of "invalid" models) # if the noise model has been extrapolated, the completeness is set to zeros for k in range(len(model.filters)): (indxs,) = np.where(compl[:, k] <= 0.0) if len(indxs) > 0: noise[indxs, k] *= -1.0 else: noise = sigma print("Writing to disk into {0:s}".format(outname)) with tables.open_file(outname, "w") as outfile: outfile.create_array(outfile.root, "bias", bias) outfile.create_array(outfile.root, "error", noise) outfile.create_array(outfile.root, "completeness", compl) return outname
[docs]def get_noisemodelcat(filename): """ returns the noise model Parameters ---------- filename: str file containing the outputs from OneD_ASTs_ModelGenerator Returns ------- ntable : dict dictonary containing the elements of the noise model """ nfile = h5py.File(filename, "r") # create a dictonary of the elements ntable = {} for ckey in nfile.keys(): ntable[ckey] = np.array(nfile[ckey]) nfile.close() # check that at least the 3 basic elements are included expected_elements = ["error", "bias", "completeness"] for cexp in expected_elements: if cexp not in ntable.keys(): raise ValueError(f"{cexp} values not found in noisemodel") return ntable