Implements synchrotron emission from cooling electrons. This is the model used in Burgess et al (2019). Please cite if you find this code useful for your research.
- This code gets rid of the need for GSL which was originally relied on for a quick computation of the of the synchrotron kernel which is an integral over a Bessel function.
- This code has been ported from GSL and written directly in python as well as accelerated with numba
- An astromodels function is also supplied for direct use in 3ML.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import pynchrotron
/Users/jburgess/.environs/pynchro/lib/python3.7/site-packages/astromodels/core/parameter.py:555: UserWarning: We have set the min_value of K to 1e-99 because there was a postive transform
warnings.warn('We have set the min_value of %s to 1e-99 because there was a postive transform' % self.path)
/Users/jburgess/.environs/pynchro/lib/python3.7/site-packages/astromodels/core/parameter.py:555: UserWarning: We have set the min_value of xc to 1e-99 because there was a postive transform
warnings.warn('We have set the min_value of %s to 1e-99 because there was a postive transform' % self.path)
model = pynchrotron.SynchrotronNumerical()
model
- description: Synchrotron emission from cooling electrions
- formula: $ $
- parameters:
- K:
- value: 1.0
- desc: normalization
- min_value: 0.0
- max_value: None
- unit:
- is_normalization: False
- delta: 0.1
- free: True
- B:
- value: 100.0
- desc: energy scaling
- min_value: 0.01
- max_value: None
- unit:
- is_normalization: False
- delta: 10.0
- free: True
- index:
- value: 3.5
- desc: spectral index of electrons
- min_value: 2.0
- max_value: 6.0
- unit:
- is_normalization: False
- delta: 0.35000000000000003
- free: True
- gamma_min:
- value: 500000.0
- desc: minimum electron lorentz factor
- min_value: 1.0
- max_value: None
- unit:
- is_normalization: False
- delta: 50000.0
- free: False
- gamma_cool:
- value: 90000000.0
- desc: cooling time of electrons
- min_value: None
- max_value: None
- unit:
- is_normalization: False
- delta: 9000000.0
- free: True
- gamma_max:
- value: 100000000.0
- desc: minimum electron lorentz factor
- min_value: 1000000.0
- max_value: None
- unit:
- is_normalization: False
- delta: 10000000.0
- free: False
- bulk_gamma:
- value: 1.0
- desc: bulk Lorentz factor
- min_value: 1.0
- max_value: None
- unit:
- is_normalization: False
- delta: 0.1
- free: False
- K:
fig, ax = plt.subplots()
ene = np.logspace(1,6,400)
ax.loglog(ene, ene**2 * model(ene))
ax.set_xlabel('energy')
ax.set_ylabel(r'$\nu F_{\nu}$')
Text(0, 0.5, '$\\nu F_{\\nu}$')
fig, ax = plt.subplots()
gamma_min = 500000.
gamma_cool = np.linspace(.1 * gamma_min, 5* gamma_min, 10)
ene = np.logspace(-1,6,400)
for gc in gamma_cool:
model.gamma_cool = gc
model.gamma_min = gamma_min
ax.loglog(ene, ene**2 * model(ene))
ax.set_xlabel('energy')
ax.set_ylabel(r'$\nu F_{\nu}$')
Text(0, 0.5, '$\\nu F_{\\nu}$')