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 && \ ...@@ -28,10 +28,14 @@ RUN source /opt/rh/devtoolset-10/enable && \
ADD . /km3buu ADD . /km3buu
RUN cd /km3buu && \ RUN source /opt/rh/devtoolset-10/enable && \
cd /km3buu && \
pip3 install --upgrade pip && \
pip3 install setuptools-scm && \ pip3 install setuptools-scm && \
pip3 install pytest-runner && \ pip3 install pytest-runner && \
pip3 install -e . pip3 install -e . && \
pip3 install -e ".[dev]" && \
pip3 install -e ".[extras]"
RUN cd /km3buu/externals/km3net-dataformat/ && \ RUN cd /km3buu/externals/km3net-dataformat/ && \
make make
......
...@@ -42,6 +42,7 @@ install: ...@@ -42,6 +42,7 @@ install:
install-dev: install-dev:
pip install -e ".[dev]" pip install -e ".[dev]"
pip install -e ".[extras]"
test: test:
python -m pytest --junitxml=./reports/junit.xml -o junit_suite_name=$(PKGNAME) $(PKGNAME) python -m pytest --junitxml=./reports/junit.xml -o junit_suite_name=$(PKGNAME) $(PKGNAME)
......
...@@ -15,6 +15,7 @@ from . import IMAGE_NAME ...@@ -15,6 +15,7 @@ from . import IMAGE_NAME
from .environment import build_image from .environment import build_image
import mendeleev import mendeleev
import xml.etree.ElementTree as ElementTree import xml.etree.ElementTree as ElementTree
import tempfile
__author__ = "Johannes Schumann" __author__ = "Johannes Schumann"
__copyright__ = "Copyright 2020, Johannes Schumann and the KM3NeT collaboration." __copyright__ = "Copyright 2020, Johannes Schumann and the KM3NeT collaboration."
...@@ -101,7 +102,7 @@ class Config(object): ...@@ -101,7 +102,7 @@ class Config(object):
@property @property
def proposal_itp_tables(self): 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) return self.get(PROPOSAL_SECTION, PROPOSAL_ITP_PATH_KEY, default_path)
@proposal_itp_tables.setter @proposal_itp_tables.setter
......
...@@ -614,7 +614,7 @@ def write_detector_file(gibuu_output, ...@@ -614,7 +614,7 @@ def write_detector_file(gibuu_output,
bjorkeny = event_data.By bjorkeny = event_data.By
tau_secondaries = None 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 from .propagation import propagate_lepton
tau_secondaries = propagate_lepton(event_data, np.sign(nu_type) * 15) tau_secondaries = propagate_lepton(event_data, np.sign(nu_type) * 15)
...@@ -707,7 +707,7 @@ def write_detector_file(gibuu_output, ...@@ -707,7 +707,7 @@ def write_detector_file(gibuu_output,
if tau_secondaries is not None: if tau_secondaries is not None:
event_tau_sec = tau_secondaries[mc_event_id] event_tau_sec = tau_secondaries[mc_event_id]
add_particles(event_tau_sec, vtx_pos, R, mc_trk_id, timestamp, 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) mc_trk_id += len(event_tau_sec.E)
else: else:
lep_out_trk = ROOT.Trk() lep_out_trk = ROOT.Trk()
......
...@@ -18,6 +18,7 @@ import proposal as pp ...@@ -18,6 +18,7 @@ import proposal as pp
from particle import Particle from particle import Particle
import awkward as ak import awkward as ak
from collections import defaultdict from collections import defaultdict
import pathlib
from .config import Config from .config import Config
...@@ -36,23 +37,34 @@ PROPOSAL_LEPTON_DEFINITIONS = { ...@@ -36,23 +37,34 @@ PROPOSAL_LEPTON_DEFINITIONS = {
-16: pp.particle.NuTauBarDef -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() def _setup_propagator(max_distance, particle_definition):
interpolation = pp.InterpolationDef() itp_table_path = Config().proposal_itp_tables
interpolation.path_to_tables = cfg.proposal_itp_tables pathlib.Path(itp_table_path).mkdir(parents=True, exist_ok=True)
interpolation.path_to_tables_readonly = cfg.proposal_itp_tables 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], utility = pp.PropagationUtility(collection=collection)
particle_def=lepton_definition,
detector=geometry, geometry = pp.geometry.Sphere(pp.Cartesian3D(), max_distance)
interpolation_def=interpolation) 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): def propagate_lepton(lepout_data, pdgid):
...@@ -76,28 +88,30 @@ def propagate_lepton(lepout_data, pdgid): ...@@ -76,28 +88,30 @@ def propagate_lepton(lepout_data, pdgid):
lepout_data.lepOut_E) / lepton_info.mass #[cm] lepout_data.lepOut_E) / lepton_info.mass #[cm]
lepton_def = PROPOSAL_LEPTON_DEFINITIONS[pdgid]() 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) propagator = _setup_propagator(10 * prop_range, lepton_def)
propagated_data = defaultdict(list)
for entry in lepout_data: for entry in lepout_data:
lepton.energy = entry.lepOut_E * 1e3 init_state = pp.particle.ParticleState()
lepton.position = pp.Vector3D(0, 0, 0) init_state.energy = entry.lepOut_E * 1e3
lepton.direction = pp.Vector3D(entry.lepOut_Px, entry.lepOut_Py, init_state.position = pp.Cartesian3D(0, 0, 0)
entry.lepOut_Pz) init_state.direction = pp.Cartesian3D(entry.lepOut_Px, entry.lepOut_Py,
lepton.direction.normalize() entry.lepOut_Pz)
secondaries = propagator.propagate(lepton, 5 * prop_range) init_state.direction.normalize()
track = propagator.propagate(init_state, 5 * prop_range)
E = np.array(secondaries.energy) / 1e3 secondaries = track.decay_products()
pdgid = [p.type for p in secondaries.particles]
Px = [p.direction.x * p.momentum / 1e3 for p in secondaries.particles] E = [s.energy / 1e3 for s in secondaries]
Py = [p.direction.y * p.momentum / 1e3 for p in secondaries.particles] pdgid = [p.type for p in secondaries]
Pz = [p.direction.z * p.momentum / 1e3 for p in secondaries.particles] Px = [p.direction.x * p.momentum / 1e3 for p in secondaries]
x = [p.position.x / 100 for p in secondaries.particles] Py = [p.direction.y * p.momentum / 1e3 for p in secondaries]
y = [p.position.y / 100 for p in secondaries.particles] Pz = [p.direction.z * p.momentum / 1e3 for p in secondaries]
z = [p.position.z / 100 for p in secondaries.particles] x = [p.position.x / 100 for p in secondaries]
dt = [p.time for p in secondaries.particles] 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["E"].append(E)
propagated_data["Px"].append(Px) propagated_data["Px"].append(Px)
......
...@@ -14,42 +14,53 @@ import csv ...@@ -14,42 +14,53 @@ import csv
import unittest import unittest
import numpy as np import numpy as np
import uproot import uproot
import pytest
from os.path import abspath, join, dirname from os.path import abspath, join, dirname
from thepipe.logger import get_logger from thepipe.logger import get_logger
from km3net_testdata import data_path
import proposal as pp import proposal as pp
from km3buu.output import GiBUUOutput import awkward as ak
from km3buu.propagation import propagate_lepton from km3buu.propagation import propagate_lepton
TESTDATA_DIR = data_path("gibuu")
pp.RandomGenerator.get().set_seed(1234) pp.RandomGenerator.get().set_seed(1234)
@pytest.mark.skip(reason="CI boost lib problem")
class TestTauPropagation(unittest.TestCase): class TestTauPropagation(unittest.TestCase):
def setUp(self): def setUp(self):
log = get_logger("ctrl.py") data = ak.Array({
log.setLevel("INFO") "lepOut_E": [
self.gibuu_output = GiBUUOutput(TESTDATA_DIR) 17.45830624434573, 3.1180989952362594, 21.270059768902005,
fname = join(TESTDATA_DIR, self.gibuu_output.root_pert_files[0]) 5.262659790136034, 23.52185741888274
fobj = uproot.open(fname) ],
data = fobj["RootTuple"].arrays() "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) self.sec = propagate_lepton(data, 15)
def test_secondary_momenta(self): def test_secondary_momenta(self):
np.testing.assert_array_almost_equal(np.array(self.sec[0].E), 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) decimal=3)
np.testing.assert_array_almost_equal(np.array(self.sec[0].Px), 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) decimal=3)
np.testing.assert_array_almost_equal(np.array(self.sec[0].Py), 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) decimal=3)
np.testing.assert_array_almost_equal(np.array(self.sec[0].Pz), 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) decimal=3)
def test_secondary_types(self): def test_secondary_types(self):
...@@ -57,9 +68,12 @@ class TestTauPropagation(unittest.TestCase): ...@@ -57,9 +68,12 @@ class TestTauPropagation(unittest.TestCase):
[13, 16, -14]) [13, 16, -14])
def test_secondary_positions(self): 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) 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) 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) decimal=1)
File moved
docopt
type-docopt
tqdm
...@@ -10,4 +10,4 @@ uproot>=4.0.0 ...@@ -10,4 +10,4 @@ uproot>=4.0.0
awkward>=1.0.0 awkward>=1.0.0
pandas pandas
mendeleev 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' ...@@ -15,11 +15,11 @@ DESCRIPTION = 'GiBUU tools for KM3NeT'
__author__ = 'Johannes Schumann' __author__ = 'Johannes Schumann'
__email__ = 'jschumann@km3net.de' __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: def read_requirements(kind):
DEV_REQUIREMENTS = [l.strip() for l in fobj.readlines()] with open(os.path.join('requirements', kind + '.txt')) as fobj:
requirements = [l.strip() for l in fobj.readlines()]
return requirements
setup( setup(
name=PACKAGE_NAME, name=PACKAGE_NAME,
...@@ -35,8 +35,11 @@ setup( ...@@ -35,8 +35,11 @@ setup(
'write_to': '{}/version.txt'.format(PACKAGE_NAME), 'write_to': '{}/version.txt'.format(PACKAGE_NAME),
'tag_regex': r'^(?P<prefix>v)?(?P<version>[^\+]+)(?P<suffix>.*)?$', 'tag_regex': r'^(?P<prefix>v)?(?P<version>[^\+]+)(?P<suffix>.*)?$',
}, },
install_requires=REQUIREMENTS, install_requires=read_requirements("install"),
extras_require={'dev': DEV_REQUIREMENTS}, extras_require={
kind: read_requirements(kind)
for kind in ["dev", "extras"]
},
python_requires='>=3.0', python_requires='>=3.0',
entry_points={'console_scripts': ['km3buu=km3buu.cmd:main']}, entry_points={'console_scripts': ['km3buu=km3buu.cmd:main']},
classifiers=[ classifiers=[
......