| 1 | (* ::Package:: *) | 
|---|
| 2 |  | 
|---|
| 3 | (* ::Section:: *) | 
|---|
| 4 | (*Renormalization scheme definitions*) | 
|---|
| 5 |  | 
|---|
| 6 |  | 
|---|
| 7 | (* ::Subsection::Closed:: *) | 
|---|
| 8 | (*Declaring unrenormalized parameters*) | 
|---|
| 9 |  | 
|---|
| 10 |  | 
|---|
| 11 | DefineUnrenormalizedParameters[List[args__]]:=DefineUnrenormalizeOne/@{args}; | 
|---|
| 12 |  | 
|---|
| 13 |  | 
|---|
| 14 | DefineUnrenormalizedParameters[args__]:=DefineUnrenormalizeOne/@{args}; | 
|---|
| 15 |  | 
|---|
| 16 |  | 
|---|
| 17 | DefineUnrenormalizeOne[exp_]:=Block[{},SchemeRules=Append[SchemeRules,FR$delta[{exp},{}]->0];]; | 
|---|
| 18 |  | 
|---|
| 19 |  | 
|---|
| 20 | (* ::Subsection::Closed:: *) | 
|---|
| 21 | (*Defining a dependent renormalisation constant*) | 
|---|
| 22 |  | 
|---|
| 23 |  | 
|---|
| 24 | AddRenormalizationCondition[obj_, rule_]:= Block[{}, SchemeRules=Append[SchemeRules,Rule[obj,rule]]]; | 
|---|
| 25 |  | 
|---|
| 26 |  | 
|---|
| 27 | (* ::Subsection::Closed:: *) | 
|---|
| 28 | (*Declaring unrenormalized fields*) | 
|---|
| 29 |  | 
|---|
| 30 |  | 
|---|
| 31 | DeclareUnrenormalizedFields[List[args__]]:=DeclareUnrenormalizedOneField/@{args}; | 
|---|
| 32 |  | 
|---|
| 33 |  | 
|---|
| 34 | DeclareUnrenormalizedFields[args__]:=DeclareUnrenormalizedOneField/@{args}; | 
|---|
| 35 |  | 
|---|
| 36 |  | 
|---|
| 37 | DeclareUnrenormalizedOneField[exp_]:=Block[{},NoRenoFields=Append[NoRenoFields,exp];]; | 
|---|
| 38 |  | 
|---|
| 39 |  | 
|---|
| 40 | (* ::Subsection::Closed:: *) | 
|---|
| 41 | (*Removing vanishing internal parameters*) | 
|---|
| 42 |  | 
|---|
| 43 |  | 
|---|
| 44 | EnforceZeroParameters[]:=PrePutIndices/@Cases[(Rule[#[[1]],#[[2]]]&/@IParamList)/.ParameterSwitchesAndSwaps[][[3]]/.Rule->myr,myr[_,0]]/.myr->Rule; | 
|---|
| 45 |  | 
|---|
| 46 |  | 
|---|
| 47 | (* ::Subsection::Closed:: *) | 
|---|
| 48 | (*Declaring real renormalization constants*) | 
|---|
| 49 |  | 
|---|
| 50 |  | 
|---|
| 51 | RealFieldRenormalization[{fields__}]:= RealFieldRenormalization/@{fields}; | 
|---|
| 52 |  | 
|---|
| 53 |  | 
|---|
| 54 | RealFieldRenormalization[field_]:=Block[{}, RealRenoFields=Append[RealRenoFields,field]; CnumQ[FR$deltaZ[{field, field},__]]:=False;]; | 
|---|
| 55 |  | 
|---|
| 56 |  | 
|---|
| 57 | RealFieldRenormalization[fields___]:= RealFieldRenormalization/@{fields}; | 
|---|
| 58 |  | 
|---|
| 59 |  | 
|---|
| 60 | RealFieldRenormalization[]:= RealFieldRenormalization/@Select[Flatten[ClassMemberList/@PartList[[All,1,2]]],!(GhostFieldQ[#]===True||GoldstoneQ[#]===True)&]; | 
|---|
| 61 |  | 
|---|
| 62 |  | 
|---|
| 63 | (* ::Subsection::Closed:: *) | 
|---|
| 64 | (*Removing an internal parameter renormalization constants*) | 
|---|
| 65 |  | 
|---|
| 66 |  | 
|---|
| 67 | RemovingInternalCst[param_]:=Block[{},If[FreeQ[InternalRemovalList,param], InternalRemovalList = Append[InternalRemovalList,param]];]; | 
|---|
| 68 |  | 
|---|
| 69 |  | 
|---|
| 70 | ExecuteRemovingInternalCst[]:= DeleteDuplicates[Flatten[Cases[Global`RenormalizationRules["Internals"][[1]]/.Rule->myr,myr[FR$delta[{PrePutIndices[#]},{}],_]] &/@ InternalRemovalList,1]/.myr->Rule]; | 
|---|
| 71 |  | 
|---|
| 72 |  | 
|---|
| 73 | (* ::Subsection::Closed:: *) | 
|---|
| 74 | (*Clearing the rules*) | 
|---|
| 75 |  | 
|---|
| 76 |  | 
|---|
| 77 | ClearRenormalizationScheme[]:=Block[{}, | 
|---|
| 78 | If[Length[FR$RmDblExt]===0,FR$RmDblExt={}]; | 
|---|
| 79 | Block[{}, CnumQ[FR$deltaZ[{#, _},__]]:=True;]&/@RealRenoFields; | 
|---|
| 80 | SchemeRules = {}; InternalRemovalList = {}; Global`EnforceZeros = True; RealRenoFields={}; NoRenoFields = {}; | 
|---|
| 81 | Global`RenormalizationRules["Externals"]={}; Global`RenormalizationRules["Masses"]={}; Global`RenormalizationRules["Internals"]={{},{}}; | 
|---|
| 82 | Global`RenormalizationRules["Fields"]={}; Global`RenormalizationRules["Tadpoles"]={}; Global`RenormalizationRules["MassShifts"] = {}; | 
|---|
| 83 | ]; | 
|---|
| 84 |  | 
|---|
| 85 |  | 
|---|
| 86 | ClearRenormalizationScheme[]; | 
|---|
| 87 |  | 
|---|
| 88 |  | 
|---|
| 89 | (* ::Subsection::Closed:: *) | 
|---|
| 90 | (*Enforcing the scheme*) | 
|---|
| 91 |  | 
|---|
| 92 |  | 
|---|
| 93 | SchemeDependence[rules_]:=Block[{output=rules/.SchemeRules}, | 
|---|
| 94 | output=DeleteCases[output,Rule[a_,a_]]; | 
|---|
| 95 | Return[output]; | 
|---|
| 96 | ]; | 
|---|
| 97 |  | 
|---|
| 98 |  | 
|---|
| 99 | SchemeDependenceInternal[{intdefs_, intrules_}]:=Block[{newintdefs, newintrules}, | 
|---|
| 100 | (* Simplifying the definitions and the rules according to the scheme *) | 
|---|
| 101 | newintdefs = If[FreeQ[#[[2]],FR$delta],Rule[#[[1]],Simplify[#[[2]]]],#]&/@SchemeDependence[intdefs]; | 
|---|
| 102 | newintrules=intrules/.newintdefs; | 
|---|
| 103 | newintrules=If[FreeQ[Coefficient[#[[2]],FR$CT],FR$delta],Rule[#[[1]],(#[[2]]/.FR$CT->0)+FR$CT*Simplify[Coefficient[#[[2]],FR$CT]]],#]&/@newintrules; | 
|---|
| 104 | newintrules=SchemeDependence[newintrules]; | 
|---|
| 105 | newintrules=Rule[#[[1]], Collect[#[[2]],{FR$delta[__], FR$deltaZ[__]}]]&/@newintrules; | 
|---|
| 106 | newintrules=Rule[#[[1]],#[[1]]+FR$CT*FR$delta[{#[[1]]},{}]]&/@newintrules; | 
|---|
| 107 | newintrules = newintrules/.FR$delta[{Conjugate[aaa_]},{}]:>Conjugate[FR$delta[{aaa},{}]]; | 
|---|
| 108 | newintdefs=DeleteCases[newintdefs,Rule[_,0]]; | 
|---|
| 109 | (* output *) | 
|---|
| 110 | Return[{PrePutIndices/@newintdefs,PrePutIndices/@newintrules}]; | 
|---|
| 111 | ]; | 
|---|
| 112 |  | 
|---|
| 113 |  | 
|---|
| 114 | (* ::Section:: *) | 
|---|
| 115 | (*Misc*) | 
|---|
| 116 |  | 
|---|
| 117 |  | 
|---|
| 118 | (* ::Subsection:: *) | 
|---|
| 119 | (*Version information*) | 
|---|
| 120 |  | 
|---|
| 121 |  | 
|---|
| 122 | MoGRe`Version = "1.1"; | 
|---|
| 123 | MoGRe`Date    = "25.10.2019" | 
|---|
| 124 |  | 
|---|
| 125 |  | 
|---|
| 126 | (* ::Subsection:: *) | 
|---|
| 127 | (*Welcome*) | 
|---|
| 128 |  | 
|---|
| 129 |  | 
|---|
| 130 | Welcome[]:=Block[{}, | 
|---|
| 131 | Print["  -- MoGRe: More General Renormalization in FeynRules --"]; | 
|---|
| 132 | Print["      > Version: " <> MoGRe`Version]; | 
|---|
| 133 | Print["      > Date: " <> MoGRe`Date]; | 
|---|
| 134 | Print["  "]; | 
|---|
| 135 | Print["      > Author: Benjamin Fuks (LPTHE / Sorbonne U.)"]; | 
|---|
| 136 | Print["      > Contact: fuks@lpthe.jussieu.fr"]; | 
|---|
| 137 | Print["  "]; | 
|---|
| 138 | Print["      > Reference: arXiv:1907.04898 [hep-ph]"]; | 
|---|
| 139 | Print["  "]; | 
|---|
| 140 | ]; | 
|---|
| 141 |  | 
|---|
| 142 |  | 
|---|
| 143 | (* ::Subsection::Closed:: *) | 
|---|
| 144 | (*Definitions*) | 
|---|
| 145 |  | 
|---|
| 146 |  | 
|---|
| 147 | numQ[FR$CT]=True;  CnumQ[FR$CT]=False; | 
|---|
| 148 |  | 
|---|
| 149 |  | 
|---|
| 150 | (* ::Subsection:: *) | 
|---|
| 151 | (*Printing*) | 
|---|
| 152 |  | 
|---|
| 153 |  | 
|---|
| 154 | (* ::Text:: *) | 
|---|
| 155 | (*Set of methods for print statements*) | 
|---|
| 156 |  | 
|---|
| 157 |  | 
|---|
| 158 | TimeStamp[method_, msg_,t0_]:= Block[{ti=SessionTime[]},Print[Style[method,Orange,Bold],": ",msg ," done in ", ti-t0," seconds"];Return[ti];]; | 
|---|
| 159 | SubMethodStamp[method_, msg_]:= Print[Style[method,Darker[Green],Bold],": starting ", msg]; | 
|---|
| 160 | Error[ msg_]:=Print[Style["  ** Error: ",Darker[Red],Bold], msg]; | 
|---|
| 161 | Warning[ msg_]:=Print[Style["  ** Warning: ",Darker[Purple],Bold], msg]; | 
|---|
| 162 | DebugPrint[msg__]:=If[Global`MoGRe$Debug,Print[msg]]; | 
|---|
| 163 |  | 
|---|
| 164 |  | 
|---|
| 165 | (* ::Subsection::Closed:: *) | 
|---|
| 166 | (*Parallelization*) | 
|---|
| 167 |  | 
|---|
| 168 |  | 
|---|
| 169 | (* ::Text:: *) | 
|---|
| 170 | (*Condition for parallelization (expressions longer than 40 terms and kernel availability)*) | 
|---|
| 171 |  | 
|---|
| 172 |  | 
|---|
| 173 | DoPara[expr_]:=Global`FR$Parallelize && Length[expr]>40 && $KernelCount>1; | 
|---|
| 174 |  | 
|---|
| 175 |  | 
|---|
| 176 | (* ::Text:: *) | 
|---|
| 177 | (*Options of the method*) | 
|---|
| 178 |  | 
|---|
| 179 |  | 
|---|
| 180 | Options[ParaExec]={Opts->MR$Null}; | 
|---|
| 181 |  | 
|---|
| 182 |  | 
|---|
| 183 | (* ::Text:: *) | 
|---|
| 184 | (*Main method (two ways, depending whether the method to parallelize has options*) | 
|---|
| 185 |  | 
|---|
| 186 |  | 
|---|
| 187 | ParaExec[func_,arg_,OptionsPattern[]]:=Block[{myoptions=OptionValue[Opts],tmpres,inter}, | 
|---|
| 188 |  | 
|---|
| 189 | tmpres=If[myoptions=!=MR$Null, | 
|---|
| 190 | (* with options *) | 
|---|
| 191 | DistributeDefinitions[myoptions];SetSharedFunction[func]; | 
|---|
| 192 | Table[inter=arg[[ii]]; ParallelSubmit[{ii,inter},$Output={}; tmpres=func[inter,Sequence@@myoptions]; $Output={OutputStream["stdout",1]}; tmpres],{ii,Length[arg]}], | 
|---|
| 193 |  | 
|---|
| 194 | (*no options *) | 
|---|
| 195 | SetSharedFunction[func]; | 
|---|
| 196 | Table[inter=arg[[ii]]; ParallelSubmit[{ii,inter},$Output={}; tmpres=func[inter]; $Output={OutputStream["stdout",1]}; tmpres],{ii,Length[arg]}] | 
|---|
| 197 | ]; | 
|---|
| 198 |  | 
|---|
| 199 | (* output and exit *) | 
|---|
| 200 | tmpres=WaitAll[tmpres]; | 
|---|
| 201 | Return[tmpres]; | 
|---|
| 202 | ]; | 
|---|
| 203 |  | 
|---|
| 204 |  | 
|---|
| 205 | (* ::Subsection::Closed:: *) | 
|---|
| 206 | (*Get the class name of a particle*) | 
|---|
| 207 |  | 
|---|
| 208 |  | 
|---|
| 209 | ParticleClassName[particle_]:=If[MemberQ[PartList[[All,1,2]],particle], Cases[PartList[[All,1]],{_,particle}][[1,1]],Error["The particle does not exist"];Abort[]]; | 
|---|
| 210 |  | 
|---|
| 211 |  | 
|---|
| 212 | (* ::Subsection::Closed:: *) | 
|---|
| 213 | (*Get the index type of the flavor index*) | 
|---|
| 214 |  | 
|---|
| 215 |  | 
|---|
| 216 | ParticleClassFlavorType[class_]:=FlavorIndex/.MR$ClassesRules[class]; | 
|---|
| 217 |  | 
|---|
| 218 |  | 
|---|
| 219 | (* ::Section:: *) | 
|---|
| 220 | (*Checks*) | 
|---|
| 221 |  | 
|---|
| 222 |  | 
|---|
| 223 | (* ::Subsection::Closed:: *) | 
|---|
| 224 | (*Mixing*) | 
|---|
| 225 |  | 
|---|
| 226 |  | 
|---|
| 227 | (* ::Text:: *) | 
|---|
| 228 | (*Checks whether the mixing pattern is either a boolean, or a list of 2-tuples*) | 
|---|
| 229 |  | 
|---|
| 230 |  | 
|---|
| 231 | CheckRenormalizeOptions["Mixing", mixpattern_]:= Block[{}, | 
|---|
| 232 | If[BooleanQ[mixpattern],Return[]]; | 
|---|
| 233 | If[Not[ListQ[mixpattern]], Error["The mixing fields must be provided as a list of n-tuples"]; Abort[]]; | 
|---|
| 234 | If[Not[And@@(ListQ/@mixpattern)], Error["The mixing fields must be provided as a list of n-tuples"]; Abort[]]; | 
|---|
| 235 | If[Not[And@@((#===1)&/@(Length[Union[#]]&/@Map[Through,Map[MR$QuantumNumbers,#]&/@mixpattern,{2}]))], | 
|---|
| 236 | Error["Imposing the one-loop mixing of fields with different quantum numbers"]; Abort[];] | 
|---|
| 237 | ]; | 
|---|
| 238 |  | 
|---|
| 239 |  | 
|---|
| 240 | (* ::Subsection::Closed:: *) | 
|---|
| 241 | (*Coupling orders*) | 
|---|
| 242 |  | 
|---|
| 243 |  | 
|---|
| 244 | (* ::Text:: *) | 
|---|
| 245 | (*Checks whether the selected coupling orders are consistent with the QCDOnly option*) | 
|---|
| 246 |  | 
|---|
| 247 |  | 
|---|
| 248 | CheckRenormalizeOptions["Couplings",couplingorders_]:=Block[{}, | 
|---|
| 249 | If[Not[ListQ[couplingorders]],Error["The CouplingOrders option must be a list of coupling orders"]; Abort[]]; | 
|---|
| 250 | If[Complement[couplingorders,M$InteractionOrderHierarchy[[All,1]]]=!={},Error["At least one unknown CouplingOrder"]; Abort[]]; | 
|---|
| 251 | ]; | 
|---|
| 252 |  | 
|---|
| 253 |  | 
|---|
| 254 | (* ::Subsection::Closed:: *) | 
|---|
| 255 | (*Vevs*) | 
|---|
| 256 |  | 
|---|
| 257 |  | 
|---|
| 258 | VevDeclarations[]:= Block[{}, | 
|---|
| 259 | If[Not[And@@(!FreeQ[#[[1]]//.MR$Definitions,#[[2]]]&/@M$vevs)], Error["vev declarations (M$vevs) incompatible with (unphysical) field definitions."]; Abort[]]; | 
|---|
| 260 | ]; | 
|---|
| 261 |  | 
|---|
| 262 |  | 
|---|
| 263 | (* ::Section:: *) | 
|---|
| 264 | (*Formatting the Lagrangian so that it could be processes by the renormalization method*) | 
|---|
| 265 |  | 
|---|
| 266 |  | 
|---|
| 267 | (* ::Text:: *) | 
|---|
| 268 | (*This method flavor-expands the Lagrangian (necessary as some fields of a given class can be massive or massless so that the renormalization is different.*) | 
|---|
| 269 | (*Next, the 4-scalar interactions are factored out in case they do not need to be renormalized (option to be provided by the user)*) | 
|---|
| 270 |  | 
|---|
| 271 |  | 
|---|
| 272 | FormattingLagrangian[lag_,no4S_,cano_]:=Block[{tmplag,lag4S={},l2pt,irules}, | 
|---|
| 273 | (* init *) | 
|---|
| 274 | tmplag=PRIVATE`Listize[lag]; | 
|---|
| 275 |  | 
|---|
| 276 | (* 1. Flavor expansion *) | 
|---|
| 277 | tmplag=If[DoPara[tmplag], | 
|---|
| 278 | DebugPrint["  ** Expanding indices over ", Global`FR$KernelNumber," cores"]; | 
|---|
| 279 | ParaExec[ExpandIndices,tmplag,Opts->{FlavorExpand->True}], | 
|---|
| 280 | DebugPrint["  ** Expanding indices"]; | 
|---|
| 281 | Plus@@(ExpandIndices[#,FlavorExpand->True]&/@tmplag) | 
|---|
| 282 | ]; | 
|---|
| 283 | tmplag=PRIVATE`Listize[Plus@@tmplag]; | 
|---|
| 284 |  | 
|---|
| 285 | (* 2. Removing 4-scalar interactions *) | 
|---|
| 286 | If[no4S, | 
|---|
| 287 | DebugPrint["  ** Removing four scalar interactions"]; | 
|---|
| 288 | lag4S=Select[tmplag,(GetFieldContent[#]/._?ScalarFieldQ -> S)==={S,S,S,S}&]; | 
|---|
| 289 | tmplag=Complement[tmplag,lag4S]; | 
|---|
| 290 | ]; | 
|---|
| 291 |  | 
|---|
| 292 | (* Cleaning the two-point/one-point interactions *) | 
|---|
| 293 | If[cano, | 
|---|
| 294 | DebugPrint["  ** Inserting canonical two point terms..."]; | 
|---|
| 295 | tmplag= Select[tmplag,Length[GetFieldContent[#]]>2&]; | 
|---|
| 296 | l2pt = Block[{sym=If[SelfConjugateQ[#],2,1], idx = $IndList[#]/.Index[type_]:>Index[type,Unique[dum]]}, | 
|---|
| 297 | Which[ | 
|---|
| 298 | FermionQ[#]===True,I/sym anti[#].Ga[mu].del[#,mu]-Mass[#]/sym anti[#].# , | 
|---|
| 299 | VectorFieldQ[#]===True,GetQuadraticTerms[-1/(2 sym) If[Length[idx]==1,FS[#,mu,nu]FS[anti[#],mu,nu],FS[#,mu,nu,aa]FS[anti[#],mu,nu,aa]] +1/sym Mass[#]^2 anti[#][Sequence@@idx]#[Sequence@@idx]], | 
|---|
| 300 | ScalarFieldQ[#]===True,1/sym del[#[Sequence@@idx],mu]del[anti[#][Sequence@@idx],mu]-1/sym Mass[#]^2 anti[#][Sequence@@idx]#[Sequence@@idx]/.fld_[]:>fld | 
|---|
| 301 | ]]&/@Flatten[ClassMemberList/@Select[PartList[[All,1,2]],(GhostFieldQ[#]=!=True)&&(GoldstoneQ[#]=!=True)&]]; | 
|---|
| 302 | l2pt = ExpandIndices[#,FlavorExpand->True]&/@l2pt, | 
|---|
| 303 | (* else *) | 
|---|
| 304 | irules = DeleteCases[(Rule[#[[1]],#[[2]]]&/@IParamList)/.ParameterSwitchesAndSwaps[][[3]],Rule[_,0]]; | 
|---|
| 305 | irules = Join[ParameterSwitchesAndSwaps[][[2]],Flatten[irules/.ConditionalExpression[a_,_]->a]/.ParameterSwitchesAndSwaps[][[2]]]; | 
|---|
| 306 | irules=(If[MemberQ[ParameterSwitchesAndSwaps[][[1]][[All,2]],#1],Solve[#1==(#2//.irules),Cases[ParameterSwitchesAndSwaps[][[1]],{_,#1}][[1,1]]][[1,1]],#1->#2]&)@@@irules; | 
|---|
| 307 | irules = Rule[#[[1]],#[[2]]//.MR$Definitions]&/@irules; | 
|---|
| 308 | irules = Rule[#[[1]],#[[2]]//.irules]&/@irules; | 
|---|
| 309 | DebugPrint["  ** Getting the two point terms..."]; | 
|---|
| 310 | l2pt=Join[DeleteCases[GetQuadraticTerms/@tmplag,0], Select[tmplag,Length[GetFieldContent[#]]===1&]]; | 
|---|
| 311 | tmplag=Complement[tmplag,PRIVATE`Listize[Plus@@l2pt]]; | 
|---|
| 312 | l2pt=Simplify/@ (l2pt//.Join[MR$Definitions,Rule[PrePutIndices[#[[1]]],#[[2]]]&/@irules]); | 
|---|
| 313 | ]; | 
|---|
| 314 |  | 
|---|
| 315 | (* output *) | 
|---|
| 316 | Return[{Join[tmplag,l2pt],lag4S}]; | 
|---|
| 317 | ]; | 
|---|
| 318 |  | 
|---|
| 319 |  | 
|---|
| 320 | (* ::Section:: *) | 
|---|
| 321 | (*Field renormalization*) | 
|---|
| 322 |  | 
|---|
| 323 |  | 
|---|
| 324 | (* ::Subsection::Closed:: *) | 
|---|
| 325 | (*Shortcut to get a field renormalization constant*) | 
|---|
| 326 |  | 
|---|
| 327 |  | 
|---|
| 328 | ConstructDeltaZ[fld1_,fld2_,idx_,newidx_,tp___]:= FR$CT*FR$deltaZ[{fld1,fld2},{DeleteCases[Append[Cases[idx,Index[FindClassFlavor[fld1],_]],Index[FindClassFlavor[fld2],newidx]],Index[MR$Null,_]]}, tp]; | 
|---|
| 329 |  | 
|---|
| 330 |  | 
|---|
| 331 | (* ::Subsection::Closed:: *) | 
|---|
| 332 | (*Main method to get the replacement rule 'bare field => renormalized field'*) | 
|---|
| 333 |  | 
|---|
| 334 |  | 
|---|
| 335 | (* ::Text:: *) | 
|---|
| 336 | (*The method starts by defining a unique sequence of indices that the given field carries.*) | 
|---|
| 337 | (*Then, all fields with which the given field can mix, at the loop-level, are determined.*) | 
|---|
| 338 | (*The renormalized field can then be computed, with off-diagonal terms corresponding to the potential mixing pattern.*) | 
|---|
| 339 | (*The results for the antifeld are then derived, and the replacement rule finally generated.*) | 
|---|
| 340 |  | 
|---|
| 341 |  | 
|---|
| 342 | RenormalizeField[field_]:= Block[{FreeIndices,SummedIndices,MixList,rfield=field,result,antiresult,newidx=Unique["idx"],spidx=Index[Spin,Unique["sp"]]}, | 
|---|
| 343 | (* 1. Indices *) | 
|---|
| 344 | FreeIndices=List@@PrePutIndices[field[Sequence@@Table[Unique["idx"],{Length[$IndList[field]]}]]]; | 
|---|
| 345 |  | 
|---|
| 346 | (* 2. Potiential mixing generated at the loop level *) | 
|---|
| 347 | If[AntiFieldQ[field]===True,rfield=anti[field]]; | 
|---|
| 348 | MixList=DeleteCases[PRIVATE`MR$ClassNameList,_?(UnphysicalQ[#]===True&)]; | 
|---|
| 349 | MixList=DeleteCases[ MixList,_?(DeleteCases[$IndList[#],Index[FindClassFlavor[#]]]=!=DeleteCases[$IndList[rfield],Index[FindClassFlavor[rfield]]]&)]; | 
|---|
| 350 | MixList=(DeleteCases[ MixList,_?( Through[MR$QuantumNumbers[#]]=!=Through[MR$QuantumNumbers[rfield]]&)]); | 
|---|
| 351 |  | 
|---|
| 352 | (* 3. Main routine *) | 
|---|
| 353 | result=(If[FermionQ[rfield]===True && GhostFieldQ[rfield]=!=True, | 
|---|
| 354 | ConstructDeltaZ[rfield,#, FreeIndices,newidx,"L"]*ProjM[FreeIndices[[1]],spidx] + ConstructDeltaZ[rfield,#,FreeIndices,newidx,"R"] * ProjP[FreeIndices[[1]],spidx], | 
|---|
| 355 | ConstructDeltaZ[rfield,#, FreeIndices,newidx]]* | 
|---|
| 356 | (#[Sequence@@DeleteCases[$IndList[#]/.(FreeIndices/.Index[a_,b_]:>Rule[Index[a],Index[a,b]])/.{Index[Spin,_]->spidx,Index[FindClassFlavor[#],___]->Index[FindClassFlavor[#],newidx]},Index[MR$Null,_]]]/.#[]->#) | 
|---|
| 357 | )&/@MixList; | 
|---|
| 358 | result=Expand[(rfield[Sequence@@FreeIndices]/.rfield[]->rfield )+Plus@@result/2]; | 
|---|
| 359 |  | 
|---|
| 360 | (* Majorana *) | 
|---|
| 361 | If[FermionQ[rfield]===True && SelfConjugateQ[field], result = Expand[result/.{FR$deltaZ[{a_,b_}, {{}}, "R"]:>FR$deltaZ[{a,b}, {{}}, "L"]}]]; | 
|---|
| 362 |  | 
|---|
| 363 | (* 4. Derivation of results for the antifield case *) | 
|---|
| 364 | antiresult=result; | 
|---|
| 365 | If[AntiFieldQ[field]===True, | 
|---|
| 366 | result=result/.{fld_?(FieldQ[#]===True&)->anti[fld],FR$deltaZ[args__]->Conjugate[FR$deltaZ[args]],ProjP[a_,b_]->ProjM[b,a],ProjM[a_,b_]->ProjP[b,a]}; | 
|---|
| 367 | result=Refine[result/.FR$deltaZ[{fi_?(AntiFieldQ[#]===True&),gi_?(AntiFieldQ[#]===True&)},bla___]:>FR$deltaZ[{anti[fi],anti[gi]},bla],Assumptions->Element[FR$CT,Reals]], | 
|---|
| 368 | (* else *) | 
|---|
| 369 | antiresult=result/.{fld_?(FieldQ[#]===True&)->anti[fld],FR$deltaZ[args__]->Conjugate[FR$deltaZ[args]],ProjP[a_,b_]->ProjM[b,a],ProjM[a_,b_]->ProjP[b,a]}; | 
|---|
| 370 | antiresult=Refine[antiresult/.FR$deltaZ[{fi_?(AntiFieldQ[#]===True&),gi_?(AntiFieldQ[#]===True&)},bla___]:>FR$deltaZ[{anti[fi],anti[gi]},bla],Assumptions->Element[FR$CT,Reals]] | 
|---|
| 371 | ]; | 
|---|
| 372 |  | 
|---|
| 373 | (* 5. Creating elements for the replacement rule *) | 
|---|
| 374 | SummedIndices=Union[Flatten[Complement[PRIVATE`ToIndexList[#]/.Index[_,a_]->a, FreeIndices/.Index[_,a_]->a]&/@List@@result]]; | 
|---|
| 375 | FreeIndices=#/.Index[a_,b_]:>Index[a,MyPattern[b,Blank[]]]&/@FreeIndices; | 
|---|
| 376 | rfield=field[Sequence@@FreeIndices]/.a_?(FieldQ[#]===True&)[]->a/.MyPattern->Pattern; | 
|---|
| 377 |  | 
|---|
| 378 | (* 6. Outputting the replacement rule *) | 
|---|
| 379 | result=If[field===anti[field], {MyRuleDelayed[rfield,MyModule[SummedIndices,result]]}, {MyRuleDelayed[rfield,MyModule[SummedIndices,result]],MyRuleDelayed[anti[rfield],MyModule[SummedIndices,antiresult]]}]; | 
|---|
| 380 | Return[result/.{MyRuleDelayed->RuleDelayed,MyModule[{},a_]->a}/.MyModule->Module]; | 
|---|
| 381 | ]; | 
|---|
| 382 |  | 
|---|
| 383 |  | 
|---|
| 384 | (* ::Subsection::Closed:: *) | 
|---|
| 385 | (*Expansion over flavors*) | 
|---|
| 386 |  | 
|---|
| 387 |  | 
|---|
| 388 | (* ::Text:: *) | 
|---|
| 389 | (*This perform a full flavor expansion in the rules (to get one rule for each flavor) and in the expression (to have no implicit summed flavor index in the rules)*) | 
|---|
| 390 | (*First, this method checks what is the flavor index of the bare field and makes this expansion.*) | 
|---|
| 391 | (*Next, it gets the summed flavor indices in the rules, and makes this flavor expasion.*) | 
|---|
| 392 |  | 
|---|
| 393 |  | 
|---|
| 394 | FlavorExpFieldReno[field_, rule_]:=Block[{myfield=field,flavtype,flavindex,nflavors,newfields={field},newrules={rule},kill}, | 
|---|
| 395 | (* we need the field name and not the antifield name *) | 
|---|
| 396 | If[AntiFieldQ[Head[field]], myfield=anti[field]]; | 
|---|
| 397 |  | 
|---|
| 398 | (* treatment of the flavor of the field *) | 
|---|
| 399 | If[PRIVATE`FlavoredQ[field], | 
|---|
| 400 | (* We get the type of flavor index, its range and the name of the index as it apepars in the replacement rule*) | 
|---|
| 401 | flavtype=ParticleClassFlavorType[ParticleClassName[Head[myfield]]]; | 
|---|
| 402 | flavindex=(Cases[List@@field, Index[flavtype,_]]/.Pattern->mypattern/.mypattern[a_,_]:>a)[[1]]; | 
|---|
| 403 | nflavors = IndexRange[Index[flavtype]][[-1]]; | 
|---|
| 404 |  | 
|---|
| 405 | (* from class to classmembers *) | 
|---|
| 406 | newfields=Table[ApplyDefinitions[field/.Index[flavtype,_]->Index[flavtype,ii]],{ii,nflavors}]/.fld_?(FieldQ[#]===True&)[]->fld; | 
|---|
| 407 | newrules=Table[ | 
|---|
| 408 | ApplyDefinitions[Refine[rule,Assumptions->Element[FR$CT,Reals]]/.flavindex->Index[flavtype,ii]/.FR$deltaZ[{a_,b_},{{Index[flavtype,ii],c___}},tp___]:>FR$deltaZ[{ClassMemberList[Head[myfield]][[ii]],b},{{c}},tp]], | 
|---|
| 409 | {ii,nflavors}]; | 
|---|
| 410 | newrules=newrules/.fld_?(FieldQ[#]===True&)[]->fld | 
|---|
| 411 | ]; | 
|---|
| 412 |  | 
|---|
| 413 | (* Treating the implicit sums *) | 
|---|
| 414 | newrules=newrules/.{ | 
|---|
| 415 | FR$deltaZ[{a_, cls_}, {{ix_}},tp___]*fld_[c___, ix_,d___]:>Plus@@Table[ApplyDefinitions[FR$deltaZ[{a, ClassMemberList[cls][[jj]]}, {{}},tp]*PrePutIndices[fld[c,jj,d]]],{jj,Length[ ClassMemberList[cls]]}]*kill[ix], | 
|---|
| 416 | Conjugate[FR$deltaZ[{a_, cl_}, {{ix_}},tp___]]*fld_[c___, ix_,d___]:>Plus@@Table[ApplyDefinitions[Conjugate[FR$deltaZ[{a,ClassMemberList[cl][[jj]]},{{}},tp]]*PrePutIndices[fld[c,jj,d]]],{jj,Length[ClassMemberList[cl]]}]*kill[ix] | 
|---|
| 417 | }/.fld_?(FieldQ[#]===True&)[]->fld/.kill[Index[_,a_]]->kill[a]; | 
|---|
| 418 | newrules=newrules/.{mymod[{a1___,ix_,a2___},bla_]:>mymod[{a1,a2},bla]/; Not[FreeQ[bla,kill[ix]]]}//.{kill[_]->1, mymod[{},bla_]->bla}; | 
|---|
| 419 |  | 
|---|
| 420 | (* output *) | 
|---|
| 421 | Return[Inner[RuleDelayed,newfields,newrules,List]/.mymod->Module]; | 
|---|
| 422 | ]; | 
|---|
| 423 |  | 
|---|
| 424 |  | 
|---|
| 425 | (* ::Subsection::Closed:: *) | 
|---|
| 426 | (*Field mixing*) | 
|---|
| 427 |  | 
|---|
| 428 |  | 
|---|
| 429 | (* ::Text:: *) | 
|---|
| 430 | (*This method removes potential loop-induced mixings if not needed.*) | 
|---|
| 431 | (*By default, all potential mixings are kept, except of FieldMixing is set to False or contains a list of 2-tuples representing all fields that can mix*) | 
|---|
| 432 |  | 
|---|
| 433 |  | 
|---|
| 434 | TreatFieldMixing[renorule_,mix_]:=Block[{right = (renorule/.Module->mod)[[2]]}, | 
|---|
| 435 |  | 
|---|
| 436 | (* Field mixing is not allowed *) | 
|---|
| 437 | If[mix===False,Return[myrd[renorule[[1]],right/.{FR$deltaZ[{a_,b_},__]:>0/;a=!=b}]/.myrd->RuleDelayed/.mod->Module]]; | 
|---|
| 438 |  | 
|---|
| 439 | (* Field mixing only allowed for specific fields *) | 
|---|
| 440 | Return[myrd[renorule[[1]],right/.{FR$deltaZ[{flds__},__]:>0/;(Not[MatchQ[{flds},{a_,a_}]]&& Not[MemberQ[Sort/@Flatten[Subsets[#,{2}]&/@mix,1],Sort[{flds}]]] )}]/.myrd->RuleDelayed/.mod->Module]; | 
|---|
| 441 |  | 
|---|
| 442 | ]; | 
|---|
| 443 |  | 
|---|
| 444 |  | 
|---|
| 445 | (* ::Subsection::Closed:: *) | 
|---|
| 446 | (*Tadpole renormalization*) | 
|---|
| 447 |  | 
|---|
| 448 |  | 
|---|
| 449 | TadpoleShift[vev_,field_]:=Block[{ShiftedField}, | 
|---|
| 450 | (* Sanity check *) | 
|---|
| 451 | If[Not[SelfConjugateQ[field]],Error["All fields getting a vev must be selfconjugate"];Abort[]]; | 
|---|
| 452 |  | 
|---|
| 453 | (* Getting the shift *) | 
|---|
| 454 | ShiftedField=Select[Expand[If[Im[Coefficient[field,vev]]===0,(field+HC[field])/.{vev->0},(field-HC[field])/.{vev->0}]],FieldQ[#]===True&]; | 
|---|
| 455 | CnumQ[FR$deltat[ShiftedField]]=False; | 
|---|
| 456 | Return[Rule[ShiftedField,ShiftedField-FR$CT*FR$deltat[ShiftedField]/Mass[ShiftedField]^2]]; | 
|---|
| 457 | ]; | 
|---|
| 458 |  | 
|---|
| 459 |  | 
|---|
| 460 | TadpoleShifts[fields_]:=Block[{RelevantFields = Select[fields,ScalarFieldQ[#]===True&],rules}, | 
|---|
| 461 | (*Sanity checks *) | 
|---|
| 462 | VevDeclarations[]; | 
|---|
| 463 |  | 
|---|
| 464 | (* Getting the field connected with the vevs and creating the rule; filtering all irrelevant fields*) | 
|---|
| 465 | rules=TadpoleShift[Sequence@@#]&/@({#[[2]],#[[1]]/.MR$Definitions}&/@M$vevs); | 
|---|
| 466 | Return[Select[rules,MemberQ[RelevantFields,#[[1]]]&]]; | 
|---|
| 467 | ]; | 
|---|
| 468 |  | 
|---|
| 469 |  | 
|---|
| 470 | DeltaMShifts[lag_]:=Block[{massterms,shifts,FR$delta2,shiftedlag}, | 
|---|
| 471 | (* Extracting the mass shift induced by the normalization procedure *) | 
|---|
| 472 | massterms =Select[lag,!FreeQ[#,FR$CT]&&FreeQ[#,FR$deltaZ]&& FreeQ[#,_?(GhostFieldQ[#]===True&)]&& FreeQ[#,_?(GoldstoneQ[#]===True&)]&& Length[GetFieldContent[#]]===2&]; | 
|---|
| 473 | If[massterms==={},massterms={{}}, $Output=OpenWrite[];massterms=(GetMassSpectrum[Plus@@massterms])[[1,2;;,{1,2}]];$Output={OutputStream["stdout",1]}]; | 
|---|
| 474 | shifts=Flatten[If[FreeQ[#,FR$delta],{},Solve[Simplify[#[[2]]/.{FR$deltat[_]->0,FR$delta->FR$delta2}]==#[[2]],{Cases[#[[2]],_FR$delta,\[Infinity]][[1]]}]/.FR$delta2->FR$delta]&/@massterms]; | 
|---|
| 475 |  | 
|---|
| 476 | (* Preparing the replacement rules and applying them *) | 
|---|
| 477 | shifts=Join[shifts, (Expand[#/.shifts]&/@Global`RenormalizationRules["Internals"][[1]])]; | 
|---|
| 478 | shifts=Select[shifts,!MemberQ[Global`RenormalizationRules["Internals"][[1,All,2]],#[[2]]]&]; | 
|---|
| 479 | shiftedlag =Expand[#/.shifts]&/@lag; | 
|---|
| 480 |  | 
|---|
| 481 | (* output *) | 
|---|
| 482 | Return[{shifts, PRIVATE`Listize[Expand[Plus@@shiftedlag]]}]; | 
|---|
| 483 | ]; | 
|---|
| 484 |  | 
|---|
| 485 |  | 
|---|
| 486 | (* ::Subsection:: *) | 
|---|
| 487 | (*Wrapper*) | 
|---|
| 488 |  | 
|---|
| 489 |  | 
|---|
| 490 | (* ::Text:: *) | 
|---|
| 491 | (*Loop over all relevant fields; the lagrangian must be properly formatted*) | 
|---|
| 492 |  | 
|---|
| 493 |  | 
|---|
| 494 | Renormalization["Fields", lag_, couplingorders_]:= Block[{fields, orderrules,myrule}, | 
|---|
| 495 | (* Relevant orders *) | 
|---|
| 496 | orderrules =myrule[#,1]&/@ Select[M$InteractionOrderHierarchy[[All,1]],Not[MemberQ[couplingorders,#]]&]; | 
|---|
| 497 |  | 
|---|
| 498 | (* Getting the fields involved in the interactions related to the coupling orders under consideration *) | 
|---|
| 499 | fields=Select[lag, Union[ | 
|---|
| 500 | Map[PRIVATE`GetIntOrder,If[ListQ[#],#,{#}]//.{ del[a_,_]->a,_?(FieldQ[#]===True&)[__]->1,Dot->Times,Index[_,i_]->i}]/.PRIVATE`GetIntOrder->IntOrder/.(orderrules/.myrule->Rule)]=!={1}&]; | 
|---|
| 501 | fields=Flatten[GetFieldContent/@fields]; | 
|---|
| 502 | fields=Union[If[AntiFieldQ[#],anti[#],#]&/@ DeleteCases[fields,_?(UnphysicalQ[#] || GhostFieldQ[#]===True &)]]; | 
|---|
| 503 | fields = Select[fields,!MemberQ[NoRenoFields,#]&]; | 
|---|
| 504 |  | 
|---|
| 505 | (* Renormalization *) | 
|---|
| 506 | fields = Flatten[RenormalizeField /@ fields]; | 
|---|
| 507 |  | 
|---|
| 508 | (* exiting the function *) | 
|---|
| 509 | Return[fields]; | 
|---|
| 510 | ]; | 
|---|
| 511 |  | 
|---|
| 512 |  | 
|---|
| 513 | (* ::Section:: *) | 
|---|
| 514 | (*Parameter renormalization*) | 
|---|
| 515 |  | 
|---|
| 516 |  | 
|---|
| 517 | (* ::Subsection::Closed:: *) | 
|---|
| 518 | (*Get replacement rules*) | 
|---|
| 519 |  | 
|---|
| 520 |  | 
|---|
| 521 | (* ::Text:: *) | 
|---|
| 522 | (*This method check whether some external parameters and internal parameters must be traded.  It then gets a formatted list for the switches.*) | 
|---|
| 523 | (*It also format the parameter names (matrix elements with things as "1x1" for the "1,1" element must be replaced by things like M[1,1])*) | 
|---|
| 524 |  | 
|---|
| 525 |  | 
|---|
| 526 | ParameterSwitchesAndSwaps[]:=Block[{switches1,switches2,renames}, | 
|---|
| 527 |  | 
|---|
| 528 | (* Getting and formatting the switches *) | 
|---|
| 529 | switches1=DeleteCases[FR$LoopSwitches/.Index[_,b_]->b/.MR$Restrictions,Rule[_,0]]; | 
|---|
| 530 | switches2=DeleteCases[FR$RmDblExt/.Index[_,b_]->b/.MR$Restrictions,Rule[_,0]]; | 
|---|
| 531 | renames = Reverse/@DeleteCases[Union[Rule[#[[1]],#[[2]]]&/@PRIVATE`$ParamListtemp],Rule[a_,a_]]/.Index[_,b_]->b; | 
|---|
| 532 |  | 
|---|
| 533 | (* output *) | 
|---|
| 534 | Return[{switches1,switches2,renames}]; | 
|---|
| 535 | ]; | 
|---|
| 536 |  | 
|---|
| 537 |  | 
|---|
| 538 | (* ::Subsection::Closed:: *) | 
|---|
| 539 | (*Main method to get the replacement rules 'bare parameter' to 'renormalized parameter'*) | 
|---|
| 540 |  | 
|---|
| 541 |  | 
|---|
| 542 | (* ::Text:: *) | 
|---|
| 543 | (*The method starts by getting all necessary switches (trade-of of external/internal parameters, etc...).*) | 
|---|
| 544 | (*Then we start the real business:*) | 
|---|
| 545 | (*   - we get the list of External parameters.*) | 
|---|
| 546 | (*   - we focus on the internal parameters and deduce the list of those that can appear in the bare Lagrangian*) | 
|---|
| 547 | (*   - we then get the list of masses to renormalize (removing those of the non QCD fields in the QCD case)*) | 
|---|
| 548 | (* Finally, we renormalize the external parameters (g -> g + delta g) and deduce the renormalization relations for the internal parameters.*) | 
|---|
| 549 |  | 
|---|
| 550 |  | 
|---|
| 551 | Renormalization["Parameters", fields_]:=Block[{switches, Externals,Internals, Masses, IntRules, ZeroRules,simplifs,myRule}, | 
|---|
| 552 | (* Getting the switches *) | 
|---|
| 553 | switches = ParameterSwitchesAndSwaps[]; | 
|---|
| 554 |  | 
|---|
| 555 | (* External parameters (without the masses and after applying the switches *) | 
|---|
| 556 | Externals=Sort[Flatten[EParamList[[All,2,All,2,1]]]]/.switches[[3]]/.Rule@@@switches[[1]]/.switches[[2]]; | 
|---|
| 557 | Externals=Select[Externals,Not[MemberQ[MassList[[2,All,2]],#]]&]; | 
|---|
| 558 | (CnumQ[FR$delta[{#},{}]]=CnumQ[#])&/@Externals; | 
|---|
| 559 |  | 
|---|
| 560 | (* Internal parameters (applying the switches where relevant) *) | 
|---|
| 561 | Internals = If[Global`EnforceZeros, | 
|---|
| 562 | DeleteCases[(Rule[#[[1]],#[[2]]]&/@IParamList)/.switches[[3]],Rule[_,0]], | 
|---|
| 563 | (Rule[#[[1]],#[[2]]]&/@IParamList)/.switches[[3]] | 
|---|
| 564 | ]; | 
|---|
| 565 | Internals=If[FreeQ[switches[[1,All,2]],#[[1]]],#,Solve[#[[1]]==(#[[2]]//.Internals),Cases[switches[[1]],{_,#[[1]]}][[1,1]] ][[1]]]&/@Internals; | 
|---|
| 566 | Internals=Join[switches[[2]],Flatten[Internals/.ConditionalExpression[a_,_]->a]/.switches[[2]]]; | 
|---|
| 567 | Internals = Rule[#[[1]],#[[2]]//.MR$Definitions]&/@Internals; | 
|---|
| 568 | Internals = Rule[#[[1]],#[[2]]//.Internals]&/@Internals; | 
|---|
| 569 |  | 
|---|
| 570 | (* Masses *) | 
|---|
| 571 | Masses=DeleteCases[Union[Mass/@fields],0]; | 
|---|
| 572 | (CnumQ[FR$delta[{#},{}]]=False)&/@Masses; | 
|---|
| 573 |  | 
|---|
| 574 | (* From bare parameters to renormalized parameters *) | 
|---|
| 575 | simplifs=Cases[SchemeRules/.Rule->myRule,myRule[_,0]]/.myRule->Rule; | 
|---|
| 576 | Externals=Rule[#,#+FR$CT*FR$delta[{#},{}]]&/@Externals; | 
|---|
| 577 | Masses=Rule[#,#+FR$CT*FR$delta[{#},{}]]&/@Masses; | 
|---|
| 578 | IntRules =Select[ Internals/.Join[Externals, Masses],Not[FreeQ[#,FR$CT]]&]; | 
|---|
| 579 | ZeroRules =Rule[FR$delta[{#},{}],0]&/@Select[ Internals/.Join[Externals, Masses],FreeQ[#,FR$CT]&][[All,1]]; | 
|---|
| 580 | Internals=Flatten[If[CnumQ[#], List[Rule[#,#+FR$CT*FR$delta[{#},{}]],Rule[Conjugate[#],Conjugate[#]+FR$CT*Conjugate[FR$delta[{#},{}]]]],Rule[#,#+FR$CT*FR$delta[{#},{}]]]&/@Internals[[All,1]]]; | 
|---|
| 581 | Internals=DeleteCases[Internals/.simplifs/.ZeroRules,Rule[a_,a_]]; | 
|---|
| 582 | Internals = Internals/.FR$delta[{Conjugate[aaa_]},{}]:>Conjugate[FR$delta[{aaa},{}]]; | 
|---|
| 583 | IntRules=If[FreeQ[#/.simplifs/.ZeroRules,FR$CT], | 
|---|
| 584 | Rule[#[[1]],#[[1]]], | 
|---|
| 585 | Rule[#[[1]],Expand[Normal[Series[#[[2]]/.simplifs,{FR$CT,0,1}]]/(Normal[Series[#[[2]],{FR$CT,0,0}]]/#[[1]])]]]&/@IntRules; | 
|---|
| 586 | IntRules = Rule[FR$delta[{#[[1]]},{}],Collect [#[[2]]-#[[1]],{ FR$delta[__]},Simplify]]/.FR$CT->1&/@IntRules; | 
|---|
| 587 |  | 
|---|
| 588 | (* Output *) | 
|---|
| 589 | Return[{(Externals/.simplifs),(Masses/.simplifs), Internals, IntRules}]; | 
|---|
| 590 | ]; | 
|---|
| 591 |  | 
|---|
| 592 |  | 
|---|
| 593 | (* ::Section:: *) | 
|---|
| 594 | (*Tools*) | 
|---|
| 595 |  | 
|---|
| 596 |  | 
|---|
| 597 | (* ::Subsection::Closed:: *) | 
|---|
| 598 | (*Get all renormalization constants*) | 
|---|
| 599 |  | 
|---|
| 600 |  | 
|---|
| 601 | (* ::Text:: *) | 
|---|
| 602 | (*Allow to extract all the possible renormalization constants of the *) | 
|---|
| 603 |  | 
|---|
| 604 |  | 
|---|
| 605 | ParameterRenormalizationConstants[]:= Block[{RenoPrms,RenoFields,dummy,tmplag}, | 
|---|
| 606 | {RenoPrms,dummy,dummy,dummy}=Renormalization["Parameters",{}]; | 
|---|
| 607 | RenoPrms = DeleteCases[Coefficient[#,FR$CT]&/@RenoPrms[[All,2]],Conjugate[__]]; | 
|---|
| 608 | RenoPrms = Join[FR$delta[{#},{}]&/@Union[MassList[[2,All,2]]],RenoPrms]; | 
|---|
| 609 | Return[Union[RenoPrms]]; | 
|---|
| 610 | ]; | 
|---|
| 611 |  | 
|---|
| 612 |  | 
|---|
| 613 | FieldRenormalizationConstants[lag_]:=Block[{dummy = Global`MoGRe$Debug, tmplag, RenoFields}, | 
|---|
| 614 | (* Verbose = off *) | 
|---|
| 615 | Global`MoGRe$Debug=False; | 
|---|
| 616 |  | 
|---|
| 617 | (* Lagrangian formatting *) | 
|---|
| 618 | tmplag = Expand[lag-(lag/.{(_?FieldQ)[__]->0,_?FieldQ->0})]; | 
|---|
| 619 | tmplag= FormattingLagrangian[tmplag,False][[1]]; | 
|---|
| 620 |  | 
|---|
| 621 | (* Constants *) | 
|---|
| 622 | RenoFields=Flatten[FlavorExpFieldReno[Sequence@@(#/.{Module->mymod})]&/@Renormalization["Fields",tmplag,OptionValue[Global`MoGRe$Renormalize,CouplingOrders]]]; | 
|---|
| 623 | If[OptionValue[Global`MoGRe$Renormalize,FlavorMixing]=!=True,RenoFields = TreatFieldMixing[#,OptionValue[Global`MoGRe$Renormalize,FlavorMixing]]&/@RenoFields]; | 
|---|
| 624 | RenoFields=Expand[Coefficient[#,FR$CT]]&/@RenoFields[[All,2]]; | 
|---|
| 625 | RenoFields=Union[DeleteCases[Select[Expand[#],!FreeQ[#,FR$deltaZ]&]&/@(RenoFields/.Plus->Sequence),Conjugate[_]]]; | 
|---|
| 626 |  | 
|---|
| 627 | (* Output and verbose set to default again *) | 
|---|
| 628 | Global`MoGRe$Debug = dummy; | 
|---|
| 629 | Return[RenoFields]; | 
|---|
| 630 | ]; | 
|---|
| 631 |  | 
|---|
| 632 |  | 
|---|
| 633 | RenormalizationConstants[lag_]:= InputForm[Join[FieldRenormalizationConstants[lag], ParameterRenormalizationConstants[]]]; | 
|---|
| 634 |  | 
|---|
| 635 |  | 
|---|
| 636 | (* ::Section:: *) | 
|---|
| 637 | (*Main method*) | 
|---|
| 638 |  | 
|---|
| 639 |  | 
|---|
| 640 | ShiftRules[]:= Block[{irules,rules}, | 
|---|
| 641 | irules = ExecuteRemovingInternalCst[]; | 
|---|
| 642 | rules = Join[Global`RenormalizationRules["Externals"],Global`RenormalizationRules["Masses"],Global`RenormalizationRules["Internals"][[2]],Global`RenormalizationRules["Fields"]]; | 
|---|
| 643 | Return[rules/.irules]; | 
|---|
| 644 | ]; | 
|---|
| 645 |  | 
|---|
| 646 |  | 
|---|
| 647 | Options[Global`MoGRe$Renormalize]={Exclude4Scalars->False,FlavorMixing->True, Global`CouplingOrders->M$InteractionOrderHierarchy[[All,1]], Global`CanonicalTwoPoints -> False}; | 
|---|
| 648 |  | 
|---|
| 649 |  | 
|---|
| 650 | Global`MoGRe$Renormalize[lag_, OptionsPattern[]]:=Block[{time=SessionTime[],lasttime,tmplag,lag4S, dum1, dum2,ishift,tmpCC}, | 
|---|
| 651 |  | 
|---|
| 652 | (* Initialization *) | 
|---|
| 653 | Welcome[]; | 
|---|
| 654 | If[Global`MoGRe$Debug,SubMethodStamp["Renormalize[]","initialization"]]; | 
|---|
| 655 | FR$Loop=True;                (*Keep two point in the vertex list*) | 
|---|
| 656 | CheckRenormalizeOptions["Mixing",OptionValue[FlavorMixing]]; | 
|---|
| 657 | CheckRenormalizeOptions["Couplings",OptionValue[CouplingOrders]]; | 
|---|
| 658 | tmplag = Expand[lag-(lag/.{(_?FieldQ)[__]->0,_?FieldQ->0})]; | 
|---|
| 659 | If[Global`EnforceZeros, tmplag = tmplag/.EnforceZeroParameters[]]; | 
|---|
| 660 | If[Global`MoGRe$Debug,lasttime=TimeStamp["Renormalize[]","initialization" ,time]]; | 
|---|
| 661 |  | 
|---|
| 662 | (* Formatting the Lagrangian *) | 
|---|
| 663 | If[Global`MoGRe$Debug,SubMethodStamp["Renormalize[]","Lagrangian formatting"]]; | 
|---|
| 664 | {tmplag,lag4S} = FormattingLagrangian[tmplag,OptionValue[Exclude4Scalars],OptionValue[CanonicalTwoPoints]]; | 
|---|
| 665 | If[Global`MoGRe$Debug,lasttime=TimeStamp["Renormalize[]","Lagrangian formatting" ,lasttime]]; | 
|---|
| 666 |  | 
|---|
| 667 | (* Field renormalization *) | 
|---|
| 668 | If[Global`MoGRe$Debug,SubMethodStamp["MoGRe$Renormalize[]","field renormalization"]]; | 
|---|
| 669 | DebugPrint["  ** Getting the replacement rules (bare into renormalized)"]; | 
|---|
| 670 | Global`RenormalizationRules["Fields"]=Flatten[FlavorExpFieldReno[Sequence@@(#/.{Module->mymod})]&/@Renormalization["Fields",tmplag, OptionValue[CouplingOrders]]]; | 
|---|
| 671 | If[OptionValue[FlavorMixing]=!=True, | 
|---|
| 672 | DebugPrint["  ** Removing unnecessary field mixing"]; | 
|---|
| 673 | Global`RenormalizationRules["Fields"] = TreatFieldMixing[#,OptionValue[FlavorMixing]]&/@Global`RenormalizationRules["Fields"]; | 
|---|
| 674 | ]; | 
|---|
| 675 | DebugPrint["  ** tadpole renormalization"]; | 
|---|
| 676 | Global`RenormalizationRules["Tadpoles"] = TadpoleShifts[If[Head[#]=!=Symbol, Head[#], #]&/@Global`RenormalizationRules["Fields"][[All,1]]]; | 
|---|
| 677 | If[Global`MoGRe$Debug,lasttime=TimeStamp["MoGRe$Renormalize[]","field renormalization" ,lasttime]]; | 
|---|
| 678 |  | 
|---|
| 679 | (* Parameter renormalization *) | 
|---|
| 680 | If[Global`MoGRe$Debug,SubMethodStamp["MoGRe$Renormalize[]","parameter renormalization"]]; | 
|---|
| 681 | DebugPrint["  ** Getting the replacement rules (bare into renormalized)"]; | 
|---|
| 682 | {Global`RenormalizationRules["Externals"],Global`RenormalizationRules["Masses"],dum2,dum1}=Renormalization["Parameters",If[Head[#]=!=Symbol, Head[#], #]&/@Global`RenormalizationRules["Fields"][[All,1]]]; | 
|---|
| 683 | Global`RenormalizationRules["Internals"]={dum1,dum2}; | 
|---|
| 684 | DebugPrint["  ** Enforcing the renormalization scheme"]; | 
|---|
| 685 | Global`RenormalizationRules["Externals"]= SchemeDependence[Global`RenormalizationRules["Externals"]]; | 
|---|
| 686 | Global`RenormalizationRules["Masses"]   = SchemeDependence[Global`RenormalizationRules["Masses"]]; | 
|---|
| 687 | Global`RenormalizationRules["Internals"]= SchemeDependenceInternal[Global`RenormalizationRules["Internals"]]; | 
|---|
| 688 | If[Global`MoGRe$Debug,lasttime=TimeStamp["MoGRe$Renormalize[]","parameter renormalization" ,lasttime]]; | 
|---|
| 689 |  | 
|---|
| 690 | (* Lagrangian (with a special treatment for charge-conjugate fields) *) | 
|---|
| 691 | If[Global`MoGRe$Debug,SubMethodStamp["MoGRe$Renormalize[]","Lagrangian renormalization"]]; | 
|---|
| 692 | DebugPrint["  ** Shifting parameters and fields"]; | 
|---|
| 693 | ishift = ShiftRules[]; | 
|---|
| 694 | tmplag = (#/.CC[fld_][inds__]:>tmpCC[fld[inds]]/.ishift/.Global`RenormalizationRules["Tadpoles"])&/@tmplag; | 
|---|
| 695 | tmplag =Normal[Series[(Expand[#/.tmpCC->CC/.Dot->FR$Dot/.FR$Dot->Dot]),{FR$CT,0,1}]]&/@tmplag; | 
|---|
| 696 | tmplag=PRIVATE`Listize[Expand[Plus@@tmplag]]; | 
|---|
| 697 | DebugPrint["  ** Absorbing all mass shifts in the renormalization constant"]; | 
|---|
| 698 | {Global`RenormalizationRules["MassShifts"],tmplag}=DeltaMShifts[tmplag]; | 
|---|
| 699 | tmplag = Collect[#,{FR$CT},Simplify]&/@tmplag; | 
|---|
| 700 | If[Global`MoGRe$Debug,lasttime=TimeStamp["MoGRe$Renormalize[]","Lagrangian renormalization" ,lasttime]]; | 
|---|
| 701 |  | 
|---|
| 702 | (* output *) | 
|---|
| 703 | Return[Plus@@Join[tmplag,lag4S]]; | 
|---|
| 704 | ]; | 
|---|