Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-06-30 07:52:48

0001 #!/usr/bin/env python3
0002 import pathlib, acts, acts.examples, acts.examples.itk
0003 from acts.examples.simulation import (
0004     addParticleGun,
0005     MomentumConfig,
0006     EtaConfig,
0007     ParticleConfig,
0008     addPythia8,
0009     ParticleSelectorConfig,
0010     addGenParticleSelection,
0011     addFatras,
0012     addDigitization,
0013     addDigiParticleSelection,
0014 )
0015 from acts.examples.reconstruction import (
0016     addSeeding,
0017     SeedingAlgorithm,
0018     addCKFTracks,
0019     CkfConfig,
0020     TrackSelectorConfig,
0021     addAmbiguityResolution,
0022     AmbiguityResolutionConfig,
0023     addVertexFitting,
0024     VertexFinder,
0025 )
0026 
0027 ttbar_pu200 = False
0028 u = acts.UnitConstants
0029 geo_dir = pathlib.Path("acts-itk")
0030 outputDir = pathlib.Path.cwd() / "itk_output"
0031 # acts.examples.dump_args_calls(locals())  # show acts.examples python binding calls
0032 
0033 detector = acts.examples.itk.buildITkGeometry(geo_dir)
0034 trackingGeometry = detector.trackingGeometry()
0035 field = acts.examples.MagneticFieldMapXyz(str(geo_dir / "bfield/ATLAS-BField-xyz.root"))
0036 rnd = acts.examples.RandomNumbers(seed=42)
0037 
0038 s = acts.examples.Sequencer(events=100, numThreads=-1, outputDir=str(outputDir))
0039 
0040 if not ttbar_pu200:
0041     addParticleGun(
0042         s,
0043         MomentumConfig(1.0 * u.GeV, 10.0 * u.GeV, transverse=True),
0044         EtaConfig(-4.0, 4.0, uniform=True),
0045         ParticleConfig(2, acts.PdgParticle.eMuon, randomizeCharge=True),
0046         rnd=rnd,
0047     )
0048 else:
0049     addPythia8(
0050         s,
0051         hardProcess=["Top:qqbar2ttbar=on"],
0052         npileup=200,
0053         vtxGen=acts.examples.GaussianVertexGenerator(
0054             stddev=acts.Vector4(0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 5.0 * u.ns),
0055             mean=acts.Vector4(0, 0, 0, 0),
0056         ),
0057         rnd=rnd,
0058         outputDirRoot=outputDir,
0059     )
0060 
0061     addGenParticleSelection(
0062         s,
0063         ParticleSelectorConfig(
0064             rho=(0.0 * u.mm, 28.0 * u.mm),
0065             absZ=(0.0 * u.mm, 1.0 * u.m),
0066             eta=(-4.0, 4.0),
0067             pt=(150 * u.MeV, None),
0068         ),
0069     )
0070 
0071 addFatras(
0072     s,
0073     trackingGeometry,
0074     field,
0075     rnd=rnd,
0076     outputDirRoot=outputDir,
0077 )
0078 
0079 addDigitization(
0080     s,
0081     trackingGeometry,
0082     field,
0083     digiConfigFile=geo_dir / "itk-hgtd/itk-smearing-config.json",
0084     outputDirRoot=outputDir,
0085     rnd=rnd,
0086 )
0087 
0088 addDigiParticleSelection(
0089     s,
0090     ParticleSelectorConfig(
0091         pt=(1.0 * u.GeV, None),
0092         eta=(-4.0, 4.0),
0093         measurements=(9, None),
0094         removeNeutral=True,
0095     ),
0096 )
0097 
0098 addSeeding(
0099     s,
0100     trackingGeometry,
0101     field,
0102     seedingAlgorithm=SeedingAlgorithm.Default,
0103     *acts.examples.itk.itkSeedingAlgConfig(
0104         acts.examples.itk.InputSpacePointsType.PixelSpacePoints
0105     ),
0106     initialSigmas=[
0107         1 * u.mm,
0108         1 * u.mm,
0109         1 * u.degree,
0110         1 * u.degree,
0111         0 * u.e / u.GeV,
0112         1 * u.ns,
0113     ],
0114     initialSigmaQoverPt=0.1 * u.e / u.GeV,
0115     initialSigmaPtRel=0.1,
0116     initialVarInflation=[1.0] * 6,
0117     geoSelectionConfigFile=geo_dir / "itk-hgtd/geoSelection-ITk.json",
0118     outputDirRoot=outputDir,
0119 )
0120 
0121 addCKFTracks(
0122     s,
0123     trackingGeometry,
0124     field,
0125     trackSelectorConfig=(
0126         # fmt: off
0127         TrackSelectorConfig(absEta=(None, 2.0), pt=(0.9 * u.GeV, None), nMeasurementsMin=9, maxHoles=2, maxOutliers=2, maxSharedHits=2),
0128         TrackSelectorConfig(absEta=(None, 2.6), pt=(0.4 * u.GeV, None), nMeasurementsMin=8, maxHoles=2, maxOutliers=2, maxSharedHits=2),
0129         TrackSelectorConfig(absEta=(None, 4.0), pt=(0.4 * u.GeV, None), nMeasurementsMin=7, maxHoles=2, maxOutliers=2, maxSharedHits=2),
0130         # fmt: on
0131     ),
0132     ckfConfig=CkfConfig(
0133         seedDeduplication=True,
0134         stayOnSeed=True,
0135         # ITk volumes from Noemi's plot
0136         pixelVolumes=[8, 9, 10, 13, 14, 15, 16, 18, 19, 20],
0137         stripVolumes=[22, 23, 24],
0138         maxPixelHoles=1,
0139         maxStripHoles=2,
0140     ),
0141     outputDirRoot=outputDir,
0142 )
0143 
0144 addAmbiguityResolution(
0145     s,
0146     AmbiguityResolutionConfig(
0147         maximumSharedHits=3,
0148         maximumIterations=10000,
0149         nMeasurementsMin=6,
0150     ),
0151     outputDirRoot=outputDir,
0152 )
0153 
0154 addVertexFitting(
0155     s,
0156     field,
0157     vertexFinder=VertexFinder.AMVF,
0158     outputDirRoot=outputDir,
0159 )
0160 
0161 s.run()