Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:22:12

0001 #!/usr/bin/env python3
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     # Running with a single thread to avoid rance conditions with Pythia8, see https://github.com/acts-project/acts/issues/3963
0043     s = acts.examples.Sequencer(
0044         events=3,
0045         numThreads=1,  # run with single thread
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)