Source code for priors

"""
Definition of priors

Define any prior functions here that you want to use in BASTA!!

The prior function must be of the form:
PRIOR = PRIORFUN(LIBITEM, INDEX)

Any prior defined here can be used from an .xml input file.
"""
import numpy as np
from basta import utils_general as util


[docs] def salpeter1955(libitem, index): """ Initial mass function from Salpeter (1955) https://ui.adsabs.harvard.edu/abs/1955ApJ...121..161S """ return libitem["massini"][index] ** (-2.35)
[docs] def millerscalo1979(libitem, index): """ Initial mass function from Miller & Scalo (1979) https://ui.adsabs.harvard.edu/abs/1979ApJS...41..513M The global normalisation is not needed as we normalise later. """ m = libitem["massini"][index] ms = [0.1, 1, 10, 100] alphas = [-1.4, -2.5, -3.3] ks = util.normfactor(alphas, ms) if (ms[0] <= m) & (m < ms[1]): return ks[0] * m ** alphas[0] elif (ms[1] <= m) & (m < ms[2]): return ks[1] * m ** alphas[1] elif (ms[2] <= m) & (m < ms[3]): return ks[2] * m ** alphas[2] else: print("Mass outside range of IMF prior") return 0
[docs] def kennicutt1994(libitem, index): """ Initial mass function from Kennicutt et al. 1994 https://ui.adsabs.harvard.edu/abs/1994ApJ...435...22K The global normalisation is not needed as we normalise later. """ m = libitem["massini"][index] ms = [0.1, 1, 100] alphas = [-1.4, -2.5] ks = util.normfactor(alphas, ms) if (ms[0] <= m) & (m < ms[1]): return ks[0] * m ** alphas[0] elif (ms[1] <= m) & (m < ms[2]): return ks[1] * m ** alphas[1] else: print("Mass outside range of IMF prior") return 0
[docs] def scalo1998(libitem, index): """ Initial mass function from Scalo (1998) https://ui.adsabs.harvard.edu/abs/1998ASPC..142..201S The global normalisation is not needed as we normalise later. """ m = libitem["massini"][index] ms = [0.1, 1, 10, 100] alphas = [-1.2, -2.7, -2.3] ks = util.normfactor(alphas, ms) if (ms[0] <= m) & (m < ms[1]): return ks[0] * m ** alphas[0] elif (ms[1] <= m) & (m < ms[2]): return ks[1] * m ** alphas[1] elif (ms[2] <= m) & (m < ms[3]): return ks[2] * m ** alphas[2] else: print("Mass outside range of IMF prior") return 0
[docs] def kroupa2001(libitem, index): """ Initial mass function from Kroupa (2001) https://ui.adsabs.harvard.edu/abs/2001MNRAS.322..231K https://ui.adsabs.harvard.edu/abs/2002Sci...295...82K The global normalisation is not needed as we normalise later. """ m = libitem["massini"][index] ms = [0.01, 0.08, 0.5, 1, 150] alphas = [-0.3, -1.3, -2.3] ks = util.normfactor(alphas, ms) if (ms[0] <= m) & (m < ms[1]): return ks[0] * m ** alphas[0] elif (ms[1] <= m) & (m < ms[2]): return ks[1] * m ** alphas[1] # This case and the last case are identical with these values elif (ms[2] <= m) & (m < ms[4]): return ks[2] * m ** alphas[2] else: print("Mass outside range of IMF prior") return 0
[docs] def baldryglazebrook2003(libitem, index): """ Initial mass function from Baldry & Glazebrook (2003) https://ui.adsabs.harvard.edu/abs/2003ApJ...593..258B The global normalisation is not needed as we normalise later. """ m = libitem["massini"][index] ms = [0.1, 0.5, 120] alphas = [-1.5, -2.2] ks = util.normfactor(alphas, ms) if (ms[0] <= m) & (m < ms[1]): return ks[0] * m ** alphas[0] elif (ms[1] <= m) & (m < ms[2]): return ks[1] * m ** alphas[1] else: print("Mass outside range of IMF prior") return 0
[docs] def chabrier2003(libitem, index): """ Initial mass function from Chabrier (2003) https://ui.adsabs.harvard.edu/abs/2003PASP..115..763C/abstract Note that this is in linear mass space, hence the (1/m) """ m = libitem["massini"][index] ks = [0.158, 0.0443] if m < 1: return ( ks[0] * (1 / m) * np.exp(-0.5 * ((np.log10(m) - np.log10(0.079)) / 0.69) ** 2) ) else: return ks[1] * m ** (-2.3)