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 make_propagator(ID, body, xs_model='dipole', granularity=0.5): if (ID in [12, -12]): return None particle_def = getattr(pp.particle, ID_2_name[ID])() #define how many layers of constant density we need for the tau descs = segment_body(body, granularity) #make the sectors sec_defs = [ make_sector(d / units.gr * units.cm**3, s * body.radius / units.meter, e * body.radius / units.meter, xs_model) for s, e, d in descs ] with path('taurunner.resources.proposal_tables', 'tables.txt') as p: tables_path = str(p).split('tables.txt')[0] #define interpolator interpolation_def = pp.InterpolationDef() interpolation_def.path_to_tables = tables_path interpolation_def.path_to_tables_readonly = tables_path interpolation_def.nodes_cross_section = 200 #define propagator -- takes a particle definition - sector - detector - interpolator prop = pp.Propagator(particle_def=particle_def, sector_defs=sec_defs, detector=pp.geometry.Sphere(pp.Vector3D(), body.radius / units.cm, 0), interpolation_def=interpolation_def) return prop
def create_table_scatter(dir_name): with open(dir_name + "Scattering_scatter.txt", "w") as file: for particle_def in particle_defs: for medium in mediums: for cut in cuts: for idx, parametrization in enumerate(parametrizations): if scat_names[idx] == "HighlandIntegral": util = pp.Utility(particle_def, medium, cut, pp.UtilityDefinition(), pp.InterpolationDef()) scattering = parametrization(particle_def, util, pp.InterpolationDef()) else: scattering = parametrization(particle_def, medium) buf = [""] for jdx, energy in enumerate(energies): # TODO wrap UtilityDecorator rnd1 = pp.RandomGenerator.get().random_double() rnd2 = pp.RandomGenerator.get().random_double() rnd3 = pp.RandomGenerator.get().random_double() rnd4 = pp.RandomGenerator.get().random_double() directions = scattering.scatter(distance, energy, energies_out[jdx], position_init, direction_init, rnd1, rnd2, rnd3, rnd4) posi = position_init + distance * directions.u dire = directions.n_i buf.append(particle_def.name) buf.append(medium.name) buf.append(scat_names[idx]) buf.append(str(cut.ecut)) buf.append(str(cut.vcut)) buf.append(str(energy)) buf.append(str(energies_out[jdx])) buf.append(str(distance)) buf.append(str(rnd1)) buf.append(str(rnd2)) buf.append(str(rnd3)) buf.append(str(rnd4)) buf.append(str(posi.x)) buf.append(str(posi.y)) buf.append(str(posi.z)) buf.append(str(dire.radius)) buf.append(str(dire.phi)) buf.append(str(dire.theta)) buf.append("\n") file.write("\t".join(buf))
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() 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 = "" 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 = [] 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) return mu_energies
def test_proposal(): # ========================================================= # Propagate # ========================================================= energy = 1e8 # MeV statistics = 100 sec_def = pp.SectorDefinition() 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.do_continuous_energy_loss_output = True sec_def.scattering_model = pp.scattering.ScatteringModel.HighlandIntegral 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 = table_path interpolation_def.path_to_tables_readonly = table_path mu_def = pp.particle.MuMinusDef() 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 pp.RandomGenerator.get().set_seed(1234) for i in range(statistics): secondaries = prop.propagate(mu).particles for idx, sec in enumerate(secondaries[1:-1]): if sec.type == int(ContinuousEnergyLoss): if (secondaries[idx - 1].type == int(ContinuousEnergyLoss) or secondaries[idx + 1].type == int(ContinuousEnergyLoss)): print("2 Continuous Losses in a row") continue energy_diff = secondaries[idx - 1].energy - secondaries[ idx + 1].parent_particle_energy continuou_energy_lost = sec.parent_particle_energy - sec.energy assert energy_diff == approx(continuou_energy_lost, abs=1e-3), "Energy differs" time_diff = secondaries[idx + 1].time - secondaries[idx - 1].time assert time_diff == approx(sec.time, abs=1e-3), "Time differs"
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): with open( dir_name + "Brems_dEdx{}.txt".format("_interpol" if interpolate else ""), "w") as file: for particle in particle_defs: for medium in mediums: for cut in cuts: for lpm in lpms: for parametrization in parametrizations:
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" interpolation_def.path_to_tables_readonly = "~/.local/share/PROPOSAL/tables" # Propagator mu_def = pp.particle.MuMinusDef() prop = pp.Propagator( particle_def=mu_def, sector_defs=[sec_def_infront, sec_def_inside, sec_def_behind], detector=geo_detector, interpolation_def=interpolation_def ) mu = pp.particle.DynamicData(mu_def.particle_type) # 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(mu).particles return mu, geo_detector, secondarys
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")