File indexing completed on 2026-03-28 07:46:08
0001
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
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
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
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
0150
0151
0152
0153
0154
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()