Source code for NuRadioMC.SignalGen.askaryan

# -*- coding: utf-8 -*-
import numpy as np
from NuRadioReco.utilities import units, fft
from NuRadioMC.SignalGen import parametrizations as par
import logging
logger = logging.getLogger("SignalGen.askaryan")


[docs]def set_log_level(level): logger.setLevel(level) par.set_log_level(level)
[docs]def get_time_trace(energy, theta, N, dt, shower_type, n_index, R, model, interp_factor=None, interp_factor2=None, same_shower=False, seed=None, full_output=False, **kwargs): """ returns the Askaryan pulse in the time domain of the eTheta component We implement only the time-domain solution and obtain the frequency spectrum via FFT (with the standard normalization of NuRadioMC). This approach assures that the units are interpreted correctly. In the time domain, the amplitudes are well defined and no details about fourier transform normalizations needs to be known by the user. Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) or "TAU" (tau lepton induced) note that TAU showers are currently only implemented in the ARZ2019 model n_index: float index of refraction at interaction vertex R: float distance from vertex to observer model: string specifies the signal model * ZHS1992: the original ZHS parametrization from E. Zas, F. Halzen, and T. Stanev, Phys. Rev. D 45, 362 (1992), https://doi.org/10.1103/PhysRevD.45.362, this parametrization does not contain any phase information * Alvarez2000: parameterization based on ZHS mainly based on J. Alvarez-Muniz, R. A. Vazquez, and E. Zas, Calculation methods for radio pulses from high energy showers, Physical Review D62 (2000) https://doi.org/10.1103/PhysRevD.84.103003 * Alvarez2009: parameterization based on ZHS from J. Alvarez-Muniz, W. R. Carvalho, M. Tueros, and E. Zas, Coherent cherenkov radio pulses from hadronic showers up to EeV energies, Astroparticle Physics 35 (2012), no. 6 287 – 299 and J. Alvarez-Muniz, C. James, R. Protheroe, and E. Zas, Thinned simulations of extremely energetic showers in dense media for radio applications, Astroparticle Physics 32 (2009), no. 2 100 – 111 * HCRB2017: analytic model from J. Hanson, A. Connolly Astroparticle Physics 91 (2017) 75-89 * ARZ2019: semi MC time domain model from Alvarez-Muñiz, J., Romero-Wolf, A., & Zas, E. (2011). Practical and accurate calculations of Askaryan radiation. Physical Review D - Particles, Fields, Gravitation and Cosmology, 84(10). https://doi.org/10.1103/PhysRevD.84.103003 * ARZ2020: semi MC time domain model updated version of ARZ2019 with parameters taken from J. Alvarez-Muñiz, P.M. Hansen, A. Romero-Wolf and E. Zas, Askaryan radiation from neutrino-induced showers in ice, Phys. Rev. D 101 (2020) 083005. https://doi.org/10.1103/PhysRevD.101.083005 interp_factor: float or None controls the interpolation of the charge-excess profiles in the ARZ model interp_Factor2: float or None controls the second interpolation of the charge-excess profiles in the ARZ model same_shower: bool (default False) controls the random behviour of picking a shower from the library in the ARZ model, see description there for more details seed: None or int the random seed for the Askaryan modules full_output: bool (default False) if True, askaryan modules can return additional output Returns ------- time trace: array the amplitudes for each time bin additional information: dict only available if `full_output` enabled """ shower_type = shower_type.upper() # some convenience to be sloppy with upper/lower case trace = None additional_output = {} if(energy == 0): trace = np.zeros(N) if model in par.get_parametrizations(): tmp = par.get_time_trace(energy, theta, N, dt, shower_type, n_index, R, model, seed=seed, same_shower=same_shower, full_output=full_output, **kwargs) if(full_output): trace, additional_output = tmp else: trace = tmp elif(model == 'HCRB2017'): from NuRadioMC.SignalGen import HCRB2017 is_em_shower = None if(shower_type == "HAD"): is_em_shower = False elif(shower_type == "EM"): is_em_shower = True else: raise NotImplementedError("shower type {} not implemented in {} Askaryan module".format(shower_type, model)) LPM = True a = None if('LPM' in kwargs): LPM = kwargs['LPM'] if('a' in kwargs): a = kwargs['a'] trace = HCRB2017.get_time_trace(energy, theta, N, dt, is_em_shower, n_index, R, LPM, a)[1] elif(model == 'ARZ2019' or model == 'ARZ2020'): from NuRadioMC.SignalGen.ARZ import ARZ gARZ = ARZ.ARZ(arz_version=model, seed=seed) if(interp_factor is not None): gARZ.set_interpolation_factor(interp_factor) if(interp_factor2 is not None): gARZ.set_interpolation_factor2(interp_factor2) trace = gARZ.get_time_trace(energy, theta, N, dt, shower_type, n_index, R, same_shower=same_shower, **kwargs)[1] additional_output['iN'] = gARZ.get_last_shower_profile_id()[shower_type] elif(model == 'spherical'): amplitude = 1. * energy / R trace = np.zeros(N) trace[N // 2] = amplitude else: raise NotImplementedError("model {} unknown".format(model)) if(full_output): return trace, additional_output else: return trace
[docs]def get_frequency_spectrum(energy, theta, N, dt, shower_type, n_index, R, model, full_output=False, **kwargs): """ returns the complex amplitudes of the frequency spectrum of the neutrino radio signal Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) or "TAU" (tau lepton induced) note that TAU showers are currently only implemented in the ARZ2019 model n_index: float index of refraction at interaction vertex R: float distance from vertex to observer model: string specifies the signal model * ZHS1992: the original ZHS parametrization from E. Zas, F. Halzen, and T. Stanev, Phys. Rev. D 45, 362 (1992), https://doi.org/10.1103/PhysRevD.45.362, this parametrization does not contain any phase information * Alvarez2000: parameterization based on ZHS mainly based on J. Alvarez-Muniz, R. A. Vazquez, and E. Zas, Calculation methods for radio pulses from high energy showers, Physical Review D62 (2000) https://doi.org/10.1103/PhysRevD.84.103003 * Alvarez2009: parameterization based on ZHS from J. Alvarez-Muniz, W. R. Carvalho, M. Tueros, and E. Zas, Coherent cherenkov radio pulses from hadronic showers up to EeV energies, Astroparticle Physics 35 (2012), no. 6 287 – 299 and J. Alvarez-Muniz, C. James, R. Protheroe, and E. Zas, Thinned simulations of extremely energetic showers in dense media for radio applications, Astroparticle Physics 32 (2009), no. 2 100 – 111 * HCRB2017: analytic model from J. Hanson, A. Connolly Astroparticle Physics 91 (2017) 75-89 * ARZ2019: semi MC time domain model from Alvarez-Muñiz, J., Romero-Wolf, A., & Zas, E. (2011). Practical and accurate calculations of Askaryan radiation. Physical Review D - Particles, Fields, Gravitation and Cosmology, 84(10). https://doi.org/10.1103/PhysRevD.84.103003 * ARZ2020: semi MC time domain model updated version of ARZ2019 with parameters taken from J. Alvarez-Muñiz, P.M. Hansen, A. Romero-Wolf and E. Zas, Askaryan radiation from neutrino-induced showers in ice, Phys. Rev. D 101 (2020) 083005. https://doi.org/10.1103/PhysRevD.101.083005 full_output: bool (default False) if True, askaryan modules can return additional output Returns ------- spectrum: array the complex amplitudes for the given frequencies additional information: dict only available if `full_output` enabled """ tmp = get_time_trace(energy, theta, N, dt, shower_type, n_index, R, model, full_output=full_output, **kwargs) if(full_output): return fft.time2freq(tmp[0], 1 / dt), tmp[1] else: return fft.time2freq(tmp, 1 / dt)