Source code for jetset.jet_emitters_factory

__author__ = "Andrea Tramacere"

import numpy as np
import pprint
from jetset.jet_emitters import EmittersDistribution, InjEmittersDistribution
__all__=['EmittersFactory']

_available_dict = {'lp': 'log-parabola',
                   'pl': 'powerlaw',
                   'lppl': 'log-parabola with low-energy powerlaw branch',
                   'lpep': 'log-parabola defined by peak energy',
                   'plc': 'powerlaw with cut-off',
                   'bkn': 'broken powerlaw',
                   'superexp': 'powerlaw with super-exp cut-off'}


def distr_func_bkn(gamma_break, gamma, p, p_1):
    f = np.zeros(gamma.shape)
    m = gamma < gamma_break
    f[m] = np.power(gamma[m], -p)
    f[~m] = np.power(gamma_break, -(p - p_1)) * np.power(gamma[~m], -p_1)
    return f


def distr_func_pl(gamma, p, ):
    return np.power(gamma, -p)


def distr_func_plc(gamma, gamma_cut, p,):
    return np.power(gamma, -p) * np.exp(-(gamma / gamma_cut) )


def distr_func_super_exp(gamma, gamma_cut, p, a):
    return np.power(gamma, -p) * np.exp(-(1 / a) * (gamma / gamma_cut) ** a)

def distr_func_lp(gamma, gamma0_log_parab, r, s):
    return np.power((gamma / gamma0_log_parab), (-s - r * np.log10(gamma / gamma0_log_parab)))


def distr_func_lep(gamma, gamma_p, r):
    return np.power(10., (-r * np.power(np.log10(gamma / gamma_p), 2)))

def distr_func_lppl(gamma, gamma0_log_parab, r, s):
    f = np.zeros(gamma.shape)
    m = gamma < gamma0_log_parab
    f[m] = np.power(gamma[m]/gamma0_log_parab, -s)
    f[~m] = np.power(gamma[~m]/gamma0_log_parab, (-s -r*np.log10(gamma[~m] / gamma0_log_parab )))
    return f


[docs] class EmittersFactory: def __repr__(self): return str(pprint.pprint(self._available_dict)) def __init__(self): self._available_dict=_available_dict self._func_dict = {'pl': self._create_pl, 'bkn': self._create_bkn, 'plc': self._create_plc, 'lp': self._create_lp, 'lppl': self._create_lppl, 'lpep': self._create_lpep, 'superexp': self._create_super_exp} self._set_emitters_class() def _set_emitters_class(self): if type(self) == EmittersFactory: self._emitters_class=EmittersDistribution elif type(self) ==InjEmittersFactory: self._emitters_class = InjEmittersDistribution else: raise RuntimeError('class instance', type(self), 'not valid')
[docs] @staticmethod def available_distributions(): for k in _available_dict.keys(): print('%s: %s' % (k, _available_dict[k]))
[docs] @staticmethod def available_distributions_list(): return _available_dict.keys()
[docs] def create_emitters(self, name, gamma_grid_size=200, log_values=False, emitters_type='electrons', normalize=True, skip_build=False): if name not in self._available_dict.keys(): raise RuntimeError('name', name, 'not among available', self._available_dict.keys()) return self._func_dict[name](gamma_grid_size=gamma_grid_size, log_values=log_values, normalize=normalize, skip_build=skip_build, emitters_type=emitters_type)
def _create_bkn(self,gamma_grid_size,log_values,normalize,skip_build,emitters_type): n_e_bkn = self._emitters_class(name='bkn', spectral_type='bkn', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_e_bkn.set_bounds(1, 1E9, log_val=n_e_bkn._log_values) gamma_break_val = n_e_bkn._set_log_val(1E4,log_val=log_values) n_e_bkn.add_par('gamma_break', par_type='turn-over-energy', val=gamma_break_val, vmin=a_t, vmax=b_t, unit='lorentz-factor',log=log_values) n_e_bkn.add_par('p', par_type='LE_spectral_slope', val=2.5, vmin=-10., vmax=10, unit='') n_e_bkn.add_par('p_1', par_type='HE_spectral_slope', val=3.5, vmin=-10., vmax=10, unit='') n_e_bkn.set_distr_func(distr_func_bkn) return n_e_bkn def _create_pl(self,gamma_grid_size, log_values, normalize, skip_build, emitters_type): n_e_pl = self._emitters_class(name='pl', spectral_type='pl', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_e_pl.set_bounds(1, 1E9, log_val=n_e_pl._log_values) n_e_pl.add_par('p', par_type='LE_spectral_slope', val=2.0, vmin=-10., vmax=10, unit='') n_e_pl.set_distr_func(distr_func_pl) return n_e_pl def _create_plc(self, gamma_grid_size,log_values,normalize,skip_build,emitters_type): n_e_plc = n_e_bkn = self._emitters_class(name='plc', spectral_type='plc', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_e_plc.set_bounds(1, 1E9, log_val=n_e_plc._log_values) gamma_cut_val = n_e_plc._set_log_val(1E4,log_val=log_values) n_e_plc.add_par('gamma_cut', par_type='turn-over-energy', val=gamma_cut_val, vmin=a_t, vmax=b_t, unit='lorentz-factor',log=log_values) n_e_plc.add_par('p', par_type='LE_spectral_slope', val=2.0, vmin=-10., vmax=10, unit='') n_e_plc.set_distr_func(distr_func_plc) return n_e_plc def _create_super_exp(self, gamma_grid_size, log_values, normalize, skip_build, emitters_type): n_e_super_exp = self._emitters_class(name='super_exp', spectral_type='plc', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_e_super_exp.set_bounds(1, 1E9, log_val=n_e_super_exp._log_values) gamma_cut_val = n_e_super_exp._set_log_val(1E4,log_val=log_values) n_e_super_exp.add_par('gamma_cut', par_type='turn-over-energy', val=gamma_cut_val, vmin=a_t, vmax=b_t, unit='lorentz-factor',log=log_values) n_e_super_exp.add_par('p', par_type='LE_spectral_slope', val=2.0, vmin=-10., vmax=10, unit='') n_e_super_exp.add_par('a', par_type='spectral_curvature', val=1.0, vmin=0., vmax=100., unit='') n_e_super_exp.set_distr_func(distr_func_super_exp) return n_e_super_exp def _create_lp(self, gamma_grid_size,log_values,normalize,skip_build,emitters_type): n_lp = self._emitters_class(name='lp', spectral_type='lp', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_lp.set_bounds(1, 1E9, log_val=n_lp._log_values) gamma0_log_parab_val = n_lp._set_log_val(1E4,log_val=log_values) n_lp.add_par('gamma0_log_parab', par_type='turn-over-energy', val=gamma0_log_parab_val, vmin=a_t, vmax=b_t, unit='lorentz-factor',log=log_values) n_lp.add_par('s', par_type='LE_spectral_slope', val=2.0, vmin=-10., vmax=10, unit='') n_lp.add_par('r', par_type='spectral_curvature', val=0.4, vmin=-15., vmax=15., unit='') n_lp.set_distr_func(distr_func_lp) return n_lp def _create_lpep(self,gamma_grid_size, log_values, normalize, skip_build, emitters_type): n_lep = self._emitters_class(name='lpep', spectral_type='lp', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_lep.set_bounds(1, 1E9, log_val=n_lep._log_values) gamma_p_val = n_lep._set_log_val(1E4,log_val=log_values) n_lep.add_par('gamma_p', par_type='turn-over-energy', val=gamma_p_val, vmin=a_t, vmax=b_t, unit='lorentz-factor',log=log_values) n_lep.add_par('r', par_type='spectral_curvature', val=0.4, vmin=-15., vmax=15., unit='') n_lep.set_distr_func(distr_func_lep) return n_lep def _create_lppl(self, gamma_grid_size, log_values, normalize, skip_build, emitters_type): n_lppl = self._emitters_class(name='lppl', spectral_type='lp', normalize=normalize, emitters_type=emitters_type, log_values=log_values, skip_build=skip_build, gamma_grid_size=gamma_grid_size) a_t, b_t = n_lppl.set_bounds(1, 1E9, log_val=n_lppl._log_values) gamma0_log_parab_val = n_lppl._set_log_val(1E4,log_val=log_values) n_lppl.add_par('gamma0_log_parab', par_type='turn-over-energy', val=gamma0_log_parab_val, vmin=a_t, vmax=b_t, unit='lorentz-factor',log=log_values) n_lppl.add_par('s', par_type='LE_spectral_slope', val=2.0, vmin=-10., vmax=10, unit='') n_lppl.add_par('r', par_type='spectral_curvature', val=0.4, vmin=-15., vmax=15., unit='') n_lppl.set_distr_func(distr_func_lppl) return n_lppl
class InjEmittersFactory(EmittersFactory): def __init__(self): super(InjEmittersFactory, self).__init__() def create_inj_emitters(self, name, gamma_grid_size=200, log_values=False, emitters_type='electrons', normalize=True, skip_build=False): if name not in self._available_dict.keys(): raise RuntimeError('name', name, 'not among available', self._available_dict.keys()) return self._func_dict[name](gamma_grid_size=gamma_grid_size, log_values=log_values, normalize=normalize, skip_build=skip_build, emitters_type=emitters_type)