Source code for modest.utils.xrayphotons
import numpy as np
# Simple library of functions for computing x-ray background flux
#
# All energies should be passed in keV!!!
#
# Everything in this library is based on the following paper:
#
# The Spectrum of Diffuse Cosmic Hard X-Rays Measured with HEAO 1
#
# D.E. Gruber, J.L. Matteson, L.E. Peterson
[docs]def xRayBackground(E):
if (type(E) is np.ndarray) or (type(E) is list):
results = np.zeros(len(E))
for i in range(len(results)):
results[i] = xRayBackground(E[i])
return results
else:
return(singleXRayBackground(E))
[docs]def singleXRayBackground(E):
background = None
if E < 1e-2:
raise ValueError(
'Photon energies less than 2 keV are below the regime of this equation')
elif (E >= 1e-2 and E <= 60):
background = (
7.877 * np.power(E, -0.29) * np.exp(-E / 41.13)
)
elif E > 60:
background = (
0.0259 * np.power(E / 60, -5.5) +
0.504 * np.power(E / 60, -1.58) +
0.0288 * np.power(E / 60, -1.05)
)
return background
[docs]def backgroundCountRatePerSR(
lowerE,
upperE,
resolution=None
):
energyBand = upperE - lowerE
if resolution is None:
nSteps = 100
resolution = energyBand / (nSteps - 1)
else:
nSteps = (energyBand / resolution) + 1
energySpectrum = np.linspace(lowerE, upperE, nSteps)
backgroundCountRate = 0
for i in range(len(energySpectrum)):
backgroundCountRate = (
backgroundCountRate +
xRayBackground(energySpectrum[i]) * resolution/energySpectrum[i]
)
return backgroundCountRate
# Perform an euler numerical integration to get the total background count
# rates over an energy range
[docs]def backgroundFluxPerSR(lowerE,
upperE,
resolution=None):
energyBand = upperE - lowerE
if resolution is None:
nSteps = 1000
resolution = energyBand / (nSteps - 1)
else:
nSteps = (energyBand / resolution) + 1
energySpectrum = np.linspace(lowerE, upperE, nSteps)
backgroundFlux = 0
for i in range(len(energySpectrum)):
backgroundFlux = (
backgroundFlux +
xRayBackground(energySpectrum[i]) * resolution
)
return backgroundFlux
[docs]def radianFOVToSR(radian):
return 2 * np.pi * (1 - np.cos(radian))
[docs]def degreeFOVToSR(degree):
radian = degree * np.pi / (180)
return radianFOVToSR(radian)
# Returns counts per cm^2
[docs]def backgroundCountRate(
lowerE,
upperE,
FOVDegrees):
return backgroundCountRatePerSR(lowerE, upperE) * degreeFOVToSR(FOVDegrees)
[docs]def KEVbackgroundFlux(lowerE,
upperE,
FOVDegrees):
return backgroundFluxPerSR(lowerE, upperE) * degreeFOVToSR(FOVDegrees)
[docs]def ERGbackgroundFlux(lowerE,
upperE,
FOVDegrees):
return (1.60218e-9 *
backgroundFluxPerSR(lowerE, upperE) *
degreeFOVToSR(FOVDegrees))
[docs]def chandraBackgroundERG(FOVDegrees):
return 3.8e-12 * np.square(FOVDegrees*2)