Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-11 07:50: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 
0021 try:
0022     import acts.examples.geant4.geomodel
0023 except ImportError:
0024     # geomodel is optional for this script
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()