def create_table(dir_name): particle_defs = [ pp.particle.MuMinusDef(), pp.particle.TauMinusDef(), pp.particle.EMinusDef() ] cuts = [ pp.EnergyCutSettings(-1, -1), pp.EnergyCutSettings(500, -1), pp.EnergyCutSettings(-1, 0.05), pp.EnergyCutSettings(500, 0.05) ] mediums = [ pp.medium.Ice(1.0), pp.medium.Hydrogen(1.0), pp.medium.Uranium(1.0) ] initial_energy = np.logspace(4, 13, num=10) # MeV final_energy = initial_energy - 1000 pp.RandomGenerator.get().set_seed(0) np.random.seed(123) with open(dir_name + "continous_randomization.txt", "w") as file: for particle in particle_defs: for medium in mediums: for cut in cuts: utility = pp.Utility(particle, medium, cut, pp.UtilityDefinition(), pp.InterpolationDef()) cont_rand = pp.ContinuousRandomizer( utility, pp.InterpolationDef()) buf = [""] for i in range(len(initial_energy)): rnd = np.random.random_sample() rand_energy = cont_rand.randomize( initial_energy[i], final_energy[i], rnd) buf.append(str(rnd)) buf.append(particle.name) buf.append(medium.name) buf.append(str(cut.ecut)) buf.append(str(cut.vcut)) buf.append(str(initial_energy[i])) buf.append(str(final_energy[i])) buf.append(str(rand_energy)) buf.append("\n") file.write("\t".join(buf))
def test_proposal(): # ========================================================= # Propagate # ========================================================= # initialize propagator args = { "particle_def": pp.particle.MuMinusDef(), "target": pp.medium.Ice(), "interpolate": True, "cuts": pp.EnergyCutSettings(500, 0.05) } cross = pp.crosssection.make_std_crosssection(**args) collection = pp.PropagationUtilityCollection() collection.displacement = pp.make_displacement(cross, True) collection.interaction = pp.make_interaction(cross, True) collection.time = pp.make_time(cross, args["particle_def"], True) utility = pp.PropagationUtility(collection=collection) detector = pp.geometry.Sphere(pp.Cartesian3D(0, 0, 0), 1e20) density_distr = pp.density_distribution.density_homogeneous( args["target"].mass_density) prop = pp.Propagator(args["particle_def"], [(detector, utility, density_distr)]) # intialize initial state statistics = 100 init_state = pp.particle.ParticleState() init_state.energy = 1e8 # initial energy in MeV init_state.position = pp.Cartesian3D(0, 0, 0) init_state.direction = pp.Cartesian3D(0, 0, -1) init_state.time = 0 pp.RandomGenerator.get().set_seed(1234) for i in range(statistics): output = prop.propagate(init_state) energies = output.track_energies() times = output.track_times() E_old = init_state.energy t_old = init_state.time for E, t in zip(energies, times): energy_diff = E_old - E time_diff = t - t_old E_old = E t_old = t assert (energy_diff >= 0) assert (time_diff >= 0)
pp.parametrization.bremsstrahlung.PetrukhinShestakov, pp.parametrization.bremsstrahlung.CompleteScreening, pp.parametrization.bremsstrahlung.AndreevBezrukovBugaev, pp.parametrization.bremsstrahlung.SandrockSoedingreksoRhode ] particle_defs = [ pp.particle.MuMinusDef(), pp.particle.TauMinusDef(), pp.particle.EMinusDef() ] mediums = [pp.medium.Ice(1.0), pp.medium.Hydrogen(1.0), pp.medium.Uranium(1.0)] cuts = [ pp.EnergyCutSettings(-1, -1), pp.EnergyCutSettings(500, -1), pp.EnergyCutSettings(-1, 0.05), pp.EnergyCutSettings(500, 0.05) ] multiplier = 1. lpms = [0, 1] energies = np.logspace(4, 13, num=10) interpoldef = pp.InterpolationDef() def create_table_dEdx(dir_name, interpolate=False):
import proposal as pp import proposal.parametrization as parametrization from matplotlib.gridspec import GridSpec import matplotlib.pyplot as plt import matplotlib.ticker as ticker import numpy as np if __name__ == "__main__": mu = pp.particle.MuMinusDef() medium = pp.medium.StandardRock(1.0) # With densitiy correction cuts = pp.EnergyCutSettings(-1, -1) # ecut, vcut dEdx_epair = [] energy = np.logspace(2, 9, 100) interpolation_def = pp.InterpolationDef() # ========================================================= # Constructor args for parametrizations # # - particle # - medium # - cut # - multiplier # - lpm effect # - interpolation definition # ========================================================= param_defs = [mu, medium, cuts, 1.0, False, interpolation_def]
def propagate_deflected_muons(initial_energies, minimum_energies, inter_type, deflection_type='continuous+stochastic', e_cut=500, v_cut=0.05, cont_rand=False, scattering_method="highlandintegral", beta=1.0, rnd_seed=1337, initial_direction=[0, 0, 1]): '''Propagate muon tracks with deflection. Scaling of Bremsstrahlung opening angle can be done by beta. Parameters ---------- initial_energies: list of energies minimum_energs: list of energies, lower propagation limit inter_type: list of interaction types for propagation/deflection deflection_type: string, choose one: 1. 'contiuous+stochastic' 2. 'continuous' 3. 'stochastic' beta: scaling factor for Bremsstrahlung e_cut, v_cut, cont_rand: usual PROPOSAL energy cut settings initial_direction: list of initial direction (cartesian coordinates) ''' pp.RandomGenerator.get().set_seed(rnd_seed) args = { "particle_def": pp.particle.MuMinusDef(), "target": pp.medium.Ice(), "interpolate": True, "cuts": pp.EnergyCutSettings(e_cut, v_cut, cont_rand) } cross = pp.crosssection.make_std_crosssection(**args) multiple_scatter = pp.make_multiple_scattering(scattering_method, args["particle_def"], args["target"], cross, True) stochastic_deflect = pp.make_default_stochastic_deflection( inter_type, args["particle_def"], args["target"]) collection = pp.PropagationUtilityCollection() collection.displacement = pp.make_displacement(cross, True) collection.interaction = pp.make_interaction(cross, True) collection.time = pp.make_time(cross, args["particle_def"], True) collection.decay = pp.make_decay(cross, args["particle_def"], True) if deflection_type == 'stochastic': print('stochastic deflection') if pp.particle.Interaction_Type.brems in inter_type: collection.scattering = pp.scattering.ScatteringMultiplier( stochastic_deflect, [(pp.particle.Interaction_Type.brems, beta)]) else: collection.scattering = pp.scattering.ScatteringMultiplier( stochastic_deflect, [(inter_type[0], 1.0)]) elif deflection_type == 'continuous': print('continuous deflection') collection.scattering = pp.scattering.ScatteringMultiplier( multiple_scatter, 1.0) elif deflection_type == 'continuous+stochastic': print('continuous and stochastic deflection') if pp.particle.Interaction_Type.brems in inter_type: collection.scattering = pp.scattering.ScatteringMultiplier( multiple_scatter, stochastic_deflect, 1.0, [(pp.particle.Interaction_Type.brems, beta)]) else: collection.scattering = pp.scattering.ScatteringMultiplier( multiple_scatter, stochastic_deflect, 1.0, [(inter_type[0], 1.0)]) utility = pp.PropagationUtility(collection=collection) detector = pp.geometry.Sphere(pp.Vector3D(0, 0, 0), 1e20) density_distr = pp.density_distribution.density_homogeneous( args["target"].mass_density) prop = pp.Propagator(args["particle_def"], [(detector, utility, density_distr)]) init_state = pp.particle.ParticleState() init_state.position = pp.Vector3D(0, 0, 0) init_state.direction = pp.Vector3D(initial_direction[0], initial_direction[1], initial_direction[2]) tracks = [] for E_i, E_min in zip(tqdm(initial_energies), minimum_energies): init_state.energy = E_i # initial energy in MeV track = prop.propagate(init_state, max_distance=1e9, min_energy=E_min) tracks.append(track) return tracks
import os import proposal as pp import numpy as np parametrizations = [ pp.parametrization.compton.KleinNishina(), ] mediums = [pp.medium.Ice(), pp.medium.Hydrogen(), pp.medium.Uranium()] particle = pp.particle.GammaDef() cuts = [ pp.EnergyCutSettings(np.inf, 1), pp.EnergyCutSettings(500, 1), pp.EnergyCutSettings(np.inf, 0.05), pp.EnergyCutSettings(500, 0.05) ] multiplier = 1. energies = np.logspace(4, 13, num=10) def create_tables(dir_name, **kwargs): pp.RandomGenerator.get().set_seed(1234) buf = {} for key in kwargs:
def propagate_muons(): mu_def = pp.particle.MuMinusDef() geometry = pp.geometry.Sphere(pp.Vector3D(), 1.e20, 0.0) ecut = 500 vcut = 5e-2 sector_def = pp.SectorDefinition() sector_def.cut_settings = pp.EnergyCutSettings(ecut, vcut) sector_def.medium = pp.medium.StandardRock(1.0) sector_def.geometry = geometry sector_def.scattering_model = pp.scattering.ScatteringModel.NoScattering sector_def.crosssection_defs.brems_def.lpm_effect = False sector_def.crosssection_defs.epair_def.lpm_effect = False # sector_def.crosssection_defs.photo_def.parametrization = pp.parametrization.photonuclear.PhotoParametrization.BezrukovBugaev # sector_def.do_stochastic_loss_weighting = True # sector_def.stochastic_loss_weighting = -0.1 detector = geometry interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables" interpolation_def.path_to_tables_readonly = "~/.local/share/PROPOSAL/tables" prop = pp.Propagator(mu_def, [sector_def], detector, interpolation_def) statistics_log = 4 statistics = int(10**statistics_log) propagation_length = 1e4 # cm E_min_log = 10.0 E_max_log = 10.0 spectral_index = 1.0 pp.RandomGenerator.get().set_seed(1234) # muon_energies = np.logspace(E_min_log, E_max_log, statistics) # muon_energies = power_law_sampler(spectral_index, 10**E_min_log, 10**E_max_log, statistics) muon_energies = np.ones(statistics)*10**10 epair_secondary_energy = [] brems_secondary_energy = [] ioniz_secondary_energy = [] photo_secondary_energy = [] mu_prop = pp.particle.DynamicData(mu_def.particle_type) mu_prop.position = pp.Vector3D(0, 0, 0) mu_prop.direction = pp.Vector3D(0, 0, -1) mu_prop.propagated_distance = 0 for mu_energy in tqdm(muon_energies): mu_prop.energy = mu_energy secondarys = prop.propagate(mu_prop, propagation_length) for sec in secondarys.particles: log_sec_energy = np.log10(sec.parent_particle_energy - sec.energy) if sec.type == int(pp.particle.Interaction_Type.Epair): epair_secondary_energy.append(log_sec_energy) if sec.type == int(pp.particle.Interaction_Type.Brems): brems_secondary_energy.append(log_sec_energy) if sec.type == int(pp.particle.Interaction_Type.DeltaE): ioniz_secondary_energy.append(log_sec_energy) if sec.type == int(pp.particle.Interaction_Type.NuclInt): photo_secondary_energy.append(log_sec_energy) # ========================================================= # Write # ========================================================= np.savez( 'data_sec_dist_{}_{}_Emin_{}_Emax_{}'.format( mu_def.name, sector_def.medium.name.lower(), E_min_log, E_max_log, ecut, vcut), brems=brems_secondary_energy, epair=epair_secondary_energy, photo=photo_secondary_energy, ioniz=ioniz_secondary_energy, statistics=[statistics], E_min=[E_min_log], E_max=[E_max_log], spectral_index=[spectral_index], distance=[propagation_length / 100], medium_name=[sector_def.medium.name.lower()], particle_name=[mu_def.name], ecut=[ecut], vcut=[vcut] )
def plot_theory_curve(): npzfile = np.load("data_sec_dist_MuMinus_standardrock_Emin_10.0_Emax_10.0.npz") ioniz_secondary_energy = npzfile['ioniz'] brems_secondary_energy = npzfile['brems'] photo_secondary_energy = npzfile['photo'] epair_secondary_energy = npzfile['epair'] all_secondary_energy = np.concatenate(( ioniz_secondary_energy, brems_secondary_energy, photo_secondary_energy, epair_secondary_energy) ) sum_hist = np.sum(all_secondary_energy) print(sum_hist) list_secondary_energies = [ ioniz_secondary_energy, brems_secondary_energy, photo_secondary_energy, epair_secondary_energy, all_secondary_energy ] list_secondary_energies_label = [ 'Ionization', 'Photonuclear', 'Bremsstrahlung', 'Pair Production', 'Sum' ] statistics = npzfile['statistics'][0] E_min_log = npzfile['E_min'][0] E_max_log = npzfile['E_max'][0] spectral_index = npzfile['spectral_index'][0] distance = npzfile['distance'][0] medium_name = npzfile['medium_name'][0] particle_name = npzfile['particle_name'][0] ecut = npzfile['ecut'][0] vcut = npzfile['vcut'][0] particle_def = pp.particle.MuMinusDef() medium = pp.medium.StandardRock(1.0) energy_cuts = pp.EnergyCutSettings(500, -1) multiplier = 1. lpm = False shadow_effect = pp.parametrization.photonuclear.ShadowButkevichMikhailov() add_pertubative = True interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables" ioniz = pp.parametrization.Ionization( particle_def=particle_def, medium=medium, energy_cuts=energy_cuts, multiplier=multiplier) epair = pp.parametrization.pairproduction.EpairProductionRhoInterpolant( particle_def=particle_def, medium=medium, energy_cuts=energy_cuts, multiplier=multiplier, lpm_effect=lpm, interpolation_def=interpolation_def) brems = pp.parametrization.bremsstrahlung.KelnerKokoulinPetrukhin( particle_def=particle_def, medium=medium, energy_cuts=energy_cuts, multiplier=multiplier, lpm_effect=lpm) photo = pp.parametrization.photonuclear.AbramowiczLevinLevyMaor97Interpolant( particle_def=particle_def, medium=medium, energy_cuts=energy_cuts, multiplier=multiplier, shadow_effect=shadow_effect, interpolation_def=interpolation_def) photo2 = pp.parametrization.photonuclear.BezrukovBugaev( particle_def=particle_def, medium=medium, energy_cuts=energy_cuts, multiplier=multiplier, add_pertubative=add_pertubative) losses_params = [ioniz, epair, brems, photo2] muon_energy = 10**10 # MeV inch_to_cm = 2.54 golden_ratio = 1.61803 width = 29.7 # cm num_bins = 100 v_bins = np.linspace(np.log10(500), np.log10(muon_energy), num_bins) v_bins_log = np.logspace(np.log10(500./muon_energy), np.log10(1.), num_bins) fig = plt.figure(figsize=(width / inch_to_cm, width / inch_to_cm / golden_ratio)) ax = fig.add_subplot(111) for idx, secondary_list in enumerate(list_secondary_energies): ax.hist( secondary_list, weights=np.ones(len(secondary_list))/sum_hist, histtype='step', log=True, bins=v_bins, label=list_secondary_energies_label[idx] ) all_cross_sections = np.empty((len(losses_params), num_bins)) for idx, param in enumerate(losses_params): all_cross_sections[idx] = np.array([param.differential_crosssection(muon_energy, v)*v for v in v_bins_log]) sum_cross_sections = np.sum(all_cross_sections, axis=0) print(sum(all_cross_sections[np.isfinite(all_cross_sections)])) print(sum(sum_cross_sections[np.isfinite(sum_cross_sections)])) for cross_section in np.append(all_cross_sections, [sum_cross_sections], axis=0): ax.plot( v_bins, cross_section/sum(sum_cross_sections[np.isfinite(sum_cross_sections)]), drawstyle="steps-pre" ) # ax.set_xscale("log") minor_locator = AutoMinorLocator() ax.xaxis.set_minor_locator(minor_locator) ax.legend() ax.set_xlabel(r'energy loss / log($E$/MeV)') ax.set_ylabel(r'$N$') ax.set_ylim(ymin=1e-8) ax.set_yscale("log") ax.legend() fig.savefig("theory_curve.pdf")
logger = logging.getLogger("track_plotter") handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) logger.addHandler(handler) pp.InterpolationSettings.tables_path = "/home/msackel/.cache/PROPOSAL" targets = {"air": pp.medium.Air(), "standardrock": pp.medium.StandardRock()} utilities = {} for target in targets.values(): prop_def = { "particle_def": pp.particle.MuMinusDef(), "cuts": pp.EnergyCutSettings(500, 1, False), "target": target, "interpolate": True, } cross = pp.crosssection.make_std_crosssection(**prop_def) collection = pp.PropagationUtilityCollection() collection.displacement = pp.make_displacement(cross, True) collection.interaction = pp.make_interaction(cross, True) collection.time = pp.make_time_approximate() utilities[f"{target.name}"] = pp.PropagationUtility(collection) logger.info("utility build") earth_radius = 6300 * 1e5 # km -> cm
def create_table(dir_name): particle_defs = [ pp.particle.MuMinusDef(), pp.particle.TauMinusDef(), pp.particle.EMinusDef() ] mediums = [ pp.medium.Ice(), pp.medium.Hydrogen(), pp.medium.Uranium() ] cuts = [ pp.EnergyCutSettings(np.inf, 1, True), pp.EnergyCutSettings(500, 1, True), pp.EnergyCutSettings(np.inf, 0.05, True), pp.EnergyCutSettings(500, 0.05, True) ] initial_energy = np.logspace(4, 13, num=10) # MeV final_energy = initial_energy - 1000 pp.RandomGenerator.get().set_seed(0) np.random.seed(123) with open(dir_name + "continous_randomization.txt", "w") as file: for particle in particle_defs: for medium in mediums: for cut in cuts: args = { "particle_def": particle, "target": medium, "interpolate": False, "cuts": cut } cross = pp.crosssection.make_std_crosssection(**args) cont_rand = pp.make_contrand(cross, False) buf = [""] for i in range(len(initial_energy)): rnd = np.random.random_sample() rand_energy = cont_rand.randomize( initial_energy[i], final_energy[i], rnd ) buf.append(str(rnd)) buf.append(particle.name) buf.append(medium.name) buf.append(str(cut.ecut)) buf.append(str(cut.vcut)) buf.append(str(initial_energy[i])) buf.append(str(final_energy[i])) buf.append(str(rand_energy)) buf.append("\n") file.write("\t".join(buf))
particle_defs = [ pp.particle.MuMinusDef(), # pp.particle.TauMinusDef(), # pp.particle.EMinusDef() ] mediums = [ pp.medium.Ice(), pp.medium.Hydrogen(), # pp.medium.Uranium() ] cuts = [ # pp.EnergyCutSettings(-1, -1), pp.EnergyCutSettings(500, 1), # pp.EnergyCutSettings(-1, 0.05), pp.EnergyCutSettings(500, 0.05) ] statistics = 10 energies = np.logspace(4, 13, num=statistics) # MeV initial_energy = 1e12 # MeV distance = 1000 # cm position = pp.Cartesian3D(0, 0, 0) direction = pp.Cartesian3D(1, 0, 0) pp.InterpolationSettings.tables_path = "~/.local/share/PROPOSAL/tables" def create_table_continous(dir_name):