169 void DrawPDF(
const lst & amps,
string fn,
int nr,
bool single_page) {
172 for(
auto item : amps) amp_vec.push_back(item);
173 string tex_path = to_string(getpid()) +
"_TeX/";
174 if(!
dir_exists(tex_path)) rc = system((
"mkdir -p "+tex_path).c_str());
176 GiNaC_Parallel(amp_vec.size(), [&_vec,single_page,tex_path](
int idx)->ex {
177 auto amp = amp_vec[idx];
178 ofstream out(tex_path+to_string(idx)+
".tex");
179 out <<
"\\documentclass[tikz]{standalone}" << endl;
180 out <<
"\\usepackage{tikz-feynman}" << endl;
181 out <<
"\\tikzfeynmanset{compat=1.1.0}" << endl;
182 out <<
"\\begin{document}" << endl;
183 out <<
"\\feynmandiagram{" << endl;
184 auto lines = TopoLines(amp);
186 map<ex,int,ex_is_less> tot_bend_map;
187 for(auto l : lines) {
188 lst ll = lst{l.op(0), l.op(1)};
193 map<ex,int,ex_is_less> bend_map;
194 std::map<ex,int,ex_is_less> vtex_map;
195 for(
auto l : lines) {
196 lst ll = lst{l.op(0), l.op(1)};
197 bool isExt = (is_a<numeric>(ll.op(0)) && ll.op(0)<0) || (is_a<numeric>(ll.op(1)) && ll.op(1)<0);
200 bool ll_same = oll.is_equal(ll);
203 auto fidL = (is_a<numeric>(l.op(1)) ? l.op(1) : l.op(1).op(0));
204 out <<
"\"" << fidL <<
"\"";
210 }
else if(vtex_map[l.op(1).op(1)]==0) {
211 out <<
VerTeX[l.op(1).op(1)];
212 vtex_map[l.op(1).op(1)]=1;
216 auto f = l.op(2).op(0);
220 auto cpos =
LineTeX[f].find(
", edge");
221 if(cpos>0) out <<
LineTeX[f].substr(0,cpos);
225 if(tot_bend_map[ll]>1) {
226 if((tot_bend_map[ll]%2)==0) {
227 if((bend_map[ll]%2)==0) {
228 if(ll_same) out <<
",half right";
229 else out <<
",half left";
231 if(ll_same) out <<
",half left";
232 else out <<
",half right";
234 }
else if(bend_map[ll]>2) {
235 if((bend_map[ll]%2)==0) {
236 if(ll_same) out <<
",half right";
237 else out <<
",half left";
239 if(ll_same) out <<
",half left";
240 else out <<
",half right";
244 if(is_zero(l.op(0)-l.op(1))) out <<
",loop,distance=2cm";
247 auto fidR = (is_a<numeric>(l.op(0)) ? l.op(0) : l.op(0).op(0));
248 out <<
" \"" << fidR <<
"\"";
254 }
else if(vtex_map[l.op(0).op(1)]==0) {
255 out <<
VerTeX[l.op(0).op(1)];
256 vtex_map[l.op(0).op(1)]=1;
261 out <<
"\\end{document}" << endl;
263 auto rc = system((
"cd "+tex_path+
" && echo X | lualatex " + to_string(idx) +
" 1>/dev/null").c_str());
267 ofstream out(tex_path+
"diagram.tex");
269 out <<
"\\let\\mypdfximage\\pdfximage" << endl;
270 out <<
"\\def\\pdfximage{\\immediate\\mypdfximage}" << endl;
271 out <<
"\\documentclass{standalone}" << endl;
273 out <<
"\\documentclass{article}" << endl;
275 out <<
"\\usepackage{graphicx}" << endl;
276 out <<
"\\usepackage{adjustbox}" << endl;
277 out <<
"\\usepackage{longtable}" << endl;
278 out <<
"\\usepackage{scalefnt}" << endl;
279 out <<
"\\begin{document}" << endl;
282 out <<
"\\begin{adjustbox}{valign=T,width=\\textwidth}" << endl;
283 out <<
"\\begin{tabular}{|";
for(
int i=0; i<nr; i++) out <<
"cc|"; out <<
"}" << endl;
285 out <<
"\\setlength\\LTleft{-2.5cm} \\setlength\\LTright{0pt}" << endl;
286 out <<
"\\begin{longtable}{|";
for(
int i=0; i<nr; i++) out <<
"cc|"; out <<
"}" << endl;
288 out <<
"\\hline" << endl;
289 int total = amps.nops();
291 if((total%nr)!=0) total = (total/nr+1)*nr;
292 for(
int i=0; i<total; i++) {
301 out <<
"{\\tiny " << i+1 <<
"}&" << endl;
303 out <<
"\\includegraphics[keepaspectratio,";
304 out <<
"height=" << 1.0/nr <<
"\\textwidth,";
305 out <<
"width=" << 1.0/nr <<
"\\textwidth]";
306 out <<
"{"<<i<<
".pdf}" << endl;
308 if((i+1)%nr==0) out <<
"\\\\ \\hline";
312 out <<
"\\end{tabular}" << endl;
313 out <<
"\\end{adjustbox}" << endl;
315 out <<
"\\end{longtable}" << endl;
317 out <<
"\\end{document}" << endl;
319 if(
Debug) rc = system((
"ulimit -n unlimited > /dev/null; cd "+tex_path+
" && pdflatex diagram && mv diagram.pdf ../"+fn).c_str());
320 else rc = system((
"ulimit -n unlimited > /dev/null; cd "+tex_path+
" && echo X | pdflatex diagram 1>/dev/null && mv diagram.pdf ../"+fn).c_str());
323 cout <<
"DrawPDF failed, files not removed, please check the TeX files!" << endl;
324 cout <<
"latex command: pdflatex diagram.tex" << endl;
325 cout <<
"if there are many pdf files, one needs ulimint -n <large number>." << endl;
328 rc = system((
"rm -r "+tex_path).c_str());
341 if(prop.nops()<1)
throw Error(
"ShrinkCut: no cut provided!");
344 for(
int i=0; i<tls.nops(); i++) {
345 auto pi = tls.op(i).op(2);
346 if(pi.nops()<2)
continue;
347 if(!is_a<lst>(prop.op(0))) {
348 if(is_zero(pi.op(0)-prop.op(0)) && is_zero(pi.op(1)-prop.op(1))) cls_vec.push_back(i);
350 for(
auto iprop : prop) {
351 if(is_zero(pi.op(0)-iprop.op(0)) && is_zero(pi.op(1)-iprop.op(1))) cls_vec.push_back(i);
355 if(cls_vec.size()<n)
return ret;
357 Combinations(cls_vec.size(), n, [n,&ret,cls_vec,tls](
const int * is)->void {
359 for(int i=0; i<n; i++) cls[i] = cls_vec[is[i]];
364 auto ol = tls2.op(ci);
365 tls2[ci] = lst{ol.op(0), 0, lst{ol.op(2).op(0)}, ol.op(3)};
366 tls2.append(lst{0, ol.op(1), lst{ol.op(2).op(1)}, ol.op(3)} );
371 int ntls2 = tls2.nops();
374 for(
int i=last; i<ntls2; i++) {
375 auto li = tls2.op(i);
376 if(is_zero(li) || li.op(2).nops()<2)
continue;
382 if(is_zero(lp))
break;
384 for(
int i=0; i<ntls2; i++) {
385 if(is_zero(tls2.op(i)))
continue;
386 if(is_zero(tls2.op(i).op(0)-lp.op(0))) tls2[i][0] = lp.op(1);
387 if(is_zero(tls2.op(i).op(1)-lp.op(0))) tls2[i][1] = lp.op(1);
392 map<int, lst> con_map;
393 for(
auto li : tls2) {
394 if(is_zero(li))
continue;
397 if(is_a<lst>(fiL)) fiL = fiL.op(0);
399 if(is_a<lst>(fiR)) fiR = fiR.op(0);
401 con_map[ex_to<numeric>(fiL).to_int()].append(fiR);
402 }
else if(fiR>0 && fiL<0) {
403 con_map[ex_to<numeric>(fiR).to_int()].append(fiL);
405 if(fiL>0 && is_zero(fiR)) key = fiL;
406 else if(fiR>0 && is_zero(fiL)) key = fiR;
407 else throw Error(
"ShrinkCut: unexpcected point reached.");
408 val = li.op(2).op(0);
409 con_map[ex_to<numeric>(key).to_int()].append(val);
414 for(
auto kv : con_map) item.append(kv.second.sort());
817 ex Models::FeynRulesSM(
const ex & amp,
const ex & xi) {
818 if(is_a<lst>(amp))
return FeynRulesSM(ex_to<lst>(amp), xi);
823 static ex CW2 = CW*CW;
824 static ex SW2 = SW*SW;
825 static ex C2W = CW2-SW2;
828 static Symbol Ubar(
"Ubar");
830 static Symbol Dbar(
"Dbar");
832 static Symbol Cbar(
"Cbar");
834 static Symbol Sbar(
"Sbar");
836 static Symbol Tbar(
"Tbar");
838 static Symbol Bbar(
"Bbar");
842 static Symbol ghbar(
"ghbar");
850 static Symbol ghAbar(
"ghAbar");
851 static Symbol ghWm(
"ghWm");
852 static Symbol ghWmbar(
"ghWmbar");
853 static Symbol ghWp(
"ghWp");
854 static Symbol ghWpbar(
"ghWpbar");
856 static Symbol ghZbar(
"ghZbar");
861 static Symbol nebar(
"nebar");
865 static Symbol nmubar(
"nmubar");
866 static Symbol taum(
"taum");
867 static Symbol taup(
"taup");
868 static Symbol ntau(
"ntau");
869 static Symbol ntaubar(
"ntaubar");
872 static Symbol phim(
"phim");
873 static Symbol phip(
"phip");
876 static auto M = [](
const string & si)->ex {
879 static ex MW = M(
"W");
880 static ex MZ = M(
"Z");
881 static ex MH = M(
"H");
885 static ex eta_s = -1;
888 static ex eta_prime = -1;
890 static ex eta_theta = 1;
892 static ex eta_e = -1;
895 static ex GEW = eta_e*eta*eta_theta * EL/SW;
896 static ex EL2 = EL*EL;
897 static ex MW2 = MW*MW;
898 static ex MZ2 = MZ*MZ;
899 static ex MH2 = MH*MH;
900 static ex GEW2 = GEW*GEW;
901 static ex sqrt2 = sqrt(ex(2));
904 T3[
"U"] = T3[
"C"] = T3[
"T"] = ex(1)/2;
905 T3[
"D"] = T3[
"S"] = T3[
"B"] = -ex(1)/2;
906 T3[
"ne"] = T3[
"nmu"] = T3[
"ntau"] = ex(1)/2;
907 T3[
"em"] = T3[
"mum"] = T3[
"taum"] = -ex(1)/2;
908 T3[
"ep"] = T3[
"mup"] = T3[
"taup"] = -ex(1)/2;
911 Q[
"U"] = Q[
"C"] = Q[
"T"] = ex(2)/3;
912 Q[
"D"] = Q[
"S"] = Q[
"B"] = -ex(1)/3;
913 Q[
"ne"] = Q[
"nmu"] = Q[
"ntau"] = 0;
914 Q[
"em"] = Q[
"mum"] = Q[
"taum"] = -1;
915 Q[
"ep"] = Q[
"mup"] = Q[
"taup"] = -1;
917 auto is_qbar_q = [&](
const ex pi1,
const ex pi2)->
bool {
918 return (pi1==Ubar && pi2==U) || (pi1==Dbar && pi2==D) || (pi1==Cbar && pi2==C) || (pi1==Sbar && pi2==S) || (pi1==Tbar && pi2==T) || (pi1==Bbar && pi2==B);
920 auto is_lbar_l = [&](
const ex pi1,
const ex pi2)->
bool {
921 return (pi1==
ep && pi2==em) || (pi1==mup && pi2==mum) || (pi1==taup && pi2==taum);
923 auto is_lbar_n = [&](
const ex pi1,
const ex pi2)->
bool {
924 return (pi1==
ep && pi2==ne) || (pi1==mup && pi2==nmu) || (pi1==taup && pi2==ntau);
926 auto is_nbar_n = [&](
const ex pi1,
const ex pi2)->
bool {
927 return (pi1==nebar && pi2==ne) || (pi1==nmubar && pi2==nmu) || (pi1==ntaubar && pi2==ntau);
929 auto is_nbar_l = [&](
const ex pi1,
const ex pi2)->
bool {
930 return (pi1==nebar && pi2==em) || (pi1==nmubar && pi2==mum) || (pi1==ntaubar && pi2==taum);
932 auto is_uqbar = [&](
const ex pi)->
bool {
933 return (pi==Ubar) || (pi==Cbar) || (pi==Tbar);
935 auto is_uq = [&](
const ex pi)->
bool {
936 return (pi==U) || (pi==C) || (pi==T);
938 auto is_dqbar = [&](
const ex pi)->
bool {
939 return (pi==Dbar) || (pi==Sbar) || (pi==Bbar);
941 auto is_dq = [&](
const ex pi)->
bool {
942 return (pi==D) || (pi==S) || (pi==B);
944 auto is_uqbar_dq = [&](
const ex pi1,
const ex pi2)->
bool {
945 return is_uqbar(pi1) && is_dq(pi2);
947 auto is_dqbar_uq = [&](
const ex pi1,
const ex pi2)->
bool {
948 return is_dqbar(pi1) && is_uq(pi2);
950 auto CKM = [&](
const string & si1,
const string & si2)->ex {
951 return Symbol(
"V"+si1+si2);
954 auto gfV = [&](
const string & si)->ex {
955 return T3[si]/2-Q[si]*SW2;
957 auto gfA = [&](
const string & si)->ex {
964 auto pi = e.op(0).op(0);
966 if(pi==U || pi==D || pi==C || pi==S || pi==T || pi==B) {
982 }
else if(pi==ghWm || pi==ghWp) {
984 }
else if(pi==em || pi==mum || pi==taum) {
986 }
else if(pi==ne || pi==nmu || pi==ntau) {
992 }
else if(pi==phim) {
995 cout << endl << e << endl;
996 throw Error(
"Propagator Not defined!");
999 auto pi1 = e.op(0).op(0);
1000 auto pi2 = e.op(1).op(0);
1001 auto pi3 = e.op(2).op(0);
1002 auto fi1 = e.op(0).op(1);
1003 auto fi2 = e.op(1).op(1);
1004 auto fi3 = e.op(2).op(1);
1005 auto mom1 = e.op(0).op(2);
1006 auto mom2 = e.op(1).op(2);
1007 auto mom3 = e.op(2).op(2);
1017 if(pi1==ghbar && pi2==gh && pi3==g) {
1020 }
else if(pi1==g && pi2==g && pi3==g) {
1023 }
else if((pi3==g) && is_qbar_q(pi1, pi2)) {
1026 }
else if((pi3==A) && is_qbar_q(pi1, pi2)) {
1029 }
else if((pi3==A) && is_lbar_l(pi1, pi2)) {
1032 }
else if((pi3==Z) && is_qbar_q(pi1, pi2)) {
1034 return -I*eta*eta_Z*GEW/CW*(gfV(si)*GMat(
GAS(
LI(fi3)),
DI(fi1),
DI(fi2))-gfA(si)*GMat(
GAS(
LI(fi3))*
GAS(5),
DI(fi1),
DI(fi2)))*
SP(
TI(fi1),
TI(fi2));
1035 }
else if((pi3==Z) && (is_lbar_l(pi1, pi2) || is_nbar_n(pi1, pi2))) {
1037 return -I*eta*eta_Z*GEW/CW*(gfV(si)*GMat(
GAS(
LI(fi3)),
DI(fi1),
DI(fi2))-gfA(si)*GMat(
GAS(
LI(fi3))*
GAS(5),
DI(fi1),
DI(fi2)));
1038 }
else if(pi1==Wp && pi2==Wm && pi3==A) {
1040 return -I*eta_e*EL*(
SP(
LI(fi1),
LI(fi2))*
SP(mom2-mom1,
LI(fi3))+
SP(
LI(fi2),
LI(fi3))*
SP(mom3-mom2,
LI(fi1))+
SP(
LI(fi3),
LI(fi1))*
SP(mom1-mom3,
LI(fi2)));
1041 }
else if(pi1==Wp && pi2==Wm && pi3==Z) {
1043 return -I*eta*eta_Z*GEW*CW*(
SP(
LI(fi1),
LI(fi2))*
SP(mom2-mom1,
LI(fi3))+
SP(
LI(fi2),
LI(fi3))*
SP(mom3-mom2,
LI(fi1))+
SP(
LI(fi3),
LI(fi1))*
SP(mom1-mom3,
LI(fi2)));
1044 }
else if(is_uqbar(pi1) && is_dq(pi2) && pi3==Wp) {
1046 auto ckm = CKM(si1, si2);
1048 }
else if(is_dqbar(pi1) && is_uq(pi2) && pi3==Wm) {
1050 auto ckm = CKM(si1, si2);
1052 }
else if( (is_nbar_l(pi1, pi2) && pi3==Wp) || (is_lbar_n(pi1, pi2) && pi3==Wm) ) {
1054 return -I*eta*GEW/sqrt2*GMat(
GAS(
LI(fi3))-
GAS(
LI(fi3))*
GAS(5),
DI(fi1),
DI(fi2))/2;
1055 }
else if(is_qbar_q(pi1, pi2) && (pi3==H)) {
1057 return -I*GEW/2*M(si)/MW*GMat(
GAS(1),
DI(fi1),
DI(fi2))*
SP(
TI(fi1),
TI(fi2));
1058 }
else if( (is_lbar_l(pi1, pi2) || is_nbar_n(pi1, pi2)) && (pi3==H)) {
1060 return -I*GEW/2*M(si)/MW*GMat(
GAS(1),
DI(fi1),
DI(fi2));
1061 }
else if(is_qbar_q(pi1, pi2) && (pi3==chi)) {
1063 return -GEW*T3[si]*M(si)/MW*GMat(
GAS(5),
DI(fi1),
DI(fi2))*
SP(
TI(fi1),
TI(fi2));
1064 }
else if( (is_lbar_l(pi1, pi2) || is_nbar_n(pi1, pi2)) && (pi3==chi)) {
1066 return -GEW*T3[si]*M(si)/MW*GMat(
GAS(5),
DI(fi1),
DI(fi2));
1067 }
else if(is_uqbar_dq(pi1, pi2) && pi3==phip) {
1069 auto ckm = CKM(si1,si2);
1070 return I*GEW/sqrt2*(M(si1)/MW*GMat(
GAS(1)-
GAS(5),
DI(fi1),
DI(fi2))/2-M(si2)/MW*GMat(
GAS(1)+
GAS(5),
DI(fi1),
DI(fi2))/2)*ckm*
SP(
TI(fi1),
TI(fi2));
1071 }
else if(is_dqbar_uq(pi1, pi2) && pi3==phim) {
1073 auto ckm = CKM(si1,si2);
1074 return I*GEW/sqrt2*(M(si2)/MW*GMat(
GAS(1)+
GAS(5),
DI(fi1),
DI(fi2))/2-M(si1)/MW*GMat(
GAS(1)-
GAS(5),
DI(fi1),
DI(fi2))/2)*ckm*
SP(
TI(fi1),
TI(fi2));
1075 }
else if(is_nbar_l(pi1, pi2) && pi3==phip) {
1077 return -I*GEW/sqrt2*M(si2)/MW*GMat(
GAS(1)+
GAS(5),
DI(fi1),
DI(fi2))/2;
1078 }
else if(is_lbar_n(pi1, pi2) && pi3==phim) {
1080 return -I*GEW/sqrt2*M(si1)/MW*GMat(
GAS(1)-
GAS(5),
DI(fi1),
DI(fi2))/2;
1081 }
else if(pi1==A && pi2==phip && pi3==phim) {
1083 return -I*eta_e*EL*
SP(mom2-mom3,
LI(fi1));
1084 }
else if(pi1==Z && pi2==phip && pi3==phim) {
1086 return -I*eta*eta_Z*GEW*C2W/(2*CW)*
SP(mom2-mom3,
LI(fi1));
1087 }
else if(pi1==Wp && pi2==phim && pi3==H) {
1089 return I/2*eta*GEW*
SP(mom2-mom3,
LI(fi1));
1090 }
else if(pi1==Wm && pi2==phip && pi3==H) {
1092 return -I/2*eta*GEW*
SP(mom2-mom3,
LI(fi1));
1093 }
else if( ((pi1==Wp && pi2==phim) || (pi1==Wm && pi2==phip)) && pi3==chi) {
1095 return -eta*GEW/2*
SP(mom2-mom3,
LI(fi1));
1096 }
else if(pi1==Z && pi2==chi && pi3==H) {
1098 return -eta*eta_Z*GEW/(2*CW)*
SP(mom2-mom3,
LI(fi1));
1099 }
else if( ((pi1==phim && pi2==Wp) || (pi1==phip && pi2==Wm)) && pi3==A) {
1101 return I*eta_e*eta*EL*MW*
SP(
LI(fi2),
LI(fi3));
1102 }
else if( ((pi1==phim && pi2==Wp) || (pi1==phip && pi2==Wm)) && pi3==Z) {
1104 return -I*eta_Z*GEW*MZ*SW2*
SP(
LI(fi2),
LI(fi3));
1105 }
else if(pi1==H && pi2==Wp && pi3==Wm) {
1107 return I*GEW*MW*
SP(
LI(fi2),
LI(fi3));
1108 }
else if(pi1==H && pi2==Z && pi3==Z) {
1110 return I*GEW/CW*MZ*
SP(
LI(fi2),
LI(fi3));
1111 }
else if(pi1==H && pi2==phim && pi3==phip) {
1113 return -I/2*GEW*MH2/MW;
1114 }
else if(pi1==H && pi2==H && pi3==H) {
1116 return -3/ex(2)*I*GEW*MH2/MW;
1117 }
else if(pi1==H && pi2==chi && pi3==chi) {
1119 return -I/2*GEW*MH2/MW;
1120 }
else if(pi1==ghWpbar && pi2==ghWp && pi3==A) {
1122 return I*eta_G*eta_e*EL*
SP(mom1,
LI(fi3));
1123 }
else if(pi1==ghWmbar && pi2==ghWm && pi3==A) {
1125 return -I*eta_G*eta_e*EL*
SP(mom1,
LI(fi3));
1126 }
else if(pi1==ghWpbar && pi2==ghWp && pi3==Z) {
1128 return I*eta_G*eta*eta_Z*GEW*CW*
SP(mom1,
LI(fi3));
1129 }
else if(pi1==ghWmbar && pi2==ghWm && pi3==Z) {
1131 return -I*eta_G*eta*eta_Z*GEW*CW*
SP(mom1,
LI(fi3));
1132 }
else if(pi1==ghWpbar && pi2==ghZ && pi3==Wp) {
1134 return -I*eta_G*eta*eta_Z*GEW*CW*
SP(mom1,
LI(fi3));
1135 }
else if(pi1==ghWmbar && pi2==ghZ && pi3==Wm) {
1137 return I*eta_G*eta*eta_Z*GEW*CW*
SP(mom1,
LI(fi3));
1138 }
else if(pi1==ghWpbar && pi2==ghA && pi3==Wp) {
1140 return -I*eta_G*eta_e*EL*
SP(mom1,
LI(fi3));
1141 }
else if(pi1==ghWmbar && pi2==ghA && pi3==Wm) {
1143 return I*eta_G*eta_e*EL*
SP(mom1,
LI(fi3));
1144 }
else if(pi1==ghZbar && pi2==ghWp && pi3==Wm) {
1146 return -I*eta_G*eta*GEW*CW*
SP(mom1,
LI(fi3));
1147 }
else if(pi1==ghZbar && pi2==ghWm && pi3==Wp) {
1149 return I*eta_G*eta*GEW*CW*
SP(mom1,
LI(fi3));
1150 }
else if(pi1==ghAbar && pi2==ghWp && pi3==Wm) {
1152 return -I*eta_G*eta_e*EL*
SP(mom1,
LI(fi3));
1153 }
else if(pi1==ghAbar && pi2==ghWm && pi3==Wp) {
1155 return I*eta_G*eta_e*EL*
SP(mom1,
LI(fi3));
1156 }
else if(pi1==ghWpbar && pi2==ghWp && pi3==chi) {
1158 return eta_G*GEW/2*xi*MW;
1159 }
else if(pi1==ghWmbar && pi2==ghWm && pi3==chi) {
1161 return -eta_G*GEW/2*xi*MW;
1162 }
else if( ((pi1==ghWpbar && pi2==ghWp) ||(pi1==ghWmbar && pi2==ghWm)) && pi3==H) {
1164 return -I/2*eta_G*GEW*xi*MW;
1165 }
else if(pi1==ghZbar && pi2==ghZ && pi3==H) {
1167 return -eta_G*I*GEW/(2*CW)*xi*MZ;
1168 }
else if( pi1==ghZbar && ((pi2==ghWp && pi3==phim) || (pi2==ghWm && pi3==phip)) ) {
1170 return I/2*eta_G*eta_Z*GEW*xi*MZ;
1171 }
else if( ((pi1==ghWpbar && pi3==phip) || (pi1==ghWmbar && pi3==phim)) && pi2==ghZ) {
1173 return -I*eta_G*eta_Z*GEW*C2W/(2*CW)*xi*MW;
1174 }
else if( ((pi1==ghWpbar && pi3==phip) || (pi1==ghWmbar && pi3==phim)) && pi2==ghA) {
1176 return -I*eta_G*eta_e*eta*EL*xi*MW;
1178 cout << endl << e << endl;
1179 throw Error(
"Vertex Not defined!");
1182 auto pi4 = e.op(3).op(0);
1183 auto fi4 = e.op(3).op(1);
1184 auto mom4 = e.op(3).op(2);
1186 if(pi1==g && pi2==g && pi3==g && pi4==g) {
1189 }
else if(pi1==Wp && pi2==Wm && pi3==A && pi4==A) {
1192 }
else if(pi1==Wp && pi2==Wm && pi3==Z && pi4==Z) {
1195 }
else if(pi1==Wp && pi2==Wm && pi3==A && pi4==Z) {
1198 }
else if(pi1==Wp && pi2==Wp && pi3==Wm && pi4==Wm) {
1201 }
else if(pi1==Wp && pi2==Wm && pi3==H && pi4==H) {
1203 return I/2*GEW2*
SP(
LI(fi1),
LI(fi2));
1204 }
else if(pi1==Wp && pi2==Wm && pi3==chi && pi4==chi) {
1206 return I/2*GEW2*
SP(
LI(fi1),
LI(fi2));
1207 }
else if(pi1==Z && pi2==Z && pi3==H && pi4==H) {
1209 return I/2*GEW2/CW2*
SP(
LI(fi1),
LI(fi2));
1210 }
else if(pi1==Z && pi2==Z && pi3==chi && pi4==chi) {
1212 return I/2*GEW2/CW2*
SP(
LI(fi1),
LI(fi2));
1213 }
else if(pi1==A && pi2==A && pi3==phip && pi4==phim) {
1215 return 2*I*EL2*
SP(
LI(fi1),
LI(fi2));
1216 }
else if(pi1==Z && pi2==Z && pi3==phip && pi4==phim) {
1218 return I/2*pow(GEW*C2W/CW,2)*
SP(
LI(fi1),
LI(fi2));
1219 }
else if(pi1==Wp && pi2==Wm && pi3==phip && pi4==phim) {
1221 return I/2*GEW2*
SP(
LI(fi1),
LI(fi2));
1222 }
else if( ((pi1==Wp && pi3==phim) || (pi1==Wm && pi3==phip)) && pi2==Z && pi4==H) {
1224 return -I*eta_Z*GEW2*SW2/(2*CW)*
SP(
LI(fi1),
LI(fi2));
1225 }
else if(pi1==Wm && pi2==Z && pi3==phip && pi4==chi) {
1227 return -eta_Z*GEW2*SW2/(2*CW)*
SP(
LI(fi1),
LI(fi2));
1228 }
else if(pi1==Wp && pi2==Z && pi3==phim && pi4==chi) {
1230 return eta_Z*GEW2*SW2/(2*CW)*
SP(
LI(fi1),
LI(fi2));
1231 }
else if( ((pi1==Wm && pi3==phip) || (pi1==Wp && pi3==phim)) && pi2==A && pi4==H) {
1233 return I/2*eta_e*eta*EL*GEW*
SP(
LI(fi1),
LI(fi2));
1234 }
else if(pi1==Wp && pi2==A && pi3==phim && pi4==chi) {
1236 return -1/ex(2)*eta_e*eta*EL*GEW*
SP(
LI(fi1),
LI(fi2));
1237 }
else if(pi1==Wm && pi2==A && pi3==phip && pi4==chi) {
1239 return 1/ex(2)*eta_e*eta*EL*GEW*
SP(
LI(fi1),
LI(fi2));
1240 }
else if(pi1==Z && pi2==A && pi3==phip && pi4==phim) {
1242 return I*eta_e*eta*eta_Z*EL*GEW*C2W/CW*
SP(
LI(fi1),
LI(fi2));
1243 }
else if(pi1==phim && pi2==phip && pi3==phim && pi4==phip) {
1245 return -I/2*GEW2*MH2/MW2;
1246 }
else if(pi1==H && pi2==H && pi3==phim && pi4==phip) {
1248 return -I/4*GEW2*MH2/MW2;
1249 }
else if(pi1==chi && pi2==chi && pi3==phim && pi4==phip) {
1251 return -I/4*GEW2*MH2/MW2;
1252 }
else if(pi1==H && pi2==H && pi3==H && pi4==H) {
1254 return -3/ex(4)*I*GEW2*MH2/MW2;
1255 }
else if(pi1==H && pi2==H && pi3==chi && pi4==chi) {
1257 return -I/4*GEW2*MH2/MW2;
1258 }
else if(pi1==chi && pi2==chi && pi3==chi && pi4==chi) {
1260 return -3/ex(4)*I*GEW2*MH2/MW2;
1262 cout << endl << e << endl;
1263 throw Error(
"Vertex Not defined!");
1266 cout << endl << e << endl;
1267 throw Error(
"Vertex Not defined!");
1269 }
else return e.map(self);