File indexing completed on 2025-08-05 08:09:09
0001
0002
0003 import tempfile
0004 from pathlib import Path
0005 import shutil
0006
0007 import acts
0008 from acts.examples.simulation import (
0009 addFatras,
0010 addGeant4,
0011 ParticleSelectorConfig,
0012 )
0013
0014 from physmon_common import makeSetup
0015
0016 u = acts.UnitConstants
0017
0018 setup = makeSetup()
0019
0020
0021 with tempfile.TemporaryDirectory() as temp:
0022 tp = Path(temp)
0023
0024 rnd = acts.examples.RandomNumbers(seed=42)
0025
0026 s = acts.examples.Sequencer(
0027 events=1000,
0028 numThreads=1,
0029 logLevel=acts.logging.INFO,
0030 )
0031
0032 for d in setup.decorators:
0033 s.addContextDecorator(d)
0034
0035 s.addReader(
0036 acts.examples.EventGenerator(
0037 level=acts.logging.INFO,
0038 generators=[
0039 acts.examples.EventGenerator.Generator(
0040 multiplicity=acts.examples.FixedMultiplicityGenerator(n=1),
0041 vertex=acts.examples.GaussianVertexGenerator(
0042 mean=acts.Vector4(0, 0, 0, 0),
0043 stddev=acts.Vector4(10 * u.um, 10 * u.um, 50 * u.mm, 1 * u.ns),
0044 ),
0045 particles=acts.examples.ParametricParticleGenerator(
0046 p=(1 * u.GeV, 100 * u.GeV),
0047 pTransverse=True,
0048 eta=(-3.0, 3.0),
0049 phi=(0.0 * u.degree, 360.0 * u.degree),
0050 pdg=pdg,
0051 randomizeCharge=True,
0052 ),
0053 )
0054 for pdg in [
0055 acts.PdgParticle.eMuon,
0056 acts.PdgParticle.ePionPlus,
0057 acts.PdgParticle.eElectron,
0058 ]
0059 ],
0060 outputParticles="particles_input",
0061 outputVertices="vertices_input",
0062 randomNumbers=rnd,
0063 )
0064 )
0065
0066 addFatras(
0067 s,
0068 setup.trackingGeometry,
0069 setup.field,
0070 rnd,
0071 enableInteractions=True,
0072 preSelectParticles=None,
0073 postSelectParticles=ParticleSelectorConfig(removeSecondaries=True),
0074 inputParticles="particles_input",
0075 outputParticlesInitial="particles_initial_fatras",
0076 outputParticlesFinal="particles_final_fatras",
0077 outputSimHits="simhits_fatras",
0078 outputDirRoot=tp / "fatras",
0079 )
0080
0081 addGeant4(
0082 s,
0083 setup.detector,
0084 setup.trackingGeometry,
0085 setup.field,
0086 rnd,
0087 preSelectParticles=None,
0088 postSelectParticles=ParticleSelectorConfig(removeSecondaries=True),
0089 killVolume=setup.trackingGeometry.worldVolume,
0090 killAfterTime=25 * u.ns,
0091 killSecondaries=True,
0092 inputParticles="particles_input",
0093 outputParticlesInitial="particles_initial_geant4",
0094 outputParticlesFinal="particles_final_geant4",
0095 outputSimHits="simhits_geant4",
0096 outputDirRoot=tp / "geant4",
0097 )
0098
0099 s.run()
0100 del s
0101
0102 for file, name in [
0103 (tp / "fatras" / "particles_simulation.root", "particles_fatras.root"),
0104 (tp / "geant4" / "particles_simulation.root", "particles_geant4.root"),
0105 ]:
0106 assert file.exists(), "file not found"
0107 shutil.copy(file, setup.outdir / name)