Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:09:09

0001 #!/usr/bin/env python3
0002 import tempfile
0003 from pathlib import Path
0004 import shutil
0005 import datetime
0006 
0007 import acts
0008 from acts.examples.simulation import (
0009     addParticleGun,
0010     MomentumConfig,
0011     EtaConfig,
0012     PhiConfig,
0013     ParticleConfig,
0014     addFatras,
0015     addDigitization,
0016 )
0017 
0018 from acts.examples.reconstruction import (
0019     addSeeding,
0020     SeedFinderConfigArg,
0021     SeedFinderOptionsArg,
0022     SeedingAlgorithm,
0023     CkfConfig,
0024     addCKFTracks,
0025     addAmbiguityResolution,
0026     AmbiguityResolutionConfig,
0027     addVertexFitting,
0028     VertexFinder,
0029     TrackSelectorConfig,
0030 )
0031 
0032 from physmon_common import makeSetup
0033 
0034 u = acts.UnitConstants
0035 
0036 setup = makeSetup()
0037 
0038 
0039 def run_vertexing(fitter, mu, events):
0040     with tempfile.TemporaryDirectory() as temp:
0041         s = acts.examples.Sequencer(
0042             events=events,
0043             numThreads=-1,
0044             logLevel=acts.logging.INFO,
0045         )
0046 
0047         tp = Path(temp)
0048 
0049         for d in setup.decorators:
0050             s.addContextDecorator(d)
0051 
0052         rnd = acts.examples.RandomNumbers(seed=42)
0053 
0054         addParticleGun(
0055             s,
0056             MomentumConfig(1.0 * u.GeV, 10.0 * u.GeV, transverse=True),
0057             EtaConfig(-3.0, 3.0),
0058             PhiConfig(0.0, 360.0 * u.degree),
0059             ParticleConfig(4, acts.PdgParticle.eMuon, randomizeCharge=True),
0060             vtxGen=acts.examples.GaussianVertexGenerator(
0061                 mean=acts.Vector4(0, 0, 0, 0),
0062                 stddev=acts.Vector4(
0063                     0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 1.0 * u.ns
0064                 ),
0065             ),
0066             multiplicity=mu,
0067             rnd=rnd,
0068         )
0069 
0070         addFatras(
0071             s,
0072             setup.trackingGeometry,
0073             setup.field,
0074             enableInteractions=True,
0075             rnd=rnd,
0076         )
0077 
0078         addDigitization(
0079             s,
0080             setup.trackingGeometry,
0081             setup.field,
0082             digiConfigFile=setup.digiConfig,
0083             rnd=rnd,
0084         )
0085 
0086         addSeeding(
0087             s,
0088             setup.trackingGeometry,
0089             setup.field,
0090             SeedFinderConfigArg(
0091                 r=(33 * u.mm, 200 * u.mm),
0092                 deltaR=(1 * u.mm, 60 * u.mm),
0093                 collisionRegion=(-250 * u.mm, 250 * u.mm),
0094                 z=(-2000 * u.mm, 2000 * u.mm),
0095                 maxSeedsPerSpM=1,
0096                 sigmaScattering=5,
0097                 radLengthPerSeed=0.1,
0098                 minPt=500 * u.MeV,
0099                 impactMax=3 * u.mm,
0100             ),
0101             SeedFinderOptionsArg(bFieldInZ=2 * u.T),
0102             seedingAlgorithm=SeedingAlgorithm.Default,
0103             initialSigmas=[
0104                 1 * u.mm,
0105                 1 * u.mm,
0106                 1 * u.degree,
0107                 1 * u.degree,
0108                 0.1 / u.GeV,
0109                 1 * u.ns,
0110             ],
0111             initialVarInflation=[1.0] * 6,
0112             geoSelectionConfigFile=setup.geoSel,
0113         )
0114 
0115         addCKFTracks(
0116             s,
0117             setup.trackingGeometry,
0118             setup.field,
0119             TrackSelectorConfig(
0120                 loc0=(-4.0 * u.mm, 4.0 * u.mm),
0121                 pt=(500 * u.MeV, None),
0122                 nMeasurementsMin=6,
0123                 maxHoles=2,
0124                 maxOutliers=2,
0125             ),
0126             CkfConfig(
0127                 seedDeduplication=True,
0128                 stayOnSeed=True,
0129             ),
0130         )
0131 
0132         addAmbiguityResolution(
0133             s,
0134             AmbiguityResolutionConfig(
0135                 maximumSharedHits=3,
0136                 maximumIterations=10000,
0137                 nMeasurementsMin=6,
0138             ),
0139         )
0140 
0141         addVertexFitting(
0142             s,
0143             setup.field,
0144             vertexFinder=fitter,
0145             outputDirRoot=tp,
0146         )
0147 
0148         s.run()
0149 
0150         del s
0151 
0152         perf_file = tp / f"performance_vertexing.root"
0153         assert perf_file.exists(), "Performance file not found"
0154         shutil.copy(
0155             perf_file,
0156             setup.outdir / f"performance_vertexing_{fitter.name}_mu{mu}.root",
0157         )
0158 
0159 
0160 for fitter in (VertexFinder.Iterative, VertexFinder.AMVF):
0161     for mu in (1, 10, 25, 50, 75, 100, 125, 150, 175, 200):
0162         start = datetime.datetime.now()
0163 
0164         events = 5
0165         run_vertexing(fitter, mu, events)
0166 
0167         delta = datetime.datetime.now() - start
0168 
0169         duration = delta.total_seconds() / events
0170 
0171         (
0172             setup.outdir / f"performance_vertexing_{fitter.name}_mu{mu}_time.txt"
0173         ).write_text(str(duration))