diff --git a/electrons/common/generic_electron_solver.py b/electrons/common/generic_electron_solver.py index c988e17..53fc5cc 100644 --- a/electrons/common/generic_electron_solver.py +++ b/electrons/common/generic_electron_solver.py @@ -6,42 +6,7 @@ import numpy as np from numpy.typing import NDArray - - -def von_neumann_expression( - dt: float, - ion_diff: float, - grid_spacing_cm: float, - ion_mobility: float, - Efield_V_cm: float, -) -> Tuple[float, NDArray, NDArray]: - """ - Finds a time step dt which fulfils the von Neumann criterion, i.e. ensures the numericl error does not increase but - decreases and eventually damps out - """ - von_neumann_expression = False - - # initialize the coefficients - sx = sy = sz = cx = cy = cz = 0.0 - - while not von_neumann_expression: - dt /= 1.01 - # as defined in the Deghan (2004) paper - - # we leave the coeficents as 0 in the xy plane - # sx = ion_diff*dt/(self.grid_spacing_cm**2) - # sy = ion_diff*dt/(self.grid_spacing_cm**2) - - sz = ion_diff * dt / (grid_spacing_cm**2) - cz = ion_mobility * Efield_V_cm * dt / grid_spacing_cm - # check von Neumann's criterion - criterion_1 = 2 * (sx + sy + sz) + cx**2 + cy**2 + cz**2 <= 1 - - criterion_2 = cx**2 * cy**2 * cz**2 <= 8 * sx * sy * sz - - von_neumann_expression = criterion_1 and criterion_2 - - return dt, np.array([sx, sy, sz]), np.array([cx, cy, cz]) +from tqdm import tqdm def create_sc_gradients( @@ -75,9 +40,9 @@ def create_sc_gradients( class GenericElectronSolver(ABC): # Simulation parameters electron_density_per_cm3: float # fluence-rate [/cm^2/s] - voltage_V: float # [V/cm] magnitude of the electric field - electrode_gap: float # [cm] # electrode gap - grid_spacing_cm: float + voltage: float # [V/cm] magnitude of the electric field + electrode_gap: float # [cm] + grid_spacing: float ion_mobility: float = 1.73 # cm s^-1 V^-1, averaged for positive and negative ions ion_diff: float = 3.7e-2 # cm^2/s, averaged for positive and negative ions alpha: float = 1.60e-6 # cm^3/s, recombination constant @@ -93,7 +58,7 @@ class GenericElectronSolver(ABC): def no_xy(self) -> int: """Number of voxels om the xy-directions""" - no_xy = int(2 * self.r_cm / self.grid_spacing_cm) + no_xy = int(2 * self.r_cm / self.grid_spacing) no_xy += 2 * self.buffer_radius return no_xy @@ -101,34 +66,63 @@ def no_xy(self) -> int: def no_z(self) -> int: """Number of voxels om the z-direction""" - return int(self.electrode_gap / self.grid_spacing_cm) + return int(self.electrode_gap / self.grid_spacing) @property def no_z_with_buffer(self) -> int: return 2 * self.no_z_electrode + self.no_z @property - def Efield_V_cm(self) -> float: - return self.voltage_V / self.electrode_gap + def electric_field(self) -> float: + return self.voltage / self.electrode_gap @property def separation_time_steps(self) -> int: - """ - Number of step required to drag the two charge carrier distributions apart - along with the number of tracks to be uniformly distributed over the domain - """ return int( - self.electrode_gap / (2.0 * self.ion_mobility * self.Efield_V_cm * self.dt) + self.electrode_gap + / (2.0 * self.ion_mobility * self.electric_field * self.dt) ) @property def computation_time_steps(self) -> int: + return self.separation_time_steps * 3 @property def delta_border(self) -> int: return 2 + def von_neumann_expression(self) -> Tuple[float, NDArray, NDArray]: + """ + Finds a time step dt which fulfils the von Neumann criterion, i.e. ensures the numericl error does not increase but + decreases and eventually damps out + """ + + von_neumann_expression = False + dt = 1.0 + + # initialize the coefficients + sx = sy = sz = cx = cy = cz = 0.0 + + while not von_neumann_expression: + dt /= 1.01 + # as defined in the Deghan (2004) paper + + # we leave the coeficents as 0 in the xy plane + # sx = ion_diff*dt/(self.grid_spacing_cm**2) + # sy = ion_diff*dt/(self.grid_spacing_cm**2) + + sz = self.ion_diff * dt / (self.grid_spacing**2) + cz = self.ion_mobility * self.electric_field * dt / self.grid_spacing + # check von Neumann's criterion + criterion_1 = 2 * (sx + sy + sz) + cx**2 + cy**2 + cz**2 <= 1 + + criterion_2 = cx**2 * cy**2 * cz**2 <= 8 * sx * sy * sz + + von_neumann_expression = criterion_1 and criterion_2 + + return dt, np.array([sx, sy, sz]), np.array([cx, cy, cz]) + def __post_init__( self, ): @@ -139,13 +133,7 @@ def __post_init__( % (self.no_xy * self.no_xy * self.no_z_with_buffer) ) - self.dt, self.s, self.c = von_neumann_expression( - self.dt, - self.ion_diff, - self.grid_spacing_cm, - self.ion_mobility, - self.Efield_V_cm, - ) + self.dt, self.s, self.c = self.von_neumann_expression() @abstractmethod def should_simulate_beam_for_time_step(self, time_step: int) -> bool: @@ -179,8 +167,6 @@ def calculate(self): The tracks are distributed uniformly in time """ - positive_temp_entry = negative_temp_entry = recomb_temp = 0.0 - f_steps_list = np.zeros(self.computation_time_steps) sc_pos, sc_neg, sc_center = create_sc_gradients(self.s, self.c) @@ -189,7 +175,7 @@ def calculate(self): Start the simulation by evolving the distribution one step at a time """ - for time_step in range(self.computation_time_steps): + for time_step in tqdm(range(self.computation_time_steps), desc="Simulating"): """ Refill the array with the electron density each time step diff --git a/electrons/numba/run_simulation.py b/electrons/numba/run_simulation.py index 4ceef7d..90e0dac 100644 --- a/electrons/numba/run_simulation.py +++ b/electrons/numba/run_simulation.py @@ -12,7 +12,7 @@ def run_simulation( solver_name="continous", - voltage_V=300, + voltage=300, electrode_gap=0.1, electron_density_per_cm3=1e9, verbose=True, @@ -26,15 +26,15 @@ def run_simulation( if verbose: print(f"Running the simulation using the {solver_name} solver.") - print(f"Voltage: {voltage_V} [V]") + print(f"Voltage: {voltage} [V]") print(f"Electrode gap: {electrode_gap} [cm]") print(f"Electron density per cm3: {electron_density_per_cm3}") solver = Solver( electron_density_per_cm3=electron_density_per_cm3, - voltage_V=voltage_V, + voltage=voltage, electrode_gap=electrode_gap, - grid_spacing_cm=5e-4, + grid_spacing=5e-4, ) return solver.calculate() diff --git a/electrons/python/run_simulation.py b/electrons/python/run_simulation.py index 26399fc..59a55ff 100644 --- a/electrons/python/run_simulation.py +++ b/electrons/python/run_simulation.py @@ -8,7 +8,7 @@ def run_simulation( solver_name="continous", - voltage_V=300, + voltage=300, electrode_gap=0.1, electron_density_per_cm3=1e9, verbose=True, @@ -22,15 +22,15 @@ def run_simulation( if verbose: print(f"Running the simulation using the {solver_name} solver.") - print(f"Voltage: {voltage_V} [V]") + print(f"Voltage: {voltage} [V]") print(f"Electrode gap: {electrode_gap} [cm]") print(f"Electron density per cm3: {electron_density_per_cm3}") solver = Solver( electron_density_per_cm3=electron_density_per_cm3, - voltage_V=voltage_V, + voltage=voltage, electrode_gap=electrode_gap, - grid_spacing_cm=5e-4, + grid_spacing=5e-4, ) return solver.calculate() diff --git a/hadrons/common/continous_beam.py b/hadrons/common/continous_beam.py new file mode 100644 index 0000000..34819bd --- /dev/null +++ b/hadrons/common/continous_beam.py @@ -0,0 +1,157 @@ +from dataclasses import dataclass +from math import exp, sqrt + +import numpy as np +from numpy.random import Generator, default_rng +from tqdm import tqdm + +from hadrons.common.generic_hadron_solver import GenericHadronSolver +from hadrons.utils.common import doserate_to_fluence +from hadrons.utils.track_distribution import create_track_distribution + + +def is_point_within_radius_from_center( + x: int, y: int, radius: float, center_x: int, center_y: int +): + """Cached function that caluclates if the point is within a given radius from the center point. It's cached to speed up the calculations.""" + return (x - center_x) ** 2 + (y - center_y) ** 2 < radius**2 + + +def get_continous_beam_pde_solver(base_solver_class: GenericHadronSolver): + + @dataclass + class ContinousHadronSolver(base_solver_class): + # TODO: dataclasses do not allow for non-default properties if the inherided class has default properties - not sure how to fix this yet + doserate: float = None # [cm-^2/s] + # TODO: add a seed param + default_random_generator: Generator = default_rng(2137) + + @property + def buffer_radius(self): + return 10 + + @property + def no_xy(self) -> int: + return ( + int(self.track_radius * self.n_track_radii / self.grid_spacing) + + 2 * self.buffer_radius + ) + + @property + def random_generator(self): + return self.default_random_generator + + @property + def xy_middle_idx(self): + return int(self.no_xy / 2.0) + + @property + def inner_radius(self): + outer_radius = self.no_xy / 2.0 + + return outer_radius - self.buffer_radius + + @property + def fluence_rate(self): + return doserate_to_fluence( + self.doserate, self.energy, particle=self.particle + ) + + def __post_init__(self): + super().__post_init__() + self.simulation_time = self.computation_time_steps * self.dt + self.number_of_tracks = int( + self.fluence_rate * self.simulation_time * self.track_area + ) + + self.number_of_tracks = max(1, self.number_of_tracks) + + self.track_distribution = create_track_distribution( + self.computation_time_steps, + self.dt, + self.number_of_tracks, + self.separation_time_steps, + self.random_generator, + ) + + # precalcuate the recombination calculation radius + self.recombination_calculation_matrix = [ + [ + is_point_within_radius_from_center( + i, j, self.inner_radius, self.xy_middle_idx, self.xy_middle_idx + ) + for j in range(self.no_xy) + ] + for i in range(self.no_xy) + ] + + def get_number_of_tracks(self, time_step: int) -> bool: + return self.track_distribution[time_step] + + def get_random_xy_coordinate(self): + return self.random_generator.random() * self.no_xy + + def get_random_coordinates(self): + x = self.get_random_xy_coordinate() + y = self.get_random_xy_coordinate() + + # check whether the point is inside the circle. + # it is too time comsuming simply to set x=rand(0,1)*no_xy + while ( + sqrt((x - self.xy_middle_idx) ** 2 + (y - self.xy_middle_idx) ** 2) + > self.inner_radius + ): + x = self.get_random_xy_coordinate() + y = self.get_random_xy_coordinate() + + return x, y + + def get_track_for_time_step(self, time_step: int): + positive_array = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + negative_array = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + no_initialised_charge_carriers = 0.0 + + x, y = self.get_random_coordinates() + + for k in tqdm( + range(self.no_z_electrode, self.no_z + self.no_z_electrode), + desc="Calculating track...", + ): + for i in range(self.no_xy): + x_track_dist_squared = (i - x) ** 2 + x_chamber_dist_squared = (i - self.xy_middle_idx) ** 2 + + for j in range(self.no_xy): + distance_from_center = ( + sqrt(x_track_dist_squared + (j - y) ** 2) + * self.grid_spacing + ) + ion_density = self.Gaussian_factor * exp( + -(distance_from_center**2) / self.track_radius**2 + ) + positive_array[i, j, k] += ion_density + negative_array[i, j, k] += ion_density + # calculate the recombination only for charge carriers inside the circle + if ( + sqrt(x_chamber_dist_squared + (j - self.xy_middle_idx) ** 2) + < self.inner_radius + ): + if time_step > self.separation_time_steps: + no_initialised_charge_carriers += ion_density + + return positive_array, negative_array, no_initialised_charge_carriers + + def should_count_recombined_charge_carriers( + self, time_step: int, x: int, y: int, z: int + ) -> bool: + # Only count after the separation time steps + if time_step < self.separation_time_steps: + return False + + # Don't count for voxels on the chambers electrode + if z <= self.no_z_electrode or z >= (self.no_z + self.no_z_electrode): + return False + + return self.recombination_calculation_matrix[x][y] + + return ContinousHadronSolver diff --git a/hadrons/common/generic_hadron_solver.py b/hadrons/common/generic_hadron_solver.py new file mode 100644 index 0000000..9d8d38b --- /dev/null +++ b/hadrons/common/generic_hadron_solver.py @@ -0,0 +1,296 @@ +from abc import ABC, abstractmethod +from dataclasses import dataclass +from math import cos, exp, log, pi, sin +from typing import Literal, Tuple + +import numpy as np +from numpy.typing import NDArray +from tqdm import tqdm + +from hadrons.utils.common import calculate_track_radius, get_LET_per_um + +from ..common_properties import ( + W, + air_density_g_cm3, + alpha, + ion_diff, + ion_mobility, + water_density_g_cm3, +) +from ..geiss_utils import Geiss_r_max, Geiss_RRD_cm + + +def create_sc_gradients( + s: NDArray, + c: NDArray, +) -> Tuple[NDArray, NDArray, float]: + sc_pos = np.array( + [ + s[0] + c[0] * (c[0] + 1.0) / 2.0, + s[1] + c[1] * (c[1] + 1.0) / 2.0, + s[2] + c[2] * (c[2] + 1.0) / 2.0, + ] + ) + + sc_neg = np.array( + [ + s[0] + c[0] * (c[0] - 1.0) / 2.0, + s[1] + c[1] * (c[1] - 1.0) / 2.0, + s[2] + c[2] * (c[2] - 1.0) / 2.0, + ] + ) + + sc_center = ( + 1.0 - c[0] * c[0] - c[1] * c[1] - c[2] * c[2] - 2.0 * (s[0] + s[1] + s[2]) + ) + + return sc_pos, sc_neg, sc_center + + +@dataclass +class GenericHadronSolver(ABC): + voltage: float # [V/cm] magnitude of the electric field + IC_angle: float # [rad] + electrode_gap: float # [cm] + energy: float # [MeV/u] + RDD_model: Literal["Gauss", "Geiss"] = "Gauss" + grid_spacing: float = 5e-4 # [cm] + # TODO: Narrow this type down + particle: str = "proton" + no_z_electrode: int = ( + 4 # length of the electrode-buffer to ensure no ions drift through the array in one time step + ) + n_track_radii: int = 6 # scaling factor to determine the grid width + dt: float = 1.0 + + @property + def LET_per_um(self) -> float: + return get_LET_per_um(self.energy, self.particle) + + @property + def LET_per_cm(self) -> float: + return self.LET_per_um * 1e7 + + @property + def a0(self) -> float: + density_ratio = water_density_g_cm3 / air_density_g_cm3 + return 8.0 * 1e-7 * density_ratio + + @property + def r_max(self) -> float: + return Geiss_r_max(self.energy, air_density_g_cm3) + + @property + def track_radius(self) -> float: + return calculate_track_radius(self.LET_per_um) + + @property + def track_area(self) -> float: + return pi * self.track_radius**2 + + @property + def Gaussian_factor(self) -> float: + N0 = self.LET_per_cm / W + return N0 / self.track_area + + @property + def no_xy(self) -> int: + return int(self.track_radius * self.n_track_radii / self.grid_spacing) + + @property + def no_z(self) -> int: + return int(self.electrode_gap / self.grid_spacing) + + @property + def no_z_with_buffer(self) -> int: + return 2 * self.no_z_electrode + self.no_z + + @property + def electric_field(self) -> float: + return self.voltage / self.electrode_gap + + @property + def separation_time_steps(self) -> int: + return int( + self.electrode_gap / (2.0 * ion_mobility * self.electric_field * self.dt) + ) + + @property + def computation_time_steps(self) -> int: + + return self.separation_time_steps * 4 + + @property + def RDD_function(self): + if self.RDD_model == "Gauss": + return lambda r_cm: self.Gaussian_factor * exp( + -(r_cm**2) / self.track_radius**2 + ) + elif self.RDD_model == "Geiss": + c = self.LET_per_cm / (pi * W) * (1 / (1 + 2 * log(self.r_max / self.a0))) + return lambda r_cm: Geiss_RRD_cm(r_cm, c, self.a0, self.r_max) + else: + raise ValueError( + f"Invalid RDD model: {self.RDD_model}. Must be 'Gauss' or 'Geiss'." + ) + + def von_neumann_expression(self) -> Tuple[float, NDArray, NDArray]: + """ + Finds a time step dt which fulfils the von Neumann criterion, i.e. ensures the numericl error does not increase but + decreases and eventually damps out + """ + + von_neumann_expression = False + dt = 1.0 + + while not von_neumann_expression: + dt /= 1.01 + # as defined in the Deghan (2004) paper + sx = ion_diff * dt / (self.grid_spacing**2) + sy = sz = sx + + cx = ( + ion_mobility + * self.electric_field + * dt + / self.grid_spacing + * sin(self.IC_angle) + ) + cy = 0 + cz = ( + ion_mobility + * self.electric_field + * dt + / self.grid_spacing + * cos(self.IC_angle) + ) + + criterion_1 = 2 * (sx + sy + sz) + cx**2 + cy**2 + cz**2 <= 1 + + criterion_2 = cx**2 * cy**2 * cz**2 <= 8 * sx * sy * sz + + von_neumann_expression = criterion_1 and criterion_2 + + return dt, np.array([sx, sy, sz]), np.array([cx, cy, cz]) + + def __post_init__(self): + # depending on the cluster/computer, the upper limit may be changed + if (self.no_xy * self.no_xy * self.no_z) > 1e8: + raise ValueError( + "Too many elements in the array: %i" + % (self.no_xy * self.no_xy * self.no_z_with_buffer) + ) + + self.dt, self.s, self.c = self.von_neumann_expression() + + @abstractmethod + def get_number_of_tracks(self, time_step: int) -> int: + pass + + @abstractmethod + def get_track_for_time_step( + self, time_step: int + ) -> Tuple[NDArray[np.float64], NDArray[np.float64], float]: + pass + + @abstractmethod + def should_count_recombined_charge_carriers( + self, time_step: int, x: float, y: float, z: float + ) -> bool: + pass + + def calculate(self): + positive_array = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + negative_array = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + + positive_array_temp = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + negative_array_temp = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + + no_recombined_charge_carriers = 0.0 + no_initialised_charge_carriers = 0.0 + + f_steps_list = np.zeros(self.computation_time_steps) + + sc_pos, sc_neg, sc_center = create_sc_gradients(self.s, self.c) + + for time_step in tqdm( + range(self.computation_time_steps), desc="Calculating..." + ): + # calculate the new densities and store them in temporary arrays + + for _ in range(self.get_number_of_tracks(time_step)): + positive_track, negative_track, initialized_carriers = ( + self.get_track_for_time_step(time_step) + ) + + positive_array += positive_track + negative_array += negative_track + + no_initialised_charge_carriers += initialized_carriers + + for i in range(1, self.no_xy - 1): + for j in range(1, self.no_xy - 1): + for k in range(1, self.no_z_with_buffer - 1): + + # using the Lax-Wendroff scheme + positive_temp_entry = 0 + + positive_temp_entry += sc_pos[0] * positive_array[i - 1, j, k] + positive_temp_entry += sc_neg[0] * positive_array[i + 1, j, k] + + positive_temp_entry += sc_pos[1] * positive_array[i, j - 1, k] + positive_temp_entry += sc_neg[1] * positive_array[i, j + 1, k] + + positive_temp_entry += sc_pos[2] * positive_array[i, j, k - 1] + positive_temp_entry += sc_neg[2] * positive_array[i, j, k + 1] + + positive_temp_entry += sc_center * positive_array[i, j, k] + + # same for the negative charge carriers + negative_temp_entry = 0 + + negative_temp_entry += sc_pos[0] * negative_array[i + 1, j, k] + negative_temp_entry += sc_neg[0] * negative_array[i - 1, j, k] + + negative_temp_entry += sc_pos[1] * negative_array[i, j + 1, k] + negative_temp_entry += sc_neg[1] * negative_array[i, j - 1, k] + + negative_temp_entry += sc_pos[2] * negative_array[i, j, k + 1] + negative_temp_entry += sc_neg[2] * negative_array[i, j, k - 1] + + negative_temp_entry += sc_center * negative_array[i, j, k] + + # the recombination part + recomb_temp = ( + alpha + * positive_array[i, j, k] + * negative_array[i, j, k] + * self.dt + ) + + positive_array_temp[i, j, k] = positive_temp_entry - recomb_temp + negative_array_temp[i, j, k] = negative_temp_entry - recomb_temp + + if self.should_count_recombined_charge_carriers( + time_step, x=i, y=j, z=k + ): + no_recombined_charge_carriers += recomb_temp + + # update the positive and negative arrays + + # TODO: check if copying the first element in each dimension is necessary + # positive_array[1:-1, 1:-1, 1:-1] = positive_array_temp[1:-1, 1:-1, 1:-1] + # negative_array[1:-1, 1:-1, 1:-1] = negative_array_temp[1:-1, 1:-1, 1:-1] + + positive_array[:] = positive_array_temp[:] + negative_array[:] = negative_array_temp[:] + + # calculate the fraction of charge carriers that have not recombined, if no charge carriers have been initialised, set the fraction to 1 + if no_initialised_charge_carriers != 0: + f_steps_list[time_step] = ( + no_initialised_charge_carriers - no_recombined_charge_carriers + ) / no_initialised_charge_carriers + else: + f_steps_list[time_step] = 1 + + return f_steps_list diff --git a/hadrons/common/initial_recombination.py b/hadrons/common/initial_recombination.py new file mode 100644 index 0000000..e427a66 --- /dev/null +++ b/hadrons/common/initial_recombination.py @@ -0,0 +1,48 @@ +from dataclasses import dataclass +from math import sqrt + +import numpy as np + +from hadrons.common.generic_hadron_solver import GenericHadronSolver + + +def get_initial_recombination_pde_solver(base_solver_class: GenericHadronSolver): + @dataclass + class InitialHadronSolver(base_solver_class): + + def get_number_of_tracks(self, time_step: int) -> bool: + if time_step == 0: + return 1 + return 0 + + def get_track_for_time_step(self, _): + positive_array = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + negative_array = np.zeros((self.no_xy, self.no_xy, self.no_z_with_buffer)) + no_initialised_charge_carriers = 0.0 + + mid_xy_array = int(self.no_xy / 2.0) + + for i in range(self.no_xy): + for j in range(self.no_xy): + distance_from_center_cm = ( + sqrt((i - mid_xy_array) ** 2 + (j - mid_xy_array) ** 2) + * self.grid_spacing + ) + ion_density = self.RDD_function(distance_from_center_cm) + no_initialised_charge_carriers += self.no_z * ion_density + positive_array[ + i, j, self.no_z_electrode : (self.no_z + self.no_z_electrode) + ] += ion_density + negative_array[ + i, j, self.no_z_electrode : (self.no_z + self.no_z_electrode) + ] += ion_density + + return positive_array, negative_array, no_initialised_charge_carriers + + def should_count_recombined_charge_carriers( + self, time_step: int, x: float, y: float, z: float + ) -> bool: + # For initial recombination we can always count the charge carriers + return True + + return InitialHadronSolver diff --git a/hadrons/common_properties.py b/hadrons/common_properties.py index 645e60a..6899684 100644 --- a/hadrons/common_properties.py +++ b/hadrons/common_properties.py @@ -4,11 +4,8 @@ ion_diff = 3.7e-2 # cm^2/s, averaged for positive and negative ions alpha = 1.60e-6 # cm^3/s, recombination constantno_figure_updates = 5 -n_track_radii = 6 # scaling factor to determine the grid width # unit_length_cm = 6e-4 # [cm], grid resolution -no_z_electrode = 4 # length of the electrode-buffer to ensure no ions drift through the array in one time step - # parameters for the Geiss RDD air_density_g_cm3 = 1.225e-3 # dry air water_density_g_cm3 = 1.0 diff --git a/hadrons/example_continuous_beam.py b/hadrons/example_continuous_beam.py index 3e6d0ae..1a31e9f 100644 --- a/hadrons/example_continuous_beam.py +++ b/hadrons/example_continuous_beam.py @@ -4,7 +4,8 @@ import numpy as np import pandas as pd import seaborn as sns -from functions import IonTracks_continuous_beam + +from hadrons.utils.common import IonTracks_continuous_beam # set parameters data_dict = dict( diff --git a/hadrons/example_single_track.py b/hadrons/example_single_track.py index 392c32a..077b5df 100644 --- a/hadrons/example_single_track.py +++ b/hadrons/example_single_track.py @@ -4,7 +4,9 @@ import numpy as np import pandas as pd import seaborn as sns -from functions import Jaffe_theory, ks_initial_IonTracks + +from hadrons.utils.common import ks_initial_IonTracks +from hadrons.utils.jaffe_theory import Jaffe_theory # set parameters data_dict = dict( diff --git a/hadrons/numba/continous_beam.py b/hadrons/numba/continous_beam.py new file mode 100644 index 0000000..f49248f --- /dev/null +++ b/hadrons/numba/continous_beam.py @@ -0,0 +1,81 @@ +from math import exp, sqrt + +import numpy as np +from numba import njit + +from hadrons.common.continous_beam import get_continous_beam_pde_solver +from hadrons.numba.generic_hadron_solver import NumbaHadronSolver + +BaseContinuousBeamPDESolver = get_continous_beam_pde_solver(NumbaHadronSolver) + + +class NumbaContinousPDESolver(BaseContinuousBeamPDESolver): + def get_track_inserting_functions(self): + # closure to give numba access to the class properties without using `self` + track_distribution = self.track_distribution + no_xy = self.no_xy + no_z_with_buffer = self.no_z_with_buffer + no_z_electrode = self.no_z_electrode + no_z = self.no_z + grid_spacing = self.grid_spacing + Gaussian_factor = self.Gaussian_factor + track_radius = self.track_radius + xy_middle_idx = self.xy_middle_idx + inner_radius = self.inner_radius + separation_time_steps = self.separation_time_steps + random_generator = self.random_generator + + # TODO: probably could be an util + @njit + def get_random_xy_coordinate(): + return random_generator.random() * no_xy + + @njit + def get_random_coordinates(): + x = get_random_xy_coordinate() + y = get_random_xy_coordinate() + + # check whether the point is inside the circle. + # it is too time comsuming simply to set x=rand(0,1)*no_xy + while ( + sqrt((x - xy_middle_idx) ** 2 + (y - xy_middle_idx) ** 2) > inner_radius + ): + x = get_random_xy_coordinate() + y = get_random_xy_coordinate() + + return x, y + + @njit + def get_number_of_tracks(time_step: int) -> int: + return track_distribution[time_step] + + @njit + def get_track_for_time_step(time_step: int): + positive_array = np.zeros((no_xy, no_xy, no_z_with_buffer)) + negative_array = np.zeros((no_xy, no_xy, no_z_with_buffer)) + no_initialised_charge_carriers = 0.0 + + x, y = get_random_coordinates() + + for k in range(no_z_electrode, no_z + no_z_electrode): + for i in range(no_xy): + for j in range(no_xy): + distance_from_center = ( + sqrt((i - x) ** 2 + (j - y) ** 2) * grid_spacing + ) + ion_density = Gaussian_factor * exp( + -(distance_from_center**2) / track_radius**2 + ) + positive_array[i, j, k] += ion_density + negative_array[i, j, k] += ion_density + # calculate the recombination only for charge carriers inside the circle + if ( + sqrt((i - xy_middle_idx) ** 2 + (j - xy_middle_idx) ** 2) + < inner_radius + ): + if time_step > separation_time_steps: + no_initialised_charge_carriers += ion_density + + return positive_array, negative_array, no_initialised_charge_carriers + + return get_number_of_tracks, get_track_for_time_step diff --git a/hadrons/numba/generic_hadron_solver.py b/hadrons/numba/generic_hadron_solver.py new file mode 100644 index 0000000..365793f --- /dev/null +++ b/hadrons/numba/generic_hadron_solver.py @@ -0,0 +1,131 @@ +from abc import ABC, abstractmethod +from typing import Callable, Tuple + +import numpy as np +from numpy.typing import NDArray + +from hadrons.common.generic_hadron_solver import ( + GenericHadronSolver, + create_sc_gradients, +) + + +def numba_calculate( + computation_time_steps: int, + get_number_of_tracks: Callable[[int], bool], + get_track_for_time_step: Callable[[NDArray, NDArray], float], + no_xy: int, + no_z_with_buffer: int, + s: NDArray, + c: NDArray, + alpha: float, + dt: float, +): + positive_array = np.zeros((no_xy, no_xy, no_z_with_buffer)) + negative_array = np.zeros((no_xy, no_xy, no_z_with_buffer)) + + positive_array_temp = np.zeros((no_xy, no_xy, no_z_with_buffer)) + negative_array_temp = np.zeros((no_xy, no_xy, no_z_with_buffer)) + + no_recombined_charge_carriers = 0.0 + no_initialised_charge_carriers = 0.0 + + f_steps_list = np.zeros(computation_time_steps) + + sc_pos, sc_neg, sc_center = create_sc_gradients(s, c) + + for time_step in range(computation_time_steps): + # calculate the new densities and store them in temporary arrays + + for _ in range(get_number_of_tracks(time_step)): + positive_track, negative_track, initialized_carriers = ( + get_track_for_time_step(time_step) + ) + + positive_array += positive_track + negative_array += negative_track + + no_initialised_charge_carriers += initialized_carriers + + for i in range(1, no_xy - 1): + for j in range(1, no_xy - 1): + for k in range(1, no_z_with_buffer - 1): + # using the Lax-Wendroff scheme + positive_temp_entry = 0 + + positive_temp_entry += sc_pos[0] * positive_array[i - 1, j, k] + positive_temp_entry += sc_neg[0] * positive_array[i + 1, j, k] + + positive_temp_entry += sc_pos[1] * positive_array[i, j - 1, k] + positive_temp_entry += sc_neg[1] * positive_array[i, j + 1, k] + + positive_temp_entry += sc_pos[2] * positive_array[i, j, k - 1] + positive_temp_entry += sc_neg[2] * positive_array[i, j, k + 1] + + positive_temp_entry += sc_center * positive_array[i, j, k] + + # same for the negative charge carriers + negative_temp_entry = 0 + + negative_temp_entry += sc_pos[0] * negative_array[i + 1, j, k] + negative_temp_entry += sc_neg[0] * negative_array[i - 1, j, k] + + negative_temp_entry += sc_pos[1] * negative_array[i, j + 1, k] + negative_temp_entry += sc_neg[1] * negative_array[i, j - 1, k] + + negative_temp_entry += sc_pos[2] * negative_array[i, j, k + 1] + negative_temp_entry += sc_neg[2] * negative_array[i, j, k - 1] + + negative_temp_entry += sc_center * negative_array[i, j, k] + + # the recombination part + recomb_temp = ( + alpha * positive_array[i, j, k] * negative_array[i, j, k] * dt + ) + + positive_array_temp[i, j, k] = positive_temp_entry - recomb_temp + negative_array_temp[i, j, k] = negative_temp_entry - recomb_temp + + no_recombined_charge_carriers += recomb_temp + + # update the positive and negative arrays + + # TODO: check if copying the first element in each dimension is necessary + # positive_array[1:-1, 1:-1, 1:-1] = positive_array_temp[1:-1, 1:-1, 1:-1] + # negative_array[1:-1, 1:-1, 1:-1] = negative_array_temp[1:-1, 1:-1, 1:-1] + + positive_array[:] = positive_array_temp[:] + negative_array[:] = negative_array_temp[:] + + f_steps_list[time_step] = ( + no_initialised_charge_carriers - no_recombined_charge_carriers + ) / no_initialised_charge_carriers + + return f_steps_list + + +class NumbaHadronSolver(GenericHadronSolver, ABC): + @abstractmethod + def get_track_inserting_functions( + self, + ) -> Tuple[Callable[[int], bool], Callable[[NDArray, NDArray], float]]: + pass + + def calculate(self): + get_number_of_tracks, get_track_for_time_step = ( + self.get_track_inserting_functions() + ) + + f_steps_list = numba_calculate( + self.computation_time_steps, + get_number_of_tracks, + get_track_for_time_step, + self.no_xy, + self.no_z_with_buffer, + self.s, + self.c, + self.alpha, + self.dt, + ) + + return f_steps_list diff --git a/hadrons/numba/initial_recombination.py b/hadrons/numba/initial_recombination.py new file mode 100644 index 0000000..d6f6cf0 --- /dev/null +++ b/hadrons/numba/initial_recombination.py @@ -0,0 +1,21 @@ +import numba as np + +from hadrons.common.initial_recombination import get_initial_recombination_pde_solver +from hadrons.numba.generic_hadron_solver import NumbaHadronSolver + +BaseInitialRecombinationPDESolver = get_initial_recombination_pde_solver( + NumbaHadronSolver +) + + +class NumbaInitialRecombinationPDESolver(BaseInitialRecombinationPDESolver): + def get_track_inserting_functions(self): + def should_insert_track(time_step: int) -> bool: + return time_step % 100 == 0 + + def get_track_for_time_step( + positive_array: np.ndarray, negative_array: np.ndarray + ) -> float: + return np.sum(positive_array + negative_array) + + return should_insert_track, get_track_for_time_step diff --git a/hadrons/numba/initial_recombination_numba.py b/hadrons/numba/initial_recombination_numba.py deleted file mode 100644 index 59fb1fc..0000000 --- a/hadrons/numba/initial_recombination_numba.py +++ /dev/null @@ -1,221 +0,0 @@ -import time -from math import exp, sqrt - -import numpy as np -from numba import njit - -from ..common_properties import alpha, no_z_electrode -from ..geiss_utils import Geiss_RRD_cm -from ..python.initial_recombination import \ - single_track_PDEsolver as single_track_PDEsolver_base - -# jitted functions defined outside the solver class as 'self' is not recogized as a supported type - - -@njit -def initialize_Gaussian_distriution_Gauss( - no_x, - no_z_with_buffer, - mid_xy_array, - unit_length_cm, - no_z, - track_radius_cm, - Gaussian_factor, -): - no_initialised_charge_carriers = 0.0 - positive_array = np.zeros((no_x, no_x, no_z_with_buffer)) - negative_array = np.zeros((no_x, no_x, no_z_with_buffer)) - - for i in range(no_x): - for j in range(no_x): - distance_from_center_cm = ( - sqrt((i - mid_xy_array) ** 2 + (j - mid_xy_array) ** 2) * unit_length_cm - ) - ion_density = Gaussian_factor * exp( - -(distance_from_center_cm**2) / track_radius_cm**2 - ) - no_initialised_charge_carriers += no_z * ion_density - positive_array[ - i, j, no_z_electrode : (no_z_electrode + no_z) - ] += ion_density - negative_array[ - i, j, no_z_electrode : (no_z_electrode + no_z) - ] += ion_density - - return no_initialised_charge_carriers, positive_array, negative_array - - -@njit -def initialize_Gaussian_distriution_Geiss( - no_x, no_z_with_buffer, mid_xy_array, unit_length_cm, no_z, c, a0_cm, r_max_cm -): - no_initialised_charge_carriers = 0.0 - positive_array = np.zeros((no_x, no_x, no_z_with_buffer)) - negative_array = np.zeros((no_x, no_x, no_z_with_buffer)) - - for i in range(no_x): - for j in range(no_x): - distance_from_center_cm = ( - sqrt((i - mid_xy_array) ** 2 + (j - mid_xy_array) ** 2) * unit_length_cm - ) - ion_density = Geiss_RRD_cm(distance_from_center_cm, c, a0_cm, r_max_cm) - no_initialised_charge_carriers += no_z * ion_density - positive_array[ - i, j, no_z_electrode : (no_z_electrode + no_z) - ] += ion_density - negative_array[ - i, j, no_z_electrode : (no_z_electrode + no_z) - ] += ion_density - - return no_initialised_charge_carriers, positive_array, negative_array - - -@njit -def main_loop( - sz, - cz, - sy, - cy, - sx, - cx, - no_x, - no_z_with_buffer, - positive_array, - negative_array, - dt, - computation_time_steps, - no_initialised_charge_carriers, -): - positive_array_temp = np.zeros((no_x, no_x, no_z_with_buffer)) - negative_array_temp = np.zeros((no_x, no_x, no_z_with_buffer)) - no_recombined_charge_carriers = 0.0 - - # calculate the new densities and store them in temporary arrays - # dunno what would be a good name for those coefficients - szcz_pos = sz + cz * (cz + 1.0) / 2.0 - szcz_neg = sz + cz * (cz - 1.0) / 2.0 - - sycy_pos = sy + cy * (cy + 1.0) / 2.0 - sycy_neg = sy + cy * (cy - 1.0) / 2.0 - - sxcx_pos = sx + cx * (cx + 1.0) / 2.0 - sxcx_neg = sx + cx * (cx - 1.0) / 2.0 - - for _ in range(computation_time_steps): - for i in range(1, no_x - 1): - for j in range(1, no_x - 1): - for k in range(1, no_z_with_buffer - 1): - # using the Lax-Wendroff scheme - positive_temp_entry = szcz_pos * positive_array[i, j, k - 1] - positive_temp_entry += szcz_neg * positive_array[i, j, k + 1] - - positive_temp_entry += sycy_pos * positive_array[i, j - 1, k] - positive_temp_entry += sycy_neg * positive_array[i, j + 1, k] - - positive_temp_entry += sxcx_pos * positive_array[i - 1, j, k] - positive_temp_entry += sxcx_neg * positive_array[i + 1, j, k] - - positive_temp_entry += ( - 1.0 - cx * cx - cy * cy - cz * cz - 2.0 * (sx + sy + sz) - ) * positive_array[i, j, k] - - # same for the negative charge carriers - negative_temp_entry = szcz_pos * negative_array[i, j, k + 1] - negative_temp_entry += szcz_neg * negative_array[i, j, k - 1] - - negative_temp_entry += sycy_pos * negative_array[i, j + 1, k] - negative_temp_entry += sycy_neg * negative_array[i, j - 1, k] - - negative_temp_entry += sxcx_pos * negative_array[i + 1, j, k] - negative_temp_entry += sxcx_neg * negative_array[i - 1, j, k] - - negative_temp_entry += ( - 1.0 - cx * cx - cy * cy - cz * cz - 2.0 * (sx + sy + sz) - ) * negative_array[i, j, k] - - # the recombination part - recomb_temp = ( - alpha * positive_array[i, j, k] * negative_array[i, j, k] * dt - ) - - positive_array_temp[i, j, k] = positive_temp_entry - recomb_temp - negative_array_temp[i, j, k] = negative_temp_entry - recomb_temp - - no_recombined_charge_carriers += recomb_temp - - for i in range(1, no_x - 1): - for j in range(1, no_x - 1): - for k in range(1, no_z_with_buffer - 1): - # update the positive and negative arrays - positive_array[i, j, k] = positive_array_temp[i, j, k] - negative_array[i, j, k] = negative_array_temp[i, j, k] - - f = ( - no_initialised_charge_carriers - no_recombined_charge_carriers - ) / no_initialised_charge_carriers - - return f - - -class single_track_PDEsolver(single_track_PDEsolver_base): - def solve(self): - # initialise the Gaussian distribution in the array - - start_time = time.time() - if self.RDD_model == "Gauss": - ( - self.no_initialised_charge_carriers, - self.positive_array, - self.negative_array, - ) = initialize_Gaussian_distriution_Gauss( - self.no_x, - self.no_z_with_buffer, - self.mid_xy_array, - self.unit_length_cm, - self.no_z, - self.track_radius_cm, - self.Gaussian_factor, - ) - elif self.RDD_model == "Geiss": - ( - self.no_initialised_charge_carriers, - self.positive_array, - self.negative_array, - ) = initialize_Gaussian_distriution_Geiss( - self.no_x, - self.no_z_with_buffer, - self.mid_xy_array, - self.unit_length_cm, - self.no_z, - self.c, - self.a0_cm, - self.r_max_cm, - ) - else: - raise ValueError(f"Invalid RDD model: {self.RDD_model}") - - if self.debug: - print(f"Gaussian distriution initialization time {time.time()-start_time}") - - calculation_time = time.time() - - f = main_loop( - self.sz, - self.cz, - self.sy, - self.cy, - self.sx, - self.cx, - self.no_x, - self.no_z_with_buffer, - self.positive_array, - self.negative_array, - self.dt, - self.computation_time_steps, - self.no_initialised_charge_carriers, - ) - - if self.debug: - print("Calculation loop combined time: ", time.time() - calculation_time) - - return 1.0 / f diff --git a/hadrons/python/continous_beam.py b/hadrons/python/continous_beam.py new file mode 100644 index 0000000..0a0b6c7 --- /dev/null +++ b/hadrons/python/continous_beam.py @@ -0,0 +1,4 @@ +from hadrons.common.continous_beam import get_continous_beam_pde_solver +from hadrons.common.generic_hadron_solver import GenericHadronSolver + +ContinousHadronSolver = get_continous_beam_pde_solver(GenericHadronSolver) diff --git a/hadrons/python/initial_recombination.py b/hadrons/python/initial_recombination.py index 9b66e21..520e98a 100644 --- a/hadrons/python/initial_recombination.py +++ b/hadrons/python/initial_recombination.py @@ -1,284 +1,4 @@ -import time -from math import cos, exp, log, pi, sin, sqrt +from hadrons.common.generic_hadron_solver import GenericHadronSolver +from hadrons.common.initial_recombination import get_initial_recombination_pde_solver -import numpy as np - -from ..common_properties import ( - W, - air_density_g_cm3, - alpha, - ion_diff, - ion_mobility, - n_track_radii, - no_z_electrode, - water_density_g_cm3, -) -from ..geiss_utils import Geiss_r_max, Geiss_RRD_cm - - -class single_track_PDEsolver: - def __init__( - self, - LET_keV_um: float, - voltage_V: float, - IC_angle_rad: float, - electrode_gap_cm: float, - E_MeV_u: float, - a0_nm: float, - RDD_model: str, - unit_length_cm: float, - track_radius_cm: float, - debug: bool = False, - ): - self.LET_eV_cm = LET_keV_um * 1e7 - density_ratio = water_density_g_cm3 / air_density_g_cm3 - self.a0_cm = a0_nm * 1e-7 * density_ratio - self.r_max_cm = Geiss_r_max(E_MeV_u, air_density_g_cm3) - self.c = ( - self.LET_eV_cm / (pi * W) * (1 / (1 + 2 * log(self.r_max_cm / self.a0_cm))) - ) - - # density parameters for the Gaussian structure - N0 = self.LET_eV_cm / W # Linear charge carrier density - self.Gaussian_factor = N0 / (pi * track_radius_cm**2) - - # grid dimension parameters - no_x = int(track_radius_cm * n_track_radii / unit_length_cm) - # print(track_radius_cm*n_track_radii) - no_z = int( - electrode_gap_cm / unit_length_cm - ) # number of elements in the z direction - no_z_with_buffer = 2 * no_z_electrode + no_z - # find the middle of the arrays - self.mid_xy_array = int(no_x / 2.0) - - # depending on the cluster/computer, the upper limit may be changed - if (no_x * no_x * no_z) > 1e8: - raise ValueError( - "Too many elements in the array: %i" % (no_x * no_x * no_z_with_buffer) - ) - - # preallocate arrays - positive_array = np.zeros((no_x, no_x, no_z_with_buffer)) - negative_array = np.zeros((no_x, no_x, no_z_with_buffer)) - no_initialised_charge_carriers = 0.0 - - dt = 1.0 - von_neumann_expression = False - Efield = voltage_V / electrode_gap_cm - - # find a time step dt which fulfils the von Neumann criterion, i.e. ensures the numericl error does not - # increase but decreases and eventually damps out - while not von_neumann_expression: - dt /= 1.01 - # as defined in the Deghan (2004) paper - sx = ion_diff * dt / (unit_length_cm**2) - sy, sz = sx, sx - - cx = ion_mobility * Efield * dt / unit_length_cm * sin(IC_angle_rad) - cy = 0 - cz = ion_mobility * Efield * dt / unit_length_cm * cos(IC_angle_rad) - - # check von Neumann's criterion - von_neumann_expression = ( - 2 * (sx + sy + sz) + cx**2 + cy**2 + cz**2 <= 1 - and cx**2 * cy**2 * cz**2 <= 8 * sx * sy * sz - ) - - # calculate the number of step required to drag the two charge carrier distributions apart - separation_time_steps = int( - electrode_gap_cm / (2.0 * ion_mobility * Efield * dt) - ) - computation_time_steps = separation_time_steps * 2 - - if debug: - print("Electric field = %s V/cm" % Efield) - print("Separation time = %3.2E s" % (separation_time_steps * dt)) - print("Time steps = %3.2E" % computation_time_steps) - print("Time step dt = %3.2E s" % dt) - print("Number of voxels = %3.2E" % (no_x**2 * no_z_with_buffer)) - print("Number of pixels = %d (x = y directions)" % no_x) - print("Number of pixels = %d (z direction)" % no_z) - - self.computation_time_steps = computation_time_steps - self.track_radius_cm = track_radius_cm - self.unit_length_cm = unit_length_cm - self.RDD_model = RDD_model - self.sx = sy - self.cx = cy - self.sy = sy - self.cy = cy - self.sz = sz - self.cz = cz - self.no_x = no_x - self.no_z = no_z - self.no_z_with_buffer = no_z_with_buffer - self.positive_array = positive_array - self.negative_array = negative_array - self.dt = dt - self.no_initialised_charge_carriers = no_initialised_charge_carriers - self.debug = debug - - def solve(self): - positive_array_temp = np.zeros((self.no_x, self.no_x, self.no_z_with_buffer)) - negative_array_temp = np.zeros((self.no_x, self.no_x, self.no_z_with_buffer)) - no_recombined_charge_carriers = 0.0 - - # define the radial dose model to be used - if self.RDD_model == "Gauss": - - def RDD_function(r_cm): - return self.Gaussian_factor * exp(-(r_cm**2) / self.track_radius_cm**2) - - elif self.RDD_model == "Geiss": - - def RDD_function(r_cm): - return Geiss_RRD_cm(r_cm, self.c, self.a0_cm, self.r_max_cm) - - else: - print("RDD model {} undefined.".format(self.RDD_model)) - return 0 - - # initialise the Gaussian distribution in the array - start_time = time.time() - for i in range(self.no_x): - for j in range(self.no_x): - if self.debug: - print( - f"\rGaussian distribution loop: i - {i+1: >3}/{self.no_x}, j - {j+1: >3}/{self.no_x} Time: {time.time()-start_time: .2f}", - end="", - ) - distance_from_center_cm = ( - sqrt((i - self.mid_xy_array) ** 2 + (j - self.mid_xy_array) ** 2) - * self.unit_length_cm - ) - ion_density = RDD_function(distance_from_center_cm) - self.no_initialised_charge_carriers += self.no_z * ion_density - self.positive_array[ - i, j, no_z_electrode : (no_z_electrode + self.no_z) - ] += ion_density - self.negative_array[ - i, j, no_z_electrode : (no_z_electrode + self.no_z) - ] += ion_density - if self.debug: - print("") - - calculation_time = time.time() - for time_step in range(self.computation_time_steps): - if self.debug: - print( - f"Calculation loop iteration {time_step+1}/{self.computation_time_steps}" - ) - - # calculate the new densities and store them in temporary arrays - start_time = time.time() - - szcz_pos = self.sz + self.cz * (self.cz + 1.0) / 2.0 - szcz_neg = self.sz + self.cz * (self.cz - 1.0) / 2.0 - - sycy_pos = self.sy + self.cy * (self.cy + 1.0) / 2.0 - sycy_neg = self.sy + self.cy * (self.cy - 1.0) / 2.0 - - sxcx_pos = self.sx + self.cx * (self.cx + 1.0) / 2.0 - sxcx_neg = self.sx + self.cx * (self.cx - 1.0) / 2.0 - - for i in range(1, self.no_x - 1): - for j in range(1, self.no_x - 1): - for k in range(1, self.no_z_with_buffer - 1): - if self.debug: - print( - f"\rDensities calculation loop: i - {i+1: >3}/{self.no_x-1}, j - {j+1: >3}/{self.no_x-1}, k - {k+1: >3}/{self.no_z_with_buffer-1} Time: {time.time()-start_time: .2f}", - end="", - ) - # using the Lax-Wendroff scheme - - positive_temp_entry = ( - szcz_pos * self.positive_array[i, j, k - 1] - ) - positive_temp_entry += ( - szcz_neg * self.positive_array[i, j, k + 1] - ) - - positive_temp_entry += ( - sycy_pos * self.positive_array[i, j - 1, k] - ) - positive_temp_entry += ( - sycy_neg * self.positive_array[i, j + 1, k] - ) - - positive_temp_entry += ( - sxcx_pos * self.positive_array[i - 1, j, k] - ) - positive_temp_entry += ( - sxcx_neg * self.positive_array[i + 1, j, k] - ) - - positive_temp_entry += ( - 1.0 - - self.cx * self.cx - - self.cy * self.cy - - self.cz * self.cz - - 2.0 * (self.sx + self.sy + self.sz) - ) * self.positive_array[i, j, k] - - # same for the negative charge carriers - negative_temp_entry = ( - szcz_pos * self.negative_array[i, j, k + 1] - ) - negative_temp_entry += ( - szcz_neg * self.negative_array[i, j, k - 1] - ) - - negative_temp_entry += ( - sycy_pos * self.negative_array[i, j + 1, k] - ) - negative_temp_entry += ( - sycy_neg * self.negative_array[i, j - 1, k] - ) - - negative_temp_entry += ( - sxcx_pos * self.negative_array[i + 1, j, k] - ) - negative_temp_entry += ( - sxcx_neg * self.negative_array[i - 1, j, k] - ) - - negative_temp_entry += ( - 1.0 - - self.cx * self.cx - - self.cy * self.cy - - self.cz * self.cz - - 2.0 * (self.sx + self.sy + self.sz) - ) * self.negative_array[i, j, k] - - # the recombination part - recomb_temp = ( - alpha - * self.positive_array[i, j, k] - * self.negative_array[i, j, k] - * self.dt - ) - - positive_array_temp[i, j, k] = positive_temp_entry - recomb_temp - negative_array_temp[i, j, k] = negative_temp_entry - recomb_temp - no_recombined_charge_carriers += recomb_temp - if self.debug: - print("") - - # update the positive and negative arrays - start_time = time.time() - - self.positive_array[1:-1, 1:-1, 1:-1] = positive_array_temp[ - 1:-1, 1:-1, 1:-1 - ] - self.negative_array[1:-1, 1:-1, 1:-1] = negative_array_temp[ - 1:-1, 1:-1, 1:-1 - ] - - f = ( - self.no_initialised_charge_carriers - no_recombined_charge_carriers - ) / self.no_initialised_charge_carriers - - if self.debug: - print("Calculation loop combined time: ", time.time() - calculation_time) - return 1.0 / f +InitialHadronSolver = get_initial_recombination_pde_solver(GenericHadronSolver) diff --git a/hadrons/python/run_simulation.py b/hadrons/python/run_simulation.py new file mode 100644 index 0000000..8f267d7 --- /dev/null +++ b/hadrons/python/run_simulation.py @@ -0,0 +1,71 @@ +import argparse + +from hadrons.python.continous_beam import ContinousHadronSolver +from hadrons.python.initial_recombination import InitialHadronSolver + +SOLVER_MAP = {"continous": ContinousHadronSolver, "initial": InitialHadronSolver} + + +def run_simulation( + solver_name="continous", + voltage=300, + IC_angle=1, + electrode_gap=0.1, + energy=200, + electron_density_per_cm3=1e9, + doserate=100, + verbose=False, +): + if solver_name not in SOLVER_MAP.keys(): + print(f'Invalid solver type "{solver_name}", defaulting to Continous solver.') + solver_name = "continous" + + # select a solver based on string name, defaukt to ContinousBeamPDEsolver if the name is invalid + Solver = SOLVER_MAP.get(solver_name, InitialHadronSolver) + + if verbose: + print(f"Running the simulation using the {solver_name} solver.") + print(f"Voltage: {voltage} [V]") + print(f"Electrode gap: {electrode_gap} [cm]") + print(f"Electron density per cm3: {electron_density_per_cm3}") + print(f"doserate: {doserate} [Gy/s]") + + if solver_name == "continous": + solver = Solver( + voltage=voltage, # [V/cm] magnitude of the electric field + IC_angle=IC_angle, + electrode_gap=electrode_gap, + energy=energy, + doserate=doserate, + ) + else: + solver = Solver( + voltage=voltage, # [V/cm] magnitude of the electric field + IC_angle=IC_angle, + electrode_gap=electrode_gap, + energy=energy, + ) + + return solver.calculate() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "solver_name", + default="continous", + help="The type of the solver to use", + ) + + parser.add_argument( + "--verbose", + "-v", + action="store_true", + ) + + args = parser.parse_args() + + result = run_simulation(**vars(args)) + + print(f"calculated f is {result}") diff --git a/hadrons/solver.py b/hadrons/solver.py index 9ee59c6..3a30e01 100644 --- a/hadrons/solver.py +++ b/hadrons/solver.py @@ -1,13 +1,17 @@ from enum import Enum, auto -from hadrons.cython_files.initial_recombination import \ - single_track_PDEsolver as cython_single_track_PDEsolver -from hadrons.numba.initial_recombination_numba import \ - single_track_PDEsolver as numba_single_track_PDEsolver -from hadrons.parallel.initial_recombination_numba_parallel import \ - single_track_PDEsolver as numba_parallel_single_track_PDEsolver -from hadrons.python.initial_recombination import \ - single_track_PDEsolver as python_single_track_PDEsolver +from hadrons.cython_files.initial_recombination import ( + single_track_PDEsolver as cython_single_track_PDEsolver, +) +from hadrons.numba.initial_recombination_numba_old import ( + single_track_PDEsolver as numba_single_track_PDEsolver, +) +from hadrons.parallel.initial_recombination_numba_parallel import ( + single_track_PDEsolver as numba_parallel_single_track_PDEsolver, +) +from hadrons.python.initial_recombination import ( + single_track_PDEsolver as python_single_track_PDEsolver, +) class SolverType(Enum): diff --git a/hadrons/utils/__init__.py b/hadrons/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hadrons/functions.py b/hadrons/utils/common.py similarity index 56% rename from hadrons/functions.py rename to hadrons/utils/common.py index d63f95b..00ac463 100644 --- a/hadrons/functions.py +++ b/hadrons/utils/common.py @@ -1,12 +1,9 @@ import sys -from math import exp, log, pi, sin, sqrt from pathlib import Path -import mpmath import numpy as np import pandas as pd from scipy.interpolate import interp1d -from scipy.special import hankel1 from hadrons.cython_files.continuous_beam import continuous_beam_PDEsolver from hadrons.cython_files.initial_recombination import single_track_PDEsolver @@ -15,102 +12,8 @@ ABS_PATH = str(Path(__file__).parent.absolute()) -mpmath.mp.dps = 50 # number of figures for computing exponential integrals -# general parameters -ion_mobility = 1.65 # TODO: units -W = 33.9 # eV/ion pair for air -# define the parameters from Kanai (1998) -ion_diff = 3.7e-2 # cm^2/s, averaged for positive and negative ions -alpha = 1.60e-6 # cm^3/s, recombination constant - -def Jaffe_theory( - x, - voltage_V, - electrode_gap_cm, - input_is_LET=True, - particle="proton", - IC_angle_rad=0.0, - **kwargs, -): - """ - The Jaffe theory for initial recombination. Returns the inverse - collection efficiency, i.e. the recombination correction factor - """ - - # provide either x as LET (keV/um) or enery (MeV/u), default is input_is_LET=True - if not input_is_LET: - LET_keV_um = E_MeV_u_to_LET_keV_um(x, particle=particle) - - LET_eV_cm = LET_keV_um * 1e7 - electric_field = voltage_V / electrode_gap_cm - - # estimate the Gaussian track radius for the given LET - b_cm = calc_b_cm(LET_keV_um) - - N0 = LET_eV_cm / W - g = alpha * N0 / (8.0 * pi * ion_diff) - - # ion track inclined with respect to the electric field? - if abs(IC_angle_rad) > 0: - x = ( - b_cm * ion_mobility * electric_field * sin(IC_angle_rad) / (2 * ion_diff) - ) ** 2 - - def nasty_function(y): - order = 0.0 - if y < 1e3: - # exp() overflows for larger y - value = exp(y) * (1j * pi / 2) * hankel1(order, 1j * y) - else: - # approximation from Zankowski and Podgorsak (1998) - value = sqrt(2.0 / (pi * y)) - return value - - f = 1.0 / (1 + g * nasty_function(x)).real - - else: - """ - Pretty ugly function splitted up in three parts using mpmath package for precision - """ - factor = ( - mpmath.exp(-1.0 / g) - * ion_mobility - * b_cm**2 - * electric_field - / (2.0 * g * electrode_gap_cm * ion_diff) - ) - first_term = mpmath.ei( - 1.0 / g - + log( - 1.0 - + ( - 2.0 - * electrode_gap_cm - * ion_diff - / (ion_mobility * b_cm**2 * electric_field) - ) - ) - ) - second_term = mpmath.ei(1.0 / g) - f = factor * (first_term - second_term) - - result_dic = { - "particle": particle, - "LET_keV_um": LET_keV_um, - "voltage_V": voltage_V, - "electrode_gap_cm": electrode_gap_cm, - "IC_angle_rad": IC_angle_rad, - "ks_Jaffe": float(1 / f), - } - - if not input_is_LET: - result_dic["E_MeV_u"] = x - - return pd.DataFrame([result_dic]) - - -def E_MeV_u_to_LET_keV_um(E_MeV_u, particle="proton", material="dry_air"): +def get_LET_per_um(energy, particle="proton", material="dry_air"): """ Calculate the stopping power in dry air or water using PSTAR data """ @@ -141,11 +44,11 @@ def E_MeV_u_to_LET_keV_um(E_MeV_u, particle="proton", material="dry_air"): # interpolate the data interpolate_LET = interp1d(df[E_col_name], df[particle_col_name]) - if isinstance(E_MeV_u, (list, tuple, np.ndarray)): - LET_keV_um = [interpolate_LET(i) for i in E_MeV_u] + if isinstance(energy, (list, tuple, np.ndarray)): + LET_per_micrometer = [interpolate_LET(i) for i in energy] else: - LET_keV_um = interpolate_LET(E_MeV_u) - return LET_keV_um + LET_per_micrometer = interpolate_LET(energy) + return LET_per_micrometer def doserate_to_fluence(dose_Gy_min, energy_MeV_u, particle="proton"): @@ -161,13 +64,13 @@ def doserate_to_fluence(dose_Gy_min, energy_MeV_u, particle="proton"): density_kg_cm3 = air_density_kg_m3 * 1e-6 # get the LET - LET_keV_um = E_MeV_u_to_LET_keV_um(energy_MeV_u, particle) + LET_keV_um = get_LET_per_um(energy_MeV_u, particle) LET_keV_cm = LET_keV_um * 1e4 fluence_cm2_s = dose_Gy_s * joule_to_keV * density_kg_cm3 / LET_keV_cm return fluence_cm2_s -def calc_b_cm(LET_keV_um): +def calculate_track_radius(LET: float): """ Calculate the Gaussian track radius as suggested by Rossomme et al. Returns the track radius in cm given a LET [keV/um] @@ -176,18 +79,18 @@ def calc_b_cm(LET_keV_um): Path(ABS_PATH, "data_LET", "LET_b.dat"), delimiter=",", dtype=float ) scale = 1e-3 - LET = data[:, 0] * scale + LET_data = data[:, 0] * scale b = data[:, 1] - logLET = np.log10(LET) + logLET = np.log10(LET_data) z = np.polyfit(logLET, b, 2) p = np.poly1d(z) - b_cm = p(np.log10(LET_keV_um)) * 1e-3 + track_radius = p(np.log10(LET)) * 1e-3 threshold = 2e-3 - if b_cm < threshold: - b_cm = threshold + if track_radius < threshold: + track_radius = threshold # b_cm = 1.05*1e-3 # cm ... Kanai, avoids edges - return b_cm + return track_radius def ks_initial_IonTracks( @@ -212,8 +115,8 @@ def ks_initial_IonTracks( beta = libam.AT_beta_from_E_single(E_MeV_u) a0_nm *= beta - LET_keV_um = E_MeV_u_to_LET_keV_um(E_MeV_u, particle) - track_radius_cm = calc_b_cm(LET_keV_um) + LET_keV_um = get_LET_per_um(E_MeV_u, particle) + track_radius_cm = calculate_track_radius(LET_keV_um) result_dic = { "E_MeV_u": E_MeV_u, @@ -262,10 +165,10 @@ def IonTracks_continuous_beam( correction factor k_s """ - LET_keV_um = E_MeV_u_to_LET_keV_um(E_MeV_u, particle=particle) + LET_keV_um = get_LET_per_um(E_MeV_u, particle=particle) fluencerate_cm2_s = doserate_to_fluence(doserate_Gy_min, E_MeV_u, particle=particle) - track_radius_cm = calc_b_cm(LET_keV_um) + track_radius_cm = calculate_track_radius(LET_keV_um) result_dic = { "E_MeV_u": E_MeV_u, diff --git a/hadrons/utils/consts.py b/hadrons/utils/consts.py new file mode 100644 index 0000000..84983e5 --- /dev/null +++ b/hadrons/utils/consts.py @@ -0,0 +1,9 @@ +import mpmath + +mpmath.mp.dps = 50 # number of figures for computing exponential integrals +# general parameters +ion_mobility = 1.65 # TODO: units +W = 33.9 # eV/ion pair for air +# define the parameters from Kanai (1998) +ion_diff = 3.7e-2 # cm^2/s, averaged for positive and negative ions +alpha = 1.60e-6 # cm^3/s, recombination constant diff --git a/hadrons/data_LET/LET_b.dat b/hadrons/utils/data_LET/LET_b.dat similarity index 100% rename from hadrons/data_LET/LET_b.dat rename to hadrons/utils/data_LET/LET_b.dat diff --git a/hadrons/data_LET/stopping_power_air.csv b/hadrons/utils/data_LET/stopping_power_air.csv similarity index 98% rename from hadrons/data_LET/stopping_power_air.csv rename to hadrons/utils/data_LET/stopping_power_air.csv index 4591920..61e7637 100644 --- a/hadrons/data_LET/stopping_power_air.csv +++ b/hadrons/utils/data_LET/stopping_power_air.csv @@ -1,504 +1,504 @@ -# Provided by Libamtrack ,,,,, -# Generated: 15/3/2022 @ 13:0:7,,,,, -# Stopping power,,,,, -E_MeV_u,proton_LET_keV_um,carbon_LET_keV_um,neon_LET_keV_um,argon_LET_keV_um,iron_LET_keV_um -0.1,0.087892496,0.813133247,1.324670718,2.212024878,2.988400738 -0.101721502,0.087731792,0.817201145,1.332837013,2.227833365,3.011134524 -0.10347264,0.087556527,0.821172105,1.34087294,2.243468896,3.033665467 -0.105253924,0.087366585,0.825042425,1.348772172,2.258920717,3.055979023 -0.107065873,0.087161885,0.828808609,1.356528678,2.274178522,3.078061232 -0.108909014,0.086942379,0.832467402,1.364136792,2.289232571,3.099898866 -0.110783886,0.086708056,0.836015838,1.371591283,2.304073809,3.1214796 -0.112691033,0.086458951,0.839451282,1.378887438,2.318694006,3.142792199 -0.114631011,0.086195139,0.842771485,1.386021146,2.333085906,3.163826724 -0.116604387,0.085916749,0.845974638,1.392988996,2.347243395,3.18457476 -0.118611734,0.085623964,0.849059437,1.399788383,2.36116168,3.205029669 -0.120653638,0.085317026,0.852025146,1.406417619,2.374837494,3.225186866 -0.122730693,0.084996239,0.854871673,1.412876066,2.388269318,3.245044124 -0.124843505,0.084661977,0.857599603,1.419164195,2.401457496,3.264601743 -0.126992689,0.0843145,0.860208441,1.42528068,2.414399321,3.283855868 -0.129178871,0.08395388,0.862695721,1.431220917,2.4270865,3.302795032 -0.131402688,0.083580209,0.865059162,1.436980569,2.439511153,3.321408299 -0.133664788,0.083193622,0.867296876,1.442555929,2.451666428,3.339686103 -0.13596583,0.082794302,0.869407431,1.447944018,2.463546664,3.357620481 -0.138306485,0.082382478,0.871389906,1.453142685,2.47514758,3.375205327 -0.140687435,0.081958438,0.873243958,1.458150726,2.486466475,3.39243667 -0.143109372,0.081522527,0.87496989,1.462968001,2.497502445,3.409312978 -0.145573003,0.081075153,0.876568731,1.467595576,2.508256629,3.4258355 -0.148079046,0.080616794,0.878042319,1.472035869,2.518732471,3.44200863 -0.15062823,0.080147976,0.879393091,1.47629231,2.528935155,3.457839146 -0.153221298,0.079669019,0.880621346,1.480364738,2.53886372,3.473325423 -0.155859007,0.079180134,0.881726159,1.484250931,2.548513647,3.488460958 -0.158542123,0.078681568,0.882707045,1.487949381,2.557881611,3.503240864 -0.161271429,0.078173613,0.88356403,1.491459428,2.566965721,3.517662198 -0.164047721,0.077656608,0.884297713,1.494781366,2.575765704,3.531724223 -0.166871806,0.077130944,0.884909329,1.497916557,2.584283121,3.545428706 -0.169744508,0.076597065,0.885400815,1.500867557,2.592521587,3.558780236 -0.172666664,0.076055476,0.885774894,1.503638253,2.600487026,3.571786568 -0.175639124,0.075506733,0.886035,1.506233763,2.608187506,3.584458423 -0.178662756,0.074951312,0.886183798,1.508657908,2.615628879,3.596803485 -0.181738439,0.074389656,0.886223632,1.510913979,2.622816087,3.608828203 -0.184867071,0.073822256,0.886157544,1.513006472,2.629756188,3.620541943 -0.188049561,0.073249658,0.88598937,1.514941252,2.636458638,3.631957393 -0.191286839,0.072672466,0.885723808,1.51672569,2.642935559,3.643090936 -0.194579846,0.072091347,0.885366503,1.518368818,2.64920202,3.653963056 -0.197929543,0.071507035,0.884924137,1.519881494,2.655276345,3.664598772 -0.201336904,0.070920269,0.884403696,1.521275156,2.661177962,3.675024685 -0.204802924,0.07033143,0.883807915,1.522553979,2.666913667,3.685250001 -0.208328611,0.069740759,0.883137864,1.523719289,2.672485286,3.695277072 -0.211914993,0.069148509,0.882394846,1.524772814,2.677895352,3.70510923 -0.215563114,0.06855495,0.881580418,1.525716724,2.683147182,3.714750895 -0.219274038,0.067960363,0.880696406,1.526553664,2.688244934,3.724207662 -0.223048846,0.067365047,0.879744922,1.527286787,2.693193681,3.733486401 -0.226888637,0.066769302,0.878728209,1.527919486,2.697998936,3.742594607 -0.23079453,0.066173381,0.877647967,1.528454223,2.702664591,3.751537542 -0.234767663,0.065577526,0.876505849,1.528893389,2.707194421,3.760320313 -0.238809194,0.064981987,0.875303685,1.529239693,2.711592783,3.768948847 -0.2429203,0.06438702,0.87404349,1.529496181,2.715864643,3.777429928 -0.247102178,0.063792889,0.872727468,1.529666242,2.720015603,3.785771243 -0.251356048,0.063199859,0.871357945,1.529753498,2.724051702,3.793981101 -0.255683148,0.062608161,0.86993685,1.529760889,2.727977789,3.802066174 -0.260084739,0.062018004,0.868465934,1.529691056,2.731798202,3.810032438 -0.264562104,0.061429598,0.866947014,1.529546772,2.735517531,3.817886229 -0.269116547,0.060843151,0.865381967,1.529330924,2.739140592,3.825634218 -0.273749394,0.060258867,0.863772716,1.529046501,2.742672406,3.833283376 -0.278461996,0.059676957,0.86212136,1.528696814,2.746118593,3.84084153 -0.283255726,0.05909765,0.860430358,1.528285837,2.749485993,3.848318232 -0.28813198,0.058521177,0.858702285,1.527817768,2.75278189,3.855723684 -0.293092179,0.057947764,0.856939781,1.527296946,2.756013854,3.863068516 -0.298137767,0.057377636,0.855145534,1.526727823,2.759189703,3.870363732 -0.303270216,0.056810984,0.853321884,1.526114255,2.762316219,3.877618915 -0.308491019,0.056247916,0.851469948,1.525457932,2.765396292,3.884838206 -0.313801699,0.055688502,0.849590392,1.524759737,2.768431364,3.892023723 -0.319203803,0.055132794,0.847683583,1.524020024,2.771421914,3.899176232 -0.324698904,0.054580817,0.845749539,1.523238515,2.774367274,3.906294889 -0.330288603,0.05403257,0.843787878,1.522414204,2.777265434,3.913376951 -0.335974529,0.053488021,0.841797752,1.521545236,2.780112816,3.920417455 -0.341758338,0.052947106,0.839777788,1.52062878,2.782904033,3.927408869 -0.347641716,0.052409723,0.83772601,1.519660896,2.785631617,3.934340697 -0.353626376,0.051875809,0.835641002,1.518638625,2.788289853,3.941204884 -0.359714062,0.051345524,0.833524969,1.517565574,2.790885054,3.948010365 -0.365906548,0.050819072,0.831380913,1.516446828,2.793426297,3.95477001 -0.372205637,0.050296649,0.829211828,1.515287492,2.795922743,3.96149685 -0.378613166,0.049778442,0.827020675,1.514092644,2.798383561,3.968203969 -0.385131,0.049264627,0.824810354,1.512867282,2.800817832,3.974904363 -0.391761039,0.04875537,0.82258367,1.51161627,2.80323444,3.981610793 -0.398505215,0.048250822,0.820343299,1.510344259,2.805641932,3.988335582 -0.405365491,0.047751077,0.818091066,1.509054371,2.808046066,3.995087123 -0.412343867,0.047256128,0.815827101,1.507746614,2.810446824,4.001865618 -0.419442376,0.046765928,0.813550814,1.506419659,2.812841699,4.008667716 -0.426663087,0.046280388,0.811260969,1.505070965,2.815225887,4.015486781 -0.434008101,0.045799384,0.808955592,1.5036966,2.817591941,4.022312384 -0.441479561,0.045322744,0.80663188,1.502291052,2.819929396,4.029129742 -0.449079642,0.044850252,0.804286149,1.500847121,2.822224532,4.035919367 -0.456810558,0.044381813,0.801916773,1.499361394,2.824470658,4.042671763 -0.464674562,0.043917556,0.799526243,1.497838142,2.82667553,4.049398095 -0.472673946,0.043457622,0.797117297,1.496282127,2.828847886,4.056110974 -0.480811038,0.043002136,0.794692512,1.494697848,2.83099602,4.062822411 -0.489088212,0.042551207,0.792254263,1.493089453,2.833127619,4.069543595 -0.497507876,0.042104927,0.789804674,1.491460646,2.835249574,4.076284604 -0.506072486,0.041663266,0.787343634,1.489810933,2.837360827,4.083044116 -0.514784535,0.041225903,0.784865543,1.488129403,2.839440435,4.08979216 -0.523646563,0.040792416,0.782362691,1.486401043,2.84145945,4.096487115 -0.532661151,0.040362312,0.779825757,1.484607653,2.843382596,4.103078068 -0.541830925,0.039935019,0.777243644,1.482727487,2.845167517,4.10950369 -0.551158556,0.039509921,0.77460409,1.480736394,2.846766901,4.115695248 -0.560646764,0.03908698,0.77190594,1.478631294,2.848173655,4.121641941 -0.570298311,0.038666685,0.769158464,1.476429083,2.849419168,4.12738866 -0.580116009,0.038249567,0.766372157,1.474149157,2.850539889,4.132987799 -0.59010272,0.037836194,0.763558525,1.471813015,2.851576626,4.138498265 -0.600261351,0.037427144,0.760729647,1.469443442,2.852572984,4.14398326 -0.610594864,0.037022407,0.757885953,1.46704086,2.853529409,4.149443465 -0.621106269,0.036621285,0.755013689,1.464578185,2.854392739,4.154801533 -0.631798628,0.036222949,0.752095996,1.462022057,2.855097124,4.159961316 -0.642675056,0.035826458,0.749113224,1.459333396,2.855564984,4.16480917 -0.653738722,0.03543093,0.74604648,1.45647426,2.855720331,4.169233309 -0.664992849,0.035036763,0.742903426,1.45345833,2.855587972,4.173268784 -0.676440716,0.034645019,0.739706252,1.450327885,2.8552492,4.17703341 -0.688085658,0.03425686,0.736479896,1.447130969,2.854797328,4.180663074 -0.699931069,0.033873523,0.733251652,1.443920678,2.854336415,4.184309965 -0.711980398,0.03349561,0.730035748,1.440724783,2.853921207,4.188054536 -0.724237157,0.033122907,0.726828853,1.437536569,2.853538444,4.19187767 -0.736704916,0.032755099,0.723625349,1.434344728,2.853165622,4.195746577 -0.749387309,0.032391805,0.720418,1.431134642,2.852773438,4.19961832 -0.762288028,0.032032443,0.717194847,1.427882154,2.852313286,4.203421333 -0.775410834,0.031676171,0.713937737,1.424550534,2.851710974,4.207045989 -0.78875955,0.03132202,0.710625235,1.42109616,2.850877838,4.210360812 -0.802338063,0.030969003,0.707234875,1.417472957,2.849719513,4.213225317 -0.816150332,0.030617387,0.703772503,1.413691302,2.848254543,4.215665505 -0.830200378,0.030268454,0.700267587,1.409809221,2.846597825,4.217850244 -0.844492297,0.029923624,0.696753636,1.405893419,2.844882806,4.219976644 -0.859030251,0.029583989,0.693257339,1.401997405,2.843217331,4.222204665 -0.873818477,0.029249253,0.689773347,1.398110238,2.841579196,4.224501644 -0.888861282,0.028918765,0.686287705,1.39420339,2.839910177,4.226781153 -0.904163049,0.028591802,0.682784448,1.390243988,2.838142656,4.228942377 -0.919728237,0.028267794,0.679250787,1.386205334,2.836221042,4.230901976 -0.93556138,0.027946224,0.675674982,1.382062635,2.834093139,4.232581294 -0.95166709,0.027626537,0.672044064,1.377788351,2.83170063,4.233892146 -0.968050061,0.027308699,0.668357503,1.373380247,2.829036781,4.234823143 -0.984715065,0.026993174,0.664627045,1.368861358,2.826146958,4.235440903 -1.001666958,0.02668046,0.660865615,1.364257356,2.823082388,4.235821141 -1.018910678,0.026370841,0.657081049,1.359583631,2.819873428,4.236008559 -1.036451248,0.026064385,0.65327608,1.354845132,2.816529004,4.236015834 -1.05429378,0.025761145,0.649453004,1.350045945,2.813056318,4.235853094 -1.072443472,0.025461155,0.645613792,1.345189521,2.809461304,4.235528596 -1.090905611,0.025164435,0.641760039,1.340278556,2.805748367,4.235048321 -1.109685576,0.024870985,0.637892903,1.335314866,2.801920093,4.234415519 -1.128788839,0.024580786,0.634013048,1.33029924,2.797976935,4.23363022 -1.148220965,0.024293796,0.630120571,1.325231292,2.793916858,4.232688678 -1.167987615,0.024009948,0.626214932,1.320109289,2.789734964,4.231582772 -1.188094549,0.023729149,0.622294877,1.314929974,2.785423065,4.230299344 -1.208547624,0.023451279,0.61835835,1.309688366,2.780969236,4.228819469 -1.229352799,0.023176181,0.614402404,1.304377552,2.776357309,4.227117662 -1.250516136,0.022903675,0.610423262,1.298988782,2.771567044,4.22516209 -1.2720438,0.022633688,0.606420052,1.293519432,2.766591099,4.222940435 -1.293942063,0.022366284,0.60239549,1.287974526,2.761438444,4.220465235 -1.316217305,0.022101522,0.598352272,1.282359094,2.756118153,4.217749238 -1.338876016,0.021839451,0.594292852,1.276677704,2.750638384,4.214803841 -1.361924798,0.021580109,0.590219403,1.270934362,2.745006157,4.211638746 -1.385370365,0.021323518,0.586133768,1.265132407,2.739227112,4.208261572 -1.409219547,0.021069687,0.58203741,1.259274396,2.73330524,4.204677433 -1.433479294,0.020818609,0.57793136,1.253361974,2.72724259,4.200888465 -1.458156673,0.020570258,0.57381616,1.247395741,2.721038946,4.196893312 -1.483258874,0.020324588,0.569691794,1.241375103,2.714691473,4.192686557 -1.50879321,0.020081543,0.565557917,1.235298736,2.708195706,4.188260222 -1.534767119,0.019841118,0.561415683,1.229168599,2.701554347,4.183617376 -1.561188171,0.019603328,0.55726677,1.222987822,2.694772707,4.178765137 -1.588064061,0.019368174,0.553112458,1.216758698,2.687854295,4.173707854 -1.61540262,0.019135637,0.548953571,1.21048254,2.680800488,4.168446575 -1.643211813,0.018905685,0.544790419,1.204159547,2.673610196,4.162978503 -1.671499743,0.018678262,0.540622735,1.197788646,2.666279494,4.157296395 -1.700274649,0.018453294,0.536449609,1.191367333,2.658801218,4.151387898 -1.729544916,0.01823068,0.532269414,1.184891495,2.651164528,4.145234836 -1.759319072,0.018010307,0.528080096,1.178356027,2.64335625,4.138815265 -1.78960579,0.01779214,0.523881787,1.171760679,2.635373993,4.132124016 -1.820413895,0.017576175,0.519675577,1.165107357,2.627220203,4.125163469 -1.851752362,0.017362391,0.515462141,1.158397052,2.618895284,4.1179328 -1.883630322,0.017150756,0.511241671,1.151629693,2.610397238,4.110427385 -1.916057061,0.016941217,0.507013823,1.144804004,2.60172131,4.102638218 -1.949042027,0.016733703,0.502777655,1.137917354,2.592859614,4.094551282 -1.982594831,0.01652812,0.498531563,1.130965596,2.583800715,4.086146857 -2.016725246,0.016324392,0.494274344,1.123945458,2.574535071,4.077408096 -2.051443218,0.016122596,0.490009552,1.116864502,2.565077919,4.068357344 -2.08675886,0.015922862,0.485742283,1.109733885,2.555452951,4.059030491 -2.122682462,0.015725319,0.481477714,1.102565069,2.54568481,4.049465143 -2.159224489,0.015530096,0.477221092,1.095369791,2.535799048,4.039700567 -2.196395588,0.015337323,0.472977719,1.088160038,2.525822079,4.029777629 -2.234206589,0.015147127,0.468752943,1.08094802,2.515781118,4.01973871 -2.272668507,0.014959595,0.464550785,1.073743003,2.505696809,4.009615925 -2.311792547,0.014774649,0.460370291,1.066542818,2.495563273,3.999399067 -2.351590109,0.014592156,0.456208683,1.059341052,2.485364609,3.989061783 -2.392072787,0.014411954,0.452062232,1.052129024,2.475079421,3.978568717 -2.433252375,0.014233851,0.447926166,1.044895551,2.464680184,3.96787443 -2.475140871,0.01405762,0.443794575,1.037626691,2.454132567,3.956922225 -2.517750478,0.013883039,0.439661592,1.030308487,2.443401831,3.945654393 -2.56109361,0.013710095,0.435527852,1.02294214,2.432488923,3.934070574 -2.605182895,0.013538849,0.43139645,1.015534664,2.421408668,3.922192884 -2.650031179,0.013369361,0.42727037,1.008092881,2.410175615,3.910043111 -2.695651526,0.013201685,0.423152457,1.000623363,2.398803867,3.897642458 -2.742057229,0.013035868,0.419045386,0.993132344,2.387306895,3.885011216 -2.789261808,0.012871936,0.414951092,0.985624376,2.375694269,3.872163441 -2.837279014,0.012709873,0.410870257,0.978101067,2.363968558,3.859101846 -2.886122837,0.01254965,0.406803028,0.970562781,2.35212936,3.845824295 -2.935807508,0.012391222,0.402749062,0.963008722,2.340173464,3.832324038 -2.986347502,0.012234528,0.398707482,0.955436816,2.328094521,3.818589129 -3.037757543,0.012079525,0.394677951,0.947846276,2.315889277,3.804612625 -3.090052609,0.011926235,0.390662259,0.940241442,2.303567011,3.790408163 -3.143247936,0.011774685,0.386662304,0.932626959,2.291137872,3.775990888 -3.197359021,0.01162489,0.382679722,0.925006891,2.278610709,3.761373905 -3.25240163,0.011476861,0.378715861,0.917384646,2.265992853,3.746567882 -3.308391799,0.011330598,0.374771739,0.909762873,2.253289862,3.731580623 -3.36534584,0.011186087,0.370848014,0.902143373,2.240505256,3.716416598 -3.423280346,0.011043307,0.36694494,0.894526989,2.227640228,3.701076439 -3.482212196,0.010902222,0.363062328,0.886913496,2.214693334,3.685556394 -3.542158559,0.010762798,0.359200084,0.879302907,2.201663724,3.669853678 -3.6031369,0.010625036,0.355359131,0.871697738,2.188556843,3.653975993 -3.665164985,0.01048893,0.351540274,0.864100246,2.175377562,3.637930136 -3.728260884,0.010354465,0.347743958,0.856511827,2.162128646,3.621719421 -3.792442981,0.010221615,0.343970228,0.848932911,2.148810465,3.605343165 -3.857729974,0.010090341,0.340218692,0.841362853,2.13542068,3.588796129 -3.924140885,0.009960591,0.336488474,0.833799811,2.121953904,3.572067915 -3.99169506,0.009832299,0.332778192,0.826240688,2.108401504,3.555142577 -4.060412183,0.009705424,0.329087383,0.818684648,2.09476056,3.538013722 -4.130312272,0.009579985,0.325417463,0.811135541,2.081040162,3.520695232 -4.201415692,0.009455998,0.321769805,0.803597149,2.067249351,3.503201 -4.27374316,0.009333472,0.318145534,0.796072671,2.053395772,3.48554265 -4.347315747,0.009212407,0.314545498,0.788564641,2.039485458,3.467729148 -4.422154888,0.009092797,0.310970239,0.781074847,2.025522598,3.449766378 -4.498282386,0.008974626,0.307419971,0.773604279,2.01150936,3.431656827 -4.57572042,0.008857878,0.303894947,0.766154026,1.997448225,3.413403533 -4.654491553,0.008742542,0.300395545,0.758725518,1.9833426,3.395011153 -4.734618732,0.008628599,0.296921829,0.751319399,1.9691939,3.376480961 -4.816125302,0.00851602,0.293473488,0.743935374,1.955001101,3.357810056 -4.89903501,0.008404762,0.2900498,0.736572104,1.940760443,3.33899082 -4.98337201,0.008294773,0.286649604,0.729227132,1.926465186,3.320010453 -5.069160874,0.00818602,0.283272445,0.721899784,1.912113271,3.300864159 -5.156426595,0.008078525,0.27991975,0.714594192,1.897715402,3.281569185 -5.245194598,0.007972314,0.276593014,0.707314692,1.883282955,3.262144073 -5.335490743,0.007867405,0.273293547,0.700065186,1.868826291,3.242605732 -5.427341339,0.007763814,0.270022458,0.69284908,1.854354575,3.222969123 -5.520773145,0.007661546,0.26678059,0.685669129,1.839875332,3.20324646 -5.615813382,0.007560589,0.263568099,0.678526333,1.825391474,3.183442004 -5.712489738,0.007460913,0.260384536,0.671420147,1.810901783,3.163552843 -5.81083038,0.007362479,0.25722906,0.664349004,1.796402291,3.143571243 -5.910863959,0.007265233,0.254100404,0.657310228,1.781885997,3.12348411 -6.012619618,0.007169116,0.250996972,0.650300274,1.767343495,3.103274047 -6.116127003,0.007074116,0.247918901,0.643320076,1.752777494,3.082944865 -6.22141627,0.006980268,0.244867869,0.636374576,1.738201713,3.062519804 -6.328518094,0.006887602,0.241845488,0.629468574,1.723629627,3.042021853 -6.437463679,0.006796148,0.238853237,0.622606556,1.709074016,3.021472934 -6.548284764,0.006705919,0.23589212,0.61579179,1.694544439,3.000889435 -6.661013637,0.006616874,0.23296107,0.609022148,1.680035687,2.980261662 -6.77568314,0.006528937,0.230057941,0.602292663,1.665534662,2.959565857 -6.892326681,0.006442021,0.227180056,0.595596945,1.651024215,2.938770897 -7.010978243,0.006356028,0.224324369,0.588927596,1.63648424,2.917840193 -7.131672395,0.006270951,0.221491045,0.582285622,1.621917867,2.89677842 -7.254444299,0.006186874,0.218683421,0.575680378,1.607351595,2.875632108 -7.379329725,0.006103887,0.215905053,0.569121854,1.592813961,2.854451778 -7.506365056,0.006022079,0.213159496,0.562620082,1.578333915,2.833289043 -7.635587303,0.005941466,0.210447704,0.556178263,1.563921483,2.812161856 -7.767034114,0.005861985,0.207767741,0.54979197,1.549565299,2.791049769 -7.900743785,0.005783552,0.205117069,0.543455151,1.5352493,2.769923738 -8.036755271,0.005706082,0.202492932,0.537161136,1.520955544,2.74875114 -8.175108198,0.005629559,0.199895122,0.530909987,1.50668504,2.727533457 -8.315842873,0.005554011,0.197324896,0.524705663,1.492449899,2.706292326 -8.459000299,0.005479461,0.194783422,0.518551891,1.478261701,2.685048581 -8.604622184,0.005405906,0.192270858,0.512449726,1.464124499,2.663809517 -8.752750953,0.005333274,0.189784965,0.506393822,1.45002407,2.642549187 -8.903429762,0.005261474,0.187322703,0.500376663,1.43593984,2.62122989 -9.05670251,0.005190418,0.18488128,0.494391361,1.421852877,2.599816698 -9.212613852,0.005120165,0.182462948,0.488444492,1.407782905,2.578345269 -9.371209211,0.005050836,0.180072349,0.482549066,1.393768413,2.556885934 -9.532534794,0.004982553,0.177714023,0.476717859,1.379847552,2.535508892 -9.696637599,0.004915307,0.175387928,0.470951396,1.366023268,2.514220016 -9.863565439,0.004848994,0.173090534,0.465240818,1.352271252,2.492974989 -10.03336694,0.004783498,0.170817919,0.459576161,1.338563785,2.471722916 -10.20609159,0.004718779,0.16856888,0.453954751,1.324894188,2.450451505 -10.38178969,0.004654853,0.166344174,0.448379169,1.311271115,2.429176801 -10.56051244,0.004591734,0.164144486,0.442851808,1.297702738,2.407914082 -10.7423119,0.004529433,0.161970379,0.437374735,1.284196347,2.386677097 -10.92724105,0.004467956,0.159822283,0.431949655,1.270758223,2.365477825 -11.11535375,0.004407307,0.157700479,0.426577869,1.257393516,2.344326224 -11.30670482,0.004347485,0.155605087,0.421260236,1.244106102,2.323229955 -11.50135001,0.004288483,0.153536047,0.415997125,1.230898441,2.302194091 -11.69934601,0.00423029,0.151493103,0.410788364,1.217771413,2.281220793 -11.90075052,0.004172889,0.149475787,0.405633196,1.204724154,2.260308975 -12.10562222,0.004116256,0.147483396,0.400530216,1.191753872,2.239453937 -12.31402078,0.004060362,0.145514974,0.395477317,1.178855656,2.218646974 -12.52600693,0.004005169,0.143569356,0.390471811,1.166022826,2.197876006 -12.74164243,0.003950666,0.141646215,0.385513277,1.153255427,2.177141591 -12.9609901,0.003896861,0.139745963,0.380603286,1.140559481,2.156455604 -13.18411384,0.003843759,0.137868917,0.375743159,1.127940294,2.13582865 -13.41107866,0.003791363,0.136015269,0.370933864,1.115402143,2.115269466 -13.64195069,0.003739672,0.13418507,0.36617598,1.102948159,2.094784672 -13.87679719,0.003688679,0.132378217,0.361469659,1.090580198,2.074378518 -14.11568657,0.003638375,0.130594439,0.356814582,1.078298705,2.054052599 -14.35868844,0.003588744,0.128833279,0.352209918,1.066102566,2.033805562 -14.60587359,0.003539766,0.127094082,0.347654277,1.053988953,2.013632779 -14.85731404,0.003491414,0.125375972,0.343145656,1.041953156,1.993526008 -15.11308304,0.003443661,0.123678061,0.338682006,1.029990289,1.973476631 -15.37325511,0.003396509,0.122000476,0.334264045,1.018103856,1.953492092 -15.63790605,0.003349968,0.120343652,0.329893326,1.006299919,1.933584804 -15.90711297,0.003304045,0.11870793,0.325571147,0.994583793,1.913765823 -16.18095428,0.003258746,0.117093554,0.321298527,0.982959952,1.894044659 -16.45950978,0.003214072,0.115500655,0.317076171,0.971431936,1.874429077 -16.74286062,0.003170022,0.113929244,0.312904444,0.960002241,1.854924881 -17.03108935,0.003126592,0.112379197,0.308783336,0.948672212,1.835535684 -17.32427995,0.003083771,0.110850243,0.304712425,0.937441921,1.816262659 -17.62251783,0.003041549,0.109342016,0.300691013,0.926310583,1.797105325 -17.92588988,0.00299992,0.107854369,0.296718999,0.915279231,1.778066742 -18.23448448,0.002958878,0.106387159,0.292796286,0.904348896,1.759149981 -18.54839155,0.002918416,0.104940103,0.288922378,0.893519377,1.740355738 -18.86770254,0.002878519,0.103512763,0.285096351,0.882789119,1.721682077 -19.19251047,0.002839169,0.102104535,0.281316807,0.872155084,1.703124152 -19.52290998,0.002800345,0.10071463,0.277581836,0.861612607,1.684673923 -19.85899733,0.002762016,0.099342064,0.273888968,0.851155254,1.666319845 -20.20087042,0.002724159,0.097985977,0.27023608,0.840777613,1.648052325 -20.54862887,0.002686778,0.096646544,0.266623881,0.830483067,1.629878984 -20.90237399,0.002649881,0.095324125,0.263053595,0.820276597,1.611810629 -21.26220884,0.002613477,0.094019016,0.259526255,0.810162601,1.593856973 -21.62823825,0.00257757,0.092731438,0.256042688,0.800144827,1.5760265 -22.00056887,0.002542164,0.09146153,0.252603486,0.790226297,1.558326304 -22.37930917,0.00250726,0.090209341,0.249208988,0.780409233,1.540761926 -22.76456949,0.002472855,0.088974823,0.245859253,0.770694967,1.523337182 -23.15646208,0.002438944,0.087757816,0.242554032,0.761083856,1.506053968 -23.55510111,0.002405521,0.086558044,0.239292741,0.751575184,1.488912061 -23.96060271,0.002372571,0.085375098,0.236074429,0.742167058,1.471908904 -24.37308504,0.002340081,0.084208429,0.232897743,0.732856303,1.455039372 -24.79266826,0.002308029,0.083057331,0.229760895,0.723638337,1.438295527 -25.21947461,0.002276397,0.081921138,0.226662196,0.714508854,1.421669934 -25.65362845,0.002245186,0.080799938,0.22360204,0.705470088,1.405168155 -26.09525625,0.002214405,0.079693994,0.2205813,0.696525782,1.388798778 -26.54448669,0.002184057,0.07860351,0.217600678,0.687679123,1.372569317 -27.00145064,0.002154147,0.077528622,0.214660683,0.678932689,1.356486089 -27.46628123,0.002124676,0.076469387,0.211761606,0.67028835,1.340554019 -27.9391139,0.00209564,0.075425666,0.208903187,0.66174622,1.324774525 -28.42008638,0.002067027,0.074397061,0.206084441,0.653304094,1.30914438 -28.90933883,0.002038822,0.073383033,0.203303989,0.644958496,1.293657781 -29.40701376,0.002011006,0.072382901,0.200560056,0.636704657,1.278306305 -29.91325618,0.001983556,0.071395837,0.197850449,0.628536458,1.263078771 -30.42821357,0.001956457,0.070421316,0.195173813,0.620450394,1.247969211 -30.95203597,0.001929713,0.069459516,0.192530735,0.612449125,1.232984038 -31.48487598,0.001903331,0.068510645,0.189921883,0.604535553,1.218130169 -32.02688884,0.001877314,0.067574858,0.187347775,0.596712097,1.203413559 -32.57823247,0.001851666,0.066652253,0.184808767,0.588980635,1.188839088 -33.13906749,0.001826386,0.065742863,0.182305029,0.581342454,1.174410445 -33.7095573,0.001801473,0.06484665,0.179836533,0.573798184,1.160129997 -34.2898681,0.001776925,0.063963498,0.17740303,0.566347741,1.145998656 -34.88016897,0.001752736,0.063093206,0.175004035,0.558990259,1.132015747 -35.48063188,0.001728899,0.062235562,0.172639026,0.551724744,1.118180319 -36.09143178,0.001705411,0.061390422,0.170307663,0.544550761,1.104492537 -36.7127466,0.001682265,0.060557572,0.168009416,0.53746725,1.09095129 -37.34475738,0.001659453,0.059736708,0.165743499,0.530472308,1.077553738 -37.98764824,0.001636964,0.058927426,0.163508846,0.523563118,1.064295158 -38.64160648,0.001614783,0.058129213,0.161304083,0.516735862,1.051168767 -39.30682262,0.001592892,0.057341438,0.159127509,0.509985638,1.038165542 -39.98349048,0.001571272,0.05656336,0.156977115,0.503306544,1.02527439 -40.67180718,0.001549915,0.055794759,0.154852334,0.496697273,1.012493535 -41.37197328,0.001528837,0.05503613,0.152754579,0.49016286,0.999834129 -42.08419275,0.00150805,0.054288009,0.150685381,0.483708703,0.98730808 -42.8086731,0.001487571,0.053550932,0.148646263,0.477340177,0.974927264 -43.54562539,0.001467414,0.05282543,0.146638736,0.471062613,0.962703485 -44.29526433,0.001447593,0.052112031,0.144664299,0.464881285,0.950648448 -45.05780833,0.001428123,0.051411222,0.142724339,0.458801115,0.938773145 -45.83347953,0.001408998,0.050722853,0.14081847,0.452821297,0.927076852 -46.62250394,0.001390196,0.050046106,0.13894445,0.44693506,0.915546602 -47.42511142,0.001371691,0.049379994,0.137099565,0.441134072,0.90416619 -48.2415358,0.001353449,0.048723365,0.135280643,0.435408511,0.892916298 -49.07201495,0.001335433,0.048074889,0.133484016,0.429746941,0.881774238 -49.91679081,0.001317603,0.047433066,0.131705541,0.424136362,0.870714054 -50.77610952,0.001299938,0.046797197,0.129943296,0.418570907,0.859724373 -51.65022141,0.001282457,0.046167941,0.128199134,0.413056855,0.84881875 -52.53938116,0.001265182,0.045546105,0.126475311,0.407601783,0.838013422 -53.44384781,0.001248137,0.044932536,0.1247742,0.402213635,0.827325404 -54.36388488,0.001231347,0.044328126,0.123098293,0.396900746,0.816772533 -55.29976041,0.001214835,0.043733715,0.121449938,0.391670972,0.806371679 -56.25174706,0.001198602,0.04314938,0.119829363,0.386525338,0.796125652 -57.22012218,0.00118264,0.042574763,0.118235594,0.381460969,0.78602922 -58.2051679,0.001166935,0.042009417,0.116667396,0.376474149,0.776075391 -59.2071712,0.001151472,0.041452795,0.115123267,0.371560272,0.76625531 -60.22642402,0.001136235,0.040904285,0.113601514,0.366714117,0.756558822 -61.26322329,0.001121216,0.040363603,0.112101363,0.361933409,0.746981827 -62.31787109,0.001106412,0.039830673,0.110622615,0.357217717,0.737524007 -63.39067467,0.00109182,0.039305374,0.109164936,0.352566175,0.728184135 -64.48194659,0.001077435,0.038787526,0.10772784,0.347977408,0.718959916 -65.59200479,0.001063251,0.038276942,0.106310817,0.343449958,0.709848866 -66.72117266,0.001049269,0.037773596,0.104913801,0.338983796,0.700851438 -67.86977918,0.001035488,0.037277478,0.103536768,0.334579016,0.691968333 -69.03815899,0.001021906,0.036788533,0.102179577,0.330235334,0.683199452 -70.22665249,0.00100852,0.036306669,0.100841978,0.325952096,0.674543917 -71.43560592,0.00099533,0.03583181,0.099523761,0.321728782,0.666001117 -72.66537152,0.000982331,0.035363875,0.098224713,0.317564844,0.65757037 -73.91630756,0.000969522,0.03490274,0.096944491,0.313459316,0.649250115 -75.1887785,0.000956897,0.03444824,0.095682641,0.309410863,0.641038008 -76.48315505,0.000944454,0.034000315,0.094439002,0.305419093,0.632933651 -77.79981432,0.000932195,0.033558987,0.093213639,0.301484336,0.624938128 -79.13913992,0.000920119,0.033124247,0.092006531,0.297606642,0.617051929 -80.50152203,0.000908224,0.032696054,0.090817567,0.293785762,0.609274918 -81.88735758,0.000896511,0.032274361,0.089646618,0.290021384,0.601606813 -83.29705033,0.000884975,0.031859092,0.088493481,0.286312951,0.594046816 -84.73101096,0.000873615,0.031450132,0.087357834,0.282659517,0.586593309 -86.18965727,0.000862426,0.03104731,0.08623921,0.279059664,0.579243675 -87.6734142,0.0008514,0.030650397,0.08513697,0.27551141,0.571994127 -89.18271404,0.000840531,0.030259103,0.084050313,0.272012249,0.564839763 -90.71799651,0.000829811,0.029873179,0.082978552,0.268560026,0.557776408 -92.27970891,0.000819246,0.029492847,0.081922299,0.265156802,0.550808626 -93.86830622,0.000808847,0.029118486,0.080882615,0.261806081,0.54394397 -95.48425127,0.000798623,0.028750422,0.079860404,0.258510857,0.53718894 -97.12801485,0.000788567,0.028388418,0.078855008,0.255269061,0.530539496 -98.80007586,0.000778664,0.028031885,0.077864797,0.25207548,0.523985057 -100.5009214,0.000768895,0.027680206,0.076888053,0.248924609,0.517514421 -102.2310471,0.000759256,0.027333225,0.075924349,0.245815117,0.511125047 -103.9909569,0.000749751,0.026991038,0.074973946,0.242747903,0.504819025 -105.7811637,0.000740381,0.026653723,0.074037069,0.239723737,0.498598164 -107.6021888,0.000731148,0.026321342,0.073113886,0.236743217,0.492463915 -109.454563,0.000722054,0.025993935,0.072204512,0.233806754,0.486417332 -111.3388258,0.000713098,0.02567152,0.071308998,0.230914551,0.48045903 -113.2555262,0.00070428,0.025354091,0.070427323,0.228066586,0.474589141 -115.2052227,0.0006956,0.025041611,0.069559392,0.225262581,0.468807271 -117.1884833,0.000687056,0.024734017,0.068705022,0.222501985,0.463112444 -119.2058857,0.000678645,0.024431208,0.067863942,0.219783948,0.457503047 -121.2580178,0.000670363,0.02413305,0.067035777,0.217107287,0.45197678 -123.3454774,0.000662205,0.023839369,0.066220042,0.214470462,0.446530585 -125.4688726,0.000654166,0.023549964,0.06541618,0.211871695,0.441160903 -127.6288221,0.000646244,0.023264783,0.064624048,0.209310546,0.435866956 -129.8259552,0.000638441,0.022983869,0.063843765,0.20678743,0.430649736 -132.060912,0.000630757,0.022707248,0.063075405,0.204302608,0.425509914 -134.3343437,0.000623192,0.022434927,0.062318986,0.201856156,0.42044777 -136.6469125,0.000615747,0.02216689,0.061574462,0.199447948,0.415463157 -138.9992922,0.000608419,0.021903094,0.060841719,0.197077634,0.410555454 -141.3921682,0.000601208,0.021643472,0.060120567,0.194744617,0.405723527 -143.8262377,0.000594109,0.021387926,0.059410735,0.192448035,0.40096568 -146.3022097,0.00058712,0.021136325,0.058711861,0.19018673,0.396279598 -148.8208056,0.000580236,0.020888504,0.058023485,0.187959229,0.391662301 -151.3827591,0.000573453,0.020644307,0.057345173,0.185764137,0.387110973 -153.9888168,0.00056677,0.020403736,0.056676934,0.183601499,0.382625788 -156.6397379,0.00056019,0.020166827,0.056018864,0.181471637,0.378207499 -159.3362945,0.000553711,0.019933598,0.055371014,0.179374728,0.373856551 -162.0792725,0.000547335,0.019704048,0.054733386,0.177310789,0.36957305 -164.8694709,0.00054106,0.01947816,0.054105928,0.175279659,0.365356728 -167.7077027,0.000534886,0.019255893,0.053488525,0.17328098,0.361206911 -170.5947946,0.000528811,0.019037181,0.052881,0.171314183,0.357122474 -173.5315879,0.000522832,0.018821936,0.052283102,0.169378467,0.353101804 -176.5189382,0.000516946,0.01861006,0.051694563,0.167472966,0.349143156 -179.5577158,0.000511153,0.018401524,0.051115303,0.165597432,0.345246064 -182.648806,0.000505453,0.018196307,0.05054526,0.163751672,0.34141018 -185.7931094,0.000499844,0.017994367,0.049984318,0.161935314,0.337634778 -188.991542,0.000494323,0.017795639,0.0494323,0.160147789,0.333918713 -192.2450358,0.00048889,0.017600035,0.048888959,0.158388307,0.330260387 -195.5545385,0.00048354,0.017407442,0.048353979,0.156655845,0.326657708 -198.9210144,0.00047827,0.017217715,0.047826963,0.154949123,0.323108044 -202.3454442,0.000473076,0.01703074,0.047307591,0.153267111,0.319609286 -205.8288257,0.000467959,0.016846534,0.046795909,0.151609957,0.316161778 -209.3721737,0.00046292,0.016665124,0.046291995,0.149977924,0.312766102 -212.9765204,0.000457959,0.016486528,0.045795897,0.148371165,0.30942261 -216.6429161,0.000453076,0.016310749,0.045307623,0.146789713,0.306131402 -220.3724289,0.000448272,0.016137776,0.044827143,0.14523347,0.3028923 -224.1661453,0.000443544,0.01596758,0.044354379,0.143702192,0.299704824 -228.0251707,0.000438893,0.015800145,0.043889282,0.14219572,0.296568668 -231.9506293,0.000434319,0.015635491,0.04343191,0.140714243,0.293484251 -235.9436647,0.000429823,0.015473632,0.042982303,0.139257896,0.290451877 -240.0054403,0.000425405,0.015314571,0.042540467,0.137826698,0.287471609 -244.1371395,0.000421064,0.015158294,0.042106367,0.13642054,0.284543239 -248.3399659,0.000416799,0.015004775,0.041679926,0.13503917,0.281666264 -252.6151442,0.00041261,0.014853966,0.04126101,0.133682164,0.278839815 -256.9639197,0.000408494,0.014705791,0.040849416,0.132348856,0.276062524 -261.3875595,0.000404449,0.014560156,0.040444873,0.131038376,0.27333259 -265.8873523,0.000400471,0.014416938,0.040047047,0.129749639,0.270647767 -270.4646092,0.000396555,0.014275992,0.03965553,0.128481329,0.268005324 -275.1206637,0.000392699,0.014137148,0.039269852,0.127231922,0.265402096 -279.8568722,0.000388898,0.014000327,0.038889794,0.126000711,0.26283662 -284.6746147,0.000385154,0.013865559,0.038515439,0.124787961,0.260309465 -289.5752947,0.000381469,0.013732871,0.038146862,0.123593924,0.257821163 -294.5603401,0.000377841,0.013602283,0.037784119,0.122418775,0.255372092 -299.6312031,0.000374272,0.013473806,0.037427238,0.121262608,0.252962461 -304.7893612,0.000370763,0.013347452,0.037076253,0.120125537,0.250592516 -310.036317,0.000367312,0.013223239,0.036731218,0.119007735,0.248262624 -315.3735994,0.000363922,0.013101179,0.036392164,0.117909301,0.245973004 -320.8027631,0.000360591,0.012981274,0.036059093,0.116830246,0.243723688 -326.3253901,0.00035732,0.012863513,0.035731979,0.115770484,0.2415145 -331.9430892,0.000354108,0.012747874,0.03541076,0.114729817,0.239345039 -337.6574971,0.000350953,0.012634323,0.035095341,0.113707933,0.237214658 -343.4702787,0.000347856,0.01252281,0.034785583,0.112704387,0.235122435 -349.3831274,0.000344813,0.012413271,0.034481307,0.111718598,0.233067166 -355.397766,0.000341824,0.012305656,0.034182376,0.110750122,0.231047929 -361.5159467,0.000338887,0.012199948,0.033888744,0.109798808,0.229064415 -367.7394521,0.000336003,0.012096123,0.033600342,0.108864436,0.22711617 -374.0700952,0.000333171,0.011994144,0.033317068,0.107946675,0.225202507 -380.5097205,0.000330388,0.011893962,0.033038782,0.107045073,0.223322489 -387.0602041,0.000327653,0.01179551,0.032765304,0.106159046,0.221474903 -393.7234544,0.000324964,0.011698708,0.03249641,0.105287867,0.219658234 -400.5014127,0.000322318,0.011603462,0.032231838,0.104430689,0.217870717 -407.3960537,0.000319715,0.011509739,0.031971497,0.103587217,0.216111744 -414.4093862,0.000317155,0.01141757,0.031715473,0.102757728,0.214381893 -421.5434533,0.000314638,0.011326984,0.031463845,0.10194248,0.212681708 -428.8003335,0.000312167,0.011238004,0.031216678,0.101141686,0.211011634 -436.1821411,0.00030974,0.011150648,0.030974022,0.100355506,0.20937201 -443.6910267,0.000307359,0.011064928,0.03073591,0.099584045,0.207763054 -451.3291779,0.000305024,0.010980847,0.030502353,0.09882734,0.20618485 -459.0988201,0.000302733,0.010898398,0.030273328,0.098085317,0.204637242 -467.0022169,0.000300488,0.01081756,0.030048777,0.097357789,0.203119843 -475.0416708,0.000298286,0.010738301,0.029828613,0.096644474,0.20163207 -483.2195241,0.000296127,0.010660579,0.029612719,0.095944994,0.200173131 -491.5381593,0.000294009,0.01058434,0.029400944,0.095258856,0.198742002 -500,0.000291931,0.010509518,0.029193104,0.09458547,0.197337454 +# Provided by Libamtrack ,,,,, +# Generated: 15/3/2022 @ 13:0:7,,,,, +# Stopping power,,,,, +E_MeV_u,proton_LET_keV_um,carbon_LET_keV_um,neon_LET_keV_um,argon_LET_keV_um,iron_LET_keV_um +0.1,0.087892496,0.813133247,1.324670718,2.212024878,2.988400738 +0.101721502,0.087731792,0.817201145,1.332837013,2.227833365,3.011134524 +0.10347264,0.087556527,0.821172105,1.34087294,2.243468896,3.033665467 +0.105253924,0.087366585,0.825042425,1.348772172,2.258920717,3.055979023 +0.107065873,0.087161885,0.828808609,1.356528678,2.274178522,3.078061232 +0.108909014,0.086942379,0.832467402,1.364136792,2.289232571,3.099898866 +0.110783886,0.086708056,0.836015838,1.371591283,2.304073809,3.1214796 +0.112691033,0.086458951,0.839451282,1.378887438,2.318694006,3.142792199 +0.114631011,0.086195139,0.842771485,1.386021146,2.333085906,3.163826724 +0.116604387,0.085916749,0.845974638,1.392988996,2.347243395,3.18457476 +0.118611734,0.085623964,0.849059437,1.399788383,2.36116168,3.205029669 +0.120653638,0.085317026,0.852025146,1.406417619,2.374837494,3.225186866 +0.122730693,0.084996239,0.854871673,1.412876066,2.388269318,3.245044124 +0.124843505,0.084661977,0.857599603,1.419164195,2.401457496,3.264601743 +0.126992689,0.0843145,0.860208441,1.42528068,2.414399321,3.283855868 +0.129178871,0.08395388,0.862695721,1.431220917,2.4270865,3.302795032 +0.131402688,0.083580209,0.865059162,1.436980569,2.439511153,3.321408299 +0.133664788,0.083193622,0.867296876,1.442555929,2.451666428,3.339686103 +0.13596583,0.082794302,0.869407431,1.447944018,2.463546664,3.357620481 +0.138306485,0.082382478,0.871389906,1.453142685,2.47514758,3.375205327 +0.140687435,0.081958438,0.873243958,1.458150726,2.486466475,3.39243667 +0.143109372,0.081522527,0.87496989,1.462968001,2.497502445,3.409312978 +0.145573003,0.081075153,0.876568731,1.467595576,2.508256629,3.4258355 +0.148079046,0.080616794,0.878042319,1.472035869,2.518732471,3.44200863 +0.15062823,0.080147976,0.879393091,1.47629231,2.528935155,3.457839146 +0.153221298,0.079669019,0.880621346,1.480364738,2.53886372,3.473325423 +0.155859007,0.079180134,0.881726159,1.484250931,2.548513647,3.488460958 +0.158542123,0.078681568,0.882707045,1.487949381,2.557881611,3.503240864 +0.161271429,0.078173613,0.88356403,1.491459428,2.566965721,3.517662198 +0.164047721,0.077656608,0.884297713,1.494781366,2.575765704,3.531724223 +0.166871806,0.077130944,0.884909329,1.497916557,2.584283121,3.545428706 +0.169744508,0.076597065,0.885400815,1.500867557,2.592521587,3.558780236 +0.172666664,0.076055476,0.885774894,1.503638253,2.600487026,3.571786568 +0.175639124,0.075506733,0.886035,1.506233763,2.608187506,3.584458423 +0.178662756,0.074951312,0.886183798,1.508657908,2.615628879,3.596803485 +0.181738439,0.074389656,0.886223632,1.510913979,2.622816087,3.608828203 +0.184867071,0.073822256,0.886157544,1.513006472,2.629756188,3.620541943 +0.188049561,0.073249658,0.88598937,1.514941252,2.636458638,3.631957393 +0.191286839,0.072672466,0.885723808,1.51672569,2.642935559,3.643090936 +0.194579846,0.072091347,0.885366503,1.518368818,2.64920202,3.653963056 +0.197929543,0.071507035,0.884924137,1.519881494,2.655276345,3.664598772 +0.201336904,0.070920269,0.884403696,1.521275156,2.661177962,3.675024685 +0.204802924,0.07033143,0.883807915,1.522553979,2.666913667,3.685250001 +0.208328611,0.069740759,0.883137864,1.523719289,2.672485286,3.695277072 +0.211914993,0.069148509,0.882394846,1.524772814,2.677895352,3.70510923 +0.215563114,0.06855495,0.881580418,1.525716724,2.683147182,3.714750895 +0.219274038,0.067960363,0.880696406,1.526553664,2.688244934,3.724207662 +0.223048846,0.067365047,0.879744922,1.527286787,2.693193681,3.733486401 +0.226888637,0.066769302,0.878728209,1.527919486,2.697998936,3.742594607 +0.23079453,0.066173381,0.877647967,1.528454223,2.702664591,3.751537542 +0.234767663,0.065577526,0.876505849,1.528893389,2.707194421,3.760320313 +0.238809194,0.064981987,0.875303685,1.529239693,2.711592783,3.768948847 +0.2429203,0.06438702,0.87404349,1.529496181,2.715864643,3.777429928 +0.247102178,0.063792889,0.872727468,1.529666242,2.720015603,3.785771243 +0.251356048,0.063199859,0.871357945,1.529753498,2.724051702,3.793981101 +0.255683148,0.062608161,0.86993685,1.529760889,2.727977789,3.802066174 +0.260084739,0.062018004,0.868465934,1.529691056,2.731798202,3.810032438 +0.264562104,0.061429598,0.866947014,1.529546772,2.735517531,3.817886229 +0.269116547,0.060843151,0.865381967,1.529330924,2.739140592,3.825634218 +0.273749394,0.060258867,0.863772716,1.529046501,2.742672406,3.833283376 +0.278461996,0.059676957,0.86212136,1.528696814,2.746118593,3.84084153 +0.283255726,0.05909765,0.860430358,1.528285837,2.749485993,3.848318232 +0.28813198,0.058521177,0.858702285,1.527817768,2.75278189,3.855723684 +0.293092179,0.057947764,0.856939781,1.527296946,2.756013854,3.863068516 +0.298137767,0.057377636,0.855145534,1.526727823,2.759189703,3.870363732 +0.303270216,0.056810984,0.853321884,1.526114255,2.762316219,3.877618915 +0.308491019,0.056247916,0.851469948,1.525457932,2.765396292,3.884838206 +0.313801699,0.055688502,0.849590392,1.524759737,2.768431364,3.892023723 +0.319203803,0.055132794,0.847683583,1.524020024,2.771421914,3.899176232 +0.324698904,0.054580817,0.845749539,1.523238515,2.774367274,3.906294889 +0.330288603,0.05403257,0.843787878,1.522414204,2.777265434,3.913376951 +0.335974529,0.053488021,0.841797752,1.521545236,2.780112816,3.920417455 +0.341758338,0.052947106,0.839777788,1.52062878,2.782904033,3.927408869 +0.347641716,0.052409723,0.83772601,1.519660896,2.785631617,3.934340697 +0.353626376,0.051875809,0.835641002,1.518638625,2.788289853,3.941204884 +0.359714062,0.051345524,0.833524969,1.517565574,2.790885054,3.948010365 +0.365906548,0.050819072,0.831380913,1.516446828,2.793426297,3.95477001 +0.372205637,0.050296649,0.829211828,1.515287492,2.795922743,3.96149685 +0.378613166,0.049778442,0.827020675,1.514092644,2.798383561,3.968203969 +0.385131,0.049264627,0.824810354,1.512867282,2.800817832,3.974904363 +0.391761039,0.04875537,0.82258367,1.51161627,2.80323444,3.981610793 +0.398505215,0.048250822,0.820343299,1.510344259,2.805641932,3.988335582 +0.405365491,0.047751077,0.818091066,1.509054371,2.808046066,3.995087123 +0.412343867,0.047256128,0.815827101,1.507746614,2.810446824,4.001865618 +0.419442376,0.046765928,0.813550814,1.506419659,2.812841699,4.008667716 +0.426663087,0.046280388,0.811260969,1.505070965,2.815225887,4.015486781 +0.434008101,0.045799384,0.808955592,1.5036966,2.817591941,4.022312384 +0.441479561,0.045322744,0.80663188,1.502291052,2.819929396,4.029129742 +0.449079642,0.044850252,0.804286149,1.500847121,2.822224532,4.035919367 +0.456810558,0.044381813,0.801916773,1.499361394,2.824470658,4.042671763 +0.464674562,0.043917556,0.799526243,1.497838142,2.82667553,4.049398095 +0.472673946,0.043457622,0.797117297,1.496282127,2.828847886,4.056110974 +0.480811038,0.043002136,0.794692512,1.494697848,2.83099602,4.062822411 +0.489088212,0.042551207,0.792254263,1.493089453,2.833127619,4.069543595 +0.497507876,0.042104927,0.789804674,1.491460646,2.835249574,4.076284604 +0.506072486,0.041663266,0.787343634,1.489810933,2.837360827,4.083044116 +0.514784535,0.041225903,0.784865543,1.488129403,2.839440435,4.08979216 +0.523646563,0.040792416,0.782362691,1.486401043,2.84145945,4.096487115 +0.532661151,0.040362312,0.779825757,1.484607653,2.843382596,4.103078068 +0.541830925,0.039935019,0.777243644,1.482727487,2.845167517,4.10950369 +0.551158556,0.039509921,0.77460409,1.480736394,2.846766901,4.115695248 +0.560646764,0.03908698,0.77190594,1.478631294,2.848173655,4.121641941 +0.570298311,0.038666685,0.769158464,1.476429083,2.849419168,4.12738866 +0.580116009,0.038249567,0.766372157,1.474149157,2.850539889,4.132987799 +0.59010272,0.037836194,0.763558525,1.471813015,2.851576626,4.138498265 +0.600261351,0.037427144,0.760729647,1.469443442,2.852572984,4.14398326 +0.610594864,0.037022407,0.757885953,1.46704086,2.853529409,4.149443465 +0.621106269,0.036621285,0.755013689,1.464578185,2.854392739,4.154801533 +0.631798628,0.036222949,0.752095996,1.462022057,2.855097124,4.159961316 +0.642675056,0.035826458,0.749113224,1.459333396,2.855564984,4.16480917 +0.653738722,0.03543093,0.74604648,1.45647426,2.855720331,4.169233309 +0.664992849,0.035036763,0.742903426,1.45345833,2.855587972,4.173268784 +0.676440716,0.034645019,0.739706252,1.450327885,2.8552492,4.17703341 +0.688085658,0.03425686,0.736479896,1.447130969,2.854797328,4.180663074 +0.699931069,0.033873523,0.733251652,1.443920678,2.854336415,4.184309965 +0.711980398,0.03349561,0.730035748,1.440724783,2.853921207,4.188054536 +0.724237157,0.033122907,0.726828853,1.437536569,2.853538444,4.19187767 +0.736704916,0.032755099,0.723625349,1.434344728,2.853165622,4.195746577 +0.749387309,0.032391805,0.720418,1.431134642,2.852773438,4.19961832 +0.762288028,0.032032443,0.717194847,1.427882154,2.852313286,4.203421333 +0.775410834,0.031676171,0.713937737,1.424550534,2.851710974,4.207045989 +0.78875955,0.03132202,0.710625235,1.42109616,2.850877838,4.210360812 +0.802338063,0.030969003,0.707234875,1.417472957,2.849719513,4.213225317 +0.816150332,0.030617387,0.703772503,1.413691302,2.848254543,4.215665505 +0.830200378,0.030268454,0.700267587,1.409809221,2.846597825,4.217850244 +0.844492297,0.029923624,0.696753636,1.405893419,2.844882806,4.219976644 +0.859030251,0.029583989,0.693257339,1.401997405,2.843217331,4.222204665 +0.873818477,0.029249253,0.689773347,1.398110238,2.841579196,4.224501644 +0.888861282,0.028918765,0.686287705,1.39420339,2.839910177,4.226781153 +0.904163049,0.028591802,0.682784448,1.390243988,2.838142656,4.228942377 +0.919728237,0.028267794,0.679250787,1.386205334,2.836221042,4.230901976 +0.93556138,0.027946224,0.675674982,1.382062635,2.834093139,4.232581294 +0.95166709,0.027626537,0.672044064,1.377788351,2.83170063,4.233892146 +0.968050061,0.027308699,0.668357503,1.373380247,2.829036781,4.234823143 +0.984715065,0.026993174,0.664627045,1.368861358,2.826146958,4.235440903 +1.001666958,0.02668046,0.660865615,1.364257356,2.823082388,4.235821141 +1.018910678,0.026370841,0.657081049,1.359583631,2.819873428,4.236008559 +1.036451248,0.026064385,0.65327608,1.354845132,2.816529004,4.236015834 +1.05429378,0.025761145,0.649453004,1.350045945,2.813056318,4.235853094 +1.072443472,0.025461155,0.645613792,1.345189521,2.809461304,4.235528596 +1.090905611,0.025164435,0.641760039,1.340278556,2.805748367,4.235048321 +1.109685576,0.024870985,0.637892903,1.335314866,2.801920093,4.234415519 +1.128788839,0.024580786,0.634013048,1.33029924,2.797976935,4.23363022 +1.148220965,0.024293796,0.630120571,1.325231292,2.793916858,4.232688678 +1.167987615,0.024009948,0.626214932,1.320109289,2.789734964,4.231582772 +1.188094549,0.023729149,0.622294877,1.314929974,2.785423065,4.230299344 +1.208547624,0.023451279,0.61835835,1.309688366,2.780969236,4.228819469 +1.229352799,0.023176181,0.614402404,1.304377552,2.776357309,4.227117662 +1.250516136,0.022903675,0.610423262,1.298988782,2.771567044,4.22516209 +1.2720438,0.022633688,0.606420052,1.293519432,2.766591099,4.222940435 +1.293942063,0.022366284,0.60239549,1.287974526,2.761438444,4.220465235 +1.316217305,0.022101522,0.598352272,1.282359094,2.756118153,4.217749238 +1.338876016,0.021839451,0.594292852,1.276677704,2.750638384,4.214803841 +1.361924798,0.021580109,0.590219403,1.270934362,2.745006157,4.211638746 +1.385370365,0.021323518,0.586133768,1.265132407,2.739227112,4.208261572 +1.409219547,0.021069687,0.58203741,1.259274396,2.73330524,4.204677433 +1.433479294,0.020818609,0.57793136,1.253361974,2.72724259,4.200888465 +1.458156673,0.020570258,0.57381616,1.247395741,2.721038946,4.196893312 +1.483258874,0.020324588,0.569691794,1.241375103,2.714691473,4.192686557 +1.50879321,0.020081543,0.565557917,1.235298736,2.708195706,4.188260222 +1.534767119,0.019841118,0.561415683,1.229168599,2.701554347,4.183617376 +1.561188171,0.019603328,0.55726677,1.222987822,2.694772707,4.178765137 +1.588064061,0.019368174,0.553112458,1.216758698,2.687854295,4.173707854 +1.61540262,0.019135637,0.548953571,1.21048254,2.680800488,4.168446575 +1.643211813,0.018905685,0.544790419,1.204159547,2.673610196,4.162978503 +1.671499743,0.018678262,0.540622735,1.197788646,2.666279494,4.157296395 +1.700274649,0.018453294,0.536449609,1.191367333,2.658801218,4.151387898 +1.729544916,0.01823068,0.532269414,1.184891495,2.651164528,4.145234836 +1.759319072,0.018010307,0.528080096,1.178356027,2.64335625,4.138815265 +1.78960579,0.01779214,0.523881787,1.171760679,2.635373993,4.132124016 +1.820413895,0.017576175,0.519675577,1.165107357,2.627220203,4.125163469 +1.851752362,0.017362391,0.515462141,1.158397052,2.618895284,4.1179328 +1.883630322,0.017150756,0.511241671,1.151629693,2.610397238,4.110427385 +1.916057061,0.016941217,0.507013823,1.144804004,2.60172131,4.102638218 +1.949042027,0.016733703,0.502777655,1.137917354,2.592859614,4.094551282 +1.982594831,0.01652812,0.498531563,1.130965596,2.583800715,4.086146857 +2.016725246,0.016324392,0.494274344,1.123945458,2.574535071,4.077408096 +2.051443218,0.016122596,0.490009552,1.116864502,2.565077919,4.068357344 +2.08675886,0.015922862,0.485742283,1.109733885,2.555452951,4.059030491 +2.122682462,0.015725319,0.481477714,1.102565069,2.54568481,4.049465143 +2.159224489,0.015530096,0.477221092,1.095369791,2.535799048,4.039700567 +2.196395588,0.015337323,0.472977719,1.088160038,2.525822079,4.029777629 +2.234206589,0.015147127,0.468752943,1.08094802,2.515781118,4.01973871 +2.272668507,0.014959595,0.464550785,1.073743003,2.505696809,4.009615925 +2.311792547,0.014774649,0.460370291,1.066542818,2.495563273,3.999399067 +2.351590109,0.014592156,0.456208683,1.059341052,2.485364609,3.989061783 +2.392072787,0.014411954,0.452062232,1.052129024,2.475079421,3.978568717 +2.433252375,0.014233851,0.447926166,1.044895551,2.464680184,3.96787443 +2.475140871,0.01405762,0.443794575,1.037626691,2.454132567,3.956922225 +2.517750478,0.013883039,0.439661592,1.030308487,2.443401831,3.945654393 +2.56109361,0.013710095,0.435527852,1.02294214,2.432488923,3.934070574 +2.605182895,0.013538849,0.43139645,1.015534664,2.421408668,3.922192884 +2.650031179,0.013369361,0.42727037,1.008092881,2.410175615,3.910043111 +2.695651526,0.013201685,0.423152457,1.000623363,2.398803867,3.897642458 +2.742057229,0.013035868,0.419045386,0.993132344,2.387306895,3.885011216 +2.789261808,0.012871936,0.414951092,0.985624376,2.375694269,3.872163441 +2.837279014,0.012709873,0.410870257,0.978101067,2.363968558,3.859101846 +2.886122837,0.01254965,0.406803028,0.970562781,2.35212936,3.845824295 +2.935807508,0.012391222,0.402749062,0.963008722,2.340173464,3.832324038 +2.986347502,0.012234528,0.398707482,0.955436816,2.328094521,3.818589129 +3.037757543,0.012079525,0.394677951,0.947846276,2.315889277,3.804612625 +3.090052609,0.011926235,0.390662259,0.940241442,2.303567011,3.790408163 +3.143247936,0.011774685,0.386662304,0.932626959,2.291137872,3.775990888 +3.197359021,0.01162489,0.382679722,0.925006891,2.278610709,3.761373905 +3.25240163,0.011476861,0.378715861,0.917384646,2.265992853,3.746567882 +3.308391799,0.011330598,0.374771739,0.909762873,2.253289862,3.731580623 +3.36534584,0.011186087,0.370848014,0.902143373,2.240505256,3.716416598 +3.423280346,0.011043307,0.36694494,0.894526989,2.227640228,3.701076439 +3.482212196,0.010902222,0.363062328,0.886913496,2.214693334,3.685556394 +3.542158559,0.010762798,0.359200084,0.879302907,2.201663724,3.669853678 +3.6031369,0.010625036,0.355359131,0.871697738,2.188556843,3.653975993 +3.665164985,0.01048893,0.351540274,0.864100246,2.175377562,3.637930136 +3.728260884,0.010354465,0.347743958,0.856511827,2.162128646,3.621719421 +3.792442981,0.010221615,0.343970228,0.848932911,2.148810465,3.605343165 +3.857729974,0.010090341,0.340218692,0.841362853,2.13542068,3.588796129 +3.924140885,0.009960591,0.336488474,0.833799811,2.121953904,3.572067915 +3.99169506,0.009832299,0.332778192,0.826240688,2.108401504,3.555142577 +4.060412183,0.009705424,0.329087383,0.818684648,2.09476056,3.538013722 +4.130312272,0.009579985,0.325417463,0.811135541,2.081040162,3.520695232 +4.201415692,0.009455998,0.321769805,0.803597149,2.067249351,3.503201 +4.27374316,0.009333472,0.318145534,0.796072671,2.053395772,3.48554265 +4.347315747,0.009212407,0.314545498,0.788564641,2.039485458,3.467729148 +4.422154888,0.009092797,0.310970239,0.781074847,2.025522598,3.449766378 +4.498282386,0.008974626,0.307419971,0.773604279,2.01150936,3.431656827 +4.57572042,0.008857878,0.303894947,0.766154026,1.997448225,3.413403533 +4.654491553,0.008742542,0.300395545,0.758725518,1.9833426,3.395011153 +4.734618732,0.008628599,0.296921829,0.751319399,1.9691939,3.376480961 +4.816125302,0.00851602,0.293473488,0.743935374,1.955001101,3.357810056 +4.89903501,0.008404762,0.2900498,0.736572104,1.940760443,3.33899082 +4.98337201,0.008294773,0.286649604,0.729227132,1.926465186,3.320010453 +5.069160874,0.00818602,0.283272445,0.721899784,1.912113271,3.300864159 +5.156426595,0.008078525,0.27991975,0.714594192,1.897715402,3.281569185 +5.245194598,0.007972314,0.276593014,0.707314692,1.883282955,3.262144073 +5.335490743,0.007867405,0.273293547,0.700065186,1.868826291,3.242605732 +5.427341339,0.007763814,0.270022458,0.69284908,1.854354575,3.222969123 +5.520773145,0.007661546,0.26678059,0.685669129,1.839875332,3.20324646 +5.615813382,0.007560589,0.263568099,0.678526333,1.825391474,3.183442004 +5.712489738,0.007460913,0.260384536,0.671420147,1.810901783,3.163552843 +5.81083038,0.007362479,0.25722906,0.664349004,1.796402291,3.143571243 +5.910863959,0.007265233,0.254100404,0.657310228,1.781885997,3.12348411 +6.012619618,0.007169116,0.250996972,0.650300274,1.767343495,3.103274047 +6.116127003,0.007074116,0.247918901,0.643320076,1.752777494,3.082944865 +6.22141627,0.006980268,0.244867869,0.636374576,1.738201713,3.062519804 +6.328518094,0.006887602,0.241845488,0.629468574,1.723629627,3.042021853 +6.437463679,0.006796148,0.238853237,0.622606556,1.709074016,3.021472934 +6.548284764,0.006705919,0.23589212,0.61579179,1.694544439,3.000889435 +6.661013637,0.006616874,0.23296107,0.609022148,1.680035687,2.980261662 +6.77568314,0.006528937,0.230057941,0.602292663,1.665534662,2.959565857 +6.892326681,0.006442021,0.227180056,0.595596945,1.651024215,2.938770897 +7.010978243,0.006356028,0.224324369,0.588927596,1.63648424,2.917840193 +7.131672395,0.006270951,0.221491045,0.582285622,1.621917867,2.89677842 +7.254444299,0.006186874,0.218683421,0.575680378,1.607351595,2.875632108 +7.379329725,0.006103887,0.215905053,0.569121854,1.592813961,2.854451778 +7.506365056,0.006022079,0.213159496,0.562620082,1.578333915,2.833289043 +7.635587303,0.005941466,0.210447704,0.556178263,1.563921483,2.812161856 +7.767034114,0.005861985,0.207767741,0.54979197,1.549565299,2.791049769 +7.900743785,0.005783552,0.205117069,0.543455151,1.5352493,2.769923738 +8.036755271,0.005706082,0.202492932,0.537161136,1.520955544,2.74875114 +8.175108198,0.005629559,0.199895122,0.530909987,1.50668504,2.727533457 +8.315842873,0.005554011,0.197324896,0.524705663,1.492449899,2.706292326 +8.459000299,0.005479461,0.194783422,0.518551891,1.478261701,2.685048581 +8.604622184,0.005405906,0.192270858,0.512449726,1.464124499,2.663809517 +8.752750953,0.005333274,0.189784965,0.506393822,1.45002407,2.642549187 +8.903429762,0.005261474,0.187322703,0.500376663,1.43593984,2.62122989 +9.05670251,0.005190418,0.18488128,0.494391361,1.421852877,2.599816698 +9.212613852,0.005120165,0.182462948,0.488444492,1.407782905,2.578345269 +9.371209211,0.005050836,0.180072349,0.482549066,1.393768413,2.556885934 +9.532534794,0.004982553,0.177714023,0.476717859,1.379847552,2.535508892 +9.696637599,0.004915307,0.175387928,0.470951396,1.366023268,2.514220016 +9.863565439,0.004848994,0.173090534,0.465240818,1.352271252,2.492974989 +10.03336694,0.004783498,0.170817919,0.459576161,1.338563785,2.471722916 +10.20609159,0.004718779,0.16856888,0.453954751,1.324894188,2.450451505 +10.38178969,0.004654853,0.166344174,0.448379169,1.311271115,2.429176801 +10.56051244,0.004591734,0.164144486,0.442851808,1.297702738,2.407914082 +10.7423119,0.004529433,0.161970379,0.437374735,1.284196347,2.386677097 +10.92724105,0.004467956,0.159822283,0.431949655,1.270758223,2.365477825 +11.11535375,0.004407307,0.157700479,0.426577869,1.257393516,2.344326224 +11.30670482,0.004347485,0.155605087,0.421260236,1.244106102,2.323229955 +11.50135001,0.004288483,0.153536047,0.415997125,1.230898441,2.302194091 +11.69934601,0.00423029,0.151493103,0.410788364,1.217771413,2.281220793 +11.90075052,0.004172889,0.149475787,0.405633196,1.204724154,2.260308975 +12.10562222,0.004116256,0.147483396,0.400530216,1.191753872,2.239453937 +12.31402078,0.004060362,0.145514974,0.395477317,1.178855656,2.218646974 +12.52600693,0.004005169,0.143569356,0.390471811,1.166022826,2.197876006 +12.74164243,0.003950666,0.141646215,0.385513277,1.153255427,2.177141591 +12.9609901,0.003896861,0.139745963,0.380603286,1.140559481,2.156455604 +13.18411384,0.003843759,0.137868917,0.375743159,1.127940294,2.13582865 +13.41107866,0.003791363,0.136015269,0.370933864,1.115402143,2.115269466 +13.64195069,0.003739672,0.13418507,0.36617598,1.102948159,2.094784672 +13.87679719,0.003688679,0.132378217,0.361469659,1.090580198,2.074378518 +14.11568657,0.003638375,0.130594439,0.356814582,1.078298705,2.054052599 +14.35868844,0.003588744,0.128833279,0.352209918,1.066102566,2.033805562 +14.60587359,0.003539766,0.127094082,0.347654277,1.053988953,2.013632779 +14.85731404,0.003491414,0.125375972,0.343145656,1.041953156,1.993526008 +15.11308304,0.003443661,0.123678061,0.338682006,1.029990289,1.973476631 +15.37325511,0.003396509,0.122000476,0.334264045,1.018103856,1.953492092 +15.63790605,0.003349968,0.120343652,0.329893326,1.006299919,1.933584804 +15.90711297,0.003304045,0.11870793,0.325571147,0.994583793,1.913765823 +16.18095428,0.003258746,0.117093554,0.321298527,0.982959952,1.894044659 +16.45950978,0.003214072,0.115500655,0.317076171,0.971431936,1.874429077 +16.74286062,0.003170022,0.113929244,0.312904444,0.960002241,1.854924881 +17.03108935,0.003126592,0.112379197,0.308783336,0.948672212,1.835535684 +17.32427995,0.003083771,0.110850243,0.304712425,0.937441921,1.816262659 +17.62251783,0.003041549,0.109342016,0.300691013,0.926310583,1.797105325 +17.92588988,0.00299992,0.107854369,0.296718999,0.915279231,1.778066742 +18.23448448,0.002958878,0.106387159,0.292796286,0.904348896,1.759149981 +18.54839155,0.002918416,0.104940103,0.288922378,0.893519377,1.740355738 +18.86770254,0.002878519,0.103512763,0.285096351,0.882789119,1.721682077 +19.19251047,0.002839169,0.102104535,0.281316807,0.872155084,1.703124152 +19.52290998,0.002800345,0.10071463,0.277581836,0.861612607,1.684673923 +19.85899733,0.002762016,0.099342064,0.273888968,0.851155254,1.666319845 +20.20087042,0.002724159,0.097985977,0.27023608,0.840777613,1.648052325 +20.54862887,0.002686778,0.096646544,0.266623881,0.830483067,1.629878984 +20.90237399,0.002649881,0.095324125,0.263053595,0.820276597,1.611810629 +21.26220884,0.002613477,0.094019016,0.259526255,0.810162601,1.593856973 +21.62823825,0.00257757,0.092731438,0.256042688,0.800144827,1.5760265 +22.00056887,0.002542164,0.09146153,0.252603486,0.790226297,1.558326304 +22.37930917,0.00250726,0.090209341,0.249208988,0.780409233,1.540761926 +22.76456949,0.002472855,0.088974823,0.245859253,0.770694967,1.523337182 +23.15646208,0.002438944,0.087757816,0.242554032,0.761083856,1.506053968 +23.55510111,0.002405521,0.086558044,0.239292741,0.751575184,1.488912061 +23.96060271,0.002372571,0.085375098,0.236074429,0.742167058,1.471908904 +24.37308504,0.002340081,0.084208429,0.232897743,0.732856303,1.455039372 +24.79266826,0.002308029,0.083057331,0.229760895,0.723638337,1.438295527 +25.21947461,0.002276397,0.081921138,0.226662196,0.714508854,1.421669934 +25.65362845,0.002245186,0.080799938,0.22360204,0.705470088,1.405168155 +26.09525625,0.002214405,0.079693994,0.2205813,0.696525782,1.388798778 +26.54448669,0.002184057,0.07860351,0.217600678,0.687679123,1.372569317 +27.00145064,0.002154147,0.077528622,0.214660683,0.678932689,1.356486089 +27.46628123,0.002124676,0.076469387,0.211761606,0.67028835,1.340554019 +27.9391139,0.00209564,0.075425666,0.208903187,0.66174622,1.324774525 +28.42008638,0.002067027,0.074397061,0.206084441,0.653304094,1.30914438 +28.90933883,0.002038822,0.073383033,0.203303989,0.644958496,1.293657781 +29.40701376,0.002011006,0.072382901,0.200560056,0.636704657,1.278306305 +29.91325618,0.001983556,0.071395837,0.197850449,0.628536458,1.263078771 +30.42821357,0.001956457,0.070421316,0.195173813,0.620450394,1.247969211 +30.95203597,0.001929713,0.069459516,0.192530735,0.612449125,1.232984038 +31.48487598,0.001903331,0.068510645,0.189921883,0.604535553,1.218130169 +32.02688884,0.001877314,0.067574858,0.187347775,0.596712097,1.203413559 +32.57823247,0.001851666,0.066652253,0.184808767,0.588980635,1.188839088 +33.13906749,0.001826386,0.065742863,0.182305029,0.581342454,1.174410445 +33.7095573,0.001801473,0.06484665,0.179836533,0.573798184,1.160129997 +34.2898681,0.001776925,0.063963498,0.17740303,0.566347741,1.145998656 +34.88016897,0.001752736,0.063093206,0.175004035,0.558990259,1.132015747 +35.48063188,0.001728899,0.062235562,0.172639026,0.551724744,1.118180319 +36.09143178,0.001705411,0.061390422,0.170307663,0.544550761,1.104492537 +36.7127466,0.001682265,0.060557572,0.168009416,0.53746725,1.09095129 +37.34475738,0.001659453,0.059736708,0.165743499,0.530472308,1.077553738 +37.98764824,0.001636964,0.058927426,0.163508846,0.523563118,1.064295158 +38.64160648,0.001614783,0.058129213,0.161304083,0.516735862,1.051168767 +39.30682262,0.001592892,0.057341438,0.159127509,0.509985638,1.038165542 +39.98349048,0.001571272,0.05656336,0.156977115,0.503306544,1.02527439 +40.67180718,0.001549915,0.055794759,0.154852334,0.496697273,1.012493535 +41.37197328,0.001528837,0.05503613,0.152754579,0.49016286,0.999834129 +42.08419275,0.00150805,0.054288009,0.150685381,0.483708703,0.98730808 +42.8086731,0.001487571,0.053550932,0.148646263,0.477340177,0.974927264 +43.54562539,0.001467414,0.05282543,0.146638736,0.471062613,0.962703485 +44.29526433,0.001447593,0.052112031,0.144664299,0.464881285,0.950648448 +45.05780833,0.001428123,0.051411222,0.142724339,0.458801115,0.938773145 +45.83347953,0.001408998,0.050722853,0.14081847,0.452821297,0.927076852 +46.62250394,0.001390196,0.050046106,0.13894445,0.44693506,0.915546602 +47.42511142,0.001371691,0.049379994,0.137099565,0.441134072,0.90416619 +48.2415358,0.001353449,0.048723365,0.135280643,0.435408511,0.892916298 +49.07201495,0.001335433,0.048074889,0.133484016,0.429746941,0.881774238 +49.91679081,0.001317603,0.047433066,0.131705541,0.424136362,0.870714054 +50.77610952,0.001299938,0.046797197,0.129943296,0.418570907,0.859724373 +51.65022141,0.001282457,0.046167941,0.128199134,0.413056855,0.84881875 +52.53938116,0.001265182,0.045546105,0.126475311,0.407601783,0.838013422 +53.44384781,0.001248137,0.044932536,0.1247742,0.402213635,0.827325404 +54.36388488,0.001231347,0.044328126,0.123098293,0.396900746,0.816772533 +55.29976041,0.001214835,0.043733715,0.121449938,0.391670972,0.806371679 +56.25174706,0.001198602,0.04314938,0.119829363,0.386525338,0.796125652 +57.22012218,0.00118264,0.042574763,0.118235594,0.381460969,0.78602922 +58.2051679,0.001166935,0.042009417,0.116667396,0.376474149,0.776075391 +59.2071712,0.001151472,0.041452795,0.115123267,0.371560272,0.76625531 +60.22642402,0.001136235,0.040904285,0.113601514,0.366714117,0.756558822 +61.26322329,0.001121216,0.040363603,0.112101363,0.361933409,0.746981827 +62.31787109,0.001106412,0.039830673,0.110622615,0.357217717,0.737524007 +63.39067467,0.00109182,0.039305374,0.109164936,0.352566175,0.728184135 +64.48194659,0.001077435,0.038787526,0.10772784,0.347977408,0.718959916 +65.59200479,0.001063251,0.038276942,0.106310817,0.343449958,0.709848866 +66.72117266,0.001049269,0.037773596,0.104913801,0.338983796,0.700851438 +67.86977918,0.001035488,0.037277478,0.103536768,0.334579016,0.691968333 +69.03815899,0.001021906,0.036788533,0.102179577,0.330235334,0.683199452 +70.22665249,0.00100852,0.036306669,0.100841978,0.325952096,0.674543917 +71.43560592,0.00099533,0.03583181,0.099523761,0.321728782,0.666001117 +72.66537152,0.000982331,0.035363875,0.098224713,0.317564844,0.65757037 +73.91630756,0.000969522,0.03490274,0.096944491,0.313459316,0.649250115 +75.1887785,0.000956897,0.03444824,0.095682641,0.309410863,0.641038008 +76.48315505,0.000944454,0.034000315,0.094439002,0.305419093,0.632933651 +77.79981432,0.000932195,0.033558987,0.093213639,0.301484336,0.624938128 +79.13913992,0.000920119,0.033124247,0.092006531,0.297606642,0.617051929 +80.50152203,0.000908224,0.032696054,0.090817567,0.293785762,0.609274918 +81.88735758,0.000896511,0.032274361,0.089646618,0.290021384,0.601606813 +83.29705033,0.000884975,0.031859092,0.088493481,0.286312951,0.594046816 +84.73101096,0.000873615,0.031450132,0.087357834,0.282659517,0.586593309 +86.18965727,0.000862426,0.03104731,0.08623921,0.279059664,0.579243675 +87.6734142,0.0008514,0.030650397,0.08513697,0.27551141,0.571994127 +89.18271404,0.000840531,0.030259103,0.084050313,0.272012249,0.564839763 +90.71799651,0.000829811,0.029873179,0.082978552,0.268560026,0.557776408 +92.27970891,0.000819246,0.029492847,0.081922299,0.265156802,0.550808626 +93.86830622,0.000808847,0.029118486,0.080882615,0.261806081,0.54394397 +95.48425127,0.000798623,0.028750422,0.079860404,0.258510857,0.53718894 +97.12801485,0.000788567,0.028388418,0.078855008,0.255269061,0.530539496 +98.80007586,0.000778664,0.028031885,0.077864797,0.25207548,0.523985057 +100.5009214,0.000768895,0.027680206,0.076888053,0.248924609,0.517514421 +102.2310471,0.000759256,0.027333225,0.075924349,0.245815117,0.511125047 +103.9909569,0.000749751,0.026991038,0.074973946,0.242747903,0.504819025 +105.7811637,0.000740381,0.026653723,0.074037069,0.239723737,0.498598164 +107.6021888,0.000731148,0.026321342,0.073113886,0.236743217,0.492463915 +109.454563,0.000722054,0.025993935,0.072204512,0.233806754,0.486417332 +111.3388258,0.000713098,0.02567152,0.071308998,0.230914551,0.48045903 +113.2555262,0.00070428,0.025354091,0.070427323,0.228066586,0.474589141 +115.2052227,0.0006956,0.025041611,0.069559392,0.225262581,0.468807271 +117.1884833,0.000687056,0.024734017,0.068705022,0.222501985,0.463112444 +119.2058857,0.000678645,0.024431208,0.067863942,0.219783948,0.457503047 +121.2580178,0.000670363,0.02413305,0.067035777,0.217107287,0.45197678 +123.3454774,0.000662205,0.023839369,0.066220042,0.214470462,0.446530585 +125.4688726,0.000654166,0.023549964,0.06541618,0.211871695,0.441160903 +127.6288221,0.000646244,0.023264783,0.064624048,0.209310546,0.435866956 +129.8259552,0.000638441,0.022983869,0.063843765,0.20678743,0.430649736 +132.060912,0.000630757,0.022707248,0.063075405,0.204302608,0.425509914 +134.3343437,0.000623192,0.022434927,0.062318986,0.201856156,0.42044777 +136.6469125,0.000615747,0.02216689,0.061574462,0.199447948,0.415463157 +138.9992922,0.000608419,0.021903094,0.060841719,0.197077634,0.410555454 +141.3921682,0.000601208,0.021643472,0.060120567,0.194744617,0.405723527 +143.8262377,0.000594109,0.021387926,0.059410735,0.192448035,0.40096568 +146.3022097,0.00058712,0.021136325,0.058711861,0.19018673,0.396279598 +148.8208056,0.000580236,0.020888504,0.058023485,0.187959229,0.391662301 +151.3827591,0.000573453,0.020644307,0.057345173,0.185764137,0.387110973 +153.9888168,0.00056677,0.020403736,0.056676934,0.183601499,0.382625788 +156.6397379,0.00056019,0.020166827,0.056018864,0.181471637,0.378207499 +159.3362945,0.000553711,0.019933598,0.055371014,0.179374728,0.373856551 +162.0792725,0.000547335,0.019704048,0.054733386,0.177310789,0.36957305 +164.8694709,0.00054106,0.01947816,0.054105928,0.175279659,0.365356728 +167.7077027,0.000534886,0.019255893,0.053488525,0.17328098,0.361206911 +170.5947946,0.000528811,0.019037181,0.052881,0.171314183,0.357122474 +173.5315879,0.000522832,0.018821936,0.052283102,0.169378467,0.353101804 +176.5189382,0.000516946,0.01861006,0.051694563,0.167472966,0.349143156 +179.5577158,0.000511153,0.018401524,0.051115303,0.165597432,0.345246064 +182.648806,0.000505453,0.018196307,0.05054526,0.163751672,0.34141018 +185.7931094,0.000499844,0.017994367,0.049984318,0.161935314,0.337634778 +188.991542,0.000494323,0.017795639,0.0494323,0.160147789,0.333918713 +192.2450358,0.00048889,0.017600035,0.048888959,0.158388307,0.330260387 +195.5545385,0.00048354,0.017407442,0.048353979,0.156655845,0.326657708 +198.9210144,0.00047827,0.017217715,0.047826963,0.154949123,0.323108044 +202.3454442,0.000473076,0.01703074,0.047307591,0.153267111,0.319609286 +205.8288257,0.000467959,0.016846534,0.046795909,0.151609957,0.316161778 +209.3721737,0.00046292,0.016665124,0.046291995,0.149977924,0.312766102 +212.9765204,0.000457959,0.016486528,0.045795897,0.148371165,0.30942261 +216.6429161,0.000453076,0.016310749,0.045307623,0.146789713,0.306131402 +220.3724289,0.000448272,0.016137776,0.044827143,0.14523347,0.3028923 +224.1661453,0.000443544,0.01596758,0.044354379,0.143702192,0.299704824 +228.0251707,0.000438893,0.015800145,0.043889282,0.14219572,0.296568668 +231.9506293,0.000434319,0.015635491,0.04343191,0.140714243,0.293484251 +235.9436647,0.000429823,0.015473632,0.042982303,0.139257896,0.290451877 +240.0054403,0.000425405,0.015314571,0.042540467,0.137826698,0.287471609 +244.1371395,0.000421064,0.015158294,0.042106367,0.13642054,0.284543239 +248.3399659,0.000416799,0.015004775,0.041679926,0.13503917,0.281666264 +252.6151442,0.00041261,0.014853966,0.04126101,0.133682164,0.278839815 +256.9639197,0.000408494,0.014705791,0.040849416,0.132348856,0.276062524 +261.3875595,0.000404449,0.014560156,0.040444873,0.131038376,0.27333259 +265.8873523,0.000400471,0.014416938,0.040047047,0.129749639,0.270647767 +270.4646092,0.000396555,0.014275992,0.03965553,0.128481329,0.268005324 +275.1206637,0.000392699,0.014137148,0.039269852,0.127231922,0.265402096 +279.8568722,0.000388898,0.014000327,0.038889794,0.126000711,0.26283662 +284.6746147,0.000385154,0.013865559,0.038515439,0.124787961,0.260309465 +289.5752947,0.000381469,0.013732871,0.038146862,0.123593924,0.257821163 +294.5603401,0.000377841,0.013602283,0.037784119,0.122418775,0.255372092 +299.6312031,0.000374272,0.013473806,0.037427238,0.121262608,0.252962461 +304.7893612,0.000370763,0.013347452,0.037076253,0.120125537,0.250592516 +310.036317,0.000367312,0.013223239,0.036731218,0.119007735,0.248262624 +315.3735994,0.000363922,0.013101179,0.036392164,0.117909301,0.245973004 +320.8027631,0.000360591,0.012981274,0.036059093,0.116830246,0.243723688 +326.3253901,0.00035732,0.012863513,0.035731979,0.115770484,0.2415145 +331.9430892,0.000354108,0.012747874,0.03541076,0.114729817,0.239345039 +337.6574971,0.000350953,0.012634323,0.035095341,0.113707933,0.237214658 +343.4702787,0.000347856,0.01252281,0.034785583,0.112704387,0.235122435 +349.3831274,0.000344813,0.012413271,0.034481307,0.111718598,0.233067166 +355.397766,0.000341824,0.012305656,0.034182376,0.110750122,0.231047929 +361.5159467,0.000338887,0.012199948,0.033888744,0.109798808,0.229064415 +367.7394521,0.000336003,0.012096123,0.033600342,0.108864436,0.22711617 +374.0700952,0.000333171,0.011994144,0.033317068,0.107946675,0.225202507 +380.5097205,0.000330388,0.011893962,0.033038782,0.107045073,0.223322489 +387.0602041,0.000327653,0.01179551,0.032765304,0.106159046,0.221474903 +393.7234544,0.000324964,0.011698708,0.03249641,0.105287867,0.219658234 +400.5014127,0.000322318,0.011603462,0.032231838,0.104430689,0.217870717 +407.3960537,0.000319715,0.011509739,0.031971497,0.103587217,0.216111744 +414.4093862,0.000317155,0.01141757,0.031715473,0.102757728,0.214381893 +421.5434533,0.000314638,0.011326984,0.031463845,0.10194248,0.212681708 +428.8003335,0.000312167,0.011238004,0.031216678,0.101141686,0.211011634 +436.1821411,0.00030974,0.011150648,0.030974022,0.100355506,0.20937201 +443.6910267,0.000307359,0.011064928,0.03073591,0.099584045,0.207763054 +451.3291779,0.000305024,0.010980847,0.030502353,0.09882734,0.20618485 +459.0988201,0.000302733,0.010898398,0.030273328,0.098085317,0.204637242 +467.0022169,0.000300488,0.01081756,0.030048777,0.097357789,0.203119843 +475.0416708,0.000298286,0.010738301,0.029828613,0.096644474,0.20163207 +483.2195241,0.000296127,0.010660579,0.029612719,0.095944994,0.200173131 +491.5381593,0.000294009,0.01058434,0.029400944,0.095258856,0.198742002 +500,0.000291931,0.010509518,0.029193104,0.09458547,0.197337454 diff --git a/hadrons/data_LET/stopping_power_proton.dat b/hadrons/utils/data_LET/stopping_power_proton.dat similarity index 100% rename from hadrons/data_LET/stopping_power_proton.dat rename to hadrons/utils/data_LET/stopping_power_proton.dat diff --git a/hadrons/data_LET/stopping_power_water.csv b/hadrons/utils/data_LET/stopping_power_water.csv similarity index 98% rename from hadrons/data_LET/stopping_power_water.csv rename to hadrons/utils/data_LET/stopping_power_water.csv index a3702d3..bcc68c4 100644 --- a/hadrons/data_LET/stopping_power_water.csv +++ b/hadrons/utils/data_LET/stopping_power_water.csv @@ -1,504 +1,504 @@ -# Provided by Libamtrack ,,,,, -# Generated: 15/3/2022 @ 13:4:33,,,,, -# Stopping power,,,,, -E_MeV_u,proton_LET_keV_um,carbon_LET_keV_um,neon_LET_keV_um,argon_LET_keV_um,iron_LET_keV_um -0.1,81.52953386,754.2666061,1228.77141,2051.885718,2772.055983 -0.101721502,81.34473522,757.7072003,1235.803703,2065.642457,2791.917662 -0.10347264,81.14575128,761.0469468,1242.69596,2079.20501,2811.544411 -0.105253924,80.93243091,764.2817784,1249.441196,2092.561413,2830.919977 -0.107065873,80.70464862,767.4077669,1256.032614,2105.699968,2850.028428 -0.108909014,80.46230722,770.421156,1262.46366,2118.609327,2868.854277 -0.110783886,80.20534079,773.318397,1268.728083,2131.278599,2887.382619 -0.112691033,79.93371781,776.0961878,1274.820001,2143.697457,2905.599285 -0.114631011,79.64744449,778.7515158,1280.733969,2155.856266,2923.491008 -0.116604387,79.3465684,781.2817055,1286.465066,2167.746219,2941.045615 -0.118611734,79.03118226,783.6844692,1292.008978,2179.359485,2958.252232 -0.120653638,78.7014281,785.9579636,1297.362094,2190.689381,2975.101512 -0.122730693,78.35750158,788.1008509,1302.521612,2201.730553,2991.58589 -0.124843505,77.99965979,790.1123964,1307.485706,2212.479262,3007.699977 -0.126992689,77.6283552,791.9938589,1312.255836,2222.937307,3023.445898 -0.129178871,77.24430449,793.7492692,1316.838057,2233.114281,3038.836381 -0.131402688,76.8483458,795.3840546,1321.240768,2243.023782,3053.889626 -0.133664788,76.4414356,796.9050555,1325.474753,2252.68351,3068.629454 -0.13596583,76.02465783,798.3206721,1329.55344,2262.115732,3083.085953 -0.138306485,75.59923369,799.6410233,1333.493187,2271.347796,3097.296195 -0.140687435,75.16653202,800.8781182,1337.313587,2280.412676,3111.305004 -0.143109372,74.72808034,802.0460415,1341.037798,2289.34958,3125.165803 -0.145573003,74.28557662,803.1611532,1344.692907,2298.204596,3138.941527 -0.148079046,73.84090177,804.2423049,1348.310321,2307.031409,3152.705622 -0.15062823,73.3959923,805.3095293,1351.92359,2315.887627,3166.537061 -0.153221298,72.95152109,806.3694957,1355.543984,2324.792907,3180.463071 -0.155859007,72.50734882,807.4200336,1359.167951,2333.741552,3194.476239 -0.158542123,72.06329522,808.4584528,1362.791043,2342.726301,3208.566994 -0.161271429,71.61914621,809.4816063,1366.408016,2351.738486,3222.72382 -0.164047721,71.17465102,810.4858411,1370.012739,2360.767874,3236.933031 -0.166871806,70.72951903,811.4669445,1373.598099,2369.802488,3251.178518 -0.169744508,70.28341646,812.4200864,1377.155893,2378.828409,3265.441478 -0.172666664,69.83596283,813.3397565,1380.676715,2387.829572,3279.700112 -0.175639124,69.38675828,814.2200615,1384.150453,2396.788604,3293.930778 -0.178662756,68.93571253,815.0586024,1387.572881,2405.698256,3308.123695 -0.181738439,68.48295149,815.8554975,1390.944037,2414.558637,3322.279191 -0.184867071,68.02861002,816.6109917,1394.264173,2423.370225,3336.398099 -0.188049561,67.57282859,817.325421,1397.533693,2432.133769,3350.481625 -0.191286839,67.1157534,817.999218,1400.753167,2440.850298,3364.53137 -0.194579846,66.65753644,818.632916,1403.923335,2449.521151,3378.54936 -0.197929543,66.19833559,819.2271543,1407.045123,2458.147985,3392.538071 -0.201336904,65.73830146,819.7825185,1410.119365,2466.732309,3406.499775 -0.204802924,65.27750446,820.2986214,1413.14522,2475.272701,3420.432704 -0.208328611,64.81597693,820.7745997,1416.121017,2483.766274,3434.333058 -0.211914993,64.35374264,821.2094713,1419.044866,2492.209736,3448.196468 -0.215563114,63.89081578,821.6021197,1421.91463,2500.59934,3462.017924 -0.219274038,63.42719989,821.9512747,1424.727888,2508.930814,3475.791674 -0.223048846,62.96288663,822.255492,1427.481895,2517.199293,3489.511131 -0.226888637,62.49786848,822.5133132,1430.173865,2525.399802,3503.169535 -0.23079453,62.03219088,822.7239591,1432.802168,2533.529383,3516.762911 -0.234767663,61.56591144,822.8868109,1435.365442,2541.585532,3530.287898 -0.238809194,61.09908136,823.0011674,1437.862167,2549.565442,3543.740709 -0.2429203,60.63174459,823.0662303,1440.290638,2557.465961,3557.117063 -0.247102178,60.16393683,823.0810879,1442.648938,2565.283533,3570.412102 -0.251356048,59.69568648,823.044724,1444.934946,2573.014217,3583.620423 -0.255683148,59.22702747,822.9561932,1447.146648,2580.654234,3596.736825 -0.260084739,58.75799175,822.8145184,1449.281958,2588.199644,3609.755872 -0.264562104,58.2886013,822.6185785,1451.338513,2595.645991,3622.671386 -0.269116547,57.81886692,822.3670857,1453.313638,2602.988221,3635.476337 -0.273749394,57.34878712,822.0585638,1455.2043,2610.220602,3648.162726 -0.278461996,56.87837432,821.6917206,1457.007765,2617.337903,3660.723226 -0.283255726,56.4076931,821.2660126,1458.722608,2624.337203,3673.153722 -0.28813198,55.93681025,820.7809425,1460.347467,2631.215676,3685.450213 -0.293092179,55.46578563,820.2359263,1461.880814,2637.970165,3697.608224 -0.298137767,54.99467128,819.6302768,1463.320918,2644.597124,3709.622714 -0.303270216,54.52353293,818.9635232,1464.666418,2651.093644,3721.489519 -0.308491019,54.05249824,818.2361503,1465.917649,2657.459867,3733.208745 -0.313801699,53.58170685,817.4488741,1467.075359,2663.696673,3744.781531 -0.319203803,53.11129784,816.602458,1468.14038,2669.805093,3756.209226 -0.324698904,52.64140922,815.6977059,1469.113614,2675.786289,3767.493367 -0.330288603,52.17217736,814.7354547,1469.996028,2681.64153,3778.635641 -0.335974529,51.70373637,813.716565,1470.78863,2687.372168,3789.63785 -0.341758338,51.23621743,812.6419111,1471.492454,2692.9796,3800.501864 -0.347641716,50.76974805,811.5123688,1472.10854,2698.465232,3811.229567 -0.353626376,50.30443272,810.3285032,1472.637366,2703.82944,3821.821388 -0.359714062,49.84030592,809.0897933,1473.077427,2709.06895,3832.27259 -0.365906548,49.37737401,807.7952742,1473.426395,2714.178937,3842.57622 -0.372205637,48.91562541,806.4436888,1473.681385,2719.153509,3852.723788 -0.378613166,48.45502881,805.0334466,1473.838873,2723.985544,3862.705026 -0.385131,47.99553114,803.5625775,1473.894608,2728.666519,3872.507639 -0.391761039,47.53705547,802.0286833,1473.843513,2733.186309,3882.117012 -0.398505215,47.07949929,800.428893,1473.679598,2737.533017,3891.515953 -0.405365491,46.62281525,798.7612292,1473.39847,2741.697618,3900.691298 -0.412343867,46.16710417,797.0262502,1473.000381,2745.679681,3909.642061 -0.419442376,45.7124808,795.2248132,1472.486133,2749.479781,3918.368687 -0.426663087,45.25905431,793.3577428,1471.856467,2753.098374,3926.871439 -0.434008101,44.80692732,791.4258123,1471.11203,2756.535727,3935.150307 -0.441479561,44.35619494,789.4297229,1470.253332,2759.791843,3943.204894 -0.449079642,43.90694367,787.3700812,1469.280705,2762.866378,3951.034298 -0.456810558,43.45925222,785.2474093,1468.194319,2765.758669,3958.637149 -0.464674562,43.0131916,783.0621423,1466.994178,2768.46772,3966.01159 -0.472673946,42.56882122,780.8145528,1465.679975,2770.99193,3973.154877 -0.480811038,42.12618718,778.5047129,1464.251018,2773.328943,3980.063167 -0.489088212,41.6853208,776.1324581,1462.706156,2775.475508,3986.731307 -0.497507876,41.24623718,773.6973518,1461.043713,2777.427332,3993.152622 -0.506072486,40.80902939,771.2004542,1459.264823,2779.185435,3999.328047 -0.514784535,40.37402111,768.6472842,1457.379081,2780.766971,4005.281751 -0.523646563,39.94158677,766.0445333,1455.39838,2782.193609,4011.044489 -0.532661151,39.51211886,763.3994731,1453.335811,2783.489459,4016.65065 -0.541830925,39.08602866,760.7199844,1451.205731,2784.681233,4022.138498 -0.551158556,38.66372301,758.0141181,1449.022935,2785.796681,4027.547938 -0.560646764,38.24523484,755.2827985,1446.788686,2786.837691,4032.881594 -0.570298311,37.83025219,752.5201337,1444.491172,2787.780923,4038.105554 -0.580116009,37.41839522,749.7187187,1442.115566,2788.597021,4043.17705 -0.59010272,37.00921961,746.8696534,1439.644036,2789.250563,4048.044339 -0.600261351,36.60223079,743.9627841,1437.056171,2789.700843,4052.647788 -0.610594864,36.19735474,740.9963028,1434.347542,2789.937898,4056.972234 -0.621106269,35.79501454,737.9786308,1431.533519,2789.990269,4061.058483 -0.631798628,35.39568259,734.9194851,1428.63212,2789.891875,4064.955331 -0.642675056,34.99985948,731.8294748,1425.663249,2789.680592,4068.71753 -0.653738722,34.60801614,728.7189056,1422.646386,2789.393757,4072.399259 -0.664992849,34.22019428,725.5892878,1419.583969,2789.035519,4076.006406 -0.676440716,33.83620373,722.4372347,1416.468854,2788.59119,4079.51732 -0.688085658,33.45580768,719.2582747,1413.2917,2788.041619,4082.903725 -0.699931069,33.07872285,716.0468189,1410.040885,2787.36298,4086.130364 -0.711980398,32.70470578,712.798008,1406.70612,2786.533887,4089.16541 -0.724237157,32.33357235,709.5081691,1403.279375,2785.53724,4091.983193 -0.736704916,31.96510307,706.1727668,1399.750834,2784.352242,4094.552485 -0.749387309,31.59904699,702.7864648,1396.109004,2782.954563,4096.836717 -0.762288028,31.23558164,699.3533993,1392.361144,2781.357117,4098.854042 -0.775410834,30.87549526,695.891606,1388.542315,2779.628566,4100.704916 -0.78875955,30.51967816,692.4219351,1384.693513,2777.850057,4102.508662 -0.802338063,30.16901028,688.9655617,1380.856751,2776.105469,4104.389149 -0.816150332,29.82334356,685.5205854,1377.028066,2774.386769,4106.334749 -0.830200378,29.48169181,682.0656571,1373.164303,2772.606719,4108.216419 -0.844492297,29.14292109,678.5754277,1369.21385,2770.660198,4109.878022 -0.859030251,28.806103,675.0287176,1365.133057,2768.457311,4111.185328 -0.873818477,28.4713172,671.4275945,1360.925002,2766.002327,4112.143485 -0.888861282,28.13886124,667.7793745,1356.603449,2763.321313,4112.790094 -0.904163049,27.80906219,664.092285,1352.184147,2760.444598,4113.169265 -0.919728237,27.48241294,660.378762,1347.691574,2757.42064,4113.352332 -0.93556138,27.15952192,656.6543565,1343.156806,2754.311846,4113.431784 -0.95166709,26.84100099,652.9350926,1338.612173,2751.183757,4113.505213 -0.968050061,26.52678885,649.2209089,1334.057251,2748.035032,4113.570536 -0.984715065,26.21617264,645.4956914,1329.458551,2744.796044,4113.523326 -1.001666958,25.90835145,641.7407494,1324.776956,2741.384883,4113.240227 -1.018910678,25.60297992,637.9482967,1319.995552,2737.764928,4112.665325 -1.036451248,25.30015143,634.1213683,1315.11971,2733.945542,4111.81159 -1.05429378,24.99996775,630.2632925,1310.155465,2729.937542,4110.694233 -1.072443472,24.70252322,626.3772961,1305.108697,2725.751521,4109.328182 -1.090905611,24.40790374,622.4664721,1299.985064,2721.397692,4107.727856 -1.109685576,24.11618565,618.5337436,1294.789923,2716.885728,4105.906917 -1.128788839,23.82743451,614.5818255,1289.528249,2712.22458,4103.877984 -1.148220965,23.54170382,610.6131827,1284.204539,2707.422269,4101.652326 -1.167987615,23.25903365,606.629984,1278.82271,2702.485663,4099.239506 -1.188094549,22.97944913,602.6340526,1273.385991,2697.420229,4096.646994 -1.208547624,22.70295888,598.6268127,1267.896799,2692.229757,4093.87974 -1.229352799,22.42955324,594.6092315,1262.356606,2686.916058,4090.939696 -1.250516136,22.15920395,590.5817949,1256.765878,2681.478807,4087.82556 -1.2720438,21.89189742,586.5453875,1251.125939,2675.91951,4084.538804 -1.293942063,21.62763896,582.5014137,1245.439241,2670.242097,4081.084612 -1.316217305,21.36641764,578.4508617,1239.707372,2664.448679,4077.465392 -1.338876016,21.1082029,574.3941969,1233.930816,2658.539,4073.679934 -1.361924798,20.85294254,570.3312944,1228.108794,2652.510077,4069.722825 -1.385370365,20.60056071,566.2613677,1222.239097,2646.355791,4065.583804 -1.409219547,20.35095573,562.1828908,1216.3179,2640.066455,4061.247051 -1.433479294,20.10399765,558.0935155,1210.339563,2633.628332,4056.690417 -1.458156673,19.85952582,553.9899817,1204.296415,2627.023116,4051.88458 -1.483258874,19.61734614,549.8680219,1198.178523,2620.227367,4046.792119 -1.50879321,19.37726012,545.7231574,1191.975404,2613.216202,4041.373172 -1.534767119,19.13927256,541.5565726,1185.688882,2605.991528,4035.629138 -1.561188171,18.90348317,537.3721695,1179.326769,2598.568468,4029.581898 -1.588064061,18.66998806,533.1738152,1172.896882,2590.962306,4023.253696 -1.61540262,18.43887858,528.9653055,1166.406962,2583.188314,4016.666861 -1.643211813,18.21024061,524.7503387,1159.864616,2575.261619,4009.84361 -1.671499743,17.98415373,520.5324865,1153.277252,2567.197059,4002.80582 -1.700274649,17.76069033,516.3151642,1146.652007,2559.00902,3995.574774 -1.729544916,17.53991473,512.1015962,1139.995667,2550.711256,3988.170875 -1.759319072,17.32187842,507.8946728,1133.314346,2542.316152,3980.612489 -1.78960579,17.10659188,503.6961081,1126.611592,2533.830452,3972.90923 -1.820413895,16.89403545,499.5067374,1119.889023,2525.25662,3965.064042 -1.851752362,16.68417134,495.3268525,1113.147058,2516.594439,3957.075659 -1.883630322,16.47694195,491.156142,1106.384767,2507.840633,3948.937988 -1.916057061,16.27226805,486.9936226,1099.599704,2498.988448,3940.639404 -1.949042027,16.07004675,482.8375673,1092.787721,2490.027186,3932.161984 -1.982594831,15.87014943,478.6854271,1085.942775,2480.941709,3923.480673 -2.016725246,15.67244666,474.5345733,1079.058594,2471.716196,3914.569176 -2.051443218,15.47691181,470.3854445,1072.135845,2462.350606,3905.426068 -2.08675886,15.28354084,466.2391606,1065.176767,2452.848516,3896.055653 -2.122682462,15.09231587,462.0964184,1058.182662,2443.211384,3886.458881 -2.159224489,14.9032038,457.957442,1051.153765,2433.438223,3876.632802 -2.196395588,14.71615487,453.8219283,1044.089113,2423.525254,3866.569991 -2.234206589,14.53110109,449.68899,1036.986393,2413.465529,3856.257901 -2.272668507,14.34797896,445.5578502,1029.843537,2403.252602,3845.684709 -2.311792547,14.1667924,441.429808,1022.663279,2392.891195,3834.85641 -2.351590109,13.98755274,437.3063951,1015.448924,2382.387442,3823.781292 -2.392072787,13.8102603,433.1888027,1008.20303,2371.74578,3812.464959 -2.433252375,13.63490326,429.0778391,1000.927293,2360.968676,3800.90987 -2.475140871,13.46145647,424.9738849,993.6224337,2350.05633,3789.114837 -2.517750478,13.28989728,420.877389,986.2893509,2339.00937,3777.079348 -2.56109361,13.12029152,416.7915984,978.9355336,2327.844115,3764.828258 -2.605182895,12.95273824,412.7208412,971.5710934,2316.583325,3752.397004 -2.650031179,12.787335,408.6694313,964.2062101,2305.250179,3739.821915 -2.695651526,12.62417739,404.6416512,956.8510889,2293.868181,3727.140071 -2.742057229,12.46335762,400.6417027,949.5158443,2282.460879,3714.388851 -2.789261808,12.30488324,396.6710839,942.2042663,2271.036847,3701.581456 -2.837279014,12.14860449,392.7262004,934.9080617,2259.575555,3688.683661 -2.886122837,11.99432823,388.8019883,927.615365,2248.047604,3675.646519 -2.935807508,11.84182886,384.8922519,920.3115062,2236.416469,3662.409101 -2.986347502,11.6908461,380.9895792,912.9787798,2224.637841,3648.897328 -3.037757543,11.54119017,377.0887662,905.6046377,2212.679547,3635.056575 -3.090052609,11.39289423,373.1918427,898.1938444,2200.551493,3620.901107 -3.143247936,11.24602152,369.3018326,890.7536151,2188.269729,3606.455404 -3.197359021,11.10063265,365.4216888,883.2910674,2175.85026,3591.744021 -3.25240163,10.95678518,361.5542761,875.8131776,2163.308935,3576.791412 -3.308391799,10.81453313,357.7023529,868.3267344,2150.661327,3561.621729 -3.36534584,10.67392648,353.8685522,860.838288,2137.922603,3546.258607 -3.423280346,10.5350106,350.0553597,853.3540947,2125.107385,3530.724923 -3.482212196,10.39782563,346.2650913,845.8800564,2112.229581,3515.042521 -3.542158559,10.26239863,342.4996268,838.4210653,2099.300742,3499.229453 -3.6031369,10.12873092,338.7599821,830.9799414,2086.327357,3483.295443 -3.665164985,9.9968109,335.0467291,823.558444,2073.313332,3467.245956 -3.728260884,9.866615679,331.3600446,816.1573796,2060.260226,3451.082565 -3.792442981,9.738109948,327.6996696,808.7764919,2047.166939,3434.802395 -3.857729974,9.611244827,324.0648657,801.4143431,2034.029379,3418.397523 -3.924140885,9.485956623,320.4543693,794.0681879,2020.840097,3401.854328 -3.99169506,9.36216628,316.8663683,786.733904,2007.588067,3385.153066 -4.060412183,9.239823773,313.3000033,779.4097129,1994.268159,3368.283826 -4.130312272,9.118937756,309.7563846,772.0987377,1980.887782,3351.257845 -4.201415692,8.99951537,306.2365612,764.8039805,1967.454132,3334.086079 -4.27374316,8.881555814,302.7413017,757.5277698,1953.972766,3316.77678 -4.347315747,8.765049536,299.2710636,750.2716787,1940.447364,3299.335064 -4.422154888,8.649977371,295.8259612,743.036435,1926.879474,3281.762459 -4.498282386,8.536310293,292.4057548,735.8218862,1913.268388,3264.056661 -4.57572042,8.424029747,289.0105452,728.6287422,1899.615661,3246.219216 -4.654491553,8.313133354,285.640973,721.4590861,1885.926472,3228.257896 -4.734618732,8.203611855,282.2974292,714.3143894,1872.204472,3210.177907 -4.816125302,8.095446888,278.9799771,707.1953072,1858.451222,3191.980914 -4.89903501,7.988610119,275.6883198,700.1015886,1844.665935,3173.664551 -4.98337201,7.883062517,272.4217728,693.0319985,1830.845233,3155.221986 -5.069160874,7.778776276,269.1800207,685.9862373,1816.9882,3136.650593 -5.156426595,7.675757157,265.9638942,678.9669319,1803.101702,3117.961196 -5.245194598,7.574008943,262.774144,671.9765269,1789.192213,3099.164019 -5.335490743,7.473528318,259.6112632,665.0168256,1775.264579,3080.266544 -5.427341339,7.374304157,256.4754605,658.0889163,1761.321805,3061.273108 -5.520773145,7.276317984,253.3666746,651.1932028,1747.365107,3042.184976 -5.615813382,7.179555883,250.2849882,644.3304632,1733.39674,3023.005241 -5.712489738,7.084004031,247.2304729,637.5014542,1719.418944,3003.737001 -5.81083038,6.989640147,244.2028911,630.7061388,1705.431853,2984.3797 -5.910863959,6.896432557,241.2016613,623.9435916,1691.433211,2964.928602 -6.012619618,6.80434176,238.2259118,617.21213,1677.418704,2945.37533 -6.116127003,6.713357197,235.2757682,610.5126492,1663.391011,2925.723768 -6.22141627,6.623493397,232.3522235,603.8483046,1649.359036,2905.988801 -6.328518094,6.534760788,229.4561175,597.2218723,1635.330748,2886.183779 -6.437463679,6.447164296,226.5880869,590.6356147,1621.312805,2866.31984 -6.548284764,6.360701324,223.748493,584.091088,1607.310005,2846.404909 -6.661013637,6.27535422,220.9371556,577.5884405,1593.323322,2826.440206 -6.77568314,6.191094082,218.1534853,571.126747,1579.350792,2806.421738 -6.892326681,6.107882561,215.3965447,564.7041643,1565.387899,2786.340962 -7.010978243,6.025674102,212.6651277,558.3181299,1551.428099,2766.185676 -7.131672395,5.944470017,209.9596679,551.9703764,1537.476769,2745.964894 -7.254444299,5.864317427,207.2822082,545.6668804,1523.551199,2725.709023 -7.379329725,5.785264226,204.6348137,539.4137057,1509.669106,2705.449456 -7.506365056,5.707354725,202.019417,533.2165953,1495.847488,2685.216517 -7.635587303,5.630574688,199.4358713,527.0758213,1482.088128,2665.013395 -7.767034114,5.554845245,196.881727,520.9855586,1468.375652,2644.812404 -7.900743785,5.480070671,194.3539196,514.9383179,1454.689851,2624.576964 -8.036755271,5.406148657,191.849133,508.9259013,1441.00833,2604.266315 -8.175108198,5.333049882,189.3666252,502.9469029,1427.327782,2583.873987 -8.315842873,5.260786619,186.9071208,497.0038073,1413.65595,2563.41352 -8.459000299,5.189367943,184.4712234,491.0987849,1399.999764,2542.897092 -8.604622184,5.118818712,182.0600905,485.2354881,1386.370468,2522.344821 -8.752750953,5.049209828,179.6765113,479.4219362,1372.79192,2501.799967 -8.903429762,4.980621694,177.3236105,473.6670741,1359.290856,2481.311349 -9.05670251,4.91311886,175.0039448,467.9783616,1345.889983,2460.920752 -9.212613852,4.846636261,172.715448,462.3509067,1332.576605,2440.605417 -9.371209211,4.781040855,170.4536177,456.77326,1319.318981,2420.307501 -9.532534794,4.716189961,168.2135912,451.2329512,1306.082144,2399.962868 -9.696637599,4.65204198,165.9940968,445.7270951,1292.858643,2379.557622 -9.863565439,4.588627691,163.7964372,440.2597093,1279.661039,2359.114682 -10.03336694,4.525977564,161.6218988,434.8347782,1266.501911,2338.657173 -10.20609159,4.464113454,159.4714554,429.4554534,1253.391518,2318.204094 -10.38178969,4.403049967,157.345816,424.1241786,1240.338141,2297.77092 -10.56051244,4.342798561,155.2455715,418.8430801,1227.3492,2277.371647 -10.7423119,4.283367284,153.1711848,413.613939,1214.431166,2257.018607 -10.92724105,4.224760406,151.1229777,408.4381534,1201.589437,2236.72223 -11.11535375,4.166978023,149.1011164,403.316698,1188.828201,2216.490775 -11.30670482,4.110015629,147.1055966,398.2500801,1176.150304,2196.33005 -11.50135001,4.053863667,145.1362268,393.2382933,1163.557086,2176.243108 -11.69934601,3.998507036,143.1926111,388.2807679,1151.04823,2156.229919 -11.90075052,3.943924574,141.2741301,383.3763176,1138.621579,2136.287021 -12.10562222,3.890088496,139.3799209,378.5230828,1126.272955,2116.407139 -12.31402078,3.836963802,137.508856,373.7184702,1113.995958,2096.578787 -12.52600693,3.784509742,135.6595954,368.959293,1101.78237,2076.78699 -12.74164243,3.732711877,133.8317366,364.2448982,1089.631489,2057.030886 -12.9609901,3.681578966,132.025704,359.5768753,1077.549327,2037.322316 -13.18411384,3.631117692,130.2418429,354.9565953,1065.541279,2017.672039 -13.41107866,3.581331594,128.480382,350.3851061,1053.611805,1998.089115 -13.64195069,3.532220741,126.7414212,345.8630987,1041.764311,1978.580674 -13.87679719,3.483781378,125.0249192,341.3908715,1030.00104,1959.151683 -14.11568657,3.436005548,123.3306797,336.9682917,1018.322937,1939.80468 -14.35868844,3.388880686,121.6583368,332.5947545,1006.729518,1920.539503 -14.60587359,3.342389184,120.0073397,328.2691392,995.2187241,1901.352988 -14.85731404,3.296507932,118.3769359,323.989762,983.7867655,1882.238651 -15.11308304,3.251213243,116.7663486,319.7548601,972.4295807,1863.189462 -15.37325511,3.206505505,115.1756616,315.5650177,961.1502238,1844.212012 -15.63790605,3.162392093,113.6052068,311.4214916,949.9538108,1825.316904 -15.90711297,3.118877784,112.0552198,307.325269,938.8446562,1806.513266 -16.18095428,3.075964472,110.5258295,303.2770389,927.8261772,1787.808558 -16.45950978,3.033650871,109.0170481,299.2771617,916.9007934,1769.208366 -16.74286062,2.991932195,107.5287589,295.3256373,906.06982,1750.716178 -17.03108935,2.950799815,106.0607044,291.4220703,895.3333529,1732.333147 -17.32427995,2.910240891,104.612473,287.5656332,884.690146,1714.057842 -17.62251783,2.87024043,103.1835734,283.7552689,874.1382268,1695.887417 -17.92588988,2.830793582,101.7738761,279.9909072,863.6786419,1677.824883 -18.23448448,2.791897478,100.3833206,276.2726596,853.3129923,1659.874348 -18.54839155,2.753545859,99.01172239,272.6002886,843.041794,1642.037836 -18.86770254,2.715728742,97.65876096,268.9731742,832.8643657,1624.315048 -19.19251047,2.678432069,96.32396706,265.3902783,822.7787128,1606.703123 -19.52290998,2.641637329,95.00670932,261.8501071,812.7814017,1589.196376 -19.85899733,2.605321159,93.70617991,258.3506712,802.8674271,1571.786017 -20.20087042,2.569463046,92.42167165,254.8902493,793.0325801,1554.46478 -20.54862887,2.534066631,91.15334433,251.4695029,783.2800404,1537.239863 -20.90237399,2.499139747,89.90150708,248.0894997,773.614255,1520.120997 -21.26220884,2.464688382,88.66640128,244.7511153,764.0390752,1503.11679 -21.62823825,2.430716477,87.44819321,241.4550121,754.5576886,1486.234584 -22.00056887,2.397225706,86.24696631,238.2016181,745.1725457,1469.480303 -22.37930917,2.364215241,85.06271264,234.9911028,735.8852815,1452.85829 -22.76456949,2.331681498,83.89532396,231.8233526,726.6966319,1436.371128 -23.15646208,2.299617871,82.74458201,228.6979431,717.6063443,1420.019455 -23.55510111,2.26801444,81.61014815,225.6141109,708.6130815,1403.801757 -23.96060271,2.236857662,80.49155229,222.5707224,699.7143197,1387.714162 -24.37308504,2.206130043,79.38818104,219.5662408,690.9062394,1371.750201 -24.79266826,2.175809781,78.29926497,216.598691,682.1836086,1355.900568 -25.21947461,2.145876485,77.2240845,213.6662285,673.5415721,1340.156664 -25.65362845,2.116332432,76.16273483,210.7692571,664.9823342,1324.52391 -26.09525625,2.087185434,75.1155096,207.9087252,656.50981,1309.01116 -26.54448669,2.058441885,74.0826507,205.0854336,648.1274441,1293.626363 -27.00145064,2.030106599,73.06434239,202.3000189,639.838157,1278.376448 -27.46628123,2.002182555,72.06070231,199.552929,631.6442626,1263.267152 -27.9391139,1.974667469,71.07165789,196.8440808,623.5463811,1248.300838 -28.42008638,1.947552008,70.09688236,194.1726819,615.5428693,1233.475337 -28.90933883,1.920823303,69.13592101,191.5375807,607.6309208,1218.786129 -29.40701376,1.894464946,68.18819118,188.9372662,599.8065617,1204.226325 -29.91325618,1.868456815,67.252976,186.3698504,592.0645921,1189.78654 -30.42821357,1.842786433,66.32983321,183.8342015,584.4021847,1175.462117 -30.95203597,1.817459063,65.41895865,181.3309518,576.8221002,1161.259627 -31.48487598,1.79248073,64.52057521,178.8608055,569.327318,1147.186097 -32.02688884,1.767856144,63.63485796,176.4243306,561.9203753,1133.247678 -32.57823247,1.743588547,62.76192889,174.0219447,554.6033189,1119.449545 -33.13906749,1.719679562,61.9018512,171.6538992,547.3776532,1105.795783 -33.7095573,1.696129018,61.05462328,169.3202624,540.2442849,1092.289272 -34.2898681,1.672934772,60.2201722,167.0209014,533.2034634,1078.931562 -34.88016897,1.650092526,59.39834717,164.7554644,526.254722,1065.722744 -35.48063188,1.627597128,58.58896634,162.5235102,519.3972901,1052.662281 -36.09143178,1.605443931,57.79186582,160.3246443,512.6305284,1039.749888 -36.7127466,1.583626269,57.00680871,158.1582667,505.9531221,1026.983898 -37.34475738,1.562134932,56.23346637,156.02352,499.3629139,1014.360913 -37.98764824,1.540957936,55.47141009,153.9192663,492.856828,1001.875643 -38.64160648,1.520080275,54.72010213,151.8440624,486.4307892,989.5207403 -39.30682262,1.499483654,53.97888618,149.7961332,480.0796366,977.2866121 -39.98349048,1.479146684,53.24699435,147.7733915,473.7971844,965.1615397 -40.67180718,1.459059663,52.52407935,145.7749146,467.5809585,953.1413267 -41.37197328,1.439229136,51.81037853,143.8014003,461.4336669,941.2323258 -42.08419275,1.419661968,51.10614067,141.8535766,455.3581049,929.4410731 -42.8086731,1.400364257,50.41158682,139.9320923,449.3568055,917.7735749 -43.54562539,1.38134124,49.72690689,138.0375084,443.4320092,906.2352418 -44.29526433,1.362597188,49.05225598,136.1702876,437.5856302,894.8308181 -45.05780833,1.344135092,48.38774292,134.3307623,431.8191543,883.5641686 -45.83347953,1.325952547,47.73328224,132.5187241,426.1323161,872.435569 -46.62250394,1.308041469,47.08858393,130.7333951,420.523005,861.4415008 -47.42511142,1.290391273,46.45326784,128.9737456,414.988285,850.5767315 -48.2415358,1.272988793,45.82686089,127.238486,409.5243686,839.8342567 -49.07201495,1.255818058,45.20878888,125.526045,404.1265433,829.2051459 -49.91679081,1.23886035,44.59837866,123.8345746,398.7891907,818.6785761 -50.77610952,1.222108678,43.99537927,122.1633981,393.5104469,808.2514016 -51.65022141,1.205576097,43.4002612,120.5138407,388.2948868,797.9336894 -52.53938116,1.189277544,42.81356275,118.8874151,383.1476831,787.7367434 -53.44384781,1.173228262,42.23583318,117.2856633,378.0740982,777.6720606 -54.36388488,1.157443789,41.66763232,115.7101561,373.0794809,767.7513232 -55.29976041,1.141938008,41.10946033,114.1622976,368.1686373,757.9851027 -56.25174706,1.126709161,40.56125432,112.6419275,363.3413207,748.3735662 -57.22012218,1.111746235,40.02261821,111.1479591,358.5942855,738.9106863 -58.2051679,1.097035614,39.49306206,109.6790445,353.9234295,729.5886437 -59.2071712,1.082560892,38.97199562,108.233556,349.3237359,720.397705 -60.22642402,1.068303143,38.4587378,106.8096131,344.7893582,711.3263945 -61.26322329,1.054245875,37.95269513,105.4055775,340.3152198,702.3647947 -62.31787109,1.040373294,37.45329922,104.0198803,335.8964555,693.5033962 -63.39067467,1.026666897,36.95988413,102.6506806,331.527312,684.7308283 -64.48194659,1.013105189,36.47167628,101.295838,327.2010569,676.0336704 -65.59200479,0.999672014,35.98809418,99.95374522,322.9126689,667.4020081 -66.72117266,0.98638462,35.50975894,98.6261343,318.6679073,658.8481927 -67.86977918,0.973270658,35.03766606,97.31577693,314.4758876,650.391523 -69.03815899,0.96035976,34.57288241,96.02564263,310.3463631,642.0526305 -70.22665249,0.947681319,34.11646631,94.75867682,306.2890075,633.8519961 -71.43560592,0.935237108,33.66848163,93.51506253,302.3045625,625.7916223 -72.66537152,0.92300744,33.22821976,92.29283677,298.3868252,617.859121 -73.91630756,0.910969003,32.79484151,91.08967353,294.5284099,610.0396264 -75.1887785,0.899096355,32.36743105,89.90303342,290.721232,602.3167961 -76.48315505,0.887381333,31.94569463,88.73210464,286.9627848,594.6858185 -77.79981432,0.87583019,31.52985734,87.57751622,283.255216,587.1515138 -79.13913992,0.864449339,31.12015012,86.43991319,279.6007203,579.7187947 -80.50152203,0.853244268,30.71677062,85.31984781,276.0011887,572.3919376 -81.88735758,0.842215369,30.31973295,84.21736239,272.4568578,565.171781 -83.29705033,0.831360112,29.92894608,83.13220691,268.9670141,558.0571817 -84.73101096,0.820674738,29.54427477,82.06400838,265.5305414,551.0461498 -86.18965727,0.810152366,29.16547124,81.01208101,262.1453067,544.1345726 -87.6734142,0.799781121,28.79210809,79.97523986,258.807557,537.3149608 -89.18271404,0.789546648,28.42366854,78.95205157,255.5127306,530.5781303 -90.71799651,0.779437029,28.05972356,77.94132633,252.2570491,523.9165076 -92.27970891,0.769462739,27.70065026,76.94411343,249.0439769,517.3375508 -93.86830622,0.759642408,27.34711934,75.9622775,245.8796152,510.854193 -95.48425127,0.749993236,26.99975006,74.99754019,242.7696004,504.4784018 -97.12801485,0.740510766,26.65838191,74.04945709,239.7125549,498.2075666 -98.80007586,0.731177529,26.32238608,73.11628284,236.7028859,492.0303042 -100.5009214,0.721975121,25.99110001,72.1961782,233.7346928,485.9345758 -102.2310471,0.712898607,25.66434602,71.28865075,230.8064318,479.9173863 -103.9909569,0.703950268,25.34220631,70.39392981,227.918893,473.9805851 -105.7811637,0.695131988,25.02474866,69.51220457,225.0727341,468.1257405 -107.6021888,0.686445135,24.71202231,68.64361269,222.2684438,462.3540625 -109.454563,0.677890505,24.40405596,67.78823467,219.5063237,456.666365 -111.3388258,0.669468265,24.10085559,66.94608785,216.7864683,451.0630255 -113.2555262,0.661177885,23.80240216,66.11711998,214.1087451,445.5439417 -115.2052227,0.653018072,23.50864909,65.3012023,211.4727715,440.1084848 -117.1884833,0.644986693,23.21951964,64.49812218,208.8778917,434.7554499 -119.2058857,0.637080698,22.93490401,63.70757518,206.3231502,429.4830026 -121.2580178,0.629296037,22.65465634,62.92915658,203.8072655,424.288622 -123.3454774,0.621627564,22.37859143,62.16235238,201.3285999,419.1690396 -125.4688726,0.614069435,22.1064989,61.40657855,198.8852876,414.1205045 -127.6288221,0.606620124,21.8383238,60.66168288,196.4768596,409.1421682 -129.8259552,0.599280886,21.57411133,59.92779116,194.103746,404.2350492 -132.060912,0.592052562,21.31389175,59.20498781,191.7662415,399.3998793 -134.3343437,0.584935481,21.0576769,58.49330598,189.4644738,394.6370377 -136.6469125,0.577929407,20.80545828,57.79272231,187.1983862,389.946515 -138.9992922,0.571033481,20.55720499,57.1031512,184.9677192,385.3278751 -141.3921682,0.564246163,20.31286159,56.42443882,182.7719914,380.7802145 -143.8262377,0.557565165,20.07234569,55.75635653,180.6104781,376.3021184 -146.3022097,0.550987381,19.83554551,55.09859403,178.4821887,371.8916139 -148.8208056,0.544508816,19.6023172,54.45075183,176.3858431,367.5461202 -151.3827591,0.538125644,19.37252304,53.81244759,174.3202158,363.2631654 -153.9888168,0.531837812,19.14616109,53.18367599,172.2853016,359.0428175 -156.6397379,0.525645949,18.92325405,52.56450024,170.2813169,354.8856018 -159.3362945,0.519550236,18.70380838,51.95493839,168.3083307,350.7917341 -162.0792725,0.513550353,18.48781261,51.35495866,166.3662503,346.7610893 -164.8694709,0.507645434,18.27523556,50.76447451,164.4548047,342.7931678 -167.7077027,0.501834013,18.06602439,50.1833393,162.5735277,338.8870601 -170.5947946,0.496113963,17.86010262,49.61134062,160.7217394,335.0414081 -173.5315879,0.490482443,17.65736789,49.04819421,158.8985267,331.2543644 -176.5189382,0.484936581,17.45771689,48.49361314,157.1029672,327.5240596 -179.5577158,0.479476162,17.2611418,47.94757577,155.3349975,323.8504122 -182.648806,0.474101453,17.06765226,47.41010892,153.594711,320.2336647 -185.7931094,0.46881229,16.87724242,46.88119639,151.8820609,316.6737661 -188.991542,0.463608039,16.68988937,46.36077457,150.1968467,313.1703418 -192.2450358,0.458487542,16.50555149,45.84872789,148.5386992,309.7226635 -195.5545385,0.453449074,16.32416666,45.34488382,146.9070641,306.3296152 -198.9210144,0.44849029,16.14565042,44.84900778,145.3011861,302.9896589 -202.3454442,0.443609121,15.96992835,44.36089307,143.7203995,299.7014423 -205.8288257,0.43880543,15.79699548,43.88052594,142.1646638,296.4649141 -209.3721737,0.434079077,15.62684675,43.40789233,140.6339369,293.2800189 -212.9765204,0.429429494,15.45946177,42.94293562,139.128039,290.1464114 -216.6429161,0.424855648,15.29480332,42.48555245,137.6466381,287.0634285 -220.3724289,0.420355993,15.13281576,42.03558826,136.1892366,284.0300592 -224.1661453,0.415928432,14.97342355,41.59283327,134.7551575,281.0449175 -228.0251707,0.411571221,14.81656396,41.15711321,133.3438387,278.1068554 -231.9506293,0.407284012,14.66222442,40.72839318,131.9551695,275.2156649 -235.9436647,0.403066281,14.5103861,40.30662087,130.5889826,272.3710191 -240.0054403,0.39891708,14.36101488,39.89170157,129.2449732,269.5723026 -244.1371395,0.394834998,14.21405993,39.48349404,127.9226857,266.8185846 -248.3399659,0.390818115,14.06945213,39.0818063,126.6214997,264.1085898 -252.6151442,0.38686459,13.92712525,38.68645439,125.340821,261.4410957 -256.9639197,0.382974157,13.78706966,38.29741155,124.0805643,258.8159412 -261.3875595,0.37914662,13.64927832,37.91465825,122.8406677,256.2330127 -265.8873523,0.375381429,13.51373144,37.53813952,121.6209545,253.6919561 -270.4646092,0.371677645,13.38039523,37.1677615,120.4211218,251.1921535 -275.1206637,0.368033948,13.24922214,36.80339214,119.2407429,248.7327278 -279.8568722,0.364449657,13.12018767,36.44496331,118.0795981,246.3132332 -284.6746147,0.360924872,12.99329539,36.09248501,116.9377208,243.9337508 -289.5752947,0.357459445,12.86854003,35.74594258,115.8150644,241.5941946 -294.5603401,0.354052906,12.7459046,35.40528881,114.7114767,239.2942574 -299.6312031,0.350704438,12.62535975,35.07044218,113.6266945,237.0333999 -304.7893612,0.347413468,12.50688484,34.74134535,112.5605326,234.8112452 -310.036317,0.344179929,12.39047744,34.41799162,111.51297,232.627758 -315.3735994,0.341003513,12.27612646,34.10035013,110.4839074,230.4827393 -320.8027631,0.337883584,12.16380901,33.78835734,109.4731394,228.3757687 -326.3253901,0.334819149,12.05348936,33.48191395,108.4803449,226.3061832 -331.9430892,0.331808823,11.94511763,33.18088148,107.5050757,224.2730548 -337.6574971,0.328850795,11.83862862,32.88507875,106.5467452,222.2751662 -343.4702787,0.325942787,11.73394032,32.59427799,105.6046159,220.3109848 -349.3831274,0.323082047,11.6309537,32.30820413,104.6777969,218.3786579 -355.397766,0.320267002,11.52961207,32.02669964,103.7657783,216.4771268 -361.5159467,0.317498229,11.42993626,31.74982245,102.8687479,214.6067886 -367.7394521,0.314776335,11.33194805,31.47763303,101.9869021,212.7680576 -374.0700952,0.312101744,11.23566277,31.21017396,101.1203791,210.9612265 -380.5097205,0.309474683,11.1410886,30.94746797,100.2692529,209.1864537 -387.0602041,0.306895162,11.04822583,30.68951588,99.43352617,207.4437493 -393.7234544,0.304362947,10.95706608,30.43629436,98.61312377,205.7329597 -400.5014127,0.30187755,10.86759181,30.18775477,97.8078882,204.05376 -407.3960537,0.29943843,10.77978348,29.94384277,97.01764363,202.4057867 -414.4093862,0.297044969,10.69361887,29.70449664,96.24219026,200.7886259 -421.5434533,0.29469626,10.60906537,29.46962582,95.48123488,199.201669 -428.8003335,0.292391076,10.52607875,29.23910747,94.73437956,197.6440883 -436.1821411,0.290127836,10.44460211,29.01278347,94.00111221,196.1148181 -443.6910267,0.287904575,10.3645647,28.79045734,93.28079634,194.6125329 -451.3291779,0.285719063,10.28588625,28.57190613,92.5727097,193.135728 -459.0988201,0.283570686,10.2085447,28.3570685,91.87665366,191.6839912 -467.0022169,0.281460056,10.132562,28.14600545,91.192826,190.257737 -475.0416708,0.279387684,10.05795664,27.93876834,90.52139318,188.8573145 -483.2195241,0.277353946,9.984742072,27.73539456,89.86247646,187.4829786 -491.5381593,0.275359062,9.912926215,27.53590607,89.21614707,186.1348794 -500,0.273403089,9.84251119,27.34030879,88.58242423,184.8130587 +# Provided by Libamtrack ,,,,, +# Generated: 15/3/2022 @ 13:4:33,,,,, +# Stopping power,,,,, +E_MeV_u,proton_LET_keV_um,carbon_LET_keV_um,neon_LET_keV_um,argon_LET_keV_um,iron_LET_keV_um +0.1,81.52953386,754.2666061,1228.77141,2051.885718,2772.055983 +0.101721502,81.34473522,757.7072003,1235.803703,2065.642457,2791.917662 +0.10347264,81.14575128,761.0469468,1242.69596,2079.20501,2811.544411 +0.105253924,80.93243091,764.2817784,1249.441196,2092.561413,2830.919977 +0.107065873,80.70464862,767.4077669,1256.032614,2105.699968,2850.028428 +0.108909014,80.46230722,770.421156,1262.46366,2118.609327,2868.854277 +0.110783886,80.20534079,773.318397,1268.728083,2131.278599,2887.382619 +0.112691033,79.93371781,776.0961878,1274.820001,2143.697457,2905.599285 +0.114631011,79.64744449,778.7515158,1280.733969,2155.856266,2923.491008 +0.116604387,79.3465684,781.2817055,1286.465066,2167.746219,2941.045615 +0.118611734,79.03118226,783.6844692,1292.008978,2179.359485,2958.252232 +0.120653638,78.7014281,785.9579636,1297.362094,2190.689381,2975.101512 +0.122730693,78.35750158,788.1008509,1302.521612,2201.730553,2991.58589 +0.124843505,77.99965979,790.1123964,1307.485706,2212.479262,3007.699977 +0.126992689,77.6283552,791.9938589,1312.255836,2222.937307,3023.445898 +0.129178871,77.24430449,793.7492692,1316.838057,2233.114281,3038.836381 +0.131402688,76.8483458,795.3840546,1321.240768,2243.023782,3053.889626 +0.133664788,76.4414356,796.9050555,1325.474753,2252.68351,3068.629454 +0.13596583,76.02465783,798.3206721,1329.55344,2262.115732,3083.085953 +0.138306485,75.59923369,799.6410233,1333.493187,2271.347796,3097.296195 +0.140687435,75.16653202,800.8781182,1337.313587,2280.412676,3111.305004 +0.143109372,74.72808034,802.0460415,1341.037798,2289.34958,3125.165803 +0.145573003,74.28557662,803.1611532,1344.692907,2298.204596,3138.941527 +0.148079046,73.84090177,804.2423049,1348.310321,2307.031409,3152.705622 +0.15062823,73.3959923,805.3095293,1351.92359,2315.887627,3166.537061 +0.153221298,72.95152109,806.3694957,1355.543984,2324.792907,3180.463071 +0.155859007,72.50734882,807.4200336,1359.167951,2333.741552,3194.476239 +0.158542123,72.06329522,808.4584528,1362.791043,2342.726301,3208.566994 +0.161271429,71.61914621,809.4816063,1366.408016,2351.738486,3222.72382 +0.164047721,71.17465102,810.4858411,1370.012739,2360.767874,3236.933031 +0.166871806,70.72951903,811.4669445,1373.598099,2369.802488,3251.178518 +0.169744508,70.28341646,812.4200864,1377.155893,2378.828409,3265.441478 +0.172666664,69.83596283,813.3397565,1380.676715,2387.829572,3279.700112 +0.175639124,69.38675828,814.2200615,1384.150453,2396.788604,3293.930778 +0.178662756,68.93571253,815.0586024,1387.572881,2405.698256,3308.123695 +0.181738439,68.48295149,815.8554975,1390.944037,2414.558637,3322.279191 +0.184867071,68.02861002,816.6109917,1394.264173,2423.370225,3336.398099 +0.188049561,67.57282859,817.325421,1397.533693,2432.133769,3350.481625 +0.191286839,67.1157534,817.999218,1400.753167,2440.850298,3364.53137 +0.194579846,66.65753644,818.632916,1403.923335,2449.521151,3378.54936 +0.197929543,66.19833559,819.2271543,1407.045123,2458.147985,3392.538071 +0.201336904,65.73830146,819.7825185,1410.119365,2466.732309,3406.499775 +0.204802924,65.27750446,820.2986214,1413.14522,2475.272701,3420.432704 +0.208328611,64.81597693,820.7745997,1416.121017,2483.766274,3434.333058 +0.211914993,64.35374264,821.2094713,1419.044866,2492.209736,3448.196468 +0.215563114,63.89081578,821.6021197,1421.91463,2500.59934,3462.017924 +0.219274038,63.42719989,821.9512747,1424.727888,2508.930814,3475.791674 +0.223048846,62.96288663,822.255492,1427.481895,2517.199293,3489.511131 +0.226888637,62.49786848,822.5133132,1430.173865,2525.399802,3503.169535 +0.23079453,62.03219088,822.7239591,1432.802168,2533.529383,3516.762911 +0.234767663,61.56591144,822.8868109,1435.365442,2541.585532,3530.287898 +0.238809194,61.09908136,823.0011674,1437.862167,2549.565442,3543.740709 +0.2429203,60.63174459,823.0662303,1440.290638,2557.465961,3557.117063 +0.247102178,60.16393683,823.0810879,1442.648938,2565.283533,3570.412102 +0.251356048,59.69568648,823.044724,1444.934946,2573.014217,3583.620423 +0.255683148,59.22702747,822.9561932,1447.146648,2580.654234,3596.736825 +0.260084739,58.75799175,822.8145184,1449.281958,2588.199644,3609.755872 +0.264562104,58.2886013,822.6185785,1451.338513,2595.645991,3622.671386 +0.269116547,57.81886692,822.3670857,1453.313638,2602.988221,3635.476337 +0.273749394,57.34878712,822.0585638,1455.2043,2610.220602,3648.162726 +0.278461996,56.87837432,821.6917206,1457.007765,2617.337903,3660.723226 +0.283255726,56.4076931,821.2660126,1458.722608,2624.337203,3673.153722 +0.28813198,55.93681025,820.7809425,1460.347467,2631.215676,3685.450213 +0.293092179,55.46578563,820.2359263,1461.880814,2637.970165,3697.608224 +0.298137767,54.99467128,819.6302768,1463.320918,2644.597124,3709.622714 +0.303270216,54.52353293,818.9635232,1464.666418,2651.093644,3721.489519 +0.308491019,54.05249824,818.2361503,1465.917649,2657.459867,3733.208745 +0.313801699,53.58170685,817.4488741,1467.075359,2663.696673,3744.781531 +0.319203803,53.11129784,816.602458,1468.14038,2669.805093,3756.209226 +0.324698904,52.64140922,815.6977059,1469.113614,2675.786289,3767.493367 +0.330288603,52.17217736,814.7354547,1469.996028,2681.64153,3778.635641 +0.335974529,51.70373637,813.716565,1470.78863,2687.372168,3789.63785 +0.341758338,51.23621743,812.6419111,1471.492454,2692.9796,3800.501864 +0.347641716,50.76974805,811.5123688,1472.10854,2698.465232,3811.229567 +0.353626376,50.30443272,810.3285032,1472.637366,2703.82944,3821.821388 +0.359714062,49.84030592,809.0897933,1473.077427,2709.06895,3832.27259 +0.365906548,49.37737401,807.7952742,1473.426395,2714.178937,3842.57622 +0.372205637,48.91562541,806.4436888,1473.681385,2719.153509,3852.723788 +0.378613166,48.45502881,805.0334466,1473.838873,2723.985544,3862.705026 +0.385131,47.99553114,803.5625775,1473.894608,2728.666519,3872.507639 +0.391761039,47.53705547,802.0286833,1473.843513,2733.186309,3882.117012 +0.398505215,47.07949929,800.428893,1473.679598,2737.533017,3891.515953 +0.405365491,46.62281525,798.7612292,1473.39847,2741.697618,3900.691298 +0.412343867,46.16710417,797.0262502,1473.000381,2745.679681,3909.642061 +0.419442376,45.7124808,795.2248132,1472.486133,2749.479781,3918.368687 +0.426663087,45.25905431,793.3577428,1471.856467,2753.098374,3926.871439 +0.434008101,44.80692732,791.4258123,1471.11203,2756.535727,3935.150307 +0.441479561,44.35619494,789.4297229,1470.253332,2759.791843,3943.204894 +0.449079642,43.90694367,787.3700812,1469.280705,2762.866378,3951.034298 +0.456810558,43.45925222,785.2474093,1468.194319,2765.758669,3958.637149 +0.464674562,43.0131916,783.0621423,1466.994178,2768.46772,3966.01159 +0.472673946,42.56882122,780.8145528,1465.679975,2770.99193,3973.154877 +0.480811038,42.12618718,778.5047129,1464.251018,2773.328943,3980.063167 +0.489088212,41.6853208,776.1324581,1462.706156,2775.475508,3986.731307 +0.497507876,41.24623718,773.6973518,1461.043713,2777.427332,3993.152622 +0.506072486,40.80902939,771.2004542,1459.264823,2779.185435,3999.328047 +0.514784535,40.37402111,768.6472842,1457.379081,2780.766971,4005.281751 +0.523646563,39.94158677,766.0445333,1455.39838,2782.193609,4011.044489 +0.532661151,39.51211886,763.3994731,1453.335811,2783.489459,4016.65065 +0.541830925,39.08602866,760.7199844,1451.205731,2784.681233,4022.138498 +0.551158556,38.66372301,758.0141181,1449.022935,2785.796681,4027.547938 +0.560646764,38.24523484,755.2827985,1446.788686,2786.837691,4032.881594 +0.570298311,37.83025219,752.5201337,1444.491172,2787.780923,4038.105554 +0.580116009,37.41839522,749.7187187,1442.115566,2788.597021,4043.17705 +0.59010272,37.00921961,746.8696534,1439.644036,2789.250563,4048.044339 +0.600261351,36.60223079,743.9627841,1437.056171,2789.700843,4052.647788 +0.610594864,36.19735474,740.9963028,1434.347542,2789.937898,4056.972234 +0.621106269,35.79501454,737.9786308,1431.533519,2789.990269,4061.058483 +0.631798628,35.39568259,734.9194851,1428.63212,2789.891875,4064.955331 +0.642675056,34.99985948,731.8294748,1425.663249,2789.680592,4068.71753 +0.653738722,34.60801614,728.7189056,1422.646386,2789.393757,4072.399259 +0.664992849,34.22019428,725.5892878,1419.583969,2789.035519,4076.006406 +0.676440716,33.83620373,722.4372347,1416.468854,2788.59119,4079.51732 +0.688085658,33.45580768,719.2582747,1413.2917,2788.041619,4082.903725 +0.699931069,33.07872285,716.0468189,1410.040885,2787.36298,4086.130364 +0.711980398,32.70470578,712.798008,1406.70612,2786.533887,4089.16541 +0.724237157,32.33357235,709.5081691,1403.279375,2785.53724,4091.983193 +0.736704916,31.96510307,706.1727668,1399.750834,2784.352242,4094.552485 +0.749387309,31.59904699,702.7864648,1396.109004,2782.954563,4096.836717 +0.762288028,31.23558164,699.3533993,1392.361144,2781.357117,4098.854042 +0.775410834,30.87549526,695.891606,1388.542315,2779.628566,4100.704916 +0.78875955,30.51967816,692.4219351,1384.693513,2777.850057,4102.508662 +0.802338063,30.16901028,688.9655617,1380.856751,2776.105469,4104.389149 +0.816150332,29.82334356,685.5205854,1377.028066,2774.386769,4106.334749 +0.830200378,29.48169181,682.0656571,1373.164303,2772.606719,4108.216419 +0.844492297,29.14292109,678.5754277,1369.21385,2770.660198,4109.878022 +0.859030251,28.806103,675.0287176,1365.133057,2768.457311,4111.185328 +0.873818477,28.4713172,671.4275945,1360.925002,2766.002327,4112.143485 +0.888861282,28.13886124,667.7793745,1356.603449,2763.321313,4112.790094 +0.904163049,27.80906219,664.092285,1352.184147,2760.444598,4113.169265 +0.919728237,27.48241294,660.378762,1347.691574,2757.42064,4113.352332 +0.93556138,27.15952192,656.6543565,1343.156806,2754.311846,4113.431784 +0.95166709,26.84100099,652.9350926,1338.612173,2751.183757,4113.505213 +0.968050061,26.52678885,649.2209089,1334.057251,2748.035032,4113.570536 +0.984715065,26.21617264,645.4956914,1329.458551,2744.796044,4113.523326 +1.001666958,25.90835145,641.7407494,1324.776956,2741.384883,4113.240227 +1.018910678,25.60297992,637.9482967,1319.995552,2737.764928,4112.665325 +1.036451248,25.30015143,634.1213683,1315.11971,2733.945542,4111.81159 +1.05429378,24.99996775,630.2632925,1310.155465,2729.937542,4110.694233 +1.072443472,24.70252322,626.3772961,1305.108697,2725.751521,4109.328182 +1.090905611,24.40790374,622.4664721,1299.985064,2721.397692,4107.727856 +1.109685576,24.11618565,618.5337436,1294.789923,2716.885728,4105.906917 +1.128788839,23.82743451,614.5818255,1289.528249,2712.22458,4103.877984 +1.148220965,23.54170382,610.6131827,1284.204539,2707.422269,4101.652326 +1.167987615,23.25903365,606.629984,1278.82271,2702.485663,4099.239506 +1.188094549,22.97944913,602.6340526,1273.385991,2697.420229,4096.646994 +1.208547624,22.70295888,598.6268127,1267.896799,2692.229757,4093.87974 +1.229352799,22.42955324,594.6092315,1262.356606,2686.916058,4090.939696 +1.250516136,22.15920395,590.5817949,1256.765878,2681.478807,4087.82556 +1.2720438,21.89189742,586.5453875,1251.125939,2675.91951,4084.538804 +1.293942063,21.62763896,582.5014137,1245.439241,2670.242097,4081.084612 +1.316217305,21.36641764,578.4508617,1239.707372,2664.448679,4077.465392 +1.338876016,21.1082029,574.3941969,1233.930816,2658.539,4073.679934 +1.361924798,20.85294254,570.3312944,1228.108794,2652.510077,4069.722825 +1.385370365,20.60056071,566.2613677,1222.239097,2646.355791,4065.583804 +1.409219547,20.35095573,562.1828908,1216.3179,2640.066455,4061.247051 +1.433479294,20.10399765,558.0935155,1210.339563,2633.628332,4056.690417 +1.458156673,19.85952582,553.9899817,1204.296415,2627.023116,4051.88458 +1.483258874,19.61734614,549.8680219,1198.178523,2620.227367,4046.792119 +1.50879321,19.37726012,545.7231574,1191.975404,2613.216202,4041.373172 +1.534767119,19.13927256,541.5565726,1185.688882,2605.991528,4035.629138 +1.561188171,18.90348317,537.3721695,1179.326769,2598.568468,4029.581898 +1.588064061,18.66998806,533.1738152,1172.896882,2590.962306,4023.253696 +1.61540262,18.43887858,528.9653055,1166.406962,2583.188314,4016.666861 +1.643211813,18.21024061,524.7503387,1159.864616,2575.261619,4009.84361 +1.671499743,17.98415373,520.5324865,1153.277252,2567.197059,4002.80582 +1.700274649,17.76069033,516.3151642,1146.652007,2559.00902,3995.574774 +1.729544916,17.53991473,512.1015962,1139.995667,2550.711256,3988.170875 +1.759319072,17.32187842,507.8946728,1133.314346,2542.316152,3980.612489 +1.78960579,17.10659188,503.6961081,1126.611592,2533.830452,3972.90923 +1.820413895,16.89403545,499.5067374,1119.889023,2525.25662,3965.064042 +1.851752362,16.68417134,495.3268525,1113.147058,2516.594439,3957.075659 +1.883630322,16.47694195,491.156142,1106.384767,2507.840633,3948.937988 +1.916057061,16.27226805,486.9936226,1099.599704,2498.988448,3940.639404 +1.949042027,16.07004675,482.8375673,1092.787721,2490.027186,3932.161984 +1.982594831,15.87014943,478.6854271,1085.942775,2480.941709,3923.480673 +2.016725246,15.67244666,474.5345733,1079.058594,2471.716196,3914.569176 +2.051443218,15.47691181,470.3854445,1072.135845,2462.350606,3905.426068 +2.08675886,15.28354084,466.2391606,1065.176767,2452.848516,3896.055653 +2.122682462,15.09231587,462.0964184,1058.182662,2443.211384,3886.458881 +2.159224489,14.9032038,457.957442,1051.153765,2433.438223,3876.632802 +2.196395588,14.71615487,453.8219283,1044.089113,2423.525254,3866.569991 +2.234206589,14.53110109,449.68899,1036.986393,2413.465529,3856.257901 +2.272668507,14.34797896,445.5578502,1029.843537,2403.252602,3845.684709 +2.311792547,14.1667924,441.429808,1022.663279,2392.891195,3834.85641 +2.351590109,13.98755274,437.3063951,1015.448924,2382.387442,3823.781292 +2.392072787,13.8102603,433.1888027,1008.20303,2371.74578,3812.464959 +2.433252375,13.63490326,429.0778391,1000.927293,2360.968676,3800.90987 +2.475140871,13.46145647,424.9738849,993.6224337,2350.05633,3789.114837 +2.517750478,13.28989728,420.877389,986.2893509,2339.00937,3777.079348 +2.56109361,13.12029152,416.7915984,978.9355336,2327.844115,3764.828258 +2.605182895,12.95273824,412.7208412,971.5710934,2316.583325,3752.397004 +2.650031179,12.787335,408.6694313,964.2062101,2305.250179,3739.821915 +2.695651526,12.62417739,404.6416512,956.8510889,2293.868181,3727.140071 +2.742057229,12.46335762,400.6417027,949.5158443,2282.460879,3714.388851 +2.789261808,12.30488324,396.6710839,942.2042663,2271.036847,3701.581456 +2.837279014,12.14860449,392.7262004,934.9080617,2259.575555,3688.683661 +2.886122837,11.99432823,388.8019883,927.615365,2248.047604,3675.646519 +2.935807508,11.84182886,384.8922519,920.3115062,2236.416469,3662.409101 +2.986347502,11.6908461,380.9895792,912.9787798,2224.637841,3648.897328 +3.037757543,11.54119017,377.0887662,905.6046377,2212.679547,3635.056575 +3.090052609,11.39289423,373.1918427,898.1938444,2200.551493,3620.901107 +3.143247936,11.24602152,369.3018326,890.7536151,2188.269729,3606.455404 +3.197359021,11.10063265,365.4216888,883.2910674,2175.85026,3591.744021 +3.25240163,10.95678518,361.5542761,875.8131776,2163.308935,3576.791412 +3.308391799,10.81453313,357.7023529,868.3267344,2150.661327,3561.621729 +3.36534584,10.67392648,353.8685522,860.838288,2137.922603,3546.258607 +3.423280346,10.5350106,350.0553597,853.3540947,2125.107385,3530.724923 +3.482212196,10.39782563,346.2650913,845.8800564,2112.229581,3515.042521 +3.542158559,10.26239863,342.4996268,838.4210653,2099.300742,3499.229453 +3.6031369,10.12873092,338.7599821,830.9799414,2086.327357,3483.295443 +3.665164985,9.9968109,335.0467291,823.558444,2073.313332,3467.245956 +3.728260884,9.866615679,331.3600446,816.1573796,2060.260226,3451.082565 +3.792442981,9.738109948,327.6996696,808.7764919,2047.166939,3434.802395 +3.857729974,9.611244827,324.0648657,801.4143431,2034.029379,3418.397523 +3.924140885,9.485956623,320.4543693,794.0681879,2020.840097,3401.854328 +3.99169506,9.36216628,316.8663683,786.733904,2007.588067,3385.153066 +4.060412183,9.239823773,313.3000033,779.4097129,1994.268159,3368.283826 +4.130312272,9.118937756,309.7563846,772.0987377,1980.887782,3351.257845 +4.201415692,8.99951537,306.2365612,764.8039805,1967.454132,3334.086079 +4.27374316,8.881555814,302.7413017,757.5277698,1953.972766,3316.77678 +4.347315747,8.765049536,299.2710636,750.2716787,1940.447364,3299.335064 +4.422154888,8.649977371,295.8259612,743.036435,1926.879474,3281.762459 +4.498282386,8.536310293,292.4057548,735.8218862,1913.268388,3264.056661 +4.57572042,8.424029747,289.0105452,728.6287422,1899.615661,3246.219216 +4.654491553,8.313133354,285.640973,721.4590861,1885.926472,3228.257896 +4.734618732,8.203611855,282.2974292,714.3143894,1872.204472,3210.177907 +4.816125302,8.095446888,278.9799771,707.1953072,1858.451222,3191.980914 +4.89903501,7.988610119,275.6883198,700.1015886,1844.665935,3173.664551 +4.98337201,7.883062517,272.4217728,693.0319985,1830.845233,3155.221986 +5.069160874,7.778776276,269.1800207,685.9862373,1816.9882,3136.650593 +5.156426595,7.675757157,265.9638942,678.9669319,1803.101702,3117.961196 +5.245194598,7.574008943,262.774144,671.9765269,1789.192213,3099.164019 +5.335490743,7.473528318,259.6112632,665.0168256,1775.264579,3080.266544 +5.427341339,7.374304157,256.4754605,658.0889163,1761.321805,3061.273108 +5.520773145,7.276317984,253.3666746,651.1932028,1747.365107,3042.184976 +5.615813382,7.179555883,250.2849882,644.3304632,1733.39674,3023.005241 +5.712489738,7.084004031,247.2304729,637.5014542,1719.418944,3003.737001 +5.81083038,6.989640147,244.2028911,630.7061388,1705.431853,2984.3797 +5.910863959,6.896432557,241.2016613,623.9435916,1691.433211,2964.928602 +6.012619618,6.80434176,238.2259118,617.21213,1677.418704,2945.37533 +6.116127003,6.713357197,235.2757682,610.5126492,1663.391011,2925.723768 +6.22141627,6.623493397,232.3522235,603.8483046,1649.359036,2905.988801 +6.328518094,6.534760788,229.4561175,597.2218723,1635.330748,2886.183779 +6.437463679,6.447164296,226.5880869,590.6356147,1621.312805,2866.31984 +6.548284764,6.360701324,223.748493,584.091088,1607.310005,2846.404909 +6.661013637,6.27535422,220.9371556,577.5884405,1593.323322,2826.440206 +6.77568314,6.191094082,218.1534853,571.126747,1579.350792,2806.421738 +6.892326681,6.107882561,215.3965447,564.7041643,1565.387899,2786.340962 +7.010978243,6.025674102,212.6651277,558.3181299,1551.428099,2766.185676 +7.131672395,5.944470017,209.9596679,551.9703764,1537.476769,2745.964894 +7.254444299,5.864317427,207.2822082,545.6668804,1523.551199,2725.709023 +7.379329725,5.785264226,204.6348137,539.4137057,1509.669106,2705.449456 +7.506365056,5.707354725,202.019417,533.2165953,1495.847488,2685.216517 +7.635587303,5.630574688,199.4358713,527.0758213,1482.088128,2665.013395 +7.767034114,5.554845245,196.881727,520.9855586,1468.375652,2644.812404 +7.900743785,5.480070671,194.3539196,514.9383179,1454.689851,2624.576964 +8.036755271,5.406148657,191.849133,508.9259013,1441.00833,2604.266315 +8.175108198,5.333049882,189.3666252,502.9469029,1427.327782,2583.873987 +8.315842873,5.260786619,186.9071208,497.0038073,1413.65595,2563.41352 +8.459000299,5.189367943,184.4712234,491.0987849,1399.999764,2542.897092 +8.604622184,5.118818712,182.0600905,485.2354881,1386.370468,2522.344821 +8.752750953,5.049209828,179.6765113,479.4219362,1372.79192,2501.799967 +8.903429762,4.980621694,177.3236105,473.6670741,1359.290856,2481.311349 +9.05670251,4.91311886,175.0039448,467.9783616,1345.889983,2460.920752 +9.212613852,4.846636261,172.715448,462.3509067,1332.576605,2440.605417 +9.371209211,4.781040855,170.4536177,456.77326,1319.318981,2420.307501 +9.532534794,4.716189961,168.2135912,451.2329512,1306.082144,2399.962868 +9.696637599,4.65204198,165.9940968,445.7270951,1292.858643,2379.557622 +9.863565439,4.588627691,163.7964372,440.2597093,1279.661039,2359.114682 +10.03336694,4.525977564,161.6218988,434.8347782,1266.501911,2338.657173 +10.20609159,4.464113454,159.4714554,429.4554534,1253.391518,2318.204094 +10.38178969,4.403049967,157.345816,424.1241786,1240.338141,2297.77092 +10.56051244,4.342798561,155.2455715,418.8430801,1227.3492,2277.371647 +10.7423119,4.283367284,153.1711848,413.613939,1214.431166,2257.018607 +10.92724105,4.224760406,151.1229777,408.4381534,1201.589437,2236.72223 +11.11535375,4.166978023,149.1011164,403.316698,1188.828201,2216.490775 +11.30670482,4.110015629,147.1055966,398.2500801,1176.150304,2196.33005 +11.50135001,4.053863667,145.1362268,393.2382933,1163.557086,2176.243108 +11.69934601,3.998507036,143.1926111,388.2807679,1151.04823,2156.229919 +11.90075052,3.943924574,141.2741301,383.3763176,1138.621579,2136.287021 +12.10562222,3.890088496,139.3799209,378.5230828,1126.272955,2116.407139 +12.31402078,3.836963802,137.508856,373.7184702,1113.995958,2096.578787 +12.52600693,3.784509742,135.6595954,368.959293,1101.78237,2076.78699 +12.74164243,3.732711877,133.8317366,364.2448982,1089.631489,2057.030886 +12.9609901,3.681578966,132.025704,359.5768753,1077.549327,2037.322316 +13.18411384,3.631117692,130.2418429,354.9565953,1065.541279,2017.672039 +13.41107866,3.581331594,128.480382,350.3851061,1053.611805,1998.089115 +13.64195069,3.532220741,126.7414212,345.8630987,1041.764311,1978.580674 +13.87679719,3.483781378,125.0249192,341.3908715,1030.00104,1959.151683 +14.11568657,3.436005548,123.3306797,336.9682917,1018.322937,1939.80468 +14.35868844,3.388880686,121.6583368,332.5947545,1006.729518,1920.539503 +14.60587359,3.342389184,120.0073397,328.2691392,995.2187241,1901.352988 +14.85731404,3.296507932,118.3769359,323.989762,983.7867655,1882.238651 +15.11308304,3.251213243,116.7663486,319.7548601,972.4295807,1863.189462 +15.37325511,3.206505505,115.1756616,315.5650177,961.1502238,1844.212012 +15.63790605,3.162392093,113.6052068,311.4214916,949.9538108,1825.316904 +15.90711297,3.118877784,112.0552198,307.325269,938.8446562,1806.513266 +16.18095428,3.075964472,110.5258295,303.2770389,927.8261772,1787.808558 +16.45950978,3.033650871,109.0170481,299.2771617,916.9007934,1769.208366 +16.74286062,2.991932195,107.5287589,295.3256373,906.06982,1750.716178 +17.03108935,2.950799815,106.0607044,291.4220703,895.3333529,1732.333147 +17.32427995,2.910240891,104.612473,287.5656332,884.690146,1714.057842 +17.62251783,2.87024043,103.1835734,283.7552689,874.1382268,1695.887417 +17.92588988,2.830793582,101.7738761,279.9909072,863.6786419,1677.824883 +18.23448448,2.791897478,100.3833206,276.2726596,853.3129923,1659.874348 +18.54839155,2.753545859,99.01172239,272.6002886,843.041794,1642.037836 +18.86770254,2.715728742,97.65876096,268.9731742,832.8643657,1624.315048 +19.19251047,2.678432069,96.32396706,265.3902783,822.7787128,1606.703123 +19.52290998,2.641637329,95.00670932,261.8501071,812.7814017,1589.196376 +19.85899733,2.605321159,93.70617991,258.3506712,802.8674271,1571.786017 +20.20087042,2.569463046,92.42167165,254.8902493,793.0325801,1554.46478 +20.54862887,2.534066631,91.15334433,251.4695029,783.2800404,1537.239863 +20.90237399,2.499139747,89.90150708,248.0894997,773.614255,1520.120997 +21.26220884,2.464688382,88.66640128,244.7511153,764.0390752,1503.11679 +21.62823825,2.430716477,87.44819321,241.4550121,754.5576886,1486.234584 +22.00056887,2.397225706,86.24696631,238.2016181,745.1725457,1469.480303 +22.37930917,2.364215241,85.06271264,234.9911028,735.8852815,1452.85829 +22.76456949,2.331681498,83.89532396,231.8233526,726.6966319,1436.371128 +23.15646208,2.299617871,82.74458201,228.6979431,717.6063443,1420.019455 +23.55510111,2.26801444,81.61014815,225.6141109,708.6130815,1403.801757 +23.96060271,2.236857662,80.49155229,222.5707224,699.7143197,1387.714162 +24.37308504,2.206130043,79.38818104,219.5662408,690.9062394,1371.750201 +24.79266826,2.175809781,78.29926497,216.598691,682.1836086,1355.900568 +25.21947461,2.145876485,77.2240845,213.6662285,673.5415721,1340.156664 +25.65362845,2.116332432,76.16273483,210.7692571,664.9823342,1324.52391 +26.09525625,2.087185434,75.1155096,207.9087252,656.50981,1309.01116 +26.54448669,2.058441885,74.0826507,205.0854336,648.1274441,1293.626363 +27.00145064,2.030106599,73.06434239,202.3000189,639.838157,1278.376448 +27.46628123,2.002182555,72.06070231,199.552929,631.6442626,1263.267152 +27.9391139,1.974667469,71.07165789,196.8440808,623.5463811,1248.300838 +28.42008638,1.947552008,70.09688236,194.1726819,615.5428693,1233.475337 +28.90933883,1.920823303,69.13592101,191.5375807,607.6309208,1218.786129 +29.40701376,1.894464946,68.18819118,188.9372662,599.8065617,1204.226325 +29.91325618,1.868456815,67.252976,186.3698504,592.0645921,1189.78654 +30.42821357,1.842786433,66.32983321,183.8342015,584.4021847,1175.462117 +30.95203597,1.817459063,65.41895865,181.3309518,576.8221002,1161.259627 +31.48487598,1.79248073,64.52057521,178.8608055,569.327318,1147.186097 +32.02688884,1.767856144,63.63485796,176.4243306,561.9203753,1133.247678 +32.57823247,1.743588547,62.76192889,174.0219447,554.6033189,1119.449545 +33.13906749,1.719679562,61.9018512,171.6538992,547.3776532,1105.795783 +33.7095573,1.696129018,61.05462328,169.3202624,540.2442849,1092.289272 +34.2898681,1.672934772,60.2201722,167.0209014,533.2034634,1078.931562 +34.88016897,1.650092526,59.39834717,164.7554644,526.254722,1065.722744 +35.48063188,1.627597128,58.58896634,162.5235102,519.3972901,1052.662281 +36.09143178,1.605443931,57.79186582,160.3246443,512.6305284,1039.749888 +36.7127466,1.583626269,57.00680871,158.1582667,505.9531221,1026.983898 +37.34475738,1.562134932,56.23346637,156.02352,499.3629139,1014.360913 +37.98764824,1.540957936,55.47141009,153.9192663,492.856828,1001.875643 +38.64160648,1.520080275,54.72010213,151.8440624,486.4307892,989.5207403 +39.30682262,1.499483654,53.97888618,149.7961332,480.0796366,977.2866121 +39.98349048,1.479146684,53.24699435,147.7733915,473.7971844,965.1615397 +40.67180718,1.459059663,52.52407935,145.7749146,467.5809585,953.1413267 +41.37197328,1.439229136,51.81037853,143.8014003,461.4336669,941.2323258 +42.08419275,1.419661968,51.10614067,141.8535766,455.3581049,929.4410731 +42.8086731,1.400364257,50.41158682,139.9320923,449.3568055,917.7735749 +43.54562539,1.38134124,49.72690689,138.0375084,443.4320092,906.2352418 +44.29526433,1.362597188,49.05225598,136.1702876,437.5856302,894.8308181 +45.05780833,1.344135092,48.38774292,134.3307623,431.8191543,883.5641686 +45.83347953,1.325952547,47.73328224,132.5187241,426.1323161,872.435569 +46.62250394,1.308041469,47.08858393,130.7333951,420.523005,861.4415008 +47.42511142,1.290391273,46.45326784,128.9737456,414.988285,850.5767315 +48.2415358,1.272988793,45.82686089,127.238486,409.5243686,839.8342567 +49.07201495,1.255818058,45.20878888,125.526045,404.1265433,829.2051459 +49.91679081,1.23886035,44.59837866,123.8345746,398.7891907,818.6785761 +50.77610952,1.222108678,43.99537927,122.1633981,393.5104469,808.2514016 +51.65022141,1.205576097,43.4002612,120.5138407,388.2948868,797.9336894 +52.53938116,1.189277544,42.81356275,118.8874151,383.1476831,787.7367434 +53.44384781,1.173228262,42.23583318,117.2856633,378.0740982,777.6720606 +54.36388488,1.157443789,41.66763232,115.7101561,373.0794809,767.7513232 +55.29976041,1.141938008,41.10946033,114.1622976,368.1686373,757.9851027 +56.25174706,1.126709161,40.56125432,112.6419275,363.3413207,748.3735662 +57.22012218,1.111746235,40.02261821,111.1479591,358.5942855,738.9106863 +58.2051679,1.097035614,39.49306206,109.6790445,353.9234295,729.5886437 +59.2071712,1.082560892,38.97199562,108.233556,349.3237359,720.397705 +60.22642402,1.068303143,38.4587378,106.8096131,344.7893582,711.3263945 +61.26322329,1.054245875,37.95269513,105.4055775,340.3152198,702.3647947 +62.31787109,1.040373294,37.45329922,104.0198803,335.8964555,693.5033962 +63.39067467,1.026666897,36.95988413,102.6506806,331.527312,684.7308283 +64.48194659,1.013105189,36.47167628,101.295838,327.2010569,676.0336704 +65.59200479,0.999672014,35.98809418,99.95374522,322.9126689,667.4020081 +66.72117266,0.98638462,35.50975894,98.6261343,318.6679073,658.8481927 +67.86977918,0.973270658,35.03766606,97.31577693,314.4758876,650.391523 +69.03815899,0.96035976,34.57288241,96.02564263,310.3463631,642.0526305 +70.22665249,0.947681319,34.11646631,94.75867682,306.2890075,633.8519961 +71.43560592,0.935237108,33.66848163,93.51506253,302.3045625,625.7916223 +72.66537152,0.92300744,33.22821976,92.29283677,298.3868252,617.859121 +73.91630756,0.910969003,32.79484151,91.08967353,294.5284099,610.0396264 +75.1887785,0.899096355,32.36743105,89.90303342,290.721232,602.3167961 +76.48315505,0.887381333,31.94569463,88.73210464,286.9627848,594.6858185 +77.79981432,0.87583019,31.52985734,87.57751622,283.255216,587.1515138 +79.13913992,0.864449339,31.12015012,86.43991319,279.6007203,579.7187947 +80.50152203,0.853244268,30.71677062,85.31984781,276.0011887,572.3919376 +81.88735758,0.842215369,30.31973295,84.21736239,272.4568578,565.171781 +83.29705033,0.831360112,29.92894608,83.13220691,268.9670141,558.0571817 +84.73101096,0.820674738,29.54427477,82.06400838,265.5305414,551.0461498 +86.18965727,0.810152366,29.16547124,81.01208101,262.1453067,544.1345726 +87.6734142,0.799781121,28.79210809,79.97523986,258.807557,537.3149608 +89.18271404,0.789546648,28.42366854,78.95205157,255.5127306,530.5781303 +90.71799651,0.779437029,28.05972356,77.94132633,252.2570491,523.9165076 +92.27970891,0.769462739,27.70065026,76.94411343,249.0439769,517.3375508 +93.86830622,0.759642408,27.34711934,75.9622775,245.8796152,510.854193 +95.48425127,0.749993236,26.99975006,74.99754019,242.7696004,504.4784018 +97.12801485,0.740510766,26.65838191,74.04945709,239.7125549,498.2075666 +98.80007586,0.731177529,26.32238608,73.11628284,236.7028859,492.0303042 +100.5009214,0.721975121,25.99110001,72.1961782,233.7346928,485.9345758 +102.2310471,0.712898607,25.66434602,71.28865075,230.8064318,479.9173863 +103.9909569,0.703950268,25.34220631,70.39392981,227.918893,473.9805851 +105.7811637,0.695131988,25.02474866,69.51220457,225.0727341,468.1257405 +107.6021888,0.686445135,24.71202231,68.64361269,222.2684438,462.3540625 +109.454563,0.677890505,24.40405596,67.78823467,219.5063237,456.666365 +111.3388258,0.669468265,24.10085559,66.94608785,216.7864683,451.0630255 +113.2555262,0.661177885,23.80240216,66.11711998,214.1087451,445.5439417 +115.2052227,0.653018072,23.50864909,65.3012023,211.4727715,440.1084848 +117.1884833,0.644986693,23.21951964,64.49812218,208.8778917,434.7554499 +119.2058857,0.637080698,22.93490401,63.70757518,206.3231502,429.4830026 +121.2580178,0.629296037,22.65465634,62.92915658,203.8072655,424.288622 +123.3454774,0.621627564,22.37859143,62.16235238,201.3285999,419.1690396 +125.4688726,0.614069435,22.1064989,61.40657855,198.8852876,414.1205045 +127.6288221,0.606620124,21.8383238,60.66168288,196.4768596,409.1421682 +129.8259552,0.599280886,21.57411133,59.92779116,194.103746,404.2350492 +132.060912,0.592052562,21.31389175,59.20498781,191.7662415,399.3998793 +134.3343437,0.584935481,21.0576769,58.49330598,189.4644738,394.6370377 +136.6469125,0.577929407,20.80545828,57.79272231,187.1983862,389.946515 +138.9992922,0.571033481,20.55720499,57.1031512,184.9677192,385.3278751 +141.3921682,0.564246163,20.31286159,56.42443882,182.7719914,380.7802145 +143.8262377,0.557565165,20.07234569,55.75635653,180.6104781,376.3021184 +146.3022097,0.550987381,19.83554551,55.09859403,178.4821887,371.8916139 +148.8208056,0.544508816,19.6023172,54.45075183,176.3858431,367.5461202 +151.3827591,0.538125644,19.37252304,53.81244759,174.3202158,363.2631654 +153.9888168,0.531837812,19.14616109,53.18367599,172.2853016,359.0428175 +156.6397379,0.525645949,18.92325405,52.56450024,170.2813169,354.8856018 +159.3362945,0.519550236,18.70380838,51.95493839,168.3083307,350.7917341 +162.0792725,0.513550353,18.48781261,51.35495866,166.3662503,346.7610893 +164.8694709,0.507645434,18.27523556,50.76447451,164.4548047,342.7931678 +167.7077027,0.501834013,18.06602439,50.1833393,162.5735277,338.8870601 +170.5947946,0.496113963,17.86010262,49.61134062,160.7217394,335.0414081 +173.5315879,0.490482443,17.65736789,49.04819421,158.8985267,331.2543644 +176.5189382,0.484936581,17.45771689,48.49361314,157.1029672,327.5240596 +179.5577158,0.479476162,17.2611418,47.94757577,155.3349975,323.8504122 +182.648806,0.474101453,17.06765226,47.41010892,153.594711,320.2336647 +185.7931094,0.46881229,16.87724242,46.88119639,151.8820609,316.6737661 +188.991542,0.463608039,16.68988937,46.36077457,150.1968467,313.1703418 +192.2450358,0.458487542,16.50555149,45.84872789,148.5386992,309.7226635 +195.5545385,0.453449074,16.32416666,45.34488382,146.9070641,306.3296152 +198.9210144,0.44849029,16.14565042,44.84900778,145.3011861,302.9896589 +202.3454442,0.443609121,15.96992835,44.36089307,143.7203995,299.7014423 +205.8288257,0.43880543,15.79699548,43.88052594,142.1646638,296.4649141 +209.3721737,0.434079077,15.62684675,43.40789233,140.6339369,293.2800189 +212.9765204,0.429429494,15.45946177,42.94293562,139.128039,290.1464114 +216.6429161,0.424855648,15.29480332,42.48555245,137.6466381,287.0634285 +220.3724289,0.420355993,15.13281576,42.03558826,136.1892366,284.0300592 +224.1661453,0.415928432,14.97342355,41.59283327,134.7551575,281.0449175 +228.0251707,0.411571221,14.81656396,41.15711321,133.3438387,278.1068554 +231.9506293,0.407284012,14.66222442,40.72839318,131.9551695,275.2156649 +235.9436647,0.403066281,14.5103861,40.30662087,130.5889826,272.3710191 +240.0054403,0.39891708,14.36101488,39.89170157,129.2449732,269.5723026 +244.1371395,0.394834998,14.21405993,39.48349404,127.9226857,266.8185846 +248.3399659,0.390818115,14.06945213,39.0818063,126.6214997,264.1085898 +252.6151442,0.38686459,13.92712525,38.68645439,125.340821,261.4410957 +256.9639197,0.382974157,13.78706966,38.29741155,124.0805643,258.8159412 +261.3875595,0.37914662,13.64927832,37.91465825,122.8406677,256.2330127 +265.8873523,0.375381429,13.51373144,37.53813952,121.6209545,253.6919561 +270.4646092,0.371677645,13.38039523,37.1677615,120.4211218,251.1921535 +275.1206637,0.368033948,13.24922214,36.80339214,119.2407429,248.7327278 +279.8568722,0.364449657,13.12018767,36.44496331,118.0795981,246.3132332 +284.6746147,0.360924872,12.99329539,36.09248501,116.9377208,243.9337508 +289.5752947,0.357459445,12.86854003,35.74594258,115.8150644,241.5941946 +294.5603401,0.354052906,12.7459046,35.40528881,114.7114767,239.2942574 +299.6312031,0.350704438,12.62535975,35.07044218,113.6266945,237.0333999 +304.7893612,0.347413468,12.50688484,34.74134535,112.5605326,234.8112452 +310.036317,0.344179929,12.39047744,34.41799162,111.51297,232.627758 +315.3735994,0.341003513,12.27612646,34.10035013,110.4839074,230.4827393 +320.8027631,0.337883584,12.16380901,33.78835734,109.4731394,228.3757687 +326.3253901,0.334819149,12.05348936,33.48191395,108.4803449,226.3061832 +331.9430892,0.331808823,11.94511763,33.18088148,107.5050757,224.2730548 +337.6574971,0.328850795,11.83862862,32.88507875,106.5467452,222.2751662 +343.4702787,0.325942787,11.73394032,32.59427799,105.6046159,220.3109848 +349.3831274,0.323082047,11.6309537,32.30820413,104.6777969,218.3786579 +355.397766,0.320267002,11.52961207,32.02669964,103.7657783,216.4771268 +361.5159467,0.317498229,11.42993626,31.74982245,102.8687479,214.6067886 +367.7394521,0.314776335,11.33194805,31.47763303,101.9869021,212.7680576 +374.0700952,0.312101744,11.23566277,31.21017396,101.1203791,210.9612265 +380.5097205,0.309474683,11.1410886,30.94746797,100.2692529,209.1864537 +387.0602041,0.306895162,11.04822583,30.68951588,99.43352617,207.4437493 +393.7234544,0.304362947,10.95706608,30.43629436,98.61312377,205.7329597 +400.5014127,0.30187755,10.86759181,30.18775477,97.8078882,204.05376 +407.3960537,0.29943843,10.77978348,29.94384277,97.01764363,202.4057867 +414.4093862,0.297044969,10.69361887,29.70449664,96.24219026,200.7886259 +421.5434533,0.29469626,10.60906537,29.46962582,95.48123488,199.201669 +428.8003335,0.292391076,10.52607875,29.23910747,94.73437956,197.6440883 +436.1821411,0.290127836,10.44460211,29.01278347,94.00111221,196.1148181 +443.6910267,0.287904575,10.3645647,28.79045734,93.28079634,194.6125329 +451.3291779,0.285719063,10.28588625,28.57190613,92.5727097,193.135728 +459.0988201,0.283570686,10.2085447,28.3570685,91.87665366,191.6839912 +467.0022169,0.281460056,10.132562,28.14600545,91.192826,190.257737 +475.0416708,0.279387684,10.05795664,27.93876834,90.52139318,188.8573145 +483.2195241,0.277353946,9.984742072,27.73539456,89.86247646,187.4829786 +491.5381593,0.275359062,9.912926215,27.53590607,89.21614707,186.1348794 +500,0.273403089,9.84251119,27.34030879,88.58242423,184.8130587 diff --git a/hadrons/utils/jaffe_theory.py b/hadrons/utils/jaffe_theory.py new file mode 100644 index 0000000..523594e --- /dev/null +++ b/hadrons/utils/jaffe_theory.py @@ -0,0 +1,94 @@ +from math import exp, log, pi, sin, sqrt + +import mpmath +import pandas as pd +from scipy.special import hankel1 + +from hadrons.utils.common import calculate_track_radius, get_LET_per_um +from hadrons.utils.consts import W, alpha, ion_diff, ion_mobility + + +def Jaffe_theory( + x, + voltage_V, + electrode_gap_cm, + input_is_LET=True, + particle="proton", + IC_angle_rad=0.0, + **kwargs, +): + """ + The Jaffe theory for initial recombination. Returns the inverse + collection efficiency, i.e. the recombination correction factor + """ + + # provide either x as LET (keV/um) or enery (MeV/u), default is input_is_LET=True + if not input_is_LET: + LET_keV_um = get_LET_per_um(x, particle=particle) + + LET_eV_cm = LET_keV_um * 1e7 + electric_field = voltage_V / electrode_gap_cm + + # estimate the Gaussian track radius for the given LET + b_cm = calculate_track_radius(LET_keV_um) + + N0 = LET_eV_cm / W + g = alpha * N0 / (8.0 * pi * ion_diff) + + # ion track inclined with respect to the electric field? + if abs(IC_angle_rad) > 0: + x = ( + b_cm * ion_mobility * electric_field * sin(IC_angle_rad) / (2 * ion_diff) + ) ** 2 + + def nasty_function(y): + order = 0.0 + if y < 1e3: + # exp() overflows for larger y + value = exp(y) * (1j * pi / 2) * hankel1(order, 1j * y) + else: + # approximation from Zankowski and Podgorsak (1998) + value = sqrt(2.0 / (pi * y)) + return value + + f = 1.0 / (1 + g * nasty_function(x)).real + + else: + """ + Pretty ugly function splitted up in three parts using mpmath package for precision + """ + factor = ( + mpmath.exp(-1.0 / g) + * ion_mobility + * b_cm**2 + * electric_field + / (2.0 * g * electrode_gap_cm * ion_diff) + ) + first_term = mpmath.ei( + 1.0 / g + + log( + 1.0 + + ( + 2.0 + * electrode_gap_cm + * ion_diff + / (ion_mobility * b_cm**2 * electric_field) + ) + ) + ) + second_term = mpmath.ei(1.0 / g) + f = factor * (first_term - second_term) + + result_dic = { + "particle": particle, + "LET_keV_um": LET_keV_um, + "voltage_V": voltage_V, + "electrode_gap_cm": electrode_gap_cm, + "IC_angle_rad": IC_angle_rad, + "ks_Jaffe": float(1 / f), + } + + if not input_is_LET: + result_dic["E_MeV_u"] = x + + return pd.DataFrame([result_dic]) diff --git a/hadrons/utils/track_distribution.py b/hadrons/utils/track_distribution.py new file mode 100644 index 0000000..a84e231 --- /dev/null +++ b/hadrons/utils/track_distribution.py @@ -0,0 +1,45 @@ +import numpy as np +from numpy.random import Generator, default_rng + + +def create_track_distribution( + computation_time_steps: int, + dt: float, + number_of_tracks: int, + separation_time_steps: int, + random_generator: Generator = default_rng(2137), +): + # Time when the tracks can be generated + beam_generation_time = (computation_time_steps - separation_time_steps) * dt + + # Generate a random delay for each beam (between 0, 1) + track_delay = random_generator.random(number_of_tracks) + + # Make the delays relative to each other (add the sum of previous delays to each element) + summed_delays = np.cumsum(track_delay) + + # Normalize the delays to fit in the beam generation time + + # two implementations: 1st is the original, it's biased towards the end of the beam generation + # time since it normalizes via the last element, the 2nd implementation normalizes by the + # number of beams - this ensures a uniform distribution of beams over the beam generation time + # TODO: check if the 1st implementation bias was intentional or accidental + + # normalized_delays = summed_delays / summed_delays[-1] * beam_generation_time + normalized_delays = summed_delays / number_of_tracks * beam_generation_time + + # create a bin for each time step + bins = np.arange(0.0, beam_generation_time + dt, dt) + + # count the delays by the bin they fall into + initialise_tracks = np.asarray( + np.histogram(normalized_delays, bins)[0], dtype=np.int32 + ) + + # append the zeros to the track distribution to match the computation time steps + dont_initialise_tracks = np.zeros(separation_time_steps) + track_times_histrogram = np.asarray( + np.concatenate((initialise_tracks, dont_initialise_tracks)), dtype=np.int32 + ) + + return track_times_histrogram diff --git a/requirements.txt b/requirements.txt index 4f7f27b..d5b8be6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ seaborn numba isort flake8 -flake8-isort \ No newline at end of file +flake8-isort +tqdm \ No newline at end of file diff --git a/tests/ks_initial/generate_expected_result.py b/tests/ks_initial/generate_expected_result.py index 87eedf2..af992b3 100644 --- a/tests/ks_initial/generate_expected_result.py +++ b/tests/ks_initial/generate_expected_result.py @@ -1,11 +1,13 @@ -import numpy as np -import pandas as pd import argparse import sys from pathlib import Path -from hadrons.functions import Jaffe_theory + +import numpy as np +import pandas as pd from testing_parameters import MATRIX_DF +from hadrons.utils.jaffe_theory import Jaffe_theory + # absolute path of the file as string ABS_PATH = str(Path(__file__).parent.absolute()) diff --git a/tests/ks_initial/testing_parameters.py b/tests/ks_initial/testing_parameters.py index 701dd1b..a8a675d 100644 --- a/tests/ks_initial/testing_parameters.py +++ b/tests/ks_initial/testing_parameters.py @@ -1,7 +1,7 @@ -import numpy as np -import pandas as pd import itertools +import pandas as pd + # set parameters TEST_DATA_DICT = dict( E_MeV_u=[10, 250], diff --git a/tests/test_single_track_cython.py b/tests/test_single_track_cython.py.disabled similarity index 97% rename from tests/test_single_track_cython.py rename to tests/test_single_track_cython.py.disabled index 76dabc7..2adacf8 100644 --- a/tests/test_single_track_cython.py +++ b/tests/test_single_track_cython.py.disabled @@ -1,50 +1,51 @@ -""" -test_single_track_cython.py -""" - -import pytest -import numpy as np -from tests.ks_initial.testing_parameters import TEST_DATA_DICT -from hadrons.solver import SolverType, solvePDE -from tests.utils import get_PDEsolver_input - - -@pytest.mark.single_track -@pytest.mark.cython -@pytest.mark.parametrize("E_MeV_u", TEST_DATA_DICT["E_MeV_u"]) -@pytest.mark.parametrize("voltage_V", TEST_DATA_DICT["voltage_V"]) -@pytest.mark.parametrize("electrode_gap_cm", TEST_DATA_DICT["electrode_gap_cm"]) -@pytest.mark.parametrize("particle", TEST_DATA_DICT["particle"]) -@pytest.mark.parametrize("grid_size_um", TEST_DATA_DICT["grid_size_um"]) -def test_single_track_PDEsolver_cython( - E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um, expected_result -): - single_track_PDEsolver_input = get_PDEsolver_input( - E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um - ) - calculated_result = solvePDE(single_track_PDEsolver_input, SolverType.CYTHON) - - assert calculated_result is not None - assert isinstance(calculated_result, float) - # TODO: Add resonable range sanity test here - # assert calculated_result >= reasonable_minimum and calculated_result <= reasonable_maximum - - def row_filter(row): - return ( - row.particle == particle - and np.allclose(row.LET_keV_um, single_track_PDEsolver_input["LET_keV_um"]) - and row.voltage_V == single_track_PDEsolver_input["voltage_V"] - and row.electrode_gap_cm == single_track_PDEsolver_input["electrode_gap_cm"] - and row.IC_angle_rad == single_track_PDEsolver_input["IC_angle_rad"] - and row.E_MeV_u == single_track_PDEsolver_input["E_MeV_u"] - ) - - expected = expected_result[ - [idx for idx, row in enumerate(expected_result) if row_filter(row)] - ] - - print(calculated_result) - - assert len(expected) > 0 - - assert np.allclose(expected[0]["ks_Jaffe"], calculated_result, rtol=1e-3) +""" +test_single_track_cython.py +""" + +import numpy as np +import pytest + +from hadrons.solver import SolverType, solvePDE +from tests.ks_initial.testing_parameters import TEST_DATA_DICT +from tests.utils import get_PDEsolver_input + + +@pytest.mark.single_track +@pytest.mark.cython +@pytest.mark.parametrize("E_MeV_u", TEST_DATA_DICT["E_MeV_u"]) +@pytest.mark.parametrize("voltage_V", TEST_DATA_DICT["voltage_V"]) +@pytest.mark.parametrize("electrode_gap_cm", TEST_DATA_DICT["electrode_gap_cm"]) +@pytest.mark.parametrize("particle", TEST_DATA_DICT["particle"]) +@pytest.mark.parametrize("grid_size_um", TEST_DATA_DICT["grid_size_um"]) +def test_single_track_PDEsolver_cython( + E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um, expected_result +): + single_track_PDEsolver_input = get_PDEsolver_input( + E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um + ) + calculated_result = solvePDE(single_track_PDEsolver_input, SolverType.CYTHON) + + assert calculated_result is not None + assert isinstance(calculated_result, float) + # TODO: Add resonable range sanity test here + # assert calculated_result >= reasonable_minimum and calculated_result <= reasonable_maximum + + def row_filter(row): + return ( + row.particle == particle + and np.allclose(row.LET_keV_um, single_track_PDEsolver_input["LET_keV_um"]) + and row.voltage_V == single_track_PDEsolver_input["voltage_V"] + and row.electrode_gap_cm == single_track_PDEsolver_input["electrode_gap_cm"] + and row.IC_angle_rad == single_track_PDEsolver_input["IC_angle_rad"] + and row.E_MeV_u == single_track_PDEsolver_input["E_MeV_u"] + ) + + expected = expected_result[ + [idx for idx, row in enumerate(expected_result) if row_filter(row)] + ] + + print(calculated_result) + + assert len(expected) > 0 + + assert np.allclose(expected[0]["ks_Jaffe"], calculated_result, rtol=1e-3) diff --git a/tests/test_single_track_numba.py b/tests/test_single_track_numba.py.disabled similarity index 94% rename from tests/test_single_track_numba.py rename to tests/test_single_track_numba.py.disabled index 28daa02..45b6c30 100644 --- a/tests/test_single_track_numba.py +++ b/tests/test_single_track_numba.py.disabled @@ -1,53 +1,53 @@ -""" -test_single_track_numba.py -""" - -import pytest -import numpy as np -from tests.ks_initial.testing_parameters import TEST_DATA_DICT -from hadrons.functions import E_MeV_u_to_LET_keV_um, calc_b_cm -from hadrons.solver import SolverType, solvePDE -from tests.utils import get_PDEsolver_input - - -@pytest.mark.single_track -@pytest.mark.numba -@pytest.mark.parametrize("E_MeV_u", TEST_DATA_DICT["E_MeV_u"]) -@pytest.mark.parametrize("voltage_V", TEST_DATA_DICT["voltage_V"]) -@pytest.mark.parametrize("electrode_gap_cm", TEST_DATA_DICT["electrode_gap_cm"]) -@pytest.mark.parametrize("particle", TEST_DATA_DICT["particle"]) -@pytest.mark.parametrize("grid_size_um", TEST_DATA_DICT["grid_size_um"]) -def test_single_track_PDEsolver_numba( - E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um, expected_result -): - single_track_PDEsolver_input = get_PDEsolver_input( - E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um - ) - calculated_result = solvePDE( - single_track_PDEsolver_input, SolverType.NUMBA_PARALLEL - ) - - assert calculated_result is not None - assert isinstance(calculated_result, float) - # TODO: Add resonable range sanity test here - # assert calculated_result >= reasonable_minimum and calculated_result <= reasonable_maximum - - def row_filter(row): - return ( - row.particle == particle - and np.allclose(row.LET_keV_um, single_track_PDEsolver_input["LET_keV_um"]) - and row.voltage_V == single_track_PDEsolver_input["voltage_V"] - and row.electrode_gap_cm == single_track_PDEsolver_input["electrode_gap_cm"] - and row.IC_angle_rad == single_track_PDEsolver_input["IC_angle_rad"] - and row.E_MeV_u == single_track_PDEsolver_input["E_MeV_u"] - ) - - expected = expected_result[ - [idx for idx, row in enumerate(expected_result) if row_filter(row)] - ] - - print(calculated_result) - - assert len(expected) > 0 - - assert np.allclose(expected[0]["ks_Jaffe"], calculated_result, rtol=1e-3) +""" +test_single_track_numba.py +""" + +import numpy as np +import pytest + +from hadrons.solver import SolverType, solvePDE +from tests.ks_initial.testing_parameters import TEST_DATA_DICT +from tests.utils import get_PDEsolver_input + + +@pytest.mark.single_track +@pytest.mark.numba +@pytest.mark.parametrize("E_MeV_u", TEST_DATA_DICT["E_MeV_u"]) +@pytest.mark.parametrize("voltage_V", TEST_DATA_DICT["voltage_V"]) +@pytest.mark.parametrize("electrode_gap_cm", TEST_DATA_DICT["electrode_gap_cm"]) +@pytest.mark.parametrize("particle", TEST_DATA_DICT["particle"]) +@pytest.mark.parametrize("grid_size_um", TEST_DATA_DICT["grid_size_um"]) +def test_single_track_PDEsolver_numba( + E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um, expected_result +): + single_track_PDEsolver_input = get_PDEsolver_input( + E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um + ) + calculated_result = solvePDE( + single_track_PDEsolver_input, SolverType.NUMBA_PARALLEL + ) + + assert calculated_result is not None + assert isinstance(calculated_result, float) + # TODO: Add resonable range sanity test here + # assert calculated_result >= reasonable_minimum and calculated_result <= reasonable_maximum + + def row_filter(row): + return ( + row.particle == particle + and np.allclose(row.LET_keV_um, single_track_PDEsolver_input["LET_keV_um"]) + and row.voltage_V == single_track_PDEsolver_input["voltage_V"] + and row.electrode_gap_cm == single_track_PDEsolver_input["electrode_gap_cm"] + and row.IC_angle_rad == single_track_PDEsolver_input["IC_angle_rad"] + and row.E_MeV_u == single_track_PDEsolver_input["E_MeV_u"] + ) + + expected = expected_result[ + [idx for idx, row in enumerate(expected_result) if row_filter(row)] + ] + + print(calculated_result) + + assert len(expected) > 0 + + assert np.allclose(expected[0]["ks_Jaffe"], calculated_result, rtol=1e-3) diff --git a/tests/test_single_track_python.py b/tests/test_single_track_python.py.disabled similarity index 94% rename from tests/test_single_track_python.py rename to tests/test_single_track_python.py.disabled index b8cf08f..da7b681 100644 --- a/tests/test_single_track_python.py +++ b/tests/test_single_track_python.py.disabled @@ -1,51 +1,51 @@ -""" -test_single_track_python.py -""" - -import pytest -import numpy as np -from tests.ks_initial.testing_parameters import TEST_DATA_DICT -from hadrons.functions import E_MeV_u_to_LET_keV_um, calc_b_cm -from hadrons.solver import SolverType, solvePDE -from tests.utils import get_PDEsolver_input - - -@pytest.mark.single_track -@pytest.mark.python -@pytest.mark.parametrize("E_MeV_u", TEST_DATA_DICT["E_MeV_u"]) -@pytest.mark.parametrize("voltage_V", TEST_DATA_DICT["voltage_V"]) -@pytest.mark.parametrize("electrode_gap_cm", TEST_DATA_DICT["electrode_gap_cm"]) -@pytest.mark.parametrize("particle", TEST_DATA_DICT["particle"]) -@pytest.mark.parametrize("grid_size_um", TEST_DATA_DICT["grid_size_um"]) -def test_single_track_PDEsolver_python( - E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um, expected_result -): - single_track_PDEsolver_input = get_PDEsolver_input( - E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um - ) - calculated_result = solvePDE(single_track_PDEsolver_input, SolverType.PYTHON) - - assert calculated_result is not None - assert isinstance(calculated_result, float) - # TODO: Add resonable range sanity test here - # assert calculated_result >= reasonable_minimum and calculated_result <= reasonable_maximum - - def row_filter(row): - return ( - row.particle == particle - and np.allclose(row.LET_keV_um, single_track_PDEsolver_input["LET_keV_um"]) - and row.voltage_V == single_track_PDEsolver_input["voltage_V"] - and row.electrode_gap_cm == single_track_PDEsolver_input["electrode_gap_cm"] - and row.IC_angle_rad == single_track_PDEsolver_input["IC_angle_rad"] - and row.E_MeV_u == single_track_PDEsolver_input["E_MeV_u"] - ) - - expected = expected_result[ - [idx for idx, row in enumerate(expected_result) if row_filter(row)] - ] - - print(calculated_result) - - assert len(expected) > 0 - - assert np.allclose(expected[0]["ks_Jaffe"], calculated_result, rtol=1e-3) +""" +test_single_track_python.py +""" + +import numpy as np +import pytest + +from hadrons.solver import SolverType, solvePDE +from tests.ks_initial.testing_parameters import TEST_DATA_DICT +from tests.utils import get_PDEsolver_input + + +@pytest.mark.single_track +@pytest.mark.python +@pytest.mark.parametrize("E_MeV_u", TEST_DATA_DICT["E_MeV_u"]) +@pytest.mark.parametrize("voltage_V", TEST_DATA_DICT["voltage_V"]) +@pytest.mark.parametrize("electrode_gap_cm", TEST_DATA_DICT["electrode_gap_cm"]) +@pytest.mark.parametrize("particle", TEST_DATA_DICT["particle"]) +@pytest.mark.parametrize("grid_size_um", TEST_DATA_DICT["grid_size_um"]) +def test_single_track_PDEsolver_python( + E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um, expected_result +): + single_track_PDEsolver_input = get_PDEsolver_input( + E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um + ) + calculated_result = solvePDE(single_track_PDEsolver_input, SolverType.PYTHON) + + assert calculated_result is not None + assert isinstance(calculated_result, float) + # TODO: Add resonable range sanity test here + # assert calculated_result >= reasonable_minimum and calculated_result <= reasonable_maximum + + def row_filter(row): + return ( + row.particle == particle + and np.allclose(row.LET_keV_um, single_track_PDEsolver_input["LET_keV_um"]) + and row.voltage_V == single_track_PDEsolver_input["voltage_V"] + and row.electrode_gap_cm == single_track_PDEsolver_input["electrode_gap_cm"] + and row.IC_angle_rad == single_track_PDEsolver_input["IC_angle_rad"] + and row.E_MeV_u == single_track_PDEsolver_input["E_MeV_u"] + ) + + expected = expected_result[ + [idx for idx, row in enumerate(expected_result) if row_filter(row)] + ] + + print(calculated_result) + + assert len(expected) > 0 + + assert np.allclose(expected[0]["ks_Jaffe"], calculated_result, rtol=1e-3) diff --git a/tests/utils.py b/tests/utils.py index 14f8ed8..343a221 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,9 +1,9 @@ -from hadrons.functions import E_MeV_u_to_LET_keV_um, calc_b_cm +from hadrons.utils.common import calculate_track_radius, get_LET_per_um def get_PDEsolver_input(E_MeV_u, voltage_V, electrode_gap_cm, particle, grid_size_um): - LET_keV_um = E_MeV_u_to_LET_keV_um(E_MeV_u, particle) - track_radius_cm = calc_b_cm(LET_keV_um) + LET_keV_um = get_LET_per_um(E_MeV_u, particle) + track_radius_cm = calculate_track_radius(LET_keV_um) return dict( LET_keV_um=float(LET_keV_um),