Skip to content

Commit

Permalink
Fixed another bug in the Larin scheme related to the ordering
Browse files Browse the repository at this point in the history
of Eps-tensor contractions (Issue #283)
  • Loading branch information
vsht committed Oct 4, 2024
1 parent f440118 commit 2f7d906
Show file tree
Hide file tree
Showing 3 changed files with 166 additions and 41 deletions.
64 changes: 38 additions & 26 deletions FeynCalc/Dirac/DiracTrace.m
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@
by hand or employ ChangeDimension[exp,D] to convert the whole expression to D-dimensions. If you explicitly \
intend to use the t'Hooft-Veltman scheme, please activate it via FCSetDiracGammaScheme[\"BMHV\"]."

DiracTrace::larinmultiple = "Detected string of Dirac matrices containing more than two g^5 matrices in the \
Larin scheme. Since the pairing of the resulting Eps-tensors depends on their physical origin, FeynCalc will \
disable all such contractions in this calculation by wrapping their heads with Hold. The correct order of \
contractions cannot be determined automatically and must be specified by the user. The Hold head can be removed \
using FRH."

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

Begin["`Package`"]
Expand All @@ -49,6 +55,7 @@
leviCivitaSign::usage="";
optSort::usage="";
larinMVV::usage="";
holdEpsQ::usage="";

Options[DiracTrace] = {
Contract -> True,
Expand Down Expand Up @@ -221,7 +228,8 @@
Block[{ diractrres, tmp = expr, diractrfact, diractrcoll,
dtmp,dWrap,wrapRule,prepSpur,time,time2,contract,spurHeadList,
spurHeadListChiral,spurHeadListNonChiral,gammaFree,gammaPart,
traceListChiral,traceListNonChiral,repRule,null1,null2,dummyIndexFreeQ, epsEvaluate},
traceListChiral,traceListNonChiral,repRule,null1,null2,dummyIndexFreeQ,
epsEvaluate, numGamma5},

wrapRule = {dWrap[5]->0, dWrap[6]->1/2, dWrap[7]->1/2, dWrap[LorentzIndex[_,_:4],___]->0,
dWrap[_. Momentum[_,_:4]+_:0,___]->0};
Expand Down Expand Up @@ -257,6 +265,19 @@
time=AbsoluteTime[];
FCPrint[1,"DiracTrace: diracTraceEvaluate: Applying DiracTrick.", FCDoControl->diTrVerbose];

If[ TrueQ[(FeynCalc`Package`DiracGammaScheme === "Larin") && !FreeQ2[tmp,{DiracGamma[5],DiracGamma[6],DiracGamma[7]}]],
numGamma5 = Count[tmp, DiracGamma[5] | DiracGamma[6] | DiracGamma[7], Infinity];
If[ !MatchQ[numGamma5,_Integer?NonNegative],
Message[DiracTrace::failmsg,"Failed to determine the number of g^5 in the trace."];
Abort[]
];
If[ numGamma5>2,
Message[DiracTrace::larinmultiple];
holdEpsQ=True
],
holdEpsQ=False
];

(* If there are no nested DOTs, then FCDiracIsolate is not needed, otherwise one should use it *)
tmp = DiracTrick[tmp, FCI -> True, InsideDiracTrace->True, FCDiracIsolate->FeynCalc`Package`containsNestedDOTsQ[tmp]];

Expand Down Expand Up @@ -703,35 +724,26 @@ we define it is a function (traceNo5fun) so that the result can be retrieved ver
]/; EvenQ[Length[{x,y}]];


(*Implements Eq.10 from 1506.04517 *)
spur5LarinMVVold[x__DiracGamma, y:DiracGamma[_[_,dim_],dim_], DiracGamma[5]]:=
Block[{inds, epsInds, gInds, indPartitions, res, signs},
inds = First/@{x};
epsInds = Subsets[inds, {3}];
(*Implements Eq.11 from 1506.04517 *)
spur5LarinMVV[x__DiracGamma, y : DiracGamma[_[_, dim_], dim_], DiracGamma[5]] :=
Block[{ inds, epsInds, gInds, indPartitions, res, signs, eps},

If[TrueQ[holdEpsQ],
eps=Hold[Eps],
eps=Eps
];

inds = First /@ {x, y};
epsInds = Subsets[inds, {4}];
gInds = SelectFree[inds, #] & /@ epsInds;
indPartitions = MapThread[Join[#1, #2] &, {gInds, epsInds}];
signs = Signature /@ (indPartitions /. Thread[Rule[inds, Range[Length[inds]]]]);
indPartitions = Join[#, {First[y]}] & /@ indPartitions;
signs = Signature /@ (indPartitions /. Thread[Rule[inds, Range[Length[inds]]]]);

res = Total[MapThread[$LeviCivitaSign*I*#2*((traceNo5Wrap @@ #1[[;; -5]])) *
Apply[Eps, #1[[-4 ;;]]] &, {indPartitions, signs}]];
res =
Total[MapThread[$LeviCivitaSign*
I*#2*((traceNo5Wrap @@ #1[[;; -5]]))*
Apply[eps, #1[[-4 ;;]]] &, {indPartitions, signs}]];
fastExpand[res]
]/; EvenQ[Length[{x,y}]] && Length[{x,y}]>=4;

(*Implements Eq.11 from 1506.04517 *)
spur5LarinMVV[x__DiracGamma, y : DiracGamma[_[_, dim_], dim_], DiracGamma[5]] :=
Block[{inds, epsInds, gInds, indPartitions, res, signs},
inds = First /@ {x, y};
epsInds = Subsets[inds, {4}];
gInds = SelectFree[inds, #] & /@ epsInds;
indPartitions = MapThread[Join[#1, #2] &, {gInds, epsInds}];
signs = Signature /@ (indPartitions /. Thread[Rule[inds, Range[Length[inds]]]]);

res =
Total[MapThread[$LeviCivitaSign*
I*#2*((traceNo5Wrap @@ #1[[;; -5]]))*
Apply[Eps, #1[[-4 ;;]]] &, {indPartitions, signs}]];
fastExpand[res]
] /; EvenQ[Length[{x, y}]] && Length[{x, y}] >= 4;

spur5BMHVWest[x__DiracGamma, DiracGamma[5]]:=
Expand Down
47 changes: 33 additions & 14 deletions FeynCalc/Dirac/DiracTrick.m
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ create replacement rules (standard) and substitute the results back.
optFCDiracIsolate = OptionValue[FCDiracIsolate];
insideDiracTrace = OptionValue[InsideDiracTrace];


FCPrint[1, "DiracTrick. Entering.", FCDoControl->diTrVerbose];
FCPrint[3, "DiracTrick: Entering with ", expr, FCDoControl->diTrVerbose];

Expand Down Expand Up @@ -626,7 +625,7 @@ create replacement rules (standard) and substitute the results back.
MatchQ[dim,{_Symbol}] && (FeynCalc`Package`DiracGammaScheme === "BMHV"),
FCPrint[2, "DiracTrick: diracTrickEval: Purely D-dim and BMHV.", FCDoControl->diTrVerbose];
Null,
(* Purely D-dimensional and Larin use the substitution rule to eliminate g^5 that are not on the left of the trace *)
(* Purely D-dimensional and Larin -> use the substitution rule to eliminate g^5 that are not on the left of the trace *)
MatchQ[dim,{_Symbol}] && (FeynCalc`Package`DiracGammaScheme === "Larin"),
FCPrint[2, "DiracTrick: diracTrickEval: Purely D-dim and Larin.", FCDoControl->diTrVerbose];
res = res /. holdDOT -> chiralTrickLarin /. chiralTrickLarin -> holdDOT,
Expand Down Expand Up @@ -1548,26 +1547,46 @@ create replacement rules (standard) and substitute the results back.
(* ------------------------------------------------------------------------ *)

chiralTrickLarin[b___,((dg:DiracGamma[_[_,_], dim_]) + mass_:0),DiracGamma[5],d__] :=
Block[{li1,li2,li3},
{li1,li2,li3} = LorentzIndex[#,dim]& /@ Unique[{"dtlarLia","dtlarLib","dtlarLic"}];
I/6 $LeviCivitaSign Eps[dg[[1]], li1, li2, li3] chiralTrickLarin[b,DiracGamma[li1,dim],
DiracGamma[li2,dim],DiracGamma[li3,dim],d] + mass chiralTrickLarin[b,DiracGamma[5],d]
Block[{li1,li2,li3,eps},

If[ TrueQ[Count[{b,d}, DiracGamma[5] | DiracGamma[6] | DiracGamma[7], Infinity]>1],
Message[DiracTrace::larinmultiple];
eps = Hold[Eps],
eps = Eps
];

{li1,li2,li3} = LorentzIndex[#,dim]& /@ Unique[{"dtlarLia","dtlarLib","dtlarLic"}];
(I/6 $LeviCivitaSign eps[dg[[1]], li1, li2, li3] chiralTrickLarin[b,DiracGamma[li1,dim],
DiracGamma[li2,dim],DiracGamma[li3,dim],d] + mass chiralTrickLarin[b,DiracGamma[5],d])
]/; !FreeQ2[{d},{DiracGamma[5],DiracGamma[6],DiracGamma[7]}] && NonCommFreeQ[mass];

chiralTrickLarin[b___,((dg:DiracGamma[_[_,_], dim_]) + mass_:0),DiracGamma[6],d__] :=
Block[{li1,li2,li3},
{li1,li2,li3} = LorentzIndex[#,dim]& /@ Unique[{"dtlarLia","dtlarLib","dtlarLic"}];
mass chiralTrickLarin[b,DiracGamma[6],d] +
1/2 chiralTrickLarin[b,dg,d] +
I/12 $LeviCivitaSign Eps[dg[[1]], li1, li2, li3] chiralTrickLarin[b,DiracGamma[li1,dim],DiracGamma[li2,dim],DiracGamma[li3,dim],d]
Block[{li1,li2,li3,eps},

If[ TrueQ[Count[{b,d}, DiracGamma[5] | DiracGamma[6] | DiracGamma[7], Infinity]>1],
Message[DiracTrace::larinmultiple];
eps = Hold[Eps],
eps = Eps
];

{li1,li2,li3} = LorentzIndex[#,dim]& /@ Unique[{"dtlarLia","dtlarLib","dtlarLic"}];
(mass chiralTrickLarin[b,DiracGamma[6],d] + 1/2 chiralTrickLarin[b,dg,d] +
I/12 $LeviCivitaSign eps[dg[[1]], li1, li2, li3] chiralTrickLarin[b,DiracGamma[li1,dim],DiracGamma[li2,dim],DiracGamma[li3,dim],d])
]/; !FreeQ2[{d},{DiracGamma[5],DiracGamma[6],DiracGamma[7]}] && NonCommFreeQ[mass];

chiralTrickLarin[b___,((dg:DiracGamma[_[_,_], dim_]) + mass_:0),DiracGamma[7],d__] :=
Block[{li1,li2,li3},
{li1,li2,li3} = LorentzIndex[#,dim]& /@ Unique[{"dtlarLia","dtlarLib","dtlarLic"}];
Block[{li1,li2,li3,eps},

If[ TrueQ[Count[{b,d}, DiracGamma[5] | DiracGamma[6] | DiracGamma[7], Infinity]>1],
Message[DiracTrace::larinmultiple];
eps = Hold[Eps],
eps = Eps
];

{li1,li2,li3} = LorentzIndex[#,dim]& /@ Unique[{"dtlarLia","dtlarLib","dtlarLic"}];
mass chiralTrickLarin[b,DiracGamma[7],d] +
1/2 chiralTrickLarin[b,dg,d] -
I/12 $LeviCivitaSign Eps[dg[[1]], li1, li2, li3] chiralTrickLarin[b,DiracGamma[li1,dim],DiracGamma[li2,dim],DiracGamma[li3,dim],d]
I/12 $LeviCivitaSign eps[dg[[1]], li1, li2, li3] chiralTrickLarin[b,DiracGamma[li1,dim],DiracGamma[li2,dim],DiracGamma[li3,dim],d]
]/; !FreeQ2[{d},{DiracGamma[5],DiracGamma[6],DiracGamma[7]}] && NonCommFreeQ[mass];

(* ------------------------------------------------------------------------ *)
Expand Down
Loading

0 comments on commit 2f7d906

Please sign in to comment.