Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-10-04 08:09:16

0001 #!/usr/bin/env python3
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()