Source code for agnpy.constraints.spectral_constraints

import numpy as np
import astropy.units as u
from astropy.constants import e, sigma_T
from ..utils.conversion import mec2

e = e.gauss

__all__ = ["SpectralConstraints"]


[docs]class SpectralConstraints: r""" Class to describe the self-consistency constraints on the electron energy distribution Parameters ---------- blob : :class: `Blob` emission region """ def __init__(self, blob): self.blob = blob @property def gamma_max_larmor(self): r"""maximum Lorentz factor of electrons that have their Larmour radius smaller than the blob radius: :math:`R_L < R_b`. The Larmor frequency and radius in Gaussian units read .. math:: \omega_L &= \frac{eB}{\gamma m_e c} \\ R_L &= \frac{v}{\omega_L} = \frac{\gamma m_e v c}{e B} \approx \frac{\gamma m_e c^2}{e B} therefore .. math:: R_L < R_b \Rightarrow \gamma_{\mathrm{max}} < \frac{R_b e B}{m_e c^2} """ return (self.blob.R_b * e * self.blob.B_cgs / mec2).to_value("") @property def gamma_max_ballistic(self): r"""Naive estimation of maximum Lorentz factor of electrons comparing acceleration time scale with ballistic time scale. For the latter we assume that the particles crosses the blob radius. .. math:: (\mathrm{d}E/\mathrm{d}t)_{\mathrm{acc}} &= \xi c E / R_L \\ T_{\mathrm{acc}} &= E \,/\,(\mathrm{d}E/\mathrm{d}t)_{\mathrm{acc}} = R_L / (\xi c) \\ T_{\mathrm{bal}} &= R_b / c \\ T_{\mathrm{acc}} &< T_{\mathrm{bal}} \Rightarrow \gamma_{\mathrm{max}} < \frac{\xi R_b e B}{m_e c^2} """ return self.blob.xi * self.gamma_max_larmor @property def gamma_max_synch(self): r"""Simple estimation of maximum Lorentz factor of electrons comparing the acceleration time scale with the synchrotron energy loss .. math:: (\mathrm{d}E/\mathrm{d}t)_{\mathrm{acc}} &= \xi c E / R_L \\ (\mathrm{d}E/\mathrm{d}t)_{\mathrm{synch}} &= 4 / 3 \sigma_T c U_B \gamma^2 \\ (\mathrm{d}E/\mathrm{d}t)_{\mathrm{acc}} &= (\mathrm{d}E/\mathrm{d}t)_{\mathrm{synch}} \Rightarrow \gamma_{\mathrm{max}} < \sqrt{\frac{6 \pi \xi e}{\sigma_T B}} """ return np.sqrt( 6 * np.pi * self.blob.xi * e / (sigma_T * self.blob.B_cgs) ).to_value("") @property def gamma_max_SSC(self): r"""Simple estimation of maximum Lorentz factor of electrons comparing the acceleration time scale with the SSC energy loss (in Thomson range) WARNING: the highest energy electrons will most often scatter in Klein-Nishina range instead .. math:: (\mathrm{d}E/\mathrm{d}t)_{\mathrm{acc}} &= \xi c E / R_L \\ (\mathrm{d}E/\mathrm{d}t)_{\mathrm{SSC}} &= 4 / 3 \sigma_T c U_{\mathrm{synch}} \gamma^2 \\ (\mathrm{d}E/\mathrm{d}t)_{\mathrm{acc}} &= (\mathrm{d}E/\mathrm{d}t)_{\mathrm{SSC}} \Rightarrow \gamma_{\mathrm{max}} < \sqrt{\frac{3 \xi e B }{\sigma_T U_SSC}} """ return np.sqrt( 3 * self.blob.xi * e * self.blob.B_cgs / (4 * sigma_T * self.blob.u_ph_synch) ).to_value("")
[docs] def gamma_max_EC_DT(self, dt, r=0 * u.cm): r"""Simple estimation of maximum Lorentz factor of electrons comparing the acceleration time scale with the EC energy loss (in Thomson range, see B&G 1970), like in gamma_max_SSC WARNING: assumes Thomson regime .. math:: \gamma_{\mathrm{max}} = \sqrt{\frac{3 \xi e B }{ \sigma_T U'_\mathrm{ext}}} """ return np.sqrt( 3 * self.blob.xi * e * self.blob.B_cgs / (4 * sigma_T * dt.u(r, self.blob)) ).to_value("")
@property def gamma_break_synch(self): r"""Simple estimation of the cooling break of electrons comparing synchrotron cooling time scale with the ballistic time scale: .. math:: T_{\mathrm{synch}} &= E\,/\,(\mathrm{d}E/\mathrm{d}t)_{\mathrm{synch}} = 3 m_e c^2 / (4 \sigma_T U_B \gamma) \\ T_{\mathrm{bal}} &= R_b / c \\ T_{\mathrm{synch}} &= T_{\mathrm{bal}} \Rightarrow \gamma_b = 6 \pi m_e c^2 / \sigma_T B^2 R_b """ gamma_max = ( ( 6 * np.pi * mec2 / (sigma_T * np.power(self.blob.B_cgs, 2) * self.blob.R_b) ) .to("") .value ) return gamma_max @property def gamma_break_SSC(self): r"""Simple estimation of the cooling break of electrons comparing SSC time scale (see B&G 1970) with the ballistic time scale: WARNING: only applicable in Thomson regime .. math:: T_{\mathrm{SSC}} &= E\,/\,(\mathrm{d}E/\mathrm{d}t)_{\mathrm{SSC}} = 3 m_e c^2 / (4 \sigma_T U_{\mathrm{SSC}} \gamma) \\ T_{\mathrm{bal}} &= R_b / c \\ T_{\mathrm{SSC}} &= T_{\mathrm{bal}} \Rightarrow \gamma_b = 3 m_e c^2 / 4 \sigma_T U_{\mathrm{SSC}} R_b """ return ( (3 * mec2 / (4 * sigma_T * self.blob.u_ph_synch * self.blob.R_b)) .to("") .value )
[docs] def gamma_break_EC_DT(self, dt, r=0 * u.cm): r"""Simple estimation of the cooling break of electrons comparing EC time scale (see B&G 1970) with the ballistic time scale, like in gamma_break_SSC WARNING: assumes Thomson regime .. math:: \gamma_b = 3 m_e c^2 / 4 \sigma_T U'_{\mathrm{ext}} R_b """ # u_ext=np.power(self.Gamma,2) * np.power(1-mu*self.Beta,2) * dt.xi_dt*dt.L_disk/(4*np.pi*np.power(d,2) * c) return ( (3 * mec2 / (4 * sigma_T * dt.u(r, self.blob) * self.blob.R_b)).to("").value )