File indexing completed on 2025-08-05 08:09:09
0001
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))