File indexing completed on 2025-12-22 09:21:13
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 runTruthTrackingGx2f(
0013 trackingGeometry: acts.TrackingGeometry,
0014 field: acts.MagneticFieldProvider,
0015 digiConfigFile: Path,
0016 outputDir: Path,
0017 inputParticlePath: Optional[Path] = None,
0018 s: acts.examples.Sequencer = None,
0019 ):
0020 from acts.examples.simulation import (
0021 addParticleGun,
0022 ParticleConfig,
0023 EtaConfig,
0024 PhiConfig,
0025 MomentumConfig,
0026 addFatras,
0027 addDigitization,
0028 ParticleSelectorConfig,
0029 addDigiParticleSelection,
0030 )
0031
0032 from acts.examples.root import (
0033 RootParticleReader,
0034 RootTrackStatesWriter,
0035 RootTrackSummaryWriter,
0036 RootTrackFitterPerformanceWriter,
0037 )
0038
0039 from acts.examples.reconstruction import (
0040 addSeeding,
0041 SeedingAlgorithm,
0042 TrackSmearingSigmas,
0043 addGx2fTracks,
0044 )
0045
0046 s = s or acts.examples.Sequencer(
0047 events=100, numThreads=-1, logLevel=acts.logging.INFO
0048 )
0049
0050 rnd = acts.examples.RandomNumbers(seed=42)
0051 outputDir = Path(outputDir)
0052
0053 if inputParticlePath is None:
0054 addParticleGun(
0055 s,
0056 ParticleConfig(num=1, pdg=acts.PdgParticle.eMuon, randomizeCharge=True),
0057 EtaConfig(-3.0, 3.0, uniform=True),
0058 MomentumConfig(1.0 * u.GeV, 100.0 * u.GeV, transverse=True),
0059 PhiConfig(0.0, 360.0 * u.degree),
0060 vtxGen=acts.examples.GaussianVertexGenerator(
0061 mean=acts.Vector4(0, 0, 0, 0),
0062 stddev=acts.Vector4(0, 0, 0, 0),
0063 ),
0064 multiplicity=1,
0065 rnd=rnd,
0066 outputDirRoot=outputDir,
0067 )
0068 else:
0069 acts.logging.getLogger("Truth tracking example").info(
0070 "Reading particles from %s", inputParticlePath.resolve()
0071 )
0072 assert inputParticlePath.exists()
0073 s.addReader(
0074 RootParticleReader(
0075 level=acts.logging.INFO,
0076 filePath=str(inputParticlePath.resolve()),
0077 outputParticles="particles_generated",
0078 )
0079 )
0080
0081 addFatras(
0082 s,
0083 trackingGeometry,
0084 field,
0085 rnd=rnd,
0086 enableInteractions=True,
0087 )
0088
0089 addDigitization(
0090 s,
0091 trackingGeometry,
0092 field,
0093 digiConfigFile=digiConfigFile,
0094 rnd=rnd,
0095 )
0096
0097 addDigiParticleSelection(
0098 s,
0099 ParticleSelectorConfig(
0100 pt=(0.9 * u.GeV, None),
0101 measurements=(7, None),
0102 removeNeutral=True,
0103 removeSecondaries=True,
0104 ),
0105 )
0106
0107 addSeeding(
0108 s,
0109 trackingGeometry,
0110 field,
0111 rnd=rnd,
0112 inputParticles="particles_generated",
0113 seedingAlgorithm=SeedingAlgorithm.TruthSmeared,
0114 trackSmearingSigmas=TrackSmearingSigmas(
0115
0116 loc0=0,
0117 loc0PtA=0,
0118 loc0PtB=0,
0119 loc1=0,
0120 loc1PtA=0,
0121 loc1PtB=0,
0122 time=0,
0123 phi=0,
0124 theta=0,
0125 ptRel=0,
0126 ),
0127 particleHypothesis=acts.ParticleHypothesis.muon,
0128 initialSigmas=[
0129 1 * u.mm,
0130 1 * u.mm,
0131 1 * u.degree,
0132 1 * u.degree,
0133 0 / u.GeV,
0134 1 * u.ns,
0135 ],
0136 initialSigmaQoverPt=0.1 / u.GeV,
0137 initialSigmaPtRel=0.1,
0138 initialVarInflation=[1e0, 1e0, 1e0, 1e0, 1e0, 1e0],
0139 )
0140
0141 addGx2fTracks(
0142 s,
0143 trackingGeometry,
0144 field,
0145 nUpdateMax=17,
0146 relChi2changeCutOff=1e-7,
0147 multipleScattering=True,
0148 )
0149
0150 s.addAlgorithm(
0151 acts.examples.TrackSelectorAlgorithm(
0152 level=acts.logging.INFO,
0153 inputTracks="tracks",
0154 outputTracks="selected-tracks",
0155 selectorConfig=acts.TrackSelector.Config(
0156 minMeasurements=7,
0157 ),
0158 )
0159 )
0160 s.addWhiteboardAlias("tracks", "selected-tracks")
0161
0162 s.addWriter(
0163 RootTrackStatesWriter(
0164 level=acts.logging.INFO,
0165 inputTracks="tracks",
0166 inputParticles="particles_selected",
0167 inputTrackParticleMatching="track_particle_matching",
0168 inputSimHits="simhits",
0169 inputMeasurementSimHitsMap="measurement_simhits_map",
0170 filePath=str(outputDir / "trackstates_gx2f.root"),
0171 )
0172 )
0173
0174 s.addWriter(
0175 RootTrackSummaryWriter(
0176 level=acts.logging.INFO,
0177 inputTracks="tracks",
0178 inputParticles="particles_selected",
0179 inputTrackParticleMatching="track_particle_matching",
0180 filePath=str(outputDir / "tracksummary_gx2f.root"),
0181 writeGx2fSpecific=True,
0182 )
0183 )
0184
0185 s.addWriter(
0186 RootTrackFitterPerformanceWriter(
0187 level=acts.logging.INFO,
0188 inputTracks="tracks",
0189 inputParticles="particles_selected",
0190 inputTrackParticleMatching="track_particle_matching",
0191 filePath=str(outputDir / "performance_gx2f.root"),
0192 )
0193 )
0194
0195 return s
0196
0197
0198 if "__main__" == __name__:
0199 srcdir = Path(__file__).resolve().parent.parent.parent.parent
0200
0201
0202 from acts.examples.odd import getOpenDataDetector
0203
0204 detector = getOpenDataDetector()
0205 trackingGeometry = detector.trackingGeometry()
0206 digiConfigFile = srcdir / "Examples/Configs/odd-digi-smearing-config.json"
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216 field = acts.ConstantBField(acts.Vector3(0, 0, 2 * u.T))
0217
0218 runTruthTrackingGx2f(
0219 trackingGeometry=trackingGeometry,
0220 field=field,
0221 digiConfigFile=digiConfigFile,
0222 outputDir=Path.cwd(),
0223 ).run()