def create_table(dir_name):

    particle_defs = [
        pp.particle.MuMinusDef(),
        pp.particle.TauMinusDef(),
        pp.particle.EMinusDef()
    ]

    cuts = [
        pp.EnergyCutSettings(-1, -1),
        pp.EnergyCutSettings(500, -1),
        pp.EnergyCutSettings(-1, 0.05),
        pp.EnergyCutSettings(500, 0.05)
    ]

    mediums = [
        pp.medium.Ice(1.0),
        pp.medium.Hydrogen(1.0),
        pp.medium.Uranium(1.0)
    ]

    initial_energy = np.logspace(4, 13, num=10)  # MeV
    final_energy = initial_energy - 1000

    pp.RandomGenerator.get().set_seed(0)
    np.random.seed(123)

    with open(dir_name + "continous_randomization.txt", "w") as file:

        for particle in particle_defs:
            for medium in mediums:
                for cut in cuts:

                    utility = pp.Utility(particle, medium, cut,
                                         pp.UtilityDefinition(),
                                         pp.InterpolationDef())

                    cont_rand = pp.ContinuousRandomizer(
                        utility, pp.InterpolationDef())

                    buf = [""]

                    for i in range(len(initial_energy)):
                        rnd = np.random.random_sample()
                        rand_energy = cont_rand.randomize(
                            initial_energy[i], final_energy[i], rnd)

                        buf.append(str(rnd))
                        buf.append(particle.name)
                        buf.append(medium.name)
                        buf.append(str(cut.ecut))
                        buf.append(str(cut.vcut))
                        buf.append(str(initial_energy[i]))
                        buf.append(str(final_energy[i]))
                        buf.append(str(rand_energy))
                        buf.append("\n")

                    file.write("\t".join(buf))
def test_proposal():

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

    # initialize propagator

    args = {
        "particle_def": pp.particle.MuMinusDef(),
        "target": pp.medium.Ice(),
        "interpolate": True,
        "cuts": pp.EnergyCutSettings(500, 0.05)
    }

    cross = pp.crosssection.make_std_crosssection(**args)

    collection = pp.PropagationUtilityCollection()
    collection.displacement = pp.make_displacement(cross, True)
    collection.interaction = pp.make_interaction(cross, True)
    collection.time = pp.make_time(cross, args["particle_def"], True)
    utility = pp.PropagationUtility(collection=collection)

    detector = pp.geometry.Sphere(pp.Cartesian3D(0, 0, 0), 1e20)
    density_distr = pp.density_distribution.density_homogeneous(
        args["target"].mass_density)

    prop = pp.Propagator(args["particle_def"],
                         [(detector, utility, density_distr)])

    # intialize initial state

    statistics = 100

    init_state = pp.particle.ParticleState()
    init_state.energy = 1e8  # initial energy in MeV
    init_state.position = pp.Cartesian3D(0, 0, 0)
    init_state.direction = pp.Cartesian3D(0, 0, -1)
    init_state.time = 0

    pp.RandomGenerator.get().set_seed(1234)
    for i in range(statistics):

        output = prop.propagate(init_state)
        energies = output.track_energies()
        times = output.track_times()

        E_old = init_state.energy
        t_old = init_state.time

        for E, t in zip(energies, times):
            energy_diff = E_old - E
            time_diff = t - t_old
            E_old = E
            t_old = t

            assert (energy_diff >= 0)
            assert (time_diff >= 0)
    pp.parametrization.bremsstrahlung.PetrukhinShestakov,
    pp.parametrization.bremsstrahlung.CompleteScreening,
    pp.parametrization.bremsstrahlung.AndreevBezrukovBugaev,
    pp.parametrization.bremsstrahlung.SandrockSoedingreksoRhode
]

particle_defs = [
    pp.particle.MuMinusDef(),
    pp.particle.TauMinusDef(),
    pp.particle.EMinusDef()
]

mediums = [pp.medium.Ice(1.0), pp.medium.Hydrogen(1.0), pp.medium.Uranium(1.0)]

cuts = [
    pp.EnergyCutSettings(-1, -1),
    pp.EnergyCutSettings(500, -1),
    pp.EnergyCutSettings(-1, 0.05),
    pp.EnergyCutSettings(500, 0.05)
]

multiplier = 1.

lpms = [0, 1]

energies = np.logspace(4, 13, num=10)

interpoldef = pp.InterpolationDef()


def create_table_dEdx(dir_name, interpolate=False):
Beispiel #4
0
import proposal as pp
import proposal.parametrization as parametrization

from matplotlib.gridspec import GridSpec
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np

if __name__ == "__main__":

    mu = pp.particle.MuMinusDef()
    medium = pp.medium.StandardRock(1.0)  # With densitiy correction
    cuts = pp.EnergyCutSettings(-1, -1)  # ecut, vcut

    dEdx_epair = []
    energy = np.logspace(2, 9, 100)

    interpolation_def = pp.InterpolationDef()

    # =========================================================
    # 	Constructor args for parametrizations
    #
    #   - particle
    #   - medium
    #   - cut
    #   - multiplier
    #   - lpm effect
    #   - interpolation definition
    # =========================================================

    param_defs = [mu, medium, cuts, 1.0, False, interpolation_def]
Beispiel #5
0
def propagate_deflected_muons(initial_energies,
                              minimum_energies,
                              inter_type,
                              deflection_type='continuous+stochastic',
                              e_cut=500,
                              v_cut=0.05,
                              cont_rand=False,
                              scattering_method="highlandintegral",
                              beta=1.0,
                              rnd_seed=1337,
                              initial_direction=[0, 0, 1]):
    '''Propagate muon tracks with deflection. Scaling of Bremsstrahlung opening angle can be done by beta.
    
    Parameters
    ----------
    initial_energies: list of energies
    minimum_energs: list of energies, lower propagation limit
    inter_type: list of interaction types for propagation/deflection
    deflection_type: string, choose one:
            1. 'contiuous+stochastic'
            2. 'continuous'
            3. 'stochastic'
    beta: scaling factor for Bremsstrahlung
    e_cut, v_cut, cont_rand: usual PROPOSAL energy cut settings
    initial_direction: list of initial direction (cartesian coordinates)
    '''
    pp.RandomGenerator.get().set_seed(rnd_seed)
    args = {
        "particle_def": pp.particle.MuMinusDef(),
        "target": pp.medium.Ice(),
        "interpolate": True,
        "cuts": pp.EnergyCutSettings(e_cut, v_cut, cont_rand)
    }

    cross = pp.crosssection.make_std_crosssection(**args)
    multiple_scatter = pp.make_multiple_scattering(scattering_method,
                                                   args["particle_def"],
                                                   args["target"], cross, True)
    stochastic_deflect = pp.make_default_stochastic_deflection(
        inter_type, args["particle_def"], args["target"])

    collection = pp.PropagationUtilityCollection()
    collection.displacement = pp.make_displacement(cross, True)
    collection.interaction = pp.make_interaction(cross, True)
    collection.time = pp.make_time(cross, args["particle_def"], True)
    collection.decay = pp.make_decay(cross, args["particle_def"], True)

    if deflection_type == 'stochastic':
        print('stochastic deflection')
        if pp.particle.Interaction_Type.brems in inter_type:
            collection.scattering = pp.scattering.ScatteringMultiplier(
                stochastic_deflect,
                [(pp.particle.Interaction_Type.brems, beta)])
        else:
            collection.scattering = pp.scattering.ScatteringMultiplier(
                stochastic_deflect, [(inter_type[0], 1.0)])
    elif deflection_type == 'continuous':
        print('continuous deflection')
        collection.scattering = pp.scattering.ScatteringMultiplier(
            multiple_scatter, 1.0)
    elif deflection_type == 'continuous+stochastic':
        print('continuous and stochastic deflection')
        if pp.particle.Interaction_Type.brems in inter_type:
            collection.scattering = pp.scattering.ScatteringMultiplier(
                multiple_scatter, stochastic_deflect, 1.0,
                [(pp.particle.Interaction_Type.brems, beta)])
        else:
            collection.scattering = pp.scattering.ScatteringMultiplier(
                multiple_scatter, stochastic_deflect, 1.0,
                [(inter_type[0], 1.0)])

    utility = pp.PropagationUtility(collection=collection)
    detector = pp.geometry.Sphere(pp.Vector3D(0, 0, 0), 1e20)
    density_distr = pp.density_distribution.density_homogeneous(
        args["target"].mass_density)

    prop = pp.Propagator(args["particle_def"],
                         [(detector, utility, density_distr)])

    init_state = pp.particle.ParticleState()
    init_state.position = pp.Vector3D(0, 0, 0)
    init_state.direction = pp.Vector3D(initial_direction[0],
                                       initial_direction[1],
                                       initial_direction[2])

    tracks = []
    for E_i, E_min in zip(tqdm(initial_energies), minimum_energies):
        init_state.energy = E_i  # initial energy in MeV
        track = prop.propagate(init_state, max_distance=1e9, min_energy=E_min)
        tracks.append(track)

    return tracks
import os
import proposal as pp
import numpy as np

parametrizations = [
    pp.parametrization.compton.KleinNishina(),
]

mediums = [pp.medium.Ice(), pp.medium.Hydrogen(), pp.medium.Uranium()]

particle = pp.particle.GammaDef()

cuts = [
    pp.EnergyCutSettings(np.inf, 1),
    pp.EnergyCutSettings(500, 1),
    pp.EnergyCutSettings(np.inf, 0.05),
    pp.EnergyCutSettings(500, 0.05)
]

multiplier = 1.

energies = np.logspace(4, 13, num=10)


def create_tables(dir_name, **kwargs):

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

    buf = {}

    for key in kwargs:
def propagate_muons():

    mu_def = pp.particle.MuMinusDef()
    geometry = pp.geometry.Sphere(pp.Vector3D(), 1.e20, 0.0)
    ecut = 500
    vcut = 5e-2

    sector_def = pp.SectorDefinition()
    sector_def.cut_settings = pp.EnergyCutSettings(ecut, vcut)
    sector_def.medium = pp.medium.StandardRock(1.0)
    sector_def.geometry = geometry
    sector_def.scattering_model = pp.scattering.ScatteringModel.NoScattering
    sector_def.crosssection_defs.brems_def.lpm_effect = False
    sector_def.crosssection_defs.epair_def.lpm_effect = False
    # sector_def.crosssection_defs.photo_def.parametrization = pp.parametrization.photonuclear.PhotoParametrization.BezrukovBugaev
    # sector_def.do_stochastic_loss_weighting = True
    # sector_def.stochastic_loss_weighting = -0.1

    detector = geometry

    interpolation_def = pp.InterpolationDef()
    interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables"
    interpolation_def.path_to_tables_readonly = "~/.local/share/PROPOSAL/tables"

    prop = pp.Propagator(mu_def, [sector_def], detector, interpolation_def)

    statistics_log = 4
    statistics = int(10**statistics_log)
    propagation_length = 1e4 # cm
    E_min_log = 10.0
    E_max_log = 10.0
    spectral_index = 1.0
    pp.RandomGenerator.get().set_seed(1234)

    # muon_energies = np.logspace(E_min_log, E_max_log, statistics)
    # muon_energies = power_law_sampler(spectral_index, 10**E_min_log, 10**E_max_log, statistics)
    muon_energies = np.ones(statistics)*10**10

    epair_secondary_energy = []
    brems_secondary_energy = []
    ioniz_secondary_energy = []
    photo_secondary_energy = []

    mu_prop = pp.particle.DynamicData(mu_def.particle_type)
    mu_prop.position = pp.Vector3D(0, 0, 0)
    mu_prop.direction = pp.Vector3D(0, 0, -1)
    mu_prop.propagated_distance = 0

    for mu_energy in tqdm(muon_energies):

        mu_prop.energy = mu_energy

        secondarys = prop.propagate(mu_prop, propagation_length)

        for sec in secondarys.particles:
            log_sec_energy = np.log10(sec.parent_particle_energy - sec.energy)

            if sec.type == int(pp.particle.Interaction_Type.Epair):
                epair_secondary_energy.append(log_sec_energy)
            if sec.type == int(pp.particle.Interaction_Type.Brems):
                brems_secondary_energy.append(log_sec_energy)
            if sec.type == int(pp.particle.Interaction_Type.DeltaE):
                ioniz_secondary_energy.append(log_sec_energy)
            if sec.type == int(pp.particle.Interaction_Type.NuclInt):
                photo_secondary_energy.append(log_sec_energy)

    # =========================================================
    #   Write
    # =========================================================

    np.savez(
        'data_sec_dist_{}_{}_Emin_{}_Emax_{}'.format(
            mu_def.name,
            sector_def.medium.name.lower(),
            E_min_log,
            E_max_log,
            ecut,
            vcut),
        brems=brems_secondary_energy,
        epair=epair_secondary_energy,
        photo=photo_secondary_energy,
        ioniz=ioniz_secondary_energy,
        statistics=[statistics],
        E_min=[E_min_log],
        E_max=[E_max_log],
        spectral_index=[spectral_index],
        distance=[propagation_length / 100],
        medium_name=[sector_def.medium.name.lower()],
        particle_name=[mu_def.name],
        ecut=[ecut],
        vcut=[vcut]
    )
def plot_theory_curve():

    npzfile = np.load("data_sec_dist_MuMinus_standardrock_Emin_10.0_Emax_10.0.npz")

    ioniz_secondary_energy = npzfile['ioniz']
    brems_secondary_energy = npzfile['brems']
    photo_secondary_energy = npzfile['photo']
    epair_secondary_energy = npzfile['epair']

    all_secondary_energy = np.concatenate((
        ioniz_secondary_energy,
        brems_secondary_energy,
        photo_secondary_energy,
        epair_secondary_energy)
    )

    sum_hist = np.sum(all_secondary_energy)
    print(sum_hist)

    list_secondary_energies = [
        ioniz_secondary_energy,
        brems_secondary_energy,
        photo_secondary_energy,
        epair_secondary_energy,
        all_secondary_energy
    ]

    list_secondary_energies_label = [
        'Ionization',
        'Photonuclear',
        'Bremsstrahlung',
        'Pair Production',
        'Sum'
    ]

    statistics = npzfile['statistics'][0]
    E_min_log = npzfile['E_min'][0]
    E_max_log = npzfile['E_max'][0]
    spectral_index = npzfile['spectral_index'][0]
    distance = npzfile['distance'][0]
    medium_name = npzfile['medium_name'][0]
    particle_name = npzfile['particle_name'][0]
    ecut = npzfile['ecut'][0]
    vcut = npzfile['vcut'][0]

    particle_def = pp.particle.MuMinusDef()
    medium = pp.medium.StandardRock(1.0)
    energy_cuts = pp.EnergyCutSettings(500, -1)
    multiplier = 1.
    lpm = False
    shadow_effect = pp.parametrization.photonuclear.ShadowButkevichMikhailov()
    add_pertubative = True
    interpolation_def = pp.InterpolationDef()
    interpolation_def.path_to_tables = "~/.local/share/PROPOSAL/tables"

    ioniz = pp.parametrization.Ionization(
        particle_def=particle_def,
        medium=medium,
        energy_cuts=energy_cuts,
        multiplier=multiplier)

    epair = pp.parametrization.pairproduction.EpairProductionRhoInterpolant(
        particle_def=particle_def,
        medium=medium,
        energy_cuts=energy_cuts,
        multiplier=multiplier,
        lpm_effect=lpm,
        interpolation_def=interpolation_def)

    brems = pp.parametrization.bremsstrahlung.KelnerKokoulinPetrukhin(
        particle_def=particle_def,
        medium=medium,
        energy_cuts=energy_cuts,
        multiplier=multiplier,
        lpm_effect=lpm)

    photo = pp.parametrization.photonuclear.AbramowiczLevinLevyMaor97Interpolant(
        particle_def=particle_def,
        medium=medium,
        energy_cuts=energy_cuts,
        multiplier=multiplier,
        shadow_effect=shadow_effect,
        interpolation_def=interpolation_def)

    photo2 = pp.parametrization.photonuclear.BezrukovBugaev(
        particle_def=particle_def,
        medium=medium,
        energy_cuts=energy_cuts,
        multiplier=multiplier,
        add_pertubative=add_pertubative)

    losses_params = [ioniz, epair, brems, photo2]

    muon_energy = 10**10  # MeV

    inch_to_cm = 2.54
    golden_ratio = 1.61803
    width = 29.7  # cm

    num_bins = 100
    v_bins = np.linspace(np.log10(500), np.log10(muon_energy), num_bins)
    v_bins_log = np.logspace(np.log10(500./muon_energy), np.log10(1.), num_bins)

    fig = plt.figure(figsize=(width / inch_to_cm, width / inch_to_cm / golden_ratio))
    ax = fig.add_subplot(111)

    for idx, secondary_list in enumerate(list_secondary_energies):
        ax.hist(
            secondary_list,
            weights=np.ones(len(secondary_list))/sum_hist,
            histtype='step',
            log=True,
            bins=v_bins,
            label=list_secondary_energies_label[idx]
        )

    all_cross_sections = np.empty((len(losses_params), num_bins))

    for idx, param in enumerate(losses_params):
        all_cross_sections[idx] = np.array([param.differential_crosssection(muon_energy, v)*v for v in v_bins_log])

    sum_cross_sections = np.sum(all_cross_sections, axis=0)
    print(sum(all_cross_sections[np.isfinite(all_cross_sections)]))
    print(sum(sum_cross_sections[np.isfinite(sum_cross_sections)]))

    for cross_section in np.append(all_cross_sections, [sum_cross_sections], axis=0):
        ax.plot(
            v_bins,
            cross_section/sum(sum_cross_sections[np.isfinite(sum_cross_sections)]),
            drawstyle="steps-pre"
        )

    # ax.set_xscale("log")
    minor_locator = AutoMinorLocator()
    ax.xaxis.set_minor_locator(minor_locator)
    ax.legend()
    ax.set_xlabel(r'energy loss / log($E$/MeV)')
    ax.set_ylabel(r'$N$')

    ax.set_ylim(ymin=1e-8)
    ax.set_yscale("log")
    ax.legend()
    fig.savefig("theory_curve.pdf")
Beispiel #9
0
logger = logging.getLogger("track_plotter")
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)

pp.InterpolationSettings.tables_path = "/home/msackel/.cache/PROPOSAL"

targets = {"air": pp.medium.Air(), "standardrock": pp.medium.StandardRock()}

utilities = {}
for target in targets.values():

    prop_def = {
        "particle_def": pp.particle.MuMinusDef(),
        "cuts": pp.EnergyCutSettings(500, 1, False),
        "target": target,
        "interpolate": True,
    }

    cross = pp.crosssection.make_std_crosssection(**prop_def)
    collection = pp.PropagationUtilityCollection()
    collection.displacement = pp.make_displacement(cross, True)
    collection.interaction = pp.make_interaction(cross, True)
    collection.time = pp.make_time_approximate()

    utilities[f"{target.name}"] = pp.PropagationUtility(collection)

logger.info("utility build")

earth_radius = 6300 * 1e5  # km -> cm
def create_table(dir_name):

    particle_defs = [
        pp.particle.MuMinusDef(),
        pp.particle.TauMinusDef(),
        pp.particle.EMinusDef()
    ]

    mediums = [
        pp.medium.Ice(),
        pp.medium.Hydrogen(),
        pp.medium.Uranium()
    ]

    cuts = [
        pp.EnergyCutSettings(np.inf, 1, True),
        pp.EnergyCutSettings(500, 1, True),
        pp.EnergyCutSettings(np.inf, 0.05, True),
        pp.EnergyCutSettings(500, 0.05, True)
    ]

    initial_energy = np.logspace(4, 13, num=10)  # MeV
    final_energy = initial_energy - 1000

    pp.RandomGenerator.get().set_seed(0)
    np.random.seed(123)

    with open(dir_name + "continous_randomization.txt", "w") as file:

        for particle in particle_defs:
            for medium in mediums:
                for cut in cuts:

                    args = {
                        "particle_def": particle,
                        "target": medium,
                        "interpolate": False,
                        "cuts": cut
                    }

                    cross = pp.crosssection.make_std_crosssection(**args)
                    cont_rand = pp.make_contrand(cross, False)


                    buf = [""]

                    for i in range(len(initial_energy)):
                        rnd = np.random.random_sample()
                        rand_energy = cont_rand.randomize(
                            initial_energy[i],
                            final_energy[i],
                            rnd
                        )

                        buf.append(str(rnd))
                        buf.append(particle.name)
                        buf.append(medium.name)
                        buf.append(str(cut.ecut))
                        buf.append(str(cut.vcut))
                        buf.append(str(initial_energy[i]))
                        buf.append(str(final_energy[i]))
                        buf.append(str(rand_energy))
                        buf.append("\n")

                    file.write("\t".join(buf))
particle_defs = [
    pp.particle.MuMinusDef(),
    # pp.particle.TauMinusDef(),
    # pp.particle.EMinusDef()
    ]

mediums = [
    pp.medium.Ice(),
    pp.medium.Hydrogen(),
    # pp.medium.Uranium()
    ]

cuts = [
    # pp.EnergyCutSettings(-1, -1),
    pp.EnergyCutSettings(500, 1),
    # pp.EnergyCutSettings(-1, 0.05),
    pp.EnergyCutSettings(500, 0.05)
    ]

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

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

pp.InterpolationSettings.tables_path = "~/.local/share/PROPOSAL/tables"

def create_table_continous(dir_name):