Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • simulation/km3buu
1 result
Show changes
Commits on Source (7)
......@@ -28,10 +28,14 @@ RUN source /opt/rh/devtoolset-10/enable && \
ADD . /km3buu
RUN cd /km3buu && \
RUN source /opt/rh/devtoolset-10/enable && \
cd /km3buu && \
pip3 install --upgrade pip && \
pip3 install setuptools-scm && \
pip3 install pytest-runner && \
pip3 install -e .
pip3 install -e . && \
pip3 install -e ".[dev]" && \
pip3 install -e ".[extras]"
RUN cd /km3buu/externals/km3net-dataformat/ && \
make
......
......@@ -42,6 +42,7 @@ install:
install-dev:
pip install -e ".[dev]"
pip install -e ".[extras]"
test:
python -m pytest --junitxml=./reports/junit.xml -o junit_suite_name=$(PKGNAME) $(PKGNAME)
......
......@@ -15,6 +15,7 @@ from . import IMAGE_NAME
from .environment import build_image
import mendeleev
import xml.etree.ElementTree as ElementTree
import tempfile
__author__ = "Johannes Schumann"
__copyright__ = "Copyright 2020, Johannes Schumann and the KM3NeT collaboration."
......@@ -101,7 +102,7 @@ class Config(object):
@property
def proposal_itp_tables(self):
default_path = abspath(join(dirname(__file__), "../.tables"))
default_path = tempfile.gettempdir()
return self.get(PROPOSAL_SECTION, PROPOSAL_ITP_PATH_KEY, default_path)
@proposal_itp_tables.setter
......
......@@ -614,7 +614,7 @@ def write_detector_file(gibuu_output,
bjorkeny = event_data.By
tau_secondaries = None
if propagate_tau and abs(nu_type) == 16:
if propagate_tau and abs(nu_type) == 16 and ichan == 2:
from .propagation import propagate_lepton
tau_secondaries = propagate_lepton(event_data, np.sign(nu_type) * 15)
......@@ -707,7 +707,7 @@ def write_detector_file(gibuu_output,
if tau_secondaries is not None:
event_tau_sec = tau_secondaries[mc_event_id]
add_particles(event_tau_sec, vtx_pos, R, mc_trk_id, timestamp,
PARTICLE_MC_STATUS["StableFinalState"])
PARTICLE_MC_STATUS["TRK_ST_FINALSTATE"])
mc_trk_id += len(event_tau_sec.E)
else:
lep_out_trk = ROOT.Trk()
......
......@@ -18,6 +18,7 @@ import proposal as pp
from particle import Particle
import awkward as ak
from collections import defaultdict
import pathlib
from .config import Config
......@@ -36,23 +37,34 @@ PROPOSAL_LEPTON_DEFINITIONS = {
-16: pp.particle.NuTauBarDef
}
PROPOSAL_TARGET = pp.medium.AntaresWater()
def _setup_propagator(max_distance, lepton_definition):
sector = pp.SectorDefinition()
sector.medium = pp.medium.AntaresWater(1.0)
geometry = pp.geometry.Sphere(pp.Vector3D(), max_distance, 0)
sector.geometry = geometry
sector.scattering_model = pp.scattering.ScatteringModel.Highland
cfg = Config()
interpolation = pp.InterpolationDef()
interpolation.path_to_tables = cfg.proposal_itp_tables
interpolation.path_to_tables_readonly = cfg.proposal_itp_tables
def _setup_propagator(max_distance, particle_definition):
itp_table_path = Config().proposal_itp_tables
pathlib.Path(itp_table_path).mkdir(parents=True, exist_ok=True)
pp.InterpolationSettings.tables_path = itp_table_path
crosssection = pp.crosssection.make_std_crosssection(
particle_def=particle_definition,
target=PROPOSAL_TARGET,
interpolate=True,
cuts=pp.EnergyCutSettings(np.inf, 0.05, False))
collection = pp.PropagationUtilityCollection()
collection.displacement = pp.make_displacement(crosssection, True)
collection.interaction = pp.make_interaction(crosssection, True)
collection.decay = pp.make_decay(crosssection, particle_definition, True)
collection.time = pp.make_time(crosssection, particle_definition, True)
return pp.Propagator(sector_defs=[sector],
particle_def=lepton_definition,
detector=geometry,
interpolation_def=interpolation)
utility = pp.PropagationUtility(collection=collection)
geometry = pp.geometry.Sphere(pp.Cartesian3D(), max_distance)
density_distr = pp.density_distribution.density_homogeneous(
PROPOSAL_TARGET.mass_density)
propagator = pp.Propagator(particle_definition,
[(geometry, utility, density_distr)])
return propagator
def propagate_lepton(lepout_data, pdgid):
......@@ -76,28 +88,30 @@ def propagate_lepton(lepout_data, pdgid):
lepout_data.lepOut_E) / lepton_info.mass #[cm]
lepton_def = PROPOSAL_LEPTON_DEFINITIONS[pdgid]()
lepton = pp.particle.DynamicData(lepton_def.particle_type)
propagated_data = defaultdict(list)
propagator = _setup_propagator(10 * prop_range, lepton_def)
propagated_data = defaultdict(list)
for entry in lepout_data:
lepton.energy = entry.lepOut_E * 1e3
lepton.position = pp.Vector3D(0, 0, 0)
lepton.direction = pp.Vector3D(entry.lepOut_Px, entry.lepOut_Py,
entry.lepOut_Pz)
lepton.direction.normalize()
secondaries = propagator.propagate(lepton, 5 * prop_range)
E = np.array(secondaries.energy) / 1e3
pdgid = [p.type for p in secondaries.particles]
Px = [p.direction.x * p.momentum / 1e3 for p in secondaries.particles]
Py = [p.direction.y * p.momentum / 1e3 for p in secondaries.particles]
Pz = [p.direction.z * p.momentum / 1e3 for p in secondaries.particles]
x = [p.position.x / 100 for p in secondaries.particles]
y = [p.position.y / 100 for p in secondaries.particles]
z = [p.position.z / 100 for p in secondaries.particles]
dt = [p.time for p in secondaries.particles]
init_state = pp.particle.ParticleState()
init_state.energy = entry.lepOut_E * 1e3
init_state.position = pp.Cartesian3D(0, 0, 0)
init_state.direction = pp.Cartesian3D(entry.lepOut_Px, entry.lepOut_Py,
entry.lepOut_Pz)
init_state.direction.normalize()
track = propagator.propagate(init_state, 5 * prop_range)
secondaries = track.decay_products()
E = [s.energy / 1e3 for s in secondaries]
pdgid = [p.type for p in secondaries]
Px = [p.direction.x * p.momentum / 1e3 for p in secondaries]
Py = [p.direction.y * p.momentum / 1e3 for p in secondaries]
Pz = [p.direction.z * p.momentum / 1e3 for p in secondaries]
x = [p.position.x / 100 for p in secondaries]
y = [p.position.y / 100 for p in secondaries]
z = [p.position.z / 100 for p in secondaries]
dt = [p.time for p in secondaries]
propagated_data["E"].append(E)
propagated_data["Px"].append(Px)
......
......@@ -14,42 +14,53 @@ import csv
import unittest
import numpy as np
import uproot
import pytest
from os.path import abspath, join, dirname
from thepipe.logger import get_logger
from km3net_testdata import data_path
import proposal as pp
from km3buu.output import GiBUUOutput
import awkward as ak
from km3buu.propagation import propagate_lepton
TESTDATA_DIR = data_path("gibuu")
pp.RandomGenerator.get().set_seed(1234)
@pytest.mark.skip(reason="CI boost lib problem")
class TestTauPropagation(unittest.TestCase):
def setUp(self):
log = get_logger("ctrl.py")
log.setLevel("INFO")
self.gibuu_output = GiBUUOutput(TESTDATA_DIR)
fname = join(TESTDATA_DIR, self.gibuu_output.root_pert_files[0])
fobj = uproot.open(fname)
data = fobj["RootTuple"].arrays()
data = ak.Array({
"lepOut_E": [
17.45830624434573, 3.1180989952362594, 21.270059768902005,
5.262659790136034, 23.52185741888274
],
"lepOut_Px": [
-0.42224402086330426, -1.0232258668453014, -0.5801431899058521,
-0.9038349288874724, 0.9022573877437422
],
"lepOut_Py": [
0.3644190693190108, -0.24542303987320932, 0.24499631087268617,
-1.1060562370375715, -3.982173292871768
],
"lepOut_Pz": [
17.35867612031871, 2.336148261778657, 21.186342871282157,
4.743161507744377, 23.096499191566885
]
})
self.sec = propagate_lepton(data, 15)
def test_secondary_momenta(self):
np.testing.assert_array_almost_equal(np.array(self.sec[0].E),
[0.535, 1.316, 0.331],
[2.182, 13.348, 1.928],
decimal=3)
np.testing.assert_array_almost_equal(np.array(self.sec[0].Px),
[-0.467, 0.321, -0.246],
[0.295, -0.48, -0.237],
decimal=3)
np.testing.assert_array_almost_equal(np.array(self.sec[0].Py),
[0.127, -0.822, 0.218],
[-0.375, 0.784, -0.044],
decimal=3)
np.testing.assert_array_almost_equal(np.array(self.sec[0].Pz),
[0.179, 0.967, -0.041],
[2.129, 13.316, 1.913],
decimal=3)
def test_secondary_types(self):
......@@ -57,9 +68,12 @@ class TestTauPropagation(unittest.TestCase):
[13, 16, -14])
def test_secondary_positions(self):
np.testing.assert_array_almost_equal(np.array(self.sec[0].x), [0, 0],
np.testing.assert_array_almost_equal(np.array(self.sec[0].x),
[-1.4e-05, -1.4e-05, -1.4e-05],
decimal=1)
np.testing.assert_array_almost_equal(np.array(self.sec[0].y), [0, 0],
np.testing.assert_array_almost_equal(np.array(self.sec[0].y),
[1.2e-05, 1.2e-05, 1.2e-05],
decimal=1)
np.testing.assert_array_almost_equal(np.array(self.sec[0].z), [0, 0],
np.testing.assert_array_almost_equal(np.array(self.sec[0].z),
[0., 0., 0.],
decimal=1)
File moved
docopt
type-docopt
tqdm
......@@ -10,4 +10,4 @@ uproot>=4.0.0
awkward>=1.0.0
pandas
mendeleev
proposal==6.1.6
proposal>=7.1.1
#!/usr/bin/env python
# coding=utf-8
# Filename: runner.py
# Author: Johannes Schumann <jschumann@km3net.de>
"""
Usage:
runner.py fixed --energy=ENERGY --events=EVENTS (--CC|--NC) (--electron|--muon|--tau) --target-a=TARGETA --target-z=TARGETZ (--sphere=RADIUS | --can) [--outdir=OUTDIR] [--km3netfile=OUTFILE]
runner.py range --energy-min=ENERGYMIN --energy-max=ENERGYMAX --events=EVENTS (--CC|--NC) (--electron|--muon|--tau) --target-a=TARGETA --target-z=TARGETZ (--sphere=RADIUS | --can) [--flux=FLUXFILE] [--outdir=OUTDIR] [--km3netfile=OUTFILE]
runner.py (-h | --help)
Options:
-h --help Show this screen.
--energy=ENERGY Neutrino energy [type: float]
--energy-min=ENERGYMIN Neutrino energy [type: float]
--energy-max=ENERGYMAX Neutrino energy [type: float]
--events=EVENTS Number of simulated events [type: int]
--target-a=TARGETA Target nucleons [type: int]
--target-z=TARGETZ Target protons [type: int]
--sphere=RADIUS Radius of the sphere volume in metres [type: float]
--can Use CAN with std. dimensions
--flux=FLUXFILE Flux definition [type: path]
--outdir=OUTDIR Output directory [type: path]
(--CC | --NC) Interaction type
(--electron | --muon | --tau) Neutrino flavor
"""
from type_docopt import docopt
from pathlib import Path
from tempfile import TemporaryDirectory
from os.path import join
from km3buu.jobcard import generate_neutrino_jobcard
from km3buu.ctrl import run_jobcard
from km3buu.geometry import CanVolume, SphericalVolume
from km3buu.output import GiBUUOutput, write_detector_file
def main():
args = docopt(__doc__, types={'path': Path})
events = args["--events"]
energy = args["--energy"] if args["fixed"] else (args["--energy-min"],
args["--energy-max"])
interaction = "CC" if args["--CC"] else "NC"
flavour = "electron" if args["--electron"] else (
"muon" if args["--muon"] else "tau")
target = (args["--target-z"], args["--target-a"])
jc = generate_neutrino_jobcard(events,
interaction,
flavour,
energy,
target,
fluxfile=args["--flux"])
outdir = args["--outdir"] if args["--outdir"] else TemporaryDirectory()
outdirname = outdir if args["--outdir"] else outdir.name
run_jobcard(jc, outdirname)
fobj = GiBUUOutput(outdir)
volume = SphericalVolume(
args["--sphere"]) if args["--sphere"] else CanVolume()
if args["fixed"]:
descriptor = "{0}_{1}_{2}GeV_A{3}Z{4}".format(flavour, interaction,
energy, target[0],
target[1])
else:
descriptor = "{0}_{1}_{2}-{3}GeV_A{4}Z{5}".format(
flavour, interaction, energy[0], energy[1], target[0], target[1])
if args["--km3netfile"]:
outfilename = args["--km3netfile"]
else:
outfilename = "km3buu_" + descriptor + ".root"
if args["--outdir"]:
outfilename = join(args["--outdir"], outfilename)
write_detector_file(fobj, geometry=volume, ofile=outfilename)
if __name__ == '__main__':
main()
......@@ -15,11 +15,11 @@ DESCRIPTION = 'GiBUU tools for KM3NeT'
__author__ = 'Johannes Schumann'
__email__ = 'jschumann@km3net.de'
with open('requirements.txt') as fobj:
REQUIREMENTS = [l.strip() for l in fobj.readlines()]
with open('requirements-dev.txt') as fobj:
DEV_REQUIREMENTS = [l.strip() for l in fobj.readlines()]
def read_requirements(kind):
with open(os.path.join('requirements', kind + '.txt')) as fobj:
requirements = [l.strip() for l in fobj.readlines()]
return requirements
setup(
name=PACKAGE_NAME,
......@@ -35,8 +35,11 @@ setup(
'write_to': '{}/version.txt'.format(PACKAGE_NAME),
'tag_regex': r'^(?P<prefix>v)?(?P<version>[^\+]+)(?P<suffix>.*)?$',
},
install_requires=REQUIREMENTS,
extras_require={'dev': DEV_REQUIREMENTS},
install_requires=read_requirements("install"),
extras_require={
kind: read_requirements(kind)
for kind in ["dev", "extras"]
},
python_requires='>=3.0',
entry_points={'console_scripts': ['km3buu=km3buu.cmd:main']},
classifiers=[
......