File indexing completed on 2026-01-07 09:21:49
0001
0002
0003 import os
0004 import argparse
0005
0006 import acts
0007 from acts.examples import Sequencer
0008 from acts.examples.odd import getOpenDataDetector
0009 from acts.examples.simulation import addParticleGun, EtaConfig, ParticleConfig
0010 from acts.examples.root import RootMaterialTrackWriter
0011
0012
0013 def runMaterialValidation(
0014 nevents,
0015 ntracks,
0016 trackingGeometry,
0017 decorators,
0018 field,
0019 outputDir,
0020 outputName="propagation-material",
0021 s=None,
0022 ):
0023
0024 s = s or Sequencer(events=nevents, numThreads=-1)
0025
0026 for decorator in decorators:
0027 s.addContextDecorator(decorator)
0028
0029 nav = acts.Navigator(trackingGeometry=trackingGeometry)
0030 stepper = acts.StraightLineStepper()
0031
0032
0033 prop = acts.examples.ConcretePropagator(acts.Propagator(stepper, nav))
0034
0035 rnd = acts.examples.RandomNumbers(seed=42)
0036
0037 addParticleGun(
0038 s,
0039 ParticleConfig(num=ntracks, pdg=acts.PdgParticle.eMuon, randomizeCharge=True),
0040 EtaConfig(-4.0, 4.0),
0041 rnd=rnd,
0042 )
0043
0044 trkParamExtractor = acts.examples.ParticleTrackParamExtractor(
0045 level=acts.logging.INFO,
0046 inputParticles="particles_generated",
0047 outputTrackParameters="params_particles_generated",
0048 )
0049 s.addAlgorithm(trkParamExtractor)
0050
0051 alg = acts.examples.PropagationAlgorithm(
0052 propagatorImpl=prop,
0053 level=acts.logging.INFO,
0054 sterileLogger=True,
0055 recordMaterialInteractions=True,
0056 inputTrackParameters="params_particles_generated",
0057 outputSummaryCollection="propagation_summary",
0058 outputMaterialCollection="material_tracks",
0059 )
0060 s.addAlgorithm(alg)
0061
0062 s.addWriter(
0063 RootMaterialTrackWriter(
0064 level=acts.logging.INFO,
0065 inputMaterialTracks=alg.config.outputMaterialCollection,
0066 filePath=os.path.join(outputDir, (outputName + ".root")),
0067 storeSurface=True,
0068 storeVolume=True,
0069 )
0070 )
0071
0072 return s
0073
0074
0075 if "__main__" == __name__:
0076 p = argparse.ArgumentParser()
0077
0078 p.add_argument(
0079 "-n", "--events", type=int, default=1000, help="Number of events to process"
0080 )
0081 p.add_argument(
0082 "-t", "--tracks", type=int, default=1000, help="Number of tracks per event"
0083 )
0084 p.add_argument(
0085 "-m", "--map", type=str, help="Input file (optional) for the material map"
0086 )
0087 p.add_argument(
0088 "-o",
0089 "--output",
0090 type=str,
0091 default="propagation-material",
0092 help="Output file name",
0093 )
0094
0095 args = p.parse_args()
0096
0097 materialDecorator = (
0098 acts.IMaterialDecorator.fromFile(args.map) if args.map != None else None
0099 )
0100
0101 detector = getOpenDataDetector(materialDecorator)
0102 trackingGeometry = detector.trackingGeometry()
0103 decorators = detector.contextDecorators()
0104
0105 field = acts.ConstantBField(acts.Vector3(0, 0, 0 * acts.UnitConstants.T))
0106
0107 runMaterialValidation(
0108 args.events,
0109 args.tracks,
0110 trackingGeometry,
0111 decorators,
0112 field,
0113 outputDir=os.getcwd(),
0114 outputName=args.output,
0115 ).run()