Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-03-28 07:46:08

0001 #!/usr/bin/env python3
0002 
0003 from pathlib import Path
0004 from typing import Optional
0005 
0006 import acts
0007 import acts.examples
0008 
0009 u = acts.UnitConstants
0010 
0011 
0012 def createStripSpacePoints(
0013     trackingGeometry: acts.TrackingGeometry,
0014     field: acts.MagneticFieldProvider,
0015     digiConfigFile: Path,
0016     geoSelection: Path,
0017     outputDir: Path,
0018     inputParticlePath: Optional[Path] = None,
0019     inputHitsPath: Optional[Path] = None,
0020     decorators=[],
0021     s: acts.examples.Sequencer = None,
0022 ):
0023     from acts.examples.simulation import (
0024         addParticleGun,
0025         ParticleConfig,
0026         EtaConfig,
0027         PhiConfig,
0028         MomentumConfig,
0029         addFatras,
0030         addDigitization,
0031     )
0032 
0033     from acts.examples.root import (
0034         RootParticleReader,
0035         RootSimHitReader,
0036         RootSpacePointWriter,
0037     )
0038 
0039     s = s or acts.examples.Sequencer(
0040         events=100, numThreads=1, logLevel=acts.logging.INFO
0041     )
0042 
0043     for d in decorators:
0044         s.addContextDecorator(d)
0045 
0046     rnd = acts.examples.RandomNumbers(seed=42)
0047     outputDir = Path(outputDir)
0048 
0049     logger = acts.getDefaultLogger("Truth tracking example", acts.logging.INFO)
0050 
0051     if inputParticlePath is None:
0052         # Note: We restrict the eta range to [-2,2] to get tracks with long-strip hits
0053         addParticleGun(
0054             s,
0055             ParticleConfig(num=1, pdg=acts.PdgParticle.eMuon, randomizeCharge=True),
0056             EtaConfig(-2.0, 2.0, uniform=True),
0057             MomentumConfig(1.0 * u.GeV, 100.0 * u.GeV, transverse=True),
0058             PhiConfig(0.0, 360.0 * u.degree),
0059             vtxGen=acts.examples.GaussianVertexGenerator(
0060                 mean=acts.Vector4(0, 0, 0, 0),
0061                 stddev=acts.Vector4(0, 0, 0, 0),
0062             ),
0063             multiplicity=1,
0064             rnd=rnd,
0065         )
0066     else:
0067         logger.info("Reading particles from {}", inputParticlePath.resolve())
0068         assert inputParticlePath.exists()
0069         s.addReader(
0070             RootParticleReader(
0071                 level=acts.logging.INFO,
0072                 filePath=str(inputParticlePath.resolve()),
0073                 outputParticles="particles_generated",
0074             )
0075         )
0076         s.addWhiteboardAlias("particles", "particles_generated")
0077 
0078     if inputHitsPath is None:
0079         addFatras(
0080             s,
0081             trackingGeometry,
0082             field,
0083             rnd=rnd,
0084             enableInteractions=True,
0085         )
0086     else:
0087         logger.info("Reading hits from {}", inputHitsPath.resolve())
0088         assert inputHitsPath.exists()
0089         s.addReader(
0090             RootSimHitReader(
0091                 level=acts.logging.INFO,
0092                 filePath=str(inputHitsPath.resolve()),
0093                 outputSimHits="simhits",
0094             )
0095         )
0096 
0097     addDigitization(
0098         s,
0099         trackingGeometry,
0100         field,
0101         digiConfigFile=digiConfigFile,
0102         rnd=rnd,
0103     )
0104 
0105     # Create strip selection of ODD:
0106     s.addAlgorithm(
0107         acts.examples.SpacePointMaker(
0108             level=acts.logging.INFO,
0109             trackingGeometry=trackingGeometry,
0110             inputMeasurements="measurements",
0111             outputSpacePoints="spacepoints",
0112             stripGeometrySelection=acts.examples.json.readJsonGeometryList(
0113                 str(geoSelection)
0114             ),
0115         )
0116     )
0117 
0118     s.addWriter(
0119         RootSpacePointWriter(
0120             level=acts.logging.INFO,
0121             inputSpacePoints="spacepoints",
0122             inputMeasurementParticlesMap="measurement_particles_map",
0123             filePath=str(outputDir / "strip_spacepoints.root"),
0124         )
0125     )
0126 
0127     return s
0128 
0129 
0130 if "__main__" == __name__:
0131     srcdir = Path(__file__).resolve().parent.parent.parent.parent
0132 
0133     # ODD
0134     from acts.examples.odd import (
0135         getOpenDataDetector,
0136         getOpenDataDetectorDirectory,
0137     )
0138 
0139     detector = getOpenDataDetector()
0140     trackingGeometry = detector.trackingGeometry()
0141     digiConfigFile = (
0142         getOpenDataDetectorDirectory() / "config/odd-digi-smearing-config.json"
0143     )
0144 
0145     geoSelection = srcdir / "Examples/Configs/odd-strip-spacepoint-selection.json"
0146     print(geoSelection.resolve())
0147     assert geoSelection.exists()
0148 
0149     ## GenericDetector
0150     # detector = acts.examples.GenericDetector()
0151     # trackingGeometry = detector.trackingGeometry()
0152     # digiConfigFile = (
0153     #     srcdir
0154     #     / "Examples/Algorithms/Digitization/share/default-smearing-config-generic.json"
0155     # )
0156 
0157     field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
0158 
0159     createStripSpacePoints(
0160         trackingGeometry=trackingGeometry,
0161         field=field,
0162         digiConfigFile=digiConfigFile,
0163         geoSelection=geoSelection,
0164         outputDir=Path.cwd(),
0165     ).run()