loop-induced: allow a polarised massive particle, and cover the last-leg frame - #96
Open
oliviermattelaer wants to merge 11 commits into
Open
loop-induced: allow a polarised massive particle, and cover the last-leg frame#96oliviermattelaer wants to merge 11 commits into
oliviermattelaer wants to merge 11 commits into
Conversation
Loop-induced ([noborn=...]/[sqrvirt=...]) is exported through the LO madevent template, so the generated auto_dsig already boosts to me_frame before the matrix-element call. The massive-particle refusal there was an omission, not a physics limitation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
M5 in the plan doc: the LO boost was already in the generated loop-induced code; verified at runtime that the selected leg reaches MadLoop exactly at rest and that improve_ps keeps it there. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
g g > z{0} z{0} [noborn=QCD]: 2.534e-02 +- 5.0e-05 pb with me_frame=[3]
against 5.805e-02 +- 4.8e-04 pb in the partonic c.m., same card.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…note Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ason The exactly-at-rest property does not survive MadLoop for a frame built on the last external leg: PSMC overwrites NEWP(1:3,NEXTERNAL) with the momentum-conservation residual before any rescaling. me_frame=[4] gives 3.211e-02 pb against 2.543e-02 at [3]. Regression test added, skipped until the shared improve_ps fix lands. sqrvirt is LoopOption='virt'/HasBorn=False and goes to standalone MadLoop, not the LO madevent template. Still allowed, for the virt reason. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
g g > z{0} z{0} [noborn=QCD]: me_frame=[3] and [4] both give
2.543e-02 +- 9.9e-05 pb with byte-identical results.dat. Wired into
acceptancetest_107.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
M6's 'what is not touched' still claimed the colour-charged refusal 'applies in every mode and stays'. It does not: ee63ba4 on the base branch scoped it to the subtracted regime, which is why this branch's own unit test now accepts g{L} g > z z [noborn=QCD]. The doc said the opposite of the test in the same commit range -- exactly the sentence a later merge would use to justify re-adding the check and silently closing the feature again. Also: put the 'still refused' loop-induced paragraph outside the [QED QCD] bullet (markdown lazy continuation folded it in, so it rendered as if loop-induced were still refused), qualify 'the quantisation axis survives MadLoop' with the me_frame it was measured on, and state the colour rule in help_polarization, where it was documented nowhere. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The base branch added it (6e51741/ee63ba492) as the dedicated assertion that the three polarised NLO regimes are checked separately -- including that colour is refused in the subtracted regime and not in loop-induced, which is why this branch's test_check_generate now accepts g{L} g > z z [noborn=QCD]. CI runs unit tests by explicit name and that name was in no job, so nothing guarded it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #79. Lifts the refusal of a polarised massive particle for the
loop-induced NLO modes (
[noborn=…],[sqrvirt=…]).Why the restriction was an omission
Loop-induced processes are exported through the LO madevent template, so they
already have
me_frameand the LO boost — nothing needed building. Verified in thegenerated code rather than argued:
auto_dsig1.fcarriesIF(FRAME_ID.NE.6) CALL BOOST_TO_FRAME(PP, FRAME_ID, P1)and passesP1toSMATRIX1, which hands it toML5_0_0_1_SLOOPMATRIX_THRES.Source/run_card.increads
FRAME_ID = 8forme_frame=[3]and16for[4].Measurement
g g > z{0} z{0} [noborn=QCD], shipped card,nevents=100:me_frameFRAME_ID[3][4]results.datbyte-identical between the two, which is the right expectation:the two Z bosons are identical and both longitudinal, so the frames must agree
pointwise. Before PR #91 this pair read 2.543e-02 vs 3.211e-02 — that PR fixed
improve_psdumping the momentum-conservation residual on legNEXTERNALanddestroying the exact zero the polarisation axis depends on. Both numbers here were
reproduced independently by a second agent on a fresh tree.
Tests
test_polarised_loop_induced_me_frame(me_frame=[3]) andtest_polarised_loop_induced_me_frame_last_leg([4]), both wired intoacceptancetest_107by explicit name — the workflow invokes tests by name, so anunwired test never runs. The
[4]test was added skipped while PR MadLoop: keep an external leg exactly at rest through improve_ps #91 wasoutstanding; the skip is deleted here.
check_parton_outputdemands|Δ|/√(5e-4² + σ²) < 3; the measured 0.02543 sits 0.18 sigma from the asserted0.02534, an unboosted run (5.805e-02) would be ~47 sigma out, and a PR MadLoop: keep an external leg exactly at rest through improve_ps #91 revert
(3.211e-02) ~9-13 sigma out.
.github/workflows/unittest.ymlnow also runstest_polarisation_nlo_regimes,the base branch's dedicated test for the three-regime split, which was defined but
never invoked by CI.
One test assertion changed direction, deliberately
g{L} g > z z [noborn=QCD]moved from the rejected list to the accepted one. That isa consequence of a base-branch decision, not a new one here: base commit
ee63ba492scoped the colour refusal to the subtracted regime and added its ownpositive assertion (
g g > t{L} t~ [noborn=QCD]) with the comment "colour is norestriction where there is no subtraction". The line added here is redundant
coverage of an assertion the base already makes. Upstream
mainhas no colour checkat all; the refusal is this chain's own invention, narrowed to where the FKS-emitter
hazard actually exists.
The doc previously said the colour refusal "applies in every mode and stays", which
has been false since the rebase and is corrected — that sentence is exactly what a
future conflict resolver would read to justify restoring a blanket colour check,
which would silently re-close this feature.
Stated limitation
No coloured polarised loop-induced process has been run anywhere in this chain.
Nothing in the LO boost path assumes a colourless polarised leg —
boost_to_frameispurely kinematic and colour enters nowhere between the boost and the matrix element —
and the specific case added here (
g{L}, massless) needs no frame at all, sincemassless helicity is Lorentz invariant. But permitting it is a format decision, not a
validated one, and the doc now says so.
Notes for the merger
05a7887b1is nearly empty: the guard it introduced went upstream into thebase, so only the
test_cmd.pyadditions survive in it, and its message stilldescribes the guard change. History was left intact rather than rewritten; harmless
under a squash merge.
acceptancetest_107runs both acceptance tests in one job — 23.4 min + 21.0 min onan 18-core machine, so likely longer on a CI runner. Worth splitting if that slot
becomes a bottleneck.