import scipy.constants
import numpy as np
from NuRadioReco.utilities import units
from NuRadioMC.SignalProp.propagation_base_class import ray_tracing_base
from NuRadioMC.SignalProp.propagation import solution_types_revert
import logging
logging.basicConfig()
speed_of_light = scipy.constants.c * units.m / units.s
[docs]class direct_ray_tracing(ray_tracing_base):
"""
Raytracing module for direct ray (straight line) propagation.
"""
[docs] def find_solutions(self):
results = []
for iS in range(self.get_number_of_solutions()):
results.append({'type': self.get_solution_type(iS), 'reflection':0})
self._results = results
return results
[docs] def get_launch_vector(self, iS):
launch_vector = self._X2 - self._X1
return launch_vector
[docs] def get_number_of_solutions(self):
return 1
[docs] def get_solution_type(self, iS):
return solution_types_revert['direct']
[docs] def get_path(self, iS, n_points = 1000):
"""
Calculates the path from the shower to the observer of the iS'th solution
and splits it into segments (points). The returned path is an array with
dimensions [n_points, 3].
"""
delta_x =(self._X2-self._X1)/(n_points-1)
path = self._X1[None] + np.arange(n_points)[:, None] * delta_x[None]
return path
[docs] def get_receive_vector(self, iS):
receive_vector = self._X1 - self._X2
return receive_vector
[docs] def get_path_length(self, iS):
path_length = np.linalg.norm(self._X2 - self._X1)
return path_length
[docs] def get_travel_time(self, iS):
"""
Calculate the travel time for the signal traveling along the solution. Takes
into account the varying index of refraction along the path.
"""
path = self.get_path(iS)
segment_length = np.linalg.norm(path[1] - path[0])
segment_centers = (path[:-1] + path[1:]) / 2
n = self._medium.get_index_of_refraction(segment_centers)
traveltime = np.sum(segment_length / (speed_of_light / n))
return traveltime
[docs] def get_reflection_angle(self):
return None
[docs] def apply_propagation_effects(self, efield, iS):
return efield
[docs] def get_output_parameters(self):
return [
{'name': 'ray_tracing_solution_type', 'ndim': 1}
]
[docs] def get_raytracing_output(self, i_solution):
return {
'ray_tracing_solution_type': self.get_solution_type(i_solution)
}