Ejemplo n.º 1
0
def create_table_propagate(dir_name):
    pp.RandomGenerator.get().set_seed(1234)
    with open(dir_name + "Sector_Propagate.txt", "w") as file:
        for particle_def in particle_defs:
            for medium in mediums:
                for cut in cuts:
                    sector_def = pp.SectorDefinition()
                    sector_def.cut_settings = cut
                    sector_def.medium = medium

                    sector = pp.Sector(particle_def, sector_def, interpoldef)

                    for energy in energies:
                        buf = [""]
                        buf.append(str(particle_def.name))
                        buf.append(str(medium.name))
                        buf.append(str(cut.ecut))
                        buf.append(str(cut.vcut))
                        buf.append(str(energy))

                        p_condition = pp.particle.DynamicData(0)
                        p_condition.position = pp.Vector3D(0, 0, 0)
                        p_condition.direction = pp.Vector3D(0, 0, -1)
                        p_condition.propagated_distance = 0
                        p_condition.energy = energy
                        sec = sector.propagate(p_condition, 1000, 0)

                        buf.append(str(sec.number_of_particles))
                        if (sec.particles[-1].propagated_distance < 999.99):
                            buf.append(
                                str(-sec.particles[-1].propagated_distance))
                        else:
                            buf.append(str(sec.particles[-1].energy))
                        buf.append("\n")
                        file.write("\t".join(buf))
Ejemplo n.º 2
0
def propagate_particle(propagator,
                       position=[-1e5, 0, 1e4],
                       direction=[1, 0, 0],
                       energy=1e9):
    mu_data = pp.particle.DynamicData(propagator.particle_def.particle_type)
    mu_data.position = pp.Vector3D(position[0], position[1], position[2])
    tmp_dir = pp.Vector3D(direction[0], direction[1], direction[2])
    tmp_dir.spherical_from_cartesian()
    mu_data.direction = tmp_dir

    mu_data.energy = energy
    mu_data.propagated_distance = 0
    mu_data.time = 0

    return propagator.propagate(mu_data)
Ejemplo n.º 3
0
def propagate_particle(propagator,
                       position=[-1e5, 0, 1e4],
                       direction=[1, 0, 0],
                       energy=1e9):
    propagator.particle.position = pp.Vector3D(position[0], position[1],
                                               position[2])
    tmp_dir = pp.Vector3D(direction[0], direction[1], direction[2])
    tmp_dir.spherical_from_cartesian()
    propagator.particle.direction = tmp_dir

    propagator.particle.energy = energy
    propagator.particle.propagated_distance = 0
    propagator.particle.time = 0

    return propagator.propagate()
Ejemplo n.º 4
0
def propagate(prop, energy, oversampling):
    propagation_length = 1e9  # cm
    muon_ranges = np.empty(oversampling)

    for idx in tqdm(range(oversampling)):
        prop.particle.position = pp.Vector3D(0, 0, 0)
        prop.particle.direction = pp.Vector3D(1, 0, 0)
        prop.particle.propagated_distance = 0
        prop.particle.energy = energy
        prop.particle.time = 0

        secondarys = prop.propagate(propagation_length)

        muon_ranges[idx] = prop.particle.propagated_distance

    return muon_ranges
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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))
Ejemplo n.º 8
0
    pp.particle.EMinusDef.get()
]

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)
]

energies = np.logspace(4, 13, num=10)  # MeV
energies_out = np.logspace(3, 12, num=10)
distance = 1000  # cm
position_init = pp.Vector3D(0, 0, 0)
direction_init = pp.Vector3D(1, 0, 0)
direction_init.spherical_from_cartesian()

interpoldef = pp.InterpolationDef()
pp.RandomGenerator.get().set_seed(1234)


def create_table_scatter(dir_name):

    with open(dir_name + "Scattering_scatter.txt", "a") as file:

        for particle_def in particle_defs:
            for medium in mediums:
                for cut in cuts:
                    for idx, parametrization in enumerate(parametrizations):
Ejemplo n.º 9
0
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))
Ejemplo n.º 10
0

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:    
    particle_backup.energy = E
    prop_length = []
Ejemplo n.º 11
0
def create_table(dir_name,
                 particle_def,
                 init_energy,
                 decay_products,
                 filename,
                 statistics=int(1e6),
                 NUM_bins=50):
    pp.RandomGenerator.get().set_seed(1234)

    init_particle = pp.particle.DynamicData(particle_def.particle_type)
    init_particle.energy = init_energy
    products = decay_products
    decay_channels = [
        pp.decay.LeptonicDecayChannelApprox(*products),
        pp.decay.LeptonicDecayChannel(*products),
        pp.decay.ManyBodyPhaseSpace(products, matrix_element_evaluate)
    ]
    decay_names = [
        "LeptonicDecayChannelApprox", "LeptonicDecayChannel", "ManyBody"
    ]

    histrogram_list = []

    v_max = (particle_def.mass**2 + products[0].mass**2) / (2 *
                                                            particle_def.mass)
    gamma = init_particle.energy / particle_def.mass
    betagamma = init_particle.momentum / particle_def.mass
    E_max = gamma * v_max + betagamma * np.sqrt(v_max**2 - products[0].mass**2)

    for channel in decay_channels:
        # print(particle_def.name, init_energy, channel)
        prod_0_energies = []
        prod_1_energies = []
        prod_2_energies = []
        for i in range(statistics):
            init_particle.position = pp.Vector3D(0, 0, 0)
            init_particle.direction = pp.Vector3D(0, 0, -1)
            init_particle.energy = init_energy
            init_particle.propagated_distance = 0

            decay_products = channel.decay(particle_def, init_particle)
            for p in decay_products.particles:
                if p.id == products[0].particle_type:
                    prod_0_energies.append(p.energy)
                elif p.id == products[1].particle_type:
                    prod_1_energies.append(p.energy)
                elif p.id == products[2].particle_type:
                    prod_2_energies.append(p.energy)
                else:
                    assert ("This should never happen")

        histogram = []
        histogram.append(
            np.histogram(prod_0_energies, bins=NUM_bins, range=(0, E_max))[0])
        histogram.append(
            np.histogram(prod_1_energies, bins=NUM_bins, range=(0, E_max))[0])
        histogram.append(
            np.histogram(prod_2_energies, bins=NUM_bins, range=(0, E_max))[0])

        histrogram_list.append(histogram)

    with open(dir_name + filename, "w") as file:
        buf = [""]
        buf.append(str(statistics))
        buf.append(str(NUM_bins))
        buf.append(str(particle_def.name))
        buf.append(str(init_particle.energy))
        buf.append(str(products[0].name))
        buf.append(str(products[1].name))
        buf.append(str(products[2].name))
        buf.append("\n")
        file.write("\t".join(buf))

        for name, hist in zip(decay_names, histrogram_list):
            buf = [""]
            buf.append(name)
            buf.append("\n")
            for prod in hist:
                for bin_value in prod:
                    buf.append(str(bin_value))
                buf.append("\n")

            file.write("\t".join(buf))
Ejemplo n.º 12
0
    pp.particle.EMinusDef.get()
]

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)
]

energies = np.logspace(4, 13, num=10)  # MeV
distance = 1000  # cm

position = pp.Vector3D(0, 0, 0)
direction = pp.Vector3D(1, 0, 0)

# stopping_decay = True
# do_continuous_randomization = True
# do_exact_time_calculation = True
interpoldef = pp.InterpolationDef()


def create_table_propagate(dir_name):

    pp.RandomGenerator.get().set_seed(1234)

    with open(dir_name + "Sector_propagate.txt", "a") as file:

        for particle_def in particle_defs:
Ejemplo n.º 13
0
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])
Ejemplo n.º 14
0
    ioniz_primary_energy = []
    ioniz_secondary_energy = []

    photo_primary_energy = []
    photo_secondary_energy = []

    length = []
    n_secondarys = []

    progress = ProgressBar(statistics, pacman=True)
    progress.start()

    for i in range(statistics):
        progress.update()

        mu.position = pyPROPOSAL.Vector3D(0, 0, 0)
        mu.direction = pyPROPOSAL.Vector3D(0, 0, -1)
        mu.energy = math.pow(10, E_max_log)
        mu.propagated_distance = 0

        secondarys = prop.propagate()

        length.append(mu.propagated_distance / 100)
        n_secondarys.append(len(secondarys))

        for sec in secondarys:
            log_sec_energy = math.log10(sec.energy)
            log_energy = math.log10(sec.parent_particle_energy)

            if sec.id == pyPROPOSAL.particle.Data.Epair:
                epair_primary_energy.append(log_energy)
Ejemplo n.º 15
0
    Y = 2. * term1 * term2 - term3

    return 4. * (G_F * V_ud * form_factor(q2))**2 * Y


if __name__ == "__main__":

    # =========================================================
    # 	Save energies
    # =========================================================

    statistics = int(1e5)
    binning = 50

    tau = pp.particle.Particle(pp.particle.TauMinusDef.get())
    tau.direction = pp.Vector3D(0, 0, -1)

    products = [
        pp.particle.Pi0Def.get(),
        pp.particle.PiMinusDef.get(),
        pp.particle.NuTauDef.get()
    ]

    products_particles = [pp.particle.Particle(p) for p in products]
    for p in products_particles:
        p.direction = pp.Vector3D(0, 0, -1)
        p.energy = 1e2

    print(evaluate(tau, products_particles))

    ME = pp.decay.ManyBodyPhaseSpace(products, evaluate)
Ejemplo n.º 16
0
def create_table(dir_name):
    """TODO: Docstring for create_table.
    Returns: TODO

    """

    statistics = int(1e6)
    NUM_bins = 50

    pp.RandomGenerator.get().set_seed(1234)

    mu = pp.particle.Particle(pp.particle.MuMinusDef.get())
    products = [
        pp.particle.EMinusDef.get(),
        pp.particle.NuMuDef.get(),
        pp.particle.NuEBarDef.get()
    ]
    decay_channels = [
        pp.decay.LeptonicDecayChannelApprox(*products),
        pp.decay.LeptonicDecayChannel(*products)
    ]
    decay_names = ["LeptonicDecayChannelApprox", "LeptonicDecayChannel"]

    histrogram_list = []

    for channel in decay_channels:
        prod_0_energies = []
        prod_1_energies = []
        prod_2_energies = []
        for i in range(statistics):
            mu.position = pp.Vector3D(0, 0, 0)
            mu.direction = pp.Vector3D(0, 0, -1)
            mu.energy = mu.particle_def.mass
            mu.propagated_distance = 0

            decay_products = channel.decay(mu)
            for p in decay_products:
                if p.particle_def == products[0]:
                    prod_0_energies.append(p.energy)
                elif p.particle_def == products[1]:
                    prod_1_energies.append(p.energy)
                elif p.particle_def == products[2]:
                    prod_2_energies.append(p.energy)
                else:
                    assert ("This should never happen")

        histogram = []
        histogram.append(
            np.histogram(prod_0_energies,
                         bins=NUM_bins,
                         range=(0, mu.particle_def.mass / 2))[0])
        histogram.append(
            np.histogram(prod_1_energies,
                         bins=NUM_bins,
                         range=(0, mu.particle_def.mass / 2))[0])
        histogram.append(
            np.histogram(prod_2_energies,
                         bins=NUM_bins,
                         range=(0, mu.particle_def.mass / 2))[0])

        histrogram_list.append(histogram)

    with open(dir_name + "Decay_Leptonic.txt", "a") as file:
        buf = [""]
        buf.append(str(statistics))
        buf.append(str(NUM_bins))
        buf.append("\n")
        file.write("\t".join(buf))

        for name, hist in zip(decay_names, histrogram_list):
            buf = [""]
            buf.append(name)
            buf.append("\n")
            for prod in hist:
                for bin_value in prod:
                    buf.append(str(bin_value))
                buf.append("\n")

            file.write("\t".join(buf))
Ejemplo n.º 17
0
          " particles have been propagated")
    return (list_position_i, list_position_f, list_ID, list_energy_i)

if (len(sys.argv) != 3 and len(sys.argv) != 4):
    print(
        "Invalid arguments! First argument must be energy, second argument shower depth. Third argument optional filename"
    )
    sys.exit()
print("Start shower propagation with initial energy " +
      str(sys.argv[1] + " MeV and maximal depth of " + str(sys.argv[2]) +
          " generations."))

list_position_i, list_position_f, list_ID, list_energy_i = start_shower(
    float(sys.argv[1]),
    int(sys.argv[2]),
    direction=pp.Vector3D(0, 0, -1),
    position=pp.Vector3D(0, 0, 1000000))

x_list_i = []
y_list_i = []
z_list_i = []

x_list_f = []
y_list_f = []
z_list_f = []

for positions in list_position_i:
    x_list_i.append(positions.x)
    y_list_i.append(positions.y)
    z_list_i.append(positions.z)
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
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')
Ejemplo n.º 20
0
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()
Ejemplo n.º 21
0
    import matplotlib.pyplot as plt
except ImportError:
    raise ImportError("Matplotlib not installed!")

if __name__ == "__main__":

    # =========================================================
    # 	Propagate
    # =========================================================

    energy = 1e7  # MeV
    statistics = 10000

    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.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),
Ejemplo n.º 22
0
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))
Ejemplo n.º 23
0
    return 64 * G_F**2 * p1 * p2


if __name__ == "__main__":

    # =========================================================
    # 	Save energies
    # =========================================================

    statistics = int(1e5)
    binning = np.linspace(0, 0.5, 50)

    pdef = pp.particle.MuMinusDef.get()
    mu = pp.particle.DynamicData(pdef.particle_type)
    mu.direction = pp.Vector3D(0, 0, -1)

    products = [pp.particle.EMinusDef.get(), pp.particle.NuMuDef.get(), pp.particle.NuEBarDef.get()]

    lep_ME = pp.decay.ManyBodyPhaseSpace(products, evaluate)
    lep = pp.decay.LeptonicDecayChannelApprox(*products)

    E_lep_ME = []
    E_lep = []

    passed_time = 0.0

    for i in tqdm(range(statistics)):
        mu.position = pp.Vector3D(0, 0, 0)
        mu.direction = pp.Vector3D(0, 0, -1)
        mu.energy = pdef.mass
Ejemplo n.º 24
0
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()