Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-01-01 08:57:49

0001 #!/usr/bin/env python3
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     # geomodel is optional for this script
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()