Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-22 09:21:13

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 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             # zero eveything so the GX2F has a chance to find the measurements
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     # ODD
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     ## GenericDetector
0209     # detector = acts.examples.GenericDetector()
0210     # trackingGeometry = detector.trackingGeometry()
0211     # digiConfigFile = (
0212     #     srcdir
0213     #     / "Examples/Configs/generic-digi-smearing-config.json"
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()