File indexing completed on 2025-12-16 09:22:12
0001
0002
0003 import tempfile
0004 from pathlib import Path
0005 import shutil
0006
0007 import acts
0008 from acts.examples.simulation import (
0009 addPythia8,
0010 ParticleSelectorConfig,
0011 addGenParticleSelection,
0012 addFatras,
0013 addDigitization,
0014 addDigiParticleSelection,
0015 )
0016 from acts.examples.reconstruction import (
0017 addSeeding,
0018 SeedFinderConfigArg,
0019 SeedFinderOptionsArg,
0020 SeedingAlgorithm,
0021 CkfConfig,
0022 addCKFTracks,
0023 addAmbiguityResolution,
0024 addAmbiguityResolutionML,
0025 AmbiguityResolutionConfig,
0026 AmbiguityResolutionMLConfig,
0027 addVertexFitting,
0028 VertexFinder,
0029 TrackSelectorConfig,
0030 )
0031
0032 from physmon_common import makeSetup
0033 from acts.examples.odd import getOpenDataDetectorDirectory
0034
0035 u = acts.UnitConstants
0036
0037 setup = makeSetup()
0038 odd_dir = getOpenDataDetectorDirectory()
0039
0040
0041 with tempfile.TemporaryDirectory() as temp:
0042
0043 s = acts.examples.Sequencer(
0044 events=3,
0045 numThreads=1,
0046 logLevel=acts.logging.INFO,
0047 )
0048
0049 tp = Path(temp)
0050
0051 for d in setup.decorators:
0052 s.addContextDecorator(d)
0053
0054 rnd = acts.examples.RandomNumbers(seed=42)
0055
0056 addPythia8(
0057 s,
0058 hardProcess=["Top:qqbar2ttbar=on"],
0059 npileup=200,
0060 vtxGen=acts.examples.GaussianVertexGenerator(
0061 mean=acts.Vector4(0, 0, 0, 0),
0062 stddev=acts.Vector4(0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 5.0 * u.ns),
0063 ),
0064 rnd=rnd,
0065 outputDirRoot=tp,
0066 )
0067
0068 addGenParticleSelection(
0069 s,
0070 ParticleSelectorConfig(
0071 rho=(0.0, 24 * u.mm),
0072 absZ=(0.0, 1.0 * u.m),
0073 ),
0074 )
0075
0076 addFatras(
0077 s,
0078 setup.trackingGeometry,
0079 setup.field,
0080 rnd=rnd,
0081 )
0082
0083 addDigitization(
0084 s,
0085 setup.trackingGeometry,
0086 setup.field,
0087 digiConfigFile=setup.digiConfig,
0088 rnd=rnd,
0089 )
0090
0091 addDigiParticleSelection(
0092 s,
0093 ParticleSelectorConfig(
0094 pt=(0.5 * u.GeV, None),
0095 measurements=(9, None),
0096 removeNeutral=True,
0097 ),
0098 )
0099
0100 addSeeding(
0101 s,
0102 setup.trackingGeometry,
0103 setup.field,
0104 SeedFinderConfigArg(
0105 r=(33 * u.mm, 200 * u.mm),
0106 deltaR=(1 * u.mm, 300 * u.mm),
0107 collisionRegion=(-250 * u.mm, 250 * u.mm),
0108 z=(-2000 * u.mm, 2000 * u.mm),
0109 maxSeedsPerSpM=1,
0110 sigmaScattering=5,
0111 radLengthPerSeed=0.1,
0112 minPt=0.5 * u.GeV,
0113 impactMax=3 * u.mm,
0114 ),
0115 SeedFinderOptionsArg(bFieldInZ=2 * u.T, beamPos=(0.0, 0.0)),
0116 seedingAlgorithm=SeedingAlgorithm.GridTriplet,
0117 initialSigmas=[
0118 1 * u.mm,
0119 1 * u.mm,
0120 1 * u.degree,
0121 1 * u.degree,
0122 0 * u.e / u.GeV,
0123 1 * u.ns,
0124 ],
0125 initialSigmaQoverPt=0.1 * u.e / u.GeV,
0126 initialSigmaPtRel=0.1,
0127 initialVarInflation=[1.0] * 6,
0128 geoSelectionConfigFile=setup.geoSel,
0129 outputDirRoot=tp,
0130 )
0131
0132 addCKFTracks(
0133 s,
0134 setup.trackingGeometry,
0135 setup.field,
0136 TrackSelectorConfig(
0137 pt=(0.5 * u.GeV, None),
0138 loc0=(-4.0 * u.mm, 4.0 * u.mm),
0139 nMeasurementsMin=6,
0140 maxHoles=2,
0141 maxOutliers=2,
0142 ),
0143 CkfConfig(
0144 chi2CutOffMeasurement=15.0,
0145 chi2CutOffOutlier=25.0,
0146 numMeasurementsCutOff=10,
0147 seedDeduplication=True,
0148 stayOnSeed=True,
0149 ),
0150 outputDirRoot=tp,
0151 )
0152
0153 addAmbiguityResolutionML(
0154 s,
0155 AmbiguityResolutionMLConfig(
0156 maximumSharedHits=3, maximumIterations=1000000, nMeasurementsMin=6
0157 ),
0158 tracks="ckf_tracks",
0159 outputDirRoot=tp,
0160 onnxModelFile=odd_dir / "data/duplicateClassifier.onnx",
0161 )
0162
0163 addAmbiguityResolution(
0164 s,
0165 AmbiguityResolutionConfig(
0166 maximumSharedHits=3,
0167 maximumIterations=100000,
0168 nMeasurementsMin=6,
0169 ),
0170 tracks="ckf_tracks",
0171 outputDirRoot=tp,
0172 )
0173
0174 s.addAlgorithm(
0175 acts.examples.TracksToParameters(
0176 level=acts.logging.INFO,
0177 inputTracks="tracks",
0178 outputTrackParameters="trackParameters",
0179 )
0180 )
0181
0182 addVertexFitting(
0183 s,
0184 setup.field,
0185 tracks="tracks",
0186 trackParameters="trackParameters",
0187 outputProtoVertices="amvf_gauss_notime_protovertices",
0188 outputVertices="amvf_gauss_notime_fittedVertices",
0189 seeder=acts.examples.VertexSeedFinder.GaussianSeeder,
0190 vertexFinder=VertexFinder.AMVF,
0191 outputDirRoot=tp / "amvf_gauss_notime",
0192 writeTrackInfo=True,
0193 )
0194
0195 addVertexFitting(
0196 s,
0197 setup.field,
0198 tracks="tracks",
0199 trackParameters="trackParameters",
0200 outputProtoVertices="amvf_grid_time_protovertices",
0201 outputVertices="amvf_grid_time_fittedVertices",
0202 seeder=acts.examples.VertexSeedFinder.AdaptiveGridSeeder,
0203 useTime=True,
0204 vertexFinder=VertexFinder.AMVF,
0205 outputDirRoot=tp / "amvf_grid_time",
0206 writeTrackInfo=True,
0207 )
0208
0209 s.run()
0210
0211 shutil.move(
0212 tp / "performance_finding_ambi.root",
0213 tp / "performance_finding_ckf_ambi.root",
0214 )
0215 shutil.move(
0216 tp / "performance_fitting_ambi.root",
0217 tp / "performance_fitting_ckf_ambi.root",
0218 )
0219
0220 shutil.move(
0221 tp / "performance_finding_ambiML.root",
0222 tp / "performance_finding_ckf_ml_solver.root",
0223 )
0224
0225 shutil.move(
0226 tp / "performance_fitting_ambiML.root",
0227 tp / "performance_fitting_ckf_ml_solver.root",
0228 )
0229
0230 for vertexing in ["amvf_gauss_notime", "amvf_grid_time"]:
0231 shutil.move(
0232 tp / f"{vertexing}/performance_vertexing.root",
0233 tp / f"performance_vertexing_{vertexing}.root",
0234 )
0235
0236 for file in [
0237 "performance_seeding.root",
0238 "tracksummary_ckf.root",
0239 "performance_finding_ckf.root",
0240 "performance_fitting_ckf.root",
0241 "performance_finding_ckf_ambi.root",
0242 "performance_fitting_ckf_ambi.root",
0243 "performance_finding_ckf_ml_solver.root",
0244 "performance_fitting_ckf_ml_solver.root",
0245 "performance_vertexing_amvf_gauss_notime.root",
0246 "performance_vertexing_amvf_grid_time.root",
0247 ]:
0248 perf_file = tp / file
0249 assert perf_file.exists(), f"Performance file not found {perf_file}"
0250 shutil.copy(perf_file, setup.outdir / file)