Repository navigation
Integrate Kinkal volumes and update Calo geometry - #2059
Conversation
brownd1978
left a comment
There was a problem hiding this comment.
This is a good first step for implementing extrapolation to the calorimeter, which will allow better comparisons with cosmic rays. It doesn't include the effect of the calorimeter material on the particles, which is very different for electrons and muons, so can't be handled generically. That can be handled in a follow-on PR.
| BackToTracker : false | ||
| ToOPA : false | ||
| ToCRV : false | ||
| ToCaloD0 : true |
There was a problem hiding this comment.
Is there a reason for seed extrapolation to the calorimeter? Seed fits are used in the trigger, we haven't been running extrapolation in those fits.
|
Yes, i think i started the material effects integration ill integrate it back in in a new PR after this |
|
📝 The HEAD of |
RobMina
left a comment
There was a problem hiding this comment.
This looks good! I ran a few test jobs and see reasonable results for the calo intersections:
| Job | Events (TrigReport) | Tracks | Calo trksegs (sid 310-317) | Reference |
|---|---|---|---|---|
| reco_lh + ntuple_lh | 20000/20000 | 4442 (1482 events) | 19,226 | - |
| reco_kl + ntuple_kl | 20000/20000 | 14427 | 1,966 | refpiece_miconf kl (10-22): 14417, matched mu 13150 -> 13158 |
| regrow_kl + ntuple | 20000/20000 | - | 1,958 | - |
| reco_ch + ntuple_ch | 10000/10000 | 1346 | 2,560 | refpiece_miconf toca (10-22): 1326, matched mu 960 -> 963 |
oksuzian
left a comment
There was a problem hiding this comment.
PR Review Summary — #2059
Reviewed at head 98b509e9b99ec61cbdf351558eac23f9662cc143. First pass.
Decision
- 🔴 Request changes. Switching the calorimeter extrapolation on changes the DS-material and CRV extrapolation of the off-spill cosmic fit (
KKCHmu) on 83% of its tracks. Moving the two new calls to the end ofKKExtrap::extrapolateremoves the side effect and keeps the calorimeter intersections (finding 1). The rest of the PR looks good to me.
Scope understood
- A new
KKGeom::Calowith four surfaces per disk (front and back annuli, inner and outer cylinders), built inKinKalGeomMakerfrom the Calorimeter geometry, and eight newSurfaceIds (310-317). KKExtrap::toCaloDiskrecords track intersections with those surfaces. It is switched on by default in all four extrapolation tables (LHDRIFTXTRAP,LHSEEDXTRAP,KLXTRAP,CHXTRAP).MakeSurfaceStepsmaps the eight calorimeter virtual detectors to the new surfaces, so MC truth exists to compare against.
Findings
-
🟠 [S1] The calorimeter extrapolation runs before the DS-material and CRV extrapolation, and changes their result for
KKCHmu- Evidence:
KKExtrap.hh:103-104callstoCaloDiskbefore theToCRVblock at:134. I ran the nightlyProduction/Validation/offSpill.fclon the 9314cosmicOffSpilldigis three times, with the same input and the same build of this head. The only change wasExtrapolationSettings.ToCaloD0/ToCaloD1, true as merged and false as on main. All 4911KKCHmutracks were found in both runs, but 4098 of them carry a different set of DS-material crossings: net change -3644DS_CryoInner, -3124DS_ShieldInner, -2539DS_Coil, +1035DS_CryoOuter, +576DS_ShieldOuter. The momentum at 1188CRV_T*crossings moves by a median of -47.7 MeV (range -167.6 to +50.0 MeV). The run with the flags off is identical to a build of the merge base51a5125d7in every intersection count. For example, a 16.6 GeV track loses its forwardDS_CryoInner(-33.6 MeV) andDS_ShieldInner(-7.3 MeV) crossings, so its momentum and covariance beyond the coil no longer include them. - Impact:
KKCHmuis written by the mdc2025 off-spill reco (Production/JobConfig/recoMC/OffSpill.fcl, run from prodtoolsmdc2025/reco.json). Its CRV-crossing momentum and the material scattering behind its CRV pointing would change silently. TheLoopHelixfits are not affected:KKDein the same files is unchanged apart from the new intersections. - Suggested fix: move the two calls after the
ToCRVblock, at the end ofKKExtrap::extrapolate. I tried exactly that, rebuilt and re-ran the same job. The DS and CRV crossings then match main on all 4911 tracks (0 differ), and the calorimeter intersections are still recorded (for example, 174EMC_Disk_0_FrontonKKCHmu, 171 before the move).KKLine(KLXTRAP, alsoToCRV: true) goes through the same code, and the mdc2025 Extracted reco and Run1B NoField reco run it. I did not run that case, so please check it too.
- Evidence:
-
🟡 [S2]
MakeSurfaceStepsnow writes calorimeter SurfaceSteps in every primary job, which makes the primary output about 5% larger for CE- Evidence: the production primary prolog runs
MakeSSong4run:virtualdetector, andcompressDetStepMCskeeps every SurfaceStep and the SimParticles they point to. I ranProduction/Validation/ceSimReco.fcl(200 events, 76 written) with an added output holding thecompressDetStepMCsproducts, on this head and on the merge base. SurfaceSteps went from 1740 to 2490 (+43%), kept SimParticles from 1699 to 1955 (+15%), and the file from 1,823,606 to 1,918,313 bytes (+5.2%). Most of the new steps are shower particles crossing the disk faces and edges. - Suggested fix: say so in the PR description so production can plan for it, or make the calorimeter entries optional in
MakeSSif 5% is more than the comparisons need.
- Evidence: the production primary prolog runs
-
🟡 [S2]
KKGeom::Calocarries dead and duplicated state- Evidence: the
z0andz1constructor arguments are never used (Calo.cc:8);KinKalGeomMaker.cc:79-80computes them only to pass them in. The four*_Z()accessors (Calo.hh:42-45) have no caller, andz0_front_and the others (:50) repeat the annulus centres. - Suggested fix: drop the two arguments, the accessors and the members;
front().center().Z()already gives the value.
- Evidence: the
-
⚪ [S3] Small items: the one-line blank-line change in
TrkReco/fcl/prolog.fcl:11belongs in no PR. The newvdmap_block inMakeSurfaceSteps_module.cc:64-73is mis-indented, and its closing brace is at column 0.ToCaloD0andToCaloD1default tofalsein C++ (KKFitSettings.hh:130-131), while their sibling keys (ToCRV,ToOPA) have no default.
Verified
- 🟢 On brownd1978's inline question about
LHSEEDXTRAP: the trigger is not affected. The trigger fits in mu2e-trig-configd3ec315use only theLHSEEDFIT,LHSEEDEXTandLHHELIXtables (core/producers/mu2eKinKalTrigger.fcl), and the triggerLoopHelixFitmodules set noExtrapolationSettings(for example,core/producers/trigAprProducers.fcl:58-90).LHSEEDXTRAPreaches only Offline'sLHSeedFit(prolog:492), which no Production job uses. Whether the seed fit should extrapolate at all is still the author's call. - 🟢 The virtual-detector mapping matches the geometry.
VirtualDetectorMaker.ccplacesSurfInandSurfOutat the front and back of each disk, andconstructVirtualDetectors.ccbuildsEdgeInandEdgeOutat the inner and outer radius. The KinKal inner radius isdiskInAlRingRIn(336 mm), against the virtual detector'scaloDiskRadiusIn(335 mm). The outer radii agree at 719 mm. - 🟢 The LoopHelix fits are unchanged apart from the new intersections. In the CE job,
KKDe's fit summaries and non-calorimeter intersections are identical with the flags on and off, and with the flags off they match the merge base. Over the 76 written CE events,KKDerecords 36 to 50 crossings per calorimeter surface. CPU per LoopHelix fit changed by about 1%, within the noise of three concurrent jobs. - 🟢 Both build paths are covered.
KinKalGeom/CMakeLists.txtlistssrc/Calo.cc, the SConscriptmake_mainlibtakes everysrc/*.cc, andGeometryServicealready linksCalorimeterGeomin both.SurfaceIdonly appends values (310-317), andnSurfaceIdsstays tied to the name table by the existingstatic_assert.
Validation check
- Build/tests run: yes. I ran
muse buildof this head and of the merge base51a5125d7(envset p108), with Production4479f3faand mu2e-trig-configd3ec315. The jobs were theceSimRecoandoffSpillvalidation configs described above, plus the reordered-call test. Scripts and outputs are inclaude-scratch/pr2059_review/. FNALbuild passed at this head on 2026-10-23 after merging onto4c00368dd. Main has since taken #2034 (other sections ofMu2eKinKal/fcl/prolog.fclandKKFitSettings.hh;git merge-treeis clean) and #2057, so a fresh build before merging would be good. - Config contract check: pass.
fhicl-dumpof both jobs at this head resolvesToCaloD0andToCaloD1to true inKKDe,KKDmu,KKUe,KKUmu,KKLine,KKCHmuandRegrowLH. - Cross-repo consistency: pass. Trigger configs are not affected (see Verified).
Residual risk
- The extrapolation does not include the calorimeter material, so disk-1 intersections are recorded for electrons that shower in disk 0. brownd1978 noted this, and the author plans a follow-up.
- On 10 of the 4911
KKCHmutracks, the momentum reported at t0 changes by 80-115 MeV (for example, 236.0 to 121.5 MeV). The extension adds segments that cover a t0 lying outside the hits. The reorder in finding 1 leaves 8 of these, so it is a separate, small effect.
Author follow-ups
- Move the
toCaloDiskcalls after the CRV block (finding 1), and checkKKLinein Extracted or NoField reco. - Mention the larger primary output in the description, or make the calorimeter
MakeSSentries optional (finding 2). - Remove the unused
Caloarguments, accessors and members (finding 3). - Answer brownd1978's
LHSEEDXTRAPquestion in the thread.
|
I'm taking another look at this. I was able to reproduce @oksuzian's result only with B field correction on (which I now realize my earlier test did not include), not with B field held nominal. Next I'll try to understand the mechanism and whether the suggested fix is correct. |
RobMina
left a comment
There was a problem hiding this comment.
Following up on my earlier comment. I'm withdrawing my approval until the calo calls are moved after the ToCRV block, as @oksuzian suggested. Details below.
Mechanism. toCaloDisk extends the fit toward the calo disks' z position without adding material. Only the leg heading to +z moves. With BFieldCorrection: true, KinKal adds one piece per field domain (at most 1 ns each). extrapolateDSMaterial searches only the end piece, and KinKal can attach a material crossing only to the front or back piece. So the shells the calo extension has already passed sit on interior pieces and are dropped. With bfcorr=false an extension only stretches the end piece, which is why the effect needs field correction.
On the nightly offSpill sample (10k events, 1175 KKCHmu tracks):
- 519 of 520 changed legs are the leg the calo extension moves.
- 93% of them lose an innermost-first run of shells.
- The extra CryoOuter/ShieldOuter crossings are the same effect: the extension stops inside the shell stack.
Truth. I compared each leg with the matched muon's MCTrajectory, which has points on the cryostat faces, and took the true energy loss from those face KEs.
- On the calo-extension leg there are 300 true DS traversals. All five shells are found on 159 with calo off and 17 with calo on.
- The other leg is unchanged (184 of 267 either way).
- True |p| loss through the stack: median 174 MeV/c.
- Reco loss minus true loss, on the legs the PR changes: median -13 MeV/c with calo off, -112 MeV/c with calo on.
So the dropped crossings are real material, and the momentum beyond the DS is about 100 MeV/c off.
Fix. Moving the calls to the end is the right fix: all material passes then run before any material-free extension, so DS/CRV become those of main by construction. Please also add a one-line comment there saying calo extrapolation must stay after the material passes. Stopping the calo extrapolation once a track is outside the disk radius and moving outward would be a cheap way to make this order-independent. It would also avoid stretching cosmics far past the DS, which is behind the t0 momentum changes on the remaining 8 tracks.
Scope. Production/JobConfig/recoMC/OffSpill.fcl runs KKCHmu with BFieldCorrection: false, so mdc2025 off-spill production is not changed. The nightly validation (Validation/offSpill.fcl) and bfcorr=true CentralHelix studies are.
Separately, and not caused by this PR: with bfcorr=true, main finds all five shells on only about 60% of true barrel traversals (73% with bfcorr=false). I'll follow that up on its own.
oksuzian
left a comment
There was a problem hiding this comment.
PR Review Summary — #2059
Reviewed at head 0fd284820b35594233925f93d39b710d6630258a. This is a re-review of the increment from 98b509e9b99ec61cbdf351558eac23f9662cc143 (one commit, "from PR"; main was not merged in).
Decision
- 🟢 Approvable. The calorimeter extrapolation now runs after the material and CRV passes, and with it on or off the DS and CRV crossings are identical (finding 1 fixed). Findings 3 and 4 are fixed too. Finding 2, the larger primary output, is still open but does not block. There is no FNALbuild build at this head yet.
Correction to my earlier review
- My first review said the mdc2025 off-spill production reco would change. That was wrong.
Production/JobConfig/recoMC/OffSpill.fclkeepsKKCHmuat themaindefault,BFieldCorrection: false. Only the nightlyProduction/Validation/offSpill.fcl(lines 55-56) turns it on, and that is the job I ran. With the production setting, the old head changed DS crossings on 13 of 5347 tracks and moved 20CRV_T*momenta by at most 0.02 MeV. A control re-run of the validation job reproduced my earlier output exactly. So the defect mattered for the validation job and for field-correction studies, not for production. @RobMina found this, and their comparison with MC truth showed the dropped crossings were real material. Thank you.
What changed
KKExtrap::extrapolatenow callstoCaloDiskat the very end, after the IPA, OPA and CRV passes, with a comment saying why it must stay there (KKExtrap.hh:142-147). This is the comment @RobMina asked for.toCaloDisknow extends once, to the back face, in the downstream direction, and searches for intersections only between the trackert0and that end (:216-233).t0is captured before any extrapolation (:100-102).LHSEEDXTRAPnow has the calorimeter extrapolation off (prolog.fcl:408-409).- New guards for a geometry without a calorimeter:
KinKalGeomMaker::makeCaloreturns early (:64-65, the same pattern asExtShieldDownstreamat:468), andtoCaloDiskreturns ifcalo()is null. - Clean-ups from my findings 3 and 4.
Earlier findings at this head
- 🟠 [S1, now graded S2 as explained above] Calorimeter extrapolation ran before the DS-material and CRV passes — fixed.
- I rebuilt this head and re-ran the same nightly
offSpilljob on the same 9314cosmicOffSpillevents, once withToCaloD0/ToCaloD1on and once off. On all 4911KKCHmutracks, the DS crossings and theCRV_T*crossings and momenta are identical (0 differ). With the flags off, this head matches the old head exactly. With them on, the DS and CRV crossings match my own reorder test. - The calorimeter intersections are still recorded on
KKCHmu, for example 158EMC_Disk_0_Frontand 124EMC_Disk_0_Outer. My simple reorder gave 174 and 125. The difference fits the new restriction to the downstream side oft0. I did not check those crossings against truth. - The only other change on 13 tracks is extra
TT_Outer/TT_Backcrossings withdP 0, added where the extension leaves the tracker. They carry no material.
- I rebuilt this head and re-ran the same nightly
- 🟡 [S2]
MakeSurfaceStepswrites calorimeter SurfaceSteps in every primary job, about 5% larger CE primary output — open. The increment only re-indents that block, and the description does not mention the size. This does not block; a line in the description would do. - 🟡 [S2] Dead and duplicated state in
KKGeom::Calo— fixed. Thez0/z1arguments, the four*_Z()accessors and the four members are gone. - ⚪ [S3] Small items — fixed. The stray blank-line change in
TrkReco/fcl/prolog.fclis reverted, thevdmap_block is re-indented, andToCaloD0/ToCaloD1have no C++ default, likeToCRVandToOPA.
Verified
- 🟢 The LoopHelix fits are unchanged. In the 200-event
ceSimRecojob,KKDe's fit summaries and non-calorimeter intersections are identical with the flags on and off. Its calorimeter intersection counts per surface are the same as at the old head (36 to 50 per surface over 76 tracks). - 🟢 Making
ToCaloD0/ToCaloD1required breaks no configuration I can find. EveryExtrapolationSettingsin Offline, Production and mu2e-trig-configmainis built from one of the four*XTRAPtables, and all four set both keys. The hand-written trigger blocks in Stntuple'sdefault_stn_config.fcllack these keys, but they already lackToCRV,MaxDtStepandMinV, which are required onmaintoo. - 🟢 The commit merges cleanly onto main
9b3d4633. Main has since taken #2034, #2051 (calorimeter geometry adjustments, read through the Calorimeter service here) and #2057.
Validation check
- Build/tests run: yes. I ran
muse buildof this head (envset p108, 0 warnings), with Production4479f3faand mu2e-trig-configd3ec315, then theoffSpillandceSimRecovalidation jobs with the calorimeter flags on and off. Scripts and outputs are inclaude-scratch/pr2059_review/. TheKKLinecase was not run: this off-spill sample has noKKLinetracks. It goes through the same reordered code. - FNALbuild: no status at this head yet.
- Config contract check: pass (see Verified).
- Cross-repo consistency: pass. The trigger fits set no
ExtrapolationSettings.
Residual risk
- On 8 of the 4911
KKCHmutracks, the momentum reported att0still changes, by -43 to -79 MeV, because the extension stretches the trajectory far past the tracker. This is the same count as my reorder test. @RobMina suggested stopping the calorimeter extrapolation once a track is outside the disk radius and moving outward, which would also fix this. That can be a follow-up. - The extrapolation still includes no calorimeter material. The author plans a follow-up, as before.
Author follow-ups
- Mention the larger primary output in the description, or make the calorimeter
MakeSSentries optional (finding 2). - Optionally, stop the calorimeter extrapolation outside the disk radius (residual risk).
|
@FNALbuild run build test |
|
⌛ The following tests have been triggered for 0fd2848: build (Build queue - API unavailable) |
|
☀️ The build tests passed at 0fd2848.
N.B. These results were obtained from a build of this Pull Request at 0fd2848 after being merged into the base branch at 9b3d463. For more information, please check the job page here. |
RobMina
left a comment
There was a problem hiding this comment.
Thanks @sophiemiddleton, I've rerun my tests and this resolves my concern.
Same nightly offSpill input (10k events), same pins, BFieldCorrection: true:
Calo flags off: the ntuple is bit-for-bit identical to the previous build (all 555 numeric leaves).
Calo flags on vs off: fit summaries are identical on all 1175 KKCHmu tracks. DS shell, CRV and strongback crossings are identical, with every paired momentum change exactly zero. 1915 calorimeter crossings are added on 593 tracks.
Per-leg DS shell sets: no leg changes. Earlier, 520 legs changed.
With BFieldCorrection: false: the same holds, and the remaining small DS momentum differences (up to 6.9 MeV/c) at the old head are now zero too.
oksuzian
left a comment
There was a problem hiding this comment.
PR Review Summary — #2059
Reviewed at head 0fd284820b35594233925f93d39b710d6630258a. Approval of the same head as my re-review (5657067027), now that the build is in.
Decision
- 🟢 approve. FNALbuild passed at this head: all 14 status contexts are green, including
buildtestandcosmicOffSpill. My re-review found the calorimeter extrapolation ordering fixed and nothing blocking. This approval replaces my earlier request for changes (5646870287).
Still open, not blocking
- Finding 2 from my re-review:
MakeSurfaceStepsnow writes calorimeter SurfaceSteps in every primary job, about 5% larger CE primary output. A line in the description would cover it.
|
I think this is ready to merge, right? |
This pull request introduces full support for calorimeter (Calo) geometry and surfaces in the KinKal geometry and extrapolation framework. It adds a new
Caloclass to represent the calorimeter disk boundaries and surfaces, integrates these surfaces into the geometry service, updates surface and virtual detector ID enumerations, and enables extrapolation to calorimeter disks in the extrapolation logic and FCL configuration. The changes are grouped below by theme.Calorimeter Geometry Integration:
Caloclass (Calo.hh,Calo.cc) to represent the calorimeter disk boundaries and reference surfaces, including inner/outer cylinders and front/back annular faces for both disks. ([[1]](https://github.com/Mu2e/Offline/pull/2059/files#diff-f23cb324d0cbcde25752a8529a2ba3dc3fce7585faf779c182adcd1829510cd8R1-R55),[[2]](https://github.com/Mu2e/Offline/pull/2059/files#diff-0e12181b8da03658b634c6daf5ad62667888806af8ae5509624e85d436340f66R1-R22),[[3]](https://github.com/Mu2e/Offline/pull/2059/files#diff-3215fc7ba9ab2b13570c9fda3cdac3d9c1095d19d5bd5fdb659ef31a62599f64R3),[[4]](https://github.com/Mu2e/Offline/pull/2059/files#diff-9d0b3051c9710db3ea39dada9f63d6290782566da4152039e97ff7da52672debR12),[[5]](https://github.com/Mu2e/Offline/pull/2059/files#diff-9d0b3051c9710db3ea39dada9f63d6290782566da4152039e97ff7da52672debR53-R61))Caloclass into the overall KinKal geometry (KinKalGeom) and updated theKinKalGeomMakerto construct and map all calorimeter surfaces from the geometry service. ([[1]](https://github.com/Mu2e/Offline/pull/2059/files#diff-51023bab61583ff8f1f9d064064f63f7f2dcfe6f045c3470c7842c947d8920a8R21),[[2]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155R19-R20),[[3]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155R58-R100))Surface and Virtual Detector ID Updates:
SurfaceIdEnuminSurfaceId.hhto include new IDs for all calorimeter disk surfaces (inner, outer, front, back for both disks), and updated the surface ID count. ([DataProducts/inc/SurfaceId.hhL39-R44](https://github.com/Mu2e/Offline/pull/2059/files#diff-5109a00d99eac796ca3523e32e97742b6314dd7154051d62299b000c99a1f104L39-R44))SurfaceId.ccto cover the new calorimeter surface IDs. ([DataProducts/src/SurfaceId.ccL83-R91](https://github.com/Mu2e/Offline/pull/2059/files#diff-3e9f05ca8c7d66f8088ef8359fbe98e69b7bcb5b468498e299e353b75b9cd0f7L83-R91))MakeSurfaceSteps_module.cc. ([CommonMC/src/MakeSurfaceSteps_module.ccR63-R72](https://github.com/Mu2e/Offline/pull/2059/files#diff-3ecb07ff8580cc03554d9ef0caada6914acef488b2dd021c506f2f27c2e1297aR63-R72))Extrapolation and Configuration:
toCaloD0,toCaloD1) in the FCL configuration and extrapolation class. ([[1]](https://github.com/Mu2e/Offline/pull/2059/files#diff-ca38cf82d8581431eeab122d99e1deb54fb4efc82d679dbbb111d88c9ee2a89bR393-R394),[[2]](https://github.com/Mu2e/Offline/pull/2059/files#diff-ca38cf82d8581431eeab122d99e1deb54fb4efc82d679dbbb111d88c9ee2a89bR408-R409),[[3]](https://github.com/Mu2e/Offline/pull/2059/files#diff-ca38cf82d8581431eeab122d99e1deb54fb4efc82d679dbbb111d88c9ee2a89bR423-R424),[[4]](https://github.com/Mu2e/Offline/pull/2059/files#diff-ca38cf82d8581431eeab122d99e1deb54fb4efc82d679dbbb111d88c9ee2a89bR438-R439),[[5]](https://github.com/Mu2e/Offline/pull/2059/files#diff-3bb6c00a7dd8048f01f4803d831fdccf228b4fddb5141b5b752c1d2b52091c80R58-R64))[Mu2eKinKal/inc/KKExtrap.hhR58-R64](https://github.com/Mu2e/Offline/pull/2059/files#diff-3bb6c00a7dd8048f01f4803d831fdccf228b4fddb5141b5b752c1d2b52091c80R58-R64))Other Minor Updates:
Diskto avoid ambiguity. ([[1]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155L35),[[2]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155L92-R135),[[3]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155L136-R178),[[4]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155L206-R248),[[5]](https://github.com/Mu2e/Offline/pull/2059/files#diff-fc31b645372434f23762c280f3115fd79c829a2c28cca5fc50173feebd1c6155L228-R270))MakeSurfaceSteps_module.cc. ([CommonMC/src/MakeSurfaceSteps_module.ccR85](https://github.com/Mu2e/Offline/pull/2059/files#diff-3ecb07ff8580cc03554d9ef0caada6914acef488b2dd021c506f2f27c2e1297aR85))These changes collectively enable tracking and extrapolation to calorimeter surfaces in the KinKal framework, laying the groundwork for improved calorimeter-related analyses and simulation.