File indexing completed on 2026-10-04 08:09:16
0001
0002
0003 """Propagate muons through the GeoModel muon mockup tracking geometry."""
0004
0005 import argparse
0006 from pathlib import Path
0007
0008 import acts
0009
0010 from muon_mockup import buildMuonMockup
0011 from propagation import runPropagation
0012 from acts.examples.simulation import (
0013 addParticleGun,
0014 EtaConfig,
0015 ParticleConfig,
0016 MomentumConfig,
0017 )
0018 from acts.examples import (
0019 AlgorithmContext,
0020 WhiteBoard,
0021 ObjTrackingGeometryWriter,
0022 )
0023
0024 from acts.examples.root import RootPropagationSummaryWriter, RootPropagationStepsWriter
0025
0026
0027 def main():
0028 parser = argparse.ArgumentParser()
0029 parser.add_argument(
0030 "-i",
0031 "--input",
0032 default="",
0033 help="Optional GeoModel SQLite input file",
0034 )
0035 parser.add_argument(
0036 "--mockupDetector",
0037 choices=["Muon"],
0038 default="Muon",
0039 help="Predefined mockup detector",
0040 )
0041 parser.add_argument("--outDir", default="./propagation_mockup")
0042 parser.add_argument("--nEvents", default=10, type=int)
0043 parser.add_argument(
0044 "--verboseSteps",
0045 action="store_true",
0046 help="Also write detailed propagation steps",
0047 )
0048 parser.add_argument(
0049 "--obj",
0050 action="store_true",
0051 help="Dump the mockup geometry into obj visualization",
0052 )
0053 args = parser.parse_args()
0054
0055 output_dir = Path(args.outDir)
0056 output_dir.mkdir(parents=True, exist_ok=True)
0057 u = acts.UnitConstants
0058 field = acts.ConstantBField(acts.Vector3(0, 0, 0 * u.T))
0059 sterileLogger = not args.verboseSteps
0060
0061 _, trackingGeometry, _, factoryCache = buildMuonMockup(
0062 input=args.input,
0063 mockupDetector=args.mockupDetector,
0064 logLevel=acts.logging.INFO,
0065 )
0066
0067 seq = acts.examples.Sequencer(
0068 events=args.nEvents,
0069 numThreads=1,
0070 outputDir=output_dir,
0071 logLevel=acts.logging.INFO,
0072 )
0073 rnd = acts.examples.RandomNumbers(seed=42)
0074
0075 addParticleGun(
0076 seq,
0077 ParticleConfig(num=1, pdg=acts.PdgParticle.eMuon, randomizeCharge=True),
0078 EtaConfig(-3.0, 3.0, uniform=True),
0079 MomentumConfig(1 * u.GeV, 100 * u.GeV, transverse=True),
0080 rnd=rnd,
0081 )
0082 trkParamExtractor = acts.examples.ParticleTrackParamExtractor(
0083 level=acts.logging.WARNING,
0084 inputParticles="particles_generated",
0085 outputTrackParameters="params_particles_generated",
0086 )
0087 seq.addAlgorithm(trkParamExtractor)
0088
0089 nav = acts.Navigator(acts.logging.INFO, trackingGeometry=trackingGeometry)
0090
0091 stepper = acts.EigenStepper(field)
0092
0093 propagator = acts.examples.ConcretePropagator(
0094 acts.Propagator(stepper, nav, acts.logging.INFO)
0095 )
0096
0097 propagationAlgorithm = acts.examples.PropagationAlgorithm(
0098 propagatorImpl=propagator,
0099 level=acts.logging.VERBOSE,
0100 sterileLogger=sterileLogger,
0101 inputTrackParameters="params_particles_generated",
0102 outputSummaryCollection="propagation_summary",
0103 )
0104 seq.addAlgorithm(propagationAlgorithm)
0105
0106 seq.addWriter(
0107 RootPropagationSummaryWriter(
0108 level=acts.logging.INFO,
0109 inputSummaryCollection="propagation_summary",
0110 filePath=output_dir / "propagation_summary.root",
0111 )
0112 )
0113
0114 if sterileLogger is False:
0115 seq.addWriter(
0116 RootPropagationStepsWriter(
0117 level=acts.logging.INFO,
0118 collection="propagation_summary",
0119 filePath=output_dir / "propagation_steps.root",
0120 )
0121 )
0122
0123 if args.obj:
0124 wb = WhiteBoard(acts.logging.INFO)
0125 context = AlgorithmContext(0, 0, wb, 10)
0126 obj_dir = Path(args.outDir) / "obj"
0127 obj_dir.mkdir(exist_ok=True)
0128 writer = ObjTrackingGeometryWriter(
0129 level=acts.logging.INFO, outputDir=str(obj_dir)
0130 )
0131
0132 writer.write(context, trackingGeometry)
0133 seq.run()
0134
0135
0136 if __name__ == "__main__":
0137 main()