File indexing completed on 2026-01-01 08:57:49
0001
0002
0003 import os
0004 import warnings
0005 import argparse
0006
0007 import acts
0008 from acts.examples import (
0009 GaussianVertexGenerator,
0010 ParametricParticleGenerator,
0011 FixedMultiplicityGenerator,
0012 EventGenerator,
0013 RandomNumbers,
0014 )
0015
0016 import acts.examples.dd4hep
0017 import acts.examples.geant4
0018 import acts.examples.hepmc3
0019 from acts.examples.odd import getOpenDataDetector
0020 from acts.examples.root import RootMaterialTrackWriter
0021
0022 try:
0023 import acts.examples.geant4.geomodel
0024 except ImportError:
0025
0026 pass
0027
0028 u = acts.UnitConstants
0029
0030 _material_recording_executed = False
0031
0032
0033 def runMaterialRecording(
0034 detector,
0035 outputDir,
0036 tracksPerEvent=10000,
0037 s=None,
0038 etaRange=(-4, 4),
0039 ):
0040 global _material_recording_executed
0041 if _material_recording_executed:
0042 warnings.warn("Material recording already ran in this process. Expect crashes")
0043 _material_recording_executed = True
0044
0045 rnd = RandomNumbers(seed=228)
0046
0047 evGen = EventGenerator(
0048 level=acts.logging.INFO,
0049 generators=[
0050 EventGenerator.Generator(
0051 multiplicity=FixedMultiplicityGenerator(n=1),
0052 vertex=GaussianVertexGenerator(
0053 stddev=acts.Vector4(0, 0, 0, 0),
0054 mean=acts.Vector4(0, 0, 0, 0),
0055 ),
0056 particles=ParametricParticleGenerator(
0057 pdg=acts.PdgParticle.eInvalid,
0058 charge=0,
0059 randomizeCharge=False,
0060 mass=0,
0061 p=(1 * u.GeV, 10 * u.GeV),
0062 eta=etaRange,
0063 numParticles=tracksPerEvent,
0064 etaUniform=True,
0065 ),
0066 )
0067 ],
0068 randomNumbers=rnd,
0069 )
0070
0071 s.addReader(evGen)
0072
0073 hepmc3Converter = acts.examples.hepmc3.HepMC3InputConverter(
0074 level=acts.logging.INFO,
0075 inputEvent=evGen.config.outputEvent,
0076 outputParticles="particles_initial",
0077 outputVertices="vertices_initial",
0078 mergePrimaries=False,
0079 )
0080 s.addAlgorithm(hepmc3Converter)
0081
0082 g4Alg = acts.examples.geant4.Geant4MaterialRecording(
0083 level=acts.logging.INFO,
0084 detector=detector,
0085 randomNumbers=rnd,
0086 inputParticles=hepmc3Converter.config.outputParticles,
0087 outputMaterialTracks="material-tracks",
0088 )
0089
0090 s.addAlgorithm(g4Alg)
0091
0092 s.addWriter(
0093 RootMaterialTrackWriter(
0094 prePostStep=True,
0095 recalculateTotals=True,
0096 inputMaterialTracks="material-tracks",
0097 filePath=os.path.join(outputDir, "geant4_material_tracks.root"),
0098 level=acts.logging.INFO,
0099 )
0100 )
0101
0102 return s
0103
0104
0105 def main():
0106 p = argparse.ArgumentParser()
0107 p.add_argument(
0108 "-n", "--events", type=int, default=1000, help="Number of events to generate"
0109 )
0110 p.add_argument(
0111 "-t", "--tracks", type=int, default=100, help="Particle tracks per event"
0112 )
0113 p.add_argument(
0114 "-i", "--input", type=str, default="", help="input (GDML/SQL) file (optional)"
0115 )
0116
0117 args = p.parse_args()
0118
0119 detector = None
0120 if args.input == "":
0121 detector = getOpenDataDetector()
0122 elif args.input.endswith(".gdml"):
0123 detector = acts.examples.geant4.GdmlDetector(path=args.input)
0124 elif args.input.endswith(".sqlite") or args.input.endswith(".db"):
0125 gmdConfig = acts.geomodel.GeoModelDetector.Config(path=args.input)
0126 detector = acts.geomodel.GeoModelDetector(gmdConfig)
0127
0128 runMaterialRecording(
0129 detector=detector,
0130 tracksPerEvent=args.tracks,
0131 outputDir=os.getcwd(),
0132 s=acts.examples.Sequencer(events=args.events, numThreads=1),
0133 ).run()
0134
0135
0136 if "__main__" == __name__:
0137 main()