Skip to content

Commit

Permalink
Added new function FCLoopReplaceQuadraticEikonalPropagators for
Browse files Browse the repository at this point in the history
rewriting mixed quadratic-eikonal propagators in terms purely
quadratic ones.
  • Loading branch information
vsht committed Aug 7, 2024
1 parent 46152f5 commit 8990853
Show file tree
Hide file tree
Showing 4 changed files with 328 additions and 0 deletions.
1 change: 1 addition & 0 deletions FeynCalc/Documentation/Markdown/Extra/FeynCalc.md
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ FeynCalc is a Mathematica package for algebraic calculations in Quantum Field Th
- [FCLoopPropagatorPowersExpand](../FCLoopPropagatorPowersExpand.md) - rewrites propagators raised to integer powers as products of propagators
- [FCLoopPropagatorsToTopology](../FCLoopPropagatorsToTopology.md) - auxiliary function that generates a list of propagators to describe a topology
- [FCLoopRemovePropagator](../FCLoopRemovePropagator.md) - removes specific propagators from given `FCTopology`s or `GLI`s
- [FCLoopReplaceQuadraticEikonalPropagators](../FCLoopReplaceQuadraticEikonalPropagators.md) - tries to eliminate quadratic-eikonal propagators by completing the square
- [FCLoopSamePropagatorHeadsQ](../FCLoopSamePropagatorHeadsQ.md) - checks if the integral contains different types of propagators
- [FCLoopRemoveNegativePropagatorPowers](../FCLoopRemoveNegativePropagatorPowers.md) - rewrites propagators rasied to negative integer powers as numerators
- [FCLoopSelectTopology](../FCLoopSelectTopology.md) - selects topologies belonging for the given `GLI`s
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
(* ::Package:: *)

(* ::Section:: *)
(*FCLoopReplaceQuadraticEikonalPropagators*)


(* ::Text:: *)
(*`FCLoopReplaceQuadraticEikonalPropagators[topologies]` identifies `SFAD`s and `CFAD`s in `topologies` that represent mixed quadratic-eikonal propagators, e.g. $[p^2 - 2 p \cdot q]$. Using the information on loop momenta provided by the user the routine will try to rewrite those denominators by completing the square, e.g. as in $[(p-q)^2 - q^2]$.*)


(* ::Text:: *)
(*This procedure is useful because one cannot easily determine the momentum flow from looking at quadratic-eikonal propagators as it is possible in the case of purely quadratic ones.*)


(* ::Text:: *)
(*For this to work it is crucial to specify the loop momenta via the `LoopMomenta` option as well as the kinematics (`IntermediateSubstitutions`) and the rules for completing the square (`InitialSubstitutions`) on the purely loop-momentum dependent piece of the propagator (e.g. $p_1^2 - 2 p_1 \cdot p_2 + p_2^2$ goes to $(p_1+p_2)^2$.*)


(* ::Text:: *)
(*Internally this routine uses `ToGFAD` and `FromGFAD`.*)


(* ::Subsection:: *)
(*See also*)


(* ::Text:: *)
(*[Overview](Extra/FeynCalc.md), [FCTopology](FCTopology.md), [GFAD](GFAD.md), [FromGFAD](FromGFAD.md), [ToGFAD](ToGFAD.md).*)


(* ::Subsection:: *)
(*Examples*)


(DataType[#,FCVariable]=True)&/@\!\(TraditionalForm\`{gkin, meta, u0b}\);


topos={FCTopology[preTopoDia1,{SFAD[{{k2,0},{0,1},1}],SFAD[{{k1,0},{0,1},1}],
SFAD[{{k1+k2,0},{0,1},1}],SFAD[{{0,-k1.nb},{0,1},1}],SFAD[{{k2,-(meta*u0b*k2.nb)},{0,1},1}],
SFAD[{{k1+k2,-2*gkin*meta*u0b*(k1+k2).n},{0,1},1}],SFAD[{{k1,-2*gkin*meta*k1.n+meta*u0b*k1.nb},
{2*gkin*meta^2*u0b,1},1}],SFAD[{{k1,-2*gkin*meta*u0b*k1.n+meta*u0b*k1.nb},{2*gkin*meta^2*u0b^2,1},1}]},
{k1,k2},{n,nb},{Hold[SPD][n]->0,Hold[SPD][nb]->0,Hold[SPD][n,nb]->2},{}]}


FCLoopReplaceQuadraticEikonalPropagators[topos,LoopMomenta->{k1,k2},
InitialSubstitutions->{
ExpandScalarProduct[SPD[k1-k2]]->SPD[k1-k2],
ExpandScalarProduct[SPD[k1+k2]]->SPD[k1+k2]},
IntermediateSubstitutions->{SPD[n]->0,SPD[nb]->0,SPD[n,nb]->0}]
118 changes: 118 additions & 0 deletions FeynCalc/LoopIntegrals/FCLoopReplaceQuadraticEikonalPropagators.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
(* ::Package:: *)

(* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *)

(* :Title: FCLoopReplaceQuadraticEikonalPropagators *)

(*
This software is covered by the GNU General Public License 3.
Copyright (C) 1990-2024 Rolf Mertig
Copyright (C) 1997-2024 Frederik Orellana
Copyright (C) 2014-2024 Vladyslav Shtabovenko
*)

(* :Summary: Tries to eliminate quadratic-eikonal propagators by
completing the square *)

(* ------------------------------------------------------------------------ *)

FCLoopReplaceQuadraticEikonalPropagators::usage =
"FCLoopReplaceQuadraticEikonalPropagators[exp] checks if the integral is free of eikonal
propagators $\\frac{1}{p \\cdot q+x}$. If the option First is set to False,
propagators that have both a quadratic and linear piece, e.g. $\\frac{1}{p^2 +
p \\cdot q+x}$ will also count as eikonal propagators. The option Momentum can
be used to check for the presence of eikonal propagators only with respect to
particular momenta. The check is performed only for
StandardPropagatorDenominator and CartesianPropagatorDenominator.";

FCLoopReplaceQuadraticEikonalPropagators::failmsg =
"FCLoopReplaceQuadraticEikonalPropagators has encountered a fatal problem and must abort the computation. \
The problem reads: `1`"

Begin["`Package`"]
End[]

Begin["`FCLoopReplaceQuadraticEikonalPropagators`Private`"]

rqepVerbose::usage="";

Options[FCLoopReplaceQuadraticEikonalPropagators] = {
Check -> True,
ExpandScalarProduct -> True,
FCE -> False,
FCI -> False,
FCVerbose -> False,
FeynAmpDenominatorExplicit -> True,
InitialSubstitutions -> {},
IntermediateSubstitutions -> {},
LoopMomenta -> {},
MomentumCombine -> True,
PowerExpand -> {}
};

FCLoopReplaceQuadraticEikonalPropagators[topo_FCTopology, opts:OptionsPattern[]]:=
FCLoopReplaceQuadraticEikonalPropagators[{topo}, opts];

FCLoopReplaceQuadraticEikonalPropagators[toposRaw:{__FCTopology}, OptionsPattern[]]:=
Block[{ topos, optInitialSubstitutions, optIntermediateSubstitutions,
optPowerExpand, optFeynAmpDenominatorExplicit, optLoopMomenta,
props, propsConverted, repRule},

optInitialSubstitutions = OptionValue[InitialSubstitutions];
optIntermediateSubstitutions = OptionValue[IntermediateSubstitutions];

If [OptionValue[FCVerbose]===False,
rqepVerbose=$VeryVerbose,
If[MatchQ[OptionValue[FCVerbose], _Integer],
rqepVerbose=OptionValue[FCVerbose]
];
];

FCPrint[1, "FCLoopReplaceQuadraticEikonalPropagators: Entering.", FCDoControl->rqepVerbose];
FCPrint[3, "FCLoopReplaceQuadraticEikonalPropagators: Entering with: ", {toposRaw}, FCDoControl->rqepVerbose];

{optInitialSubstitutions,optIntermediateSubstitutions} = FRH[{optInitialSubstitutions,optIntermediateSubstitutions}];

If[ !OptionValue[FCI],
{topos, optInitialSubstitutions, optIntermediateSubstitutions} =
FCI[{toposRaw,optInitialSubstitutions, optIntermediateSubstitutions}],
topos = toposRaw
];

props = Union[Cases[topos, FeynAmpDenominator[(StandardPropagatorDenominator|CartesianPropagatorDenominator)[a_ /; a =!= 0, b_ /; b =!= 0, ___]], Infinity]];

If[props==={},
FCPrint[1, "FCLoopReplaceQuadraticEikonalPropagators: Nothing to do.", FCDoControl->rqepVerbose];
Return[topos]
];

propsConverted = ToGFAD[props,FCI->True,FinalSubstitutions->optIntermediateSubstitutions];

FCPrint[3, "FCLoopReplaceQuadraticEikonalPropagators: After ToGFAD: ", propsConverted, FCDoControl->rqepVerbose];

propsConverted = FromGFAD[propsConverted,FCI->True,
InitialSubstitutions->optInitialSubstitutions,
IntermediateSubstitutions->optIntermediateSubstitutions,
PowerExpand->OptionValue[PowerExpand],
FeynAmpDenominatorExplicit->OptionValue[FeynAmpDenominatorExplicit],
ExpandScalarProduct->OptionValue[ExpandScalarProduct],
LoopMomenta->OptionValue[LoopMomenta],
MomentumCombine->OptionValue[MomentumCombine],
Check->OptionValue[Check]];

repRule = Thread[Rule[props,propsConverted]];

FCPrint[3, "FCLoopReplaceQuadraticEikonalPropagators: Replacement rule: ", repRule, FCDoControl->rqepVerbose];

topos = topos /. Dispatch[repRule];

FCPrint[1, "FCLoopReplaceQuadraticEikonalPropagators: Leaving.", FCDoControl->rqepVerbose];
FCPrint[3, "FCLoopReplaceQuadraticEikonalPropagators: Leaving with: ", topos, FCDoControl->rqepVerbose];

topos


]

FCPrint[1,"FCLoopReplaceQuadraticEikonalPropagators.m loaded."];
End[]
160 changes: 160 additions & 0 deletions Tests/LoopIntegrals/FCLoopReplaceQuadraticEikonalPropagators.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@


(* :Title: FCLoopReplaceQuadraticEikonalPropagators.test *)

(*
This software is covered by the GNU General Public License 3.
Copyright (C) 1990-2024 Rolf Mertig
Copyright (C) 1997-2024 Frederik Orellana
Copyright (C) 2014-2024 Vladyslav Shtabovenko
*)

(* :Summary: Framework independent unit tests for FCLoopReplaceQuadraticEikonalPropagators *)

(* ------------------------------------------------------------------------ *)

Tests`LoopIntegrals`FCLoopReplaceQuadraticEikonalPropagators =
({
{"fcstFCLoopReplaceQuadraticEikonalPropagators-ID1",
"FCLoopReplaceQuadraticEikonalPropagators[FCTopology[pfrTopo226, \
{SFAD[{{k2, 0}, {0, 1}, 1}], SFAD[{{k1, 0}, {0, 1}, 1}], SFAD[{{k1 - \
(meta*nb*u0b)/2, 0}, {0, 1}, 1}], SFAD[{{k2 + gkin*meta*n*u0b, 0}, \
{0, 1}, 1}], SFAD[{{k1 - k2 - (meta*nb*u0b)/2, 0}, {0, 1}, 1}], \
SFAD[{{k1 + (meta*(2*gkin*n - nb)*u0b)/2, 0}, {2*gkin*meta^2*u0b^2, \
1}, 1}]},
{k1, k2}, {n, nb}, {Hold[SPD][n] -> 0, Hold[SPD][nb] -> 0, \
Hold[SPD][n, nb] -> 2}, {}]]",
"{FCTopology[
pfrTopo226, {FeynAmpDenominator[
StandardPropagatorDenominator[Momentum[k2, D], 0, 0, {1, 1}]],
FeynAmpDenominator[
StandardPropagatorDenominator[Momentum[k1, D], 0, 0, {1, 1}]],
FeynAmpDenominator[
StandardPropagatorDenominator[
Momentum[k1, D] - Momentum[meta*nb*u0b, D]/2, 0, 0, {1, 1}]],
FeynAmpDenominator[
StandardPropagatorDenominator[
Momentum[k2, D] + Momentum[gkin*meta*n*u0b, D], 0, 0, {1, 1}]],
FeynAmpDenominator[
StandardPropagatorDenominator[
Momentum[k1, D] - Momentum[k2, D] - Momentum[meta*nb*u0b, D]/2,
0, 0, {1, 1}]],
FeynAmpDenominator[
StandardPropagatorDenominator[
Momentum[k1, D] + Momentum[gkin*meta*n*u0b, D] -
Momentum[meta*nb*u0b, D]/2,
0, -2*gkin*meta^2*u0b^2, {1, 1}]]}, {k1, k2}, {n,
nb}, {Hold[SPD][n] -> 0, Hold[SPD][nb] -> 0,
Hold[SPD][n, nb] -> 2}, {}]}"},
{"fcstFCLoopReplaceQuadraticEikonalPropagators-ID2",
"FCLoopReplaceQuadraticEikonalPropagators[{FCTopology[pfrTopo226, \
{SFAD[{{k2, 0}, {0, 1}, 1}], SFAD[{{k1, 0}, {0, 1}, 1}], SFAD[{{k1 - \
(meta*nb*u0b)/2, 0}, {0, 1}, 1}], SFAD[{{k2 + gkin*meta*n*u0b, 0}, \
{0, 1}, 1}], SFAD[{{k1 - k2 - (meta*nb*u0b)/2, 0}, {0, 1}, 1}], \
SFAD[{{k1 + (meta*(2*gkin*n - nb)*u0b)/2, 0}, {2*gkin*meta^2*u0b^2, \
1}, 1}]},
{k1, k2}, {n, nb}, {Hold[SPD][n] -> 0, Hold[SPD][nb] -> 0, \
Hold[SPD][n, nb] -> 2}, {}],FCTopology[pfrTopo212, {SFAD[{{k2, 0}, \
{0, 1}, 1}], SFAD[{{k1, 0}, {0, 1}, 1}], SFAD[{{k2 - (meta*nb*u0b)/2, \
0}, {0, 1}, 1}], SFAD[{{k1 + gkin*meta*n*u0b, 0}, {0, 1}, 1}], \
SFAD[{{k1 - k2 + gkin*meta*n*u0b, 0}, {0, 1}, 1}], SFAD[{{k1 + \
(meta*(2*gkin*n - nb)*u0b)/2, 0}, {2*gkin*meta^2*u0b^2, 1}, 1}]},
{k1, k2}, {n, nb}, {Hold[SPD][n] -> 0, Hold[SPD][nb] -> 0, \
Hold[SPD][n, nb] -> 2}, \
{}]}]\[IndentingNewLine](DataType[#,FCVariable]=True)&/@\!\(\*FormBox[\
\({gkin, meta, u0b}\),
TraditionalForm]\);FCLoopReplaceQuadraticEikonalPropagators[{\
FCTopology[preTopoDia1,{SFAD[{{k2,0},{0,1},1}],SFAD[{{k1,0},{0,1},1}],\
SFAD[{{k1+k2,0},{0,1},1}],SFAD[{{0,-k1.nb},{0,1},1}],SFAD[{{k2,-(meta*\
u0b*k2.nb)},{0,1},1}],SFAD[{{k1+k2,-2*gkin*meta*u0b*(k1+k2).n},{0,1},\
1}],SFAD[{{k1,-2*gkin*meta*k1.n+meta*u0b*k1.nb},{2*gkin*meta^2*u0b,1},\
1}],SFAD[{{k1,-2*gkin*meta*u0b*k1.n+meta*u0b*k1.nb},{2*gkin*meta^2*\
u0b^2,1},1}]},{k1,k2},{n,nb},{Hold[SPD][n]->0,Hold[SPD][nb]->0,Hold[\
SPD][n,nb]->2},{}]},\[IndentingNewLine]LoopMomenta->{k1,k2},\
InitialSubstitutions->{ExpandScalarProduct[SPD[k1-k2]]->SPD[k1-k2],
ExpandScalarProduct[SPD[k1+k2]]->SPD[k1+k2]},\
IntermediateSubstitutions->{SPD[n]->0,SPD[nb]->0,SPD[n,nb]->0}]",
"{FCTopology[preTopoDia1, \
{FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k2, D], 0, \
0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D], 0, \
0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] + \
Momentum[k2, D], 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[0, \
-Pair[Momentum[k1, D], Momentum[nb, D]], 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k2, D] - \
(meta*u0b*Momentum[nb, D])/2, 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1 + k2, D] \
- gkin*meta*u0b*Momentum[n, D], 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] - \
(meta*Momentum[2*gkin*n - nb*u0b, D])/2, 0, -2*gkin*meta^2*u0b, {1, \
1}]], FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, \
D] - (meta*u0b*Momentum[2*gkin*n - nb, D])/2, 0, \
-2*gkin*meta^2*u0b^2, {1, 1}]]}, {k1, k2}, {n, nb}, {Hold[SPD][n] -> \
0, Hold[SPD][nb] -> 0, Hold[SPD][n, nb] -> 2}, {}]}"},
{"fcstFCLoopReplaceQuadraticEikonalPropagators-ID3",
"FCLoopReplaceQuadraticEikonalPropagators[{FCTopology[preTopoDia2,{\
SFAD[{{k2,0},{0,1},1}],SFAD[{{k1,0},{0,1},1}],SFAD[{{0,k2.nb},{2*gkin*\
meta,1},1}],SFAD[{{0,(k1+k2).nb},{2*gkin*meta,1},1}],SFAD[{{k1,-(meta*\
u0b*k1.nb)},{0,1},1}],SFAD[{{k1,-2*gkin*meta*u0b*k1.n},{0,1},1}],SFAD[\
{{k1+k2,-2*gkin*meta*(k1+k2).n},{0,1},1}],SFAD[{{k2,-2*gkin*meta*k2.n+\
2*gkin*meta*u0b*k2.n},{0,1},1}]},{k1,k2},{n,nb},{Hold[SPD][n]->0,Hold[\
SPD][nb]->0,Hold[SPD][n,nb]->2},{}]},\[IndentingNewLine]LoopMomenta->{\
k1,k2},InitialSubstitutions->{ExpandScalarProduct[SPD[k1-k2]]->SPD[k1-\
k2],
ExpandScalarProduct[SPD[k1+k2]]->SPD[k1+k2]},\
IntermediateSubstitutions->{SPD[n]->0,SPD[nb]->0,SPD[n,nb]->0}]",
"{FCTopology[preTopoDia2, \
{FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k2, D], 0, \
0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D], 0, \
0, {1, 1}]], FeynAmpDenominator[StandardPropagatorDenominator[0, \
Pair[Momentum[k2, D], Momentum[nb, D]], -2*gkin*meta, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[0, Pair[Momentum[k1, \
D] + Momentum[k2, D], Momentum[nb, D]], -2*gkin*meta, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] - \
(meta*u0b*Momentum[nb, D])/2, 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] - \
gkin*meta*u0b*Momentum[n, D], 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1 + k2, D] \
- gkin*meta*Momentum[n, D], 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k2, D] - \
gkin*meta*Momentum[n*(1 - u0b), D], 0, 0, {1, 1}]]}, {k1, k2}, {n, \
nb}, {Hold[SPD][n] -> 0, Hold[SPD][nb] -> 0, Hold[SPD][n, nb] -> 2}, \
{}]}"},
{"fcstFCLoopReplaceQuadraticEikonalPropagators-ID4",
"FCLoopReplaceQuadraticEikonalPropagators[{FCTopology[preTopoDia3,{\
SFAD[{{k2,0},{0,1},1}],SFAD[{{k1,0},{0,1},1}],SFAD[{{0,k2.nb},{2*gkin*\
meta,1},1}],SFAD[{{0,k1.nb},{2*gkin*meta*u0b,1},1}],SFAD[{{k1,-(meta*\
u0b*k1.nb)},{0,1},1}],SFAD[{{k1,-2*gkin*meta*u0b*k1.n},{0,1},1}],SFAD[\
{{k1,2*gkin*meta*k1.n-2*gkin*meta*u0b*k1.n-meta*u0b*k1.nb},{2*gkin*\
meta^2*u0b-2*gkin*meta^2*u0b^2,1},1}],SFAD[{{k1-k2,2*gkin*meta*k1.n-2*\
gkin*meta*u0b*k1.n-2*gkin*meta*k2.n+2*gkin*meta*u0b*k2.n+meta*u0b*(-\
k1+k2).nb},{2*gkin*meta^2*u0b-2*gkin*meta^2*u0b^2,1},1}]},{k1,k2},{n,\
nb},{Hold[SPD][n]->0,Hold[SPD][nb]->0,Hold[SPD][n,nb]->2},{}]},\
\[IndentingNewLine]LoopMomenta->{k1,k2},InitialSubstitutions->{\
ExpandScalarProduct[SPD[k1-k2]]->SPD[k1-k2],
ExpandScalarProduct[SPD[k1+k2]]->SPD[k1+k2]},\
IntermediateSubstitutions->{SPD[n]->0,SPD[nb]->0,SPD[n,nb]->0}]",
"{FCTopology[preTopoDia3, \
{FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k2, D], 0, \
0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D], 0, \
0, {1, 1}]], FeynAmpDenominator[StandardPropagatorDenominator[0, \
Pair[Momentum[k2, D], Momentum[nb, D]], -2*gkin*meta, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[0, Pair[Momentum[k1, \
D], Momentum[nb, D]], -2*gkin*meta*u0b, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] - \
(meta*u0b*Momentum[nb, D])/2, 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] - \
gkin*meta*u0b*Momentum[n, D], 0, 0, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1, D] + \
(meta*Momentum[2*gkin*n - 2*gkin*n*u0b - nb*u0b, D])/2, 0, \
-2*gkin*meta^2*u0b + 2*gkin*meta^2*u0b^2, {1, 1}]], \
FeynAmpDenominator[StandardPropagatorDenominator[Momentum[k1 - k2, D] \
+ (meta*Momentum[2*gkin*n - 2*gkin*n*u0b - nb*u0b, D])/2, 0, \
-2*gkin*meta^2*u0b + 2*gkin*meta^2*u0b^2, {1, 1}]]}, {k1, k2}, {n, \
nb}, {Hold[SPD][n] -> 0, Hold[SPD][nb] -> 0, Hold[SPD][n, nb] -> 2}, \
{}]}"}
})

0 comments on commit 8990853

Please sign in to comment.