Module taurunner.cross_sections.xs
Expand source code
import os, sys, pickle
import numpy as np
from importlib.resources import path
from taurunner.utils import units
def hima_tot_xs(E, spl): # pragma: no cover
pass
def jeff_tot_xs(E, spl):
return np.exp(spl(np.log(E)))
def hima_diff_xs(E_in, E_out, spl): # pragma: no cover
return(10**spl(np.log10(E_in), np.log10(E_out))[0][0]/E_in)
def jeff_diff_xs(E_in, E_out, spl):
E_min = 1. # Lowest knot on spline in GeV
E_in = E_in
E_out = E_out
zz = (E_out-E_min)/(E_in-E_min)
res = np.exp(spl(np.log(E_in), zz)[0])/E_in
return res
def get_file_path(name):
with path('taurunner.resources.cross_section_tables', name) as p:
return str(p)
class CrossSections(object):
def __init__(self, model):
self.model = model
#self.cross_section_path = os.path.dirname(os.path.realpath(__file__))+'/cross_section_tables/'
#cross_section_path = self.cross_section_path
if(self.model=='dipole'):
self.f_NC = np.load(get_file_path('NC_table_py3.npy'), allow_pickle=True).item()
self.f_CC = np.load(get_file_path('CC_table_py3.npy'), allow_pickle=True).item()
self.dsdy_spline_CC = np.load(get_file_path('dsigma_dy_CC_py3.npy'), allow_pickle=True).item()
self.dsdy_spline_CC_lowe = np.load(get_file_path('dsigma_dy_CC_lowE_py3.npy'), allow_pickle=True).item()
self.dsdy_spline_NC = np.load(get_file_path('dsigma_dy_NC_py3.npy'), allow_pickle=True).item()
self.dsdy_spline_NC_lowe = np.load(get_file_path('dsigma_dy_NC_lowE_py3.npy'), allow_pickle=True).item()
elif(self.model=='CSMS'):
with open(get_file_path('CSMS_nu_n_dsde_CC.pkl'), 'rb') as pkl_f:
diff_nu_n_CC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_p_dsde_CC.pkl'), 'rb') as pkl_f:
diff_nu_p_CC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_n_dsde_NC.pkl'), 'rb') as pkl_f:
diff_nu_n_NC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_n_dsde_NC.pkl'), 'rb') as pkl_f:
diff_nu_p_NC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_n_sigma_CC.pkl'), 'rb') as pkl_f:
nu_n_CC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_p_sigma_CC.pkl'), 'rb') as pkl_f:
nu_p_CC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_n_sigma_NC.pkl'), 'rb') as pkl_f:
nu_n_NC = pickle.load(pkl_f)
with open(get_file_path('CSMS_nu_p_sigma_NC.pkl'), 'rb') as pkl_f:
nu_p_NC = pickle.load(pkl_f)
self._nu_p_NC = lambda E:jeff_tot_xs(E,nu_p_NC)
self._nu_n_NC = lambda E:jeff_tot_xs(E,nu_n_NC)
self._nu_p_CC = lambda E:jeff_tot_xs(E,nu_p_CC)
self._nu_n_CC = lambda E:jeff_tot_xs(E,nu_n_CC)
self.f_NC = lambda E: (jeff_tot_xs(E, nu_p_NC)+jeff_tot_xs(E, nu_n_NC))/2.
self.f_CC = lambda E: (jeff_tot_xs(E, nu_p_CC)+jeff_tot_xs(E, nu_n_CC))/2.
self.dsdy_spline_CC = lambda Ein, Eout: (jeff_diff_xs(Ein,Eout,diff_nu_p_CC)+jeff_diff_xs(Ein,Eout,diff_nu_n_CC))/2
self.dsdy_spline_CC_lowe = self.dsdy_spline_CC
self.dsdy_spline_NC = lambda Ein, Eout: (jeff_diff_xs(Ein,Eout,diff_nu_p_NC)+jeff_diff_xs(Ein,Eout,diff_nu_n_NC))/2
self.dsdy_spline_NC_lowe = self.dsdy_spline_NC
def TotalNeutrinoCrossSection(self, enu, interaction = 'NC'):
r'''
Calculates total neutrino cross section. returns the value of sigma_CC (or NC)
in natural units.
Parameters
----------
enu: float
neutrino energy in eV
interaction: str
string defining the interaction type (CC or NC). default is NC
Returns
-------
TotalCrossSection: float
Total neutrino cross section at the given energy in natural units.
'''
if(np.log10(enu) < 0.):
raise ValueError("Going below a GeV. this region is not supported.")
if self.model=='CSMS':
if interaction=='NC':
return self.f_NC(enu)
elif interaction=='CC':
return self.f_CC(enu)
elif self.model=='dipole':
if(interaction == 'NC'):
return((10**self.f_NC(np.log10(enu/1e9)))*(units.cm)**2)
else:
return((10**self.f_CC(np.log10(enu/1e9)))*(units.cm)**2)
def DifferentialOutGoingLeptonDistribution(self, ein, eout, interaction):
r'''
Calculates Differential neutrino cross section. returns the value of d$\sigma$/dy
in natural units.
Parameters
----------
ein: float
incoming lepton energy in GeV
eout: float
outgoing lepton energy in GeV
interaction: nusquids obj
string defining the interaction type (CC or NC).
Returns
-------
diff: float
d$\sigma$/d(1-y) at the given energies in natural units where y is the bjorken-y.
'''
eout = np.atleast_1d(eout)
diff = np.zeros_like(eout)
if np.log10(ein) < 0:
return diff
if self.model=='dipole':
if(interaction=='CC'):
greater_out_msk = (np.log10(eout) >= np.log10(ein))
diff[greater_out_msk] = 0.
lowe_msk = (np.log10(eout) < 3.) & ~greater_out_msk
if np.count_nonzero(lowe_msk) > 0:
diff[lowe_msk] = 10**self.dsdy_spline_CC_lowe(np.log10(ein),
np.log10(eout[lowe_msk])
)[0][:]/ein
other_msk = ~(greater_out_msk | lowe_msk)
if np.count_nonzero(other_msk) > 0:
diff[other_msk] = 10**self.dsdy_spline_CC(np.log10(ein),
np.log10(eout[other_msk])
)[0][:]/ein
elif(interaction=='NC'):
greater_out_msk = np.log10(eout) >= np.log10(ein)
diff[greater_out_msk] = 0.
lowe_msk = (np.log10(eout) <= 3.) & ~greater_out_msk
if np.count_nonzero(lowe_msk) > 0:
diff[lowe_msk] = 10**self.dsdy_spline_NC_lowe(np.log10(ein),
np.log10(eout[lowe_msk])
)[0][:]/ein
other_msk = ~(greater_out_msk | lowe_msk)
if np.count_nonzero(other_msk) > 0:
diff[other_msk] = 10**self.dsdy_spline_NC(np.log10(ein),
np.log10(eout[other_msk])
)[0][:]/ein
elif(self.model=='CSMS'):
if interaction=='NC':
diff = self.dsdy_spline_NC(ein, eout)
elif interaction=='CC':
diff = self.dsdy_spline_CC(ein, eout)
else:
raise ValueError('Interaction %s not allowed. Must be "CC" or "NC"')
return diff
Functions
def get_file_path(name)
-
Expand source code
def get_file_path(name): with path('taurunner.resources.cross_section_tables', name) as p: return str(p)
def hima_diff_xs(E_in, E_out, spl)
-
Expand source code
def hima_diff_xs(E_in, E_out, spl): # pragma: no cover return(10**spl(np.log10(E_in), np.log10(E_out))[0][0]/E_in)
def hima_tot_xs(E, spl)
-
Expand source code
def hima_tot_xs(E, spl): # pragma: no cover pass
def jeff_diff_xs(E_in, E_out, spl)
-
Expand source code
def jeff_diff_xs(E_in, E_out, spl): E_min = 1. # Lowest knot on spline in GeV E_in = E_in E_out = E_out zz = (E_out-E_min)/(E_in-E_min) res = np.exp(spl(np.log(E_in), zz)[0])/E_in return res
def jeff_tot_xs(E, spl)
-
Expand source code
def jeff_tot_xs(E, spl): return np.exp(spl(np.log(E)))
Classes
class CrossSections (model)
-
Expand source code
class CrossSections(object): def __init__(self, model): self.model = model #self.cross_section_path = os.path.dirname(os.path.realpath(__file__))+'/cross_section_tables/' #cross_section_path = self.cross_section_path if(self.model=='dipole'): self.f_NC = np.load(get_file_path('NC_table_py3.npy'), allow_pickle=True).item() self.f_CC = np.load(get_file_path('CC_table_py3.npy'), allow_pickle=True).item() self.dsdy_spline_CC = np.load(get_file_path('dsigma_dy_CC_py3.npy'), allow_pickle=True).item() self.dsdy_spline_CC_lowe = np.load(get_file_path('dsigma_dy_CC_lowE_py3.npy'), allow_pickle=True).item() self.dsdy_spline_NC = np.load(get_file_path('dsigma_dy_NC_py3.npy'), allow_pickle=True).item() self.dsdy_spline_NC_lowe = np.load(get_file_path('dsigma_dy_NC_lowE_py3.npy'), allow_pickle=True).item() elif(self.model=='CSMS'): with open(get_file_path('CSMS_nu_n_dsde_CC.pkl'), 'rb') as pkl_f: diff_nu_n_CC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_p_dsde_CC.pkl'), 'rb') as pkl_f: diff_nu_p_CC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_n_dsde_NC.pkl'), 'rb') as pkl_f: diff_nu_n_NC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_n_dsde_NC.pkl'), 'rb') as pkl_f: diff_nu_p_NC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_n_sigma_CC.pkl'), 'rb') as pkl_f: nu_n_CC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_p_sigma_CC.pkl'), 'rb') as pkl_f: nu_p_CC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_n_sigma_NC.pkl'), 'rb') as pkl_f: nu_n_NC = pickle.load(pkl_f) with open(get_file_path('CSMS_nu_p_sigma_NC.pkl'), 'rb') as pkl_f: nu_p_NC = pickle.load(pkl_f) self._nu_p_NC = lambda E:jeff_tot_xs(E,nu_p_NC) self._nu_n_NC = lambda E:jeff_tot_xs(E,nu_n_NC) self._nu_p_CC = lambda E:jeff_tot_xs(E,nu_p_CC) self._nu_n_CC = lambda E:jeff_tot_xs(E,nu_n_CC) self.f_NC = lambda E: (jeff_tot_xs(E, nu_p_NC)+jeff_tot_xs(E, nu_n_NC))/2. self.f_CC = lambda E: (jeff_tot_xs(E, nu_p_CC)+jeff_tot_xs(E, nu_n_CC))/2. self.dsdy_spline_CC = lambda Ein, Eout: (jeff_diff_xs(Ein,Eout,diff_nu_p_CC)+jeff_diff_xs(Ein,Eout,diff_nu_n_CC))/2 self.dsdy_spline_CC_lowe = self.dsdy_spline_CC self.dsdy_spline_NC = lambda Ein, Eout: (jeff_diff_xs(Ein,Eout,diff_nu_p_NC)+jeff_diff_xs(Ein,Eout,diff_nu_n_NC))/2 self.dsdy_spline_NC_lowe = self.dsdy_spline_NC def TotalNeutrinoCrossSection(self, enu, interaction = 'NC'): r''' Calculates total neutrino cross section. returns the value of sigma_CC (or NC) in natural units. Parameters ---------- enu: float neutrino energy in eV interaction: str string defining the interaction type (CC or NC). default is NC Returns ------- TotalCrossSection: float Total neutrino cross section at the given energy in natural units. ''' if(np.log10(enu) < 0.): raise ValueError("Going below a GeV. this region is not supported.") if self.model=='CSMS': if interaction=='NC': return self.f_NC(enu) elif interaction=='CC': return self.f_CC(enu) elif self.model=='dipole': if(interaction == 'NC'): return((10**self.f_NC(np.log10(enu/1e9)))*(units.cm)**2) else: return((10**self.f_CC(np.log10(enu/1e9)))*(units.cm)**2) def DifferentialOutGoingLeptonDistribution(self, ein, eout, interaction): r''' Calculates Differential neutrino cross section. returns the value of d$\sigma$/dy in natural units. Parameters ---------- ein: float incoming lepton energy in GeV eout: float outgoing lepton energy in GeV interaction: nusquids obj string defining the interaction type (CC or NC). Returns ------- diff: float d$\sigma$/d(1-y) at the given energies in natural units where y is the bjorken-y. ''' eout = np.atleast_1d(eout) diff = np.zeros_like(eout) if np.log10(ein) < 0: return diff if self.model=='dipole': if(interaction=='CC'): greater_out_msk = (np.log10(eout) >= np.log10(ein)) diff[greater_out_msk] = 0. lowe_msk = (np.log10(eout) < 3.) & ~greater_out_msk if np.count_nonzero(lowe_msk) > 0: diff[lowe_msk] = 10**self.dsdy_spline_CC_lowe(np.log10(ein), np.log10(eout[lowe_msk]) )[0][:]/ein other_msk = ~(greater_out_msk | lowe_msk) if np.count_nonzero(other_msk) > 0: diff[other_msk] = 10**self.dsdy_spline_CC(np.log10(ein), np.log10(eout[other_msk]) )[0][:]/ein elif(interaction=='NC'): greater_out_msk = np.log10(eout) >= np.log10(ein) diff[greater_out_msk] = 0. lowe_msk = (np.log10(eout) <= 3.) & ~greater_out_msk if np.count_nonzero(lowe_msk) > 0: diff[lowe_msk] = 10**self.dsdy_spline_NC_lowe(np.log10(ein), np.log10(eout[lowe_msk]) )[0][:]/ein other_msk = ~(greater_out_msk | lowe_msk) if np.count_nonzero(other_msk) > 0: diff[other_msk] = 10**self.dsdy_spline_NC(np.log10(ein), np.log10(eout[other_msk]) )[0][:]/ein elif(self.model=='CSMS'): if interaction=='NC': diff = self.dsdy_spline_NC(ein, eout) elif interaction=='CC': diff = self.dsdy_spline_CC(ein, eout) else: raise ValueError('Interaction %s not allowed. Must be "CC" or "NC"') return diff
Methods
def DifferentialOutGoingLeptonDistribution(self, ein, eout, interaction)
-
Calculates Differential neutrino cross section. returns the value of d$\sigma$/dy in natural units. Parameters
ein
:float
- incoming lepton energy in GeV
eout
:float
- outgoing lepton energy in GeV
interaction
:nusquids obj
- string defining the interaction type (CC or NC).
Returns
diff
:float
- d$\sigma$/d(1-y) at the given energies in natural units where y is the bjorken-y.
Expand source code
def DifferentialOutGoingLeptonDistribution(self, ein, eout, interaction): r''' Calculates Differential neutrino cross section. returns the value of d$\sigma$/dy in natural units. Parameters ---------- ein: float incoming lepton energy in GeV eout: float outgoing lepton energy in GeV interaction: nusquids obj string defining the interaction type (CC or NC). Returns ------- diff: float d$\sigma$/d(1-y) at the given energies in natural units where y is the bjorken-y. ''' eout = np.atleast_1d(eout) diff = np.zeros_like(eout) if np.log10(ein) < 0: return diff if self.model=='dipole': if(interaction=='CC'): greater_out_msk = (np.log10(eout) >= np.log10(ein)) diff[greater_out_msk] = 0. lowe_msk = (np.log10(eout) < 3.) & ~greater_out_msk if np.count_nonzero(lowe_msk) > 0: diff[lowe_msk] = 10**self.dsdy_spline_CC_lowe(np.log10(ein), np.log10(eout[lowe_msk]) )[0][:]/ein other_msk = ~(greater_out_msk | lowe_msk) if np.count_nonzero(other_msk) > 0: diff[other_msk] = 10**self.dsdy_spline_CC(np.log10(ein), np.log10(eout[other_msk]) )[0][:]/ein elif(interaction=='NC'): greater_out_msk = np.log10(eout) >= np.log10(ein) diff[greater_out_msk] = 0. lowe_msk = (np.log10(eout) <= 3.) & ~greater_out_msk if np.count_nonzero(lowe_msk) > 0: diff[lowe_msk] = 10**self.dsdy_spline_NC_lowe(np.log10(ein), np.log10(eout[lowe_msk]) )[0][:]/ein other_msk = ~(greater_out_msk | lowe_msk) if np.count_nonzero(other_msk) > 0: diff[other_msk] = 10**self.dsdy_spline_NC(np.log10(ein), np.log10(eout[other_msk]) )[0][:]/ein elif(self.model=='CSMS'): if interaction=='NC': diff = self.dsdy_spline_NC(ein, eout) elif interaction=='CC': diff = self.dsdy_spline_CC(ein, eout) else: raise ValueError('Interaction %s not allowed. Must be "CC" or "NC"') return diff
def TotalNeutrinoCrossSection(self, enu, interaction='NC')
-
Calculates total neutrino cross section. returns the value of sigma_CC (or NC) in natural units. Parameters
enu
:float
- neutrino energy in eV
interaction
:str
- string defining the interaction type (CC or NC). default is NC
Returns
TotalCrossSection
:float
- Total neutrino cross section at the given energy in natural units.
Expand source code
def TotalNeutrinoCrossSection(self, enu, interaction = 'NC'): r''' Calculates total neutrino cross section. returns the value of sigma_CC (or NC) in natural units. Parameters ---------- enu: float neutrino energy in eV interaction: str string defining the interaction type (CC or NC). default is NC Returns ------- TotalCrossSection: float Total neutrino cross section at the given energy in natural units. ''' if(np.log10(enu) < 0.): raise ValueError("Going below a GeV. this region is not supported.") if self.model=='CSMS': if interaction=='NC': return self.f_NC(enu) elif interaction=='CC': return self.f_CC(enu) elif self.model=='dipole': if(interaction == 'NC'): return((10**self.f_NC(np.log10(enu/1e9)))*(units.cm)**2) else: return((10**self.f_CC(np.log10(enu/1e9)))*(units.cm)**2)