def create_propagator( path_to_inerpolation_tables='~/.local/share/PROPOSAL/tables', brems_param_name='BremsKelnerKokoulinPetrukhin', epair_param_name='EpairKelnerKokoulinPetrukhin', photo_param_name='PhotoAbramowiczLevinLevyMaor97'): mu_def = pp.particle.MuMinusDef.get() geometry = pp.geometry.Sphere(pp.Vector3D(), 1.e20, 0.0) ecut = 500 vcut = -1 sector_def = pp.SectorDefinition() sector_def.cut_settings = pp.EnergyCutSettings(ecut, vcut) sector_def.medium = pp.medium.Ice(1.0) sector_def.geometry = geometry sector_def.scattering_model = pp.scattering.ScatteringModel.NoScattering sector_def.crosssection_defs.brems_def.lpm_effect = True sector_def.crosssection_defs.epair_def.lpm_effect = True sector_def.do_continuous_randomization = False sector_def.do_exact_time_calculation = False sector_def.crosssection_defs.brems_def.parametrization = pp.parametrization.bremsstrahlung.BremsFactory.get( ).get_enum_from_str(brems_param_name) sector_def.crosssection_defs.epair_def.parametrization = pp.parametrization.pairproduction.EpairFactory.get( ).get_enum_from_str(epair_param_name) sector_def.crosssection_defs.photo_def.parametrization = pp.parametrization.photonuclear.PhotoFactory.get( ).get_enum_from_str(photo_param_name) detector = geometry interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = path_to_inerpolation_tables interpolation_def.path_to_tables_readonly = path_to_inerpolation_tables return pp.Propagator(mu_def, [sector_def], detector, interpolation_def)
def muons(energy, statistics, vcut, do_continuous_randomization, dist): sec_def = pp.SectorDefinition() sec_def.medium = pp.medium.StandardRock(1.0) sec_def.geometry = pp.geometry.Sphere(pp.Vector3D(), 1e20, 0) sec_def.particle_location = pp.ParticleLocation.inside_detector sec_def.scattering_model = pp.scattering.ScatteringModel.Highland sec_def.do_continuous_randomization = do_continuous_randomization sec_def.cut_settings.ecut = 0 sec_def.cut_settings.vcut = vcut interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables" interpolation_def.path_to_tables_readonly = "~/.local/share/PROPOSAL/tables" mu_def = pp.particle.MuMinusDef.get() prop = pp.Propagator( particle_def=mu_def, sector_defs=[sec_def], detector=pp.geometry.Sphere(pp.Vector3D(), 1e20, 0), interpolation_def=interpolation_def ) mu = pp.particle.DynamicData(mu_def.particle_type) mu.position = pp.Vector3D(0, 0, 0) mu.direction = pp.Vector3D(0, 0, -1) mu.energy = energy mu.propagated_distance = 0. mu.time = 0. mu_energies = [] pp.RandomGenerator.get().set_seed(1234) for i in tqdm(range(statistics)): secondaries = prop.propagate(mu, dist * 100) mu_energies.append(secondaries.energy[-1]) # del secondaries return mu_energies
def muons(energy, statistics, vcut, do_continuous_randomization, dist): sec_def = pp.SectorDefinition() sec_def.medium = pp.medium.StandardRock(1.0) sec_def.geometry = pp.geometry.Sphere(pp.Vector3D(), 1e20, 0) sec_def.particle_location = pp.ParticleLocation.inside_detector sec_def.scattering_model = pp.scattering.ScatteringModel.Moliere sec_def.do_continuous_randomization = do_continuous_randomization sec_def.cut_settings.ecut = 0 sec_def.cut_settings.vcut = vcut interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "tables/" prop = pp.Propagator(particle_def=pp.particle.MuMinusDef.get(), sector_defs=[sec_def], detector=pp.geometry.Sphere(pp.Vector3D(), 1e20, 0), interpolation_def=interpolation_def) mu = prop.particle mu_energies = [] start = timer() for i in range(statistics): mu.position = pp.Vector3D(0, 0, 0) mu.direction = pp.Vector3D(0, 0, -1) mu.energy = energy mu.propagated_distance = 0 d = prop.propagate(dist * 100) mu_energies.append(mu.energy) end = timer() return (mu_energies, statistics / (end - start))
def propagate(): """ Propagte muon in ice threw a cylindric detector Returns: (Particle) Particle representing the start position (Geometry) Geometry of the detector (list) List of secondarys particles represeint interactions """ medium = pp.medium.Ice(1.0) geo_detector = pp.geometry.Cylinder(pp.Vector3D(), 800, 0, 1600) geo_outside = pp.geometry.Box(pp.Vector3D(), 500000, 500000, 500000) # Infront sec_def_infront = pp.SectorDefinition() sec_def_infront.medium = medium sec_def_infront.geometry = geo_outside sec_def_infront.particle_location = pp.ParticleLocation.infront_detector sec_def_infront.scattering_model = pp.scattering.ScatteringModel.Moliere sec_def_infront.cut_settings.ecut = -1 sec_def_infront.cut_settings.vcut = 0.05 # Inside sec_def_inside = pp.SectorDefinition() sec_def_inside.medium = medium sec_def_inside.geometry = geo_outside sec_def_inside.particle_location = pp.ParticleLocation.inside_detector sec_def_inside.scattering_model = pp.scattering.ScatteringModel.Moliere sec_def_inside.cut_settings.ecut = 500 sec_def_inside.cut_settings.vcut = -1 # Behind sec_def_behind = pp.SectorDefinition() sec_def_behind.medium = medium sec_def_behind.geometry = geo_outside sec_def_behind.particle_location = pp.ParticleLocation.behind_detector sec_def_behind.scattering_model = pp.scattering.ScatteringModel.Moliere sec_def_behind.cut_settings.ecut = -1 sec_def_behind.cut_settings.vcut = 0.05 # Interpolation defintion interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables" # Propagator prop = pp.Propagator( particle_def=pp.particle.MuMinusDef.get(), sector_defs=[sec_def_infront, sec_def_inside, sec_def_behind], detector=geo_detector, interpolation_def=interpolation_def) mu = prop.particle # Set energy and position of the particle mu.energy = 9e6 mu.direction = pp.Vector3D(0, 0, 1) pos = mu.position pos.set_cartesian_coordinates(0, 0, -1e5) mu.position = pos mu_start = pp.particle.Particle(mu) secondarys = prop.propagate() return mu_start, geo_detector, secondarys
import pyPROPOSAL as pp import numpy as np import matplotlib.pyplot as plt particle_def_builder = pp.particle.ParticleDefBuilder() particle_def_builder.SetParticleDef(pp.particle.GammaDef.get()) particle_def_builder.SetLow(0.1) # switch this line to change the e_low parameter photon_def = particle_def_builder.build() #photon_def = pp.particle.GammaDef.get() #photon_def = pp.particle.EMinusDef.get() photon_def = pp.particle.GammaDef.get() prop = pp.Propagator(particle_def=photon_def, config_file="config_rad_length.json") particle_to_prop = prop.particle particle_backup = pp.particle.Particle(particle_to_prop) statistics = 1e5 particle_backup.direction = pp.Vector3D(0, 0, -1) particle_backup.position = pp.Vector3D(0, 0, 1000000) particle_backup.propagated_distance = 0 particle_backup.energy = 1e5 X_0 = 36.62 # g/cm^2, PDG 2014 . rho = 1.205e-3 # g / cm^3 L_theorie = X_0 / rho * (9./7.) energies = np.logspace(1, 8, 12) L_mc_list = [] for E in energies:
statistics = 100 config_file = "resources/config_ice.json" if len(sys.argv) == 2: statistics = int(sys.argv[1]) elif len(sys.argv) == 3: statistics = int(sys.argv[1]) config_file = sys.argv[2] # ========================================================= # POPOSAL # ========================================================= mu_def = pp.particle.MuMinusDef.get() prop = pp.Propagator(particle_def=mu_def, config_file=config_file) E_max_log = 14 mu = pp.particle.DynamicData(mu_def.particle_type) mu.position = pp.Vector3D(0, 0, 0) mu.direction = pp.Vector3D(0, 0, -1) mu.energy = math.pow(10, E_max_log) mu.propagated_distance = 0 mu.time = 0 epair_primary_energy = [] epair_secondary_energy = [] brems_primary_energy = []
def propagate_muons(): # start_time = time.time() mu_def = pp.particle.MuMinusDef.get() 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" 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 = [] progress = ProgressBar(statistics, pacman=True) progress.start() for mu_energy in muon_energies: progress.update() prop.particle.position = pp.Vector3D(0, 0, 0) prop.particle.direction = pp.Vector3D(0, 0, -1) prop.particle.propagated_distance = 0 prop.particle.energy = mu_energy secondarys = prop.propagate(propagation_length) for sec in secondarys: log_sec_energy = math.log10(sec.energy) if sec.id == pp.particle.Data.Epair: epair_secondary_energy.append(log_sec_energy) if sec.id == pp.particle.Data.Brems: brems_secondary_energy.append(log_sec_energy) if sec.id == pp.particle.Data.DeltaE: ioniz_secondary_energy.append(log_sec_energy) if sec.id == pp.particle.Data.NuclInt: photo_secondary_energy.append(log_sec_energy) # ========================================================= # Write # ========================================================= dir_prefix = "" np.savez(os.path.join( dir_prefix, 'data_sec_dist_{}_{}_Emin_{}_Emax_{}'.format( prop.particle.particle_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=[prop.particle.propagated_distance / 100], medium_name=[sector_def.medium.name.lower()], particle_name=[prop.particle.particle_def.name], ecut=[ecut], vcut=[vcut])
statistics = 100 config_file = "resources/config_ice.json" if len(sys.argv) == 2: statistics = int(sys.argv[1]) elif len(sys.argv) == 3: statistics = int(sys.argv[1]) config_file = sys.argv[2] # ========================================================= # POPOSAL # ========================================================= prop = pyPROPOSAL.Propagator( particle_def=pyPROPOSAL.particle.MuMinusDef.get(), config_file=config_file) mu = prop.particle E_max_log = 14 epair_primary_energy = [] epair_secondary_energy = [] brems_primary_energy = [] brems_secondary_energy = [] ioniz_primary_energy = [] ioniz_secondary_energy = []
from __future__ import division import numpy as np import matplotlib.pyplot as plt import pyPROPOSAL as pp from enum import Enum import sys photon_def = pp.particle.GammaDef.get() prop_photon = pp.Propagator(particle_def=photon_def, config_file="shower/config_photon.json") electron_def = pp.particle.EMinusDef.get() prop_electron = pp.Propagator(particle_def=electron_def, config_file="shower/config_electron.json") positron_def = pp.particle.EPlusDef.get() prop_positron = pp.Propagator(particle_def=positron_def, config_file="shower/config_positron.json") def propagate(propagator, position, direction, energy, time, propagated_distance): particle_backup = pp.particle.Particle(propagator.particle) ## assign values particle_backup.position = position particle_backup.direction = direction particle_backup.energy = energy particle_backup.time = time particle_backup.propagated_distance = propagated_distance
def propagate_muons(): mu_def = pp.particle.MuMinusDef.get() geometry = pp.geometry.Sphere(pp.Vector3D(), 1.e20, 0.0) ecut = 500 vcut = -1 sector_def = pp.SectorDefinition() sector_def.cut_settings = pp.EnergyCutSettings(ecut, vcut) sector_def.medium = pp.medium.Ice(1.0) sector_def.geometry = geometry sector_def.scattering_model = pp.scattering.ScatteringModel.NoScattering sector_def.crosssection_defs.brems_def.lpm_effect = True sector_def.crosssection_defs.epair_def.lpm_effect = True detector = geometry interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "tables/" #initialize propagator without mupairproduction prop_nomupair = pp.Propagator(mu_def, [sector_def], detector, interpolation_def) #initialize propagator with mupairproduction sector_def.crosssection_defs.mupair_def.parametrization = pp.parametrization.mupairproduction.MupairParametrization.KelnerKokoulinPetrukhin sector_def.crosssection_defs.mupair_def.particle_output = False prop = pp.Propagator(mu_def, [sector_def], detector, interpolation_def) # for rho sampling param_defs_mupair = [mu_def, sector_def.medium, sector_def.cut_settings, 1.0, True, interpolation_def] param_mupair = pp.parametrization.mupairproduction.KelnerKokoulinPetrukhinInterpolant(*param_defs_mupair) statistics_log = 5 statistics = int(10**statistics_log) propagation_length = 1e20 # cm E_log = 8.0 pp.RandomGenerator.get().set_seed(1234) ### PRIMARY MUON PROPAGATION ### muon_energies = np.ones(statistics)*10**E_log epair_secondary_energy = [] brems_secondary_energy = [] ioniz_secondary_energy = [] photo_secondary_energy = [] mpair_secondary_energy = [] mpair_primary_energy = [] print("Propagate primary muons...") progress = ProgressBar(statistics, pacman=True) progress.start() for mu_energy in muon_energies: progress.update() prop.particle.position = pp.Vector3D(0, 0, 0) prop.particle.direction = pp.Vector3D(0, 0, -1) prop.particle.propagated_distance = 0 prop.particle.energy = mu_energy secondarys = prop.propagate(propagation_length) for sec in secondarys: sec_energy = sec.energy if sec.id == pp.particle.Data.Epair: epair_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.Brems: brems_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.DeltaE: ioniz_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.NuclInt: photo_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.MuPair: mpair_secondary_energy.append(sec_energy) mpair_primary_energy.append(sec.parent_particle_energy) #statistics: num_all = len(brems_secondary_energy) + len(epair_secondary_energy) + len(photo_secondary_energy) + len(ioniz_secondary_energy) + len(mpair_secondary_energy) ene_all = sum(brems_secondary_energy) + sum(epair_secondary_energy) + sum(photo_secondary_energy) + sum(ioniz_secondary_energy) + sum(mpair_secondary_energy) print("Number:") print("Brems: ", len(brems_secondary_energy), len(brems_secondary_energy)/num_all) print("Epair: ", len(epair_secondary_energy), len(epair_secondary_energy)/num_all) print("photo: ", len(photo_secondary_energy), len(photo_secondary_energy)/num_all) print("Ioniz: ", len(ioniz_secondary_energy), len(ioniz_secondary_energy)/num_all) print("MPair: ", len(mpair_secondary_energy), len(mpair_secondary_energy)/num_all) print("Energies:") print("Brems ", sum(brems_secondary_energy), sum(brems_secondary_energy)/ene_all) print("Epair: ", sum(epair_secondary_energy), sum(epair_secondary_energy)/ene_all) print("photo: ", sum(photo_secondary_energy), sum(photo_secondary_energy)/ene_all) print("Ioniz: ", sum(ioniz_secondary_energy), sum(ioniz_secondary_energy)/ene_all) print("MPair: ", sum(mpair_secondary_energy), sum(mpair_secondary_energy)/ene_all) plt.rcParams.update(params) fig_all = plt.figure( figsize=(width, 4) ) x_space = np.logspace(min(np.log10(np.concatenate((ioniz_secondary_energy,brems_secondary_energy,photo_secondary_energy,epair_secondary_energy,mpair_secondary_energy)))), E_log, 100) ax_all = fig_all.add_subplot(111) ax_all.hist( [ ioniz_secondary_energy, photo_secondary_energy, brems_secondary_energy, epair_secondary_energy, mpair_secondary_energy, np.concatenate(( ioniz_secondary_energy, brems_secondary_energy, photo_secondary_energy, epair_secondary_energy, mpair_secondary_energy) ) ], histtype='step', log=True, bins=x_space, label=['Ionization', 'Photonuclear', 'Bremsstrahlung', r'$e$ pair production', r'$\mu$ pair production', 'Sum'], color = ['C3', 'C2', 'C1', 'C0', 'C4', 'C7'], zorder = 3 ) plt.xscale('log') #minor_locator = AutoMinorLocator() #ax_all.xaxis.set_minor_locator(minor_locator) ax_all.legend(loc='best') ax_all.set_xlabel(r'$ E \cdot v \,/\, \mathrm{MeV} $') ax_all.set_ylabel(r'Frequency') #plt.xlim(left=2.5) plt.grid(grid_conf) fig_all.tight_layout() fig_all.savefig("build/spectrum_mupair.pdf",bbox_inches='tight') plt.clf() epair_old = epair_secondary_energy brems_old = brems_secondary_energy ioniz_old = ioniz_secondary_energy photo_old = photo_secondary_energy mpair_old = mpair_secondary_energy ### SECONDARY MUON PROPAGATION ### secondary_muon_energy = [] for E, nu in zip(mpair_primary_energy, mpair_secondary_energy): rho = param_mupair.Calculaterho(E, nu/E, np.random.rand(), np.random.rand()) secondary_muon_energy.append( 0.5 * nu * (1. + rho) ) secondary_muon_energy.append( 0.5 * nu * (1. - rho) ) epair_secondary_energy = [] brems_secondary_energy = [] ioniz_secondary_energy = [] photo_secondary_energy = [] mpair_secondary_energy = [] print("Propagate secondary muons...") progress = ProgressBar(len(secondary_muon_energy), pacman=True) progress.start() for mu_energy in secondary_muon_energy: progress.update() prop.particle.position = pp.Vector3D(0, 0, 0) prop.particle.direction = pp.Vector3D(0, 0, -1) prop.particle.propagated_distance = 0 prop.particle.energy = mu_energy secondarys = prop.propagate(propagation_length) for sec in secondarys: sec_energy = sec.energy if sec.id == pp.particle.Data.Epair: epair_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.Brems: brems_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.DeltaE: ioniz_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.NuclInt: photo_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.MuPair: mpair_secondary_energy.append(sec_energy) print("Number:") print("Brems: ", len(brems_secondary_energy), len(brems_secondary_energy)/num_all) print("Epair: ", len(epair_secondary_energy), len(epair_secondary_energy)/num_all) print("photo: ", len(photo_secondary_energy), len(photo_secondary_energy)/num_all) print("Ioniz: ", len(ioniz_secondary_energy), len(ioniz_secondary_energy)/num_all) print("MPair: ", len(mpair_secondary_energy), len(mpair_secondary_energy)/num_all) print("Energies:") print("Brems ", sum(brems_secondary_energy), sum(brems_secondary_energy)/ene_all) print("Epair: ", sum(epair_secondary_energy), sum(epair_secondary_energy)/ene_all) print("photo: ", sum(photo_secondary_energy), sum(photo_secondary_energy)/ene_all) print("Ioniz: ", sum(ioniz_secondary_energy), sum(ioniz_secondary_energy)/ene_all) print("MPair: ", sum(mpair_secondary_energy), sum(mpair_secondary_energy)/ene_all) ### PROPAGATION WITHOUT MUPAIRPRODUCTION muon_energies = np.ones(statistics)*10**E_log epair_secondary_energy_nomupair = [] brems_secondary_energy_nomupair = [] ioniz_secondary_energy_nomupair = [] photo_secondary_energy_nomupair = [] print("Propagate muons without MuPairProduction...") progress = ProgressBar(statistics, pacman=True) progress.start() for mu_energy in muon_energies: progress.update() prop_nomupair.particle.position = pp.Vector3D(0, 0, 0) prop_nomupair.particle.direction = pp.Vector3D(0, 0, -1) prop_nomupair.particle.propagated_distance = 0 prop_nomupair.particle.energy = mu_energy secondarys = prop_nomupair.propagate(propagation_length) for sec in secondarys: sec_energy = sec.energy if sec.id == pp.particle.Data.Epair: epair_secondary_energy_nomupair.append(sec_energy) elif sec.id == pp.particle.Data.Brems: brems_secondary_energy_nomupair.append(sec_energy) elif sec.id == pp.particle.Data.DeltaE: ioniz_secondary_energy_nomupair.append(sec_energy) elif sec.id == pp.particle.Data.NuclInt: photo_secondary_energy_nomupair.append(sec_energy) elif sec.id == pp.particle.Data.MuPair: print("Something went wrong") # Comparison plot plt.rcParams.update(params) fig_all = plt.figure( figsize=(width, 4) ) gs = matplotlib.gridspec.GridSpec(2, 1, height_ratios=[4, 1], hspace=0.1) x_space = np.logspace(min(np.log10(np.concatenate((ioniz_secondary_energy_nomupair,photo_secondary_energy_nomupair,brems_secondary_energy_nomupair,epair_secondary_energy_nomupair)))), E_log, 100) ax_all = fig_all.add_subplot(gs[0]) ax_all.hist( [ ioniz_secondary_energy, photo_secondary_energy, brems_secondary_energy, epair_secondary_energy, mpair_secondary_energy ], histtype='step', color = ['C3', 'C2', 'C1', 'C0', 'C4'], log=True, bins=x_space, zorder = 3, linestyle = 'dashed', ) ax_all.hist( [ ioniz_secondary_energy_nomupair, photo_secondary_energy_nomupair, brems_secondary_energy_nomupair, epair_secondary_energy_nomupair, np.concatenate(( ioniz_secondary_energy_nomupair, brems_secondary_energy_nomupair, photo_secondary_energy_nomupair, epair_secondary_energy_nomupair) ) ], color = ['C3', 'C2', 'C1', 'C0', 'C7'], label=['Ionization', 'Photonuclear', 'Bremsstrahlung', r'$e$ pair production', 'Sum'], histtype='step', log=True, bins=x_space, zorder = 4, ) ax_all.hist( [ np.array([0]) ], color = ['C4'], label=[r'$\mu$ pair production'], histtype='step', log=True, bins=x_space, zorder = 0, ) plt.xscale('log') #minor_locator = AutoMinorLocator() #ax_all.xaxis.set_minor_locator(minor_locator) ax_all.legend(loc='best') ax_all.set_ylabel(r'Frequency') #plt.xlim(left=2.5) plt.grid(grid_conf) plt.setp(ax_all.get_xticklabels(), visible=False) plt.tick_params( axis='x', # changes apply to the x-axis which='both', # both major and minor ticks are affected bottom=False, # ticks along the bottom edge are off top=False, # ticks along the top edge are off labelbottom=False ) # labels along the bottom edge are off ax_all = fig_all.add_subplot(gs[1], sharex=ax_all) hist_1, bin_edges_1 = np.histogram(np.concatenate((ioniz_secondary_energy_nomupair,brems_secondary_energy_nomupair,photo_secondary_energy_nomupair,epair_secondary_energy_nomupair)), bins = x_space) hist_2, bin_edges_2 = np.histogram(np.concatenate((epair_old, ioniz_old, brems_old, photo_old, ioniz_secondary_energy,photo_secondary_energy,brems_secondary_energy,epair_secondary_energy,mpair_secondary_energy)), bins = x_space) print(np.shape(x_space)) print(np.shape(hist_1)) ax_all.step(x_space[1:], hist_1/hist_2, where='pre', color='C4') #ax_all.bar(x_space[:-1], hist_1/hist_2, width=np.diff(x_space), align='edge', fill=False) ax_all.set_xlabel(r'$ E \cdot v \,/\, \mathrm{MeV} $') ax_all.set_ylabel(r'ratio') plt.ylim(0.9, 1.1) plt.grid(grid_conf) ax_all.axhline(y=1, linewidth=0.5, zorder=0, C = 'C7') fig_all.tight_layout() fig_all.savefig("build/spectrum_mupair_secondary_comparison.pdf",bbox_inches='tight') plt.clf() # Plot particles from secondary spectrum plt.rcParams.update(params) fig_all = plt.figure( figsize=(width, 4) ) x_space = np.logspace(min(np.log10(np.concatenate((ioniz_secondary_energy,brems_secondary_energy,photo_secondary_energy,epair_secondary_energy,mpair_secondary_energy)))), E_log, 100) ax_all = fig_all.add_subplot(111) ax_all.hist( [ ioniz_secondary_energy, photo_secondary_energy, brems_secondary_energy, epair_secondary_energy, mpair_secondary_energy, np.concatenate(( ioniz_secondary_energy, brems_secondary_energy, photo_secondary_energy, epair_secondary_energy, mpair_secondary_energy) ) ], histtype='step', log=True, bins=x_space, label=['Ionization', 'Photonuclear', 'Bremsstrahlung', r'$e$ pair production', r'$\mu$ pair production', 'Sum'], color = ['C3', 'C2', 'C1', 'C0', 'C4', 'C7'], zorder = 3 ) plt.xscale('log') #minor_locator = AutoMinorLocator() #ax_all.xaxis.set_minor_locator(minor_locator) ax_all.legend(loc='best') ax_all.set_xlabel(r'$ E \cdot v \,/\, \mathrm{MeV} $') ax_all.set_ylabel(r'Frequency') #plt.xlim(left=2.5) plt.grid(grid_conf) fig_all.tight_layout() fig_all.savefig("build/spectrum_mupair_secondary.pdf",bbox_inches='tight') plt.clf()
def propagate_muons(): # start_time = time.time() mu_def = pp.particle.EPlusDef.get() geometry = pp.geometry.Sphere(pp.Vector3D(), 1.e20, 0.0) ecut = 500 vcut = -1 sector_def = pp.SectorDefinition() sector_def.do_continuous_randomization = False 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 = True #sector_def.crosssection_defs.epair_def.lpm_effect = False sector_def.crosssection_defs.annihilation_def.parametrization = pp.parametrization.annihilation.AnnihilationParametrization.Heitler sector_def.crosssection_defs.ioniz_def.parametrization = pp.parametrization.ionization.IonizParametrization.IonizBergerSeltzerBhabha sector_def.crosssection_defs.brems_def.parametrization = pp.parametrization.bremsstrahlung.BremsParametrization.ElectronScreening # 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" prop = pp.Propagator(mu_def, [sector_def], detector, interpolation_def) statistics_log = 5 statistics = int(10**statistics_log) propagation_length = 1e10 # cm E_min_log = 8.0 E_max_log = 8.0 spectral_index = 1 pp.RandomGenerator.get().set_seed(1000) #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 = [] annihilation_secondary_energy = [] plot_energy_histogram( np.log10(muon_energies), 'energyhist_{}_{}_Emin_{}_Emax_{}.pdf'.format( prop.particle.particle_def.name, sector_def.medium.name.lower(), E_min_log, E_max_log, ecut, vcut)) progress = ProgressBar(statistics, pacman=True) progress.start() for mu_energy in muon_energies: progress.update() prop.particle.position = pp.Vector3D(0, 0, 0) prop.particle.direction = pp.Vector3D(0, 0, -1) prop.particle.propagated_distance = 0 prop.particle.energy = mu_energy secondarys = prop.propagate(propagation_length) skip_next = False for sec in secondarys: if (skip_next): skip_next = False continue if (sec.energy > 0): log_sec_energy = math.log10(sec.energy) else: print(sec.energy) print(sec.id) if sec.id == pp.particle.Data.Epair: epair_secondary_energy.append(log_sec_energy) elif sec.id == pp.particle.Data.Brems: brems_secondary_energy.append(log_sec_energy) elif sec.id == pp.particle.Data.DeltaE: ioniz_secondary_energy.append(log_sec_energy) elif sec.id == pp.particle.Data.NuclInt: photo_secondary_energy.append(log_sec_energy) else: annihilation_secondary_energy.append( math.log10(sec.parent_particle_energy)) skip_next = True # do not include the second photon as well... # ========================================================= # Write # ========================================================= dir_prefix = "" np.savez(os.path.join( dir_prefix, 'data_sec_dist_{}_{}_Emin_{}_Emax_{}'.format( prop.particle.particle_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, annihilation=annihilation_secondary_energy, statistics=[statistics], statistics_log=[statistics_log], E_min=[E_min_log], E_max=[E_max_log], spectral_index=[spectral_index], distance=[prop.particle.propagated_distance / 100], medium_name=[sector_def.medium.name.lower()], particle_name=[prop.particle.particle_def.name], ecut=[ecut], vcut=[vcut]) #statistics: sum_all = np.sum(brems_secondary_energy) + np.sum( epair_secondary_energy) + np.sum(photo_secondary_energy) + np.sum( ioniz_secondary_energy) num_all = len(brems_secondary_energy) + len(epair_secondary_energy) + len( photo_secondary_energy) + len(ioniz_secondary_energy) print(num_all) print("Brem: ", len(brems_secondary_energy), len(brems_secondary_energy) / num_all) print("Epair: ", len(epair_secondary_energy), len(epair_secondary_energy) / num_all) print("photo: ", len(photo_secondary_energy), len(photo_secondary_energy) / num_all) print("Ioniz: ", len(ioniz_secondary_energy), len(ioniz_secondary_energy) / num_all) plot_secondary_spectrum('data_sec_dist_{}_{}_Emin_{}_Emax_{}.npz'.format( prop.particle.particle_def.name, sector_def.medium.name.lower(), E_min_log, E_max_log, ecut, vcut))
def main(): prop = pp.Propagator(particle_def=pp.particle.MuMinusDef.get(), config_file="resources/config.json") # print('losses inside: ', prop.sector_list[0].sector_def.only_loss_inside_detector) pp.RandomGenerator.get().set_seed(1234) fig = plt.figure(figsize=(8, 10)) gs = gridspec.GridSpec(3, 1) ax1 = fig.add_subplot(gs[:-1]) ax2 = fig.add_subplot(gs[-1], sharex=ax1) # ax1 = fig.add_subplot(111) ax1.plot( np.array([ -prop.detector.radius, prop.detector.radius, prop.detector.radius, -prop.detector.radius, -prop.detector.radius ]), np.array([ -prop.detector.height, -prop.detector.height, prop.detector.height, prop.detector.height, -prop.detector.height ]) / 2, color='k', label='detector') ax1.set_xlabel('x coord. / cm') ax1.set_ylabel('z coord. / cm') ax1.set_xlim([-1e5, 1e5]) ax1.set_ylim([-1e5, 1e5]) labels = ['EPair', 'Brems', 'Ioniz', 'NuclInt', r'$e_{\mathrm{decay}}$'] start_positions = np.array([ # [-1e5,0,1e4], [-1e5, 0, 2e4], # [-3e4,0,3e4], # [1e4,0,4e4], [74428.7, 29332., 69745.] ]) tmp_dir = pp.Vector3D() tmp_dir.set_spherical_coordinates(1, 0.181678, 1.94055) tmp_dir.cartesian_from_spherical() tmp_dir = -tmp_dir # print(tmp_dir) start_directions = [ # [1, 0, 0], [1, 0, 0], # [1, 0, 0], # [1, 0, 0], [tmp_dir.x, tmp_dir.y, tmp_dir.z] ] start_energies = [ # 1e9, 3e5, # 1e5, # 1e5, 158816 ] for jdx in range(len(start_energies)): secondarys = propagate_particle(prop, position=start_positions[jdx], direction=start_directions[jdx], energy=start_energies[jdx]) # print(prop.particle) nsecs = len(secondarys) # to get rid of the decay neutrinos positions = np.empty((nsecs, 3)) secs_energy = np.empty(nsecs) mu_energies = np.empty(nsecs) secs_ids = np.empty(nsecs) for idx in range(nsecs): positions[idx] = np.array([ secondarys[idx].position.x, secondarys[idx].position.y, secondarys[idx].position.z ]) secs_energy[idx] = secondarys[idx].energy mu_energies[idx] = secondarys[idx].parent_particle_energy if secondarys[idx].id == pp.particle.Data.Epair: secs_ids[idx] = 0 elif secondarys[idx].id == pp.particle.Data.Brems: secs_ids[idx] = 1 elif secondarys[idx].id == pp.particle.Data.DeltaE: secs_ids[idx] = 2 elif secondarys[idx].id == pp.particle.Data.NuclInt: secs_ids[idx] = 3 elif secondarys[idx].id == pp.particle.Data.Particle: # decay if secondarys[idx].particle_def == pp.particle.EMinusDef.get(): secs_ids[idx] = 4 else: secs_ids[idx] = 5 # Neutrinos for idx in range(len(labels)): ax2.plot(positions[:, 0][secs_ids == idx], secs_energy[secs_ids == idx] / 1e3, ls='None', marker='.', label=labels[idx]) end_position = np.array([[ prop.particle.position.x, prop.particle.position.y, prop.particle.position.z ]]) # now after ploting the losss, one can add the start position/energy of the muon to plot it positions = np.concatenate( ([start_positions[jdx]], positions, end_position), axis=0) mu_energies = np.concatenate( ([start_energies[jdx]], mu_energies, [prop.particle.energy])) ax2.plot(positions[:, 0], mu_energies / 1e3, label=r'$E_{\mu}$') ax2.axhline(0.5, color='r', label='ecut') ax2.axvline(prop.particle.entry_point.x, color='g', ls='-', label='entry/exit') ax2.axvline(prop.particle.exit_point.x, color='g', ls='-') ax2.axvline(prop.particle.closet_approach_point.x, color='b', ls='dotted', label='closest approach') ax2.set_yscale('log') ax2.set_ylabel('Energy / GeV') ax2.set_xlabel('x coord. / cm') # ax2.legend() plt.subplots_adjust(hspace=.0) plt.setp(ax1.get_xticklabels(), visible=False) ax1.plot(positions[:, 0], positions[:, 2], label='muon') # {}'.format(jdx)) ax1.plot([prop.particle.entry_point.x, prop.particle.exit_point.x], [prop.particle.entry_point.z, prop.particle.exit_point.z], ls='None', marker='x', label='entry/exit') # {}'.format(jdx)) ax1.plot(prop.particle.closet_approach_point.x, prop.particle.closet_approach_point.z, ls='None', marker='+', label='closet approach') # {}'.format(jdx)) # ax1.plot([prop.particle.entry_point.x, prop.particle.closet_approach_point.x, prop.particle.exit_point.x], # [prop.particle.entry_point.z, prop.particle.closet_approach_point.z, prop.particle.exit_point.z], # ls='dotted', label='approx line')# {}'.format(jdx)) ax1.legend() fig.savefig('entry_exit_points.png') plt.show()
sec_def.medium = pp.medium.Ice(1.0) sec_def.geometry = pp.geometry.Sphere(pp.Vector3D(), 1e20, 0) sec_def.particle_location = pp.ParticleLocation.inside_detector sec_def.scattering_model = pp.scattering.ScatteringModel.Moliere sec_def.crosssection_defs.brems_def.lpm_effect = False sec_def.crosssection_defs.epair_def.lpm_effect = False sec_def.cut_settings.ecut = 500 sec_def.cut_settings.vcut = 0.05 interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables" prop = pp.Propagator(particle_def=pp.particle.MuMinusDef.get(), sector_defs=[sec_def], detector=pp.geometry.Sphere(pp.Vector3D(), 1e20, 0), interpolation_def=interpolation_def) mu = prop.particle mu_length = [] n_secondarys = [] for i in range(statistics): mu.position = pp.Vector3D(0, 0, 0) mu.direction = pp.Vector3D(0, 0, -1) mu.energy = energy mu.propagated_distance = 0 d = prop.propagate()
def create_table(dir_name): """TODO: Docstring for create_table. Returns: TODO """ statistics = 10 prop = pp.Propagator( pp.particle.MuMinusDef.get(), "resources/config_ice.json" ) mu = prop.particle mu.energy = 1e8 mu.propagated_distance = 0 mu.position = pp.Vector3D(0, 0, 0) mu.direction = pp.Vector3D(0, 0, -1) pp.RandomGenerator.get().set_seed(1234) with open(dir_name + "Propagator_propagation.txt", "a") as file: buf = [""] buf.append("name") buf.append("lenght") buf.append("energy") buf.append("x") buf.append("y") buf.append("z") buf.append("dx") buf.append("dy") buf.append("dz") buf.append("\n") buf.append(str(statistics)) buf.append(str(mu.energy)) buf.append("\n") file.write("\t".join(buf)) for i in range(statistics): mu.energy = 1e8 mu.propagated_distance = 0 mu.position = pp.Vector3D(0, 0, 0) mu.direction = pp.Vector3D(0, 0, -1) daughters = prop.propagate() buf = [""] for d in daughters: if d.id == pp.particle.Data.Particle: buf.append(d.particle_def.name) else: buf.append(str(d.id).split(".")[1]) buf.append(str(d.propagated_distance)) buf.append(str(d.energy)) buf.append(str(d.position.x)) buf.append(str(d.position.y)) buf.append(str(d.position.z)) buf.append(str(d.direction.x)) buf.append(str(d.direction.y)) buf.append(str(d.direction.z)) buf.append("\n") file.write("\t".join(buf))
def propagate_muons(): mu_def = pp.particle.MuMinusDef.get() 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.Ice(1.0) sector_def.geometry = geometry sector_def.scattering_model = pp.scattering.ScatteringModel.NoScattering sector_def.crosssection_defs.brems_def.lpm_effect = True sector_def.crosssection_defs.epair_def.lpm_effect = True detector = geometry interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = "tables/" prop = pp.Propagator(mu_def, [sector_def], detector, interpolation_def) statistics = int(1e4) propagation_length = 1e20 # cm E_log = 8.0 pp.RandomGenerator.get().set_seed(1234) muon_energies = np.ones(statistics) * 10**E_log epair_secondary_energy = [] brems_secondary_energy = [] ioniz_secondary_energy = [] photo_secondary_energy = [] progress = ProgressBar(statistics, pacman=True) progress.start() for mu_energy in muon_energies: progress.update() prop.particle.position = pp.Vector3D(0, 0, 0) prop.particle.direction = pp.Vector3D(0, 0, -1) prop.particle.propagated_distance = 0 prop.particle.energy = mu_energy secondarys = prop.propagate(propagation_length) for sec in secondarys: sec_energy = sec.energy if sec.id == pp.particle.Data.Epair: epair_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.Brems: brems_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.DeltaE: ioniz_secondary_energy.append(sec_energy) elif sec.id == pp.particle.Data.NuclInt: photo_secondary_energy.append(sec_energy) #statistics: num_all = len(brems_secondary_energy) + len(epair_secondary_energy) + len( photo_secondary_energy) + len(ioniz_secondary_energy) ene_all = sum(brems_secondary_energy) + sum(epair_secondary_energy) + sum( photo_secondary_energy) + sum(ioniz_secondary_energy) print("Anzahl:") print("Brems: ", len(brems_secondary_energy), len(brems_secondary_energy) / num_all) print("Epair: ", len(epair_secondary_energy), len(epair_secondary_energy) / num_all) print("photo: ", len(photo_secondary_energy), len(photo_secondary_energy) / num_all) print("Ioniz: ", len(ioniz_secondary_energy), len(ioniz_secondary_energy) / num_all) print("Energie:") print("Brems ", sum(brems_secondary_energy), sum(brems_secondary_energy) / ene_all) print("Epair: ", sum(epair_secondary_energy), sum(epair_secondary_energy) / ene_all) print("photo: ", sum(photo_secondary_energy), sum(photo_secondary_energy) / ene_all) print("Ioniz: ", sum(ioniz_secondary_energy), sum(ioniz_secondary_energy) / ene_all) plt.rcParams.update(params) fig_all = plt.figure(figsize=(width, 4)) tmp = np.concatenate((ioniz_secondary_energy, brems_secondary_energy, photo_secondary_energy, epair_secondary_energy)) tmp = tmp[tmp > 0] # remove zero elements x_space = np.logspace(min(np.log10(tmp)), E_log, 100) ax_all = fig_all.add_subplot(111) ax_all.hist([ ioniz_secondary_energy, photo_secondary_energy, brems_secondary_energy, epair_secondary_energy, np.concatenate((ioniz_secondary_energy, brems_secondary_energy, photo_secondary_energy, epair_secondary_energy)) ], histtype='step', log=True, bins=x_space, label=[ 'Ionization', 'Photonuclear', 'Bremsstrahlung', r'$e$ pair production', 'Sum' ], color=['C3', 'C2', 'C1', 'C0', 'C7'], zorder=3) plt.xscale('log') #minor_locator = AutoMinorLocator() #ax_all.xaxis.set_minor_locator(minor_locator) ax_all.legend(loc='best') ax_all.set_xlabel(r'$ E \cdot v \,/\, \mathrm{MeV} $') ax_all.set_ylabel(r'Frequency') #plt.xlim(left=2.5) plt.grid(grid_conf) fig_all.tight_layout() fig_all.savefig("build/spectrum.pdf", bbox_inches='tight')