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