Index: trunk/omega/tests/Makefile.am =================================================================== --- trunk/omega/tests/Makefile.am (revision 8415) +++ trunk/omega/tests/Makefile.am (revision 8416) @@ -1,914 +1,961 @@ # Makefile.am -- Makefile for O'Mega within and without WHIZARD ## ## Process this file with automake to produce Makefile.in ## ######################################################################## # # Copyright (C) 1999-2020 by # Wolfgang Kilian # Thorsten Ohl # Juergen Reuter # with contributions from # cf. main AUTHORS file # # WHIZARD is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # WHIZARD is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ######################################################################## SUBDIRS = UFO DIST_SUBDIRS = UFO # OMEGA_SPLIT = -target:single_function OMEGA_SPLIT = -target:split_function 10 # OMEGA_SPLIT = -target:split_module 10 # OMEGA_SPLIT = -target:split_file 10 OMEGA_QED = $(top_builddir)/omega/bin/omega_QED$(OCAML_NATIVE_EXT) OMEGA_QED_OPTS = $(OMEGA_SPLIT) -target:parameter_module parameters_QED OMEGA_QCD = $(top_builddir)/omega/bin/omega_QCD$(OCAML_NATIVE_EXT) OMEGA_QCD_OPTS = $(OMEGA_SPLIT) -target:parameter_module parameters_QCD OMEGA_SYM = $(top_builddir)/omega/bin/omega_SYM$(OCAML_NATIVE_EXT) OMEGA_SYM_OPTS = $(OMEGA_SPLIT) -target:parameter_module parameters_SYM OMEGA_SM = $(top_builddir)/omega/bin/omega_SM$(OCAML_NATIVE_EXT) OMEGA_SM_OPTS = $(OMEGA_SPLIT) -target:parameter_module parameters_SM OMEGA_SM_CKM = $(top_builddir)/omega/bin/omega_SM_CKM$(OCAML_NATIVE_EXT) OMEGA_SM_Higgs = $(top_builddir)/omega/bin/omega_SM_Higgs$(OCAML_NATIVE_EXT) OMEGA_THDM = $(top_builddir)/omega/bin/omega_THDM$(OCAML_NATIVE_EXT) OMEGA_THDM_CKM = $(top_builddir)/omega/bin/omega_THDM_CKM$(OCAML_NATIVE_EXT) OMEGA_HSExt = $(top_builddir)/omega/bin/omega_HSExt$(OCAML_NATIVE_EXT) OMEGA_Zprime = $(top_builddir)/omega/bin/omega_Zprime$(OCAML_NATIVE_EXT) OMEGA_SM_top_anom = $(top_builddir)/omega/bin/omega_SM_top_anom$(OCAML_NATIVE_EXT) OMEGA_SM_top_anom_OPTS = $(OMEGA_SPLIT) -target:parameter_module parameters_SM_top_anom OMEGA_UFO = $(top_builddir)/omega/bin/omega_UFO$(OCAML_NATIVE_EXT) +OMEGA_UFO_MAJORANA = \ + $(top_builddir)/omega/bin/omega_UFO_Majorana$(OCAML_NATIVE_EXT) OMEGA_UFO_OPTS = -target:parameter_module parameters_UFO +OMEGA_UFO_PATH = $(top_srcdir)/omega/tests/UFO OMEGA_XXX = $(top_builddir)/omega/bin/omega_%%%$(OCAML_NATIVE_EXT) OMEGA_XXX_OPTS = -target:parameter_module parameters_%%% OMEGA_UFO_XXX_OPTS = \ "-model:UFO_dir $(top_srcdir)/omega/tests/UFO/%%%/ -model:exec" +OMEGA_XXX_MAJORANA = \ + $(top_builddir)/omega/bin/omega_%%%_Majorana$(OCAML_NATIVE_EXT) +OMEGA_XXX_MAJORANA_LEGACY = \ + $(top_builddir)/omega/bin/omega_%%%_Majorana_legacy$(OCAML_NATIVE_EXT) OMEGA_QED_VM = $(top_builddir)/omega/bin/omega_QED_VM$(OCAML_NATIVE_EXT) OMEGA_QCD_VM = $(top_builddir)/omega/bin/omega_QCD_VM$(OCAML_NATIVE_EXT) OMEGA_SM_VM = $(top_builddir)/omega/bin/omega_SM_VM$(OCAML_NATIVE_EXT) OMEGA_SM_CKM_VM = $(top_builddir)/omega/bin/omega_SM_CKM_VM$(OCAML_NATIVE_EXT) OMEGA_THDM_VM = $(top_builddir)/omega/bin/omega_THDM_VM$(OCAML_NATIVE_EXT) OMEGA_THDM_CKM_VM = $(top_builddir)/omega/bin/omega_THDM_CKM_VM$(OCAML_NATIVE_EXT) OMEGA_HSExt_VM = $(top_builddir)/omega/bin/omega_HSExt_VM$(OCAML_NATIVE_EXT) OMEGA_Zprime_VM = $(top_builddir)/omega/bin/omega_Zprime_VM$(OCAML_NATIVE_EXT) OMEGA_SM_Higgs_VM = $(top_builddir)/omega/bin/omega_SM_Higgs_VM$(OCAML_NATIVE_EXT) OMEGA_XXX_VM = $(top_builddir)/omega/bin/omega_%%%_VM$(OCAML_NATIVE_EXT) OMEGA_XXX_VM_PARAMS_OPTS = -params -target:parameter_module_external \ parameters_%%% -target:wrapper_module %% -target:bytecode_file % AM_FCFLAGS = -I$(top_builddir)/omega/src AM_LDFLAGS = ######################################################################## ## Default Fortran compiler options ## OpenMP if FC_USE_OPENMP AM_FCFLAGS += $(FCFLAGS_OPENMP) AM_TESTS_ENVIRONMENT = \ export OMP_NUM_THREADS=1; endif ######################################################################## TESTS = XFAIL_TESTS = EXTRA_PROGRAMS = EXTRA_DIST = ######################################################################## include $(top_srcdir)/omega/src/Makefile.ocaml if OCAML_AVAILABLE OCAMLFLAGS += -I $(top_builddir)/omega/src OMEGA_CORE = $(top_builddir)/omega/src/omega_core.cmxa OMEGA_MODELS = $(top_builddir)/omega/src/omega_models.cmxa TESTS += omega_unit EXTRA_PROGRAMS += omega_unit omega_unit_SOURCES = omega_unit.ml omega_unit: $(OMEGA_CORE) omega_unit.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) -o omega_unit \ unix.cmxa $(OMEGA_CORE) omega_unit.cmx omega_unit.cmx: omega_unit.ml omega_unit.cmx: $(OMEGA_CORE) endif ######################################################################## KINDS = $(top_builddir)/omega/src/kinds.lo TESTS += test_omega95 test_omega95_bispinors EXTRA_PROGRAMS += test_omega95 test_omega95_bispinors test_omega95_SOURCES = test_omega95.f90 omega_testtools.f90 test_omega95_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la test_omega95_bispinors_SOURCES = test_omega95_bispinors.f90 omega_testtools.f90 test_omega95_bispinors_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la test_omega95.o test_omega95_bispinors.o: omega_testtools.o if NOWEB_AVAILABLE test_omega95.f90: $(top_srcdir)/omega/src/omegalib.nw $(NOTANGLE) -R[[$@]] $< | $(CPIF) $@ test_omega95_bispinors.f90: $(top_srcdir)/omega/src/omegalib.nw $(NOTANGLE) -R[[$@]] $< | $(CPIF) $@ omega_testtools.f90: $(top_srcdir)/omega/src/omegalib.nw $(NOTANGLE) -R[[$@]] $< | $(CPIF) $@ endif NOWEB_AVAILABLE ######################################################################## TESTS += test_qed_eemm EXTRA_PROGRAMS += test_qed_eemm test_qed_eemm_SOURCES = test_qed_eemm.f90 parameters_QED.f90 nodist_test_qed_eemm_SOURCES = amplitude_qed_eemm.f90 test_qed_eemm_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la amplitude_qed_eemm.f90: $(OMEGA_QED) Makefile $(OMEGA_QED) $(OMEGA_QED_OPTS) -target:module amplitude_qed_eemm \ -scatter "e+ e- -> m+ m-" > $@ test_qed_eemm.o: amplitude_qed_eemm.o test_qed_eemm.o: parameters_QED.o amplitude_qed_eemm.o: parameters_QED.o ######################################################################## EXTENDED_COLOR_TESTS = \ $(srcdir)/fc_s.ects \ $(srcdir)/fc_a.ects $(srcdir)/cf_a.ects $(srcdir)/fa_f.ects \ $(srcdir)/ca_c.ects $(srcdir)/af_f.ects $(srcdir)/ac_c.ects \ $(srcdir)/aa_a.ects \ $(srcdir)/fc_fc.ects \ $(srcdir)/aa_s.ects $(srcdir)/as_a.ects $(srcdir)/sa_a.ects TESTS += ects EXTRA_PROGRAMS += ects EXTRA_DIST += ects_driver.sh $(EXTENDED_COLOR_TESTS) # Explicitly state dependence on model files ects.f90: $(OMEGA_QCD) $(OMEGA_SYM) $(OMEGA_SM) ects.f90: ects_driver.sh $(EXTENDED_COLOR_TESTS) @if $(AM_V_P); then :; else echo " ECTS_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/ects_driver.sh \ $(OMEGA_XXX) $(EXTENDED_COLOR_TESTS) > $@ ects_SOURCES = color_test_lib.f90 \ parameters_SM.f90 parameters_QED.f90 parameters_QCD.f90 parameters_SYM.f90 nodist_ects_SOURCES = ects.f90 ects_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la ######################################################################## TESTS += cascade # if there is some debugging output ... # XFAIL_TESTS += cascade CASCADE_TESTS = \ bhabha-s-channel.cascade bhabha-t-channel.cascade bhabha-full.cascade \ ww-onlycc.cascade ww-notgc.cascade \ jjj-notgc.cascade \ vbf-noh.cascade cascade: cascade_driver.sh Makefile $(SED) -e 's|%%cascade_tests%%|$(CASCADE_TESTS)|' \ -e 's|%%srcdir%%|$(srcdir)|' \ -e 's|%%SED%%|$(SED)|' \ -e 's|%%top_builddir%%|$(top_builddir)|' \ -e 's|%%OCAML_NATIVE_EXT%%|$(OCAML_NATIVE_EXT)|' $< >$@ chmod +x $@ EXTRA_DIST += cascade_driver.sh $(CASCADE_TESTS) ######################################################################## TESTS += phase_space PHASE_SPACE_TESTS = eeee.phs qqggg.phs phase_space: phase_space_driver.sh Makefile $(SED) -e 's|%%phase_space_tests%%|$(PHASE_SPACE_TESTS)|' \ -e 's|%%srcdir%%|$(srcdir)|' \ -e 's|%%SED%%|$(SED)|' \ -e 's|%%top_builddir%%|$(top_builddir)|' \ -e 's|%%OCAML_NATIVE_EXT%%|$(OCAML_NATIVE_EXT)|' $< >$@ chmod +x $@ EXTRA_DIST += phase_space_driver.sh $(PHASE_SPACE_TESTS) ######################################################################## TESTS += fermi # XFAIL_TESTS += fermi EXTRA_PROGRAMS += fermi EXTRA_DIST += fermi_driver.sh EXTRA_DIST += fermi.list FERMI_SUPPORT_F90 = \ omega_interface.f90 omega_testtools.f90 tao_random_numbers.f90 \ parameters_QED.f90 parameters_QCD.f90 parameters_SYM.f90 \ parameters_SM.f90 parameters_MSSM.f90 parameters_SM_top_anom.f90 FERMI_SUPPORT_O = $(FERMI_SUPPORT_F90:.f90=.o) fermi_lib.o: $(FERMI_SUPPORT_O) FERMI_LIB_F90 = fermi_lib.f90 $(FERMI_SUPPORT_F90) FERMI_LIB_O = $(FERMI_LIB_F90:.f90=.o) run_fermi: fermi ./fermi fermi.f90: fermi_driver.sh $(OMEGA_QED) $(OMEGA_QCD) $(OMEGA_SYM) fermi.f90: $(OMEGA_SM) $(OMEGA_SM_top_anom) fermi.f90: fermi.list @if $(AM_V_P); then :; else echo " FERMI_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/fermi_driver.sh \ $(OMEGA_XXX) $(OMEGA_SPLIT) < $< > $@ fermi_SOURCES = $(FERMI_LIB_F90) nodist_fermi_SOURCES = fermi.f90 fermi_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la fermi.o: $(FERMI_LIB_O) ######################################################################## TESTS += ward EXTRA_PROGRAMS += ward EXTRA_DIST += ward_driver.sh EXTRA_DIST += ward_identities.list WARD_SUPPORT_F90 = \ omega_interface.f90 omega_testtools.f90 tao_random_numbers.f90 \ parameters_QED.f90 parameters_QCD.f90 parameters_SYM.f90 \ parameters_SM.f90 parameters_SM_top_anom.f90 WARD_SUPPORT_O = $(WARD_SUPPORT_F90:.f90=.o) ward_lib.o: $(WARD_SUPPORT_O) WARD_LIB_F90 = ward_lib.f90 $(WARD_SUPPORT_F90) WARD_LIB_O = $(WARD_LIB_F90:.f90=.o) run_ward: ward ./ward ward.f90: ward_driver.sh $(OMEGA_QED) $(OMEGA_QCD) $(OMEGA_SYM) ward.f90: $(OMEGA_SM) $(OMEGA_SM_top_anom) ward.f90: ward_identities.list @if $(AM_V_P); then :; else echo " WARD_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/ward_driver.sh \ $(OMEGA_XXX) $(OMEGA_SPLIT) < $< > $@ ward_SOURCES = $(WARD_LIB_F90) nodist_ward_SOURCES = ward.f90 ward_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la ward.o: $(WARD_LIB_O) ######################################################################## EXTRA_PROGRAMS += ward_long EXTRA_DIST += ward_identities_long.list run_ward_long: ward_long ./ward_long ward_long.f90: ward_driver.sh ward_long.f90: ward_identities_long.list @if $(AM_V_P); then :; else echo " WARD_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/ward_driver.sh \ $(OMEGA_XXX) $(OMEGA_SPLIT) < $< > $@ ward_long_SOURCES = $(WARD_LIB_F90) nodist_ward_long_SOURCES = ward_long.f90 ward_long_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la # ward_long.o: ward_long.f90 # $(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) -O0 $< ward_long.o: $(WARD_LIB_O) ######################################################################## EXTRA_PROGRAMS += ward_fail EXTRA_DIST += ward_identities_fail.list run_ward_fail: ward_fail ./ward_fail ward_fail.f90: ward_driver.sh ward_fail.f90: ward_identities_fail.list @if $(AM_V_P); then :; else echo " WARD_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/ward_driver.sh \ $(OMEGA_XXX) $(OMEGA_SPLIT) < $< > $@ ward_fail_SOURCES = $(WARD_LIB_F90) nodist_ward_fail_SOURCES = ward_fail.f90 ward_fail_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la ward_fail.o: ward_fail.f90 $(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) -O0 $< ward_fail.o: $(WARD_LIB_O) ######################################################################## TESTS += compare_split_function compare_split_module EXTRA_PROGRAMS += compare_split_function compare_split_module EXTRA_DIST += compare_driver.sh EXTRA_DIST += comparisons.list COMPARE_SUPPORT_F90 = $(WARD_SUPPORT_F90) COMPARE_SUPPORT_O = $(WARD_SUPPORT_O) compare_lib.o: $(COMPARE_SUPPORT_O) COMPARE_LIB_F90 = compare_lib.f90 $(COMPARE_SUPPORT_F90) COMPARE_LIB_O = $(COMPARE_LIB_F90:.f90=.o) run_compare: compare_split_function compare_split_module ./compare_split_function ./compare_split_module compare_split_function.f90: comparisons.list @if $(AM_V_P); then :; else echo " COMPARE_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/compare_driver.sh SF \ "$(OMEGA_XXX) -target:single_function" \ "$(OMEGA_XXX) -target:split_function 10" < $< > $@ compare_split_module.f90: comparisons.list @if $(AM_V_P); then :; else echo " COMPARE_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/compare_driver.sh SM \ "$(OMEGA_XXX) -target:single_function" \ "$(OMEGA_XXX) -target:split_module 10" < $< > $@ compare_split_function.f90 compare_split_module.f90: \ compare_driver.sh $(OMEGA_QCD) $(OMEGA_SM) compare_split_function_SOURCES = $(COMPARE_LIB_F90) nodist_compare_split_function_SOURCES = compare_split_function.f90 compare_split_function_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la compare_split_module_SOURCES = $(COMPARE_LIB_F90) nodist_compare_split_module_SOURCES = compare_split_module.f90 compare_split_module_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la compare_split_function.o compare_split_module.o: $(COMPARE_LIB_O) ######################################################################## +TESTS += compare_majorana compare_majorana_legacy compare_majorana_UFO +EXTRA_PROGRAMS += compare_majorana compare_majorana_legacy compare_majorana_UFO +EXTRA_DIST += compare_driver_majorana.sh compare_driver_majorana_UFO.sh +EXTRA_DIST += comparisons_majorana.list comparisons_majorana_legacy.list \ + comparisons_majorana_UFO.list + +compare_majorana.f90: comparisons_majorana.list + @if $(AM_V_P); then :; else echo " COMPARE_DRIVER"; fi + $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_majorana.sh Maj \ + "$(OMEGA_XXX)" "$(OMEGA_XXX_MAJORANA)" < $< > $@ + +compare_majorana_legacy.f90: comparisons_majorana_legacy.list + @if $(AM_V_P); then :; else echo " COMPARE_DRIVER"; fi + $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_majorana.sh MajL \ + "$(OMEGA_XXX)" "$(OMEGA_XXX_MAJORANA_LEGACY)" < $< > $@ + +compare_majorana_UFO.f90: comparisons_majorana_UFO.list + @if $(AM_V_P); then :; else echo " COMPARE_DRIVER"; fi + $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_majorana_UFO.sh MajU \ + "$(OMEGA_UFO)" "$(OMEGA_UFO_MAJORANA)" "$(OMEGA_UFO_PATH)" < $< > $@ + +compare_majorana.f90 compare_majorana_legacy.f90 compare_majorana_UFO.f90: \ + compare_driver_majorana.sh $(OMEGA_UFO) $(OMEGA_UFO_MAJORANA) + +compare_majorana_SOURCES = $(COMPARE_LIB_F90) +nodist_compare_majorana_SOURCES = compare_majorana.f90 +compare_majorana_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la + +compare_majorana_legacy_SOURCES = $(COMPARE_LIB_F90) +nodist_compare_majorana_legacy_SOURCES = compare_majorana_legacy.f90 +compare_majorana_legacy_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la + +compare_majorana_UFO_SOURCES = $(COMPARE_LIB_F90) parameters_SM_UFO.f90 +nodist_compare_majorana_UFO_SOURCES = compare_majorana_UFO.f90 +compare_majorana_UFO_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la + +compare_majorana.o compare_majorana_legacy.o compare_majorana_UFO.o: $(COMPARE_LIB_O) + +######################################################################## + # At quadruple or extended precision, these tests take waaaaaayyyy too long! if FC_PREC else TESTS += compare_amplitude_UFO # XFAIL_TESTS += compare_amplitude_UFO EXTRA_PROGRAMS += compare_amplitude_UFO EXTRA_DIST += compare_driver_UFO.sh EXTRA_DIST += comparisons_UFO.list compare_amplitude_UFO_SOURCES = \ parameters_SM_from_UFO.f90 compare_lib.f90 \ omega_interface.f90 omega_testtools.f90 tao_random_numbers.f90 compare_amplitude_UFO.f90: comparisons_UFO.list compare_driver_UFO.sh $(OMEGA_UFO) @if $(AM_V_P); then :; else echo " COMPARE_DRIVER_UFO"; fi $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_UFO.sh UFO \ "$(OMEGA_XXX) -model:constant_width" \ "$(OMEGA_UFO) -model:UFO_dir $(top_srcdir)/omega/tests/UFO/%%%/ -model:exec" \ < $< > $@ # -model:long_flavors -parameters_SM_UFO.f90: $(OMEGA_UFO) - $(OMEGA_UFO) \ - -model:UFO_dir $(top_srcdir)/omega/tests/UFO/SM/ -model:exec \ - -target:parameter_module parameters_sm_ufo -params > $@ - nodist_compare_amplitude_UFO_SOURCES = \ compare_amplitude_UFO.f90 parameters_SM_UFO.f90 compare_amplitude_UFO_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la parameters_SM_from_UFO.o: parameters_SM_UFO.o compare_amplitude_UFO.o: parameters_SM_UFO.o parameters_SM_from_UFO.o compare_amplitude_UFO.o: $(COMPARE_LIB_O) endif +parameters_SM_UFO.f90: $(OMEGA_UFO) + $(OMEGA_UFO) \ + -model:UFO_dir $(top_srcdir)/omega/tests/UFO/SM/ -model:exec \ + -target:parameter_module parameters_sm_ufo -params > $@ + ######################################################################## # At quadruple or extended precision, these tests take waaaaaayyyy too long! if FC_PREC else TESTS += fermi_UFO # XFAIL_TESTS += fermi_UFO # We need more work on the parameters to pass the tests # at quadruple or extended precision. if FC_PREC XFAIL_TESTS += fermi_UFO endif EXTRA_PROGRAMS += fermi_UFO EXTRA_DIST += fermi_driver_UFO.sh EXTRA_DIST += fermi_UFO.list FERMI_UFO_SUPPORT_F90 = \ omega_interface.f90 omega_testtools.f90 tao_random_numbers.f90 FERMI_UFO_SUPPORT_O = $(FERMI_UFO_SUPPORT_F90:.f90=.o) fermi_UFO_lib.o: $(FERMI_SUPPORT_O) FERMI_UFO_LIB_F90 = fermi_lib.f90 $(FERMI_UFO_SUPPORT_F90) FERMI_UFO_LIB_O = $(FERMI_UFO_LIB_F90:.f90=.o) run_fermi_UFO: fermi_UFO ./fermi_UFO fermi_UFO.f90: fermi_UFO.list fermi_driver_UFO.sh $(OMEGA_UFO) @if $(AM_V_P); then :; else echo " FERMI_UFO_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/fermi_driver_UFO.sh \ - $(OMEGA_UFO) -model:UFO_dir $(top_srcdir)/omega/tests/UFO/SM/ \ + $(OMEGA_UFO) $(OMEGA_UFO_MAJORANA) $(OMEGA_UFO_PATH) \ $(OMEGA_SPLIT) < $< > $@ fermi_UFO_SOURCES = $(FERMI_UFO_LIB_F90) nodist_fermi_UFO_SOURCES = fermi_UFO.f90 parameters_SM_UFO.f90 fermi_UFO_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la fermi_UFO.o: $(FERMI_UFO_LIB_O) endif ######################################################################## # At quadruple or extended precision, these tests take waaaaaayyyy too long! if FC_PREC else TESTS += ward_UFO # We need more work on the parameters to pass the tests # at quadruple or extended precision. if FC_PREC XFAIL_TESTS += ward_UFO endif EXTRA_PROGRAMS += ward_UFO EXTRA_DIST += ward_driver_UFO.sh EXTRA_DIST += ward_identities_UFO.list WARD_UFO_SUPPORT_F90 = \ omega_interface.f90 omega_testtools.f90 tao_random_numbers.f90 WARD_UFO_SUPPORT_O = $(WARD_UFO_SUPPORT_F90:.f90=.o) ward_UFO_lib.o: $(WARD_SUPPORT_O) WARD_UFO_LIB_F90 = ward_lib.f90 $(WARD_UFO_SUPPORT_F90) WARD_UFO_LIB_O = $(WARD_UFO_LIB_F90:.f90=.o) run_ward_UFO: ward_UFO ./ward_UFO ward_UFO.f90: ward_identities_UFO.list ward_driver_UFO.sh $(OMEGA_UFO) @if $(AM_V_P); then :; else echo " WARD_UFO_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/ward_driver_UFO.sh \ $(OMEGA_UFO) -model:UFO_dir $(top_srcdir)/omega/tests/UFO/SM/ \ $(OMEGA_SPLIT) < $< > $@ ward_UFO_SOURCES = $(WARD_UFO_LIB_F90) nodist_ward_UFO_SOURCES = ward_UFO.f90 parameters_SM_UFO.f90 ward_UFO_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la ward_UFO.o: $(WARD_UFO_LIB_O) endif ######################################################################## TESTS += compare_amplitude_VM EXTRA_PROGRAMS += compare_amplitude_VM EXTRA_DIST += compare_driver_VM.sh compare_driver_VM_wrappers.sh EXTRA_DIST += comparisons_VM.list compare_amplitude_VM.f90: comparisons_VM.list comparisons_VM.wrappers.o @if $(AM_V_P); then :; else echo " COMPARE_DRIVER_VM"; fi $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_VM.sh \ "$(OMEGA_XXX) " "$(OMEGA_XXX_VM) " "$(OMEGA_XXX_VM_PARAMS_OPTS)" < $< > $@ comparisons_VM.wrappers.f90: comparisons_VM.list @if $(AM_V_P); then :; else echo " COMPARE_DRIVER_VM_WRAPPERS"; fi $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_VM_wrappers.sh \ "$(OMEGA_XXX) " "$(OMEGA_XXX_VM) " "$(OMEGA_XXX_VM_PARAMS_OPTS)" < $< > $@ # Explicitly state dependence on model files compare_amplitude_VM.f90: compare_driver_VM.sh \ $(OMEGA_QED) $(OMEGA_QED_VM) \ $(OMEGA_QCD) $(OMEGA_QCD_VM) \ $(OMEGA_SM) $(OMEGA_SM_VM) \ $(OMEGA_SM_CKM) $(OMEGA_SM_CKM_VM) \ $(OMEGA_SM_Higgs) $(OMEGA_SM_Higgs_VM) \ $(OMEGA_THDM) $(OMEGA_THDM_VM) \ $(OMEGA_THDM_CKM) $(OMEGA_THDM_CKM_VM) \ $(OMEGA_HSExt) $(OMEGA_HSExt_VM) \ $(OMEGA_Zprime) $(OMEGA_Zprime_VM) COMPARE_EXTRA_MODELS = parameters_SM_CKM.f90 parameters_SM_Higgs.f90 \ parameters_THDM.f90 parameters_THDM_CKM.f90 parameters_HSExt.f90 \ parameters_Zprime.f90 compare_amplitude_VM_SOURCES = $(COMPARE_LIB_F90) $(COMPARE_EXTRA_MODELS) nodist_compare_amplitude_VM_SOURCES = compare_amplitude_VM.f90 comparisons_VM.wrappers.f90 compare_amplitude_VM_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la compare_amplitude_VM.o: $(COMPARE_LIB_O) ######################################################################## if FC_USE_OPENMP TESTS += test_openmp EXTRA_PROGRAMS += test_openmp TESTOPENMP_SUPPORT_F90 = $(WARD_SUPPORT_F90) TESTOPENMP_SUPPORT_O = $(WARD_SUPPORT_O) test_openmp_SOURCES = test_openmp.f90 $(TESTOPENMP_SUPPORT_F90) nodist_test_openmp_SOURCES = amplitude_openmp.f90 test_openmp_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la amplitude_openmp.f90: $(OMEGA_QCD) Makefile $(OMEGA_QCD) $(OMEGA_QCD_OPTS) -target:openmp \ -target:module amplitude_openmp -scatter "gl gl -> gl gl gl" > $@ test_openmp.o: amplitude_openmp.o test_openmp.o: $(TESTOPENMP_SUPPORT_O) amplitude_openmp.o: parameters_QCD.o endif ######################################################################## EXTRA_PROGRAMS += benchmark_VM_vs_Fortran EXTRA_DIST += benchmark_VM_vs_Fortran_driver.sh BENCHMARK_LIB_F90 = benchmark_lib.f90 $(WARD_SUPPORT_F90) BENCHMARK_LIB_O = $(BENCHMARK_LIB_F90:.f90=.o) benchmark_VM_vs_Fortran.f90: benchmark_processes.list benchmark_processes.wrappers.o @if $(AM_V_P); then :; else echo " BENCHMARK_VM_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/benchmark_VM_vs_Fortran_driver.sh \ "$(OMEGA_XXX) " "$(OMEGA_XXX_VM) " "$(OMEGA_XXX_VM_PARAMS_OPTS)" < $< > $@ benchmark_processes.wrappers.f90: benchmark_processes.list @if $(AM_V_P); then :; else echo " BENCHMARK_DRIVER_WRAPPERS"; fi $(AM_V_at)$(SHELL) $(srcdir)/benchmark_driver_wrappers.sh \ "$(OMEGA_XXX) " "$(OMEGA_XXX_VM) " "$(OMEGA_XXX_VM_PARAMS_OPTS)" < $< > $@ # Explicitly state dependence on model files benchmark_VM_vs_Fortran.f90: benchmark_VM_vs_Fortran_driver.sh \ $(OMEGA_QED) $(OMEGA_QED_VM) \ $(OMEGA_QCD) $(OMEGA_QCD_VM) \ $(OMEGA_SM) $(OMEGA_SM_VM) benchmark_VM_vs_Fortran_SOURCES = $(BENCHMARK_LIB_F90) nodist_benchmark_VM_vs_Fortran_SOURCES = benchmark_VM_vs_Fortran.f90 benchmark_processes.wrappers.f90 benchmark_VM_vs_Fortran_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la benchmark_VM_vs_Fortran.o: $(BENCHMARK_LIB_O) ######################################################################## if FC_USE_OPENMP EXTRA_PROGRAMS += benchmark_amp_parallel benchmark_amp_parallel.f90: benchmark_processes.list benchmark_processes.wrappers.o @if $(AM_V_P); then :; else echo " BENCHMARK_PARALLEL_DRIVER"; fi $(AM_V_at)$(SHELL) $(srcdir)/benchmark_amp_parallel_driver.sh \ "$(OMEGA_XXX) " "$(OMEGA_XXX_VM) " "$(OMEGA_XXX_VM_PARAMS_OPTS)" < $< > $@ # Explicitly state dependence on model files benchmark_amp_parallel.f90: benchmark_amp_parallel_driver.sh \ $(OMEGA_QED) $(OMEGA_QED_VM) \ $(OMEGA_QCD) $(OMEGA_QCD_VM) \ $(OMEGA_SM) $(OMEGA_SM_VM) benchmark_amp_parallel_SOURCES = $(BENCHMARK_LIB_F90) nodist_benchmark_amp_parallel_SOURCES = benchmark_amp_parallel.f90 benchmark_processes.wrappers.f90 benchmark_amp_parallel_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la benchmark_amp_parallel.o: $(BENCHMARK_LIB_O) endif ######################################################################## EXTRA_PROGRAMS += benchmark run_benchmark: benchmark ./benchmark BENCHMARK_PROCESS = -scatter "gl gl -> gl gl gl" BENCHMARK_SPLIT_SIZE = 10 benchmark_SOURCES = benchmark.f90 parameters_QCD.f90 nodist_benchmark_SOURCES = \ amplitude_benchmark_v1.f90 amplitude_benchmark_v2.f90 \ amplitude_benchmark_v3.f90 # amplitude_benchmark_v4.f90 benchmark_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la amplitude_benchmark_v1.f90: $(OMEGA_QCD) Makefile $(OMEGA_QCD) $(OMEGA_QCD_OPTS) -target:module amplitude_benchmark_v1 \ $(BENCHMARK_PROCESS) -target:single_function > $@ amplitude_benchmark_v2.f90: $(OMEGA_QCD) Makefile $(OMEGA_QCD) $(OMEGA_QCD_OPTS) -target:module amplitude_benchmark_v2 \ $(BENCHMARK_PROCESS) -target:split_function $(BENCHMARK_SPLIT_SIZE) > $@ amplitude_benchmark_v3.f90: $(OMEGA_QCD) Makefile $(OMEGA_QCD) $(OMEGA_QCD_OPTS) -target:module amplitude_benchmark_v3 \ $(BENCHMARK_PROCESS) -target:split_module $(BENCHMARK_SPLIT_SIZE) > $@ amplitude_benchmark_v4.f90: $(OMEGA_QCD) Makefile $(OMEGA_QCD) $(OMEGA_QCD_OPTS) -target:module amplitude_benchmark_v4 \ $(BENCHMARK_PROCESS) -target:split_file $(BENCHMARK_SPLIT_SIZE) > $@ benchmark.o: \ amplitude_benchmark_v1.o amplitude_benchmark_v2.o \ amplitude_benchmark_v3.o # amplitude_benchmark_v4.o benchmark.o: parameters_QCD.o amplitude_benchmark_v1.o amplitude_benchmark_v2.o \ amplitude_benchmark_v3.o amplitude_benchmark_v4.o: parameters_QCD.o ######################################################################## if OCAML_AVAILABLE TESTS += vertex_unit EXTRA_PROGRAMS += vertex_unit vertex_unit_SOURCES = vertex_unit.ml vertex_unit: $(OMEGA_CORE) vertex_unit.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) -o vertex_unit \ unix.cmxa $(OMEGA_CORE) $(OMEGA_MODELS) vertex_unit.cmx vertex_unit.cmx: vertex_unit.ml vertex_unit.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) endif ######################################################################## if OCAML_AVAILABLE TESTS += ufo_unit EXTRA_PROGRAMS += ufo_unit ufo_unit_SOURCES = ufo_unit.ml ufo_unit: $(OMEGA_CORE) ufo_unit.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) -o ufo_unit \ unix.cmxa $(OMEGA_CORE) $(OMEGA_MODELS) ufo_unit.cmx ufo_unit.cmx: ufo_unit.ml ufo_unit.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) endif ######################################################################## if OCAML_AVAILABLE TESTS += keystones_omegalib keystones_UFO TESTS += keystones_omegalib_bispinors keystones_UFO_bispinors # XFAIL_TESTS += keystones_UFO -XFAIL_TESTS += keystones_UFO_bispinors +# XFAIL_TESTS += keystones_UFO_bispinors EXTRA_PROGRAMS += keystones_omegalib keystones_UFO EXTRA_PROGRAMS += keystones_omegalib_bispinors keystones_UFO_bispinors keystones_omegalib_SOURCES = omega_testtools.f90 keystones_tools.f90 nodist_keystones_omegalib_SOURCES = keystones_omegalib.f90 keystones_omegalib_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la keystones_UFO_SOURCES = omega_testtools.f90 keystones_tools.f90 nodist_keystones_UFO_SOURCES = keystones_UFO.f90 keystones_UFO_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la keystones_omegalib_bispinors_SOURCES = omega_testtools.f90 keystones_tools.f90 nodist_keystones_omegalib_bispinors_SOURCES = keystones_omegalib_bispinors.f90 keystones_omegalib_bispinors_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la keystones_UFO_bispinors_SOURCES = omega_testtools.f90 keystones_tools.f90 nodist_keystones_UFO_bispinors_SOURCES = keystones_UFO_bispinors.f90 keystones_UFO_bispinors_LDADD = $(KINDS) $(top_builddir)/omega/src/libomega_core.la EXTRA_PROGRAMS += keystones_omegalib_generate keystones_UFO_generate EXTRA_PROGRAMS += keystones_omegalib_bispinors_generate keystones_UFO_bispinors_generate keystones_omegalib_generate_SOURCES = \ keystones.ml keystones.mli keystones_omegalib_generate.ml keystones_UFO_generate_SOURCES = \ keystones.ml keystones.mli keystones_UFO_generate.ml keystones_omegalib_bispinors_generate_SOURCES = \ keystones.ml keystones.mli keystones_omegalib_bispinors_generate.ml keystones_UFO_bispinors_generate_SOURCES = \ keystones.ml keystones.mli keystones_UFO_bispinors_generate.ml keystones_omegalib.f90: keystones_omegalib_generate ./keystones_omegalib_generate -cat > $@ keystones_UFO.f90: keystones_UFO_generate ./keystones_UFO_generate -cat > $@ keystones_omegalib_bispinors.f90: keystones_omegalib_bispinors_generate ./keystones_omegalib_bispinors_generate -cat > $@ keystones_UFO_bispinors.f90: keystones_UFO_bispinors_generate ./keystones_UFO_bispinors_generate -cat > $@ keystones_omegalib_generate: $(OMEGA_CORE) keystones_omegalib_generate.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) \ -o keystones_omegalib_generate \ unix.cmxa $(OMEGA_CORE) $(OMEGA_MODELS) \ keystones.cmx keystones_omegalib_generate.cmx keystones_UFO_generate: $(OMEGA_CORE) keystones_UFO_generate.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) \ -o keystones_UFO_generate \ unix.cmxa $(OMEGA_CORE) $(OMEGA_MODELS) \ keystones.cmx keystones_UFO_generate.cmx keystones_omegalib_bispinors_generate: $(OMEGA_CORE) keystones_omegalib_bispinors_generate.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) \ -o keystones_omegalib_bispinors_generate \ unix.cmxa $(OMEGA_CORE) $(OMEGA_MODELS) \ keystones.cmx keystones_omegalib_bispinors_generate.cmx keystones_UFO_bispinors_generate: $(OMEGA_CORE) keystones_UFO_bispinors_generate.cmx @if $(AM_V_P); then :; else echo " OCAMLOPT " $@; fi $(AM_V_at)$(OCAMLOPT) $(OCAMLFLAGS) $(OCAMLOPTFLAGS) \ -o keystones_UFO_bispinors_generate \ unix.cmxa $(OMEGA_CORE) $(OMEGA_MODELS) \ keystones.cmx keystones_UFO_bispinors_generate.cmx keystones_omegalib_generate.cmx: \ keystones.cmi keystones.cmx keystones_omegalib_generate.ml keystones_omegalib_generate.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) keystones_UFO_generate.cmx: \ keystones.cmi keystones.cmx keystones_UFO_generate.ml keystones_UFO_generate.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) keystones_omegalib_bispinors_generate.cmx: \ keystones.cmi keystones.cmx keystones_omegalib_bispinors_generate.ml keystones_omegalib_bispinors_generate.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) keystones_UFO_bispinors_generate.cmx: \ keystones.cmi keystones.cmx keystones_UFO_bispinors_generate.ml keystones_UFO_bispinors_generate.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) keystones.cmx: keystones.ml keystones.cmi keystones.cmx: $(OMEGA_CORE) $(OMEGA_MODELS) keystones.cmi: keystones.mli endif ######################################################################## if RECOLA_AVAILABLE TESTS += compare_amplitude_recola # We need more work on the parameters to pass the tests # at quadruple or extended precision if FC_PREC XFAIL_TESTS += compare_amplitude_recola endif EXTRA_PROGRAMS += compare_amplitude_recola AM_FCFLAGS += $(RECOLA_INCLUDES) compare_amplitude_recola_SOURCES = \ parameters_SM_Higgs_recola.f90 \ omega_interface.f90 compare_lib.f90 compare_lib_recola.f90 \ omega_testtools.f90 tao_random_numbers.f90 nodist_compare_amplitude_recola_SOURCES = compare_amplitude_recola.f90 compare_amplitude_recola.f90: comparisons_recola.list compare_driver_recola.sh @if $(AM_V_P); then :; else echo " COMPARE_DRIVER_RECOLA"; fi $(AM_V_at)$(SHELL) $(srcdir)/compare_driver_recola.sh \ "$(OMEGA_XXX) -model:constant_width" < $< > $@ compare_amplitude_recola.o: \ omega_testtools.f90 compare_lib.o compare_lib_recola.o \ tao_random_numbers.o \ parameters_SM_Higgs_recola.o compare_lib_recola.o: \ omega_testtools.f90 compare_lib.o tao_random_numbers.o \ parameters_SM_Higgs_recola.o compare_amplitude_recola_LDADD = \ $(LDFLAGS_RECOLA) \ $(KINDS) $(top_builddir)/omega/src/libomega_core.la run_compare_recola: compare_amplitude_recola ./compare_amplitude_recola endif ######################################################################## installcheck-local: PATH=$(DESTDIR)$(bindir):$$PATH; export PATH; \ LD_LIBRARY_PATH=$(DESTDIR)$(libdir):$(DESTDIR)$(pkglibdir):$$LD_LIBRARY_PATH; \ export LD_LIBRARY_PATH; \ omega_QED.opt $(OMEGA_QED_OPTS) -scatter "e+ e- -> m+ m-" \ -target:module amplitude_qed_eemm > amplitude_qed_eemm.f90; \ $(FC) $(AM_FCFLAGS) $(FCFLAGS) -I$(pkgincludedir) \ -L$(DESTDIR)$(libdir) -L$(DESTDIR)$(pkglibdir) \ $(srcdir)/parameters_QED.f90 amplitude_qed_eemm.f90 \ $(srcdir)/test_qed_eemm.f90 -lomega_core; \ ./a.out ######################################################################## ### Remove DWARF debug information on MAC OS X clean-macosx: -rm -rf a.out.dSYM -rm -rf compare_amplitude_UFO.dSYM -rm -rf compare_amplitude_VM.dSYM -rm -rf compare_split_function.dSYM -rm -rf compare_split_module.dSYM -rm -rf ects.dSYM -rm -rf test_omega95.dSYM -rm -rf test_omega95_bispinors.dSYM -rm -rf test_qed_eemm.dSYM -rm -rf ward.dSYM .PHONY: clean-macosx clean-local: clean-macosx rm -f a.out gmon.out *.$(FC_MODULE_EXT) \ *.o *.cmi *.cmo *.cmx amplitude_*.f90 \ $(EXTRA_PROGRAMS) ects.f90 ward.f90 ward_UFO.f90 \ fermi.f90 fermi_UFO.f90 compare_*.f90 \ parameters_SM_UFO.f90 keystones_omegalib.f90 keystones_UFO.f90 \ keystones_UFO_bispinors.f90 keystones_omegalib_bispinors.f90 \ omega_testtools.f90 test_omega95*.f90 benchmark*.f90 \ *.hbc *wrappers.f90 cascade phase_space \ output.rcl recola.log rm -fr output_cll if FC_SUBMODULES -rm -f *.smod endif ######################################################################## ## The End. ######################################################################## Index: trunk/omega/tests/compare_driver.sh =================================================================== --- trunk/omega/tests/compare_driver.sh (revision 8415) +++ trunk/omega/tests/compare_driver.sh (revision 8416) @@ -1,161 +1,164 @@ #! /bin/sh # compare_driver.sh -- ######################################################################## tag="$1" omega_v1="$2" omega_v2="$3" shift 3 models="qed qcd sym" modules="" ######################################################################## while read module threshold abs_threshold n roots model mode process; do case $module in '#'*) # skip comments ;; '') # skip empty lines ;; + '!'*) break + ;; + *) ######################################################################## modules="$modules $module" eval threshold_$module=$threshold eval abs_threshold_$module=$abs_threshold eval n_$module=$n eval roots_$module=$roots eval process_$module="'$process'" ######################################################################## ov1="`echo $omega_v1 | sed s/%%%/$model/g`" # echo "running $ov1 -$mode '$process'" 1>&2 $ov1 "$@" \ -target:parameter_module parameters_$model \ -target:module amplitude_compare_${tag}_v1_${module} \ -$mode "$process" 2>/dev/null ov2="`echo $omega_v2 | sed s/%%%/$model/g`" # echo "running $ov2 -$mode '$process'" 1>&2 $ov2 "$@" \ -target:parameter_module parameters_$model \ -target:module amplitude_compare_${tag}_v2_${module} \ -$mode "$process" 2>/dev/null ;; esac done ######################################################################## for module in $modules; do for mode in v1 v2; do cat < number_particles_in p%number_particles_out => number_particles_out p%number_spin_states => number_spin_states p%spin_states => spin_states p%number_flavor_states => number_flavor_states p%flavor_states => flavor_states p%number_color_indices => number_color_indices p%number_color_flows => number_color_flows p%color_flows => color_flows p%number_color_factors => number_color_factors p%color_factors => color_factors p%color_sum => color_sum p%new_event => new_event p%reset_helicity_selection => reset_helicity_selection p%is_allowed => is_allowed p%get_amplitude => get_amplitude end function load end module interface_compare_${tag}_${mode}_${module} EOF done done ######################################################################## cat < load EOF done done for model in $models; do cat < init_parameters EOF done cat < 0) then print *, failures, " failures in ", attempts, " attempts" failed_processes = failed_processes + 1 end if EOF done cat < 0) then print *, failed_processes, " failed processes in ", attempted_processes, " attempts" stop 1 end if end program compare_driver EOF exit 0 Index: trunk/omega/tests/compare_driver_VM.sh =================================================================== --- trunk/omega/tests/compare_driver_VM.sh (revision 8415) +++ trunk/omega/tests/compare_driver_VM.sh (revision 8416) @@ -1,168 +1,171 @@ #! /bin/sh # compare_driver.sh -- ######################################################################## tag=VM odefault="$1" ovm="$2" oparams="$2 $3" shift 3 models="QED QCD SM SM_CKM SM_Higgs" modules="" ######################################################################## while read module threshold abs_threshold n roots model mode process; do case $module in '#'*) # skip comments ;; '') # skip empty lines ;; + '!'*) break + ;; + *) ######################################################################## modules="$modules $module" eval threshold_$module=$threshold eval abs_threshold_$module=$abs_threshold eval n_$module=$n eval roots_$module=$roots eval process_$module="'$process'" eval model_$module="'$model'" ######################################################################## ov1="`echo $odefault | sed s/%%%/$model/g`" #echo "running $ov1 -$mode '$process'" 1>&2 $ov1 "$@" \ -target:parameter_module parameters_$model \ -target:module amplitude_compare_${tag}_v1_${module} \ -$mode "$process" 2>/dev/null ov2="`echo $ovm | sed s/%%%/$model/g`" #bc_file="`echo $process | sed 's/->/to/g' | sed 's/ /_/g'`".hbc bc_file=$module.hbc eval bc_file_$module=$bc_file #echo "running $ov2 -$mode '$process', saving to $bc_file" 1>&2 $ov2 "$@" -$mode "$process" 2>/dev/null 1> $bc_file ;; esac done ######################################################################## for module in $modules; do for mode in v1 v2; do if [ $mode == v2 ]; then init="call init()" else init="" fi cat < number_particles_in p%number_particles_out => number_particles_out p%number_spin_states => number_spin_states p%spin_states => spin_states p%number_flavor_states => number_flavor_states p%flavor_states => flavor_states p%number_color_indices => number_color_indices p%number_color_flows => number_color_flows p%color_flows => color_flows p%number_color_factors => number_color_factors p%color_factors => color_factors p%color_sum => color_sum p%new_event => new_event p%reset_helicity_selection => reset_helicity_selection p%is_allowed => is_allowed p%get_amplitude => get_amplitude end function load end module interface_compare_${tag}_${mode}_${module} EOF done done ######################################################################## cat < load EOF done done for model in $models; do cat < init_parameters EOF done cat < 0) then print *, failures, " failures in ", attempts, " attempts" failed_processes = failed_processes + 1 end if EOF done cat < 0) then print *, failed_processes, " failed processes" stop 1 end if end program compare_driver EOF exit 0 Index: trunk/omega/tests/ward_lib.f90 =================================================================== --- trunk/omega/tests/ward_lib.f90 (revision 8415) +++ trunk/omega/tests/ward_lib.f90 (revision 8416) @@ -1,305 +1,325 @@ ! ward_lib.f90 -- check On Shell Ward Identities in O'Mega !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Copyright (C) 1999-2020 by ! Wolfgang Kilian ! Thorsten Ohl ! Juergen Reuter ! Christian Speckner ! ! WHIZARD is free software; you can redistribute it and/or modify it ! under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! WHIZARD is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! module ward_lib ! use ieee_arithmetic use kinds use constants use tao_random_numbers use omega95 use omega_interface use omega_testtools implicit none private public :: check contains elemental function ieee_is_nan (x) result (yorn) logical :: yorn real (kind=default), intent(in) :: x yorn = (x /= x) end function ieee_is_nan subroutine check (physical, unphysical, roots, threshold, n, failures, attempts, seed) type(omega_procedures), intent(in) :: physical, unphysical real(kind=default), intent(in) :: roots, threshold integer, intent(in) :: n integer, intent(out) :: failures, attempts integer, intent(in), optional :: seed logical :: match, passed integer :: n_out, n_flv, n_hel, n_col integer :: i, i_flv, i_hel, i_col ! integer :: i_prt integer, dimension(:,:), allocatable :: spin_states_phys, spin_states_unphys real(kind=default), dimension(:,:), allocatable :: p complex(kind=default), dimension(:), allocatable :: a character(len=80) :: msg complex(kind=default) :: wi real(kind=default) :: a_avg failures = 0 attempts = 0 call quantum_numbers (physical, unphysical, n_out, n_flv, n_hel, n_col, match) if (.not.match) then failures = 1 return end if + if (n_out <= 0) then + print *, "no outgoing particles" + failures = 1 + return + end if + if (n_flv <= 0) then + print *, "no allowed flavor combinations" + failures = 1 + return + end if + if (n_hel <= 0) then + print *, "no allowed helicity combinations" + failures = 1 + return + end if + if (n_col <= 0) then + print *, "no allowed color flows" + failures = 1 + return + end if if (present (seed)) then call tao_random_seed (seed) end if call physical%reset_helicity_selection (-1.0_default, -1) call unphysical%reset_helicity_selection (-1.0_default, -1) allocate (p(0:3,2+n_out)) allocate (a(n_hel)) allocate (spin_states_phys(2+n_out,n_hel)) allocate (spin_states_unphys(2+n_out,unphysical%number_spin_states())) call physical%spin_states(spin_states_phys) call unphysical%spin_states(spin_states_unphys) call beams (ROOTS, 0.0_default, 0.0_default, p(:,1), p(:,2)) do i = 1, N call massless_isotropic_decay (ROOTS, p(:,3:)) call physical%new_event (p) call unphysical%new_event (p) do i_flv = 1, n_flv do i_col = 1, n_col do i_hel = 1, n_hel a(i_hel) = physical%get_amplitude (i_flv, i_hel, i_col) ! do i_prt = 1, (2+n_out) ! if (spin_states_phys(i_prt,i_hel).eq.0) then ! a(i_hel) = 0.0_default ! exit ! end if ! end do end do a_avg = sum (abs (a)) / n_hel !write (*, "(1X,'a_avg=',E15.5)") a_avg if (.not. ieee_is_nan (a_avg)) then if (a_avg > 0) then do i_hel = 1, n_hel / 2 ! do i_hel = 1, size(spin_states_unphys,dim=2) wi = unphysical%get_amplitude (i_flv, i_hel, i_col) ! do i_prt = 1, (2+n_out) ! if (spin_states_unphys(i_prt,i_hel).eq.0) then ! wi = 0.0_default ! exit ! end if ! end do attempts = attempts + 1 write (msg, "(1X,'evt=',I5,', flv=',I3,', col=',I3,', hel=',I3)") & i, i_flv, i_col, i_hel passed = .true. call expect_zero (wi, a_avg, trim(msg), passed, & quiet=.true., threshold = threshold) if (.not.passed) then failures = failures + 1 end if end do else ! write (*, "(1X,'evt=',I5,', flv=',I3,', col=',I3,': ', A)") & ! i, i_flv, i_col, "skipped: physical amplitude vanishes" end if else write (*, "(1X,'evt=',I5,', flv=',I3,', col=',I3,': ', A)") & i, i_flv, i_col, "physical amplitude NaN" attempts = attempts + 1 failures = failures + 1 end if end do end do end do deallocate (p) deallocate (a) deallocate (spin_states_phys) deallocate (spin_states_unphys) end subroutine check subroutine quantum_numbers (physical, unphysical, n_out, n_flv, n_hel, n_col, match) type(omega_procedures), intent(in) :: physical, unphysical integer, intent(out) :: n_out, n_flv, n_hel, n_col logical, intent(out) :: match integer, dimension(:,:), allocatable :: & physical_flavor_states, unphysical_flavor_states, & physical_spin_states, unphysical_spin_states integer, dimension(:,:,:), allocatable :: & physical_color_flows, unphysical_color_flows logical, dimension(:,:), allocatable :: & physical_ghost_flags, unphysical_ghost_flags type(omega_color_factor), dimension(:), allocatable :: & physical_color_factors, unphysical_color_factors integer :: n_in, n_prt, n_cix, n_cfs n_in = physical%number_particles_in () n_out = physical%number_particles_out () n_prt = n_in + n_out n_flv = physical%number_flavor_states () n_hel = physical%number_spin_states () n_cix = physical%number_color_indices () n_col = physical%number_color_flows () n_cfs = physical%number_color_factors () match = .true. if (unphysical%number_particles_in () .ne. n_in) then print *, "#particles_in don't match!" match = .false. end if if (unphysical%number_particles_out () .ne. n_out) then print *, "#particles_out don't match!" match = .false. end if if (unphysical%number_flavor_states () .ne. n_flv) then print *, "#flavor_states don't match!" match = .false. end if if (unphysical%number_spin_states () .ne. n_hel/2) then print *, "#spin_states don't match!" ! match = .false. end if if (unphysical%number_color_indices () .ne. n_cix) then print *, "#color_indices don't match!" match = .false. end if if (unphysical%number_color_flows () .ne. n_col) then print *, "#color_flows don't match!" match = .false. end if if (unphysical%number_color_factors () .ne. n_cfs) then print *, "#color_factors don't match!" match = .false. end if if (match) then allocate (physical_flavor_states(n_prt,n_flv), unphysical_flavor_states(n_prt,n_flv)) allocate (physical_spin_states(n_prt,n_hel), unphysical_spin_states(n_prt,n_hel/2)) allocate (physical_color_flows(n_cix,n_prt,n_col), & unphysical_color_flows(n_cix,n_prt,n_col)) allocate (physical_ghost_flags(n_prt,n_col), unphysical_ghost_flags(n_prt,n_col)) allocate (physical_color_factors(n_cfs), unphysical_color_factors(n_cfs)) call physical%flavor_states (physical_flavor_states) call unphysical%flavor_states (unphysical_flavor_states) call physical%spin_states (physical_spin_states) call unphysical%spin_states (unphysical_spin_states) call physical%color_flows (physical_color_flows, physical_ghost_flags) call unphysical%color_flows (unphysical_color_flows, unphysical_ghost_flags) call physical%color_factors (physical_color_factors) call unphysical%color_factors (unphysical_color_factors) if (any (physical_flavor_states .ne. unphysical_flavor_states)) then print *, "flavor states don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if ! if (any (physical_spin_states .ne. unphysical_spin_states)) then ! print *, "spin states don't match!" ! print *, "CAVEAT: this might be due to simple reordering!" ! match = .false. ! end if if (any (physical_color_flows .ne. unphysical_color_flows)) then print *, "color flows don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if if (any (physical_ghost_flags .neqv. unphysical_ghost_flags)) then print *, "ghost flags don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if if (any (.not. color_factors_equal (physical_color_factors, & unphysical_color_factors))) then print *, "color_factors don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if deallocate (physical_flavor_states, unphysical_flavor_states) deallocate (physical_spin_states, unphysical_spin_states) deallocate (physical_color_flows, unphysical_color_flows) deallocate (physical_ghost_flags, unphysical_ghost_flags) deallocate (physical_color_factors, unphysical_color_factors) end if end subroutine quantum_numbers elemental function color_factors_equal (cf1, cf2) result (eq) logical :: eq type(omega_color_factor), intent(in) :: cf1, cf2 eq = (cf1%i1 .eq. cf2%i1) .and. (cf1%i2 .eq. cf2%i2) .and. (cf1%factor .eq. cf2%factor) end function color_factors_equal pure function dot (p, q) result (pq) real(kind=default), dimension(0:), intent(in) :: p, q real(kind=default) :: pq pq = p(0)*q(0) - dot_product (p(1:), q(1:)) end function dot pure subroutine beams (roots, m1, m2, p1, p2) real(kind=default), intent(in) :: roots, m1, m2 real(kind=default), dimension(0:), intent(out) :: p1, p2 real(kind=default) :: m12, m22 m12 = m1**2 m22 = m2**2 p1(0) = (roots**2 + m12 - m22) / (2*roots) p1(1:2) = 0 p1(3) = sqrt (p1(0)**2 - m12) p2(0) = roots - p1(0) p2(1:3) = - p1(1:3) end subroutine beams ! The massless RAMBO algorithm subroutine massless_isotropic_decay (roots, p) real(kind=default), intent(in) :: roots real(kind=default), dimension(0:,:), intent(out) :: p real(kind=default), dimension(0:3,size(p,dim=2)) :: q real(kind=default), dimension(0:3) :: qsum real(kind=double), dimension(4) :: ran_double real(kind=default), dimension(4) :: ran real(kind=default) :: c, s, f, qabs, x, r, z integer :: k ! Generate isotropic null vectors do k = 1, size (p, dim = 2) ! if default is not double or single, we can't use ! tao_random_number directly ... call tao_random_number (ran_double) ran = ran_double ! generate a x*exp(-x) distribution for q(0,k) q(0,k)= -log(ran(1)*ran(2)) c = 2*ran(3)-1 f = 2*PI*ran(4) s = sqrt(1-c*c) q(2,k) = q(0,k)*s*sin(f) q(3,k) = q(0,k)*s*cos(f) q(1,k) = q(0,k)*c enddo ! Boost and rescale the vectors qsum = sum (q, dim = 2) qabs = sqrt (dot (qsum, qsum)) x = roots/qabs do k = 1, size (p, dim = 2) r = dot (q(0:,k), qsum) / qabs z = (q(0,k)+r)/(qsum(0)+qabs) p(1:3,k) = x*(q(1:3,k)-qsum(1:3)*z) p(0,k) = x*r enddo end subroutine massless_isotropic_decay end module ward_lib Index: trunk/omega/tests/compare_driver_majorana.sh =================================================================== --- trunk/omega/tests/compare_driver_majorana.sh (revision 0) +++ trunk/omega/tests/compare_driver_majorana.sh (revision 8416) @@ -0,0 +1,166 @@ +#! /bin/sh +# compare_driver.sh -- +######################################################################## + +tag="$1" +omega_v1="$2" +omega_v2="$3" +shift 3 + +models="sm" + +modules="" + +######################################################################## +while read module threshold abs_threshold n roots model sign mode process; do + + case $module in + + '#'*) # skip comments + ;; + + '') # skip empty lines + ;; + + '!'*) break + ;; + + *) + ######################################################################## + modules="$modules $module" + eval threshold_$module=$threshold + eval abs_threshold_$module=$abs_threshold + eval n_$module=$n + eval roots_$module=$roots + eval sign_$module=$sign + eval process_$module="'$process'" + ######################################################################## + + ov1="`echo $omega_v1 | sed s/%%%/$model/g`" + # echo "running $ov1 -$mode '$process'" 1>&2 + $ov1 "$@" \ + -target:parameter_module parameters_$model \ + -target:module amplitude_compare_${tag}_v1_${module} \ + -$mode "$process" 2>/dev/null + ov2="`echo $omega_v2 | sed s/%%%/$model/g`" + # echo "running $ov2 -$mode '$process'" 1>&2 + $ov2 "$@" \ + -target:parameter_module parameters_$model \ + -target:module amplitude_compare_${tag}_v2_${module} \ + -$mode "$process" 2>/dev/null + ;; + esac + +done +######################################################################## + +for module in $modules; do + + for mode in v1 v2; do + +cat < number_particles_in + p%number_particles_out => number_particles_out + p%number_spin_states => number_spin_states + p%spin_states => spin_states + p%number_flavor_states => number_flavor_states + p%flavor_states => flavor_states + p%number_color_indices => number_color_indices + p%number_color_flows => number_color_flows + p%color_flows => color_flows + p%number_color_factors => number_color_factors + p%color_factors => color_factors + p%color_sum => color_sum + p%new_event => new_event + p%reset_helicity_selection => reset_helicity_selection + p%is_allowed => is_allowed + p%get_amplitude => get_amplitude + end function load +end module interface_compare_${tag}_${mode}_${module} + +EOF + + done + +done + +######################################################################## + +cat < load +EOF + done +done + +for model in $models; do +cat < init_parameters +EOF +done + +cat < 0) then + print *, failures, " failures in ", attempts, " attempts" + failed_processes = failed_processes + 1 + end if +EOF +done + +cat < 0) then + print *, failed_processes, " failed processes in ", attempted_processes, " attempts" + stop 1 + end if +end program compare_driver_majorana +EOF + +exit 0 Index: trunk/omega/tests/fermi_UFO.list =================================================================== --- trunk/omega/tests/fermi_UFO.list (revision 8415) +++ trunk/omega/tests/fermi_UFO.list (revision 8416) @@ -1,13 +1,30 @@ # fermi_UFO.list -- # ---------------------------------------------------------------------- -# thr abs_thr n roots model i j eps process ... +# thr abs_thr n roots model i j eps process ... # ---------------------------------------------------------------------- -eeee 0.70 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- -eeee 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- -eeeea 0.60 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- a -eeeea 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- a -eeeeaa 0.70 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- a a -eeeeaa 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- a a -eeeeaa 0.75 1E-11 1000 1000 SM 5 6 1 scatter e- e- -> e- e- a a -eeeeee 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e+ e- -> e+ e+ e- e- -eeeeee 0.75 1E-11 1000 1000 SM 5 6 -1 scatter e+ e- -> e+ e+ e- e- +eeee 0.70 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- +eeee 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- +eeeea 0.60 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- a +eeeea 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- a +eeeeaa 0.70 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- a a +eeeeaa 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- a a +eeeeaa 0.75 1E-11 1000 1000 SM 5 6 1 scatter e- e- -> e- e- a a +eeeepe 0.70 1E-11 1000 1000 SM 1 2 -1 scatter e- e- -> e- e- e+ e- +eeeepe 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e- e- -> e- e- e+ e- +eeeepe 0.75 1E-11 1000 1000 SM 3 6 -1 scatter e- e- -> e- e- e+ e- +eeeepe 0.75 1E-11 1000 1000 SM 4 6 -1 scatter e- e- -> e- e- e+ e- +peppee 0.75 1E-11 1000 1000 SM 3 4 -1 scatter e+ e- -> e+ e+ e- e- +peppee 0.75 1E-11 1000 1000 SM 5 6 -1 scatter e+ e- -> e+ e+ e- e- +meeee 0.70 1E-11 1000 1000 SM/M 1 2 -1 scatter e- e- -> e- e- +meeee 0.75 1E-11 1000 1000 SM/M 3 4 -1 scatter e- e- -> e- e- +#eeeea 0.40 1E-11 1000 1000 SM/M 1 2 -1 scatter e- e- -> e- e- a +meeeea 0.70 1E-11 1000 1000 SM/M 3 4 -1 scatter e- e- -> e- e- a +#eeeeaa 0.50 1E-11 1000 1000 SM/M 1 2 -1 scatter e- e- -> e- e- a a +meeeeaa 0.75 1E-11 1000 1000 SM/M 3 4 -1 scatter e- e- -> e- e- a a +meeeeaa 0.75 1E-11 1000 1000 SM/M 5 6 1 scatter e- e- -> e- e- a a +meeeepe 0.70 1E-11 1000 1000 SM/M 1 2 -1 scatter e- e- -> e- e- e+ e- +meeeepe 0.75 1E-11 1000 1000 SM/M 3 4 -1 scatter e- e- -> e- e- e+ e- +#eeeepe 0.70 1E-11 1000 1000 SM/M 3 6 -1 scatter e- e- -> e- e- e+ e- +#eeeepe 0.75 1E-11 1000 1000 SM/M 4 6 -1 scatter e- e- -> e- e- e+ e- +mpeppee 0.75 1E-11 1000 1000 SM/M 3 4 -1 scatter e+ e- -> e+ e+ e- e- +mpeppee 0.75 1E-11 1000 1000 SM/M 5 6 -1 scatter e+ e- -> e+ e+ e- e- Index: trunk/omega/tests/benchmark_VM_vs_Fortran_driver.sh =================================================================== --- trunk/omega/tests/benchmark_VM_vs_Fortran_driver.sh (revision 8415) +++ trunk/omega/tests/benchmark_VM_vs_Fortran_driver.sh (revision 8416) @@ -1,153 +1,156 @@ #! /bin/sh # compare_driver.sh -- ######################################################################## tag=VM odefault="$1" ovm="$2" oparams="$2 $3" shift 3 models="QED QCD SM" modules="" ######################################################################## while read module n roots model mode process; do case $module in '#'*) # skip comments ;; '') # skip empty lines ;; + '!'*) break + ;; + *) ######################################################################## modules="$modules $module" eval n_$module=$n eval roots_$module=$roots eval process_$module="'$process'" eval model_$module="'$model'" ######################################################################## ov1="`echo $odefault | sed s/%%%/$model/g`" #echo "running $ov1 -$mode '$process'" 1>&2 $ov1 "$@" \ -target:parameter_module parameters_$model \ -target:module amplitude_compare_${tag}_v1_${module} \ -$mode "$process" 2>/dev/null ov2="`echo $ovm | sed s/%%%/$model/g`" #bc_file="`echo $process | sed 's/->/to/g' | sed 's/ /_/g'`".hbc bc_file=$module.hbc eval bc_file_$module=$bc_file #echo "running $ov2 -$mode '$process', saving to $bc_file" 1>&2 $ov2 "$@" -$mode "$process" 2>/dev/null 1> $bc_file ;; esac done ######################################################################## for module in $modules; do for mode in v1 v2; do if [ $mode == v2 ]; then init="call init()" else init="" fi cat < number_particles_in p%number_particles_out => number_particles_out p%number_spin_states => number_spin_states p%spin_states => spin_states p%number_flavor_states => number_flavor_states p%flavor_states => flavor_states p%number_color_indices => number_color_indices p%number_color_flows => number_color_flows p%color_flows => color_flows p%number_color_factors => number_color_factors p%color_factors => color_factors p%color_sum => color_sum p%new_event => new_event p%reset_helicity_selection => reset_helicity_selection p%is_allowed => is_allowed p%get_amplitude => get_amplitude end function load end module interface_compare_${tag}_${mode}_${module} EOF done done ######################################################################## cat < load EOF done done for model in $models; do cat < init_parameters EOF done cat < Thorsten Ohl Juergen Reuter WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) open Coupling type field = lorentz * int type argument = | G of int (* complex coupling *) | M of int (* real mass (or width) *) | P of int (* momentum *) | F of field (* field *) | V of string (* verbatim *) type keystone = { bra : field; name : string; args : argument list } type vertex = { tag : string; keystones : keystone list } let order_fields (_, i) (_, j) = compare i j let extract_fields { bra; args } = List.sort order_fields (List.fold_left (fun acc arg -> match arg with | F f -> f :: acc | _ -> acc) [bra] args) let check_indices field_list = if List.exists (fun (n, _) -> n > 1) (ThoList.classify (List.map snd field_list)) then invalid_arg "check_indices"; () let spin_to_string = function | Scalar -> "Scalar" | Spinor -> "Spinor" | ConjSpinor -> "ConjSpinor" | Majorana -> "Majorana" | Vector | Massive_Vector -> "Vector" | Tensor_2 -> "Tensor_2" | _ -> failwith "spin_to_string" let fields_to_string fields = "[" ^ String.concat "; " (List.map (fun (s, i) -> Printf.sprintf "%s(%d)" (spin_to_string s) i) fields) ^ "]" let check_fields ks_list = let fields = List.map extract_fields ks_list in if not (ThoList.homogeneous fields) then begin let spins = "[" ^ String.concat "; " (List.map fields_to_string fields) ^ "]" in invalid_arg ("check_spins: " ^ spins) end; check_indices (List.hd fields) open Format_Fortran let spin_type = function | Scalar -> "complex(kind=default)" | Spinor -> "type(spinor)" | ConjSpinor -> "type(conjspinor)" | Majorana -> "type(bispinor)" | Vector | Massive_Vector -> "type(vector)" | Tensor_2 -> "type(tensor)" | _ -> failwith "spin_type" let type_arg = function | G _ -> Some "complex(kind=default)" | M _ -> Some "real(kind=default)" | P _ -> Some "type(momentum)" | F (s, _) -> Some (spin_type s) | V _ -> None let spin_mnemonic = function | Scalar -> "phi" | Spinor -> "psi" | ConjSpinor -> "psibar" | Majorana -> "chi" | Maj_Ghost -> "???" | Vector -> "a" | Massive_Vector -> "v" | Tensor_2 -> "h" | _ -> failwith "spin_mnemonic" let format_coupling i = Printf.sprintf "g%d" i let format_momentum i = Printf.sprintf "p%d" i let format_mass i = Printf.sprintf "m%d" i let format_field (s, i) = Printf.sprintf "%s%d" (spin_mnemonic s) i let format_arg = function | G i -> format_coupling i | M i -> format_mass i | P i -> format_momentum i | F f -> format_field f | V s -> s let fusion_to_fortran ff name args = let printf fmt = fprintf ff fmt in match args with | [] -> invalid_arg "fusion_to_fortran" | arg1 :: arg2n -> printf "%s (%s" name (format_arg arg1); List.iter (fun arg -> printf ",@ %s" (format_arg arg)) arg2n; printf ")" (* \begin{dubious} The ordering here works for Dirac spinors, but fails for Majorana spinors, leading to a sign ambiguity in this test \ldots \end{dubious} *) let keystone_to_fortran ff (ksv, { bra; name; args }) = let printf fmt = fprintf ff fmt and nl = pp_newline ff in printf " @[<2>%s =@ " ksv; begin match bra with | Spinor, _ -> fusion_to_fortran ff name args; printf "@ * %s" (format_field bra) + | Majorana, _ -> + begin match args with + | _ :: F (Majorana, _) :: _ -> + fusion_to_fortran ff name args; + printf "@ * %s" (format_field bra) + | _ -> + printf "%s@ * " (format_field bra); + fusion_to_fortran ff name args + end | _, _ -> printf "%s@ * " (format_field bra); fusion_to_fortran ff name args end; printf "@]"; nl() let keystones_to_subroutine ff { tag; keystones } = check_fields keystones; let printf fmt = fprintf ff fmt and nl = pp_newline ff in printf " @[<4>subroutine@ testks_%s@ (repetitions," tag; printf "@ passed,@ threshold,@ quiet,@ abs_threshold)@]"; nl (); printf " integer, intent(in) :: repetitions"; nl (); printf " logical, intent(inout) :: passed"; nl (); printf " logical, intent(in), optional :: quiet"; nl (); printf " @[<2>real(kind=default),@ intent(in),@ optional ::"; printf "@ threshold,@ abs_threshold@]"; nl (); printf " integer :: i"; nl (); let ks1 = List.hd keystones in let all_momenta = List.map (fun i -> P i) (ThoList.range 0 (List.length (extract_fields ks1) - 1)) in let variables = ThoList.uniq (List.sort compare (F (ks1.bra) :: ks1.args @ all_momenta)) in List.iter (fun a -> match type_arg a with | None -> () | Some t -> printf " @[<2>%s :: %s@]" t (format_arg a); nl ()) variables; let ks_list = List.map (fun (n, ks) -> (Printf.sprintf "ks%d" n, ks)) (ThoList.enumerate 0 keystones) in begin match ks_list with | [] -> failwith "keystones_to_fortran" | (ksv1, _) :: ks2n -> printf " @[<2>complex(kind=default) ::@ %s" ksv1; List.iter (fun (ksv, _) -> printf ",@ %s" ksv) ks2n; printf "@]"; nl () end; printf " do i = 1, repetitions"; nl (); List.iter (fun a -> match a with | P 0 -> () (* this will be determined by momentum conservation! *) | V _ -> () | a -> printf " @[<2>call@ make_random@ (%s)@]" (format_arg a); nl ()) variables; begin match all_momenta with | [] -> failwith "keystones_to_fortran" | p1 :: p2n -> printf " @[<2>%s =" (format_arg p1); List.iter (fun p -> printf "@ - %s" (format_arg p)) p2n; printf "@]"; nl () end; List.iter (keystone_to_fortran ff) ks_list; begin match ks_list with | [] -> failwith "keystones_to_fortran" | (ksv1, ks1) :: ks2n -> List.iter (fun (ksv, ks) -> printf " @[<8>call@ expect@ (%s,@ %s," ksv ksv1; printf "@ '%s: %s <> %s'," tag ks.name ks1.name; printf "@ passed,@ threshold, quiet, abs_threshold)@]"; nl ()) ks2n end; printf " end do"; nl (); printf " @[<2>end@ subroutine@ testks_%s@]" tag; nl () let keystones_to_fortran ff ?(reps=1000) ?(threshold=0.85) ?(omega_module="omega95") ?(modules=[]) vertices = let printf fmt = fprintf ff fmt and nl = pp_newline ff in printf "program keystones_omegalib_demo"; nl (); List.iter (fun m -> printf " use %s" m; nl ()) ("kinds" :: "constants" :: omega_module :: "omega_testtools" :: "keystones_tools" :: modules); printf " implicit none"; nl (); printf " logical :: passed"; nl (); printf " logical, parameter :: quiet = .false."; nl (); printf " integer, parameter :: reps = %d" reps; nl (); printf " real(kind=default), parameter :: threshold = %f" threshold; nl (); printf " real(kind=default), parameter :: abs_threshold = 1E-17"; nl (); printf " integer, dimension(8) :: date_time"; nl (); printf " integer :: rsize"; nl (); printf " call date_and_time (values = date_time)"; nl (); printf " call random_seed (size = rsize)"; nl (); printf " @[<8>call random_seed@ (put = spread (product (date_time),"; printf "@ dim = 1,@ ncopies = rsize))@]"; nl (); printf " passed = .true."; nl (); List.iter (fun v -> printf " @[<8>call testks_%s@ (reps,@ passed," v.tag; printf "@ threshold, quiet, abs_threshold)@]"; nl ()) vertices; printf " if (passed) then"; nl (); printf " stop 0"; nl (); printf " else"; nl (); printf " stop 1"; nl (); printf " end if"; nl (); printf "contains"; nl (); List.iter (keystones_to_subroutine ff) vertices; printf "end program keystones_omegalib_demo"; nl () let generate ?reps ?threshold ?omega_module ?modules vertices = let my_name = Sys.argv.(0) in let verbose = ref false and cat = ref false and usage = "usage: " ^ my_name ^ " ..." in Arg.parse (Arg.align [ ("-cat", Arg.Set cat, " print test snippets"); ("-v", Arg.Set verbose, " be more verbose"); ("-verbose", Arg.Set verbose, " be more verbose") ]) (fun s -> raise (Arg.Bad s)) usage; if !cat then keystones_to_fortran std_formatter ?reps ?threshold ?omega_module ?modules vertices type ufo_vertex = { v_tag : string; v_spins : lorentz array; v_tensor : UFOx.Lorentz.t } type ufo_propagator = { p_tag : string; p_omega : string; p_spins : lorentz * lorentz; p_propagator : UFO.Propagator.t } let transpose p = { p_tag = p.p_tag; p_omega = p.p_omega; p_spins = (snd p.p_spins, fst p.p_spins); p_propagator = UFO.Propagator.transpose p.p_propagator } let equivalent_tensors v_spins alternatives = List.map (fun (v_tag, tensor) -> { v_tag; v_spins; v_tensor = UFOx.Lorentz.of_string tensor }) alternatives module P = Permutation.Default let permute_spins p s = P.array p s (* We must permute only the free indices, of course. Note that we apply the \emph{inverse} permutation to the indices in order to match the permutation of the particles/spins. *) let permute_structure n p l = let permuted = P.array (P.inverse p) (Array.init n succ) in let permute_index i = if i > 0 then permuted.(pred i) else i in UFOx.Lorentz.map_indices permute_index l let permute_vertex n v p = { v_tag = v.v_tag ^ "_p" ^ P.to_string p; v_spins = permute_spins p v.v_spins; v_tensor = permute_structure n p v.v_tensor } let vertex_permutations v = let n = Array.length v.v_spins in List.map (permute_vertex n v) (P.cyclic n) let keystones_of_ufo_vertex { v_tag; v_spins } = { tag = v_tag; keystones = let fields = Array.mapi (fun i s -> (s, i)) v_spins in let n = Array.length fields in List.map (fun p -> let permuted = P.array p fields in match Array.to_list permuted with | [] -> invalid_arg "keystones_of_ufo_vertex" | bra :: args -> { bra; name = v_tag ^ "_p" ^ P.to_string p; args = G (0) :: (ThoList.flatmap (fun (s, i) -> [ F (s, i); P (i) ]) args) }) (P.cyclic n) } let keystones_of_propagator { p_tag; p_omega; p_spins } = let s0, s1 = p_spins in let keystone omega s = match omega, s1 with | _, (Scalar|Tensor_2) | false, _ -> { bra = (s0, 0); name = s; args = [P (1); M (0); M (1); F (s1, 1) ] } | _, Vector -> { bra = (s0, 0); name = s; args = [P (1); F (s1, 1) ] } | true, _ -> { bra = (s0, 0); name = s; args = [P (1); M (0); M (1); V (".false."); F (s1, 1) ] } in { tag = p_tag; keystones = [keystone false ("pr_U_" ^ p_tag); keystone true p_omega] } let merge (ufo_list, omegalib) = match ufo_list with | [] -> omegalib | ufo1 :: _ -> { tag = ufo1.v_tag; keystones = (omegalib.keystones @ ThoList.flatmap (fun ufo -> (keystones_of_ufo_vertex ufo).keystones) ufo_list) } let fusions ff ?(omega_module="omega95") module_name vertices propagators = let printf fmt = fprintf ff fmt and nl () = pp_newline ff () in printf "module %s" module_name; nl (); printf " use kinds"; nl (); printf " use %s" omega_module; nl (); printf " implicit none"; nl (); printf " private"; nl (); let permuted_vertices = ThoList.flatmap vertex_permutations vertices in List.iter (fun v -> printf " public :: %s" v.v_tag; nl ()) permuted_vertices; List.iter (fun p -> printf " public :: pr_U_%s" p.p_tag; nl ()) propagators; UFO_targets.Fortran.eps4_g4_g44_decl std_formatter (); UFO_targets.Fortran.eps4_g4_g44_init std_formatter (); printf "contains"; nl (); List.iter (fun v -> let tensor = UFO_Lorentz.parse (Array.to_list v.v_spins) v.v_tensor in printf " ! %s" (String.make 68 '='); nl (); printf " ! %s" (UFO_Lorentz.to_string tensor); nl (); UFO_targets.Fortran.lorentz std_formatter v.v_tag v.v_spins tensor) permuted_vertices; List.iter (fun p -> UFO_targets.Fortran.propagator std_formatter p.p_tag p.p_spins p.p_propagator.UFO.Propagator.numerator p.p_propagator.UFO.Propagator.denominator) propagators; printf "end module %s" module_name; nl () let generate_ufo ?omega_module ?reps ?threshold module_name vertices propagators = fusions ?omega_module std_formatter module_name (ThoList.flatmap fst vertices) propagators; generate ?reps ?threshold ?omega_module ~modules:[module_name] (List.map merge vertices @ List.map keystones_of_propagator propagators) Index: trunk/omega/tests/compare_driver_VM_wrappers.sh =================================================================== --- trunk/omega/tests/compare_driver_VM_wrappers.sh (revision 8415) +++ trunk/omega/tests/compare_driver_VM_wrappers.sh (revision 8416) @@ -1,52 +1,55 @@ #! /bin/sh # compare_driver.sh -- ######################################################################## tag=VM odefault="$1" ovm="$2" oparams="$2 $3" shift 3 modules="" ######################################################################## while read module threshold abs_threshold n roots model mode process; do case $module in '#'*) # skip comments ;; '') # skip empty lines ;; + '!'*) break + ;; + *) modules="$modules $module" eval threshold_$module=$threshold eval abs_threshold_$module=$abs_threshold eval n_$module=$n eval roots_$module=$roots eval process_$module="'$process'" eval model_$module="'$model'" ;; esac done ######################################################################## for module in $modules; do eval bc_file="\${bc_file_$module}" eval model="\${model_$module}" ovp="`echo $oparams | sed s/%%%/$model/g`" ovp="`echo $ovp | sed s/%%/amplitude_compare_${tag}_v2_${module}/g`" ovp="`echo $ovp | sed s/%/${module}.hbc/g`" #echo "writing wrapper file $params_file with '$ovp'" 1>&2 $ovp 2>/dev/null done ######################################################################## exit 0 Index: trunk/omega/tests/benchmark_driver_wrappers.sh =================================================================== --- trunk/omega/tests/benchmark_driver_wrappers.sh (revision 8415) +++ trunk/omega/tests/benchmark_driver_wrappers.sh (revision 8416) @@ -1,50 +1,53 @@ #! /bin/sh # compare_driver.sh -- ######################################################################## tag=VM odefault="$1" ovm="$2" oparams="$2 $3" shift 3 modules="" ######################################################################## while read module n roots model mode process; do case $module in '#'*) # skip comments ;; '') # skip empty lines ;; + '!'*) break + ;; + *) modules="$modules $module" eval n_$module=$n eval roots_$module=$roots eval process_$module="'$process'" eval model_$module="'$model'" ;; esac done ######################################################################## for module in $modules; do eval bc_file="\${bc_file_$module}" eval model="\${model_$module}" ovp="`echo $oparams | sed s/%%%/$model/g`" ovp="`echo $ovp | sed s/%%/amplitude_compare_${tag}_v2_${module}/g`" ovp="`echo $ovp | sed s/%/${module}.hbc/g`" echo "writing wrapper file $params_file with '$ovp'" 1>&2 $ovp 2>/dev/null done ######################################################################## exit 0 Index: trunk/omega/tests/keystones_UFO_bispinors_generate.ml =================================================================== --- trunk/omega/tests/keystones_UFO_bispinors_generate.ml (revision 8415) +++ trunk/omega/tests/keystones_UFO_bispinors_generate.ml (revision 8416) @@ -1,153 +1,155 @@ (* keystones_UFO_generate.ml -- Copyright (C) 2019-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) open Coupling open Keystones let qed = equivalent_tensors [| Majorana; Vector; Majorana |] [ ("qed", "Gamma(2,1,3)") ] let axial = equivalent_tensors [| Majorana; Vector; Majorana |] [ ("axial1", "Gamma5(1,-1)*Gamma(2,-1,3)"); ("axial2", "-Gamma(2,1,-3)*Gamma5(-3,3)") ] let left = equivalent_tensors [| Majorana; Vector; Majorana |] [ ("left1", "(Identity(1,-1)+Gamma5(1,-1))*Gamma(2,-1,3)"); ("left2", "2*ProjP(1,-1)*Gamma(2,-1,3)"); ("left3", "Gamma(2,1,-3)*(Identity(-3,3)-Gamma5(-3,3))"); ("left4", "2*Gamma(2,1,-3)*ProjM(-3,3)") ] let right = equivalent_tensors [| Majorana; Vector; Majorana |] [ ("right1", "(Identity(1,-1)-Gamma5(1,-1))*Gamma(2,-1,3)"); ("right2", "2*ProjM(1,-1)*Gamma(2,-1,3)"); ("right3", "Gamma(2,1,-3)*(Identity(-3,3)+Gamma5(-3,3))"); ("right4", "2*Gamma(2,1,-3)*ProjP(-3,3)") ] let vector_spinor_current tag = { tag = Printf.sprintf "vector_spinor_current__%s_ff" tag; keystones = [ { bra = (Majorana, 0); name = Printf.sprintf "f_%sf" tag; args = [G (0); F (Vector, 1); F (Majorana, 2)] }; { bra = (Vector, 1); name = Printf.sprintf "%s_ff" tag; args = [G (0); F (Majorana, 0); F (Majorana, 2)] } ] } let scalar = equivalent_tensors [| Majorana; Scalar; Majorana |] [ ("scalar_current", "Identity(1,3)") ] let pseudo = equivalent_tensors [| Majorana; Scalar; Majorana |] [ ("pseudo_current", "Gamma5(1,3)") ] let left_scalar = equivalent_tensors [| Majorana; Scalar; Majorana |] [ ("left_scalar1", "Identity(1,3)-Gamma5(1,3)"); ("left_scalar2", "2*ProjM(1,3)") ] let right_scalar = equivalent_tensors [| Majorana; Scalar; Majorana |] [ ("right_scalar1", "Identity(1,3)+Gamma5(1,3)"); ("right_scalar2", "2*ProjP(1,3)") ] let scalar_spinor_current tag = { tag = Printf.sprintf "scalar_spinor_current__%s_ff" tag; keystones = [ { bra = (Majorana, 0); name = Printf.sprintf "f_%sf" tag; args = [G (0); F (Scalar, 1); F (Majorana, 2)] }; { bra = (Scalar, 1); name = Printf.sprintf "%s_ff" tag; args = [G (0); F (Majorana, 0); F (Majorana, 2)] } ] } let empty = { tag = "empty"; keystones = [ ] } let vertices = [ (qed, vector_spinor_current "v"); (axial, vector_spinor_current "a"); (left, vector_spinor_current "vl"); (right, vector_spinor_current "vr"); (scalar, scalar_spinor_current "s"); (pseudo, scalar_spinor_current "p"); (left_scalar, scalar_spinor_current "sl"); - (right_scalar, scalar_spinor_current "sr") ] + (right_scalar, scalar_spinor_current "sr"); + ] let parse_propagator (p_tag, p_omega, p_spins, numerator, denominator) = let p = UFO.Propagator.of_propagator_UFO + ~majorana:true { UFO.Propagator_UFO.name = p_tag; UFO.Propagator_UFO.numerator = UFOx.Lorentz.of_string numerator; UFO.Propagator_UFO.denominator = UFOx.Lorentz.of_string denominator } in { p_tag; p_omega; p_spins; p_propagator = p } let default_denominator = "P('mu', id) * P('mu', id) - Mass(id) * Mass(id) \ + complex(0,1) * Mass(id) * Width(id)" let majorana_propagator = ( "majorana", "pr_psi", (Majorana, Majorana), "Gamma('mu', 1, 2) * P('mu', id) + Mass(id) * Identity(1, 2)", default_denominator ) let gravitino_propagator = ( "vectorspinor", "pr_grav", (Vectorspinor, Vectorspinor), "(Gamma(-1,1,2)*P(-1,id) - Mass(id)*Identity(1,2)) \ * (Metric(1,2) - P(1,id)*P(2,id)/Mass(id)**2) \ + 1/3 * (Gamma(1,1,-1) - P(1,id)/Mass(id)*Identity(1,-1)) \ * (Gamma(-3,-1,-2)*P(-3,id) + Mass(id)*Identity(-1,-2)) \ * (Gamma(2,-2,2) - P(2,id)/Mass(id)*Identity(-2,2)) ", default_denominator ) let gravitino_propagator = ( "vectorspinor", "pr_grav", (Vectorspinor, Vectorspinor), "(Gamma(-1,2001,2002)*P(-1,id) - Mass(id)*Identity(2001,2002)) \ * (Metric(1001,1002) - P(1001,id)*P(1002,id)/Mass(id)**2) \ + 1/3 * (Gamma(1001,2001,-1) - P(1001,id)/Mass(id)*Identity(2001,-1)) \ * (Gamma(-3,-1,-2)*P(-3,id) + Mass(id)*Identity(-1,-2)) \ * (Gamma(1002,-2,2002) - P(1002,id)/Mass(id)*Identity(-2,2002)) ", default_denominator ) let propagators = List.map parse_propagator [ majorana_propagator; (* [gravitino_propagator] *) ] let _ = generate_ufo ~reps:10000 ~threshold:0.70 ~omega_module:"omega95_bispinors" "fusions" vertices propagators; exit 0 Index: trunk/omega/tests/comparisons_VM.list =================================================================== --- trunk/omega/tests/comparisons_VM.list (revision 8415) +++ trunk/omega/tests/comparisons_VM.list (revision 8416) @@ -1,93 +1,93 @@ # processes to cross-check the OVM with compiled code # # For these comparisons, use the relative threshold `thr` except for amplitudes # smaller than `abs_thr` with `n` points for a fixed `roots` and decay or # scattering `process` in their respective `model` # # ---------------------------------------------------------------------- # thr abs_thr n roots model process # ---------------------------------------------------------------------- # Check QCD and color flows gggg 0.30 1E-12 200 1000 QCD scatter gl gl -> gl gl ggggg 0.30 1E-12 100 1000 QCD scatter gl gl -> gl gl gl uubddb 0.30 1E-15 200 1000 QCD scatter u ubar -> d dbar udud 0.60 1E-15 200 1000 QCD scatter u d -> u d gguub 0.60 1E-15 200 1000 QCD scatter gl gl -> u ubar uubgg 0.60 1E-15 200 1000 QCD scatter u ubar -> gl gl # Check multiple level parallelization with simple QED eeaa 0.60 1E-15 200 1000 QED scatter e+ e- -> A A ee4a 0.40 1E-15 200 50 QED scatter e+ e- -> A A A A eeaee 0.60 1E-15 200 500 QED scatter e+ e- -> A e+ e- aeae 0.60 1E-15 200 1000 QED scatter A e+ -> A e+ aeaea 0.60 1E-15 200 50 QED scatter A e+ -> A e+ A # Check some SM vertices aatt 0.60 1E-15 200 1000 SM scatter t tbar -> A A ttaa 0.60 1E-15 200 1000 SM scatter A A -> t tbar tata 0.60 1E-15 200 1000 SM scatter A t -> A t atat 0.60 1E-15 200 1000 SM scatter A tbar -> A tbar # Check multi-flavor algorithm 2uubgg 0.60 1E-12 200 1000 QCD scatter u:ubar u:ubar -> gl gl 4qj 0.60 1E-12 100 1000 QCD scatter u:ubar:d:dbar u:ubar:d:dbar -> u:ubar:d:dbar u:ubar:d:dbar eeall 0.60 1E-12 200 50 QED scatter e+ e- -> e+:e-:m+:m-:A e+:e-:m+:m-:A e+:e-:m+:m-:A # Check V-A couplings DY 0.60 1E-15 200 1000 SM scatter u ubar -> e+ e- DYj 0.60 1E-15 200 1000 SM scatter u ubar -> e+ e- u:ubar:gl # Check scalar couplings and 1 -> 2, 2 -> 1 SSS 0.60 1E-15 200 1000 SM decay H -> H H 3Sx 0.60 1E-15 1 1000 SM scatter H H -> H 4H 0.60 1E-15 200 1000 SM scatter H H -> H H 5H 0.60 1E-15 200 1000 SM scatter H H -> H H H 6H 0.60 1E-15 200 50 SM scatter H H -> H H H H # Check scalar-vector couplings SVV 0.60 1E-15 200 1000 SM decay H -> W+ W- VSV 0.60 1E-15 200 1000 SM decay Z -> Z H VSSV 0.60 1E-15 200 1000 SM scatter W+ W- -> H H SSVV 0.60 1E-15 200 1000 SM scatter H H -> W+ W- WpWm 0.60 1E-15 200 1000 SM scatter W+ W- -> W+ W- ZZZZ 0.60 1E-15 200 1000 SM scatter Z Z -> Z Z VBF 0.60 1E-12 100 1000 SM scatter u:ubar:d:dbar u:ubar:d:dbar -> u:ubar:d:dbar u:ubar:d:dbar H # Check zero amplitude -uudd 0.60 1E-12 200 1000 QCD scatter u u -> d d +#uudd 0.60 1E-12 200 1000 QCD scatter u u -> d d # Check SM_CKM ttbar 0.60 1E-12 100 50 SM_CKM scatter u ubar -> e+ nue b bbar mu- numubar pidec 0.60 1E-12 200 1000 SM_CKM scatter u dbar -> mu+ numu betdec 0.60 1E-12 200 1000 SM_CKM decay d -> u e- nuebar Bdec 0.60 1E-12 200 1000 SM_CKM decay b -> c e- nuebar scat 0.60 1E-12 200 1000 SM_CKM scatter u g -> d mu+ numu # Check SM_Higgs ggH 0.60 1E-12 1 1000 SM_Higgs scatter g g -> H Hgg 0.60 1E-12 200 1000 SM_Higgs decay H -> g g ggAA 0.60 1E-12 200 1000 SM_Higgs scatter g g -> A A ZHgg 0.60 1E-12 200 1000 SM_Higgs scatter Z A -> g g ggAAH 0.60 1E-12 200 1000 SM_Higgs scatter g g -> A A H ggAAHH 0.60 1E-12 200 1000 SM_Higgs scatter g g -> A A H H # Check Zprime eeuu 0.60 1E-15 200 10000 Zprime scatter e+ e- -> u ubar Zhuub 0.60 1E-15 200 10000 Zprime decay Zh -> u ubar ZhddbA 0.60 1E-15 200 10000 Zprime decay Zh -> d dbar A # Check THDM eeWW 0.60 1E-15 200 10000 THDM scatter e+ e- -> W+ W- eeWWx 0.60 1E-15 200 10000 THDM scatter e+ W- -> e+ W- eeZZ 0.60 1E-15 200 10000 THDM scatter e+ e- -> Z Z eehH 0.60 1E-15 200 10000 THDM scatter e+ e- -> h0 H0 eehA 0.60 1E-15 200 10000 THDM scatter e+ e- -> h0 A0 WWZZZ 0.30 1E-12 200 10000 THDM scatter W+ W- -> Z Z Z # Check THDM_CKM utbdbb 0.60 1E-15 1 1000 THDM_CKM scatter u tbar -> d bbar # Check HSExt ttbS 0.60 1E-15 1 1000 HSExt scatter t tbar -> S ttbHS 0.60 1E-15 200 1000 HSExt scatter t tbar -> S H Index: trunk/omega/tests/compare_lib.f90 =================================================================== --- trunk/omega/tests/compare_lib.f90 (revision 8415) +++ trunk/omega/tests/compare_lib.f90 (revision 8416) @@ -1,618 +1,644 @@ -! compare_lib.f90 -- ! compare_lib.f90 -- compare two O'Mega versions !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Copyright (C) 1999-2020 by ! Wolfgang Kilian ! Thorsten Ohl ! Juergen Reuter ! Christian Speckner ! ! WHIZARD is free software; you can redistribute it and/or modify it ! under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! WHIZARD is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! module compare_lib ! use ieee_arithmetic use kinds use constants use tao_random_numbers use omega95 use omega_interface use omega_testtools implicit none private public :: check public :: omega_flavor_states, omega_squared_matrix_element public :: massless_isotropic_decay, rambo, beams, dot, rambo_check contains elemental function ieee_is_nan (x) result (yorn) logical :: yorn real (kind=default), intent(in) :: x yorn = (x /= x) end function ieee_is_nan subroutine check (v1, v2, roots, threshold, n, & - failures, attempts, seed, abs_threshold, ignore_phase) + failures, attempts, seed, abs_threshold, & + ignore_phase, flip_sign) type(omega_procedures), intent(in) :: v1, v2 real(kind=default), intent(in) :: roots, threshold integer, intent(in) :: n integer, intent(out) :: failures, attempts integer, intent(in), optional :: seed real(kind=default), intent(in), optional :: abs_threshold - logical, intent(in), optional :: ignore_phase + logical, intent(in), optional :: ignore_phase, flip_sign logical :: modulus_only logical :: match, passed integer :: n_out, n_flv, n_hel, n_col integer :: i, i_flv, i_hel, i_col real(kind=default), dimension(:,:), allocatable :: p complex(kind=default) :: a1, a2 - real(kind=default) :: asq1, asq2, s_asq1, s_asq2 + real(kind=default) :: asq1, asq2, s_asq1, s_asq2, relative_sign character(len=80) :: msg modulus_only = .false. if (present (ignore_phase)) then modulus_only = ignore_phase end if + relative_sign = 1 + if (present (flip_sign)) then + if (flip_sign) then + relative_sign = -1 + end if + end if failures = 0 attempts = 0 a1 = 0 a2 = 0 asq1 = 0 asq2 = 0 s_asq1 = 0 s_asq2 = 0 call quantum_numbers (v1, v2, n_out, n_flv, n_hel, n_col, match) if (.not.match) then failures = 1 return end if + if (n_out <= 0) then + print *, "no outgoing particles" + failures = 1 + return + end if + if (n_flv <= 0) then + print *, "no allowed flavor combinations" + failures = 1 + return + end if + if (n_hel <= 0) then + print *, "no allowed helicity combinations" + failures = 1 + return + end if + if (n_col <= 0) then + print *, "no allowed color flows" + failures = 1 + return + end if if (present (seed)) then call tao_random_seed (seed) end if call v1%reset_helicity_selection (-1.0_default, -1) call v2%reset_helicity_selection (-1.0_default, -1) allocate (p(0:3,2+n_out)) call beams (ROOTS, 0.0_default, 0.0_default, p(:,1), p(:,2)) do i = 1, N if (n_out > 1) then call massless_isotropic_decay (ROOTS, p(:,3:)) end if if (n_out == 1) then p(:,3) = p(:,1) + p(:,2) end if call v1%new_event (p) call v2%new_event (p) do i_flv = 1, n_flv do i_hel = 1, n_hel attempts = attempts + 1 passed = .true. do i_col = 1, n_col a1 = v1%get_amplitude (i_flv, i_hel, i_col) - a2 = v2%get_amplitude (i_flv, i_hel, i_col) + a2 = v2%get_amplitude (i_flv, i_hel, i_col)*relative_sign if (ieee_is_nan (real (a1)) .or. ieee_is_nan (aimag (a1))) then write (*, "(1X,'evt=',I5,', flv=',I3,', col=',I3,': ', A)") & i, i_flv, i_col, "v1 amplitude NaN" end if if (ieee_is_nan (real (a2)) .or. ieee_is_nan (aimag (a2))) then write (*, "(1X,'evt=',I5,', flv=',I3,', col=',I3,': ', A)") & i, i_flv, i_col, "v2 amplitude NaN" end if write (msg, "(1X,'evt=',I5,', flv=',I3,', col=',I3,', hel=',I3)") & i, i_flv, i_col, i_hel if (modulus_only) then call expect (abs (a1), abs (a2), trim(msg), passed, & quiet=.true., threshold=threshold, & abs_threshold=abs_threshold) else call expect (a1, a2, trim(msg), passed, & quiet=.true., threshold=threshold, & abs_threshold=abs_threshold) end if end do write (msg, "(1X,'evt=',I5,', flv=',I3,', hel=',I3)") & i, i_flv, i_hel asq1 = v1%color_sum (i_flv, i_hel) s_asq1 = s_asq1 + asq1 asq2 = v2%color_sum (i_flv, i_hel) s_asq2 = s_asq2 + asq2 call expect (asq1, asq2, trim(msg), passed, & quiet=.true., threshold=threshold, & abs_threshold=abs_threshold) if (.not.passed) then failures = failures + 1 end if end do end do end do print *, 'Summed results: ' print *, 's_asq1, s_asq2 = ', s_asq1, s_asq2 deallocate (p) end subroutine check subroutine quantum_numbers (v1, v2, n_out, n_flv, n_hel, n_col, match) type(omega_procedures), intent(in) :: v1, v2 integer, intent(out) :: n_out, n_flv, n_hel, n_col logical, intent(out) :: match integer, dimension(:,:), allocatable :: & v1_flavor_states, v2_flavor_states, & v1_spin_states, v2_spin_states integer, dimension(:,:,:), allocatable :: & v1_color_flows, v2_color_flows logical, dimension(:,:), allocatable :: & v1_ghost_flags, v2_ghost_flags type(omega_color_factor), dimension(:), allocatable :: & v1_color_factors, v2_color_factors integer :: n_in, n_prt, n_cix, n_cfs n_in = v1%number_particles_in () n_out = v1%number_particles_out () n_prt = n_in + n_out n_flv = v1%number_flavor_states () n_hel = v1%number_spin_states () n_cix = v1%number_color_indices () n_col = v1%number_color_flows () n_cfs = v1%number_color_factors () match = .true. if (v2%number_particles_in () .ne. n_in) then print *, "number_particles_in don't match!" match = .false. end if if (v2%number_particles_out () .ne. n_out) then print *, "number_particles_out don't match!" match = .false. end if if (v2%number_flavor_states () .ne. n_flv) then print *, "number_flavor_states don't match!" match = .false. end if if (v2%number_spin_states () .ne. n_hel) then print *, "number_spin_states don't match!" match = .false. end if if (v2%number_color_indices () .ne. n_cix) then print *, "number_color_indices don't match!" match = .false. end if if (v2%number_color_flows () .ne. n_col) then print *, "number_color_flows don't match!" match = .false. end if ! We save only the symmetric part in the OVM !if (v2%number_color_factors () .ne. n_cfs) then !print *, "number_color_factors don't match!" !match = .false. !end if if (match) then allocate (v1_flavor_states(n_prt,n_flv), v2_flavor_states(n_prt,n_flv)) allocate (v1_spin_states(n_prt,n_hel), v2_spin_states(n_prt,n_hel)) allocate (v1_color_flows(n_cix,n_prt,n_col), & v2_color_flows(n_cix,n_prt,n_col)) allocate (v1_ghost_flags(n_prt,n_col), v2_ghost_flags(n_prt,n_col)) !allocate (v1_color_factors(n_cfs), v2_color_factors(n_cfs)) call v1%flavor_states (v1_flavor_states) call v2%flavor_states (v2_flavor_states) call v1%spin_states (v1_spin_states) call v2%spin_states (v2_spin_states) call v1%color_flows (v1_color_flows, v1_ghost_flags) call v2%color_flows (v2_color_flows, v2_ghost_flags) !call v1%color_factors (v1_color_factors) !call v2%color_factors (v2_color_factors) if (any (v1_flavor_states .ne. v2_flavor_states)) then print *, "flavor states don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if if (any (v1_spin_states .ne. v2_spin_states)) then print *, "spin states don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if if (any (v1_color_flows .ne. v2_color_flows)) then print *, "color flows don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if if (any (v1_ghost_flags .neqv. v2_ghost_flags)) then print *, "ghost flags don't match!" print *, "CAVEAT: this might be due to simple reordering!" match = .false. end if !if (any (.not. color_factors_equal (v1_color_factors, & !v2_color_factors))) then !print *, "color_factors don't match!" !print *, "CAVEAT: this might be due to simple reordering!" !match = .false. !end if deallocate (v1_flavor_states, v2_flavor_states) deallocate (v1_spin_states, v2_spin_states) deallocate (v1_color_flows, v2_color_flows) deallocate (v1_ghost_flags, v2_ghost_flags) !deallocate (v1_color_factors, v2_color_factors) end if end subroutine quantum_numbers elemental function color_factors_equal (cf1, cf2) result (eq) logical :: eq type(omega_color_factor), intent(in) :: cf1, cf2 eq = (cf1%i1 .eq. cf2%i1) .and. (cf1%i2 .eq. cf2%i2) .and. (cf1%factor .eq. cf2%factor) end function color_factors_equal subroutine omega_flavor_states (proc, flavors) type(omega_procedures) :: proc integer, dimension(:,:), allocatable, intent(inout) :: flavors integer :: n_in, n_out, n_prt, n_flv n_in = proc%number_particles_in () n_out = proc%number_particles_out () n_prt = n_in + n_out n_flv = proc%number_flavor_states () if (allocated (flavors)) then if (any (size (flavors) /= (/ n_prt, n_flv /))) then deallocate (flavors) allocate (flavors (n_prt, n_flv)) end if else allocate (flavors (n_prt, n_flv)) end if call proc%flavor_states (flavors) end subroutine omega_flavor_states subroutine omega_squared_matrix_element (proc, p, asq, error) type(omega_procedures) :: proc real(kind=default), dimension(0:,:), intent(in) :: p real(kind=default), intent(out) :: asq logical, intent(out) :: error real(kind=default) :: asq_sum integer :: i_hel call proc%new_event (p) error = .false. if (proc%number_flavor_states () /= 1) then print *, "ambiguous flavor in omega amplitude" error = .true. return end if asq_sum = 0 do i_hel = 1, proc%number_spin_states () asq_sum = asq_sum + proc%color_sum (1, i_hel) end do asq = asq_sum / 4 end subroutine omega_squared_matrix_element pure function dot (p, q) result (pq) real(kind=default), dimension(0:), intent(in) :: p, q real(kind=default) :: pq pq = p(0)*q(0) - dot_product (p(1:), q(1:)) end function dot pure subroutine beams (roots, m1, m2, p1, p2) real(kind=default), intent(in) :: roots, m1, m2 real(kind=default), dimension(0:), intent(out) :: p1, p2 real(kind=default) :: m12, m22 m12 = m1**2 m22 = m2**2 p1(0) = (roots**2 + m12 - m22) / (2*roots) p1(1:2) = 0 p1(3) = sqrt (p1(0)**2 - m12) p2(0) = roots - p1(0) p2(1:3) = - p1(1:3) end subroutine beams ! The massless RAMBO algorithm subroutine massless_isotropic_decay (roots, p) real(kind=default), intent(in) :: roots real(kind=default), dimension(0:,:), intent(out) :: p real(kind=default), dimension(0:3,size(p,dim=2)) :: q real(kind=default), dimension(0:3) :: qsum real(kind=double), dimension(4) :: ran_double real(kind=default), dimension(4) :: ran real(kind=default) :: c, s, f, qabs, x, r, z integer :: k ! Generate isotropic null vectors do k = 1, size (p, dim = 2) ! if default is not double or single, we can't use ! tao_random_number directly ... call tao_random_number (ran_double) ran = ran_double ! generate a x*exp(-x) distribution for q(0,k) q(0,k)= -log(ran(1)*ran(2)) c = 2*ran(3)-1 f = 2*PI*ran(4) s = sqrt(1-c*c) q(2,k) = q(0,k)*s*sin(f) q(3,k) = q(0,k)*s*cos(f) q(1,k) = q(0,k)*c enddo ! Boost and rescale the vectors qsum = sum (q, dim = 2) qabs = sqrt (dot (qsum, qsum)) x = roots/qabs do k = 1, size (p, dim = 2) r = dot (q(0:,k), qsum) / qabs z = (q(0,k)+r)/(qsum(0)+qabs) p(1:3,k) = x*(q(1:3,k)-qsum(1:3)*z) p(0,k) = x*r enddo end subroutine massless_isotropic_decay !------------------------------------------------------ ! RAMBO, R. Kleiss, W.J. Stirling, S.D. Ellis. ! Comp. Phys. Commun. 40 (1986) 359 !------------------------------------------------------ subroutine rambo (roots, m, p, weight, unweighted) implicit none real(kind=default), intent(in) :: roots real(kind=default), dimension(:), intent(in) :: m real(kind=default), dimension(0:,:), intent(out) :: p real(kind=default), intent(out) :: weight logical, intent(in) :: unweighted real(kind=default), dimension(0:3,size(m)):: q real(kind=default), dimension(0:3) :: sum_q real(kind=default) :: mass_sum_q real(kind=default), dimension(4) :: random real(kind=default) :: random_weight real(kind=double), dimension(4) :: random_double real(kind=double) :: random_weight_double real(kind=default), dimension(size(m)):: m2, e, v, p2 real(kind=default) :: a,accu,bq,costh,phi,f0,g,g0,pm2 real(kind=default) :: sinth,sm2,w,wt2,wt3,wtm,wtmax,x,x2,xmax,sum_m real(kind=default) :: b(3) integer :: i, iter, k, num_massive real(kind=default), dimension(:), allocatable, save :: z real(kind=default), save :: twopi, log_pi_over_2 real(kind=default), parameter :: ACC = 1d-14 integer, parameter :: MAX_ITERATIONS = 6 integer, save :: underflows = 0, overflows = 0, excessive_weights = 0 if (size(p,dim=2) /= size(m)) then print *, 'rambo: mismatch of array dimensions of M and P' stop end if ! initialize the factorials for the phase space weight if (allocated(z)) then if (size(z) < size(m)) then deallocate (z) end if end if if (.not.allocated(z)) then allocate (z(size(m))) ! z(1) = ??? twopi = 8 * atan (1.0_default) log_pi_over_2 = log (twopi / 4) z(2) = log_pi_over_2 do k = 3, size(z) z(k) = z(k-1) + log_pi_over_2 - 2 * log (real (k-2, kind=default)) end do do k = 3, size(z) z(k) = z(k) - log (real (k-1, kind=default)) end do end if ! check whether total energy suffices and count nonzero masses num_massive = count (m /= 0) sum_m = sum (abs (m)) if (sum_m > roots) then print *, ' RAMBO FAILS: TOTAL MASS =', sum_m, & ' IS NOT', ' SMALLER THAN TOTAL ENERGY =', roots stop end if ! generate N massless momenta generate: do do i = 1, size(m) call tao_random_number (random_double) random = random_double costh = 2 * random(1) - 1 sinth = sqrt (1 - costh*costh) phi = twopi * random(2) q(0,i) = -log (random(3)*random(4)) q(3,i) = q(0,i) * costh q(2,i) = q(0,i) * sinth * cos (phi) q(1,i) = q(0,i) * sinth * sin (phi) end do ! compute the parameters of the conformal transformation sum_q = sum (q, dim=2) mass_sum_q = sqrt (dot (sum_q, sum_q)) b = - sum_q(1:3) / mass_sum_q g = sum_q(0) / mass_sum_q a = 1 / (1 + g) x = roots / mass_sum_q ! TRANSFORM THE Q'S CONFORMALLY INTO THE P'S do i = 1, size(m) bq = b(1) * q(1,i) + b(2) * q(2,i) + b(3) * q(3,i) p(1:3,i) = x * (q(1:3,i) + b * (q(0,i) + a*bq)) p(0,i) = x * (g*q(0,i) + bq) end do ! for unweighted massless momenta, we're done weight = 1 if (num_massive == 0 .and. unweighted) then exit generate end if ! CALCULATE WEIGHT AND POSSIBLE WARNINGS weight = log_pi_over_2 if (size(m) /= 2) then weight = (2*size(m) - 4) * log (roots) + z(size(m)) end if if (weight < - 180) then if (underflows <= 5) then call rambo_flow (weight, 'under') end if underflows = underflows + 1 end if if (weight > 174) then if (overflows <= 5) then call rambo_flow (weight, 'over') end if overflows = overflows + 1 end if ! return FOR WEIGHTED MASSLESS MOMENTA if (num_massive /= 0) then ! MASSIVE PARTICLES: RESCALE THE MOMENTA BY A FACTOR X xmax = sqrt (1 - (sum_m/roots)**2) m2 = m**2 p2 = p(0,:)**2 x = xmax accu = roots * ACC iter = 0 solve: do f0 = - roots g0 = 0 x2 = x*x do i = 1, size(m) e(i) = sqrt (m2(i) + x2 * p2(i)) f0 = f0 + e(i) g0 = g0 + p2(i) / e(i) end do if (abs (f0) > accu) then iter = iter + 1 if (iter <= MAX_ITERATIONS) then x = x - f0 / (x*g0) cycle solve else print *, ' RAMBO WARNS:', MAX_ITERATIONS, & ' ITERATIONS DID NOT GIVE THE', & ' DESIRED ACCURACY =', ACC end if end if exit solve end do solve v = x * p(0,:) P(1:3,:) = x * P(1:3,:) P(0,:) = e ! CALCULATE THE MASS-EFFECT WEIGHT FACTOR wt2 = product (v / e) wt3 = sum (v**2 / e) wtm = (2*size(m) - 3) * log (x) + LOG (wt2 / wt3 * roots) if (unweighted) then ! UNWEIGHTED MASSIVE MOMENTA REQUIRED: ESTIMATE MAXIMUM WEIGHT weight = exp (wtm) if (num_massive <= 1) then ! ONE MASSIVE PARTICLE wtmax = xmax**(4*size(m) - 6) elseif (num_massive > 2) then ! MORE THAN TWO MASSIVE PARTICLES: AN ESTIMATE ONLY wtmax = xmax**(2*size(m) - 5 + num_massive) else ! TWO MASSIVE PARTICLES sm2 = sum (m2) ! this was wrong (always 0) in thr orignal) pm2 = product (m2, mask = (m2 /= 0)) wtmax = ((1 - sm2 / (roots**2))**2 & - 4*pm2 / roots**4)**(size(m) - 1.5_default) end if ! DETERMINE WHETHER OR NOT TO ACCEPT THIS EVENT w = weight / wtmax if (w > 1) then print *, ' RAMBO WARNS: ESTIMATE FOR MAXIMUM WEIGHT =', & wtmax, ' EXCEEDED BY A FACTOR ', w excessive_weights = excessive_weights + 1 end if call tao_random_number (random_weight_double) random_weight = random_weight_double if (w < random_weight) then cycle generate end if weight = 1 else ! return FOR WEIGHTED MASSIVE MOMENTA weight = weight + wtm if (weight < -180) then if (underflows <= 5) then call rambo_flow (weight, 'under') end if underflows = underflows + 1 end if if (weight > 174) then if (overflows <= 5) then call rambo_flow (weight, 'over') end if overflows = overflows + 1 end if weight = exp (weight) end if else weight = exp (weight) end if exit generate end do generate end subroutine rambo subroutine rambo_check (roots, m, p, quiet) real(kind=default), intent(in) :: roots real(kind=default), dimension(:), intent(in) :: m real(kind=default), dimension(0:,:), intent(in) :: p logical, intent (in) :: quiet real(kind=default), dimension(0:3) :: sum_p integer :: mu, i logical :: passed real(kind=default), parameter :: & THRESHOLD_MOMENTUM = 0.80, & THRESHOLD_MASS = 0.45 passed = .true. sum_p = sum (p, dim=2) call expect (sum_p(0), roots, 'energy momentum', & passed, threshold=THRESHOLD_MOMENTUM, quiet=quiet) do mu = 1, 3 call expect_zero (sum_p(mu), roots, 'spatial momentum', & passed, threshold=THRESHOLD_MOMENTUM, quiet=quiet) end do do i = 1, size(m) call expect (dot (p(:,i), p(:,i)), m(i)**2, 'mass shell', & passed, threshold=THRESHOLD_MASS, quiet=quiet) end do if (.not.passed .and. .not.quiet) then do i = 1, size (m) print *, 'M(', i, ') = ', sqrt (abs (dot (p(:,i), p(:,i)))), & 'vs. ', m(i) end do do mu = 0, 3 print *, 'sum p(', mu, ',:) = ', sum_p(mu) end do end if end subroutine rambo_check subroutine rambo_flow (w, f) implicit none real(kind=default), intent(in) :: w character(len=*), intent(in) :: f print *, ' RAMBO WARNS: WEIGHT = EXP(', w,') MAY ', f end subroutine rambo_flow end module compare_lib Index: trunk/omega/tests/keystones_UFO_generate.ml =================================================================== --- trunk/omega/tests/keystones_UFO_generate.ml (revision 8415) +++ trunk/omega/tests/keystones_UFO_generate.ml (revision 8416) @@ -1,357 +1,365 @@ (* keystones_UFO_generate.ml -- Copyright (C) 2019-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) open Coupling open Keystones let qed = equivalent_tensors [| ConjSpinor; Vector; Spinor |] [ ("qed", "Gamma(2,1,3)") ] let axial = equivalent_tensors [| ConjSpinor; Vector; Spinor |] [ ("axial1", "Gamma5(1,-1)*Gamma(2,-1,3)"); ("axial2", "-Gamma(2,1,-3)*Gamma5(-3,3)") ] let left = equivalent_tensors [| ConjSpinor; Vector; Spinor |] [ ("left1", "(Identity(1,-1)+Gamma5(1,-1))*Gamma(2,-1,3)"); ("left2", "2*ProjP(1,-1)*Gamma(2,-1,3)"); ("left3", "Gamma(2,1,-3)*(Identity(-3,3)-Gamma5(-3,3))"); ("left4", "2*Gamma(2,1,-3)*ProjM(-3,3)") ] let right = equivalent_tensors [| ConjSpinor; Vector; Spinor |] [ ("right1", "(Identity(1,-1)-Gamma5(1,-1))*Gamma(2,-1,3)"); ("right2", "2*ProjM(1,-1)*Gamma(2,-1,3)"); ("right3", "Gamma(2,1,-3)*(Identity(-3,3)+Gamma5(-3,3))"); ("right4", "2*Gamma(2,1,-3)*ProjP(-3,3)") ] let vector_spinor_current tag = { tag = Printf.sprintf "vector_spinor_current__%s_ff" tag; keystones = [ { bra = (ConjSpinor, 0); name = Printf.sprintf "f_%sf" tag; args = [G (0); F (Vector, 1); F (Spinor, 2)] }; { bra = (Vector, 1); name = Printf.sprintf "%s_ff" tag; args = [G (0); F (ConjSpinor, 0); F (Spinor, 2)] }; { bra = (Spinor, 2); name = Printf.sprintf "f_f%s" tag; args = [G (0); F (ConjSpinor, 0); F (Vector, 1)] } ] } let scalar = equivalent_tensors [| ConjSpinor; Scalar; Spinor |] [ ("scalar_current", "Identity(1,3)") ] let pseudo = equivalent_tensors [| ConjSpinor; Scalar; Spinor |] [ ("pseudo_current", "Gamma5(1,3)") ] let left_scalar = equivalent_tensors [| ConjSpinor; Scalar; Spinor |] [ ("left_scalar1", "Identity(1,3)-Gamma5(1,3)"); ("left_scalar2", "2*ProjM(1,3)") ] let right_scalar = equivalent_tensors [| ConjSpinor; Scalar; Spinor |] [ ("right_scalar1", "Identity(1,3)+Gamma5(1,3)"); ("right_scalar2", "2*ProjP(1,3)") ] let scalar_spinor_current tag = { tag = Printf.sprintf "scalar_spinor_current__%s_ff" tag; keystones = [ { bra = (ConjSpinor, 0); name = Printf.sprintf "f_%sf" tag; args = [G (0); F (Scalar, 1); F (Spinor, 2)] }; { bra = (Scalar, 1); name = Printf.sprintf "%s_ff" tag; args = [G (0); F (ConjSpinor, 0); F (Spinor, 2)] }; { bra = (Spinor, 2); name = Printf.sprintf "f_f%s" tag; args = [G (0); F (ConjSpinor, 0); F (Scalar, 1)] } ] } let fermi_ss = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_ss", "Identity(1,2)*Identity(3,4)"); ("fermi_ss_f", " (1/4) * Identity(1,4)*Identity(3,2)" ^ " + (1/4) * Gamma(-1,1,4)*Gamma(-1,3,2)" ^ " + (1/8) * Sigma(-1,-2,1,4)*Sigma(-1,-2,3,2)" ^ " - (1/4) * Gamma(-1,1,-4)*Gamma5(-4,4)*Gamma(-1,3,-2)*Gamma5(-2,2)" ^ " + (1/4) * Gamma5(1,4)*Gamma5(3,2)") ] let fermi_vv = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_vv", "Gamma(-1,1,2)*Gamma(-1,3,4)"); ("fermi_vv_f", " Identity(1,4)*Identity(3,2)" ^ " - (1/2) * Gamma(-1,1,4)*Gamma(-1,3,2)" ^ " - (1/2) * Gamma(-1,1,-4)*Gamma5(-4,4)*Gamma(-1,3,-2)*Gamma5(-2,2)" ^ " - Gamma5(1,4)*Gamma5(3,2)") ] let fermi_tt = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_tt1", " Sigma(-1,-2,1,2)*Sigma(-1,-2,3,4)"); ("fermi_tt2", " - Sigma(-1,-2,1,2)*Sigma(-2,-1,3,4)"); ("fermi_tt3", " - Sigma(-2,-1,1,2)*Sigma(-1,-2,3,4)"); ("fermi_tt_f", " 3 * Identity(1,4)*Identity(3,2)" ^ " - (1/2) * Sigma(-1,-2,1,4)*Sigma(-1,-2,3,2)" ^ " + 3 * Gamma5(1,4)*Gamma5(3,2)") ] let fermi_aa = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_aa", "Gamma5(1,-2)*Gamma(-1,-2,2)*Gamma5(3,-3)*Gamma(-1,-3,4)"); ("fermi_aa_f", " - Identity(1,4)*Identity(3,2)" ^ " - (1/2) * Gamma(-1,1,4)*Gamma(-1,3,2)" ^ " - (1/2) * Gamma(-1,1,-4)*Gamma5(-4,4)*Gamma(-1,3,-2)*Gamma5(-2,2)" ^ " + Gamma5(1,4)*Gamma5(3,2)") ] let fermi_pp = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_pp", "Gamma5(1,2)*Gamma5(3,4)"); ("fermi_pp_f", " (1/4) * Identity(1,4)*Identity(3,2)" ^ " - (1/4) * Gamma(-1,1,4)*Gamma(-1,3,2)" ^ " + (1/8) * Sigma(-1,-2,1,4)*Sigma(-1,-2,3,2)" ^ " + (1/4) * Gamma(-1,1,-4)*Gamma5(-4,4)*Gamma(-1,3,-2)*Gamma5(-2,2)" ^ " + (1/4) * Gamma5(1,4)*Gamma5(3,2)") ] let fermi_ll = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_ll", " Gamma(-1,1,-2)*ProjM(-2,2)*Gamma(-1,3,-4)*ProjM(-4,4)"); ("fermi_ll_f", " - Gamma(-1,1,-2)*ProjM(-2,4)*Gamma(-1,3,-4)*ProjM(-4,2)") ] let fermi_va = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_va", "Gamma(-1,1,2)*Gamma5(3,-3)*Gamma(-1,-3,4)") ] let fermi_av = equivalent_tensors [| ConjSpinor; Spinor; ConjSpinor; Spinor |] [ ("fermi_av", "Gamma5(1,-2)*Gamma(-1,-2,2)*Gamma(-1,3,4)") ] let sqed = equivalent_tensors [| Scalar; Vector; Scalar |] [ ("sqed1", "P(2,3)-P(2,1)"); ("sqed2", "2*P(2,3)+P(2,2)"); ("sqed3", "-P(2,2)-2*P(2,1)") ] let vector_scalar_current = { tag = "vector_scalar_current__v_ss"; keystones = [ { bra = (Vector, 1); name = "v_ss"; args = [G (0); F (Scalar, 2); P (2); F (Scalar, 0); P (0)] }; { bra = (Scalar, 0); name = "s_vs"; args = [G (0); F (Vector, 1); P (1); F (Scalar, 2); P (2)] } ] } let svv_t = equivalent_tensors [| Scalar; Vector; Vector |] [ ("svv_t", "P(-1,2)*P(-1,3)*Metric(2,3)-P(2,3)*P(3,2)") ] let scalar_vector_current tag = { tag = Printf.sprintf "transversal_vector_current__s_vv_%s" tag; keystones = [ { bra = (Scalar, 0); name = Printf.sprintf "s_vv_%s" tag; args = [G (0); F (Vector, 1); P (1); F (Vector, 2); P (2)] }; { bra = (Vector, 1); name = Printf.sprintf "v_sv_%s" tag; args = [G (0); F (Scalar, 0); P (0); F (Vector, 2); P (2)] } ] } let gauge = equivalent_tensors [| Vector; Vector; Vector |] [ ("gauge", " Metric(1,2)*P(3,1) - Metric(1,2)*P(3,2) \ + Metric(3,1)*P(2,3) - Metric(3,1)*P(2,1) \ + Metric(2,3)*P(1,2) - Metric(2,3)*P(1,3)") ] let gauge_omega = { tag = "g_gg"; keystones = [ { bra = (Vector, 0); name = "(0,1)*g_gg"; args = [G (0); F (Vector, 1); P (1); F (Vector, 2); P (2)] } ] } (* Note that $C^{-1}=-C$ for the charge conjugation matrix.*) let charge_conjugate_s = equivalent_tensors [| Scalar; ConjSpinor; Spinor |] [ ("gamma1", "Identity(2,3)"); ("gamma1_cc", "C(3,-3)*Identity(-3,-2)*(-C(-2,2))"); ("gamma1_cx", "C(3,-1)*(-C(-1,2))") ] (* $C \gamma_5 C^{-1} = \gamma_5^T$ *) let charge_conjugate_p = equivalent_tensors [| Scalar; ConjSpinor; Spinor |] [ ("gamma5", "Gamma5(2,3)"); ("gamma5_cc", "C(3,-3)*Gamma5(-3,-2)*(-C(-2,2))") ] (* $C \gamma_\mu C^{-1} = - \gamma_\mu^T$ *) let charge_conjugate_v = equivalent_tensors [| Vector; ConjSpinor; Spinor |] [ ("gamma_mu", "Gamma(1,2,3)"); ("gamma_mu_cc", "-C(3,-3)*Gamma(1,-3,-2)*(-C(-2,2))") ] (* $C \gamma_5\gamma_\mu C^{-1} = (\gamma_5\gamma_\mu)^T$ *) let charge_conjugate_a = equivalent_tensors [| Vector; ConjSpinor; Spinor |] [ ("gamma_5mu", "Gamma5(2,-2)*Gamma(1,-2,3)"); ("gamma_5mu_cc", "C(3,-3)*Gamma5(-3,-1)*Gamma(1,-1,-2)*(-C(-2,2))") ] (* $C \sigma_{\mu\nu} C^{-1} = - \sigma_{\mu\nu}^T$ *) let charge_conjugate_t = equivalent_tensors [| Vector; Vector; ConjSpinor; Spinor |] [ ("sigma_munu", "Sigma(1,2,3,4)"); ("sigma_munu_cc", "-C(4,-4)*Sigma(1,2,-4,-3)*(-C(-3,3))") ] +(* $C \gamma_\mu \gamma_\nu C^{-1} = \gamma_\nu^T \gamma_\mu^T$ *) +let charge_conjugate_vv = + equivalent_tensors + [| Vector; Vector; ConjSpinor; Spinor |] + [ ("gamma_mu_nu", "Gamma(1,3,-1)*Gamma(2,-1,4)"); + ("gamma_mu_nu_cc", "C(4,-4)*Gamma(2,-4,-1)*Gamma(1,-1,-3)*(-C(-3,3))") ] + let empty = { tag = "empty"; keystones = [ ] } let vertices = [ (qed, vector_spinor_current "v"); (axial, vector_spinor_current "a"); (left, vector_spinor_current "vl"); (right, vector_spinor_current "vr"); (scalar, scalar_spinor_current "s"); (pseudo, scalar_spinor_current "p"); (left_scalar, scalar_spinor_current "sl"); (right_scalar, scalar_spinor_current "sr"); (sqed, vector_scalar_current); (fermi_ss, empty); (fermi_vv, empty); (fermi_tt, empty); (fermi_aa, empty); (fermi_pp, empty); (fermi_ll, empty); (fermi_va, empty); (fermi_av, empty); (svv_t, scalar_vector_current "t"); (gauge, gauge_omega); (charge_conjugate_s, empty); (charge_conjugate_p, empty); (charge_conjugate_v, empty); (charge_conjugate_a, empty); - (charge_conjugate_t, empty) ] + (charge_conjugate_t, empty); + (charge_conjugate_vv, empty) ] let parse_propagator (p_tag, p_omega, p_spins, numerator, denominator) = let p = UFO.Propagator.of_propagator_UFO { UFO.Propagator_UFO.name = p_tag; UFO.Propagator_UFO.numerator = UFOx.Lorentz.of_string numerator; UFO.Propagator_UFO.denominator = UFOx.Lorentz.of_string denominator } in { p_tag; p_omega; p_spins; p_propagator = p } let default_denominator = "P('mu', id) * P('mu', id) - Mass(id) * Mass(id) \ + complex(0,1) * Mass(id) * Width(id)" let scalar_propagator = ( "scalar", "pr_phi", (Scalar, Scalar), "1", default_denominator ) let spinor_propagator = ( "spinor", "pr_psi", (ConjSpinor, Spinor), "Gamma('mu', 1, 2) * P('mu', id) + Mass(id) * Identity(1, 2)", default_denominator ) let conjspinor_propagator = ( "conjspinor", "pr_psibar", (ConjSpinor, Spinor), "Gamma('mu', 1, 2) * P('mu', id) + Mass(id) * Identity(1, 2)", default_denominator ) let feynman_propagator = ( "feynman", "pr_feynman", (Vector, Vector), " - Metric(1, 2)", "P('mu', id) * P('mu', id)" ) let unitarity_propagator = ( "unitarity", "pr_unitarity", (Massive_Vector, Massive_Vector), "- Metric(1, 2) + Metric(1,'mu')*P('mu', id)*P(2, id)/Mass(id)**2", default_denominator ) let tensor_propagator = ( "tensor", "pr_tensor", (Tensor_2, Tensor_2), " 1/2 * (Metric(1001,1002) - P(1001,id)*P(1002,id)/Mass(id)**2) \ * (Metric(2001,2002) - P(2001,id)*P(2002,id)/Mass(id)**2) \ + 1/2 * (Metric(1001,2002) - P(1001,id)*P(2002,id)/Mass(id)**2) \ * (Metric(2001,1002) - P(2001,id)*P(1002,id)/Mass(id)**2) \ - 1/3 * (Metric(1001,2001) - P(1001,id)*P(2001,id)/Mass(id)**2) \ * (Metric(1002,2002) - P(1002,id)*P(2002,id)/Mass(id)**2) ", default_denominator ) let tensor_propagator_51_52 = ( "tensor_51_52", "pr_tensor", (Tensor_2, Tensor_2), " 1/2 * (Metric( 1, 2) - P( 1,id)*P( 2,id)/Mass(id)**2) \ * (Metric(51,52) - P(51,id)*P(52,id)/Mass(id)**2) \ + 1/2 * (Metric( 1,52) - P( 1,id)*P(52,id)/Mass(id)**2) \ * (Metric(51, 2) - P(51,id)*P( 2,id)/Mass(id)**2) \ - 1/3 * (Metric( 1,51) - P( 1,id)*P(51,id)/Mass(id)**2) \ * (Metric( 2,52) - P( 2,id)*P(52,id)/Mass(id)**2) ", default_denominator ) let propagators = List.map parse_propagator [ scalar_propagator; spinor_propagator; feynman_propagator; unitarity_propagator; tensor_propagator; tensor_propagator_51_52 ] let conjugate_propagators = List.map (fun p -> transpose (parse_propagator p)) [ conjspinor_propagator ] let all_propagators = propagators @ conjugate_propagators let _ = generate_ufo ~reps:10000 ~threshold:0.70 "fusions" vertices all_propagators; exit 0 Index: trunk/omega/tests/comparisons_majorana.list =================================================================== --- trunk/omega/tests/comparisons_majorana.list (revision 0) +++ trunk/omega/tests/comparisons_majorana.list (revision 8416) @@ -0,0 +1,23 @@ +# comparisons_majorana.list -- +######################################################################## +# NB: the *overall* sign of an apmplitude may change depending on whether +# we compute with Fusion.Mixed23 or Fusion.Mixed23_Majorana +######################################################################## +# ---------------------------------------------------------------------- +# thr abs_thr n roots model sign process ... +# ---------------------------------------------------------------------- +eeee 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- +eeeea 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- A +eeeeaa 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- A A +eeeeep 0.80 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- e+ e- +aaep 0.90 1E-11 1000 1000 SM .false. scatter A A -> e+ e- +aaepep 0.75 1E-11 1000 1000 SM .false. scatter A A -> e+ e- e+ e- +eaea 0.90 1E-11 1000 1000 SM .false. scatter e- A -> e- A +epaa 0.90 1E-11 1000 1000 SM .true. scatter e+ e- -> A A +epep 0.90 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- +epepa 0.75 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- A +epepaa 0.80 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- A A +epepep 0.80 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- +epepepa 0.70 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- A +epepepaa 0.70 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- A A +epepepep 0.70 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- e+ e- Index: trunk/omega/tests/fermi_lib.f90 =================================================================== --- trunk/omega/tests/fermi_lib.f90 (revision 8415) +++ trunk/omega/tests/fermi_lib.f90 (revision 8416) @@ -1,296 +1,316 @@ ! fermi_lib.f90 -- check On Shell Ward Identities in O'Mega !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Copyright (C) 1999-2020 by ! Wolfgang Kilian ! Thorsten Ohl ! Juergen Reuter ! Christian Speckner ! ! WHIZARD is free software; you can redistribute it and/or modify it ! under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! WHIZARD is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! module fermi_lib ! use ieee_arithmetic use kinds use constants use tao_random_numbers use omega95 use omega_interface use omega_testtools implicit none private public :: check contains elemental function ieee_is_nan (x) result (yorn) logical :: yorn real (kind=default), intent(in) :: x yorn = (x /= x) end function ieee_is_nan subroutine check (process, i, j, eps, roots, threshold, abs_threshold, & n, failures, attempts, seed) type(omega_procedures), intent(in) :: process integer, intent(in) :: i, j, eps real(kind=default), intent(in) :: roots, threshold, abs_threshold integer, intent(in) :: n integer, intent(out) :: failures, attempts integer, intent(in), optional :: seed logical :: match, passed integer :: n_in, n_out, n_prt, n_flv, n_hel, n_col, n_cix integer :: k, k_flv, k_hel, k_col, k_xhl, k_xcl ! integer :: k_prt integer, dimension(:,:,:), allocatable :: color_states logical, dimension(:,:), allocatable :: ghost_flags integer, dimension(:,:), allocatable :: spin_states integer, dimension(:), allocatable :: spin_map, color_map real(kind=default), dimension(:,:), allocatable :: p complex(kind=default), dimension(:,:,:), allocatable :: a1, a2 complex(kind=default) :: aa1, aa2 character(len=80) :: msg failures = 0 attempts = 0 if (present (seed)) then call tao_random_seed (seed) end if n_in = process%number_particles_in () n_out = process%number_particles_out () n_prt = n_in + n_out n_flv = process%number_flavor_states () n_hel = process%number_spin_states () n_col = process%number_color_flows () n_cix = process%number_color_indices () + if (n_out <= 0) then + print *, "no outgoing particles" + failures = 1 + return + end if + if (n_flv <= 0) then + print *, "no allowed flavor combinations" + failures = 1 + return + end if + if (n_hel <= 0) then + print *, "no allowed helicity combinations" + failures = 1 + return + end if + if (n_col <= 0) then + print *, "no allowed color flows" + failures = 1 + return + end if if (max (i, j) > n_prt .or. min (i, j) < 1) then print *, "invalid #particles, i or j!" stop 2 end if call process%reset_helicity_selection (-1.0_default, -1) allocate (p(0:3,n_prt)) allocate (a1(n_flv,n_hel,n_col), a2(n_flv,n_hel,n_col)) allocate (spin_states(n_prt,n_hel)) allocate (spin_map(n_hel)) allocate (color_states(n_cix,n_prt,n_col)) allocate (ghost_flags(n_prt,n_col)) allocate (color_map(n_col)) call process%spin_states(spin_states) call spin_exchange (spin_map, spin_states, i, j) call process%color_flows (color_states,ghost_flags) ! call color_exchange (color_map, color_states, i, j) if (n_in == 2) then call beams (ROOTS, 0.0_default, 0.0_default, p(:,1), p(:,2)) else if (n_in == 1) then p(0,1) = ROOTS p(1:3,1) = 0 else stop end if do k = 1, N attempts = attempts + 1 passed = .true. call massless_isotropic_decay (ROOTS, p(:,3:)) call process%new_event (p) do k_flv = 1, n_flv do k_col = 1, n_col do k_hel = 1, n_hel a1(k_flv,k_hel,k_col) & = process%get_amplitude (k_flv, k_hel, k_col) end do end do end do ! print *, p call exchange_momentum (p, i, j) ! print *, p call process%new_event (p) do k_flv = 1, n_flv do k_col = 1, n_col do k_hel = 1, n_hel a2(k_flv,k_hel,k_col) & = process%get_amplitude (k_flv, k_hel, k_col) end do end do end do do k_flv = 1, n_flv do k_col = 1, n_col k_xcl = k_col ! k_xcl = color_map(k_col) ! print *, 'c (', k_col, ') = ', color_states(:,:,k_col) ! print *, 'cx(', k_xcl, ') = ', color_states(:,:,k_xcl) do k_hel = 1, n_hel k_xhl = spin_map(k_hel) ! print *, 'h = ', spin_states(:,k_hel) ! print *, 'hx = ', spin_states(:,k_xhl) aa1 = a1(k_flv,k_hel,k_col) aa2 = a2(k_flv,k_xhl,k_xcl) if (ieee_is_nan (real (aa1)) .or. ieee_is_nan (aimag (aa1))) then write (*, "(1X,'evt=',I5,', flv=',I3, & &', hel=',I3,', col=',I3,': ', A)") & k, k_flv, k_hel, k_col, "v1 amplitude NaN" end if if (ieee_is_nan (real (aa2)) .or. ieee_is_nan (aimag (aa2))) then write (*, "(1X,'evt=',I5,', flv=',I3, & &', hel=',I3,', col=',I3,': ', A)") & k, k_flv, k_xhl, k_xcl, "v2 amplitude NaN" end if write (msg, "(1X,'evt=',I5,', flv=',I3, & &', col=',I3,',',I3,', hel=',I3,',',I3)") & k, k_flv, k_col, k_xcl, k_hel, k_xhl call expect (aa1, eps * aa2, trim(msg), passed, & quiet=.true., threshold=threshold, & abs_threshold=abs_threshold) if (.not.passed) then failures = failures + 1 end if end do end do end do end do deallocate (p) deallocate (a1, a2) deallocate (spin_states) end subroutine check subroutine exchange_momentum (p, i, j) real(kind=default), dimension(0:,:), intent(inout) :: p integer, intent(in) :: i, j real(kind=default), dimension(0:ubound(p,1)) :: tmp tmp = p(:,j) p(:,j) = p(:,i) p(:,i) = tmp end subroutine exchange_momentum subroutine exchange_spins (h, i, j) integer, dimension(:,:), intent(inout) :: h integer, intent(in) :: i, j integer, dimension(size(h,2)) :: tmp tmp = h(j,:) h(j,:) = h(i,:) h(i,:) = tmp end subroutine exchange_spins subroutine spin_exchange (map, h, i, j) integer, dimension(:), intent(inout) :: map integer, dimension(:,:), intent(in) :: h integer, intent(in) :: i, j integer, dimension(size(h,1),size(h,2)) :: hx integer :: k, l hx = h call exchange_spins (hx, i, j) do l = 1, size (h, 2) find: do k = 1, size (h, 2) if (all (hx(:,k) == h(:,l))) then map(l) = k exit find endif end do find end do end subroutine spin_exchange subroutine exchange_colors (c, i, j) integer, dimension(:,:,:), intent(inout) :: c integer, intent(in) :: i, j integer, dimension(size(c,1),size(c,3)) :: tmp tmp = c(:,j,:) c(:,j,:) = c(:,i,:) c(:,i,:) = tmp end subroutine exchange_colors subroutine color_exchange (map, c, i, j) integer, dimension(:), intent(inout) :: map integer, dimension(:,:,:), intent(in) :: c integer, intent(in) :: i, j integer, dimension(size(c,1),size(c,2),size(c,3)) :: cx integer :: k, l cx = c call exchange_colors (cx, i, j) do l = 1, size (c, 3) print *, 'c (', l, ') = ', c(:,:,l) end do do l = 1, size (c, 3) print *, 'cx(', l, ') = ', cx(:,:,l) end do do l = 1, size (c, 3) map(l) = l find: do k = 1, size (c, 3) ! this does NOT work!!! ! color flow indices can be renamed ! for equivalent flows ... if (all (cx(:,:,k) == c(:,:,l))) then print *, 'map: ', l, ' -> ', k map(l) = k exit find endif end do find end do end subroutine color_exchange pure function dot (p, q) result (pq) real(kind=default), dimension(0:), intent(in) :: p, q real(kind=default) :: pq pq = p(0)*q(0) - dot_product (p(1:), q(1:)) end function dot pure subroutine beams (roots, m1, m2, p1, p2) real(kind=default), intent(in) :: roots, m1, m2 real(kind=default), dimension(0:), intent(out) :: p1, p2 real(kind=default) :: m12, m22 m12 = m1**2 m22 = m2**2 p1(0) = (roots**2 + m12 - m22) / (2*roots) p1(1:2) = 0 p1(3) = sqrt (p1(0)**2 - m12) p2(0) = roots - p1(0) p2(1:3) = - p1(1:3) end subroutine beams ! The massless RAMBO algorithm subroutine massless_isotropic_decay (roots, p) real(kind=default), intent(in) :: roots real(kind=default), dimension(0:,:), intent(out) :: p real(kind=default), dimension(0:3,size(p,dim=2)) :: q real(kind=default), dimension(0:3) :: qsum real(kind=double), dimension(4) :: ran_double real(kind=default), dimension(4) :: ran real(kind=default) :: c, s, f, qabs, x, r, z integer :: k ! Generate isotropic null vectors do k = 1, size (p, dim = 2) ! if default is not double or single, we can't use ! tao_random_number directly ... call tao_random_number (ran_double) ran = ran_double ! generate a x*exp(-x) distribution for q(0,k) q(0,k)= -log(ran(1)*ran(2)) c = 2*ran(3)-1 f = 2*PI*ran(4) s = sqrt(1-c*c) q(2,k) = q(0,k)*s*sin(f) q(3,k) = q(0,k)*s*cos(f) q(1,k) = q(0,k)*c enddo ! Boost and rescale the vectors qsum = sum (q, dim = 2) qabs = sqrt (dot (qsum, qsum)) x = roots/qabs do k = 1, size (p, dim = 2) r = dot (q(0:,k), qsum) / qabs z = (q(0,k)+r)/(qsum(0)+qabs) p(1:3,k) = x*(q(1:3,k)-qsum(1:3)*z) p(0,k) = x*r enddo end subroutine massless_isotropic_decay end module fermi_lib Index: trunk/omega/tests/comparisons_majorana_UFO.list =================================================================== --- trunk/omega/tests/comparisons_majorana_UFO.list (revision 0) +++ trunk/omega/tests/comparisons_majorana_UFO.list (revision 8416) @@ -0,0 +1,26 @@ +# comparisons_majorana_UFO.list -- +######################################################################## +# NB: the *overall* sign of an apmplitude may change depending on whether +# we compute with Fusion.Mixed23 or Fusion.Mixed23_Majorana +######################################################################## +# +# ---------------------------------------------------------------------- +# thr abs_thr n roots model sign process ... +# ---------------------------------------------------------------------- +eeee 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- +#eeea 0.40 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- a +#eeeaa 0.90 1E-11 1000 1000 SM .false. scatter e- e- -> e- e- a a +#eeeep 0.80 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- e+ e- +#eeeeep 0.80 1E-11 1000 1000 SM .false. scatter e- e- -> e- e- e+ e- +aaep 0.90 1E-11 1000 1000 SM .false. scatter a a -> e+ e- +#aepep 0.90 1E-11 1000 1000 SM .true. scatter a a -> e+ e- e+ e- +eaea 0.90 1E-11 1000 1000 SM .false. scatter e- a -> e- a +epaa 0.90 1E-11 1000 1000 SM .true. scatter e+ e- -> a a +epep 0.65 1E-11 1000 1000 SM .false. scatter e+ e- -> e+ e- +#pepa 0.90 1E-11 1000 1000 SM .false. scatter e+ e- -> e+ e- a +#pepaa 0.90 1E-11 1000 1000 SM .false. scatter e+ e- -> e+ e- a a +#pepep 0.80 1E-11 1000 1000 SM .false. scatter e+ e- -> e+ e- e+ e- +epvv 0.90 1E-11 1000 1000 SM .false. scatter e+ e- -> ve~ ve +epvva 0.90 1E-11 1000 1000 SM .false. scatter e+ e- -> ve~ ve a +vvep 0.90 1E-11 1000 1000 SM .false. scatter ve~ ve -> e+ e- +#vepa 0.40 1E-11 1000 1000 SM .false. scatter ve~ ve -> e+ e- a Index: trunk/omega/tests/compare_driver_majorana_UFO.sh =================================================================== --- trunk/omega/tests/compare_driver_majorana_UFO.sh (revision 0) +++ trunk/omega/tests/compare_driver_majorana_UFO.sh (revision 8416) @@ -0,0 +1,165 @@ +#! /bin/sh +# compare_driver.sh -- +######################################################################## + +tag="$1" +omega_dirac="$2" +omega_majorana="$3" +ufo_path="$4" +shift 4 + +models="sm_ufo" + +modules="" + +######################################################################## +while read module threshold abs_threshold n roots model sign mode process; do + + case $module in + + '#'*) # skip comments + ;; + + '') # skip empty lines + ;; + + '!'*) break + ;; + + *) + ######################################################################## + modules="$modules $module" + eval threshold_$module=$threshold + eval abs_threshold_$module=$abs_threshold + eval n_$module=$n + eval roots_$module=$roots + eval sign_$module=$sign + eval process_$module="'$process'" + ######################################################################## + + $omega_dirac \ + -model:UFO_dir $ufo_path/$model -model:exec \ + -target:parameter_module parameters_${model}_UFO \ + -target:module amplitude_compare_${tag}_v1_${module} \ + -$mode "$process" 2>/dev/null + $omega_majorana -model:Majorana \ + -model:UFO_dir $ufo_path/$model -model:exec \ + -target:parameter_module parameters_${model}_UFO \ + -target:module amplitude_compare_${tag}_v2_${module} \ + -$mode "$process" 2>/dev/null + ;; + esac + +done +######################################################################## + +for module in $modules; do + + for mode in v1 v2; do + +cat < number_particles_in + p%number_particles_out => number_particles_out + p%number_spin_states => number_spin_states + p%spin_states => spin_states + p%number_flavor_states => number_flavor_states + p%flavor_states => flavor_states + p%number_color_indices => number_color_indices + p%number_color_flows => number_color_flows + p%color_flows => color_flows + p%number_color_factors => number_color_factors + p%color_factors => color_factors + p%color_sum => color_sum + p%new_event => new_event + p%reset_helicity_selection => reset_helicity_selection + p%is_allowed => is_allowed + p%get_amplitude => get_amplitude + end function load +end module interface_compare_${tag}_${mode}_${module} + +EOF + + done + +done + +######################################################################## + +cat < load +EOF + done +done + +for model in $models; do +cat < setup_parameters +EOF +done + +cat < 0) then + print *, failures, " failures in ", attempts, " attempts" + failed_processes = failed_processes + 1 + end if +EOF +done + +cat < 0) then + print *, failed_processes, " failed processes in ", attempted_processes, " attempts" + stop 1 + end if +end program compare_driver_majorana +EOF + +exit 0 Index: trunk/omega/tests/fermi_driver_UFO.sh =================================================================== --- trunk/omega/tests/fermi_driver_UFO.sh (revision 8415) +++ trunk/omega/tests/fermi_driver_UFO.sh (revision 8416) @@ -1,158 +1,171 @@ #! /bin/sh # fermi_driver_UFO.sh -- ######################################################################## -omega="$1" +omega_dirac="$1" +shift + +omega_majorana="$1" +shift + +omega_path="$1" shift models="sm_ufo" modules="" ######################################################################## while read prefix threshold abs_threshold n roots model i j eps mode process; do case $prefix in '#'*) # skip comments ;; '') # skip empty lines ;; '!'*) break ;; *) ######################################################################## module=${prefix}_${i}_${j} modules="$modules $module" eval threshold_$module=$threshold eval abs_threshold_$module=$abs_threshold eval n_$module=$n eval i_$module=$i eval j_$module=$j eval eps_$module=$eps eval roots_$module=$roots eval process_$module="'$process'" + eval model_$module="$model" ######################################################################## - # echo "running $omega_bin -$mode '$process'" 1>&2 - $omega "$@" -model:exec \ + omega=$omega_dirac + case "$model" in + */M) model=`echo $model | sed 's|/M||'` + omega="$omega_majorana -model:Majorana";; + MSSM) omega="$omega_majorana -model:Majorana";; + esac + $omega -model:UFO_dir $omega_path/$model "$@" -model:exec \ -target:parameter_module parameters_sm_ufo \ -target:module amplitude_fermi_ufo_$module \ -$mode "$process" 2>/dev/null ;; esac done ######################################################################## for module in $modules; do cat < number_particles_in p%number_particles_out => number_particles_out p%number_spin_states => number_spin_states p%spin_states => spin_states p%number_flavor_states => number_flavor_states p%flavor_states => flavor_states p%number_color_indices => number_color_indices p%number_color_flows => number_color_flows p%color_flows => color_flows p%number_color_factors => number_color_factors p%color_factors => color_factors p%color_sum => color_sum p%new_event => new_event p%reset_helicity_selection => reset_helicity_selection p%is_allowed => is_allowed p%get_amplitude => get_amplitude end function load end module interface_fermi_ufo_${module} EOF done ######################################################################## cat < load EOF done for model in $models; do cat < setup_parameters EOF done cat < $j)" + print *, "checking process '$process' ($i <=> $j) in $model" call check (load_$module (), i = $i, j = $j, eps = $eps, & roots = real ($roots, kind=default), & threshold = real ($threshold, kind=default), & abs_threshold = real ($abs_threshold, kind=default), & n = $n, seed = SEED, & failures = failures, attempts = attempts) if (failures > 0) then print *, failures, " failures in ", attempts, " attempts" failed_processes = failed_processes + 1 end if EOF done cat < 0) then print *, failed_processes, " failed processes in ", attempted_processes, " attempts" stop 1 end if end program fermi_ufo_driver EOF exit 0 Index: trunk/omega/tests/comparisons_majorana_legacy.list =================================================================== --- trunk/omega/tests/comparisons_majorana_legacy.list (revision 0) +++ trunk/omega/tests/comparisons_majorana_legacy.list (revision 8416) @@ -0,0 +1,23 @@ +# comparisons_majorana_legacy.list -- +######################################################################## +# NB: the *overall* sign of an apmplitude may change depending on wether +# we compute with Fusion.Mixed23 or Fusion_vintage.Mixed23_Majorana +######################################################################## +# ---------------------------------------------------------------------- +# thr abs_thr n roots model sign process ... +# ---------------------------------------------------------------------- +eeee 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- +eeeea 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- A +eeeeaa 0.90 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- A A +eeeeep 0.80 1E-11 1000 1000 SM .true. scatter e- e- -> e- e- e+ e- +aaep 0.90 1E-11 1000 1000 SM .false. scatter A A -> e+ e- +aaepep 0.75 1E-11 1000 1000 SM .false. scatter A A -> e+ e- e+ e- +eaea 0.90 1E-11 1000 1000 SM .false. scatter e- A -> e- A +epaa 0.90 1E-11 1000 1000 SM .true. scatter e+ e- -> A A +epep 0.90 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- +epepa 0.75 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- A +epepaa 0.80 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- A A +epepep 0.80 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- +epepepa 0.70 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- A +epepepaa 0.70 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- A A +epepepep 0.70 1E-11 1000 1000 SM .true. scatter e+ e- -> e+ e- e+ e- e+ e- Index: trunk/omega/tests/benchmark_amp_parallel_driver.sh =================================================================== --- trunk/omega/tests/benchmark_amp_parallel_driver.sh (revision 8415) +++ trunk/omega/tests/benchmark_amp_parallel_driver.sh (revision 8416) @@ -1,175 +1,178 @@ #! /bin/sh # benchmark_amp_parallel_driver.sh - Compare between amplitude # parallelization and phase space parallelization ######################################################################## odefault="$1" ovm="$2" oparams="$2 $3" shift 3 models="QED QCD SM" modules="" ######################################################################## while read module n roots model mode process; do case $module in '#'*) # skip comments ;; '') # skip empty lines ;; + '!'*) break + ;; + *) ######################################################################## modules="$modules $module" eval n_$module=$n eval roots_$module=$roots eval process_$module="'$process'" eval model_$module="'$model'" ######################################################################## ov2="`echo $ovm | sed s/%%%/$model/g`" #bc_file="`echo $process | sed 's/->/to/g' | sed 's/ /_/g'`".hbc bc_file=$module.hbc eval bc_file_$module=$bc_file #echo "running $ov2 -$mode '$process', saving to $bc_file" 1>&2 $ov2 "$@" -$mode "$process" 2>/dev/null 1> $bc_file ;; esac done ######################################################################## cat < varying_string EOF for module in $modules; do cat < initialize_vm EOF done for model in $models; do cat < init_parameters EOF done cat < 0) then !\$omp parallel do do i_threads = 1, remainder call massless_isotropic_decay (${roots}.0_default, p(:,3:, i_threads)) call vms(i_threads)%run (p(:,:,i_threads), helicity=helicity) end do !\$omp end parallel do end if elapsed_ps(num_threads) = omp_get_wtime () - wtime_start deallocate (vms) wtime_start = omp_get_wtime () do i = 1, $n call massless_isotropic_decay (${roots}.0_default, p(:,3:,1)) call vm%run (p(:,:,1), helicity=helicity) end do elapsed_amp(num_threads) = omp_get_wtime () - wtime_start end do deallocate(p) deallocate(helicity) elapsed_amp = elapsed_amp * 1000 / $n elapsed_ps = elapsed_ps * 1000 / $n do num_threads = 1, max_threads write(*, "(A,7X,I2,5X,F19.5,F19.5,F19.5,F19.5,F19.5)") "$module", num_threads, & elapsed_ps(num_threads), elapsed_amp(num_threads), & elapsed_amp(num_threads) / elapsed_ps(num_threads), & elapsed_ps(1) / elapsed_ps(num_threads), & elapsed_amp(1) / elapsed_amp(num_threads) end do EOF done cat < # Thorsten Ohl # Juergen Reuter # with contributions from # cf. main AUTHORS file # # WHIZARD is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # WHIZARD is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ######################################################################## -SUBDIRS = SM +SUBDIRS = SM MSSM ######################################################################## ## The End. ######################################################################## Index: trunk/omega/tests/UFO/MSSM/lorentz.py =================================================================== --- trunk/omega/tests/UFO/MSSM/lorentz.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/lorentz.py (revision 8416) @@ -0,0 +1,94 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:08 + + +from object_library import all_lorentz, Lorentz + +from function_library import complexconjugate, re, im, csc, sec, acsc, asec, cot +try: + import form_factors as ForFac +except ImportError: + pass + + +UUS1 = Lorentz(name = 'UUS1', + spins = [ -1, -1, 1 ], + structure = '1') + +UUV1 = Lorentz(name = 'UUV1', + spins = [ -1, -1, 3 ], + structure = 'P(3,2) + P(3,3)') + +SSS1 = Lorentz(name = 'SSS1', + spins = [ 1, 1, 1 ], + structure = '1') + +FFS1 = Lorentz(name = 'FFS1', + spins = [ 2, 2, 1 ], + structure = 'ProjM(2,1)') + +FFS2 = Lorentz(name = 'FFS2', + spins = [ 2, 2, 1 ], + structure = 'ProjP(2,1)') + +FFV1 = Lorentz(name = 'FFV1', + spins = [ 2, 2, 3 ], + structure = 'Gamma(3,2,1)') + +FFV2 = Lorentz(name = 'FFV2', + spins = [ 2, 2, 3 ], + structure = 'Gamma(3,2,-1)*ProjM(-1,1)') + +FFV3 = Lorentz(name = 'FFV3', + spins = [ 2, 2, 3 ], + structure = 'Gamma(3,2,-1)*ProjP(-1,1)') + +FFV4 = Lorentz(name = 'FFV4', + spins = [ 2, 2, 3 ], + structure = 'Gamma(3,2,-1)*ProjM(-1,1) - Gamma(3,2,-1)*ProjP(-1,1)') + +FFV5 = Lorentz(name = 'FFV5', + spins = [ 2, 2, 3 ], + structure = 'Gamma(3,2,-1)*ProjM(-1,1) + Gamma(3,2,-1)*ProjP(-1,1)') + +FFV6 = Lorentz(name = 'FFV6', + spins = [ 2, 2, 3 ], + structure = 'Gamma(3,2,1) + Gamma(3,2,-1)*ProjM(-1,1) + Gamma(3,2,-1)*ProjP(-1,1)') + +VSS1 = Lorentz(name = 'VSS1', + spins = [ 3, 1, 1 ], + structure = 'P(1,2) - P(1,3)') + +VVS1 = Lorentz(name = 'VVS1', + spins = [ 3, 3, 1 ], + structure = 'Metric(1,2)') + +VVV1 = Lorentz(name = 'VVV1', + spins = [ 3, 3, 3 ], + structure = 'P(3,1)*Metric(1,2) - P(3,2)*Metric(1,2) - P(2,1)*Metric(1,3) + P(2,3)*Metric(1,3) + P(1,2)*Metric(2,3) - P(1,3)*Metric(2,3)') + +VVSS1 = Lorentz(name = 'VVSS1', + spins = [ 3, 3, 1, 1 ], + structure = 'Metric(1,2)') + +VVVV1 = Lorentz(name = 'VVVV1', + spins = [ 3, 3, 3, 3 ], + structure = 'Metric(1,4)*Metric(2,3) - Metric(1,3)*Metric(2,4)') + +VVVV2 = Lorentz(name = 'VVVV2', + spins = [ 3, 3, 3, 3 ], + structure = 'Metric(1,4)*Metric(2,3) + Metric(1,3)*Metric(2,4) - 2*Metric(1,2)*Metric(3,4)') + +VVVV3 = Lorentz(name = 'VVVV3', + spins = [ 3, 3, 3, 3 ], + structure = 'Metric(1,4)*Metric(2,3) - Metric(1,2)*Metric(3,4)') + +VVVV4 = Lorentz(name = 'VVVV4', + spins = [ 3, 3, 3, 3 ], + structure = 'Metric(1,3)*Metric(2,4) - Metric(1,2)*Metric(3,4)') + +VVVV5 = Lorentz(name = 'VVVV5', + spins = [ 3, 3, 3, 3 ], + structure = 'Metric(1,4)*Metric(2,3) - (Metric(1,3)*Metric(2,4))/2. - (Metric(1,2)*Metric(3,4))/2.') + Index: trunk/omega/tests/UFO/MSSM/coupling_orders.py =================================================================== --- trunk/omega/tests/UFO/MSSM/coupling_orders.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/coupling_orders.py (revision 8416) @@ -0,0 +1,16 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:13 + + +from object_library import all_orders, CouplingOrder + + +QCD = CouplingOrder(name = 'QCD', + expansion_order = 99, + hierarchy = 1) + +QED = CouplingOrder(name = 'QED', + expansion_order = 99, + hierarchy = 2) + Index: trunk/omega/tests/UFO/MSSM/__init__.py =================================================================== --- trunk/omega/tests/UFO/MSSM/__init__.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/__init__.py (revision 8416) @@ -0,0 +1,48 @@ + +import particles +import couplings +import lorentz +import parameters +import vertices +import coupling_orders +import write_param_card +import propagators + + +all_particles = particles.all_particles +all_vertices = vertices.all_vertices +all_couplings = couplings.all_couplings +all_lorentz = lorentz.all_lorentz +all_parameters = parameters.all_parameters +all_orders = coupling_orders.all_orders +all_functions = function_library.all_functions +all_propagators = propagators.all_propagators + +try: + import decays +except ImportError: + pass +else: + all_decays = decays.all_decays + +try: + import form_factors +except ImportError: + pass +else: + all_form_factors = form_factors.all_form_factors + +try: + import CT_vertices +except ImportError: + pass +else: + all_CTvertices = CT_vertices.all_CTvertices + + +gauge = [0, 1] + + +__author__ = "Benjamin Fuks" +__date__ = "26.10.12" +__version__= "1.3.13" Index: trunk/omega/tests/UFO/MSSM/propagators.py =================================================================== --- trunk/omega/tests/UFO/MSSM/propagators.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/propagators.py (revision 8416) @@ -0,0 +1,35 @@ +# This file was automatically created by FeynRules 1.7.69 +# Mathematica version: 8.0 for Mac OS X x86 (64-bit) (November 6, 2010) +# Date: Mon 1 Oct 2012 14:58:26 + +from object_library import all_propagators, Propagator + + +# define only once the denominator since this is always the same +denominator = "P('mu', id) * P('mu', id) - Mass(id) * Mass(id) + complex(0,1) * Mass(id) * Width(id)" + +# propagator for the scalar +S = Propagator(name = "S", + numerator = "complex(0,1)", + denominator = denominator + ) + +# propagator for the incoming fermion # the one for the outcomming is computed on the flight +F = Propagator(name = "F", + numerator = "complex(0,1) * (Gamma('mu', s1, s2) * P('mu', id) + Mass(id) * Identity(s1, s2))", + denominator = denominator + ) + +# massive vector in the unitary gauge, can't be use for massless particles +V1 = Propagator(name = "V1", + numerator = "complex(0,1) * (-1 * Metric(l1, l2) + Metric(l1,'mu')* P('mu', id) * P(l2, id) / Mass(id)**2 ", + denominator = denominator + ) + +# massless vector and massive vector in unitary gauge +V2 = Propagator(name = "V2", + numerator = "complex(0,-1) * Metric(l1, l2)", + denominator = "P('mu', id) * P('mu', id)" + ) + + Index: trunk/omega/tests/UFO/MSSM/Makefile.am =================================================================== --- trunk/omega/tests/UFO/MSSM/Makefile.am (revision 0) +++ trunk/omega/tests/UFO/MSSM/Makefile.am (revision 8416) @@ -0,0 +1,45 @@ +# Makefile.am -- Makefile for O'Mega within and without WHIZARD +## +## Process this file with automake to produce Makefile.in +## +######################################################################## +# +# Copyright (C) 1999-2016 by +# Wolfgang Kilian +# Thorsten Ohl +# Juergen Reuter +# Christian Speckner +# +# WHIZARD is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# WHIZARD is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +######################################################################## + +EXTRA_DIST = \ + __init__.py \ + coupling_orders.py \ + couplings.py \ + CT_couplings.py \ + function_library.py \ + lorentz.py \ + object_library.py \ + parameters.py \ + particles.py \ + propagators.py \ + vertices.py \ + write_param_card.py + +######################################################################## +## The End. +######################################################################## Index: trunk/omega/tests/UFO/MSSM/couplings.py =================================================================== --- trunk/omega/tests/UFO/MSSM/couplings.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/couplings.py (revision 8416) @@ -0,0 +1,4367 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:08 + + +from object_library import all_couplings, Coupling + +from function_library import complexconjugate, re, im, csc, sec, acsc, asec, cot + + + +GC_1 = Coupling(name = 'GC_1', + value = '-(ee*complex(0,1))/3.', + order = {'QED':1}) + +GC_2 = Coupling(name = 'GC_2', + value = '(2*ee*complex(0,1))/3.', + order = {'QED':1}) + +GC_3 = Coupling(name = 'GC_3', + value = '-(ee*complex(0,1))', + order = {'QED':1}) + +GC_4 = Coupling(name = 'GC_4', + value = 'ee*complex(0,1)', + order = {'QED':1}) + +GC_5 = Coupling(name = 'GC_5', + value = 'ee**2*complex(0,1)', + order = {'QED':2}) + +GC_6 = Coupling(name = 'GC_6', + value = '-G', + order = {'QCD':1}) + +GC_7 = Coupling(name = 'GC_7', + value = 'complex(0,1)*G', + order = {'QCD':1}) + +GC_8 = Coupling(name = 'GC_8', + value = 'G/2.', + order = {'QCD':1}) + +GC_9 = Coupling(name = 'GC_9', + value = 'complex(0,1)*G**2', + order = {'QCD':2}) + +GC_10 = Coupling(name = 'GC_10', + value = '(2*ee**2*complex(0,1)*I15a11)/9.', + order = {'QED':2}) + +GC_11 = Coupling(name = 'GC_11', + value = '(-2*ee*complex(0,1)*G*I15a11)/3.', + order = {'QCD':1,'QED':1}) + +GC_12 = Coupling(name = 'GC_12', + value = 'complex(0,1)*G**2*I15a11', + order = {'QCD':2}) + +GC_13 = Coupling(name = 'GC_13', + value = '(2*ee**2*complex(0,1)*I15a22)/9.', + order = {'QED':2}) + +GC_14 = Coupling(name = 'GC_14', + value = '(-2*ee*complex(0,1)*G*I15a22)/3.', + order = {'QCD':1,'QED':1}) + +GC_15 = Coupling(name = 'GC_15', + value = 'complex(0,1)*G**2*I15a22', + order = {'QCD':2}) + +GC_16 = Coupling(name = 'GC_16', + value = '(2*ee**2*complex(0,1)*I15a33)/9. + (2*ee**2*complex(0,1)*I16a33)/9.', + order = {'QED':2}) + +GC_17 = Coupling(name = 'GC_17', + value = '(-2*ee*complex(0,1)*G*I15a33)/3. - (2*ee*complex(0,1)*G*I16a33)/3.', + order = {'QCD':1,'QED':1}) + +GC_18 = Coupling(name = 'GC_18', + value = 'complex(0,1)*G**2*I15a33 + complex(0,1)*G**2*I16a33', + order = {'QCD':2}) + +GC_19 = Coupling(name = 'GC_19', + value = '(2*ee**2*complex(0,1)*I15a36)/9. + (2*ee**2*complex(0,1)*I16a36)/9.', + order = {'QED':2}) + +GC_20 = Coupling(name = 'GC_20', + value = '(-2*ee*complex(0,1)*G*I15a36)/3. - (2*ee*complex(0,1)*G*I16a36)/3.', + order = {'QCD':1,'QED':1}) + +GC_21 = Coupling(name = 'GC_21', + value = 'complex(0,1)*G**2*I15a36 + complex(0,1)*G**2*I16a36', + order = {'QCD':2}) + +GC_22 = Coupling(name = 'GC_22', + value = '(2*ee**2*complex(0,1)*I16a44)/9.', + order = {'QED':2}) + +GC_23 = Coupling(name = 'GC_23', + value = '(-2*ee*complex(0,1)*G*I16a44)/3.', + order = {'QCD':1,'QED':1}) + +GC_24 = Coupling(name = 'GC_24', + value = 'complex(0,1)*G**2*I16a44', + order = {'QCD':2}) + +GC_25 = Coupling(name = 'GC_25', + value = '(2*ee**2*complex(0,1)*I16a55)/9.', + order = {'QED':2}) + +GC_26 = Coupling(name = 'GC_26', + value = '(-2*ee*complex(0,1)*G*I16a55)/3.', + order = {'QCD':1,'QED':1}) + +GC_27 = Coupling(name = 'GC_27', + value = 'complex(0,1)*G**2*I16a55', + order = {'QCD':2}) + +GC_28 = Coupling(name = 'GC_28', + value = '(2*ee**2*complex(0,1)*I15a63)/9. + (2*ee**2*complex(0,1)*I16a63)/9.', + order = {'QED':2}) + +GC_29 = Coupling(name = 'GC_29', + value = '(-2*ee*complex(0,1)*G*I15a63)/3. - (2*ee*complex(0,1)*G*I16a63)/3.', + order = {'QCD':1,'QED':1}) + +GC_30 = Coupling(name = 'GC_30', + value = 'complex(0,1)*G**2*I15a63 + complex(0,1)*G**2*I16a63', + order = {'QCD':2}) + +GC_31 = Coupling(name = 'GC_31', + value = '(2*ee**2*complex(0,1)*I15a66)/9. + (2*ee**2*complex(0,1)*I16a66)/9.', + order = {'QED':2}) + +GC_32 = Coupling(name = 'GC_32', + value = '(-2*ee*complex(0,1)*G*I15a66)/3. - (2*ee*complex(0,1)*G*I16a66)/3.', + order = {'QCD':1,'QED':1}) + +GC_33 = Coupling(name = 'GC_33', + value = 'complex(0,1)*G**2*I15a66 + complex(0,1)*G**2*I16a66', + order = {'QCD':2}) + +GC_34 = Coupling(name = 'GC_34', + value = 'ee*complex(0,1)*I25a11', + order = {'QED':1}) + +GC_35 = Coupling(name = 'GC_35', + value = 'ee*complex(0,1)*I25a22', + order = {'QED':1}) + +GC_36 = Coupling(name = 'GC_36', + value = 'ee*complex(0,1)*I25a33 + ee*complex(0,1)*I26a33', + order = {'QED':1}) + +GC_37 = Coupling(name = 'GC_37', + value = 'ee*complex(0,1)*I25a36 + ee*complex(0,1)*I26a36', + order = {'QED':1}) + +GC_38 = Coupling(name = 'GC_38', + value = 'ee*complex(0,1)*I26a44', + order = {'QED':1}) + +GC_39 = Coupling(name = 'GC_39', + value = 'ee*complex(0,1)*I26a55', + order = {'QED':1}) + +GC_40 = Coupling(name = 'GC_40', + value = '-(ee*complex(0,1)*I25a63) - ee*complex(0,1)*I26a63', + order = {'QED':1}) + +GC_41 = Coupling(name = 'GC_41', + value = 'ee*complex(0,1)*I25a66 + ee*complex(0,1)*I26a66', + order = {'QED':1}) + +GC_42 = Coupling(name = 'GC_42', + value = '2*ee**2*complex(0,1)*I31a11', + order = {'QED':2}) + +GC_43 = Coupling(name = 'GC_43', + value = '2*ee**2*complex(0,1)*I31a22', + order = {'QED':2}) + +GC_44 = Coupling(name = 'GC_44', + value = '2*ee**2*complex(0,1)*I31a33 + 2*ee**2*complex(0,1)*I32a33', + order = {'QED':2}) + +GC_45 = Coupling(name = 'GC_45', + value = '2*ee**2*complex(0,1)*I31a36 + 2*ee**2*complex(0,1)*I32a36', + order = {'QED':2}) + +GC_46 = Coupling(name = 'GC_46', + value = '2*ee**2*complex(0,1)*I32a44', + order = {'QED':2}) + +GC_47 = Coupling(name = 'GC_47', + value = '2*ee**2*complex(0,1)*I32a55', + order = {'QED':2}) + +GC_48 = Coupling(name = 'GC_48', + value = '2*ee**2*complex(0,1)*I31a63 + 2*ee**2*complex(0,1)*I32a63', + order = {'QED':2}) + +GC_49 = Coupling(name = 'GC_49', + value = '2*ee**2*complex(0,1)*I31a66 + 2*ee**2*complex(0,1)*I32a66', + order = {'QED':2}) + +GC_50 = Coupling(name = 'GC_50', + value = '(-2*ee*complex(0,1)*I51a11)/3.', + order = {'QED':1}) + +GC_51 = Coupling(name = 'GC_51', + value = '-(complex(0,1)*G*I51a11)', + order = {'QCD':1}) + +GC_52 = Coupling(name = 'GC_52', + value = '(-2*ee*complex(0,1)*I51a22)/3.', + order = {'QED':1}) + +GC_53 = Coupling(name = 'GC_53', + value = '-(complex(0,1)*G*I51a22)', + order = {'QCD':1}) + +GC_54 = Coupling(name = 'GC_54', + value = '(-2*ee*complex(0,1)*I51a33)/3. - (2*ee*complex(0,1)*I52a33)/3.', + order = {'QED':1}) + +GC_55 = Coupling(name = 'GC_55', + value = '-(complex(0,1)*G*I51a33) - complex(0,1)*G*I52a33', + order = {'QCD':1}) + +GC_56 = Coupling(name = 'GC_56', + value = '(-2*ee*complex(0,1)*I51a36)/3. - (2*ee*complex(0,1)*I52a36)/3.', + order = {'QED':1}) + +GC_57 = Coupling(name = 'GC_57', + value = '-(complex(0,1)*G*I51a36) - complex(0,1)*G*I52a36', + order = {'QCD':1}) + +GC_58 = Coupling(name = 'GC_58', + value = '(-2*ee*complex(0,1)*I52a44)/3.', + order = {'QED':1}) + +GC_59 = Coupling(name = 'GC_59', + value = '-(complex(0,1)*G*I52a44)', + order = {'QCD':1}) + +GC_60 = Coupling(name = 'GC_60', + value = '(-2*ee*complex(0,1)*I52a55)/3.', + order = {'QED':1}) + +GC_61 = Coupling(name = 'GC_61', + value = '-(complex(0,1)*G*I52a55)', + order = {'QCD':1}) + +GC_62 = Coupling(name = 'GC_62', + value = '(2*ee*complex(0,1)*I51a63)/3. + (2*ee*complex(0,1)*I52a63)/3.', + order = {'QED':1}) + +GC_63 = Coupling(name = 'GC_63', + value = 'complex(0,1)*G*I51a63 + complex(0,1)*G*I52a63', + order = {'QCD':1}) + +GC_64 = Coupling(name = 'GC_64', + value = '(-2*ee*complex(0,1)*I51a66)/3. - (2*ee*complex(0,1)*I52a66)/3.', + order = {'QED':1}) + +GC_65 = Coupling(name = 'GC_65', + value = '-(complex(0,1)*G*I51a66) - complex(0,1)*G*I52a66', + order = {'QCD':1}) + +GC_66 = Coupling(name = 'GC_66', + value = '(8*ee**2*complex(0,1)*I74a11)/9.', + order = {'QED':2}) + +GC_67 = Coupling(name = 'GC_67', + value = '(4*ee*complex(0,1)*G*I74a11)/3.', + order = {'QCD':1,'QED':1}) + +GC_68 = Coupling(name = 'GC_68', + value = 'complex(0,1)*G**2*I74a11', + order = {'QCD':2}) + +GC_69 = Coupling(name = 'GC_69', + value = '(8*ee**2*complex(0,1)*I74a22)/9.', + order = {'QED':2}) + +GC_70 = Coupling(name = 'GC_70', + value = '(4*ee*complex(0,1)*G*I74a22)/3.', + order = {'QCD':1,'QED':1}) + +GC_71 = Coupling(name = 'GC_71', + value = 'complex(0,1)*G**2*I74a22', + order = {'QCD':2}) + +GC_72 = Coupling(name = 'GC_72', + value = '(8*ee**2*complex(0,1)*I74a33)/9. + (8*ee**2*complex(0,1)*I75a33)/9.', + order = {'QED':2}) + +GC_73 = Coupling(name = 'GC_73', + value = '(4*ee*complex(0,1)*G*I74a33)/3. + (4*ee*complex(0,1)*G*I75a33)/3.', + order = {'QCD':1,'QED':1}) + +GC_74 = Coupling(name = 'GC_74', + value = 'complex(0,1)*G**2*I74a33 + complex(0,1)*G**2*I75a33', + order = {'QCD':2}) + +GC_75 = Coupling(name = 'GC_75', + value = '(8*ee**2*complex(0,1)*I74a36)/9. + (8*ee**2*complex(0,1)*I75a36)/9.', + order = {'QED':2}) + +GC_76 = Coupling(name = 'GC_76', + value = '(4*ee*complex(0,1)*G*I74a36)/3. + (4*ee*complex(0,1)*G*I75a36)/3.', + order = {'QCD':1,'QED':1}) + +GC_77 = Coupling(name = 'GC_77', + value = 'complex(0,1)*G**2*I74a36 + complex(0,1)*G**2*I75a36', + order = {'QCD':2}) + +GC_78 = Coupling(name = 'GC_78', + value = '(8*ee**2*complex(0,1)*I75a44)/9.', + order = {'QED':2}) + +GC_79 = Coupling(name = 'GC_79', + value = '(4*ee*complex(0,1)*G*I75a44)/3.', + order = {'QCD':1,'QED':1}) + +GC_80 = Coupling(name = 'GC_80', + value = 'complex(0,1)*G**2*I75a44', + order = {'QCD':2}) + +GC_81 = Coupling(name = 'GC_81', + value = '(8*ee**2*complex(0,1)*I75a55)/9.', + order = {'QED':2}) + +GC_82 = Coupling(name = 'GC_82', + value = '(4*ee*complex(0,1)*G*I75a55)/3.', + order = {'QCD':1,'QED':1}) + +GC_83 = Coupling(name = 'GC_83', + value = 'complex(0,1)*G**2*I75a55', + order = {'QCD':2}) + +GC_84 = Coupling(name = 'GC_84', + value = '(8*ee**2*complex(0,1)*I74a63)/9. + (8*ee**2*complex(0,1)*I75a63)/9.', + order = {'QED':2}) + +GC_85 = Coupling(name = 'GC_85', + value = '(4*ee*complex(0,1)*G*I74a63)/3. + (4*ee*complex(0,1)*G*I75a63)/3.', + order = {'QCD':1,'QED':1}) + +GC_86 = Coupling(name = 'GC_86', + value = 'complex(0,1)*G**2*I74a63 + complex(0,1)*G**2*I75a63', + order = {'QCD':2}) + +GC_87 = Coupling(name = 'GC_87', + value = '(8*ee**2*complex(0,1)*I74a66)/9. + (8*ee**2*complex(0,1)*I75a66)/9.', + order = {'QED':2}) + +GC_88 = Coupling(name = 'GC_88', + value = '(4*ee*complex(0,1)*G*I74a66)/3. + (4*ee*complex(0,1)*G*I75a66)/3.', + order = {'QCD':1,'QED':1}) + +GC_89 = Coupling(name = 'GC_89', + value = 'complex(0,1)*G**2*I74a66 + complex(0,1)*G**2*I75a66', + order = {'QCD':2}) + +GC_90 = Coupling(name = 'GC_90', + value = '(ee*complex(0,1)*I8a11)/3.', + order = {'QED':1}) + +GC_91 = Coupling(name = 'GC_91', + value = '-(complex(0,1)*G*I8a11)', + order = {'QCD':1}) + +GC_92 = Coupling(name = 'GC_92', + value = '(ee*complex(0,1)*I8a22)/3.', + order = {'QED':1}) + +GC_93 = Coupling(name = 'GC_93', + value = '-(complex(0,1)*G*I8a22)', + order = {'QCD':1}) + +GC_94 = Coupling(name = 'GC_94', + value = '(ee*complex(0,1)*I8a33)/3. + (ee*complex(0,1)*I9a33)/3.', + order = {'QED':1}) + +GC_95 = Coupling(name = 'GC_95', + value = '-(complex(0,1)*G*I8a33) - complex(0,1)*G*I9a33', + order = {'QCD':1}) + +GC_96 = Coupling(name = 'GC_96', + value = '(ee*complex(0,1)*I8a36)/3. + (ee*complex(0,1)*I9a36)/3.', + order = {'QED':1}) + +GC_97 = Coupling(name = 'GC_97', + value = '-(complex(0,1)*G*I8a36) - complex(0,1)*G*I9a36', + order = {'QCD':1}) + +GC_98 = Coupling(name = 'GC_98', + value = '(ee*complex(0,1)*I9a44)/3.', + order = {'QED':1}) + +GC_99 = Coupling(name = 'GC_99', + value = '-(complex(0,1)*G*I9a44)', + order = {'QCD':1}) + +GC_100 = Coupling(name = 'GC_100', + value = '(ee*complex(0,1)*I9a55)/3.', + order = {'QED':1}) + +GC_101 = Coupling(name = 'GC_101', + value = '-(complex(0,1)*G*I9a55)', + order = {'QCD':1}) + +GC_102 = Coupling(name = 'GC_102', + value = '-(ee*complex(0,1)*I8a63)/3. - (ee*complex(0,1)*I9a63)/3.', + order = {'QED':1}) + +GC_103 = Coupling(name = 'GC_103', + value = 'complex(0,1)*G*I8a63 + complex(0,1)*G*I9a63', + order = {'QCD':1}) + +GC_104 = Coupling(name = 'GC_104', + value = '(ee*complex(0,1)*I8a66)/3. + (ee*complex(0,1)*I9a66)/3.', + order = {'QED':1}) + +GC_105 = Coupling(name = 'GC_105', + value = '-(complex(0,1)*G*I8a66) - complex(0,1)*G*I9a66', + order = {'QCD':1}) + +GC_106 = Coupling(name = 'GC_106', + value = '-(complex(0,1)*G*Rd1x1*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_107 = Coupling(name = 'GC_107', + value = '-(complex(0,1)*G*Rd2x2*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_108 = Coupling(name = 'GC_108', + value = '-(complex(0,1)*G*Rd3x3*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_109 = Coupling(name = 'GC_109', + value = 'complex(0,1)*G*Rd3x6*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_110 = Coupling(name = 'GC_110', + value = 'complex(0,1)*G*Rd4x4*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_111 = Coupling(name = 'GC_111', + value = 'complex(0,1)*G*Rd5x5*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_112 = Coupling(name = 'GC_112', + value = '-(complex(0,1)*G*Rd6x3*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_113 = Coupling(name = 'GC_113', + value = 'complex(0,1)*G*Rd6x6*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_114 = Coupling(name = 'GC_114', + value = '-(complex(0,1)*G*Ru1x1*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_115 = Coupling(name = 'GC_115', + value = '-(complex(0,1)*G*Ru2x2*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_116 = Coupling(name = 'GC_116', + value = '-(complex(0,1)*G*Ru3x3*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_117 = Coupling(name = 'GC_117', + value = 'complex(0,1)*G*Ru3x6*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_118 = Coupling(name = 'GC_118', + value = 'complex(0,1)*G*Ru4x4*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_119 = Coupling(name = 'GC_119', + value = 'complex(0,1)*G*Ru5x5*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_120 = Coupling(name = 'GC_120', + value = '-(complex(0,1)*G*Ru6x3*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_121 = Coupling(name = 'GC_121', + value = 'complex(0,1)*G*Ru6x6*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_122 = Coupling(name = 'GC_122', + value = '-(ee**2*complex(0,1)) + (ee**2*complex(0,1))/sw**2', + order = {'QED':2}) + +GC_123 = Coupling(name = 'GC_123', + value = '(ee**2*complex(0,1))/(2.*sw**2)', + order = {'QED':2}) + +GC_124 = Coupling(name = 'GC_124', + value = '-((ee**2*complex(0,1))/sw**2)', + order = {'QED':2}) + +GC_125 = Coupling(name = 'GC_125', + value = '(ee**2*complex(0,1)*I96a11)/(2.*sw**2)', + order = {'QED':2}) + +GC_126 = Coupling(name = 'GC_126', + value = '(ee**2*complex(0,1)*I96a22)/(2.*sw**2)', + order = {'QED':2}) + +GC_127 = Coupling(name = 'GC_127', + value = '(ee**2*complex(0,1)*I96a33)/(2.*sw**2)', + order = {'QED':2}) + +GC_128 = Coupling(name = 'GC_128', + value = '(ee**2*complex(0,1)*I96a36)/(2.*sw**2)', + order = {'QED':2}) + +GC_129 = Coupling(name = 'GC_129', + value = '(ee**2*complex(0,1)*I96a63)/(2.*sw**2)', + order = {'QED':2}) + +GC_130 = Coupling(name = 'GC_130', + value = '(ee**2*complex(0,1)*I96a66)/(2.*sw**2)', + order = {'QED':2}) + +GC_131 = Coupling(name = 'GC_131', + value = '(ee**2*complex(0,1)*I97a11)/(2.*sw**2)', + order = {'QED':2}) + +GC_132 = Coupling(name = 'GC_132', + value = '(ee**2*complex(0,1)*I97a22)/(2.*sw**2)', + order = {'QED':2}) + +GC_133 = Coupling(name = 'GC_133', + value = '(ee**2*complex(0,1)*I97a33)/(2.*sw**2)', + order = {'QED':2}) + +GC_134 = Coupling(name = 'GC_134', + value = '(ee**2*complex(0,1)*I97a36)/(2.*sw**2)', + order = {'QED':2}) + +GC_135 = Coupling(name = 'GC_135', + value = '(ee**2*complex(0,1)*I97a63)/(2.*sw**2)', + order = {'QED':2}) + +GC_136 = Coupling(name = 'GC_136', + value = '(ee**2*complex(0,1)*I97a66)/(2.*sw**2)', + order = {'QED':2}) + +GC_137 = Coupling(name = 'GC_137', + value = '(ee**2*complex(0,1)*I98a11)/(2.*sw**2)', + order = {'QED':2}) + +GC_138 = Coupling(name = 'GC_138', + value = '(ee**2*complex(0,1)*I98a22)/(2.*sw**2)', + order = {'QED':2}) + +GC_139 = Coupling(name = 'GC_139', + value = '(ee**2*complex(0,1)*I98a33)/(2.*sw**2)', + order = {'QED':2}) + +GC_140 = Coupling(name = 'GC_140', + value = '(ee**2*complex(0,1)*I98a36)/(2.*sw**2)', + order = {'QED':2}) + +GC_141 = Coupling(name = 'GC_141', + value = '(ee**2*complex(0,1)*I98a63)/(2.*sw**2)', + order = {'QED':2}) + +GC_142 = Coupling(name = 'GC_142', + value = '(ee**2*complex(0,1)*I98a66)/(2.*sw**2)', + order = {'QED':2}) + +GC_143 = Coupling(name = 'GC_143', + value = '(ee*complex(0,1))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_144 = Coupling(name = 'GC_144', + value = '(CKM1x1*ee*complex(0,1))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_145 = Coupling(name = 'GC_145', + value = '(CKM2x2*ee*complex(0,1))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_146 = Coupling(name = 'GC_146', + value = '(CKM3x3*ee*complex(0,1))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_147 = Coupling(name = 'GC_147', + value = '-((cw*ee*complex(0,1))/sw)', + order = {'QED':1}) + +GC_148 = Coupling(name = 'GC_148', + value = '(cw*ee*complex(0,1))/sw', + order = {'QED':1}) + +GC_149 = Coupling(name = 'GC_149', + value = '(-2*cw*ee**2*complex(0,1))/sw', + order = {'QED':2}) + +GC_150 = Coupling(name = 'GC_150', + value = '-((ee**2*complex(0,1)*I39a11)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_151 = Coupling(name = 'GC_151', + value = '-((ee**2*complex(0,1)*I39a22)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_152 = Coupling(name = 'GC_152', + value = '-((ee**2*complex(0,1)*I39a33)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_153 = Coupling(name = 'GC_153', + value = '-((ee**2*complex(0,1)*I39a36)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_154 = Coupling(name = 'GC_154', + value = '-((ee**2*complex(0,1)*I45a11)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_155 = Coupling(name = 'GC_155', + value = '-((ee**2*complex(0,1)*I45a22)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_156 = Coupling(name = 'GC_156', + value = '-((ee**2*complex(0,1)*I45a33)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_157 = Coupling(name = 'GC_157', + value = '-((ee**2*complex(0,1)*I45a36)/(sw*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_158 = Coupling(name = 'GC_158', + value = '(ee**2*complex(0,1)*I53a11)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_159 = Coupling(name = 'GC_159', + value = '(ee*complex(0,1)*G*I53a11*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_160 = Coupling(name = 'GC_160', + value = '(ee**2*complex(0,1)*I53a22)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_161 = Coupling(name = 'GC_161', + value = '(ee*complex(0,1)*G*I53a22*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_162 = Coupling(name = 'GC_162', + value = '(ee**2*complex(0,1)*I53a33)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_163 = Coupling(name = 'GC_163', + value = '(ee*complex(0,1)*G*I53a33*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_164 = Coupling(name = 'GC_164', + value = '(ee**2*complex(0,1)*I53a36)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_165 = Coupling(name = 'GC_165', + value = '(ee*complex(0,1)*G*I53a36*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_166 = Coupling(name = 'GC_166', + value = '(ee**2*complex(0,1)*I53a63)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_167 = Coupling(name = 'GC_167', + value = '(ee*complex(0,1)*G*I53a63*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_168 = Coupling(name = 'GC_168', + value = '(ee**2*complex(0,1)*I53a66)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_169 = Coupling(name = 'GC_169', + value = '(ee*complex(0,1)*G*I53a66*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_170 = Coupling(name = 'GC_170', + value = '(ee**2*complex(0,1)*I66a11)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_171 = Coupling(name = 'GC_171', + value = '(ee*complex(0,1)*G*I66a11*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_172 = Coupling(name = 'GC_172', + value = '(ee**2*complex(0,1)*I66a22)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_173 = Coupling(name = 'GC_173', + value = '(ee*complex(0,1)*G*I66a22*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_174 = Coupling(name = 'GC_174', + value = '(ee**2*complex(0,1)*I66a33)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_175 = Coupling(name = 'GC_175', + value = '(ee*complex(0,1)*G*I66a33*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_176 = Coupling(name = 'GC_176', + value = '(ee**2*complex(0,1)*I66a36)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_177 = Coupling(name = 'GC_177', + value = '(ee*complex(0,1)*G*I66a36*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_178 = Coupling(name = 'GC_178', + value = '(ee**2*complex(0,1)*I66a63)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_179 = Coupling(name = 'GC_179', + value = '(ee*complex(0,1)*G*I66a63*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_180 = Coupling(name = 'GC_180', + value = '(ee**2*complex(0,1)*I66a66)/(3.*sw*cmath.sqrt(2))', + order = {'QED':2}) + +GC_181 = Coupling(name = 'GC_181', + value = '(ee*complex(0,1)*G*I66a66*cmath.sqrt(2))/sw', + order = {'QCD':1,'QED':1}) + +GC_182 = Coupling(name = 'GC_182', + value = '-((ee*complex(0,1)*I92a11)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_183 = Coupling(name = 'GC_183', + value = '-((ee*complex(0,1)*I92a22)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_184 = Coupling(name = 'GC_184', + value = '-((ee*complex(0,1)*I92a33)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_185 = Coupling(name = 'GC_185', + value = '-((ee*complex(0,1)*I92a36)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_186 = Coupling(name = 'GC_186', + value = '-((ee*complex(0,1)*I92a63)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_187 = Coupling(name = 'GC_187', + value = '-((ee*complex(0,1)*I92a66)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_188 = Coupling(name = 'GC_188', + value = '-((ee*complex(0,1)*I93a11)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_189 = Coupling(name = 'GC_189', + value = '-((ee*complex(0,1)*I93a22)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_190 = Coupling(name = 'GC_190', + value = '-((ee*complex(0,1)*I93a33)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_191 = Coupling(name = 'GC_191', + value = '-((ee*complex(0,1)*I93a36)/(sw*cmath.sqrt(2)))', + order = {'QED':1}) + +GC_192 = Coupling(name = 'GC_192', + value = '(ee*complex(0,1)*I94a11)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_193 = Coupling(name = 'GC_193', + value = '(ee*complex(0,1)*I94a22)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_194 = Coupling(name = 'GC_194', + value = '(ee*complex(0,1)*I94a33)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_195 = Coupling(name = 'GC_195', + value = '(ee*complex(0,1)*I94a36)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_196 = Coupling(name = 'GC_196', + value = '(ee*complex(0,1)*I94a63)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_197 = Coupling(name = 'GC_197', + value = '(ee*complex(0,1)*I94a66)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_198 = Coupling(name = 'GC_198', + value = '(ee*complex(0,1)*I95a11)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_199 = Coupling(name = 'GC_199', + value = '(ee*complex(0,1)*I95a22)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_200 = Coupling(name = 'GC_200', + value = '(ee*complex(0,1)*I95a33)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_201 = Coupling(name = 'GC_201', + value = '(ee*complex(0,1)*I95a36)/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_202 = Coupling(name = 'GC_202', + value = '(cw*ee**2*complex(0,1)*I92a11)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_203 = Coupling(name = 'GC_203', + value = '(cw*ee**2*complex(0,1)*I92a22)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_204 = Coupling(name = 'GC_204', + value = '(cw*ee**2*complex(0,1)*I92a33)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_205 = Coupling(name = 'GC_205', + value = '(cw*ee**2*complex(0,1)*I92a36)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_206 = Coupling(name = 'GC_206', + value = '(cw*ee**2*complex(0,1)*I92a63)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_207 = Coupling(name = 'GC_207', + value = '(cw*ee**2*complex(0,1)*I92a66)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_208 = Coupling(name = 'GC_208', + value = '-((cw*ee**2*complex(0,1)*I93a11)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_209 = Coupling(name = 'GC_209', + value = '-((cw*ee**2*complex(0,1)*I93a22)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_210 = Coupling(name = 'GC_210', + value = '-((cw*ee**2*complex(0,1)*I93a33)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_211 = Coupling(name = 'GC_211', + value = '-((cw*ee**2*complex(0,1)*I93a36)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_212 = Coupling(name = 'GC_212', + value = '(cw*ee**2*complex(0,1)*I94a11)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_213 = Coupling(name = 'GC_213', + value = '(cw*ee**2*complex(0,1)*I94a22)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_214 = Coupling(name = 'GC_214', + value = '(cw*ee**2*complex(0,1)*I94a33)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_215 = Coupling(name = 'GC_215', + value = '(cw*ee**2*complex(0,1)*I94a36)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_216 = Coupling(name = 'GC_216', + value = '(cw*ee**2*complex(0,1)*I94a63)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_217 = Coupling(name = 'GC_217', + value = '(cw*ee**2*complex(0,1)*I94a66)/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':2}) + +GC_218 = Coupling(name = 'GC_218', + value = '-((cw*ee**2*complex(0,1)*I95a11)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_219 = Coupling(name = 'GC_219', + value = '-((cw*ee**2*complex(0,1)*I95a22)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_220 = Coupling(name = 'GC_220', + value = '-((cw*ee**2*complex(0,1)*I95a33)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_221 = Coupling(name = 'GC_221', + value = '-((cw*ee**2*complex(0,1)*I95a36)/((-1 + sw)*(1 + sw)*cmath.sqrt(2)))', + order = {'QED':2}) + +GC_222 = Coupling(name = 'GC_222', + value = '(cw*ee*complex(0,1)*NN1x1*Rd4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_223 = Coupling(name = 'GC_223', + value = '(cw*ee*complex(0,1)*NN2x1*Rd4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_224 = Coupling(name = 'GC_224', + value = '(cw*ee*complex(0,1)*NN3x1*Rd4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_225 = Coupling(name = 'GC_225', + value = '(cw*ee*complex(0,1)*NN4x1*Rd4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_226 = Coupling(name = 'GC_226', + value = '(cw*ee*complex(0,1)*NN1x1*Rd5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_227 = Coupling(name = 'GC_227', + value = '(cw*ee*complex(0,1)*NN2x1*Rd5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_228 = Coupling(name = 'GC_228', + value = '(cw*ee*complex(0,1)*NN3x1*Rd5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_229 = Coupling(name = 'GC_229', + value = '(cw*ee*complex(0,1)*NN4x1*Rd5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_230 = Coupling(name = 'GC_230', + value = '(cw*ee*complex(0,1)*NN1x1*Rl4x4*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_231 = Coupling(name = 'GC_231', + value = '(cw*ee*complex(0,1)*NN2x1*Rl4x4*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_232 = Coupling(name = 'GC_232', + value = '(cw*ee*complex(0,1)*NN3x1*Rl4x4*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_233 = Coupling(name = 'GC_233', + value = '(cw*ee*complex(0,1)*NN4x1*Rl4x4*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_234 = Coupling(name = 'GC_234', + value = '(cw*ee*complex(0,1)*NN1x1*Rl5x5*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_235 = Coupling(name = 'GC_235', + value = '(cw*ee*complex(0,1)*NN2x1*Rl5x5*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_236 = Coupling(name = 'GC_236', + value = '(cw*ee*complex(0,1)*NN3x1*Rl5x5*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_237 = Coupling(name = 'GC_237', + value = '(cw*ee*complex(0,1)*NN4x1*Rl5x5*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_238 = Coupling(name = 'GC_238', + value = '(-2*cw*ee*complex(0,1)*NN1x1*Ru4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_239 = Coupling(name = 'GC_239', + value = '(-2*cw*ee*complex(0,1)*NN2x1*Ru4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_240 = Coupling(name = 'GC_240', + value = '(-2*cw*ee*complex(0,1)*NN3x1*Ru4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_241 = Coupling(name = 'GC_241', + value = '(-2*cw*ee*complex(0,1)*NN4x1*Ru4x4*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_242 = Coupling(name = 'GC_242', + value = '(-2*cw*ee*complex(0,1)*NN1x1*Ru5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_243 = Coupling(name = 'GC_243', + value = '(-2*cw*ee*complex(0,1)*NN2x1*Ru5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_244 = Coupling(name = 'GC_244', + value = '(-2*cw*ee*complex(0,1)*NN3x1*Ru5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_245 = Coupling(name = 'GC_245', + value = '(-2*cw*ee*complex(0,1)*NN4x1*Ru5x5*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_246 = Coupling(name = 'GC_246', + value = '-(ee**2*complex(0,1))/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':2}) + +GC_247 = Coupling(name = 'GC_247', + value = '-(cw*ee*complex(0,1))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_248 = Coupling(name = 'GC_248', + value = '(cw*ee*complex(0,1))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_249 = Coupling(name = 'GC_249', + value = '-(cw*ee*complex(0,1)*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_250 = Coupling(name = 'GC_250', + value = '(2*cw*ee*complex(0,1)*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_251 = Coupling(name = 'GC_251', + value = '-((cw*ee*complex(0,1)*sw)/((-1 + sw)*(1 + sw)))', + order = {'QED':1}) + +GC_252 = Coupling(name = 'GC_252', + value = '(cw*ee*complex(0,1)*I100a44*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_253 = Coupling(name = 'GC_253', + value = '(cw*ee*complex(0,1)*I100a55*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_254 = Coupling(name = 'GC_254', + value = '(cw*ee*complex(0,1)*I101a44*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_255 = Coupling(name = 'GC_255', + value = '(cw*ee*complex(0,1)*I101a55*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_256 = Coupling(name = 'GC_256', + value = '(-2*cw*ee*complex(0,1)*I102a44*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_257 = Coupling(name = 'GC_257', + value = '(-2*cw*ee*complex(0,1)*I102a55*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_258 = Coupling(name = 'GC_258', + value = '(2*cw*ee**2*complex(0,1)*I26a44*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_259 = Coupling(name = 'GC_259', + value = '(2*cw*ee**2*complex(0,1)*I26a55*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_260 = Coupling(name = 'GC_260', + value = '(8*cw*ee**2*complex(0,1)*I52a44*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_261 = Coupling(name = 'GC_261', + value = '(4*cw*ee*complex(0,1)*G*I52a44*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_262 = Coupling(name = 'GC_262', + value = '(8*cw*ee**2*complex(0,1)*I52a55*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_263 = Coupling(name = 'GC_263', + value = '(4*cw*ee*complex(0,1)*G*I52a55*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_264 = Coupling(name = 'GC_264', + value = '(2*cw*ee**2*complex(0,1)*I9a44*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_265 = Coupling(name = 'GC_265', + value = '(-2*cw*ee*complex(0,1)*G*I9a44*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_266 = Coupling(name = 'GC_266', + value = '(2*cw*ee**2*complex(0,1)*I9a55*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_267 = Coupling(name = 'GC_267', + value = '(-2*cw*ee*complex(0,1)*G*I9a55*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_268 = Coupling(name = 'GC_268', + value = '(-2*ee**2*complex(0,1)*I100a44*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_269 = Coupling(name = 'GC_269', + value = '(-2*ee**2*complex(0,1)*I100a55*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_270 = Coupling(name = 'GC_270', + value = '(-2*ee**2*complex(0,1)*I101a44*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_271 = Coupling(name = 'GC_271', + value = '(-2*ee**2*complex(0,1)*I101a55*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_272 = Coupling(name = 'GC_272', + value = '(-8*ee**2*complex(0,1)*I102a44*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_273 = Coupling(name = 'GC_273', + value = '(-8*ee**2*complex(0,1)*I102a55*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_274 = Coupling(name = 'GC_274', + value = '-((cw*ee**2*complex(0,1)*I25a11)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*I25a11*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_275 = Coupling(name = 'GC_275', + value = '-((cw*ee**2*complex(0,1)*I25a22)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*I25a22*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_276 = Coupling(name = 'GC_276', + value = '-((cw*ee**2*complex(0,1)*I25a33)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*I25a33*sw)/((-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I26a33*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_277 = Coupling(name = 'GC_277', + value = '-((cw*ee**2*complex(0,1)*I25a36)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*I25a36*sw)/((-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I26a36*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_278 = Coupling(name = 'GC_278', + value = '-((cw*ee**2*complex(0,1)*I25a63)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*I25a63*sw)/((-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I26a63*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_279 = Coupling(name = 'GC_279', + value = '-((cw*ee**2*complex(0,1)*I25a66)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*I25a66*sw)/((-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I26a66*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_280 = Coupling(name = 'GC_280', + value = '(-2*cw*ee**2*complex(0,1)*I51a11)/(3.*(-1 + sw)*sw*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I51a11*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_281 = Coupling(name = 'GC_281', + value = '-((cw*ee*complex(0,1)*G*I51a11)/((-1 + sw)*sw*(1 + sw))) + (4*cw*ee*complex(0,1)*G*I51a11*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_282 = Coupling(name = 'GC_282', + value = '(-2*cw*ee**2*complex(0,1)*I51a22)/(3.*(-1 + sw)*sw*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I51a22*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_283 = Coupling(name = 'GC_283', + value = '-((cw*ee*complex(0,1)*G*I51a22)/((-1 + sw)*sw*(1 + sw))) + (4*cw*ee*complex(0,1)*G*I51a22*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_284 = Coupling(name = 'GC_284', + value = '(-2*cw*ee**2*complex(0,1)*I51a33)/(3.*(-1 + sw)*sw*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I51a33*sw)/(9.*(-1 + sw)*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I52a33*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_285 = Coupling(name = 'GC_285', + value = '-((cw*ee*complex(0,1)*G*I51a33)/((-1 + sw)*sw*(1 + sw))) + (4*cw*ee*complex(0,1)*G*I51a33*sw)/(3.*(-1 + sw)*(1 + sw)) + (4*cw*ee*complex(0,1)*G*I52a33*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_286 = Coupling(name = 'GC_286', + value = '(-2*cw*ee**2*complex(0,1)*I51a36)/(3.*(-1 + sw)*sw*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I51a36*sw)/(9.*(-1 + sw)*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I52a36*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_287 = Coupling(name = 'GC_287', + value = '-((cw*ee*complex(0,1)*G*I51a36)/((-1 + sw)*sw*(1 + sw))) + (4*cw*ee*complex(0,1)*G*I51a36*sw)/(3.*(-1 + sw)*(1 + sw)) + (4*cw*ee*complex(0,1)*G*I52a36*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_288 = Coupling(name = 'GC_288', + value = '(-2*cw*ee**2*complex(0,1)*I51a63)/(3.*(-1 + sw)*sw*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I51a63*sw)/(9.*(-1 + sw)*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I52a63*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_289 = Coupling(name = 'GC_289', + value = '-((cw*ee*complex(0,1)*G*I51a63)/((-1 + sw)*sw*(1 + sw))) + (4*cw*ee*complex(0,1)*G*I51a63*sw)/(3.*(-1 + sw)*(1 + sw)) + (4*cw*ee*complex(0,1)*G*I52a63*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_290 = Coupling(name = 'GC_290', + value = '(-2*cw*ee**2*complex(0,1)*I51a66)/(3.*(-1 + sw)*sw*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I51a66*sw)/(9.*(-1 + sw)*(1 + sw)) + (8*cw*ee**2*complex(0,1)*I52a66*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_291 = Coupling(name = 'GC_291', + value = '-((cw*ee*complex(0,1)*G*I51a66)/((-1 + sw)*sw*(1 + sw))) + (4*cw*ee*complex(0,1)*G*I51a66*sw)/(3.*(-1 + sw)*(1 + sw)) + (4*cw*ee*complex(0,1)*G*I52a66*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_292 = Coupling(name = 'GC_292', + value = '-(cw*ee**2*complex(0,1)*I8a11)/(3.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I8a11*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_293 = Coupling(name = 'GC_293', + value = '(cw*ee*complex(0,1)*G*I8a11)/((-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I8a11*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_294 = Coupling(name = 'GC_294', + value = '-(cw*ee**2*complex(0,1)*I8a22)/(3.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I8a22*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_295 = Coupling(name = 'GC_295', + value = '(cw*ee*complex(0,1)*G*I8a22)/((-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I8a22*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_296 = Coupling(name = 'GC_296', + value = '-(cw*ee*complex(0,1)*I96a11)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I96a11*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_297 = Coupling(name = 'GC_297', + value = '-(cw*ee*complex(0,1)*I96a22)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I96a22*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_298 = Coupling(name = 'GC_298', + value = '-(cw*ee*complex(0,1)*I96a33)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I100a33*sw)/(3.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*I96a33*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_299 = Coupling(name = 'GC_299', + value = '-(cw*ee*complex(0,1)*I96a36)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I100a36*sw)/(3.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*I96a36*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_300 = Coupling(name = 'GC_300', + value = '(cw*ee*complex(0,1)*I96a63)/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*I100a63*sw)/(3.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*I96a63*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_301 = Coupling(name = 'GC_301', + value = '-(cw*ee*complex(0,1)*I96a66)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I100a66*sw)/(3.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*I96a66*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_302 = Coupling(name = 'GC_302', + value = '-(cw*ee*complex(0,1)*I97a11)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I97a11*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_303 = Coupling(name = 'GC_303', + value = '-(cw*ee*complex(0,1)*I97a22)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I97a22*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_304 = Coupling(name = 'GC_304', + value = '-(cw*ee*complex(0,1)*I97a33)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I101a33*sw)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*I97a33*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_305 = Coupling(name = 'GC_305', + value = '-(cw*ee*complex(0,1)*I97a36)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I101a36*sw)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*I97a36*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_306 = Coupling(name = 'GC_306', + value = '(cw*ee*complex(0,1)*I97a63)/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*I101a63*sw)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*I97a63*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_307 = Coupling(name = 'GC_307', + value = '-(cw*ee*complex(0,1)*I97a66)/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*I101a66*sw)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*I97a66*sw)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_308 = Coupling(name = 'GC_308', + value = '(cw*ee*complex(0,1)*I98a11)/(2.*(-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*I98a11*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_309 = Coupling(name = 'GC_309', + value = '(cw*ee*complex(0,1)*I98a22)/(2.*(-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*I98a22*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_310 = Coupling(name = 'GC_310', + value = '(cw*ee*complex(0,1)*I98a33)/(2.*(-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*I102a33*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*I98a33*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_311 = Coupling(name = 'GC_311', + value = '(cw*ee*complex(0,1)*I98a36)/(2.*(-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*I102a36*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*I98a36*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_312 = Coupling(name = 'GC_312', + value = '-(cw*ee*complex(0,1)*I98a63)/(2.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee*complex(0,1)*I102a63*sw)/(3.*(-1 + sw)*(1 + sw)) + (2*cw*ee*complex(0,1)*I98a63*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_313 = Coupling(name = 'GC_313', + value = '(cw*ee*complex(0,1)*I98a66)/(2.*(-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*I102a66*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*I98a66*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_314 = Coupling(name = 'GC_314', + value = '-(cw*ee**2*complex(0,1)*I8a33)/(3.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I8a33*sw)/(9.*(-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I9a33*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_315 = Coupling(name = 'GC_315', + value = '(cw*ee*complex(0,1)*G*I8a33)/((-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I8a33*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I9a33*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_316 = Coupling(name = 'GC_316', + value = '-(cw*ee**2*complex(0,1)*I8a36)/(3.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I8a36*sw)/(9.*(-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I9a36*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_317 = Coupling(name = 'GC_317', + value = '(cw*ee*complex(0,1)*G*I8a36)/((-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I8a36*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I9a36*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_318 = Coupling(name = 'GC_318', + value = '-(cw*ee**2*complex(0,1)*I8a63)/(3.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I8a63*sw)/(9.*(-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I9a63*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_319 = Coupling(name = 'GC_319', + value = '(cw*ee*complex(0,1)*G*I8a63)/((-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I8a63*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I9a63*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_320 = Coupling(name = 'GC_320', + value = '-(cw*ee**2*complex(0,1)*I8a66)/(3.*(-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I8a66*sw)/(9.*(-1 + sw)*(1 + sw)) + (2*cw*ee**2*complex(0,1)*I9a66*sw)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_321 = Coupling(name = 'GC_321', + value = '(cw*ee*complex(0,1)*G*I8a66)/((-1 + sw)*sw*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I8a66*sw)/(3.*(-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*G*I9a66*sw)/(3.*(-1 + sw)*(1 + sw))', + order = {'QCD':1,'QED':1}) + +GC_322 = Coupling(name = 'GC_322', + value = '(2*ee**2*complex(0,1)*I96a11)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I96a11)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I96a11*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_323 = Coupling(name = 'GC_323', + value = '(2*ee**2*complex(0,1)*I96a22)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I96a22)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I96a22*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_324 = Coupling(name = 'GC_324', + value = '(2*ee**2*complex(0,1)*I96a33)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I96a33)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I100a33*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I96a33*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_325 = Coupling(name = 'GC_325', + value = '(2*ee**2*complex(0,1)*I96a36)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I96a36)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I100a36*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I96a36*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_326 = Coupling(name = 'GC_326', + value = '(2*ee**2*complex(0,1)*I96a63)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I96a63)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I100a63*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I96a63*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_327 = Coupling(name = 'GC_327', + value = '(2*ee**2*complex(0,1)*I96a66)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I96a66)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I100a66*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I96a66*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_328 = Coupling(name = 'GC_328', + value = '(2*ee**2*complex(0,1)*I97a11)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I97a11)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I97a11*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_329 = Coupling(name = 'GC_329', + value = '(2*ee**2*complex(0,1)*I97a22)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I97a22)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I97a22*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_330 = Coupling(name = 'GC_330', + value = '(2*ee**2*complex(0,1)*I97a33)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I97a33)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I101a33*sw**2)/((-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I97a33*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_331 = Coupling(name = 'GC_331', + value = '(2*ee**2*complex(0,1)*I97a36)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I97a36)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I101a36*sw**2)/((-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I97a36*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_332 = Coupling(name = 'GC_332', + value = '(2*ee**2*complex(0,1)*I97a63)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I97a63)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I101a63*sw**2)/((-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I97a63*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_333 = Coupling(name = 'GC_333', + value = '(2*ee**2*complex(0,1)*I97a66)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I97a66)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*I101a66*sw**2)/((-1 + sw)*(1 + sw)) - (2*ee**2*complex(0,1)*I97a66*sw**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_334 = Coupling(name = 'GC_334', + value = '(4*ee**2*complex(0,1)*I98a11)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I98a11)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (8*ee**2*complex(0,1)*I98a11*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_335 = Coupling(name = 'GC_335', + value = '(4*ee**2*complex(0,1)*I98a22)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I98a22)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (8*ee**2*complex(0,1)*I98a22*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_336 = Coupling(name = 'GC_336', + value = '(4*ee**2*complex(0,1)*I98a33)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I98a33)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (8*ee**2*complex(0,1)*I102a33*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (8*ee**2*complex(0,1)*I98a33*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_337 = Coupling(name = 'GC_337', + value = '(4*ee**2*complex(0,1)*I98a36)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I98a36)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (8*ee**2*complex(0,1)*I102a36*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (8*ee**2*complex(0,1)*I98a36*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_338 = Coupling(name = 'GC_338', + value = '(4*ee**2*complex(0,1)*I98a63)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I98a63)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (8*ee**2*complex(0,1)*I102a63*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (8*ee**2*complex(0,1)*I98a63*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_339 = Coupling(name = 'GC_339', + value = '(4*ee**2*complex(0,1)*I98a66)/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I98a66)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (8*ee**2*complex(0,1)*I102a66*sw**2)/(9.*(-1 + sw)*(1 + sw)) - (8*ee**2*complex(0,1)*I98a66*sw**2)/(9.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_340 = Coupling(name = 'GC_340', + value = '(complex(0,1)*I13a33*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a33*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*Rd3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_341 = Coupling(name = 'GC_341', + value = '(complex(0,1)*I13a36*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a36*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*Rd6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_342 = Coupling(name = 'GC_342', + value = '(complex(0,1)*I27a33*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a33*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*Rl3x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_343 = Coupling(name = 'GC_343', + value = '(complex(0,1)*I27a36*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a36*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*Rl6x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_344 = Coupling(name = 'GC_344', + value = '(complex(0,1)*I61a33*NN1x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a33*NN1x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN1x1*Ru3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_345 = Coupling(name = 'GC_345', + value = '(complex(0,1)*I61a36*NN1x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a36*NN1x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN1x1*Ru6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_346 = Coupling(name = 'GC_346', + value = '(complex(0,1)*I13a33*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a33*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*Rd3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_347 = Coupling(name = 'GC_347', + value = '(complex(0,1)*I13a36*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a36*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*Rd6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_348 = Coupling(name = 'GC_348', + value = '(complex(0,1)*I27a33*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a33*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*Rl3x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_349 = Coupling(name = 'GC_349', + value = '(complex(0,1)*I27a36*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a36*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*Rl6x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_350 = Coupling(name = 'GC_350', + value = '(complex(0,1)*I61a33*NN2x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a33*NN2x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN2x1*Ru3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_351 = Coupling(name = 'GC_351', + value = '(complex(0,1)*I61a36*NN2x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a36*NN2x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN2x1*Ru6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_352 = Coupling(name = 'GC_352', + value = '(complex(0,1)*I13a33*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a33*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*Rd3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_353 = Coupling(name = 'GC_353', + value = '(complex(0,1)*I13a36*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a36*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*Rd6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_354 = Coupling(name = 'GC_354', + value = '(complex(0,1)*I27a33*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a33*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*Rl3x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_355 = Coupling(name = 'GC_355', + value = '(complex(0,1)*I27a36*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a36*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*Rl6x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_356 = Coupling(name = 'GC_356', + value = '(complex(0,1)*I61a33*NN3x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a33*NN3x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN3x1*Ru3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_357 = Coupling(name = 'GC_357', + value = '(complex(0,1)*I61a36*NN3x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a36*NN3x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN3x1*Ru6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_358 = Coupling(name = 'GC_358', + value = '(complex(0,1)*I13a33*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a33*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*Rd3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_359 = Coupling(name = 'GC_359', + value = '(complex(0,1)*I13a36*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I13a36*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*Rd6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_360 = Coupling(name = 'GC_360', + value = '(complex(0,1)*I27a33*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a33*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*Rl3x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_361 = Coupling(name = 'GC_361', + value = '(complex(0,1)*I27a36*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I27a36*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*Rl6x6*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_362 = Coupling(name = 'GC_362', + value = '(complex(0,1)*I61a33*NN4x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a33*NN4x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN4x1*Ru3x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_363 = Coupling(name = 'GC_363', + value = '(complex(0,1)*I61a36*NN4x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I61a36*NN4x4*sw**2)/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*NN4x1*Ru6x6*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_364 = Coupling(name = 'GC_364', + value = '-((ee*complex(0,1)*I82a11*UU1x1)/sw)', + order = {'QED':1}) + +GC_365 = Coupling(name = 'GC_365', + value = '-((ee*complex(0,1)*I82a22*UU1x1)/sw)', + order = {'QED':1}) + +GC_366 = Coupling(name = 'GC_366', + value = '-((ee*complex(0,1)*I85a11*UU1x1)/sw)', + order = {'QED':1}) + +GC_367 = Coupling(name = 'GC_367', + value = '-((ee*complex(0,1)*I85a22*UU1x1)/sw)', + order = {'QED':1}) + +GC_368 = Coupling(name = 'GC_368', + value = 'complex(0,1)*I44a33*UU1x2', + order = {'QED':1}) + +GC_369 = Coupling(name = 'GC_369', + value = 'complex(0,1)*I64a33*UU1x2', + order = {'QED':1}) + +GC_370 = Coupling(name = 'GC_370', + value = 'complex(0,1)*I64a36*UU1x2', + order = {'QED':1}) + +GC_371 = Coupling(name = 'GC_371', + value = '-((ee*complex(0,1)*I82a33*UU1x1)/sw) + complex(0,1)*I83a33*UU1x2', + order = {'QED':1}) + +GC_372 = Coupling(name = 'GC_372', + value = '-((ee*complex(0,1)*I82a36*UU1x1)/sw) + complex(0,1)*I83a36*UU1x2', + order = {'QED':1}) + +GC_373 = Coupling(name = 'GC_373', + value = '-((ee*complex(0,1)*I85a33*UU1x1)/sw) + complex(0,1)*I86a33*UU1x2', + order = {'QED':1}) + +GC_374 = Coupling(name = 'GC_374', + value = '-((ee*complex(0,1)*I85a36*UU1x1)/sw) + complex(0,1)*I86a36*UU1x2', + order = {'QED':1}) + +GC_375 = Coupling(name = 'GC_375', + value = '-((ee*complex(0,1)*I82a11*UU2x1)/sw)', + order = {'QED':1}) + +GC_376 = Coupling(name = 'GC_376', + value = '-((ee*complex(0,1)*I82a22*UU2x1)/sw)', + order = {'QED':1}) + +GC_377 = Coupling(name = 'GC_377', + value = '-((ee*complex(0,1)*I85a11*UU2x1)/sw)', + order = {'QED':1}) + +GC_378 = Coupling(name = 'GC_378', + value = '-((ee*complex(0,1)*I85a22*UU2x1)/sw)', + order = {'QED':1}) + +GC_379 = Coupling(name = 'GC_379', + value = 'complex(0,1)*I44a33*UU2x2', + order = {'QED':1}) + +GC_380 = Coupling(name = 'GC_380', + value = 'complex(0,1)*I64a33*UU2x2', + order = {'QED':1}) + +GC_381 = Coupling(name = 'GC_381', + value = 'complex(0,1)*I64a36*UU2x2', + order = {'QED':1}) + +GC_382 = Coupling(name = 'GC_382', + value = '-((ee*complex(0,1)*I82a33*UU2x1)/sw) + complex(0,1)*I83a33*UU2x2', + order = {'QED':1}) + +GC_383 = Coupling(name = 'GC_383', + value = '-((ee*complex(0,1)*I82a36*UU2x1)/sw) + complex(0,1)*I83a36*UU2x2', + order = {'QED':1}) + +GC_384 = Coupling(name = 'GC_384', + value = '-((ee*complex(0,1)*I85a33*UU2x1)/sw) + complex(0,1)*I86a33*UU2x2', + order = {'QED':1}) + +GC_385 = Coupling(name = 'GC_385', + value = '-((ee*complex(0,1)*I85a36*UU2x1)/sw) + complex(0,1)*I86a36*UU2x2', + order = {'QED':1}) + +GC_386 = Coupling(name = 'GC_386', + value = '-((ee*complex(0,1)*I87a11*VV1x1)/sw)', + order = {'QED':1}) + +GC_387 = Coupling(name = 'GC_387', + value = '-((ee*complex(0,1)*I87a22*VV1x1)/sw)', + order = {'QED':1}) + +GC_388 = Coupling(name = 'GC_388', + value = '-((ee*complex(0,1)*I87a33*VV1x1)/sw)', + order = {'QED':1}) + +GC_389 = Coupling(name = 'GC_389', + value = '-((ee*complex(0,1)*I89a11*VV1x1)/sw)', + order = {'QED':1}) + +GC_390 = Coupling(name = 'GC_390', + value = '-((ee*complex(0,1)*I89a22*VV1x1)/sw)', + order = {'QED':1}) + +GC_391 = Coupling(name = 'GC_391', + value = 'complex(0,1)*I11a33*VV1x2', + order = {'QED':1}) + +GC_392 = Coupling(name = 'GC_392', + value = 'complex(0,1)*I11a36*VV1x2', + order = {'QED':1}) + +GC_393 = Coupling(name = 'GC_393', + value = '-((ee*complex(0,1)*I89a33*VV1x1)/sw) + complex(0,1)*I90a33*VV1x2', + order = {'QED':1}) + +GC_394 = Coupling(name = 'GC_394', + value = '-((ee*complex(0,1)*I89a36*VV1x1)/sw) + complex(0,1)*I90a36*VV1x2', + order = {'QED':1}) + +GC_395 = Coupling(name = 'GC_395', + value = '-((ee*complex(0,1)*I87a11*VV2x1)/sw)', + order = {'QED':1}) + +GC_396 = Coupling(name = 'GC_396', + value = '-((ee*complex(0,1)*I87a22*VV2x1)/sw)', + order = {'QED':1}) + +GC_397 = Coupling(name = 'GC_397', + value = '-((ee*complex(0,1)*I87a33*VV2x1)/sw)', + order = {'QED':1}) + +GC_398 = Coupling(name = 'GC_398', + value = '-((ee*complex(0,1)*I89a11*VV2x1)/sw)', + order = {'QED':1}) + +GC_399 = Coupling(name = 'GC_399', + value = '-((ee*complex(0,1)*I89a22*VV2x1)/sw)', + order = {'QED':1}) + +GC_400 = Coupling(name = 'GC_400', + value = 'complex(0,1)*I11a33*VV2x2', + order = {'QED':1}) + +GC_401 = Coupling(name = 'GC_401', + value = 'complex(0,1)*I11a36*VV2x2', + order = {'QED':1}) + +GC_402 = Coupling(name = 'GC_402', + value = '-((ee*complex(0,1)*I89a33*VV2x1)/sw) + complex(0,1)*I90a33*VV2x2', + order = {'QED':1}) + +GC_403 = Coupling(name = 'GC_403', + value = '-((ee*complex(0,1)*I89a36*VV2x1)/sw) + complex(0,1)*I90a36*VV2x2', + order = {'QED':1}) + +GC_404 = Coupling(name = 'GC_404', + value = '(ee*complex(0,1)*complexconjugate(CKM1x1))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_405 = Coupling(name = 'GC_405', + value = '(ee*complex(0,1)*complexconjugate(CKM2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_406 = Coupling(name = 'GC_406', + value = '(ee*complex(0,1)*complexconjugate(CKM3x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_407 = Coupling(name = 'GC_407', + value = '(cw*ee*complex(0,1)*Rd1x1*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd1x1*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd1x1*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_408 = Coupling(name = 'GC_408', + value = '(cw*ee*complex(0,1)*Rd2x2*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd2x2*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd2x2*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_409 = Coupling(name = 'GC_409', + value = '-((cw*ee*complex(0,1)*Rl1x1*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl1x1*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl1x1*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_410 = Coupling(name = 'GC_410', + value = '-((cw*ee*complex(0,1)*Rl2x2*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl2x2*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl2x2*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_411 = Coupling(name = 'GC_411', + value = '-((cw*ee*complex(0,1)*Rn1x1*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn1x1*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn1x1*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_412 = Coupling(name = 'GC_412', + value = '-((cw*ee*complex(0,1)*Rn2x2*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn2x2*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn2x2*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_413 = Coupling(name = 'GC_413', + value = '-((cw*ee*complex(0,1)*Rn3x3*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn3x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn3x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_414 = Coupling(name = 'GC_414', + value = '(cw*ee*complex(0,1)*Ru1x1*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru1x1*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru1x1*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_415 = Coupling(name = 'GC_415', + value = '(cw*ee*complex(0,1)*Ru2x2*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru2x2*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru2x2*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_416 = Coupling(name = 'GC_416', + value = '(complex(0,1)*I14a33*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a33*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd3x3*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd3x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd3x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_417 = Coupling(name = 'GC_417', + value = '(complex(0,1)*I14a36*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a36*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd6x3*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd6x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd6x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_418 = Coupling(name = 'GC_418', + value = '(complex(0,1)*I28a33*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a33*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl3x3*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl3x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl3x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_419 = Coupling(name = 'GC_419', + value = '(complex(0,1)*I28a36*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a36*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl6x3*complexconjugate(NN1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl6x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl6x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_420 = Coupling(name = 'GC_420', + value = '-((ee*complex(0,1)*UU1x1*complexconjugate(NN1x2))/sw) - (ee*complex(0,1)*UU1x2*complexconjugate(NN1x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_421 = Coupling(name = 'GC_421', + value = '-((ee*complex(0,1)*UU2x1*complexconjugate(NN1x2))/sw) - (ee*complex(0,1)*UU2x2*complexconjugate(NN1x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_422 = Coupling(name = 'GC_422', + value = '-(cw*ee*complex(0,1)*NN1x3*complexconjugate(NN1x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*complexconjugate(NN1x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_423 = Coupling(name = 'GC_423', + value = '(cw*ee*complex(0,1)*NN2x3*complexconjugate(NN1x3))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*NN2x4*complexconjugate(NN1x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_424 = Coupling(name = 'GC_424', + value = '(cw*ee*complex(0,1)*NN3x3*complexconjugate(NN1x3))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*NN3x4*complexconjugate(NN1x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_425 = Coupling(name = 'GC_425', + value = '(cw*ee*complex(0,1)*NN4x3*complexconjugate(NN1x3))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*NN4x4*complexconjugate(NN1x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_426 = Coupling(name = 'GC_426', + value = '(complex(0,1)*I62a33*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a33*sw**2*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru3x3*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru3x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru3x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_427 = Coupling(name = 'GC_427', + value = '(complex(0,1)*I62a36*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a36*sw**2*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru6x3*complexconjugate(NN1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru6x3*complexconjugate(NN1x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru6x3*sw*complexconjugate(NN1x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_428 = Coupling(name = 'GC_428', + value = '-((ee*complex(0,1)*VV1x1*complexconjugate(NN1x2))/sw) + (ee*complex(0,1)*VV1x2*complexconjugate(NN1x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_429 = Coupling(name = 'GC_429', + value = '-((ee*complex(0,1)*VV2x1*complexconjugate(NN1x2))/sw) + (ee*complex(0,1)*VV2x2*complexconjugate(NN1x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_430 = Coupling(name = 'GC_430', + value = '(cw*ee*complex(0,1)*Rd1x1*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd1x1*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd1x1*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_431 = Coupling(name = 'GC_431', + value = '(cw*ee*complex(0,1)*Rd2x2*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd2x2*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd2x2*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_432 = Coupling(name = 'GC_432', + value = '-((cw*ee*complex(0,1)*Rl1x1*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl1x1*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl1x1*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_433 = Coupling(name = 'GC_433', + value = '-((cw*ee*complex(0,1)*Rl2x2*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl2x2*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl2x2*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_434 = Coupling(name = 'GC_434', + value = '-((cw*ee*complex(0,1)*Rn1x1*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn1x1*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn1x1*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_435 = Coupling(name = 'GC_435', + value = '-((cw*ee*complex(0,1)*Rn2x2*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn2x2*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn2x2*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_436 = Coupling(name = 'GC_436', + value = '-((cw*ee*complex(0,1)*Rn3x3*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn3x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn3x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_437 = Coupling(name = 'GC_437', + value = '(cw*ee*complex(0,1)*Ru1x1*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru1x1*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru1x1*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_438 = Coupling(name = 'GC_438', + value = '(cw*ee*complex(0,1)*Ru2x2*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru2x2*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru2x2*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_439 = Coupling(name = 'GC_439', + value = '(complex(0,1)*I14a33*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a33*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd3x3*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd3x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd3x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_440 = Coupling(name = 'GC_440', + value = '(complex(0,1)*I14a36*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a36*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd6x3*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd6x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd6x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_441 = Coupling(name = 'GC_441', + value = '(complex(0,1)*I28a33*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a33*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl3x3*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl3x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl3x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_442 = Coupling(name = 'GC_442', + value = '(complex(0,1)*I28a36*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a36*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl6x3*complexconjugate(NN2x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl6x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl6x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_443 = Coupling(name = 'GC_443', + value = '-((ee*complex(0,1)*UU1x1*complexconjugate(NN2x2))/sw) - (ee*complex(0,1)*UU1x2*complexconjugate(NN2x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_444 = Coupling(name = 'GC_444', + value = '-((ee*complex(0,1)*UU2x1*complexconjugate(NN2x2))/sw) - (ee*complex(0,1)*UU2x2*complexconjugate(NN2x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_445 = Coupling(name = 'GC_445', + value = '-(cw*ee*complex(0,1)*NN1x3*complexconjugate(NN2x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*complexconjugate(NN2x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_446 = Coupling(name = 'GC_446', + value = '-(cw*ee*complex(0,1)*NN2x3*complexconjugate(NN2x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN2x4*complexconjugate(NN2x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_447 = Coupling(name = 'GC_447', + value = '(cw*ee*complex(0,1)*NN3x3*complexconjugate(NN2x3))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*NN3x4*complexconjugate(NN2x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_448 = Coupling(name = 'GC_448', + value = '(cw*ee*complex(0,1)*NN4x3*complexconjugate(NN2x3))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*NN4x4*complexconjugate(NN2x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_449 = Coupling(name = 'GC_449', + value = '(complex(0,1)*I62a33*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a33*sw**2*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru3x3*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru3x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru3x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_450 = Coupling(name = 'GC_450', + value = '(complex(0,1)*I62a36*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a36*sw**2*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru6x3*complexconjugate(NN2x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru6x3*complexconjugate(NN2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru6x3*sw*complexconjugate(NN2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_451 = Coupling(name = 'GC_451', + value = '-((ee*complex(0,1)*VV1x1*complexconjugate(NN2x2))/sw) + (ee*complex(0,1)*VV1x2*complexconjugate(NN2x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_452 = Coupling(name = 'GC_452', + value = '-((ee*complex(0,1)*VV2x1*complexconjugate(NN2x2))/sw) + (ee*complex(0,1)*VV2x2*complexconjugate(NN2x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_453 = Coupling(name = 'GC_453', + value = '(cw*ee*complex(0,1)*Rd1x1*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd1x1*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd1x1*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_454 = Coupling(name = 'GC_454', + value = '(cw*ee*complex(0,1)*Rd2x2*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd2x2*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd2x2*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_455 = Coupling(name = 'GC_455', + value = '-((cw*ee*complex(0,1)*Rl1x1*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl1x1*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl1x1*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_456 = Coupling(name = 'GC_456', + value = '-((cw*ee*complex(0,1)*Rl2x2*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl2x2*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl2x2*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_457 = Coupling(name = 'GC_457', + value = '-((cw*ee*complex(0,1)*Rn1x1*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn1x1*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn1x1*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_458 = Coupling(name = 'GC_458', + value = '-((cw*ee*complex(0,1)*Rn2x2*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn2x2*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn2x2*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_459 = Coupling(name = 'GC_459', + value = '-((cw*ee*complex(0,1)*Rn3x3*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn3x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn3x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_460 = Coupling(name = 'GC_460', + value = '(cw*ee*complex(0,1)*Ru1x1*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru1x1*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru1x1*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_461 = Coupling(name = 'GC_461', + value = '(cw*ee*complex(0,1)*Ru2x2*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru2x2*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru2x2*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_462 = Coupling(name = 'GC_462', + value = '(complex(0,1)*I14a33*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a33*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd3x3*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd3x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd3x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_463 = Coupling(name = 'GC_463', + value = '(complex(0,1)*I14a36*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a36*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd6x3*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd6x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd6x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_464 = Coupling(name = 'GC_464', + value = '(complex(0,1)*I28a33*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a33*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl3x3*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl3x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl3x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_465 = Coupling(name = 'GC_465', + value = '(complex(0,1)*I28a36*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a36*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl6x3*complexconjugate(NN3x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl6x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl6x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_466 = Coupling(name = 'GC_466', + value = '-((ee*complex(0,1)*UU1x1*complexconjugate(NN3x2))/sw) - (ee*complex(0,1)*UU1x2*complexconjugate(NN3x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_467 = Coupling(name = 'GC_467', + value = '-((ee*complex(0,1)*UU2x1*complexconjugate(NN3x2))/sw) - (ee*complex(0,1)*UU2x2*complexconjugate(NN3x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_468 = Coupling(name = 'GC_468', + value = '-(cw*ee*complex(0,1)*NN1x3*complexconjugate(NN3x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*complexconjugate(NN3x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_469 = Coupling(name = 'GC_469', + value = '-(cw*ee*complex(0,1)*NN2x3*complexconjugate(NN3x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN2x4*complexconjugate(NN3x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_470 = Coupling(name = 'GC_470', + value = '-(cw*ee*complex(0,1)*NN3x3*complexconjugate(NN3x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN3x4*complexconjugate(NN3x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_471 = Coupling(name = 'GC_471', + value = '(cw*ee*complex(0,1)*NN4x3*complexconjugate(NN3x3))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*NN4x4*complexconjugate(NN3x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_472 = Coupling(name = 'GC_472', + value = '(complex(0,1)*I62a33*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a33*sw**2*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru3x3*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru3x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru3x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_473 = Coupling(name = 'GC_473', + value = '(complex(0,1)*I62a36*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a36*sw**2*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru6x3*complexconjugate(NN3x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru6x3*complexconjugate(NN3x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru6x3*sw*complexconjugate(NN3x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_474 = Coupling(name = 'GC_474', + value = '-((ee*complex(0,1)*VV1x1*complexconjugate(NN3x2))/sw) + (ee*complex(0,1)*VV1x2*complexconjugate(NN3x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_475 = Coupling(name = 'GC_475', + value = '-((ee*complex(0,1)*VV2x1*complexconjugate(NN3x2))/sw) + (ee*complex(0,1)*VV2x2*complexconjugate(NN3x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_476 = Coupling(name = 'GC_476', + value = '(cw*ee*complex(0,1)*Rd1x1*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd1x1*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd1x1*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_477 = Coupling(name = 'GC_477', + value = '(cw*ee*complex(0,1)*Rd2x2*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd2x2*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd2x2*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_478 = Coupling(name = 'GC_478', + value = '-((cw*ee*complex(0,1)*Rl1x1*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl1x1*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl1x1*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_479 = Coupling(name = 'GC_479', + value = '-((cw*ee*complex(0,1)*Rl2x2*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*Rl2x2*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl2x2*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_480 = Coupling(name = 'GC_480', + value = '-((cw*ee*complex(0,1)*Rn1x1*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn1x1*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn1x1*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_481 = Coupling(name = 'GC_481', + value = '-((cw*ee*complex(0,1)*Rn2x2*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn2x2*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn2x2*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_482 = Coupling(name = 'GC_482', + value = '-((cw*ee*complex(0,1)*Rn3x3*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*Rn3x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rn3x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_483 = Coupling(name = 'GC_483', + value = '(cw*ee*complex(0,1)*Ru1x1*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru1x1*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru1x1*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_484 = Coupling(name = 'GC_484', + value = '(cw*ee*complex(0,1)*Ru2x2*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru2x2*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru2x2*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_485 = Coupling(name = 'GC_485', + value = '(complex(0,1)*I14a33*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a33*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd3x3*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd3x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd3x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_486 = Coupling(name = 'GC_486', + value = '(complex(0,1)*I14a36*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I14a36*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Rd6x3*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rd6x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rd6x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_487 = Coupling(name = 'GC_487', + value = '(complex(0,1)*I28a33*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a33*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl3x3*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl3x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl3x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_488 = Coupling(name = 'GC_488', + value = '(complex(0,1)*I28a36*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I28a36*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*Rl6x3*complexconjugate(NN4x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Rl6x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Rl6x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_489 = Coupling(name = 'GC_489', + value = '-((ee*complex(0,1)*UU1x1*complexconjugate(NN4x2))/sw) - (ee*complex(0,1)*UU1x2*complexconjugate(NN4x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_490 = Coupling(name = 'GC_490', + value = '-((ee*complex(0,1)*UU2x1*complexconjugate(NN4x2))/sw) - (ee*complex(0,1)*UU2x2*complexconjugate(NN4x3))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_491 = Coupling(name = 'GC_491', + value = '-(cw*ee*complex(0,1)*NN1x3*complexconjugate(NN4x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*complexconjugate(NN4x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_492 = Coupling(name = 'GC_492', + value = '-(cw*ee*complex(0,1)*NN2x3*complexconjugate(NN4x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN2x4*complexconjugate(NN4x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_493 = Coupling(name = 'GC_493', + value = '-(cw*ee*complex(0,1)*NN3x3*complexconjugate(NN4x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN3x4*complexconjugate(NN4x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_494 = Coupling(name = 'GC_494', + value = '-(cw*ee*complex(0,1)*NN4x3*complexconjugate(NN4x3))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*NN4x4*complexconjugate(NN4x4))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_495 = Coupling(name = 'GC_495', + value = '(complex(0,1)*I62a33*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a33*sw**2*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru3x3*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru3x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru3x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_496 = Coupling(name = 'GC_496', + value = '(complex(0,1)*I62a36*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I62a36*sw**2*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*Ru6x3*complexconjugate(NN4x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*Ru6x3*complexconjugate(NN4x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*Ru6x3*sw*complexconjugate(NN4x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_497 = Coupling(name = 'GC_497', + value = '-((ee*complex(0,1)*VV1x1*complexconjugate(NN4x2))/sw) + (ee*complex(0,1)*VV1x2*complexconjugate(NN4x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_498 = Coupling(name = 'GC_498', + value = '-((ee*complex(0,1)*VV2x1*complexconjugate(NN4x2))/sw) + (ee*complex(0,1)*VV2x2*complexconjugate(NN4x4))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_499 = Coupling(name = 'GC_499', + value = '-(complex(0,1)*G*complexconjugate(Rd1x1)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_500 = Coupling(name = 'GC_500', + value = '(cw*ee*complex(0,1)*NN1x1*complexconjugate(Rd1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*complexconjugate(Rd1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rd1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_501 = Coupling(name = 'GC_501', + value = '(cw*ee*complex(0,1)*NN2x1*complexconjugate(Rd1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*complexconjugate(Rd1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rd1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_502 = Coupling(name = 'GC_502', + value = '(cw*ee*complex(0,1)*NN3x1*complexconjugate(Rd1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*complexconjugate(Rd1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rd1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_503 = Coupling(name = 'GC_503', + value = '(cw*ee*complex(0,1)*NN4x1*complexconjugate(Rd1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*complexconjugate(Rd1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rd1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_504 = Coupling(name = 'GC_504', + value = '-(complex(0,1)*G*complexconjugate(Rd2x2)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_505 = Coupling(name = 'GC_505', + value = '(cw*ee*complex(0,1)*NN1x1*complexconjugate(Rd2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*complexconjugate(Rd2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rd2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_506 = Coupling(name = 'GC_506', + value = '(cw*ee*complex(0,1)*NN2x1*complexconjugate(Rd2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*complexconjugate(Rd2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rd2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_507 = Coupling(name = 'GC_507', + value = '(cw*ee*complex(0,1)*NN3x1*complexconjugate(Rd2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*complexconjugate(Rd2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rd2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_508 = Coupling(name = 'GC_508', + value = '(cw*ee*complex(0,1)*NN4x1*complexconjugate(Rd2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*complexconjugate(Rd2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rd2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_509 = Coupling(name = 'GC_509', + value = '-(complex(0,1)*G*complexconjugate(Rd3x3)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_510 = Coupling(name = 'GC_510', + value = '(complex(0,1)*I6a33*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a33*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*complexconjugate(Rd3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*complexconjugate(Rd3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rd3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_511 = Coupling(name = 'GC_511', + value = '(complex(0,1)*I6a33*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a33*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*complexconjugate(Rd3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*complexconjugate(Rd3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rd3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_512 = Coupling(name = 'GC_512', + value = '(complex(0,1)*I6a33*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a33*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*complexconjugate(Rd3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*complexconjugate(Rd3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rd3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_513 = Coupling(name = 'GC_513', + value = '(complex(0,1)*I6a33*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a33*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*complexconjugate(Rd3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*complexconjugate(Rd3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rd3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_514 = Coupling(name = 'GC_514', + value = 'complex(0,1)*G*complexconjugate(Rd3x6)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_515 = Coupling(name = 'GC_515', + value = '(complex(0,1)*I7a33*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a33*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rd3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_516 = Coupling(name = 'GC_516', + value = '(complex(0,1)*I7a33*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a33*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rd3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_517 = Coupling(name = 'GC_517', + value = '(complex(0,1)*I7a33*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a33*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rd3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_518 = Coupling(name = 'GC_518', + value = '(complex(0,1)*I7a33*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a33*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rd3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_519 = Coupling(name = 'GC_519', + value = 'complex(0,1)*G*complexconjugate(Rd4x4)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_520 = Coupling(name = 'GC_520', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rd4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_521 = Coupling(name = 'GC_521', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rd4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_522 = Coupling(name = 'GC_522', + value = '(cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rd4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_523 = Coupling(name = 'GC_523', + value = '(cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rd4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_524 = Coupling(name = 'GC_524', + value = 'complex(0,1)*G*complexconjugate(Rd5x5)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_525 = Coupling(name = 'GC_525', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rd5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_526 = Coupling(name = 'GC_526', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rd5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_527 = Coupling(name = 'GC_527', + value = '(cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rd5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_528 = Coupling(name = 'GC_528', + value = '(cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rd5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_529 = Coupling(name = 'GC_529', + value = '-(complex(0,1)*G*complexconjugate(Rd6x3)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_530 = Coupling(name = 'GC_530', + value = '(complex(0,1)*I6a36*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a36*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*complexconjugate(Rd6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*complexconjugate(Rd6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rd6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_531 = Coupling(name = 'GC_531', + value = '(complex(0,1)*I6a36*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a36*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*complexconjugate(Rd6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*complexconjugate(Rd6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rd6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_532 = Coupling(name = 'GC_532', + value = '(complex(0,1)*I6a36*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a36*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*complexconjugate(Rd6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*complexconjugate(Rd6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rd6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_533 = Coupling(name = 'GC_533', + value = '(complex(0,1)*I6a36*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I6a36*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*complexconjugate(Rd6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*complexconjugate(Rd6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rd6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_534 = Coupling(name = 'GC_534', + value = 'complex(0,1)*G*complexconjugate(Rd6x6)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_535 = Coupling(name = 'GC_535', + value = '(complex(0,1)*I7a36*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a36*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rd6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_536 = Coupling(name = 'GC_536', + value = '(complex(0,1)*I7a36*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a36*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rd6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_537 = Coupling(name = 'GC_537', + value = '(complex(0,1)*I7a36*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a36*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rd6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_538 = Coupling(name = 'GC_538', + value = '(complex(0,1)*I7a36*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I7a36*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rd6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_539 = Coupling(name = 'GC_539', + value = '-((cw*ee*complex(0,1)*NN1x1*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN1x2*complexconjugate(Rl1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_540 = Coupling(name = 'GC_540', + value = '-((cw*ee*complex(0,1)*NN2x1*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN2x2*complexconjugate(Rl1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_541 = Coupling(name = 'GC_541', + value = '-((cw*ee*complex(0,1)*NN3x1*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN3x2*complexconjugate(Rl1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_542 = Coupling(name = 'GC_542', + value = '-((cw*ee*complex(0,1)*NN4x1*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN4x2*complexconjugate(Rl1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rl1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_543 = Coupling(name = 'GC_543', + value = '-((cw*ee*complex(0,1)*NN1x1*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN1x2*complexconjugate(Rl2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_544 = Coupling(name = 'GC_544', + value = '-((cw*ee*complex(0,1)*NN2x1*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN2x2*complexconjugate(Rl2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_545 = Coupling(name = 'GC_545', + value = '-((cw*ee*complex(0,1)*NN3x1*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN3x2*complexconjugate(Rl2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_546 = Coupling(name = 'GC_546', + value = '-((cw*ee*complex(0,1)*NN4x1*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) - (ee*complex(0,1)*NN4x2*complexconjugate(Rl2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rl2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_547 = Coupling(name = 'GC_547', + value = '(complex(0,1)*I23a33*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a33*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*complexconjugate(Rl3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_548 = Coupling(name = 'GC_548', + value = '(complex(0,1)*I23a33*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a33*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN2x1*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*complexconjugate(Rl3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_549 = Coupling(name = 'GC_549', + value = '(complex(0,1)*I23a33*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a33*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN3x1*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*complexconjugate(Rl3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_550 = Coupling(name = 'GC_550', + value = '(complex(0,1)*I23a33*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a33*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN4x1*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*complexconjugate(Rl3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rl3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_551 = Coupling(name = 'GC_551', + value = '(complex(0,1)*I24a33*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a33*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rl3x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_552 = Coupling(name = 'GC_552', + value = '(complex(0,1)*I24a33*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a33*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rl3x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_553 = Coupling(name = 'GC_553', + value = '(complex(0,1)*I24a33*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a33*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rl3x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_554 = Coupling(name = 'GC_554', + value = '(complex(0,1)*I24a33*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a33*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rl3x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_555 = Coupling(name = 'GC_555', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rl4x4)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_556 = Coupling(name = 'GC_556', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rl4x4)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_557 = Coupling(name = 'GC_557', + value = '(cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rl4x4)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_558 = Coupling(name = 'GC_558', + value = '(cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rl4x4)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_559 = Coupling(name = 'GC_559', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rl5x5)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_560 = Coupling(name = 'GC_560', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rl5x5)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_561 = Coupling(name = 'GC_561', + value = '(cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rl5x5)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_562 = Coupling(name = 'GC_562', + value = '(cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rl5x5)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_563 = Coupling(name = 'GC_563', + value = '(complex(0,1)*I23a36*NN1x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a36*NN1x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*complexconjugate(Rl6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_564 = Coupling(name = 'GC_564', + value = '(complex(0,1)*I23a36*NN2x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a36*NN2x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN2x1*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*complexconjugate(Rl6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_565 = Coupling(name = 'GC_565', + value = '(complex(0,1)*I23a36*NN3x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a36*NN3x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN3x1*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*complexconjugate(Rl6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_566 = Coupling(name = 'GC_566', + value = '(complex(0,1)*I23a36*NN4x3)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I23a36*NN4x3*sw**2)/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN4x1*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*complexconjugate(Rl6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rl6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_567 = Coupling(name = 'GC_567', + value = '(complex(0,1)*I24a36*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a36*sw**2*complexconjugate(NN1x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Rl6x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_568 = Coupling(name = 'GC_568', + value = '(complex(0,1)*I24a36*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a36*sw**2*complexconjugate(NN2x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Rl6x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_569 = Coupling(name = 'GC_569', + value = '(complex(0,1)*I24a36*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a36*sw**2*complexconjugate(NN3x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Rl6x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_570 = Coupling(name = 'GC_570', + value = '(complex(0,1)*I24a36*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I24a36*sw**2*complexconjugate(NN4x3))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Rl6x6)*cmath.sqrt(2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_571 = Coupling(name = 'GC_571', + value = '-((cw*ee*complex(0,1)*NN1x1*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN1x2*complexconjugate(Rn1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_572 = Coupling(name = 'GC_572', + value = '-((cw*ee*complex(0,1)*NN2x1*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN2x2*complexconjugate(Rn1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_573 = Coupling(name = 'GC_573', + value = '-((cw*ee*complex(0,1)*NN3x1*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN3x2*complexconjugate(Rn1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_574 = Coupling(name = 'GC_574', + value = '-((cw*ee*complex(0,1)*NN4x1*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN4x2*complexconjugate(Rn1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rn1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_575 = Coupling(name = 'GC_575', + value = '-((cw*ee*complex(0,1)*NN1x1*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN1x2*complexconjugate(Rn2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_576 = Coupling(name = 'GC_576', + value = '-((cw*ee*complex(0,1)*NN2x1*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN2x2*complexconjugate(Rn2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_577 = Coupling(name = 'GC_577', + value = '-((cw*ee*complex(0,1)*NN3x1*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN3x2*complexconjugate(Rn2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_578 = Coupling(name = 'GC_578', + value = '-((cw*ee*complex(0,1)*NN4x1*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN4x2*complexconjugate(Rn2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rn2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_579 = Coupling(name = 'GC_579', + value = '-((cw*ee*complex(0,1)*NN1x1*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN1x2*complexconjugate(Rn3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_580 = Coupling(name = 'GC_580', + value = '-((cw*ee*complex(0,1)*NN2x1*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN2x2*complexconjugate(Rn3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_581 = Coupling(name = 'GC_581', + value = '-((cw*ee*complex(0,1)*NN3x1*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN3x2*complexconjugate(Rn3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_582 = Coupling(name = 'GC_582', + value = '-((cw*ee*complex(0,1)*NN4x1*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))) + (ee*complex(0,1)*NN4x2*complexconjugate(Rn3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Rn3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_583 = Coupling(name = 'GC_583', + value = '-(complex(0,1)*G*complexconjugate(Ru1x1)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_584 = Coupling(name = 'GC_584', + value = '(cw*ee*complex(0,1)*NN1x1*complexconjugate(Ru1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*complexconjugate(Ru1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Ru1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_585 = Coupling(name = 'GC_585', + value = '(cw*ee*complex(0,1)*NN2x1*complexconjugate(Ru1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*complexconjugate(Ru1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Ru1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_586 = Coupling(name = 'GC_586', + value = '(cw*ee*complex(0,1)*NN3x1*complexconjugate(Ru1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*complexconjugate(Ru1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Ru1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_587 = Coupling(name = 'GC_587', + value = '(cw*ee*complex(0,1)*NN4x1*complexconjugate(Ru1x1))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*complexconjugate(Ru1x1))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Ru1x1))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_588 = Coupling(name = 'GC_588', + value = '-(complex(0,1)*G*complexconjugate(Ru2x2)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_589 = Coupling(name = 'GC_589', + value = '(cw*ee*complex(0,1)*NN1x1*complexconjugate(Ru2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*complexconjugate(Ru2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Ru2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_590 = Coupling(name = 'GC_590', + value = '(cw*ee*complex(0,1)*NN2x1*complexconjugate(Ru2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*complexconjugate(Ru2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Ru2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_591 = Coupling(name = 'GC_591', + value = '(cw*ee*complex(0,1)*NN3x1*complexconjugate(Ru2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*complexconjugate(Ru2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Ru2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_592 = Coupling(name = 'GC_592', + value = '(cw*ee*complex(0,1)*NN4x1*complexconjugate(Ru2x2))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*complexconjugate(Ru2x2))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Ru2x2))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_593 = Coupling(name = 'GC_593', + value = '-(complex(0,1)*G*complexconjugate(Ru3x3)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_594 = Coupling(name = 'GC_594', + value = '(complex(0,1)*I49a33*NN1x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a33*NN1x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*complexconjugate(Ru3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*complexconjugate(Ru3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Ru3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_595 = Coupling(name = 'GC_595', + value = '(complex(0,1)*I49a33*NN2x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a33*NN2x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*complexconjugate(Ru3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*complexconjugate(Ru3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Ru3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_596 = Coupling(name = 'GC_596', + value = '(complex(0,1)*I49a33*NN3x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a33*NN3x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*complexconjugate(Ru3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*complexconjugate(Ru3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Ru3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_597 = Coupling(name = 'GC_597', + value = '(complex(0,1)*I49a33*NN4x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a33*NN4x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*complexconjugate(Ru3x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*complexconjugate(Ru3x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Ru3x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_598 = Coupling(name = 'GC_598', + value = 'complex(0,1)*G*complexconjugate(Ru3x6)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_599 = Coupling(name = 'GC_599', + value = '(complex(0,1)*I50a33*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a33*sw**2*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Ru3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_600 = Coupling(name = 'GC_600', + value = '(complex(0,1)*I50a33*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a33*sw**2*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Ru3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_601 = Coupling(name = 'GC_601', + value = '(complex(0,1)*I50a33*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a33*sw**2*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Ru3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_602 = Coupling(name = 'GC_602', + value = '(complex(0,1)*I50a33*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a33*sw**2*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Ru3x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_603 = Coupling(name = 'GC_603', + value = 'complex(0,1)*G*complexconjugate(Ru4x4)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_604 = Coupling(name = 'GC_604', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Ru4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_605 = Coupling(name = 'GC_605', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Ru4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_606 = Coupling(name = 'GC_606', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Ru4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_607 = Coupling(name = 'GC_607', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Ru4x4)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_608 = Coupling(name = 'GC_608', + value = 'complex(0,1)*G*complexconjugate(Ru5x5)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_609 = Coupling(name = 'GC_609', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Ru5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_610 = Coupling(name = 'GC_610', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Ru5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_611 = Coupling(name = 'GC_611', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Ru5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_612 = Coupling(name = 'GC_612', + value = '(-2*cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Ru5x5)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_613 = Coupling(name = 'GC_613', + value = '-(complex(0,1)*G*complexconjugate(Ru6x3)*cmath.sqrt(2))', + order = {'QCD':1}) + +GC_614 = Coupling(name = 'GC_614', + value = '(complex(0,1)*I49a36*NN1x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a36*NN1x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*complexconjugate(Ru6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*complexconjugate(Ru6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*complexconjugate(Ru6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_615 = Coupling(name = 'GC_615', + value = '(complex(0,1)*I49a36*NN2x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a36*NN2x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*complexconjugate(Ru6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*complexconjugate(Ru6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*complexconjugate(Ru6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_616 = Coupling(name = 'GC_616', + value = '(complex(0,1)*I49a36*NN3x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a36*NN3x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*complexconjugate(Ru6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*complexconjugate(Ru6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*complexconjugate(Ru6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_617 = Coupling(name = 'GC_617', + value = '(complex(0,1)*I49a36*NN4x4)/((-1 + sw)*(1 + sw)) - (complex(0,1)*I49a36*NN4x4*sw**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*complexconjugate(Ru6x3))/(3.*(-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*complexconjugate(Ru6x3))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*complexconjugate(Ru6x3))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_618 = Coupling(name = 'GC_618', + value = 'complex(0,1)*G*complexconjugate(Ru6x6)*cmath.sqrt(2)', + order = {'QCD':1}) + +GC_619 = Coupling(name = 'GC_619', + value = '(complex(0,1)*I50a36*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a36*sw**2*complexconjugate(NN1x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(Ru6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_620 = Coupling(name = 'GC_620', + value = '(complex(0,1)*I50a36*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a36*sw**2*complexconjugate(NN2x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(Ru6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_621 = Coupling(name = 'GC_621', + value = '(complex(0,1)*I50a36*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a36*sw**2*complexconjugate(NN3x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(Ru6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_622 = Coupling(name = 'GC_622', + value = '(complex(0,1)*I50a36*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I50a36*sw**2*complexconjugate(NN4x4))/((-1 + sw)*(1 + sw)) - (2*cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(Ru6x6)*cmath.sqrt(2))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_623 = Coupling(name = 'GC_623', + value = '-((ee*complex(0,1)*I10a11*complexconjugate(UU1x1))/sw)', + order = {'QED':1}) + +GC_624 = Coupling(name = 'GC_624', + value = '-((ee*complex(0,1)*I10a22*complexconjugate(UU1x1))/sw)', + order = {'QED':1}) + +GC_625 = Coupling(name = 'GC_625', + value = '-((ee*complex(0,1)*I29a11*complexconjugate(UU1x1))/sw)', + order = {'QED':1}) + +GC_626 = Coupling(name = 'GC_626', + value = '-((ee*complex(0,1)*I29a22*complexconjugate(UU1x1))/sw)', + order = {'QED':1}) + +GC_627 = Coupling(name = 'GC_627', + value = 'complex(0,1)*I88a33*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_628 = Coupling(name = 'GC_628', + value = 'complex(0,1)*I91a33*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_629 = Coupling(name = 'GC_629', + value = 'complex(0,1)*I91a36*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_630 = Coupling(name = 'GC_630', + value = '-((ee*complex(0,1)*I10a33*complexconjugate(UU1x1))/sw) + complex(0,1)*I12a33*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_631 = Coupling(name = 'GC_631', + value = '-((ee*complex(0,1)*I10a36*complexconjugate(UU1x1))/sw) + complex(0,1)*I12a36*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_632 = Coupling(name = 'GC_632', + value = '-((ee*complex(0,1)*I29a33*complexconjugate(UU1x1))/sw) + complex(0,1)*I30a33*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_633 = Coupling(name = 'GC_633', + value = '-((ee*complex(0,1)*I29a36*complexconjugate(UU1x1))/sw) + complex(0,1)*I30a36*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_634 = Coupling(name = 'GC_634', + value = '-((ee*complex(0,1)*NN1x2*complexconjugate(UU1x1))/sw) - (ee*complex(0,1)*NN1x3*complexconjugate(UU1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_635 = Coupling(name = 'GC_635', + value = '-((ee*complex(0,1)*NN2x2*complexconjugate(UU1x1))/sw) - (ee*complex(0,1)*NN2x3*complexconjugate(UU1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_636 = Coupling(name = 'GC_636', + value = '-((ee*complex(0,1)*NN3x2*complexconjugate(UU1x1))/sw) - (ee*complex(0,1)*NN3x3*complexconjugate(UU1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_637 = Coupling(name = 'GC_637', + value = '-((ee*complex(0,1)*NN4x2*complexconjugate(UU1x1))/sw) - (ee*complex(0,1)*NN4x3*complexconjugate(UU1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_638 = Coupling(name = 'GC_638', + value = 'ee*complex(0,1)*UU1x1*complexconjugate(UU1x1) + ee*complex(0,1)*UU1x2*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_639 = Coupling(name = 'GC_639', + value = '-((cw*ee*complex(0,1)*UU1x1*complexconjugate(UU1x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*UU1x1*complexconjugate(UU1x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*UU1x2*complexconjugate(UU1x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*UU1x2*complexconjugate(UU1x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_640 = Coupling(name = 'GC_640', + value = 'ee*complex(0,1)*UU2x1*complexconjugate(UU1x1) + ee*complex(0,1)*UU2x2*complexconjugate(UU1x2)', + order = {'QED':1}) + +GC_641 = Coupling(name = 'GC_641', + value = '-((cw*ee*complex(0,1)*UU2x1*complexconjugate(UU1x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*UU2x1*complexconjugate(UU1x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*UU2x2*complexconjugate(UU1x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*UU2x2*complexconjugate(UU1x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_642 = Coupling(name = 'GC_642', + value = '-((ee*complex(0,1)*I10a11*complexconjugate(UU2x1))/sw)', + order = {'QED':1}) + +GC_643 = Coupling(name = 'GC_643', + value = '-((ee*complex(0,1)*I10a22*complexconjugate(UU2x1))/sw)', + order = {'QED':1}) + +GC_644 = Coupling(name = 'GC_644', + value = '-((ee*complex(0,1)*I29a11*complexconjugate(UU2x1))/sw)', + order = {'QED':1}) + +GC_645 = Coupling(name = 'GC_645', + value = '-((ee*complex(0,1)*I29a22*complexconjugate(UU2x1))/sw)', + order = {'QED':1}) + +GC_646 = Coupling(name = 'GC_646', + value = 'complex(0,1)*I88a33*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_647 = Coupling(name = 'GC_647', + value = 'complex(0,1)*I91a33*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_648 = Coupling(name = 'GC_648', + value = 'complex(0,1)*I91a36*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_649 = Coupling(name = 'GC_649', + value = '-((ee*complex(0,1)*I10a33*complexconjugate(UU2x1))/sw) + complex(0,1)*I12a33*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_650 = Coupling(name = 'GC_650', + value = '-((ee*complex(0,1)*I10a36*complexconjugate(UU2x1))/sw) + complex(0,1)*I12a36*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_651 = Coupling(name = 'GC_651', + value = '-((ee*complex(0,1)*I29a33*complexconjugate(UU2x1))/sw) + complex(0,1)*I30a33*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_652 = Coupling(name = 'GC_652', + value = '-((ee*complex(0,1)*I29a36*complexconjugate(UU2x1))/sw) + complex(0,1)*I30a36*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_653 = Coupling(name = 'GC_653', + value = '-((ee*complex(0,1)*NN1x2*complexconjugate(UU2x1))/sw) - (ee*complex(0,1)*NN1x3*complexconjugate(UU2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_654 = Coupling(name = 'GC_654', + value = '-((ee*complex(0,1)*NN2x2*complexconjugate(UU2x1))/sw) - (ee*complex(0,1)*NN2x3*complexconjugate(UU2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_655 = Coupling(name = 'GC_655', + value = '-((ee*complex(0,1)*NN3x2*complexconjugate(UU2x1))/sw) - (ee*complex(0,1)*NN3x3*complexconjugate(UU2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_656 = Coupling(name = 'GC_656', + value = '-((ee*complex(0,1)*NN4x2*complexconjugate(UU2x1))/sw) - (ee*complex(0,1)*NN4x3*complexconjugate(UU2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_657 = Coupling(name = 'GC_657', + value = 'ee*complex(0,1)*UU1x1*complexconjugate(UU2x1) + ee*complex(0,1)*UU1x2*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_658 = Coupling(name = 'GC_658', + value = '-((cw*ee*complex(0,1)*UU1x1*complexconjugate(UU2x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*UU1x1*complexconjugate(UU2x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*UU1x2*complexconjugate(UU2x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*UU1x2*complexconjugate(UU2x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_659 = Coupling(name = 'GC_659', + value = 'ee*complex(0,1)*UU2x1*complexconjugate(UU2x1) + ee*complex(0,1)*UU2x2*complexconjugate(UU2x2)', + order = {'QED':1}) + +GC_660 = Coupling(name = 'GC_660', + value = '-((cw*ee*complex(0,1)*UU2x1*complexconjugate(UU2x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*UU2x1*complexconjugate(UU2x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*UU2x2*complexconjugate(UU2x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*UU2x2*complexconjugate(UU2x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_661 = Coupling(name = 'GC_661', + value = '-((ee*complex(0,1)*I43a11*complexconjugate(VV1x1))/sw)', + order = {'QED':1}) + +GC_662 = Coupling(name = 'GC_662', + value = '-((ee*complex(0,1)*I43a22*complexconjugate(VV1x1))/sw)', + order = {'QED':1}) + +GC_663 = Coupling(name = 'GC_663', + value = '-((ee*complex(0,1)*I43a33*complexconjugate(VV1x1))/sw)', + order = {'QED':1}) + +GC_664 = Coupling(name = 'GC_664', + value = '-((ee*complex(0,1)*I63a11*complexconjugate(VV1x1))/sw)', + order = {'QED':1}) + +GC_665 = Coupling(name = 'GC_665', + value = '-((ee*complex(0,1)*I63a22*complexconjugate(VV1x1))/sw)', + order = {'QED':1}) + +GC_666 = Coupling(name = 'GC_666', + value = 'complex(0,1)*I84a33*complexconjugate(VV1x2)', + order = {'QED':1}) + +GC_667 = Coupling(name = 'GC_667', + value = 'complex(0,1)*I84a36*complexconjugate(VV1x2)', + order = {'QED':1}) + +GC_668 = Coupling(name = 'GC_668', + value = '-((ee*complex(0,1)*I63a33*complexconjugate(VV1x1))/sw) + complex(0,1)*I65a33*complexconjugate(VV1x2)', + order = {'QED':1}) + +GC_669 = Coupling(name = 'GC_669', + value = '-((ee*complex(0,1)*I63a36*complexconjugate(VV1x1))/sw) + complex(0,1)*I65a36*complexconjugate(VV1x2)', + order = {'QED':1}) + +GC_670 = Coupling(name = 'GC_670', + value = '-((ee*complex(0,1)*NN1x2*complexconjugate(VV1x1))/sw) + (ee*complex(0,1)*NN1x4*complexconjugate(VV1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_671 = Coupling(name = 'GC_671', + value = '-((ee*complex(0,1)*NN2x2*complexconjugate(VV1x1))/sw) + (ee*complex(0,1)*NN2x4*complexconjugate(VV1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_672 = Coupling(name = 'GC_672', + value = '-((ee*complex(0,1)*NN3x2*complexconjugate(VV1x1))/sw) + (ee*complex(0,1)*NN3x4*complexconjugate(VV1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_673 = Coupling(name = 'GC_673', + value = '-((ee*complex(0,1)*NN4x2*complexconjugate(VV1x1))/sw) + (ee*complex(0,1)*NN4x4*complexconjugate(VV1x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_674 = Coupling(name = 'GC_674', + value = 'ee*complex(0,1)*VV1x1*complexconjugate(VV1x1) + ee*complex(0,1)*VV1x2*complexconjugate(VV1x2)', + order = {'QED':1}) + +GC_675 = Coupling(name = 'GC_675', + value = '-((cw*ee*complex(0,1)*VV1x1*complexconjugate(VV1x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*VV1x1*complexconjugate(VV1x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*VV1x2*complexconjugate(VV1x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*VV1x2*complexconjugate(VV1x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_676 = Coupling(name = 'GC_676', + value = 'ee*complex(0,1)*VV2x1*complexconjugate(VV1x1) + ee*complex(0,1)*VV2x2*complexconjugate(VV1x2)', + order = {'QED':1}) + +GC_677 = Coupling(name = 'GC_677', + value = '-((cw*ee*complex(0,1)*VV2x1*complexconjugate(VV1x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*VV2x1*complexconjugate(VV1x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*VV2x2*complexconjugate(VV1x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*VV2x2*complexconjugate(VV1x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_678 = Coupling(name = 'GC_678', + value = '-((ee*complex(0,1)*I43a11*complexconjugate(VV2x1))/sw)', + order = {'QED':1}) + +GC_679 = Coupling(name = 'GC_679', + value = '-((ee*complex(0,1)*I43a22*complexconjugate(VV2x1))/sw)', + order = {'QED':1}) + +GC_680 = Coupling(name = 'GC_680', + value = '-((ee*complex(0,1)*I43a33*complexconjugate(VV2x1))/sw)', + order = {'QED':1}) + +GC_681 = Coupling(name = 'GC_681', + value = '-((ee*complex(0,1)*I63a11*complexconjugate(VV2x1))/sw)', + order = {'QED':1}) + +GC_682 = Coupling(name = 'GC_682', + value = '-((ee*complex(0,1)*I63a22*complexconjugate(VV2x1))/sw)', + order = {'QED':1}) + +GC_683 = Coupling(name = 'GC_683', + value = 'complex(0,1)*I84a33*complexconjugate(VV2x2)', + order = {'QED':1}) + +GC_684 = Coupling(name = 'GC_684', + value = 'complex(0,1)*I84a36*complexconjugate(VV2x2)', + order = {'QED':1}) + +GC_685 = Coupling(name = 'GC_685', + value = '-((ee*complex(0,1)*I63a33*complexconjugate(VV2x1))/sw) + complex(0,1)*I65a33*complexconjugate(VV2x2)', + order = {'QED':1}) + +GC_686 = Coupling(name = 'GC_686', + value = '-((ee*complex(0,1)*I63a36*complexconjugate(VV2x1))/sw) + complex(0,1)*I65a36*complexconjugate(VV2x2)', + order = {'QED':1}) + +GC_687 = Coupling(name = 'GC_687', + value = '-((ee*complex(0,1)*NN1x2*complexconjugate(VV2x1))/sw) + (ee*complex(0,1)*NN1x4*complexconjugate(VV2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_688 = Coupling(name = 'GC_688', + value = '-((ee*complex(0,1)*NN2x2*complexconjugate(VV2x1))/sw) + (ee*complex(0,1)*NN2x4*complexconjugate(VV2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_689 = Coupling(name = 'GC_689', + value = '-((ee*complex(0,1)*NN3x2*complexconjugate(VV2x1))/sw) + (ee*complex(0,1)*NN3x4*complexconjugate(VV2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_690 = Coupling(name = 'GC_690', + value = '-((ee*complex(0,1)*NN4x2*complexconjugate(VV2x1))/sw) + (ee*complex(0,1)*NN4x4*complexconjugate(VV2x2))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_691 = Coupling(name = 'GC_691', + value = 'ee*complex(0,1)*VV1x1*complexconjugate(VV2x1) + ee*complex(0,1)*VV1x2*complexconjugate(VV2x2)', + order = {'QED':1}) + +GC_692 = Coupling(name = 'GC_692', + value = '-((cw*ee*complex(0,1)*VV1x1*complexconjugate(VV2x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*VV1x1*complexconjugate(VV2x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*VV1x2*complexconjugate(VV2x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*VV1x2*complexconjugate(VV2x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_693 = Coupling(name = 'GC_693', + value = 'ee*complex(0,1)*VV2x1*complexconjugate(VV2x1) + ee*complex(0,1)*VV2x2*complexconjugate(VV2x2)', + order = {'QED':1}) + +GC_694 = Coupling(name = 'GC_694', + value = '-((cw*ee*complex(0,1)*VV2x1*complexconjugate(VV2x1))/((-1 + sw)*sw*(1 + sw))) + (cw*ee*complex(0,1)*sw*VV2x1*complexconjugate(VV2x1))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*VV2x2*complexconjugate(VV2x2))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*complex(0,1)*sw*VV2x2*complexconjugate(VV2x2))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_695 = Coupling(name = 'GC_695', + value = '-((complex(0,1)*yd3x3*cmath.cos(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_696 = Coupling(name = 'GC_696', + value = '-((complex(0,1)*ye3x3*cmath.cos(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_697 = Coupling(name = 'GC_697', + value = '-((complex(0,1)*yu3x3*cmath.cos(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_698 = Coupling(name = 'GC_698', + value = '-((complex(0,1)*complexconjugate(yd3x3)*cmath.cos(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_699 = Coupling(name = 'GC_699', + value = '-((complex(0,1)*complexconjugate(ye3x3)*cmath.cos(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_700 = Coupling(name = 'GC_700', + value = '-((complex(0,1)*complexconjugate(yu3x3)*cmath.cos(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_701 = Coupling(name = 'GC_701', + value = 'complex(0,1)*I1a33*cmath.cos(beta)', + order = {'QED':1}) + +GC_702 = Coupling(name = 'GC_702', + value = '-(complex(0,1)*I2a33*cmath.cos(beta))', + order = {'QED':1}) + +GC_703 = Coupling(name = 'GC_703', + value = '-(complex(0,1)*I3a33*cmath.cos(beta))', + order = {'QED':1}) + +GC_704 = Coupling(name = 'GC_704', + value = 'complex(0,1)*I4a33*cmath.cos(beta)', + order = {'QED':1}) + +GC_705 = Coupling(name = 'GC_705', + value = '-(complex(0,1)*I5a33*cmath.cos(beta))', + order = {'QED':1}) + +GC_706 = Coupling(name = 'GC_706', + value = '-(complex(0,1)*I99a33*cmath.cos(beta))', + order = {'QED':1}) + +GC_707 = Coupling(name = 'GC_707', + value = '-((yd3x3*cmath.cos(beta))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_708 = Coupling(name = 'GC_708', + value = '-((ye3x3*cmath.cos(beta))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_709 = Coupling(name = 'GC_709', + value = '(yu3x3*cmath.cos(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_710 = Coupling(name = 'GC_710', + value = '(complexconjugate(yd3x3)*cmath.cos(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_711 = Coupling(name = 'GC_711', + value = '(complexconjugate(ye3x3)*cmath.cos(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_712 = Coupling(name = 'GC_712', + value = '-((complexconjugate(yu3x3)*cmath.cos(beta))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_713 = Coupling(name = 'GC_713', + value = '-((ee*complex(0,1)*NN1x3*UU1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN1x3*sw*UU1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*UU1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_714 = Coupling(name = 'GC_714', + value = '-((ee*complex(0,1)*NN2x3*UU1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN2x3*sw*UU1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*UU1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_715 = Coupling(name = 'GC_715', + value = '-((ee*complex(0,1)*NN3x3*UU1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN3x3*sw*UU1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*UU1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_716 = Coupling(name = 'GC_716', + value = '-((ee*complex(0,1)*NN4x3*UU1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN4x3*sw*UU1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*UU1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*UU1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_717 = Coupling(name = 'GC_717', + value = '-((ee*complex(0,1)*NN1x3*UU2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN1x3*sw*UU2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*UU2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_718 = Coupling(name = 'GC_718', + value = '-((ee*complex(0,1)*NN2x3*UU2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN2x3*sw*UU2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*UU2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_719 = Coupling(name = 'GC_719', + value = '-((ee*complex(0,1)*NN3x3*UU2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN3x3*sw*UU2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*UU2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_720 = Coupling(name = 'GC_720', + value = '-((ee*complex(0,1)*NN4x3*UU2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*NN4x3*sw*UU2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*UU2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*UU2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_721 = Coupling(name = 'GC_721', + value = '(ee*complex(0,1)*NN1x4*VV1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x4*sw*VV1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*VV1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_722 = Coupling(name = 'GC_722', + value = '(ee*complex(0,1)*NN2x4*VV1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x4*sw*VV1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*VV1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_723 = Coupling(name = 'GC_723', + value = '(ee*complex(0,1)*NN3x4*VV1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x4*sw*VV1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*VV1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_724 = Coupling(name = 'GC_724', + value = '(ee*complex(0,1)*NN4x4*VV1x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x4*sw*VV1x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*VV1x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*VV1x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_725 = Coupling(name = 'GC_725', + value = '(ee*complex(0,1)*NN1x4*VV2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x4*sw*VV2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*VV2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_726 = Coupling(name = 'GC_726', + value = '(ee*complex(0,1)*NN2x4*VV2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x4*sw*VV2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*VV2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_727 = Coupling(name = 'GC_727', + value = '(ee*complex(0,1)*NN3x4*VV2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x4*sw*VV2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*VV2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_728 = Coupling(name = 'GC_728', + value = '(ee*complex(0,1)*NN4x4*VV2x1*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x4*sw*VV2x1*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*VV2x2*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*VV2x2*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_729 = Coupling(name = 'GC_729', + value = '-((ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_730 = Coupling(name = 'GC_730', + value = '-((ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_731 = Coupling(name = 'GC_731', + value = '-((ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN3x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_732 = Coupling(name = 'GC_732', + value = '-((ee*complex(0,1)*complexconjugate(NN4x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN4x3)*complexconjugate(UU1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(UU1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_733 = Coupling(name = 'GC_733', + value = '-((ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_734 = Coupling(name = 'GC_734', + value = '-((ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_735 = Coupling(name = 'GC_735', + value = '-((ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN3x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_736 = Coupling(name = 'GC_736', + value = '-((ee*complex(0,1)*complexconjugate(NN4x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw))) + (ee*complex(0,1)*sw*complexconjugate(NN4x3)*complexconjugate(UU2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(UU2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_737 = Coupling(name = 'GC_737', + value = '(ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_738 = Coupling(name = 'GC_738', + value = '(ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_739 = Coupling(name = 'GC_739', + value = '(ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_740 = Coupling(name = 'GC_740', + value = '(ee*complex(0,1)*complexconjugate(NN4x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x4)*complexconjugate(VV1x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(VV1x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_741 = Coupling(name = 'GC_741', + value = '(ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_742 = Coupling(name = 'GC_742', + value = '(ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_743 = Coupling(name = 'GC_743', + value = '(ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_744 = Coupling(name = 'GC_744', + value = '(ee*complex(0,1)*complexconjugate(NN4x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x4)*complexconjugate(VV2x1)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(VV2x2)*cmath.cos(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_745 = Coupling(name = 'GC_745', + value = '(complex(0,1)*yd3x3*cmath.sin(alp))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_746 = Coupling(name = 'GC_746', + value = '(complex(0,1)*ye3x3*cmath.sin(alp))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_747 = Coupling(name = 'GC_747', + value = '-((complex(0,1)*yu3x3*cmath.sin(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_748 = Coupling(name = 'GC_748', + value = '(complex(0,1)*complexconjugate(yd3x3)*cmath.sin(alp))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_749 = Coupling(name = 'GC_749', + value = '(complex(0,1)*complexconjugate(ye3x3)*cmath.sin(alp))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_750 = Coupling(name = 'GC_750', + value = '-((complex(0,1)*complexconjugate(yu3x3)*cmath.sin(alp))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_751 = Coupling(name = 'GC_751', + value = '(cw*ee*complex(0,1)*NN1x1*NN1x4*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN1x4*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN1x4*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN1x3*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN1x3*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN1x3*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_752 = Coupling(name = 'GC_752', + value = '-((cw*ee*complex(0,1)*NN1x1*NN1x3*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*NN1x2*NN1x3*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN1x3*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN1x4*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN1x4*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN1x4*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_753 = Coupling(name = 'GC_753', + value = '(cw*ee*complex(0,1)*NN1x4*NN2x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN2x4*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x4*NN2x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN2x4*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x4*NN2x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN2x4*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x3*NN2x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN2x3*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x3*NN2x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN2x3*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x3*NN2x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN2x3*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_754 = Coupling(name = 'GC_754', + value = '(cw*ee*complex(0,1)*NN2x1*NN2x4*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN2x4*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN2x4*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN2x3*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN2x3*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN2x3*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_755 = Coupling(name = 'GC_755', + value = '-(cw*ee*complex(0,1)*NN1x3*NN2x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*NN2x3*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x3*NN2x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN2x3*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x3*NN2x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN2x3*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*NN2x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN2x4*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x4*NN2x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN2x4*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x4*NN2x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN2x4*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_756 = Coupling(name = 'GC_756', + value = '-((cw*ee*complex(0,1)*NN2x1*NN2x3*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*NN2x2*NN2x3*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN2x3*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN2x4*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN2x4*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN2x4*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_757 = Coupling(name = 'GC_757', + value = '(cw*ee*complex(0,1)*NN1x4*NN3x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN3x4*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x4*NN3x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN3x4*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x4*NN3x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN3x4*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x3*NN3x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN3x3*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x3*NN3x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN3x3*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x3*NN3x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN3x3*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_758 = Coupling(name = 'GC_758', + value = '(cw*ee*complex(0,1)*NN2x4*NN3x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN3x4*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x4*NN3x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN3x4*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x4*NN3x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN3x4*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x3*NN3x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN3x3*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x3*NN3x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN3x3*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x3*NN3x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN3x3*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_759 = Coupling(name = 'GC_759', + value = '(cw*ee*complex(0,1)*NN3x1*NN3x4*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN3x4*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN3x4*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*NN3x3*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN3x3*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN3x3*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_760 = Coupling(name = 'GC_760', + value = '-(cw*ee*complex(0,1)*NN1x3*NN3x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*NN3x3*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x3*NN3x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN3x3*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x3*NN3x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN3x3*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*NN3x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN3x4*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x4*NN3x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN3x4*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x4*NN3x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN3x4*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_761 = Coupling(name = 'GC_761', + value = '-(cw*ee*complex(0,1)*NN2x3*NN3x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN2x1*NN3x3*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x3*NN3x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN3x3*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x3*NN3x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN3x3*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x4*NN3x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN3x4*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x4*NN3x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN3x4*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x4*NN3x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN3x4*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_762 = Coupling(name = 'GC_762', + value = '-((cw*ee*complex(0,1)*NN3x1*NN3x3*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*NN3x2*NN3x3*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN3x3*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*NN3x4*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN3x4*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN3x4*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_763 = Coupling(name = 'GC_763', + value = '(cw*ee*complex(0,1)*NN1x4*NN4x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN4x4*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x4*NN4x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN4x4*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x4*NN4x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN4x4*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x3*NN4x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN4x3*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x3*NN4x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN4x3*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x3*NN4x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN4x3*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_764 = Coupling(name = 'GC_764', + value = '(cw*ee*complex(0,1)*NN2x4*NN4x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN4x4*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x4*NN4x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN4x4*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x4*NN4x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN4x4*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x3*NN4x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN4x3*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x3*NN4x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN4x3*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x3*NN4x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN4x3*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_765 = Coupling(name = 'GC_765', + value = '(cw*ee*complex(0,1)*NN3x4*NN4x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*NN4x4*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x4*NN4x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN4x4*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x4*NN4x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN4x4*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x3*NN4x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*NN4x3*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x3*NN4x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN4x3*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x3*NN4x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN4x3*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_766 = Coupling(name = 'GC_766', + value = '(cw*ee*complex(0,1)*NN4x1*NN4x4*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN4x2*NN4x4*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN4x2*NN4x4*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*NN4x3*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN4x2*NN4x3*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN4x2*NN4x3*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_767 = Coupling(name = 'GC_767', + value = '-(cw*ee*complex(0,1)*NN1x3*NN4x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*NN4x3*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x3*NN4x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN4x3*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x3*NN4x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN4x3*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x4*NN4x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*NN4x4*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN1x4*NN4x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x2*NN4x4*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN1x4*NN4x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN1x2*NN4x4*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_768 = Coupling(name = 'GC_768', + value = '-(cw*ee*complex(0,1)*NN2x3*NN4x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN2x1*NN4x3*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x3*NN4x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN4x3*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x3*NN4x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN4x3*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x4*NN4x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*NN4x4*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN2x4*NN4x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x2*NN4x4*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN2x4*NN4x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN2x2*NN4x4*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_769 = Coupling(name = 'GC_769', + value = '-(cw*ee*complex(0,1)*NN3x3*NN4x1*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN3x1*NN4x3*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN3x3*NN4x2*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN4x3*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x3*NN4x2*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN4x3*sw*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x4*NN4x1*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*NN4x4*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN3x4*NN4x2*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x2*NN4x4*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN3x4*NN4x2*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*NN3x2*NN4x4*sw*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_770 = Coupling(name = 'GC_770', + value = '-((cw*ee*complex(0,1)*NN4x1*NN4x3*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*NN4x2*NN4x3*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x2*NN4x3*sw*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*NN4x4*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*NN4x2*NN4x4*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*NN4x2*NN4x4*sw*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_771 = Coupling(name = 'GC_771', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp))/(4.*sw**2) + (ee**2*complex(0,1)*vd*cmath.sin(alp))/(4.*sw**2)', + order = {'QED':1}) + +GC_772 = Coupling(name = 'GC_772', + value = '(ee**2*complex(0,1)*vu*cmath.cos(alp))/(2.*sw**2) - (ee**2*complex(0,1)*vd*cmath.sin(alp))/(2.*sw**2)', + order = {'QED':1}) + +GC_773 = Coupling(name = 'GC_773', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp))/2. - (cw**2*ee**2*complex(0,1)*vu*cmath.cos(alp))/(4.*sw**2) - (ee**2*complex(0,1)*sw**2*vu*cmath.cos(alp))/(4.*cw**2) + (ee**2*complex(0,1)*vd*cmath.sin(alp))/2. + (cw**2*ee**2*complex(0,1)*vd*cmath.sin(alp))/(4.*sw**2) + (ee**2*complex(0,1)*sw**2*vd*cmath.sin(alp))/(4.*cw**2)', + order = {'QED':1}) + +GC_774 = Coupling(name = 'GC_774', + value = '(ee**2*complex(0,1)*I26a44*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a44*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_775 = Coupling(name = 'GC_775', + value = '(ee**2*complex(0,1)*I26a55*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a55*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_776 = Coupling(name = 'GC_776', + value = '-(ee**2*complex(0,1)*I52a44*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a44*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_777 = Coupling(name = 'GC_777', + value = '-(ee**2*complex(0,1)*I52a55*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a55*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_778 = Coupling(name = 'GC_778', + value = '(ee**2*complex(0,1)*I9a44*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a44*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_779 = Coupling(name = 'GC_779', + value = '(ee**2*complex(0,1)*I9a55*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a55*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_780 = Coupling(name = 'GC_780', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_781 = Coupling(name = 'GC_781', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.sin(alp))/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_782 = Coupling(name = 'GC_782', + value = '-(ee**2*complex(0,1)*I25a11*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a11*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I25a11*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a11*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_783 = Coupling(name = 'GC_783', + value = '-(ee**2*complex(0,1)*I25a22*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a22*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I25a22*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a22*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_784 = Coupling(name = 'GC_784', + value = '(ee**2*complex(0,1)*I51a11*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a11*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*I51a11*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a11*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_785 = Coupling(name = 'GC_785', + value = '(ee**2*complex(0,1)*I51a22*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a22*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*I51a22*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a22*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_786 = Coupling(name = 'GC_786', + value = '-(ee**2*complex(0,1)*I8a11*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a11*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I8a11*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a11*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_787 = Coupling(name = 'GC_787', + value = '-(ee**2*complex(0,1)*I8a22*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a22*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I8a22*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a22*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_788 = Coupling(name = 'GC_788', + value = '-(ee**2*complex(0,1)*I8a33*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a33*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a33*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a33*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a33*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a33*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a33*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I20a33*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a33*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a33*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a33*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a33*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I20a33*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a33*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I17a33*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a33*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I17a33*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a33*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_789 = Coupling(name = 'GC_789', + value = '-(ee**2*complex(0,1)*I8a36*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a36*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a36*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a36*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a36*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a36*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a36*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I20a36*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a36*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a36*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a36*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a36*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I20a36*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a36*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I17a36*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a36*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I17a36*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a36*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_790 = Coupling(name = 'GC_790', + value = '-(ee**2*complex(0,1)*I8a63*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a63*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a63*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a63*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a63*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a63*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a63*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I20a63*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a63*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a63*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a63*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a63*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I20a63*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a63*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I17a63*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a63*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I17a63*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a63*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_791 = Coupling(name = 'GC_791', + value = '-(ee**2*complex(0,1)*I8a66*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a66*vu*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a66*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a66*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a66*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a66*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a66*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I20a66*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a66*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a66*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a66*vd*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a66*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I20a66*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a66*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I17a66*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a66*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I17a66*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a66*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_792 = Coupling(name = 'GC_792', + value = '-(ee**2*complex(0,1)*I25a33*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a33*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a33*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a33*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a33*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a33*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a33*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a33*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a33*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (complex(0,1)*I36a33*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a33*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a33*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I36a33*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a33*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I33a33*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a33*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I33a33*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a33*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_793 = Coupling(name = 'GC_793', + value = '-(ee**2*complex(0,1)*I25a36*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a36*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a36*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a36*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a36*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a36*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a36*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a36*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a36*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (complex(0,1)*I36a36*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a36*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a36*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I36a36*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a36*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I33a36*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a36*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I33a36*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a36*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_794 = Coupling(name = 'GC_794', + value = '-(ee**2*complex(0,1)*I25a63*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a63*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a63*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a63*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a63*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a63*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a63*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a63*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a63*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (complex(0,1)*I36a63*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a63*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a63*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I36a63*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a63*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I33a63*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a63*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I33a63*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a63*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_795 = Coupling(name = 'GC_795', + value = '-(ee**2*complex(0,1)*I25a66*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a66*vu*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a66*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a66*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a66*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a66*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a66*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a66*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a66*vd*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (complex(0,1)*I36a66*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a66*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a66*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I36a66*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a66*sw**2*vd*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I33a66*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a66*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I33a66*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a66*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_796 = Coupling(name = 'GC_796', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp))/(4.*sw**2) - (ee**2*complex(0,1)*vu*cmath.sin(alp))/(4.*sw**2)', + order = {'QED':1}) + +GC_797 = Coupling(name = 'GC_797', + value = '(ee**2*complex(0,1)*vd*cmath.cos(alp))/(2.*sw**2) + (ee**2*complex(0,1)*vu*cmath.sin(alp))/(2.*sw**2)', + order = {'QED':1}) + +GC_798 = Coupling(name = 'GC_798', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp))/2. - (cw**2*ee**2*complex(0,1)*vd*cmath.cos(alp))/(4.*sw**2) - (ee**2*complex(0,1)*sw**2*vd*cmath.cos(alp))/(4.*cw**2) - (ee**2*complex(0,1)*vu*cmath.sin(alp))/2. - (cw**2*ee**2*complex(0,1)*vu*cmath.sin(alp))/(4.*sw**2) - (ee**2*complex(0,1)*sw**2*vu*cmath.sin(alp))/(4.*cw**2)', + order = {'QED':1}) + +GC_799 = Coupling(name = 'GC_799', + value = '-(ee**2*complex(0,1)*I26a44*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a44*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_800 = Coupling(name = 'GC_800', + value = '-(ee**2*complex(0,1)*I26a55*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a55*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_801 = Coupling(name = 'GC_801', + value = '(ee**2*complex(0,1)*I52a44*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a44*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_802 = Coupling(name = 'GC_802', + value = '(ee**2*complex(0,1)*I52a55*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a55*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_803 = Coupling(name = 'GC_803', + value = '-(ee**2*complex(0,1)*I9a44*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a44*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_804 = Coupling(name = 'GC_804', + value = '-(ee**2*complex(0,1)*I9a55*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a55*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_805 = Coupling(name = 'GC_805', + value = '(ee**2*complex(0,1)*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_806 = Coupling(name = 'GC_806', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp))/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.sin(alp))/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_807 = Coupling(name = 'GC_807', + value = '(ee**2*complex(0,1)*I25a11*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I25a11*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I25a11*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a11*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_808 = Coupling(name = 'GC_808', + value = '(ee**2*complex(0,1)*I25a22*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I25a22*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I25a22*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a22*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_809 = Coupling(name = 'GC_809', + value = '-(ee**2*complex(0,1)*I51a11*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I51a11*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*I51a11*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a11*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_810 = Coupling(name = 'GC_810', + value = '-(ee**2*complex(0,1)*I51a22*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I51a22*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*I51a22*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a22*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_811 = Coupling(name = 'GC_811', + value = '(ee**2*complex(0,1)*I8a11*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a11*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I8a11*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a11*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_812 = Coupling(name = 'GC_812', + value = '(ee**2*complex(0,1)*I8a22*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a22*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*I8a22*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a22*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_813 = Coupling(name = 'GC_813', + value = '-(ee**2*complex(0,1)*I51a33*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I52a33*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I51a33*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I76a33*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I76a33*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a33*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a33*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a33*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a33*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a33*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a33*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a33*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a33*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a33*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a33*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a33*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a33*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a33*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_814 = Coupling(name = 'GC_814', + value = '-(ee**2*complex(0,1)*I51a36*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I52a36*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I51a36*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I76a36*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I76a36*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a36*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a36*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a36*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a36*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a36*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a36*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a36*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a36*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a36*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a36*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a36*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a36*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a36*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_815 = Coupling(name = 'GC_815', + value = '-(ee**2*complex(0,1)*I51a63*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I52a63*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I51a63*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I76a63*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I76a63*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a63*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a63*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a63*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a63*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a63*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a63*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a63*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a63*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a63*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a63*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a63*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a63*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a63*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_816 = Coupling(name = 'GC_816', + value = '-(ee**2*complex(0,1)*I51a66*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I52a66*vd*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I51a66*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I76a66*MUH*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I76a66*MUH*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a66*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a66*sw**2*complexconjugate(MUH)*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a66*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a66*vu*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a66*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a66*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a66*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a66*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a66*sw**2*vu*cmath.sin(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a66*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a66*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a66*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a66*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_817 = Coupling(name = 'GC_817', + value = '-((ee*complex(0,1)*UU1x1*VV1x2*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*UU1x2*VV1x1*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_818 = Coupling(name = 'GC_818', + value = '-((ee*complex(0,1)*UU2x1*VV1x2*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*UU2x2*VV1x1*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_819 = Coupling(name = 'GC_819', + value = '-((ee*complex(0,1)*UU1x2*VV1x1*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*UU1x1*VV1x2*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_820 = Coupling(name = 'GC_820', + value = '-((ee*complex(0,1)*UU2x2*VV1x1*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*UU2x1*VV1x2*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_821 = Coupling(name = 'GC_821', + value = '-((ee*complex(0,1)*UU1x1*VV2x2*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*UU1x2*VV2x1*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_822 = Coupling(name = 'GC_822', + value = '-((ee*complex(0,1)*UU2x1*VV2x2*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*UU2x2*VV2x1*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_823 = Coupling(name = 'GC_823', + value = '-((ee*complex(0,1)*UU1x2*VV2x1*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*UU1x1*VV2x2*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_824 = Coupling(name = 'GC_824', + value = '-((ee*complex(0,1)*UU2x2*VV2x1*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*UU2x1*VV2x2*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_825 = Coupling(name = 'GC_825', + value = '(complex(0,1)*I20a33*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a33*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a33*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I9a33*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a33*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I20a33*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a33*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I17a33*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a33*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I17a33*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a33*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I8a33*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a33*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a33*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a33*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a33*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a33*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a33*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_826 = Coupling(name = 'GC_826', + value = '(complex(0,1)*I20a36*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a36*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a36*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I9a36*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a36*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I20a36*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a36*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I17a36*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a36*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I17a36*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a36*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I8a36*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a36*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a36*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a36*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a36*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a36*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a36*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_827 = Coupling(name = 'GC_827', + value = '(complex(0,1)*I20a63*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a63*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a63*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I9a63*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a63*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I20a63*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a63*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I17a63*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a63*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I17a63*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a63*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I8a63*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a63*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a63*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a63*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a63*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a63*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a63*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_828 = Coupling(name = 'GC_828', + value = '(complex(0,1)*I20a66*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I22a66*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a66*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I9a66*vd*cmath.cos(alp))/(6.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I8a66*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I20a66*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I22a66*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I17a66*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I19a66*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I17a66*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I19a66*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I8a66*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I9a66*vu*cmath.sin(alp))/(6.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I8a66*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I18a66*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I18a66*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I21a66*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I21a66*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_829 = Coupling(name = 'GC_829', + value = '(ee**2*complex(0,1)*I25a33*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I26a33*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I36a33*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a33*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I25a33*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I36a33*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a33*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I33a33*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a33*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I33a33*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a33*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a33*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a33*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a33*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a33*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a33*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a33*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a33*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_830 = Coupling(name = 'GC_830', + value = '(ee**2*complex(0,1)*I25a36*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I26a36*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I36a36*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a36*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I25a36*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I36a36*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a36*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I33a36*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a36*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I33a36*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a36*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a36*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a36*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a36*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a36*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a36*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a36*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a36*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_831 = Coupling(name = 'GC_831', + value = '(ee**2*complex(0,1)*I25a63*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I26a63*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I36a63*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a63*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I25a63*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I36a63*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a63*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I33a63*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a63*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I33a63*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a63*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a63*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a63*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a63*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a63*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a63*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a63*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a63*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_832 = Coupling(name = 'GC_832', + value = '(ee**2*complex(0,1)*I25a66*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I26a66*vd*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I36a66*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I38a66*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I25a66*vd*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I36a66*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I38a66*sw**2*vd*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I33a66*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I35a66*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I33a66*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I35a66*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee**2*complex(0,1)*I25a66*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I26a66*vu*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*I25a66*vu*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I34a66*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I34a66*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I37a66*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I37a66*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_833 = Coupling(name = 'GC_833', + value = '(ee**2*complex(0,1)*I51a33*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a33*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a33*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a33*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a33*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a33*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a33*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a33*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a33*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a33*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a33*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a33*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a33*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a33*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I76a33*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I76a33*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a33*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a33*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_834 = Coupling(name = 'GC_834', + value = '(ee**2*complex(0,1)*I51a36*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a36*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a36*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a36*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a36*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a36*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a36*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a36*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a36*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a36*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a36*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a36*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a36*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a36*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I76a36*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I76a36*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a36*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a36*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_835 = Coupling(name = 'GC_835', + value = '(ee**2*complex(0,1)*I51a63*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a63*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a63*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a63*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a63*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a63*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a63*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a63*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a63*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a63*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a63*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a63*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a63*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a63*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I76a63*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I76a63*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a63*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a63*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_836 = Coupling(name = 'GC_836', + value = '(ee**2*complex(0,1)*I51a66*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a66*vu*cmath.cos(alp))/(3.*(-1 + sw)*(1 + sw)) + (complex(0,1)*I80a66*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I81a66*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a66*vu*cmath.cos(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (complex(0,1)*I80a66*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (complex(0,1)*I81a66*sw**2*vu*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (complex(0,1)*I77a66*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I78a66*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I77a66*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I78a66*sw**2*cmath.cos(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee**2*complex(0,1)*I51a66*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I52a66*vd*cmath.sin(alp))/(3.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*I51a66*vd*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (complex(0,1)*I76a66*MUH*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I76a66*MUH*sw**2*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (complex(0,1)*I79a66*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (complex(0,1)*I79a66*sw**2*complexconjugate(MUH)*cmath.sin(alp))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_837 = Coupling(name = 'GC_837', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN1x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN1x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_838 = Coupling(name = 'GC_838', + value = '-((cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN1x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN1x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_839 = Coupling(name = 'GC_839', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN2x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN2x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN2x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN2x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_840 = Coupling(name = 'GC_840', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN2x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN2x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_841 = Coupling(name = 'GC_841', + value = '-(cw*ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN2x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN2x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN2x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN2x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_842 = Coupling(name = 'GC_842', + value = '-((cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN2x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN2x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_843 = Coupling(name = 'GC_843', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN3x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN3x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN3x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN3x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_844 = Coupling(name = 'GC_844', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN3x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN3x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN3x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN3x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_845 = Coupling(name = 'GC_845', + value = '(cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN3x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN3x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_846 = Coupling(name = 'GC_846', + value = '-(cw*ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN3x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN3x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN3x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN3x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_847 = Coupling(name = 'GC_847', + value = '-(cw*ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN3x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN3x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN3x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN3x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_848 = Coupling(name = 'GC_848', + value = '-((cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN3x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN3x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_849 = Coupling(name = 'GC_849', + value = '(cw*ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN4x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN4x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_850 = Coupling(name = 'GC_850', + value = '(cw*ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN4x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN4x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_851 = Coupling(name = 'GC_851', + value = '(cw*ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(NN4x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(NN4x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_852 = Coupling(name = 'GC_852', + value = '(cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(NN4x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(NN4x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_853 = Coupling(name = 'GC_853', + value = '-(cw*ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN4x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN4x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_854 = Coupling(name = 'GC_854', + value = '-(cw*ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN4x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN4x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_855 = Coupling(name = 'GC_855', + value = '-(cw*ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(NN4x1)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.cos(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(NN4x1)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_856 = Coupling(name = 'GC_856', + value = '-((cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(NN4x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw))) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.cos(alp))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.cos(alp))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(NN4x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw)) - (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.sin(alp))/((-1 + sw)*sw*(1 + sw)) + (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.sin(alp))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_857 = Coupling(name = 'GC_857', + value = '-((ee*complex(0,1)*complexconjugate(UU1x1)*complexconjugate(VV1x2)*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*complexconjugate(UU1x2)*complexconjugate(VV1x1)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_858 = Coupling(name = 'GC_858', + value = '-((ee*complex(0,1)*complexconjugate(UU2x1)*complexconjugate(VV1x2)*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*complexconjugate(UU2x2)*complexconjugate(VV1x1)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_859 = Coupling(name = 'GC_859', + value = '-((ee*complex(0,1)*complexconjugate(UU1x2)*complexconjugate(VV1x1)*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*complexconjugate(UU1x1)*complexconjugate(VV1x2)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_860 = Coupling(name = 'GC_860', + value = '-((ee*complex(0,1)*complexconjugate(UU2x2)*complexconjugate(VV1x1)*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*complexconjugate(UU2x1)*complexconjugate(VV1x2)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_861 = Coupling(name = 'GC_861', + value = '-((ee*complex(0,1)*complexconjugate(UU1x1)*complexconjugate(VV2x2)*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*complexconjugate(UU1x2)*complexconjugate(VV2x1)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_862 = Coupling(name = 'GC_862', + value = '-((ee*complex(0,1)*complexconjugate(UU2x1)*complexconjugate(VV2x2)*cmath.cos(alp))/(sw*cmath.sqrt(2))) + (ee*complex(0,1)*complexconjugate(UU2x2)*complexconjugate(VV2x1)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_863 = Coupling(name = 'GC_863', + value = '-((ee*complex(0,1)*complexconjugate(UU1x2)*complexconjugate(VV2x1)*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*complexconjugate(UU1x1)*complexconjugate(VV2x2)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_864 = Coupling(name = 'GC_864', + value = '-((ee*complex(0,1)*complexconjugate(UU2x2)*complexconjugate(VV2x1)*cmath.cos(alp))/(sw*cmath.sqrt(2))) - (ee*complex(0,1)*complexconjugate(UU2x1)*complexconjugate(VV2x2)*cmath.sin(alp))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_865 = Coupling(name = 'GC_865', + value = '(ee**2*complex(0,1)*cmath.cos(alp)**2)/(2.*sw**2) + (ee**2*complex(0,1)*cmath.sin(alp)**2)/(2.*sw**2)', + order = {'QED':2}) + +GC_866 = Coupling(name = 'GC_866', + value = '-(ee**2*complex(0,1)*cmath.cos(alp)**2)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*cmath.sin(alp)**2)/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':2}) + +GC_867 = Coupling(name = 'GC_867', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (5*ee**2*complex(0,1)*vd*cmath.cos(alp)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (5*ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(alp)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.sin(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_868 = Coupling(name = 'GC_868', + value = '(3*ee**2*complex(0,1)*vu*cmath.cos(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (3*ee**2*complex(0,1)*vd*cmath.cos(alp)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (3*ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(alp)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (3*ee**2*complex(0,1)*vd*cmath.sin(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_869 = Coupling(name = 'GC_869', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (5*ee**2*complex(0,1)*vu*cmath.cos(alp)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (5*ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(alp)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.sin(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_870 = Coupling(name = 'GC_870', + value = '(3*ee**2*complex(0,1)*vd*cmath.cos(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (3*ee**2*complex(0,1)*vu*cmath.cos(alp)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (3*ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(alp)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (3*ee**2*complex(0,1)*vu*cmath.sin(alp)**3)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_871 = Coupling(name = 'GC_871', + value = 'complex(0,1)*I1a33*cmath.sin(beta)', + order = {'QED':1}) + +GC_872 = Coupling(name = 'GC_872', + value = 'complex(0,1)*I2a33*cmath.sin(beta)', + order = {'QED':1}) + +GC_873 = Coupling(name = 'GC_873', + value = 'complex(0,1)*I3a33*cmath.sin(beta)', + order = {'QED':1}) + +GC_874 = Coupling(name = 'GC_874', + value = 'complex(0,1)*I4a33*cmath.sin(beta)', + order = {'QED':1}) + +GC_875 = Coupling(name = 'GC_875', + value = 'complex(0,1)*I5a33*cmath.sin(beta)', + order = {'QED':1}) + +GC_876 = Coupling(name = 'GC_876', + value = 'complex(0,1)*I99a33*cmath.sin(beta)', + order = {'QED':1}) + +GC_877 = Coupling(name = 'GC_877', + value = '(yd3x3*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_878 = Coupling(name = 'GC_878', + value = '(ye3x3*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_879 = Coupling(name = 'GC_879', + value = '(yu3x3*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_880 = Coupling(name = 'GC_880', + value = '-((complexconjugate(yd3x3)*cmath.sin(beta))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_881 = Coupling(name = 'GC_881', + value = '-((complexconjugate(ye3x3)*cmath.sin(beta))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_882 = Coupling(name = 'GC_882', + value = '-((complexconjugate(yu3x3)*cmath.sin(beta))/cmath.sqrt(2))', + order = {'QED':1}) + +GC_883 = Coupling(name = 'GC_883', + value = '-((I18a33*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I21a33*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I17a33*cmath.sin(beta))/cmath.sqrt(2) + (I19a33*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_884 = Coupling(name = 'GC_884', + value = '-((I18a36*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I21a36*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I17a36*cmath.sin(beta))/cmath.sqrt(2) + (I19a36*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_885 = Coupling(name = 'GC_885', + value = '-((I18a63*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I21a63*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I17a63*cmath.sin(beta))/cmath.sqrt(2) + (I19a63*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_886 = Coupling(name = 'GC_886', + value = '-((I18a66*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I21a66*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I17a66*cmath.sin(beta))/cmath.sqrt(2) + (I19a66*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_887 = Coupling(name = 'GC_887', + value = '-((I34a33*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I37a33*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I33a33*cmath.sin(beta))/cmath.sqrt(2) + (I35a33*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_888 = Coupling(name = 'GC_888', + value = '-((I34a36*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I37a36*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I33a36*cmath.sin(beta))/cmath.sqrt(2) + (I35a36*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_889 = Coupling(name = 'GC_889', + value = '-((I34a63*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I37a63*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I33a63*cmath.sin(beta))/cmath.sqrt(2) + (I35a63*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_890 = Coupling(name = 'GC_890', + value = '-((I34a66*MUH*cmath.cos(beta))/cmath.sqrt(2)) + (I37a66*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I33a66*cmath.sin(beta))/cmath.sqrt(2) + (I35a66*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_891 = Coupling(name = 'GC_891', + value = '(I76a33*MUH*cmath.cos(beta))/cmath.sqrt(2) - (I79a33*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I77a33*cmath.sin(beta))/cmath.sqrt(2) + (I78a33*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_892 = Coupling(name = 'GC_892', + value = '(I76a36*MUH*cmath.cos(beta))/cmath.sqrt(2) - (I79a36*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I77a36*cmath.sin(beta))/cmath.sqrt(2) + (I78a36*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_893 = Coupling(name = 'GC_893', + value = '(I76a63*MUH*cmath.cos(beta))/cmath.sqrt(2) - (I79a63*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I77a63*cmath.sin(beta))/cmath.sqrt(2) + (I78a63*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_894 = Coupling(name = 'GC_894', + value = '(I76a66*MUH*cmath.cos(beta))/cmath.sqrt(2) - (I79a66*complexconjugate(MUH)*cmath.cos(beta))/cmath.sqrt(2) - (I77a66*cmath.sin(beta))/cmath.sqrt(2) + (I78a66*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_895 = Coupling(name = 'GC_895', + value = '-((cw*ee*NN1x1*NN1x4*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN1x2*NN1x4*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN1x2*NN1x4*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*NN1x1*NN1x3*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*NN1x2*NN1x3*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN1x3*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_896 = Coupling(name = 'GC_896', + value = '-((cw*ee*NN1x1*NN1x3*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN1x2*NN1x3*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN1x2*NN1x3*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN1x4*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*NN1x2*NN1x4*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN1x2*NN1x4*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_897 = Coupling(name = 'GC_897', + value = '-(cw*ee*NN1x4*NN2x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN2x4*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x4*NN2x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN2x4*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x4*NN2x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN2x4*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN1x3*NN2x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN1x1*NN2x3*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x3*NN2x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x2*NN2x3*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x3*NN2x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x2*NN2x3*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_898 = Coupling(name = 'GC_898', + value = '-((cw*ee*NN2x1*NN2x4*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN2x2*NN2x4*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN2x2*NN2x4*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*NN2x1*NN2x3*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*NN2x2*NN2x3*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN2x3*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_899 = Coupling(name = 'GC_899', + value = '-(cw*ee*NN1x3*NN2x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN2x3*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x3*NN2x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN2x3*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x3*NN2x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN2x3*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x4*NN2x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN2x4*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x4*NN2x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN2x4*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x4*NN2x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN2x4*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_900 = Coupling(name = 'GC_900', + value = '-((cw*ee*NN2x1*NN2x3*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN2x2*NN2x3*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN2x2*NN2x3*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN2x4*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*NN2x2*NN2x4*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN2x2*NN2x4*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_901 = Coupling(name = 'GC_901', + value = '-(cw*ee*NN1x4*NN3x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN3x4*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x4*NN3x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN3x4*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x4*NN3x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN3x4*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN1x3*NN3x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN1x1*NN3x3*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x3*NN3x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x2*NN3x3*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x3*NN3x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x2*NN3x3*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_902 = Coupling(name = 'GC_902', + value = '-(cw*ee*NN2x4*NN3x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN3x4*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x4*NN3x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN3x4*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x4*NN3x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x2*NN3x4*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN2x3*NN3x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN2x1*NN3x3*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x3*NN3x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x2*NN3x3*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x3*NN3x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x2*NN3x3*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_903 = Coupling(name = 'GC_903', + value = '-((cw*ee*NN3x1*NN3x4*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN3x2*NN3x4*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN3x2*NN3x4*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*NN3x1*NN3x3*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*NN3x2*NN3x3*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*NN3x2*NN3x3*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_904 = Coupling(name = 'GC_904', + value = '-(cw*ee*NN1x3*NN3x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN3x3*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x3*NN3x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN3x3*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x3*NN3x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN3x3*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x4*NN3x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN3x4*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x4*NN3x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN3x4*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x4*NN3x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN3x4*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_905 = Coupling(name = 'GC_905', + value = '-(cw*ee*NN2x3*NN3x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN3x3*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x3*NN3x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN3x3*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x3*NN3x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x2*NN3x3*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x4*NN3x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN3x4*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x4*NN3x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN3x4*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x4*NN3x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x2*NN3x4*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_906 = Coupling(name = 'GC_906', + value = '-((cw*ee*NN3x1*NN3x3*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN3x2*NN3x3*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN3x2*NN3x3*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*NN3x1*NN3x4*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*NN3x2*NN3x4*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN3x2*NN3x4*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_907 = Coupling(name = 'GC_907', + value = '-(cw*ee*NN1x4*NN4x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN4x4*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x4*NN4x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN4x4*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x4*NN4x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN4x4*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN1x3*NN4x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN1x1*NN4x3*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x3*NN4x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x2*NN4x3*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x3*NN4x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x2*NN4x3*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_908 = Coupling(name = 'GC_908', + value = '-(cw*ee*NN2x4*NN4x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN4x4*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x4*NN4x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN4x4*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x4*NN4x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x2*NN4x4*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN2x3*NN4x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN2x1*NN4x3*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x3*NN4x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x2*NN4x3*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x3*NN4x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x2*NN4x3*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_909 = Coupling(name = 'GC_909', + value = '-(cw*ee*NN3x4*NN4x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN3x1*NN4x4*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN3x4*NN4x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN3x2*NN4x4*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN3x4*NN4x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN3x2*NN4x4*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN3x3*NN4x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*NN3x1*NN4x3*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN3x3*NN4x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN3x2*NN4x3*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN3x3*NN4x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN3x2*NN4x3*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_910 = Coupling(name = 'GC_910', + value = '-((cw*ee*NN4x1*NN4x4*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN4x2*NN4x4*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN4x2*NN4x4*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*NN4x1*NN4x3*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*NN4x2*NN4x3*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*NN4x2*NN4x3*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_911 = Coupling(name = 'GC_911', + value = '-(cw*ee*NN1x3*NN4x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN4x3*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x3*NN4x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN4x3*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x3*NN4x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN4x3*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x4*NN4x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN1x1*NN4x4*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN1x4*NN4x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN1x2*NN4x4*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN1x4*NN4x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN1x2*NN4x4*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_912 = Coupling(name = 'GC_912', + value = '-(cw*ee*NN2x3*NN4x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN4x3*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x3*NN4x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN4x3*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x3*NN4x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x2*NN4x3*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x4*NN4x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN2x1*NN4x4*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN2x4*NN4x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN2x2*NN4x4*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN2x4*NN4x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN2x2*NN4x4*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_913 = Coupling(name = 'GC_913', + value = '-(cw*ee*NN3x3*NN4x1*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN3x1*NN4x3*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN3x3*NN4x2*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN3x2*NN4x3*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN3x3*NN4x2*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN3x2*NN4x3*sw*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN3x4*NN4x1*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*NN3x1*NN4x4*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*NN3x4*NN4x2*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*NN3x2*NN4x4*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*NN3x4*NN4x2*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*NN3x2*NN4x4*sw*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_914 = Coupling(name = 'GC_914', + value = '-((cw*ee*NN4x1*NN4x3*cmath.cos(beta))/((-1 + sw)*(1 + sw))) + (ee*NN4x2*NN4x3*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN4x2*NN4x3*sw*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*NN4x1*NN4x4*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*NN4x2*NN4x4*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*NN4x2*NN4x4*sw*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_915 = Coupling(name = 'GC_915', + value = '(ee*complex(0,1)*NN1x3*UU1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x3*sw*UU1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*UU1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_916 = Coupling(name = 'GC_916', + value = '(ee*complex(0,1)*NN2x3*UU1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x3*sw*UU1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN2x1*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*UU1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_917 = Coupling(name = 'GC_917', + value = '(ee*complex(0,1)*NN3x3*UU1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x3*sw*UU1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN3x1*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*UU1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_918 = Coupling(name = 'GC_918', + value = '(ee*complex(0,1)*NN4x3*UU1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x3*sw*UU1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN4x1*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*UU1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*UU1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_919 = Coupling(name = 'GC_919', + value = '(ee*complex(0,1)*NN1x3*UU2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x3*sw*UU2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN1x1*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*UU2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*sw*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_920 = Coupling(name = 'GC_920', + value = '(ee*complex(0,1)*NN2x3*UU2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x3*sw*UU2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN2x1*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*UU2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*sw*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_921 = Coupling(name = 'GC_921', + value = '(ee*complex(0,1)*NN3x3*UU2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x3*sw*UU2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN3x1*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*UU2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*sw*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_922 = Coupling(name = 'GC_922', + value = '(ee*complex(0,1)*NN4x3*UU2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x3*sw*UU2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*NN4x1*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*UU2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*sw*UU2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_923 = Coupling(name = 'GC_923', + value = '(ee**2*vu*cmath.cos(beta))/(4.*sw**2) - (ee**2*vd*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_924 = Coupling(name = 'GC_924', + value = '-(ee**2*vu*cmath.cos(beta))/(4.*sw**2) + (ee**2*vd*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_925 = Coupling(name = 'GC_925', + value = '(ee**2*complex(0,1)*vu*cmath.cos(beta))/(4.*cw) + (cw*ee**2*complex(0,1)*vu*cmath.cos(beta))/(4.*sw**2) - (ee**2*complex(0,1)*vd*cmath.sin(beta))/(4.*cw) - (cw*ee**2*complex(0,1)*vd*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_926 = Coupling(name = 'GC_926', + value = '(ee**2*complex(0,1)*vu*cmath.cos(beta))/(4.*cw) - (cw*ee**2*complex(0,1)*vu*cmath.cos(beta))/(4.*sw**2) - (ee**2*complex(0,1)*vd*cmath.sin(beta))/(4.*cw) + (cw*ee**2*complex(0,1)*vd*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_927 = Coupling(name = 'GC_927', + value = '-(ee**2*complex(0,1)*I39a11*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I39a11*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_928 = Coupling(name = 'GC_928', + value = '-(ee**2*complex(0,1)*I39a22*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I39a22*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_929 = Coupling(name = 'GC_929', + value = 'complex(0,1)*I42a33*complexconjugate(MUH)*cmath.cos(beta) - (ee**2*complex(0,1)*I39a33*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I40a33*cmath.sin(beta) + (complex(0,1)*I41a33*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I39a33*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_930 = Coupling(name = 'GC_930', + value = 'complex(0,1)*I42a36*complexconjugate(MUH)*cmath.cos(beta) - (ee**2*complex(0,1)*I39a36*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I40a36*cmath.sin(beta) + (complex(0,1)*I41a36*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I39a36*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_931 = Coupling(name = 'GC_931', + value = '-(ee**2*complex(0,1)*I45a11*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I45a11*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_932 = Coupling(name = 'GC_932', + value = '-(ee**2*complex(0,1)*I45a22*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I45a22*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_933 = Coupling(name = 'GC_933', + value = 'complex(0,1)*I47a33*MUH*cmath.cos(beta) - (ee**2*complex(0,1)*I45a33*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I46a33*cmath.sin(beta) + (complex(0,1)*I48a33*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I45a33*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_934 = Coupling(name = 'GC_934', + value = 'complex(0,1)*I47a36*MUH*cmath.cos(beta) - (ee**2*complex(0,1)*I45a36*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I46a36*cmath.sin(beta) + (complex(0,1)*I48a36*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I45a36*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_935 = Coupling(name = 'GC_935', + value = '-(ee**2*complex(0,1)*I53a11*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I53a11*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_936 = Coupling(name = 'GC_936', + value = '-(ee**2*complex(0,1)*I53a22*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I53a22*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_937 = Coupling(name = 'GC_937', + value = '-(ee**2*complex(0,1)*I66a11*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I66a11*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_938 = Coupling(name = 'GC_938', + value = '-(ee**2*complex(0,1)*I66a22*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I66a22*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_939 = Coupling(name = 'GC_939', + value = '(ee**2*complex(0,1)*vu*cmath.cos(beta))/(2.*sw) - (ee**2*complex(0,1)*vd*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_940 = Coupling(name = 'GC_940', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(beta))/(2.*sw) + (ee**2*complex(0,1)*vd*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_941 = Coupling(name = 'GC_941', + value = '(cw*ee**2*complex(0,1)*vu*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee**2*complex(0,1)*vd*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_942 = Coupling(name = 'GC_942', + value = 'complex(0,1)*I55a33*cmath.cos(beta) + complex(0,1)*I58a33*complexconjugate(MUH)*cmath.cos(beta) + (complex(0,1)*I59a33*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I60a33*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a33*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I56a33*cmath.sin(beta) + complex(0,1)*I54a33*MUH*cmath.sin(beta) + (complex(0,1)*I57a33*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a33*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I59a33*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_943 = Coupling(name = 'GC_943', + value = 'complex(0,1)*I55a36*cmath.cos(beta) + complex(0,1)*I58a36*complexconjugate(MUH)*cmath.cos(beta) + (complex(0,1)*I59a36*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I60a36*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a36*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I56a36*cmath.sin(beta) + complex(0,1)*I54a36*MUH*cmath.sin(beta) + (complex(0,1)*I57a36*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a36*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I59a36*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_944 = Coupling(name = 'GC_944', + value = 'complex(0,1)*I55a63*cmath.cos(beta) + complex(0,1)*I58a63*complexconjugate(MUH)*cmath.cos(beta) + (complex(0,1)*I59a63*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I60a63*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a63*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I56a63*cmath.sin(beta) + complex(0,1)*I54a63*MUH*cmath.sin(beta) + (complex(0,1)*I57a63*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a63*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I59a63*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_945 = Coupling(name = 'GC_945', + value = 'complex(0,1)*I55a66*cmath.cos(beta) + complex(0,1)*I58a66*complexconjugate(MUH)*cmath.cos(beta) + (complex(0,1)*I59a66*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I60a66*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a66*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I56a66*cmath.sin(beta) + complex(0,1)*I54a66*MUH*cmath.sin(beta) + (complex(0,1)*I57a66*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a66*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I59a66*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_946 = Coupling(name = 'GC_946', + value = '-(ee**2*vd*cmath.cos(beta))/(4.*sw**2) - (ee**2*vu*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_947 = Coupling(name = 'GC_947', + value = '(ee**2*vd*cmath.cos(beta))/(4.*sw**2) + (ee**2*vu*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_948 = Coupling(name = 'GC_948', + value = '(ee**2*complex(0,1)*vd*cmath.cos(beta))/(4.*cw) - (cw*ee**2*complex(0,1)*vd*cmath.cos(beta))/(4.*sw**2) + (ee**2*complex(0,1)*vu*cmath.sin(beta))/(4.*cw) - (cw*ee**2*complex(0,1)*vu*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_949 = Coupling(name = 'GC_949', + value = '(ee**2*complex(0,1)*vd*cmath.cos(beta))/(4.*cw) + (cw*ee**2*complex(0,1)*vd*cmath.cos(beta))/(4.*sw**2) + (ee**2*complex(0,1)*vu*cmath.sin(beta))/(4.*cw) + (cw*ee**2*complex(0,1)*vu*cmath.sin(beta))/(4.*sw**2)', + order = {'QED':1}) + +GC_950 = Coupling(name = 'GC_950', + value = '(ee**2*complex(0,1)*I39a11*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I39a11*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_951 = Coupling(name = 'GC_951', + value = '(ee**2*complex(0,1)*I39a22*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I39a22*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_952 = Coupling(name = 'GC_952', + value = '(ee**2*complex(0,1)*I45a11*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I45a11*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_953 = Coupling(name = 'GC_953', + value = '(ee**2*complex(0,1)*I45a22*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I45a22*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_954 = Coupling(name = 'GC_954', + value = '-(complex(0,1)*I46a33*cmath.cos(beta)) - (complex(0,1)*I48a33*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I45a33*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I47a33*MUH*cmath.sin(beta) - (ee**2*complex(0,1)*I45a33*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_955 = Coupling(name = 'GC_955', + value = '-(complex(0,1)*I46a36*cmath.cos(beta)) - (complex(0,1)*I48a36*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I45a36*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I47a36*MUH*cmath.sin(beta) - (ee**2*complex(0,1)*I45a36*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_956 = Coupling(name = 'GC_956', + value = '(ee**2*complex(0,1)*I53a11*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I53a11*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_957 = Coupling(name = 'GC_957', + value = '(ee**2*complex(0,1)*I53a22*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I53a22*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_958 = Coupling(name = 'GC_958', + value = '(ee**2*complex(0,1)*I66a11*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I66a11*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_959 = Coupling(name = 'GC_959', + value = '(ee**2*complex(0,1)*I66a22*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (ee**2*complex(0,1)*I66a22*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_960 = Coupling(name = 'GC_960', + value = '-(complex(0,1)*I67a33*cmath.cos(beta)) - complex(0,1)*I71a33*complexconjugate(MUH)*cmath.cos(beta) - (complex(0,1)*I70a33*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I66a33*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I73a33*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I69a33*cmath.sin(beta) + complex(0,1)*I68a33*MUH*cmath.sin(beta) + (complex(0,1)*I73a33*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I72a33*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a33*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_961 = Coupling(name = 'GC_961', + value = '-(complex(0,1)*I67a36*cmath.cos(beta)) - complex(0,1)*I71a36*complexconjugate(MUH)*cmath.cos(beta) - (complex(0,1)*I70a36*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I66a36*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I73a36*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I69a36*cmath.sin(beta) + complex(0,1)*I68a36*MUH*cmath.sin(beta) + (complex(0,1)*I73a36*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I72a36*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a36*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_962 = Coupling(name = 'GC_962', + value = '-(complex(0,1)*I67a63*cmath.cos(beta)) - complex(0,1)*I71a63*complexconjugate(MUH)*cmath.cos(beta) - (complex(0,1)*I70a63*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I66a63*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I73a63*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I69a63*cmath.sin(beta) + complex(0,1)*I68a63*MUH*cmath.sin(beta) + (complex(0,1)*I73a63*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I72a63*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a63*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_963 = Coupling(name = 'GC_963', + value = '-(complex(0,1)*I67a66*cmath.cos(beta)) - complex(0,1)*I71a66*complexconjugate(MUH)*cmath.cos(beta) - (complex(0,1)*I70a66*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I66a66*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I73a66*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I69a66*cmath.sin(beta) + complex(0,1)*I68a66*MUH*cmath.sin(beta) + (complex(0,1)*I73a66*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I72a66*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a66*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_964 = Coupling(name = 'GC_964', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(beta))/(2.*sw) - (ee**2*complex(0,1)*vu*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_965 = Coupling(name = 'GC_965', + value = '(ee**2*complex(0,1)*vd*cmath.cos(beta))/(2.*sw) + (ee**2*complex(0,1)*vu*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_966 = Coupling(name = 'GC_966', + value = '(cw*ee**2*complex(0,1)*vd*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee**2*complex(0,1)*vu*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_967 = Coupling(name = 'GC_967', + value = '(ee*UU1x1*VV1x2*cmath.cos(beta))/(sw*cmath.sqrt(2)) + (ee*UU1x2*VV1x1*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_968 = Coupling(name = 'GC_968', + value = '(ee*UU2x1*VV1x2*cmath.cos(beta))/(sw*cmath.sqrt(2)) + (ee*UU2x2*VV1x1*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_969 = Coupling(name = 'GC_969', + value = '(ee*complex(0,1)*NN1x4*VV1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x4*sw*VV1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*VV1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_970 = Coupling(name = 'GC_970', + value = '(ee*complex(0,1)*NN2x4*VV1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x4*sw*VV1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*VV1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_971 = Coupling(name = 'GC_971', + value = '(ee*complex(0,1)*NN3x4*VV1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x4*sw*VV1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*VV1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_972 = Coupling(name = 'GC_972', + value = '(ee*complex(0,1)*NN4x4*VV1x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x4*sw*VV1x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*VV1x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*VV1x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_973 = Coupling(name = 'GC_973', + value = '-((ee*UU1x2*VV1x1*cmath.cos(beta))/(sw*cmath.sqrt(2))) + (ee*UU1x1*VV1x2*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_974 = Coupling(name = 'GC_974', + value = '-((ee*UU2x2*VV1x1*cmath.cos(beta))/(sw*cmath.sqrt(2))) + (ee*UU2x1*VV1x2*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_975 = Coupling(name = 'GC_975', + value = '(ee*UU1x1*VV2x2*cmath.cos(beta))/(sw*cmath.sqrt(2)) + (ee*UU1x2*VV2x1*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_976 = Coupling(name = 'GC_976', + value = '(ee*UU2x1*VV2x2*cmath.cos(beta))/(sw*cmath.sqrt(2)) + (ee*UU2x2*VV2x1*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_977 = Coupling(name = 'GC_977', + value = '(ee*complex(0,1)*NN1x4*VV2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN1x4*sw*VV2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN1x1*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN1x2*VV2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN1x2*sw*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_978 = Coupling(name = 'GC_978', + value = '(ee*complex(0,1)*NN2x4*VV2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN2x4*sw*VV2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN2x1*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN2x2*VV2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN2x2*sw*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_979 = Coupling(name = 'GC_979', + value = '(ee*complex(0,1)*NN3x4*VV2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN3x4*sw*VV2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN3x1*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN3x2*VV2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN3x2*sw*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_980 = Coupling(name = 'GC_980', + value = '(ee*complex(0,1)*NN4x4*VV2x1*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*NN4x4*sw*VV2x1*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*NN4x1*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*NN4x2*VV2x2*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*NN4x2*sw*VV2x2*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_981 = Coupling(name = 'GC_981', + value = '-((ee*UU1x2*VV2x1*cmath.cos(beta))/(sw*cmath.sqrt(2))) + (ee*UU1x1*VV2x2*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_982 = Coupling(name = 'GC_982', + value = '-((ee*UU2x2*VV2x1*cmath.cos(beta))/(sw*cmath.sqrt(2))) + (ee*UU2x1*VV2x2*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_983 = Coupling(name = 'GC_983', + value = '(I17a33*cmath.cos(beta))/cmath.sqrt(2) - (I19a33*cmath.cos(beta))/cmath.sqrt(2) - (I18a33*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I21a33*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_984 = Coupling(name = 'GC_984', + value = '(I17a36*cmath.cos(beta))/cmath.sqrt(2) - (I19a36*cmath.cos(beta))/cmath.sqrt(2) - (I18a36*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I21a36*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_985 = Coupling(name = 'GC_985', + value = '(I17a63*cmath.cos(beta))/cmath.sqrt(2) - (I19a63*cmath.cos(beta))/cmath.sqrt(2) - (I18a63*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I21a63*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_986 = Coupling(name = 'GC_986', + value = '(I17a66*cmath.cos(beta))/cmath.sqrt(2) - (I19a66*cmath.cos(beta))/cmath.sqrt(2) - (I18a66*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I21a66*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_987 = Coupling(name = 'GC_987', + value = '(I33a33*cmath.cos(beta))/cmath.sqrt(2) - (I35a33*cmath.cos(beta))/cmath.sqrt(2) - (I34a33*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I37a33*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_988 = Coupling(name = 'GC_988', + value = '(I33a36*cmath.cos(beta))/cmath.sqrt(2) - (I35a36*cmath.cos(beta))/cmath.sqrt(2) - (I34a36*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I37a36*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_989 = Coupling(name = 'GC_989', + value = '(I33a63*cmath.cos(beta))/cmath.sqrt(2) - (I35a63*cmath.cos(beta))/cmath.sqrt(2) - (I34a63*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I37a63*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_990 = Coupling(name = 'GC_990', + value = '(I33a66*cmath.cos(beta))/cmath.sqrt(2) - (I35a66*cmath.cos(beta))/cmath.sqrt(2) - (I34a66*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I37a66*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_991 = Coupling(name = 'GC_991', + value = '-(complex(0,1)*I40a33*cmath.cos(beta)) - (complex(0,1)*I41a33*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I39a33*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I42a33*complexconjugate(MUH)*cmath.sin(beta) - (ee**2*complex(0,1)*I39a33*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_992 = Coupling(name = 'GC_992', + value = '-(complex(0,1)*I40a36*cmath.cos(beta)) - (complex(0,1)*I41a36*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I39a36*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I42a36*complexconjugate(MUH)*cmath.sin(beta) - (ee**2*complex(0,1)*I39a36*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_993 = Coupling(name = 'GC_993', + value = '-(complex(0,1)*I56a33*cmath.cos(beta)) - complex(0,1)*I54a33*MUH*cmath.cos(beta) - (complex(0,1)*I57a33*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I53a33*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I59a33*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I55a33*cmath.sin(beta) + complex(0,1)*I58a33*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I59a33*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I60a33*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a33*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_994 = Coupling(name = 'GC_994', + value = '-(complex(0,1)*I56a36*cmath.cos(beta)) - complex(0,1)*I54a36*MUH*cmath.cos(beta) - (complex(0,1)*I57a36*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I53a36*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I59a36*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I55a36*cmath.sin(beta) + complex(0,1)*I58a36*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I59a36*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I60a36*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a36*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_995 = Coupling(name = 'GC_995', + value = '-(complex(0,1)*I56a63*cmath.cos(beta)) - complex(0,1)*I54a63*MUH*cmath.cos(beta) - (complex(0,1)*I57a63*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I53a63*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I59a63*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I55a63*cmath.sin(beta) + complex(0,1)*I58a63*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I59a63*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I60a63*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a63*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_996 = Coupling(name = 'GC_996', + value = '-(complex(0,1)*I56a66*cmath.cos(beta)) - complex(0,1)*I54a66*MUH*cmath.cos(beta) - (complex(0,1)*I57a66*vd*cmath.cos(beta))/cmath.sqrt(2) + (ee**2*complex(0,1)*I53a66*vd*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) - (complex(0,1)*I59a66*vu*cmath.cos(beta))/cmath.sqrt(2) + complex(0,1)*I55a66*cmath.sin(beta) + complex(0,1)*I58a66*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I59a66*vd*cmath.sin(beta))/cmath.sqrt(2) + (complex(0,1)*I60a66*vu*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I53a66*vu*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2))', + order = {'QED':1}) + +GC_997 = Coupling(name = 'GC_997', + value = 'complex(0,1)*I69a33*cmath.cos(beta) + complex(0,1)*I68a33*MUH*cmath.cos(beta) + (complex(0,1)*I73a33*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I72a33*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a33*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I67a33*cmath.sin(beta) + complex(0,1)*I71a33*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I70a33*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a33*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I73a33*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_998 = Coupling(name = 'GC_998', + value = 'complex(0,1)*I69a36*cmath.cos(beta) + complex(0,1)*I68a36*MUH*cmath.cos(beta) + (complex(0,1)*I73a36*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I72a36*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a36*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I67a36*cmath.sin(beta) + complex(0,1)*I71a36*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I70a36*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a36*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I73a36*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_999 = Coupling(name = 'GC_999', + value = 'complex(0,1)*I69a63*cmath.cos(beta) + complex(0,1)*I68a63*MUH*cmath.cos(beta) + (complex(0,1)*I73a63*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I72a63*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a63*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I67a63*cmath.sin(beta) + complex(0,1)*I71a63*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I70a63*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a63*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I73a63*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_1000 = Coupling(name = 'GC_1000', + value = 'complex(0,1)*I69a66*cmath.cos(beta) + complex(0,1)*I68a66*MUH*cmath.cos(beta) + (complex(0,1)*I73a66*vd*cmath.cos(beta))/cmath.sqrt(2) + (complex(0,1)*I72a66*vu*cmath.cos(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a66*vu*cmath.cos(beta))/(2.*sw**2*cmath.sqrt(2)) + complex(0,1)*I67a66*cmath.sin(beta) + complex(0,1)*I71a66*complexconjugate(MUH)*cmath.sin(beta) + (complex(0,1)*I70a66*vd*cmath.sin(beta))/cmath.sqrt(2) - (ee**2*complex(0,1)*I66a66*vd*cmath.sin(beta))/(2.*sw**2*cmath.sqrt(2)) + (complex(0,1)*I73a66*vu*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_1001 = Coupling(name = 'GC_1001', + value = '-((I77a33*cmath.cos(beta))/cmath.sqrt(2)) + (I78a33*cmath.cos(beta))/cmath.sqrt(2) - (I76a33*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I79a33*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_1002 = Coupling(name = 'GC_1002', + value = '-((I77a36*cmath.cos(beta))/cmath.sqrt(2)) + (I78a36*cmath.cos(beta))/cmath.sqrt(2) - (I76a36*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I79a36*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_1003 = Coupling(name = 'GC_1003', + value = '-((I77a63*cmath.cos(beta))/cmath.sqrt(2)) + (I78a63*cmath.cos(beta))/cmath.sqrt(2) - (I76a63*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I79a63*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_1004 = Coupling(name = 'GC_1004', + value = '-((I77a66*cmath.cos(beta))/cmath.sqrt(2)) + (I78a66*cmath.cos(beta))/cmath.sqrt(2) - (I76a66*MUH*cmath.sin(beta))/cmath.sqrt(2) + (I79a66*complexconjugate(MUH)*cmath.sin(beta))/cmath.sqrt(2)', + order = {'QED':1}) + +GC_1005 = Coupling(name = 'GC_1005', + value = '(cw*ee*complexconjugate(NN1x1)*complexconjugate(NN1x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN1x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1006 = Coupling(name = 'GC_1006', + value = '(cw*ee*complexconjugate(NN1x1)*complexconjugate(NN1x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN1x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN1x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN1x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1007 = Coupling(name = 'GC_1007', + value = '(cw*ee*complexconjugate(NN1x4)*complexconjugate(NN2x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN2x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x3)*complexconjugate(NN2x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN2x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1008 = Coupling(name = 'GC_1008', + value = '(cw*ee*complexconjugate(NN2x1)*complexconjugate(NN2x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN2x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1009 = Coupling(name = 'GC_1009', + value = '(cw*ee*complexconjugate(NN1x3)*complexconjugate(NN2x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x3)*complexconjugate(NN2x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN2x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN2x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x4)*complexconjugate(NN2x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x4)*complexconjugate(NN2x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN2x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN2x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1010 = Coupling(name = 'GC_1010', + value = '(cw*ee*complexconjugate(NN2x1)*complexconjugate(NN2x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN2x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN2x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN2x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1011 = Coupling(name = 'GC_1011', + value = '(cw*ee*complexconjugate(NN1x4)*complexconjugate(NN3x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN3x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x3)*complexconjugate(NN3x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN3x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1012 = Coupling(name = 'GC_1012', + value = '(cw*ee*complexconjugate(NN2x4)*complexconjugate(NN3x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN3x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN2x3)*complexconjugate(NN3x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN3x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1013 = Coupling(name = 'GC_1013', + value = '(cw*ee*complexconjugate(NN3x1)*complexconjugate(NN3x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN3x1)*complexconjugate(NN3x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1014 = Coupling(name = 'GC_1014', + value = '(cw*ee*complexconjugate(NN1x3)*complexconjugate(NN3x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x3)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN3x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN3x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x4)*complexconjugate(NN3x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x4)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN3x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN3x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1015 = Coupling(name = 'GC_1015', + value = '(cw*ee*complexconjugate(NN2x3)*complexconjugate(NN3x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x3)*complexconjugate(NN3x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN3x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN3x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x4)*complexconjugate(NN3x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x4)*complexconjugate(NN3x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN3x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN3x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1016 = Coupling(name = 'GC_1016', + value = '(cw*ee*complexconjugate(NN3x1)*complexconjugate(NN3x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN3x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN3x1)*complexconjugate(NN3x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN3x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1017 = Coupling(name = 'GC_1017', + value = '(cw*ee*complexconjugate(NN1x4)*complexconjugate(NN4x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x3)*complexconjugate(NN4x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1018 = Coupling(name = 'GC_1018', + value = '(cw*ee*complexconjugate(NN2x4)*complexconjugate(NN4x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN2x3)*complexconjugate(NN4x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1019 = Coupling(name = 'GC_1019', + value = '(cw*ee*complexconjugate(NN3x4)*complexconjugate(NN4x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN3x1)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN3x3)*complexconjugate(NN4x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN3x1)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1020 = Coupling(name = 'GC_1020', + value = '(cw*ee*complexconjugate(NN4x1)*complexconjugate(NN4x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complexconjugate(NN4x1)*complexconjugate(NN4x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (ee*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*sw*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1021 = Coupling(name = 'GC_1021', + value = '(cw*ee*complexconjugate(NN1x3)*complexconjugate(NN4x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x3)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x4)*complexconjugate(NN4x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x4)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN1x1)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN1x2)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1022 = Coupling(name = 'GC_1022', + value = '(cw*ee*complexconjugate(NN2x3)*complexconjugate(NN4x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x3)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x4)*complexconjugate(NN4x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x4)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN2x1)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN2x2)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1023 = Coupling(name = 'GC_1023', + value = '(cw*ee*complexconjugate(NN3x3)*complexconjugate(NN4x1)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x3)*complexconjugate(NN4x2)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN3x1)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN4x3)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN3x4)*complexconjugate(NN4x1)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x4)*complexconjugate(NN4x2)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN3x1)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN3x2)*complexconjugate(NN4x4)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1024 = Coupling(name = 'GC_1024', + value = '(cw*ee*complexconjugate(NN4x1)*complexconjugate(NN4x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.cos(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN4x2)*complexconjugate(NN4x3)*cmath.cos(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complexconjugate(NN4x1)*complexconjugate(NN4x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (ee*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) + (ee*sw*complexconjugate(NN4x2)*complexconjugate(NN4x4)*cmath.sin(beta))/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1025 = Coupling(name = 'GC_1025', + value = '(ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1026 = Coupling(name = 'GC_1026', + value = '(ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1027 = Coupling(name = 'GC_1027', + value = '(ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1028 = Coupling(name = 'GC_1028', + value = '(ee*complex(0,1)*complexconjugate(NN4x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x3)*complexconjugate(UU1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(UU1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1029 = Coupling(name = 'GC_1029', + value = '(ee*complex(0,1)*complexconjugate(NN1x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1030 = Coupling(name = 'GC_1030', + value = '(ee*complex(0,1)*complexconjugate(NN2x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1031 = Coupling(name = 'GC_1031', + value = '(ee*complex(0,1)*complexconjugate(NN3x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1032 = Coupling(name = 'GC_1032', + value = '(ee*complex(0,1)*complexconjugate(NN4x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x3)*complexconjugate(UU2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) - (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(UU2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1033 = Coupling(name = 'GC_1033', + value = '-((ee*complexconjugate(UU1x1)*complexconjugate(VV1x2)*cmath.cos(beta))/(sw*cmath.sqrt(2))) - (ee*complexconjugate(UU1x2)*complexconjugate(VV1x1)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1034 = Coupling(name = 'GC_1034', + value = '-((ee*complexconjugate(UU2x1)*complexconjugate(VV1x2)*cmath.cos(beta))/(sw*cmath.sqrt(2))) - (ee*complexconjugate(UU2x2)*complexconjugate(VV1x1)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1035 = Coupling(name = 'GC_1035', + value = '(ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1036 = Coupling(name = 'GC_1036', + value = '(ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1037 = Coupling(name = 'GC_1037', + value = '(ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1038 = Coupling(name = 'GC_1038', + value = '(ee*complex(0,1)*complexconjugate(NN4x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x4)*complexconjugate(VV1x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(VV1x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1039 = Coupling(name = 'GC_1039', + value = '(ee*complexconjugate(UU1x2)*complexconjugate(VV1x1)*cmath.cos(beta))/(sw*cmath.sqrt(2)) - (ee*complexconjugate(UU1x1)*complexconjugate(VV1x2)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1040 = Coupling(name = 'GC_1040', + value = '(ee*complexconjugate(UU2x2)*complexconjugate(VV1x1)*cmath.cos(beta))/(sw*cmath.sqrt(2)) - (ee*complexconjugate(UU2x1)*complexconjugate(VV1x2)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1041 = Coupling(name = 'GC_1041', + value = '-((ee*complexconjugate(UU1x1)*complexconjugate(VV2x2)*cmath.cos(beta))/(sw*cmath.sqrt(2))) - (ee*complexconjugate(UU1x2)*complexconjugate(VV2x1)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1042 = Coupling(name = 'GC_1042', + value = '-((ee*complexconjugate(UU2x1)*complexconjugate(VV2x2)*cmath.cos(beta))/(sw*cmath.sqrt(2))) - (ee*complexconjugate(UU2x2)*complexconjugate(VV2x1)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1043 = Coupling(name = 'GC_1043', + value = '(ee*complex(0,1)*complexconjugate(NN1x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN1x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN1x1)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN1x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN1x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1044 = Coupling(name = 'GC_1044', + value = '(ee*complex(0,1)*complexconjugate(NN2x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN2x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN2x1)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN2x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN2x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1045 = Coupling(name = 'GC_1045', + value = '(ee*complex(0,1)*complexconjugate(NN3x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN3x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN3x1)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN3x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN3x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1046 = Coupling(name = 'GC_1046', + value = '(ee*complex(0,1)*complexconjugate(NN4x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)) - (ee*complex(0,1)*sw*complexconjugate(NN4x4)*complexconjugate(VV2x1)*cmath.sin(beta))/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*complexconjugate(NN4x1)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2)) + (ee*complex(0,1)*complexconjugate(NN4x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*sw*(1 + sw)*cmath.sqrt(2)) - (ee*complex(0,1)*sw*complexconjugate(NN4x2)*complexconjugate(VV2x2)*cmath.sin(beta))/((-1 + sw)*(1 + sw)*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1047 = Coupling(name = 'GC_1047', + value = '(ee*complexconjugate(UU1x2)*complexconjugate(VV2x1)*cmath.cos(beta))/(sw*cmath.sqrt(2)) - (ee*complexconjugate(UU1x1)*complexconjugate(VV2x2)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1048 = Coupling(name = 'GC_1048', + value = '(ee*complexconjugate(UU2x2)*complexconjugate(VV2x1)*cmath.cos(beta))/(sw*cmath.sqrt(2)) - (ee*complexconjugate(UU2x1)*complexconjugate(VV2x2)*cmath.sin(beta))/(sw*cmath.sqrt(2))', + order = {'QED':1}) + +GC_1049 = Coupling(name = 'GC_1049', + value = '(ee*complex(0,1)*cmath.cos(beta)*cmath.sin(alp))/(2.*sw) - (ee*complex(0,1)*cmath.cos(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_1050 = Coupling(name = 'GC_1050', + value = '-(ee*complex(0,1)*cmath.cos(beta)*cmath.sin(alp))/(2.*sw) + (ee*complex(0,1)*cmath.cos(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_1051 = Coupling(name = 'GC_1051', + value = '(ee**2*complex(0,1)*cmath.cos(beta)*cmath.sin(alp))/(2.*sw) - (ee**2*complex(0,1)*cmath.cos(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':2}) + +GC_1052 = Coupling(name = 'GC_1052', + value = '-(ee**2*complex(0,1)*cmath.cos(beta)*cmath.sin(alp))/(2.*sw) + (ee**2*complex(0,1)*cmath.cos(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':2}) + +GC_1053 = Coupling(name = 'GC_1053', + value = '(cw*ee**2*complex(0,1)*cmath.cos(beta)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (cw*ee**2*complex(0,1)*cmath.cos(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1054 = Coupling(name = 'GC_1054', + value = '-(cw*ee**2*complex(0,1)*cmath.cos(beta)*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee**2*complex(0,1)*cmath.cos(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1055 = Coupling(name = 'GC_1055', + value = '(cw*ee*cmath.cos(beta)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*cmath.cos(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_1056 = Coupling(name = 'GC_1056', + value = '-(cw*ee*cmath.cos(beta)*cmath.sin(alp))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*cmath.cos(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_1057 = Coupling(name = 'GC_1057', + value = '-(ee*complex(0,1)*cmath.cos(alp)*cmath.cos(beta))/(2.*sw) - (ee*complex(0,1)*cmath.sin(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_1058 = Coupling(name = 'GC_1058', + value = '(ee*complex(0,1)*cmath.cos(alp)*cmath.cos(beta))/(2.*sw) + (ee*complex(0,1)*cmath.sin(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':1}) + +GC_1059 = Coupling(name = 'GC_1059', + value = '(ee**2*complex(0,1)*cmath.cos(alp)*cmath.cos(beta))/(2.*sw) + (ee**2*complex(0,1)*cmath.sin(alp)*cmath.sin(beta))/(2.*sw)', + order = {'QED':2}) + +GC_1060 = Coupling(name = 'GC_1060', + value = '(cw*ee**2*complex(0,1)*cmath.cos(alp)*cmath.cos(beta))/(2.*(-1 + sw)*(1 + sw)) + (cw*ee**2*complex(0,1)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1061 = Coupling(name = 'GC_1061', + value = '(cw*ee*cmath.cos(alp)*cmath.cos(beta))/(2.*(-1 + sw)*sw*(1 + sw)) + (cw*ee*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw*(1 + sw))', + order = {'QED':1}) + +GC_1062 = Coupling(name = 'GC_1062', + value = '(ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1063 = Coupling(name = 'GC_1063', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1064 = Coupling(name = 'GC_1064', + value = '-(ee*complex(0,1)*cmath.cos(beta)**2) - ee*complex(0,1)*cmath.sin(beta)**2', + order = {'QED':1}) + +GC_1065 = Coupling(name = 'GC_1065', + value = '2*ee**2*complex(0,1)*cmath.cos(beta)**2 + 2*ee**2*complex(0,1)*cmath.sin(beta)**2', + order = {'QED':2}) + +GC_1066 = Coupling(name = 'GC_1066', + value = '(ee**2*complex(0,1)*cmath.cos(beta)**2)/(2.*sw**2) + (ee**2*complex(0,1)*cmath.sin(beta)**2)/(2.*sw**2)', + order = {'QED':2}) + +GC_1067 = Coupling(name = 'GC_1067', + value = '(ee*cmath.cos(beta)**2)/(2.*sw) + (ee*cmath.sin(beta)**2)/(2.*sw)', + order = {'QED':1}) + +GC_1068 = Coupling(name = 'GC_1068', + value = '-(ee**2*cmath.cos(beta)**2)/(2.*sw) - (ee**2*cmath.sin(beta)**2)/(2.*sw)', + order = {'QED':2}) + +GC_1069 = Coupling(name = 'GC_1069', + value = '(ee**2*cmath.cos(beta)**2)/(2.*sw) + (ee**2*cmath.sin(beta)**2)/(2.*sw)', + order = {'QED':2}) + +GC_1070 = Coupling(name = 'GC_1070', + value = '-(cw*ee**2*cmath.cos(beta)**2)/(2.*(-1 + sw)*(1 + sw)) - (cw*ee**2*cmath.sin(beta)**2)/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1071 = Coupling(name = 'GC_1071', + value = '(cw*ee**2*cmath.cos(beta)**2)/(2.*(-1 + sw)*(1 + sw)) + (cw*ee**2*cmath.sin(beta)**2)/(2.*(-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1072 = Coupling(name = 'GC_1072', + value = '-(ee**2*complex(0,1)*cmath.cos(beta)**2)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*cmath.sin(beta)**2)/(2.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':2}) + +GC_1073 = Coupling(name = 'GC_1073', + value = '(cw*ee*complex(0,1)*cmath.cos(beta)**2)/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*sw*cmath.cos(beta)**2)/((-1 + sw)*(1 + sw)) + (cw*ee*complex(0,1)*cmath.sin(beta)**2)/(2.*(-1 + sw)*sw*(1 + sw)) - (cw*ee*complex(0,1)*sw*cmath.sin(beta)**2)/((-1 + sw)*(1 + sw))', + order = {'QED':1}) + +GC_1074 = Coupling(name = 'GC_1074', + value = '-((cw*ee**2*complex(0,1)*cmath.cos(beta)**2)/((-1 + sw)*sw*(1 + sw))) + (2*cw*ee**2*complex(0,1)*sw*cmath.cos(beta)**2)/((-1 + sw)*(1 + sw)) - (cw*ee**2*complex(0,1)*cmath.sin(beta)**2)/((-1 + sw)*sw*(1 + sw)) + (2*cw*ee**2*complex(0,1)*sw*cmath.sin(beta)**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1075 = Coupling(name = 'GC_1075', + value = '(2*ee**2*complex(0,1)*cmath.cos(beta)**2)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*cmath.cos(beta)**2)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*sw**2*cmath.cos(beta)**2)/((-1 + sw)*(1 + sw)) + (2*ee**2*complex(0,1)*cmath.sin(beta)**2)/((-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*cmath.sin(beta)**2)/(2.*(-1 + sw)*sw**2*(1 + sw)) - (2*ee**2*complex(0,1)*sw**2*cmath.sin(beta)**2)/((-1 + sw)*(1 + sw))', + order = {'QED':2}) + +GC_1076 = Coupling(name = 'GC_1076', + value = '(ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1077 = Coupling(name = 'GC_1077', + value = '(ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1078 = Coupling(name = 'GC_1078', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1079 = Coupling(name = 'GC_1079', + value = '-(ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1080 = Coupling(name = 'GC_1080', + value = '(ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1081 = Coupling(name = 'GC_1081', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1082 = Coupling(name = 'GC_1082', + value = '(ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1083 = Coupling(name = 'GC_1083', + value = '(ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1084 = Coupling(name = 'GC_1084', + value = '(ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1085 = Coupling(name = 'GC_1085', + value = '-(ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.cos(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(beta)**2*cmath.sin(alp))/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.cos(alp)*cmath.cos(beta)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vd*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(beta)*cmath.sin(alp)*cmath.sin(beta))/(2.*(-1 + sw)*sw**2*(1 + sw)) + (ee**2*complex(0,1)*vd*cmath.cos(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw)) - (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(2.*(-1 + sw)*(1 + sw)) + (ee**2*complex(0,1)*vu*cmath.sin(alp)*cmath.sin(beta)**2)/(4.*(-1 + sw)*sw**2*(1 + sw))', + order = {'QED':1}) + +GC_1086 = Coupling(name = 'GC_1086', + value = '(ee**2*vu*cmath.cos(beta)**3)/(4.*sw**2) - (ee**2*vd*cmath.cos(beta)**2*cmath.sin(beta))/(4.*sw**2) + (ee**2*vu*cmath.cos(beta)*cmath.sin(beta)**2)/(4.*sw**2) - (ee**2*vd*cmath.sin(beta)**3)/(4.*sw**2)', + order = {'QED':1}) + +GC_1087 = Coupling(name = 'GC_1087', + value = '-(ee**2*vu*cmath.cos(beta)**3)/(4.*sw**2) + (ee**2*vd*cmath.cos(beta)**2*cmath.sin(beta))/(4.*sw**2) - (ee**2*vu*cmath.cos(beta)*cmath.sin(beta)**2)/(4.*sw**2) + (ee**2*vd*cmath.sin(beta)**3)/(4.*sw**2)', + order = {'QED':1}) + +GC_1088 = Coupling(name = 'GC_1088', + value = '-(ee**2*vd*cmath.cos(beta)**3)/(4.*sw**2) - (ee**2*vu*cmath.cos(beta)**2*cmath.sin(beta))/(4.*sw**2) - (ee**2*vd*cmath.cos(beta)*cmath.sin(beta)**2)/(4.*sw**2) - (ee**2*vu*cmath.sin(beta)**3)/(4.*sw**2)', + order = {'QED':1}) + +GC_1089 = Coupling(name = 'GC_1089', + value = '(ee**2*vd*cmath.cos(beta)**3)/(4.*sw**2) + (ee**2*vu*cmath.cos(beta)**2*cmath.sin(beta))/(4.*sw**2) + (ee**2*vd*cmath.cos(beta)*cmath.sin(beta)**2)/(4.*sw**2) + (ee**2*vu*cmath.sin(beta)**3)/(4.*sw**2)', + order = {'QED':1}) + Index: trunk/omega/tests/UFO/MSSM/parameters.py =================================================================== --- trunk/omega/tests/UFO/MSSM/parameters.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/parameters.py (revision 8416) @@ -0,0 +1,4051 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:07 + + + +from object_library import all_parameters, Parameter + + +from function_library import complexconjugate, re, im, csc, sec, acsc, asec, cot + +# This is a default parameter object representing 0. +ZERO = Parameter(name = 'ZERO', + nature = 'internal', + type = 'real', + value = '0.0', + texname = '0') + +# User-defined parameters. +RRd1x1 = Parameter(name = 'RRd1x1', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRd1x1}', + lhablock = 'DSQMIX', + lhacode = [ 1, 1 ]) + +RRd2x2 = Parameter(name = 'RRd2x2', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRd2x2}', + lhablock = 'DSQMIX', + lhacode = [ 2, 2 ]) + +RRd3x3 = Parameter(name = 'RRd3x3', + nature = 'external', + type = 'real', + value = 0.938737896, + texname = '\\text{RRd3x3}', + lhablock = 'DSQMIX', + lhacode = [ 3, 3 ]) + +RRd3x6 = Parameter(name = 'RRd3x6', + nature = 'external', + type = 'real', + value = 0.344631925, + texname = '\\text{RRd3x6}', + lhablock = 'DSQMIX', + lhacode = [ 3, 6 ]) + +RRd4x4 = Parameter(name = 'RRd4x4', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRd4x4}', + lhablock = 'DSQMIX', + lhacode = [ 4, 4 ]) + +RRd5x5 = Parameter(name = 'RRd5x5', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRd5x5}', + lhablock = 'DSQMIX', + lhacode = [ 5, 5 ]) + +RRd6x3 = Parameter(name = 'RRd6x3', + nature = 'external', + type = 'real', + value = -0.344631925, + texname = '\\text{RRd6x3}', + lhablock = 'DSQMIX', + lhacode = [ 6, 3 ]) + +RRd6x6 = Parameter(name = 'RRd6x6', + nature = 'external', + type = 'real', + value = 0.938737896, + texname = '\\text{RRd6x6}', + lhablock = 'DSQMIX', + lhacode = [ 6, 6 ]) + +alp = Parameter(name = 'alp', + nature = 'external', + type = 'real', + value = -0.11382521, + texname = '\\alpha', + lhablock = 'FRALPHA', + lhacode = [ 1 ]) + +RMUH = Parameter(name = 'RMUH', + nature = 'external', + type = 'real', + value = 357.680977, + texname = '\\text{RMUH}', + lhablock = 'HMIX', + lhacode = [ 1 ]) + +tb = Parameter(name = 'tb', + nature = 'external', + type = 'real', + value = 9.74862403, + texname = 't_b', + lhablock = 'HMIX', + lhacode = [ 2 ]) + +RmD21x1 = Parameter(name = 'RmD21x1', + nature = 'external', + type = 'real', + value = 273684.674, + texname = '\\text{RmD21x1}', + lhablock = 'MSD2', + lhacode = [ 1, 1 ]) + +RmD22x2 = Parameter(name = 'RmD22x2', + nature = 'external', + type = 'real', + value = 273684.674, + texname = '\\text{RmD22x2}', + lhablock = 'MSD2', + lhacode = [ 2, 2 ]) + +RmD23x3 = Parameter(name = 'RmD23x3', + nature = 'external', + type = 'real', + value = 270261.969, + texname = '\\text{RmD23x3}', + lhablock = 'MSD2', + lhacode = [ 3, 3 ]) + +RmE21x1 = Parameter(name = 'RmE21x1', + nature = 'external', + type = 'real', + value = 18630.6287, + texname = '\\text{RmE21x1}', + lhablock = 'MSE2', + lhacode = [ 1, 1 ]) + +RmE22x2 = Parameter(name = 'RmE22x2', + nature = 'external', + type = 'real', + value = 18630.6287, + texname = '\\text{RmE22x2}', + lhablock = 'MSE2', + lhacode = [ 2, 2 ]) + +RmE23x3 = Parameter(name = 'RmE23x3', + nature = 'external', + type = 'real', + value = 17967.6406, + texname = '\\text{RmE23x3}', + lhablock = 'MSE2', + lhacode = [ 3, 3 ]) + +RmL21x1 = Parameter(name = 'RmL21x1', + nature = 'external', + type = 'real', + value = 38155.67, + texname = '\\text{RmL21x1}', + lhablock = 'MSL2', + lhacode = [ 1, 1 ]) + +RmL22x2 = Parameter(name = 'RmL22x2', + nature = 'external', + type = 'real', + value = 38155.67, + texname = '\\text{RmL22x2}', + lhablock = 'MSL2', + lhacode = [ 2, 2 ]) + +RmL23x3 = Parameter(name = 'RmL23x3', + nature = 'external', + type = 'real', + value = 37828.6769, + texname = '\\text{RmL23x3}', + lhablock = 'MSL2', + lhacode = [ 3, 3 ]) + +RMx1 = Parameter(name = 'RMx1', + nature = 'external', + type = 'real', + value = 101.396534, + texname = '\\text{RMx1}', + lhablock = 'MSOFT', + lhacode = [ 1 ]) + +RMx2 = Parameter(name = 'RMx2', + nature = 'external', + type = 'real', + value = 191.504241, + texname = '\\text{RMx2}', + lhablock = 'MSOFT', + lhacode = [ 2 ]) + +RMx3 = Parameter(name = 'RMx3', + nature = 'external', + type = 'real', + value = 588.263031, + texname = '\\text{RMx3}', + lhablock = 'MSOFT', + lhacode = [ 3 ]) + +mHd2 = Parameter(name = 'mHd2', + nature = 'external', + type = 'real', + value = 32337.4943, + texname = '\\text{Subsuperscript}\\left[m,H_d,2\\right]', + lhablock = 'MSOFT', + lhacode = [ 21 ]) + +mHu2 = Parameter(name = 'mHu2', + nature = 'external', + type = 'real', + value = -128800.134, + texname = '\\text{Subsuperscript}\\left[m,H_u,2\\right]', + lhablock = 'MSOFT', + lhacode = [ 22 ]) + +RmQ21x1 = Parameter(name = 'RmQ21x1', + nature = 'external', + type = 'real', + value = 299836.701, + texname = '\\text{RmQ21x1}', + lhablock = 'MSQ2', + lhacode = [ 1, 1 ]) + +RmQ22x2 = Parameter(name = 'RmQ22x2', + nature = 'external', + type = 'real', + value = 299836.701, + texname = '\\text{RmQ22x2}', + lhablock = 'MSQ2', + lhacode = [ 2, 2 ]) + +RmQ23x3 = Parameter(name = 'RmQ23x3', + nature = 'external', + type = 'real', + value = 248765.367, + texname = '\\text{RmQ23x3}', + lhablock = 'MSQ2', + lhacode = [ 3, 3 ]) + +RmU21x1 = Parameter(name = 'RmU21x1', + nature = 'external', + type = 'real', + value = 280382.106, + texname = '\\text{RmU21x1}', + lhablock = 'MSU2', + lhacode = [ 1, 1 ]) + +RmU22x2 = Parameter(name = 'RmU22x2', + nature = 'external', + type = 'real', + value = 280382.106, + texname = '\\text{RmU22x2}', + lhablock = 'MSU2', + lhacode = [ 2, 2 ]) + +RmU23x3 = Parameter(name = 'RmU23x3', + nature = 'external', + type = 'real', + value = 179137.072, + texname = '\\text{RmU23x3}', + lhablock = 'MSU2', + lhacode = [ 3, 3 ]) + +RNN1x1 = Parameter(name = 'RNN1x1', + nature = 'external', + type = 'real', + value = 0.98636443, + texname = '\\text{RNN1x1}', + lhablock = 'NMIX', + lhacode = [ 1, 1 ]) + +RNN1x2 = Parameter(name = 'RNN1x2', + nature = 'external', + type = 'real', + value = -0.0531103553, + texname = '\\text{RNN1x2}', + lhablock = 'NMIX', + lhacode = [ 1, 2 ]) + +RNN1x3 = Parameter(name = 'RNN1x3', + nature = 'external', + type = 'real', + value = 0.146433995, + texname = '\\text{RNN1x3}', + lhablock = 'NMIX', + lhacode = [ 1, 3 ]) + +RNN1x4 = Parameter(name = 'RNN1x4', + nature = 'external', + type = 'real', + value = -0.0531186117, + texname = '\\text{RNN1x4}', + lhablock = 'NMIX', + lhacode = [ 1, 4 ]) + +RNN2x1 = Parameter(name = 'RNN2x1', + nature = 'external', + type = 'real', + value = 0.0993505358, + texname = '\\text{RNN2x1}', + lhablock = 'NMIX', + lhacode = [ 2, 1 ]) + +RNN2x2 = Parameter(name = 'RNN2x2', + nature = 'external', + type = 'real', + value = 0.944949299, + texname = '\\text{RNN2x2}', + lhablock = 'NMIX', + lhacode = [ 2, 2 ]) + +RNN2x3 = Parameter(name = 'RNN2x3', + nature = 'external', + type = 'real', + value = -0.26984672, + texname = '\\text{RNN2x3}', + lhablock = 'NMIX', + lhacode = [ 2, 3 ]) + +RNN2x4 = Parameter(name = 'RNN2x4', + nature = 'external', + type = 'real', + value = 0.156150698, + texname = '\\text{RNN2x4}', + lhablock = 'NMIX', + lhacode = [ 2, 4 ]) + +RNN3x1 = Parameter(name = 'RNN3x1', + nature = 'external', + type = 'real', + value = -0.0603388002, + texname = '\\text{RNN3x1}', + lhablock = 'NMIX', + lhacode = [ 3, 1 ]) + +RNN3x2 = Parameter(name = 'RNN3x2', + nature = 'external', + type = 'real', + value = 0.0877004854, + texname = '\\text{RNN3x2}', + lhablock = 'NMIX', + lhacode = [ 3, 2 ]) + +RNN3x3 = Parameter(name = 'RNN3x3', + nature = 'external', + type = 'real', + value = 0.695877493, + texname = '\\text{RNN3x3}', + lhablock = 'NMIX', + lhacode = [ 3, 3 ]) + +RNN3x4 = Parameter(name = 'RNN3x4', + nature = 'external', + type = 'real', + value = 0.710226984, + texname = '\\text{RNN3x4}', + lhablock = 'NMIX', + lhacode = [ 3, 4 ]) + +RNN4x1 = Parameter(name = 'RNN4x1', + nature = 'external', + type = 'real', + value = -0.116507132, + texname = '\\text{RNN4x1}', + lhablock = 'NMIX', + lhacode = [ 4, 1 ]) + +RNN4x2 = Parameter(name = 'RNN4x2', + nature = 'external', + type = 'real', + value = 0.310739017, + texname = '\\text{RNN4x2}', + lhablock = 'NMIX', + lhacode = [ 4, 2 ]) + +RNN4x3 = Parameter(name = 'RNN4x3', + nature = 'external', + type = 'real', + value = 0.64922596, + texname = '\\text{RNN4x3}', + lhablock = 'NMIX', + lhacode = [ 4, 3 ]) + +RNN4x4 = Parameter(name = 'RNN4x4', + nature = 'external', + type = 'real', + value = -0.684377823, + texname = '\\text{RNN4x4}', + lhablock = 'NMIX', + lhacode = [ 4, 4 ]) + +RRl1x1 = Parameter(name = 'RRl1x1', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRl1x1}', + lhablock = 'SELMIX', + lhacode = [ 1, 1 ]) + +RRl2x2 = Parameter(name = 'RRl2x2', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRl2x2}', + lhablock = 'SELMIX', + lhacode = [ 2, 2 ]) + +RRl3x3 = Parameter(name = 'RRl3x3', + nature = 'external', + type = 'real', + value = 0.28248719, + texname = '\\text{RRl3x3}', + lhablock = 'SELMIX', + lhacode = [ 3, 3 ]) + +RRl3x6 = Parameter(name = 'RRl3x6', + nature = 'external', + type = 'real', + value = 0.959271071, + texname = '\\text{RRl3x6}', + lhablock = 'SELMIX', + lhacode = [ 3, 6 ]) + +RRl4x4 = Parameter(name = 'RRl4x4', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRl4x4}', + lhablock = 'SELMIX', + lhacode = [ 4, 4 ]) + +RRl5x5 = Parameter(name = 'RRl5x5', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRl5x5}', + lhablock = 'SELMIX', + lhacode = [ 5, 5 ]) + +RRl6x3 = Parameter(name = 'RRl6x3', + nature = 'external', + type = 'real', + value = 0.959271071, + texname = '\\text{RRl6x3}', + lhablock = 'SELMIX', + lhacode = [ 6, 3 ]) + +RRl6x6 = Parameter(name = 'RRl6x6', + nature = 'external', + type = 'real', + value = -0.28248719, + texname = '\\text{RRl6x6}', + lhablock = 'SELMIX', + lhacode = [ 6, 6 ]) + +aEWM1 = Parameter(name = 'aEWM1', + nature = 'external', + type = 'real', + value = 127.934, + texname = '\\text{Subsuperscript}[\\alpha ,w,-1]', + lhablock = 'SMINPUTS', + lhacode = [ 1 ]) + +aS = Parameter(name = 'aS', + nature = 'external', + type = 'real', + value = 0.118, + texname = '\\alpha _s', + lhablock = 'SMINPUTS', + lhacode = [ 3 ]) + +RRn1x1 = Parameter(name = 'RRn1x1', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRn1x1}', + lhablock = 'SNUMIX', + lhacode = [ 1, 1 ]) + +RRn2x2 = Parameter(name = 'RRn2x2', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRn2x2}', + lhablock = 'SNUMIX', + lhacode = [ 2, 2 ]) + +RRn3x3 = Parameter(name = 'RRn3x3', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRn3x3}', + lhablock = 'SNUMIX', + lhacode = [ 3, 3 ]) + +Rtd3x3 = Parameter(name = 'Rtd3x3', + nature = 'external', + type = 'real', + value = -110.693742, + texname = '\\text{Rtd3x3}', + lhablock = 'TD', + lhacode = [ 3, 3 ]) + +Rte3x3 = Parameter(name = 'Rte3x3', + nature = 'external', + type = 'real', + value = -25.4019727, + texname = '\\text{Rte3x3}', + lhablock = 'TE', + lhacode = [ 3, 3 ]) + +Rtu3x3 = Parameter(name = 'Rtu3x3', + nature = 'external', + type = 'real', + value = -444.752457, + texname = '\\text{Rtu3x3}', + lhablock = 'TU', + lhacode = [ 3, 3 ]) + +RUU1x1 = Parameter(name = 'RUU1x1', + nature = 'external', + type = 'real', + value = 0.916834859, + texname = '\\text{RUU1x1}', + lhablock = 'UMIX', + lhacode = [ 1, 1 ]) + +RUU1x2 = Parameter(name = 'RUU1x2', + nature = 'external', + type = 'real', + value = -0.399266629, + texname = '\\text{RUU1x2}', + lhablock = 'UMIX', + lhacode = [ 1, 2 ]) + +RUU2x1 = Parameter(name = 'RUU2x1', + nature = 'external', + type = 'real', + value = 0.399266629, + texname = '\\text{RUU2x1}', + lhablock = 'UMIX', + lhacode = [ 2, 1 ]) + +RUU2x2 = Parameter(name = 'RUU2x2', + nature = 'external', + type = 'real', + value = 0.916834859, + texname = '\\text{RUU2x2}', + lhablock = 'UMIX', + lhacode = [ 2, 2 ]) + +RMNS1x1 = Parameter(name = 'RMNS1x1', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RMNS1x1}', + lhablock = 'UPMNS', + lhacode = [ 1, 1 ]) + +RMNS2x2 = Parameter(name = 'RMNS2x2', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RMNS2x2}', + lhablock = 'UPMNS', + lhacode = [ 2, 2 ]) + +RMNS3x3 = Parameter(name = 'RMNS3x3', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RMNS3x3}', + lhablock = 'UPMNS', + lhacode = [ 3, 3 ]) + +RRu1x1 = Parameter(name = 'RRu1x1', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRu1x1}', + lhablock = 'USQMIX', + lhacode = [ 1, 1 ]) + +RRu2x2 = Parameter(name = 'RRu2x2', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRu2x2}', + lhablock = 'USQMIX', + lhacode = [ 2, 2 ]) + +RRu3x3 = Parameter(name = 'RRu3x3', + nature = 'external', + type = 'real', + value = 0.55364496, + texname = '\\text{RRu3x3}', + lhablock = 'USQMIX', + lhacode = [ 3, 3 ]) + +RRu3x6 = Parameter(name = 'RRu3x6', + nature = 'external', + type = 'real', + value = 0.83275282, + texname = '\\text{RRu3x6}', + lhablock = 'USQMIX', + lhacode = [ 3, 6 ]) + +RRu4x4 = Parameter(name = 'RRu4x4', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRu4x4}', + lhablock = 'USQMIX', + lhacode = [ 4, 4 ]) + +RRu5x5 = Parameter(name = 'RRu5x5', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RRu5x5}', + lhablock = 'USQMIX', + lhacode = [ 5, 5 ]) + +RRu6x3 = Parameter(name = 'RRu6x3', + nature = 'external', + type = 'real', + value = 0.83275282, + texname = '\\text{RRu6x3}', + lhablock = 'USQMIX', + lhacode = [ 6, 3 ]) + +RRu6x6 = Parameter(name = 'RRu6x6', + nature = 'external', + type = 'real', + value = -0.55364496, + texname = '\\text{RRu6x6}', + lhablock = 'USQMIX', + lhacode = [ 6, 6 ]) + +RCKM1x1 = Parameter(name = 'RCKM1x1', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RCKM1x1}', + lhablock = 'VCKM', + lhacode = [ 1, 1 ]) + +RCKM2x2 = Parameter(name = 'RCKM2x2', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RCKM2x2}', + lhablock = 'VCKM', + lhacode = [ 2, 2 ]) + +RCKM3x3 = Parameter(name = 'RCKM3x3', + nature = 'external', + type = 'real', + value = 1., + texname = '\\text{RCKM3x3}', + lhablock = 'VCKM', + lhacode = [ 3, 3 ]) + +RVV1x1 = Parameter(name = 'RVV1x1', + nature = 'external', + type = 'real', + value = 0.972557835, + texname = '\\text{RVV1x1}', + lhablock = 'VMIX', + lhacode = [ 1, 1 ]) + +RVV1x2 = Parameter(name = 'RVV1x2', + nature = 'external', + type = 'real', + value = -0.232661249, + texname = '\\text{RVV1x2}', + lhablock = 'VMIX', + lhacode = [ 1, 2 ]) + +RVV2x1 = Parameter(name = 'RVV2x1', + nature = 'external', + type = 'real', + value = 0.232661249, + texname = '\\text{RVV2x1}', + lhablock = 'VMIX', + lhacode = [ 2, 1 ]) + +RVV2x2 = Parameter(name = 'RVV2x2', + nature = 'external', + type = 'real', + value = 0.972557835, + texname = '\\text{RVV2x2}', + lhablock = 'VMIX', + lhacode = [ 2, 2 ]) + +Ryd3x3 = Parameter(name = 'Ryd3x3', + nature = 'external', + type = 'real', + value = 0.138840206, + texname = '\\text{Ryd3x3}', + lhablock = 'YD', + lhacode = [ 3, 3 ]) + +Rye3x3 = Parameter(name = 'Rye3x3', + nature = 'external', + type = 'real', + value = 0.10089081, + texname = '\\text{Rye3x3}', + lhablock = 'YE', + lhacode = [ 3, 3 ]) + +Ryu3x3 = Parameter(name = 'Ryu3x3', + nature = 'external', + type = 'real', + value = 0.89284455, + texname = '\\text{Ryu3x3}', + lhablock = 'YU', + lhacode = [ 3, 3 ]) + +MZ = Parameter(name = 'MZ', + nature = 'external', + type = 'real', + value = 91.1876, + texname = '\\text{MZ}', + lhablock = 'MASS', + lhacode = [ 23 ]) + +MW = Parameter(name = 'MW', + nature = 'external', + type = 'real', + value = 79.8290131, + texname = '\\text{MW}', + lhablock = 'MASS', + lhacode = [ 24 ]) + +Mneu1 = Parameter(name = 'Mneu1', + nature = 'external', + type = 'real', + value = 96.6880686, + texname = '\\text{Mneu1}', + lhablock = 'MASS', + lhacode = [ 1000022 ]) + +Mneu2 = Parameter(name = 'Mneu2', + nature = 'external', + type = 'real', + value = 181.088157, + texname = '\\text{Mneu2}', + lhablock = 'MASS', + lhacode = [ 1000023 ]) + +Mneu3 = Parameter(name = 'Mneu3', + nature = 'external', + type = 'real', + value = -363.756027, + texname = '\\text{Mneu3}', + lhablock = 'MASS', + lhacode = [ 1000025 ]) + +Mneu4 = Parameter(name = 'Mneu4', + nature = 'external', + type = 'real', + value = 381.729382, + texname = '\\text{Mneu4}', + lhablock = 'MASS', + lhacode = [ 1000035 ]) + +Mch1 = Parameter(name = 'Mch1', + nature = 'external', + type = 'real', + value = 181.696474, + texname = '\\text{Mch1}', + lhablock = 'MASS', + lhacode = [ 1000024 ]) + +Mch2 = Parameter(name = 'Mch2', + nature = 'external', + type = 'real', + value = 379.93932, + texname = '\\text{Mch2}', + lhablock = 'MASS', + lhacode = [ 1000037 ]) + +Mgo = Parameter(name = 'Mgo', + nature = 'external', + type = 'real', + value = 607.713704, + texname = '\\text{Mgo}', + lhablock = 'MASS', + lhacode = [ 1000021 ]) + +MH01 = Parameter(name = 'MH01', + nature = 'external', + type = 'real', + value = 110.899057, + texname = '\\text{MH01}', + lhablock = 'MASS', + lhacode = [ 25 ]) + +MH02 = Parameter(name = 'MH02', + nature = 'external', + type = 'real', + value = 399.960116, + texname = '\\text{MH02}', + lhablock = 'MASS', + lhacode = [ 35 ]) + +MA0 = Parameter(name = 'MA0', + nature = 'external', + type = 'real', + value = 399.583917, + texname = '\\text{MA0}', + lhablock = 'MASS', + lhacode = [ 36 ]) + +MH = Parameter(name = 'MH', + nature = 'external', + type = 'real', + value = 407.879012, + texname = '\\text{MH}', + lhablock = 'MASS', + lhacode = [ 37 ]) + +Mta = Parameter(name = 'Mta', + nature = 'external', + type = 'real', + value = 1.777, + texname = '\\text{Mta}', + lhablock = 'MASS', + lhacode = [ 15 ]) + +MT = Parameter(name = 'MT', + nature = 'external', + type = 'real', + value = 175., + texname = '\\text{MT}', + lhablock = 'MASS', + lhacode = [ 6 ]) + +MB = Parameter(name = 'MB', + nature = 'external', + type = 'real', + value = 4.88991651, + texname = '\\text{MB}', + lhablock = 'MASS', + lhacode = [ 5 ]) + +Msn1 = Parameter(name = 'Msn1', + nature = 'external', + type = 'real', + value = 185.258326, + texname = '\\text{Msn1}', + lhablock = 'MASS', + lhacode = [ 1000012 ]) + +Msn2 = Parameter(name = 'Msn2', + nature = 'external', + type = 'real', + value = 185.258326, + texname = '\\text{Msn2}', + lhablock = 'MASS', + lhacode = [ 1000014 ]) + +Msn3 = Parameter(name = 'Msn3', + nature = 'external', + type = 'real', + value = 184.708464, + texname = '\\text{Msn3}', + lhablock = 'MASS', + lhacode = [ 1000016 ]) + +Msl1 = Parameter(name = 'Msl1', + nature = 'external', + type = 'real', + value = 202.91569, + texname = '\\text{Msl1}', + lhablock = 'MASS', + lhacode = [ 1000011 ]) + +Msl2 = Parameter(name = 'Msl2', + nature = 'external', + type = 'real', + value = 202.91569, + texname = '\\text{Msl2}', + lhablock = 'MASS', + lhacode = [ 1000013 ]) + +Msl3 = Parameter(name = 'Msl3', + nature = 'external', + type = 'real', + value = 134.490864, + texname = '\\text{Msl3}', + lhablock = 'MASS', + lhacode = [ 1000015 ]) + +Msl4 = Parameter(name = 'Msl4', + nature = 'external', + type = 'real', + value = 144.102799, + texname = '\\text{Msl4}', + lhablock = 'MASS', + lhacode = [ 2000011 ]) + +Msl5 = Parameter(name = 'Msl5', + nature = 'external', + type = 'real', + value = 144.102799, + texname = '\\text{Msl5}', + lhablock = 'MASS', + lhacode = [ 2000013 ]) + +Msl6 = Parameter(name = 'Msl6', + nature = 'external', + type = 'real', + value = 206.867805, + texname = '\\text{Msl6}', + lhablock = 'MASS', + lhacode = [ 2000015 ]) + +Msu1 = Parameter(name = 'Msu1', + nature = 'external', + type = 'real', + value = 561.119014, + texname = '\\text{Msu1}', + lhablock = 'MASS', + lhacode = [ 1000002 ]) + +Msu2 = Parameter(name = 'Msu2', + nature = 'external', + type = 'real', + value = 561.119014, + texname = '\\text{Msu2}', + lhablock = 'MASS', + lhacode = [ 1000004 ]) + +Msu3 = Parameter(name = 'Msu3', + nature = 'external', + type = 'real', + value = 399.668493, + texname = '\\text{Msu3}', + lhablock = 'MASS', + lhacode = [ 1000006 ]) + +Msu4 = Parameter(name = 'Msu4', + nature = 'external', + type = 'real', + value = 549.259265, + texname = '\\text{Msu4}', + lhablock = 'MASS', + lhacode = [ 2000002 ]) + +Msu5 = Parameter(name = 'Msu5', + nature = 'external', + type = 'real', + value = 549.259265, + texname = '\\text{Msu5}', + lhablock = 'MASS', + lhacode = [ 2000004 ]) + +Msu6 = Parameter(name = 'Msu6', + nature = 'external', + type = 'real', + value = 585.785818, + texname = '\\text{Msu6}', + lhablock = 'MASS', + lhacode = [ 2000006 ]) + +Msd1 = Parameter(name = 'Msd1', + nature = 'external', + type = 'real', + value = 568.441109, + texname = '\\text{Msd1}', + lhablock = 'MASS', + lhacode = [ 1000001 ]) + +Msd2 = Parameter(name = 'Msd2', + nature = 'external', + type = 'real', + value = 568.441109, + texname = '\\text{Msd2}', + lhablock = 'MASS', + lhacode = [ 1000003 ]) + +Msd3 = Parameter(name = 'Msd3', + nature = 'external', + type = 'real', + value = 513.065179, + texname = '\\text{Msd3}', + lhablock = 'MASS', + lhacode = [ 1000005 ]) + +Msd4 = Parameter(name = 'Msd4', + nature = 'external', + type = 'real', + value = 545.228462, + texname = '\\text{Msd4}', + lhablock = 'MASS', + lhacode = [ 2000001 ]) + +Msd5 = Parameter(name = 'Msd5', + nature = 'external', + type = 'real', + value = 545.228462, + texname = '\\text{Msd5}', + lhablock = 'MASS', + lhacode = [ 2000003 ]) + +Msd6 = Parameter(name = 'Msd6', + nature = 'external', + type = 'real', + value = 543.726676, + texname = '\\text{Msd6}', + lhablock = 'MASS', + lhacode = [ 2000005 ]) + +WZ = Parameter(name = 'WZ', + nature = 'external', + type = 'real', + value = 2.41143316, + texname = '\\text{WZ}', + lhablock = 'DECAY', + lhacode = [ 23 ]) + +WW = Parameter(name = 'WW', + nature = 'external', + type = 'real', + value = 2.00282196, + texname = '\\text{WW}', + lhablock = 'DECAY', + lhacode = [ 24 ]) + +Wneu2 = Parameter(name = 'Wneu2', + nature = 'external', + type = 'real', + value = 0.0207770048, + texname = '\\text{Wneu2}', + lhablock = 'DECAY', + lhacode = [ 1000023 ]) + +Wneu3 = Parameter(name = 'Wneu3', + nature = 'external', + type = 'real', + value = 1.91598495, + texname = '\\text{Wneu3}', + lhablock = 'DECAY', + lhacode = [ 1000025 ]) + +Wneu4 = Parameter(name = 'Wneu4', + nature = 'external', + type = 'real', + value = 2.58585079, + texname = '\\text{Wneu4}', + lhablock = 'DECAY', + lhacode = [ 1000035 ]) + +Wch1 = Parameter(name = 'Wch1', + nature = 'external', + type = 'real', + value = 0.0170414503, + texname = '\\text{Wch1}', + lhablock = 'DECAY', + lhacode = [ 1000024 ]) + +Wch2 = Parameter(name = 'Wch2', + nature = 'external', + type = 'real', + value = 2.4868951, + texname = '\\text{Wch2}', + lhablock = 'DECAY', + lhacode = [ 1000037 ]) + +Wgo = Parameter(name = 'Wgo', + nature = 'external', + type = 'real', + value = 5.50675438, + texname = '\\text{Wgo}', + lhablock = 'DECAY', + lhacode = [ 1000021 ]) + +WH01 = Parameter(name = 'WH01', + nature = 'external', + type = 'real', + value = 0.00198610799, + texname = '\\text{WH01}', + lhablock = 'DECAY', + lhacode = [ 25 ]) + +WH02 = Parameter(name = 'WH02', + nature = 'external', + type = 'real', + value = 0.574801389, + texname = '\\text{WH02}', + lhablock = 'DECAY', + lhacode = [ 35 ]) + +WA0 = Parameter(name = 'WA0', + nature = 'external', + type = 'real', + value = 0.632178488, + texname = '\\text{WA0}', + lhablock = 'DECAY', + lhacode = [ 36 ]) + +WH = Parameter(name = 'WH', + nature = 'external', + type = 'real', + value = 0.546962813, + texname = '\\text{WH}', + lhablock = 'DECAY', + lhacode = [ 37 ]) + +WT = Parameter(name = 'WT', + nature = 'external', + type = 'real', + value = 1.56194983, + texname = '\\text{WT}', + lhablock = 'DECAY', + lhacode = [ 6 ]) + +Wsn1 = Parameter(name = 'Wsn1', + nature = 'external', + type = 'real', + value = 0.149881634, + texname = '\\text{Wsn1}', + lhablock = 'DECAY', + lhacode = [ 1000012 ]) + +Wsn2 = Parameter(name = 'Wsn2', + nature = 'external', + type = 'real', + value = 0.149881634, + texname = '\\text{Wsn2}', + lhablock = 'DECAY', + lhacode = [ 1000014 ]) + +Wsn3 = Parameter(name = 'Wsn3', + nature = 'external', + type = 'real', + value = 0.147518977, + texname = '\\text{Wsn3}', + lhablock = 'DECAY', + lhacode = [ 1000016 ]) + +Wsl1 = Parameter(name = 'Wsl1', + nature = 'external', + type = 'real', + value = 0.213682161, + texname = '\\text{Wsl1}', + lhablock = 'DECAY', + lhacode = [ 1000011 ]) + +Wsl2 = Parameter(name = 'Wsl2', + nature = 'external', + type = 'real', + value = 0.213682161, + texname = '\\text{Wsl2}', + lhablock = 'DECAY', + lhacode = [ 1000013 ]) + +Wsl3 = Parameter(name = 'Wsl3', + nature = 'external', + type = 'real', + value = 0.148327268, + texname = '\\text{Wsl3}', + lhablock = 'DECAY', + lhacode = [ 1000015 ]) + +Wsl4 = Parameter(name = 'Wsl4', + nature = 'external', + type = 'real', + value = 0.216121626, + texname = '\\text{Wsl4}', + lhablock = 'DECAY', + lhacode = [ 2000011 ]) + +Wsl5 = Parameter(name = 'Wsl5', + nature = 'external', + type = 'real', + value = 0.216121626, + texname = '\\text{Wsl5}', + lhablock = 'DECAY', + lhacode = [ 2000013 ]) + +Wsl6 = Parameter(name = 'Wsl6', + nature = 'external', + type = 'real', + value = 0.269906096, + texname = '\\text{Wsl6}', + lhablock = 'DECAY', + lhacode = [ 2000015 ]) + +Wsu1 = Parameter(name = 'Wsu1', + nature = 'external', + type = 'real', + value = 5.47719539, + texname = '\\text{Wsu1}', + lhablock = 'DECAY', + lhacode = [ 1000002 ]) + +Wsu2 = Parameter(name = 'Wsu2', + nature = 'external', + type = 'real', + value = 5.47719539, + texname = '\\text{Wsu2}', + lhablock = 'DECAY', + lhacode = [ 1000004 ]) + +Wsu3 = Parameter(name = 'Wsu3', + nature = 'external', + type = 'real', + value = 2.02159578, + texname = '\\text{Wsu3}', + lhablock = 'DECAY', + lhacode = [ 1000006 ]) + +Wsu4 = Parameter(name = 'Wsu4', + nature = 'external', + type = 'real', + value = 1.15297292, + texname = '\\text{Wsu4}', + lhablock = 'DECAY', + lhacode = [ 2000002 ]) + +Wsu5 = Parameter(name = 'Wsu5', + nature = 'external', + type = 'real', + value = 1.15297292, + texname = '\\text{Wsu5}', + lhablock = 'DECAY', + lhacode = [ 2000004 ]) + +Wsu6 = Parameter(name = 'Wsu6', + nature = 'external', + type = 'real', + value = 7.37313275, + texname = '\\text{Wsu6}', + lhablock = 'DECAY', + lhacode = [ 2000006 ]) + +Wsd1 = Parameter(name = 'Wsd1', + nature = 'external', + type = 'real', + value = 5.31278772, + texname = '\\text{Wsd1}', + lhablock = 'DECAY', + lhacode = [ 1000001 ]) + +Wsd2 = Parameter(name = 'Wsd2', + nature = 'external', + type = 'real', + value = 5.31278772, + texname = '\\text{Wsd2}', + lhablock = 'DECAY', + lhacode = [ 1000003 ]) + +Wsd3 = Parameter(name = 'Wsd3', + nature = 'external', + type = 'real', + value = 3.73627601, + texname = '\\text{Wsd3}', + lhablock = 'DECAY', + lhacode = [ 1000005 ]) + +Wsd4 = Parameter(name = 'Wsd4', + nature = 'external', + type = 'real', + value = 0.285812308, + texname = '\\text{Wsd4}', + lhablock = 'DECAY', + lhacode = [ 2000001 ]) + +Wsd5 = Parameter(name = 'Wsd5', + nature = 'external', + type = 'real', + value = 0.285812308, + texname = '\\text{Wsd5}', + lhablock = 'DECAY', + lhacode = [ 2000003 ]) + +Wsd6 = Parameter(name = 'Wsd6', + nature = 'external', + type = 'real', + value = 0.801566294, + texname = '\\text{Wsd6}', + lhablock = 'DECAY', + lhacode = [ 2000005 ]) + +beta = Parameter(name = 'beta', + nature = 'internal', + type = 'real', + value = 'cmath.atan(tb)', + texname = '\\beta') + +CKM1x1 = Parameter(name = 'CKM1x1', + nature = 'internal', + type = 'complex', + value = 'RCKM1x1', + texname = '\\text{CKM1x1}') + +CKM2x2 = Parameter(name = 'CKM2x2', + nature = 'internal', + type = 'complex', + value = 'RCKM2x2', + texname = '\\text{CKM2x2}') + +CKM3x3 = Parameter(name = 'CKM3x3', + nature = 'internal', + type = 'complex', + value = 'RCKM3x3', + texname = '\\text{CKM3x3}') + +cw = Parameter(name = 'cw', + nature = 'internal', + type = 'real', + value = 'MW/MZ', + texname = 'c_w') + +mD21x1 = Parameter(name = 'mD21x1', + nature = 'internal', + type = 'complex', + value = 'RmD21x1', + texname = '\\text{mD21x1}') + +mD22x2 = Parameter(name = 'mD22x2', + nature = 'internal', + type = 'complex', + value = 'RmD22x2', + texname = '\\text{mD22x2}') + +mD23x3 = Parameter(name = 'mD23x3', + nature = 'internal', + type = 'complex', + value = 'RmD23x3', + texname = '\\text{mD23x3}') + +mE21x1 = Parameter(name = 'mE21x1', + nature = 'internal', + type = 'complex', + value = 'RmE21x1', + texname = '\\text{mE21x1}') + +mE22x2 = Parameter(name = 'mE22x2', + nature = 'internal', + type = 'complex', + value = 'RmE22x2', + texname = '\\text{mE22x2}') + +mE23x3 = Parameter(name = 'mE23x3', + nature = 'internal', + type = 'complex', + value = 'RmE23x3', + texname = '\\text{mE23x3}') + +mL21x1 = Parameter(name = 'mL21x1', + nature = 'internal', + type = 'complex', + value = 'RmL21x1', + texname = '\\text{mL21x1}') + +mL22x2 = Parameter(name = 'mL22x2', + nature = 'internal', + type = 'complex', + value = 'RmL22x2', + texname = '\\text{mL22x2}') + +mL23x3 = Parameter(name = 'mL23x3', + nature = 'internal', + type = 'complex', + value = 'RmL23x3', + texname = '\\text{mL23x3}') + +mQ21x1 = Parameter(name = 'mQ21x1', + nature = 'internal', + type = 'complex', + value = 'RmQ21x1', + texname = '\\text{mQ21x1}') + +mQ22x2 = Parameter(name = 'mQ22x2', + nature = 'internal', + type = 'complex', + value = 'RmQ22x2', + texname = '\\text{mQ22x2}') + +mQ23x3 = Parameter(name = 'mQ23x3', + nature = 'internal', + type = 'complex', + value = 'RmQ23x3', + texname = '\\text{mQ23x3}') + +mU21x1 = Parameter(name = 'mU21x1', + nature = 'internal', + type = 'complex', + value = 'RmU21x1', + texname = '\\text{mU21x1}') + +mU22x2 = Parameter(name = 'mU22x2', + nature = 'internal', + type = 'complex', + value = 'RmU22x2', + texname = '\\text{mU22x2}') + +mU23x3 = Parameter(name = 'mU23x3', + nature = 'internal', + type = 'complex', + value = 'RmU23x3', + texname = '\\text{mU23x3}') + +MUH = Parameter(name = 'MUH', + nature = 'internal', + type = 'complex', + value = 'RMUH', + texname = '\\mu') + +Mx1 = Parameter(name = 'Mx1', + nature = 'internal', + type = 'complex', + value = 'RMx1', + texname = 'M_1') + +Mx2 = Parameter(name = 'Mx2', + nature = 'internal', + type = 'complex', + value = 'RMx2', + texname = 'M_2') + +Mx3 = Parameter(name = 'Mx3', + nature = 'internal', + type = 'complex', + value = 'RMx3', + texname = 'M_3') + +NN1x1 = Parameter(name = 'NN1x1', + nature = 'internal', + type = 'complex', + value = 'RNN1x1', + texname = '\\text{NN1x1}') + +NN1x2 = Parameter(name = 'NN1x2', + nature = 'internal', + type = 'complex', + value = 'RNN1x2', + texname = '\\text{NN1x2}') + +NN1x3 = Parameter(name = 'NN1x3', + nature = 'internal', + type = 'complex', + value = 'RNN1x3', + texname = '\\text{NN1x3}') + +NN1x4 = Parameter(name = 'NN1x4', + nature = 'internal', + type = 'complex', + value = 'RNN1x4', + texname = '\\text{NN1x4}') + +NN2x1 = Parameter(name = 'NN2x1', + nature = 'internal', + type = 'complex', + value = 'RNN2x1', + texname = '\\text{NN2x1}') + +NN2x2 = Parameter(name = 'NN2x2', + nature = 'internal', + type = 'complex', + value = 'RNN2x2', + texname = '\\text{NN2x2}') + +NN2x3 = Parameter(name = 'NN2x3', + nature = 'internal', + type = 'complex', + value = 'RNN2x3', + texname = '\\text{NN2x3}') + +NN2x4 = Parameter(name = 'NN2x4', + nature = 'internal', + type = 'complex', + value = 'RNN2x4', + texname = '\\text{NN2x4}') + +NN3x1 = Parameter(name = 'NN3x1', + nature = 'internal', + type = 'complex', + value = 'RNN3x1', + texname = '\\text{NN3x1}') + +NN3x2 = Parameter(name = 'NN3x2', + nature = 'internal', + type = 'complex', + value = 'RNN3x2', + texname = '\\text{NN3x2}') + +NN3x3 = Parameter(name = 'NN3x3', + nature = 'internal', + type = 'complex', + value = 'RNN3x3', + texname = '\\text{NN3x3}') + +NN3x4 = Parameter(name = 'NN3x4', + nature = 'internal', + type = 'complex', + value = 'RNN3x4', + texname = '\\text{NN3x4}') + +NN4x1 = Parameter(name = 'NN4x1', + nature = 'internal', + type = 'complex', + value = 'RNN4x1', + texname = '\\text{NN4x1}') + +NN4x2 = Parameter(name = 'NN4x2', + nature = 'internal', + type = 'complex', + value = 'RNN4x2', + texname = '\\text{NN4x2}') + +NN4x3 = Parameter(name = 'NN4x3', + nature = 'internal', + type = 'complex', + value = 'RNN4x3', + texname = '\\text{NN4x3}') + +NN4x4 = Parameter(name = 'NN4x4', + nature = 'internal', + type = 'complex', + value = 'RNN4x4', + texname = '\\text{NN4x4}') + +Rd1x1 = Parameter(name = 'Rd1x1', + nature = 'internal', + type = 'complex', + value = 'RRd1x1', + texname = '\\text{Rd1x1}') + +Rd2x2 = Parameter(name = 'Rd2x2', + nature = 'internal', + type = 'complex', + value = 'RRd2x2', + texname = '\\text{Rd2x2}') + +Rd3x3 = Parameter(name = 'Rd3x3', + nature = 'internal', + type = 'complex', + value = 'RRd3x3', + texname = '\\text{Rd3x3}') + +Rd3x6 = Parameter(name = 'Rd3x6', + nature = 'internal', + type = 'complex', + value = 'RRd3x6', + texname = '\\text{Rd3x6}') + +Rd4x4 = Parameter(name = 'Rd4x4', + nature = 'internal', + type = 'complex', + value = 'RRd4x4', + texname = '\\text{Rd4x4}') + +Rd5x5 = Parameter(name = 'Rd5x5', + nature = 'internal', + type = 'complex', + value = 'RRd5x5', + texname = '\\text{Rd5x5}') + +Rd6x3 = Parameter(name = 'Rd6x3', + nature = 'internal', + type = 'complex', + value = 'RRd6x3', + texname = '\\text{Rd6x3}') + +Rd6x6 = Parameter(name = 'Rd6x6', + nature = 'internal', + type = 'complex', + value = 'RRd6x6', + texname = '\\text{Rd6x6}') + +Rl1x1 = Parameter(name = 'Rl1x1', + nature = 'internal', + type = 'complex', + value = 'RRl1x1', + texname = '\\text{Rl1x1}') + +Rl2x2 = Parameter(name = 'Rl2x2', + nature = 'internal', + type = 'complex', + value = 'RRl2x2', + texname = '\\text{Rl2x2}') + +Rl3x3 = Parameter(name = 'Rl3x3', + nature = 'internal', + type = 'complex', + value = 'RRl3x3', + texname = '\\text{Rl3x3}') + +Rl3x6 = Parameter(name = 'Rl3x6', + nature = 'internal', + type = 'complex', + value = 'RRl3x6', + texname = '\\text{Rl3x6}') + +Rl4x4 = Parameter(name = 'Rl4x4', + nature = 'internal', + type = 'complex', + value = 'RRl4x4', + texname = '\\text{Rl4x4}') + +Rl5x5 = Parameter(name = 'Rl5x5', + nature = 'internal', + type = 'complex', + value = 'RRl5x5', + texname = '\\text{Rl5x5}') + +Rl6x3 = Parameter(name = 'Rl6x3', + nature = 'internal', + type = 'complex', + value = 'RRl6x3', + texname = '\\text{Rl6x3}') + +Rl6x6 = Parameter(name = 'Rl6x6', + nature = 'internal', + type = 'complex', + value = 'RRl6x6', + texname = '\\text{Rl6x6}') + +Rn1x1 = Parameter(name = 'Rn1x1', + nature = 'internal', + type = 'complex', + value = 'RRn1x1', + texname = '\\text{Rn1x1}') + +Rn2x2 = Parameter(name = 'Rn2x2', + nature = 'internal', + type = 'complex', + value = 'RRn2x2', + texname = '\\text{Rn2x2}') + +Rn3x3 = Parameter(name = 'Rn3x3', + nature = 'internal', + type = 'complex', + value = 'RRn3x3', + texname = '\\text{Rn3x3}') + +Ru1x1 = Parameter(name = 'Ru1x1', + nature = 'internal', + type = 'complex', + value = 'RRu1x1', + texname = '\\text{Ru1x1}') + +Ru2x2 = Parameter(name = 'Ru2x2', + nature = 'internal', + type = 'complex', + value = 'RRu2x2', + texname = '\\text{Ru2x2}') + +Ru3x3 = Parameter(name = 'Ru3x3', + nature = 'internal', + type = 'complex', + value = 'RRu3x3', + texname = '\\text{Ru3x3}') + +Ru3x6 = Parameter(name = 'Ru3x6', + nature = 'internal', + type = 'complex', + value = 'RRu3x6', + texname = '\\text{Ru3x6}') + +Ru4x4 = Parameter(name = 'Ru4x4', + nature = 'internal', + type = 'complex', + value = 'RRu4x4', + texname = '\\text{Ru4x4}') + +Ru5x5 = Parameter(name = 'Ru5x5', + nature = 'internal', + type = 'complex', + value = 'RRu5x5', + texname = '\\text{Ru5x5}') + +Ru6x3 = Parameter(name = 'Ru6x3', + nature = 'internal', + type = 'complex', + value = 'RRu6x3', + texname = '\\text{Ru6x3}') + +Ru6x6 = Parameter(name = 'Ru6x6', + nature = 'internal', + type = 'complex', + value = 'RRu6x6', + texname = '\\text{Ru6x6}') + +UU1x1 = Parameter(name = 'UU1x1', + nature = 'internal', + type = 'complex', + value = 'RUU1x1', + texname = '\\text{UU1x1}') + +UU1x2 = Parameter(name = 'UU1x2', + nature = 'internal', + type = 'complex', + value = 'RUU1x2', + texname = '\\text{UU1x2}') + +UU2x1 = Parameter(name = 'UU2x1', + nature = 'internal', + type = 'complex', + value = 'RUU2x1', + texname = '\\text{UU2x1}') + +UU2x2 = Parameter(name = 'UU2x2', + nature = 'internal', + type = 'complex', + value = 'RUU2x2', + texname = '\\text{UU2x2}') + +VV1x1 = Parameter(name = 'VV1x1', + nature = 'internal', + type = 'complex', + value = 'RVV1x1', + texname = '\\text{VV1x1}') + +VV1x2 = Parameter(name = 'VV1x2', + nature = 'internal', + type = 'complex', + value = 'RVV1x2', + texname = '\\text{VV1x2}') + +VV2x1 = Parameter(name = 'VV2x1', + nature = 'internal', + type = 'complex', + value = 'RVV2x1', + texname = '\\text{VV2x1}') + +VV2x2 = Parameter(name = 'VV2x2', + nature = 'internal', + type = 'complex', + value = 'RVV2x2', + texname = '\\text{VV2x2}') + +ee = Parameter(name = 'ee', + nature = 'internal', + type = 'real', + value = '2*cmath.sqrt(1/aEWM1)*cmath.sqrt(cmath.pi)', + texname = 'e') + +G = Parameter(name = 'G', + nature = 'internal', + type = 'real', + value = '2*cmath.sqrt(aS)*cmath.sqrt(cmath.pi)', + texname = 'G') + +td3x3 = Parameter(name = 'td3x3', + nature = 'internal', + type = 'complex', + value = 'Rtd3x3', + texname = '\\text{td3x3}') + +te3x3 = Parameter(name = 'te3x3', + nature = 'internal', + type = 'complex', + value = 'Rte3x3', + texname = '\\text{te3x3}') + +tu3x3 = Parameter(name = 'tu3x3', + nature = 'internal', + type = 'complex', + value = 'Rtu3x3', + texname = '\\text{tu3x3}') + +yd3x3 = Parameter(name = 'yd3x3', + nature = 'internal', + type = 'complex', + value = 'Ryd3x3', + texname = '\\text{yd3x3}') + +ye3x3 = Parameter(name = 'ye3x3', + nature = 'internal', + type = 'complex', + value = 'Rye3x3', + texname = '\\text{ye3x3}') + +yu3x3 = Parameter(name = 'yu3x3', + nature = 'internal', + type = 'complex', + value = 'Ryu3x3', + texname = '\\text{yu3x3}') + +bb = Parameter(name = 'bb', + nature = 'internal', + type = 'complex', + value = '((-mHd2 + mHu2)*cmath.tan(2*alp))/2. - MZ**2*(cmath.sin(2*beta)/2. + cmath.cos(2*beta)*cmath.tan(2*alp))', + texname = 'b') + +sw = Parameter(name = 'sw', + nature = 'internal', + type = 'real', + value = 'cmath.sqrt(1 - cw**2)', + texname = 's_w') + +gp = Parameter(name = 'gp', + nature = 'internal', + type = 'real', + value = 'ee/cw', + texname = 'g\'') + +gw = Parameter(name = 'gw', + nature = 'internal', + type = 'real', + value = 'ee/sw', + texname = 'g_w') + +vev = Parameter(name = 'vev', + nature = 'internal', + type = 'real', + value = '(2*cw*MZ*sw)/ee', + texname = 'v') + +vd = Parameter(name = 'vd', + nature = 'internal', + type = 'real', + value = 'vev*cmath.cos(beta)', + texname = 'v_d') + +vu = Parameter(name = 'vu', + nature = 'internal', + type = 'real', + value = 'vev*cmath.sin(beta)', + texname = 'v_u') + +I1a33 = Parameter(name = 'I1a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM3x3)*complexconjugate(yu3x3)', + texname = '\\text{I1a33}') + +I10a11 = Parameter(name = 'I10a11', + nature = 'internal', + type = 'complex', + value = 'Rd1x1*complexconjugate(CKM1x1)', + texname = '\\text{I10a11}') + +I10a22 = Parameter(name = 'I10a22', + nature = 'internal', + type = 'complex', + value = 'Rd2x2*complexconjugate(CKM2x2)', + texname = '\\text{I10a22}') + +I10a33 = Parameter(name = 'I10a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)', + texname = '\\text{I10a33}') + +I10a36 = Parameter(name = 'I10a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)', + texname = '\\text{I10a36}') + +I100a33 = Parameter(name = 'I100a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*complexconjugate(Rd3x6)', + texname = '\\text{I100a33}') + +I100a36 = Parameter(name = 'I100a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*complexconjugate(Rd3x6)', + texname = '\\text{I100a36}') + +I100a44 = Parameter(name = 'I100a44', + nature = 'internal', + type = 'complex', + value = 'Rd4x4*complexconjugate(Rd4x4)', + texname = '\\text{I100a44}') + +I100a55 = Parameter(name = 'I100a55', + nature = 'internal', + type = 'complex', + value = 'Rd5x5*complexconjugate(Rd5x5)', + texname = '\\text{I100a55}') + +I100a63 = Parameter(name = 'I100a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*complexconjugate(Rd6x6)', + texname = '\\text{I100a63}') + +I100a66 = Parameter(name = 'I100a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*complexconjugate(Rd6x6)', + texname = '\\text{I100a66}') + +I101a33 = Parameter(name = 'I101a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*complexconjugate(Rl3x6)', + texname = '\\text{I101a33}') + +I101a36 = Parameter(name = 'I101a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*complexconjugate(Rl3x6)', + texname = '\\text{I101a36}') + +I101a44 = Parameter(name = 'I101a44', + nature = 'internal', + type = 'complex', + value = 'Rl4x4*complexconjugate(Rl4x4)', + texname = '\\text{I101a44}') + +I101a55 = Parameter(name = 'I101a55', + nature = 'internal', + type = 'complex', + value = 'Rl5x5*complexconjugate(Rl5x5)', + texname = '\\text{I101a55}') + +I101a63 = Parameter(name = 'I101a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*complexconjugate(Rl6x6)', + texname = '\\text{I101a63}') + +I101a66 = Parameter(name = 'I101a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*complexconjugate(Rl6x6)', + texname = '\\text{I101a66}') + +I102a33 = Parameter(name = 'I102a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*complexconjugate(Ru3x6)', + texname = '\\text{I102a33}') + +I102a36 = Parameter(name = 'I102a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*complexconjugate(Ru3x6)', + texname = '\\text{I102a36}') + +I102a44 = Parameter(name = 'I102a44', + nature = 'internal', + type = 'complex', + value = 'Ru4x4*complexconjugate(Ru4x4)', + texname = '\\text{I102a44}') + +I102a55 = Parameter(name = 'I102a55', + nature = 'internal', + type = 'complex', + value = 'Ru5x5*complexconjugate(Ru5x5)', + texname = '\\text{I102a55}') + +I102a63 = Parameter(name = 'I102a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*complexconjugate(Ru6x6)', + texname = '\\text{I102a63}') + +I102a66 = Parameter(name = 'I102a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*complexconjugate(Ru6x6)', + texname = '\\text{I102a66}') + +I11a33 = Parameter(name = 'I11a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(yu3x3)', + texname = '\\text{I11a33}') + +I11a36 = Parameter(name = 'I11a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(yu3x3)', + texname = '\\text{I11a36}') + +I12a33 = Parameter(name = 'I12a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(CKM3x3)', + texname = '\\text{I12a33}') + +I12a36 = Parameter(name = 'I12a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(CKM3x3)', + texname = '\\text{I12a36}') + +I13a33 = Parameter(name = 'I13a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(yd3x3)', + texname = '\\text{I13a33}') + +I13a36 = Parameter(name = 'I13a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(yd3x3)', + texname = '\\text{I13a36}') + +I14a33 = Parameter(name = 'I14a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3', + texname = '\\text{I14a33}') + +I14a36 = Parameter(name = 'I14a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3', + texname = '\\text{I14a36}') + +I15a11 = Parameter(name = 'I15a11', + nature = 'internal', + type = 'complex', + value = 'Rd1x1*complexconjugate(Rd1x1)', + texname = '\\text{I15a11}') + +I15a22 = Parameter(name = 'I15a22', + nature = 'internal', + type = 'complex', + value = 'Rd2x2*complexconjugate(Rd2x2)', + texname = '\\text{I15a22}') + +I15a33 = Parameter(name = 'I15a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd3x3)', + texname = '\\text{I15a33}') + +I15a36 = Parameter(name = 'I15a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd3x3)', + texname = '\\text{I15a36}') + +I15a63 = Parameter(name = 'I15a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd6x3)', + texname = '\\text{I15a63}') + +I15a66 = Parameter(name = 'I15a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd6x3)', + texname = '\\text{I15a66}') + +I16a33 = Parameter(name = 'I16a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*complexconjugate(Rd3x6)', + texname = '\\text{I16a33}') + +I16a36 = Parameter(name = 'I16a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*complexconjugate(Rd3x6)', + texname = '\\text{I16a36}') + +I16a44 = Parameter(name = 'I16a44', + nature = 'internal', + type = 'complex', + value = 'Rd4x4*complexconjugate(Rd4x4)', + texname = '\\text{I16a44}') + +I16a55 = Parameter(name = 'I16a55', + nature = 'internal', + type = 'complex', + value = 'Rd5x5*complexconjugate(Rd5x5)', + texname = '\\text{I16a55}') + +I16a63 = Parameter(name = 'I16a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*complexconjugate(Rd6x6)', + texname = '\\text{I16a63}') + +I16a66 = Parameter(name = 'I16a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*complexconjugate(Rd6x6)', + texname = '\\text{I16a66}') + +I17a33 = Parameter(name = 'I17a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd3x6)*complexconjugate(td3x3)', + texname = '\\text{I17a33}') + +I17a36 = Parameter(name = 'I17a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd3x6)*complexconjugate(td3x3)', + texname = '\\text{I17a36}') + +I17a63 = Parameter(name = 'I17a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd6x6)*complexconjugate(td3x3)', + texname = '\\text{I17a63}') + +I17a66 = Parameter(name = 'I17a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd6x6)*complexconjugate(td3x3)', + texname = '\\text{I17a66}') + +I18a33 = Parameter(name = 'I18a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I18a33}') + +I18a36 = Parameter(name = 'I18a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I18a36}') + +I18a63 = Parameter(name = 'I18a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I18a63}') + +I18a66 = Parameter(name = 'I18a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I18a66}') + +I19a33 = Parameter(name = 'I19a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*td3x3*complexconjugate(Rd3x3)', + texname = '\\text{I19a33}') + +I19a36 = Parameter(name = 'I19a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*td3x3*complexconjugate(Rd3x3)', + texname = '\\text{I19a36}') + +I19a63 = Parameter(name = 'I19a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*td3x3*complexconjugate(Rd6x3)', + texname = '\\text{I19a63}') + +I19a66 = Parameter(name = 'I19a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*td3x3*complexconjugate(Rd6x3)', + texname = '\\text{I19a66}') + +I2a33 = Parameter(name = 'I2a33', + nature = 'internal', + type = 'complex', + value = 'yd3x3*complexconjugate(CKM3x3)', + texname = '\\text{I2a33}') + +I20a33 = Parameter(name = 'I20a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*yd3x3*complexconjugate(Rd3x3)*complexconjugate(yd3x3)', + texname = '\\text{I20a33}') + +I20a36 = Parameter(name = 'I20a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*yd3x3*complexconjugate(Rd3x3)*complexconjugate(yd3x3)', + texname = '\\text{I20a36}') + +I20a63 = Parameter(name = 'I20a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*yd3x3*complexconjugate(Rd6x3)*complexconjugate(yd3x3)', + texname = '\\text{I20a63}') + +I20a66 = Parameter(name = 'I20a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*yd3x3*complexconjugate(Rd6x3)*complexconjugate(yd3x3)', + texname = '\\text{I20a66}') + +I21a33 = Parameter(name = 'I21a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(Rd3x3)', + texname = '\\text{I21a33}') + +I21a36 = Parameter(name = 'I21a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(Rd3x3)', + texname = '\\text{I21a36}') + +I21a63 = Parameter(name = 'I21a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(Rd6x3)', + texname = '\\text{I21a63}') + +I21a66 = Parameter(name = 'I21a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(Rd6x3)', + texname = '\\text{I21a66}') + +I22a33 = Parameter(name = 'I22a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I22a33}') + +I22a36 = Parameter(name = 'I22a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I22a36}') + +I22a63 = Parameter(name = 'I22a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I22a63}') + +I22a66 = Parameter(name = 'I22a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I22a66}') + +I23a33 = Parameter(name = 'I23a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I23a33}') + +I23a36 = Parameter(name = 'I23a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I23a36}') + +I24a33 = Parameter(name = 'I24a33', + nature = 'internal', + type = 'complex', + value = 'ye3x3*complexconjugate(Rl3x3)', + texname = '\\text{I24a33}') + +I24a36 = Parameter(name = 'I24a36', + nature = 'internal', + type = 'complex', + value = 'ye3x3*complexconjugate(Rl6x3)', + texname = '\\text{I24a36}') + +I25a11 = Parameter(name = 'I25a11', + nature = 'internal', + type = 'complex', + value = 'Rl1x1*complexconjugate(Rl1x1)', + texname = '\\text{I25a11}') + +I25a22 = Parameter(name = 'I25a22', + nature = 'internal', + type = 'complex', + value = 'Rl2x2*complexconjugate(Rl2x2)', + texname = '\\text{I25a22}') + +I25a33 = Parameter(name = 'I25a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl3x3)', + texname = '\\text{I25a33}') + +I25a36 = Parameter(name = 'I25a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl3x3)', + texname = '\\text{I25a36}') + +I25a63 = Parameter(name = 'I25a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl6x3)', + texname = '\\text{I25a63}') + +I25a66 = Parameter(name = 'I25a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl6x3)', + texname = '\\text{I25a66}') + +I26a33 = Parameter(name = 'I26a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*complexconjugate(Rl3x6)', + texname = '\\text{I26a33}') + +I26a36 = Parameter(name = 'I26a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*complexconjugate(Rl3x6)', + texname = '\\text{I26a36}') + +I26a44 = Parameter(name = 'I26a44', + nature = 'internal', + type = 'complex', + value = 'Rl4x4*complexconjugate(Rl4x4)', + texname = '\\text{I26a44}') + +I26a55 = Parameter(name = 'I26a55', + nature = 'internal', + type = 'complex', + value = 'Rl5x5*complexconjugate(Rl5x5)', + texname = '\\text{I26a55}') + +I26a63 = Parameter(name = 'I26a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*complexconjugate(Rl6x6)', + texname = '\\text{I26a63}') + +I26a66 = Parameter(name = 'I26a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*complexconjugate(Rl6x6)', + texname = '\\text{I26a66}') + +I27a33 = Parameter(name = 'I27a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(ye3x3)', + texname = '\\text{I27a33}') + +I27a36 = Parameter(name = 'I27a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(ye3x3)', + texname = '\\text{I27a36}') + +I28a33 = Parameter(name = 'I28a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3', + texname = '\\text{I28a33}') + +I28a36 = Parameter(name = 'I28a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3', + texname = '\\text{I28a36}') + +I29a11 = Parameter(name = 'I29a11', + nature = 'internal', + type = 'complex', + value = 'Rl1x1', + texname = '\\text{I29a11}') + +I29a22 = Parameter(name = 'I29a22', + nature = 'internal', + type = 'complex', + value = 'Rl2x2', + texname = '\\text{I29a22}') + +I29a33 = Parameter(name = 'I29a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3', + texname = '\\text{I29a33}') + +I29a36 = Parameter(name = 'I29a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3', + texname = '\\text{I29a36}') + +I3a33 = Parameter(name = 'I3a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*complexconjugate(yd3x3)', + texname = '\\text{I3a33}') + +I30a33 = Parameter(name = 'I30a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3', + texname = '\\text{I30a33}') + +I30a36 = Parameter(name = 'I30a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3', + texname = '\\text{I30a36}') + +I31a11 = Parameter(name = 'I31a11', + nature = 'internal', + type = 'complex', + value = 'Rl1x1*complexconjugate(Rl1x1)', + texname = '\\text{I31a11}') + +I31a22 = Parameter(name = 'I31a22', + nature = 'internal', + type = 'complex', + value = 'Rl2x2*complexconjugate(Rl2x2)', + texname = '\\text{I31a22}') + +I31a33 = Parameter(name = 'I31a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl3x3)', + texname = '\\text{I31a33}') + +I31a36 = Parameter(name = 'I31a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl3x3)', + texname = '\\text{I31a36}') + +I31a63 = Parameter(name = 'I31a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl6x3)', + texname = '\\text{I31a63}') + +I31a66 = Parameter(name = 'I31a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl6x3)', + texname = '\\text{I31a66}') + +I32a33 = Parameter(name = 'I32a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*complexconjugate(Rl3x6)', + texname = '\\text{I32a33}') + +I32a36 = Parameter(name = 'I32a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*complexconjugate(Rl3x6)', + texname = '\\text{I32a36}') + +I32a44 = Parameter(name = 'I32a44', + nature = 'internal', + type = 'complex', + value = 'Rl4x4*complexconjugate(Rl4x4)', + texname = '\\text{I32a44}') + +I32a55 = Parameter(name = 'I32a55', + nature = 'internal', + type = 'complex', + value = 'Rl5x5*complexconjugate(Rl5x5)', + texname = '\\text{I32a55}') + +I32a63 = Parameter(name = 'I32a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*complexconjugate(Rl6x6)', + texname = '\\text{I32a63}') + +I32a66 = Parameter(name = 'I32a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*complexconjugate(Rl6x6)', + texname = '\\text{I32a66}') + +I33a33 = Parameter(name = 'I33a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl3x6)*complexconjugate(te3x3)', + texname = '\\text{I33a33}') + +I33a36 = Parameter(name = 'I33a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl3x6)*complexconjugate(te3x3)', + texname = '\\text{I33a36}') + +I33a63 = Parameter(name = 'I33a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl6x6)*complexconjugate(te3x3)', + texname = '\\text{I33a63}') + +I33a66 = Parameter(name = 'I33a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl6x6)*complexconjugate(te3x3)', + texname = '\\text{I33a66}') + +I34a33 = Parameter(name = 'I34a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I34a33}') + +I34a36 = Parameter(name = 'I34a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I34a36}') + +I34a63 = Parameter(name = 'I34a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I34a63}') + +I34a66 = Parameter(name = 'I34a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I34a66}') + +I35a33 = Parameter(name = 'I35a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*te3x3*complexconjugate(Rl3x3)', + texname = '\\text{I35a33}') + +I35a36 = Parameter(name = 'I35a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*te3x3*complexconjugate(Rl3x3)', + texname = '\\text{I35a36}') + +I35a63 = Parameter(name = 'I35a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*te3x3*complexconjugate(Rl6x3)', + texname = '\\text{I35a63}') + +I35a66 = Parameter(name = 'I35a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*te3x3*complexconjugate(Rl6x3)', + texname = '\\text{I35a66}') + +I36a33 = Parameter(name = 'I36a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*ye3x3*complexconjugate(Rl3x3)*complexconjugate(ye3x3)', + texname = '\\text{I36a33}') + +I36a36 = Parameter(name = 'I36a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*ye3x3*complexconjugate(Rl3x3)*complexconjugate(ye3x3)', + texname = '\\text{I36a36}') + +I36a63 = Parameter(name = 'I36a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*ye3x3*complexconjugate(Rl6x3)*complexconjugate(ye3x3)', + texname = '\\text{I36a63}') + +I36a66 = Parameter(name = 'I36a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*ye3x3*complexconjugate(Rl6x3)*complexconjugate(ye3x3)', + texname = '\\text{I36a66}') + +I37a33 = Parameter(name = 'I37a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3*complexconjugate(Rl3x3)', + texname = '\\text{I37a33}') + +I37a36 = Parameter(name = 'I37a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3*complexconjugate(Rl3x3)', + texname = '\\text{I37a36}') + +I37a63 = Parameter(name = 'I37a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3*complexconjugate(Rl6x3)', + texname = '\\text{I37a63}') + +I37a66 = Parameter(name = 'I37a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3*complexconjugate(Rl6x3)', + texname = '\\text{I37a66}') + +I38a33 = Parameter(name = 'I38a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3*complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I38a33}') + +I38a36 = Parameter(name = 'I38a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3*complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I38a36}') + +I38a63 = Parameter(name = 'I38a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3*complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I38a63}') + +I38a66 = Parameter(name = 'I38a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3*complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I38a66}') + +I39a11 = Parameter(name = 'I39a11', + nature = 'internal', + type = 'complex', + value = 'Rl1x1*complexconjugate(Rn1x1)', + texname = '\\text{I39a11}') + +I39a22 = Parameter(name = 'I39a22', + nature = 'internal', + type = 'complex', + value = 'Rl2x2*complexconjugate(Rn2x2)', + texname = '\\text{I39a22}') + +I39a33 = Parameter(name = 'I39a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rn3x3)', + texname = '\\text{I39a33}') + +I39a36 = Parameter(name = 'I39a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rn3x3)', + texname = '\\text{I39a36}') + +I4a33 = Parameter(name = 'I4a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*yu3x3', + texname = '\\text{I4a33}') + +I40a33 = Parameter(name = 'I40a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*te3x3*complexconjugate(Rn3x3)', + texname = '\\text{I40a33}') + +I40a36 = Parameter(name = 'I40a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*te3x3*complexconjugate(Rn3x3)', + texname = '\\text{I40a36}') + +I41a33 = Parameter(name = 'I41a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*ye3x3*complexconjugate(Rn3x3)*complexconjugate(ye3x3)', + texname = '\\text{I41a33}') + +I41a36 = Parameter(name = 'I41a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*ye3x3*complexconjugate(Rn3x3)*complexconjugate(ye3x3)', + texname = '\\text{I41a36}') + +I42a33 = Parameter(name = 'I42a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x6*ye3x3*complexconjugate(Rn3x3)', + texname = '\\text{I42a33}') + +I42a36 = Parameter(name = 'I42a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x6*ye3x3*complexconjugate(Rn3x3)', + texname = '\\text{I42a36}') + +I43a11 = Parameter(name = 'I43a11', + nature = 'internal', + type = 'complex', + value = 'Rn1x1', + texname = '\\text{I43a11}') + +I43a22 = Parameter(name = 'I43a22', + nature = 'internal', + type = 'complex', + value = 'Rn2x2', + texname = '\\text{I43a22}') + +I43a33 = Parameter(name = 'I43a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3', + texname = '\\text{I43a33}') + +I44a33 = Parameter(name = 'I44a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(ye3x3)', + texname = '\\text{I44a33}') + +I45a11 = Parameter(name = 'I45a11', + nature = 'internal', + type = 'complex', + value = 'Rn1x1*complexconjugate(Rl1x1)', + texname = '\\text{I45a11}') + +I45a22 = Parameter(name = 'I45a22', + nature = 'internal', + type = 'complex', + value = 'Rn2x2*complexconjugate(Rl2x2)', + texname = '\\text{I45a22}') + +I45a33 = Parameter(name = 'I45a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl3x3)', + texname = '\\text{I45a33}') + +I45a36 = Parameter(name = 'I45a36', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl6x3)', + texname = '\\text{I45a36}') + +I46a33 = Parameter(name = 'I46a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl3x6)*complexconjugate(te3x3)', + texname = '\\text{I46a33}') + +I46a36 = Parameter(name = 'I46a36', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl6x6)*complexconjugate(te3x3)', + texname = '\\text{I46a36}') + +I47a33 = Parameter(name = 'I47a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I47a33}') + +I47a36 = Parameter(name = 'I47a36', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I47a36}') + +I48a33 = Parameter(name = 'I48a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*ye3x3*complexconjugate(Rl3x3)*complexconjugate(ye3x3)', + texname = '\\text{I48a33}') + +I48a36 = Parameter(name = 'I48a36', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*ye3x3*complexconjugate(Rl6x3)*complexconjugate(ye3x3)', + texname = '\\text{I48a36}') + +I49a33 = Parameter(name = 'I49a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I49a33}') + +I49a36 = Parameter(name = 'I49a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I49a36}') + +I5a33 = Parameter(name = 'I5a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(ye3x3)', + texname = '\\text{I5a33}') + +I50a33 = Parameter(name = 'I50a33', + nature = 'internal', + type = 'complex', + value = 'yu3x3*complexconjugate(Ru3x3)', + texname = '\\text{I50a33}') + +I50a36 = Parameter(name = 'I50a36', + nature = 'internal', + type = 'complex', + value = 'yu3x3*complexconjugate(Ru6x3)', + texname = '\\text{I50a36}') + +I51a11 = Parameter(name = 'I51a11', + nature = 'internal', + type = 'complex', + value = 'Ru1x1*complexconjugate(Ru1x1)', + texname = '\\text{I51a11}') + +I51a22 = Parameter(name = 'I51a22', + nature = 'internal', + type = 'complex', + value = 'Ru2x2*complexconjugate(Ru2x2)', + texname = '\\text{I51a22}') + +I51a33 = Parameter(name = 'I51a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru3x3)', + texname = '\\text{I51a33}') + +I51a36 = Parameter(name = 'I51a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru3x3)', + texname = '\\text{I51a36}') + +I51a63 = Parameter(name = 'I51a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru6x3)', + texname = '\\text{I51a63}') + +I51a66 = Parameter(name = 'I51a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru6x3)', + texname = '\\text{I51a66}') + +I52a33 = Parameter(name = 'I52a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*complexconjugate(Ru3x6)', + texname = '\\text{I52a33}') + +I52a36 = Parameter(name = 'I52a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*complexconjugate(Ru3x6)', + texname = '\\text{I52a36}') + +I52a44 = Parameter(name = 'I52a44', + nature = 'internal', + type = 'complex', + value = 'Ru4x4*complexconjugate(Ru4x4)', + texname = '\\text{I52a44}') + +I52a55 = Parameter(name = 'I52a55', + nature = 'internal', + type = 'complex', + value = 'Ru5x5*complexconjugate(Ru5x5)', + texname = '\\text{I52a55}') + +I52a63 = Parameter(name = 'I52a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*complexconjugate(Ru6x6)', + texname = '\\text{I52a63}') + +I52a66 = Parameter(name = 'I52a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*complexconjugate(Ru6x6)', + texname = '\\text{I52a66}') + +I53a11 = Parameter(name = 'I53a11', + nature = 'internal', + type = 'complex', + value = 'Rd1x1*complexconjugate(CKM1x1)*complexconjugate(Ru1x1)', + texname = '\\text{I53a11}') + +I53a22 = Parameter(name = 'I53a22', + nature = 'internal', + type = 'complex', + value = 'Rd2x2*complexconjugate(CKM2x2)*complexconjugate(Ru2x2)', + texname = '\\text{I53a22}') + +I53a33 = Parameter(name = 'I53a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I53a33}') + +I53a36 = Parameter(name = 'I53a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I53a36}') + +I53a63 = Parameter(name = 'I53a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I53a63}') + +I53a66 = Parameter(name = 'I53a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I53a66}') + +I54a33 = Parameter(name = 'I54a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I54a33}') + +I54a36 = Parameter(name = 'I54a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I54a36}') + +I54a63 = Parameter(name = 'I54a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I54a63}') + +I54a66 = Parameter(name = 'I54a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I54a66}') + +I55a33 = Parameter(name = 'I55a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(tu3x3)', + texname = '\\text{I55a33}') + +I55a36 = Parameter(name = 'I55a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(tu3x3)', + texname = '\\text{I55a36}') + +I55a63 = Parameter(name = 'I55a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(tu3x3)', + texname = '\\text{I55a63}') + +I55a66 = Parameter(name = 'I55a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(tu3x3)', + texname = '\\text{I55a66}') + +I56a33 = Parameter(name = 'I56a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*td3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I56a33}') + +I56a36 = Parameter(name = 'I56a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*td3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I56a36}') + +I56a63 = Parameter(name = 'I56a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*td3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I56a63}') + +I56a66 = Parameter(name = 'I56a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*td3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I56a66}') + +I57a33 = Parameter(name = 'I57a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)*complexconjugate(yd3x3)', + texname = '\\text{I57a33}') + +I57a36 = Parameter(name = 'I57a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)*complexconjugate(yd3x3)', + texname = '\\text{I57a36}') + +I57a63 = Parameter(name = 'I57a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)*complexconjugate(yd3x3)', + texname = '\\text{I57a63}') + +I57a66 = Parameter(name = 'I57a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)*complexconjugate(yd3x3)', + texname = '\\text{I57a66}') + +I58a33 = Parameter(name = 'I58a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I58a33}') + +I58a36 = Parameter(name = 'I58a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I58a36}') + +I58a63 = Parameter(name = 'I58a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I58a63}') + +I58a66 = Parameter(name = 'I58a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I58a66}') + +I59a33 = Parameter(name = 'I59a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I59a33}') + +I59a36 = Parameter(name = 'I59a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I59a36}') + +I59a63 = Parameter(name = 'I59a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I59a63}') + +I59a66 = Parameter(name = 'I59a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I59a66}') + +I6a33 = Parameter(name = 'I6a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I6a33}') + +I6a36 = Parameter(name = 'I6a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I6a36}') + +I60a33 = Parameter(name = 'I60a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*yu3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)*complexconjugate(yu3x3)', + texname = '\\text{I60a33}') + +I60a36 = Parameter(name = 'I60a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*yu3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)*complexconjugate(yu3x3)', + texname = '\\text{I60a36}') + +I60a63 = Parameter(name = 'I60a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*yu3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)*complexconjugate(yu3x3)', + texname = '\\text{I60a63}') + +I60a66 = Parameter(name = 'I60a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*yu3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)*complexconjugate(yu3x3)', + texname = '\\text{I60a66}') + +I61a33 = Parameter(name = 'I61a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(yu3x3)', + texname = '\\text{I61a33}') + +I61a36 = Parameter(name = 'I61a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(yu3x3)', + texname = '\\text{I61a36}') + +I62a33 = Parameter(name = 'I62a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*yu3x3', + texname = '\\text{I62a33}') + +I62a36 = Parameter(name = 'I62a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*yu3x3', + texname = '\\text{I62a36}') + +I63a11 = Parameter(name = 'I63a11', + nature = 'internal', + type = 'complex', + value = 'CKM1x1*Ru1x1', + texname = '\\text{I63a11}') + +I63a22 = Parameter(name = 'I63a22', + nature = 'internal', + type = 'complex', + value = 'CKM2x2*Ru2x2', + texname = '\\text{I63a22}') + +I63a33 = Parameter(name = 'I63a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3', + texname = '\\text{I63a33}') + +I63a36 = Parameter(name = 'I63a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3', + texname = '\\text{I63a36}') + +I64a33 = Parameter(name = 'I64a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(yd3x3)', + texname = '\\text{I64a33}') + +I64a36 = Parameter(name = 'I64a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(yd3x3)', + texname = '\\text{I64a36}') + +I65a33 = Parameter(name = 'I65a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*yu3x3', + texname = '\\text{I65a33}') + +I65a36 = Parameter(name = 'I65a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*yu3x3', + texname = '\\text{I65a36}') + +I66a11 = Parameter(name = 'I66a11', + nature = 'internal', + type = 'complex', + value = 'CKM1x1*Ru1x1*complexconjugate(Rd1x1)', + texname = '\\text{I66a11}') + +I66a22 = Parameter(name = 'I66a22', + nature = 'internal', + type = 'complex', + value = 'CKM2x2*Ru2x2*complexconjugate(Rd2x2)', + texname = '\\text{I66a22}') + +I66a33 = Parameter(name = 'I66a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd3x3)', + texname = '\\text{I66a33}') + +I66a36 = Parameter(name = 'I66a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd3x3)', + texname = '\\text{I66a36}') + +I66a63 = Parameter(name = 'I66a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd6x3)', + texname = '\\text{I66a63}') + +I66a66 = Parameter(name = 'I66a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd6x3)', + texname = '\\text{I66a66}') + +I67a33 = Parameter(name = 'I67a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd3x6)*complexconjugate(td3x3)', + texname = '\\text{I67a33}') + +I67a36 = Parameter(name = 'I67a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd3x6)*complexconjugate(td3x3)', + texname = '\\text{I67a36}') + +I67a63 = Parameter(name = 'I67a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd6x6)*complexconjugate(td3x3)', + texname = '\\text{I67a63}') + +I67a66 = Parameter(name = 'I67a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd6x6)*complexconjugate(td3x3)', + texname = '\\text{I67a66}') + +I68a33 = Parameter(name = 'I68a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I68a33}') + +I68a36 = Parameter(name = 'I68a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I68a36}') + +I68a63 = Parameter(name = 'I68a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I68a63}') + +I68a66 = Parameter(name = 'I68a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I68a66}') + +I69a33 = Parameter(name = 'I69a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*tu3x3*complexconjugate(Rd3x3)', + texname = '\\text{I69a33}') + +I69a36 = Parameter(name = 'I69a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*tu3x3*complexconjugate(Rd3x3)', + texname = '\\text{I69a36}') + +I69a63 = Parameter(name = 'I69a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*tu3x3*complexconjugate(Rd6x3)', + texname = '\\text{I69a63}') + +I69a66 = Parameter(name = 'I69a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*tu3x3*complexconjugate(Rd6x3)', + texname = '\\text{I69a66}') + +I7a33 = Parameter(name = 'I7a33', + nature = 'internal', + type = 'complex', + value = 'yd3x3*complexconjugate(Rd3x3)', + texname = '\\text{I7a33}') + +I7a36 = Parameter(name = 'I7a36', + nature = 'internal', + type = 'complex', + value = 'yd3x3*complexconjugate(Rd6x3)', + texname = '\\text{I7a36}') + +I70a33 = Parameter(name = 'I70a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*yd3x3*complexconjugate(Rd3x3)*complexconjugate(yd3x3)', + texname = '\\text{I70a33}') + +I70a36 = Parameter(name = 'I70a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*yd3x3*complexconjugate(Rd3x3)*complexconjugate(yd3x3)', + texname = '\\text{I70a36}') + +I70a63 = Parameter(name = 'I70a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*yd3x3*complexconjugate(Rd6x3)*complexconjugate(yd3x3)', + texname = '\\text{I70a63}') + +I70a66 = Parameter(name = 'I70a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*yd3x3*complexconjugate(Rd6x3)*complexconjugate(yd3x3)', + texname = '\\text{I70a66}') + +I71a33 = Parameter(name = 'I71a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*yu3x3*complexconjugate(Rd3x3)', + texname = '\\text{I71a33}') + +I71a36 = Parameter(name = 'I71a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*yu3x3*complexconjugate(Rd3x3)', + texname = '\\text{I71a36}') + +I71a63 = Parameter(name = 'I71a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*yu3x3*complexconjugate(Rd6x3)', + texname = '\\text{I71a63}') + +I71a66 = Parameter(name = 'I71a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*yu3x3*complexconjugate(Rd6x3)', + texname = '\\text{I71a66}') + +I72a33 = Parameter(name = 'I72a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*yu3x3*complexconjugate(Rd3x3)*complexconjugate(yu3x3)', + texname = '\\text{I72a33}') + +I72a36 = Parameter(name = 'I72a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*yu3x3*complexconjugate(Rd3x3)*complexconjugate(yu3x3)', + texname = '\\text{I72a36}') + +I72a63 = Parameter(name = 'I72a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*yu3x3*complexconjugate(Rd6x3)*complexconjugate(yu3x3)', + texname = '\\text{I72a63}') + +I72a66 = Parameter(name = 'I72a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*yu3x3*complexconjugate(Rd6x3)*complexconjugate(yu3x3)', + texname = '\\text{I72a66}') + +I73a33 = Parameter(name = 'I73a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*yu3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I73a33}') + +I73a36 = Parameter(name = 'I73a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*yu3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I73a36}') + +I73a63 = Parameter(name = 'I73a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x6*yu3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I73a63}') + +I73a66 = Parameter(name = 'I73a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x6*yu3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I73a66}') + +I74a11 = Parameter(name = 'I74a11', + nature = 'internal', + type = 'complex', + value = 'Ru1x1*complexconjugate(Ru1x1)', + texname = '\\text{I74a11}') + +I74a22 = Parameter(name = 'I74a22', + nature = 'internal', + type = 'complex', + value = 'Ru2x2*complexconjugate(Ru2x2)', + texname = '\\text{I74a22}') + +I74a33 = Parameter(name = 'I74a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru3x3)', + texname = '\\text{I74a33}') + +I74a36 = Parameter(name = 'I74a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru3x3)', + texname = '\\text{I74a36}') + +I74a63 = Parameter(name = 'I74a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru6x3)', + texname = '\\text{I74a63}') + +I74a66 = Parameter(name = 'I74a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru6x3)', + texname = '\\text{I74a66}') + +I75a33 = Parameter(name = 'I75a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*complexconjugate(Ru3x6)', + texname = '\\text{I75a33}') + +I75a36 = Parameter(name = 'I75a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*complexconjugate(Ru3x6)', + texname = '\\text{I75a36}') + +I75a44 = Parameter(name = 'I75a44', + nature = 'internal', + type = 'complex', + value = 'Ru4x4*complexconjugate(Ru4x4)', + texname = '\\text{I75a44}') + +I75a55 = Parameter(name = 'I75a55', + nature = 'internal', + type = 'complex', + value = 'Ru5x5*complexconjugate(Ru5x5)', + texname = '\\text{I75a55}') + +I75a63 = Parameter(name = 'I75a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*complexconjugate(Ru6x6)', + texname = '\\text{I75a63}') + +I75a66 = Parameter(name = 'I75a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*complexconjugate(Ru6x6)', + texname = '\\text{I75a66}') + +I76a33 = Parameter(name = 'I76a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I76a33}') + +I76a36 = Parameter(name = 'I76a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I76a36}') + +I76a63 = Parameter(name = 'I76a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I76a63}') + +I76a66 = Parameter(name = 'I76a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I76a66}') + +I77a33 = Parameter(name = 'I77a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru3x6)*complexconjugate(tu3x3)', + texname = '\\text{I77a33}') + +I77a36 = Parameter(name = 'I77a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru3x6)*complexconjugate(tu3x3)', + texname = '\\text{I77a36}') + +I77a63 = Parameter(name = 'I77a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru6x6)*complexconjugate(tu3x3)', + texname = '\\text{I77a63}') + +I77a66 = Parameter(name = 'I77a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru6x6)*complexconjugate(tu3x3)', + texname = '\\text{I77a66}') + +I78a33 = Parameter(name = 'I78a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*tu3x3*complexconjugate(Ru3x3)', + texname = '\\text{I78a33}') + +I78a36 = Parameter(name = 'I78a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*tu3x3*complexconjugate(Ru3x3)', + texname = '\\text{I78a36}') + +I78a63 = Parameter(name = 'I78a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*tu3x3*complexconjugate(Ru6x3)', + texname = '\\text{I78a63}') + +I78a66 = Parameter(name = 'I78a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*tu3x3*complexconjugate(Ru6x3)', + texname = '\\text{I78a66}') + +I79a33 = Parameter(name = 'I79a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*yu3x3*complexconjugate(Ru3x3)', + texname = '\\text{I79a33}') + +I79a36 = Parameter(name = 'I79a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*yu3x3*complexconjugate(Ru3x3)', + texname = '\\text{I79a36}') + +I79a63 = Parameter(name = 'I79a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*yu3x3*complexconjugate(Ru6x3)', + texname = '\\text{I79a63}') + +I79a66 = Parameter(name = 'I79a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*yu3x3*complexconjugate(Ru6x3)', + texname = '\\text{I79a66}') + +I8a11 = Parameter(name = 'I8a11', + nature = 'internal', + type = 'complex', + value = 'Rd1x1*complexconjugate(Rd1x1)', + texname = '\\text{I8a11}') + +I8a22 = Parameter(name = 'I8a22', + nature = 'internal', + type = 'complex', + value = 'Rd2x2*complexconjugate(Rd2x2)', + texname = '\\text{I8a22}') + +I8a33 = Parameter(name = 'I8a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd3x3)', + texname = '\\text{I8a33}') + +I8a36 = Parameter(name = 'I8a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd3x3)', + texname = '\\text{I8a36}') + +I8a63 = Parameter(name = 'I8a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd6x3)', + texname = '\\text{I8a63}') + +I8a66 = Parameter(name = 'I8a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd6x3)', + texname = '\\text{I8a66}') + +I80a33 = Parameter(name = 'I80a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*yu3x3*complexconjugate(Ru3x3)*complexconjugate(yu3x3)', + texname = '\\text{I80a33}') + +I80a36 = Parameter(name = 'I80a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*yu3x3*complexconjugate(Ru3x3)*complexconjugate(yu3x3)', + texname = '\\text{I80a36}') + +I80a63 = Parameter(name = 'I80a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*yu3x3*complexconjugate(Ru6x3)*complexconjugate(yu3x3)', + texname = '\\text{I80a63}') + +I80a66 = Parameter(name = 'I80a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*yu3x3*complexconjugate(Ru6x3)*complexconjugate(yu3x3)', + texname = '\\text{I80a66}') + +I81a33 = Parameter(name = 'I81a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*yu3x3*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I81a33}') + +I81a36 = Parameter(name = 'I81a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*yu3x3*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I81a36}') + +I81a63 = Parameter(name = 'I81a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x6*yu3x3*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I81a63}') + +I81a66 = Parameter(name = 'I81a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x6*yu3x3*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I81a66}') + +I82a11 = Parameter(name = 'I82a11', + nature = 'internal', + type = 'complex', + value = 'CKM1x1*complexconjugate(Rd1x1)', + texname = '\\text{I82a11}') + +I82a22 = Parameter(name = 'I82a22', + nature = 'internal', + type = 'complex', + value = 'CKM2x2*complexconjugate(Rd2x2)', + texname = '\\text{I82a22}') + +I82a33 = Parameter(name = 'I82a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*complexconjugate(Rd3x3)', + texname = '\\text{I82a33}') + +I82a36 = Parameter(name = 'I82a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*complexconjugate(Rd6x3)', + texname = '\\text{I82a36}') + +I83a33 = Parameter(name = 'I83a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*complexconjugate(Rd3x6)*complexconjugate(yd3x3)', + texname = '\\text{I83a33}') + +I83a36 = Parameter(name = 'I83a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*complexconjugate(Rd6x6)*complexconjugate(yd3x3)', + texname = '\\text{I83a36}') + +I84a33 = Parameter(name = 'I84a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*yu3x3*complexconjugate(Rd3x3)', + texname = '\\text{I84a33}') + +I84a36 = Parameter(name = 'I84a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*yu3x3*complexconjugate(Rd6x3)', + texname = '\\text{I84a36}') + +I85a11 = Parameter(name = 'I85a11', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl1x1)', + texname = '\\text{I85a11}') + +I85a22 = Parameter(name = 'I85a22', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl2x2)', + texname = '\\text{I85a22}') + +I85a33 = Parameter(name = 'I85a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl3x3)', + texname = '\\text{I85a33}') + +I85a36 = Parameter(name = 'I85a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl6x3)', + texname = '\\text{I85a36}') + +I86a33 = Parameter(name = 'I86a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl3x6)*complexconjugate(ye3x3)', + texname = '\\text{I86a33}') + +I86a36 = Parameter(name = 'I86a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rl6x6)*complexconjugate(ye3x3)', + texname = '\\text{I86a36}') + +I87a11 = Parameter(name = 'I87a11', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rn1x1)', + texname = '\\text{I87a11}') + +I87a22 = Parameter(name = 'I87a22', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rn2x2)', + texname = '\\text{I87a22}') + +I87a33 = Parameter(name = 'I87a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(Rn3x3)', + texname = '\\text{I87a33}') + +I88a33 = Parameter(name = 'I88a33', + nature = 'internal', + type = 'complex', + value = 'ye3x3*complexconjugate(Rn3x3)', + texname = '\\text{I88a33}') + +I89a11 = Parameter(name = 'I89a11', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM1x1)*complexconjugate(Ru1x1)', + texname = '\\text{I89a11}') + +I89a22 = Parameter(name = 'I89a22', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM2x2)*complexconjugate(Ru2x2)', + texname = '\\text{I89a22}') + +I89a33 = Parameter(name = 'I89a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I89a33}') + +I89a36 = Parameter(name = 'I89a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I89a36}') + +I9a33 = Parameter(name = 'I9a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*complexconjugate(Rd3x6)', + texname = '\\text{I9a33}') + +I9a36 = Parameter(name = 'I9a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*complexconjugate(Rd3x6)', + texname = '\\text{I9a36}') + +I9a44 = Parameter(name = 'I9a44', + nature = 'internal', + type = 'complex', + value = 'Rd4x4*complexconjugate(Rd4x4)', + texname = '\\text{I9a44}') + +I9a55 = Parameter(name = 'I9a55', + nature = 'internal', + type = 'complex', + value = 'Rd5x5*complexconjugate(Rd5x5)', + texname = '\\text{I9a55}') + +I9a63 = Parameter(name = 'I9a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x6*complexconjugate(Rd6x6)', + texname = '\\text{I9a63}') + +I9a66 = Parameter(name = 'I9a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x6*complexconjugate(Rd6x6)', + texname = '\\text{I9a66}') + +I90a33 = Parameter(name = 'I90a33', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM3x3)*complexconjugate(Ru3x6)*complexconjugate(yu3x3)', + texname = '\\text{I90a33}') + +I90a36 = Parameter(name = 'I90a36', + nature = 'internal', + type = 'complex', + value = 'complexconjugate(CKM3x3)*complexconjugate(Ru6x6)*complexconjugate(yu3x3)', + texname = '\\text{I90a36}') + +I91a33 = Parameter(name = 'I91a33', + nature = 'internal', + type = 'complex', + value = 'yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I91a33}') + +I91a36 = Parameter(name = 'I91a36', + nature = 'internal', + type = 'complex', + value = 'yd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I91a36}') + +I92a11 = Parameter(name = 'I92a11', + nature = 'internal', + type = 'complex', + value = 'CKM1x1*Ru1x1*complexconjugate(Rd1x1)', + texname = '\\text{I92a11}') + +I92a22 = Parameter(name = 'I92a22', + nature = 'internal', + type = 'complex', + value = 'CKM2x2*Ru2x2*complexconjugate(Rd2x2)', + texname = '\\text{I92a22}') + +I92a33 = Parameter(name = 'I92a33', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd3x3)', + texname = '\\text{I92a33}') + +I92a36 = Parameter(name = 'I92a36', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd3x3)', + texname = '\\text{I92a36}') + +I92a63 = Parameter(name = 'I92a63', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru3x3*complexconjugate(Rd6x3)', + texname = '\\text{I92a63}') + +I92a66 = Parameter(name = 'I92a66', + nature = 'internal', + type = 'complex', + value = 'CKM3x3*Ru6x3*complexconjugate(Rd6x3)', + texname = '\\text{I92a66}') + +I93a11 = Parameter(name = 'I93a11', + nature = 'internal', + type = 'complex', + value = 'Rn1x1*complexconjugate(Rl1x1)', + texname = '\\text{I93a11}') + +I93a22 = Parameter(name = 'I93a22', + nature = 'internal', + type = 'complex', + value = 'Rn2x2*complexconjugate(Rl2x2)', + texname = '\\text{I93a22}') + +I93a33 = Parameter(name = 'I93a33', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl3x3)', + texname = '\\text{I93a33}') + +I93a36 = Parameter(name = 'I93a36', + nature = 'internal', + type = 'complex', + value = 'Rn3x3*complexconjugate(Rl6x3)', + texname = '\\text{I93a36}') + +I94a11 = Parameter(name = 'I94a11', + nature = 'internal', + type = 'complex', + value = 'Rd1x1*complexconjugate(CKM1x1)*complexconjugate(Ru1x1)', + texname = '\\text{I94a11}') + +I94a22 = Parameter(name = 'I94a22', + nature = 'internal', + type = 'complex', + value = 'Rd2x2*complexconjugate(CKM2x2)*complexconjugate(Ru2x2)', + texname = '\\text{I94a22}') + +I94a33 = Parameter(name = 'I94a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I94a33}') + +I94a36 = Parameter(name = 'I94a36', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I94a36}') + +I94a63 = Parameter(name = 'I94a63', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru3x3)', + texname = '\\text{I94a63}') + +I94a66 = Parameter(name = 'I94a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(CKM3x3)*complexconjugate(Ru6x3)', + texname = '\\text{I94a66}') + +I95a11 = Parameter(name = 'I95a11', + nature = 'internal', + type = 'complex', + value = 'Rl1x1*complexconjugate(Rn1x1)', + texname = '\\text{I95a11}') + +I95a22 = Parameter(name = 'I95a22', + nature = 'internal', + type = 'complex', + value = 'Rl2x2*complexconjugate(Rn2x2)', + texname = '\\text{I95a22}') + +I95a33 = Parameter(name = 'I95a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rn3x3)', + texname = '\\text{I95a33}') + +I95a36 = Parameter(name = 'I95a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rn3x3)', + texname = '\\text{I95a36}') + +I96a11 = Parameter(name = 'I96a11', + nature = 'internal', + type = 'complex', + value = 'Rd1x1*complexconjugate(Rd1x1)', + texname = '\\text{I96a11}') + +I96a22 = Parameter(name = 'I96a22', + nature = 'internal', + type = 'complex', + value = 'Rd2x2*complexconjugate(Rd2x2)', + texname = '\\text{I96a22}') + +I96a33 = Parameter(name = 'I96a33', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd3x3)', + texname = '\\text{I96a33}') + +I96a36 = Parameter(name = 'I96a36', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd3x3)', + texname = '\\text{I96a36}') + +I96a63 = Parameter(name = 'I96a63', + nature = 'internal', + type = 'complex', + value = 'Rd3x3*complexconjugate(Rd6x3)', + texname = '\\text{I96a63}') + +I96a66 = Parameter(name = 'I96a66', + nature = 'internal', + type = 'complex', + value = 'Rd6x3*complexconjugate(Rd6x3)', + texname = '\\text{I96a66}') + +I97a11 = Parameter(name = 'I97a11', + nature = 'internal', + type = 'complex', + value = 'Rl1x1*complexconjugate(Rl1x1)', + texname = '\\text{I97a11}') + +I97a22 = Parameter(name = 'I97a22', + nature = 'internal', + type = 'complex', + value = 'Rl2x2*complexconjugate(Rl2x2)', + texname = '\\text{I97a22}') + +I97a33 = Parameter(name = 'I97a33', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl3x3)', + texname = '\\text{I97a33}') + +I97a36 = Parameter(name = 'I97a36', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl3x3)', + texname = '\\text{I97a36}') + +I97a63 = Parameter(name = 'I97a63', + nature = 'internal', + type = 'complex', + value = 'Rl3x3*complexconjugate(Rl6x3)', + texname = '\\text{I97a63}') + +I97a66 = Parameter(name = 'I97a66', + nature = 'internal', + type = 'complex', + value = 'Rl6x3*complexconjugate(Rl6x3)', + texname = '\\text{I97a66}') + +I98a11 = Parameter(name = 'I98a11', + nature = 'internal', + type = 'complex', + value = 'Ru1x1*complexconjugate(Ru1x1)', + texname = '\\text{I98a11}') + +I98a22 = Parameter(name = 'I98a22', + nature = 'internal', + type = 'complex', + value = 'Ru2x2*complexconjugate(Ru2x2)', + texname = '\\text{I98a22}') + +I98a33 = Parameter(name = 'I98a33', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru3x3)', + texname = '\\text{I98a33}') + +I98a36 = Parameter(name = 'I98a36', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru3x3)', + texname = '\\text{I98a36}') + +I98a63 = Parameter(name = 'I98a63', + nature = 'internal', + type = 'complex', + value = 'Ru3x3*complexconjugate(Ru6x3)', + texname = '\\text{I98a63}') + +I98a66 = Parameter(name = 'I98a66', + nature = 'internal', + type = 'complex', + value = 'Ru6x3*complexconjugate(Ru6x3)', + texname = '\\text{I98a66}') + +I99a33 = Parameter(name = 'I99a33', + nature = 'internal', + type = 'complex', + value = 'ye3x3', + texname = '\\text{I99a33}') + Index: trunk/omega/tests/UFO/MSSM/write_param_card.py =================================================================== --- trunk/omega/tests/UFO/MSSM/write_param_card.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/write_param_card.py (revision 8416) @@ -0,0 +1,182 @@ +from __future__ import division +__date__ = "10 Dec 2012" +__author__ = 'olivier.mattelaer@uclouvain.be' + +from function_library import * + + +class ParamCardWriter(object): + + header = \ + """######################################################################\n""" + \ + """## PARAM_CARD AUTOMATICALY GENERATED BY THE UFO #####################\n""" + \ + """######################################################################\n""" + + def __init__(self, filename, list_of_parameters=None, generic=False): + """write a valid param_card.dat""" + + if not list_of_parameters: + from parameters import all_parameters + list_of_parameters = [param for param in all_parameters if \ + param.nature=='external'] + + self.generic_output = generic + if generic: + self.define_not_dep_param(list_of_parameters) + + + self.fsock = open(filename, 'w') + self.fsock.write(self.header) + + self.write_card(list_of_parameters) + self.fsock.close() + + def define_not_dep_param(self, list_of_parameters): + """define self.dep_mass and self.dep_width in case that they are + requested in the param_card.dat""" + from particles import all_particles + + self.dep_mass = [(part, part.mass) for part in all_particles \ + if part.pdg_code > 0 and \ + part.mass not in list_of_parameters] + self.dep_width = [(part, part.width) for part in all_particles\ + if part.pdg_code > 0 and \ + part.width not in list_of_parameters] + + @staticmethod + def order_param(obj1, obj2): + """ order parameter of a given block """ + + maxlen = min([len(obj1.lhacode), len(obj2.lhacode)]) + + for i in range(maxlen): + if obj1.lhacode[i] < obj2.lhacode[i]: + return -1 + elif obj1.lhacode[i] == obj2.lhacode[i]: + return 0 + else: + return 1 + #identical up to the first finish + if len(obj1.lhacode) > len(obj2.lhacode): + return 1 + elif len(obj1.lhacode) == len(obj2.lhacode): + return 0 + else: + return -1 + + def write_card(self, all_ext_param): + """ """ + + # list all lhablock + all_lhablock = set([param.lhablock for param in all_ext_param]) + + # ordonate lhablock alphabeticaly + all_lhablock = list(all_lhablock) + all_lhablock.sort() + # put at the beginning SMINPUT + MASS + DECAY + for name in ['DECAY', 'MASS','SMINPUTS']: + if name in all_lhablock: + all_lhablock.remove(name) + all_lhablock.insert(0, name) + + for lhablock in all_lhablock: + self.write_block(lhablock) + need_writing = [ param for param in all_ext_param if \ + param.lhablock == lhablock] + need_writing.sort(self.order_param) + [self.write_param(param, lhablock) for param in need_writing] + + if self.generic_output: + if lhablock in ['MASS', 'DECAY']: + self.write_dep_param_block(lhablock) + + if self.generic_output: + self.write_qnumber() + + def write_block(self, name): + """ write a comment for a block""" + + self.fsock.writelines( + """\n###################################""" + \ + """\n## INFORMATION FOR %s""" % name.upper() +\ + """\n###################################\n""" + ) + if name!='DECAY': + self.fsock.write("""Block %s \n""" % name) + + def write_param(self, param, lhablock): + + lhacode=' '.join(['%3s' % key for key in param.lhacode]) + if lhablock != 'DECAY': + text = """ %s %e # %s \n""" % (lhacode, complex(param.value).real, param.name ) + else: + text = '''DECAY %s %e \n''' % (lhacode, complex(param.value).real) + self.fsock.write(text) + + + + + def write_dep_param_block(self, lhablock): + import cmath + from parameters import all_parameters + for parameter in all_parameters: + exec("%s = %s" % (parameter.name, parameter.value)) + text = "## Not dependent paramater.\n" + text += "## Those values should be edited following analytical the \n" + text += "## analytical expression. Some generator could simply ignore \n" + text += "## those values and use the analytical expression\n" + + if lhablock == 'MASS': + data = self.dep_mass + prefix = " " + else: + data = self.dep_width + prefix = "DECAY " + for part, param in data: + if isinstance(param.value, str): + value = complex(eval(param.value)).real + else: + value = param.value + + text += """%s %s %f # %s : %s \n""" %(prefix, part.pdg_code, + value, part.name, param.value) + self.fsock.write(text) + + sm_pdg = [1,2,3,4,5,6,11,12,13,13,14,15,16,21,22,23,24,25] + data="""Block QNUMBERS %(pdg)d # %(name)s + 1 %(charge)d # 3 times electric charge + 2 %(spin)d # number of spin states (2S+1) + 3 %(color)d # colour rep (1: singlet, 3: triplet, 8: octet) + 4 %(antipart)d # Particle/Antiparticle distinction (0=own anti)\n""" + + def write_qnumber(self): + """ write qnumber """ + from particles import all_particles + import particles + print particles.__file__ + text="""#===========================================================\n""" + text += """# QUANTUM NUMBERS OF NEW STATE(S) (NON SM PDG CODE)\n""" + text += """#===========================================================\n\n""" + + for part in all_particles: + if part.pdg_code in self.sm_pdg or part.pdg_code < 0: + continue + text += self.data % {'pdg': part.pdg_code, + 'name': part.name, + 'charge': 3 * part.charge, + 'spin': part.spin, + 'color': part.color, + 'antipart': part.name != part.antiname and 1 or 0} + + self.fsock.write(text) + + + + + + + +if '__main__' == __name__: + ParamCardWriter('./param_card.dat', generic=True) + print 'write ./param_card.dat' + Index: trunk/omega/tests/UFO/MSSM/vertices.py =================================================================== --- trunk/omega/tests/UFO/MSSM/vertices.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/vertices.py (revision 8416) @@ -0,0 +1,5843 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:07 + + +from object_library import all_vertices, Vertex +import particles as P +import couplings as C +import lorentz as L + + +V_1 = Vertex(name = 'V_1', + particles = [ P.h01, P.h01, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_869}) + +V_2 = Vertex(name = 'V_2', + particles = [ P.h02, P.h02, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_870}) + +V_3 = Vertex(name = 'V_3', + particles = [ P.h01, P.h01, P.h01 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_868}) + +V_4 = Vertex(name = 'V_4', + particles = [ P.h01, P.h02, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_867}) + +V_5 = Vertex(name = 'V_5', + particles = [ P.a, P.a, P.G__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1065}) + +V_6 = Vertex(name = 'V_6', + particles = [ P.a, P.a, P.H__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1065}) + +V_7 = Vertex(name = 'V_7', + particles = [ P.G__plus__, P.H__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1082}) + +V_8 = Vertex(name = 'V_8', + particles = [ P.A0, P.A0, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1081}) + +V_9 = Vertex(name = 'V_9', + particles = [ P.G0, P.G0, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1083}) + +V_10 = Vertex(name = 'V_10', + particles = [ P.G__minus__, P.G__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1084}) + +V_11 = Vertex(name = 'V_11', + particles = [ P.G__minus__, P.h01, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1082}) + +V_12 = Vertex(name = 'V_12', + particles = [ P.H__minus__, P.h02, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1085}) + +V_13 = Vertex(name = 'V_13', + particles = [ P.A0, P.A0, P.h01 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1076}) + +V_14 = Vertex(name = 'V_14', + particles = [ P.G0, P.G0, P.h01 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1079}) + +V_15 = Vertex(name = 'V_15', + particles = [ P.G__minus__, P.G__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1078}) + +V_16 = Vertex(name = 'V_16', + particles = [ P.G__plus__, P.H__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1080}) + +V_17 = Vertex(name = 'V_17', + particles = [ P.H__minus__, P.h01, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1077}) + +V_18 = Vertex(name = 'V_18', + particles = [ P.G__minus__, P.h02, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1080}) + +V_19 = Vertex(name = 'V_19', + particles = [ P.A0, P.G__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1089}) + +V_20 = Vertex(name = 'V_20', + particles = [ P.A0, P.G__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1088}) + +V_21 = Vertex(name = 'V_21', + particles = [ P.G0, P.G__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1087}) + +V_22 = Vertex(name = 'V_22', + particles = [ P.G0, P.G__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1086}) + +V_23 = Vertex(name = 'V_23', + particles = [ P.a, P.G__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1064}) + +V_24 = Vertex(name = 'V_24', + particles = [ P.a, P.H__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1064}) + +V_25 = Vertex(name = 'V_25', + particles = [ P.ghA, P.ghWm__tilde__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_3}) + +V_26 = Vertex(name = 'V_26', + particles = [ P.ghA, P.ghWp__tilde__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_4}) + +V_27 = Vertex(name = 'V_27', + particles = [ P.ghWm, P.ghA__tilde__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_964}) + +V_28 = Vertex(name = 'V_28', + particles = [ P.ghWm, P.ghA__tilde__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_940}) + +V_29 = Vertex(name = 'V_29', + particles = [ P.ghWm, P.ghA__tilde__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_3}) + +V_30 = Vertex(name = 'V_30', + particles = [ P.ghWm, P.ghWm__tilde__, P.h02 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_796}) + +V_31 = Vertex(name = 'V_31', + particles = [ P.ghWm, P.ghWm__tilde__, P.h01 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_771}) + +V_32 = Vertex(name = 'V_32', + particles = [ P.ghWm, P.ghWm__tilde__, P.G0 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_946}) + +V_33 = Vertex(name = 'V_33', + particles = [ P.ghWm, P.ghWm__tilde__, P.A0 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_924}) + +V_34 = Vertex(name = 'V_34', + particles = [ P.ghWm, P.ghWm__tilde__, P.a ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_4}) + +V_35 = Vertex(name = 'V_35', + particles = [ P.ghWm, P.ghWm__tilde__, P.Z ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_148}) + +V_36 = Vertex(name = 'V_36', + particles = [ P.ghWm, P.ghZ__tilde__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_948}) + +V_37 = Vertex(name = 'V_37', + particles = [ P.ghWm, P.ghZ__tilde__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_926}) + +V_38 = Vertex(name = 'V_38', + particles = [ P.ghWm, P.ghZ__tilde__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_147}) + +V_39 = Vertex(name = 'V_39', + particles = [ P.ghWp, P.ghA__tilde__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_964}) + +V_40 = Vertex(name = 'V_40', + particles = [ P.ghWp, P.ghA__tilde__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_940}) + +V_41 = Vertex(name = 'V_41', + particles = [ P.ghWp, P.ghA__tilde__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_4}) + +V_42 = Vertex(name = 'V_42', + particles = [ P.ghWp, P.ghWp__tilde__, P.h02 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_796}) + +V_43 = Vertex(name = 'V_43', + particles = [ P.ghWp, P.ghWp__tilde__, P.h01 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_771}) + +V_44 = Vertex(name = 'V_44', + particles = [ P.ghWp, P.ghWp__tilde__, P.G0 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_947}) + +V_45 = Vertex(name = 'V_45', + particles = [ P.ghWp, P.ghWp__tilde__, P.A0 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_923}) + +V_46 = Vertex(name = 'V_46', + particles = [ P.ghWp, P.ghWp__tilde__, P.a ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_3}) + +V_47 = Vertex(name = 'V_47', + particles = [ P.ghWp, P.ghWp__tilde__, P.Z ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_147}) + +V_48 = Vertex(name = 'V_48', + particles = [ P.ghWp, P.ghZ__tilde__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_948}) + +V_49 = Vertex(name = 'V_49', + particles = [ P.ghWp, P.ghZ__tilde__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_926}) + +V_50 = Vertex(name = 'V_50', + particles = [ P.ghWp, P.ghZ__tilde__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_148}) + +V_51 = Vertex(name = 'V_51', + particles = [ P.ghZ, P.ghWm__tilde__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_949}) + +V_52 = Vertex(name = 'V_52', + particles = [ P.ghZ, P.ghWm__tilde__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_925}) + +V_53 = Vertex(name = 'V_53', + particles = [ P.ghZ, P.ghWm__tilde__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_147}) + +V_54 = Vertex(name = 'V_54', + particles = [ P.ghZ, P.ghWp__tilde__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_949}) + +V_55 = Vertex(name = 'V_55', + particles = [ P.ghZ, P.ghWp__tilde__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_925}) + +V_56 = Vertex(name = 'V_56', + particles = [ P.ghZ, P.ghWp__tilde__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_148}) + +V_57 = Vertex(name = 'V_57', + particles = [ P.ghZ, P.ghZ__tilde__, P.h02 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_798}) + +V_58 = Vertex(name = 'V_58', + particles = [ P.ghZ, P.ghZ__tilde__, P.h01 ], + color = [ '1' ], + lorentz = [ L.UUS1 ], + couplings = {(0,0):C.GC_773}) + +V_59 = Vertex(name = 'V_59', + particles = [ P.ghG, P.ghG__tilde__, P.g ], + color = [ 'f(1,2,3)' ], + lorentz = [ L.UUV1 ], + couplings = {(0,0):C.GC_6}) + +V_60 = Vertex(name = 'V_60', + particles = [ P.g, P.g, P.g ], + color = [ 'f(1,2,3)' ], + lorentz = [ L.VVV1 ], + couplings = {(0,0):C.GC_6}) + +V_61 = Vertex(name = 'V_61', + particles = [ P.g, P.g, P.g, P.g ], + color = [ 'f(-1,1,2)*f(3,4,-1)', 'f(-1,1,3)*f(2,4,-1)', 'f(-1,1,4)*f(2,3,-1)' ], + lorentz = [ L.VVVV1, L.VVVV3, L.VVVV4 ], + couplings = {(1,1):C.GC_9,(0,0):C.GC_9,(2,2):C.GC_9}) + +V_62 = Vertex(name = 'V_62', + particles = [ P.x1__minus__, P.x1__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_859,(0,1):C.GC_819}) + +V_63 = Vertex(name = 'V_63', + particles = [ P.x2__minus__, P.x1__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_863,(0,1):C.GC_820}) + +V_64 = Vertex(name = 'V_64', + particles = [ P.x1__minus__, P.x2__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_860,(0,1):C.GC_823}) + +V_65 = Vertex(name = 'V_65', + particles = [ P.x2__minus__, P.x2__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_864,(0,1):C.GC_824}) + +V_66 = Vertex(name = 'V_66', + particles = [ P.x1__minus__, P.x1__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_857,(0,1):C.GC_817}) + +V_67 = Vertex(name = 'V_67', + particles = [ P.x2__minus__, P.x1__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_861,(0,1):C.GC_818}) + +V_68 = Vertex(name = 'V_68', + particles = [ P.x1__minus__, P.x2__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_858,(0,1):C.GC_821}) + +V_69 = Vertex(name = 'V_69', + particles = [ P.x2__minus__, P.x2__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_862,(0,1):C.GC_822}) + +V_70 = Vertex(name = 'V_70', + particles = [ P.x1__minus__, P.x1__plus__, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1039,(0,1):C.GC_973}) + +V_71 = Vertex(name = 'V_71', + particles = [ P.x2__minus__, P.x1__plus__, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1047,(0,1):C.GC_974}) + +V_72 = Vertex(name = 'V_72', + particles = [ P.x1__minus__, P.x2__plus__, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1040,(0,1):C.GC_981}) + +V_73 = Vertex(name = 'V_73', + particles = [ P.x2__minus__, P.x2__plus__, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1048,(0,1):C.GC_982}) + +V_74 = Vertex(name = 'V_74', + particles = [ P.x1__minus__, P.x1__plus__, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1033,(0,1):C.GC_967}) + +V_75 = Vertex(name = 'V_75', + particles = [ P.x2__minus__, P.x1__plus__, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1041,(0,1):C.GC_968}) + +V_76 = Vertex(name = 'V_76', + particles = [ P.x1__minus__, P.x2__plus__, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1034,(0,1):C.GC_975}) + +V_77 = Vertex(name = 'V_77', + particles = [ P.x2__minus__, P.x2__plus__, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1042,(0,1):C.GC_976}) + +V_78 = Vertex(name = 'V_78', + particles = [ P.n1, P.x1__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_729,(0,1):C.GC_969}) + +V_79 = Vertex(name = 'V_79', + particles = [ P.n2, P.x1__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_730,(0,1):C.GC_970}) + +V_80 = Vertex(name = 'V_80', + particles = [ P.n3, P.x1__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_731,(0,1):C.GC_971}) + +V_81 = Vertex(name = 'V_81', + particles = [ P.n4, P.x1__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_732,(0,1):C.GC_972}) + +V_82 = Vertex(name = 'V_82', + particles = [ P.n1, P.x2__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_733,(0,1):C.GC_977}) + +V_83 = Vertex(name = 'V_83', + particles = [ P.n2, P.x2__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_734,(0,1):C.GC_978}) + +V_84 = Vertex(name = 'V_84', + particles = [ P.n3, P.x2__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_735,(0,1):C.GC_979}) + +V_85 = Vertex(name = 'V_85', + particles = [ P.n4, P.x2__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_736,(0,1):C.GC_980}) + +V_86 = Vertex(name = 'V_86', + particles = [ P.x1__minus__, P.n1, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_737,(0,1):C.GC_915}) + +V_87 = Vertex(name = 'V_87', + particles = [ P.x2__minus__, P.n1, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_741,(0,1):C.GC_919}) + +V_88 = Vertex(name = 'V_88', + particles = [ P.x1__minus__, P.n2, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_738,(0,1):C.GC_916}) + +V_89 = Vertex(name = 'V_89', + particles = [ P.x2__minus__, P.n2, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_742,(0,1):C.GC_920}) + +V_90 = Vertex(name = 'V_90', + particles = [ P.x1__minus__, P.n3, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_739,(0,1):C.GC_917}) + +V_91 = Vertex(name = 'V_91', + particles = [ P.x2__minus__, P.n3, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_743,(0,1):C.GC_921}) + +V_92 = Vertex(name = 'V_92', + particles = [ P.x1__minus__, P.n4, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_740,(0,1):C.GC_918}) + +V_93 = Vertex(name = 'V_93', + particles = [ P.x2__minus__, P.n4, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_744,(0,1):C.GC_922}) + +V_94 = Vertex(name = 'V_94', + particles = [ P.n1, P.n1, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_838,(0,1):C.GC_752}) + +V_95 = Vertex(name = 'V_95', + particles = [ P.n2, P.n1, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_841,(0,1):C.GC_755}) + +V_96 = Vertex(name = 'V_96', + particles = [ P.n3, P.n1, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_846,(0,1):C.GC_760}) + +V_97 = Vertex(name = 'V_97', + particles = [ P.n4, P.n1, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_853,(0,1):C.GC_767}) + +V_98 = Vertex(name = 'V_98', + particles = [ P.n2, P.n2, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_842,(0,1):C.GC_756}) + +V_99 = Vertex(name = 'V_99', + particles = [ P.n3, P.n2, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_847,(0,1):C.GC_761}) + +V_100 = Vertex(name = 'V_100', + particles = [ P.n4, P.n2, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_854,(0,1):C.GC_768}) + +V_101 = Vertex(name = 'V_101', + particles = [ P.n3, P.n3, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_848,(0,1):C.GC_762}) + +V_102 = Vertex(name = 'V_102', + particles = [ P.n4, P.n3, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_855,(0,1):C.GC_769}) + +V_103 = Vertex(name = 'V_103', + particles = [ P.n4, P.n4, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_856,(0,1):C.GC_770}) + +V_104 = Vertex(name = 'V_104', + particles = [ P.n1, P.n1, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_837,(0,1):C.GC_751}) + +V_105 = Vertex(name = 'V_105', + particles = [ P.n2, P.n1, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_839,(0,1):C.GC_753}) + +V_106 = Vertex(name = 'V_106', + particles = [ P.n3, P.n1, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_843,(0,1):C.GC_757}) + +V_107 = Vertex(name = 'V_107', + particles = [ P.n4, P.n1, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_849,(0,1):C.GC_763}) + +V_108 = Vertex(name = 'V_108', + particles = [ P.n2, P.n2, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_840,(0,1):C.GC_754}) + +V_109 = Vertex(name = 'V_109', + particles = [ P.n3, P.n2, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_844,(0,1):C.GC_758}) + +V_110 = Vertex(name = 'V_110', + particles = [ P.n4, P.n2, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_850,(0,1):C.GC_764}) + +V_111 = Vertex(name = 'V_111', + particles = [ P.n3, P.n3, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_845,(0,1):C.GC_759}) + +V_112 = Vertex(name = 'V_112', + particles = [ P.n4, P.n3, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_851,(0,1):C.GC_765}) + +V_113 = Vertex(name = 'V_113', + particles = [ P.n4, P.n4, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_852,(0,1):C.GC_766}) + +V_114 = Vertex(name = 'V_114', + particles = [ P.n1, P.n1, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1006,(0,1):C.GC_896}) + +V_115 = Vertex(name = 'V_115', + particles = [ P.n2, P.n1, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1009,(0,1):C.GC_899}) + +V_116 = Vertex(name = 'V_116', + particles = [ P.n3, P.n1, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1014,(0,1):C.GC_904}) + +V_117 = Vertex(name = 'V_117', + particles = [ P.n4, P.n1, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1021,(0,1):C.GC_911}) + +V_118 = Vertex(name = 'V_118', + particles = [ P.n2, P.n2, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1010,(0,1):C.GC_900}) + +V_119 = Vertex(name = 'V_119', + particles = [ P.n3, P.n2, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1015,(0,1):C.GC_905}) + +V_120 = Vertex(name = 'V_120', + particles = [ P.n4, P.n2, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1022,(0,1):C.GC_912}) + +V_121 = Vertex(name = 'V_121', + particles = [ P.n3, P.n3, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1016,(0,1):C.GC_906}) + +V_122 = Vertex(name = 'V_122', + particles = [ P.n4, P.n3, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1023,(0,1):C.GC_913}) + +V_123 = Vertex(name = 'V_123', + particles = [ P.n4, P.n4, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1024,(0,1):C.GC_914}) + +V_124 = Vertex(name = 'V_124', + particles = [ P.n1, P.n1, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1005,(0,1):C.GC_895}) + +V_125 = Vertex(name = 'V_125', + particles = [ P.n2, P.n1, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1007,(0,1):C.GC_897}) + +V_126 = Vertex(name = 'V_126', + particles = [ P.n3, P.n1, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1011,(0,1):C.GC_901}) + +V_127 = Vertex(name = 'V_127', + particles = [ P.n4, P.n1, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1017,(0,1):C.GC_907}) + +V_128 = Vertex(name = 'V_128', + particles = [ P.n2, P.n2, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1008,(0,1):C.GC_898}) + +V_129 = Vertex(name = 'V_129', + particles = [ P.n3, P.n2, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1012,(0,1):C.GC_902}) + +V_130 = Vertex(name = 'V_130', + particles = [ P.n4, P.n2, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1018,(0,1):C.GC_908}) + +V_131 = Vertex(name = 'V_131', + particles = [ P.n3, P.n3, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1013,(0,1):C.GC_903}) + +V_132 = Vertex(name = 'V_132', + particles = [ P.n4, P.n3, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1019,(0,1):C.GC_909}) + +V_133 = Vertex(name = 'V_133', + particles = [ P.n4, P.n4, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_1020,(0,1):C.GC_910}) + +V_134 = Vertex(name = 'V_134', + particles = [ P.b__tilde__, P.b, P.h02 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_695,(0,1):C.GC_698}) + +V_135 = Vertex(name = 'V_135', + particles = [ P.b__tilde__, P.b, P.G0 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_707,(0,1):C.GC_710}) + +V_136 = Vertex(name = 'V_136', + particles = [ P.t__tilde__, P.b, P.H__plus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_701,(0,0):C.GC_872}) + +V_137 = Vertex(name = 'V_137', + particles = [ P.tau__plus__, P.tau__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_696,(0,1):C.GC_699}) + +V_138 = Vertex(name = 'V_138', + particles = [ P.tau__plus__, P.tau__minus__, P.G0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_708,(0,1):C.GC_711}) + +V_139 = Vertex(name = 'V_139', + particles = [ P.b__tilde__, P.t, P.G__minus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_703,(0,0):C.GC_874}) + +V_140 = Vertex(name = 'V_140', + particles = [ P.t__tilde__, P.t, P.h01 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_697,(0,1):C.GC_700}) + +V_141 = Vertex(name = 'V_141', + particles = [ P.t__tilde__, P.t, P.A0 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_709,(0,1):C.GC_712}) + +V_142 = Vertex(name = 'V_142', + particles = [ P.tau__plus__, P.vt, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_705}) + +V_143 = Vertex(name = 'V_143', + particles = [ P.n1, P.d, P.sd1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_500}) + +V_144 = Vertex(name = 'V_144', + particles = [ P.n1, P.d, P.sd4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_520}) + +V_145 = Vertex(name = 'V_145', + particles = [ P.n2, P.d, P.sd1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_501}) + +V_146 = Vertex(name = 'V_146', + particles = [ P.n2, P.d, P.sd4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_521}) + +V_147 = Vertex(name = 'V_147', + particles = [ P.n3, P.d, P.sd1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_502}) + +V_148 = Vertex(name = 'V_148', + particles = [ P.n3, P.d, P.sd4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_522}) + +V_149 = Vertex(name = 'V_149', + particles = [ P.n4, P.d, P.sd1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_503}) + +V_150 = Vertex(name = 'V_150', + particles = [ P.n4, P.d, P.sd4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_523}) + +V_151 = Vertex(name = 'V_151', + particles = [ P.n1, P.s, P.sd2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_505}) + +V_152 = Vertex(name = 'V_152', + particles = [ P.n1, P.s, P.sd5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_525}) + +V_153 = Vertex(name = 'V_153', + particles = [ P.n2, P.s, P.sd2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_506}) + +V_154 = Vertex(name = 'V_154', + particles = [ P.n2, P.s, P.sd5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_526}) + +V_155 = Vertex(name = 'V_155', + particles = [ P.n3, P.s, P.sd2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_507}) + +V_156 = Vertex(name = 'V_156', + particles = [ P.n3, P.s, P.sd5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_527}) + +V_157 = Vertex(name = 'V_157', + particles = [ P.n4, P.s, P.sd2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_508}) + +V_158 = Vertex(name = 'V_158', + particles = [ P.n4, P.s, P.sd5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_528}) + +V_159 = Vertex(name = 'V_159', + particles = [ P.n1, P.b, P.sd3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_515,(0,1):C.GC_510}) + +V_160 = Vertex(name = 'V_160', + particles = [ P.n1, P.b, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_535,(0,1):C.GC_530}) + +V_161 = Vertex(name = 'V_161', + particles = [ P.n2, P.b, P.sd3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_516,(0,1):C.GC_511}) + +V_162 = Vertex(name = 'V_162', + particles = [ P.n2, P.b, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_536,(0,1):C.GC_531}) + +V_163 = Vertex(name = 'V_163', + particles = [ P.n3, P.b, P.sd3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_517,(0,1):C.GC_512}) + +V_164 = Vertex(name = 'V_164', + particles = [ P.n3, P.b, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_537,(0,1):C.GC_532}) + +V_165 = Vertex(name = 'V_165', + particles = [ P.n4, P.b, P.sd3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_518,(0,1):C.GC_513}) + +V_166 = Vertex(name = 'V_166', + particles = [ P.n4, P.b, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_538,(0,1):C.GC_533}) + +V_167 = Vertex(name = 'V_167', + particles = [ P.a, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_90}) + +V_168 = Vertex(name = 'V_168', + particles = [ P.a, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_92}) + +V_169 = Vertex(name = 'V_169', + particles = [ P.a, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_94}) + +V_170 = Vertex(name = 'V_170', + particles = [ P.a, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_96}) + +V_171 = Vertex(name = 'V_171', + particles = [ P.a, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_98}) + +V_172 = Vertex(name = 'V_172', + particles = [ P.a, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_100}) + +V_173 = Vertex(name = 'V_173', + particles = [ P.a, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_102}) + +V_174 = Vertex(name = 'V_174', + particles = [ P.a, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_104}) + +V_175 = Vertex(name = 'V_175', + particles = [ P.u__tilde__, P.x1__plus__, P.sd1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_623}) + +V_176 = Vertex(name = 'V_176', + particles = [ P.c__tilde__, P.x1__plus__, P.sd2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_624}) + +V_177 = Vertex(name = 'V_177', + particles = [ P.t__tilde__, P.x1__plus__, P.sd3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_630,(0,1):C.GC_391}) + +V_178 = Vertex(name = 'V_178', + particles = [ P.t__tilde__, P.x1__plus__, P.sd6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_631,(0,1):C.GC_392}) + +V_179 = Vertex(name = 'V_179', + particles = [ P.u__tilde__, P.x2__plus__, P.sd1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_642}) + +V_180 = Vertex(name = 'V_180', + particles = [ P.c__tilde__, P.x2__plus__, P.sd2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_643}) + +V_181 = Vertex(name = 'V_181', + particles = [ P.t__tilde__, P.x2__plus__, P.sd3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_649,(0,1):C.GC_400}) + +V_182 = Vertex(name = 'V_182', + particles = [ P.t__tilde__, P.x2__plus__, P.sd6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_650,(0,1):C.GC_401}) + +V_183 = Vertex(name = 'V_183', + particles = [ P.d__tilde__, P.n1, P.sd1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_407}) + +V_184 = Vertex(name = 'V_184', + particles = [ P.d__tilde__, P.n1, P.sd4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_222}) + +V_185 = Vertex(name = 'V_185', + particles = [ P.s__tilde__, P.n1, P.sd2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_408}) + +V_186 = Vertex(name = 'V_186', + particles = [ P.s__tilde__, P.n1, P.sd5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_226}) + +V_187 = Vertex(name = 'V_187', + particles = [ P.b__tilde__, P.n1, P.sd3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_416,(0,1):C.GC_340}) + +V_188 = Vertex(name = 'V_188', + particles = [ P.b__tilde__, P.n1, P.sd6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_417,(0,1):C.GC_341}) + +V_189 = Vertex(name = 'V_189', + particles = [ P.d__tilde__, P.n2, P.sd1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_430}) + +V_190 = Vertex(name = 'V_190', + particles = [ P.d__tilde__, P.n2, P.sd4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_223}) + +V_191 = Vertex(name = 'V_191', + particles = [ P.s__tilde__, P.n2, P.sd2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_431}) + +V_192 = Vertex(name = 'V_192', + particles = [ P.s__tilde__, P.n2, P.sd5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_227}) + +V_193 = Vertex(name = 'V_193', + particles = [ P.b__tilde__, P.n2, P.sd3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_439,(0,1):C.GC_346}) + +V_194 = Vertex(name = 'V_194', + particles = [ P.b__tilde__, P.n2, P.sd6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_440,(0,1):C.GC_347}) + +V_195 = Vertex(name = 'V_195', + particles = [ P.d__tilde__, P.n3, P.sd1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_453}) + +V_196 = Vertex(name = 'V_196', + particles = [ P.d__tilde__, P.n3, P.sd4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_224}) + +V_197 = Vertex(name = 'V_197', + particles = [ P.s__tilde__, P.n3, P.sd2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_454}) + +V_198 = Vertex(name = 'V_198', + particles = [ P.s__tilde__, P.n3, P.sd5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_228}) + +V_199 = Vertex(name = 'V_199', + particles = [ P.b__tilde__, P.n3, P.sd3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_462,(0,1):C.GC_352}) + +V_200 = Vertex(name = 'V_200', + particles = [ P.b__tilde__, P.n3, P.sd6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_463,(0,1):C.GC_353}) + +V_201 = Vertex(name = 'V_201', + particles = [ P.d__tilde__, P.n4, P.sd1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_476}) + +V_202 = Vertex(name = 'V_202', + particles = [ P.d__tilde__, P.n4, P.sd4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_225}) + +V_203 = Vertex(name = 'V_203', + particles = [ P.s__tilde__, P.n4, P.sd2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_477}) + +V_204 = Vertex(name = 'V_204', + particles = [ P.s__tilde__, P.n4, P.sd5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_229}) + +V_205 = Vertex(name = 'V_205', + particles = [ P.b__tilde__, P.n4, P.sd3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_485,(0,1):C.GC_358}) + +V_206 = Vertex(name = 'V_206', + particles = [ P.b__tilde__, P.n4, P.sd6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_486,(0,1):C.GC_359}) + +V_207 = Vertex(name = 'V_207', + particles = [ P.a, P.a, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_10}) + +V_208 = Vertex(name = 'V_208', + particles = [ P.a, P.a, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_13}) + +V_209 = Vertex(name = 'V_209', + particles = [ P.a, P.a, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_16}) + +V_210 = Vertex(name = 'V_210', + particles = [ P.a, P.a, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_19}) + +V_211 = Vertex(name = 'V_211', + particles = [ P.a, P.a, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_22}) + +V_212 = Vertex(name = 'V_212', + particles = [ P.a, P.a, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_25}) + +V_213 = Vertex(name = 'V_213', + particles = [ P.a, P.a, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_28}) + +V_214 = Vertex(name = 'V_214', + particles = [ P.a, P.a, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_31}) + +V_215 = Vertex(name = 'V_215', + particles = [ P.h02, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_811}) + +V_216 = Vertex(name = 'V_216', + particles = [ P.h02, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_812}) + +V_217 = Vertex(name = 'V_217', + particles = [ P.h02, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_825}) + +V_218 = Vertex(name = 'V_218', + particles = [ P.h02, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_826}) + +V_219 = Vertex(name = 'V_219', + particles = [ P.h02, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_803}) + +V_220 = Vertex(name = 'V_220', + particles = [ P.h02, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_804}) + +V_221 = Vertex(name = 'V_221', + particles = [ P.h02, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_827}) + +V_222 = Vertex(name = 'V_222', + particles = [ P.h02, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_828}) + +V_223 = Vertex(name = 'V_223', + particles = [ P.h01, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_786}) + +V_224 = Vertex(name = 'V_224', + particles = [ P.h01, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_787}) + +V_225 = Vertex(name = 'V_225', + particles = [ P.h01, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_788}) + +V_226 = Vertex(name = 'V_226', + particles = [ P.h01, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_789}) + +V_227 = Vertex(name = 'V_227', + particles = [ P.h01, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_778}) + +V_228 = Vertex(name = 'V_228', + particles = [ P.h01, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_779}) + +V_229 = Vertex(name = 'V_229', + particles = [ P.h01, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_790}) + +V_230 = Vertex(name = 'V_230', + particles = [ P.h01, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_791}) + +V_231 = Vertex(name = 'V_231', + particles = [ P.G0, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_983}) + +V_232 = Vertex(name = 'V_232', + particles = [ P.G0, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_984}) + +V_233 = Vertex(name = 'V_233', + particles = [ P.G0, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_985}) + +V_234 = Vertex(name = 'V_234', + particles = [ P.G0, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_986}) + +V_235 = Vertex(name = 'V_235', + particles = [ P.A0, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_883}) + +V_236 = Vertex(name = 'V_236', + particles = [ P.A0, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_884}) + +V_237 = Vertex(name = 'V_237', + particles = [ P.A0, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_885}) + +V_238 = Vertex(name = 'V_238', + particles = [ P.A0, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_886}) + +V_239 = Vertex(name = 'V_239', + particles = [ P.b__tilde__, P.b, P.h01 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_745,(0,1):C.GC_748}) + +V_240 = Vertex(name = 'V_240', + particles = [ P.tau__plus__, P.tau__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_746,(0,1):C.GC_749}) + +V_241 = Vertex(name = 'V_241', + particles = [ P.t__tilde__, P.t, P.h02 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_747,(0,1):C.GC_750}) + +V_242 = Vertex(name = 'V_242', + particles = [ P.A0, P.G0, P.h02 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1063}) + +V_243 = Vertex(name = 'V_243', + particles = [ P.A0, P.G0, P.h01 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1062}) + +V_244 = Vertex(name = 'V_244', + particles = [ P.n1, P.x1__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_721,(0,0):C.GC_1025}) + +V_245 = Vertex(name = 'V_245', + particles = [ P.n2, P.x1__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_722,(0,0):C.GC_1026}) + +V_246 = Vertex(name = 'V_246', + particles = [ P.n3, P.x1__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_723,(0,0):C.GC_1027}) + +V_247 = Vertex(name = 'V_247', + particles = [ P.n4, P.x1__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_724,(0,0):C.GC_1028}) + +V_248 = Vertex(name = 'V_248', + particles = [ P.n1, P.x2__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_725,(0,0):C.GC_1029}) + +V_249 = Vertex(name = 'V_249', + particles = [ P.n2, P.x2__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_726,(0,0):C.GC_1030}) + +V_250 = Vertex(name = 'V_250', + particles = [ P.n3, P.x2__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_727,(0,0):C.GC_1031}) + +V_251 = Vertex(name = 'V_251', + particles = [ P.n4, P.x2__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_728,(0,0):C.GC_1032}) + +V_252 = Vertex(name = 'V_252', + particles = [ P.x1__minus__, P.n1, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_713,(0,0):C.GC_1035}) + +V_253 = Vertex(name = 'V_253', + particles = [ P.x2__minus__, P.n1, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_717,(0,0):C.GC_1043}) + +V_254 = Vertex(name = 'V_254', + particles = [ P.x1__minus__, P.n2, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_714,(0,0):C.GC_1036}) + +V_255 = Vertex(name = 'V_255', + particles = [ P.x2__minus__, P.n2, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_718,(0,0):C.GC_1044}) + +V_256 = Vertex(name = 'V_256', + particles = [ P.x1__minus__, P.n3, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_715,(0,0):C.GC_1037}) + +V_257 = Vertex(name = 'V_257', + particles = [ P.x2__minus__, P.n3, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_719,(0,0):C.GC_1045}) + +V_258 = Vertex(name = 'V_258', + particles = [ P.x1__minus__, P.n4, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_716,(0,0):C.GC_1038}) + +V_259 = Vertex(name = 'V_259', + particles = [ P.x2__minus__, P.n4, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,1):C.GC_720,(0,0):C.GC_1046}) + +V_260 = Vertex(name = 'V_260', + particles = [ P.b__tilde__, P.b, P.A0 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_877,(0,1):C.GC_880}) + +V_261 = Vertex(name = 'V_261', + particles = [ P.t__tilde__, P.b, P.G__plus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_702,(0,1):C.GC_871}) + +V_262 = Vertex(name = 'V_262', + particles = [ P.tau__plus__, P.tau__minus__, P.A0 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_878,(0,1):C.GC_881}) + +V_263 = Vertex(name = 'V_263', + particles = [ P.b__tilde__, P.t, P.H__minus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_704,(0,1):C.GC_873}) + +V_264 = Vertex(name = 'V_264', + particles = [ P.t__tilde__, P.t, P.G0 ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_879,(0,1):C.GC_882}) + +V_265 = Vertex(name = 'V_265', + particles = [ P.tau__plus__, P.vt, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_875}) + +V_266 = Vertex(name = 'V_266', + particles = [ P.n1, P.e__minus__, P.sl1__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_539}) + +V_267 = Vertex(name = 'V_267', + particles = [ P.n1, P.e__minus__, P.sl4__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_555}) + +V_268 = Vertex(name = 'V_268', + particles = [ P.n2, P.e__minus__, P.sl1__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_540}) + +V_269 = Vertex(name = 'V_269', + particles = [ P.n2, P.e__minus__, P.sl4__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_556}) + +V_270 = Vertex(name = 'V_270', + particles = [ P.n3, P.e__minus__, P.sl1__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_541}) + +V_271 = Vertex(name = 'V_271', + particles = [ P.n3, P.e__minus__, P.sl4__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_557}) + +V_272 = Vertex(name = 'V_272', + particles = [ P.n4, P.e__minus__, P.sl1__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_542}) + +V_273 = Vertex(name = 'V_273', + particles = [ P.n4, P.e__minus__, P.sl4__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_558}) + +V_274 = Vertex(name = 'V_274', + particles = [ P.n1, P.mu__minus__, P.sl2__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_543}) + +V_275 = Vertex(name = 'V_275', + particles = [ P.n1, P.mu__minus__, P.sl5__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_559}) + +V_276 = Vertex(name = 'V_276', + particles = [ P.n2, P.mu__minus__, P.sl2__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_544}) + +V_277 = Vertex(name = 'V_277', + particles = [ P.n2, P.mu__minus__, P.sl5__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_560}) + +V_278 = Vertex(name = 'V_278', + particles = [ P.n3, P.mu__minus__, P.sl2__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_545}) + +V_279 = Vertex(name = 'V_279', + particles = [ P.n3, P.mu__minus__, P.sl5__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_561}) + +V_280 = Vertex(name = 'V_280', + particles = [ P.n4, P.mu__minus__, P.sl2__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_546}) + +V_281 = Vertex(name = 'V_281', + particles = [ P.n4, P.mu__minus__, P.sl5__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_562}) + +V_282 = Vertex(name = 'V_282', + particles = [ P.n1, P.tau__minus__, P.sl3__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_551,(0,1):C.GC_547}) + +V_283 = Vertex(name = 'V_283', + particles = [ P.n1, P.tau__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_567,(0,1):C.GC_563}) + +V_284 = Vertex(name = 'V_284', + particles = [ P.n2, P.tau__minus__, P.sl3__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_552,(0,1):C.GC_548}) + +V_285 = Vertex(name = 'V_285', + particles = [ P.n2, P.tau__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_568,(0,1):C.GC_564}) + +V_286 = Vertex(name = 'V_286', + particles = [ P.n3, P.tau__minus__, P.sl3__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_553,(0,1):C.GC_549}) + +V_287 = Vertex(name = 'V_287', + particles = [ P.n3, P.tau__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_569,(0,1):C.GC_565}) + +V_288 = Vertex(name = 'V_288', + particles = [ P.n4, P.tau__minus__, P.sl3__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_554,(0,1):C.GC_550}) + +V_289 = Vertex(name = 'V_289', + particles = [ P.n4, P.tau__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_570,(0,1):C.GC_566}) + +V_290 = Vertex(name = 'V_290', + particles = [ P.a, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_34}) + +V_291 = Vertex(name = 'V_291', + particles = [ P.a, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_35}) + +V_292 = Vertex(name = 'V_292', + particles = [ P.a, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_36}) + +V_293 = Vertex(name = 'V_293', + particles = [ P.a, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_37}) + +V_294 = Vertex(name = 'V_294', + particles = [ P.a, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_38}) + +V_295 = Vertex(name = 'V_295', + particles = [ P.a, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_39}) + +V_296 = Vertex(name = 'V_296', + particles = [ P.a, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_40}) + +V_297 = Vertex(name = 'V_297', + particles = [ P.a, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_41}) + +V_298 = Vertex(name = 'V_298', + particles = [ P.e__plus__, P.n1, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_409}) + +V_299 = Vertex(name = 'V_299', + particles = [ P.e__plus__, P.n1, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_230}) + +V_300 = Vertex(name = 'V_300', + particles = [ P.mu__plus__, P.n1, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_410}) + +V_301 = Vertex(name = 'V_301', + particles = [ P.mu__plus__, P.n1, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_234}) + +V_302 = Vertex(name = 'V_302', + particles = [ P.tau__plus__, P.n1, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_418,(0,1):C.GC_342}) + +V_303 = Vertex(name = 'V_303', + particles = [ P.tau__plus__, P.n1, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_419,(0,1):C.GC_343}) + +V_304 = Vertex(name = 'V_304', + particles = [ P.e__plus__, P.n2, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_432}) + +V_305 = Vertex(name = 'V_305', + particles = [ P.e__plus__, P.n2, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_231}) + +V_306 = Vertex(name = 'V_306', + particles = [ P.mu__plus__, P.n2, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_433}) + +V_307 = Vertex(name = 'V_307', + particles = [ P.mu__plus__, P.n2, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_235}) + +V_308 = Vertex(name = 'V_308', + particles = [ P.tau__plus__, P.n2, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_441,(0,1):C.GC_348}) + +V_309 = Vertex(name = 'V_309', + particles = [ P.tau__plus__, P.n2, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_442,(0,1):C.GC_349}) + +V_310 = Vertex(name = 'V_310', + particles = [ P.e__plus__, P.n3, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_455}) + +V_311 = Vertex(name = 'V_311', + particles = [ P.e__plus__, P.n3, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_232}) + +V_312 = Vertex(name = 'V_312', + particles = [ P.mu__plus__, P.n3, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_456}) + +V_313 = Vertex(name = 'V_313', + particles = [ P.mu__plus__, P.n3, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_236}) + +V_314 = Vertex(name = 'V_314', + particles = [ P.tau__plus__, P.n3, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_464,(0,1):C.GC_354}) + +V_315 = Vertex(name = 'V_315', + particles = [ P.tau__plus__, P.n3, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_465,(0,1):C.GC_355}) + +V_316 = Vertex(name = 'V_316', + particles = [ P.e__plus__, P.n4, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_478}) + +V_317 = Vertex(name = 'V_317', + particles = [ P.e__plus__, P.n4, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_233}) + +V_318 = Vertex(name = 'V_318', + particles = [ P.mu__plus__, P.n4, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_479}) + +V_319 = Vertex(name = 'V_319', + particles = [ P.mu__plus__, P.n4, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_237}) + +V_320 = Vertex(name = 'V_320', + particles = [ P.tau__plus__, P.n4, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_487,(0,1):C.GC_360}) + +V_321 = Vertex(name = 'V_321', + particles = [ P.tau__plus__, P.n4, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_488,(0,1):C.GC_361}) + +V_322 = Vertex(name = 'V_322', + particles = [ P.ve__tilde__, P.x1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_625}) + +V_323 = Vertex(name = 'V_323', + particles = [ P.vm__tilde__, P.x1__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_626}) + +V_324 = Vertex(name = 'V_324', + particles = [ P.vt__tilde__, P.x1__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_632}) + +V_325 = Vertex(name = 'V_325', + particles = [ P.vt__tilde__, P.x1__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_633}) + +V_326 = Vertex(name = 'V_326', + particles = [ P.ve__tilde__, P.x2__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_644}) + +V_327 = Vertex(name = 'V_327', + particles = [ P.vm__tilde__, P.x2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_645}) + +V_328 = Vertex(name = 'V_328', + particles = [ P.vt__tilde__, P.x2__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_651}) + +V_329 = Vertex(name = 'V_329', + particles = [ P.vt__tilde__, P.x2__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_652}) + +V_330 = Vertex(name = 'V_330', + particles = [ P.a, P.a, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_42}) + +V_331 = Vertex(name = 'V_331', + particles = [ P.a, P.a, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_43}) + +V_332 = Vertex(name = 'V_332', + particles = [ P.a, P.a, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_44}) + +V_333 = Vertex(name = 'V_333', + particles = [ P.a, P.a, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_45}) + +V_334 = Vertex(name = 'V_334', + particles = [ P.a, P.a, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_46}) + +V_335 = Vertex(name = 'V_335', + particles = [ P.a, P.a, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_47}) + +V_336 = Vertex(name = 'V_336', + particles = [ P.a, P.a, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_48}) + +V_337 = Vertex(name = 'V_337', + particles = [ P.a, P.a, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_49}) + +V_338 = Vertex(name = 'V_338', + particles = [ P.h02, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_807}) + +V_339 = Vertex(name = 'V_339', + particles = [ P.h02, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_808}) + +V_340 = Vertex(name = 'V_340', + particles = [ P.h02, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_829}) + +V_341 = Vertex(name = 'V_341', + particles = [ P.h02, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_830}) + +V_342 = Vertex(name = 'V_342', + particles = [ P.h02, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_799}) + +V_343 = Vertex(name = 'V_343', + particles = [ P.h02, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_800}) + +V_344 = Vertex(name = 'V_344', + particles = [ P.h02, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_831}) + +V_345 = Vertex(name = 'V_345', + particles = [ P.h02, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_832}) + +V_346 = Vertex(name = 'V_346', + particles = [ P.h01, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_782}) + +V_347 = Vertex(name = 'V_347', + particles = [ P.h01, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_783}) + +V_348 = Vertex(name = 'V_348', + particles = [ P.h01, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_792}) + +V_349 = Vertex(name = 'V_349', + particles = [ P.h01, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_793}) + +V_350 = Vertex(name = 'V_350', + particles = [ P.h01, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_774}) + +V_351 = Vertex(name = 'V_351', + particles = [ P.h01, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_775}) + +V_352 = Vertex(name = 'V_352', + particles = [ P.h01, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_794}) + +V_353 = Vertex(name = 'V_353', + particles = [ P.h01, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_795}) + +V_354 = Vertex(name = 'V_354', + particles = [ P.G0, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_987}) + +V_355 = Vertex(name = 'V_355', + particles = [ P.G0, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_988}) + +V_356 = Vertex(name = 'V_356', + particles = [ P.G0, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_989}) + +V_357 = Vertex(name = 'V_357', + particles = [ P.G0, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_990}) + +V_358 = Vertex(name = 'V_358', + particles = [ P.A0, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_887}) + +V_359 = Vertex(name = 'V_359', + particles = [ P.A0, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_888}) + +V_360 = Vertex(name = 'V_360', + particles = [ P.A0, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_889}) + +V_361 = Vertex(name = 'V_361', + particles = [ P.A0, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_890}) + +V_362 = Vertex(name = 'V_362', + particles = [ P.G__plus__, P.sl1__minus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_950}) + +V_363 = Vertex(name = 'V_363', + particles = [ P.G__plus__, P.sl2__minus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_951}) + +V_364 = Vertex(name = 'V_364', + particles = [ P.G__plus__, P.sl3__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_991}) + +V_365 = Vertex(name = 'V_365', + particles = [ P.G__plus__, P.sl6__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_992}) + +V_366 = Vertex(name = 'V_366', + particles = [ P.H__plus__, P.sl1__minus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_927}) + +V_367 = Vertex(name = 'V_367', + particles = [ P.H__plus__, P.sl2__minus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_928}) + +V_368 = Vertex(name = 'V_368', + particles = [ P.H__plus__, P.sl3__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_929}) + +V_369 = Vertex(name = 'V_369', + particles = [ P.H__plus__, P.sl6__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_930}) + +V_370 = Vertex(name = 'V_370', + particles = [ P.n1, P.ve, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_571}) + +V_371 = Vertex(name = 'V_371', + particles = [ P.n2, P.ve, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_572}) + +V_372 = Vertex(name = 'V_372', + particles = [ P.n3, P.ve, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_573}) + +V_373 = Vertex(name = 'V_373', + particles = [ P.n4, P.ve, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_574}) + +V_374 = Vertex(name = 'V_374', + particles = [ P.n1, P.vm, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_575}) + +V_375 = Vertex(name = 'V_375', + particles = [ P.n2, P.vm, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_576}) + +V_376 = Vertex(name = 'V_376', + particles = [ P.n3, P.vm, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_577}) + +V_377 = Vertex(name = 'V_377', + particles = [ P.n4, P.vm, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_578}) + +V_378 = Vertex(name = 'V_378', + particles = [ P.n1, P.vt, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_579}) + +V_379 = Vertex(name = 'V_379', + particles = [ P.n2, P.vt, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_580}) + +V_380 = Vertex(name = 'V_380', + particles = [ P.n3, P.vt, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_581}) + +V_381 = Vertex(name = 'V_381', + particles = [ P.n4, P.vt, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_582}) + +V_382 = Vertex(name = 'V_382', + particles = [ P.e__plus__, P.x1__minus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_661}) + +V_383 = Vertex(name = 'V_383', + particles = [ P.mu__plus__, P.x1__minus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_662}) + +V_384 = Vertex(name = 'V_384', + particles = [ P.tau__plus__, P.x1__minus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_663,(0,1):C.GC_368}) + +V_385 = Vertex(name = 'V_385', + particles = [ P.e__plus__, P.x2__minus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_678}) + +V_386 = Vertex(name = 'V_386', + particles = [ P.mu__plus__, P.x2__minus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_679}) + +V_387 = Vertex(name = 'V_387', + particles = [ P.tau__plus__, P.x2__minus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_680,(0,1):C.GC_379}) + +V_388 = Vertex(name = 'V_388', + particles = [ P.G__minus__, P.sl1__plus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_952}) + +V_389 = Vertex(name = 'V_389', + particles = [ P.G__minus__, P.sl2__plus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_953}) + +V_390 = Vertex(name = 'V_390', + particles = [ P.G__minus__, P.sl3__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_954}) + +V_391 = Vertex(name = 'V_391', + particles = [ P.G__minus__, P.sl6__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_955}) + +V_392 = Vertex(name = 'V_392', + particles = [ P.H__minus__, P.sl1__plus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_931}) + +V_393 = Vertex(name = 'V_393', + particles = [ P.H__minus__, P.sl2__plus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_932}) + +V_394 = Vertex(name = 'V_394', + particles = [ P.H__minus__, P.sl3__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_933}) + +V_395 = Vertex(name = 'V_395', + particles = [ P.H__minus__, P.sl6__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_934}) + +V_396 = Vertex(name = 'V_396', + particles = [ P.ve__tilde__, P.n1, P.sv1 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_411}) + +V_397 = Vertex(name = 'V_397', + particles = [ P.vm__tilde__, P.n1, P.sv2 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_412}) + +V_398 = Vertex(name = 'V_398', + particles = [ P.vt__tilde__, P.n1, P.sv3 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_413}) + +V_399 = Vertex(name = 'V_399', + particles = [ P.ve__tilde__, P.n2, P.sv1 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_434}) + +V_400 = Vertex(name = 'V_400', + particles = [ P.vm__tilde__, P.n2, P.sv2 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_435}) + +V_401 = Vertex(name = 'V_401', + particles = [ P.vt__tilde__, P.n2, P.sv3 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_436}) + +V_402 = Vertex(name = 'V_402', + particles = [ P.ve__tilde__, P.n3, P.sv1 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_457}) + +V_403 = Vertex(name = 'V_403', + particles = [ P.vm__tilde__, P.n3, P.sv2 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_458}) + +V_404 = Vertex(name = 'V_404', + particles = [ P.vt__tilde__, P.n3, P.sv3 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_459}) + +V_405 = Vertex(name = 'V_405', + particles = [ P.ve__tilde__, P.n4, P.sv1 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_480}) + +V_406 = Vertex(name = 'V_406', + particles = [ P.vm__tilde__, P.n4, P.sv2 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_481}) + +V_407 = Vertex(name = 'V_407', + particles = [ P.vt__tilde__, P.n4, P.sv3 ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_482}) + +V_408 = Vertex(name = 'V_408', + particles = [ P.h02, P.sv1__tilde__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_805}) + +V_409 = Vertex(name = 'V_409', + particles = [ P.h02, P.sv2__tilde__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_805}) + +V_410 = Vertex(name = 'V_410', + particles = [ P.h02, P.sv3__tilde__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_805}) + +V_411 = Vertex(name = 'V_411', + particles = [ P.h01, P.sv1__tilde__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_780}) + +V_412 = Vertex(name = 'V_412', + particles = [ P.h01, P.sv2__tilde__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_780}) + +V_413 = Vertex(name = 'V_413', + particles = [ P.h01, P.sv3__tilde__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_780}) + +V_414 = Vertex(name = 'V_414', + particles = [ P.n1, P.u, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_584}) + +V_415 = Vertex(name = 'V_415', + particles = [ P.n1, P.u, P.su4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_604}) + +V_416 = Vertex(name = 'V_416', + particles = [ P.n2, P.u, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_585}) + +V_417 = Vertex(name = 'V_417', + particles = [ P.n2, P.u, P.su4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_605}) + +V_418 = Vertex(name = 'V_418', + particles = [ P.n3, P.u, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_586}) + +V_419 = Vertex(name = 'V_419', + particles = [ P.n3, P.u, P.su4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_606}) + +V_420 = Vertex(name = 'V_420', + particles = [ P.n4, P.u, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_587}) + +V_421 = Vertex(name = 'V_421', + particles = [ P.n4, P.u, P.su4__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_607}) + +V_422 = Vertex(name = 'V_422', + particles = [ P.n1, P.c, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_589}) + +V_423 = Vertex(name = 'V_423', + particles = [ P.n1, P.c, P.su5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_609}) + +V_424 = Vertex(name = 'V_424', + particles = [ P.n2, P.c, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_590}) + +V_425 = Vertex(name = 'V_425', + particles = [ P.n2, P.c, P.su5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_610}) + +V_426 = Vertex(name = 'V_426', + particles = [ P.n3, P.c, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_591}) + +V_427 = Vertex(name = 'V_427', + particles = [ P.n3, P.c, P.su5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_611}) + +V_428 = Vertex(name = 'V_428', + particles = [ P.n4, P.c, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_592}) + +V_429 = Vertex(name = 'V_429', + particles = [ P.n4, P.c, P.su5__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_612}) + +V_430 = Vertex(name = 'V_430', + particles = [ P.n1, P.t, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_599,(0,1):C.GC_594}) + +V_431 = Vertex(name = 'V_431', + particles = [ P.n1, P.t, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_619,(0,1):C.GC_614}) + +V_432 = Vertex(name = 'V_432', + particles = [ P.n2, P.t, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_600,(0,1):C.GC_595}) + +V_433 = Vertex(name = 'V_433', + particles = [ P.n2, P.t, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_620,(0,1):C.GC_615}) + +V_434 = Vertex(name = 'V_434', + particles = [ P.n3, P.t, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_601,(0,1):C.GC_596}) + +V_435 = Vertex(name = 'V_435', + particles = [ P.n3, P.t, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_621,(0,1):C.GC_616}) + +V_436 = Vertex(name = 'V_436', + particles = [ P.n4, P.t, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_602,(0,1):C.GC_597}) + +V_437 = Vertex(name = 'V_437', + particles = [ P.n4, P.t, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_622,(0,1):C.GC_617}) + +V_438 = Vertex(name = 'V_438', + particles = [ P.a, P.su1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_50}) + +V_439 = Vertex(name = 'V_439', + particles = [ P.a, P.su2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_52}) + +V_440 = Vertex(name = 'V_440', + particles = [ P.a, P.su3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_54}) + +V_441 = Vertex(name = 'V_441', + particles = [ P.a, P.su3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_56}) + +V_442 = Vertex(name = 'V_442', + particles = [ P.a, P.su4__tilde__, P.su4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_58}) + +V_443 = Vertex(name = 'V_443', + particles = [ P.a, P.su5__tilde__, P.su5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_60}) + +V_444 = Vertex(name = 'V_444', + particles = [ P.a, P.su3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_62}) + +V_445 = Vertex(name = 'V_445', + particles = [ P.a, P.su6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_64}) + +V_446 = Vertex(name = 'V_446', + particles = [ P.G__plus__, P.sd1, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_956}) + +V_447 = Vertex(name = 'V_447', + particles = [ P.G__plus__, P.sd2, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_957}) + +V_448 = Vertex(name = 'V_448', + particles = [ P.G__plus__, P.sd3, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_993}) + +V_449 = Vertex(name = 'V_449', + particles = [ P.G__plus__, P.sd3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_994}) + +V_450 = Vertex(name = 'V_450', + particles = [ P.G__plus__, P.sd6, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_995}) + +V_451 = Vertex(name = 'V_451', + particles = [ P.G__plus__, P.sd6, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_996}) + +V_452 = Vertex(name = 'V_452', + particles = [ P.H__plus__, P.sd1, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_935}) + +V_453 = Vertex(name = 'V_453', + particles = [ P.H__plus__, P.sd2, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_936}) + +V_454 = Vertex(name = 'V_454', + particles = [ P.H__plus__, P.sd3, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_942}) + +V_455 = Vertex(name = 'V_455', + particles = [ P.H__plus__, P.sd3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_943}) + +V_456 = Vertex(name = 'V_456', + particles = [ P.H__plus__, P.sd6, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_944}) + +V_457 = Vertex(name = 'V_457', + particles = [ P.H__plus__, P.sd6, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_945}) + +V_458 = Vertex(name = 'V_458', + particles = [ P.u__tilde__, P.n1, P.su1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_414}) + +V_459 = Vertex(name = 'V_459', + particles = [ P.u__tilde__, P.n1, P.su4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_238}) + +V_460 = Vertex(name = 'V_460', + particles = [ P.c__tilde__, P.n1, P.su2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_415}) + +V_461 = Vertex(name = 'V_461', + particles = [ P.c__tilde__, P.n1, P.su5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_242}) + +V_462 = Vertex(name = 'V_462', + particles = [ P.t__tilde__, P.n1, P.su3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_426,(0,1):C.GC_344}) + +V_463 = Vertex(name = 'V_463', + particles = [ P.t__tilde__, P.n1, P.su6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_427,(0,1):C.GC_345}) + +V_464 = Vertex(name = 'V_464', + particles = [ P.u__tilde__, P.n2, P.su1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_437}) + +V_465 = Vertex(name = 'V_465', + particles = [ P.u__tilde__, P.n2, P.su4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_239}) + +V_466 = Vertex(name = 'V_466', + particles = [ P.c__tilde__, P.n2, P.su2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_438}) + +V_467 = Vertex(name = 'V_467', + particles = [ P.c__tilde__, P.n2, P.su5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_243}) + +V_468 = Vertex(name = 'V_468', + particles = [ P.t__tilde__, P.n2, P.su3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_449,(0,1):C.GC_350}) + +V_469 = Vertex(name = 'V_469', + particles = [ P.t__tilde__, P.n2, P.su6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_450,(0,1):C.GC_351}) + +V_470 = Vertex(name = 'V_470', + particles = [ P.u__tilde__, P.n3, P.su1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_460}) + +V_471 = Vertex(name = 'V_471', + particles = [ P.u__tilde__, P.n3, P.su4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_240}) + +V_472 = Vertex(name = 'V_472', + particles = [ P.c__tilde__, P.n3, P.su2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_461}) + +V_473 = Vertex(name = 'V_473', + particles = [ P.c__tilde__, P.n3, P.su5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_244}) + +V_474 = Vertex(name = 'V_474', + particles = [ P.t__tilde__, P.n3, P.su3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_472,(0,1):C.GC_356}) + +V_475 = Vertex(name = 'V_475', + particles = [ P.t__tilde__, P.n3, P.su6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_473,(0,1):C.GC_357}) + +V_476 = Vertex(name = 'V_476', + particles = [ P.u__tilde__, P.n4, P.su1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_483}) + +V_477 = Vertex(name = 'V_477', + particles = [ P.u__tilde__, P.n4, P.su4 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_241}) + +V_478 = Vertex(name = 'V_478', + particles = [ P.c__tilde__, P.n4, P.su2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_484}) + +V_479 = Vertex(name = 'V_479', + particles = [ P.c__tilde__, P.n4, P.su5 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_245}) + +V_480 = Vertex(name = 'V_480', + particles = [ P.t__tilde__, P.n4, P.su3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_495,(0,1):C.GC_362}) + +V_481 = Vertex(name = 'V_481', + particles = [ P.t__tilde__, P.n4, P.su6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_496,(0,1):C.GC_363}) + +V_482 = Vertex(name = 'V_482', + particles = [ P.d__tilde__, P.x1__minus__, P.su1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_664}) + +V_483 = Vertex(name = 'V_483', + particles = [ P.s__tilde__, P.x1__minus__, P.su2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_665}) + +V_484 = Vertex(name = 'V_484', + particles = [ P.b__tilde__, P.x1__minus__, P.su3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_668,(0,1):C.GC_369}) + +V_485 = Vertex(name = 'V_485', + particles = [ P.b__tilde__, P.x1__minus__, P.su6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_669,(0,1):C.GC_370}) + +V_486 = Vertex(name = 'V_486', + particles = [ P.d__tilde__, P.x2__minus__, P.su1 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_681}) + +V_487 = Vertex(name = 'V_487', + particles = [ P.s__tilde__, P.x2__minus__, P.su2 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_682}) + +V_488 = Vertex(name = 'V_488', + particles = [ P.b__tilde__, P.x2__minus__, P.su3 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_685,(0,1):C.GC_380}) + +V_489 = Vertex(name = 'V_489', + particles = [ P.b__tilde__, P.x2__minus__, P.su6 ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_686,(0,1):C.GC_381}) + +V_490 = Vertex(name = 'V_490', + particles = [ P.G__minus__, P.sd1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_958}) + +V_491 = Vertex(name = 'V_491', + particles = [ P.G__minus__, P.sd2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_959}) + +V_492 = Vertex(name = 'V_492', + particles = [ P.G__minus__, P.sd3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_960}) + +V_493 = Vertex(name = 'V_493', + particles = [ P.G__minus__, P.sd3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_961}) + +V_494 = Vertex(name = 'V_494', + particles = [ P.G__minus__, P.sd6__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_962}) + +V_495 = Vertex(name = 'V_495', + particles = [ P.G__minus__, P.sd6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_963}) + +V_496 = Vertex(name = 'V_496', + particles = [ P.H__minus__, P.sd1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_937}) + +V_497 = Vertex(name = 'V_497', + particles = [ P.H__minus__, P.sd2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_938}) + +V_498 = Vertex(name = 'V_498', + particles = [ P.H__minus__, P.sd3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_997}) + +V_499 = Vertex(name = 'V_499', + particles = [ P.H__minus__, P.sd3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_998}) + +V_500 = Vertex(name = 'V_500', + particles = [ P.H__minus__, P.sd6__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_999}) + +V_501 = Vertex(name = 'V_501', + particles = [ P.H__minus__, P.sd6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1000}) + +V_502 = Vertex(name = 'V_502', + particles = [ P.a, P.a, P.su1__tilde__, P.su1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_66}) + +V_503 = Vertex(name = 'V_503', + particles = [ P.a, P.a, P.su2__tilde__, P.su2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_69}) + +V_504 = Vertex(name = 'V_504', + particles = [ P.a, P.a, P.su3__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_72}) + +V_505 = Vertex(name = 'V_505', + particles = [ P.a, P.a, P.su3__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_75}) + +V_506 = Vertex(name = 'V_506', + particles = [ P.a, P.a, P.su4__tilde__, P.su4 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_78}) + +V_507 = Vertex(name = 'V_507', + particles = [ P.a, P.a, P.su5__tilde__, P.su5 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_81}) + +V_508 = Vertex(name = 'V_508', + particles = [ P.a, P.a, P.su3, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_84}) + +V_509 = Vertex(name = 'V_509', + particles = [ P.a, P.a, P.su6__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_87}) + +V_510 = Vertex(name = 'V_510', + particles = [ P.h02, P.su1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_809}) + +V_511 = Vertex(name = 'V_511', + particles = [ P.h02, P.su2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_810}) + +V_512 = Vertex(name = 'V_512', + particles = [ P.h02, P.su3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_813}) + +V_513 = Vertex(name = 'V_513', + particles = [ P.h02, P.su3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_814}) + +V_514 = Vertex(name = 'V_514', + particles = [ P.h02, P.su4__tilde__, P.su4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_801}) + +V_515 = Vertex(name = 'V_515', + particles = [ P.h02, P.su5__tilde__, P.su5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_802}) + +V_516 = Vertex(name = 'V_516', + particles = [ P.h02, P.su3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_815}) + +V_517 = Vertex(name = 'V_517', + particles = [ P.h02, P.su6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_816}) + +V_518 = Vertex(name = 'V_518', + particles = [ P.h01, P.su1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_784}) + +V_519 = Vertex(name = 'V_519', + particles = [ P.h01, P.su2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_785}) + +V_520 = Vertex(name = 'V_520', + particles = [ P.h01, P.su3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_833}) + +V_521 = Vertex(name = 'V_521', + particles = [ P.h01, P.su3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_834}) + +V_522 = Vertex(name = 'V_522', + particles = [ P.h01, P.su4__tilde__, P.su4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_776}) + +V_523 = Vertex(name = 'V_523', + particles = [ P.h01, P.su5__tilde__, P.su5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_777}) + +V_524 = Vertex(name = 'V_524', + particles = [ P.h01, P.su3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_835}) + +V_525 = Vertex(name = 'V_525', + particles = [ P.h01, P.su6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_836}) + +V_526 = Vertex(name = 'V_526', + particles = [ P.A0, P.su3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1001}) + +V_527 = Vertex(name = 'V_527', + particles = [ P.A0, P.su3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1002}) + +V_528 = Vertex(name = 'V_528', + particles = [ P.A0, P.su3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1003}) + +V_529 = Vertex(name = 'V_529', + particles = [ P.A0, P.su6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_1004}) + +V_530 = Vertex(name = 'V_530', + particles = [ P.G0, P.su3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_891}) + +V_531 = Vertex(name = 'V_531', + particles = [ P.G0, P.su3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_892}) + +V_532 = Vertex(name = 'V_532', + particles = [ P.G0, P.su3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_893}) + +V_533 = Vertex(name = 'V_533', + particles = [ P.G0, P.su6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.SSS1 ], + couplings = {(0,0):C.GC_894}) + +V_534 = Vertex(name = 'V_534', + particles = [ P.go, P.d, P.sd1__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_499}) + +V_535 = Vertex(name = 'V_535', + particles = [ P.go, P.d, P.sd4__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_519}) + +V_536 = Vertex(name = 'V_536', + particles = [ P.go, P.s, P.sd2__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_504}) + +V_537 = Vertex(name = 'V_537', + particles = [ P.go, P.s, P.sd5__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_524}) + +V_538 = Vertex(name = 'V_538', + particles = [ P.go, P.b, P.sd3__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_514,(0,1):C.GC_509}) + +V_539 = Vertex(name = 'V_539', + particles = [ P.go, P.b, P.sd6__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_534,(0,1):C.GC_529}) + +V_540 = Vertex(name = 'V_540', + particles = [ P.g, P.sd1__tilde__, P.sd1 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_91}) + +V_541 = Vertex(name = 'V_541', + particles = [ P.g, P.sd2__tilde__, P.sd2 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_93}) + +V_542 = Vertex(name = 'V_542', + particles = [ P.g, P.sd3__tilde__, P.sd3 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_95}) + +V_543 = Vertex(name = 'V_543', + particles = [ P.g, P.sd3__tilde__, P.sd6 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_97}) + +V_544 = Vertex(name = 'V_544', + particles = [ P.g, P.sd4__tilde__, P.sd4 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_99}) + +V_545 = Vertex(name = 'V_545', + particles = [ P.g, P.sd5__tilde__, P.sd5 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_101}) + +V_546 = Vertex(name = 'V_546', + particles = [ P.g, P.sd3, P.sd6__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_103}) + +V_547 = Vertex(name = 'V_547', + particles = [ P.g, P.sd6__tilde__, P.sd6 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_105}) + +V_548 = Vertex(name = 'V_548', + particles = [ P.go, P.u, P.su1__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_583}) + +V_549 = Vertex(name = 'V_549', + particles = [ P.go, P.u, P.su4__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_603}) + +V_550 = Vertex(name = 'V_550', + particles = [ P.go, P.c, P.su2__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_588}) + +V_551 = Vertex(name = 'V_551', + particles = [ P.go, P.c, P.su5__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_608}) + +V_552 = Vertex(name = 'V_552', + particles = [ P.go, P.t, P.su3__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_598,(0,1):C.GC_593}) + +V_553 = Vertex(name = 'V_553', + particles = [ P.go, P.t, P.su6__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_618,(0,1):C.GC_613}) + +V_554 = Vertex(name = 'V_554', + particles = [ P.g, P.su1__tilde__, P.su1 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_51}) + +V_555 = Vertex(name = 'V_555', + particles = [ P.g, P.su2__tilde__, P.su2 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_53}) + +V_556 = Vertex(name = 'V_556', + particles = [ P.g, P.su3__tilde__, P.su3 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_55}) + +V_557 = Vertex(name = 'V_557', + particles = [ P.g, P.su3__tilde__, P.su6 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_57}) + +V_558 = Vertex(name = 'V_558', + particles = [ P.g, P.su4__tilde__, P.su4 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_59}) + +V_559 = Vertex(name = 'V_559', + particles = [ P.g, P.su5__tilde__, P.su5 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_61}) + +V_560 = Vertex(name = 'V_560', + particles = [ P.g, P.su3, P.su6__tilde__ ], + color = [ 'T(1,2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_63}) + +V_561 = Vertex(name = 'V_561', + particles = [ P.g, P.su6__tilde__, P.su6 ], + color = [ 'T(1,3,2)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_65}) + +V_562 = Vertex(name = 'V_562', + particles = [ P.d__tilde__, P.go, P.sd1 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_106}) + +V_563 = Vertex(name = 'V_563', + particles = [ P.d__tilde__, P.go, P.sd4 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_110}) + +V_564 = Vertex(name = 'V_564', + particles = [ P.s__tilde__, P.go, P.sd2 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_107}) + +V_565 = Vertex(name = 'V_565', + particles = [ P.s__tilde__, P.go, P.sd5 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_111}) + +V_566 = Vertex(name = 'V_566', + particles = [ P.b__tilde__, P.go, P.sd3 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_108,(0,1):C.GC_109}) + +V_567 = Vertex(name = 'V_567', + particles = [ P.b__tilde__, P.go, P.sd6 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_112,(0,1):C.GC_113}) + +V_568 = Vertex(name = 'V_568', + particles = [ P.a, P.g, P.sd1__tilde__, P.sd1 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_11}) + +V_569 = Vertex(name = 'V_569', + particles = [ P.a, P.g, P.sd2__tilde__, P.sd2 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_14}) + +V_570 = Vertex(name = 'V_570', + particles = [ P.a, P.g, P.sd3__tilde__, P.sd3 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_17}) + +V_571 = Vertex(name = 'V_571', + particles = [ P.a, P.g, P.sd3__tilde__, P.sd6 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_20}) + +V_572 = Vertex(name = 'V_572', + particles = [ P.a, P.g, P.sd4__tilde__, P.sd4 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_23}) + +V_573 = Vertex(name = 'V_573', + particles = [ P.a, P.g, P.sd5__tilde__, P.sd5 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_26}) + +V_574 = Vertex(name = 'V_574', + particles = [ P.a, P.g, P.sd3, P.sd6__tilde__ ], + color = [ 'T(2,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_29}) + +V_575 = Vertex(name = 'V_575', + particles = [ P.a, P.g, P.sd6__tilde__, P.sd6 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_32}) + +V_576 = Vertex(name = 'V_576', + particles = [ P.u__tilde__, P.go, P.su1 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_114}) + +V_577 = Vertex(name = 'V_577', + particles = [ P.u__tilde__, P.go, P.su4 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_118}) + +V_578 = Vertex(name = 'V_578', + particles = [ P.c__tilde__, P.go, P.su2 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_115}) + +V_579 = Vertex(name = 'V_579', + particles = [ P.c__tilde__, P.go, P.su5 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_119}) + +V_580 = Vertex(name = 'V_580', + particles = [ P.t__tilde__, P.go, P.su3 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_116,(0,1):C.GC_117}) + +V_581 = Vertex(name = 'V_581', + particles = [ P.t__tilde__, P.go, P.su6 ], + color = [ 'T(2,3,1)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_120,(0,1):C.GC_121}) + +V_582 = Vertex(name = 'V_582', + particles = [ P.a, P.g, P.su1__tilde__, P.su1 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_67}) + +V_583 = Vertex(name = 'V_583', + particles = [ P.a, P.g, P.su2__tilde__, P.su2 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_70}) + +V_584 = Vertex(name = 'V_584', + particles = [ P.a, P.g, P.su3__tilde__, P.su3 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_73}) + +V_585 = Vertex(name = 'V_585', + particles = [ P.a, P.g, P.su3__tilde__, P.su6 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_76}) + +V_586 = Vertex(name = 'V_586', + particles = [ P.a, P.g, P.su4__tilde__, P.su4 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_79}) + +V_587 = Vertex(name = 'V_587', + particles = [ P.a, P.g, P.su5__tilde__, P.su5 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_82}) + +V_588 = Vertex(name = 'V_588', + particles = [ P.a, P.g, P.su3, P.su6__tilde__ ], + color = [ 'T(2,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_85}) + +V_589 = Vertex(name = 'V_589', + particles = [ P.a, P.g, P.su6__tilde__, P.su6 ], + color = [ 'T(2,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_88}) + +V_590 = Vertex(name = 'V_590', + particles = [ P.g, P.g, P.sd1__tilde__, P.sd1 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_12,(0,0):C.GC_12}) + +V_591 = Vertex(name = 'V_591', + particles = [ P.g, P.g, P.sd2__tilde__, P.sd2 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_15,(0,0):C.GC_15}) + +V_592 = Vertex(name = 'V_592', + particles = [ P.g, P.g, P.sd3__tilde__, P.sd3 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_18,(0,0):C.GC_18}) + +V_593 = Vertex(name = 'V_593', + particles = [ P.g, P.g, P.sd3__tilde__, P.sd6 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_21,(0,0):C.GC_21}) + +V_594 = Vertex(name = 'V_594', + particles = [ P.g, P.g, P.sd4__tilde__, P.sd4 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_24,(0,0):C.GC_24}) + +V_595 = Vertex(name = 'V_595', + particles = [ P.g, P.g, P.sd5__tilde__, P.sd5 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_27,(0,0):C.GC_27}) + +V_596 = Vertex(name = 'V_596', + particles = [ P.g, P.g, P.sd3, P.sd6__tilde__ ], + color = [ 'T(1,-1,4)*T(2,3,-1)', 'T(1,3,-1)*T(2,-1,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_30,(0,0):C.GC_30}) + +V_597 = Vertex(name = 'V_597', + particles = [ P.g, P.g, P.sd6__tilde__, P.sd6 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_33,(0,0):C.GC_33}) + +V_598 = Vertex(name = 'V_598', + particles = [ P.g, P.g, P.su1__tilde__, P.su1 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_68,(0,0):C.GC_68}) + +V_599 = Vertex(name = 'V_599', + particles = [ P.g, P.g, P.su2__tilde__, P.su2 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_71,(0,0):C.GC_71}) + +V_600 = Vertex(name = 'V_600', + particles = [ P.g, P.g, P.su3__tilde__, P.su3 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_74,(0,0):C.GC_74}) + +V_601 = Vertex(name = 'V_601', + particles = [ P.g, P.g, P.su3__tilde__, P.su6 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_77,(0,0):C.GC_77}) + +V_602 = Vertex(name = 'V_602', + particles = [ P.g, P.g, P.su4__tilde__, P.su4 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_80,(0,0):C.GC_80}) + +V_603 = Vertex(name = 'V_603', + particles = [ P.g, P.g, P.su5__tilde__, P.su5 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_83,(0,0):C.GC_83}) + +V_604 = Vertex(name = 'V_604', + particles = [ P.g, P.g, P.su3, P.su6__tilde__ ], + color = [ 'T(1,-1,4)*T(2,3,-1)', 'T(1,3,-1)*T(2,-1,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_86,(0,0):C.GC_86}) + +V_605 = Vertex(name = 'V_605', + particles = [ P.g, P.g, P.su6__tilde__, P.su6 ], + color = [ 'T(1,-1,3)*T(2,4,-1)', 'T(1,4,-1)*T(2,-1,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(1,0):C.GC_89,(0,0):C.GC_89}) + +V_606 = Vertex(name = 'V_606', + particles = [ P.x1__minus__, P.u, P.sd1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_364}) + +V_607 = Vertex(name = 'V_607', + particles = [ P.x2__minus__, P.u, P.sd1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_375}) + +V_608 = Vertex(name = 'V_608', + particles = [ P.x1__minus__, P.c, P.sd2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_365}) + +V_609 = Vertex(name = 'V_609', + particles = [ P.x2__minus__, P.c, P.sd2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_376}) + +V_610 = Vertex(name = 'V_610', + particles = [ P.x1__minus__, P.t, P.sd3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_666,(0,1):C.GC_371}) + +V_611 = Vertex(name = 'V_611', + particles = [ P.x1__minus__, P.t, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_667,(0,1):C.GC_372}) + +V_612 = Vertex(name = 'V_612', + particles = [ P.x2__minus__, P.t, P.sd3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_683,(0,1):C.GC_382}) + +V_613 = Vertex(name = 'V_613', + particles = [ P.x2__minus__, P.t, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_684,(0,1):C.GC_383}) + +V_614 = Vertex(name = 'V_614', + particles = [ P.x1__minus__, P.ve, P.sl1__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_366}) + +V_615 = Vertex(name = 'V_615', + particles = [ P.x2__minus__, P.ve, P.sl1__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_377}) + +V_616 = Vertex(name = 'V_616', + particles = [ P.x1__minus__, P.vm, P.sl2__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_367}) + +V_617 = Vertex(name = 'V_617', + particles = [ P.x2__minus__, P.vm, P.sl2__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_378}) + +V_618 = Vertex(name = 'V_618', + particles = [ P.x1__minus__, P.vt, P.sl3__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_373}) + +V_619 = Vertex(name = 'V_619', + particles = [ P.x1__minus__, P.vt, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_374}) + +V_620 = Vertex(name = 'V_620', + particles = [ P.x2__minus__, P.vt, P.sl3__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_384}) + +V_621 = Vertex(name = 'V_621', + particles = [ P.x2__minus__, P.vt, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_385}) + +V_622 = Vertex(name = 'V_622', + particles = [ P.e__minus__, P.x1__plus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_386}) + +V_623 = Vertex(name = 'V_623', + particles = [ P.mu__minus__, P.x1__plus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_387}) + +V_624 = Vertex(name = 'V_624', + particles = [ P.tau__minus__, P.x1__plus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_627,(0,1):C.GC_388}) + +V_625 = Vertex(name = 'V_625', + particles = [ P.e__minus__, P.x2__plus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_395}) + +V_626 = Vertex(name = 'V_626', + particles = [ P.mu__minus__, P.x2__plus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_396}) + +V_627 = Vertex(name = 'V_627', + particles = [ P.tau__minus__, P.x2__plus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_646,(0,1):C.GC_397}) + +V_628 = Vertex(name = 'V_628', + particles = [ P.d, P.x1__plus__, P.su1__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_389}) + +V_629 = Vertex(name = 'V_629', + particles = [ P.s, P.x1__plus__, P.su2__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_390}) + +V_630 = Vertex(name = 'V_630', + particles = [ P.b, P.x1__plus__, P.su3__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_628,(0,1):C.GC_393}) + +V_631 = Vertex(name = 'V_631', + particles = [ P.b, P.x1__plus__, P.su6__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_629,(0,1):C.GC_394}) + +V_632 = Vertex(name = 'V_632', + particles = [ P.d, P.x2__plus__, P.su1__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_398}) + +V_633 = Vertex(name = 'V_633', + particles = [ P.s, P.x2__plus__, P.su2__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS2 ], + couplings = {(0,0):C.GC_399}) + +V_634 = Vertex(name = 'V_634', + particles = [ P.b, P.x2__plus__, P.su3__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_647,(0,1):C.GC_402}) + +V_635 = Vertex(name = 'V_635', + particles = [ P.b, P.x2__plus__, P.su6__tilde__ ], + color = [ 'Identity(1,3)' ], + lorentz = [ L.FFS1, L.FFS2 ], + couplings = {(0,0):C.GC_648,(0,1):C.GC_403}) + +V_636 = Vertex(name = 'V_636', + particles = [ P.a, P.W__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_965}) + +V_637 = Vertex(name = 'V_637', + particles = [ P.a, P.W__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_939}) + +V_638 = Vertex(name = 'V_638', + particles = [ P.a, P.W__minus__, P.G__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1059}) + +V_639 = Vertex(name = 'V_639', + particles = [ P.a, P.W__minus__, P.h01, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1059}) + +V_640 = Vertex(name = 'V_640', + particles = [ P.a, P.W__minus__, P.G0, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1068}) + +V_641 = Vertex(name = 'V_641', + particles = [ P.a, P.W__minus__, P.A0, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1068}) + +V_642 = Vertex(name = 'V_642', + particles = [ P.W__minus__, P.A0, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1067}) + +V_643 = Vertex(name = 'V_643', + particles = [ P.W__minus__, P.G0, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1067}) + +V_644 = Vertex(name = 'V_644', + particles = [ P.W__minus__, P.G__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1058}) + +V_645 = Vertex(name = 'V_645', + particles = [ P.W__minus__, P.h01, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1057}) + +V_646 = Vertex(name = 'V_646', + particles = [ P.W__minus__, P.sd1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_182}) + +V_647 = Vertex(name = 'V_647', + particles = [ P.W__minus__, P.sd2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_183}) + +V_648 = Vertex(name = 'V_648', + particles = [ P.W__minus__, P.sd3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_184}) + +V_649 = Vertex(name = 'V_649', + particles = [ P.W__minus__, P.sd3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_185}) + +V_650 = Vertex(name = 'V_650', + particles = [ P.W__minus__, P.sd6__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_186}) + +V_651 = Vertex(name = 'V_651', + particles = [ P.W__minus__, P.sd6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_187}) + +V_652 = Vertex(name = 'V_652', + particles = [ P.a, P.W__minus__, P.G__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1052}) + +V_653 = Vertex(name = 'V_653', + particles = [ P.a, P.W__minus__, P.h02, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1051}) + +V_654 = Vertex(name = 'V_654', + particles = [ P.W__minus__, P.G__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1050}) + +V_655 = Vertex(name = 'V_655', + particles = [ P.W__minus__, P.h02, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1050}) + +V_656 = Vertex(name = 'V_656', + particles = [ P.W__minus__, P.sl1__plus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_188}) + +V_657 = Vertex(name = 'V_657', + particles = [ P.W__minus__, P.sl2__plus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_189}) + +V_658 = Vertex(name = 'V_658', + particles = [ P.W__minus__, P.sl3__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_190}) + +V_659 = Vertex(name = 'V_659', + particles = [ P.W__minus__, P.sl6__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_191}) + +V_660 = Vertex(name = 'V_660', + particles = [ P.a, P.W__minus__, P.sl1__plus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_154}) + +V_661 = Vertex(name = 'V_661', + particles = [ P.a, P.W__minus__, P.sl2__plus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_155}) + +V_662 = Vertex(name = 'V_662', + particles = [ P.a, P.W__minus__, P.sl3__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_156}) + +V_663 = Vertex(name = 'V_663', + particles = [ P.a, P.W__minus__, P.sl6__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_157}) + +V_664 = Vertex(name = 'V_664', + particles = [ P.a, P.W__minus__, P.sd1__tilde__, P.su1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_170}) + +V_665 = Vertex(name = 'V_665', + particles = [ P.a, P.W__minus__, P.sd2__tilde__, P.su2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_172}) + +V_666 = Vertex(name = 'V_666', + particles = [ P.a, P.W__minus__, P.sd3__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_174}) + +V_667 = Vertex(name = 'V_667', + particles = [ P.a, P.W__minus__, P.sd3__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_176}) + +V_668 = Vertex(name = 'V_668', + particles = [ P.a, P.W__minus__, P.sd6__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_178}) + +V_669 = Vertex(name = 'V_669', + particles = [ P.a, P.W__minus__, P.sd6__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_180}) + +V_670 = Vertex(name = 'V_670', + particles = [ P.g, P.W__minus__, P.sd1__tilde__, P.su1 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_171}) + +V_671 = Vertex(name = 'V_671', + particles = [ P.g, P.W__minus__, P.sd2__tilde__, P.su2 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_173}) + +V_672 = Vertex(name = 'V_672', + particles = [ P.g, P.W__minus__, P.sd3__tilde__, P.su3 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_175}) + +V_673 = Vertex(name = 'V_673', + particles = [ P.g, P.W__minus__, P.sd3__tilde__, P.su6 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_177}) + +V_674 = Vertex(name = 'V_674', + particles = [ P.g, P.W__minus__, P.sd6__tilde__, P.su3 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_179}) + +V_675 = Vertex(name = 'V_675', + particles = [ P.g, P.W__minus__, P.sd6__tilde__, P.su6 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_181}) + +V_676 = Vertex(name = 'V_676', + particles = [ P.a, P.W__minus__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.VVV1 ], + couplings = {(0,0):C.GC_4}) + +V_677 = Vertex(name = 'V_677', + particles = [ P.a, P.W__plus__, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_965}) + +V_678 = Vertex(name = 'V_678', + particles = [ P.a, P.W__plus__, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_939}) + +V_679 = Vertex(name = 'V_679', + particles = [ P.a, P.W__plus__, P.H__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1059}) + +V_680 = Vertex(name = 'V_680', + particles = [ P.a, P.W__plus__, P.G__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1059}) + +V_681 = Vertex(name = 'V_681', + particles = [ P.a, P.W__plus__, P.G0, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1069}) + +V_682 = Vertex(name = 'V_682', + particles = [ P.a, P.W__plus__, P.A0, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1069}) + +V_683 = Vertex(name = 'V_683', + particles = [ P.W__plus__, P.A0, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1067}) + +V_684 = Vertex(name = 'V_684', + particles = [ P.W__plus__, P.G0, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1067}) + +V_685 = Vertex(name = 'V_685', + particles = [ P.W__plus__, P.G__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1057}) + +V_686 = Vertex(name = 'V_686', + particles = [ P.W__plus__, P.H__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1057}) + +V_687 = Vertex(name = 'V_687', + particles = [ P.W__plus__, P.sd1, P.su1__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_192}) + +V_688 = Vertex(name = 'V_688', + particles = [ P.W__plus__, P.sd2, P.su2__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_193}) + +V_689 = Vertex(name = 'V_689', + particles = [ P.W__plus__, P.sd3, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_194}) + +V_690 = Vertex(name = 'V_690', + particles = [ P.W__plus__, P.sd3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_195}) + +V_691 = Vertex(name = 'V_691', + particles = [ P.W__plus__, P.sd6, P.su3__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_196}) + +V_692 = Vertex(name = 'V_692', + particles = [ P.W__plus__, P.sd6, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_197}) + +V_693 = Vertex(name = 'V_693', + particles = [ P.a, P.W__plus__, P.G__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1052}) + +V_694 = Vertex(name = 'V_694', + particles = [ P.a, P.W__plus__, P.H__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1051}) + +V_695 = Vertex(name = 'V_695', + particles = [ P.W__plus__, P.G__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1049}) + +V_696 = Vertex(name = 'V_696', + particles = [ P.W__plus__, P.H__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1050}) + +V_697 = Vertex(name = 'V_697', + particles = [ P.W__plus__, P.sl1__minus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_198}) + +V_698 = Vertex(name = 'V_698', + particles = [ P.W__plus__, P.sl2__minus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_199}) + +V_699 = Vertex(name = 'V_699', + particles = [ P.W__plus__, P.sl3__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_200}) + +V_700 = Vertex(name = 'V_700', + particles = [ P.W__plus__, P.sl6__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_201}) + +V_701 = Vertex(name = 'V_701', + particles = [ P.a, P.W__plus__, P.sl1__minus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_150}) + +V_702 = Vertex(name = 'V_702', + particles = [ P.a, P.W__plus__, P.sl2__minus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_151}) + +V_703 = Vertex(name = 'V_703', + particles = [ P.a, P.W__plus__, P.sl3__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_152}) + +V_704 = Vertex(name = 'V_704', + particles = [ P.a, P.W__plus__, P.sl6__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_153}) + +V_705 = Vertex(name = 'V_705', + particles = [ P.a, P.W__plus__, P.sd1, P.su1__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_158}) + +V_706 = Vertex(name = 'V_706', + particles = [ P.a, P.W__plus__, P.sd2, P.su2__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_160}) + +V_707 = Vertex(name = 'V_707', + particles = [ P.a, P.W__plus__, P.sd3, P.su3__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_162}) + +V_708 = Vertex(name = 'V_708', + particles = [ P.a, P.W__plus__, P.sd3, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_164}) + +V_709 = Vertex(name = 'V_709', + particles = [ P.a, P.W__plus__, P.sd6, P.su3__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_166}) + +V_710 = Vertex(name = 'V_710', + particles = [ P.a, P.W__plus__, P.sd6, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_168}) + +V_711 = Vertex(name = 'V_711', + particles = [ P.g, P.W__plus__, P.sd1, P.su1__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_159}) + +V_712 = Vertex(name = 'V_712', + particles = [ P.g, P.W__plus__, P.sd2, P.su2__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_161}) + +V_713 = Vertex(name = 'V_713', + particles = [ P.g, P.W__plus__, P.sd3, P.su3__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_163}) + +V_714 = Vertex(name = 'V_714', + particles = [ P.g, P.W__plus__, P.sd3, P.su6__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_165}) + +V_715 = Vertex(name = 'V_715', + particles = [ P.g, P.W__plus__, P.sd6, P.su3__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_167}) + +V_716 = Vertex(name = 'V_716', + particles = [ P.g, P.W__plus__, P.sd6, P.su6__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_169}) + +V_717 = Vertex(name = 'V_717', + particles = [ P.W__minus__, P.W__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_797}) + +V_718 = Vertex(name = 'V_718', + particles = [ P.W__minus__, P.W__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_772}) + +V_719 = Vertex(name = 'V_719', + particles = [ P.W__minus__, P.W__plus__, P.h01, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_865}) + +V_720 = Vertex(name = 'V_720', + particles = [ P.W__minus__, P.W__plus__, P.h02, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_865}) + +V_721 = Vertex(name = 'V_721', + particles = [ P.W__minus__, P.W__plus__, P.A0, P.A0 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1066}) + +V_722 = Vertex(name = 'V_722', + particles = [ P.W__minus__, P.W__plus__, P.G0, P.G0 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1066}) + +V_723 = Vertex(name = 'V_723', + particles = [ P.W__minus__, P.W__plus__, P.G__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1066}) + +V_724 = Vertex(name = 'V_724', + particles = [ P.W__minus__, P.W__plus__, P.H__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1066}) + +V_725 = Vertex(name = 'V_725', + particles = [ P.W__minus__, P.W__plus__, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_125}) + +V_726 = Vertex(name = 'V_726', + particles = [ P.W__minus__, P.W__plus__, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_126}) + +V_727 = Vertex(name = 'V_727', + particles = [ P.W__minus__, P.W__plus__, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_127}) + +V_728 = Vertex(name = 'V_728', + particles = [ P.W__minus__, P.W__plus__, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_128}) + +V_729 = Vertex(name = 'V_729', + particles = [ P.W__minus__, P.W__plus__, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_129}) + +V_730 = Vertex(name = 'V_730', + particles = [ P.W__minus__, P.W__plus__, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_130}) + +V_731 = Vertex(name = 'V_731', + particles = [ P.W__minus__, P.W__plus__, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_131}) + +V_732 = Vertex(name = 'V_732', + particles = [ P.W__minus__, P.W__plus__, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_132}) + +V_733 = Vertex(name = 'V_733', + particles = [ P.W__minus__, P.W__plus__, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_133}) + +V_734 = Vertex(name = 'V_734', + particles = [ P.W__minus__, P.W__plus__, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_134}) + +V_735 = Vertex(name = 'V_735', + particles = [ P.W__minus__, P.W__plus__, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_135}) + +V_736 = Vertex(name = 'V_736', + particles = [ P.W__minus__, P.W__plus__, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_136}) + +V_737 = Vertex(name = 'V_737', + particles = [ P.W__minus__, P.W__plus__, P.sv1__tilde__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_123}) + +V_738 = Vertex(name = 'V_738', + particles = [ P.W__minus__, P.W__plus__, P.sv2__tilde__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_123}) + +V_739 = Vertex(name = 'V_739', + particles = [ P.W__minus__, P.W__plus__, P.sv3__tilde__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_123}) + +V_740 = Vertex(name = 'V_740', + particles = [ P.W__minus__, P.W__plus__, P.su1__tilde__, P.su1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_137}) + +V_741 = Vertex(name = 'V_741', + particles = [ P.W__minus__, P.W__plus__, P.su2__tilde__, P.su2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_138}) + +V_742 = Vertex(name = 'V_742', + particles = [ P.W__minus__, P.W__plus__, P.su3__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_139}) + +V_743 = Vertex(name = 'V_743', + particles = [ P.W__minus__, P.W__plus__, P.su3__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_140}) + +V_744 = Vertex(name = 'V_744', + particles = [ P.W__minus__, P.W__plus__, P.su3, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_141}) + +V_745 = Vertex(name = 'V_745', + particles = [ P.W__minus__, P.W__plus__, P.su6__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_142}) + +V_746 = Vertex(name = 'V_746', + particles = [ P.a, P.a, P.W__minus__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.VVVV2 ], + couplings = {(0,0):C.GC_5}) + +V_747 = Vertex(name = 'V_747', + particles = [ P.W__minus__, P.W__plus__, P.Z ], + color = [ '1' ], + lorentz = [ L.VVV1 ], + couplings = {(0,0):C.GC_148}) + +V_748 = Vertex(name = 'V_748', + particles = [ P.W__minus__, P.W__minus__, P.W__plus__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.VVVV2 ], + couplings = {(0,0):C.GC_124}) + +V_749 = Vertex(name = 'V_749', + particles = [ P.vt__tilde__, P.tau__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_706}) + +V_750 = Vertex(name = 'V_750', + particles = [ P.vt__tilde__, P.tau__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.FFS1 ], + couplings = {(0,0):C.GC_876}) + +V_751 = Vertex(name = 'V_751', + particles = [ P.a, P.Z, P.G__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1074}) + +V_752 = Vertex(name = 'V_752', + particles = [ P.a, P.Z, P.H__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1074}) + +V_753 = Vertex(name = 'V_753', + particles = [ P.Z, P.A0, P.h01 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1061}) + +V_754 = Vertex(name = 'V_754', + particles = [ P.Z, P.G0, P.h02 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1061}) + +V_755 = Vertex(name = 'V_755', + particles = [ P.Z, P.G__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1073}) + +V_756 = Vertex(name = 'V_756', + particles = [ P.Z, P.H__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1073}) + +V_757 = Vertex(name = 'V_757', + particles = [ P.Z, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_296}) + +V_758 = Vertex(name = 'V_758', + particles = [ P.Z, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_297}) + +V_759 = Vertex(name = 'V_759', + particles = [ P.Z, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_298}) + +V_760 = Vertex(name = 'V_760', + particles = [ P.Z, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_299}) + +V_761 = Vertex(name = 'V_761', + particles = [ P.Z, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_252}) + +V_762 = Vertex(name = 'V_762', + particles = [ P.Z, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_253}) + +V_763 = Vertex(name = 'V_763', + particles = [ P.Z, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_300}) + +V_764 = Vertex(name = 'V_764', + particles = [ P.Z, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_301}) + +V_765 = Vertex(name = 'V_765', + particles = [ P.a, P.Z, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_292}) + +V_766 = Vertex(name = 'V_766', + particles = [ P.a, P.Z, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_294}) + +V_767 = Vertex(name = 'V_767', + particles = [ P.a, P.Z, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_314}) + +V_768 = Vertex(name = 'V_768', + particles = [ P.a, P.Z, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_316}) + +V_769 = Vertex(name = 'V_769', + particles = [ P.a, P.Z, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_264}) + +V_770 = Vertex(name = 'V_770', + particles = [ P.a, P.Z, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_266}) + +V_771 = Vertex(name = 'V_771', + particles = [ P.a, P.Z, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_318}) + +V_772 = Vertex(name = 'V_772', + particles = [ P.a, P.Z, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_320}) + +V_773 = Vertex(name = 'V_773', + particles = [ P.Z, P.A0, P.h02 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1055}) + +V_774 = Vertex(name = 'V_774', + particles = [ P.Z, P.G0, P.h01 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_1056}) + +V_775 = Vertex(name = 'V_775', + particles = [ P.Z, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_302}) + +V_776 = Vertex(name = 'V_776', + particles = [ P.Z, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_303}) + +V_777 = Vertex(name = 'V_777', + particles = [ P.Z, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_304}) + +V_778 = Vertex(name = 'V_778', + particles = [ P.Z, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_305}) + +V_779 = Vertex(name = 'V_779', + particles = [ P.Z, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_254}) + +V_780 = Vertex(name = 'V_780', + particles = [ P.Z, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_255}) + +V_781 = Vertex(name = 'V_781', + particles = [ P.Z, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_306}) + +V_782 = Vertex(name = 'V_782', + particles = [ P.Z, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_307}) + +V_783 = Vertex(name = 'V_783', + particles = [ P.a, P.Z, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_274}) + +V_784 = Vertex(name = 'V_784', + particles = [ P.a, P.Z, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_275}) + +V_785 = Vertex(name = 'V_785', + particles = [ P.a, P.Z, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_276}) + +V_786 = Vertex(name = 'V_786', + particles = [ P.a, P.Z, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_277}) + +V_787 = Vertex(name = 'V_787', + particles = [ P.a, P.Z, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_258}) + +V_788 = Vertex(name = 'V_788', + particles = [ P.a, P.Z, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_259}) + +V_789 = Vertex(name = 'V_789', + particles = [ P.a, P.Z, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_278}) + +V_790 = Vertex(name = 'V_790', + particles = [ P.a, P.Z, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_279}) + +V_791 = Vertex(name = 'V_791', + particles = [ P.Z, P.sv1__tilde__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_248}) + +V_792 = Vertex(name = 'V_792', + particles = [ P.Z, P.sv2__tilde__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_248}) + +V_793 = Vertex(name = 'V_793', + particles = [ P.Z, P.sv3__tilde__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_248}) + +V_794 = Vertex(name = 'V_794', + particles = [ P.Z, P.su1__tilde__, P.su1 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_308}) + +V_795 = Vertex(name = 'V_795', + particles = [ P.Z, P.su2__tilde__, P.su2 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_309}) + +V_796 = Vertex(name = 'V_796', + particles = [ P.Z, P.su3__tilde__, P.su3 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_310}) + +V_797 = Vertex(name = 'V_797', + particles = [ P.Z, P.su3__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_311}) + +V_798 = Vertex(name = 'V_798', + particles = [ P.Z, P.su4__tilde__, P.su4 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_256}) + +V_799 = Vertex(name = 'V_799', + particles = [ P.Z, P.su5__tilde__, P.su5 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_257}) + +V_800 = Vertex(name = 'V_800', + particles = [ P.Z, P.su3, P.su6__tilde__ ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_312}) + +V_801 = Vertex(name = 'V_801', + particles = [ P.Z, P.su6__tilde__, P.su6 ], + color = [ 'Identity(2,3)' ], + lorentz = [ L.VSS1 ], + couplings = {(0,0):C.GC_313}) + +V_802 = Vertex(name = 'V_802', + particles = [ P.a, P.Z, P.su1__tilde__, P.su1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_280}) + +V_803 = Vertex(name = 'V_803', + particles = [ P.a, P.Z, P.su2__tilde__, P.su2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_282}) + +V_804 = Vertex(name = 'V_804', + particles = [ P.a, P.Z, P.su3__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_284}) + +V_805 = Vertex(name = 'V_805', + particles = [ P.a, P.Z, P.su3__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_286}) + +V_806 = Vertex(name = 'V_806', + particles = [ P.a, P.Z, P.su4__tilde__, P.su4 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_260}) + +V_807 = Vertex(name = 'V_807', + particles = [ P.a, P.Z, P.su5__tilde__, P.su5 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_262}) + +V_808 = Vertex(name = 'V_808', + particles = [ P.a, P.Z, P.su3, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_288}) + +V_809 = Vertex(name = 'V_809', + particles = [ P.a, P.Z, P.su6__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_290}) + +V_810 = Vertex(name = 'V_810', + particles = [ P.g, P.Z, P.sd1__tilde__, P.sd1 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_293}) + +V_811 = Vertex(name = 'V_811', + particles = [ P.g, P.Z, P.sd2__tilde__, P.sd2 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_295}) + +V_812 = Vertex(name = 'V_812', + particles = [ P.g, P.Z, P.sd3__tilde__, P.sd3 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_315}) + +V_813 = Vertex(name = 'V_813', + particles = [ P.g, P.Z, P.sd3__tilde__, P.sd6 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_317}) + +V_814 = Vertex(name = 'V_814', + particles = [ P.g, P.Z, P.sd4__tilde__, P.sd4 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_265}) + +V_815 = Vertex(name = 'V_815', + particles = [ P.g, P.Z, P.sd5__tilde__, P.sd5 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_267}) + +V_816 = Vertex(name = 'V_816', + particles = [ P.g, P.Z, P.sd3, P.sd6__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_319}) + +V_817 = Vertex(name = 'V_817', + particles = [ P.g, P.Z, P.sd6__tilde__, P.sd6 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_321}) + +V_818 = Vertex(name = 'V_818', + particles = [ P.g, P.Z, P.su1__tilde__, P.su1 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_281}) + +V_819 = Vertex(name = 'V_819', + particles = [ P.g, P.Z, P.su2__tilde__, P.su2 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_283}) + +V_820 = Vertex(name = 'V_820', + particles = [ P.g, P.Z, P.su3__tilde__, P.su3 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_285}) + +V_821 = Vertex(name = 'V_821', + particles = [ P.g, P.Z, P.su3__tilde__, P.su6 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_287}) + +V_822 = Vertex(name = 'V_822', + particles = [ P.g, P.Z, P.su4__tilde__, P.su4 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_261}) + +V_823 = Vertex(name = 'V_823', + particles = [ P.g, P.Z, P.su5__tilde__, P.su5 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_263}) + +V_824 = Vertex(name = 'V_824', + particles = [ P.g, P.Z, P.su3, P.su6__tilde__ ], + color = [ 'T(1,3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_289}) + +V_825 = Vertex(name = 'V_825', + particles = [ P.g, P.Z, P.su6__tilde__, P.su6 ], + color = [ 'T(1,4,3)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_291}) + +V_826 = Vertex(name = 'V_826', + particles = [ P.W__minus__, P.Z, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_966}) + +V_827 = Vertex(name = 'V_827', + particles = [ P.W__minus__, P.Z, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_941}) + +V_828 = Vertex(name = 'V_828', + particles = [ P.W__minus__, P.Z, P.G__plus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1060}) + +V_829 = Vertex(name = 'V_829', + particles = [ P.W__minus__, P.Z, P.h01, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1060}) + +V_830 = Vertex(name = 'V_830', + particles = [ P.W__minus__, P.Z, P.G0, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1070}) + +V_831 = Vertex(name = 'V_831', + particles = [ P.W__minus__, P.Z, P.A0, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1070}) + +V_832 = Vertex(name = 'V_832', + particles = [ P.W__minus__, P.Z, P.G__plus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1054}) + +V_833 = Vertex(name = 'V_833', + particles = [ P.W__minus__, P.Z, P.h02, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1053}) + +V_834 = Vertex(name = 'V_834', + particles = [ P.W__minus__, P.Z, P.sl1__plus__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_208}) + +V_835 = Vertex(name = 'V_835', + particles = [ P.W__minus__, P.Z, P.sl2__plus__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_209}) + +V_836 = Vertex(name = 'V_836', + particles = [ P.W__minus__, P.Z, P.sl3__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_210}) + +V_837 = Vertex(name = 'V_837', + particles = [ P.W__minus__, P.Z, P.sl6__plus__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_211}) + +V_838 = Vertex(name = 'V_838', + particles = [ P.W__minus__, P.Z, P.sd1__tilde__, P.su1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_202}) + +V_839 = Vertex(name = 'V_839', + particles = [ P.W__minus__, P.Z, P.sd2__tilde__, P.su2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_203}) + +V_840 = Vertex(name = 'V_840', + particles = [ P.W__minus__, P.Z, P.sd3__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_204}) + +V_841 = Vertex(name = 'V_841', + particles = [ P.W__minus__, P.Z, P.sd3__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_205}) + +V_842 = Vertex(name = 'V_842', + particles = [ P.W__minus__, P.Z, P.sd6__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_206}) + +V_843 = Vertex(name = 'V_843', + particles = [ P.W__minus__, P.Z, P.sd6__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_207}) + +V_844 = Vertex(name = 'V_844', + particles = [ P.W__plus__, P.Z, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_966}) + +V_845 = Vertex(name = 'V_845', + particles = [ P.W__plus__, P.Z, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_941}) + +V_846 = Vertex(name = 'V_846', + particles = [ P.W__plus__, P.Z, P.H__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1060}) + +V_847 = Vertex(name = 'V_847', + particles = [ P.W__plus__, P.Z, P.G__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1060}) + +V_848 = Vertex(name = 'V_848', + particles = [ P.W__plus__, P.Z, P.G0, P.G__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1071}) + +V_849 = Vertex(name = 'V_849', + particles = [ P.W__plus__, P.Z, P.A0, P.H__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1071}) + +V_850 = Vertex(name = 'V_850', + particles = [ P.W__plus__, P.Z, P.G__minus__, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1054}) + +V_851 = Vertex(name = 'V_851', + particles = [ P.W__plus__, P.Z, P.H__minus__, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1053}) + +V_852 = Vertex(name = 'V_852', + particles = [ P.W__plus__, P.Z, P.sl1__minus__, P.sv1__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_218}) + +V_853 = Vertex(name = 'V_853', + particles = [ P.W__plus__, P.Z, P.sl2__minus__, P.sv2__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_219}) + +V_854 = Vertex(name = 'V_854', + particles = [ P.W__plus__, P.Z, P.sl3__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_220}) + +V_855 = Vertex(name = 'V_855', + particles = [ P.W__plus__, P.Z, P.sl6__minus__, P.sv3__tilde__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_221}) + +V_856 = Vertex(name = 'V_856', + particles = [ P.W__plus__, P.Z, P.sd1, P.su1__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_212}) + +V_857 = Vertex(name = 'V_857', + particles = [ P.W__plus__, P.Z, P.sd2, P.su2__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_213}) + +V_858 = Vertex(name = 'V_858', + particles = [ P.W__plus__, P.Z, P.sd3, P.su3__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_214}) + +V_859 = Vertex(name = 'V_859', + particles = [ P.W__plus__, P.Z, P.sd3, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_215}) + +V_860 = Vertex(name = 'V_860', + particles = [ P.W__plus__, P.Z, P.sd6, P.su3__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_216}) + +V_861 = Vertex(name = 'V_861', + particles = [ P.W__plus__, P.Z, P.sd6, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_217}) + +V_862 = Vertex(name = 'V_862', + particles = [ P.a, P.W__minus__, P.W__plus__, P.Z ], + color = [ '1' ], + lorentz = [ L.VVVV5 ], + couplings = {(0,0):C.GC_149}) + +V_863 = Vertex(name = 'V_863', + particles = [ P.Z, P.Z, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_806}) + +V_864 = Vertex(name = 'V_864', + particles = [ P.Z, P.Z, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVS1 ], + couplings = {(0,0):C.GC_781}) + +V_865 = Vertex(name = 'V_865', + particles = [ P.Z, P.Z, P.h01, P.h01 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_866}) + +V_866 = Vertex(name = 'V_866', + particles = [ P.Z, P.Z, P.h02, P.h02 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_866}) + +V_867 = Vertex(name = 'V_867', + particles = [ P.Z, P.Z, P.A0, P.A0 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1072}) + +V_868 = Vertex(name = 'V_868', + particles = [ P.Z, P.Z, P.G0, P.G0 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1072}) + +V_869 = Vertex(name = 'V_869', + particles = [ P.Z, P.Z, P.G__minus__, P.G__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1075}) + +V_870 = Vertex(name = 'V_870', + particles = [ P.Z, P.Z, P.H__minus__, P.H__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_1075}) + +V_871 = Vertex(name = 'V_871', + particles = [ P.Z, P.Z, P.sd1__tilde__, P.sd1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_322}) + +V_872 = Vertex(name = 'V_872', + particles = [ P.Z, P.Z, P.sd2__tilde__, P.sd2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_323}) + +V_873 = Vertex(name = 'V_873', + particles = [ P.Z, P.Z, P.sd3__tilde__, P.sd3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_324}) + +V_874 = Vertex(name = 'V_874', + particles = [ P.Z, P.Z, P.sd3__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_325}) + +V_875 = Vertex(name = 'V_875', + particles = [ P.Z, P.Z, P.sd4__tilde__, P.sd4 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_268}) + +V_876 = Vertex(name = 'V_876', + particles = [ P.Z, P.Z, P.sd5__tilde__, P.sd5 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_269}) + +V_877 = Vertex(name = 'V_877', + particles = [ P.Z, P.Z, P.sd3, P.sd6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_326}) + +V_878 = Vertex(name = 'V_878', + particles = [ P.Z, P.Z, P.sd6__tilde__, P.sd6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_327}) + +V_879 = Vertex(name = 'V_879', + particles = [ P.Z, P.Z, P.sl1__plus__, P.sl1__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_328}) + +V_880 = Vertex(name = 'V_880', + particles = [ P.Z, P.Z, P.sl2__plus__, P.sl2__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_329}) + +V_881 = Vertex(name = 'V_881', + particles = [ P.Z, P.Z, P.sl3__plus__, P.sl3__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_330}) + +V_882 = Vertex(name = 'V_882', + particles = [ P.Z, P.Z, P.sl3__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_331}) + +V_883 = Vertex(name = 'V_883', + particles = [ P.Z, P.Z, P.sl4__plus__, P.sl4__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_270}) + +V_884 = Vertex(name = 'V_884', + particles = [ P.Z, P.Z, P.sl5__plus__, P.sl5__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_271}) + +V_885 = Vertex(name = 'V_885', + particles = [ P.Z, P.Z, P.sl3__minus__, P.sl6__plus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_332}) + +V_886 = Vertex(name = 'V_886', + particles = [ P.Z, P.Z, P.sl6__plus__, P.sl6__minus__ ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_333}) + +V_887 = Vertex(name = 'V_887', + particles = [ P.Z, P.Z, P.sv1__tilde__, P.sv1 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_246}) + +V_888 = Vertex(name = 'V_888', + particles = [ P.Z, P.Z, P.sv2__tilde__, P.sv2 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_246}) + +V_889 = Vertex(name = 'V_889', + particles = [ P.Z, P.Z, P.sv3__tilde__, P.sv3 ], + color = [ '1' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_246}) + +V_890 = Vertex(name = 'V_890', + particles = [ P.Z, P.Z, P.su1__tilde__, P.su1 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_334}) + +V_891 = Vertex(name = 'V_891', + particles = [ P.Z, P.Z, P.su2__tilde__, P.su2 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_335}) + +V_892 = Vertex(name = 'V_892', + particles = [ P.Z, P.Z, P.su3__tilde__, P.su3 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_336}) + +V_893 = Vertex(name = 'V_893', + particles = [ P.Z, P.Z, P.su3__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_337}) + +V_894 = Vertex(name = 'V_894', + particles = [ P.Z, P.Z, P.su4__tilde__, P.su4 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_272}) + +V_895 = Vertex(name = 'V_895', + particles = [ P.Z, P.Z, P.su5__tilde__, P.su5 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_273}) + +V_896 = Vertex(name = 'V_896', + particles = [ P.Z, P.Z, P.su3, P.su6__tilde__ ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_338}) + +V_897 = Vertex(name = 'V_897', + particles = [ P.Z, P.Z, P.su6__tilde__, P.su6 ], + color = [ 'Identity(3,4)' ], + lorentz = [ L.VVSS1 ], + couplings = {(0,0):C.GC_339}) + +V_898 = Vertex(name = 'V_898', + particles = [ P.W__minus__, P.W__plus__, P.Z, P.Z ], + color = [ '1' ], + lorentz = [ L.VVVV2 ], + couplings = {(0,0):C.GC_122}) + +V_899 = Vertex(name = 'V_899', + particles = [ P.d__tilde__, P.d, P.a ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_1}) + +V_900 = Vertex(name = 'V_900', + particles = [ P.s__tilde__, P.s, P.a ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_1}) + +V_901 = Vertex(name = 'V_901', + particles = [ P.b__tilde__, P.b, P.a ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_1}) + +V_902 = Vertex(name = 'V_902', + particles = [ P.e__plus__, P.e__minus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_3}) + +V_903 = Vertex(name = 'V_903', + particles = [ P.mu__plus__, P.mu__minus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_3}) + +V_904 = Vertex(name = 'V_904', + particles = [ P.tau__plus__, P.tau__minus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_3}) + +V_905 = Vertex(name = 'V_905', + particles = [ P.u__tilde__, P.u, P.a ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_2}) + +V_906 = Vertex(name = 'V_906', + particles = [ P.c__tilde__, P.c, P.a ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_2}) + +V_907 = Vertex(name = 'V_907', + particles = [ P.t__tilde__, P.t, P.a ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_2}) + +V_908 = Vertex(name = 'V_908', + particles = [ P.go, P.go, P.g ], + color = [ 'f(3,2,1)' ], + lorentz = [ L.FFV6 ], + couplings = {(0,0):C.GC_8}) + +V_909 = Vertex(name = 'V_909', + particles = [ P.d__tilde__, P.d, P.g ], + color = [ 'T(3,2,1)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_7}) + +V_910 = Vertex(name = 'V_910', + particles = [ P.s__tilde__, P.s, P.g ], + color = [ 'T(3,2,1)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_7}) + +V_911 = Vertex(name = 'V_911', + particles = [ P.b__tilde__, P.b, P.g ], + color = [ 'T(3,2,1)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_7}) + +V_912 = Vertex(name = 'V_912', + particles = [ P.u__tilde__, P.u, P.g ], + color = [ 'T(3,2,1)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_7}) + +V_913 = Vertex(name = 'V_913', + particles = [ P.c__tilde__, P.c, P.g ], + color = [ 'T(3,2,1)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_7}) + +V_914 = Vertex(name = 'V_914', + particles = [ P.t__tilde__, P.t, P.g ], + color = [ 'T(3,2,1)' ], + lorentz = [ L.FFV1 ], + couplings = {(0,0):C.GC_7}) + +V_915 = Vertex(name = 'V_915', + particles = [ P.x1__minus__, P.x1__plus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_674,(0,1):C.GC_638}) + +V_916 = Vertex(name = 'V_916', + particles = [ P.x2__minus__, P.x1__plus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_691,(0,1):C.GC_640}) + +V_917 = Vertex(name = 'V_917', + particles = [ P.x1__minus__, P.x2__plus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_676,(0,1):C.GC_657}) + +V_918 = Vertex(name = 'V_918', + particles = [ P.x2__minus__, P.x2__plus__, P.a ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_693,(0,1):C.GC_659}) + +V_919 = Vertex(name = 'V_919', + particles = [ P.d__tilde__, P.u, P.W__minus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_144}) + +V_920 = Vertex(name = 'V_920', + particles = [ P.s__tilde__, P.c, P.W__minus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_145}) + +V_921 = Vertex(name = 'V_921', + particles = [ P.b__tilde__, P.t, P.W__minus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_146}) + +V_922 = Vertex(name = 'V_922', + particles = [ P.e__plus__, P.ve, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_143}) + +V_923 = Vertex(name = 'V_923', + particles = [ P.mu__plus__, P.vm, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_143}) + +V_924 = Vertex(name = 'V_924', + particles = [ P.tau__plus__, P.vt, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_143}) + +V_925 = Vertex(name = 'V_925', + particles = [ P.n1, P.x1__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_428,(0,1):C.GC_634}) + +V_926 = Vertex(name = 'V_926', + particles = [ P.n2, P.x1__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_451,(0,1):C.GC_635}) + +V_927 = Vertex(name = 'V_927', + particles = [ P.n3, P.x1__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_474,(0,1):C.GC_636}) + +V_928 = Vertex(name = 'V_928', + particles = [ P.n4, P.x1__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_497,(0,1):C.GC_637}) + +V_929 = Vertex(name = 'V_929', + particles = [ P.n1, P.x2__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_429,(0,1):C.GC_653}) + +V_930 = Vertex(name = 'V_930', + particles = [ P.n2, P.x2__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_452,(0,1):C.GC_654}) + +V_931 = Vertex(name = 'V_931', + particles = [ P.n3, P.x2__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_475,(0,1):C.GC_655}) + +V_932 = Vertex(name = 'V_932', + particles = [ P.n4, P.x2__plus__, P.W__minus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_498,(0,1):C.GC_656}) + +V_933 = Vertex(name = 'V_933', + particles = [ P.u__tilde__, P.d, P.W__plus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_404}) + +V_934 = Vertex(name = 'V_934', + particles = [ P.c__tilde__, P.s, P.W__plus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_405}) + +V_935 = Vertex(name = 'V_935', + particles = [ P.t__tilde__, P.b, P.W__plus__ ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_406}) + +V_936 = Vertex(name = 'V_936', + particles = [ P.x1__minus__, P.n1, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_670,(0,1):C.GC_420}) + +V_937 = Vertex(name = 'V_937', + particles = [ P.x2__minus__, P.n1, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_687,(0,1):C.GC_421}) + +V_938 = Vertex(name = 'V_938', + particles = [ P.x1__minus__, P.n2, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_671,(0,1):C.GC_443}) + +V_939 = Vertex(name = 'V_939', + particles = [ P.x2__minus__, P.n2, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_688,(0,1):C.GC_444}) + +V_940 = Vertex(name = 'V_940', + particles = [ P.x1__minus__, P.n3, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_672,(0,1):C.GC_466}) + +V_941 = Vertex(name = 'V_941', + particles = [ P.x2__minus__, P.n3, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_689,(0,1):C.GC_467}) + +V_942 = Vertex(name = 'V_942', + particles = [ P.x1__minus__, P.n4, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_673,(0,1):C.GC_489}) + +V_943 = Vertex(name = 'V_943', + particles = [ P.x2__minus__, P.n4, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_690,(0,1):C.GC_490}) + +V_944 = Vertex(name = 'V_944', + particles = [ P.ve__tilde__, P.e__minus__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_143}) + +V_945 = Vertex(name = 'V_945', + particles = [ P.vm__tilde__, P.mu__minus__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_143}) + +V_946 = Vertex(name = 'V_946', + particles = [ P.vt__tilde__, P.tau__minus__, P.W__plus__ ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_143}) + +V_947 = Vertex(name = 'V_947', + particles = [ P.d__tilde__, P.d, P.Z ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_248,(0,1):C.GC_249}) + +V_948 = Vertex(name = 'V_948', + particles = [ P.s__tilde__, P.s, P.Z ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_248,(0,1):C.GC_249}) + +V_949 = Vertex(name = 'V_949', + particles = [ P.b__tilde__, P.b, P.Z ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_248,(0,1):C.GC_249}) + +V_950 = Vertex(name = 'V_950', + particles = [ P.e__plus__, P.e__minus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_248,(0,1):C.GC_251}) + +V_951 = Vertex(name = 'V_951', + particles = [ P.mu__plus__, P.mu__minus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_248,(0,1):C.GC_251}) + +V_952 = Vertex(name = 'V_952', + particles = [ P.tau__plus__, P.tau__minus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_248,(0,1):C.GC_251}) + +V_953 = Vertex(name = 'V_953', + particles = [ P.u__tilde__, P.u, P.Z ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_247,(0,1):C.GC_250}) + +V_954 = Vertex(name = 'V_954', + particles = [ P.c__tilde__, P.c, P.Z ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_247,(0,1):C.GC_250}) + +V_955 = Vertex(name = 'V_955', + particles = [ P.t__tilde__, P.t, P.Z ], + color = [ 'Identity(1,2)' ], + lorentz = [ L.FFV2, L.FFV5 ], + couplings = {(0,0):C.GC_247,(0,1):C.GC_250}) + +V_956 = Vertex(name = 'V_956', + particles = [ P.ve__tilde__, P.ve, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_247}) + +V_957 = Vertex(name = 'V_957', + particles = [ P.vm__tilde__, P.vm, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_247}) + +V_958 = Vertex(name = 'V_958', + particles = [ P.vt__tilde__, P.vt, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2 ], + couplings = {(0,0):C.GC_247}) + +V_959 = Vertex(name = 'V_959', + particles = [ P.n1, P.n1, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV4 ], + couplings = {(0,0):C.GC_422}) + +V_960 = Vertex(name = 'V_960', + particles = [ P.n2, P.n1, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_445,(0,1):C.GC_423}) + +V_961 = Vertex(name = 'V_961', + particles = [ P.n3, P.n1, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_468,(0,1):C.GC_424}) + +V_962 = Vertex(name = 'V_962', + particles = [ P.n4, P.n1, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_491,(0,1):C.GC_425}) + +V_963 = Vertex(name = 'V_963', + particles = [ P.n2, P.n2, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV4 ], + couplings = {(0,0):C.GC_446}) + +V_964 = Vertex(name = 'V_964', + particles = [ P.n3, P.n2, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_469,(0,1):C.GC_447}) + +V_965 = Vertex(name = 'V_965', + particles = [ P.n4, P.n2, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_492,(0,1):C.GC_448}) + +V_966 = Vertex(name = 'V_966', + particles = [ P.n3, P.n3, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV4 ], + couplings = {(0,0):C.GC_470}) + +V_967 = Vertex(name = 'V_967', + particles = [ P.n4, P.n3, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_493,(0,1):C.GC_471}) + +V_968 = Vertex(name = 'V_968', + particles = [ P.n4, P.n4, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV4 ], + couplings = {(0,0):C.GC_494}) + +V_969 = Vertex(name = 'V_969', + particles = [ P.x1__minus__, P.x1__plus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_675,(0,1):C.GC_639}) + +V_970 = Vertex(name = 'V_970', + particles = [ P.x2__minus__, P.x1__plus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_692,(0,1):C.GC_641}) + +V_971 = Vertex(name = 'V_971', + particles = [ P.x1__minus__, P.x2__plus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_677,(0,1):C.GC_658}) + +V_972 = Vertex(name = 'V_972', + particles = [ P.x2__minus__, P.x2__plus__, P.Z ], + color = [ '1' ], + lorentz = [ L.FFV2, L.FFV3 ], + couplings = {(0,0):C.GC_694,(0,1):C.GC_660}) + Index: trunk/omega/tests/UFO/MSSM/particles.py =================================================================== --- trunk/omega/tests/UFO/MSSM/particles.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/particles.py (revision 8416) @@ -0,0 +1,814 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:07 + + +from __future__ import division +from object_library import all_particles, Particle +import parameters as Param + +import propagators as Prop + +a = Particle(pdg_code = 22, + name = 'a', + antiname = 'a', + spin = 3, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'a', + antitexname = 'a', + charge = 0, + GhostNumber = 0, + Y = 0) + +Z = Particle(pdg_code = 23, + name = 'Z', + antiname = 'Z', + spin = 3, + color = 1, + mass = Param.MZ, + width = Param.WZ, + texname = 'Z', + antitexname = 'Z', + charge = 0, + GhostNumber = 0, + Y = 0) + +W__plus__ = Particle(pdg_code = 24, + name = 'W+', + antiname = 'W-', + spin = 3, + color = 1, + mass = Param.MW, + width = Param.WW, + texname = 'W+', + antitexname = 'W-', + charge = 1, + GhostNumber = 0, + Y = 0) + +W__minus__ = W__plus__.anti() + +g = Particle(pdg_code = 21, + name = 'g', + antiname = 'g', + spin = 3, + color = 8, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'g', + antitexname = 'g', + charge = 0, + GhostNumber = 0, + Y = 0) + +n1 = Particle(pdg_code = 1000022, + name = 'n1', + antiname = 'n1', + spin = 2, + color = 1, + mass = Param.Mneu1, + width = Param.ZERO, + texname = 'n1', + antitexname = 'n1', + charge = 0, + GhostNumber = 0, + Y = 0) + +n2 = Particle(pdg_code = 1000023, + name = 'n2', + antiname = 'n2', + spin = 2, + color = 1, + mass = Param.Mneu2, + width = Param.Wneu2, + texname = 'n2', + antitexname = 'n2', + charge = 0, + GhostNumber = 0, + Y = 0) + +n3 = Particle(pdg_code = 1000025, + name = 'n3', + antiname = 'n3', + spin = 2, + color = 1, + mass = Param.Mneu3, + width = Param.Wneu3, + texname = 'n3', + antitexname = 'n3', + charge = 0, + GhostNumber = 0, + Y = 0) + +n4 = Particle(pdg_code = 1000035, + name = 'n4', + antiname = 'n4', + spin = 2, + color = 1, + mass = Param.Mneu4, + width = Param.Wneu4, + texname = 'n4', + antitexname = 'n4', + charge = 0, + GhostNumber = 0, + Y = 0) + +x1__plus__ = Particle(pdg_code = 1000024, + name = 'x1+', + antiname = 'x1-', + spin = 2, + color = 1, + mass = Param.Mch1, + width = Param.Wch1, + texname = 'x1+', + antitexname = 'x1-', + charge = 1, + GhostNumber = 0, + Y = 0) + +x1__minus__ = x1__plus__.anti() + +x2__plus__ = Particle(pdg_code = 1000037, + name = 'x2+', + antiname = 'x2-', + spin = 2, + color = 1, + mass = Param.Mch2, + width = Param.Wch2, + texname = 'x2+', + antitexname = 'x2-', + charge = 1, + GhostNumber = 0, + Y = 0) + +x2__minus__ = x2__plus__.anti() + +go = Particle(pdg_code = 1000021, + name = 'go', + antiname = 'go', + spin = 2, + color = 8, + mass = Param.Mgo, + width = Param.Wgo, + texname = 'go', + antitexname = 'go', + charge = 0, + GhostNumber = 0, + Y = 0) + +h01 = Particle(pdg_code = 25, + name = 'h01', + antiname = 'h01', + spin = 1, + color = 1, + mass = Param.MH01, + width = Param.WH01, + texname = 'h01', + antitexname = 'h01', + charge = 0, + GhostNumber = 0, + Y = 0) + +h02 = Particle(pdg_code = 35, + name = 'h02', + antiname = 'h02', + spin = 1, + color = 1, + mass = Param.MH02, + width = Param.WH02, + texname = 'h02', + antitexname = 'h02', + charge = 0, + GhostNumber = 0, + Y = 0) + +A0 = Particle(pdg_code = 36, + name = 'A0', + antiname = 'A0', + spin = 1, + color = 1, + mass = Param.MA0, + width = Param.WA0, + texname = 'A0', + antitexname = 'A0', + charge = 0, + GhostNumber = 0, + Y = 0) + +H__plus__ = Particle(pdg_code = 37, + name = 'H+', + antiname = 'H-', + spin = 1, + color = 1, + mass = Param.MH, + width = Param.WH, + texname = 'H+', + antitexname = 'H-', + charge = 1, + GhostNumber = 0, + Y = 0) + +H__minus__ = H__plus__.anti() + +G0 = Particle(pdg_code = 250, + name = 'G0', + antiname = 'G0', + spin = 1, + color = 1, + mass = Param.MZ, + width = Param.ZERO, + texname = 'G0', + antitexname = 'G0', + goldstone = True, + charge = 0, + GhostNumber = 0, + Y = 0) + +G__plus__ = Particle(pdg_code = 251, + name = 'G+', + antiname = 'G-', + spin = 1, + color = 1, + mass = Param.MW, + width = Param.ZERO, + texname = 'G+', + antitexname = 'G-', + goldstone = True, + charge = 1, + GhostNumber = 0, + Y = 0) + +G__minus__ = G__plus__.anti() + +ve = Particle(pdg_code = 12, + name = 've', + antiname = 've~', + spin = 2, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 've', + antitexname = 've~', + charge = 0, + GhostNumber = 0, + Y = 0) + +ve__tilde__ = ve.anti() + +vm = Particle(pdg_code = 14, + name = 'vm', + antiname = 'vm~', + spin = 2, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'vm', + antitexname = 'vm~', + charge = 0, + GhostNumber = 0, + Y = 0) + +vm__tilde__ = vm.anti() + +vt = Particle(pdg_code = 16, + name = 'vt', + antiname = 'vt~', + spin = 2, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'vt', + antitexname = 'vt~', + charge = 0, + GhostNumber = 0, + Y = 0) + +vt__tilde__ = vt.anti() + +e__minus__ = Particle(pdg_code = 11, + name = 'e-', + antiname = 'e+', + spin = 2, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'e-', + antitexname = 'e+', + charge = -1, + GhostNumber = 0, + Y = 0) + +e__plus__ = e__minus__.anti() + +mu__minus__ = Particle(pdg_code = 13, + name = 'mu-', + antiname = 'mu+', + spin = 2, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'mu-', + antitexname = 'mu+', + charge = -1, + GhostNumber = 0, + Y = 0) + +mu__plus__ = mu__minus__.anti() + +tau__minus__ = Particle(pdg_code = 15, + name = 'tau-', + antiname = 'tau+', + spin = 2, + color = 1, + mass = Param.Mta, + width = Param.ZERO, + texname = 'tau-', + antitexname = 'tau+', + charge = -1, + GhostNumber = 0, + Y = 0) + +tau__plus__ = tau__minus__.anti() + +u = Particle(pdg_code = 2, + name = 'u', + antiname = 'u~', + spin = 2, + color = 3, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'u', + antitexname = 'u~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +u__tilde__ = u.anti() + +c = Particle(pdg_code = 4, + name = 'c', + antiname = 'c~', + spin = 2, + color = 3, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'c', + antitexname = 'c~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +c__tilde__ = c.anti() + +t = Particle(pdg_code = 6, + name = 't', + antiname = 't~', + spin = 2, + color = 3, + mass = Param.MT, + width = Param.WT, + texname = 't', + antitexname = 't~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +t__tilde__ = t.anti() + +d = Particle(pdg_code = 1, + name = 'd', + antiname = 'd~', + spin = 2, + color = 3, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'd', + antitexname = 'd~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +d__tilde__ = d.anti() + +s = Particle(pdg_code = 3, + name = 's', + antiname = 's~', + spin = 2, + color = 3, + mass = Param.ZERO, + width = Param.ZERO, + texname = 's', + antitexname = 's~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +s__tilde__ = s.anti() + +b = Particle(pdg_code = 5, + name = 'b', + antiname = 'b~', + spin = 2, + color = 3, + mass = Param.MB, + width = Param.ZERO, + texname = 'b', + antitexname = 'b~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +b__tilde__ = b.anti() + +sv1 = Particle(pdg_code = 1000012, + name = 'sv1', + antiname = 'sv1~', + spin = 1, + color = 1, + mass = Param.Msn1, + width = Param.Wsn1, + texname = 'sv1', + antitexname = 'sv1~', + charge = 0, + GhostNumber = 0, + Y = 0) + +sv1__tilde__ = sv1.anti() + +sv2 = Particle(pdg_code = 1000014, + name = 'sv2', + antiname = 'sv2~', + spin = 1, + color = 1, + mass = Param.Msn2, + width = Param.Wsn2, + texname = 'sv2', + antitexname = 'sv2~', + charge = 0, + GhostNumber = 0, + Y = 0) + +sv2__tilde__ = sv2.anti() + +sv3 = Particle(pdg_code = 1000016, + name = 'sv3', + antiname = 'sv3~', + spin = 1, + color = 1, + mass = Param.Msn3, + width = Param.Wsn3, + texname = 'sv3', + antitexname = 'sv3~', + charge = 0, + GhostNumber = 0, + Y = 0) + +sv3__tilde__ = sv3.anti() + +sl1__minus__ = Particle(pdg_code = 1000011, + name = 'sl1-', + antiname = 'sl1+', + spin = 1, + color = 1, + mass = Param.Msl1, + width = Param.Wsl1, + texname = 'sl1-', + antitexname = 'sl1+', + charge = -1, + GhostNumber = 0, + Y = 0) + +sl1__plus__ = sl1__minus__.anti() + +sl2__minus__ = Particle(pdg_code = 1000013, + name = 'sl2-', + antiname = 'sl2+', + spin = 1, + color = 1, + mass = Param.Msl2, + width = Param.Wsl2, + texname = 'sl2-', + antitexname = 'sl2+', + charge = -1, + GhostNumber = 0, + Y = 0) + +sl2__plus__ = sl2__minus__.anti() + +sl3__minus__ = Particle(pdg_code = 1000015, + name = 'sl3-', + antiname = 'sl3+', + spin = 1, + color = 1, + mass = Param.Msl3, + width = Param.Wsl3, + texname = 'sl3-', + antitexname = 'sl3+', + charge = -1, + GhostNumber = 0, + Y = 0) + +sl3__plus__ = sl3__minus__.anti() + +sl4__minus__ = Particle(pdg_code = 2000011, + name = 'sl4-', + antiname = 'sl4+', + spin = 1, + color = 1, + mass = Param.Msl4, + width = Param.Wsl4, + texname = 'sl4-', + antitexname = 'sl4+', + charge = -1, + GhostNumber = 0, + Y = 0) + +sl4__plus__ = sl4__minus__.anti() + +sl5__minus__ = Particle(pdg_code = 2000013, + name = 'sl5-', + antiname = 'sl5+', + spin = 1, + color = 1, + mass = Param.Msl5, + width = Param.Wsl5, + texname = 'sl5-', + antitexname = 'sl5+', + charge = -1, + GhostNumber = 0, + Y = 0) + +sl5__plus__ = sl5__minus__.anti() + +sl6__minus__ = Particle(pdg_code = 2000015, + name = 'sl6-', + antiname = 'sl6+', + spin = 1, + color = 1, + mass = Param.Msl6, + width = Param.Wsl6, + texname = 'sl6-', + antitexname = 'sl6+', + charge = -1, + GhostNumber = 0, + Y = 0) + +sl6__plus__ = sl6__minus__.anti() + +su1 = Particle(pdg_code = 1000002, + name = 'su1', + antiname = 'su1~', + spin = 1, + color = 3, + mass = Param.Msu1, + width = Param.Wsu1, + texname = 'su1', + antitexname = 'su1~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +su1__tilde__ = su1.anti() + +su2 = Particle(pdg_code = 1000004, + name = 'su2', + antiname = 'su2~', + spin = 1, + color = 3, + mass = Param.Msu2, + width = Param.Wsu2, + texname = 'su2', + antitexname = 'su2~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +su2__tilde__ = su2.anti() + +su3 = Particle(pdg_code = 1000006, + name = 'su3', + antiname = 'su3~', + spin = 1, + color = 3, + mass = Param.Msu3, + width = Param.Wsu3, + texname = 'su3', + antitexname = 'su3~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +su3__tilde__ = su3.anti() + +su4 = Particle(pdg_code = 2000002, + name = 'su4', + antiname = 'su4~', + spin = 1, + color = 3, + mass = Param.Msu4, + width = Param.Wsu4, + texname = 'su4', + antitexname = 'su4~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +su4__tilde__ = su4.anti() + +su5 = Particle(pdg_code = 2000004, + name = 'su5', + antiname = 'su5~', + spin = 1, + color = 3, + mass = Param.Msu5, + width = Param.Wsu5, + texname = 'su5', + antitexname = 'su5~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +su5__tilde__ = su5.anti() + +su6 = Particle(pdg_code = 2000006, + name = 'su6', + antiname = 'su6~', + spin = 1, + color = 3, + mass = Param.Msu6, + width = Param.Wsu6, + texname = 'su6', + antitexname = 'su6~', + charge = 2/3, + GhostNumber = 0, + Y = 0) + +su6__tilde__ = su6.anti() + +sd1 = Particle(pdg_code = 1000001, + name = 'sd1', + antiname = 'sd1~', + spin = 1, + color = 3, + mass = Param.Msd1, + width = Param.Wsd1, + texname = 'sd1', + antitexname = 'sd1~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +sd1__tilde__ = sd1.anti() + +sd2 = Particle(pdg_code = 1000003, + name = 'sd2', + antiname = 'sd2~', + spin = 1, + color = 3, + mass = Param.Msd2, + width = Param.Wsd2, + texname = 'sd2', + antitexname = 'sd2~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +sd2__tilde__ = sd2.anti() + +sd3 = Particle(pdg_code = 1000005, + name = 'sd3', + antiname = 'sd3~', + spin = 1, + color = 3, + mass = Param.Msd3, + width = Param.Wsd3, + texname = 'sd3', + antitexname = 'sd3~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +sd3__tilde__ = sd3.anti() + +sd4 = Particle(pdg_code = 2000001, + name = 'sd4', + antiname = 'sd4~', + spin = 1, + color = 3, + mass = Param.Msd4, + width = Param.Wsd4, + texname = 'sd4', + antitexname = 'sd4~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +sd4__tilde__ = sd4.anti() + +sd5 = Particle(pdg_code = 2000003, + name = 'sd5', + antiname = 'sd5~', + spin = 1, + color = 3, + mass = Param.Msd5, + width = Param.Wsd5, + texname = 'sd5', + antitexname = 'sd5~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +sd5__tilde__ = sd5.anti() + +sd6 = Particle(pdg_code = 2000005, + name = 'sd6', + antiname = 'sd6~', + spin = 1, + color = 3, + mass = Param.Msd6, + width = Param.Wsd6, + texname = 'sd6', + antitexname = 'sd6~', + charge = -1/3, + GhostNumber = 0, + Y = 0) + +sd6__tilde__ = sd6.anti() + +ghG = Particle(pdg_code = 9000001, + name = 'ghG', + antiname = 'ghG~', + spin = -1, + color = 8, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'ghG', + antitexname = 'ghG~', + charge = 0, + GhostNumber = 1, + Y = 0) + +ghG__tilde__ = ghG.anti() + +ghA = Particle(pdg_code = 9000002, + name = 'ghA', + antiname = 'ghA~', + spin = -1, + color = 1, + mass = Param.ZERO, + width = Param.ZERO, + texname = 'ghA', + antitexname = 'ghA~', + charge = 0, + GhostNumber = 1, + Y = 0) + +ghA__tilde__ = ghA.anti() + +ghZ = Particle(pdg_code = 9000003, + name = 'ghZ', + antiname = 'ghZ~', + spin = -1, + color = 1, + mass = Param.MZ, + width = Param.WZ, + texname = 'ghZ', + antitexname = 'ghZ~', + charge = 0, + GhostNumber = 1, + Y = 0) + +ghZ__tilde__ = ghZ.anti() + +ghWp = Particle(pdg_code = 9000004, + name = 'ghWp', + antiname = 'ghWp~', + spin = -1, + color = 1, + mass = Param.MW, + width = Param.WW, + texname = 'ghWp', + antitexname = 'ghWp~', + charge = 1, + GhostNumber = 1, + Y = 0) + +ghWp__tilde__ = ghWp.anti() + +ghWm = Particle(pdg_code = 9000005, + name = 'ghWm', + antiname = 'ghWm~', + spin = -1, + color = 1, + mass = Param.MW, + width = Param.WW, + texname = 'ghWm', + antitexname = 'ghWm~', + charge = -1, + GhostNumber = 1, + Y = 0) + +ghWm__tilde__ = ghWm.anti() + Index: trunk/omega/tests/UFO/MSSM/CT_couplings.py =================================================================== --- trunk/omega/tests/UFO/MSSM/CT_couplings.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/CT_couplings.py (revision 8416) @@ -0,0 +1,11 @@ +# This file was automatically created by FeynRules 1.7.214 +# Mathematica version: 9.0 for Mac OS X x86 (64-bit) (January 24, 2013) +# Date: Mon 26 Aug 2013 03:14:13 + + +from object_library import all_couplings, Coupling + +from function_library import complexconjugate, re, im, csc, sec, acsc, asec, cot + + + Index: trunk/omega/tests/UFO/MSSM/function_library.py =================================================================== --- trunk/omega/tests/UFO/MSSM/function_library.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/function_library.py (revision 8416) @@ -0,0 +1,62 @@ +# This file is part of the UFO. +# +# This file contains definitions for functions that +# are extensions of the cmath library, and correspond +# either to functions that are in cmath, but inconvenient +# to access from there (e.g. z.conjugate()), +# or functions that are simply not defined. +# +# + +__date__ = "22 July 2010" +__author__ = "claude.duhr@durham.ac.uk" + +import cmath +from object_library import all_functions, Function + +# +# shortcuts for functions from cmath +# + +complexconjugate = Function(name = 'complexconjugate', + arguments = ('z',), + expression = 'z.conjugate()') + + +re = Function(name = 're', + arguments = ('z',), + expression = 'z.real') + +im = Function(name = 'im', + arguments = ('z',), + expression = 'z.imag') + +# New functions (trigonometric) + +sec = Function(name = 'sec', + arguments = ('z',), + expression = '1./cmath.cos(z)') + +asec = Function(name = 'asec', + arguments = ('z',), + expression = 'cmath.acos(1./z)') + +csc = Function(name = 'csc', + arguments = ('z',), + expression = '1./cmath.sin(z)') + +acsc = Function(name = 'acsc', + arguments = ('z',), + expression = 'cmath.asin(1./z)') + +cot = Function(name = 'cot', + arguments = ('z',), + expression = '1./cmath.tan(z)') + +# Heaviside theta function + +theta_function = Function(name = 'theta_function', + arguments = ('x','y','z'), + expression = 'y if x else z') + + Index: trunk/omega/tests/UFO/MSSM/object_library.py =================================================================== --- trunk/omega/tests/UFO/MSSM/object_library.py (revision 0) +++ trunk/omega/tests/UFO/MSSM/object_library.py (revision 8416) @@ -0,0 +1,377 @@ +## +## +## Feynrules Header +## +## +## +## +## + +import cmath +import re + +class UFOError(Exception): + """Exception raised if when inconsistencies are detected in the UFO model.""" + pass + +class UFOBaseClass(object): + """The class from which all FeynRules classes are derived.""" + + require_args = [] + + def __init__(self, *args, **options): + assert(len(self.require_args) == len (args)) + + for i, name in enumerate(self.require_args): + setattr(self, name, args[i]) + + for (option, value) in options.items(): + setattr(self, option, value) + + def get(self, name): + return getattr(self, name) + + def set(self, name, value): + setattr(self, name, value) + + def get_all(self): + """Return a dictionary containing all the information of the object""" + return self.__dict__ + + def __str__(self): + return self.name + + def nice_string(self): + """ return string with the full information """ + return '\n'.join(['%s \t: %s' %(name, value) for name, value in self.__dict__.items()]) + + def __repr__(self): + replacements = [ + ('+','__plus__'), + ('-','__minus__'), + ('@','__at__'), + ('!','__exclam__'), + ('?','__quest__'), + ('*','__star__'), + ('~','__tilde__') + ] + text = self.name + for orig,sub in replacements: + text = text.replace(orig,sub) + return text + + + +all_particles = [] + +class Particle(UFOBaseClass): + """A standard Particle""" + + require_args=['pdg_code', 'name', 'antiname', 'spin', 'color', 'mass', 'width', 'texname', 'antitexname', 'charge'] + + require_args_all = ['pdg_code', 'name', 'antiname', 'spin', 'color', 'mass', 'width', 'texname', 'antitexname','counterterm','charge', 'line', 'propagating', 'goldstoneboson', 'propagator'] + + def __init__(self, pdg_code, name, antiname, spin, color, mass, width, texname, + antitexname, charge , line=None, propagating=True, counterterm=None, goldstoneboson=False, + propagator=None, **options): + + args= (pdg_code, name, antiname, spin, color, mass, width, texname, + antitexname, float(charge)) + + UFOBaseClass.__init__(self, *args, **options) + + global all_particles + all_particles.append(self) + + self.propagating = propagating + self.goldstoneboson= goldstoneboson + + self.selfconjugate = (name == antiname) + if not line: + self.line = self.find_line_type() + else: + self.line = line + + if propagator: + if isinstance(propagator, dict): + self.propagator = propagator + else: + self.propagator = {0: propagator, 1: propagator} + + def find_line_type(self): + """ find how we draw a line if not defined + valid output: dashed/straight/wavy/curly/double/swavy/scurly + """ + + spin = self.spin + color = self.color + + #use default + if spin == 1: + return 'dashed' + elif spin == 2: + if not self.selfconjugate: + return 'straight' + elif color == 1: + return 'swavy' + else: + return 'scurly' + elif spin == 3: + if color == 1: + return 'wavy' + + else: + return 'curly' + elif spin == 5: + return 'double' + elif spin == -1: + return 'dotted' + else: + return 'dashed' # not supported yet + + def anti(self): + if self.selfconjugate: + raise Exception('%s has no anti particle.' % self.name) + outdic = {} + for k,v in self.__dict__.iteritems(): + if k not in self.require_args_all: + outdic[k] = -v + if self.color in [1,8]: + newcolor = self.color + else: + newcolor = -self.color + + return Particle(-self.pdg_code, self.antiname, self.name, self.spin, newcolor, self.mass, self.width, + self.antitexname, self.texname, -self.charge, self.line, self.propagating, self.goldstoneboson, **outdic) + + + +all_parameters = [] + +class Parameter(UFOBaseClass): + + require_args=['name', 'nature', 'type', 'value', 'texname'] + + def __init__(self, name, nature, type, value, texname, lhablock=None, lhacode=None): + + args = (name,nature,type,value,texname) + + UFOBaseClass.__init__(self, *args) + + args=(name,nature,type,value,texname) + + global all_parameters + all_parameters.append(self) + + if (lhablock is None or lhacode is None) and nature == 'external': + raise Exception('Need LHA information for external parameter "%s".' % name) + self.lhablock = lhablock + self.lhacode = lhacode + +all_CTparameters = [] + +class CTParameter(UFOBaseClass): + + require_args=['name', 'nature,', 'type', 'value', 'texname'] + + def __init__(self, name, type, value, texname): + + args = (name,'internal',type,value,texname) + + UFOBaseClass.__init__(self, *args) + + args=(name,'internal',type,value,texname) + + self.nature='interal' + + global all_CTparameters + all_CTparameters.append(self) + + def finite(self): + try: + return self.value[0] + except KeyError: + return 'ZERO' + + def pole(self, x): + try: + return self.value[-x] + except KeyError: + return 'ZERO' + +all_vertices = [] + +class Vertex(UFOBaseClass): + + require_args=['name', 'particles', 'color', 'lorentz', 'couplings'] + + def __init__(self, name, particles, color, lorentz, couplings, **opt): + + args = (name, particles, color, lorentz, couplings) + + UFOBaseClass.__init__(self, *args, **opt) + + args=(particles,color,lorentz,couplings) + + global all_vertices + all_vertices.append(self) + +all_CTvertices = [] + +class CTVertex(UFOBaseClass): + + require_args=['name', 'particles', 'color', 'lorentz', 'couplings', 'type', 'loop_particles'] + + def __init__(self, name, particles, color, lorentz, couplings, type, loop_particles, **opt): + + args = (name, particles, color, lorentz, couplings, type, loop_particles) + + UFOBaseClass.__init__(self, *args, **opt) + + args=(particles,color,lorentz,couplings, type, loop_particles) + + global all_CTvertices + all_CTvertices.append(self) + +all_couplings = [] + +class Coupling(UFOBaseClass): + + require_args=['name', 'value', 'order'] + + require_args_all=['name', 'value', 'order', 'loop_particles', 'counterterm'] + + def __init__(self, name, value, order, **opt): + + args =(name, value, order) + UFOBaseClass.__init__(self, *args, **opt) + global all_couplings + all_couplings.append(self) + + def value(self): + return self.pole(0) + + def pole(self, x): + """ the self.value attribute can be a dictionary directly specifying the Laurent serie using normal + parameter or just a string which can possibly contain CTparameter defining the Laurent serie.""" + + if isinstance(self.value,dict): + if -x in self.value.keys(): + return self.value[-x] + else: + return 'ZERO' + + CTparam=None + for param in all_CTparameters: + pattern=re.compile(r"(?P\A|\*|\+|\-|\()(?P"+param.name+r")(?P\Z|\*|\+|\-|\))") + numberOfMatches=len(pattern.findall(self.value)) + if numberOfMatches==1: + if not CTparam: + CTparam=param + else: + raise UFOError, "UFO does not support yet more than one occurence of CTParameters in the couplings values." + elif numberOfMatches>1: + raise UFOError, "UFO does not support yet more than one occurence of CTParameters in the couplings values." + + if not CTparam: + if x==0: + return self.value + else: + return 'ZERO' + else: + if CTparam.pole(x)=='ZERO': + return 'ZERO' + else: + def substitution(matchedObj): + return matchedObj.group('first')+"("+CTparam.pole(x)+")"+matchedObj.group('second') + pattern=re.compile(r"(?P\A|\*|\+|\-|\()(?P"+CTparam.name+r")(?P\Z|\*|\+|\-|\))") + return pattern.sub(substitution,self.value) + +all_lorentz = [] + +class Lorentz(UFOBaseClass): + + require_args=['name','spins','structure'] + + def __init__(self, name, spins, structure='external', **opt): + args = (name, spins, structure) + UFOBaseClass.__init__(self, *args, **opt) + + global all_lorentz + all_lorentz.append(self) + + +all_functions = [] + +class Function(object): + + def __init__(self, name, arguments, expression): + + global all_functions + all_functions.append(self) + + self.name = name + self.arguments = arguments + self.expr = expression + + def __call__(self, *opt): + + for i, arg in enumerate(self.arguments): + exec('%s = %s' % (arg, opt[i] )) + + return eval(self.expr) + +all_orders = [] + +class CouplingOrder(object): + + def __init__(self, name, expansion_order, hierarchy, perturbative_expansion = 0): + + global all_orders + all_orders.append(self) + + self.name = name + self.expansion_order = expansion_order + self.hierarchy = hierarchy + self.perturbative_expansion = perturbative_expansion + +all_decays = [] + +class Decay(UFOBaseClass): + require_args = ['particle','partial_widths'] + + def __init__(self, particle, partial_widths, **opt): + args = (particle, partial_widths) + UFOBaseClass.__init__(self, *args, **opt) + + global all_decays + all_decays.append(self) + + # Add the information directly to the particle + particle.partial_widths = partial_widths + +all_form_factors = [] + +class FormFactor(UFOBaseClass): + require_args = ['name','type','value'] + + def __init__(self, name, type, value, **opt): + args = (name, type, value) + UFOBaseClass.__init__(self, *args, **opt) + + global all_form_factors + all_form_factors.append(self) + + +all_propagators = [] + +class Propagator(UFOBaseClass): + + require_args = ['name','numerator','denominator'] + + def __init__(self, name, numerator, denominator=None, **opt): + args = (name, numerator, denominator) + UFOBaseClass.__init__(self, *args, **opt) + + global all_propagators + all_propagators.append(self) Index: trunk/omega/tests/README =================================================================== --- trunk/omega/tests/README (revision 0) +++ trunk/omega/tests/README (revision 8416) @@ -0,0 +1,118 @@ +Here's an overview of the tests of O'Mega that are performed by 'make check' + +######################################################################## + +Essential tests: + + omega_unit + + unit tests of the O'Mega library modules + + ects (Extended Colorflow Test-Suite) + + despite the name, this just checks some very simple color + flows against reference results in *.ects files + + cascade + + test the '-cascade' option in simple cases against reference + results in *.cascades files + + phase_space + + test the '-phase_space' option used by WHIZARD's new phase + space generator simple cases against reference results in + *.phs files + + test_qed_eemm + + compare the amplitude for e+ e- -> mu+ mu- at one phase + space point against a reference value + + compare_split_function + compare_split_module + + check that splitting the amplitude into smaller subroutines + or modules does not change the result + + test_omega95 + test_omega95_bispinors + + check properties of wave functions and hardcoded couplings + form the omegalib: equations of motion, current conservation, + etc. + + keystones_omegalib + keystones_omegalib_bispinors + + check that splitting a vertex into a wavefunction for one + leg and a hardcoded current for the remaining legs gives + the same result for each leg + + keystones_UFO + keystones_UFO_bispinors + + check that splitting a vertex into wavefunction for one leg + and current for the remaining legs gives the same result + for each leg. In addition, test Fierz identities and + different UFO expressions for the same vertex. If available, + also compare to the currents from omegalib. + + fermi + fermi_UFO + + test the (anti-)symmetry of amplitudes under exchange of + external particles + + ward + ward_UFO + + test Ward identities for one external gauge boson + + compare_amplitude_VM + + check that the amplitudes computed by the virtual machine + agree with the amplitudes computed by the compiled code + + compare_amplitude_UFO + + check that the amplitudes computed for a hardcoded model + agree with the amplitudes computed for the equivalent + UFO model + + + compare_majorana_legacy + + check that amplitudes in hardcoded models computed with + the default implementation of Fermi statistics for Dirac + spinors agree with JRR's implementation of Fermi statistics + for Majorana spinors + + compare_majorana + + check that amplitudes in hardcoded models computed with + the default implementation of Fermi statistics for Dirac + spinors agree with the new, UFO friendly, implementation + of Fermi statistics for Majorana spinors + + compare_majorana_UFO + + check that amplitudes in UFO models computed with the + implementation of Fermi statistics for Dirac spinors agree + with the implementation of Fermi statistics for Majorana spinors + + +######################################################################## + +The remaining tests could be removed from TESTS: + + ufo_unit + + despite the name, this is for interactive testing and will + not perform meaningful tests if called without arguments + + vertex_unit + + partially test an incomplete implementation of an alternative + model file format, that is not used in production + Index: trunk/omega/tests/omega_unit.ml =================================================================== --- trunk/omega/tests/omega_unit.ml (revision 8415) +++ trunk/omega/tests/omega_unit.ml (revision 8416) @@ -1,207 +1,209 @@ (* omega_unit.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) open OUnit let unattended = ref true let skip_if_unattended () = skip_if !unattended "not suitable for unattended tests" let trivial_test = "trivial" >:: (bracket (fun () -> true) (fun b -> assert_bool "always true" b) (fun b -> ())) let short_random_list n = let l = ref [] in for i = 1 to n do l := Random.int 1024 :: !l done; !l let allowed_recursion_depth () = let rec allowed_recursion_depth' n = try allowed_recursion_depth' (succ n) with | Stack_overflow -> n in allowed_recursion_depth' 0 let long_random_list factor = let n = factor * allowed_recursion_depth () in let l = ref [] in for i = 1 to n do l := Random.int n :: !l done; !l module Integer = struct type t = int let compare = compare let pp_printer = Format.pp_print_int let pp_print_sep = OUnitDiff.pp_comma_separator end module Integer_List = OUnitDiff.ListSimpleMake(Integer) module ThoList_Unit_Tests = struct let inner_list = ThoList.range 1 5 let outer_list = List.map (( * ) 10) (ThoList.range 1 4) let f n = List.map ((+) n) inner_list let flatmap = "flatmap" >:: (fun () -> let result = ThoList.flatmap f outer_list and expected = List.flatten (List.map f outer_list) in assert_equal expected result) let rev_flatmap = "rev_flatmap" >:: (fun () -> let result = ThoList.rev_flatmap f outer_list and expected = List.rev (ThoList.flatmap f outer_list) in Integer_List.assert_equal expected result) let flatmap_stack_overflow = "flatmap_stack_overflow" >:: (fun () -> skip_if !unattended "memory limits not suitable for unattended tests"; let l = long_random_list 2 in let f n = List.map ((+) n) (short_random_list 2) in assert_raises Stack_overflow (fun () -> ThoList.flatmap f l)) let rev_flatmap_no_stack_overflow = "rev_flatmap_no_stack_overflow" >:: (fun () -> skip_if !unattended "memory limits not suitable for unattended tests"; let l = long_random_list 10 in let f n = List.map ((+) n) (short_random_list 10) in ignore (ThoList.rev_flatmap f l); assert_bool "always true" true) let suite = "ThoList" >::: [flatmap; flatmap_stack_overflow; rev_flatmap; rev_flatmap_no_stack_overflow ] end module IListSet = Set.Make (struct type t = int list let compare = compare end) let list_elements_unique l = let rec list_elements_unique' set = function | [] -> true | x :: rest -> if IListSet.mem x set then false else list_elements_unique' (IListSet.add x set) rest in list_elements_unique' IListSet.empty l let ilistset_test = "IListSet" >:: (fun () -> assert_bool "true" (list_elements_unique [[1];[2]]); assert_bool "false" (not (list_elements_unique [[1];[1]]))) module Combinatorics_Unit_Tests = struct let permute = "permute" >:: (fun () -> let n = 8 in let l = ThoList.range 1 n in let result = Combinatorics.permute l in assert_equal (Combinatorics.factorial n) (List.length result); assert_bool "unique" (list_elements_unique result)) let permute_no_stack_overflow = "permute_no_stack_overflow" >:: (fun () -> skip_if !unattended "memory limits not suitable for unattended tests"; let n = 10 in (* n = 10 needs 1 GB, n = 11 needs 7.3 GB *) let l = ThoList.range 1 n in let result = Combinatorics.permute l in assert_equal (Combinatorics.factorial n) (List.length result)) let suite = "Combinatorics" >::: [permute; permute_no_stack_overflow] end let selftest_suite = "testsuite" >::: [trivial_test; ilistset_test] module Permutation_Test_Using_Lists = Permutation.Test(Permutation.Using_Lists) module Permutation_Test_Using_Arrays = Permutation.Test(Permutation.Using_Arrays) let suite = "omega" >::: [selftest_suite; ThoList_Unit_Tests.suite; ThoList.Test.suite; ThoArray.Test.suite; Partial.Test.suite; Permutation_Test_Using_Lists.suite; Permutation_Test_Using_Arrays.suite; Combinatorics_Unit_Tests.suite; Combinatorics.Test.suite; Algebra.Q.Test.suite; Algebra.QC.Test.suite; Algebra.Laurent.Test.suite; Color.Arrow.Test.suite; Color.Birdtracks.Test.suite; Color.SU3.Test.suite; Color.U3.Test.suite; + UFO_targets.Fortran.Test.suite; + UFO_Lorentz.Test.suite; UFO.Test.suite; Format_Fortran.Test.suite; Dirac.Chiral.test_suite] let _ = ignore (run_test_tt_main ~arg_specs:[("-attended", Arg.Clear unattended, " run tests that depend on the environment"); ("-unattended", Arg.Set unattended, " don't run tests depend on the environment")] suite); exit 0 Index: trunk/omega/src/omega_SM_Maj.ml =================================================================== --- trunk/omega/src/omega_SM_Maj.ml (revision 8415) +++ trunk/omega/src/omega_SM_Maj.ml (revision 8416) @@ -1,36 +0,0 @@ -(* omega_SM_Maj.ml -- - - Copyright (C) 1999-2020 by - - Wolfgang Kilian - Thorsten Ohl - Juergen Reuter - with contributions from - Christian Speckner - - WHIZARD is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - WHIZARD is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) - -module O = Omega.Make - (Fusion.Binary_Majorana)(Targets.Fortran_Majorana) - (Modellib_SM.SM(Modellib_SM.SM_no_anomalous)) -let _ = O.main () - -(*i - * Local Variables: - * mode:caml - * indent-tabs-mode:nil - * page-delimiter:"^(\\* .*\n" - * End: -i*) Index: trunk/omega/src/modellib_WZW.ml =================================================================== --- trunk/omega/src/modellib_WZW.ml (revision 8415) +++ trunk/omega/src/modellib_WZW.ml (revision 8416) @@ -1,630 +1,631 @@ (* modellib_WZW.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{SM with WZW-type pseudoscalars} *) module type SM_flags = sig val include_anomalous : bool val k_matrix : bool end module SM_no_anomalous : SM_flags = struct let include_anomalous = false let k_matrix = false end module WZW (Flags : SM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] (* We do not introduce the Goldstones for the heavy vectors here. *) type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H | Psi0 | Eta type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Models.WZW.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", [O H; O Psi0; O Eta]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> Scalar let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H | Psi0 | Eta -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Psi0 -> Psi0 | Eta -> Eta end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("WZW.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 | Psi0 | Eta -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_NC_h_neutrino | G_NC_h_lepton | G_NC_h_up | G_NC_h_down | I_Q_W | I_G_ZWW | I_G_WWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_EtaGG | G_EtaWW | G_PsiWW | G_PsiZZ | G_PsiAA | G_PsiAZ | G_PsiGG | G_EtaZZ | G_EtaAZ | G_EtaAA | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | Gs | I_Gs | G2 | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)); nc_coupling G_NC_h_neutrino half (Integer 0); nc_coupling G_NC_h_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_h_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_h_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF (1, Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF (1, Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] let gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ); ((O Psi0, G Wp, G Wm), Dim5_Scalar_Gauge2_Skew 1, G_PsiWW); ((O Psi0, G Z, G Z), Dim5_Scalar_Gauge2_Skew 1, G_PsiZZ); ((O Psi0, G Ga, G Ga), Dim5_Scalar_Gauge2_Skew 1, G_PsiAA); ((O Psi0, G Z, G Ga), Dim5_Scalar_Gauge2_Skew 1, G_PsiAZ); ((O Psi0, G Gl, G Gl), Dim5_Scalar_Gauge2_Skew 1, G_PsiGG); ((O Eta, G Gl, G Gl), Dim5_Scalar_Gauge2_Skew 1, G_EtaGG); ((O Eta, G Wp, G Wm), Dim5_Scalar_Gauge2_Skew 1, G_EtaWW); ((O Eta, G Z, G Z), Dim5_Scalar_Gauge2_Skew 1, G_EtaZZ); ((O Eta, G Z, G Ga), Dim5_Scalar_Gauge2_Skew 1, G_EtaAZ); ((O Eta, G Ga, G Ga), Dim5_Scalar_Gauge2_Skew 1, G_EtaAA)] let gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "Psi" -> O Psi0 | "Eta" -> O Eta | "H" -> O H | _ -> invalid_arg "Models.WZW.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Models.WZW.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Models.WZW.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Models.WZW.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Models.WZW.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Psi0 -> "psi" | Eta -> "eta" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Models.WZW.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Models.WZW.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Models.WZW.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Models.WZW.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Psi0 -> "\\Psi" | Eta -> "\\eta" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Psi0 -> "psi" | Eta -> "eta" end (* There are PDG numbers for Z', Z'', W', 32-34, respectively. We just introduce a number 38 for Y0 as a Z'''. As well, there is the number 8 for a t'. *) let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Psi0 -> 28 | Eta -> 29 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_NC_h_lepton -> "gnchlep" | G_NC_h_neutrino -> "gnchneu" | G_NC_h_up -> "gnchup" | G_NC_h_down -> "gnchdwn" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_G_WWW -> "igwww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_PsiWW -> "gpsiww" | G_PsiZZ -> "gpsizz" | G_PsiAA -> "gpsiaa" | G_PsiAZ -> "gpsiaz" | G_PsiGG -> "gpsigg" | G_EtaGG -> "getagg" | G_EtaZZ -> "getazz" | G_EtaAA -> "getaaa" | G_EtaAZ -> "getaaz" | G_EtaWW -> "getaww" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end Index: trunk/omega/src/UFO.mli =================================================================== --- trunk/omega/src/UFO.mli (revision 8415) +++ trunk/omega/src/UFO.mli (revision 8416) @@ -1,101 +1,109 @@ (* vertex.mli -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) val parse_string : string -> UFO_syntax.t val parse_file : string -> UFO_syntax.t (* These are the contents of the Python files after lexical analysis as context-free variable declarations, before any semantic interpretation. *) module type Files = sig type t = private { particles : UFO_syntax.t; couplings : UFO_syntax.t; coupling_orders : UFO_syntax.t; vertices : UFO_syntax.t; lorentz : UFO_syntax.t; parameters : UFO_syntax.t; propagators : UFO_syntax.t; decays : UFO_syntax.t } val parse_directory : string -> t end type t exception Unhandled of string module Model : Model.T val parse_directory : string -> t module type Fortran_Target = sig + (* [fuse c v s fl g wfs ps fusion] + fuses the wavefunctions named [wfs] with momenta named [ps] + using the vertex named [v] with legs reordered according to [fusion]. + The overall coupling constant named [g] is multiplied by the rational + coefficient [c]. The list of spins [s] and the fermion + lines [fl] are used for selecting the appropriately + transformed version of the vertex [v]. *) val fuse : - Algebra.QC.t -> string -> Coupling.lorentzn -> + Algebra.QC.t -> string -> + Coupling.lorentzn -> Coupling.fermion_lines -> string -> string list -> string list -> Coupling.fusen -> unit val lorentz_module : ?only:Sets.String.t -> ?name:string -> ?fortran_module:string -> Format_Fortran.formatter -> unit -> unit end module Targets : sig module Fortran : Fortran_Target end (* Export some functions for testing: *) module Propagator_UFO : sig type t = (* private *) { name : string; numerator : UFOx.Lorentz.t; denominator : UFOx.Lorentz.t } end module Propagator : sig type t = (* private *) { name : string; spins : Coupling.lorentz * Coupling.lorentz; numerator : UFO_Lorentz.t; denominator : UFO_Lorentz.t } - val of_propagator_UFO : Propagator_UFO.t -> t + val of_propagator_UFO : ?majorana:bool -> Propagator_UFO.t -> t val transpose : t -> t end module type Test = sig val suite : OUnit.test end module Test : Test Index: trunk/omega/src/modellib_NMSSM.ml =================================================================== --- trunk/omega/src/modellib_NMSSM.ml (revision 8415) +++ trunk/omega/src/modellib_NMSSM.ml (revision 8416) @@ -1,1593 +1,1594 @@ (* modellib_NMSSM.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Felix Braam (this file only) WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Next-to-Minimal Supersymmetric Standard Model} *) (* This is based on the NMSSM implementation by Felix Braam. Note that for the Higgs sector vertices the conventions of the Franke/Fraas paper have been used. *) module type NMSSM_flags = sig val ckm_present : bool val higgs_triangle : bool end module NMSSM : NMSSM_flags = struct let ckm_present = false let higgs_triangle = false end module NMSSM_CKM : NMSSM_flags = struct let ckm_present = true let higgs_triangle = false end module NMSSM_Hgg : NMSSM_flags = struct let ckm_present = false let higgs_triangle = true end module NMSSM_func (Flags : NMSSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] (* Yields a list of tuples consistig of the off-diag combinations of the elements in "set". *) let choose2 set = List.map (function [x;y] -> (x,y) | _ -> failwith "choose2") (Combinatorics.choose 2 set) (* [pairs] appends the diagonal combinations to [choose2]. *) let rec diag = function | [] -> [] | x1 :: rest -> (x1, x1) :: diag rest let pairs l = choose2 l @ diag l let rec cloop set i j k = if i > ((List.length set)-1) then [] else if j > i then cloop set (succ i) (j-i-1) (j-i-1) else if k > j then cloop set i (succ j) (k-j-1) else (List.nth set i, List.nth set j, List.nth set k) :: cloop set i j (succ k) let triples set = cloop set 0 0 0 let rec two_and_one' l1 z n = if n < 0 then [] else ((fst (List.nth (pairs l1) n)),(snd (List.nth (pairs l1) n)), z):: two_and_one' l1 z (pred n) let two_and_one l1 l2 = let f z = two_and_one' l1 z ((List.length (pairs l1))-1) in List.flatten ( List.map f l2 ) type gen = | G of int | GG of gen*gen let rec string_of_gen = function | G n when n > 0 -> string_of_int n | G n -> string_of_int (abs n) ^ "c" | GG (g1,g2) -> string_of_gen g1 ^ "_" ^ string_of_gen g2 (* With this we distinguish the flavour. *) type sff = | SL | SN | SU | SD let string_of_sff = function | SL -> "sl" | SN -> "sn" | SU -> "su" | SD -> "sd" (* With this we distinguish the mass eigenstates. At the moment we have to cheat a little bit for the sneutrinos. Because we are dealing with massless neutrinos there is only one sort of sneutrino. *) type sfm = | M1 | M2 let string_of_sfm = function | M1 -> "1" | M2 -> "2" (* We also introduce special types for the charginos and neutralinos. *) type char = | C1 | C2 | C1c | C2c type neu = | N1 | N2 | N3 | N4 | N5 let int_of_char = function | C1 -> 1 | C2 -> 2 | C1c -> -1 | C2c -> -2 let string_of_char = function | C1 -> "1" | C2 -> "2" | C1c -> "-1" | C2c -> "-2" let conj_char = function | C1 -> C1c | C2 -> C2c | C1c -> C1 | C2c -> C2 let string_of_neu = function | N1 -> "1" | N2 -> "2" | N3 -> "3" | N4 -> "4" | N5 -> "5" (* For the Higgs bosons, we follow the conventions of Franke/Fraas. *) type shiggs = | S1 | S2 | S3 type phiggs = | P1 | P2 let string_of_shiggs = function | S1 -> "1" | S2 -> "2" | S3 -> "3" let string_of_phiggs = function | P1 -> "1" | P2 -> "2" type flavor = | L of int | N of int | U of int | D of int | Sup of sfm*int | Sdown of sfm*int | Ga | Wp | Wm | Z | Gl | Slepton of sfm*int | Sneutrino of int | Neutralino of neu | Chargino of char | Gluino | SHiggs of shiggs | Hp | Hm | PHiggs of phiggs let string_of_fermion_type = function | L _ -> "l" | U _ -> "u" | D _ -> "d" | N _ -> "n" | _ -> failwith "Modellib_NMSSM.NMSSM.string_of_fermion_type: invalid fermion type" let string_of_fermion_gen = function | L g | U g | D g | N g -> string_of_int (abs (g)) | _ -> failwith "Modellib_NMSSM.NMSSM.string_of_fermion_gen: invalid fermion type" type gauge = unit let gauge_symbol () = failwith "Modellib_NMSSM.NMSSM.gauge_symbol: internal error" (* At this point we will forget graviton and -ino. *) let family g = [ L g; N g; Slepton (M1,g); Slepton (M2,g); Sneutrino g; U g; D g; Sup (M1,g); Sup (M2,g); Sdown (M1,g); Sdown (M2,g)] let external_flavors () = [ "1st Generation matter", ThoList.flatmap family [1; -1]; "2nd Generation matter", ThoList.flatmap family [2; -2]; "3rd Generation matter", ThoList.flatmap family [3; -3]; "Gauge Bosons", [Ga; Z; Wp; Wm; Gl]; "Charginos", [Chargino C1; Chargino C2; Chargino C1c; Chargino C2c]; "Neutralinos", [Neutralino N1; Neutralino N2; Neutralino N3; Neutralino N4; Neutralino N5]; "Higgs Bosons", [SHiggs S1; SHiggs S2; SHiggs S3; Hp; Hm; PHiggs P1; PHiggs P2]; "Gluino", [Gluino]] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n m = if n >= 0 && m >= 0 then Spinor else if n <= 0 && m <=0 then ConjSpinor else invalid_arg "Modellib_NMSSM.NMSSM.spinor: internal error" let lorentz = function | L g -> spinor g 0 | N g -> spinor g 0 | U g -> spinor g 0 | D g -> spinor g 0 | Chargino c -> spinor (int_of_char c) 0 | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector | SHiggs _ | PHiggs _ | Hp | Hm | Sup _ | Sdown _ | Slepton _ | Sneutrino _ -> Scalar | Neutralino _ | Gluino -> Majorana let color = function | U g -> Color.SUN (if g > 0 then 3 else -3) | Sup (m,g) -> Color.SUN (if g > 0 then 3 else -3) | D g -> Color.SUN (if g > 0 then 3 else -3) | Sdown (m,g) -> Color.SUN (if g > 0 then 3 else -3) | Gl | Gluino -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n m = if n >= 0 && m >=0 then Prop_Spinor else if n <=0 && m <=0 then Prop_ConjSpinor else invalid_arg "Modellib_NMSSM.NMSSM.prop_spinor: internal error" let propagator = function | L g -> prop_spinor g 0 | N g -> prop_spinor g 0 | U g -> prop_spinor g 0 | D g -> prop_spinor g 0 | Chargino c -> prop_spinor (int_of_char c) 0 | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity | SHiggs _ | PHiggs _ -> Prop_Scalar | Hp | Hm -> Prop_Scalar | Sup _ | Sdown _ | Slepton _ | Sneutrino _ -> Prop_Scalar | Gluino -> Prop_Majorana | Neutralino _ -> Prop_Majorana (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | Wp | Wm | U 3 | U (-3) -> Fudged | _ -> !default_width else !default_width let goldstone _ = None let conjugate = function | L g -> L (-g) | N g -> N (-g) | U g -> U (-g) | D g -> D (-g) | Sup (m,g) -> Sup (m,-g) | Sdown (m,g) -> Sdown (m,-g) | Slepton (m,g) -> Slepton (m,-g) | Sneutrino g -> Sneutrino (-g) | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | SHiggs s -> SHiggs s | PHiggs p -> PHiggs p | Hp -> Hm | Hm -> Hp | Gluino -> Gluino | Neutralino n -> Neutralino n | Chargino c -> Chargino (conj_char c) let fermion = function | L g -> if g > 0 then 1 else -1 | N g -> if g > 0 then 1 else -1 | U g -> if g > 0 then 1 else -1 | D g -> if g > 0 then 1 else -1 | Gl | Ga | Z | Wp | Wm -> 0 | SHiggs _ | Hp | Hm | PHiggs _ -> 0 | Neutralino _ -> 2 | Chargino c -> if (int_of_char c) > 0 then 1 else -1 | Sup _ -> 0 | Sdown _ -> 0 | Slepton _ -> 0 | Sneutrino _ -> 0 | Gluino -> 2 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("NMSSM.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | L n | N n | U n | D n | Sup (_,n) | Sdown (_,n) | Slepton (_,n) | Sneutrino n -> generation' n | _ -> [0//1; 0//1; 0//1] let charge = function | L n -> if n > 0 then -1//1 else 1//1 | Slepton (_,n) -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | Sneutrino n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | Sup (_,n) -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 | Sdown (_,n) -> if n > 0 then -1//3 else 1//3 | Gl | Ga | Z | Neutralino _ | Gluino -> 0//1 | Wp -> 1//1 | Wm -> -1//1 | SHiggs _ | PHiggs _ -> 0//1 | Hp -> 1//1 | Hm -> -1//1 | Chargino (C1 | C2) -> 1//1 | Chargino (C1c | C2c) -> -1//1 let lepton = function | L n | N n -> if n > 0 then 1//1 else -1//1 | Slepton (_,n) | Sneutrino n -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let baryon = function | U n | D n -> if n > 0 then 1//1 else -1//1 | Sup (_,n) | Sdown (_,n) -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f (* We introduce a Boolean type vc as a pseudonym for Vertex Conjugator to distinguish between vertices containing complex mixing matrices like the CKM--matrix or the sfermion or neutralino/chargino--mixing matrices, which have to become complex conjugated. The true--option stands for the conjugated vertex, the false--option for the unconjugated vertex. *) type vc = bool type constant = | E | G | Mu (*lambda**) | Lambda | Q_lepton | Q_up | Q_down | Q_charg | G_Z | G_CC | G_CCQ of vc*int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_PZWW | G_PPWW | G_SS | I_G_S | Gs | G_NZN of neu*neu | G_CZC of char*char | G_YUK_FFS of flavor*flavor*shiggs | G_YUK_FFP of flavor*flavor*phiggs | G_YUK_LCN of int | G_YUK_UCD of int*int | G_YUK_DCU of int*int | G_NHC of vc*neu*char | G_YUK_C of vc*flavor*char*sff*sfm | G_YUK_Q of vc*int*flavor*char*sff*sfm | G_YUK_N of vc*flavor*neu*sff*sfm | G_YUK_G of vc*flavor*sff*sfm | G_NWC of neu*char | G_CWN of char*neu | G_CSC of char*char*shiggs | G_CPC of char*char*phiggs | G_WSQ of vc*int*int*sfm*sfm | G_SLSNW of vc*int*sfm | G_ZSF of sff*int*sfm*sfm | G_CICIS of neu*neu*shiggs | G_CICIP of neu*neu*phiggs | G_GH_WPC of phiggs | G_GH_WSC of shiggs | G_GH_ZSP of shiggs*phiggs | G_GH_WWS of shiggs | G_GH_ZZS of shiggs | G_GH_ZCC | G_GH_GaCC | G_GH4_ZZPP of phiggs*phiggs | G_GH4_ZZSS of shiggs*shiggs | G_GH4_ZZCC | G_GH4_GaGaCC | G_GH4_ZGaCC | G_GH4_WWCC | G_GH4_WWPP of phiggs*phiggs | G_GH4_WWSS of shiggs*shiggs | G_GH4_ZWSC of shiggs | G_GH4_GaWSC of shiggs | G_GH4_ZWPC of phiggs | G_GH4_GaWPC of phiggs | G_WWSFSF of sff*int*sfm*sfm | G_WPSLSN of vc*int*sfm | G_H3_SCC of shiggs | G_H3_SSS of shiggs*shiggs*shiggs | G_H3_SPP of shiggs*phiggs*phiggs | G_SFSFS of shiggs*sff*int*sfm*sfm | G_SFSFP of phiggs*sff*int*sfm*sfm | G_HSNSL of vc*int*sfm | G_HSUSD of vc*sfm*sfm*int*int | G_WPSUSD of vc*sfm*sfm*int*int | G_WZSUSD of vc*sfm*sfm*int*int | G_WZSLSN of vc*int*sfm | G_GlGlSQSQ | G_PPSFSF of sff | G_ZZSFSF of sff*int*sfm*sfm | G_ZPSFSF of sff*int*sfm*sfm | G_GlZSFSF of sff*int*sfm*sfm | G_GlPSQSQ | G_GlWSUSD of vc*sfm*sfm*int*int | G_GLUGLUA0 of phiggs | G_GLUGLUH0 of shiggs (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} Here we must perhaps allow for complex input parameters. So split them into their modulus and their phase. At first, we leave them real; the generalization to complex parameters is obvious. *) let parameters () = { input = []; derived = []; derived_arrays = [] } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* For the couplings there are generally two possibilities concerning the sign of the covariant derivative. \begin{equation} {\rm CD}^\pm = \partial_\mu \pm \ii g T^a A^a_\mu \end{equation} The particle data group defines the signs consistently to be positive. Since the convention for that signs also influence the phase definitions of the gaugino/higgsino fields via the off-diagonal entries in their mass matrices it would be the best to adopt that convention. *) (*** REVISED: Compatible with CD+. FB ***) let electromagnetic_currents_3 g = [ ((L (-g), Ga, L g), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-g), Ga, U g), FBF (1, Psibar, V, Psi), Q_up); ((D (-g), Ga, D g), FBF (1, Psibar, V, Psi), Q_down)] (*** REVISED: Compatible with CD+. FB***) let electromagnetic_sfermion_currents g m = [ ((Ga, Slepton (m,-g), Slepton (m,g)), Vector_Scalar_Scalar 1, Q_lepton); ((Ga, Sup (m,-g), Sup (m,g)), Vector_Scalar_Scalar 1, Q_up); ((Ga, Sdown (m,-g), Sdown (m,g)), Vector_Scalar_Scalar 1, Q_down)] (*** REVISED: Compatible with CD+. FB***) let electromagnetic_currents_2 c = let cc = conj_char c in [ ((Chargino cc, Ga, Chargino c), FBF (1, Psibar, V, Psi), Q_charg) ] (*** REVISED: Compatible with CD+. FB***) let neutral_currents g = [ ((L (-g), Z, L g), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-g), Z, N g), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-g), Z, U g), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-g), Z, D g), FBF (1, Psibar, VA, Psi), G_NC_down)] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = \mp \frac{g}{2\sqrt2} \sum_i \bar\psi_i \gamma^\mu (1-\gamma_5)(T^+W^+_\mu+T^-W^-_\mu)\psi_i , \end{equation} where the sign corresponds to $\text{CD}_\pm$, respectively. *) (*** REVISED: Compatible with CD+. ***) (* Remark: The definition with the other sign compared to the SM files comes from the fact that $g_{cc} = 1/(2\sqrt{2})$ is used overwhelmingly often in the SUSY Feynman rules, so that JR decided to use a different definiton for [g_cc] in SM and MSSM. *) (** FB **) let charged_currents g = [ ((L (-g), Wm, N g), FBF ((-1), Psibar, VL, Psi), G_CC); ((N (-g), Wp, L g), FBF ((-1), Psibar, VL, Psi), G_CC) ] (* The quark with the inverted generation (the antiparticle) is the outgoing one, the other the incoming. The vertex attached to the outgoing up-quark contains the CKM matrix element {\em not} complex conjugated, while the vertex with the outgoing down-quark has the conjugated CKM matrix element. *) (*** REVISED: Compatible with CD+. FB ***) let charged_quark_currents g h = [ ((D (-g), Wm, U h), FBF ((-1), Psibar, VL, Psi), G_CCQ (true,g,h)); ((U (-g), Wp, D h), FBF ((-1), Psibar, VL, Psi), G_CCQ (false,h,g))] (*** REVISED: Compatible with CD+.FB ***) let charged_chargino_currents n c = let cc = conj_char c in [ ((Chargino cc, Wp, Neutralino n), FBF (1, Psibar, VLR, Chi), G_CWN (c,n)); ((Neutralino n, Wm, Chargino c), FBF (1, Chibar, VLR, Psi), G_NWC (n,c)) ] (*** REVISED: Compatible with CD+. FB***) let charged_slepton_currents g m = [ ((Wm, Slepton (m,-g), Sneutrino g), Vector_Scalar_Scalar (-1), G_SLSNW (true,g,m)); ((Wp, Slepton (m,g), Sneutrino (-g)), Vector_Scalar_Scalar 1, G_SLSNW (false,g,m)) ] (*** REVISED: Compatible with CD+. FB***) let charged_squark_currents' g h m1 m2 = [ ((Wm, Sup (m1,g), Sdown (m2,-h)), Vector_Scalar_Scalar (-1), G_WSQ (true,g,h,m1,m2)); ((Wp, Sup (m1,-g), Sdown (m2,h)), Vector_Scalar_Scalar 1, G_WSQ (false,g,h,m1,m2)) ] let charged_squark_currents g h = List.flatten (Product.list2 (charged_squark_currents' g h) [M1;M2] [M1;M2] ) (*** REVISED: Compatible with CD+. FB ***) let neutral_sfermion_currents' g m1 m2 = [ ((Z, Slepton (m1,-g), Slepton (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SL,g,m1,m2)); ((Z, Sup (m1,-g), Sup (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF(SU,g,m1,m2)); ((Z, Sdown (m1,-g), Sdown (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SD,g,m1,m2))] let neutral_sfermion_currents g = List.flatten (Product.list2 (neutral_sfermion_currents' g) [M1;M2] [M1;M2]) @ [ ((Z, Sneutrino (-g), Sneutrino g), Vector_Scalar_Scalar (-1), G_ZSF (SN,g,M1,M1)) ] (*** REVISED: Compatible with CD+. FB***) let neutral_Z (n,m) = [ ((Neutralino n, Z, Neutralino m), FBF (1, Chibar, VLR, Chi), (G_NZN (n,m))) ] (*** REVISED: Compatible with CD+. FB***) let charged_Z c1 c2 = let cc1 = conj_char c1 in ((Chargino cc1, Z, Chargino c2), FBF ((-1), Psibar, VA , Psi), G_CZC (c1,c2)) (*** REVISED: Compatible with CD+. Remark: This is pure octet. FB***) let yukawa_v = [ (Gluino, Gl, Gluino), FBF (1, Chibar, V, Chi), Gs] (*** REVISED: Independent of the sign of CD. ***) (*** REVISED: Felix Braam: Compact version using new COMBOS + FF-Couplings *) let yukawa_higgs_FFS f s = [((conjugate f, SHiggs s, f ), FBF (1, Psibar, S, Psi), G_YUK_FFS (conjugate f, f, s))] let yukawa_higgs_FFP f p = [((conjugate f, PHiggs p, f), FBF (1, Psibar, P, Psi), G_YUK_FFP (conjugate f ,f , p))] let yukawa_higgs_NLC g = [ ((N (-g), Hp, L g), FBF (1, Psibar, Coupling.SR, Psi), G_YUK_LCN g); ((L (-g), Hm, N g), FBF (1, Psibar, Coupling.SL, Psi), G_YUK_LCN g)] let yukawa_higgs g = yukawa_higgs_NLC g @ List.flatten ( Product.list2 yukawa_higgs_FFS [L g; U g; D g] [S1; S2; S3]) @ List.flatten ( Product.list2 yukawa_higgs_FFP [L g; U g; D g] [P1; P2]) (*** REVISED: Independent of the sign of CD. FB***) let yukawa_higgs_quark (g,h) = [ ((U (-g), Hp, D h), FBF (1, Psibar, SLR, Psi), G_YUK_UCD (g, h)); ((D (-h), Hm, U g), FBF (1, Psibar, SLR, Psi), G_YUK_DCU (g, h)) ] (*** REVISED: Compatible with CD+. ***) (*** REVISED: Felix Braam: Compact version using new COMBOS*) let yukawa_shiggs_2 c1 c2 s = let cc1 = conj_char c1 in ((Chargino cc1, SHiggs s, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CSC (c1,c2,s)) let yukawa_phiggs_2 c1 c2 p = let cc1 = conj_char c1 in ((Chargino cc1, PHiggs p, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CPC (c1,c2,p)) let yukawa_higgs_2 = Product.list3 yukawa_shiggs_2 [C1;C2] [C1;C2] [S1;S2;S3] @ Product.list3 yukawa_phiggs_2 [C1;C2] [C1;C2] [P1;P2] (*** REVISED: Compatible with CD+.FB ***) let higgs_charg_neutr n c = let cc = conj_char c in [ ((Neutralino n, Hm, Chargino c), FBF (-1, Chibar, SLR, Psi), G_NHC (false,n,c)); ((Chargino cc, Hp, Neutralino n), FBF (-1, Psibar, SLR, Chi), G_NHC (true,n,c)) ] (*** REVISED: Compatible with CD+. ***) (*** REVISED: Felix Braam: Compact version using new COMBOS*) let shiggs_neutr (n,m,s) = ((Neutralino n, SHiggs s, Neutralino m), FBF (1, Chibar, SLR, Chi), G_CICIS (n,m,s)) let phiggs_neutr (n,m,p) = ((Neutralino n, PHiggs p, Neutralino m), FBF (1, Chibar, SLR, Chi), G_CICIP (n,m,p)) let higgs_neutr = List.map shiggs_neutr (two_and_one [N1;N2;N3;N4;N5] [S1;S2;S3]) @ List.map phiggs_neutr (two_and_one [N1;N2;N3;N4;N5] [P1;P2]) (*** REVISED: Compatible with CD+. FB***) let yukawa_n_2 n m g = [ ((Neutralino n, Slepton (m,-g), L g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,L g,n,SL,m)); ((L (-g), Slepton (m,g), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,L g,n,SL,m)); ((Neutralino n, Sup (m,-g), U g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,U g,n,SU,m)); ((U (-g), Sup (m,g), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,U g,n,SU,m)); ((Neutralino n, Sdown (m,-g), D g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,D g,n,SD,m)); ((D (-g), Sdown (m,g), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,D g,n,SD,m)) ] let yukawa_n_3 n g = [ ((Neutralino n, Sneutrino (-g), N g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,N g,n,SN,M1)); ((N (-g), Sneutrino g, Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,N g, n,SN,M1)) ] let yukawa_n_5 g m = [ ((U (-g), Sup (m,g), Gluino), FBF (1, Psibar, SLR, Chi), G_YUK_G (false,U g,SU,m)); ((D (-g), Sdown (m,g), Gluino), FBF (1, Psibar, SLR, Chi), G_YUK_G (false,D g,SD,m)); ((Gluino, Sup (m,-g), U g), FBF (1, Chibar, SLR, Psi), G_YUK_G (true,U g,SU,m)); ((Gluino, Sdown (m,-g), D g), FBF (1, Chibar, SLR, Psi), G_YUK_G (true,D g,SD,m))] let yukawa_n = List.flatten (Product.list3 yukawa_n_2 [N1;N2;N3;N4;N5] [M1;M2] [1;2;3]) @ List.flatten (Product.list2 yukawa_n_3 [N1;N2;N3;N4;N5] [1;2;3]) @ List.flatten (Product.list2 yukawa_n_5 [1;2;3] [M1;M2]) (*** REVISED: Compatible with CD+.FB ***) let yukawa_c_2 c g = let cc = conj_char c in [ ((L (-g), Sneutrino g, Chargino cc), BBB (1, Psibar, SLR, Psibar), G_YUK_C (true,L g,c,SN,M1)); ((Chargino c, Sneutrino (-g), L g), PBP (1, Psi, SLR, Psi), G_YUK_C (false,L g,c,SN,M1)) ] let yukawa_c_3 c m g = let cc = conj_char c in [ ((N (-g), Slepton (m,g), Chargino c), FBF (1, Psibar, SLR, Psi), G_YUK_C (true,N g,c,SL,m)); ((Chargino cc, Slepton (m,-g), N g), FBF (1, Psibar, SLR, Psi), G_YUK_C (false,N g,c,SL,m)) ] let yukawa_c c = ThoList.flatmap (yukawa_c_2 c) [1;2;3] @ List.flatten (Product.list2 (yukawa_c_3 c) [M1;M2] [1;2;3]) (*** REVISED: Compatible with CD+. FB***) let yukawa_cq' c (g,h) m = let cc = conj_char c in [ ((Chargino c, Sup (m,-g), D h), PBP (1, Psi, SLR, Psi), G_YUK_Q (false,g,D h,c,SU,m)); ((D (-h), Sup (m,g), Chargino cc), BBB (1, Psibar, SLR, Psibar), G_YUK_Q (true,g,D h,c,SU,m)); ((Chargino cc, Sdown (m,-g), U h), FBF (1, Psibar, SLR, Psi), G_YUK_Q (true,g,U h,c,SD,m)); ((U (-h), Sdown (m,g), Chargino c), FBF (1, Psibar, SLR, Psi), G_YUK_Q (false,g,U h,c,SD,m)) ] let yukawa_cq c = if Flags.ckm_present then List.flatten (Product.list2 (yukawa_cq' c) [(1,1);(1,2);(2,1);(2,2);(1,3);(2,3);(3,3);(3,2);(3,1)] [M1;M2]) else List.flatten (Product.list2 (yukawa_cq' c) [(1,1);(2,2);(3,3)] [M1;M2]) (*** REVISED: Compatible with CD+. Remark: Singlet and octet gluon exchange. The coupling is divided by sqrt(2) to account for the correct normalization of the Lie algebra generators. **FB*) let col_currents g = [ ((D (-g), Gl, D g), FBF ((-1), Psibar, V, Psi), Gs); ((U (-g), Gl, U g), FBF ((-1), Psibar, V, Psi), Gs)] (*** REVISED: Compatible with CD+. Remark: Singlet and octet gluon exchange. The coupling is divided by sqrt(2) to account for the correct normalization of the Lie algebra generators. **FB*) let chg = function | M1 -> M2 | M2 -> M1 let col_sfermion_currents g m = [ ((Gl, Sup (m,-g), Sup (m,g)), Vector_Scalar_Scalar (-1), Gs); ((Gl, Sdown (m,-g), Sdown (m,g)), Vector_Scalar_Scalar (-1), Gs)] (*** REVISED: Compatible with CD+. **FB*) let triple_gauge = [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_G_S)] (*** REVISED: Independent of the sign of CD. **FB*) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_PZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_PPWW; (Gl, Gl, Gl, Gl), gauge4, G_SS] (* The [Scalar_Vector_Vector] couplings do not depend on the choice of the sign of the covariant derivative since they are quadratic in the gauge couplings. *) (** Effective Higgs-Gluon-Gluon coupling. **) let gauge_higgs_GlGlS s= ((SHiggs s, Gl, Gl), Dim5_Scalar_Gauge2 1, G_GLUGLUH0 s) let gauge_higgs_GlGlP p= ((PHiggs p, Gl, Gl), Dim5_Scalar_Gauge2_Skew 1, G_GLUGLUA0 p) (*** REVISED: Compatible with CD+. FB***) (*** Revision: 2005-03-10: first two vertices corrected. ***) (*** REVISED: Compact version using new COMBOS*) (*** REVISED: Couplings adjusted to FF-convention*) let gauge_higgs_WPC p= [ ((Wm, Hp, PHiggs p), Vector_Scalar_Scalar 1, G_GH_WPC p); ((Wp, Hm, PHiggs p), Vector_Scalar_Scalar 1, G_GH_WPC p)] let gauge_higgs_WSC s= [((Wm, Hp, SHiggs s),Vector_Scalar_Scalar 1, G_GH_WSC s); ((Wp, Hm, SHiggs s),Vector_Scalar_Scalar (-1), G_GH_WSC s)] let gauge_higgs_ZSP s p = [((Z, SHiggs s, PHiggs p),Vector_Scalar_Scalar 1, G_GH_ZSP (s,p))] let gauge_higgs_WWS s= ((SHiggs s, Wp, Wm),Scalar_Vector_Vector 1, G_GH_WWS s) let gauge_higgs_ZZS s= ((SHiggs s, Z, Z), Scalar_Vector_Vector 1, G_GH_ZZS s) let gauge_higgs_ZCC = ((Z, Hp, Hm),Vector_Scalar_Scalar 1, G_GH_ZCC ) let gauge_higgs_GaCC = ((Ga, Hp, Hm),Vector_Scalar_Scalar 1, G_GH_GaCC ) let gauge_higgs = ThoList.flatmap gauge_higgs_WPC [P1;P2] @ ThoList.flatmap gauge_higgs_WSC [S1;S2;S3] @ List.flatten (Product.list2 gauge_higgs_ZSP [S1;S2;S3] [P1;P2]) @ List.map gauge_higgs_WWS [S1;S2;S3] @ List.map gauge_higgs_ZZS [S1;S2;S3] @ [gauge_higgs_ZCC] @ [gauge_higgs_GaCC] @ (if Flags.higgs_triangle then List.map gauge_higgs_GlGlS [S1;S2;S3] @ List.map gauge_higgs_GlGlP [P1;P2] else []) (*** REVISED: Compact version using new COMBOS*) (*** REVISED: Couplings adjusted to FF-convention*) let gauge_higgs4_ZZPP (p1,p2) = ((PHiggs p1, PHiggs p2, Z, Z), Scalar2_Vector2 1, G_GH4_ZZPP (p1,p2)) let gauge_higgs4_ZZSS (s1,s2) = ((SHiggs s1, SHiggs s2 , Z, Z), Scalar2_Vector2 1, G_GH4_ZZSS (s1,s2)) let gauge_higgs4_ZZCC = ((Hp, Hm, Z, Z), Scalar2_Vector2 1, G_GH4_ZZCC) let gauge_higgs4_GaGaCC = ((Hp, Hm, Ga, Ga), Scalar2_Vector2 1, G_GH4_GaGaCC) let gauge_higgs4_ZGaCC = ((Hp, Hm, Ga, Z), Scalar2_Vector2 1, G_GH4_ZGaCC ) let gauge_higgs4_WWCC = ((Hp, Hm, Wp, Wm), Scalar2_Vector2 1, G_GH4_WWCC ) let gauge_higgs4_WWPP (p1,p2) = ((PHiggs p1, PHiggs p2, Wp, Wm), Scalar2_Vector2 1, G_GH4_WWPP (p1,p2)) let gauge_higgs4_WWSS (s1,s2) = ((SHiggs s1, SHiggs s2, Wp, Wm), Scalar2_Vector2 1, G_GH4_WWSS (s1,s2)) let gauge_higgs4_ZWSC s = [ ((Hp, SHiggs s, Wm, Z), Scalar2_Vector2 1, G_GH4_ZWSC s); ((Hm, SHiggs s, Wp, Z), Scalar2_Vector2 1, G_GH4_ZWSC s)] let gauge_higgs4_GaWSC s = [ ((Hp, SHiggs s, Wm, Ga), Scalar2_Vector2 1, G_GH4_GaWSC s); ((Hm, SHiggs s, Wp, Ga), Scalar2_Vector2 1, G_GH4_GaWSC s) ] let gauge_higgs4_ZWPC p = [ ((Hp, PHiggs p, Wm, Z), Scalar2_Vector2 1, G_GH4_ZWPC p); ((Hm, PHiggs p, Wp, Z), Scalar2_Vector2 (-1), G_GH4_ZWPC p)] let gauge_higgs4_GaWPC p = [ ((Hp, PHiggs p, Wm, Ga), Scalar2_Vector2 1, G_GH4_GaWPC p); ((Hm, PHiggs p, Wp, Ga), Scalar2_Vector2 (-1), G_GH4_GaWPC p) ] let gauge_higgs4 = List.map gauge_higgs4_ZZPP (pairs [P1;P2]) @ List.map gauge_higgs4_ZZSS (pairs [S1;S2;S3]) @ [gauge_higgs4_ZZCC] @ [gauge_higgs4_GaGaCC] @ [gauge_higgs4_ZGaCC] @ [gauge_higgs4_WWCC] @ List.map gauge_higgs4_WWPP (pairs [P1;P2]) @ List.map gauge_higgs4_WWSS (pairs [S1;S2;S3]) @ ThoList.flatmap gauge_higgs4_ZWSC [S1;S2;S3] @ ThoList.flatmap gauge_higgs4_GaWSC [S1;S2;S3] @ ThoList.flatmap gauge_higgs4_ZWPC [P1;P2] @ ThoList.flatmap gauge_higgs4_GaWPC [P1;P2] (**********************************************FB****) let gauge_sfermion4' g m1 m2 = [ ((Wp, Wm, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SL,g,m1,m2)); ((Z, Ga, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SL,g,m1,m2)); ((Z, Z, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF(SL,g,m1,m2)); ((Wp, Wm, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SU,g,m1,m2)); ((Wp, Wm, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_WWSFSF(SD,g,m1,m2)); ((Z, Z, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SU,g,m1,m2)); ((Z, Z, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SD,g,m1,m2)); ((Z, Ga, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SU,g,m1,m2)); ((Z, Ga, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SD,g,m1,m2)) ] let gauge_sfermion4'' g m = [ ((Wp, Ga, Slepton (m,g), Sneutrino (-g)), Scalar2_Vector2 1, G_WPSLSN (false,g,m)); ((Wm, Ga, Slepton (m,-g), Sneutrino g), Scalar2_Vector2 1, G_WPSLSN (true,g,m)); ((Wp, Z, Slepton (m,g), Sneutrino (-g)), Scalar2_Vector2 1, G_WZSLSN(false,g,m)); ((Wm, Z, Slepton (m,-g), Sneutrino g), Scalar2_Vector2 1, G_WZSLSN (true,g,m)); ((Ga, Ga, Slepton (m,g), Slepton (m,-g)), Scalar2_Vector2 1, G_PPSFSF SL); ((Ga, Ga, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 1, G_PPSFSF SU); ((Ga, Ga, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 1, G_PPSFSF SD)] let gauge_sfermion4 g = List.flatten (Product.list2 (gauge_sfermion4' g) [M1;M2] [M1;M2]) @ ThoList.flatmap (gauge_sfermion4'' g) [M1;M2] @ [ ((Wp, Wm, Sneutrino g, Sneutrino (-g)), Scalar2_Vector2 1, G_WWSFSF (SN,g,M1,M1)); ((Z, Z, Sneutrino g, Sneutrino (-g)), Scalar2_Vector2 1, G_ZZSFSF (SN,g,M1,M1)) ] (*** Added by Felix Braam. ***) let gauge_squark4'' g h m1 m2 = [ ((Wp, Ga, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_WPSUSD (false,m1,m2,g,h)); ((Wm, Ga, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_WPSUSD (true,m1,m2,g,h)); ((Wp, Z, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_WZSUSD (false,m1,m2,g,h)); ((Wm, Z, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_WZSUSD (true,m1,m2,g,h)) ] let gauge_squark4' g h = List.flatten (Product.list2 (gauge_squark4'' g h) [M1;M2] [M1;M2]) let gauge_squark4 = if Flags.ckm_present then List.flatten (Product.list2 gauge_squark4' [1;2;3] [1;2;3]) else ThoList.flatmap (fun g -> gauge_squark4' g g) [1;2;3] (**********************************FB*********************) let gluon_w_squark'' g h m1 m2 = [ ((Gl, Wp, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_GlWSUSD (false,m1,m2,g,h)); ((Gl, Wm, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_GlWSUSD (true,m1,m2,g,h)) ] let gluon_w_squark' g h = List.flatten (Product.list2 (gluon_w_squark'' g h) [M1;M2] [M1;M2]) let gluon_w_squark = if Flags.ckm_present then List.flatten (Product.list2 gluon_w_squark' [1;2;3] [1;2;3]) else ThoList.flatmap (fun g -> gluon_w_squark' g g) [1;2;3] (***********************************FB********************) let gluon_gauge_squark' g m1 m2 = [ ((Gl, Z, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 2, G_GlZSFSF (SU,g,m1,m2)); ((Gl, Z, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 2, G_GlZSFSF (SD,g,m1,m2)) ] let gluon_gauge_squark'' g m = [ ((Gl, Ga, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 2, G_GlPSQSQ); ((Gl, Ga, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 (-1), G_GlPSQSQ) ] let gluon_gauge_squark g = List.flatten (Product.list2 (gluon_gauge_squark' g) [M1;M2] [M1;M2]) @ ThoList.flatmap (gluon_gauge_squark'' g) [M1;M2] (*************************************FB******************) let gluon2_squark2' g m = [ ((Gl, Gl, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 2, G_GlGlSQSQ); ((Gl, Gl, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 2, G_GlGlSQSQ) ] let gluon2_squark2 g = ThoList.flatmap (gluon2_squark2' g) [M1;M2] (*** REVISED: Independent of the sign of CD. *FB**) (*** REVISED: Compact version using new COMBOS*) (*** REVISED: Couplings adjusted to FF-convention*) let higgs_SCC s = ((Hp, Hm, SHiggs s), Scalar_Scalar_Scalar 1, G_H3_SCC s ) let higgs_SSS (s1,s2,s3)= ((SHiggs s1, SHiggs s2, SHiggs s3), Scalar_Scalar_Scalar 1, G_H3_SSS (s1,s2,s3)) let higgs_SPP (p1,p2,s) = ((SHiggs s, PHiggs p1, PHiggs p2), Scalar_Scalar_Scalar 1, G_H3_SPP (s,p1,p2)) let higgs = List.map higgs_SCC [S1;S2;S3]@ List.map higgs_SSS (triples [S1;S2;S3])@ List.map higgs_SPP (two_and_one [P1;P2] [S1;S2;S3]) let higgs4 = [] (* The vertices of the type Higgs - Sfermion - Sfermion are independent of the choice of the CD sign since they are quadratic in the gauge coupling. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_sneutrino' s g = ((SHiggs s, Sneutrino g, Sneutrino (-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SN,g,M1,M1)) let higgs_sneutrino'' g m = [((Hp, Sneutrino (-g), Slepton (m,g)), Scalar_Scalar_Scalar 1, G_HSNSL (false,g,m)); ((Hm, Sneutrino g, Slepton (m,-g)), Scalar_Scalar_Scalar 1, G_HSNSL (true,g,m))] let higgs_sneutrino = Product.list2 higgs_sneutrino' [S1;S2;S3] [1;2;3] @ List.flatten ( Product.list2 higgs_sneutrino'' [1;2;3] [M1;M2] ) (* Under the assumption that there is no mixing between the left- and right-handed sfermions for the first two generations there is only a coupling of the form Higgs - sfermion1 - sfermion2 for the third generation. All the others are suppressed by $m_f/M_W$. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_sfermion_S s g m1 m2 = [ ((SHiggs s, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SL,g,m1,m2)); ((SHiggs s, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SU,g,m1,m2)); ((SHiggs s, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SD,g,m1,m2))] let higgs_sfermion' g m1 m2 = (higgs_sfermion_S S1 g m1 m2) @ (higgs_sfermion_S S2 g m1 m2) @ (higgs_sfermion_S S3 g m1 m2) let higgs_sfermion_P p g m1 m2 = [ ((PHiggs p, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFP (p,SL,g,m1,m2)); ((PHiggs p, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFP (p,SU,g,m1,m2)); ((PHiggs p, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFP (p,SD,g,m1,m2)) ] let higgs_sfermion'' g m1 m2 = (higgs_sfermion_P P1 g m1 m2) @ (higgs_sfermion_P P2 g m1 m2) let higgs_sfermion = List.flatten (Product.list3 higgs_sfermion' [1;2;3] [M1;M2] [M1;M2]) @ List.flatten (Product.list3 higgs_sfermion'' [1;2;3] [M1;M2] [M1;M2]) (*** REVISED: Independent of the sign of CD. ***) let higgs_squark' g h m1 m2 = [ ((Hp, Sup (m1,-g), Sdown (m2,h)), Scalar_Scalar_Scalar 1, G_HSUSD (false,m1,m2,g,h)); ((Hm, Sup (m1,g), Sdown (m2,-h)), Scalar_Scalar_Scalar 1, G_HSUSD (true,m1,m2,g,h)) ] let higgs_squark_a g h = higgs_squark' g h M1 M1 let higgs_squark_b (g,h) = List.flatten (Product.list2 (higgs_squark' g h) [M1;M2] [M1;M2]) let higgs_squark = if Flags.ckm_present then List.flatten (Product.list2 higgs_squark_a [1;2] [1;2]) @ ThoList.flatmap higgs_squark_b [(1,3);(2,3);(3,3);(3,1);(3,2)] else higgs_squark_a 1 1 @ higgs_squark_a 2 2 @ higgs_squark_b (3,3) let vertices3 = (ThoList.flatmap electromagnetic_currents_3 [1;2;3] @ ThoList.flatmap electromagnetic_currents_2 [C1;C2] @ List.flatten (Product.list2 electromagnetic_sfermion_currents [1;2;3] [M1;M2]) @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_sfermion_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ List.flatten (Product.list2 charged_slepton_currents [1;2;3] [M1;M2]) @ (if Flags.ckm_present then List.flatten (Product.list2 charged_quark_currents [1;2;3] [1;2;3]) @ List.flatten (Product.list2 charged_squark_currents [1;2;3] [1;2;3]) @ ThoList.flatmap yukawa_higgs_quark [(1,3);(2,3);(3,3);(3,1);(3,2)] else charged_quark_currents 1 1 @ charged_quark_currents 2 2 @ charged_quark_currents 3 3 @ charged_squark_currents 1 1 @ charged_squark_currents 2 2 @ charged_squark_currents 3 3 @ ThoList.flatmap yukawa_higgs_quark [(3,3)]) @ (*i ThoList.flatmap yukawa_higgs [1;2;3] @ i*) yukawa_higgs 3 @ yukawa_n @ ThoList.flatmap yukawa_c [C1;C2] @ ThoList.flatmap yukawa_cq [C1;C2] @ List.flatten (Product.list2 charged_chargino_currents [N1;N2;N3;N4;N5] [C1;C2]) @ triple_gauge @ ThoList.flatmap neutral_Z (pairs [N1;N2;N3;N4;N5]) @ Product.list2 charged_Z [C1;C2] [C1;C2] @ gauge_higgs @ higgs @ yukawa_higgs_2 @ (*i List.flatten (Product.list2 yukawa_higgs_quark [1;2;3] [1;2;3]) @ i*) List.flatten (Product.list2 higgs_charg_neutr [N1;N2;N3;N4;N5] [C1;C2]) @ higgs_neutr @ higgs_sneutrino @ higgs_sfermion @ higgs_squark @ yukawa_v @ ThoList.flatmap col_currents [1;2;3] @ List.flatten (Product.list2 col_sfermion_currents [1;2;3] [M1;M2])) let vertices4 = (quartic_gauge @ higgs4 @ gauge_higgs4 @ ThoList.flatmap gauge_sfermion4 [1;2;3] @ gauge_squark4 @ gluon_w_squark @ ThoList.flatmap gluon2_squark2 [1;2;3] @ ThoList.flatmap gluon_gauge_squark [1;2;3]) let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 (* SLHA2-Nomenclature for neutral Higgses *) let flavor_of_string s = match s with | "e-" -> L 1 | "e+" -> L (-1) | "mu-" -> L 2 | "mu+" -> L (-2) | "tau-" -> L 3 | "tau+" -> L (-3) | "nue" -> N 1 | "nuebar" -> N (-1) | "numu" -> N 2 | "numubar" -> N (-2) | "nutau" -> N 3 | "nutaubar" -> N (-3) | "se1-" -> Slepton (M1,1) | "se1+" -> Slepton (M1,-1) | "smu1-" -> Slepton (M1,2) | "smu1+" -> Slepton (M1,-2) | "stau1-" -> Slepton (M1,3) | "stau1+" -> Slepton (M1,-3) | "se2-" -> Slepton (M2,1) | "se2+" -> Slepton (M2,-1) | "smu2-" -> Slepton (M2,2) | "smu2+" -> Slepton (M2,-2) | "stau2-" -> Slepton (M2,3) | "stau2+" -> Slepton (M2,-3) | "snue" -> Sneutrino 1 | "snue*" -> Sneutrino (-1) | "snumu" -> Sneutrino 2 | "snumu*" -> Sneutrino (-2) | "snutau" -> Sneutrino 3 | "snutau*" -> Sneutrino (-3) | "u" -> U 1 | "ubar" -> U (-1) | "c" -> U 2 | "cbar" -> U (-2) | "t" -> U 3 | "tbar" -> U (-3) | "d" -> D 1 | "dbar" -> D (-1) | "s" -> D 2 | "sbar" -> D (-2) | "b" -> D 3 | "bbar" -> D (-3) | "A" -> Ga | "Z" | "Z0" -> Z | "W+" -> Wp | "W-" -> Wm | "gl" | "g" -> Gl | "h01" -> SHiggs S1 | "h02" -> SHiggs S2 | "h03" -> SHiggs S3 | "A01" -> PHiggs P1 | "A02" -> PHiggs P2 | "H+" -> Hp | "H-" -> Hm | "su1" -> Sup (M1,1) | "su1c" -> Sup (M1,-1) | "sc1" -> Sup (M1,2) | "sc1c" -> Sup (M1,-2) | "st1" -> Sup (M1,3) | "st1c" -> Sup (M1,-3) | "su2" -> Sup (M2,1) | "su2c" -> Sup (M2,-1) | "sc2" -> Sup (M2,2) | "sc2c" -> Sup (M2,-2) | "st2" -> Sup (M2,3) | "st2c" -> Sup (M2,-3) | "sgl" | "sg" -> Gluino | "sd1" -> Sdown (M1,1) | "sd1c" -> Sdown (M1,-1) | "ss1" -> Sdown (M1,2) | "ss1c" -> Sdown (M1,-2) | "sb1" -> Sdown (M1,3) | "sb1c" -> Sdown (M1,-3) | "sd2" -> Sdown (M2,1) | "sd2c" -> Sdown (M2,-1) | "ss2" -> Sdown (M2,2) | "ss2c" -> Sdown (M2,-2) | "sb2" -> Sdown (M2,3) | "sb2c" -> Sdown (M2,-3) | "neu1" -> Neutralino N1 | "neu2" -> Neutralino N2 | "neu3" -> Neutralino N3 | "neu4" -> Neutralino N4 | "neu5" -> Neutralino N5 | "ch1+" -> Chargino C1 | "ch2+" -> Chargino C2 | "ch1-" -> Chargino C1c | "ch2-" -> Chargino C2c | s -> invalid_arg ("Fatal error: %s Modellib_NMSSM.NMSSM.flavor_of_string:" ^ s) let flavor_to_string = function | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_string: invalid down type quark" | Gl -> "gl" | Gluino -> "sgl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | SHiggs S1 -> "h01" | SHiggs S2 -> "h02" | SHiggs S3 -> "h03" | PHiggs P1 -> "A01" | PHiggs P2 -> "A02" | Hp -> "H+" | Hm -> "H-" | Slepton (M1,1) -> "se1-" | Slepton (M1,-1) -> "se1+" | Slepton (M1,2) -> "smu1-" | Slepton (M1,-2) -> "smu1+" | Slepton (M1,3) -> "stau1-" | Slepton (M1,-3) -> "stau1+" | Slepton (M2,1) -> "se2-" | Slepton (M2,-1) -> "se2+" | Slepton (M2,2) -> "smu2-" | Slepton (M2,-2) -> "smu2+" | Slepton (M2,3) -> "stau2-" | Slepton (M2,-3) -> "stau2+" | Sneutrino 1 -> "snue" | Sneutrino (-1) -> "snue*" | Sneutrino 2 -> "snumu" | Sneutrino (-2) -> "snumu*" | Sneutrino 3 -> "snutau" | Sneutrino (-3) -> "snutau*" | Sup (M1,1) -> "su1" | Sup (M1,-1) -> "su1c" | Sup (M1,2) -> "sc1" | Sup (M1,-2) -> "sc1c" | Sup (M1,3) -> "st1" | Sup (M1,-3) -> "st1c" | Sup (M2,1) -> "su2" | Sup (M2,-1) -> "su2c" | Sup (M2,2) -> "sc2" | Sup (M2,-2) -> "sc2c" | Sup (M2,3) -> "st2" | Sup (M2,-3) -> "st2c" | Sdown (M1,1) -> "sd1" | Sdown (M1,-1) -> "sd1c" | Sdown (M1,2) -> "ss1" | Sdown (M1,-2) -> "ss1c" | Sdown (M1,3) -> "sb1" | Sdown (M1,-3) -> "sb1c" | Sdown (M2,1) -> "sd2" | Sdown (M2,-1) -> "sd2c" | Sdown (M2,2) -> "ss2" | Sdown (M2,-2) -> "ss2c" | Sdown (M2,3) -> "sb2" | Sdown (M2,-3) -> "sb2c" | Neutralino N1 -> "neu1" | Neutralino N2 -> "neu2" | Neutralino N3 -> "neu3" | Neutralino N4 -> "neu4" | Neutralino N5 -> "neu5" | Chargino C1 -> "ch1+" | Chargino C1c -> "ch1-" | Chargino C2 -> "ch2+" | Chargino C2c -> "ch2-" | _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_string" let flavor_to_TeX = function | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | L _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid lepton" | N _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid neutrino" | U _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid up type quark" | D _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid down type quark" | Gl -> "g" | Gluino -> "\\widetilde{g}" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | SHiggs S1 -> "S_1" | SHiggs S2 -> "S_2" | SHiggs S3 -> "S_3" | PHiggs P1 -> "P_1" | PHiggs P2 -> "P_2" | Hp -> "H^+" | Hm -> "H^-" | Slepton (M1,1) -> "\\widetilde{e}_1^-" | Slepton (M1,-1) -> "\\widetilde{e}_1^+" | Slepton (M1,2) -> "\\widetilde{\\mu}_1^-" | Slepton (M1,-2) -> "\\widetilde{\\mu}_1^+" | Slepton (M1,3) -> "\\widetilde{\\tau}_1^-" | Slepton (M1,-3) -> "\\widetilde{\\tau}_1^+" | Slepton (M2,1) -> "\\widetilde{e}_2^-" | Slepton (M2,-1) -> "\\widetilde{e}_2^+" | Slepton (M2,2) -> "\\widetilde{\\mu}_2^-" | Slepton (M2,-2) -> "\\widetilde{\\mu}_2^+" | Slepton (M2,3) -> "\\widetilde{\\tau}_2^-" | Slepton (M2,-3) -> "\\widetilde{\\tau}_2^+" | Sneutrino 1 -> "\\widetilde{\\nu}_e" | Sneutrino (-1) -> "\\widetilde{\\nu}_e^*" | Sneutrino 2 -> "\\widetilde{\\nu}_\\mu" | Sneutrino (-2) -> "\\widetilde{\\nu}_\\mu^*" | Sneutrino 3 -> "\\widetilde{\\nu}_\\tau" | Sneutrino (-3) -> "\\widetilde{\\nu}_\\tau^*" | Sup (M1,1) -> "\\widetilde{u}_1" | Sup (M1,-1) -> "\\widetilde{u}_1^*" | Sup (M1,2) -> "\\widetilde{c}_1" | Sup (M1,-2) -> "\\widetilde{c}_1^*" | Sup (M1,3) -> "\\widetilde{t}_1" | Sup (M1,-3) -> "\\widetilde{t}_1^*" | Sup (M2,1) -> "\\widetilde{u}_2" | Sup (M2,-1) -> "\\widetilde{u}_2^*" | Sup (M2,2) -> "\\widetilde{c}_2" | Sup (M2,-2) -> "\\widetilde{c}_2^*" | Sup (M2,3) -> "\\widetilde{t}_2" | Sup (M2,-3) -> "\\widetilde{t}_2^*" | Sdown (M1,1) -> "\\widetilde{d}_1" | Sdown (M1,-1) -> "\\widetilde{d}_1^*" | Sdown (M1,2) -> "\\widetilde{s}_1" | Sdown (M1,-2) -> "\\widetilde{s}_1^*" | Sdown (M1,3) -> "\\widetilde{b}_1" | Sdown (M1,-3) -> "\\widetilde{b}_1^*" | Sdown (M2,1) -> "\\widetilde{d}_2" | Sdown (M2,-1) -> "\\widetilde{d}_2^*" | Sdown (M2,2) -> "\\widetilde{s}_2" | Sdown (M2,-2) -> "\\widetilde{s}_2^*" | Sdown (M2,3) -> "\\widetilde{b}_2" | Sdown (M2,-3) -> "\\widetilde{b}_2^*" | Neutralino N1 -> "\\widetilde{\\chi}^0_1" | Neutralino N2 -> "\\widetilde{\\chi}^0_2" | Neutralino N3 -> "\\widetilde{\\chi}^0_3" | Neutralino N4 -> "\\widetilde{\\chi}^0_4" | Neutralino N5 -> "\\widetilde{\\chi}^0_5" | Slepton _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid slepton" | Sneutrino _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid sneutrino" | Sup _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid up type squark" | Sdown _ -> invalid_arg "Modellib_NMSSM.NMSSM.flavor_to_TeX: invalid down type squark" | Chargino C1 -> "\\widetilde{\\chi}_1^+" | Chargino C1c -> "\\widetilde{\\chi}_1^-" | Chargino C2 -> "\\widetilde{\\chi}_2^+" | Chargino C2c -> "\\widetilde{\\chi}_2^-" let flavor_symbol = function | L g when g > 0 -> "l" ^ string_of_int g | L g -> "l" ^ string_of_int (abs g) ^ "b" | N g when g > 0 -> "n" ^ string_of_int g | N g -> "n" ^ string_of_int (abs g) ^ "b" | U g when g > 0 -> "u" ^ string_of_int g | U g -> "u" ^ string_of_int (abs g) ^ "b" | D g when g > 0 -> "d" ^ string_of_int g | D g -> "d" ^ string_of_int (abs g) ^ "b" | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | Slepton (M1,g) when g > 0 -> "sl1" ^ string_of_int g | Slepton (M1,g) -> "sl1c" ^ string_of_int (abs g) | Slepton (M2,g) when g > 0 -> "sl2" ^ string_of_int g | Slepton (M2,g) -> "sl2c" ^ string_of_int (abs g) | Sneutrino g when g > 0 -> "sn" ^ string_of_int g | Sneutrino g -> "snc" ^ string_of_int (abs g) | Sup (M1,g) when g > 0 -> "su1" ^ string_of_int g | Sup (M1,g) -> "su1c" ^ string_of_int (abs g) | Sup (M2,g) when g > 0 -> "su2" ^ string_of_int g | Sup (M2,g) -> "su2c" ^ string_of_int (abs g) | Sdown (M1,g) when g > 0 -> "sd1" ^ string_of_int g | Sdown (M1,g) -> "sd1c" ^ string_of_int (abs g) | Sdown (M2,g) when g > 0 -> "sd2" ^ string_of_int g | Sdown (M2,g) -> "sd2c" ^ string_of_int (abs g) | Neutralino n -> "neu" ^ (string_of_neu n) | Chargino c when (int_of_char c) > 0 -> "cp" ^ string_of_char c | Chargino c -> "cm" ^ string_of_int (abs (int_of_char c)) | Gluino -> "sgl" | SHiggs s -> "h0" ^ (string_of_shiggs s) | PHiggs p -> "A0" ^ (string_of_phiggs p) | Hp -> "hp" | Hm -> "hm" let pdg = function | L g when g > 0 -> 9 + 2*g | L g -> - 9 + 2*g | N g when g > 0 -> 10 + 2*g | N g -> - 10 + 2*g | U g when g > 0 -> 2*g | U g -> 2*g | D g when g > 0 -> - 1 + 2*g | D g -> 1 + 2*g | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | SHiggs S1 -> 25 | SHiggs S2 -> 35 | SHiggs S3 -> 45 | PHiggs P1 -> 36 | PHiggs P2 -> 46 | Hp -> 37 | Hm -> (-37) | Slepton (M1,g) when g > 0 -> 1000009 + 2*g | Slepton (M1,g) -> - 1000009 + 2*g | Slepton (M2,g) when g > 0 -> 2000009 + 2*g | Slepton (M2,g) -> - 2000009 + 2*g | Sneutrino g when g > 0 -> 1000010 + 2*g | Sneutrino g -> - 1000010 + 2*g | Sup (M1,g) when g > 0 -> 1000000 + 2*g | Sup (M1,g) -> - 1000000 + 2*g | Sup (M2,g) when g > 0 -> 2000000 + 2*g | Sup (M2,g) -> - 2000000 + 2*g | Sdown (M1,g) when g > 0 -> 999999 + 2*g | Sdown (M1,g) -> - 999999 + 2*g | Sdown (M2,g) when g > 0 -> 1999999 + 2*g | Sdown (M2,g) -> - 1999999 + 2*g | Gluino -> 1000021 | Chargino C1 -> 1000024 | Chargino C1c -> (-1000024) | Chargino C2 -> 1000037 | Chargino C2c -> (-1000037) | Neutralino N1 -> 1000022 | Neutralino N2 -> 1000023 | Neutralino N3 -> 1000025 | Neutralino N4 -> 1000035 | Neutralino N5 -> 1000045 (* We must take care of the pdg numbers for the two different kinds of sfermions in the MSSM. The particle data group in its Monte Carlo particle numbering scheme takes only into account mixtures of the third generation squarks and the stau. For the other sfermions we will use the number of the lefthanded field for the lighter mixed state and the one for the righthanded for the heavier. Below are the official pdg numbers from the Particle Data Group. In order not to produce arrays with some million entries in the Fortran code for the masses and the widths we introduce our private pdg numbering scheme which only extends not too far beyond 42. Our private scheme then has the following pdf numbers (for the sparticles the subscripts $L/R$ and $1/2$ are taken synonymously): \begin{center} \renewcommand{\arraystretch}{1.2} \begin{tabular}{|r|l|l|}\hline $d$ & down-quark & 1 \\\hline $u$ & up-quark & 2 \\\hline $s$ & strange-quark & 3 \\\hline $c$ & charm-quark & 4 \\\hline $b$ & bottom-quark & 5 \\\hline $t$ & top-quark & 6 \\\hline\hline $e^-$ & electron & 11 \\\hline $\nu_e$ & electron-neutrino & 12 \\\hline $\mu^-$ & muon & 13 \\\hline $\nu_\mu$ & muon-neutrino & 14 \\\hline $\tau^-$ & tau & 15 \\\hline $\nu_\tau$ & tau-neutrino & 16 \\\hline\hline $g$ & gluon & (9) 21 \\\hline $\gamma$ & photon & 22 \\\hline $Z^0$ & Z-boson & 23 \\\hline $W^+$ & W-boson & 24 \\\hline\hline $h^0$ & light Higgs boson & 25 \\\hline $H^0$ & heavy Higgs boson & 35 \\\hline $A^0$ & pseudoscalar Higgs & 36 \\\hline $H^+$ & charged Higgs & 37 \\\hline\hline $\tilde{d}_L$ & down-squark 1 & 41 \\\hline $\tilde{u}_L$ & up-squark 1 & 42 \\\hline $\tilde{s}_L$ & strange-squark 1 & 43 \\\hline $\tilde{c}_L$ & charm-squark 1 & 44 \\\hline $\tilde{b}_L$ & bottom-squark 1 & 45 \\\hline $\tilde{t}_L$ & top-squark 1 & 46 \\\hline $\tilde{d}_R$ & down-squark 2 & 47 \\\hline $\tilde{u}_R$ & up-squark 2 & 48 \\\hline $\tilde{s}_R$ & strange-squark 2 & 49 \\\hline $\tilde{c}_R$ & charm-squark 2 & 50 \\\hline $\tilde{b}_R$ & bottom-squark 2 & 51 \\\hline $\tilde{t}_R$ & top-squark 2 & 52 \\\hline\hline $\tilde{e}_L$ & selectron 1 & 53 \\\hline $\tilde{\nu}_{e,L}$ & electron-sneutrino & 54 \\\hline $\tilde{\mu}_L$ & smuon 1 & 55 \\\hline $\tilde{\nu}_{\mu,L}$ & muon-sneutrino & 56 \\\hline $\tilde{\tau}_L$ & stau 1 & 57 \\\hline $\tilde{\nu}_{\tau,L}$ & tau-sneutrino & 58 \\\hline $\tilde{e}_R$ & selectron 2 & 59 \\\hline $\tilde{\mu}_R$ & smuon 2 & 61 \\\hline $\tilde{\tau}_R$ & stau 2 & 63 \\\hline\hline $\tilde{g}$ & gluino & 64 \\\hline $\tilde{\chi}^0_1$ & neutralino 1 & 65 \\\hline $\tilde{\chi}^0_2$ & neutralino 2 & 66 \\\hline $\tilde{\chi}^0_3$ & neutralino 3 & 67 \\\hline $\tilde{\chi}^0_4$ & neutralino 4 & 68 \\\hline $\tilde{\chi}^0_5$ & neutralino 5 & 69 \\\hline $\tilde{\chi4}^+_1$ & chargino 1 & 70 \\\hline $\tilde{\chi}^+_2$ & chargino 2 & 71 \\\hline\hline $a$ & pseudoscalar & 72 \\\hline $s$ & scalar singlet & 73 \\\hline $\tilde{G}$ & gravitino & -- \\\hline\hline \end{tabular} \end{center} *) let pdg_mw = function | L g when g > 0 -> 9 + 2*g | L g -> - 9 + 2*g | N g when g > 0 -> 10 + 2*g | N g -> - 10 + 2*g | U g when g > 0 -> 2*g | U g -> 2*g | D g when g > 0 -> - 1 + 2*g | D g -> 1 + 2*g | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | SHiggs S1 -> 25 | SHiggs S2 -> 35 | PHiggs P1 -> 36 | Hp -> 37 | Hm -> (-37) | Sup (M1,g) when g > 0 -> 40 + 2*g | Sup (M1,g) -> - 40 + 2*g | Sup (M2,g) when g > 0 -> 46 + 2*g | Sup (M2,g) -> - 46 + 2*g | Sdown (M1,g) when g > 0 -> 39 + 2*g | Sdown (M1,g) -> - 39 + 2*g | Sdown (M2,g) when g > 0 -> 45 + 2*g | Sdown (M2,g) -> - 45 + 2*g | Slepton (M1,g) when g > 0 -> 51 + 2*g | Slepton (M1,g) -> - 51 + 2*g | Slepton (M2,g) when g > 0 -> 57 + 2*g | Slepton (M2,g) -> - 57 + 2*g | Sneutrino g when g > 0 -> 52 + 2*g | Sneutrino g -> - 52 + 2*g | Gluino -> 64 | Chargino C1 -> 70 | Chargino C1c -> (-70) | Chargino C2 -> 71 | Chargino C2c -> (-71) | Neutralino N1 -> 65 | Neutralino N2 -> 66 | Neutralino N3 -> 67 | Neutralino N4 -> 68 | Neutralino N5 -> 69 | PHiggs P2 -> 72 | SHiggs S3 -> 73 let mass_symbol f = "mass(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let conj_symbol = function | false, str -> str | true, str -> str ^ "_c" let constant_symbol = function | E -> "e" | G -> "g" | Mu -> "mu" | Lambda -> "lambda" | G_Z -> "gz" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_charg -> "qchar" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCQ (vc,g1,g2) -> conj_symbol (vc, "g_ccq" ) ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ ")" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_PZWW -> "gpzww" | G_PPWW -> "gppww" | G_GH4_ZZPP (p1,p2) -> "g_ZZA0A0(" ^ string_of_phiggs p1 ^ "," ^ string_of_phiggs p2 ^ ")" | G_GH4_ZZSS (s1,s2) -> "g_ZZh0h0(" ^ string_of_shiggs s1 ^ "," ^ string_of_shiggs s2 ^ ")" | G_GH4_ZZCC -> "g_zzhphm" | G_GH4_GaGaCC -> "g_AAhphm" | G_GH4_ZGaCC -> "g_zAhphm" | G_GH4_WWCC -> "g_wwhphm" | G_GH4_WWPP (p1,p2) -> "g_WWA0A0(" ^ string_of_phiggs p1 ^ "," ^ string_of_phiggs p2 ^ ")" | G_GH4_WWSS (s1,s2) -> "g_WWh0h0(" ^ string_of_shiggs s1 ^ "," ^ string_of_shiggs s2 ^ ")" | G_GH4_ZWSC s -> "g_ZWhph0(" ^ string_of_shiggs s ^")" | G_GH4_GaWSC s -> "g_AWhph0(" ^ string_of_shiggs s ^")" | G_GH4_ZWPC p -> "g_ZWhpA0(" ^ string_of_phiggs p ^")" | G_GH4_GaWPC p -> "g_AWhpA0(" ^ string_of_phiggs p ^")" | G_CICIS (n1,n2,s) -> "g_neuneuh0(" ^ string_of_neu n1 ^ "," ^ string_of_neu n2 ^ "," ^ string_of_shiggs s ^ ")" | G_CICIP (n1,n2,p) -> "g_neuneuA0(" ^ string_of_neu n1 ^ "," ^ string_of_neu n2 ^ "," ^ string_of_phiggs p ^ ")" | G_H3_SCC s -> "g_h0hphm(" ^ string_of_shiggs s ^ ")" | G_H3_SPP (s,p1,p2) -> "g_h0A0A0(" ^ string_of_shiggs s ^ "," ^ string_of_phiggs p1 ^ "," ^ string_of_phiggs p2 ^ ")" | G_H3_SSS (s1,s2,s3) -> "g_h0h0h0(" ^ string_of_shiggs s1 ^ "," ^ string_of_shiggs s2 ^ "," ^ string_of_shiggs s3 ^ ")" | G_CSC (c1,c2,s) -> "g_chchh0(" ^ string_of_char c1 ^ "," ^ string_of_char c2 ^ "," ^ string_of_shiggs s ^")" | G_CPC (c1,c2,p) -> "g_chchA0(" ^ string_of_char c1 ^ "," ^ string_of_char c2 ^ "," ^ string_of_phiggs p ^")" | G_YUK_FFS (f1,f2,s) -> "g_yuk_h0_" ^ string_of_fermion_type f1 ^ string_of_fermion_type f2 ^ "(" ^ string_of_shiggs s ^ "," ^ string_of_fermion_gen f1 ^ ")" | G_YUK_FFP (f1,f2,p) -> "g_yuk_A0_" ^ string_of_fermion_type f1 ^ string_of_fermion_type f2 ^ "(" ^ string_of_phiggs p ^ "," ^ string_of_fermion_gen f1 ^ ")" | G_YUK_LCN g -> "g_yuk_hp_ln(" ^ string_of_int g ^ ")" | G_NWC (n,c) -> "g_nwc(" ^ string_of_char c ^ "," ^ string_of_neu n ^ ")" | G_CWN (c,n) -> "g_cwn(" ^ string_of_char c ^ "," ^ string_of_neu n ^ ")" | G_SLSNW (vc,g,m) -> conj_symbol (vc, "g_wslsn") ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m ^ ")" | G_NZN (n1,n2) -> "g_zneuneu(" ^ string_of_neu n1 ^ "," ^ string_of_neu n2 ^ ")" | G_CZC (c1,c2) -> "g_zchch(" ^ string_of_char c1 ^ "," ^ string_of_char c2 ^ ")" | Gs -> "gs" | G_YUK_UCD (n,m) -> "g_yuk_hp_ud(" ^ string_of_int n ^ "," ^ string_of_int m ^ ")" | G_YUK_DCU (n,m) -> "g_yuk_hm_du(" ^ string_of_int n ^ "," ^ string_of_int m ^ ")" | G_YUK_N (vc,f,n,sf,m) -> conj_symbol (vc, "g_yuk_neu_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_fermion_gen f ^ "," ^ string_of_neu n ^ "," ^ string_of_sfm m ^ ")" | G_YUK_G (vc,f,sf,m) -> conj_symbol (vc, "g_yuk_gluino_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_fermion_gen f ^ "," ^ string_of_sfm m ^ ")" | G_YUK_C (vc,f,c,sf,m) -> conj_symbol (vc, "g_yuk_char_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_fermion_gen f ^ "," ^ string_of_char c ^ "," ^ string_of_sfm m ^ ")" | G_YUK_Q (vc,g1,f,c,sf,m) -> conj_symbol (vc, "g_yuk_char_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_int g1 ^ "," ^ string_of_fermion_gen f ^ "," ^ string_of_char c ^ "," ^ string_of_sfm m ^ ")" | G_WPSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_wA_susd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_WZSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_wz_susd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_GH_ZSP (s,p) -> "g_zh0a0(" ^ string_of_shiggs s ^ "," ^ string_of_phiggs p ^ ")" | G_GH_WSC s -> "g_Whph0(" ^ string_of_shiggs s ^ ")" | G_GH_WPC p -> "g_WhpA0(" ^ string_of_phiggs p ^ ")" | G_GH_ZZS s -> "g_ZZh0(" ^ string_of_shiggs s ^ ")" | G_GH_WWS s -> "g_WWh0(" ^ string_of_shiggs s ^ ")" | G_GLUGLUH0 s -> "g_glugluh0(" ^ string_of_shiggs s ^ ")" | G_GLUGLUA0 p -> "g_gluglua0(" ^ string_of_phiggs p ^ ")" | G_GH_ZCC -> "g_Zhmhp" | G_GH_GaCC -> "g_Ahmhp" | G_ZSF (f,g,m1,m2) -> "g_z" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_HSNSL (vc,g,m) -> conj_symbol (vc, "g_hp_sl" ^ string_of_sfm m ^ "sn1") ^ "(" ^ string_of_int g ^ ")" | G_GlGlSQSQ -> "g_gg_sqsq" | G_PPSFSF f -> "g_AA_" ^ string_of_sff f ^ string_of_sff f | G_ZZSFSF (f,g,m1,m2) -> "g_zz_" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^","^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_ZPSFSF (f,g,m1,m2) -> "g_zA_" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^","^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_GlPSQSQ -> "g_gA_sqsq" | G_GlZSFSF (f,g,m1,m2) -> "g_gz_" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_GlWSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_gw_susd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_SS -> "gs**2" | I_G_S -> "igs" | G_NHC (vc,n,c) -> conj_symbol(vc,"g_neuhmchar") ^ "(" ^ string_of_neu n ^ "," ^ string_of_char c ^")" | G_WWSFSF (f,g,m1,m2) -> "g_ww_" ^ string_of_sff f ^ string_of_sff f ^"(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_WPSLSN (vc,g,m) -> conj_symbol (vc, "g_wA_slsn") ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m ^ ")" | G_WZSLSN (vc,g,m) -> conj_symbol (vc, "g_wz_slsn") ^"("^ string_of_int g ^ "," ^ string_of_sfm m ^ ")" | G_SFSFS (s,f,g,m1,m2) -> "g_h0_"^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "(" ^ string_of_shiggs s ^ "," ^ string_of_int g ^ ")" | G_SFSFP (p,f,g,m1,m2) -> "g_A0_"^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "(" ^ string_of_phiggs p ^ "," ^ string_of_int g ^ ")" | G_HSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_hp_su" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 )^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^")" | G_WSQ (vc,g1,g2,m1,m2) -> conj_symbol (vc, "g_wsusd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" end Index: trunk/omega/src/UFO_targets.ml =================================================================== --- trunk/omega/src/UFO_targets.ml (revision 8415) +++ trunk/omega/src/UFO_targets.ml (revision 8416) @@ -1,1026 +1,1298 @@ (* UFO_targets.ml -- Copyright (C) 1999-2017 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) let (@@) f g x = f (g x) (* \thocwmodulesection{Generating Code for UFO Lorentz Structures} *) (* O'Caml before 4.02 had a module typing bug that forces us to put this definition outside [Lorentz_Fusion]. *) module Q = Algebra.Q module QC = Algebra.QC module type T = sig (* [lorentz formatter name spins v] writes a representation of the Lorentz structure [v] of particles with the Lorentz representations [spins] as a (Fortran) function [name] to [formatter]. *) val lorentz : Format_Fortran.formatter -> string -> Coupling.lorentz array -> UFO_Lorentz.t -> unit val propagator : Format_Fortran.formatter -> string -> Coupling.lorentz * Coupling.lorentz -> UFO_Lorentz.t -> UFO_Lorentz.t -> unit + val fusion_name : + string -> Permutation.Default.t -> Coupling.fermion_lines -> string + val fuse : - Algebra.QC.t -> string -> Coupling.lorentzn -> + Algebra.QC.t -> string -> + Coupling.lorentzn -> Coupling.fermion_lines -> string -> string list -> string list -> Coupling.fusen -> unit val eps4_g4_g44_decl : Format_Fortran.formatter -> unit -> unit val eps4_g4_g44_init : Format_Fortran.formatter -> unit -> unit + module type Test = + sig + val suite : OUnit.test + end + + module Test : Test + end module Fortran : T = struct open Format_Fortran let pp_divide ?(indent=0) ff () = fprintf ff "%*s! %s" indent "" (String.make (70 - indent) '-'); pp_newline ff () let conjugate = function | Coupling.Spinor -> Coupling.ConjSpinor | Coupling.ConjSpinor -> Coupling.Spinor | r -> r let spin_mnemonic = function | Coupling.Scalar -> "phi" | Coupling.Spinor -> "psi" | Coupling.ConjSpinor -> "psibar" | Coupling.Majorana -> "chi" | Coupling.Maj_Ghost -> invalid_arg "UFO_targets: Maj_Ghost" | Coupling.Vector -> "a" | Coupling.Massive_Vector -> "v" | Coupling.Vectorspinor -> "grav" (* itino *) | Coupling.Tensor_1 -> invalid_arg "UFO_targets: Tensor_1" | Coupling.Tensor_2 -> "h" | Coupling.BRS l -> invalid_arg "UFO_targets: BRS" let fortran_type = function | Coupling.Scalar -> "complex(kind=default)" | Coupling.Spinor -> "type(spinor)" | Coupling.ConjSpinor -> "type(conjspinor)" | Coupling.Majorana -> "type(bispinor)" | Coupling.Maj_Ghost -> invalid_arg "UFO_targets: Maj_Ghost" | Coupling.Vector -> "type(vector)" | Coupling.Massive_Vector -> "type(vector)" | Coupling.Vectorspinor -> "type(vectorspinor)" | Coupling.Tensor_1 -> invalid_arg "UFO_targets: Tensor_1" | Coupling.Tensor_2 -> "type(tensor)" | Coupling.BRS l -> invalid_arg "UFO_targets: BRS" (* The \texttt{omegalib} separates time from space. Maybe not a good idea after all. Mend it locally \ldots *) type wf = { pos : int; spin : Coupling.lorentz; name : string; local_array : string option; momentum : string; momentum_array : string; fortran_type : string } let wf_table spins = Array.mapi (fun i s -> let spin = if i = 0 then conjugate s else s in let pos = succ i in let i = string_of_int pos in let name = spin_mnemonic s ^ i in let local_array = begin match spin with | Coupling.Vector | Coupling.Massive_Vector -> Some (name ^ "a") | _ -> None end in { pos; spin; name; local_array; momentum = "k" ^ i; momentum_array = "p" ^ i; fortran_type = fortran_type spin } ) spins module L = UFO_Lorentz (* Format rational ([Q.t]) and complex rational ([QC.t]) numbers as fortran values. *) let format_rational q = if Q.is_integer q then string_of_int (Q.to_integer q) else let n, d = Q.to_ratio q in Printf.sprintf "%d.0_default/%d" n d let format_complex_rational cq = let real = QC.real cq and imag = QC.imag cq in if Q.is_null imag then begin if Q.is_negative real then "(" ^ format_rational real ^ ")" else format_rational real end else if Q.is_integer real && Q.is_integer imag then Printf.sprintf "(%d,%d)" (Q.to_integer real) (Q.to_integer imag) else Printf.sprintf "cmplx(%s,%s,kind=default)" (format_rational real) (format_rational imag) (* Optimize the representation if used as a prefactor of a summand in a sum. *) let format_rational_factor q = if Q.is_unit q then "+" else if Q.is_unit (Q.neg q) then "-" else if Q.is_negative q then "-" ^ format_rational (Q.neg q) ^ "*" else "+" ^ format_rational q ^ "*" let format_complex_rational_factor cq = let real = QC.real cq and imag = QC.imag cq in if Q.is_null imag then begin if Q.is_unit real then "+" else if Q.is_unit (Q.neg real) then "-" else if Q.is_negative real then "-" ^ format_rational (Q.neg real) ^ "*" else "+" ^ format_rational real ^ "*" end else if Q.is_integer real && Q.is_integer imag then Printf.sprintf "+(%d,%d)*" (Q.to_integer real) (Q.to_integer imag) else Printf.sprintf "+cmplx(%s,%s,kind=default)*" (format_rational real) (format_rational imag) (* Append a formatted list of indices to [name]. *) let append_indices name = function | [] -> name | indices -> name ^ "(" ^ String.concat "," (List.map string_of_int indices) ^ ")" (* Dirac string variables and their names. *) type dsv = | Ket of int | Bra of int | Braket of int let dsv_name = function | Ket n -> Printf.sprintf "ket%02d" n | Bra n -> Printf.sprintf "bra%02d" n | Braket n -> Printf.sprintf "bkt%02d" n let dirac_dimension dsv indices = let tail ilist = String.concat "," (List.map (fun _ -> "0:3") ilist) ^ ")" in match dsv, indices with | Braket _, [] -> "" | (Ket _ | Bra _), [] -> ", dimension(1:4)" | Braket _, indices -> ", dimension(" ^ tail indices | (Ket _ | Bra _), indices -> ", dimension(1:4," ^ tail indices (* Write Fortran code to [decl] and [eval]: apply the Dirac matrix [gamma] with complex rational entries to the spinor [ket] from the left. [ket] must be the name of a scalar variable and cannot be an array element. The result is stored in [dsv_name (Ket n)] which can have additional [indices]. Return [Ket n] for further processing. *) let dirac_ket_to_fortran_decl ff n indices = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let dsv = Ket n in printf " @[<2>complex(kind=default)%s ::@ %s@]" (dirac_dimension dsv indices) (dsv_name dsv); nl () let dirac_ket_to_fortran_eval ff n indices gamma ket = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let dsv = Ket n in for i = 0 to 3 do let name = append_indices (dsv_name dsv) (succ i :: indices) in printf " @[<%d>%s = 0" (String.length name + 5) name; for j = 0 to 3 do if gamma.(i).(j) <> QC.null then printf "@,%s%s%%a(%d)" (format_complex_rational_factor gamma.(i).(j)) ket.name (succ j) done; printf "@]"; nl () done; dsv (* The same as [dirac_bra_to_fortran], but apply the Dirac matrix [gamma] to [bra] from the right and return [Bra n]. *) let dirac_bra_to_fortran_decl ff n indices = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let dsv = Bra n in printf " @[<2>complex(kind=default)%s ::@ %s@]" (dirac_dimension dsv indices) (dsv_name dsv); nl () let dirac_bra_to_fortran_eval ff n indices bra gamma = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let dsv = Bra n in for j = 0 to 3 do let name = append_indices (dsv_name dsv) (succ j :: indices) in printf " @[<%d>%s = 0" (String.length name + 5) name; for i = 0 to 3 do if gamma.(i).(j) <> QC.null then printf "@,%s%s%%a(%d)" (format_complex_rational_factor gamma.(i).(j)) bra.name (succ i) done; printf "@]"; nl () done; dsv (* More of the same, but evaluating a spinor sandwich and returning [Braket n]. *) let dirac_braket_to_fortran_decl ff n indices = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let dsv = Braket n in printf " @[<2>complex(kind=default)%s ::@ %s@]" (dirac_dimension dsv indices) (dsv_name dsv); nl () let dirac_braket_to_fortran_eval ff n indices bra gamma ket = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let dsv = Braket n in let name = append_indices (dsv_name dsv) indices in printf " @[<%d>%s = 0" (String.length name + 5) name; for i = 0 to 3 do for j = 0 to 3 do if gamma.(i).(j) <> QC.null then printf "@,%s%s%%a(%d)*%s%%a(%d)" (format_complex_rational_factor gamma.(i).(j)) bra.name (succ i) ket.name (succ j) done done; printf "@]"; nl (); dsv (* Choose among the previous functions according to the position of [bra] and [ket] among the wavefunctions. If any is in the first position evaluate the spinor expression with the corresponding spinor removed, otherwise evaluate the spinir sandwich. *) let dirac_bra_or_ket_to_fortran_decl ff n indices bra ket = if bra = 1 then dirac_ket_to_fortran_decl ff n indices else if ket = 1 then dirac_bra_to_fortran_decl ff n indices else dirac_braket_to_fortran_decl ff n indices let dirac_bra_or_ket_to_fortran_eval ff n indices wfs bra gamma ket = if bra = 1 then dirac_ket_to_fortran_eval ff n indices gamma wfs.(pred ket) else if ket = 1 then dirac_bra_to_fortran_eval ff n indices wfs.(pred bra) gamma else dirac_braket_to_fortran_eval ff n indices wfs.(pred bra) gamma wfs.(pred ket) (* UFO summation indices are negative integers. Derive a valid Fortran variable name. *) let prefix_summation = "mu" let prefix_polarization = "nu" let index_spinor = "alpha" let index_tensor = "nu" let index_variable mu = if mu < 0 then Printf.sprintf "%s%d" prefix_summation (- mu) else if mu == 0 then prefix_polarization else Printf.sprintf "%s%d" prefix_polarization mu let format_indices indices = String.concat "," (List.map index_variable indices) module IntPM = Partial.Make (struct type t = int let compare = compare end) type tensor = | DS of dsv | V of string | T of UFOx.Lorentz_Atom.vector | S of UFOx.Lorentz_Atom.scalar | Inv of UFOx.Lorentz_Atom.scalar + (* Transform the Dirac strings if we have Majorana + fermions involved, in order to implement the algorithm + from JRR's thesis. NB: + The following is for reference only, to better understand what JRR + was doing\ldots *) + + (* If the vertex is (suppressing the Lorentz indices of~$\phi_2$ and~$\Gamma$) + \begin{equation} + \bar\psi_1 \Gamma\phi_2 \psi_3 + = \Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2 \psi_{3,\beta}\,, + \end{equation} + then this is the version implemented by [fuse] below. *) + + let tho_print_dirac_current f c wf1 wf2 fusion = + match fusion with + | [1; 3] -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta}$ *) + | [3; 1] -> printf "%s_ff(%s,%s,%s)" f c wf2 wf1 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta}$ *) + | [2; 3] -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 (* $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta}$ *) + | [3; 2] -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 (* $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta}$ *) + | [1; 2] -> printf "f_f%s(%s,%s,%s)" f c wf1 wf2 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2$ *) + | [2; 1] -> printf "f_f%s(%s,%s,%s)" f c wf2 wf1 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2$ *) + | _ -> () + + (* This is how JRR implemented + (see subsection~\ref{sec:dirac-matrices-jrr}) the Dirac matrices + that don't change sign under $C\Gamma^T C^{-1} = \Gamma$, + i.\,e.~$\mathbf{1}$, $\gamma_5$ and~$\gamma_5\gamma_\mu$ + (see [Targets.Fortran_Majorana_Fermions.print_fermion_current]) + \begin{itemize} + \item In the case of two fermions, the second wave + function [wf2] is always put into the right slot, + as described in JRR's thesis. + \label{pg:JRR-Fusions} + \item In the case of a boson and a fermion, there is no + need for both ["f_%sf"] and ["f_f%s"], since the + latter can be obtained by exchanging arguments. + \end{itemize} *) + + let jrr_print_majorana_current_S_P_A f c wf1 wf2 fusion = + match fusion with + | [1; 3] -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 (* + $(C\Gamma)_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \cong + C\Gamma $ *) + | [3; 1] -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 (* + $(C\Gamma)_{\alpha\beta} \psi_{3,\alpha} \bar\psi_{1,\beta} \cong + C\Gamma = C\,C\Gamma^T C^{-1} $ *) + | [2; 3] -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 (* + $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [3; 2] -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 (* + $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [1; 2] -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 (* + $\Gamma_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \cong + \Gamma = C\Gamma^T C^{-1} $ *) + | [2; 1] -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 (* + $\Gamma_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \cong + \Gamma = C\Gamma^T C^{-1} $ *) + | _ -> () + + (* This is how JRR implemented the Dirac matrices + that do change sign under $C\Gamma^T C^{-1} = - \Gamma$, + i.\,e.~$\gamma_\mu$ and~$\sigma_{\mu\nu}$ + (see [Targets.Fortran_Majorana_Fermions.print_fermion_current_vector]). *) + + let jrr_print_majorana_current_V f c wf1 wf2 fusion = + match fusion with + | [1; 3] -> printf "%s_ff( %s,%s,%s)" f c wf1 wf2 (* + $ (C\Gamma)_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \cong + C\Gamma $ *) + | [3; 1] -> printf "%s_ff(-%s,%s,%s)" f c wf1 wf2 (* + $-(C\Gamma)_{\alpha\beta} \psi_{3,\alpha} \bar\psi_{1,\beta} \cong + -C\Gamma = C\,C\Gamma^T C^{-1} $ *) + | [2; 3] -> printf "f_%sf( %s,%s,%s)" f c wf1 wf2 (* + $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [3; 2] -> printf "f_%sf( %s,%s,%s)" f c wf2 wf1 (* + $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [1; 2] -> printf "f_%sf(-%s,%s,%s)" f c wf2 wf1 (* + $-\Gamma_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \cong + -\Gamma = C\Gamma^T C^{-1} $ *) + | [2; 1] -> printf "f_%sf(-%s,%s,%s)" f c wf1 wf2 (* + $-\Gamma_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \cong + -\Gamma = C\Gamma^T C^{-1} $ *) + | _ -> () + + (* These two can be unified, if the \texttt{\_c} functions + implement~$\Gamma'=C\Gamma^T C^{-1}$, but we \emph{must} + make sure that the multiplication with~$C$ from the left + happens \emph{after} the transformation~$\Gamma\to\Gamma'$. *) + let jrr_print_majorana_current f c wf1 wf2 fusion = + match fusion with + | [1; 3] -> printf "%s_ff (%s,%s,%s)" f c wf1 wf2 (* + $ (C\Gamma)_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \cong + C\Gamma $ *) + | [3; 1] -> printf "%s_ff_c(%s,%s,%s)" f c wf1 wf2 (* + $(C\Gamma')_{\alpha\beta} \psi_{3,\alpha} \bar\psi_{1,\beta} \cong + C\Gamma' = C\,C\Gamma^T C^{-1} $ *) + | [2; 3] -> printf "f_%sf (%s,%s,%s)" f c wf1 wf2 (* + $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [3; 2] -> printf "f_%sf (%s,%s,%s)" f c wf2 wf1 (* + $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [1; 2] -> printf "f_%sf_c(%s,%s,%s)" f c wf2 wf1 (* + $\Gamma'_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \cong + \Gamma' = C\Gamma^T C^{-1} $ *) + | [2; 1] -> printf "f_%sf_c(%s,%s,%s)" f c wf1 wf2 (* + $\Gamma'_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \cong + \Gamma' = C\Gamma^T C^{-1} $ *) + | _ -> () + + (* Since we may assume~$C^{-1}=-C=C^T$, this can be rewritten + if the \texttt{\_c} functions implement + \begin{equation} + \Gamma^{\prime\,T} + = \left(C\Gamma^T C^{-1}\right)^T + = \left(C^{-1}\right)^T \Gamma \left(C\right)^T + = C \Gamma C^{-1} + \end{equation} + instead. *) + let jrr_print_majorana_current_transposing f c wf1 wf2 fusion = + match fusion with + | [1; 3] -> printf "%s_ff (%s,%s,%s)" f c wf1 wf2 (* + $ (C\Gamma)_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \cong + C\Gamma $ *) + | [3; 1] -> printf "%s_ff_c(%s,%s,%s)" f c wf2 wf1 (* + $(C\Gamma')^T_{\alpha\beta} + \bar\psi_{1,\alpha} \psi_{3,\beta} \cong + (C\Gamma')^T = - C\Gamma $ *) + | [2; 3] -> printf "f_%sf (%s,%s,%s)" f c wf1 wf2 (* + $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [3; 2] -> printf "f_%sf (%s,%s,%s)" f c wf2 wf1 (* + $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \cong + \Gamma $ *) + | [1; 2] -> printf "f_f%s_c(%s,%s,%s)" f c wf1 wf2 (* + $\Gamma^{\prime\,T}_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2 \cong + \Gamma^{\prime\,T} = C\Gamma C^{-1}$ *) + | [2; 1] -> printf "f_f%s_c(%s,%s,%s)" f c wf2 wf1 (* + $\Gamma^{\prime\,T}_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2 \cong + \Gamma^{\prime\,T} = C\Gamma C^{-1} $ *) + | _ -> () + + (* where we have used + \begin{equation} + (C\Gamma')^T = \Gamma^{\prime,T}C^T = C\Gamma C^{-1} C^T = - C\Gamma\,. + \end{equation} *) + + (* This puts the arguments in the same slots as [tho_print_dirac_current] + above and can be implemented by [fuse], iff we inject the proper + transformations in [dennerize] below. *) + + let is_majorana = function + | Coupling.Majorana | Coupling.Vectorspinor | Coupling.Maj_Ghost -> true + | _ -> false + + let is_dirac = function + | Coupling.Spinor | Coupling.ConjSpinor -> true + | _ -> false + + let dennerize ~eval wfs atom = + let printf fmt = fprintf eval fmt + and nl = pp_newline eval in + if is_majorana wfs.(pred atom.L.bra).spin || + is_majorana wfs.(pred atom.L.ket).spin then + if atom.L.bra = 1 then + (* Fusing one or more bosons with a ket like fermion: + $\chi \leftarrow \Gamma\chi$. *) + (* Don't do anything, + as per subsection~\ref{sec:dirac-matrices-jrr}. *) + atom + else if atom.L.ket = 1 then + (* We fuse one or more bosons with a bra like fermion: + $\bar\chi \leftarrow \bar\chi\Gamma$. *) + (* $\Gamma\to C\Gamma C^{-1}$. *) + begin + let atom = L.conjugate atom in + printf " ! conjugated for Majorana"; nl (); + printf " ! %s" (L.dirac_string_to_string atom); nl (); + atom + end + else if atom.L.ket < atom.L.bra then + (* We fuse zero or more bosons with a sandwich of fermions. + $\phi \leftarrow \bar\chi\gamma\chi$.*) + (* Multiply by~$C$ from the left, + as per subsection~\ref{sec:dirac-matrices-jrr}. *) + begin + let atom = L.cc_times atom in + printf " ! multiplied by CC for Majorana"; nl (); + printf " ! %s" (L.dirac_string_to_string atom); nl (); + atom + end + else + (* Transposed: multiply by~$-C$ from the left. *) + begin + let atom = L.minus (L.cc_times atom) in + printf " ! multiplied by negative CC for Majorana"; nl (); + printf " ! %s" (L.dirac_string_to_string atom); nl (); + atom + end + else + atom + (* Write the [i]th Dirac string [ds] as Fortran code to [eval], including a shorthand representation as a comment. Return [ds] with [ds.L.atom] replaced by the dirac string variable, i,\,e.~[DS dsv] annotated with the internal and external indices. In addition write the declaration to [decl]. *) let dirac_string_to_fortran ~decl ~eval i wfs ds = let printf fmt = fprintf eval fmt and nl = pp_newline eval in let bra = ds.L.atom.L.bra and ket = ds.L.atom.L.ket in pp_divide ~indent:4 eval (); - let atom = - match wfs.(pred bra).spin with - | Coupling.Majorana | Coupling.Vectorspinor -> - if bra = 1 then - ds.L.atom - else if ket = 1 then - L.transpose ds.L.atom - else - L.majorana ds.L.atom - | _ -> ds.L.atom in - printf " ! %s" (L.dirac_string_to_string atom); nl (); + printf " ! %s" (L.dirac_string_to_string ds.L.atom); nl (); + let atom = dennerize ~eval wfs ds.L.atom in begin match ds.L.indices with | [] -> let gamma = L.dirac_string_to_matrix (fun _ -> 0) atom in dirac_bra_or_ket_to_fortran_decl decl i [] bra ket; let dsv = dirac_bra_or_ket_to_fortran_eval eval i [] wfs bra gamma ket in L.map_atom (fun _ -> DS dsv) ds | indices -> dirac_bra_or_ket_to_fortran_decl decl i indices bra ket; let combinations = Product.power (List.length indices) [0; 1; 2; 3] in let dsv = List.map (fun combination -> let substitution = IntPM.of_lists indices combination in let substitute = IntPM.apply substitution in let indices = List.map substitute indices in let gamma = L.dirac_string_to_matrix substitute atom in dirac_bra_or_ket_to_fortran_eval eval i indices wfs bra gamma ket) combinations in begin match ThoList.uniq (List.sort compare dsv) with | [dsv] -> L.map_atom (fun _ -> DS dsv) ds | _ -> failwith "dirac_string_to_fortran: impossible" end end (* Write the Dirac strings in the list [ds_list] as Fortran code to [eval], including shorthand representations as comments. Return the list of variables and corresponding indices to be contracted. *) let dirac_strings_to_fortran ~decl ~eval wfs last ds_list = List.fold_left (fun (i, acc) ds -> let i = succ i in (i, dirac_string_to_fortran ~decl ~eval i wfs ds :: acc)) (last, []) ds_list (* Perform a nested sum of terms, as printed by [print_term] (which takes the number of spaces to indent as only argument) of the cartesian product of [indices] running from 0 to 3. *) let nested_sums ~decl ~eval initial_indent indices print_term = let rec nested_sums' indent = function | [] -> print_term indent | index :: indices -> let var = index_variable index in fprintf eval "%*s@[<2>do %s = 0, 3@]" indent "" var; pp_newline eval (); nested_sums' (indent + 2) indices; pp_newline eval (); fprintf eval "%*s@[<2>end do@]" indent "" in nested_sums' (initial_indent + 2) indices (* Polarization indices also need to be summed over, but they appear only once. *) let indices_of_contractions contractions = let index_pairs, polarizations = L.classify_indices (ThoList.flatmap (fun ds -> ds.L.indices) contractions) in try ThoList.pairs index_pairs @ ThoList.uniq (List.sort compare polarizations) with | Invalid_argument s -> invalid_arg ("indices_of_contractions: " ^ ThoList.to_string string_of_int index_pairs) (*i Printf.eprintf "indices_of_contractions: %s / %s\n" (ThoList.to_string string_of_int index_pairs) (ThoList.to_string string_of_int polarizations); i*) let format_dsv dsv indices = match dsv, indices with | Braket _, [] -> dsv_name dsv | Braket _, ilist -> Printf.sprintf "%s(%s)" (dsv_name dsv) (format_indices indices) | (Bra _ | Ket _), [] -> Printf.sprintf "%s(%s)" (dsv_name dsv) index_spinor | (Bra _ | Ket _), ilist -> Printf.sprintf "%s(%s,%s)" (dsv_name dsv) index_spinor (format_indices indices) let format_tensor t = let indices = t.L.indices in match t.L.atom with | DS dsv -> format_dsv dsv indices | V vector -> Printf.sprintf "%s(%s)" vector (format_indices indices) | T UFOx.Lorentz_Atom.P (mu, n) -> Printf.sprintf "p%d(%s)" n (index_variable mu) | T UFOx.Lorentz_Atom.Epsilon (mu1, mu2, mu3, mu4) -> Printf.sprintf "eps4_(%s)" (format_indices [mu1; mu2; mu3; mu4]) | T UFOx.Lorentz_Atom.Metric (mu1, mu2) -> if mu1 > 0 && mu2 > 0 then Printf.sprintf "g44_(%s)" (format_indices [mu1; mu2]) else failwith "format_tensor: compress_metrics has failed!" | S (UFOx.Lorentz_Atom.Mass _) -> "m" | S (UFOx.Lorentz_Atom.Width _) -> "w" | Inv (UFOx.Lorentz_Atom.Mass _) -> "1/m" | Inv (UFOx.Lorentz_Atom.Width _) -> "1/w" let rec multiply_tensors ~decl ~eval = function | [] -> fprintf eval "1"; | [t] -> fprintf eval "%s" (format_tensor t) | t :: tensors -> fprintf eval "%s@,*" (format_tensor t); multiply_tensors ~decl ~eval tensors let contract_indices ~decl ~eval indent wf_indices wfs (fusion, contractees) = let printf fmt = fprintf eval fmt and nl = pp_newline eval in let sum_var = begin match wf_indices with | [] -> wfs.(0).name | ilist -> let indices = String.concat "," ilist in begin match wfs.(0).local_array with | None -> let component = begin match wfs.(0).spin with | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana -> "a" | Coupling.Tensor_2 -> "t" | Coupling.Vector | Coupling.Massive_Vector -> failwith "contract_indices: expected local_array for vectors" | _ -> failwith "contract_indices: unexpected spin" end in Printf.sprintf "%s%%%s(%s)" wfs.(0).name component indices | Some a -> Printf.sprintf "%s(%s)" a indices end end in let indices = List.filter (fun i -> UFOx.Index.position i <> 1) (indices_of_contractions contractees) in nested_sums ~decl ~eval indent indices (fun indent -> printf "%*s@[<2>%s = %s" indent "" sum_var sum_var; printf "@,%s" (format_complex_rational_factor fusion.L.coeff); List.iter (fun i -> printf "@,g4_(%s)*" (index_variable i)) indices; printf "@,("; multiply_tensors ~decl ~eval contractees; printf ")@]"); printf "@]"; nl () let external_wf_loop ~decl ~eval ~indent wfs (fusion, _ as contractees) = pp_divide ~indent eval (); fprintf eval "%*s! %s\n" indent "" (L.to_string [fusion]); pp_divide ~indent eval (); match wfs.(0).spin with | Coupling.Scalar -> contract_indices ~decl ~eval 2 [] wfs contractees | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana -> let idx = index_spinor in fprintf eval "%*s@[<2>do %s = 1, 4@]" indent "" idx; pp_newline eval (); contract_indices ~decl ~eval 4 [idx] wfs contractees; fprintf eval "%*send do@]" indent ""; pp_newline eval () | Coupling.Vector | Coupling.Massive_Vector -> let idx = index_variable 1 in fprintf eval "%*s@[<2>do %s = 0, 3@]" indent "" idx; pp_newline eval (); contract_indices ~decl ~eval 4 [idx] wfs contractees; fprintf eval "%*send do@]" indent ""; pp_newline eval () | Coupling.Tensor_2 -> let idx1 = index_variable (UFOx.Index.pack 1 1) and idx2 = index_variable (UFOx.Index.pack 1 2) in fprintf eval "%*s@[<2>do %s = 0, 3@]" indent "" idx1; pp_newline eval (); fprintf eval "%*s@[<2>do %s = 0, 3@]" (indent + 2) "" idx2; pp_newline eval (); contract_indices ~decl ~eval 6 [idx1; idx2] wfs contractees; fprintf eval "%*send do@]" (indent + 2) ""; pp_newline eval (); fprintf eval "%*send do@]" indent ""; pp_newline eval () | Coupling.Vectorspinor -> failwith "external_wf_loop: Vectorspinor not supported yet!" | Coupling.Maj_Ghost -> failwith "external_wf_loop: unexpected Maj_Ghost" | Coupling.Tensor_1 -> failwith "external_wf_loop: unexpected Tensor_1" | Coupling.BRS _ -> failwith "external_wf_loop: unexpected BRS" let local_vector_copies ~decl ~eval wfs = begin match wfs.(0).local_array with | None -> () | Some a -> fprintf decl " @[<2>complex(kind=default),@ dimension(0:3) ::@ %s@]" a; pp_newline decl () end; let n = Array.length wfs in for i = 1 to n - 1 do match wfs.(i).local_array with | None -> () | Some a -> fprintf decl " @[<2>complex(kind=default),@ dimension(0:3) ::@ %s@]" a; pp_newline decl (); fprintf eval " @[<2>%s(0) = %s%%t@]" a wfs.(i).name; pp_newline eval (); fprintf eval " @[<2>%s(1:3) = %s%%x@]" a wfs.(i).name; pp_newline eval () done let return_vector ff wfs = let printf fmt = fprintf ff fmt and nl = pp_newline ff in match wfs.(0).local_array with | None -> () | Some a -> pp_divide ~indent:4 ff (); printf " @[<2>%s%%t = %s(0)@]" wfs.(0).name a; nl (); printf " @[<2>%s%%x = %s(1:3)@]" wfs.(0).name a; nl () let multiply_coupling_and_scalars ff g_opt wfs = let printf fmt = fprintf ff fmt and nl = pp_newline ff in pp_divide ~indent:4 ff (); let g = match g_opt with | None -> "" | Some g -> g ^ "*" in let wfs0name = match wfs.(0).local_array with | None -> wfs.(0).name | Some a -> a in printf " @[<2>%s = %s%s" wfs0name g wfs0name; for i = 1 to Array.length wfs - 1 do match wfs.(i).spin with | Coupling.Scalar -> printf "@,*%s" wfs.(i).name | _ -> () done; printf "@]"; nl () let local_momentum_copies ~decl ~eval wfs = let n = Array.length wfs in fprintf decl " @[<2>real(kind=default),@ dimension(0:3) ::@ %s" wfs.(0).momentum_array; for i = 1 to n - 1 do fprintf decl ",@ %s" wfs.(i).momentum_array; fprintf eval " @[<2>%s(0) = %s%%t@]" wfs.(i).momentum_array wfs.(i).momentum; pp_newline eval (); fprintf eval " @[<2>%s(1:3) = %s%%x@]" wfs.(i).momentum_array wfs.(i).momentum; pp_newline eval () done; fprintf eval " @[<2>%s =" wfs.(0).momentum_array; for i = 1 to n - 1 do fprintf eval "@ - %s" wfs.(i).momentum_array done; fprintf decl "@]"; pp_newline decl (); fprintf eval "@]"; pp_newline eval () let contractees_of_fusion ~decl ~eval wfs (max_dsv, indices_seen, contractees) fusion = let max_dsv', dirac_strings = dirac_strings_to_fortran ~decl ~eval wfs max_dsv fusion.L.dirac and vectors = List.fold_left (fun acc wf -> match wf.spin, wf.local_array with | Coupling.Tensor_2, None -> { L.atom = V (Printf.sprintf "%s%d%%t" (spin_mnemonic wf.spin) wf.pos); L.indices = [UFOx.Index.pack wf.pos 1; UFOx.Index.pack wf.pos 2] } :: acc | _, None -> acc | _, Some a -> { L.atom = V a; L.indices = [wf.pos] } :: acc) [] (List.tl (Array.to_list wfs)) and tensors = List.map (L.map_atom (fun t -> T t)) fusion.L.vector and scalars = List.map (fun t -> { L.atom = S t; L.indices = [] }) fusion.L.scalar and inverses = List.map (fun t -> { L.atom = Inv t; L.indices = [] }) fusion.L.inverse in let contractees' = dirac_strings @ vectors @ tensors @ scalars @ inverses in let indices_seen' = Sets.Int.of_list (indices_of_contractions contractees') in (max_dsv', Sets.Int.union indices_seen indices_seen', (fusion, contractees') :: contractees) let local_name wf = match wf.local_array with | Some a -> a | None -> match wf.spin with | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana -> wf.name ^ "%a" | Coupling.Scalar -> wf.name | Coupling.Tensor_2 -> wf.name ^ "%t" | Coupling.Vector | Coupling.Massive_Vector -> failwith "UFO_targets.Fortran.local_name: unexpected spin 1" | _ -> failwith "UFO_targets.Fortran.local_name: unhandled spin" let pseudo_wfs_for_denominator = Array.init 2 (fun i -> let ii = string_of_int i in { pos = i; spin = Coupling.Scalar; name = "den"; local_array = None; momentum = "k" ^ ii; momentum_array = "p" ^ ii; fortran_type = fortran_type Coupling.Scalar }) let fusions_to_fortran ~decl ~eval wfs ?(denominator=[]) ?coupling fusions = local_vector_copies ~decl ~eval wfs; local_momentum_copies ~decl ~eval wfs; let max_dsv, indices_used, contractions = List.fold_left (contractees_of_fusion ~decl ~eval wfs) (0, Sets.Int.empty, []) fusions in let _, indices_used, denominator_contractions = List.fold_left (contractees_of_fusion ~decl ~eval pseudo_wfs_for_denominator) (max_dsv, indices_used, []) denominator in Sets.Int.iter (fun index -> fprintf decl " @[<2>integer ::@ %s@]" (index_variable index); pp_newline decl ()) indices_used; begin match wfs.(0).spin with | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana -> fprintf decl " @[<2>integer ::@ %s@]" index_spinor; pp_newline decl () | _ -> () end; pp_divide ~indent:4 eval (); let wfs0name = local_name wfs.(0) in fprintf eval " %s = 0" wfs0name; pp_newline eval (); List.iter (external_wf_loop ~decl ~eval ~indent:4 wfs) contractions; multiply_coupling_and_scalars eval coupling wfs; begin match denominator_contractions with | [] -> () | contractions -> fprintf decl " @[<2>complex(kind=default) :: den@]"; pp_newline decl (); pp_divide ~indent:4 eval (); fprintf eval " @[<2>den = 0@]"; pp_newline eval (); List.iter (external_wf_loop ~decl ~eval ~indent:4 pseudo_wfs_for_denominator) contractions; pp_divide ~indent:4 eval (); fprintf eval " @[<2>%s =@ %s / den@]" wfs0name wfs0name; pp_newline eval () end; return_vector eval wfs (* TODO: eventually, we should include the momentum among the arguments only if required. But this can wait for another day. *) let lorentz ff name spins lorentz = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let wfs = wf_table spins in let n = Array.length wfs in printf " @[<4>pure function %s@ (g,@ " name; for i = 1 to n - 2 do printf "%s,@ %s,@ " wfs.(i).name wfs.(i).momentum done; printf "%s,@ %s" wfs.(n - 1).name wfs.(n - 1).momentum; printf ")@ result (%s)@]" wfs.(0).name; nl (); printf " @[<2>%s ::@ %s@]" wfs.(0).fortran_type wfs.(0).name; nl(); printf " @[<2>complex(kind=default),@ intent(in) ::@ g@]"; nl(); for i = 1 to n - 1 do printf " @[<2>%s, intent(in) :: %s@]" wfs.(i).fortran_type wfs.(i).name; nl(); done; printf " @[<2>type(momentum), intent(in) ::@ %s" wfs.(1).momentum; for i = 2 to n - 1 do printf ",@ %s" wfs.(i).momentum done; printf "@]"; nl (); let width = 80 in (* get this from the default formatter instead! *) let decl_buf = Buffer.create 1024 and eval_buf = Buffer.create 1024 in let decl = formatter_of_buffer ~width decl_buf and eval = formatter_of_buffer ~width eval_buf in fusions_to_fortran ~decl ~eval ~coupling:"g" wfs lorentz; pp_flush decl (); pp_flush eval (); pp_divide ~indent:4 ff (); (*i printf " ! %s" (L.to_string lorentz); nl (); pp_divide ~indent:4 ff (); i*) printf "%s" (Buffer.contents decl_buf); pp_divide ~indent:4 ff (); printf "%s" (Buffer.contents eval_buf); printf " end function %s@]" name; nl (); Buffer.reset decl_buf; Buffer.reset eval_buf; () let propagator ff name (bra_spin, ket_spin) numerator denominator = let printf fmt = fprintf ff fmt and nl = pp_newline ff in let width = 80 in (* get this from the default formatter instead! *) let wf_name = spin_mnemonic ket_spin and wf_type = fortran_type ket_spin in let wfs = wf_table [| ket_spin; ket_spin |] in printf " @[<4>pure function pr_U_%s@ (k2, m, w, %s2)" name wf_name; printf " result (%s1)@]" wf_name; nl (); printf " %s :: %s1" wf_type wf_name; nl (); printf " type(momentum), intent(in) :: k2"; nl (); printf " real(kind=default), intent(in) :: m, w"; nl (); printf " %s, intent(in) :: %s2" wf_type wf_name; nl (); let decl_buf = Buffer.create 1024 and eval_buf = Buffer.create 1024 in let decl = formatter_of_buffer ~width decl_buf and eval = formatter_of_buffer ~width eval_buf in fusions_to_fortran ~decl ~eval wfs ~denominator numerator; pp_flush decl (); pp_flush eval (); pp_divide ~indent:4 ff (); printf "%s" (Buffer.contents decl_buf); pp_divide ~indent:4 ff (); printf "%s" (Buffer.contents eval_buf); printf " end function pr_U_%s@]" name; nl (); Buffer.reset decl_buf; Buffer.reset eval_buf; () let scale_coupling c g = if c = 1 then g else if c = -1 then "-" ^ g else Printf.sprintf "%d*%s" c g let scale_coupling z g = format_complex_rational_factor z ^ g (* As a prototypical example consider the vertex \begin{equation} \bar\psi\fmslash{A}\psi = \tr\left(\psi\otimes\bar\psi\fmslash{A}\right) \end{equation} encoded as \texttt{FFV} in the SM UFO file. This example is useful, because all three fields have different type and we can use the Fortran compiler to check our implementation. In this case we need to generate the following function calls with the arguments in the following order \begin{center} \begin{tabular}{lcl} \texttt{F12}:&$\psi_1\bar\psi_2\to A$& \texttt{FFV\_p201(g,psi1,p1,psibar2,p2)} \\ \texttt{F21}:&$\bar\psi_1\psi_2\to A$& \texttt{FFV\_p201(g,psi2,p2,psibar1,p1)} \\ \texttt{F23}:&$\bar\psi_1 A_2 \to \bar\psi$& \texttt{FFV\_p012(g,psibar1,p1,A2,p2)} \\ \texttt{F32}:&$A_1\bar\psi_2 \to \bar\psi$& \texttt{FFV\_p012(g,psibar2,p2,A1,p1)} \\ \texttt{F31}:&$A_1\psi_2\to \psi$& \texttt{FFV\_p120(g,A1,p1,psi2,p2)} \\ \texttt{F13}:&$\psi_1A_2\to \psi$& \texttt{FFV\_p120(g,A2,p2,psi1,p1)} \end{tabular} \end{center} *) (* Fortunately, all Fermi signs have been taken care of by [Fusions] and we can concentrate on injecting the wave functions into the correct slots. *) (* \begin{dubious} Eventually, we should use the reverted lists everywhere to become a bit more efficient. \end{dubious} *) module P = Permutation.Default let factor_cyclic f12__n = let f12__, fn = ThoList.split_last f12__n in let cyclic = ThoList.cycle_until fn (List.sort compare f12__n) in (P.of_list (List.map pred cyclic), P.of_lists (List.tl cyclic) f12__) - let fuse c v s g wfs ps fusion = + let ccs_to_string ccs = + String.concat "" (List.map (fun (f, i) -> Printf.sprintf "_c%x%x" i f) ccs) + + let fusion_name v perm ccs = + Printf.sprintf "%s_p%s%s" v (P.to_string perm) (ccs_to_string ccs) + + let fuse_dirac c v s fl g wfs ps fusion = let g = scale_coupling c g and cyclic, factor = factor_cyclic fusion in - let perm = P.to_string cyclic in let wfs_ps = List.map2 (fun wf p -> (wf, p)) wfs ps in let args = P.list (P.inverse factor) wfs_ps in let args_string = String.concat "," (List.map (fun (wf, p) -> wf ^ "," ^ p) args) in - printf "%s_p%s(%s,%s)" v perm g args_string + printf "%s(%s,%s)" (fusion_name v cyclic []) g args_string - (* \begin{dubious} - The following is for reference only, to better understand what JRR - was doing\ldots - \end{dubious} *) + (* We need to look at the permuted fermion lines in order to + decide wether to apply charge conjugations. *) - (* The vertex is (suppressing the Lorentz index of~$\phi_2$) - \begin{equation} - \bar\psi_1 \Gamma\phi_2 \psi_3 - = \Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2 \psi_{3,\beta} - \end{equation} *) - - (* This is the version implemented by [fuse] above. *) - - let tho_print_dirac_current f c wf1 wf2 fusion = - match fusion with - | [1; 3] -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta}$ *) - | [3; 1] -> printf "%s_ff(%s,%s,%s)" f c wf2 wf1 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta}$ *) - | [2; 3] -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 (* $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta}$ *) - | [3; 2] -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 (* $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta}$ *) - | [1; 2] -> printf "f_f%s(%s,%s,%s)" f c wf1 wf2 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2$ *) - | [2; 1] -> printf "f_f%s(%s,%s,%s)" f c wf2 wf1 (* $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2$ *) - | _ -> () - - (* This is how JRR implemented the Dirac matrices - that don't change sign under $C\Gamma^T C^{-1} = \Gamma$, - i.\,e.~$\mathbf{1}$, $\gamma_5$ and~$\gamma_5\gamma_\mu$. *) - - (* In the case of two fermions, the second wave - function [wf2] is always put into the right slot, - as described in JRR's thesis. *) - - (* In the case of a boson and a fermion, there is no - need for both ["f_%sf"] and ["f_f%s"], since the - latter can be obtained by exchanging arguments. *) - - let jrr_print_majorana_current_S_P_A f c wf1 wf2 fusion = - match fusion with - | [1; 3] -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 (* - $\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \equiv - \Gamma $ *) - | [3; 1] -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 (* - $\Gamma_{\alpha\beta} \psi_{3,\alpha} \bar\psi_{1,\beta} \equiv - \Gamma = C\Gamma^T C^{-1} $ *) - | [2; 3] -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 (* - $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \equiv - \Gamma $ *) - | [3; 2] -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 (* - $\Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \equiv - \Gamma $ *) - | [1; 2] -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 (* - $\Gamma_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \equiv - \Gamma = C\Gamma^T C^{-1} $ *) - | [2; 1] -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 (* - $\Gamma_{\alpha\beta} \phi_2 \bar\psi_{1,\beta} \equiv - \Gamma = C\Gamma^T C^{-1} $ *) - | _ -> () - - (* This is how JRR implemented the Dirac matrices - that do change sign under $C\Gamma^T C^{-1} = - \Gamma$, - i.\,e.~$\gamma_\mu$ and~$\sigma_{\mu\nu}$ (NB: the - latter case never appears!). *) - - let jrr_print_majorana_current_V f c wf1 wf2 fusion = - match fusion with - | [1; 3] -> printf "%s_ff( %s,%s,%s)" f c wf1 wf2 (* - $ \Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \equiv - \Gamma $ *) - | [3; 1] -> printf "%s_ff(-%s,%s,%s)" f c wf1 wf2 (* - $-\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \psi_{3,\beta} \equiv - -\Gamma = C\Gamma^T C^{-1} $ *) - | [2; 3] -> printf "f_%sf( %s,%s,%s)" f c wf1 wf2 (* - $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \equiv - \Gamma $ *) - | [3; 2] -> printf "f_%sf( %s,%s,%s)" f c wf2 wf1 (* - $ \Gamma_{\alpha\beta} \phi_2 \psi_{3,\beta} \equiv - \Gamma $ *) - | [1; 2] -> printf "f_%sf(-%s,%s,%s)" f c wf2 wf1 (* - $-\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2 \equiv - -\Gamma = C\Gamma^T C^{-1} $ *) - | [2; 1] -> printf "f_%sf(-%s,%s,%s)" f c wf1 wf2 (* - $-\Gamma_{\alpha\beta} \bar\psi_{1,\alpha} \phi_2 \equiv - -\Gamma = C\Gamma^T C^{-1} $ *) - | _ -> () + (* It is not enough to look at the cyclic permutation used + to move the fields into the correct arguments of + the fusions \ldots *) + let map_indices perm unit = + let pmap = IntPM.of_lists unit (P.list perm unit) in + IntPM.apply pmap + + (* \ldots{} we also need to inspect the full permutation of + the fields. *) + let map_indices2 perm unit = + let pmap = + IntPM.of_lists unit (1 :: P.list (P.inverse perm) (List.tl unit)) in + IntPM.apply pmap + + (* This is a more direct implementation of the composition + of [map_indices2] and [map_indices], that is used in the + unit tests. *) + let map_indices_raw fusion = + let unit = ThoList.range 1 (List.length fusion) in + let f12__, fn = ThoList.split_last fusion in + let fusion = fn :: f12__ in + let map_index = IntPM.of_lists fusion unit in + IntPM.apply map_index + + (* Map the fermion line indices in [fl] according to [map_index]. *) + let map_fermion_lines map_index fl = + List.map (fun (i, f) -> (map_index i, map_index f)) fl + + (* Map the fermion line indices in [fl] according to [map_index], + but keep a copy of the original. *) + let map_fermion_lines2 map_index fl = + List.map (fun (i, f) -> ((i, f), (map_index i, map_index f))) fl + + let permute_fermion_lines cyclic unit fl = + map_fermion_lines (map_indices cyclic unit) fl + + let permute_fermion_lines2 cyclic factor unit fl = + map_fermion_lines2 + (map_indices2 factor unit) + (map_fermion_lines (map_indices cyclic unit) fl) (* \begin{dubious} - Still need a way to reliably select the Majorana - version in the [Target] module! + TODO: this needs more more work for the fully + general case. \end{dubious} *) + let charge_conjugations fl2 = + ThoList.filtermap + (fun ((i, f), (i', f')) -> + match (i, f), (i', f') with + | (1, 2), _ | (2, 1), _ -> Some (f, i) (* $\chi^T\Gamma'$ *) + | _, (2, 3) -> Some (f, i) (* $\chi^T(C\Gamma')\chi$ *) + | _ -> None) + fl2 + +(*i + let fuse_majorana c v s fl g wfs ps fusion = + let g = scale_coupling c g + and cyclic, factor = factor_cyclic fusion in + let wfs_ps = List.map2 (fun wf p -> (wf, p)) wfs ps in + let wfs_ps_string = + String.concat "," (List.map (fun (wf, p) -> wf ^ "," ^ p) wfs_ps) in + let args = P.list (P.inverse factor) wfs_ps in + let args_string = + String.concat "," (List.map (fun (wf, p) -> wf ^ "," ^ p) args) in + let f12__, fn = ThoList.split_last fusion in + Printf.eprintf + "fusion : %d < %s\n" fn (ThoList.to_string string_of_int f12__); + Printf.eprintf "cyclic : %s\n" (P.to_string cyclic); + Printf.eprintf "factor : %s\n" (P.to_string factor); + let unit = ThoList.range 1 (List.length fusion) in + Printf.eprintf "permutation : %s -> %s\n" + (ThoList.to_string string_of_int unit) + (ThoList.to_string + string_of_int (List.map (map_indices cyclic unit) unit)); + Printf.eprintf "permutation raw : %s -> %s\n" + (ThoList.to_string string_of_int unit) + (ThoList.to_string + string_of_int (List.map (map_indices_raw fusion) unit)); + Printf.eprintf "fermion lines : %s\n" + (ThoList.to_string (fun (i, f) -> Printf.sprintf "%d>%d" i f) fl); + let fl2 = permute_fermion_lines2 cyclic factor unit fl in + let fl = permute_fermion_lines cyclic unit fl in + Printf.eprintf "permuted : %s\n" + (ThoList.to_string (fun (i, f) -> Printf.sprintf "%d>%d" i f) fl); + Printf.eprintf "arguments : %s\n" wfs_ps_string; + Printf.eprintf "permuted : %s\n" args_string; + Printf.eprintf + ">> %s(%s,%s)\n" + (fusion_name v cyclic (charge_conjugations fl2)) g args_string; + printf "%s(%s,%s)" (fusion_name v cyclic (charge_conjugations fl2)) g args_string +i*) + + let fuse_majorana c v s fl g wfs ps fusion = + let g = scale_coupling c g + and cyclic, factor = factor_cyclic fusion in + let wfs_ps = List.map2 (fun wf p -> (wf, p)) wfs ps in + let args = P.list (P.inverse factor) wfs_ps in + let args_string = + String.concat "," (List.map (fun (wf, p) -> wf ^ "," ^ p) args) in + let unit = ThoList.range 1 (List.length fusion) in + let ccs = + charge_conjugations (permute_fermion_lines2 cyclic factor unit fl) in + printf "%s(%s,%s)" (fusion_name v cyclic ccs) g args_string + + let fuse c v s fl g wfs ps fusion = + if List.exists is_majorana s then + fuse_majorana c v s fl g wfs ps fusion + else + fuse_dirac c v s fl g wfs ps fusion let eps4_g4_g44_decl ff () = let printf fmt = fprintf ff fmt and nl = pp_newline ff in printf " @[<2>integer,@ dimension(0:3)"; printf ",@ save,@ private ::@ g4_@]"; nl (); printf " @[<2>integer,@ dimension(0:3,0:3)"; printf ",@ save,@ private ::@ g44_@]"; nl (); printf " @[<2>integer,@ dimension(0:3,0:3,0:3,0:3)"; printf ",@ save,@ private ::@ eps4_@]"; nl () let eps4_g4_g44_init ff () = let printf fmt = fprintf ff fmt and nl = pp_newline ff in printf " @[<2>data g4_@ /@ 1, -1, -1, -1 /@]"; nl (); printf " @[<2>data g44_(0,:)@ /@ 1, 0, 0, 0 /@]"; nl (); printf " @[<2>data g44_(1,:)@ /@ 0, -1, 0, 0 /@]"; nl (); printf " @[<2>data g44_(2,:)@ /@ 0, 0, -1, 0 /@]"; nl (); printf " @[<2>data g44_(3,:)@ /@ 0, 0, 0, -1 /@]"; nl (); for mu1 = 0 to 3 do for mu2 = 0 to 3 do for mu3 = 0 to 3 do printf " @[<2>data eps4_(%d,%d,%d,:)@ /@ " mu1 mu2 mu3; for mu4 = 0 to 3 do if mu4 <> 0 then printf ",@ "; let mus = [mu1; mu2; mu3; mu4] in if List.sort compare mus = [0; 1; 2; 3] then printf "%2d" (Combinatorics.sign mus) else printf "%2d" 0; done; printf " /@]"; nl () done done done + module type Test = + sig + val suite : OUnit.test + end + + module Test : Test = + struct + + open OUnit + + let assert_mappings fusion = + let unit = ThoList.range 1 (List.length fusion) in + let cyclic, factor = factor_cyclic fusion in + let raw = map_indices_raw fusion + and map1 = map_indices cyclic unit + and map2 = map_indices2 factor unit in + let map i = map2 (map1 i) in + assert_equal ~printer:(ThoList.to_string string_of_int) + (List.map raw unit) (List.map map unit) + + let suite_mappings = + "mappings" >::: + + [ "1<-2" >:: + (fun () -> + List.iter assert_mappings (Combinatorics.permute [1;2;3])); + + "1<-3" >:: + (fun () -> + List.iter assert_mappings (Combinatorics.permute [1;2;3;4])) ] + + let suite = + "UFO_targets" >::: + [suite_mappings] + + end end Index: trunk/omega/src/thoList.mli =================================================================== --- trunk/omega/src/thoList.mli (revision 8415) +++ trunk/omega/src/thoList.mli (revision 8416) @@ -1,186 +1,201 @@ (* thoList.mli -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* [splitn n l = (hdn l, tln l)], but more efficient. *) val hdn : int -> 'a list -> 'a list val tln : int -> 'a list -> 'a list val splitn : int -> 'a list -> 'a list * 'a list (* [split_last (l @ [a]) = (l, a)] *) val split_last : 'a list -> 'a list * 'a (* [chop n l] chops [l] into pieces of size [n] (except for the last one, which contains th remainder). *) val chopn : int -> 'a list -> 'a list list (* [cycle_until a l] finds a member [a] in the list [l] and returns the cyclically permuted list with [a] as head. Raises [Not_found] if [a] is not in [l]. *) val cycle_until : 'a -> 'a list -> 'a list (* [cycle n l] cyclically permute the list [l] by [n >= 0] positions. Raises [Not_found] [List.length l > n]. NB: [cycle n l = tln n l @ hdn n l], but more efficient. *) val cycle : int -> 'a list -> 'a list (* [of_subarray n m a] is $[\ocwlowerid{a.}(\ocwlowerid{n}); \ocwlowerid{a.}(\ocwlowerid{n}+1);\ldots; \ocwlowerid{a.}(\ocwlowerid{m})]$. Values of~[n] and~[m] out of bounds are silently shifted towards these bounds. *) val of_subarray : int -> int -> 'a array -> 'a list (* [range s n m] is $[\ocwlowerid{n}; \ocwlowerid{n}+\ocwlowerid{s}; \ocwlowerid{n}+2\ocwlowerid{s};\ldots; \ocwlowerid{m} - ((\ocwlowerid{m}-\ocwlowerid{n})\mod s)]$ *) val range : ?stride:int -> int -> int -> int list (* [enumerate s n [a1;a2;...] is [(n,a1); (n+s,a2); ...] *) val enumerate : ?stride:int -> int -> 'a list -> (int * 'a) list (* [alist_of_list ~predicate ~offset list] takes the elements of [list] that satisfy [predicate] and forms a list of pairs of an offset into the original [list] and the element with the offsets starting from [offset]. NB: the order of the returned alist is not specified! *) val alist_of_list : ?predicate:('a -> bool) -> ?offset:int -> 'a list -> (int * 'a) list (* Compress identical elements in a sorted list. Identity is determined using the polymorphic equality function [Pervasives.(=)]. *) val uniq : 'a list -> 'a list (* Test if all members of a list are structurally identical (actually [homogeneous l] and [List.length (uniq l) <= 1] are equivalent, but the former is more efficient if a mismatch comes early). *) val homogeneous : 'a list -> bool (* If all elements of the list [l] appear exactly twice, [pairs l] returns a sorted list with these elements appearing once. Otherwise [Invalid_argument] is raised. *) val pairs : 'a list -> 'a list (* [compare cmp l1 l2] compare two lists [l1] and [l2] according to [cmp]. [cmp] defaults to the polymorphic [Pervasives.compare]. *) val compare : ?cmp:('a -> 'a -> int) -> 'a list -> 'a list -> int (* Collect and count identical elements in a list. Identity is determined using the polymorphic equality function [Pervasives.(=)]. [classify] does not assume that the list is sorted. However, it is~$O(n)$ for sorted lists and~$O(n^2)$ in the worst case. *) val classify : 'a list -> (int * 'a) list (* Collect the second factors with a common first factor in lists. \label{ThoList.factorize} *) val factorize : ('a * 'b) list -> ('a * 'b list) list (* [flatmap f] is equivalent to $\ocwlowerid{flatten} \circ (\ocwlowerid{map}\;\ocwlowerid{f})$, but more efficient, because no intermediate lists are built. Unfortunately, it is not tail recursive. *) val flatmap : ('a -> 'b list) -> 'a list -> 'b list (* [rev_flatmap f] is equivalent to $\ocwlowerid{flatten} \circ (\ocwlowerid{rev\_map}\;(\ocwlowerid{rev}\circ\ocwlowerid{f})) = \ocwlowerid{rev}\circ(\ocwlowerid{flatmap}\;\ocwlowerid{f})$, but more efficient, because no intermediate lists are built. It is tail recursive. *) val rev_flatmap : ('a -> 'b list) -> 'a list -> 'b list +(* [clone n a] builds a list from [n] copies of the element [a]. *) val clone : int -> 'a -> 'a list + +(* [multiply n l] concatenates [n] copies of the list [l]. *) val multiply : int -> 'a list -> 'a list +(* [filtermap f l] applies [f] to each element of [l] and drops + the results [None]. *) +val filtermap : ('a -> 'b option) -> 'a list -> 'b list + +(* [power a_list] computes the list of all sublists of [a_list], + i.\,e.~the power set. The elements of the sublists are \emph{not} + required to have been sequential in [a_list]. *) +val power : 'a list -> 'a list list + (* \begin{dubious} Invent other names to avoid confusions with [List.fold_left2] and [List.fold_right2]. \end{dubious} *) val fold_right2 : ('a -> 'b -> 'b) -> 'a list list -> 'b -> 'b val fold_left2 : ('b -> 'a -> 'b) -> 'b -> 'a list list -> 'b (* [iteri f n [a;b;c]] evaluates [f n a], [f (n+1) b] and [f (n+2) c]. *) val iteri : (int -> 'a -> unit) -> int -> 'a list -> unit val mapi : (int -> 'a -> 'b) -> int -> 'a list -> 'b list (* [iteri2 f n m [[aa;ab];[ba;bb]]] evaluates [f n m aa], [f n (m+1) ab], [f (n+1) m ba] and [f (n+1) (m+1) bb]. NB: the nested lists need not be rectangular. *) val iteri2 : (int -> int -> 'a -> unit) -> int -> int -> 'a list list -> unit +(* Just like [List.map3]: *) +val map3 : ('a -> 'b -> 'c -> 'd) -> 'a list -> 'b list -> 'c list -> 'd list + (* Transpose a \emph{rectangular} list of lists like a matrix. *) val transpose : 'a list list -> 'a list list (* [interleave f list] walks through [list] and inserts the result of [f] applied to the reversed list of elements before and the list of elements after. The empty lists at the beginning and end are included! *) val interleave : ('a list -> 'a list -> 'a list) -> 'a list -> 'a list (* [interleave_nearest f list] is like [interleave f list], but [f] looks only at the nearest neighbors. *) val interleave_nearest : ('a -> 'a -> 'a list) -> 'a list -> 'a list (* [partitioned_sort cmp index_sets list] sorts the sublists of [list] specified by the [index_sets] and the complement of their union. \textbf{NB:} the sorting follows to order in the lists in [index_sets]. \textbf{NB:} the indices are 0-based. *) val partitioned_sort : ('a -> 'a -> int) -> int list list -> 'a list -> 'a list exception Overlapping_indices exception Out_of_bounds (* [ariadne_sort cmp list] sorts [list] according to [cmp] (default [Pervasives.compare]) keeping track of the original order by a 0-based list of indices. *) val ariadne_sort : ?cmp:('a -> 'a -> int) -> 'a list -> 'a list * int list (* [ariadne_unsort (ariadne_sort cmp list)] returns [list]. *) val ariadne_unsort : 'a list * int list -> 'a list (* [lexicographic cmp list1 list2] compares [list1] and [list2] lexicographically. *) val lexicographic : ?cmp:('a -> 'a -> int) -> 'a list -> 'a list -> int (* [common l1 l2] returns the elements common to the lists [l1] and [l2]. The lists are not required to be ordered and the result will also not be ordered. *) val common : 'a list -> 'a list -> 'a list (* [complement l1 l2] returns the list [l1] with elements of list [l2] removed. The lists are not required to be ordered. Raises [Invalid_argument "ThoList.complement"], if a member of [l1] is not in [l1]. *) val complement : 'a list -> 'a list -> 'a list val to_string : ('a -> string) -> 'a list -> string module Test : sig val suite : OUnit.test end (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/UFO_Lorentz.mli =================================================================== --- trunk/omega/src/UFO_Lorentz.mli (revision 8415) +++ trunk/omega/src/UFO_Lorentz.mli (revision 8416) @@ -1,105 +1,138 @@ (* UFO_Lorentz.mli -- Copyright (C) 1999-2017 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Processed UFO Lorentz Structures} *) (* Just like [UFOx.Lorentz_Atom.dirac], but without the Dirac matrix indices. *) type dirac = (* [private] *) | Gamma5 | ProjM | ProjP | Gamma of int | Sigma of int * int | C | Minus (* A sandwich of a string of $\gamma$-matrices. [bra] and [ket] are positions of fields in the vertex, \emph{not} spinor indices. *) type dirac_string = (* [private] *) { bra : int; ket : int; gammas : dirac list } (* In the case of Majorana spinors, we have to insert charge conjugation matrices. *) -val majorana : dirac_string -> dirac_string + +(* $\Gamma\to - \Gamma$: *) +val minus : dirac_string -> dirac_string + +(* $\Gamma\to C\Gamma$: *) +val cc_times : dirac_string -> dirac_string + +(* $\Gamma\to \Gamma C^{-1}$: *) +val times_cc_inv : dirac_string -> dirac_string + +(* $\Gamma\to \Gamma^T$: *) val transpose : dirac_string -> dirac_string +(* $\Gamma\to C\Gamma C^{-1}$: *) +val conjugate : dirac_string -> dirac_string + +(* $\Gamma\to C\Gamma^T C^{-1}$, i.\,e.~the composition of [conjugate] + and [transpose]: *) +val conjugate_transpose : dirac_string -> dirac_string + +(* \begin{dubious} + Careful: of the above, [transpose] is currently implemented + as [conjugate] to make the tests in~\texttt{keystones\_UFO\_bispinors} + work. This needs to be changed eventually! [conjugate_transpose] is + the real thing, though. + \end{dubious} *) + (* The Lorentz indices appearing in a term are either negative internal summation indices or positive external polarization indices. Note that the external indices are not really indices, but denote the position of the particle in the vertex. *) type 'a term = (* [private] *) { indices : int list; atom : 'a } (* Split the list of indices into summation and polarization indices. *) val classify_indices : int list -> int list * int list (* Replace the atom keeping the associated indices. *) val map_atom : ('a -> 'b) -> 'a term -> 'b term (* A contraction consists of a (possibly empty) product of Dirac strings and a (possibly empty) product of Lorentz tensors with a rational coefficient. *) type contraction = (* [private] *) { coeff : Algebra.QC.t; dirac : dirac_string term list; vector : UFOx.Lorentz_Atom.vector term list; scalar : UFOx.Lorentz_Atom.scalar list; inverse : UFOx.Lorentz_Atom.scalar list } (* A sum of [contraction]s. *) type t = contraction list (* Fermion line connections. *) val fermion_lines : t -> Coupling.fermion_lines +(* $\Gamma\to C\Gamma C^{-1}$ *) +val charge_conjugate : int * int -> t -> t + (* [parse spins lorentz] uses the [spins] to parse the UFO [lorentz] structure as a list of [contraction]s. *) val parse : Coupling.lorentz list -> UFOx.Lorentz.t -> t (* [map_indices f lorentz] applies the map [f] to the free indices in [lorentz]. *) val map_indices : (int -> int) -> t -> t val map_fermion_lines : (int -> int) -> Coupling.fermion_lines -> Coupling.fermion_lines (* Create a readable representation for debugging and documenting generated code. *) val to_string : t -> string val fermion_lines_to_string : Coupling.fermion_lines -> string (* Punting \ldots *) val dummy : t (* More debugging and documenting. *) val dirac_string_to_string : dirac_string -> string (* [dirac_string_to_matrix substitute ds] take a string of $\gamma$-matrices [ds], applies [substitute] to the indices and returns the product as a matrix. *) val dirac_string_to_matrix : (int -> int) -> dirac_string -> Dirac.Chiral.t +module type Test = + sig + val suite : OUnit.test + end + +module Test : Test Index: trunk/omega/src/Makefile.sources =================================================================== --- trunk/omega/src/Makefile.sources (revision 8415) +++ trunk/omega/src/Makefile.sources (revision 8416) @@ -1,296 +1,296 @@ # Makefile.sources -- Makefile component for O'Mega ## ## Process Makefile.am with automake to include this file in Makefile.in ## ######################################################################## # # Copyright (C) 1999-2020 by # Wolfgang Kilian # Thorsten Ohl # Juergen Reuter # with contributions from # cf. main AUTHORS file # # WHIZARD is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # WHIZARD is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ######################################################################## ## ## We define the source files in a separate file so that they can be ## include by Makefiles in multiple directories. ## ######################################################################## ######################################################################## # # O'Caml sources # ######################################################################## # # NB: # # * all modules MUST be given in the correct sequence for linking # # * foo.ml as a source file implies foo.mli as a source files # # * we must use ocamlc -i to generate *_lexer.mli from *_lexer.ml in # order to treat *_lexer.ml like all other modules # # * automake conditionals are not available here, use # autoconf substitutions that expand to '#' or '' # ######################################################################## CASCADE_MLL = cascade_lexer.mll CASCADE_MLY = cascade_parser.mly CASCADE_MLD = $(CASCADE_MLL:.mll=.ml) $(CASCADE_MLY:.mly=.ml) CASCADE_ML_PRIMARY = cascade_syntax.ml cascade.ml CASCADE_ML = cascade_syntax.ml $(CASCADE_MLD) cascade.ml VERTEX_MLL = vertex_lexer.mll VERTEX_MLY = vertex_parser.mly VERTEX_MLD = $(VERTEX_MLL:.mll=.ml) $(VERTEX_MLY:.mly=.ml) VERTEX_ML_PRIMARY = vertex_syntax.ml vertex.ml VERTEX_ML = vertex_syntax.ml $(VERTEX_MLD) vertex.ml UFO_MLL = UFOx_lexer.mll UFO_lexer.mll UFO_MLY = UFOx_parser.mly UFO_parser.mly UFO_MLD = $(UFO_MLL:.mll=.ml) $(UFO_MLY:.mly=.ml) UFO_ML_PRIMARY = UFO_tools.ml UFOx_syntax.ml UFOx.ml UFO_syntax.ml UFO_Lorentz.ml UFO_targets.ml UFO.ml UFO_ML = UFO_tools.ml UFOx_syntax.ml UFO_syntax.ml $(UFO_MLD) UFOx.ml UFO_Lorentz.ml UFO_targets.ml UFO.ml OMEGA_MLL = $(CASCADE_MLL) $(VERTEX_MLL) $(UFO_MLL) OMEGA_MLY = $(CASCADE_MLY) $(VERTEX_MLY) $(UFO_MLY) OMEGA_DERIVED_CAML = \ $(OMEGA_MLL:.mll=.mli) $(OMEGA_MLL:.mll=.ml) \ $(OMEGA_MLY:.mly=.mli) $(OMEGA_MLY:.mly=.ml) OMEGA_INTERFACES_MLI = \ coupling.mli \ model.mli \ target.mli ######################################################################## # We need lists of all modules including and excluding derived # files (*_PRIMARY). Unfortunately, we need the longer list in # proper linking order, so we can't just tack the additional # files to the end of the shorter list. ######################################################################## OMEGA_CORE_ML_PART1 = \ OUnit.ml OUnitDiff.ml \ config.ml partial.ml pmap.ml format_Fortran.ml \ thoString.ml sets.ml thoList.ml thoArray.ml bundle.ml powSet.ml \ thoFilename.ml cache.ml progress.ml trie.ml linalg.ml tree2.ml \ algebra.ml options.ml product.ml combinatorics.ml \ permutation.ml partition.ml tree.ml \ tuple.ml topology.ml DAG.ml momentum.ml phasespace.ml \ charges.ml color.ml modeltools.ml whizard.ml dirac.ml OMEGA_CORE_ML_PART2 = \ $(VERTEX_ML) $(UFO_ML) $(CASCADE_ML) OMEGA_CORE_ML_PART2_PRIMARY = \ $(VERTEX_ML_PRIMARY) $(UFO_ML_PRIMARY) $(CASCADE_ML_PRIMARY) OMEGA_CORE_ML_PART3 = \ colorize.ml process.ml fusion.ml fusion_vintage.ml omega.ml OMEGA_CORE_ML_PRIMARY = \ $(OMEGA_CORE_ML_PART1) $(OMEGA_CORE_ML_PART2_PRIMARY) $(OMEGA_CORE_ML_PART3) OMEGA_CORE_ML = \ $(OMEGA_CORE_ML_PART1) $(OMEGA_CORE_ML_PART2) $(OMEGA_CORE_ML_PART3) OMEGA_CORE_MLI_PRIMARY = $(OMEGA_INTERFACES_MLI) $(OMEGA_CORE_ML_PRIMARY:.ml=.mli) OMEGA_CORE_MLI = $(OMEGA_INTERFACES_MLI) $(OMEGA_CORE_ML:.ml=.mli) OMEGA_MODELLIB_ML = \ modellib_SM.ml \ modellib_MSSM.ml \ modellib_NoH.ml \ modellib_NMSSM.ml \ modellib_PSSSM.ml \ modellib_BSM.ml \ modellib_WZW.ml \ modellib_Zprime.ml OMEGA_MODELLIB_MLI = $(OMEGA_MODELLIB_ML:.ml=.mli) OMEGA_TARGETLIB_ML = \ targets_Kmatrix.ml \ targets_Kmatrix_2.ml \ targets.ml OMEGA_TARGETLIB_MLI = $(OMEGA_TARGETLIB_ML:.ml=.mli) ######################################################################## # The supported models: ######################################################################## OMEGA_MINIMAL_APPLICATIONS_ML = \ omega_QED.ml \ omega_QCD.ml \ omega_SM.ml OMEGA_APPLICATIONS_ML = \ omega_QED.ml \ omega_QED_VM.ml \ omega_QCD.ml \ omega_QCD_VM.ml \ omega_SM.ml \ omega_SM_VM.ml \ omega_SM_CKM.ml \ omega_SM_CKM_VM.ml \ omega_SM_ac.ml \ omega_SM_ac_CKM.ml \ omega_SM_dim6.ml \ omega_SM_top.ml \ omega_SM_top_anom.ml \ omega_SM_tt_threshold.ml \ omega_SM_Higgs.ml \ omega_SM_Higgs_VM.ml \ omega_SM_Higgs_CKM.ml \ omega_SM_Higgs_CKM_VM.ml \ omega_THDM.ml \ omega_THDM_VM.ml \ omega_THDM_CKM.ml \ omega_THDM_CKM_VM.ml \ omega_MSSM.ml \ omega_MSSM_CKM.ml \ omega_MSSM_Grav.ml \ omega_MSSM_Hgg.ml \ omega_NMSSM.ml \ omega_NMSSM_CKM.ml \ omega_NMSSM_Hgg.ml \ omega_PSSSM.ml \ omega_Littlest.ml \ omega_Littlest_Eta.ml \ omega_Littlest_Tpar.ml \ omega_Simplest.ml \ omega_Simplest_univ.ml \ omega_Xdim.ml \ omega_GravTest.ml \ omega_NoH_rx.ml \ omega_AltH.ml \ omega_SM_rx.ml \ omega_SM_ul.ml \ omega_SSC.ml \ omega_SSC_2.ml \ omega_SSC_AltT.ml \ omega_UED.ml \ omega_WZW.ml \ omega_Zprime.ml \ omega_Zprime_VM.ml \ omega_Threeshl.ml \ omega_Threeshl_nohf.ml \ omega_HSExt.ml \ omega_HSExt_VM.ml \ omega_Template.ml \ omega_SYM.ml \ - omega_UFO.ml - -### Not ready for primetime yet!!! -# omega_UFO_Majorana.ml + omega_UFO.ml \ + omega_UFO_Majorana.ml \ + omega_SM_Majorana.ml \ + omega_SM_Majorana_legacy.ml OMEGA_CORE_CMO = $(OMEGA_CORE_ML:.ml=.cmo) OMEGA_CORE_CMX = $(OMEGA_CORE_ML:.ml=.cmx) OMEGA_TARGETS_CMO = $(OMEGA_TARGETLIB_ML:.ml=.cmo) OMEGA_TARGETS_CMX = $(OMEGA_TARGETLIB_ML:.ml=.cmx) OMEGA_MODELS_CMO = $(OMEGA_MODELLIB_ML:.ml=.cmo) OMEGA_MODELS_CMX = $(OMEGA_MODELLIB_ML:.ml=.cmx) OMEGA_APPLICATIONS_CMO = $(OMEGA_APPLICATIONS_ML:.ml=.cmo) OMEGA_APPLICATIONS_CMX = $(OMEGA_APPLICATIONS_ML:.ml=.cmx) OMEGA_APPLICATIONS_BYTECODE = $(OMEGA_APPLICATIONS_ML:.ml=$(OCAML_BYTECODE_EXT)) OMEGA_APPLICATIONS_NATIVE = $(OMEGA_APPLICATIONS_ML:.ml=$(OCAML_NATIVE_EXT)) OMEGA_CACHES = $(OMEGA_APPLICATIONS_ML:.ml=.$(OMEGA_CACHE_SUFFIX)) OMEGA_MINIMAL_APPLICATIONS_BYTECODE = $(OMEGA_MINIMAL_APPLICATIONS_ML:.ml=$(OCAML_BYTECODE_EXT)) OMEGA_MINIMAL_APPLICATIONS_NATIVE = $(OMEGA_MINIMAL_APPLICATIONS_ML:.ml=$(OCAML_NATIVE_EXT)) OMEGA_MINIMAL_CACHES = $(OMEGA_MINIMAL_APPLICATIONS_ML:.ml=.$(OMEGA_CACHE_SUFFIX)) # Only primary sources, excluding generated parsers and lexers # (used for dependency generation) OMEGA_ML_PRIMARY = \ $(OMEGA_CORE_ML_PRIMARY) \ $(OMEGA_MODELLIB_ML) \ $(OMEGA_TARGETLIB_ML) \ $(OMEGA_APPLICATIONS_ML) OMEGA_MLI_PRIMARY = \ $(OMEGA_CORE_MLI_PRIMARY) \ $(OMEGA_MODELLIB_MLI) \ $(OMEGA_TARGETLIB_MLI) OMEGA_CAML_PRIMARY = $(OMEGA_ML_PRIMARY) $(OMEGA_MLI_PRIMARY) $(OMEGA_MLL) $(OMEGA_MLY) # All sources, including generated parsers and lexers # (used for linking and distribution) OMEGA_ML = \ $(OMEGA_CORE_ML) \ $(OMEGA_MODELLIB_ML) \ $(OMEGA_TARGETLIB_ML) \ $(OMEGA_APPLICATIONS_ML) OMEGA_MLI = \ $(OMEGA_CORE_MLI) \ $(OMEGA_MODELLIB_MLI) \ $(OMEGA_TARGETLIB_MLI) OMEGA_CAML = $(OMEGA_ML) $(OMEGA_MLI) $(OMEGA_MLL) $(OMEGA_MLY) $(OMEGA_DERIVED_CAML) ######################################################################## # # Fortran 90/95/2003 sources # ######################################################################## AM_FCFLAGS = ## Profiling if FC_USE_PROFILING AM_FCFLAGS += $(FCFLAGS_PROFILING) endif ## OpenMP if FC_USE_OPENMP AM_FCFLAGS += $(FCFLAGS_OPENMP) endif KINDS_F90 = kinds.f90 CONSTANTS_F90 = constants.f90 STRINGS_F90 = iso_varying_string.f90 OMEGA_PARAMETERS_F90 = # omega_parameters.f90 omega_parameters_madgraph.f90 OMEGALIB_DERIVED_F90 = \ omega_spinors.f90 omega_bispinors.f90 omega_vectors.f90 \ omega_vectorspinors.f90 omega_tensors.f90 \ omega_couplings.f90 omega_spinor_couplings.f90 omega_bispinor_couplings.f90 \ omega_polarizations.f90 omega_polarizations_madgraph.f90 \ omega_tensor_polarizations.f90 omega_vspinor_polarizations.f90 \ omega_color.f90 omega_utils.f90 \ omega95.f90 omega95_bispinors.f90 omegavm95.f90 OMEGALIB_F90 = \ $(CONSTANTS_F90) $(STRINGS_F90) \ $(OMEGALIB_DERIVED_F90) \ $(OMEGA_PARAMETERS_F90) OMEGALIB_MOD = $(KINDS_F90:.f90=.mod) $(OMEGALIB_F90:.f90=.mod) ######################################################################## ## The End. ######################################################################## Index: trunk/omega/src/UFO.ml =================================================================== --- trunk/omega/src/UFO.ml (revision 8415) +++ trunk/omega/src/UFO.ml (revision 8416) @@ -1,2684 +1,2766 @@ (* UFO.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Unfortunately, \texttt{ocamlweb} will not typeset all multi character operators nicely. E.\,g.~\verb+f @< g+ comes out as [f @< g]. *) let (@@) f g x = f (g x) let (@@@) f g x y = f (g x y) module SMap = Map.Make (struct type t = string let compare = compare end) module SSet = Sets.String module CMap = Map.Make (struct type t = string let compare = ThoString.compare_caseless end) module CSet = Sets.String_Caseless let error_in_string text start_pos end_pos = let i = start_pos.Lexing.pos_cnum and j = end_pos.Lexing.pos_cnum in String.sub text i (j - i) let error_in_file name start_pos end_pos = Printf.sprintf "%s:%d.%d-%d.%d" name start_pos.Lexing.pos_lnum (start_pos.Lexing.pos_cnum - start_pos.Lexing.pos_bol) end_pos.Lexing.pos_lnum (end_pos.Lexing.pos_cnum - end_pos.Lexing.pos_bol) let parse_string text = try UFO_parser.file UFO_lexer.token (UFO_lexer.init_position "" (Lexing.from_string text)) with | UFO_tools.Lexical_Error (msg, start_pos, end_pos) -> invalid_arg (Printf.sprintf "lexical error (%s) at: `%s'" msg (error_in_string text start_pos end_pos)) | UFO_syntax.Syntax_Error (msg, start_pos, end_pos) -> invalid_arg (Printf.sprintf "syntax error (%s) at: `%s'" msg (error_in_string text start_pos end_pos)) | Parsing.Parse_error -> invalid_arg ("parse error: " ^ text) let parse_file name = let ic = open_in name in let result = begin try UFO_parser.file UFO_lexer.token (UFO_lexer.init_position name (Lexing.from_channel ic)) with | UFO_tools.Lexical_Error (msg, start_pos, end_pos) -> begin close_in ic; invalid_arg (Printf.sprintf "%s: lexical error (%s)" (error_in_file name start_pos end_pos) msg) end | UFO_syntax.Syntax_Error (msg, start_pos, end_pos) -> begin close_in ic; invalid_arg (Printf.sprintf "%s: syntax error (%s)" (error_in_file name start_pos end_pos) msg) end | Parsing.Parse_error -> begin close_in ic; invalid_arg ("parse error: " ^ name) end end in close_in ic; result (* These are the contents of the Python files after lexical analysis as context-free variable declarations, before any semantic interpretation. *) module type Files = sig type t = private { particles : UFO_syntax.t; couplings : UFO_syntax.t; coupling_orders : UFO_syntax.t; vertices : UFO_syntax.t; lorentz : UFO_syntax.t; parameters : UFO_syntax.t; propagators : UFO_syntax.t; decays : UFO_syntax.t } val parse_directory : string -> t end module Files : Files = struct type t = { particles : UFO_syntax.t; couplings : UFO_syntax.t; coupling_orders : UFO_syntax.t; vertices : UFO_syntax.t; lorentz : UFO_syntax.t; parameters : UFO_syntax.t; propagators : UFO_syntax.t; decays : UFO_syntax.t } let parse_directory dir = let parse stem = parse_file (Filename.concat dir (stem ^ ".py")) in { particles = parse "particles"; couplings = parse "couplings"; coupling_orders = (try parse "coupling_orders" with _ -> []); vertices = parse "vertices"; lorentz = parse "lorentz"; parameters = parse "parameters"; propagators = (try parse "propagators" with _ -> []); decays = (try parse "decays" with _ -> []) } end let dump_file pfx f = List.iter (fun s -> print_endline (pfx ^ ": " ^ s)) (UFO_syntax.to_strings f) type charge = | Q_Integer of int | Q_Fraction of int * int let charge_to_string = function | Q_Integer i -> Printf.sprintf "%d" i | Q_Fraction (n, d) -> Printf.sprintf "%d/%d" n d module S = UFO_syntax let find_attrib name attribs = try (List.find (fun a -> name = a.S.a_name) attribs).S.a_value with | Not_found -> failwith ("UFO.find_attrib: \"" ^ name ^ "\" not found") let find_attrib name attribs = (List.find (fun a -> name = a.S.a_name) attribs).S.a_value let name_to_string ?strip name = let stripped = begin match strip, List.rev name with | Some pfx, head :: tail -> if pfx = head then tail else failwith ("UFO.name_to_string: expected prefix '" ^ pfx ^ "', got '" ^ head ^ "'") | _, name -> name end in String.concat "." stripped let name_attrib ?strip name attribs = match find_attrib name attribs with | S.Name n -> name_to_string ?strip n | _ -> invalid_arg name let integer_attrib name attribs = match find_attrib name attribs with | S.Integer i -> i | _ -> invalid_arg name let charge_attrib name attribs = match find_attrib name attribs with | S.Integer i -> Q_Integer i | S.Fraction (n, d) -> Q_Fraction (n, d) | _ -> invalid_arg name let string_attrib name attribs = match find_attrib name attribs with | S.String s -> s | _ -> invalid_arg name let boolean_attrib name attribs = try match ThoString.lowercase (name_attrib name attribs) with | "true" -> true | "false" -> false | _ -> invalid_arg name with | Not_found -> false type value = | Integer of int | Fraction of int * int | Float of float | Expr of UFOx.Expr.t | Name of string list let map_expr f default = function | Integer _ | Fraction (_, _) | Float _ | Name _ -> default | Expr e -> f e let variables = map_expr UFOx.Expr.variables CSet.empty let functions = map_expr UFOx.Expr.functions CSet.empty let add_to_set_in_map key element map = let set = try CMap.find key map with Not_found -> CSet.empty in CMap.add key (CSet.add element set) map (* Add all variables in [value] to the [map] from variables to the names in which they appear, indicating that [name] depends on these variables. *) let dependency name value map = CSet.fold (fun variable acc -> add_to_set_in_map variable name acc) (variables value) map let dependencies name_value_list = List.fold_left (fun acc (name, value) -> dependency name value acc) CMap.empty name_value_list let dependency_to_string (variable, appearences) = Printf.sprintf "%s -> {%s}" variable (String.concat ", " (CSet.elements appearences)) let dependencies_to_strings map = List.map dependency_to_string (CMap.bindings map) let expr_to_string = UFOx.Value.to_string @@ UFOx.Value.of_expr let value_to_string = function | Integer i -> Printf.sprintf "%d" i | Fraction (n, d) -> Printf.sprintf "%d/%d" n d | Float x -> string_of_float x | Expr e -> "'" ^ expr_to_string e ^ "'" | Name n -> name_to_string n let value_to_expr substitutions = function | Integer i -> Printf.sprintf "%d" i | Fraction (n, d) -> Printf.sprintf "%d/%d" n d | Float x -> string_of_float x | Expr e -> expr_to_string (substitutions e) | Name n -> name_to_string n let value_to_coupling substitutions atom = function | Integer i -> Coupling.Integer i | Fraction (n, d) -> Coupling.Quot (Coupling.Integer n, Coupling.Integer d) | Float x -> Coupling.Float x | Expr e -> UFOx.Value.to_coupling atom (UFOx.Value.of_expr (substitutions e)) | Name n -> failwith "UFO.value_to_coupling: Name not supported yet!" let value_to_numeric = function | Integer i -> Printf.sprintf "%d" i | Fraction (n, d) -> Printf.sprintf "%g" (float n /. float d) | Float x -> Printf.sprintf "%g" x | Expr e -> invalid_arg ("UFO.value_to_numeric: expr = " ^ (expr_to_string e)) | Name n -> invalid_arg ("UFO.value_to_numeric: name = " ^ name_to_string n) let value_to_float = function | Integer i -> float i | Fraction (n, d) -> float n /. float d | Float x -> x | Expr e -> invalid_arg ("UFO.value_to_float: string = " ^ (expr_to_string e)) | Name n -> invalid_arg ("UFO.value_to_float: name = " ^ name_to_string n) let value_attrib name attribs = match find_attrib name attribs with | S.Integer i -> Integer i | S.Fraction (n, d) -> Fraction (n, d) | S.Float x -> Float x | S.String s -> Expr (UFOx.Expr.of_string s) | S.Name n -> Name n | _ -> invalid_arg name let string_list_attrib name attribs = match find_attrib name attribs with | S.String_List l -> l | _ -> invalid_arg name let name_list_attrib ~strip name attribs = match find_attrib name attribs with | S.Name_List l -> List.map (name_to_string ~strip) l | _ -> invalid_arg name let integer_list_attrib name attribs = match find_attrib name attribs with | S.Integer_List l -> l | _ -> invalid_arg name let order_dictionary_attrib name attribs = match find_attrib name attribs with | S.Order_Dictionary d -> d | _ -> invalid_arg name let coupling_dictionary_attrib ~strip name attribs = match find_attrib name attribs with | S.Coupling_Dictionary d -> List.map (fun (i, j, c) -> (i, j, name_to_string ~strip c)) d | _ -> invalid_arg name let decay_dictionary_attrib name attribs = match find_attrib name attribs with | S.Decay_Dictionary d -> List.map (fun (p, w) -> (List.map List.hd p, w)) d | _ -> invalid_arg name (*i The following doesn't typecheck in applications, even with type annotations ... let attrib_handlers : type attribs value. string -> string -> attribs -> ((string -> attribs -> value) -> string -> value) * ((string -> attribs -> value) -> string -> value -> value) = fun kind symbol attribs -> let required query name = try query name attribs with | Not_found -> invalid_arg (Printf.sprintf "fatal UFO error: mandatory attribute `%s' missing for %s `%s'!" name kind symbol) and optional query name default = try query name attribs with | Not_found -> default in (required, optional) i*) let required_handler kind symbol attribs query name = try query name attribs with | Not_found -> invalid_arg (Printf.sprintf "fatal UFO error: mandatory attribute `%s' missing for %s `%s'!" name kind symbol) let optional_handler attribs query name default = try query name attribs with | Not_found -> default let warn_symbol_name file symbol name = if name <> symbol then Printf.eprintf "UFO: warning: symbol '%s' <> name '%s' in %s.py: expect errors!\n" symbol name file let map_to_alist map = SMap.fold (fun key value acc -> (key, value) :: acc) map [] let keys map = SMap.fold (fun key _ acc -> key :: acc) map [] let keys_caseless map = CMap.fold (fun key _ acc -> key :: acc) map [] let values map = SMap.fold (fun _ value acc -> value :: acc) map [] module SKey = struct type t = string let hash = Hashtbl.hash let equal = (=) end module SHash = Hashtbl.Make (SKey) module type Particle = sig type t = private { pdg_code : int; name : string; antiname : string; spin : UFOx.Lorentz.r; color : UFOx.Color.r; mass : string; width : string; propagator : string option; texname : string; antitexname : string; charge : charge; ghost_number : int; lepton_number : int; y : int; goldstone : bool; propagating : bool; (* NOT HANDLED YET! *) line : string option; (* NOT HANDLED YET! *) is_anti : bool } val of_file : S.t -> t SMap.t val to_string : string -> t -> string val conjugate : t -> t val force_spinor : t -> t val force_conjspinor : t -> t val force_majorana : t -> t val is_majorana : t -> bool val is_ghost : t -> bool val is_goldstone : t -> bool val is_physical : t -> bool val filter : (t -> bool) -> t SMap.t -> t SMap.t end module Particle : Particle = struct type t = { pdg_code : int; name : string; antiname : string; spin : UFOx.Lorentz.r; color : UFOx.Color.r; mass : string; width : string; propagator : string option; texname : string; antitexname : string; charge : charge; ghost_number : int; lepton_number : int; y : int; goldstone : bool; propagating : bool; (* NOT HANDLED YET! *) line : string option; (* NOT HANDLED YET! *) is_anti : bool } let to_string symbol p = Printf.sprintf "particle: %s => [pdg = %d, name = '%s'/'%s', \ spin = %s, color = %s, \ mass = %s, width = %s,%s \ Q = %s, G = %d, L = %d, Y = %d, \ TeX = '%s'/'%s'%s]" symbol p.pdg_code p.name p.antiname (UFOx.Lorentz.rep_to_string p.spin) (UFOx.Color.rep_to_string p.color) p.mass p.width (match p.propagator with | None -> "" | Some p -> " propagator = " ^ p ^ ",") (charge_to_string p.charge) p.ghost_number p.lepton_number p.y p.texname p.antitexname (if p.goldstone then ", GB" else "") let conjugate_charge = function | Q_Integer i -> Q_Integer (-i) | Q_Fraction (n, d) -> Q_Fraction (-n, d) let is_neutral p = (p.name = p.antiname) (* We \emph{must not} mess with [pdg_code] and [color] if the particle is neutral! *) let conjugate p = if is_neutral p then p else { pdg_code = - p.pdg_code; name = p.antiname; antiname = p.name; spin = UFOx.Lorentz.rep_conjugate p.spin; color = UFOx.Color.rep_conjugate p.color; mass = p.mass; width = p.width; propagator = p.propagator; texname = p.antitexname; antitexname = p.texname; charge = conjugate_charge p.charge; ghost_number = p.ghost_number; lepton_number = p.lepton_number; y = p.y; goldstone = p.goldstone; propagating = p.propagating; line = p.line; is_anti = not p.is_anti } let of_file1 map d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Particle" ], attribs -> let required query name = required_handler "particle" symbol attribs query name and optional query name default = optional_handler attribs query name default in let name = required string_attrib "name" and antiname = required string_attrib "antiname" in let neutral = (name = antiname) in SMap.add symbol { (* The required attributes per UFO docs. *) pdg_code = required integer_attrib "pdg_code"; name; antiname; spin = UFOx.Lorentz.rep_of_int neutral (required integer_attrib "spin"); color = UFOx.Color.rep_of_int neutral (required integer_attrib "color"); mass = required (name_attrib ~strip:"Param") "mass"; width = required (name_attrib ~strip:"Param") "width"; texname = required string_attrib "texname"; antitexname = required string_attrib "antitexname"; charge = required charge_attrib "charge"; (* The optional attributes per UFO docs. *) ghost_number = optional integer_attrib "GhostNumber" 0; lepton_number = optional integer_attrib "LeptonNumber" 0; y = optional integer_attrib "Y" 0; goldstone = optional boolean_attrib "goldstone" false; propagating = optional boolean_attrib "propagating" true; line = (try Some (name_attrib "line" attribs) with _ -> None); (* Undocumented extensions. *) propagator = (try Some (name_attrib "propagator" attribs) with _ -> None); (* O'Mega extensions. *) is_anti = false } map | [ "anti"; p ], [] -> begin try SMap.add symbol (conjugate (SMap.find p map)) map with | Not_found -> invalid_arg ("Particle.of_file: " ^ p ^ ".anti() not yet defined!") end | _ -> invalid_arg ("Particle.of_file: " ^ name_to_string d.S.kind) let of_file particles = List.fold_left of_file1 SMap.empty particles let is_spinor p = match UFOx.Lorentz.omega p.spin with | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana -> true | _ -> false (* \begin{dubious} TODO: this is a bit of a hack: try to expose the type [UFOx.Lorentz_Atom'.r] instead. \end{dubious} *) let force_spinor p = if is_spinor p then { p with spin = UFOx.Lorentz.rep_of_int false 2 } else p let force_conjspinor p = if is_spinor p then { p with spin = UFOx.Lorentz.rep_of_int false (-2) } else p let force_majorana p = if is_spinor p then { p with spin = UFOx.Lorentz.rep_of_int true 2 } else p let is_majorana p = match UFOx.Lorentz.omega p.spin with - | Coupling.Majorana -> true + | Coupling.Majorana | Coupling.Vectorspinor | Coupling.Maj_Ghost -> true | _ -> false let is_ghost p = p.ghost_number <> 0 let is_goldstone p = p.goldstone let is_physical p = not (is_ghost p || is_goldstone p) let filter predicate map = SMap.filter (fun symbol p -> predicate p) map end module type UFO_Coupling = sig type t = private { name : string; value : UFOx.Expr.t; order : (string * int) list } val of_file : S.t -> t SMap.t val to_string : string -> t -> string end module UFO_Coupling : UFO_Coupling = struct type t = { name : string; value : UFOx.Expr.t; order : (string * int) list } let order_to_string orders = String.concat ", " (List.map (fun (s, i) -> Printf.sprintf "'%s':%d" s i) orders) let to_string symbol c = Printf.sprintf "coupling: %s => [name = '%s', value = '%s', order = [%s]]" symbol c.name (expr_to_string c.value) (order_to_string c.order) let of_file1 map d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Coupling" ], attribs -> let required query name = required_handler "coupling" symbol attribs query name in let name = required string_attrib "name" in warn_symbol_name "couplings" symbol name; SMap.add symbol { name; value = UFOx.Expr.of_string (required string_attrib "value"); order = required order_dictionary_attrib "order" } map | _ -> invalid_arg ("UFO_Coupling.of_file: " ^ name_to_string d.S.kind) let of_file couplings = List.fold_left of_file1 SMap.empty couplings end module type Coupling_Order = sig type t = private { name : string; expansion_order : int; hierarchy : int } val of_file : S.t -> t SMap.t val to_string : string -> t -> string end module Coupling_Order : Coupling_Order = struct type t = { name : string; expansion_order : int; hierarchy : int } let to_string symbol c = Printf.sprintf "coupling_order: %s => [name = '%s', \ expansion_order = '%d', \ hierarchy = %d]" symbol c.name c.expansion_order c.hierarchy let of_file1 map d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "CouplingOrder" ], attribs -> let required query name = required_handler "coupling order" symbol attribs query name in let name = required string_attrib "name" in warn_symbol_name "coupling_orders" symbol name; SMap.add symbol { name; expansion_order = required integer_attrib "expansion_order"; hierarchy = required integer_attrib "hierarchy" } map | _ -> invalid_arg ("Coupling_order.of_file: " ^ name_to_string d.S.kind) let of_file coupling_orders = List.fold_left of_file1 SMap.empty coupling_orders end module type Lorentz_UFO = sig type t = private { name : string; spins : int list; structure : UFOx.Lorentz.t } val of_file : S.t -> t SMap.t val to_string : string -> t -> string end module Lorentz_UFO : Lorentz_UFO = struct type t = { name : string; spins : int list; structure : UFOx.Lorentz.t } let to_string symbol l = Printf.sprintf "lorentz: %s => [name = '%s', spins = [%s], \ structure = %s]" symbol l.name (String.concat ", " (List.map string_of_int l.spins)) (UFOx.Lorentz.to_string l.structure) let of_file1 map d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Lorentz" ], attribs -> let required query name = required_handler "lorentz" symbol attribs query name in let name = required string_attrib "name" in warn_symbol_name "lorentz" symbol name; SMap.add symbol { name; spins = required integer_list_attrib "spins"; structure = UFOx.Lorentz.of_string (required string_attrib "structure") } map | _ -> invalid_arg ("Lorentz.of_file: " ^ name_to_string d.S.kind) let of_file lorentz = List.fold_left of_file1 SMap.empty lorentz end module type Vertex = sig type lcc = private (* Lorentz-color-coupling *) { lorentz : string; color : UFOx.Color.t; coupling : string } type t = private { name : string; particles : string array; lcc : lcc list } val of_file : Particle.t SMap.t -> S.t -> t SMap.t val to_string : string -> t -> string val to_string_expanded : Lorentz_UFO.t SMap.t -> UFO_Coupling.t SMap.t -> t -> string val contains : Particle.t SMap.t -> (Particle.t -> bool) -> t -> bool val filter : (t -> bool) -> t SMap.t -> t SMap.t end module Vertex : Vertex = struct type lcc = { lorentz : string; color : UFOx.Color.t; coupling : string } type t = { name : string; particles : string array; lcc : lcc list } let to_string symbol c = Printf.sprintf "vertex: %s => [name = '%s', particles = [%s], \ lorentz-color-couplings = [%s]" symbol c.name (String.concat ", " (Array.to_list c.particles)) (String.concat ", " (List.map (fun lcc -> Printf.sprintf "%s * %s * %s" lcc.coupling lcc.lorentz (UFOx.Color.to_string lcc.color)) c.lcc)) let to_string_expanded lorentz couplings c = let expand_lorentz s = try UFOx.Lorentz.to_string (SMap.find s lorentz).Lorentz_UFO.structure with | Not_found -> "?" in Printf.sprintf "expanded: [%s] -> { lorentz-color-couplings = [%s] }" (String.concat ", " (Array.to_list c.particles)) (String.concat ", " (List.map (fun lcc -> Printf.sprintf "%s * %s * %s" lcc.coupling (expand_lorentz lcc.lorentz) (UFOx.Color.to_string lcc.color)) c.lcc)) let contains particles predicate v = let p = v.particles in let rec contains' i = if i < 0 then false else if predicate (SMap.find p.(i) particles) then true else contains' (pred i) in contains' (Array.length p - 1) let force_adj_identity1 adj_indices = function | UFOx.Color_Atom.Identity (a, b) as atom -> begin match List.mem a adj_indices, List.mem b adj_indices with | true, true -> UFOx.Color_Atom.Identity8 (a, b) | false, false -> atom | true, false | false, true -> invalid_arg "force_adj_identity: mixed representations!" end | atom -> atom let force_adj_identity adj_indices tensor = UFOx.Color.map_atoms (force_adj_identity1 adj_indices) tensor let find_adj_indices map particles = let adj_indices = ref [] in Array.iteri (fun i p -> (* We must pattern match against the O'Mega representation, because [UFOx.Color.r] is abstract. *) match UFOx.Color.omega (SMap.find p map).Particle.color with | Color.AdjSUN _ -> adj_indices := succ i :: !adj_indices | _ -> ()) particles; !adj_indices let classify_color_indices map particles = let fund_indices = ref [] and conj_indices = ref [] and adj_indices = ref [] in Array.iteri (fun i p -> (* We must pattern match against the O'Mega representation, because [UFOx.Color.r] is abstract. *) match UFOx.Color.omega (SMap.find p map).Particle.color with | Color.SUN n -> if n > 0 then fund_indices := succ i :: !fund_indices else if n < 0 then conj_indices := succ i :: !conj_indices else failwith "classify_color_indices: SU(0)" | Color.AdjSUN n -> if n <> 0 then adj_indices := succ i :: !adj_indices else failwith "classify_color_indices: SU(0)" | _ -> ()) particles; (!fund_indices, !conj_indices, !adj_indices) (* FIXME: would have expected the opposite order \ldots *) let force_identity1 (fund_indices, conj_indices, adj_indices) = function | UFOx.Color_Atom.Identity (a, b) as atom -> if List.mem a fund_indices then begin if List.mem b conj_indices then UFOx.Color_Atom.Identity (b, a) else invalid_arg "force_adj_identity: mixed representations!" end else if List.mem a conj_indices then begin if List.mem b fund_indices then UFOx.Color_Atom.Identity (a, b) else invalid_arg "force_adj_identity: mixed representations!" end else if List.mem a adj_indices then begin if List.mem b adj_indices then UFOx.Color_Atom.Identity8 (a, b) else invalid_arg "force_adj_identity: mixed representations!" end else atom | atom -> atom let force_identity indices tensor = UFOx.Color.map_atoms (force_identity1 indices) tensor (* Here we don't have the Lorentz structures available yet. Thus we set [fermion_lines = []] for now and correct this later. *) let of_file1 particle_map map d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Vertex" ], attribs -> let required query name = required_handler "vertex" symbol attribs query name in let name = required string_attrib "name" in warn_symbol_name "vertices" symbol name; let particles = Array.of_list (required (name_list_attrib ~strip:"P") "particles") in let color = let indices = classify_color_indices particle_map particles in Array.of_list (List.map (force_identity indices @@ UFOx.Color.of_string) (required string_list_attrib "color")) and lorentz = Array.of_list (required (name_list_attrib ~strip:"L") "lorentz") and couplings_alist = required (coupling_dictionary_attrib ~strip:"C") "couplings" in let lcc = List.map (fun (i, j, c) -> { lorentz = lorentz.(j); color = color.(i); coupling = c }) couplings_alist in SMap.add symbol { name; particles; lcc } map | _ -> invalid_arg ("Vertex.of_file: " ^ name_to_string d.S.kind) let of_file particles vertices = List.fold_left (of_file1 particles) SMap.empty vertices let filter predicate map = SMap.filter (fun symbol p -> predicate p) map end module type Parameter = sig type nature = private Internal | External type ptype = private Real | Complex type t = private { name : string; nature : nature; ptype : ptype; value : value; texname : string; lhablock : string option; lhacode : int list option; sequence : int } val of_file : S.t -> t SMap.t val to_string : string -> t -> string val missing : string -> t end module Parameter : Parameter = struct type nature = Internal | External let nature_to_string = function | Internal -> "internal" | External -> "external" let nature_of_string = function | "internal" -> Internal | "external" -> External | s -> invalid_arg ("Parameter.nature_of_string: " ^ s) type ptype = Real | Complex let ptype_to_string = function | Real -> "real" | Complex -> "complex" let ptype_of_string = function | "real" -> Real | "complex" -> Complex | s -> invalid_arg ("Parameter.ptype_of_string: " ^ s) type t = { name : string; nature : nature; ptype : ptype; value : value; texname : string; lhablock : string option; lhacode : int list option; sequence : int } let to_string symbol p = Printf.sprintf "parameter: %s => [#%d, name = '%s', nature = %s, type = %s, \ value = %s, texname = '%s', \ lhablock = %s, lhacode = [%s]]" symbol p.sequence p.name (nature_to_string p.nature) (ptype_to_string p.ptype) (value_to_string p.value) p.texname (match p.lhablock with None -> "???" | Some s -> s) (match p.lhacode with | None -> "" | Some c -> String.concat ", " (List.map string_of_int c)) let of_file1 (map, n) d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Parameter" ], attribs -> let required query name = required_handler "particle" symbol attribs query name in let name = required string_attrib "name" in warn_symbol_name "parameters" symbol name; (SMap.add symbol { name; nature = nature_of_string (required string_attrib "nature"); ptype = ptype_of_string (required string_attrib "type"); value = required value_attrib "value"; texname = required string_attrib "texname"; lhablock = (try Some (string_attrib "lhablock" attribs) with Not_found -> None); lhacode = (try Some (integer_list_attrib "lhacode" attribs) with Not_found -> None); sequence = n } map, succ n) | _ -> invalid_arg ("Parameter.of_file: " ^ name_to_string d.S.kind) let of_file parameters = let map, _ = List.fold_left of_file1 (SMap.empty, 0) parameters in map let missing name = { name; nature = External; ptype = Real; value = Integer 0; texname = Printf.sprintf "\\texttt{%s}" name; lhablock = None; lhacode = None; sequence = 0 } end module type Propagator_UFO = sig type t = (* private *) { name : string; numerator : UFOx.Lorentz.t; denominator : UFOx.Lorentz.t } val of_file : S.t -> t SMap.t val to_string : string -> t -> string end module Propagator_UFO : Propagator_UFO = struct type t = { name : string; numerator : UFOx.Lorentz.t; denominator : UFOx.Lorentz.t } let to_string symbol p = Printf.sprintf "propagator: %s => [name = '%s', numerator = '%s', \ denominator = '%s']" symbol p.name (UFOx.Lorentz.to_string p.numerator) (UFOx.Lorentz.to_string p.denominator) (* The \texttt{denominator} attribute is optional and there is a default (cf.~\texttt{arXiv:1308.1668}) *) let default_denominator = "P('mu', id) * P('mu', id) \ - Mass(id) * Mass(id) \ + complex(0,1) * Mass(id) * Width(id)" let of_string_with_error_correction symbol num_or_den s = try UFOx.Lorentz.of_string s with | Invalid_argument msg -> begin let fixed = s ^ ")" in try let tensor = UFOx.Lorentz.of_string fixed in Printf.eprintf "UFO.Propagator.of_string: added missing closing parenthesis \ in %s of %s: \"%s\"\n" num_or_den symbol s; tensor with | Invalid_argument _ -> invalid_arg (Printf.sprintf "UFO.Propagator.of_string: %s of %s: %s in \"%s\"\n" num_or_den symbol msg fixed) end (* The parser will turn [foo = "bar"] into [foo = "bar"."$"], which will be interpreted as a macro definition for [foo] expanding to ["bar"]. The dollar is used to distinguish it from an empty attribute list. This could also be implemented with a union type for the declarations. *) let of_file1 (macros, map) d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Propagator" ], attribs -> let required query name = required_handler "particle" symbol attribs query name and optional query name default = optional_handler attribs query name default in let name = required string_attrib "name" in warn_symbol_name "propagators" symbol name; let num_string = required string_attrib "numerator" and den_string = begin match optional find_attrib "denominator" (S.String default_denominator) with | S.String s -> s | S.Name [n] -> SMap.find n macros | _ -> invalid_arg "Propagator.denominator: " end in let numerator = of_string_with_error_correction symbol "numerator" num_string and denominator = of_string_with_error_correction symbol "denominator" den_string in (macros, SMap.add symbol { name; numerator; denominator } map) | [ "$"; s ], [] -> (SMap.add symbol s macros, map) | _ -> invalid_arg ("Propagator:of_file: " ^ name_to_string d.S.kind) let of_file propagators = let _, propagators' = List.fold_left of_file1 (SMap.empty, SMap.empty) propagators in propagators' end module type Decay = sig type t = private { name : string; particle : string; widths : (string list * string) list } val of_file : S.t -> t SMap.t val to_string : string -> t -> string end module Decay : Decay = struct type t = { name : string; particle : string; widths : (string list * string) list } let width_to_string ws = String.concat ", " (List.map (fun (ps, w) -> "(" ^ String.concat ", " ps ^ ") -> '" ^ w ^ "'") ws) let to_string symbol d = Printf.sprintf "decay: %s => [name = '%s', particle = '%s', widths = [%s]]" symbol d.name d.particle (width_to_string d.widths) let of_file1 map d = let symbol = d.S.name in match d.S.kind, d.S.attribs with | [ "Decay" ], attribs -> let required query name = required_handler "particle" symbol attribs query name in let name = required string_attrib "name" in warn_symbol_name "decays" symbol name; SMap.add symbol { name; particle = required (name_attrib ~strip:"P") "particle"; widths = required decay_dictionary_attrib "partial_widths" } map | _ -> invalid_arg ("Decay.of_file: " ^ name_to_string d.S.kind) let of_file decays = List.fold_left of_file1 SMap.empty decays end (* We can read the spinor representations off the vertices to check for consistency. *) (* \begin{dubious} Note that we have to conjugate the representations! \end{dubious} *) let collect_spinor_reps_of_vertex particles lorentz v sets = List.fold_left (fun sets' lcc -> let l = (SMap.find lcc.Vertex.lorentz lorentz).Lorentz_UFO.structure in List.fold_left (fun (spinors, conj_spinors as sets'') (i, rep) -> let p = v.Vertex.particles.(pred i) in match UFOx.Lorentz.omega rep with | Coupling.ConjSpinor -> (SSet.add p spinors, conj_spinors) | Coupling.Spinor -> (spinors, SSet.add p conj_spinors) | _ -> sets'') sets' (UFOx.Lorentz.classify_indices l)) sets v.Vertex.lcc let collect_spinor_reps_of_vertices particles lorentz vertices = SMap.fold (fun _ v -> collect_spinor_reps_of_vertex particles lorentz v) vertices (SSet.empty, SSet.empty) let lorentz_reps_of_vertex particles v = ThoList.alist_of_list ~predicate:(not @@ UFOx.Lorentz.rep_trivial) ~offset:1 (List.map (fun p -> (* Why do we need to conjugate??? *) UFOx.Lorentz.rep_conjugate (SMap.find p particles).Particle.spin) (Array.to_list v.Vertex.particles)) let rep_compatible rep_vertex rep_particle = let open UFOx.Lorentz in let open Coupling in match omega rep_vertex, omega rep_particle with | (Spinor | ConjSpinor), Majorana -> true | r1, r2 -> r1 = r2 let reps_compatible reps_vertex reps_particles = List.for_all2 (fun (iv, rv) (ip, rp) -> iv = ip && rep_compatible rv rp) reps_vertex reps_particles let check_lorentz_reps_of_vertex particles lorentz v = let reps_particles = List.sort compare (lorentz_reps_of_vertex particles v) in List.iter (fun lcc -> let l = (SMap.find lcc.Vertex.lorentz lorentz).Lorentz_UFO.structure in let reps_vertex = List.sort compare (UFOx.Lorentz.classify_indices l) in if not (reps_compatible reps_vertex reps_particles) then begin Printf.eprintf "%s <> %s [%s]\n" (UFOx.Index.classes_to_string UFOx.Lorentz.rep_to_string reps_particles) (UFOx.Index.classes_to_string UFOx.Lorentz.rep_to_string reps_vertex) v.Vertex.name (* [(Vertex.to_string v.Vertex.name v)] *); (* [invalid_arg "check_lorentz_reps_of_vertex"] *) () end) v.Vertex.lcc let color_reps_of_vertex particles v = ThoList.alist_of_list ~predicate:(not @@ UFOx.Color.rep_trivial) ~offset:1 (List.map (fun p -> (SMap.find p particles).Particle.color) (Array.to_list v.Vertex.particles)) let check_color_reps_of_vertex particles v = let reps_particles = List.sort compare (color_reps_of_vertex particles v) in List.iter (fun lcc -> let reps_vertex = List.sort compare (UFOx.Color.classify_indices lcc.Vertex.color) in if reps_vertex <> reps_particles then begin Printf.printf "%s <> %s\n" (UFOx.Index.classes_to_string UFOx.Color.rep_to_string reps_particles) (UFOx.Index.classes_to_string UFOx.Color.rep_to_string reps_vertex); invalid_arg "check_color_reps_of_vertex" end) v.Vertex.lcc module P = Permutation.Default module type Lorentz = sig type spins = private | Unused | Unique of Coupling.lorentz array | Ambiguous of Coupling.lorentz array SMap.t type t = private { name : string; n : int; spins : spins; structure : UFO_Lorentz.t; fermion_lines : Coupling.fermion_lines } + val all_charge_conjugates : t -> t list val permute : P.t -> t -> t val of_lorentz_UFO : Particle.t SMap.t -> Vertex.t SMap.t -> Lorentz_UFO.t SMap.t -> t SMap.t val lorentz_to_string : Coupling.lorentz -> string val to_string : string -> t -> string end module Lorentz : Lorentz = struct let rec lorentz_to_string = function | Coupling.Scalar -> "Scalar" | Coupling.Spinor -> "Spinor" | Coupling.ConjSpinor -> "ConjSpinor" | Coupling.Majorana -> "Majorana" | Coupling.Maj_Ghost -> "Maj_Ghost" | Coupling.Vector -> "Vector" | Coupling.Massive_Vector -> "Massive_Vector" | Coupling.Vectorspinor -> "Vectorspinor" | Coupling.Tensor_1 -> "Tensor_1" | Coupling.Tensor_2 -> "Tensor_2" | Coupling.BRS l -> "BRS(" ^ lorentz_to_string l ^ ")" (* Unlike UFO, O'Mega distinguishes bewteen spinors and conjugate spinors. However, we can inspect the particles in the vertices in which a Lorentz structure is used to determine the correct quantum numbers. Most model files in the real world contain unused Lorentz structures. This is not a problem, we can just ignore them. *) type spins = | Unused | Unique of Coupling.lorentz array | Ambiguous of Coupling.lorentz array SMap.t + (* \begin{dubious} + Use [UFO_targets.Fortran.fusion_name] below in order + to avoid communication problems. Or even move away + from strings alltogether. + \end{dubious} *) type t = { name : string; n : int; spins : spins; structure : UFO_Lorentz.t; fermion_lines : Coupling.fermion_lines } + (* Add one charge conjugated fermion lines. *) + let charge_conjugate1 l (bra, ket as fermion_line) = + { name = l.name ^ Printf.sprintf "_c%x%x" bra ket; + n = l.n; + spins = l.spins; + structure = UFO_Lorentz.charge_conjugate fermion_line l.structure; + fermion_lines = l.fermion_lines } + + (* Add several charge conjugated fermion lines. *) + let charge_conjugate l fermion_lines = + List.fold_left charge_conjugate1 l fermion_lines + + (* Add all combinations of charge conjugated fermion lines. *) + let all_charge_conjugates l = + List.map (charge_conjugate l) (ThoList.power l.fermion_lines) + let permute_spins p = function | Unused -> Unused | Unique s -> Unique (P.array p s) | Ambiguous map -> Ambiguous (SMap.map (P.array p) map) (* Note that we apply the \emph{inverse} permutation to the indices in order to match the permutation of the particles/spins. *) let permute_structure n p (l, f) = let permuted = P.array (P.inverse p) (Array.init n succ) in let permute_index i = if i > 0 then UFOx.Index.map_position (fun pos -> permuted.(pred pos)) i else i in (UFO_Lorentz.map_indices permute_index l, UFO_Lorentz.map_fermion_lines permute_index f) let permute p l = let structure, fermion_lines = permute_structure l.n p (l.structure, l.fermion_lines) in { name = l.name ^ "_p" ^ P.to_string (P.inverse p); n = l.n; spins = permute_spins p l.spins; structure; fermion_lines } let omega_lorentz_reps n alist = let reps = Array.make n Coupling.Scalar in List.iter (fun (i, rep) -> reps.(pred i) <- UFOx.Lorentz.omega rep) alist; reps let contained lorentz vertex = List.exists (fun lcc1 -> lcc1.Vertex.lorentz = lorentz.Lorentz_UFO.name) vertex.Vertex.lcc (* Find all vertices in with the Lorentz structure [lorentz] is used and build a map from those vertices to the O'Mega Lorentz representations inferred from UFO's Lorentz structure and the [particles] involved. Then scan the bindings and check that we have inferred the same Lorentz representation from all vertices. *) let lorentz_reps_of_structure particles vertices lorentz = let uses = SMap.fold (fun name v acc -> if contained lorentz v then SMap.add name (omega_lorentz_reps (Array.length v.Vertex.particles) (lorentz_reps_of_vertex particles v)) acc else acc) vertices SMap.empty in let variants = ThoList.uniq (List.sort compare (List.map snd (SMap.bindings uses))) in match variants with | [] -> Unused | [s] -> Unique s | _ -> Printf.eprintf "UFO.Lorentz.lorentz_reps_of_structure: AMBIGUOUS!\n"; List.iter (fun variant -> Printf.eprintf "UFO.Lorentz.lorentz_reps_of_structure: %s\n" (ThoList.to_string lorentz_to_string (Array.to_list variant))) variants; Ambiguous uses let of_lorentz_tensor spins lorentz = match spins with | Unique s -> begin try Some (UFO_Lorentz.parse (Array.to_list s) lorentz) with | Failure msg -> begin prerr_endline msg; Some (UFO_Lorentz.dummy) end end | Unused -> Printf.eprintf "UFO.Lorentz: stripping unused structure %s\n" (UFOx.Lorentz.to_string lorentz); None | Ambiguous _ -> invalid_arg "UFO.Lorentz.of_lorentz_tensor: Ambiguous" let of_lorentz_UFO particles vertices lorentz_UFO = SMap.fold (fun name l acc -> let spins = lorentz_reps_of_structure particles vertices l in match of_lorentz_tensor spins l.Lorentz_UFO.structure with | None -> acc | Some structure -> SMap.add name { name = l.Lorentz_UFO.name; n = List.length l.Lorentz_UFO.spins; spins; structure; fermion_lines = UFO_Lorentz.fermion_lines structure } acc) lorentz_UFO SMap.empty let to_string symbol l = Printf.sprintf "lorentz: %s => [name = '%s', spins = %s, \ structure = %s, fermion_lines = %s]" symbol l.name (match l.spins with | Unique s -> "[" ^ String.concat ", " (List.map lorentz_to_string (Array.to_list s)) ^ "]" | Ambiguous _ -> "AMBIGUOUS!" | Unused -> "UNUSED!") (UFO_Lorentz.to_string l.structure) (UFO_Lorentz.fermion_lines_to_string l.fermion_lines) end (* According to arxiv:1308:1668, there should not be a factor of~$i$ in the numerators of propagators, but the (unused) \texttt{propagators.py} in most models violate this rule! *) let divide_propagators_by_i = ref false module type Propagator = sig type t = (* private *) { name : string; spins : Coupling.lorentz * Coupling.lorentz; numerator : UFO_Lorentz.t; denominator : UFO_Lorentz.t } - val of_propagator_UFO : Propagator_UFO.t -> t - - val of_propagators_UFO : - Particle.t SMap.t -> Propagator_UFO.t SMap.t -> t SMap.t + val of_propagator_UFO : ?majorana:bool -> Propagator_UFO.t -> t + val of_propagators_UFO : ?majorana:bool -> Propagator_UFO.t SMap.t -> t SMap.t val transpose : t -> t val to_string : string -> t -> string end module Propagator : Propagator = struct type t = (* private *) { name : string; spins : Coupling.lorentz * Coupling.lorentz; numerator : UFO_Lorentz.t; denominator : UFO_Lorentz.t } let lorentz_rep_at rep_classes i = try UFOx.Lorentz.omega (List.assoc i rep_classes) with | Not_found -> Coupling.Scalar let imaginary = Algebra.QC.make Algebra.Q.null Algebra.Q.unit let scalars = [Coupling.Scalar; Coupling.Scalar] (* If~$51$ and~$52$ show up as indices, we must map $(1,51)\to(1001,2001)$ and $(2,52)\to(1002,2002)$, as per the UFO conventions for Lorentz structures. *) (* \begin{dubious} This does not work yet, because [UFOx.Lorentz.map_indices] affects also the position argument of [P], [Mass] and [Width]. \end{dubious} *) let contains_51_52 tensor = List.exists (fun (i, _) -> i = 51 || i = 52) (UFOx.Lorentz.classify_indices tensor) let remap_51_52 = function | 1 -> 1001 | 51 -> 2001 | 2 -> 1002 | 52 -> 2002 | i -> i let canonicalize_51_52 tensor = if contains_51_52 tensor then UFOx.Lorentz.rename_indices remap_51_52 tensor else tensor + let force_majorana = function + | Coupling.Spinor | Coupling.ConjSpinor -> Coupling.Majorana + | s -> s + (* In the current conventions, the factor of~$i$ is not included: *) - let of_propagator_UFO p = + let of_propagator_UFO ?(majorana=false) p = let numerator = canonicalize_51_52 p.Propagator_UFO.numerator in let lorentz_reps = UFOx.Lorentz.classify_indices numerator in let spin1 = lorentz_rep_at lorentz_reps 1 and spin2 = lorentz_rep_at lorentz_reps 2 in let numerator_sans_i = if !divide_propagators_by_i then UFOx.Lorentz.map_coef (fun q -> Algebra.QC.div q imaginary) numerator else numerator in { name = p.Propagator_UFO.name; - spins = (spin1, spin2); + spins = + if majorana then + (force_majorana spin1, force_majorana spin2) + else + (spin1, spin2); numerator = UFO_Lorentz.parse [spin1; spin2] numerator_sans_i; denominator = UFO_Lorentz.parse scalars p.Propagator_UFO.denominator } - let of_propagators_UFO particles propagators_UFO = + let of_propagators_UFO ?majorana propagators_UFO = SMap.fold - (fun name p acc -> SMap.add name (of_propagator_UFO p) acc) + (fun name p acc -> SMap.add name (of_propagator_UFO ?majorana p) acc) propagators_UFO SMap.empty let permute12 = function | 1 -> 2 | 2 -> 1 | n -> n let transpose_positions t = UFOx.Index.map_position permute12 t let transpose p = { name = p.name; spins = (snd p.spins, fst p.spins); numerator = UFO_Lorentz.map_indices transpose_positions p.numerator; denominator = p.denominator } let to_string symbol p = Printf.sprintf "propagator: %s => [name = '%s', spin = '(%s, %s)', numerator/I = '%s', \ denominator = '%s']" symbol p.name (Lorentz.lorentz_to_string (fst p.spins)) (Lorentz.lorentz_to_string (snd p.spins)) (UFO_Lorentz.to_string p.numerator) (UFO_Lorentz.to_string p.denominator) end type t = { particles : Particle.t SMap.t; particle_array : Particle.t array; (* for diagnostics *) couplings : UFO_Coupling.t SMap.t; coupling_orders : Coupling_Order.t SMap.t; vertices : Vertex.t SMap.t; lorentz_UFO : Lorentz_UFO.t SMap.t; lorentz : Lorentz.t SMap.t; parameters : Parameter.t SMap.t; propagators_UFO : Propagator_UFO.t SMap.t; propagators : Propagator.t SMap.t; decays : Decay.t SMap.t; nc : int } let use_majorana_spinors = ref false let fallback_to_majorana_if_necessary particles vertices lorentz_UFO = let majoranas = SMap.fold (fun p particle acc -> if Particle.is_majorana particle then SSet.add p acc else acc) particles SSet.empty in let spinors, conj_spinors = collect_spinor_reps_of_vertices particles lorentz_UFO vertices in let ambiguous = SSet.diff (SSet.inter spinors conj_spinors) majoranas in let no_majoranas = SSet.is_empty majoranas and no_ambiguities = SSet.is_empty ambiguous in if no_majoranas && no_ambiguities && not !use_majorana_spinors then - SMap.mapi - (fun p particle -> - if SSet.mem p spinors then - Particle.force_spinor particle - else if SSet.mem p conj_spinors then - Particle.force_conjspinor particle - else - particle) - particles + (SMap.mapi + (fun p particle -> + if SSet.mem p spinors then + Particle.force_spinor particle + else if SSet.mem p conj_spinors then + Particle.force_conjspinor particle + else + particle) + particles, + false) else begin if !use_majorana_spinors then Printf.eprintf "O'Mega: Majorana fermions requested.\n"; if not no_majoranas then Printf.eprintf "O'Mega: found Majorana fermions!\n"; if not no_ambiguities then Printf.eprintf "O'Mega: found ambiguous spinor representations for %s!\n" (String.concat ", " (SSet.elements ambiguous)); Printf.eprintf "O'Mega: falling back to the Majorana representation for all fermions.\n"; - SMap.map Particle.force_majorana particles + (SMap.map Particle.force_majorana particles, + true) end let nc_of_particles particles = let nc_set = List.fold_left (fun nc_set (_, p) -> match UFOx.Color.omega p.Particle.color with | Color.Singlet -> nc_set | Color.SUN nc -> Sets.Int.add (abs nc) nc_set | Color.AdjSUN nc -> Sets.Int.add (abs nc) nc_set) Sets.Int.empty (SMap.bindings particles) in match Sets.Int.elements nc_set with | [] -> 0 | [n] -> n | nc_list -> invalid_arg ("UFO.Model: more than one value of N_C: " ^ String.concat ", " (List.map string_of_int nc_list)) let of_file u = let particles = Particle.of_file u.Files.particles in let vertices = Vertex.of_file particles u.Files.vertices and lorentz_UFO = Lorentz_UFO.of_file u.Files.lorentz and propagators_UFO = Propagator_UFO.of_file u.Files.propagators in - let particles = + let particles, majorana = fallback_to_majorana_if_necessary particles vertices lorentz_UFO in let particle_array = Array.of_list (values particles) and lorentz = Lorentz.of_lorentz_UFO particles vertices lorentz_UFO - and propagators = Propagator.of_propagators_UFO particles propagators_UFO in + and propagators = Propagator.of_propagators_UFO ~majorana propagators_UFO in let model = { particles; particle_array; couplings = UFO_Coupling.of_file u.Files.couplings; coupling_orders = Coupling_Order.of_file u.Files.coupling_orders; vertices; lorentz_UFO; lorentz; parameters = Parameter.of_file u.Files.parameters; propagators_UFO; propagators; decays = Decay.of_file u.Files.decays; nc = nc_of_particles particles } in SMap.iter (fun _ v -> check_color_reps_of_vertex model.particles v; check_lorentz_reps_of_vertex model.particles model.lorentz_UFO v) model.vertices; model let parse_directory dir = of_file (Files.parse_directory dir) let dump model = Printf.printf "NC = %d\n" model.nc; SMap.iter (print_endline @@@ Particle.to_string) model.particles; SMap.iter (print_endline @@@ UFO_Coupling.to_string) model.couplings; SMap.iter (print_endline @@@ Coupling_Order.to_string) model.coupling_orders; (* [SMap.iter (print_endline @@@ Vertex.to_string) model.vertices;] *) SMap.iter (fun symbol v -> (print_endline @@@ Vertex.to_string) symbol v; print_endline (Vertex.to_string_expanded model.lorentz_UFO model.couplings v)) model.vertices; SMap.iter (print_endline @@@ Lorentz_UFO.to_string) model.lorentz_UFO; SMap.iter (print_endline @@@ Lorentz.to_string) model.lorentz; SMap.iter (print_endline @@@ Parameter.to_string) model.parameters; SMap.iter (print_endline @@@ Propagator_UFO.to_string) model.propagators_UFO; SMap.iter (print_endline @@@ Propagator.to_string) model.propagators; SMap.iter (print_endline @@@ Decay.to_string) model.decays; SMap.iter (fun symbol d -> List.iter (fun (_, w) -> ignore (UFOx.Expr.of_string w)) d.Decay.widths) model.decays exception Unhandled of string let unhandled s = raise (Unhandled s) module Model = struct (* NB: we could use [type flavor = Particle.t], but that would be very inefficient, because we will use [flavor] as a key for maps below. *) type flavor = int type constant = string type gauge = unit module M = Modeltools.Mutable (struct type f = flavor type g = gauge type c = constant end) let flavors = M.flavors let external_flavors = M.external_flavors let external_flavors = M.external_flavors let lorentz = M.lorentz let color = M.color let nc = M.nc let propagator = M.propagator let width = M.width let goldstone = M.goldstone let conjugate = M.conjugate let fermion = M.fermion let vertices = M.vertices let fuse2 = M.fuse2 let fuse3 = M.fuse3 let fuse = M.fuse let max_degree = M.max_degree let parameters = M.parameters let flavor_of_string = M.flavor_of_string let flavor_to_string = M.flavor_to_string let flavor_to_TeX = M.flavor_to_TeX let flavor_symbol = M.flavor_symbol let gauge_symbol = M.gauge_symbol let pdg = M.pdg let mass_symbol = M.mass_symbol let width_symbol = M.width_symbol let constant_symbol = M.constant_symbol module Ch = M.Ch let charges = M.charges let rec fermion_of_lorentz = function | Coupling.Spinor -> 1 | Coupling.ConjSpinor -> -1 | Coupling.Majorana -> 2 | Coupling.Maj_Ghost -> 2 | Coupling.Vectorspinor -> 1 | Coupling.Vector | Coupling.Massive_Vector -> 0 | Coupling.Scalar | Coupling.Tensor_1 | Coupling.Tensor_2 -> 0 | Coupling.BRS f -> fermion_of_lorentz f module Q = Algebra.Q module QC = Algebra.QC let dummy_tensor3 = Coupling.Scalar_Scalar_Scalar 1 let dummy_tensor4 = Coupling.Scalar4 1 let triplet p = (p.(0), p.(1), p.(2)) let quartet p = (p.(0), p.(1), p.(2), p.(3)) let half_times q1 q2 = Q.mul (Q.make 1 2) (Q.mul q1 q2) let name g = g.UFO_Coupling.name let fractional_coupling g r = let g = name g in match Q.to_ratio r with | 0, _ -> "0.0_default" | 1, 1 -> g | -1, 1 -> Printf.sprintf "(-%s)" g | n, 1 -> Printf.sprintf "(%d*%s)" n g | 1, d -> Printf.sprintf "(%s/%d)" g d | -1, d -> Printf.sprintf "(-%s/%d)" g d | n, d -> Printf.sprintf "(%d*%s/%d)" n g d let lorentz_of_symbol model symbol = try SMap.find symbol model.lorentz with | Not_found -> invalid_arg ("lorentz_of_symbol: " ^ symbol) let lorentz_UFO_of_symbol model symbol = try SMap.find symbol model.lorentz_UFO with | Not_found -> invalid_arg ("lorentz_UFO_of_symbol: " ^ symbol) let coupling_of_symbol model symbol = try SMap.find symbol model.couplings with | Not_found -> invalid_arg ("coupling_of_symbol: " ^ symbol) let spin_triplet model name = match (lorentz_of_symbol model name).Lorentz.spins with | Lorentz.Unique [|s0; s1; s2|] -> (s0, s1, s2) | Lorentz.Unique _ -> invalid_arg "spin_triplet: wrong number of spins" | Lorentz.Unused -> invalid_arg "spin_triplet: Unused" | Lorentz.Ambiguous _ -> invalid_arg "spin_triplet: Ambiguous" let spin_quartet model name = match (lorentz_of_symbol model name).Lorentz.spins with | Lorentz.Unique [|s0; s1; s2; s3|] -> (s0, s1, s2, s3) | Lorentz.Unique _ -> invalid_arg "spin_quartet: wrong number of spins" | Lorentz.Unused -> invalid_arg "spin_quartet: Unused" | Lorentz.Ambiguous _ -> invalid_arg "spin_quartet: Ambiguous" let spin_multiplet model name = match (lorentz_of_symbol model name).Lorentz.spins with | Lorentz.Unique sarray -> sarray | Lorentz.Unused -> invalid_arg "spin_multiplet: Unused" | Lorentz.Ambiguous _ -> invalid_arg "spin_multiplet: Ambiguous" (* If we have reason to belive that a $\delta_{ab}$-vertex is an effective $\tr(T_aT_b)$-vertex generated at loop level, like~$gg\to H\ldots$ in the SM, we should interpret it as such and use the expression~(6.2) from~\cite{Kilian:2012pz}. *) (* AFAIK, there is no way to distinguish these cases directly in a UFO file. Instead we rely in a heuristic, in which each massless color octet vector particle or ghost is a gluon and colorless scalars are potential Higgses. *) let is_massless p = match ThoString.uppercase p.Particle.mass with | "ZERO" -> true | _ -> false let is_gluon model f = let p = model.particle_array.(f) in match UFOx.Color.omega p.Particle.color, UFOx.Lorentz.omega p.Particle.spin with | Color.AdjSUN _, Coupling.Vector -> is_massless p | Color.AdjSUN _, Coupling.Scalar -> if p.Particle.ghost_number <> 0 then is_massless p else false | _ -> false let is_color_singlet model f = let p = model.particle_array.(f) in match UFOx.Color.omega p.Particle.color with | Color.Singlet -> true | _ -> false let is_higgs_gluon_vertex model p adjoints = if Array.length p > List.length adjoints then List.for_all (fun (i, p) -> if List.mem i adjoints then is_gluon model p else is_color_singlet model p) (ThoList.enumerate 1 (Array.to_list p)) else false let delta8_heuristics model p a b = if is_higgs_gluon_vertex model p [a; b] then Color.Vertex.delta8_loop a b else Color.Vertex.delta8 a b let verbatim_higgs_glue = ref false let translate_color_atom model p = function | UFOx.Color_Atom.Identity (i, j) -> Color.Vertex.delta3 i j | UFOx.Color_Atom.Identity8 (a, b) -> if !verbatim_higgs_glue then Color.Vertex.delta8 a b else delta8_heuristics model p a b | UFOx.Color_Atom.T (a, i, j) -> Color.Vertex.t a i j | UFOx.Color_Atom.F (a, b, c) -> Color.Vertex.f a b c | UFOx.Color_Atom.D (a, b, c) -> Color.Vertex.d a b c | UFOx.Color_Atom.Epsilon (i, j, k) -> Color.Vertex.epsilon i j k | UFOx.Color_Atom.EpsilonBar (i, j, k) -> Color.Vertex.epsilonbar i j k | UFOx.Color_Atom.T6 (a, i, j) -> Color.Vertex.t6 a i j | UFOx.Color_Atom.K6 (i, j, k) -> Color.Vertex.k6 i j k | UFOx.Color_Atom.K6Bar (i, j, k) -> Color.Vertex.k6bar i j k let translate_color_term model p = function | [], q -> Color.Vertex.scale q Color.Vertex.unit | [atom], q -> Color.Vertex.scale q (translate_color_atom model p atom) | atoms, q -> let atoms = List.map (translate_color_atom model p) atoms in Color.Vertex.scale q (Color.Vertex.multiply atoms) let translate_color model p terms = match terms with | [] -> invalid_arg "translate_color: empty" | [ term ] -> translate_color_term model p term | terms -> Color.Vertex.sum (List.map (translate_color_term model p) terms) let translate_coupling_1 model p lcc = let l = lcc.Vertex.lorentz in let s = Array.to_list (spin_multiplet model l) and fl = (SMap.find l model.lorentz).Lorentz.fermion_lines and c = name (coupling_of_symbol model lcc.Vertex.coupling) and col = translate_color model p lcc.Vertex.color in (Array.to_list p, Coupling.UFO (QC.unit, l, s, fl, col), c) let translate_coupling model p lcc = List.map (translate_coupling_1 model p) lcc let long_flavors = ref false module type Lookup = sig type f = private { flavors : flavor list; flavor_of_string : string -> flavor; flavor_of_symbol : string -> flavor; particle : flavor -> Particle.t; flavor_symbol : flavor -> string; conjugate : flavor -> flavor } type flavor_format = | Long | Decimal | Hexadecimal val flavor_format : flavor_format ref val of_model : t -> f end module Lookup : Lookup = struct type f = { flavors : flavor list; flavor_of_string : string -> flavor; flavor_of_symbol : string -> flavor; particle : flavor -> Particle.t; flavor_symbol : flavor -> string; conjugate : flavor -> flavor } type flavor_format = | Long | Decimal | Hexadecimal let flavor_format = ref Hexadecimal let conjugate_of_particle_array particles = Array.init (Array.length particles) (fun i -> let f' = Particle.conjugate particles.(i) in match ThoArray.match_all f' particles with | [i'] -> i' | [] -> invalid_arg ("no charge conjugate: " ^ f'.Particle.name) | _ -> invalid_arg ("multiple charge conjugates: " ^ f'.Particle.name)) let invert_flavor_array a = let table = SHash.create 37 in Array.iteri (fun i s -> SHash.add table s i) a; (fun name -> try SHash.find table name with | Not_found -> invalid_arg ("not found: " ^ name)) let digits base n = let rec digits' acc n = if n < 1 then acc else digits' (succ acc) (n / base) in if n < 0 then digits' 1 (-n) else if n = 0 then 1 else digits' 0 n let of_model model = let particle_array = Array.of_list (values model.particles) in let conjugate_array = conjugate_of_particle_array particle_array and name_array = Array.map (fun f -> f.Particle.name) particle_array and symbol_array = Array.of_list (keys model.particles) in let flavor_symbol f = begin match !flavor_format with | Long -> symbol_array.(f) | Decimal -> let w = digits 10 (Array.length particle_array - 1) in Printf.sprintf "%0*d" w f | Hexadecimal -> let w = digits 16 (Array.length particle_array - 1) in Printf.sprintf "%0*X" w f end in { flavors = ThoList.range 0 (Array.length particle_array - 1); flavor_of_string = invert_flavor_array name_array; flavor_of_symbol = invert_flavor_array symbol_array; particle = Array.get particle_array; flavor_symbol = flavor_symbol; conjugate = Array.get conjugate_array } end (* \begin{dubious} We appear to need to conjugate all flavors. Why??? \end{dubious} *) let translate_vertices model tables = let vn = List.fold_left (fun acc v -> let p = Array.map tables.Lookup.flavor_of_symbol v.Vertex.particles and lcc = v.Vertex.lcc in let p = Array.map conjugate p in (* FIXME: why? *) translate_coupling model p lcc @ acc) [] (values model.vertices) in ([], [], vn) let propagator_of_lorentz = function | Coupling.Scalar -> Coupling.Prop_Scalar | Coupling.Spinor -> Coupling.Prop_Spinor | Coupling.ConjSpinor -> Coupling.Prop_ConjSpinor | Coupling.Majorana -> Coupling.Prop_Majorana | Coupling.Maj_Ghost -> invalid_arg "UFO.Model.propagator_of_lorentz: SUSY ghosts do not propagate" | Coupling.Vector -> Coupling.Prop_Feynman | Coupling.Massive_Vector -> Coupling.Prop_Unitarity | Coupling.Tensor_2 -> Coupling.Prop_Tensor_2 | Coupling.Vectorspinor -> invalid_arg "UFO.Model.propagator_of_lorentz: Vectorspinor" | Coupling.Tensor_1 -> invalid_arg "UFO.Model.propagator_of_lorentz: Tensor_1" | Coupling.BRS _ -> invalid_arg "UFO.Model.propagator_of_lorentz: no BRST" let filter_unphysical model = let physical_particles = Particle.filter Particle.is_physical model.particles in let physical_particle_array = Array.of_list (values physical_particles) in let physical_vertices = Vertex.filter (not @@ (Vertex.contains model.particles (not @@ Particle.is_physical))) model.vertices in { model with particles = physical_particles; particle_array = physical_particle_array; vertices = physical_vertices } let whizard_constants = SSet.of_list [ "ZERO" ] let filter_constants parameters = List.filter (fun p -> not (SSet.mem (ThoString.uppercase p.Parameter.name) whizard_constants)) parameters let add_name set parameter = CSet.add parameter.Parameter.name set let hardcoded_parameters = CSet.of_list ["cmath.pi"] let missing_parameters input derived couplings = let input_parameters = List.fold_left add_name hardcoded_parameters input in let all_parameters = List.fold_left add_name input_parameters derived in let derived_dependencies = dependencies (List.map (fun p -> (p.Parameter.name, p.Parameter.value)) derived) in let coupling_dependencies = dependencies (List.map (fun p -> (p.UFO_Coupling.name, Expr p.UFO_Coupling.value)) (values couplings)) in let missing_input = CMap.filter (fun parameter derived_parameters -> not (CSet.mem parameter all_parameters)) derived_dependencies and missing = CMap.filter (fun parameter couplings -> not (CSet.mem parameter all_parameters)) coupling_dependencies in CMap.iter (fun parameter derived_parameters -> Printf.eprintf "UFO warning: undefined input parameter %s appears in derived \ parameters {%s}: will be added to the list of input parameters!\n" parameter (String.concat "; " (CSet.elements derived_parameters))) missing_input; CMap.iter (fun parameter couplings -> Printf.eprintf "UFO warning: undefined parameter %s appears in couplings {%s}: \ will be added to the list of input parameters!\n" parameter (String.concat "; " (CSet.elements couplings))) missing; keys_caseless missing_input @ keys_caseless missing let classify_parameters model = let compare_parameters p1 p2 = compare p1.Parameter.sequence p2.Parameter.sequence in let input, derived = List.fold_left (fun (input, derived) p -> match p.Parameter.nature with | Parameter.Internal -> (input, p :: derived) | Parameter.External -> begin match p.Parameter.ptype with | Parameter.Real -> () | Parameter.Complex -> Printf.eprintf "UFO warning: invalid complex declaration of input \ parameter `%s' ignored!\n" p.Parameter.name end; (p :: input, derived)) ([], []) (filter_constants (values model.parameters)) in let additional = missing_parameters input derived model.couplings in (List.sort compare_parameters input @ List.map Parameter.missing additional, List.sort compare_parameters derived) (*i List.iter (fun line -> Printf.eprintf "par: %s\n" line) (dependencies_to_strings derived_dependencies); List.iter (fun line -> Printf.eprintf "coupling: %s\n" line) (dependencies_to_strings coupling_dependencies); i*) let translate_name map name = try SMap.find name map with Not_found -> name let translate_input map p = (translate_name map p.Parameter.name, value_to_float p.Parameter.value) let alpha_s_half e = UFOx.Expr.substitute "aS" (UFOx.Expr.half "aS") e let alpha_s_half_etc map e = UFOx.Expr.rename (map_to_alist map) (alpha_s_half e) let translate_derived map p = let make_atom s = s in let c = make_atom (translate_name map p.Parameter.name) and v = value_to_coupling (alpha_s_half_etc map) make_atom p.Parameter.value in match p.Parameter.ptype with | Parameter.Real -> (Coupling.Real c, v) | Parameter.Complex -> (Coupling.Complex c, v) let translate_coupling_constant map c = let make_atom s = s in (Coupling.Complex c.UFO_Coupling.name, Coupling.Quot (value_to_coupling (alpha_s_half_etc map) make_atom (Expr c.UFO_Coupling.value), Coupling.I)) module Lowercase_Parameters = struct type elt = string type base = string let compare_elt = compare let compare_base = compare let pi = ThoString.lowercase end module Lowercase_Bundle = Bundle.Make (Lowercase_Parameters) let coupling_names model = SMap.fold (fun _ c acc -> c.UFO_Coupling.name :: acc) model.couplings [] let parameter_names model = SMap.fold (fun _ c acc -> c.Parameter.name :: acc) model.parameters [] let ambiguous_parameters model = let all_names = List.rev_append (coupling_names model) (parameter_names model) in let lc_bundle = Lowercase_Bundle.of_list all_names in let lc_set = List.fold_left (fun acc s -> SSet.add s acc) SSet.empty (Lowercase_Bundle.base lc_bundle) and ambiguities = List.filter (fun (_, names) -> List.length names > 1) (Lowercase_Bundle.fibers lc_bundle) in (lc_set, ambiguities) let disambiguate1 lc_set name = let rec disambiguate1' i = let name' = Printf.sprintf "%s_%d" name i in let lc_name' = ThoString.lowercase name' in if SSet.mem lc_name' lc_set then disambiguate1' (succ i) else (SSet.add lc_name' lc_set, name') in disambiguate1' 1 let disambiguate lc_set names = let _, replacements = List.fold_left (fun (lc_set', acc) name -> let lc_set'', name' = disambiguate1 lc_set' name in (lc_set'', SMap.add name name' acc)) (lc_set, SMap.empty) names in replacements let omegalib_names = ["u"; "ubar"; "v"; "vbar"; "eps"] let translate_parameters model = let lc_set, ambiguities = ambiguous_parameters model in let replacements = disambiguate lc_set (ThoList.flatmap snd ambiguities) in SMap.iter (Printf.eprintf "warning: case sensitive parameter names: renaming '%s' -> '%s'\n") replacements; let replacements = List.fold_left (fun acc name -> SMap.add name ("UFO_" ^ name) acc) replacements omegalib_names in let input_parameters, derived_parameters = classify_parameters model and couplings = values model.couplings in { Coupling.input = List.map (translate_input replacements) input_parameters; Coupling.derived = List.map (translate_derived replacements) derived_parameters @ List.map (translate_coupling_constant replacements) couplings; Coupling.derived_arrays = [] } (* UFO requires us to look up the mass parameter to distinguish between massless and massive vectors. TODO: this is a candidate for another lookup table. *) let lorentz_of_particle p = match UFOx.Lorentz.omega p.Particle.spin with | Coupling.Vector -> begin match ThoString.uppercase p.Particle.mass with | "ZERO" -> Coupling.Vector | _ -> Coupling.Massive_Vector end | s -> s type state = { directory : string; model : t } let initialized = ref None let is_initialized_from dir = match !initialized with | None -> false | Some state -> dir = state.directory let dump_raw = ref false let init dir = let model = filter_unphysical (parse_directory dir) in if !dump_raw then dump model; let tables = Lookup.of_model model in let vertices () = translate_vertices model tables in let particle f = tables.Lookup.particle f in let lorentz f = lorentz_of_particle (particle f) in let propagator f = let p = particle f in match p.Particle.propagator with | None -> propagator_of_lorentz (lorentz_of_particle p) | Some s -> Coupling.Prop_UFO s in let gauge_symbol () = "?GAUGE?" in let constant_symbol s = s in let parameters = translate_parameters model in M.setup ~color:(fun f -> UFOx.Color.omega (particle f).Particle.color) ~nc:(fun () -> model.nc) ~pdg:(fun f -> (particle f).Particle.pdg_code) ~lorentz ~propagator ~width:(fun f -> Coupling.Constant) ~goldstone:(fun f -> None) ~conjugate:tables.Lookup.conjugate ~fermion:(fun f -> fermion_of_lorentz (lorentz f)) ~vertices ~flavors:[("All Flavors", tables.Lookup.flavors)] ~parameters:(fun () -> parameters) ~flavor_of_string:tables.Lookup.flavor_of_string ~flavor_to_string:(fun f -> (particle f).Particle.name) ~flavor_to_TeX:(fun f -> (particle f).Particle.texname) ~flavor_symbol:tables.Lookup.flavor_symbol ~gauge_symbol ~mass_symbol:(fun f -> (particle f).Particle.mass) ~width_symbol:(fun f -> (particle f).Particle.width) ~constant_symbol; initialized := Some { directory = dir; model = model } let ufo_directory = ref Config.default_UFO_dir let load () = if is_initialized_from !ufo_directory then () else init !ufo_directory let include_all_fusions = ref false + (* In case of Majorana spinors, also generate + all combinations of charge conjugated fermion lines. + The naming convention is to append + \texttt{\_c}$nm$ if the $\gamma$-matrices + of the fermion line $n\to m$ has been charge conjugated + (this could become impractical for too many fermions at + a vertex, but shouldn't matter in real life). *) + + (* \begin{dubious} + To be decided: is it better (in the sense of + \emph{easier to understand}, not efficiency) + to permute first or to charge conjugate first? + \end{dubious} *) + + let is_majorana = function + | Coupling.Majorana | Coupling.Vectorspinor | Coupling.Maj_Ghost -> true + | _ -> false + + let name_spins_structure spins l = + (l.Lorentz.name, spins, l.Lorentz.structure) + let fusions_of_model ?only model = let include_fusion = match !include_all_fusions, only with | true, _ | false, None -> (fun name -> true) | false, Some names -> (fun name -> SSet.mem name names) in SMap.fold (fun name l acc -> if include_fusion name then List.fold_left (fun acc p -> let l' = Lorentz.permute p l in match l'.Lorentz.spins with | Lorentz.Unused -> acc | Lorentz.Unique spins -> - (l'.Lorentz.name, spins, l'.Lorentz.structure) :: acc + if Array.exists is_majorana spins then + List.map + (name_spins_structure spins) + (Lorentz.all_charge_conjugates l') + @ acc + else + name_spins_structure spins l' :: acc | Lorentz.Ambiguous _ -> failwith "fusions: Lorentz.Ambiguous") [] (Permutation.Default.cyclic l.Lorentz.n) @ acc else acc) model.lorentz [] let fusions ?only () = match !initialized with | None -> [] | Some { model = model } -> fusions_of_model ?only model let propagators_of_model ?only model = let include_propagator = match !include_all_fusions, only with | true, _ | false, None -> (fun name -> true) | false, Some names -> (fun name -> SSet.mem name names) in SMap.fold (fun name p acc -> if include_propagator name then (name, p) :: acc else acc) model.propagators [] let propagators ?only () = match !initialized with | None -> [] | Some { model = model } -> propagators_of_model ?only model let include_hadrons = ref true + let ufo_majorana_warnings = + [ "***************************************************"; + "* *"; + "* CAVEAT: *"; + "* *"; + "* These amplitudes have been computed for a *"; + "* UFO model containing Majorana fermions. *"; + "* This version of O'Mega contains some known *"; + "* bugs for this case. It was released early at *"; + "* the request of the Linear Collider community. *"; + "* *"; + "* These amplitudes MUST NOT be used for *"; + "* publications without prior consulation *"; + "* with the WHIZARD authors !!! *"; + "* *"; + "***************************************************" ] + + let caveats () = + if !use_majorana_spinors then + ufo_majorana_warnings + else + [] + module Whizard : sig val write : unit -> unit end = struct let write_header dir = Printf.printf "# WHIZARD Model file derived from UFO directory\n"; Printf.printf "# '%s'\n\n" dir; + List.iter (fun s -> Printf.printf "# %s\n" s) (M.caveats ()); Printf.printf "model \"%s\"\n\n" (Filename.basename dir) let write_input_parameters parameters = let open Parameter in Printf.printf "# Independent (input) Parameters\n"; List.iter (fun p -> Printf.printf "parameter %s = %s" p.name (value_to_numeric p.value); begin match p.lhablock, p.lhacode with | None, None -> () | Some name, Some (index :: indices) -> Printf.printf " slha_entry %s %d" name index; List.iter (fun i -> Printf.printf " %d" i) indices | Some name, None -> Printf.eprintf "UFO: parameter %s: slhablock %s without slhacode\n" p.name name | Some name, Some [] -> Printf.eprintf "UFO: parameter %s: slhablock %s with empty slhacode\n" p.name name | None, Some _ -> Printf.eprintf "UFO: parameter %s: slhacode without slhablock\n" p.name end; Printf.printf "\n") parameters; Printf.printf "\n" let write_derived_parameters parameters = let open Parameter in Printf.printf "# Dependent (derived) Parameters\n"; List.iter (fun p -> Printf.printf "derived %s = %s\n" p.name (value_to_expr alpha_s_half p.value)) parameters let write_particles particles = let open Particle in Printf.printf "# Particles\n"; Printf.printf "# NB: hypercharge assignments appear to be unreliable\n"; Printf.printf "# therefore we can't infer the isospin\n"; Printf.printf "# NB: parton-, gauge- & handedness are unavailable\n"; List.iter (fun p -> if not p.is_anti then begin Printf.printf "particle \"%s\" %d ### parton? gauge? left?\n" p.name p.pdg_code; Printf.printf " spin %s charge %s color %s ### isospin?\n" (UFOx.Lorentz.rep_to_string_whizard p.spin) (charge_to_string p.charge) (UFOx.Color.rep_to_string_whizard p.color); Printf.printf " name \"%s\"\n" p.name; if p.antiname <> p.name then Printf.printf " anti \"%s\"\n" p.antiname; Printf.printf " tex_name \"%s\"\n" p.texname; if p.antiname <> p.name then Printf.printf " tex_anti \"%s\"\n" p.antitexname; Printf.printf " mass %s width %s\n\n" p.mass p.width end) (values particles); Printf.printf "\n" let write_hadrons () = Printf.printf "# Hadrons (protons and beam remnants)\n"; Printf.printf "# NB: these are NOT part of the UFO model\n"; Printf.printf "# but added for WHIZARD's convenience!\n"; Printf.printf "particle PROTON 2212\n"; Printf.printf " spin 1/2 charge 1\n"; Printf.printf " name p \"p+\"\n"; Printf.printf " anti pbar \"p-\"\n"; Printf.printf "particle HADRON_REMNANT 90\n"; Printf.printf " name hr\n"; Printf.printf " tex_name \"had_r\"\n"; Printf.printf "particle HADRON_REMNANT_SINGLET 91\n"; Printf.printf " name hr1\n"; Printf.printf " tex_name \"had_r^{(1)}\"\n"; Printf.printf "particle HADRON_REMNANT_TRIPLET 92\n"; Printf.printf " color 3\n"; Printf.printf " name hr3\n"; Printf.printf " tex_name \"had_r^{(3)}\"\n"; Printf.printf " anti hr3bar\n"; Printf.printf " tex_anti \"had_r^{(\\bar 3)}\"\n"; Printf.printf "particle HADRON_REMNANT_OCTET 93\n"; Printf.printf " color 8\n"; Printf.printf " name hr8\n"; Printf.printf " tex_name \"had_r^{(8)}\"\n"; Printf.printf "\n" let write_vertices model vertices = Printf.printf "# Vertices (for phasespace generation only)\n"; Printf.printf "# NB: particles should be sorted increasing in mass.\n"; Printf.printf "# This is NOT implemented yet!\n"; List.iter (fun v -> let particles = String.concat " " (List.map (fun s -> "\"" ^ (SMap.find s model.particles).Particle.name ^ "\"") (Array.to_list v.Vertex.particles)) in Printf.printf "vertex %s\n" particles) (values vertices); Printf.printf "\n" let write () = match !initialized with | None -> failwith "UFO.Whizard.write: UFO model not initialized" | Some { directory = dir; model = model } -> let input_parameters, derived_parameters = classify_parameters model in write_header dir; write_input_parameters input_parameters; write_derived_parameters derived_parameters; write_particles model.particles; if !include_hadrons then write_hadrons (); write_vertices model model.vertices; exit 0 end let options = Options.create [ ("UFO_dir", Arg.String (fun name -> ufo_directory := name), "UFO model directory (default: " ^ !ufo_directory ^ ")"); ("Majorana", Arg.Set use_majorana_spinors, "use Majorana spinors (must come _before_ exec!)"); ("divide_propagators_by_i", Arg.Set divide_propagators_by_i, "divide propagators by I (pre 2013 FeynRules convention)"); ("verbatim_Hg", Arg.Set verbatim_higgs_glue, "don't correct the color flows for effective Higgs Gluon couplings"); ("write_WHIZARD", Arg.Unit Whizard.write, "write the WHIZARD model file (required once per model)"); ("long_flavors", Arg.Unit (fun () -> Lookup.flavor_format := Lookup.Long), "write use the UFO flavor names instead of integers"); ("dump", Arg.Set dump_raw, "dump UFO model for debugging the parser (must come _before_ exec!)"); ("all_fusions", Arg.Set include_all_fusions, "include all fusions in the fortran module"); ("no_hadrons", Arg.Clear include_hadrons, "don't add any particle not in the UFO file"); ("add_hadrons", Arg.Set include_hadrons, "add protons and beam remants for WHIZARD"); ("exec", Arg.Unit load, "load the UFO model files (required _before_ using particles names)"); ("help", Arg.Unit (fun () -> prerr_endline "..."), "print information on the model")] end module type Fortran_Target = sig val fuse : - Algebra.QC.t -> string -> Coupling.lorentzn -> + Algebra.QC.t -> string -> + Coupling.lorentzn -> Coupling.fermion_lines -> string -> string list -> string list -> Coupling.fusen -> unit val lorentz_module : ?only:SSet.t -> ?name:string -> ?fortran_module:string -> Format_Fortran.formatter -> unit -> unit end module Targets = struct module Fortran : Fortran_Target = struct open Format_Fortran let fuse = UFO_targets.Fortran.fuse let lorentz_functions ff fusions () = List.iter (fun (name, s, l) -> UFO_targets.Fortran.lorentz ff name s l) fusions let propagator_functions ff propagators () = List.iter (fun (name, p) -> UFO_targets.Fortran.propagator ff name p.Propagator.spins p.Propagator.numerator p.Propagator.denominator) propagators let lorentz_module ?only ?(name="omega_amplitude_ufo") ?(fortran_module="omega95") ff () = let printf fmt = fprintf ff fmt and nl = pp_newline ff in printf "module %s" name; nl (); printf " use kinds"; nl (); printf " use %s" fortran_module; nl (); printf " implicit none"; nl (); printf " private"; nl (); let fusions = Model.fusions ?only () and propagators = Model.propagators () in List.iter (fun (name, _, _) -> printf " public :: %s" name; nl ()) fusions; List.iter (fun (name, _) -> printf " public :: pr_U_%s" name; nl ()) propagators; UFO_targets.Fortran.eps4_g4_g44_decl ff (); UFO_targets.Fortran.eps4_g4_g44_init ff (); printf "contains"; nl (); lorentz_functions ff fusions (); propagator_functions ff propagators (); printf "end module %s" name; nl (); pp_flush ff () end end module type Test = sig val suite : OUnit.test end module Test : Test = struct open OUnit let lexer s = UFO_lexer.token (UFO_lexer.init_position "" (Lexing.from_string s)) let suite_lexer_escapes = "escapes" >::: [ "single-quote" >:: (fun () -> assert_equal (UFO_parser.STRING "a'b'c") (lexer "'a\\'b\\'c'")); "unterminated" >:: (fun () -> assert_raises End_of_file (fun () -> lexer "'a\\'b\\'c")) ] let suite_lexer = "lexer" >::: [suite_lexer_escapes] let suite = "UFO" >::: [suite_lexer] end Index: trunk/omega/src/modellib_NoH.ml =================================================================== --- trunk/omega/src/modellib_NoH.ml (revision 8415) +++ trunk/omega/src/modellib_NoH.ml (revision 8416) @@ -1,2922 +1,2924 @@ (* modellib_NoH.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Marco Sekulla Fabian Bach (only parts of this file) WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Minimal Higgsless Model (Unitarity Gauge)} *) module type NoH_flags = sig val triple_anom : bool val quartic_anom : bool val k_matrix : bool val ckm_present : bool val top_anom : bool val top_anom_4f : bool end module NoH_k_matrix : NoH_flags = struct let triple_anom = false let quartic_anom = false let k_matrix = true let ckm_present = false let top_anom = false let top_anom_4f = false end (* \thocwmodulesection{Minimal Higgsless Model including unitarization} *) module NoH (Flags : NoH_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type f_aux_top = TTGG | TBWA | TBWZ | TTWW | BBWW | (*i top auxiliary field "flavors" *) QGUG | QBUB | QW | DL | DR | QUQD1L | QUQD1R | QUQD8L | QUQD8R type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | Aux_top of int*int*int*bool*f_aux_top (*i lorentz*color*charge*top-side*flavor *) type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib.NoH.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let rec aux_top_flavors (f,l,co,ch) = List.append ( List.map other [ Aux_top(l,co,ch/2,true,f); Aux_top(l,co,ch/2,false,f) ] ) ( if ch > 1 then List.append ( List.map other [ Aux_top(l,co,-ch/2,true,f); Aux_top(l,co,-ch/2,false,f) ] ) ( aux_top_flavors (f,l,co,(ch-2)) ) else [] ) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = List.append ( ThoList.flatmap snd (external_flavors ()) ) ( ThoList.flatmap aux_top_flavors [ (TTGG,2,1,1); (TBWA,2,0,2); (TBWZ,2,0,2); (TTWW,2,0,1); (BBWW,2,0,1); (QGUG,1,1,1); (QBUB,1,0,1); (QW,1,0,3); (DL,0,0,3); (DR,0,0,3); (QUQD1L,0,0,3); (QUQD1R,0,0,3); (QUQD8L,0,1,3); (QUQD8R,0,1,3) ] ) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz_aux = function | 2 -> Tensor_1 | 1 -> Vector | 0 -> Scalar | _ -> invalid_arg ("NoH.lorentz_aux: wrong value") let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> begin match f with | Aux_top (l,_,_,_,_) -> lorentz_aux l | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | O (Aux_top (_,co,_,_,_)) -> if co == 0 then Color.Singlet else Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let prop_aux = function | 2 -> Aux_Tensor_1 | 1 -> Aux_Vector | 0 -> Aux_Scalar | _ -> invalid_arg ("NoH.prop_aux: wrong value") let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | Aux_top (l,_,_,_,_) -> prop_aux l end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | Aux_top (l,co,ch,n,f) -> Aux_top (l,co,(-ch),(not n),f) end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("NoH.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | Phi0 -> 0//1 | Phip -> 1//1 | Phim -> -1//1 | Aux_top (_,_,ch,_,_) -> ch//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Half | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | I_G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_TVA_ttA | G_TVA_bbA | G_VLR_ttZ | G_TVA_ttZ | G_TVA_bbZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWZ | G_TRL_tbWZ | G_TLR_btWA | G_TRL_tbWA | G_TVA_ttWW | G_TVA_bbWW | G_TVA_ttG | G_TVA_ttGG | G_VLR_qGuG | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | C_quqd1R_bt | C_quqd1R_tb | C_quqd1L_bt | C_quqd1L_tb | C_quqd8R_bt | C_quqd8R_tb | C_quqd8L_bt | C_quqd8L_tb | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | I_G1_AWW | I_G1_ZWW | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_lambda_AWW | I_lambda_ZWW | G5_AWW | G5_ZWW | I_kappa5_AWW | I_kappa5_ZWW | I_lambda5_AWW | I_lambda5_ZWW | Alpha_WWWW0 | Alpha_ZZWW1 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZZZ | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T | Gs | I_Gs | G2 | Mass of flavor | Width of flavor | K_Matrix_Coeff of int | K_Matrix_Pole of int (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | Q_lepton | Q_up | Q_down | G_NC_lepton | G_NC_neutrino | G_NC_up | G_NC_down | G_CC | G_CCQ _ | I_Q_W | I_G_ZWW | I_G1_AWW | I_G1_ZWW | I_G_weak | Half | Unit | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_kappa5_AWW | I_kappa5_ZWW | G5_AWW | G5_ZWW | I_lambda_AWW | I_lambda_ZWW | I_lambda5_AWW | I_lambda5_ZWW | G_TVA_ttA | G_TVA_bbA | G_VLR_ttZ | G_TVA_ttZ | G_TVA_bbZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWA | G_TRL_tbWA | G_TLR_btWZ | G_TRL_tbWZ | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | G_TVA_ttWW | G_TVA_bbWW -> (0,1) | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | Alpha_WWWW0 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZWW1 | Alpha_ZZZZ | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T -> (0,2) | Gs | I_Gs | G_TVA_ttG | G_TVA_ttGG | G_VLR_qGuG | C_quqd1R_bt | C_quqd1R_tb | C_quqd1L_bt | C_quqd1L_tb | C_quqd8R_bt | C_quqd8R_tb | C_quqd8L_bt | C_quqd8L_tb -> (1,0) | G2 -> (2,0) (* These constants are not used, hence initialized to zero. *) | Sinthw | Sin2thw | Costhw | Pi | Alpha_QED | G_weak | K_Matrix_Coeff _ | K_Matrix_Pole _ | Mass _ | Width _ | Vev | E -> (0,0) (* \begin{dubious} The current abstract syntax for parameter dependencies is admittedly tedious. Later, there will be a parser for a convenient concrete syntax as a part of a concrete syntax for models. But as these examples show, it should include simple functions. \end{dubious} *) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} *) let input_parameters = [ Alpha_QED, 1. /. 137.0359895; Sin2thw, 0.23124; Mass (G Z), 91.187; Mass (M (N 1)), 0.0; Mass (M (L 1)), 0.51099907e-3; Mass (M (N 2)), 0.0; Mass (M (L 2)), 0.105658389; Mass (M (N 3)), 0.0; Mass (M (L 3)), 1.77705; Mass (M (U 1)), 5.0e-3; Mass (M (D 1)), 3.0e-3; Mass (M (U 2)), 1.2; Mass (M (D 2)), 0.1; Mass (M (U 3)), 174.0; Mass (M (D 3)), 4.2 ] (* \begin{subequations} \begin{align} e &= \sqrt{4\pi\alpha} \\ \sin\theta_w &= \sqrt{\sin^2\theta_w} \\ \cos\theta_w &= \sqrt{1-\sin^2\theta_w} \\ g &= \frac{e}{\sin\theta_w} \\ m_W &= \cos\theta_w m_Z \\ v &= \frac{2m_W}{g} \\ g_{CC} = -\frac{g}{2\sqrt2} &= -\frac{e}{2\sqrt2\sin\theta_w} \\ Q_{\text{lepton}} = -q_{\text{lepton}}e &= e \\ Q_{\text{up}} = -q_{\text{up}}e &= -\frac{2}{3}e \\ Q_{\text{down}} = -q_{\text{down}}e &= \frac{1}{3}e \\ \ii q_We = \ii g_{\gamma WW} &= \ii e \\ \ii g_{ZWW} &= \ii g \cos\theta_w \\ \ii g_{WWW} &= \ii g \end{align} \end{subequations} *) let derived_parameters = [ Real E, Sqrt (Prod [Integer 4; Atom Pi; Atom Alpha_QED]); Real Sinthw, Sqrt (Atom Sin2thw); Real Costhw, Sqrt (Diff (Integer 1, Atom Sin2thw)); Real G_weak, Quot (Atom E, Atom Sinthw); Real (Mass (G Wp)), Prod [Atom Costhw; Atom (Mass (G Z))]; Real Vev, Quot (Prod [Integer 2; Atom (Mass (G Wp))], Atom G_weak); Real Q_lepton, Atom E; Real Q_up, Prod [Quot (Integer (-2), Integer 3); Atom E]; Real Q_down, Prod [Quot (Integer 1, Integer 3); Atom E]; Real G_CC, Neg (Quot (Atom G_weak, Prod [Integer 2; Sqrt (Integer 2)])); Complex I_Q_W, Prod [I; Atom E]; Complex I_G_weak, Prod [I; Atom G_weak]; Complex I_G_ZWW, Prod [I; Atom G_weak; Atom Costhw] ] (* \begin{equation} - \frac{g}{2\cos\theta_w} \end{equation} *) let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) (* \begin{subequations} \begin{align} - \frac{g}{2\cos\theta_w} g_V &= - \frac{g}{2\cos\theta_w} (T_3 - 2 q \sin^2\theta_w) \\ - \frac{g}{2\cos\theta_w} g_A &= - \frac{g}{2\cos\theta_w} T_3 \end{align} \end{subequations} *) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents' n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents'' n = List.map mgm [ ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents_triv = ThoList.flatmap charged_currents' [1;2;3] @ ThoList.flatmap charged_currents'' [1;2;3] let charged_currents_ckm = let charged_currents_2 n1 n2 = List.map mgm [ ((D (-n1), Wm, U n2), FBF (1, Psibar, VL, Psi), G_CCQ (n2,n1)); ((U (-n1), Wp, D n2), FBF (1, Psibar, VL, Psi), G_CCQ (n1,n2)) ] in ThoList.flatmap charged_currents' [1;2;3] @ List.flatten (Product.list2 charged_currents_2 [1;2;3] [1;2;3]) (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] (* \begin{multline} \mathcal{L}_{\textrm{TGC}}(g_1,\kappa) = g_1 \mathcal{L}_T(V,W^+,W^-) \\ + \frac{\kappa+g_1}{2} \Bigl(\mathcal{L}_T(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr)\\ + \frac{\kappa-g_1}{2} \Bigl(\mathcal{L}_L(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr) \end{multline} *) (* \begin{dubious} The whole thing in the LEP2 workshop notation: \begin{multline} \ii\mathcal{L}_{\textrm{TGC},V} / g_{WWV} = \\ g_1^V V^\mu (W^-_{\mu\nu}W^{+,\nu}-W^+_{\mu\nu}W^{-,\nu}) + \kappa_V W^+_\mu W^-_\nu V^{\mu\nu} + \frac{\lambda_V}{m_W^2} V_{\mu\nu} W^-_{\rho\mu} W^{+,\hphantom{\nu}\rho}_{\hphantom{+,}\nu} \\ + \ii g_5^V \epsilon_{\mu\nu\rho\sigma} \left( (\partial^\rho W^{-,\mu}) W^{+,\nu} - W^{-,\mu}(\partial^\rho W^{+,\nu}) \right) V^\sigma \\ + \ii g_4^V W^-_\mu W^+_\nu (\partial^\mu V^\nu + \partial^\nu V^\mu) - \frac{\tilde\kappa_V}{2} W^-_\mu W^+_\nu \epsilon^{\mu\nu\rho\sigma} V_{\rho\sigma} - \frac{\tilde\lambda_V}{2m_W^2} W^-_{\rho\mu} W^{+,\mu}_{\hphantom{+,\mu}\nu} \epsilon^{\nu\rho\alpha\beta} V_{\alpha\beta} \end{multline} using the conventions of Itzykson and Zuber with $\epsilon^{0123} = +1$. \end{dubious} *) (* \begin{dubious} This is equivalent to the notation of Hagiwara et al.~\cite{HPZH87}, if we remember that they have opposite signs for~$g_{WWV}$: \begin{multline} \mathcal{L}_{WWV} / (-g_{WWV}) = \\ \ii g_1^V \left( W^\dagger_{\mu\nu} W^\mu - W^\dagger_\mu W^\mu_{\hphantom{\mu}\nu} \right) V^\nu + \ii \kappa_V W^\dagger_\mu W_\nu V^{\mu\nu} + \ii \frac{\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} V^{\nu\lambda} \\ - g_4^V W^\dagger_\mu W_\nu \left(\partial^\mu V^\nu + \partial^\nu V^\mu \right) + g_5^V \epsilon^{\mu\nu\lambda\sigma} \left( W^\dagger_\mu \stackrel{\leftrightarrow}{\partial_\lambda} W_\nu \right) V_\sigma\\ + \ii \tilde\kappa_V W^\dagger_\mu W_\nu \tilde{V}^{\mu\nu} + \ii\frac{\tilde\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} \tilde{V}^{\nu\lambda} \end{multline} Here $V^\mu$ stands for either the photon or the~$Z$ field, $W^\mu$ is the $W^-$ field, $W_{\mu\nu} = \partial_\mu W_\nu - \partial_\nu W_\mu$, $V_{\mu\nu} = \partial_\mu V_\nu - \partial_\nu V_\mu$, and $\tilde{V}_{\mu\nu} = \frac{1}{2} \epsilon_{\mu\nu\lambda\sigma} V^{\lambda\sigma}$. \end{dubious} *) let anomalous_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_ZWW) ] let triple_gauge = if Flags.triple_anom then anomalous_triple_gauge else standard_triple_gauge (* \begin{equation} \mathcal{L}_{\textrm{QGC}} = - g^2 W_{+,\mu} W_{-,\nu} W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Actually, quartic gauge couplings are a little bit more straightforward using auxiliary fields. Here we have to impose the antisymmetry manually: \begin{subequations} \begin{multline} (W^{+,\mu}_1 W^{-,\nu}_2 - W^{+,\nu}_1 W^{-,\mu}_2) (W^+_{3,\mu} W^-_{4,\nu} - W^+_{3,\nu} W^-_{4,\mu}) \\ = 2(W^+_1W^+_3)(W^-_2W^-_4) - 2(W^+_1W^-_4)(W^-_2W^+_3) \end{multline} also ($V$ can be $A$ or $Z$) \begin{multline} (W^{+,\mu}_1 V^\nu_2 - W^{+,\nu}_1 V^\mu_2) (W^-_{3,\mu} V_{4,\nu} - W^-_{3,\nu} V_{4,\mu}) \\ = 2(W^+_1W^-_3)(V_2V_4) - 2(W^+_1V_4)(V_2W^-_3) \end{multline} \end{subequations} *) (* \begin{subequations} \begin{multline} W^{+,\mu} W^{-,\nu} W^+_\mu W^-_\nu \end{multline} \end{subequations} *) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] (* \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \left( \frac{g^4}{2}\left( (W^+_\mu W^{-,\mu})^2 + W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} \right)\right.\notag \\ &\qquad\qquad\qquad \left. + \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \\ \mathcal{L}_5 &= \alpha_5 \left( g^4 (W^+_\mu W^{-,\mu})^2 + \frac{g^4}{\cos^2\theta_w} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \end{align} \end{subequations} or \begin{multline} \mathcal{L}_4 + \mathcal{L}_5 = (\alpha_4+2\alpha_5) g^4 \frac{1}{2} (W^+_\mu W^{-,\mu})^2 \\ + 2\alpha_4 g^4 \frac{1}{4} W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} + \alpha_4 \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu \\ + 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \frac{1}{2} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \frac{1}{8} (Z_\mu Z^\mu)^2 \end{multline} and therefore \begin{subequations} \begin{align} \alpha_{(WW)_0} &= (\alpha_4+2\alpha_5) g^4 \\ \alpha_{(WW)_2} &= 2\alpha_4 g^4 \\ \alpha_{(WZ)_0} &= 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{(WZ)_1} &= \alpha_4 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{ZZ} &= (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \end{align} \end{subequations} *) let anomalous_quartic_gauge = if Flags.quartic_anom then List.map qgc [ ((Wm, Wm, Wp, Wp), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4 [1, C_12_34], Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4 [1, C_12_34], Alpha_ZZWW0); ((Wm, Wp, Z, Z), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4 [(1, C_12_34); (1, C_13_42); (1, C_14_23)], Alpha_ZZZZ) ] else [] (* In any diagonal channel~$\chi$, the scattering amplitude~$a_\chi(s)$ is unitary iff\footnote{% Trivial proof: \begin{equation} -1 = \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = \frac{\textrm{Im}(a_\chi^*(s))}{ |a_\chi(s)|^2 } = - \frac{\textrm{Im}(a_\chi(s))}{ |a_\chi(s)|^2 } \end{equation} i.\,e.~$\textrm{Im}(a_\chi(s)) = |a_\chi(s)|^2$.} \begin{equation} \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = -1 \end{equation} For a real perturbative scattering amplitude~$r_\chi(s)$ this can be enforced easily--and arbitrarily--by \begin{equation} \frac{1}{a_\chi(s)} = \frac{1}{r_\chi(s)} - \mathrm{i} \end{equation} *) let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_WWWW2_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZWW0_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_14_23)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_13_42); (1, C_12_34)]), D_Alpha_ZZZZ_T)] else [] (*i Thorsten's original implementation of the K matrix, which we keep since it still might be usefull for the future. let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 2, K_Matrix_Pole 2]), Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4_K_Matrix_tho (0, [(K_Matrix_Coeff 0, K_Matrix_Pole 0); (K_Matrix_Coeff 2, K_Matrix_Pole 2)]), Alpha_ZZWW0); ((Wm, Z, Wp, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 1, K_Matrix_Pole 1]), Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_ZZZZ) ] else [] i*) let quartic_gauge = standard_quartic_gauge @ anomalous_quartic_gauge @ k_matrix_quartic_gauge (* WK's couplings (apparently, he still intends to divide by $\Lambda^2_{\text{EWSB}}=16\pi^2v_{\mathrm{F}}^2$): \begin{subequations} \begin{align} \mathcal{L}^{\tau}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V^{\mu} \right\rbrack^2 \\ \mathcal{L}^{\tau}_5 &= \left\lbrack (\partial_{\mu}H)(\partial_{\nu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V_{\nu} \right\rbrack^2 \end{align} \end{subequations} with \begin{equation} V_{\mu} V_{\nu} = \frac{1}{2} \left( W^+_{\mu} W^-_{\nu} + W^+_{\nu} W^-_{\mu} \right) + \frac{1}{2\cos^2\theta_{w}} Z_{\mu} Z_{\nu} \end{equation} (note the symmetrization!), i.\,e. \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V_{\nu})^2 \\ \mathcal{L}_5 &= \alpha_5 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V^{\mu})^2 \end{align} \end{subequations} *) let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] (* Anomalous trilinear interactions $f_i f_j V$ : \begin{equation} \Delta\mathcal{L}_{tt\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{t} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) t A_\mu \end{equation} *) let anomalous_ttA = if Flags.top_anom then [ ((M (U (-3)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bb\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{b} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) b A_\mu \end{equation} *) let anomalous_bbA = if Flags.top_anom then [ ((M (D (-3)), G Ga, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttg} = - g_s \frac{\upsilon}{\Lambda^2} \bar{t}\lambda^a i\sigma^{\mu\nu}k_\nu (d_V(k^2)+id_A(k^2)\gamma_5)tG^a_\mu \end{equation} *) let anomalous_ttG = if Flags.top_anom then [ ((M (U (-3)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttG) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{t} \fmslash{Z} (X_L(k^2) P_L + X_R(k^2) P_R) t + \bar{t}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)tZ_\mu\right\rbrack \end{equation} *) let anomalous_ttZ = if Flags.top_anom then [ ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_ttZ); ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2} \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)bZ_\mu \end{equation} *) let anomalous_bbZ = if Flags.top_anom then [ ((M (D (-3)), G Z, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbW} = - \frac{g}{\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\fmslash{W}^-(V_L(k^2) P_L+V_R(k^2) P_R) t + \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)tW^-_\mu\right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbW = if Flags.top_anom then [ ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tbW); ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, TLRM, Psi), G_TLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, TRLM, Psi), G_TRL_tbW) ] else [] (* quartic fermion-gauge interactions $f_i f_j V_1 V_2$ emerging from gauge-invariant effective operators: \begin{equation} \Delta\mathcal{L}_{ttgg} = - \frac{g_s^2}{2} f_{abc} \frac{\upsilon}{\Lambda^2} \bar{t} \lambda^a \sigma^{\mu\nu} (d_V(k^2)+id_A(k^2)\gamma_5)t G^b_\mu G^c_\nu \end{equation} *) let anomalous_ttGG = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,1,0,true,TTGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttGG); ((O (Aux_top (2,1,0,false,TTGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWA} = - i\sin\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t A_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWA = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWA)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWA); ((O (Aux_top (2,0,1,false,TBWA)), G Ga, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWA)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWA); ((O (Aux_top (2,0,-1,false,TBWA)), G Wp, G Ga), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWZ} = - i\cos\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t Z_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWZ = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWZ)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWZ); ((O (Aux_top (2,0,1,false,TBWZ)), G Z, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWZ)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWZ); ((O (Aux_top (2,0,-1,false,TBWZ)), G Wp, G Z), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{t} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)t W^-_\mu W^+_\nu \end{equation} *) let anomalous_ttWW = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,0,0,true,TTWW)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttWW); ((O (Aux_top (2,0,0,false,TTWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{b} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)b W^-_\mu W^+_\nu \end{equation} *) let anomalous_bbWW = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,0,true,BBWW)), M (D 3)), FBF (1, Psibar, TVA, Psi), G_TVA_bbWW); ((O (Aux_top (2,0,0,false,BBWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* 4-fermion contact terms emerging from operator rewriting: *) let anomalous_top_qGuG_tt = [ ((M (U (-3)), O (Aux_top (1,1,0,true,QGUG)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qGuG) ] let anomalous_top_qGuG_ff n = List.map mom [ ((U (-n), Aux_top (1,1,0,false,QGUG), U n), FBF (1, Psibar, V, Psi), Unit); ((D (-n), Aux_top (1,1,0,false,QGUG), D n), FBF (1, Psibar, V, Psi), Unit) ] let anomalous_top_qGuG = if Flags.top_anom_4f then anomalous_top_qGuG_tt @ ThoList.flatmap anomalous_top_qGuG_ff [1;2;3] else [] let anomalous_top_qBuB_tt = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QBUB)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB) ] let anomalous_top_qBuB_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QBUB), U n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_u); ((D (-n), Aux_top (1,0,0,false,QBUB), D n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_d); ((L (-n), Aux_top (1,0,0,false,QBUB), L n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_e); ((N (-n), Aux_top (1,0,0,false,QBUB), N n), FBF (1, Psibar, VL, Psi), G_VL_qBuB_n) ] let anomalous_top_qBuB = if Flags.top_anom_4f then anomalous_top_qBuB_tt @ ThoList.flatmap anomalous_top_qBuB_ff [1;2;3] else [] let anomalous_top_qW_tq = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (D (-3)), O (Aux_top (1,0,-1,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (U (-3)), O (Aux_top (1,0,1,true,QW)), M (D 3)), FBF (1, Psibar, VL, Psi), G_VL_qW) ] let anomalous_top_qW_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QW), U n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((D (-n), Aux_top (1,0,0,false,QW), D n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((N (-n), Aux_top (1,0,0,false,QW), N n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((L (-n), Aux_top (1,0,0,false,QW), L n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((D (-n), Aux_top (1,0,-1,false,QW), U n), FBF (1, Psibar, VL, Psi), Half); ((U (-n), Aux_top (1,0,1,false,QW), D n), FBF (1, Psibar, VL, Psi), Half); ((L (-n), Aux_top (1,0,-1,false,QW), N n), FBF (1, Psibar, VL, Psi), Half); ((N (-n), Aux_top (1,0,1,false,QW), L n), FBF (1, Psibar, VL, Psi), Half) ] let anomalous_top_qW = if Flags.top_anom_4f then anomalous_top_qW_tq @ ThoList.flatmap anomalous_top_qW_ff [1;2;3] else [] let anomalous_top_DuDd = if Flags.top_anom_4f then [ ((M (U (-3)), O (Aux_top (0,0,0,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,0,false,DR)), M (U 3)), FBF (1, Psibar, SL, Psi), G_SL_DttR); ((M (D (-3)), O (Aux_top (0,0,0,false,DR)), M (D 3)), FBF (1, Psibar, SR, Psi), G_SR_DttR); ((M (U (-3)), O (Aux_top (0,0,0,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (D (-3)), O (Aux_top (0,0,0,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DttL); ((M (D (-3)), O (Aux_top (0,0,-1,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DR)), M (D 3)), FBF (1, Psibar, SLR, Psi), G_SLR_DbtR); ((M (D (-3)), O (Aux_top (0,0,-1,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DbtL) ] else [] let anomalous_top_quqd1_tq = [ ((M (D (-3)), O (Aux_top (0,0,-1,true,QUQD1R)), M (U 3)), FBF (1, Psibar, SR, Psi), C_quqd1R_bt); ((M (U (-3)), O (Aux_top (0,0, 1,true,QUQD1R)), M (D 3)), FBF (1, Psibar, SL, Psi), C_quqd1R_tb); ((M (D (-3)), O (Aux_top (0,0,-1,true,QUQD1L)), M (U 3)), FBF (1, Psibar, SL, Psi), C_quqd1L_bt); ((M (U (-3)), O (Aux_top (0,0, 1,true,QUQD1L)), M (D 3)), FBF (1, Psibar, SR, Psi), C_quqd1L_tb) ] let anomalous_top_quqd1_ff n = List.map mom [ ((U (-n), Aux_top (0,0, 1,false,QUQD1R), D n), FBF (1, Psibar, SR, Psi), Half); ((D (-n), Aux_top (0,0,-1,false,QUQD1R), U n), FBF (1, Psibar, SL, Psi), Half); ((U (-n), Aux_top (0,0, 1,false,QUQD1L), D n), FBF (1, Psibar, SL, Psi), Half); ((D (-n), Aux_top (0,0,-1,false,QUQD1L), U n), FBF (1, Psibar, SR, Psi), Half) ] let anomalous_top_quqd1 = if Flags.top_anom_4f then anomalous_top_quqd1_tq @ ThoList.flatmap anomalous_top_quqd1_ff [1;2;3] else [] let anomalous_top_quqd8_tq = [ ((M (D (-3)), O (Aux_top (0,1,-1,true,QUQD8R)), M (U 3)), FBF (1, Psibar, SR, Psi), C_quqd8R_bt); ((M (U (-3)), O (Aux_top (0,1, 1,true,QUQD8R)), M (D 3)), FBF (1, Psibar, SL, Psi), C_quqd8R_tb); ((M (D (-3)), O (Aux_top (0,1,-1,true,QUQD8L)), M (U 3)), FBF (1, Psibar, SL, Psi), C_quqd8L_bt); ((M (U (-3)), O (Aux_top (0,1, 1,true,QUQD8L)), M (D 3)), FBF (1, Psibar, SR, Psi), C_quqd8L_tb) ] let anomalous_top_quqd8_ff n = List.map mom [ ((U (-n), Aux_top (0,1, 1,false,QUQD8R), D n), FBF (1, Psibar, SR, Psi), Half); ((D (-n), Aux_top (0,1,-1,false,QUQD8R), U n), FBF (1, Psibar, SL, Psi), Half); ((U (-n), Aux_top (0,1, 1,false,QUQD8L), D n), FBF (1, Psibar, SL, Psi), Half); ((D (-n), Aux_top (0,1,-1,false,QUQD8L), U n), FBF (1, Psibar, SR, Psi), Half) ] let anomalous_top_quqd8 = if Flags.top_anom_4f then anomalous_top_quqd8_tq @ ThoList.flatmap anomalous_top_quqd8_ff [1;2;3] else [] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ (if Flags.ckm_present then charged_currents_ckm else charged_currents_triv) @ triple_gauge @ goldstone_vertices @ anomalous_ttA @ anomalous_bbA @ anomalous_ttZ @ anomalous_bbZ @ anomalous_tbW @ anomalous_tbWA @ anomalous_tbWZ @ anomalous_ttWW @ anomalous_bbWW @ anomalous_ttG @ anomalous_ttGG @ anomalous_top_qGuG @ anomalous_top_qBuB @ anomalous_top_qW @ anomalous_top_DuDd @ anomalous_top_quqd1 @ anomalous_top_quqd8) let vertices4 = quartic_gauge let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "Aux_t_ttGG0" -> O (Aux_top (2,1, 0,true,TTGG)) | "Aux_ttGG0" -> O (Aux_top (2,1, 0,false,TTGG)) | "Aux_t_tbWA+" -> O (Aux_top (2,0, 1,true,TBWA)) | "Aux_tbWA+" -> O (Aux_top (2,0, 1,false,TBWA)) | "Aux_t_tbWA-" -> O (Aux_top (2,0,-1,true,TBWA)) | "Aux_tbWA-" -> O (Aux_top (2,0,-1,false,TBWA)) | "Aux_t_tbWZ+" -> O (Aux_top (2,0, 1,true,TBWZ)) | "Aux_tbWZ+" -> O (Aux_top (2,0, 1,false,TBWZ)) | "Aux_t_tbWZ-" -> O (Aux_top (2,0,-1,true,TBWZ)) | "Aux_tbWZ-" -> O (Aux_top (2,0,-1,false,TBWZ)) | "Aux_t_ttWW0" -> O (Aux_top (2,0, 0,true,TTWW)) | "Aux_ttWW0" -> O (Aux_top (2,0, 0,false,TTWW)) | "Aux_t_bbWW0" -> O (Aux_top (2,0, 0,true,BBWW)) | "Aux_bbWW0" -> O (Aux_top (2,0, 0,false,BBWW)) | "Aux_t_qGuG0" -> O (Aux_top (1,1, 0,true,QGUG)) | "Aux_qGuG0" -> O (Aux_top (1,1, 0,false,QGUG)) | "Aux_t_qBuB0" -> O (Aux_top (1,0, 0,true,QBUB)) | "Aux_qBuB0" -> O (Aux_top (1,0, 0,false,QBUB)) | "Aux_t_qW0" -> O (Aux_top (1,0, 0,true,QW)) | "Aux_qW0" -> O (Aux_top (1,0, 0,false,QW)) | "Aux_t_qW+" -> O (Aux_top (1,0, 1,true,QW)) | "Aux_qW+" -> O (Aux_top (1,0, 1,false,QW)) | "Aux_t_qW-" -> O (Aux_top (1,0,-1,true,QW)) | "Aux_qW-" -> O (Aux_top (1,0,-1,false,QW)) | "Aux_t_dL0" -> O (Aux_top (0,0, 0,true,DL)) | "Aux_dL0" -> O (Aux_top (0,0, 0,false,DL)) | "Aux_t_dL+" -> O (Aux_top (0,0, 1,true,DL)) | "Aux_dL+" -> O (Aux_top (0,0, 1,false,DL)) | "Aux_t_dL-" -> O (Aux_top (0,0,-1,true,DL)) | "Aux_dL-" -> O (Aux_top (0,0,-1,false,DL)) | "Aux_t_dR0" -> O (Aux_top (0,0, 0,true,DR)) | "Aux_dR0" -> O (Aux_top (0,0, 0,false,DR)) | "Aux_t_dR+" -> O (Aux_top (0,0, 1,true,DR)) | "Aux_dR+" -> O (Aux_top (0,0, 1,false,DR)) | "Aux_t_dR-" -> O (Aux_top (0,0,-1,true,DR)) | "Aux_dR-" -> O (Aux_top (0,0,-1,false,DR)) | "Aux_t_quqd1L+" -> O (Aux_top (0,0, 1,true,QUQD1L)) | "Aux_quqd1L+" -> O (Aux_top (0,0, 1,false,QUQD1L)) | "Aux_t_quqd1L-" -> O (Aux_top (0,0,-1,true,QUQD1L)) | "Aux_quqd1L-" -> O (Aux_top (0,0,-1,false,QUQD1L)) | "Aux_t_quqd1R+" -> O (Aux_top (0,0, 1,true,QUQD1R)) | "Aux_quqd1R+" -> O (Aux_top (0,0, 1,false,QUQD1R)) | "Aux_t_quqd1R-" -> O (Aux_top (0,0,-1,true,QUQD1R)) | "Aux_quqd1R-" -> O (Aux_top (0,0,-1,false,QUQD1R)) | "Aux_t_quqd8L+" -> O (Aux_top (0,1, 1,true,QUQD8L)) | "Aux_quqd8L+" -> O (Aux_top (0,1, 1,false,QUQD8L)) | "Aux_t_quqd8L-" -> O (Aux_top (0,1,-1,true,QUQD8L)) | "Aux_quqd8L-" -> O (Aux_top (0,1,-1,false,QUQD8L)) | "Aux_t_quqd8R+" -> O (Aux_top (0,1, 1,true,QUQD8R)) | "Aux_quqd8R+" -> O (Aux_top (0,1, 1,false,QUQD8R)) | "Aux_t_quqd8R-" -> O (Aux_top (0,1,-1,true,QUQD8R)) | "Aux_quqd8R-" -> O (Aux_top (0,1,-1,false,QUQD8R)) | _ -> invalid_arg "Modellib.NoH.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib.NoH.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib.NoH.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib.NoH.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib.NoH.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "gl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | Aux_top (_,_,ch,n,v) -> "Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" | QUQD1L -> "quqd1L" | QUQD1R -> "quqd1R" | QUQD8L -> "quqd8L" | QUQD8R -> "quqd8R" end ) ^ ( if ch > 0 then "+" else if ch < 0 then "-" else "0" ) end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib.NoH.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib.NoH.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib.NoH.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib.NoH.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | Aux_top (_,_,ch,n,v) -> "\\textnormal{Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" | QUQD1L -> "quqd1L" | QUQD1R -> "quqd1R" | QUQD8L -> "quqd8L" | QUQD8R -> "quqd8R" end ) ^ ( if ch > 0 then "^+" else if ch < 0 then "^-" else "^0" ) ^ "}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | Aux_top (_,_,ch,n,v) -> "aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttgg" | TBWA -> "tbwa" | TBWZ -> "tbwz" | TTWW -> "ttww" | BBWW -> "bbww" | QGUG -> "qgug" | QBUB -> "qbub" | QW -> "qw" | DL -> "dl" | DR -> "dr" | QUQD1L -> "quqd1l" | QUQD1R -> "quqd1r" | QUQD8L -> "quqd8l" | QUQD8R -> "quqd8r" end ) ^ "_" ^ ( if ch > 0 then "p" else if ch < 0 then "m" else "0" ) end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | Aux_top (_,_,ch,t,f) -> let n = begin match f with | QW -> 0 | QUQD1R -> 1 | QUQD1L -> 2 | QUQD8R -> 3 | QUQD8L -> 4 | _ -> 5 end in (602 + 3*n - ch) * ( if t then (1) else (-1) ) end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Half -> "half" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | I_G_weak -> "ig" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_TVA_ttA -> "gtva_tta" | G_TVA_bbA -> "gtva_bba" | G_VLR_ttZ -> "gvlr_ttz" | G_TVA_ttZ -> "gtva_ttz" | G_TVA_bbZ -> "gtva_bbz" | G_VLR_btW -> "gvlr_btw" | G_VLR_tbW -> "gvlr_tbw" | G_TLR_btW -> "gtlr_btw" | G_TRL_tbW -> "gtrl_tbw" | G_TLR_btWA -> "gtlr_btwa" | G_TRL_tbWA -> "gtrl_tbwa" | G_TLR_btWZ -> "gtlr_btwz" | G_TRL_tbWZ -> "gtrl_tbwz" | G_TVA_ttWW -> "gtva_ttww" | G_TVA_bbWW -> "gtva_bbww" | G_TVA_ttG -> "gtva_ttg" | G_TVA_ttGG -> "gtva_ttgg" | G_VLR_qGuG -> "gvlr_qgug" | G_VLR_qBuB -> "gvlr_qbub" | G_VLR_qBuB_u -> "gvlr_qbub_u" | G_VLR_qBuB_d -> "gvlr_qbub_d" | G_VLR_qBuB_e -> "gvlr_qbub_e" | G_VL_qBuB_n -> "gvl_qbub_n" | G_VL_qW -> "gvl_qw" | G_VL_qW_u -> "gvl_qw_u" | G_VL_qW_d -> "gvl_qw_d" | G_SL_DttR -> "gsl_dttr" | G_SR_DttR -> "gsr_dttr" | G_SL_DttL -> "gsl_dttl" | G_SLR_DbtR -> "gslr_dbtr" | G_SL_DbtL -> "gsl_dbtl" | C_quqd1R_bt -> "c_quqd1_1" | C_quqd1R_tb -> "conjg(c_quqd1_1)" | C_quqd1L_bt -> "conjg(c_quqd1_2)" | C_quqd1L_tb -> "c_quqd1_2" | C_quqd8R_bt -> "c_quqd8_1" | C_quqd8R_tb -> "conjg(c_quqd8_1)" | C_quqd8L_bt -> "conjg(c_quqd8_2)" | C_quqd8L_tb -> "c_quqd8_2" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | I_G1_AWW -> "ig1a" | I_G1_ZWW -> "ig1z" | I_G1_plus_kappa_plus_G4_AWW -> "ig1pkpg4a" | I_G1_plus_kappa_plus_G4_ZWW -> "ig1pkpg4z" | I_G1_plus_kappa_minus_G4_AWW -> "ig1pkmg4a" | I_G1_plus_kappa_minus_G4_ZWW -> "ig1pkmg4z" | I_G1_minus_kappa_plus_G4_AWW -> "ig1mkpg4a" | I_G1_minus_kappa_plus_G4_ZWW -> "ig1mkpg4z" | I_G1_minus_kappa_minus_G4_AWW -> "ig1mkmg4a" | I_G1_minus_kappa_minus_G4_ZWW -> "ig1mkmg4z" | I_lambda_AWW -> "ila" | I_lambda_ZWW -> "ilz" | G5_AWW -> "rg5a" | G5_ZWW -> "rg5z" | I_kappa5_AWW -> "ik5a" | I_kappa5_ZWW -> "ik5z" | I_lambda5_AWW -> "il5a" | I_lambda5_ZWW -> "il5z" | Alpha_WWWW0 -> "alww0" | Alpha_WWWW2 -> "alww2" | Alpha_ZZWW0 -> "alzw0" | Alpha_ZZWW1 -> "alzw1" | Alpha_ZZZZ -> "alzz" | D_Alpha_ZZWW0_S -> "dalzz0_s(gkm,mkm," | D_Alpha_ZZWW0_T -> "dalzz0_t(gkm,mkm," | D_Alpha_ZZWW1_S -> "dalzz1_s(gkm,mkm," | D_Alpha_ZZWW1_T -> "dalzz1_t(gkm,mkm," | D_Alpha_ZZWW1_U -> "dalzz1_u(gkm,mkm," | D_Alpha_WWWW0_S -> "dalww0_s(gkm,mkm," | D_Alpha_WWWW0_T -> "dalww0_t(gkm,mkm," | D_Alpha_WWWW0_U -> "dalww0_u(gkm,mkm," | D_Alpha_WWWW2_S -> "dalww2_s(gkm,mkm," | D_Alpha_WWWW2_T -> "dalww2_t(gkm,mkm," | D_Alpha_ZZZZ_S -> "dalz4_s(gkm,mkm," | D_Alpha_ZZZZ_T -> "dalz4_t(gkm,mkm," | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f | K_Matrix_Coeff i -> "kc" ^ string_of_int i | K_Matrix_Pole i -> "kp" ^ string_of_int i end (* \thocwmodulesection{Minimal Higgsless Model including additional Resonances} *) module AltH (Flags : NoH_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"] + let caveats () = [] type f_aux_top = TTGG | TBWA | TBWZ | TTWW | BBWW | (*i top auxiliary field "flavors" *) QGUG | QBUB | QW | DL | DR type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | Rsigma | Rphin | Rphip | Rphim | Rphipp | Rphimm | Rf | Rtn | Rtp | Rtm | Rtpp | Rtmm | Aux_top of int*int*int*bool*f_aux_top (*i lorentz*color*charge*top-side*flavor *) type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_NoH.AltH.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let rec aux_top_flavors (f,l,co,ch) = List.append ( List.map other [ Aux_top(l,co,ch/2,true,f); Aux_top(l,co,ch/2,false,f) ] ) ( if ch > 1 then List.append ( List.map other [ Aux_top(l,co,-ch/2,true,f); Aux_top(l,co,-ch/2,false,f) ] ) ( aux_top_flavors (f,l,co,(ch-2)) ) else [] ) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Scalar Resonances", List.map other [Rsigma; Rphin; Rphip; Rphim; Rphipp; Rphimm]; "Tensor Resonances", List.map other [Rf; Rtn; Rtp; Rtm; Rtpp; Rtmm]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = List.append ( ThoList.flatmap snd (external_flavors ()) ) ( ThoList.flatmap aux_top_flavors [ (TTGG,2,1,1); (TBWA,2,0,2); (TBWZ,2,0,2); (TTWW,2,0,1); (BBWW,2,0,1); (QGUG,1,1,1); (QBUB,1,0,1); (QW,1,0,3); (DL,0,0,3); (DR,0,0,3) ] ) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz_aux = function | 2 -> Tensor_1 | 1 -> Vector | 0 -> Scalar | _ -> invalid_arg ("SM.lorentz_aux: wrong value") let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> begin match f with | Aux_top (l,_,_,_,_) -> lorentz_aux l | Rf | Rtn | Rtp | Rtm | Rtpp | Rtmm -> Tensor_2 | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | O (Aux_top (_,co,_,_,_)) -> if co == 0 then Color.Singlet else Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let prop_aux = function | 2 -> Aux_Tensor_1 | 1 -> Aux_Vector | 0 -> Aux_Scalar | _ -> invalid_arg ("SM.prop_aux: wrong value") let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | Rsigma -> Prop_Scalar | Rphin | Rphip | Rphim | Rphipp | Rphimm -> Prop_Scalar | Rf -> Prop_Tensor_2 | Rtn | Rtp | Rtm | Rtpp | Rtmm -> Prop_Tensor_2 | Aux_top (l,_,_,_,_) -> prop_aux l end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | Rsigma -> Rsigma | Rphin -> Rphin | Rphip -> Rphim | Rphim -> Rphip | Rphipp -> Rphimm | Rphimm -> Rphipp | Rf -> Rf | Rtn -> Rtn | Rtp -> Rtm | Rtm -> Rtp | Rtpp -> Rtmm | Rtmm -> Rtpp | Aux_top (l,co,ch,n,f) -> Aux_top (l,co,(-ch),(not n),f) end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | Rsigma | Phi0 | Rphin | Rf | Rtn -> 0//1 | Phip | Rphip | Rtp -> 1//1 | Phim | Rphim | Rtm -> -1//1 | Rphipp | Rtpp -> 2//1 | Rphimm | Rtmm -> -2//1 | Aux_top (_,_,ch,_,_) -> ch//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Half | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | I_G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_TVA_ttA | G_TVA_bbA | G_VLR_ttZ | G_TVA_ttZ | G_TVA_bbZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWZ | G_TRL_tbWZ | G_TLR_btWA | G_TRL_tbWA | G_TVA_ttWW | G_TVA_bbWW | G_TVA_ttG | G_TVA_ttGG | G_VLR_qGuG | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | I_G1_AWW | I_G1_ZWW | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_lambda_AWW | I_lambda_ZWW | G5_AWW | G5_ZWW | I_kappa5_AWW | I_kappa5_ZWW | I_lambda5_AWW | I_lambda5_ZWW | Alpha_WWWW0 | Alpha_ZZWW1 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZZZ | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T | G_SWW | G_SWW_T | G_SSWW | G_SZZ | G_SZZ_T | G_SSZZ | G_PNWW | G_PNZZ | G_PWZ | G_PWW | G_FWW | G_FZZ | G_FWW_T | G_FZZ_T | G_TNWW | G_TNZZ | G_TWZ | G_TWW | Gs | I_Gs | G2 | Mass of flavor | Width of flavor | K_Matrix_Coeff of int | K_Matrix_Pole of int (* \begin{dubious} The current abstract syntax for parameter dependencies is admittedly tedious. Later, there will be a parser for a convenient concrete syntax as a part of a concrete syntax for models. But as these examples show, it should include simple functions. \end{dubious} *) type orders = int * int let orders = function | _ -> (0,0) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} *) let input_parameters = [ Alpha_QED, 1. /. 137.0359895; Sin2thw, 0.23124; Mass (G Z), 91.187; Mass (M (N 1)), 0.0; Mass (M (L 1)), 0.51099907e-3; Mass (M (N 2)), 0.0; Mass (M (L 2)), 0.105658389; Mass (M (N 3)), 0.0; Mass (M (L 3)), 1.77705; Mass (M (U 1)), 5.0e-3; Mass (M (D 1)), 3.0e-3; Mass (M (U 2)), 1.2; Mass (M (D 2)), 0.1; Mass (M (U 3)), 174.0; Mass (M (D 3)), 4.2 ] (* \begin{subequations} \begin{align} e &= \sqrt{4\pi\alpha} \\ \sin\theta_w &= \sqrt{\sin^2\theta_w} \\ \cos\theta_w &= \sqrt{1-\sin^2\theta_w} \\ g &= \frac{e}{\sin\theta_w} \\ m_W &= \cos\theta_w m_Z \\ v &= \frac{2m_W}{g} \\ g_{CC} = -\frac{g}{2\sqrt2} &= -\frac{e}{2\sqrt2\sin\theta_w} \\ Q_{\text{lepton}} = -q_{\text{lepton}}e &= e \\ Q_{\text{up}} = -q_{\text{up}}e &= -\frac{2}{3}e \\ Q_{\text{down}} = -q_{\text{down}}e &= \frac{1}{3}e \\ \ii q_We = \ii g_{\gamma WW} &= \ii e \\ \ii g_{ZWW} &= \ii g \cos\theta_w \\ \ii g_{WWW} &= \ii g \end{align} \end{subequations} *) let derived_parameters = [ Real E, Sqrt (Prod [Integer 4; Atom Pi; Atom Alpha_QED]); Real Sinthw, Sqrt (Atom Sin2thw); Real Costhw, Sqrt (Diff (Integer 1, Atom Sin2thw)); Real G_weak, Quot (Atom E, Atom Sinthw); Real (Mass (G Wp)), Prod [Atom Costhw; Atom (Mass (G Z))]; Real Vev, Quot (Prod [Integer 2; Atom (Mass (G Wp))], Atom G_weak); Real Q_lepton, Atom E; Real Q_up, Prod [Quot (Integer (-2), Integer 3); Atom E]; Real Q_down, Prod [Quot (Integer 1, Integer 3); Atom E]; Real G_CC, Neg (Quot (Atom G_weak, Prod [Integer 2; Sqrt (Integer 2)])); Complex I_Q_W, Prod [I; Atom E]; Complex I_G_weak, Prod [I; Atom G_weak]; Complex I_G_ZWW, Prod [I; Atom G_weak; Atom Costhw] ] (* \begin{equation} - \frac{g}{2\cos\theta_w} \end{equation} *) let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) (* \begin{subequations} \begin{align} - \frac{g}{2\cos\theta_w} g_V &= - \frac{g}{2\cos\theta_w} (T_3 - 2 q \sin^2\theta_w) \\ - \frac{g}{2\cos\theta_w} g_A &= - \frac{g}{2\cos\theta_w} T_3 \end{align} \end{subequations} *) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents' n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents'' n = List.map mgm [ ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents_triv = ThoList.flatmap charged_currents' [1;2;3] @ ThoList.flatmap charged_currents'' [1;2;3] let charged_currents_ckm = let charged_currents_2 n1 n2 = List.map mgm [ ((D (-n1), Wm, U n2), FBF (1, Psibar, VL, Psi), G_CCQ (n2,n1)); ((U (-n1), Wp, D n2), FBF (1, Psibar, VL, Psi), G_CCQ (n1,n2)) ] in ThoList.flatmap charged_currents' [1;2;3] @ List.flatten (Product.list2 charged_currents_2 [1;2;3] [1;2;3]) (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] (* \begin{multline} \mathcal{L}_{\textrm{TGC}}(g_1,\kappa) = g_1 \mathcal{L}_T(V,W^+,W^-) \\ + \frac{\kappa+g_1}{2} \Bigl(\mathcal{L}_T(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr)\\ + \frac{\kappa-g_1}{2} \Bigl(\mathcal{L}_L(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr) \end{multline} *) (* \begin{dubious} The whole thing in the LEP2 workshop notation: \begin{multline} \ii\mathcal{L}_{\textrm{TGC},V} / g_{WWV} = \\ g_1^V V^\mu (W^-_{\mu\nu}W^{+,\nu}-W^+_{\mu\nu}W^{-,\nu}) + \kappa_V W^+_\mu W^-_\nu V^{\mu\nu} + \frac{\lambda_V}{m_W^2} V_{\mu\nu} W^-_{\rho\mu} W^{+,\hphantom{\nu}\rho}_{\hphantom{+,}\nu} \\ + \ii g_5^V \epsilon_{\mu\nu\rho\sigma} \left( (\partial^\rho W^{-,\mu}) W^{+,\nu} - W^{-,\mu}(\partial^\rho W^{+,\nu}) \right) V^\sigma \\ + \ii g_4^V W^-_\mu W^+_\nu (\partial^\mu V^\nu + \partial^\nu V^\mu) - \frac{\tilde\kappa_V}{2} W^-_\mu W^+_\nu \epsilon^{\mu\nu\rho\sigma} V_{\rho\sigma} - \frac{\tilde\lambda_V}{2m_W^2} W^-_{\rho\mu} W^{+,\mu}_{\hphantom{+,\mu}\nu} \epsilon^{\nu\rho\alpha\beta} V_{\alpha\beta} \end{multline} using the conventions of Itzykson and Zuber with $\epsilon^{0123} = +1$. \end{dubious} *) (* \begin{dubious} This is equivalent to the notation of Hagiwara et al.~\cite{HPZH87}, if we remember that they have opposite signs for~$g_{WWV}$: \begin{multline} \mathcal{L}_{WWV} / (-g_{WWV}) = \\ \ii g_1^V \left( W^\dagger_{\mu\nu} W^\mu - W^\dagger_\mu W^\mu_{\hphantom{\mu}\nu} \right) V^\nu + \ii \kappa_V W^\dagger_\mu W_\nu V^{\mu\nu} + \ii \frac{\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} V^{\nu\lambda} \\ - g_4^V W^\dagger_\mu W_\nu \left(\partial^\mu V^\nu + \partial^\nu V^\mu \right) + g_5^V \epsilon^{\mu\nu\lambda\sigma} \left( W^\dagger_\mu \stackrel{\leftrightarrow}{\partial_\lambda} W_\nu \right) V_\sigma\\ + \ii \tilde\kappa_V W^\dagger_\mu W_\nu \tilde{V}^{\mu\nu} + \ii\frac{\tilde\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} \tilde{V}^{\nu\lambda} \end{multline} Here $V^\mu$ stands for either the photon or the~$Z$ field, $W^\mu$ is the $W^-$ field, $W_{\mu\nu} = \partial_\mu W_\nu - \partial_\nu W_\mu$, $V_{\mu\nu} = \partial_\mu V_\nu - \partial_\nu V_\mu$, and $\tilde{V}_{\mu\nu} = \frac{1}{2} \epsilon_{\mu\nu\lambda\sigma} V^{\lambda\sigma}$. \end{dubious} *) let anomalous_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_ZWW) ] let triple_gauge = if Flags.triple_anom then anomalous_triple_gauge else standard_triple_gauge (* \begin{equation} \mathcal{L}_{\textrm{QGC}} = - g^2 W_{+,\mu} W_{-,\nu} W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Actually, quartic gauge couplings are a little bit more straightforward using auxiliary fields. Here we have to impose the antisymmetry manually: \begin{subequations} \begin{multline} (W^{+,\mu}_1 W^{-,\nu}_2 - W^{+,\nu}_1 W^{-,\mu}_2) (W^+_{3,\mu} W^-_{4,\nu} - W^+_{3,\nu} W^-_{4,\mu}) \\ = 2(W^+_1W^+_3)(W^-_2W^-_4) - 2(W^+_1W^-_4)(W^-_2W^+_3) \end{multline} also ($V$ can be $A$ or $Z$) \begin{multline} (W^{+,\mu}_1 V^\nu_2 - W^{+,\nu}_1 V^\mu_2) (W^-_{3,\mu} V_{4,\nu} - W^-_{3,\nu} V_{4,\mu}) \\ = 2(W^+_1W^-_3)(V_2V_4) - 2(W^+_1V_4)(V_2W^-_3) \end{multline} \end{subequations} *) (* \begin{subequations} \begin{multline} W^{+,\mu} W^{-,\nu} W^+_\mu W^-_\nu \end{multline} \end{subequations} *) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] (* \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \left( \frac{g^4}{2}\left( (W^+_\mu W^{-,\mu})^2 + W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} \right)\right.\notag \\ &\qquad\qquad\qquad \left. + \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \\ \mathcal{L}_5 &= \alpha_5 \left( g^4 (W^+_\mu W^{-,\mu})^2 + \frac{g^4}{\cos^2\theta_w} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \end{align} \end{subequations} or \begin{multline} \mathcal{L}_4 + \mathcal{L}_5 = (\alpha_4+2\alpha_5) g^4 \frac{1}{2} (W^+_\mu W^{-,\mu})^2 \\ + 2\alpha_4 g^4 \frac{1}{4} W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} + \alpha_4 \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu \\ + 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \frac{1}{2} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \frac{1}{8} (Z_\mu Z^\mu)^2 \end{multline} and therefore \begin{subequations} \begin{align} \alpha_{(WW)_0} &= (\alpha_4+2\alpha_5) g^4 \\ \alpha_{(WW)_2} &= 2\alpha_4 g^4 \\ \alpha_{(WZ)_0} &= 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{(WZ)_1} &= \alpha_4 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{ZZ} &= (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \end{align} \end{subequations} *) let anomalous_quartic_gauge = if Flags.quartic_anom then List.map qgc [ ((Wm, Wm, Wp, Wp), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4 [1, C_12_34], Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4 [1, C_12_34], Alpha_ZZWW0); ((Wm, Wp, Z, Z), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4 [(1, C_12_34); (1, C_13_42); (1, C_14_23)], Alpha_ZZZZ) ] else [] (* In any diagonal channel~$\chi$, the scattering amplitude~$a_\chi(s)$ is unitary iff\footnote{% Trivial proof: \begin{equation} -1 = \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = \frac{\textrm{Im}(a_\chi^*(s))}{ |a_\chi(s)|^2 } = - \frac{\textrm{Im}(a_\chi(s))}{ |a_\chi(s)|^2 } \end{equation} i.\,e.~$\textrm{Im}(a_\chi(s)) = |a_\chi(s)|^2$.} \begin{equation} \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = -1 \end{equation} For a real perturbative scattering amplitude~$r_\chi(s)$ this can be enforced easily--and arbitrarily--by \begin{equation} \frac{1}{a_\chi(s)} = \frac{1}{r_\chi(s)} - \mathrm{i} \end{equation} *) let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_WWWW2_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZWW0_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_14_23)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_13_42); (1, C_12_34)]), D_Alpha_ZZZZ_T)] else [] (*i Thorsten's original implementation of the K matrix, which we keep since it still might be usefull for the future. let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 2, K_Matrix_Pole 2]), Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4_K_Matrix_tho (0, [(K_Matrix_Coeff 0, K_Matrix_Pole 0); (K_Matrix_Coeff 2, K_Matrix_Pole 2)]), Alpha_ZZWW0); ((Wm, Z, Wp, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 1, K_Matrix_Pole 1]), Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_ZZZZ) ] else [] i*) let quartic_gauge = standard_quartic_gauge @ anomalous_quartic_gauge @ k_matrix_quartic_gauge (* WK's couplings (apparently, he still intends to divide by $\Lambda^2_{\text{EWSB}}=16\pi^2v_{\mathrm{F}}^2$): with \begin{equation} V_{\mu} V_{\nu} = \frac{1}{2} \left( W^+_{\mu} W^-_{\nu} + W^+_{\nu} W^-_{\mu} \right) + \frac{1}{2\cos^2\theta_{w}} Z_{\mu} Z_{\nu} \end{equation} (note the symmetrization!), i.\,e. \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V_{\nu})^2 \\ \mathcal{L}_5 &= \alpha_5 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V^{\mu})^2 \end{align} \end{subequations} *) let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] (* New Resonances *) (* \begin{dubious} There is an extra minus in the Lagrangian to have the same sign as HWW or HZZ vertex. Effectivly this doesn't matter for VBS, because $(-1)^2=1$. This is only for completeness. \end{dubious} \begin{subequations} \begin{align} \mathbf{V}_\mu &= -\mathrm{i} g\mathbf{W}_\mu+\mathrm{i} g^\prime\mathbf{B}_\mu \\ \mathbf{W}_\mu &= W_\mu^a\frac{\tau^a}{2} \\ \mathbf{B}_\mu &= W_\mu^a\frac{\tau^3}{2} \\ \tau^{++}&= \tau^+ \otimes \tau^+ \\ \tau^+ &= \frac{1}{2} \left (\tau^+ \otimes \tau^3 + \tau^3+\tau^+ \right ) \\ \tau^0 &= \frac{1}{\sqrt{6}} \left (\tau^3\otimes\tau^3 -\tau^+ \otimes \tau^- - \tau^-+\tau^+ \right ) \\ \tau^- &= \frac{1}{2} \left (\tau^- \otimes \tau^3 + \tau^3+\tau^- \right ) \\ \tau^{--}&= \tau^- \otimes \tau^- \end{align} \end{subequations} *) (* Scalar Isoscalar \begin{equation} \mathcal{L}_{\sigma}= -\frac{g_\sigma v}{2} \text{tr} \left\lbrack \mathbf{V}_\mu \mathbf{V}^\mu \right\rbrack \sigma \end{equation} *) let rsigma3 = [ ((O Rsigma, G Wp, G Wm), Scalar_Vector_Vector 1, G_SWW); ((O Rsigma, G Z, G Z), Scalar_Vector_Vector 1, G_SZZ) ] let rsigma3t = [ ((O Rsigma, G Wp, G Wm), Scalar_Vector_Vector_t 1, G_SWW_T); ((O Rsigma, G Z, G Z), Scalar_Vector_Vector_t 1, G_SZZ_T) ] let rsigma4 = [ (O Rsigma, O Rsigma, G Wp, G Wm), Scalar2_Vector2 1, G_SSWW; (O Rsigma, O Rsigma, G Z, G Z), Scalar2_Vector2 1, G_SSZZ ] (* Scalar Isotensor \begin{subequations} \begin{align} \mathcal{L}_{\phi}&= \frac{g_\phi v}{4} \text{Tr} \left \lbrack \left ( \mathbf{V}_\mu \otimes \mathbf{V}^\mu - \frac{\tau^{aa}}{6} \text{Tr} \left \lbrack \mathbf{V}_\mu \mathbf{V}^\mu \right \rbrack\right ) {\mathbf{\phi}} \right \rbrack\\ \phi&=\sqrt{2} \left (\phi^{++}\tau^{++}+\phi^+\tau^++\phi^0\tau^0+\phi^-\tau^- + \phi^{--}\tau^{--} \right ) \end{align} \end{subequations} *) let rphi3 = [ ((O Rphin, G Wp, G Wm), Scalar_Vector_Vector 1, G_PNWW); ((O Rphin, G Z, G Z), Scalar_Vector_Vector 1, G_PNZZ) ; ((O Rphip, G Z, G Wm), Scalar_Vector_Vector 1, G_PWZ) ; ((O Rphipp, G Wm, G Wm), Scalar_Vector_Vector 1, G_PWW) ; ((O Rphim, G Wp, G Z), Scalar_Vector_Vector 1, G_PWZ) ; ((O Rphimm, G Wp, G Wp), Scalar_Vector_Vector 1, G_PWW) ] (* Tensor IsoScalar *) let rf3 = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_FWW); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_FZZ) ] let rf3t = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_t 1, G_FWW_T); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_t 1, G_FZZ_T) ] (* Tensor Isotensor \begin{subequations} \begin{align} \mathcal{L}_{t} \end{align} \end{subequations} *) let rt3 = [ ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_TNWW); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_TNZZ) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector_1 1, G_TWZ) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector_1 1, G_TWW) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector_1 1, G_TWZ) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector_1 1, G_TWW) ] (* Anomalous trilinear interactions $f_i f_j V$ : \begin{equation} \Delta\mathcal{L}_{tt\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{t} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) t A_\mu \end{equation} *) let anomalous_ttA = if Flags.top_anom then [ ((M (U (-3)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bb\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{b} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) b A_\mu \end{equation} *) let anomalous_bbA = if Flags.top_anom then [ ((M (D (-3)), G Ga, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttg} = - g_s \frac{\upsilon}{\Lambda^2} \bar{t}\lambda^a i\sigma^{\mu\nu}k_\nu (d_V(k^2)+id_A(k^2)\gamma_5)tG^a_\mu \end{equation} *) let anomalous_ttG = if Flags.top_anom then [ ((M (U (-3)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttG) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{t} \fmslash{Z} (X_L(k^2) P_L + X_R(k^2) P_R) t + \bar{t}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)tZ_\mu\right\rbrack \end{equation} *) let anomalous_ttZ = if Flags.top_anom then [ ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_ttZ); ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2} \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)bZ_\mu \end{equation} *) let anomalous_bbZ = if Flags.top_anom then [ ((M (D (-3)), G Z, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbW} = - \frac{g}{\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\fmslash{W}^-(V_L(k^2) P_L+V_R(k^2) P_R) t + \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)tW^-_\mu\right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbW = if Flags.top_anom then [ ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tbW); ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, TLRM, Psi), G_TLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, TRLM, Psi), G_TRL_tbW) ] else [] (* quartic fermion-gauge interactions $f_i f_j V_1 V_2$ emerging from gauge-invariant effective operators: \begin{equation} \Delta\mathcal{L}_{ttgg} = - \frac{g_s^2}{2} f_{abc} \frac{\upsilon}{\Lambda^2} \bar{t} \lambda^a \sigma^{\mu\nu} (d_V(k^2)+id_A(k^2)\gamma_5)t G^b_\mu G^c_\nu \end{equation} *) let anomalous_ttGG = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,1,0,true,TTGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttGG); ((O (Aux_top (2,1,0,false,TTGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWA} = - i\sin\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t A_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWA = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWA)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWA); ((O (Aux_top (2,0,1,false,TBWA)), G Ga, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWA)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWA); ((O (Aux_top (2,0,-1,false,TBWA)), G Wp, G Ga), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWZ} = - i\cos\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t Z_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWZ = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWZ)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWZ); ((O (Aux_top (2,0,1,false,TBWZ)), G Z, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWZ)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWZ); ((O (Aux_top (2,0,-1,false,TBWZ)), G Wp, G Z), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{t} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)t W^-_\mu W^+_\nu \end{equation} *) let anomalous_ttWW = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,0,0,true,TTWW)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttWW); ((O (Aux_top (2,0,0,false,TTWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{b} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)b W^-_\mu W^+_\nu \end{equation} *) let anomalous_bbWW = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,0,true,BBWW)), M (D 3)), FBF (1, Psibar, TVA, Psi), G_TVA_bbWW); ((O (Aux_top (2,0,0,false,BBWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* 4-fermion contact terms emerging from operator rewriting: *) let anomalous_top_qGuG_tt = [ ((M (U (-3)), O (Aux_top (1,1,0,true,QGUG)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qGuG) ] let anomalous_top_qGuG_ff n = List.map mom [ ((U (-n), Aux_top (1,1,0,false,QGUG), U n), FBF (1, Psibar, V, Psi), Unit); ((D (-n), Aux_top (1,1,0,false,QGUG), D n), FBF (1, Psibar, V, Psi), Unit) ] let anomalous_top_qGuG = if Flags.top_anom_4f then anomalous_top_qGuG_tt @ ThoList.flatmap anomalous_top_qGuG_ff [1;2;3] else [] let anomalous_top_qBuB_tt = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QBUB)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB) ] let anomalous_top_qBuB_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QBUB), U n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_u); ((D (-n), Aux_top (1,0,0,false,QBUB), D n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_d); ((L (-n), Aux_top (1,0,0,false,QBUB), L n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_e); ((N (-n), Aux_top (1,0,0,false,QBUB), N n), FBF (1, Psibar, VL, Psi), G_VL_qBuB_n) ] let anomalous_top_qBuB = if Flags.top_anom_4f then anomalous_top_qBuB_tt @ ThoList.flatmap anomalous_top_qBuB_ff [1;2;3] else [] let anomalous_top_qW_tq = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (D (-3)), O (Aux_top (1,0,-1,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (U (-3)), O (Aux_top (1,0,1,true,QW)), M (D 3)), FBF (1, Psibar, VL, Psi), G_VL_qW) ] let anomalous_top_qW_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QW), U n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((D (-n), Aux_top (1,0,0,false,QW), D n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((N (-n), Aux_top (1,0,0,false,QW), N n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((L (-n), Aux_top (1,0,0,false,QW), L n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((D (-n), Aux_top (1,0,-1,false,QW), U n), FBF (1, Psibar, VL, Psi), Half); ((U (-n), Aux_top (1,0,1,false,QW), D n), FBF (1, Psibar, VL, Psi), Half); ((L (-n), Aux_top (1,0,-1,false,QW), N n), FBF (1, Psibar, VL, Psi), Half); ((N (-n), Aux_top (1,0,1,false,QW), L n), FBF (1, Psibar, VL, Psi), Half) ] let anomalous_top_qW = if Flags.top_anom_4f then anomalous_top_qW_tq @ ThoList.flatmap anomalous_top_qW_ff [1;2;3] else [] let anomalous_top_DuDd = if Flags.top_anom_4f then [ ((M (U (-3)), O (Aux_top (0,0,0,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,0,false,DR)), M (U 3)), FBF (1, Psibar, SL, Psi), G_SL_DttR); ((M (D (-3)), O (Aux_top (0,0,0,false,DR)), M (D 3)), FBF (1, Psibar, SR, Psi), G_SR_DttR); ((M (U (-3)), O (Aux_top (0,0,0,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (D (-3)), O (Aux_top (0,0,0,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DttL); ((M (D (-3)), O (Aux_top (0,0,-1,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DR)), M (D 3)), FBF (1, Psibar, SLR, Psi), G_SLR_DbtR); ((M (D (-3)), O (Aux_top (0,0,-1,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DbtL) ] else [] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ (if Flags.ckm_present then charged_currents_ckm else charged_currents_triv) @ triple_gauge @ goldstone_vertices @ rsigma3 @ rsigma3t @ rphi3 @ rf3 @ rf3t @ rt3 @ anomalous_ttA @ anomalous_bbA @ anomalous_ttZ @ anomalous_bbZ @ anomalous_tbW @ anomalous_tbWA @ anomalous_tbWZ @ anomalous_ttWW @ anomalous_bbWW @ anomalous_ttG @ anomalous_ttGG @ anomalous_top_qGuG @ anomalous_top_qBuB @ anomalous_top_qW @ anomalous_top_DuDd) let vertices4 = quartic_gauge @ rsigma4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "Rsigma" -> O Rsigma | "Rphi0" -> O Rphin | "Rphi+" -> O Rphip | "Rphi-" -> O Rphim | "Rphi++" -> O Rphip | "Rphi--" -> O Rphimm | "Rf" -> O Rf | "Rt0" -> O Rtn | "Rt+" -> O Rtp | "Rt-" -> O Rtm | "Rt++" -> O Rtp | "Rt--" -> O Rtmm | "Aux_t_ttGG0" -> O (Aux_top (2,1, 0,true,TTGG)) | "Aux_ttGG0" -> O (Aux_top (2,1, 0,false,TTGG)) | "Aux_t_tbWA+" -> O (Aux_top (2,0, 1,true,TBWA)) | "Aux_tbWA+" -> O (Aux_top (2,0, 1,false,TBWA)) | "Aux_t_tbWA-" -> O (Aux_top (2,0,-1,true,TBWA)) | "Aux_tbWA-" -> O (Aux_top (2,0,-1,false,TBWA)) | "Aux_t_tbWZ+" -> O (Aux_top (2,0, 1,true,TBWZ)) | "Aux_tbWZ+" -> O (Aux_top (2,0, 1,false,TBWZ)) | "Aux_t_tbWZ-" -> O (Aux_top (2,0,-1,true,TBWZ)) | "Aux_tbWZ-" -> O (Aux_top (2,0,-1,false,TBWZ)) | "Aux_t_ttWW0" -> O (Aux_top (2,0, 0,true,TTWW)) | "Aux_ttWW0" -> O (Aux_top (2,0, 0,false,TTWW)) | "Aux_t_bbWW0" -> O (Aux_top (2,0, 0,true,BBWW)) | "Aux_bbWW0" -> O (Aux_top (2,0, 0,false,BBWW)) | "Aux_t_qGuG0" -> O (Aux_top (1,1, 0,true,QGUG)) | "Aux_qGuG0" -> O (Aux_top (1,1, 0,false,QGUG)) | "Aux_t_qBuB0" -> O (Aux_top (1,0, 0,true,QBUB)) | "Aux_qBuB0" -> O (Aux_top (1,0, 0,false,QBUB)) | "Aux_t_qW0" -> O (Aux_top (1,0, 0,true,QW)) | "Aux_qW0" -> O (Aux_top (1,0, 0,false,QW)) | "Aux_t_qW+" -> O (Aux_top (1,0, 1,true,QW)) | "Aux_qW+" -> O (Aux_top (1,0, 1,false,QW)) | "Aux_t_qW-" -> O (Aux_top (1,0,-1,true,QW)) | "Aux_qW-" -> O (Aux_top (1,0,-1,false,QW)) | "Aux_t_dL0" -> O (Aux_top (0,0, 0,true,DL)) | "Aux_dL0" -> O (Aux_top (0,0, 0,false,DL)) | "Aux_t_dL+" -> O (Aux_top (0,0, 1,true,DL)) | "Aux_dL+" -> O (Aux_top (0,0, 1,false,DL)) | "Aux_t_dL-" -> O (Aux_top (0,0,-1,true,DL)) | "Aux_dL-" -> O (Aux_top (0,0,-1,false,DL)) | "Aux_t_dR0" -> O (Aux_top (0,0, 0,true,DR)) | "Aux_dR0" -> O (Aux_top (0,0, 0,false,DR)) | "Aux_t_dR+" -> O (Aux_top (0,0, 1,true,DR)) | "Aux_dR+" -> O (Aux_top (0,0, 1,false,DR)) | "Aux_t_dR-" -> O (Aux_top (0,0,-1,true,DR)) | "Aux_dR-" -> O (Aux_top (0,0,-1,false,DR)) | _ -> invalid_arg "Modellib_NoH.AltH.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "gl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | Rsigma -> "Rsigma" | Rphin -> "Rphin" | Rphip -> "Rphi+" | Rphim -> "Rphi-" | Rphipp -> "Rphi++" | Rphimm -> "Rphi--" | Rf -> "Rf" | Rtn -> "Rtn" | Rtp -> "Rt+" | Rtm -> "Rt-" | Rtpp -> "Rt++" | Rtmm -> "Rt--" | Aux_top (_,_,ch,n,v) -> "Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" end ) ^ ( if ch > 0 then "+" else if ch < 0 then "-" else "0" ) end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_NoH.AltH.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | Rsigma -> "\\sigma" | Rphip -> "\\phi^+" | Rphim -> "\\phi^-" | Rphin -> "\\phi^0" | Rphipp -> "\\phi^{++}" | Rphimm -> "\\phi^{--}" | Rf -> "f" | Rtp -> "t^+" | Rtm -> "t^-" | Rtn -> "t^0" | Rtpp -> "t^{++}" | Rtmm -> "t^{--}" | Aux_top (_,_,ch,n,v) -> "\\textnormal{Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" end ) ^ ( if ch > 0 then "^+" else if ch < 0 then "^-" else "^0" ) ^ "}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | Rsigma -> "rsi" | Rphip -> "rpp" | Rphim -> "rpm" | Rphin -> "rpn" | Rphipp -> "rppp" | Rphimm -> "rpmm" | Rf -> "rf" | Rtp -> "rtp" | Rtm -> "rtm" | Rtn -> "rtn" | Rtpp -> "rtpp" | Rtmm -> "rtmm" | Aux_top (_,_,ch,n,v) -> "aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttgg" | TBWA -> "tbwa" | TBWZ -> "tbwz" | TTWW -> "ttww" | BBWW -> "bbww" | QGUG -> "qgug" | QBUB -> "qbub" | QW -> "qw" | DL -> "dl" | DR -> "dr" end ) ^ "_" ^ ( if ch > 0 then "p" else if ch < 0 then "m" else "0" ) end (* Introducing new Resonances from 45, there are no PDG values *) let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | Rsigma -> 45 | Rphin -> 46 | Rphip | Rphim -> 47 | Rphipp | Rphimm -> 48 | Rf -> 52 | Rtn -> 53 | Rtp | Rtm -> 54 | Rtpp | Rtmm -> 55 | Aux_top (_,_,_,_,_) -> 81 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Half -> "half" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | I_G_weak -> "ig" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_TVA_ttA -> "gtva_tta" | G_TVA_bbA -> "gtva_bba" | G_VLR_ttZ -> "gvlr_ttz" | G_TVA_ttZ -> "gtva_ttz" | G_TVA_bbZ -> "gtva_bbz" | G_VLR_btW -> "gvlr_btw" | G_VLR_tbW -> "gvlr_tbw" | G_TLR_btW -> "gtlr_btw" | G_TRL_tbW -> "gtrl_tbw" | G_TLR_btWA -> "gtlr_btwa" | G_TRL_tbWA -> "gtrl_tbwa" | G_TLR_btWZ -> "gtlr_btwz" | G_TRL_tbWZ -> "gtrl_tbwz" | G_TVA_ttWW -> "gtva_ttww" | G_TVA_bbWW -> "gtva_bbww" | G_TVA_ttG -> "gtva_ttg" | G_TVA_ttGG -> "gtva_ttgg" | G_VLR_qGuG -> "gvlr_qgug" | G_VLR_qBuB -> "gvlr_qbub" | G_VLR_qBuB_u -> "gvlr_qbub_u" | G_VLR_qBuB_d -> "gvlr_qbub_d" | G_VLR_qBuB_e -> "gvlr_qbub_e" | G_VL_qBuB_n -> "gvl_qbub_n" | G_VL_qW -> "gvl_qw" | G_VL_qW_u -> "gvl_qw_u" | G_VL_qW_d -> "gvl_qw_d" | G_SL_DttR -> "gsl_dttr" | G_SR_DttR -> "gsr_dttr" | G_SL_DttL -> "gsl_dttl" | G_SLR_DbtR -> "gslr_dbtr" | G_SL_DbtL -> "gsl_dbtl" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | I_G1_AWW -> "ig1a" | I_G1_ZWW -> "ig1z" | I_G1_plus_kappa_plus_G4_AWW -> "ig1pkpg4a" | I_G1_plus_kappa_plus_G4_ZWW -> "ig1pkpg4z" | I_G1_plus_kappa_minus_G4_AWW -> "ig1pkmg4a" | I_G1_plus_kappa_minus_G4_ZWW -> "ig1pkmg4z" | I_G1_minus_kappa_plus_G4_AWW -> "ig1mkpg4a" | I_G1_minus_kappa_plus_G4_ZWW -> "ig1mkpg4z" | I_G1_minus_kappa_minus_G4_AWW -> "ig1mkmg4a" | I_G1_minus_kappa_minus_G4_ZWW -> "ig1mkmg4z" | I_lambda_AWW -> "ila" | I_lambda_ZWW -> "ilz" | G5_AWW -> "rg5a" | G5_ZWW -> "rg5z" | I_kappa5_AWW -> "ik5a" | I_kappa5_ZWW -> "ik5z" | I_lambda5_AWW -> "il5a" | I_lambda5_ZWW -> "il5z" | Alpha_WWWW0 -> "alww0" | Alpha_WWWW2 -> "alww2" | Alpha_ZZWW0 -> "alzw0" | Alpha_ZZWW1 -> "alzw1" | Alpha_ZZZZ -> "alzz" | D_Alpha_ZZWW0_S -> "dalzz0_s(gkm,mkm," | D_Alpha_ZZWW0_T -> "dalzz0_t(gkm,mkm," | D_Alpha_ZZWW1_S -> "dalzz1_s(gkm,mkm," | D_Alpha_ZZWW1_T -> "dalzz1_t(gkm,mkm," | D_Alpha_ZZWW1_U -> "dalzz1_u(gkm,mkm," | D_Alpha_WWWW0_S -> "dalww0_s(gkm,mkm," | D_Alpha_WWWW0_T -> "dalww0_t(gkm,mkm," | D_Alpha_WWWW0_U -> "dalww0_u(gkm,mkm," | D_Alpha_WWWW2_S -> "dalww2_s(gkm,mkm," | D_Alpha_WWWW2_T -> "dalww2_t(gkm,mkm," | D_Alpha_ZZZZ_S -> "dalz4_s(gkm,mkm," | D_Alpha_ZZZZ_T -> "dalz4_t(gkm,mkm," | G_SWW -> "gsww" | G_SZZ -> "gszz" | G_SWW_T -> "gswwt" | G_SZZ_T -> "gszzt" | G_PNWW -> "gpnww" | G_PNZZ -> "gpnzz" | G_PWZ -> "gpwz" | G_PWW -> "gpww" | G_FWW -> "gfww" | G_FZZ -> "gfzz" | G_FWW_T -> "gfwwt" | G_FZZ_T -> "gfzzt" | G_TNWW -> "gtnww" | G_TNZZ -> "gtnzz" | G_TWZ -> "gtwz" | G_TWW -> "gtww" | G_SSWW -> "gssww" | G_SSZZ -> "gsszz" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f | K_Matrix_Coeff i -> "kc" ^ string_of_int i | K_Matrix_Pole i -> "kp" ^ string_of_int i end Index: trunk/omega/src/omegalib.nw =================================================================== --- trunk/omega/src/omegalib.nw (revision 8415) +++ trunk/omega/src/omegalib.nw (revision 8416) @@ -1,14119 +1,14120 @@ % -*- ess-noweb-default-code-mode: f90-mode; noweb-default-code-mode: f90-mode; -*- % omegalib.nw -- % % Copyright (C) 1999-2020 by % Wolfgang Kilian % Thorsten Ohl % Juergen Reuter % with contributions from % Fabian Bach % Bijan Chokoufe Nejad % Marco Sekulla % Christian Speckner % % WHIZARD is free software; you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2, or (at your option) % any later version. % % WHIZARD is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @ \section{Trivia} <<[[omega_spinors.f90]]>>= <> module omega_spinors use kinds use constants implicit none private public :: operator (*), operator (+), operator (-) public :: abs <<[[intrinsic :: abs]]>> type, public :: conjspinor ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default), dimension(4) :: a end type conjspinor type, public :: spinor ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default), dimension(4) :: a end type spinor <> integer, parameter, public :: omega_spinors_2010_01_A = 0 contains <> end module omega_spinors @ <<[[intrinsic :: abs]] (if working)>>= intrinsic :: abs @ <<[[intrinsic :: conjg]] (if working)>>= intrinsic :: conjg @ well, the Intel Fortran Compiler chokes on these with an internal error: <<[[intrinsic :: abs]]>>= @ <<[[intrinsic :: conjg]]>>= @ To reenable the pure functions that have been removed for OpenMP, one should set this chunk to [[pure &]] <<[[pure]] unless OpenMP>>= @ \subsection{Inner Product} <>= interface operator (*) module procedure conjspinor_spinor end interface private :: conjspinor_spinor @ \begin{equation} \bar\psi\psi' \end{equation} NB: [[dot_product]] conjugates its first argument, we can either cancel this or inline [[dot_product]]: <>= pure function conjspinor_spinor (psibar, psi) result (psibarpsi) complex(kind=default) :: psibarpsi type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi psibarpsi = psibar%a(1)*psi%a(1) + psibar%a(2)*psi%a(2) & + psibar%a(3)*psi%a(3) + psibar%a(4)*psi%a(4) end function conjspinor_spinor @ \subsection{Spinor Vector Space} \subsubsection{Scalar Multiplication} <>= interface operator (*) module procedure integer_spinor, spinor_integer, & real_spinor, double_spinor, & complex_spinor, dcomplex_spinor, & spinor_real, spinor_double, & spinor_complex, spinor_dcomplex end interface private :: integer_spinor, spinor_integer, real_spinor, & double_spinor, complex_spinor, dcomplex_spinor, & spinor_real, spinor_double, spinor_complex, spinor_dcomplex @ <>= pure function integer_spinor (x, y) result (xy) integer, intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function integer_spinor @ <>= pure function real_spinor (x, y) result (xy) real(kind=single), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function real_spinor pure function double_spinor (x, y) result (xy) real(kind=default), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function double_spinor pure function complex_spinor (x, y) result (xy) complex(kind=single), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function complex_spinor pure function dcomplex_spinor (x, y) result (xy) complex(kind=default), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function dcomplex_spinor pure function spinor_integer (y, x) result (xy) integer, intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function spinor_integer pure function spinor_real (y, x) result (xy) real(kind=single), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function spinor_real pure function spinor_double (y, x) result (xy) real(kind=default), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function spinor_double pure function spinor_complex (y, x) result (xy) complex(kind=single), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function spinor_complex pure function spinor_dcomplex (y, x) result (xy) complex(kind=default), intent(in) :: x type(spinor), intent(in) :: y type(spinor) :: xy xy%a = x * y%a end function spinor_dcomplex @ <>= interface operator (*) module procedure integer_conjspinor, conjspinor_integer, & real_conjspinor, double_conjspinor, & complex_conjspinor, dcomplex_conjspinor, & conjspinor_real, conjspinor_double, & conjspinor_complex, conjspinor_dcomplex end interface private :: integer_conjspinor, conjspinor_integer, real_conjspinor, & double_conjspinor, complex_conjspinor, dcomplex_conjspinor, & conjspinor_real, conjspinor_double, conjspinor_complex, & conjspinor_dcomplex @ <>= pure function integer_conjspinor (x, y) result (xy) integer, intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function integer_conjspinor pure function real_conjspinor (x, y) result (xy) real(kind=single), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function real_conjspinor pure function double_conjspinor (x, y) result (xy) real(kind=default), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function double_conjspinor pure function complex_conjspinor (x, y) result (xy) complex(kind=single), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function complex_conjspinor pure function dcomplex_conjspinor (x, y) result (xy) complex(kind=default), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function dcomplex_conjspinor pure function conjspinor_integer (y, x) result (xy) integer, intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function conjspinor_integer pure function conjspinor_real (y, x) result (xy) real(kind=single), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function conjspinor_real pure function conjspinor_double (y, x) result (xy) real(kind=default), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function conjspinor_double pure function conjspinor_complex (y, x) result (xy) complex(kind=single), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function conjspinor_complex pure function conjspinor_dcomplex (y, x) result (xy) complex(kind=default), intent(in) :: x type(conjspinor), intent(in) :: y type(conjspinor) :: xy xy%a = x * y%a end function conjspinor_dcomplex @ \subsubsection{Unary Plus and Minus} <>= interface operator (+) module procedure plus_spinor, plus_conjspinor end interface private :: plus_spinor, plus_conjspinor interface operator (-) module procedure neg_spinor, neg_conjspinor end interface private :: neg_spinor, neg_conjspinor @ <>= pure function plus_spinor (x) result (plus_x) type(spinor), intent(in) :: x type(spinor) :: plus_x plus_x%a = x%a end function plus_spinor pure function neg_spinor (x) result (neg_x) type(spinor), intent(in) :: x type(spinor) :: neg_x neg_x%a = - x%a end function neg_spinor @ <>= pure function plus_conjspinor (x) result (plus_x) type(conjspinor), intent(in) :: x type(conjspinor) :: plus_x plus_x%a = x%a end function plus_conjspinor pure function neg_conjspinor (x) result (neg_x) type(conjspinor), intent(in) :: x type(conjspinor) :: neg_x neg_x%a = - x%a end function neg_conjspinor @ \subsubsection{Addition and Subtraction} <>= interface operator (+) module procedure add_spinor, add_conjspinor end interface private :: add_spinor, add_conjspinor interface operator (-) module procedure sub_spinor, sub_conjspinor end interface private :: sub_spinor, sub_conjspinor @ <>= pure function add_spinor (x, y) result (xy) type(spinor), intent(in) :: x, y type(spinor) :: xy xy%a = x%a + y%a end function add_spinor pure function sub_spinor (x, y) result (xy) type(spinor), intent(in) :: x, y type(spinor) :: xy xy%a = x%a - y%a end function sub_spinor @ <>= pure function add_conjspinor (x, y) result (xy) type(conjspinor), intent(in) :: x, y type(conjspinor) :: xy xy%a = x%a + y%a end function add_conjspinor pure function sub_conjspinor (x, y) result (xy) type(conjspinor), intent(in) :: x, y type(conjspinor) :: xy xy%a = x%a - y%a end function sub_conjspinor @ \subsection{Norm} <>= interface abs module procedure abs_spinor, abs_conjspinor end interface private :: abs_spinor, abs_conjspinor @ <>= pure function abs_spinor (psi) result (x) type(spinor), intent(in) :: psi real(kind=default) :: x x = sqrt (real (dot_product (psi%a, psi%a))) end function abs_spinor @ <>= pure function abs_conjspinor (psibar) result (x) real(kind=default) :: x type(conjspinor), intent(in) :: psibar x = sqrt (real (dot_product (psibar%a, psibar%a))) end function abs_conjspinor @ \section{Spinors Revisited} <<[[omega_bispinors.f90]]>>= <> module omega_bispinors use kinds use constants implicit none private public :: operator (*), operator (+), operator (-) public :: abs type, public :: bispinor ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default), dimension(4) :: a end type bispinor <> integer, parameter, public :: omega_bispinors_2010_01_A = 0 contains <> end module omega_bispinors @ <>= interface operator (*) module procedure spinor_product end interface private :: spinor_product @ \begin{equation} \bar\psi\psi' \end{equation} NB: [[dot_product]] conjugates its first argument, we have to cancel this. <>= pure function spinor_product (psil, psir) result (psilpsir) complex(kind=default) :: psilpsir type(bispinor), intent(in) :: psil, psir type(bispinor) :: psidum psidum%a(1) = psir%a(2) psidum%a(2) = - psir%a(1) psidum%a(3) = - psir%a(4) psidum%a(4) = psir%a(3) psilpsir = dot_product (conjg (psil%a), psidum%a) end function spinor_product @ \subsection{Spinor Vector Space} \subsubsection{Scalar Multiplication} <>= interface operator (*) module procedure integer_bispinor, bispinor_integer, & real_bispinor, double_bispinor, & complex_bispinor, dcomplex_bispinor, & bispinor_real, bispinor_double, & bispinor_complex, bispinor_dcomplex end interface private :: integer_bispinor, bispinor_integer, real_bispinor, & double_bispinor, complex_bispinor, dcomplex_bispinor, & bispinor_real, bispinor_double, bispinor_complex, bispinor_dcomplex @ <>= pure function integer_bispinor (x, y) result (xy) type(bispinor) :: xy integer, intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function integer_bispinor @ <>= pure function real_bispinor (x, y) result (xy) type(bispinor) :: xy real(kind=single), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function real_bispinor @ <>= pure function double_bispinor (x, y) result (xy) type(bispinor) :: xy real(kind=default), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function double_bispinor @ <>= pure function complex_bispinor (x, y) result (xy) type(bispinor) :: xy complex(kind=single), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function complex_bispinor @ <>= pure function dcomplex_bispinor (x, y) result (xy) type(bispinor) :: xy complex(kind=default), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function dcomplex_bispinor @ <>= pure function bispinor_integer (y, x) result (xy) type(bispinor) :: xy integer, intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function bispinor_integer @ <>= pure function bispinor_real (y, x) result (xy) type(bispinor) :: xy real(kind=single), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function bispinor_real @ <>= pure function bispinor_double (y, x) result (xy) type(bispinor) :: xy real(kind=default), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function bispinor_double @ <>= pure function bispinor_complex (y, x) result (xy) type(bispinor) :: xy complex(kind=single), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function bispinor_complex @ <>= pure function bispinor_dcomplex (y, x) result (xy) type(bispinor) :: xy complex(kind=default), intent(in) :: x type(bispinor), intent(in) :: y xy%a = x * y%a end function bispinor_dcomplex @ \subsubsection{Unary Plus and Minus} <>= interface operator (+) module procedure plus_bispinor end interface private :: plus_bispinor interface operator (-) module procedure neg_bispinor end interface private :: neg_bispinor @ <>= pure function plus_bispinor (x) result (plus_x) type(bispinor) :: plus_x type(bispinor), intent(in) :: x plus_x%a = x%a end function plus_bispinor @ <>= pure function neg_bispinor (x) result (neg_x) type(bispinor) :: neg_x type(bispinor), intent(in) :: x neg_x%a = - x%a end function neg_bispinor @ \subsubsection{Addition and Subtraction} <>= interface operator (+) module procedure add_bispinor end interface private :: add_bispinor interface operator (-) module procedure sub_bispinor end interface private :: sub_bispinor @ <>= pure function add_bispinor (x, y) result (xy) type(bispinor) :: xy type(bispinor), intent(in) :: x, y xy%a = x%a + y%a end function add_bispinor @ <>= pure function sub_bispinor (x, y) result (xy) type(bispinor) :: xy type(bispinor), intent(in) :: x, y xy%a = x%a - y%a end function sub_bispinor @ \subsection{Norm} <>= interface abs module procedure abs_bispinor end interface private :: abs_bispinor @ <>= pure function abs_bispinor (psi) result (x) real(kind=default) :: x type(bispinor), intent(in) :: psi x = sqrt (real (dot_product (psi%a, psi%a))) end function abs_bispinor @ \section{Vectorspinors} <<[[omega_vectorspinors.f90]]>>= <> module omega_vectorspinors use kinds use constants use omega_bispinors use omega_vectors implicit none private public :: operator (*), operator (+), operator (-) public :: abs type, public :: vectorspinor ! private (omegalib needs access, but DON'T TOUCH IT!) type(bispinor), dimension(4) :: psi end type vectorspinor <> integer, parameter, public :: omega_vectorspinors_2010_01_A = 0 contains <> end module omega_vectorspinors @ <>= interface operator (*) module procedure vspinor_product end interface private :: vspinor_product @ \begin{equation} \bar\psi^\mu\psi'_\mu \end{equation} <>= pure function vspinor_product (psil, psir) result (psilpsir) complex(kind=default) :: psilpsir type(vectorspinor), intent(in) :: psil, psir psilpsir = psil%psi(1) * psir%psi(1) & - psil%psi(2) * psir%psi(2) & - psil%psi(3) * psir%psi(3) & - psil%psi(4) * psir%psi(4) end function vspinor_product @ \subsection{Vectorspinor Vector Space} \subsubsection{Scalar Multiplication} <>= interface operator (*) module procedure integer_vectorspinor, vectorspinor_integer, & real_vectorspinor, double_vectorspinor, & complex_vectorspinor, dcomplex_vectorspinor, & vectorspinor_real, vectorspinor_double, & vectorspinor_complex, vectorspinor_dcomplex, & momentum_vectorspinor, vectorspinor_momentum end interface private :: integer_vectorspinor, vectorspinor_integer, real_vectorspinor, & double_vectorspinor, complex_vectorspinor, dcomplex_vectorspinor, & vectorspinor_real, vectorspinor_double, vectorspinor_complex, & vectorspinor_dcomplex @ <>= pure function integer_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy integer, intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = x * y%psi(k) end do end function integer_vectorspinor @ <>= pure function real_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy real(kind=single), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = x * y%psi(k) end do end function real_vectorspinor @ <>= pure function double_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy real(kind=default), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = x * y%psi(k) end do end function double_vectorspinor @ <>= pure function complex_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy complex(kind=single), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = x * y%psi(k) end do end function complex_vectorspinor @ <>= pure function dcomplex_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy complex(kind=default), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = x * y%psi(k) end do end function dcomplex_vectorspinor @ <>= pure function vectorspinor_integer (y, x) result (xy) type(vectorspinor) :: xy integer, intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = y%psi(k) * x end do end function vectorspinor_integer @ <>= pure function vectorspinor_real (y, x) result (xy) type(vectorspinor) :: xy real(kind=single), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = y%psi(k) * x end do end function vectorspinor_real @ <>= pure function vectorspinor_double (y, x) result (xy) type(vectorspinor) :: xy real(kind=default), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = y%psi(k) * x end do end function vectorspinor_double @ <>= pure function vectorspinor_complex (y, x) result (xy) type(vectorspinor) :: xy complex(kind=single), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = y%psi(k) * x end do end function vectorspinor_complex @ <>= pure function vectorspinor_dcomplex (y, x) result (xy) type(vectorspinor) :: xy complex(kind=default), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%psi(k) = y%psi(k) * x end do end function vectorspinor_dcomplex @ <>= pure function momentum_vectorspinor (y, x) result (xy) type(bispinor) :: xy type(momentum), intent(in) :: y type(vectorspinor), intent(in) :: x integer :: k do k = 1,4 xy%a(k) = y%t * x%psi(1)%a(k) - y%x(1) * x%psi(2)%a(k) - & y%x(2) * x%psi(3)%a(k) - y%x(3) * x%psi(4)%a(k) end do end function momentum_vectorspinor @ <>= pure function vectorspinor_momentum (y, x) result (xy) type(bispinor) :: xy type(momentum), intent(in) :: x type(vectorspinor), intent(in) :: y integer :: k do k = 1,4 xy%a(k) = x%t * y%psi(1)%a(k) - x%x(1) * y%psi(2)%a(k) - & x%x(2) * y%psi(3)%a(k) - x%x(3) * y%psi(4)%a(k) end do end function vectorspinor_momentum @ \subsubsection{Unary Plus and Minus} <>= interface operator (+) module procedure plus_vectorspinor end interface private :: plus_vectorspinor interface operator (-) module procedure neg_vectorspinor end interface private :: neg_vectorspinor @ <>= pure function plus_vectorspinor (x) result (plus_x) type(vectorspinor) :: plus_x type(vectorspinor), intent(in) :: x integer :: k do k = 1,4 plus_x%psi(k) = + x%psi(k) end do end function plus_vectorspinor @ <>= pure function neg_vectorspinor (x) result (neg_x) type(vectorspinor) :: neg_x type(vectorspinor), intent(in) :: x integer :: k do k = 1,4 neg_x%psi(k) = - x%psi(k) end do end function neg_vectorspinor @ \subsubsection{Addition and Subtraction} <>= interface operator (+) module procedure add_vectorspinor end interface private :: add_vectorspinor interface operator (-) module procedure sub_vectorspinor end interface private :: sub_vectorspinor @ <>= pure function add_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy type(vectorspinor), intent(in) :: x, y integer :: k do k = 1,4 xy%psi(k) = x%psi(k) + y%psi(k) end do end function add_vectorspinor @ <>= pure function sub_vectorspinor (x, y) result (xy) type(vectorspinor) :: xy type(vectorspinor), intent(in) :: x, y integer :: k do k = 1,4 xy%psi(k) = x%psi(k) - y%psi(k) end do end function sub_vectorspinor @ \subsection{Norm} <>= interface abs module procedure abs_vectorspinor end interface private :: abs_vectorspinor @ <>= pure function abs_vectorspinor (psi) result (x) real(kind=default) :: x type(vectorspinor), intent(in) :: psi x = sqrt (real (dot_product (psi%psi(1)%a, psi%psi(1)%a) & - dot_product (psi%psi(2)%a, psi%psi(2)%a) & - dot_product (psi%psi(3)%a, psi%psi(3)%a) & - dot_product (psi%psi(4)%a, psi%psi(4)%a))) end function abs_vectorspinor @ \section{Vectors and Tensors} Condensed representation of antisymmetric rank-2 tensors: \begin{equation} \begin{pmatrix} T^{00} & T^{01} & T^{02} & T^{03} \\ T^{10} & T^{11} & T^{12} & T^{13} \\ T^{20} & T^{21} & T^{22} & T^{23} \\ T^{30} & T^{31} & T^{32} & T^{33} \end{pmatrix} = \begin{pmatrix} 0 & T_e^1 & T_e^2 & T_e^3 \\ -T_e^1 & 0 & T_b^3 & -T_b^2 \\ -T_e^2 & -T_b^3 & 0 & T_b^1 \\ -T_e^3 & T_b^2 & -T_b^1 & 0 \end{pmatrix} \end{equation} <<[[omega_vectors.f90]]>>= <> module omega_vectors use kinds use constants implicit none private public :: assignment (=), operator(==) public :: operator (*), operator (+), operator (-), operator (.wedge.) public :: abs, conjg public :: random_momentum <<[[intrinsic :: abs]]>> <<[[intrinsic :: conjg]]>> type, public :: momentum ! private (omegalib needs access, but DON'T TOUCH IT!) real(kind=default) :: t real(kind=default), dimension(3) :: x end type momentum type, public :: vector ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default) :: t complex(kind=default), dimension(3) :: x end type vector type, public :: tensor2odd ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default), dimension(3) :: e complex(kind=default), dimension(3) :: b end type tensor2odd <> integer, parameter, public :: omega_vectors_2010_01_A = 0 contains <> end module omega_vectors @ \subsection{Constructors} <>= interface assignment (=) module procedure momentum_of_array, vector_of_momentum, & vector_of_array, vector_of_double_array, & array_of_momentum, array_of_vector end interface private :: momentum_of_array, vector_of_momentum, vector_of_array, & vector_of_double_array, array_of_momentum, array_of_vector @ <>= pure subroutine momentum_of_array (m, p) type(momentum), intent(out) :: m real(kind=default), dimension(0:), intent(in) :: p m%t = p(0) m%x = p(1:3) end subroutine momentum_of_array pure subroutine array_of_momentum (p, v) real(kind=default), dimension(0:), intent(out) :: p type(momentum), intent(in) :: v p(0) = v%t p(1:3) = v%x end subroutine array_of_momentum @ <>= pure subroutine vector_of_array (v, p) type(vector), intent(out) :: v complex(kind=default), dimension(0:), intent(in) :: p v%t = p(0) v%x = p(1:3) end subroutine vector_of_array pure subroutine vector_of_double_array (v, p) type(vector), intent(out) :: v real(kind=default), dimension(0:), intent(in) :: p v%t = p(0) v%x = p(1:3) end subroutine vector_of_double_array pure subroutine array_of_vector (p, v) complex(kind=default), dimension(0:), intent(out) :: p type(vector), intent(in) :: v p(0) = v%t p(1:3) = v%x end subroutine array_of_vector @ <>= pure subroutine vector_of_momentum (v, p) type(vector), intent(out) :: v type(momentum), intent(in) :: p v%t = p%t v%x = p%x end subroutine vector_of_momentum @ <>= interface operator(==) module procedure momentum_eq end interface @ <>= elemental function momentum_eq (lhs, rhs) result (yorn) logical :: yorn type(momentum), intent(in) :: lhs type(momentum), intent(in) :: rhs yorn = all (abs(lhs%x - rhs%x) < eps0) .and. abs(lhs%t - rhs%t) < eps0 end function momentum_eq @ \subsection{Inner Products} <>= interface operator (*) module procedure momentum_momentum, vector_vector, & vector_momentum, momentum_vector, tensor2odd_tensor2odd end interface private :: momentum_momentum, vector_vector, vector_momentum, & momentum_vector, tensor2odd_tensor2odd @ <>= pure function momentum_momentum (x, y) result (xy) type(momentum), intent(in) :: x type(momentum), intent(in) :: y real(kind=default) :: xy xy = x%t*y%t - x%x(1)*y%x(1) - x%x(2)*y%x(2) - x%x(3)*y%x(3) end function momentum_momentum pure function momentum_vector (x, y) result (xy) type(momentum), intent(in) :: x type(vector), intent(in) :: y complex(kind=default) :: xy xy = x%t*y%t - x%x(1)*y%x(1) - x%x(2)*y%x(2) - x%x(3)*y%x(3) end function momentum_vector pure function vector_momentum (x, y) result (xy) type(vector), intent(in) :: x type(momentum), intent(in) :: y complex(kind=default) :: xy xy = x%t*y%t - x%x(1)*y%x(1) - x%x(2)*y%x(2) - x%x(3)*y%x(3) end function vector_momentum pure function vector_vector (x, y) result (xy) type(vector), intent(in) :: x type(vector), intent(in) :: y complex(kind=default) :: xy xy = x%t*y%t - x%x(1)*y%x(1) - x%x(2)*y%x(2) - x%x(3)*y%x(3) end function vector_vector @ Just like classical electrodynamics: \begin{equation} \frac{1}{2} T_{\mu\nu} U^{\mu\nu} = \frac{1}{2} \left( - T^{0i} U^{0i} - T^{i0} U^{i0} + T^{ij} U^{ij} \right) = T_b^k U_b^k - T_e^k U_e^k \end{equation} <>= pure function tensor2odd_tensor2odd (x, y) result (xy) type(tensor2odd), intent(in) :: x type(tensor2odd), intent(in) :: y complex(kind=default) :: xy xy = x%b(1)*y%b(1) + x%b(2)*y%b(2) + x%b(3)*y%b(3) & - x%e(1)*y%e(1) - x%e(2)*y%e(2) - x%e(3)*y%e(3) end function tensor2odd_tensor2odd @ \subsection{Not Entirely Inner Products} <>= interface operator (*) module procedure momentum_tensor2odd, tensor2odd_momentum, & vector_tensor2odd, tensor2odd_vector end interface private :: momentum_tensor2odd, tensor2odd_momentum, vector_tensor2odd, & tensor2odd_vector @ \begin{subequations} \begin{align} y^\nu = x_\mu T^{\mu\nu}: & y^0 = - x^i T^{i0} = x^i T^{0i} \\ & y^1 = x^0 T^{01} - x^2 T^{21} - x^3 T^{31} \\ & y^2 = x^0 T^{02} - x^1 T^{12} - x^3 T^{32} \\ & y^3 = x^0 T^{03} - x^1 T^{13} - x^2 T^{23} \end{align} \end{subequations} <>= pure function vector_tensor2odd (x, t2) result (xt2) type(vector), intent(in) :: x type(tensor2odd), intent(in) :: t2 type(vector) :: xt2 xt2%t = x%x(1)*t2%e(1) + x%x(2)*t2%e(2) + x%x(3)*t2%e(3) xt2%x(1) = x%t*t2%e(1) + x%x(2)*t2%b(3) - x%x(3)*t2%b(2) xt2%x(2) = x%t*t2%e(2) + x%x(3)*t2%b(1) - x%x(1)*t2%b(3) xt2%x(3) = x%t*t2%e(3) + x%x(1)*t2%b(2) - x%x(2)*t2%b(1) end function vector_tensor2odd pure function momentum_tensor2odd (x, t2) result (xt2) type(momentum), intent(in) :: x type(tensor2odd), intent(in) :: t2 type(vector) :: xt2 xt2%t = x%x(1)*t2%e(1) + x%x(2)*t2%e(2) + x%x(3)*t2%e(3) xt2%x(1) = x%t*t2%e(1) + x%x(2)*t2%b(3) - x%x(3)*t2%b(2) xt2%x(2) = x%t*t2%e(2) + x%x(3)*t2%b(1) - x%x(1)*t2%b(3) xt2%x(3) = x%t*t2%e(3) + x%x(1)*t2%b(2) - x%x(2)*t2%b(1) end function momentum_tensor2odd @ \begin{subequations} \begin{align} y^\mu = T^{\mu\nu} x_\nu : & y^0 = - T^{0i} x^i \\ & y^1 = T^{10} x^0 - T^{12} x^2 - T^{13} x^3 \\ & y^2 = T^{20} x^0 - T^{21} x^1 - T^{23} x^3 \\ & y^3 = T^{30} x^0 - T^{31} x^1 - T^{32} x^2 \end{align} \end{subequations} <>= pure function tensor2odd_vector (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 type(vector), intent(in) :: x type(vector) :: t2x t2x%t = - t2%e(1)*x%x(1) - t2%e(2)*x%x(2) - t2%e(3)*x%x(3) t2x%x(1) = - t2%e(1)*x%t + t2%b(2)*x%x(3) - t2%b(3)*x%x(2) t2x%x(2) = - t2%e(2)*x%t + t2%b(3)*x%x(1) - t2%b(1)*x%x(3) t2x%x(3) = - t2%e(3)*x%t + t2%b(1)*x%x(2) - t2%b(2)*x%x(1) end function tensor2odd_vector pure function tensor2odd_momentum (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 type(momentum), intent(in) :: x type(vector) :: t2x t2x%t = - t2%e(1)*x%x(1) - t2%e(2)*x%x(2) - t2%e(3)*x%x(3) t2x%x(1) = - t2%e(1)*x%t + t2%b(2)*x%x(3) - t2%b(3)*x%x(2) t2x%x(2) = - t2%e(2)*x%t + t2%b(3)*x%x(1) - t2%b(1)*x%x(3) t2x%x(3) = - t2%e(3)*x%t + t2%b(1)*x%x(2) - t2%b(2)*x%x(1) end function tensor2odd_momentum @ \subsection{Outer Products} <>= interface operator (.wedge.) module procedure momentum_wedge_momentum, & momentum_wedge_vector, vector_wedge_momentum, vector_wedge_vector end interface private :: momentum_wedge_momentum, momentum_wedge_vector, & vector_wedge_momentum, vector_wedge_vector @ <>= pure function momentum_wedge_momentum (x, y) result (t2) type(momentum), intent(in) :: x type(momentum), intent(in) :: y type(tensor2odd) :: t2 t2%e = x%t * y%x - x%x * y%t t2%b(1) = x%x(2) * y%x(3) - x%x(3) * y%x(2) t2%b(2) = x%x(3) * y%x(1) - x%x(1) * y%x(3) t2%b(3) = x%x(1) * y%x(2) - x%x(2) * y%x(1) end function momentum_wedge_momentum pure function momentum_wedge_vector (x, y) result (t2) type(momentum), intent(in) :: x type(vector), intent(in) :: y type(tensor2odd) :: t2 t2%e = x%t * y%x - x%x * y%t t2%b(1) = x%x(2) * y%x(3) - x%x(3) * y%x(2) t2%b(2) = x%x(3) * y%x(1) - x%x(1) * y%x(3) t2%b(3) = x%x(1) * y%x(2) - x%x(2) * y%x(1) end function momentum_wedge_vector pure function vector_wedge_momentum (x, y) result (t2) type(vector), intent(in) :: x type(momentum), intent(in) :: y type(tensor2odd) :: t2 t2%e = x%t * y%x - x%x * y%t t2%b(1) = x%x(2) * y%x(3) - x%x(3) * y%x(2) t2%b(2) = x%x(3) * y%x(1) - x%x(1) * y%x(3) t2%b(3) = x%x(1) * y%x(2) - x%x(2) * y%x(1) end function vector_wedge_momentum pure function vector_wedge_vector (x, y) result (t2) type(vector), intent(in) :: x type(vector), intent(in) :: y type(tensor2odd) :: t2 t2%e = x%t * y%x - x%x * y%t t2%b(1) = x%x(2) * y%x(3) - x%x(3) * y%x(2) t2%b(2) = x%x(3) * y%x(1) - x%x(1) * y%x(3) t2%b(3) = x%x(1) * y%x(2) - x%x(2) * y%x(1) end function vector_wedge_vector @ \subsection{Vector Space} \subsubsection{Scalar Multiplication} <>= interface operator (*) module procedure integer_momentum, real_momentum, double_momentum, & complex_momentum, dcomplex_momentum, & integer_vector, real_vector, double_vector, & complex_vector, dcomplex_vector, & integer_tensor2odd, real_tensor2odd, double_tensor2odd, & complex_tensor2odd, dcomplex_tensor2odd, & momentum_integer, momentum_real, momentum_double, & momentum_complex, momentum_dcomplex, & vector_integer, vector_real, vector_double, & vector_complex, vector_dcomplex, & tensor2odd_integer, tensor2odd_real, tensor2odd_double, & tensor2odd_complex, tensor2odd_dcomplex end interface private :: integer_momentum, real_momentum, double_momentum, & complex_momentum, dcomplex_momentum, integer_vector, real_vector, & double_vector, complex_vector, dcomplex_vector, & integer_tensor2odd, real_tensor2odd, double_tensor2odd, & complex_tensor2odd, dcomplex_tensor2odd, momentum_integer, & momentum_real, momentum_double, momentum_complex, & momentum_dcomplex, vector_integer, vector_real, vector_double, & vector_complex, vector_dcomplex, tensor2odd_integer, & tensor2odd_real, tensor2odd_double, tensor2odd_complex, & tensor2odd_dcomplex @ <>= pure function integer_momentum (x, y) result (xy) integer, intent(in) :: x type(momentum), intent(in) :: y type(momentum) :: xy xy%t = x * y%t xy%x = x * y%x end function integer_momentum pure function real_momentum (x, y) result (xy) real(kind=single), intent(in) :: x type(momentum), intent(in) :: y type(momentum) :: xy xy%t = x * y%t xy%x = x * y%x end function real_momentum pure function double_momentum (x, y) result (xy) real(kind=default), intent(in) :: x type(momentum), intent(in) :: y type(momentum) :: xy xy%t = x * y%t xy%x = x * y%x end function double_momentum pure function complex_momentum (x, y) result (xy) complex(kind=single), intent(in) :: x type(momentum), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function complex_momentum pure function dcomplex_momentum (x, y) result (xy) complex(kind=default), intent(in) :: x type(momentum), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function dcomplex_momentum @ <>= pure function integer_vector (x, y) result (xy) integer, intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function integer_vector pure function real_vector (x, y) result (xy) real(kind=single), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function real_vector pure function double_vector (x, y) result (xy) real(kind=default), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function double_vector pure function complex_vector (x, y) result (xy) complex(kind=single), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function complex_vector pure function dcomplex_vector (x, y) result (xy) complex(kind=default), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function dcomplex_vector @ <>= pure function integer_tensor2odd (x, t2) result (xt2) integer, intent(in) :: x type(tensor2odd), intent(in) :: t2 type(tensor2odd) :: xt2 xt2%e = x * t2%e xt2%b = x * t2%b end function integer_tensor2odd pure function real_tensor2odd (x, t2) result (xt2) real(kind=single), intent(in) :: x type(tensor2odd), intent(in) :: t2 type(tensor2odd) :: xt2 xt2%e = x * t2%e xt2%b = x * t2%b end function real_tensor2odd pure function double_tensor2odd (x, t2) result (xt2) real(kind=default), intent(in) :: x type(tensor2odd), intent(in) :: t2 type(tensor2odd) :: xt2 xt2%e = x * t2%e xt2%b = x * t2%b end function double_tensor2odd pure function complex_tensor2odd (x, t2) result (xt2) complex(kind=single), intent(in) :: x type(tensor2odd), intent(in) :: t2 type(tensor2odd) :: xt2 xt2%e = x * t2%e xt2%b = x * t2%b end function complex_tensor2odd pure function dcomplex_tensor2odd (x, t2) result (xt2) complex(kind=default), intent(in) :: x type(tensor2odd), intent(in) :: t2 type(tensor2odd) :: xt2 xt2%e = x * t2%e xt2%b = x * t2%b end function dcomplex_tensor2odd @ <>= pure function momentum_integer (y, x) result (xy) integer, intent(in) :: x type(momentum), intent(in) :: y type(momentum) :: xy xy%t = x * y%t xy%x = x * y%x end function momentum_integer pure function momentum_real (y, x) result (xy) real(kind=single), intent(in) :: x type(momentum), intent(in) :: y type(momentum) :: xy xy%t = x * y%t xy%x = x * y%x end function momentum_real pure function momentum_double (y, x) result (xy) real(kind=default), intent(in) :: x type(momentum), intent(in) :: y type(momentum) :: xy xy%t = x * y%t xy%x = x * y%x end function momentum_double pure function momentum_complex (y, x) result (xy) complex(kind=single), intent(in) :: x type(momentum), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function momentum_complex pure function momentum_dcomplex (y, x) result (xy) complex(kind=default), intent(in) :: x type(momentum), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function momentum_dcomplex @ <>= pure function vector_integer (y, x) result (xy) integer, intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function vector_integer pure function vector_real (y, x) result (xy) real(kind=single), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function vector_real pure function vector_double (y, x) result (xy) real(kind=default), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function vector_double pure function vector_complex (y, x) result (xy) complex(kind=single), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function vector_complex pure function vector_dcomplex (y, x) result (xy) complex(kind=default), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x * y%t xy%x = x * y%x end function vector_dcomplex @ <>= pure function tensor2odd_integer (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 integer, intent(in) :: x type(tensor2odd) :: t2x t2x%e = x * t2%e t2x%b = x * t2%b end function tensor2odd_integer pure function tensor2odd_real (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 real(kind=single), intent(in) :: x type(tensor2odd) :: t2x t2x%e = x * t2%e t2x%b = x * t2%b end function tensor2odd_real pure function tensor2odd_double (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 real(kind=default), intent(in) :: x type(tensor2odd) :: t2x t2x%e = x * t2%e t2x%b = x * t2%b end function tensor2odd_double pure function tensor2odd_complex (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 complex(kind=single), intent(in) :: x type(tensor2odd) :: t2x t2x%e = x * t2%e t2x%b = x * t2%b end function tensor2odd_complex pure function tensor2odd_dcomplex (t2, x) result (t2x) type(tensor2odd), intent(in) :: t2 complex(kind=default), intent(in) :: x type(tensor2odd) :: t2x t2x%e = x * t2%e t2x%b = x * t2%b end function tensor2odd_dcomplex @ \subsubsection{Unary Plus and Minus} <>= interface operator (+) module procedure plus_momentum, plus_vector, plus_tensor2odd end interface private :: plus_momentum, plus_vector, plus_tensor2odd interface operator (-) module procedure neg_momentum, neg_vector, neg_tensor2odd end interface private :: neg_momentum, neg_vector, neg_tensor2odd @ <>= pure function plus_momentum (x) result (plus_x) type(momentum), intent(in) :: x type(momentum) :: plus_x plus_x = x end function plus_momentum pure function neg_momentum (x) result (neg_x) type(momentum), intent(in) :: x type(momentum) :: neg_x neg_x%t = - x%t neg_x%x = - x%x end function neg_momentum @ <>= pure function plus_vector (x) result (plus_x) type(vector), intent(in) :: x type(vector) :: plus_x plus_x = x end function plus_vector pure function neg_vector (x) result (neg_x) type(vector), intent(in) :: x type(vector) :: neg_x neg_x%t = - x%t neg_x%x = - x%x end function neg_vector @ <>= pure function plus_tensor2odd (x) result (plus_x) type(tensor2odd), intent(in) :: x type(tensor2odd) :: plus_x plus_x = x end function plus_tensor2odd pure function neg_tensor2odd (x) result (neg_x) type(tensor2odd), intent(in) :: x type(tensor2odd) :: neg_x neg_x%e = - x%e neg_x%b = - x%b end function neg_tensor2odd @ \subsubsection{Addition and Subtraction} <>= interface operator (+) module procedure add_momentum, add_vector, & add_vector_momentum, add_momentum_vector, add_tensor2odd end interface private :: add_momentum, add_vector, add_vector_momentum, & add_momentum_vector, add_tensor2odd interface operator (-) module procedure sub_momentum, sub_vector, & sub_vector_momentum, sub_momentum_vector, sub_tensor2odd end interface private :: sub_momentum, sub_vector, sub_vector_momentum, & sub_momentum_vector, sub_tensor2odd @ <>= pure function add_momentum (x, y) result (xy) type(momentum), intent(in) :: x, y type(momentum) :: xy xy%t = x%t + y%t xy%x = x%x + y%x end function add_momentum pure function add_vector (x, y) result (xy) type(vector), intent(in) :: x, y type(vector) :: xy xy%t = x%t + y%t xy%x = x%x + y%x end function add_vector pure function add_momentum_vector (x, y) result (xy) type(momentum), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x%t + y%t xy%x = x%x + y%x end function add_momentum_vector pure function add_vector_momentum (x, y) result (xy) type(vector), intent(in) :: x type(momentum), intent(in) :: y type(vector) :: xy xy%t = x%t + y%t xy%x = x%x + y%x end function add_vector_momentum pure function add_tensor2odd (x, y) result (xy) type(tensor2odd), intent(in) :: x, y type(tensor2odd) :: xy xy%e = x%e + y%e xy%b = x%b + y%b end function add_tensor2odd @ <>= pure function sub_momentum (x, y) result (xy) type(momentum), intent(in) :: x, y type(momentum) :: xy xy%t = x%t - y%t xy%x = x%x - y%x end function sub_momentum pure function sub_vector (x, y) result (xy) type(vector), intent(in) :: x, y type(vector) :: xy xy%t = x%t - y%t xy%x = x%x - y%x end function sub_vector pure function sub_momentum_vector (x, y) result (xy) type(momentum), intent(in) :: x type(vector), intent(in) :: y type(vector) :: xy xy%t = x%t - y%t xy%x = x%x - y%x end function sub_momentum_vector pure function sub_vector_momentum (x, y) result (xy) type(vector), intent(in) :: x type(momentum), intent(in) :: y type(vector) :: xy xy%t = x%t - y%t xy%x = x%x - y%x end function sub_vector_momentum pure function sub_tensor2odd (x, y) result (xy) type(tensor2odd), intent(in) :: x, y type(tensor2odd) :: xy xy%e = x%e - y%e xy%b = x%b - y%b end function sub_tensor2odd @ \subsection{Norm} \emph{Not} the covariant length! <>= interface abs module procedure abs_momentum, abs_vector, abs_tensor2odd end interface private :: abs_momentum, abs_vector, abs_tensor2odd @ <>= pure function abs_momentum (x) result (absx) type(momentum), intent(in) :: x real(kind=default) :: absx absx = sqrt (real (x%t*x%t + dot_product (x%x, x%x))) end function abs_momentum pure function abs_vector (x) result (absx) type(vector), intent(in) :: x real(kind=default) :: absx absx = sqrt (real (conjg(x%t)*x%t + dot_product (x%x, x%x))) end function abs_vector pure function abs_tensor2odd (x) result (absx) type(tensor2odd), intent(in) :: x real(kind=default) :: absx absx = sqrt (real (dot_product (x%e, x%e) + dot_product (x%b, x%b))) end function abs_tensor2odd @ \subsection{Conjugation} <>= interface conjg module procedure conjg_momentum, conjg_vector, conjg_tensor2odd end interface private :: conjg_momentum, conjg_vector, conjg_tensor2odd @ <>= pure function conjg_momentum (x) result (conjg_x) type(momentum), intent(in) :: x type(momentum) :: conjg_x conjg_x = x end function conjg_momentum pure function conjg_vector (x) result (conjg_x) type(vector), intent(in) :: x type(vector) :: conjg_x conjg_x%t = conjg (x%t) conjg_x%x = conjg (x%x) end function conjg_vector pure function conjg_tensor2odd (t2) result (conjg_t2) type(tensor2odd), intent(in) :: t2 type(tensor2odd) :: conjg_t2 conjg_t2%e = conjg (t2%e) conjg_t2%b = conjg (t2%b) end function conjg_tensor2odd @ \subsection{$\epsilon$-Tensors} \begin{equation} \epsilon_{0123} = 1 = - \epsilon^{0123} \end{equation} in particular \begin{equation} \epsilon(p_1,p_2,p_3,p_4) = \epsilon_{\mu_1\mu_2\mu_3\mu_4} p_1^{\mu_1}p_2^{\mu_2}p_3^{\mu_3}p_4^{\mu_4} = p_1^0 p_2^1 p_3^2 p_4^3 \pm \ldots \end{equation} <>= interface pseudo_scalar module procedure pseudo_scalar_momentum, pseudo_scalar_vector, & pseudo_scalar_vec_mom end interface public :: pseudo_scalar private :: pseudo_scalar_momentum, pseudo_scalar_vector @ <>= pure function pseudo_scalar_momentum (p1, p2, p3, p4) result (eps1234) type(momentum), intent(in) :: p1, p2, p3, p4 real(kind=default) :: eps1234 eps1234 = & p1%t * p2%x(1) * (p3%x(2) * p4%x(3) - p3%x(3) * p4%x(2)) & + p1%t * p2%x(2) * (p3%x(3) * p4%x(1) - p3%x(1) * p4%x(3)) & + p1%t * p2%x(3) * (p3%x(1) * p4%x(2) - p3%x(2) * p4%x(1)) & - p1%x(1) * p2%x(2) * (p3%x(3) * p4%t - p3%t * p4%x(3)) & - p1%x(1) * p2%x(3) * (p3%t * p4%x(2) - p3%x(2) * p4%t ) & - p1%x(1) * p2%t * (p3%x(2) * p4%x(3) - p3%x(3) * p4%x(2)) & + p1%x(2) * p2%x(3) * (p3%t * p4%x(1) - p3%x(1) * p4%t ) & + p1%x(2) * p2%t * (p3%x(1) * p4%x(3) - p3%x(3) * p4%x(1)) & + p1%x(2) * p2%x(1) * (p3%x(3) * p4%t - p3%t * p4%x(3)) & - p1%x(3) * p2%t * (p3%x(1) * p4%x(2) - p3%x(2) * p4%x(1)) & - p1%x(3) * p2%x(1) * (p3%x(2) * p4%t - p3%t * p4%x(2)) & - p1%x(3) * p2%x(2) * (p3%t * p4%x(1) - p3%x(1) * p4%t ) end function pseudo_scalar_momentum @ <>= pure function pseudo_scalar_vector (p1, p2, p3, p4) result (eps1234) type(vector), intent(in) :: p1, p2, p3, p4 complex(kind=default) :: eps1234 eps1234 = & p1%t * p2%x(1) * (p3%x(2) * p4%x(3) - p3%x(3) * p4%x(2)) & + p1%t * p2%x(2) * (p3%x(3) * p4%x(1) - p3%x(1) * p4%x(3)) & + p1%t * p2%x(3) * (p3%x(1) * p4%x(2) - p3%x(2) * p4%x(1)) & - p1%x(1) * p2%x(2) * (p3%x(3) * p4%t - p3%t * p4%x(3)) & - p1%x(1) * p2%x(3) * (p3%t * p4%x(2) - p3%x(2) * p4%t ) & - p1%x(1) * p2%t * (p3%x(2) * p4%x(3) - p3%x(3) * p4%x(2)) & + p1%x(2) * p2%x(3) * (p3%t * p4%x(1) - p3%x(1) * p4%t ) & + p1%x(2) * p2%t * (p3%x(1) * p4%x(3) - p3%x(3) * p4%x(1)) & + p1%x(2) * p2%x(1) * (p3%x(3) * p4%t - p3%t * p4%x(3)) & - p1%x(3) * p2%t * (p3%x(1) * p4%x(2) - p3%x(2) * p4%x(1)) & - p1%x(3) * p2%x(1) * (p3%x(2) * p4%t - p3%t * p4%x(2)) & - p1%x(3) * p2%x(2) * (p3%t * p4%x(1) - p3%x(1) * p4%t ) end function pseudo_scalar_vector @ <>= pure function pseudo_scalar_vec_mom (p1, v1, p2, v2) result (eps1234) type(momentum), intent(in) :: p1, p2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: eps1234 eps1234 = & p1%t * v1%x(1) * (p2%x(2) * v2%x(3) - p2%x(3) * v2%x(2)) & + p1%t * v1%x(2) * (p2%x(3) * v2%x(1) - p2%x(1) * v2%x(3)) & + p1%t * v1%x(3) * (p2%x(1) * v2%x(2) - p2%x(2) * v2%x(1)) & - p1%x(1) * v1%x(2) * (p2%x(3) * v2%t - p2%t * v2%x(3)) & - p1%x(1) * v1%x(3) * (p2%t * v2%x(2) - p2%x(2) * v2%t ) & - p1%x(1) * v1%t * (p2%x(2) * v2%x(3) - p2%x(3) * v2%x(2)) & + p1%x(2) * v1%x(3) * (p2%t * v2%x(1) - p2%x(1) * v2%t ) & + p1%x(2) * v1%t * (p2%x(1) * v2%x(3) - p2%x(3) * v2%x(1)) & + p1%x(2) * v1%x(1) * (p2%x(3) * v2%t - p2%t * v2%x(3)) & - p1%x(3) * v1%t * (p2%x(1) * v2%x(2) - p2%x(2) * v2%x(1)) & - p1%x(3) * v1%x(1) * (p2%x(2) * v2%t - p2%t * v2%x(2)) & - p1%x(3) * v1%x(2) * (p2%t * v2%x(1) - p2%x(1) * v2%t ) end function pseudo_scalar_vec_mom @ \begin{equation} \epsilon_\mu(p_1,p_2,p_3) = \epsilon_{\mu\mu_1\mu_2\mu_3} p_1^{\mu_1}p_2^{\mu_2}p_3^{\mu_3} \end{equation} i.\,e. \begin{subequations} \begin{align} \epsilon_0(p_1,p_2,p_3) &= p_1^1 p_2^2 p_3^3 \pm \ldots \\ \epsilon_1(p_1,p_2,p_3) &= p_1^2 p_2^3 p_3^0 \pm \ldots \\ \epsilon_2(p_1,p_2,p_3) &= - p_1^3 p_2^0 p_3^1 \pm \ldots \\ \epsilon_3(p_1,p_2,p_3) &= p_1^0 p_2^1 p_3^2 \pm \ldots \end{align} \end{subequations} <>= interface pseudo_vector module procedure pseudo_vector_momentum, pseudo_vector_vector, & pseudo_vector_vec_mom end interface public :: pseudo_vector private :: pseudo_vector_momentum, pseudo_vector_vector @ <>= pure function pseudo_vector_momentum (p1, p2, p3) result (eps123) type(momentum), intent(in) :: p1, p2, p3 type(momentum) :: eps123 eps123%t = & + p1%x(1) * (p2%x(2) * p3%x(3) - p2%x(3) * p3%x(2)) & + p1%x(2) * (p2%x(3) * p3%x(1) - p2%x(1) * p3%x(3)) & + p1%x(3) * (p2%x(1) * p3%x(2) - p2%x(2) * p3%x(1)) eps123%x(1) = & + p1%x(2) * (p2%x(3) * p3%t - p2%t * p3%x(3)) & + p1%x(3) * (p2%t * p3%x(2) - p2%x(2) * p3%t ) & + p1%t * (p2%x(2) * p3%x(3) - p2%x(3) * p3%x(2)) eps123%x(2) = & - p1%x(3) * (p2%t * p3%x(1) - p2%x(1) * p3%t ) & - p1%t * (p2%x(1) * p3%x(3) - p2%x(3) * p3%x(1)) & - p1%x(1) * (p2%x(3) * p3%t - p2%t * p3%x(3)) eps123%x(3) = & + p1%t * (p2%x(1) * p3%x(2) - p2%x(2) * p3%x(1)) & + p1%x(1) * (p2%x(2) * p3%t - p2%t * p3%x(2)) & + p1%x(2) * (p2%t * p3%x(1) - p2%x(1) * p3%t ) end function pseudo_vector_momentum @ <>= pure function pseudo_vector_vector (p1, p2, p3) result (eps123) type(vector), intent(in) :: p1, p2, p3 type(vector) :: eps123 eps123%t = & + p1%x(1) * (p2%x(2) * p3%x(3) - p2%x(3) * p3%x(2)) & + p1%x(2) * (p2%x(3) * p3%x(1) - p2%x(1) * p3%x(3)) & + p1%x(3) * (p2%x(1) * p3%x(2) - p2%x(2) * p3%x(1)) eps123%x(1) = & + p1%x(2) * (p2%x(3) * p3%t - p2%t * p3%x(3)) & + p1%x(3) * (p2%t * p3%x(2) - p2%x(2) * p3%t ) & + p1%t * (p2%x(2) * p3%x(3) - p2%x(3) * p3%x(2)) eps123%x(2) = & - p1%x(3) * (p2%t * p3%x(1) - p2%x(1) * p3%t ) & - p1%t * (p2%x(1) * p3%x(3) - p2%x(3) * p3%x(1)) & - p1%x(1) * (p2%x(3) * p3%t - p2%t * p3%x(3)) eps123%x(3) = & + p1%t * (p2%x(1) * p3%x(2) - p2%x(2) * p3%x(1)) & + p1%x(1) * (p2%x(2) * p3%t - p2%t * p3%x(2)) & + p1%x(2) * (p2%t * p3%x(1) - p2%x(1) * p3%t ) end function pseudo_vector_vector @ <>= pure function pseudo_vector_vec_mom (p1, p2, v) result (eps123) type(momentum), intent(in) :: p1, p2 type(vector), intent(in) :: v type(vector) :: eps123 eps123%t = & + p1%x(1) * (p2%x(2) * v%x(3) - p2%x(3) * v%x(2)) & + p1%x(2) * (p2%x(3) * v%x(1) - p2%x(1) * v%x(3)) & + p1%x(3) * (p2%x(1) * v%x(2) - p2%x(2) * v%x(1)) eps123%x(1) = & + p1%x(2) * (p2%x(3) * v%t - p2%t * v%x(3)) & + p1%x(3) * (p2%t * v%x(2) - p2%x(2) * v%t ) & + p1%t * (p2%x(2) * v%x(3) - p2%x(3) * v%x(2)) eps123%x(2) = & - p1%x(3) * (p2%t * v%x(1) - p2%x(1) * v%t ) & - p1%t * (p2%x(1) * v%x(3) - p2%x(3) * v%x(1)) & - p1%x(1) * (p2%x(3) * v%t - p2%t * v%x(3)) eps123%x(3) = & + p1%t * (p2%x(1) * v%x(2) - p2%x(2) * v%x(1)) & + p1%x(1) * (p2%x(2) * v%t - p2%t * v%x(2)) & + p1%x(2) * (p2%t * v%x(1) - p2%x(1) * v%t ) end function pseudo_vector_vec_mom @ \subsection{Utilities} <>= @ <>= subroutine random_momentum (p, pabs, m) type(momentum), intent(out) :: p real(kind=default), intent(in) :: pabs, m real(kind=default), dimension(2) :: r real(kind=default) :: phi, cos_th call random_number (r) phi = 2*PI * r(1) cos_th = 2 * r(2) - 1 p%t = sqrt (pabs**2 + m**2) p%x = pabs * (/ cos_th * cos(phi), cos_th * sin(phi), sqrt (1 - cos_th**2) /) end subroutine random_momentum @ \section{Polarization vectors} <<[[omega_polarizations.f90]]>>= <> module omega_polarizations use kinds use constants use omega_vectors implicit none private <> integer, parameter, public :: omega_polarizations_2010_01_A = 0 contains <> end module omega_polarizations @ Here we use a phase convention for the polarization vectors compatible with the angular momentum coupling to spin 3/2 and spin 2. \begin{subequations} \begin{align} \epsilon^\mu_1(k) &= \frac{1}{|\vec k|\sqrt{k_x^2+k_y^2}} \left(0; k_z k_x, k_y k_z, - k_x^2 - k_y^2\right) \\ \epsilon^\mu_2(k) &= \frac{1}{\sqrt{k_x^2+k_y^2}} \left(0; -k_y, k_x, 0\right) \\ \epsilon^\mu_3(k) &= \frac{k_0}{m|\vec k|} \left({\vec k}^2/k_0; k_x, k_y, k_z\right) \end{align} \end{subequations} and \begin{subequations} \begin{align} \epsilon^\mu_\pm(k) &= \frac{1}{\sqrt{2}} (\epsilon^\mu_1(k) \pm \ii\epsilon^\mu_2(k) ) \\ \epsilon^\mu_0(k) &= \epsilon^\mu_3(k) \end{align} \end{subequations} i.\,e. \begin{subequations} \begin{align} \epsilon^\mu_+(k) &= \frac{1}{\sqrt{2}\sqrt{k_x^2+k_y^2}} \left(0; \frac{k_zk_x}{|\vec k|} - \ii k_y, \frac{k_yk_z}{|\vec k|} + \ii k_x, - \frac{k_x^2+k_y^2}{|\vec k|}\right) \\ \epsilon^\mu_-(k) &= \frac{1}{\sqrt{2}\sqrt{k_x^2+k_y^2}} \left(0; \frac{k_zk_x}{|\vec k|} + \ii k_y, \frac{k_yk_z}{|\vec k|} - \ii k_x, -\frac{k_x^2+k_y^2}{|\vec k|}\right) \\ \epsilon^\mu_0(k) &= \frac{k_0}{m|\vec k|} \left({\vec k}^2/k_0; k_x, k_y, k_z\right) \end{align} \end{subequations} Determining the mass from the momenta is a numerically haphazardous for light particles. Therefore, we accept some redundancy and pass the mass explicitely. <>= public :: eps @ <>= pure function eps (m, k, s) result (e) type(vector) :: e real(kind=default), intent(in) :: m type(momentum), intent(in) :: k integer, intent(in) :: s real(kind=default) :: kt, kabs, kabs2, sqrt2 sqrt2 = sqrt (2.0_default) kabs2 = dot_product (k%x, k%x) e%t = 0 e%x = 0 if (kabs2 > 0) then kabs = sqrt (kabs2) select case (s) case (1) kt = sqrt (k%x(1)**2 + k%x(2)**2) if (abs(kt) <= epsilon(kt) * kabs) then if (k%x(3) > 0) then e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, 1, kind=default) / sqrt2 else e%x(1) = cmplx ( - 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, 1, kind=default) / sqrt2 end if else e%x(1) = cmplx ( k%x(3)*k%x(1)/kabs, & - k%x(2), kind=default) / kt / sqrt2 e%x(2) = cmplx ( k%x(2)*k%x(3)/kabs, & k%x(1), kind=default) / kt / sqrt2 e%x(3) = - kt / kabs / sqrt2 end if case (-1) kt = sqrt (k%x(1)**2 + k%x(2)**2) if (abs(kt) <= epsilon(kt) * kabs) then if (k%x(3) > 0) then e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 else e%x(1) = cmplx ( -1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 end if else e%x(1) = cmplx ( k%x(3)*k%x(1)/kabs, & k%x(2), kind=default) / kt / sqrt2 e%x(2) = cmplx ( k%x(2)*k%x(3)/kabs, & - k%x(1), kind=default) / kt / sqrt2 e%x(3) = - kt / kabs / sqrt2 end if case (0) if (m > 0) then e%t = kabs / m e%x = k%t / (m*kabs) * k%x end if case (3) e = (0,1) * k case (4) if (m > 0) then e = (1 / m) * k else e = (1 / k%t) * k end if end select else !!! for particles in their rest frame defined to be !!! polarized along the 3-direction select case (s) case (1) e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, 1, kind=default) / sqrt2 case (-1) e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 case (0) if (m > 0) then e%x(3) = 1 end if case (4) if (m > 0) then e = (1 / m) * k else e = (1 / k%t) * k end if end select end if end function eps @ \section{Polarization vectors revisited} <<[[omega_polarizations_madgraph.f90]]>>= <> module omega_polarizations_madgraph use kinds use constants use omega_vectors implicit none private <> integer, parameter, public :: omega_pols_madgraph_2010_01_A = 0 contains <> end module omega_polarizations_madgraph @ This set of polarization vectors is compatible with HELAS~\cite{HELAS}: \begin{subequations} \begin{align} \epsilon^\mu_1(k) &= \frac{1}{|\vec k|\sqrt{k_x^2+k_y^2}} \left(0; k_z k_x, k_y k_z, - k_x^2 - k_y^2\right) \\ \epsilon^\mu_2(k) &= \frac{1}{\sqrt{k_x^2+k_y^2}} \left(0; -k_y, k_x, 0\right) \\ \epsilon^\mu_3(k) &= \frac{k_0}{m|\vec k|} \left({\vec k}^2/k_0; k_x, k_y, k_z\right) \end{align} \end{subequations} and \begin{subequations} \begin{align} \epsilon^\mu_\pm(k) &= \frac{1}{\sqrt{2}} (\mp \epsilon^\mu_1(k) - \ii\epsilon^\mu_2(k) ) \\ \epsilon^\mu_0(k) &= \epsilon^\mu_3(k) \end{align} \end{subequations} i.\,e. \begin{subequations} \begin{align} \epsilon^\mu_+(k) &= \frac{1}{\sqrt{2}\sqrt{k_x^2+k_y^2}} \left(0; -\frac{k_zk_x}{|\vec k|} + \ii k_y, -\frac{k_yk_z}{|\vec k|} - \ii k_x, \frac{k_x^2+k_y^2}{|\vec k|}\right) \\ \epsilon^\mu_-(k) &= \frac{1}{\sqrt{2}\sqrt{k_x^2+k_y^2}} \left(0; \frac{k_zk_x}{|\vec k|} + \ii k_y, \frac{k_yk_z}{|\vec k|} - \ii k_x, -\frac{k_x^2+k_y^2}{|\vec k|}\right) \\ \epsilon^\mu_0(k) &= \frac{k_0}{m|\vec k|} \left({\vec k}^2/k_0; k_x, k_y, k_z\right) \end{align} \end{subequations} Fortunately, for comparing with squared matrix generated by Madgraph we can also use the modified version, since the difference is only a phase and does \emph{not} mix helicity states. @ Determining the mass from the momenta is a numerically haphazardous for light particles. Therefore, we accept some redundancy and pass the mass explicitely. <>= public :: eps @ <>= pure function eps (m, k, s) result (e) type(vector) :: e real(kind=default), intent(in) :: m type(momentum), intent(in) :: k integer, intent(in) :: s real(kind=default) :: kt, kabs, kabs2, sqrt2 sqrt2 = sqrt (2.0_default) kabs2 = dot_product (k%x, k%x) e%t = 0 e%x = 0 if (kabs2 > 0) then kabs = sqrt (kabs2) select case (s) case (1) kt = sqrt (k%x(1)**2 + k%x(2)**2) if (abs(kt) <= epsilon(kt) * kabs) then if (k%x(3) > 0) then e%x(1) = cmplx ( - 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 else e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 end if else e%x(1) = cmplx ( - k%x(3)*k%x(1)/kabs, & k%x(2), kind=default) / kt / sqrt2 e%x(2) = cmplx ( - k%x(2)*k%x(3)/kabs, & - k%x(1), kind=default) / kt / sqrt2 e%x(3) = kt / kabs / sqrt2 end if case (-1) kt = sqrt (k%x(1)**2 + k%x(2)**2) if (abs(kt) <= epsilon(kt) * kabs) then if (k%x(3) > 0) then e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 else e%x(1) = cmplx ( -1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 end if else e%x(1) = cmplx ( k%x(3)*k%x(1)/kabs, & k%x(2), kind=default) / kt / sqrt2 e%x(2) = cmplx ( k%x(2)*k%x(3)/kabs, & - k%x(1), kind=default) / kt / sqrt2 e%x(3) = - kt / kabs / sqrt2 end if case (0) if (m > 0) then e%t = kabs / m e%x = k%t / (m*kabs) * k%x end if case (3) e = (0,1) * k case (4) if (m > 0) then e = (1 / m) * k else e = (1 / k%t) * k end if end select else !!! for particles in their rest frame defined to be !!! polarized along the 3-direction select case (s) case (1) e%x(1) = cmplx ( - 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 case (-1) e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, - 1, kind=default) / sqrt2 case (0) if (m > 0) then e%x(3) = 1 end if case (4) if (m > 0) then e = (1 / m) * k else e = (1 / k%t) * k end if end select end if end function eps @ \section{Symmetric Tensors} Spin-2 polarization tensors are symmetric, transversal and traceless \begin{subequations} \begin{align} \epsilon^{\mu\nu}_{m}(k) &= \epsilon^{\nu\mu}_{m}(k) \\ k_\mu \epsilon^{\mu\nu}_{m}(k) &= k_\nu \epsilon^{\mu\nu}_{m}(k) = 0 \\ \epsilon^{\mu}_{m,\mu}(k) &= 0 \end{align} \end{subequations} with $m=1,2,3,4,5$. Our current representation is redundant and does \emph{not} enforce symmetry or tracelessness. <<[[omega_tensors.f90]]>>= <> module omega_tensors use kinds use constants use omega_vectors implicit none private public :: operator (*), operator (+), operator (-), & operator (.tprod.) public :: abs, conjg <<[[intrinsic :: abs]]>> <<[[intrinsic :: conjg]]>> type, public :: tensor ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default), dimension(0:3,0:3) :: t end type tensor <> integer, parameter, public :: omega_tensors_2010_01_A = 0 contains <> end module omega_tensors @ \subsection{Vector Space} \subsubsection{Scalar Multliplication} <>= interface operator (*) module procedure integer_tensor, real_tensor, double_tensor, & complex_tensor, dcomplex_tensor end interface private :: integer_tensor, real_tensor, double_tensor private :: complex_tensor, dcomplex_tensor @ <>= pure function integer_tensor (x, y) result (xy) integer, intent(in) :: x type(tensor), intent(in) :: y type(tensor) :: xy xy%t = x * y%t end function integer_tensor pure function real_tensor (x, y) result (xy) real(kind=single), intent(in) :: x type(tensor), intent(in) :: y type(tensor) :: xy xy%t = x * y%t end function real_tensor pure function double_tensor (x, y) result (xy) real(kind=default), intent(in) :: x type(tensor), intent(in) :: y type(tensor) :: xy xy%t = x * y%t end function double_tensor pure function complex_tensor (x, y) result (xy) complex(kind=single), intent(in) :: x type(tensor), intent(in) :: y type(tensor) :: xy xy%t = x * y%t end function complex_tensor pure function dcomplex_tensor (x, y) result (xy) complex(kind=default), intent(in) :: x type(tensor), intent(in) :: y type(tensor) :: xy xy%t = x * y%t end function dcomplex_tensor @ \subsubsection{Addition and Subtraction} <>= interface operator (+) module procedure plus_tensor end interface private :: plus_tensor interface operator (-) module procedure neg_tensor end interface private :: neg_tensor @ <>= pure function plus_tensor (t1) result (t2) type(tensor), intent(in) :: t1 type(tensor) :: t2 t2 = t1 end function plus_tensor pure function neg_tensor (t1) result (t2) type(tensor), intent(in) :: t1 type(tensor) :: t2 t2%t = - t1%t end function neg_tensor @ <>= interface operator (+) module procedure add_tensor end interface private :: add_tensor interface operator (-) module procedure sub_tensor end interface private :: sub_tensor @ <>= pure function add_tensor (x, y) result (xy) type(tensor), intent(in) :: x, y type(tensor) :: xy xy%t = x%t + y%t end function add_tensor pure function sub_tensor (x, y) result (xy) type(tensor), intent(in) :: x, y type(tensor) :: xy xy%t = x%t - y%t end function sub_tensor @ <>= interface operator (.tprod.) module procedure out_prod_vv, out_prod_vm, & out_prod_mv, out_prod_mm end interface private :: out_prod_vv, out_prod_vm, & out_prod_mv, out_prod_mm @ <>= pure function out_prod_vv (v, w) result (t) type(tensor) :: t type(vector), intent(in) :: v, w integer :: i, j t%t(0,0) = v%t * w%t t%t(0,1:3) = v%t * w%x t%t(1:3,0) = v%x * w%t do i = 1, 3 do j = 1, 3 t%t(i,j) = v%x(i) * w%x(j) end do end do end function out_prod_vv @ <>= pure function out_prod_vm (v, m) result (t) type(tensor) :: t type(vector), intent(in) :: v type(momentum), intent(in) :: m integer :: i, j t%t(0,0) = v%t * m%t t%t(0,1:3) = v%t * m%x t%t(1:3,0) = v%x * m%t do i = 1, 3 do j = 1, 3 t%t(i,j) = v%x(i) * m%x(j) end do end do end function out_prod_vm @ <>= pure function out_prod_mv (m, v) result (t) type(tensor) :: t type(vector), intent(in) :: v type(momentum), intent(in) :: m integer :: i, j t%t(0,0) = m%t * v%t t%t(0,1:3) = m%t * v%x t%t(1:3,0) = m%x * v%t do i = 1, 3 do j = 1, 3 t%t(i,j) = m%x(i) * v%x(j) end do end do end function out_prod_mv @ <>= pure function out_prod_mm (m, n) result (t) type(tensor) :: t type(momentum), intent(in) :: m, n integer :: i, j t%t(0,0) = m%t * n%t t%t(0,1:3) = m%t * n%x t%t(1:3,0) = m%x * n%t do i = 1, 3 do j = 1, 3 t%t(i,j) = m%x(i) * n%x(j) end do end do end function out_prod_mm @ <>= interface abs module procedure abs_tensor end interface private :: abs_tensor @ <>= pure function abs_tensor (t) result (abs_t) type(tensor), intent(in) :: t real(kind=default) :: abs_t abs_t = sqrt (sum ((abs (t%t))**2)) end function abs_tensor @ <>= interface conjg module procedure conjg_tensor end interface private :: conjg_tensor @ <>= pure function conjg_tensor (t) result (conjg_t) type(tensor), intent(in) :: t type(tensor) :: conjg_t conjg_t%t = conjg (t%t) end function conjg_tensor @ <>= interface operator (*) module procedure tensor_tensor, vector_tensor, tensor_vector, & momentum_tensor, tensor_momentum end interface private :: tensor_tensor, vector_tensor, tensor_vector, & momentum_tensor, tensor_momentum @ <>= pure function tensor_tensor (t1, t2) result (t1t2) type(tensor), intent(in) :: t1 type(tensor), intent(in) :: t2 complex(kind=default) :: t1t2 integer :: i1, i2 t1t2 = t1%t(0,0)*t2%t(0,0) & - dot_product (conjg (t1%t(0,1:)), t2%t(0,1:)) & - dot_product (conjg (t1%t(1:,0)), t2%t(1:,0)) do i1 = 1, 3 do i2 = 1, 3 t1t2 = t1t2 + t1%t(i1,i2)*t2%t(i1,i2) end do end do end function tensor_tensor @ <>= pure function tensor_vector (t, v) result (tv) type(tensor), intent(in) :: t type(vector), intent(in) :: v type(vector) :: tv tv%t = t%t(0,0) * v%t - dot_product (conjg (t%t(0,1:)), v%x) tv%x(1) = t%t(0,1) * v%t - dot_product (conjg (t%t(1,1:)), v%x) tv%x(2) = t%t(0,2) * v%t - dot_product (conjg (t%t(2,1:)), v%x) tv%x(3) = t%t(0,3) * v%t - dot_product (conjg (t%t(3,1:)), v%x) end function tensor_vector @ <>= pure function vector_tensor (v, t) result (vt) type(vector), intent(in) :: v type(tensor), intent(in) :: t type(vector) :: vt vt%t = v%t * t%t(0,0) - dot_product (conjg (v%x), t%t(1:,0)) vt%x(1) = v%t * t%t(0,1) - dot_product (conjg (v%x), t%t(1:,1)) vt%x(2) = v%t * t%t(0,2) - dot_product (conjg (v%x), t%t(1:,2)) vt%x(3) = v%t * t%t(0,3) - dot_product (conjg (v%x), t%t(1:,3)) end function vector_tensor @ <>= pure function tensor_momentum (t, p) result (tp) type(tensor), intent(in) :: t type(momentum), intent(in) :: p type(vector) :: tp tp%t = t%t(0,0) * p%t - dot_product (conjg (t%t(0,1:)), p%x) tp%x(1) = t%t(0,1) * p%t - dot_product (conjg (t%t(1,1:)), p%x) tp%x(2) = t%t(0,2) * p%t - dot_product (conjg (t%t(2,1:)), p%x) tp%x(3) = t%t(0,3) * p%t - dot_product (conjg (t%t(3,1:)), p%x) end function tensor_momentum @ <>= pure function momentum_tensor (p, t) result (pt) type(momentum), intent(in) :: p type(tensor), intent(in) :: t type(vector) :: pt pt%t = p%t * t%t(0,0) - dot_product (p%x, t%t(1:,0)) pt%x(1) = p%t * t%t(0,1) - dot_product (p%x, t%t(1:,1)) pt%x(2) = p%t * t%t(0,2) - dot_product (p%x, t%t(1:,2)) pt%x(3) = p%t * t%t(0,3) - dot_product (p%x, t%t(1:,3)) end function momentum_tensor @ \section{Symmetric Polarization Tensors} \begin{subequations} \begin{align} \epsilon^{\mu\nu}_{+2}(k) &= \epsilon^{\mu}_{+}(k)\epsilon^{\nu}_{+}(k) \\ \epsilon^{\mu\nu}_{+1}(k) &= \frac{1}{\sqrt{2}} \left( \epsilon^{\mu}_{+}(k)\epsilon^{\nu}_{0}(k) + \epsilon^{\mu}_{0}(k)\epsilon^{\nu}_{+}(k) \right) \\ \epsilon^{\mu\nu}_{0}(k) &= \frac{1}{\sqrt{6}} \left( \epsilon^{\mu}_{+}(k)\epsilon^{\nu}_{-}(k) + \epsilon^{\mu}_{-}(k)\epsilon^{\nu}_{+}(k) - 2 \epsilon^{\mu}_{0}(k)\epsilon^{\nu}_{0}(k) \right) \\ \epsilon^{\mu\nu}_{-1}(k) &= \frac{1}{\sqrt{2}} \left( \epsilon^{\mu}_{-}(k)\epsilon^{\nu}_{0}(k) + \epsilon^{\mu}_{0}(k)\epsilon^{\nu}_{-}(k) \right) \\ \epsilon^{\mu\nu}_{-2}(k) &= \epsilon^{\mu}_{-}(k)\epsilon^{\nu}_{-}(k) \end{align} \end{subequations} Note that~$\epsilon^{\mu}_{\pm2,\mu}(k) = \epsilon^{\mu}_{\pm}(k)\epsilon_{\pm,\mu}(k) \propto \epsilon^{\mu}_{\pm}(k)\epsilon_{\mp,\mu}^{*}(k) = 0$ and that the sign in $\epsilon^{\mu\nu}_{0}(k)$ insures its tracelessness\footnote{ On the other hand, with the shift operator $L_{-}\ket{+}=\ee^{\ii\phi}\ket{0}$ and $L_{-}\ket{0}=\ee^{\ii\chi}\ket{-}$, we find \begin{equation*} L_{-}^{2}\ket{++} = 2\ee^{2\ii\phi}\ket{00} + \ee^{\ii(\phi+\chi)}(\ket{+-}+\ket{-+}) \end{equation*} i.\,e.~$\chi-\phi=\pi$, if we want to identify $\epsilon^{\mu}_{-,0,+}$ with $\ket{-,0,+}$.}. <<[[omega_tensor_polarizations.f90]]>>= <> module omega_tensor_polarizations use kinds use constants use omega_vectors use omega_tensors use omega_polarizations implicit none private <> integer, parameter, public :: omega_tensor_pols_2010_01_A = 0 contains <> end module omega_tensor_polarizations @ <>= public :: eps2 @ <>= pure function eps2 (m, k, s) result (t) type(tensor) :: t real(kind=default), intent(in) :: m type(momentum), intent(in) :: k integer, intent(in) :: s type(vector) :: ep, em, e0 t%t = 0 select case (s) case (2) ep = eps (m, k, 1) t = ep.tprod.ep case (1) ep = eps (m, k, 1) e0 = eps (m, k, 0) t = (1 / sqrt (2.0_default)) & * ((ep.tprod.e0) + (e0.tprod.ep)) case (0) ep = eps (m, k, 1) e0 = eps (m, k, 0) em = eps (m, k, -1) t = (1 / sqrt (6.0_default)) & * ((ep.tprod.em) + (em.tprod.ep) - 2*(e0.tprod.e0)) case (-1) e0 = eps (m, k, 0) em = eps (m, k, -1) t = (1 / sqrt (2.0_default)) & * ((em.tprod.e0) + (e0.tprod.em)) case (-2) em = eps (m, k, -1) t = em.tprod.em end select end function eps2 @ \section{Couplings} <<[[omega_couplings.f90]]>>= <> module omega_couplings use kinds use constants use omega_vectors use omega_tensors implicit none private <> <> integer, parameter, public :: omega_couplings_2010_01_A = 0 contains <> <> end module omega_couplings @ <>= public :: wd_tl @ <>= public :: wd_run @ <>= public :: gauss @ \begin{equation} \Theta(p^2)\Gamma \end{equation} <>= pure function wd_tl (p, w) result (width) real(kind=default) :: width type(momentum), intent(in) :: p real(kind=default), intent(in) :: w if (p*p > 0) then width = w else width = 0 end if end function wd_tl @ \begin{equation} \frac{p^2}{m^2} \Gamma \end{equation} <>= pure function wd_run (p, m, w) result (width) real(kind=default) :: width type(momentum), intent(in) :: p real(kind=default), intent(in) :: m real(kind=default), intent(in) :: w if (p*p > 0) then width = w * (p*p) / m**2 else width = 0 end if end function wd_run @ <>= pure function gauss (x, mu, w) result (gg) real(kind=default) :: gg real(kind=default), intent(in) :: x, mu, w if (w > 0) then gg = exp(-(x - mu**2)**2/4.0_default/mu**2/w**2) * & sqrt(sqrt(PI/2)) / w / mu else gg = 1.0_default end if end function gauss @ <>= public :: pr_phi, pr_unitarity, pr_feynman, pr_gauge, pr_rxi public :: pr_vector_pure public :: pj_phi, pj_unitarity public :: pg_phi, pg_unitarity @ \begin{equation} \frac{\ii}{p^2-m^2+\ii m\Gamma}\phi \end{equation} <>= pure function pr_phi (p, m, w, phi) result (pphi) complex(kind=default) :: pphi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w complex(kind=default), intent(in) :: phi pphi = (1 / cmplx (p*p - m**2, m*w, kind=default)) * phi end function pr_phi @ \begin{equation} \sqrt{\frac{\pi}{M\Gamma}} \phi \end{equation} <>= pure function pj_phi (m, w, phi) result (pphi) complex(kind=default) :: pphi real(kind=default), intent(in) :: m, w complex(kind=default), intent(in) :: phi pphi = (0, -1) * sqrt (PI / m / w) * phi end function pj_phi @ <>= pure function pg_phi (p, m, w, phi) result (pphi) complex(kind=default) :: pphi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w complex(kind=default), intent(in) :: phi pphi = ((0, 1) * gauss (p*p, m, w)) * phi end function pg_phi @ \begin{equation} \frac{\ii}{p^2-m^2+\ii m\Gamma} \left( -g_{\mu\nu} + \frac{p_\mu p_\nu}{m^2} \right) \epsilon^\nu(p) \end{equation} NB: the explicit cast to [[vector]] is required here, because a specific [[complex_momentum]] procedure for [[operator (*)]] would introduce ambiguities. NB: we used to use the constructor [[vector (p%t, p%x)]] instead of the temporary variable, but the Intel Fortran Compiler choked on it. <>= pure function pr_unitarity (p, m, w, cms, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(vector), intent(in) :: e logical, intent(in) :: cms type(vector) :: pv complex(kind=default) :: c_mass2 pv = p if (cms) then c_mass2 = cmplx (m**2, -m*w, kind=default) else c_mass2 = m**2 end if pe = - (1 / cmplx (p*p - m**2, m*w, kind=default)) & * (e - (p*e / c_mass2) * pv) end function pr_unitarity @ \begin{equation} \sqrt{\frac{\pi}{M\Gamma}} \left( -g_{\mu\nu} + \frac{p_\mu p_\nu}{m^2} \right) \epsilon^\nu(p) \end{equation} <>= pure function pj_unitarity (p, m, w, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(vector), intent(in) :: e type(vector) :: pv pv = p pe = (0, 1) * sqrt (PI / m / w) * (e - (p*e / m**2) * pv) end function pj_unitarity @ <>= pure function pg_unitarity (p, m, w, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(vector), intent(in) :: e type(vector) :: pv pv = p pe = - gauss (p*p, m, w) & * (e - (p*e / m**2) * pv) end function pg_unitarity @ \begin{equation} \frac{-i}{p^2} \epsilon^\nu(p) \end{equation} <>= pure function pr_feynman (p, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p type(vector), intent(in) :: e pe = - (1 / (p*p)) * e end function pr_feynman @ \begin{equation} \frac{\ii}{p^2} \left( -g_{\mu\nu} + (1-\xi)\frac{p_\mu p_\nu}{p^2} \right) \epsilon^\nu(p) \end{equation} <>= pure function pr_gauge (p, xi, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p real(kind=default), intent(in) :: xi type(vector), intent(in) :: e real(kind=default) :: p2 type(vector) :: pv p2 = p*p pv = p pe = - (1 / p2) * (e - ((1 - xi) * (p*e) / p2) * pv) end function pr_gauge @ \begin{equation} \frac{\ii}{p^2-m^2+\ii m\Gamma} \left( -g_{\mu\nu} + (1-\xi)\frac{p_\mu p_\nu}{p^2-\xi m^2} \right) \epsilon^\nu(p) \end{equation} <>= pure function pr_rxi (p, m, w, xi, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w, xi type(vector), intent(in) :: e real(kind=default) :: p2 type(vector) :: pv p2 = p*p pv = p pe = - (1 / cmplx (p2 - m**2, m*w, kind=default)) & * (e - ((1 - xi) * (p*e) / (p2 - xi * m**2)) * pv) end function pr_rxi @ \begin{equation} \frac{\ii}{p^2-m^2+\ii m\Gamma} \left( -g_{\mu\nu} \right) \epsilon^\nu(p) \end{equation} <>= pure function pr_vector_pure (p, m, w, e) result (pe) type(vector) :: pe type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(vector), intent(in) :: e real(kind=default) :: p2 type(vector) :: pv p2 = p*p pv = p pe = - (1 / cmplx (p2 - m**2, m*w, kind=default)) * e end function pr_vector_pure @ <>= public :: pr_tensor, pr_tensor_pure @ \begin{subequations} \begin{equation} \frac{\ii P^{\mu\nu,\rho\sigma}(p,m)}{p^2-m^2+\ii m\Gamma} T_{\rho\sigma} \end{equation} with \begin{multline} P^{\mu\nu,\rho\sigma}(p,m) = \frac{1}{2} \left(g^{\mu\rho}-\frac{p^{\mu}p^{\nu}}{m^2}\right) \left(g^{\nu\sigma}-\frac{p^{\nu}p^{\sigma}}{m^2}\right) + \frac{1}{2} \left(g^{\mu\sigma}-\frac{p^{\mu}p^{\sigma}}{m^2}\right) \left(g^{\nu\rho}-\frac{p^{\nu}p^{\rho}}{m^2}\right) \\ - \frac{1}{3} \left(g^{\mu\nu}-\frac{p^{\mu}p^{\nu}}{m^2}\right) \left(g^{\rho\sigma}-\frac{p^{\rho}p^{\sigma}}{m^2}\right) \end{multline} \end{subequations} Be careful with raising and lowering of indices: \begin{subequations} \begin{align} g^{\mu\nu}-\frac{k^{\mu}k^{\nu}}{m^2} &= \begin{pmatrix} 1 - k^0k^0 / m^2 & - k^0 \vec k / m^2 \\ - \vec k k^0 / m^2 & - \mathbf{1} - \vec k \otimes \vec k / m^2 \end{pmatrix} \\ g^{\mu}_{\hphantom{\mu}\nu}-\frac{k^{\mu}k_{\nu}}{m^2} &= \begin{pmatrix} 1 - k^0k^0 / m^2 & k^0 \vec k / m^2 \\ - \vec k k^0 / m^2 & \mathbf{1} + \vec k \otimes \vec k / m^2 \end{pmatrix} \end{align} \end{subequations} <>= pure function pr_tensor (p, m, w, t) result (pt) type(tensor) :: pt type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(tensor), intent(in) :: t complex(kind=default) :: p_dd_t real(kind=default), dimension(0:3,0:3) :: p_uu, p_ud, p_du, p_dd integer :: i, j p_uu(0,0) = 1 - p%t * p%t / m**2 p_uu(0,1:3) = - p%t * p%x / m**2 p_uu(1:3,0) = p_uu(0,1:3) do i = 1, 3 do j = 1, 3 p_uu(i,j) = - p%x(i) * p%x(j) / m**2 end do end do do i = 1, 3 p_uu(i,i) = - 1 + p_uu(i,i) end do p_ud(:,0) = p_uu(:,0) p_ud(:,1:3) = - p_uu(:,1:3) p_du = transpose (p_ud) p_dd(:,0) = p_du(:,0) p_dd(:,1:3) = - p_du(:,1:3) p_dd_t = 0 do i = 0, 3 do j = 0, 3 p_dd_t = p_dd_t + p_dd(i,j) * t%t(i,j) end do end do pt%t = matmul (p_ud, matmul (0.5_default * (t%t + transpose (t%t)), p_du)) & - (p_dd_t / 3.0_default) * p_uu pt%t = pt%t / cmplx (p*p - m**2, m*w, kind=default) end function pr_tensor @ \begin{subequations} \begin{equation} \frac{\ii P_p^{\mu\nu,\rho\sigma}}{p^2-m^2+\ii m\Gamma} T_{\rho\sigma} \end{equation} with \begin{multline} P_p^{\mu\nu,\rho\sigma} = \frac{1}{2} g^{\mu\rho} g^{\nu\sigma} + \frac{1}{2} g^{\mu\sigma} g^{\nu\rho} - \frac{1}{2} g^{\mu\nu}g^{\rho\sigma} \end{multline} \end{subequations} <>= pure function pr_tensor_pure (p, m, w, t) result (pt) type(tensor) :: pt type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(tensor), intent(in) :: t complex(kind=default) :: p_dd_t real(kind=default), dimension(0:3,0:3) :: g_uu integer :: i, j g_uu(0,0) = 1 g_uu(0,1:3) = 0 g_uu(1:3,0) = g_uu(0,1:3) do i = 1, 3 do j = 1, 3 g_uu(i,j) = 0 end do end do do i = 1, 3 g_uu(i,i) = - 1 end do p_dd_t = t%t(0,0) - t%t(1,1) - t%t(2,2) - t%t(3,3) pt%t = 0.5_default * ((t%t + transpose (t%t)) & - p_dd_t * g_uu ) pt%t = pt%t / cmplx (p*p - m**2, m*w, kind=default) end function pr_tensor_pure @ \subsection{Triple Gauge Couplings} <>= public :: g_gg @ According to~(\ref{eq:fuse-gauge}) \begin{multline} A^{a,\mu}(k_1+k_2) = - \ii g \bigl( (k_1^{\mu}-k_2^{\mu})A^{a_1}(k_1) \cdot A^{a_2}(k_2) \\ + (2k_2+k_1)\cdot A^{a_1}(k_1)A^{a_2,\mu}(k_2) - A^{a_1,\mu}(k_1)A^{a_2}(k_2)\cdot(2k_1+k_2) \bigr) \end{multline} <>= pure function g_gg (g, a1, k1, a2, k2) result (a) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1, a2 type(momentum), intent(in) :: k1, k2 type(vector) :: a a = (0, -1) * g * ((k1 - k2) * (a1 * a2) & + ((2*k2 + k1) * a1) * a2 - a1 * ((2*k1 + k2) * a2)) end function g_gg @ \subsection{Quadruple Gauge Couplings} <>= public :: x_gg, g_gx @ \begin{equation} T^{a,\mu\nu}(k_1+k_2) = g \bigl( A^{a_1,\mu}(k_1) A^{a_2,\nu}(k_2) - A^{a_1,\nu}(k_1) A^{a_2,\mu}(k_2) \bigr) \end{equation} <>= pure function x_gg (g, a1, a2) result (x) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1, a2 type(tensor2odd) :: x x = g * (a1 .wedge. a2) end function x_gg @ \begin{equation} A^{a,\mu}(k_1+k_2) = g A^{a_1}_\nu(k_1) T^{a_2,\nu\mu}(k_2) \end{equation} <>= pure function g_gx (g, a1, x) result (a) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1 type(tensor2odd), intent(in) :: x type(vector) :: a a = g * (a1 * x) end function g_gx @ \subsection{Scalar Current} <>= public :: v_ss, s_vs @ \begin{equation} V^\mu(k_1+k_2) = g(k_1^\mu - k_2^\mu)\phi_1(k_1)\phi_2(k_2) \end{equation} <>= pure function v_ss (g, phi1, k1, phi2, k2) result (v) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 type(vector) :: v v = (k1 - k2) * (g * phi1 * phi2) end function v_ss @ \begin{equation} \phi(k_1+k_2) = g(k_1^\mu + 2k_2^\mu)V_\mu(k_1)\phi(k_2) \end{equation} <>= pure function s_vs (g, v1, k1, phi2, k2) result (phi) complex(kind=default), intent(in) :: g, phi2 type(vector), intent(in) :: v1 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi phi = g * ((k1 + 2*k2) * v1) * phi2 end function s_vs @ \subsection{Transversal Scalar-Vector Coupling} <>= public :: s_vv_t, v_sv_t @ \begin{equation} phi(k_1+k_2) = g((V_1(k_1) V_2(k_2))(k_1 k_2) - (V_1(k_1) k_2)(V_2(k_2) k_1)) \end{equation} <>= pure function s_vv_t (g, v1, k1, v2, k2) result (phi) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi phi = g * ((v1*v2) * (k1*k2) - (v1*k2) * (v2*k1)) end function s_vv_t @ \begin{equation} V_1^\mu(k_\phi+k_V) = g phi(((k_\phi+k_V)k_V)V_2^\mu- (k_\phi+k_V)V_2)k_V^\mu ) \end{equation} <>= pure function v_sv_t (g, phi, kphi,v, kv) result (vout) complex(kind=default), intent(in) :: g, phi type(vector), intent(in) :: v type(momentum), intent(in) :: kv, kphi type(momentum) :: kout type(vector) :: vout kout = - (kv + kphi) vout = g * phi * ((kout*kv) * v - (v * kout) * kv) end function v_sv_t @ \subsection{Transversal TensorScalar-Vector Coupling} <>= public :: tphi_vv, tphi_vv_cf, v_tphiv, v_tphiv_cf @ \begin{equation} phi(k_1 + k_2) = g (V_1(k_1) (k_1 +k_2)) * ( V_2(k_2) (k_1 + k_2)) \end{equation} <>= pure function tphi_vv (g, v1, k1, v2, k2) result (phi) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi type(momentum) :: k k = - (k1 + k2) phi = 2 * g * (v1*k) * (v2*k) end function tphi_vv @ \begin{equation} phi(k_1+k_2) = g((V_1(k_1) V_2(k_2))(k_1 + k_2)^2) \end{equation} <>= pure function tphi_vv_cf (g, v1, k1, v2, k2) result (phi) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi type(momentum) :: k k = - (k1 + k2) phi = - g/2 * (v1*v2) * (k*k) end function tphi_vv_cf @ \begin{equation} V_1^\mu(k_\phi+k_V) = g phi ((k_\phi+k_V)V_2) (k_\phi+k_V)^\mu \end{equation} <>= pure function v_tphiv (g, phi, kphi,v, kv) result (vout) complex(kind=default), intent(in) :: g, phi type(vector), intent(in) :: v type(momentum), intent(in) :: kv, kphi type(momentum) :: kout type(vector) :: vout kout = - (kv + kphi) vout = 2 * g * phi * ((v * kout) * kout) end function v_tphiv @ \begin{equation} V_1^\mu(k_\phi+k_V) = g phi((k_\phi+k_V)(k_\phi+k_V))V_2^\mu \end{equation} <>= pure function v_tphiv_cf (g, phi, kphi,v, kv) result (vout) complex(kind=default), intent(in) :: g, phi type(vector), intent(in) :: v type(momentum), intent(in) :: kv, kphi type(momentum) :: kout type(vector) :: vout kout = - (kv + kphi) vout = -g/2 * phi * (kout*kout) * v end function v_tphiv_cf @ \subsection{Triple Vector Couplings} <>= public :: tkv_vv, lkv_vv, tv_kvv, lv_kvv, kg_kgkg public :: t5kv_vv, l5kv_vv, t5v_kvv, l5v_kvv, kg5_kgkg, kg_kg5kg public :: dv_vv, v_dvv, dv_vv_cf, v_dvv_cf @ \begin{equation} V^\mu(k_1+k_2) = \ii g(k_1-k_2)^\mu V_1^\nu(k_1)V_{2,\nu}(k_2) \end{equation} <>= pure function tkv_vv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v v = (k1 - k2) * ((0, 1) * g * (v1*v2)) end function tkv_vv @ \begin{equation} V^\mu(k_1+k_2) = \ii g \epsilon^{\mu\nu\rho\sigma} (k_1-k_2)_{\nu} V_{1,\rho}(k_1)V_{2,\sigma}(k_2) \end{equation} <>= pure function t5kv_vv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v type(vector) :: k k = k1 - k2 v = (0, 1) * g * pseudo_vector (k, v1, v2) end function t5kv_vv @ \begin{equation} V^\mu(k_1+k_2) = \ii g(k_1+k_2)^\mu V_1^\nu(k_1)V_{2,\nu}(k_2) \end{equation} <>= pure function lkv_vv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v v = (k1 + k2) * ((0, 1) * g * (v1*v2)) end function lkv_vv @ \begin{equation} V^\mu(k_1+k_2) = \ii g \epsilon^{\mu\nu\rho\sigma} (k_1+k_2)_{\nu} V_{1,\rho}(k_1)V_{2,\sigma}(k_2) \end{equation} <>= pure function l5kv_vv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v type(vector) :: k k = k1 + k2 v = (0, 1) * g * pseudo_vector (k, v1, v2) end function l5kv_vv @ \begin{equation} V^\mu(k_1+k_2) = \ii g (k_2-k)^\nu V_{1,\nu}(k_1)V_2^\mu(k_2) = \ii g (2k_2+k_1)^\nu V_{1,\nu}(k_1)V_2^\mu(k_2) \end{equation} using $k=-k_1-k_2$ <>= pure function tv_kvv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v v = v2 * ((0, 1) * g * ((2*k2 + k1)*v1)) end function tv_kvv @ \begin{equation} V^\mu(k_1+k_2) = \ii g \epsilon^{\mu\nu\rho\sigma} (2k_2+k_1)_{\nu} V_{1,\rho}(k_1)V_{2,\sigma}(k_2) \end{equation} <>= pure function t5v_kvv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v type(vector) :: k k = k1 + 2*k2 v = (0, 1) * g * pseudo_vector (k, v1, v2) end function t5v_kvv @ \begin{equation} V^\mu(k_1+k_2) = - \ii g k_1^\nu V_{1,\nu}(k_1)V_2^\mu(k_2) \end{equation} using $k=-k_1-k_2$ <>= pure function lv_kvv (g, v1, k1, v2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1 type(vector) :: v v = v2 * ((0, -1) * g * (k1*v1)) end function lv_kvv @ \begin{equation} V^\mu(k_1+k_2) = - \ii g \epsilon^{\mu\nu\rho\sigma} k_{1,\nu} V_{1,\rho}(k_1)V_{2,\sigma}(k_2) \end{equation} <>= pure function l5v_kvv (g, v1, k1, v2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1 type(vector) :: v type(vector) :: k k = k1 v = (0, -1) * g * pseudo_vector (k, v1, v2) end function l5v_kvv @ \begin{equation} A^\mu(k_1+k_2) = \ii g k^\nu \Bigl( F_{1,\nu}^{\hphantom{1,\nu}\rho}(k_1)F_{2,\rho\mu}(k_2) - F_{1,\mu}^{\hphantom{1,\mu}\rho}(k_1)F_{2,\rho\nu}(k_2) \Bigr) \end{equation} with $k=-k_1-k_2$, i.\,e. \begin{multline} A^\mu(k_1+k_2) = -\ii g \Bigl( [(kk_2)(k_1A_2) - (k_1k_2)(kA_2)] A_1^\mu \\ + [(k_1k_2)(kA_1) - (kk_1)(k_2A_1)] A_2^\mu \\ + [(k_2A_1)(kA_2) - (kk_2)(A_1A_2)] k_1^\mu \\ + [(kk_1)(A_1A_2) - (kA_1)(k_1A_2)] k_2^\mu \Bigr) \end{multline} <>= pure function kg_kgkg (g, a1, k1, a2, k2) result (a) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1, a2 type(momentum), intent(in) :: k1, k2 type(vector) :: a real(kind=default) :: k1k1, k2k2, k1k2, kk1, kk2 complex(kind=default) :: a1a2, k2a1, ka1, k1a2, ka2 k1k1 = k1 * k1 k1k2 = k1 * k2 k2k2 = k2 * k2 kk1 = k1k1 + k1k2 kk2 = k1k2 + k2k2 k2a1 = k2 * a1 ka1 = k2a1 + k1 * a1 k1a2 = k1 * a2 ka2 = k1a2 + k2 * a2 a1a2 = a1 * a2 a = (0, -1) * g * ( (kk2 * k1a2 - k1k2 * ka2 ) * a1 & + (k1k2 * ka1 - kk1 * k2a1) * a2 & + (ka2 * k2a1 - kk2 * a1a2) * k1 & + (kk1 * a1a2 - ka1 * k1a2) * k2 ) end function kg_kgkg @ \begin{equation} A^\mu(k_1+k_2) = \ii g \epsilon^{\mu\nu\rho\sigma} k_{\nu} F_{1,\rho}^{\hphantom{1,\rho}\lambda}(k_1)F_{2,\lambda\sigma}(k_2) \end{equation} with $k=-k_1-k_2$, i.\,e. \begin{multline} A^\mu(k_1+k_2) = -2\ii g \epsilon^{\mu\nu\rho\sigma} k_{\nu} \Bigl( (k_2A_1) k_{1,\rho} A_{2,\sigma} + (k_1A_2) A_{1,\rho} k_{2,\sigma} \\ - (A_1A_2) k_{1,\rho} k_{2,\sigma} - (k_1k_2) A_{1,\rho} A_{2,\sigma} \Bigr) \end{multline} <>= pure function kg5_kgkg (g, a1, k1, a2, k2) result (a) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1, a2 type(momentum), intent(in) :: k1, k2 type(vector) :: a type(vector) :: kv, k1v, k2v kv = - k1 - k2 k1v = k1 k2v = k2 a = (0, -2) * g * ( (k2*A1) * pseudo_vector (kv, k1v, a2 ) & + (k1*A2) * pseudo_vector (kv, A1 , k2v) & - (A1*A2) * pseudo_vector (kv, k1v, k2v) & - (k1*k2) * pseudo_vector (kv, a1 , a2 ) ) end function kg5_kgkg @ \begin{equation} A^\mu(k_1+k_2) = \ii g k_{\nu} \Bigl( \epsilon^{\mu\rho\lambda\sigma} F_{1,\hphantom{\nu}\rho}^{\hphantom{1,}\nu} - \epsilon^{\nu\rho\lambda\sigma} F_{1,\hphantom{\mu}\rho}^{\hphantom{1,}\mu} \Bigr) \frac{1}{2} F_{1,\lambda\sigma} \end{equation} with $k=-k_1-k_2$, i.\,e. \begin{multline} A^\mu(k_1+k_2) = -\ii g \Bigl( \epsilon^{\mu\rho\lambda\sigma} (kk_2) A_{2,\rho} - \epsilon^{\mu\rho\lambda\sigma} (kA_2) k_{2,\rho} - k_2^\mu \epsilon^{\nu\rho\lambda\sigma} k_nu A_{2,\rho} + A_2^\mu \epsilon^{\nu\rho\lambda\sigma} k_nu k_{2,\rho} \Bigr) k_{1,\lambda} A_{1,\sigma} \end{multline} \begin{dubious} This is not the most efficienct way of doing it: $\epsilon^{\mu\nu\rho\sigma}F_{1,\rho\sigma}$ should be cached! \end{dubious} <>= pure function kg_kg5kg (g, a1, k1, a2, k2) result (a) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1, a2 type(momentum), intent(in) :: k1, k2 type(vector) :: a type(vector) :: kv, k1v, k2v kv = - k1 - k2 k1v = k1 k2v = k2 a = (0, -1) * g * ( (kv*k2v) * pseudo_vector (a2 , k1v, a1) & - (kv*a2 ) * pseudo_vector (k2v, k1v, a1) & - k2v * pseudo_scalar (kv, a2, k1v, a1) & + a2 * pseudo_scalar (kv, k2v, k1v, a1) ) end function kg_kg5kg @ \begin{equation} V^\mu(k_1+k_2) = - g ((k_1+k_2) V_{1}) V_{2}^\mu + ((k_1+k_2) V_{2}) V_{1}^\mu \end{equation} <>= pure function dv_vv (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v type(vector) :: k k = -(k1 + k2) v = g * ((k * v1) * v2 + (k * v2) * v1) end function dv_vv @ \begin{equation} V^\mu(k_1+k_2) = \frac{g}{2} ( V_{1} (k_{1}) V_{2} (k_{2}) ) (k_{1}+k_{2})^\mu \end{equation} <>= pure function dv_vv_cf (g, v1, k1, v2, k2) result (v) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: v type(vector) :: k k = -(k1 + k2) v = - g/2 * (v1 * v2) * k end function dv_vv_cf @ \begin{equation} V_{1}^\mu = g * ( k V_{2}) V (k) + ( V V_{2}) k \end{equation} <>= pure function v_dvv (g, v, k, v2) result (v1) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v, v2 type(momentum), intent(in) :: k type(vector) :: v1 v1 = g * ((v * v2) * k + (k * v2) * v) end function v_dvv @ \begin{equation} V_{1}^\mu = -\frac{g}{2} ( V (k) k ) V_{2}^\mu \end{equation} <>= pure function v_dvv_cf (g, v, k, v2) result (v1) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v, v2 type(momentum), intent(in) :: k type(vector) :: v1 v1 = - g/2 * (v * k) * v2 end function v_dvv_cf @ \section{Tensorvector - Scalar coupling } <>= public :: dv_phi2,phi_dvphi, dv_phi2_cf, phi_dvphi_cf @ \begin{equation} V^\mu (k_1 + k_2 ) = g* ((k_1 k_2 + k_2 k_2) k_1^\mu + (k_1 k_2 + k_1 k_1) k_2^\mu ) * phi_1 (k_1) phi_2 (k_2) \end{equation} <>= pure function dv_phi2 (g, phi1, k1, phi2, k2) result (v) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 type(vector) :: v v = g * phi1 * phi2 * ( & (k1 * k2 + k2 * k2 ) * k1 + & (k1 * k2 + k1 * k1 ) * k2 ) end function dv_phi2 @ \begin{equation} V^\mu (k_1 + k_2 ) = - \frac{g}{2} * (k_1 k_2) * (k_1 + k_2 )^\mu * phi_1 (k_1) phi_2 (k_2) \end{equation} <>= pure function dv_phi2_cf (g, phi1, k1, phi2, k2) result (v) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 type(vector) :: v v = - g/2 * phi1 * phi2 * (k1 * k2) * (k1 + k2) end function dv_phi2_cf @ \begin{equation} phi_1 (k_1) = g * ((k_1 k_2 + k_2 k_2) (k_1 * V(-k_1 - k_2) ) + (k_1 k_2 + k_1 k_1) (k_2 * V(-k_1 - k_2) ) ) * phi_2 (k_2) \end{equation} <>= pure function phi_dvphi (g, v, k, phi2, k2) result (phi1) complex(kind=default), intent(in) :: g, phi2 type(vector), intent(in) :: v type(momentum), intent(in) :: k, k2 complex(kind=default) :: phi1 type(momentum) :: k1 k1 = - (k + k2) phi1 = g * phi2 * ( & (k1 * k2 + k2 * k2 ) * ( k1 * V ) + & (k1 * k2 + k1 * k1 ) * ( k2 * V ) ) end function phi_dvphi @ \begin{equation} phi_1 (k_1 ) = - \frac{g}{2} * (k_1 k_2) * ((k_1 + k_2 ) V(- k_1 - k_2)) \end{equation} <>= pure function phi_dvphi_cf (g, v, k, phi2, k2) result (phi1) complex(kind=default), intent(in) :: g, phi2 type(vector), intent(in) :: v type(momentum), intent(in) :: k, k2 complex(kind=default) :: phi1 type(momentum) :: k1 k1 = -(k + k2) phi1 = - g/2 * phi2 * (k1 * k2) * ((k1 + k2) * v) end function phi_dvphi_cf @ \section{Scalar-Vector Dim-5 Couplings} <>= public :: phi_vv, v_phiv, phi_u_vv, v_u_phiv @ <>= pure function phi_vv (g, k1, k2, v1, v2) result (phi) complex(kind=default), intent(in) :: g type(momentum), intent(in) :: k1, k2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: phi phi = g * pseudo_scalar (k1, v1, k2, v2) end function phi_vv @ <>= pure function v_phiv (g, phi, k1, k2, v) result (w) complex(kind=default), intent(in) :: g, phi type(vector), intent(in) :: v type(momentum), intent(in) :: k1, k2 type(vector) :: w w = g * phi * pseudo_vector (k1, k2, v) end function v_phiv @ <>= pure function phi_u_vv (g, k1, k2, v1, v2) result (phi) complex(kind=default), intent(in) :: g type(momentum), intent(in) :: k1, k2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: phi phi = g * ((k1*v2)*((-(k1+k2))*v1) + & (k2*v1)*((-(k1+k2))*v2) + & (((k1+k2)*(k1+k2)) * (v1*v2))) end function phi_u_vv @ <>= pure function v_u_phiv (g, phi, k1, k2, v) result (w) complex(kind=default), intent(in) :: g, phi type(vector), intent(in) :: v type(momentum), intent(in) :: k1, k2 type(vector) :: w w = g * phi * ((k1*v)*k2 + & ((-(k1+k2))*v)*k1 + & ((k1*k1)*v)) end function v_u_phiv @ \section{Dim-6 Anoumalous Couplings with Higgs} <>= public :: s_vv_6D, v_sv_6D, s_vv_6DP, v_sv_6DP, a_hz_D, h_az_D, z_ah_D, & a_hz_DP, h_az_DP, z_ah_DP, h_hh_6 <>= pure function s_vv_6D (g, v1, k1, v2, k2) result (phi) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi phi = g * (-(k1 * v1) * (k1 * v2) - (k2 * v1) * (k2 * v2) & + ((k1 * k1) + (k2 * k2)) * (v1 * v2)) end function s_vv_6D <>= pure function v_sv_6D (g, phi, kphi, v, kv) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(vector), intent(in) :: v type(momentum), intent(in) :: kphi, kv type(vector) :: vout vout = g * ( - phi * (kv * v) * kv - phi * ((kphi + kv) * v) * (kphi + kv) & + phi * (kv * kv) * v + phi * ((kphi + kv)*(kphi + kv)) * v) end function v_sv_6D <>= pure function s_vv_6DP (g, v1, k1, v2, k2) result (phi) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi phi = g * ( (-(k1+k2)*v1) * (k1*v2) - ((k1+k2)*v2) * (k2*v1) + & ((k1+k2)*(k1+k2))*(v1*v2) ) end function s_vv_6DP <>= pure function v_sv_6DP (g, phi, kphi, v, kv) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(vector), intent(in) :: v type(momentum), intent(in) :: kphi, kv type(vector) :: vout vout = g * phi * ((-(kphi + kv)*v) * kphi + (kphi * v) * kv + & (kphi*kphi) * v ) end function v_sv_6DP <>= pure function a_hz_D (g, h1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * h1 * (((k1 + k2) * v2) * (k1 + k2) + & ((k1 + k2) * (k1 + k2)) * v2) end function a_hz_D <>= pure function h_az_D (g, v1, k1, v2, k2) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: hout hout = g * ((k1 * v1) * (k1 * v2) + (k1 * k1) * (v1 * v2)) end function h_az_D <>= pure function z_ah_D (g, v1, k1, h2, k2) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * h2 * ((k1 * v1) * k1 + ((k1 * k1)) *v1) end function z_ah_D <>= pure function a_hz_DP (g, h1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * ((- h1 * (k1 + k2) * v2) * (k1) & + h1 * ((k1 + k2) * (k1)) *v2) end function a_hz_DP <>= pure function h_az_DP (g, v1, k1, v2, k2) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: hout hout = g * (- (k1 * v2) * ((k1 + k2) * v1) + (k1 * (k1 + k2)) * (v1 * v2)) end function h_az_DP <>= pure function z_ah_DP (g, v1, k1, h2, k2) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * h2* ((k2 * v1) * k1 - (k1 * k2) * v1) end function z_ah_DP <>= pure function h_hh_6 (g, h1, k1, h2, k2) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: hout hout = g * ((k1* k1) + (k2 * k2) + (k1* k2)) * h1 * h2 end function h_hh_6 @ \section{Dim-6 Anoumalous Couplings without Higgs} <>= public :: g_gg_13, g_gg_23, g_gg_6, kg_kgkg_i <>= pure function g_gg_23 (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v1 * (-2*(k1*v2)) + v2 * (2*k2 * v1) + (k1 - k2) * (v1*v2)) end function g_gg_23 <>= pure function g_gg_13 (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v1 * (2*(k1 + k2)*v2) - v2 * ((k1 + 2*k2) * v1) + 2*k2 * (v1 * v2)) end function g_gg_13 <>= pure function g_gg_6 (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * & ( k1 * ((-(k1 + k2) * v2) * (k2 * v1) + ((k1 + k2) * k2) * (v1 * v2)) & + k2 * (((k1 + k2) * v1) * (k1 * v2) - ((k1 + k2) * k1) * (v1 * v2)) & + v1 * (-((k1 + k2) * k2) * (k1 * v2) + (k1 * k2) * ((k1 + k2) * v2)) & + v2 * (((k1 + k2) * k1) * (k2 * v1) - (k1 * k2) * ((k1 + k2) * v1))) end function g_gg_6 <>= pure function kg_kgkg_i (g, a1, k1, a2, k2) result (a) complex(kind=default), intent(in) :: g type(vector), intent(in) :: a1, a2 type(momentum), intent(in) :: k1, k2 type(vector) :: a real(kind=default) :: k1k1, k2k2, k1k2, kk1, kk2 complex(kind=default) :: a1a2, k2a1, ka1, k1a2, ka2 k1k1 = k1 * k1 k1k2 = k1 * k2 k2k2 = k2 * k2 kk1 = k1k1 + k1k2 kk2 = k1k2 + k2k2 k2a1 = k2 * a1 ka1 = k2a1 + k1 * a1 k1a2 = k1 * a2 ka2 = k1a2 + k2 * a2 a1a2 = a1 * a2 a = (-1) * g * ( (kk2 * k1a2 - k1k2 * ka2 ) * a1 & + (k1k2 * ka1 - kk1 * k2a1) * a2 & + (ka2 * k2a1 - kk2 * a1a2) * k1 & + (kk1 * a1a2 - ka1 * k1a2) * k2 ) end function kg_kgkg_i @ \section{Dim-6 Anoumalous Couplings with AWW} <>= public ::a_ww_DP, w_aw_DP, a_ww_DW <>= pure function a_ww_DP (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * ( - ((k1 + k2) * v2) * v1 + ((k1 + k2) * v1) * v2) end function a_ww_DP <>= pure function w_aw_DP (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * ((k1 * v2) * v1 - (v1 * v2) * k1) end function w_aw_DP <>= pure function a_ww_DW (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v1 * (- (4*k1 + 2*k2) * v2) & + v2 * ( (2*k1 + 4*k2) * v1) & + (k1 - k2) * (2*v1*v2)) end function a_ww_DW <>= public :: w_wz_DPW, z_ww_DPW, w_wz_DW, z_ww_DW, w_wz_D, z_ww_D <>= pure function w_wz_DPW (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v1 * (-(k1+k2)*v2 - k1*v2) + v2 * ((k1+k2)*v1) + k1 * (v1*v2)) end function w_wz_DPW <>= pure function z_ww_DPW (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (k1*(v1*v2) - k2*(v1*v2) - v1*(k1*v2) + v2*(k2*v1)) end function z_ww_DPW <>= pure function w_wz_DW (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v2 * (v1 * k2) - k2 * (v1 * v2)) end function w_wz_DW <>= pure function z_ww_DW (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v1 * ((-1)*(k1+k2) * v2) + v2 * ((k1+k2) * v1)) end function z_ww_DW <>= pure function w_wz_D (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v2 * (k2*v1) - k2 * (v1*v2)) end function w_wz_D <>= pure function z_ww_D (g, v1, k1, v2, k2) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(vector) :: vout vout = g * (v1 * (- (k1 + k2) * v2) + v2 * ((k1 + k2) * v1)) end function z_ww_D @ \section{Dim-6 Quartic Couplings} <>= public :: hhhh_p2, a_hww_DPB, h_aww_DPB, w_ahw_DPB, a_hww_DPW, h_aww_DPW, & w_ahw_DPW, a_hww_DW, h_aww_DW, w3_ahw_DW, w4_ahw_DW <>= pure function hhhh_p2 (g, h1, k1, h2, k2, h3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2, h3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h1*h2*h3* (k1*k1 + k2*k2 +k3*k3 + k1*k3 + k1*k2 + k2*k3) end function hhhh_p2 <>= pure function a_hww_DPB (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * (v3*((k1+k2+k3)*v2) - v2*((k1+k2+k3)*v3)) end function a_hww_DPB <>= pure function h_aww_DPB (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * ((k1 * v3) * (v1 * v2) - (k1 * v2) * (v1 * v3)) end function h_aww_DPB <>= pure function w_ahw_DPB (g, v1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * (v1 * (k1 * v3) - k1 * (v1 * v3)) end function w_ahw_DPB <>= pure function a_hww_DPW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * (v3 * ((2*k1+k2+k3)*v2) - v2 * ((2*k1+k2+k3)*v3)) end function a_hww_DPW <>= pure function h_aww_DPW (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * ((-(2*k1+k2+k3)*v2)*(v1*v3)+((2*k1+k2+k3)*v3)*(v1*v2)) end function h_aww_DPW <>= pure function w_ahw_DPW (g, v1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * ((k2 - k1) * (v1 * v3) + v1 * ((k1 - k2) * v3)) end function w_ahw_DPW <>= pure function a_hww_DW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ( v2 * (-(3*k1 + 4*k2 + 4*k3) * v3) & + v3 * ((3*k1 + 2*k2 + 4*k3) * v2) & + (k2 - k3) *2*(v2 * v3)) end function a_hww_DW <>= pure function h_aww_DW (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * ((v1*v2) * ((3*k1 - k2 - k3)*v3) & + (v1*v3) * ((-3*k1 - k2 + k3)*v2) & + (v2*v3) * (2*(k2-k3)*v1)) end function h_aww_DW <>= pure function w3_ahw_DW (g, v1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * (v1 * ((4*k1 + k2) * v3) & +v3 * (-2*(k1 + k2 + 2*k3) * v1) & +(-2*k1 + k2 + 2*k3) * (v1*v3)) end function w3_ahw_DW <>= pure function w4_ahw_DW (g, v1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * (v1 * (-(4*k1 + k2 + 2*k3) * v3) & + v3 * (2*(k1 + k2 + 2*k3) * v1) & +(4*k1 + k2) * (v1*v3)) end function w4_ahw_DW <>= public ::a_aww_DW, w_aaw_DW, a_aww_W, w_aaw_W <>= pure function a_aww_DW (g, v1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * (2*v1*(v2*v3) - v2*(v1*v3) - v3*(v1*v2)) end function a_aww_DW pure function w_aaw_DW (g, v1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * (2*v3*(v1*v2) - v2*(v1*v3) - v1*(v2*v3)) end function w_aaw_DW pure function a_aww_W (g, v1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * (v1*((-(k2+k3)*v2)*(k2*v3) + (-(k2+k3)*v3)*(k3*v2)) & +v2*((-((k2-k3)*v1)*(k1+k2+k3)*v3) - (k1*v3)*(k2*v1) & + ((k1+k2+k3)*v1)*(k2*v3)) & +v3*(((k2-k3)*v1)*((k1+k2+k3)*v2) - (k1*v2)*(k3*v1) & + ((k1+k2+k3)*v1)*(k3*v2)) & +(v1*v2)*(((2*k1+k2+k3)*v3)*k2 - (k2*v3)*k1 -(k1*v3)*k3) & +(v1*v3)*(((2*k1+k2+k3)*v2)*k3 - (k3*v2)*k1 - (k1*v2)*k3) & +(v2*v3)*((-(k1+k2+k3)*v1)*(k2+k3) + ((k2+k3)*v1)*k1) & +(-(k1+k2+k3)*k3 +k1*k2)*((v1*v3)*v2 - (v2*v3)*v1) & +(-(k1+k2+k3)*k2 + k1*k3)*((v1*v2)*v3 - (v2*v3)*v1)) end function a_aww_W pure function w_aaw_W (g, v1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * (v1*((k1*v3)*(-(k1+k2+2*k3)*v2) + (k2*v3)*((k1+k2+k3)*v2) & + (k1*v2)*((k1+k2+k3)*v3)) & + v2*(((k1-k2)*v3)*((k1+k2+k3)*v1) - (k2*v3)*(k3*v1) & + (k2*v1)*((k1+k2+k3)*v3)) & + v3*((k1*v2)*(-(k1+k2)*v1) + (k2*v1)*(-(k1+k2)*v2)) & + (v1*v2)*((k1+k2)*(-(k1+k2+k3)*v3) + k3*((k1+k2)*v3))& + (v1*v3)*(-k2*(k3*v2) - k3*(k1*v2) + k1*((k1+k2+2*k3)*v2)) & + (v2*v3)*(-k1*(k3*v1) - k3*(k2*v1) + k2*((k1+k2+2*k3)*v1)) & + (-k2*(k1+k2+k3) + k1*k3)*(v1*(v2*v3) - v3*(v1*v2)) & + (-k1*(k1+k2+k3) + k2*k3)*(v2*(v1*v3) - v3*(v1*v2)) ) end function w_aaw_W <>= public :: h_hww_D, w_hhw_D, h_hww_DP, w_hhw_DP, h_hvv_PB, v_hhv_PB <>= pure function h_hww_D (g, h1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h1 * ((v2*v3)*((k2*k2)+(k3*k3)) - (k2*v2)*(k2*v3) & - (k3*v2)*(k3*v3)) end function h_hww_D <>= pure function w_hhw_D (g, h1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(vector), intent(in) :: v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * h2 * (v3 * ((k1+k2+k3)*(k1+k2+k3)+(k3*k3)) & - (k1+k2+k3) * ((k1+k2+k3)*v3) - k3 * (k3*v3)) end function w_hhw_D <>= pure function h_hww_DP (g, h1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h1 * (-((k2+k3)*v2)*(k2*v3) - & ((k2+k3)*v3)*(k3*v2)+ (v2*v3)*((k2+k3)*(k2+k3))) end function h_hww_DP <>= pure function w_hhw_DP (g, h1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(vector), intent(in) :: v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * h2 * (k3*((k1+k2)*v3) + (k1+k2)*(-(k1+k2+k3)*v3) & + v3*((k1+k2)*(k1+k2))) end function w_hhw_DP <>= pure function h_hvv_PB (g, h1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h1 * ((k2*v3)*(k3*v2) - (k2*k3)*(v2*v3)) end function h_hvv_PB <>= pure function v_hhv_PB (g, h1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(vector), intent(in) :: v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * h2 * ((-(k1+k2+k3)*v3)*k3 + ((k1+k2+k3)*k3)*v3) end function v_hhv_PB <>= public :: a_hhz_D, h_ahz_D, z_ahh_D, a_hhz_DP, h_ahz_DP, z_ahh_DP, & a_hhz_PB, h_ahz_PB, z_ahh_PB <>= pure function a_hhz_D (g, h1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(vector), intent(in) :: v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * h2 * ((k1+k2+k3) * ((k1+k2+k3)*v3) & - v3 * ((k1+k2+k3)*(k1+k2+k3))) end function a_hhz_D <>= pure function h_ahz_D (g, v1, k1, h2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h2 * ((k1*v1)*(k1*v3) - (k1*k1)*(v1*v3)) end function h_ahz_D <>= pure function z_ahh_D (g, v1, k1, h2, k2, h3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1 complex(kind=default), intent(in) :: h2, h3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * h3 * ((k1*v1)*k1 - (k1*k1)*v1) end function z_ahh_D <>= pure function a_hhz_DP (g, h1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(vector), intent(in) :: v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * h2 * ((-(k1+k2+k3)*v3)*(k1+k2) + ((k1+k2+k3)*(k1+k2))*v3) end function a_hhz_DP <>= pure function h_ahz_DP (g, v1, k1, h2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h2 * ( (k1*v3)*(-(k1+k3)*v1) + (k1*(k1+k3))*(v1*v3) ) end function h_ahz_DP <>= pure function z_ahh_DP (g, v1, k1, h2, k2, h3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1 complex(kind=default), intent(in) :: h2, h3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * h3 * (k1*((k2+k3)*v1) - v1*(k1*(k2+k3))) end function z_ahh_DP <>= pure function a_hhz_PB (g, h1, k1, h2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1, h2 type(vector), intent(in) :: v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * h2 * (k3*((k1+k2+k3)*v3) - v3*((k1+k2+k3)*k3)) end function a_hhz_PB <>= pure function h_ahz_PB (g, v1, k1, h2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h2 type(vector), intent(in) :: v1, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * h2 * ((-k1*v3)*(k3*v1) + (k1*k3)*(v1*v3)) end function h_ahz_PB <>= pure function z_ahh_PB (g, v1, k1, h2, k2, h3, k3) result (vout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1 complex(kind=default), intent(in) :: h2, h3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h2 * h3 * (k1*((k1+k2+k3)*v1) - v1*(k1*(k1+k2+k3))) end function z_ahh_PB <>= public :: h_wwz_DW, w_hwz_DW, z_hww_DW, h_wwz_DPB, w_hwz_DPB, z_hww_DPB public :: h_wwz_DDPW, w_hwz_DDPW, z_hww_DDPW, h_wwz_DPW, w_hwz_DPW, z_hww_DPW <>= pure function h_wwz_DW (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * (((k1-k2)*v3)*(v1*v2)-((2*k1+k2)*v2)*(v1*v3) + & ((k1+2*k2)*v1)*(v2*v3)) end function h_wwz_DW <>= pure function w_hwz_DW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ( v2*(-(k1+2*k2+k3)*v3) + v3*((2*k1+k2+2*k3)*v2) - & (k1 - k2 + k3)*(v2*v3)) end function w_hwz_DW <>= pure function z_hww_DW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ((k2-k3)*(v2*v3) - v2*((2*k2+k3)*v3) + v3*((k2+2*k3)*v2)) end function z_hww_DW <>= pure function h_wwz_DPB (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * ((k3*v1)*(v2*v3) - (k3*v2)*(v1*v3)) end function h_wwz_DPB <>= pure function w_hwz_DPB (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * (k3*(v2*v3) - v3*(k3*v2)) end function w_hwz_DPB <>= pure function z_hww_DPB (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * (((k1+k2+k3)*v3)*v2 - ((k1+k2+k3)*v2)*v3) end function z_hww_DPB <>= pure function h_wwz_DDPW (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * (((k1-k2)*v3)*(v1*v2)-((k1-k3)*v2)*(v1*v3)+((k2-k3)*v1)*(v2*v3)) end function h_wwz_DDPW <>= pure function w_hwz_DDPW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ((-(k1+2*k2+k3)*v3)*v2 + ((k1+k2+2*k3)*v2)*v3 + & (v2*v3)*(k2-k3)) end function w_hwz_DDPW <>= pure function z_hww_DDPW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ((v2*v3)*(k2-k3) - ((k1+2*k2+k3)*v3) *v2 + & ((k1+k2+2*k3)*v2)*v3 ) end function z_hww_DDPW <>= pure function h_wwz_DPW (g, v1, k1, v2, k2, v3, k3) result (hout) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2, v3 type(momentum), intent(in) :: k1, k2, k3 complex(kind=default) :: hout hout = g * (((k1-k2)*v3)*(v1*v2) + (-(2*k1+k2+k3)*v2)*(v1*v3) + & ((k1+2*k2+k3)*v1)*(v2*v3)) end function h_wwz_DPW <>= pure function w_hwz_DPW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ((-(k1+2*k2+k3)*v3)*v2 + ((2*k1+k2+k3)*v2)*v3 + & (v2*v3)*(k2-k1)) end function w_hwz_DPW <>= pure function z_hww_DPW (g, h1, k1, v2, k2, v3, k3) result (vout) complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: h1 type(vector), intent(in) :: v2, v3 type(momentum), intent(in) :: k1, k2, k3 type(vector) :: vout vout = g * h1 * ((v2*v3)*(k2-k3) + ((k1-k2)*v3)*v2 + ((k3-k1)*v2)*v3) end function z_hww_DPW @ \section{Scalar3 Dim-5 Couplings} <>= public :: phi_dim5s2 @ \begin{equation} \phi_1(k_1) = g (k_2 \cdot k_3) \phi_2 (k_2) \phi_3 (k_3) \end{equation} <>= pure function phi_dim5s2 (g, phi2, k2, phi3, k3) result (phi1) complex(kind=default), intent(in) :: g, phi2, phi3 type(momentum), intent(in) :: k2, k3 complex(kind=default) :: phi1 phi1 = g * phi2 * phi3 * (k2 * k3) end function phi_dim5s2 @ \section{Tensorscalar-Scalar Couplings} <>= public :: tphi_ss, tphi_ss_cf, s_tphis, s_tphis_cf @ \begin{equation} \phi(k_1 + k_2) = 2 g ((k_1 \cdot k_2) + (k_1 \cdot k_1)) ((k_1 \cdot k_2) + (k_2 \cdot k_2)) \phi_1 (k_1) \phi_2 (k_2) \end{equation} <>= pure function tphi_ss (g, phi1, k1, phi2, k2) result (phi) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi phi = 2 * g * phi1 * phi2 * & ((k1 * k2)+ (k1 * k1)) * & ((k1 * k2)+ (k2 * k2)) end function tphi_ss @ \begin{equation} \phi(k_1 + k_2) = - g/2 (k_1 \cdot k_2) ((k_1 + k_2) \cdot (k_1 + k_2)) \phi_1 (k_1) \phi_2 (k_2) \end{equation} <>= pure function tphi_ss_cf (g, phi1, k1, phi2, k2) result (phi) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 complex(kind=default) :: phi phi = - g/2 * phi1 * phi2 * & (k1 * k2) * & ((k1 + k2) * (k1 + k2)) end function tphi_ss_cf @ \begin{equation} \phi_1(k_1) = 2 g ((k_1 \cdot k_2) + (k_1 \cdot k_1)) ((k_1 \cdot k_2) + (k_2 \cdot k_2)) \phi(k_2-k_1) \phi_2 (k_2) \end{equation} <>= pure function s_tphis (g, phi, k, phi2, k2) result (phi1) complex(kind=default), intent(in) :: g, phi, phi2 type(momentum), intent(in) :: k, k2 complex(kind=default) :: phi1 type(momentum) :: k1 k1 = - ( k + k2) phi1 = 2 * g * phi * phi2 * & ((k1 * k2)+ (k1 * k1)) * & ((k1 * k2)+ (k2 * k2)) end function s_tphis @ \begin{equation} \phi_1(k_1) = - g/2 (k_1 \cdot k_2) ((k_1 + k_2) \cdot (k_1 + k_2)) \phi (k_2 -k_1) \phi_2 (k_2) \end{equation} <>= pure function s_tphis_cf (g, phi, k, phi2, k2) result (phi1) complex(kind=default), intent(in) :: g, phi, phi2 type(momentum), intent(in) :: k, k2 complex(kind=default) :: phi1 type(momentum) :: k1 k1 = - ( k + k2) phi1 = - g/2 * phi * phi2 * & (k1 * k2) * & ((k1 + k2) * (k1 + k2)) end function s_tphis_cf @ \section{Scalar2-Vector2 Dim-8 Couplings} <>= public :: phi_phi2v_1, v_phi2v_1, phi_phi2v_2, v_phi2v_2 @ \begin{equation} \phi_2(k_2) = g \left (\left ( k_1 \cdot V_1 \right ) \left ( k_2 \cdot V_2 \right ) + \left ( k_1 \cdot V_1 \right )\left ( k_1 \cdot V_2 \right ) \right ) \phi_1 (k_1) \end{equation} <>= pure function phi_phi2v_1 (g, phi1, k1, v1, k_v1, v2, k_v2) result (phi2) complex(kind=default), intent(in) :: g, phi1 type(momentum), intent(in) :: k1, k_v1, k_v2 type(momentum) :: k2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: phi2 k2 = - k1 - k_v1 - k_v2 phi2 = g * phi1 * & ( (k1 * v1) * (k2 * v2) + (k1 * v2) * (k2 * v1) ) end function phi_phi2v_1 @ \begin{equation} V_2^\mu =g \left ( k_1^\mu \left ( k_2 \cdot V_1 \right ) + k_2^\mu \left ( k_1 \cdot V_1 \right ) \right ) \phi_1 (k_1) \phi_2 (k_2) \end{equation} <>= pure function v_phi2v_1 (g, phi1, k1, phi2, k2, v1) result (v2) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 type(vector), intent(in) :: v1 type(vector) :: v2 v2 = g * phi1 * phi2 * & ( k1 * (k2 * v1) + k2 * (k1 * v1) ) end function v_phi2v_1 @ \begin{equation} \phi_2(k_2) = g \left ( k_1 \cdot k_2 \right ) \left ( V_1\cdot V_2 \right) \phi_1 (k_1) \end{equation} <>= pure function phi_phi2v_2 (g, phi1, k1, v1,k_v1, v2, k_v2) result (phi2) complex(kind=default), intent(in) :: g, phi1 type(momentum), intent(in) :: k1, k_v1, k_v2 type(vector), intent(in) :: v1, v2 type(momentum) :: k2 complex(kind=default) :: phi2 k2 = - k1 - k_v1 - k_v2 phi2 = g * phi1 * (k1 * k2) * (v1 * v2) end function phi_phi2v_2 @ \begin{equation} V_2^\mu = g V_1^\mu \left ( k_1 \cdot k_2 \right ) \phi_1 \phi_2 \end{equation} <>= pure function v_phi2v_2 (g, phi1, k1, phi2, k2, v1) result (v2) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 type(vector), intent(in) :: v1 type(vector) :: v2 v2 = g * phi1 * phi2 * & ( k1 * k2 ) * v1 end function v_phi2v_2 @ \section{Scalar4 Dim-8 Couplings} <>= public :: s_dim8s3 @ \begin{equation} \phi(k_1) = g \left [ \left ( k_1 \cdot k_2 \right ) \left ( k_3 \cdot k_4 \right )+ \left ( k_1 \cdot k_3 \right ) \left ( k_2 \cdot k_4 \right ) + \left ( k_1 \cdot k_4 \right )\left ( k_2 \cdot k_3 \right ) \right ] \phi_2 (k_2) \phi_3 (k_3) \phi_4 (k_4) \end{equation} <>= pure function s_dim8s3 (g, phi2, k2, phi3, k3, phi4, k4) result (phi1) complex(kind=default), intent(in) :: g, phi2, phi3, phi4 type(momentum), intent(in) :: k2, k3, k4 type(momentum) :: k1 complex(kind=default) :: phi1 k1 = - k2 - k3 - k4 phi1 = g * ( (k1 * k2) * (k3 * k4) + (k1 * k3) * (k2 * k4) & + (k1 * k4) * (k2 * k3) ) * phi2 * phi3 * phi4 end function s_dim8s3 @ \section{Mixed Scalar2-Vector2 Dim-8 Couplings} <>= public :: phi_phi2v_m_0, v_phi2v_m_0, phi_phi2v_m_1, v_phi2v_m_1, phi_phi2v_m_7, v_phi2v_m_7 @ \begin{equation} \phi_2(k_2) = g \left (\left ( V_1 \cdot k_{V_2} \right ) \left ( V_2 \cdot k_{V_1} \right ) \left ( k_1 \cdot k_2 \right ) - (\left ( V_1 \cdot V_2 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \left ( k_1 \cdot k_2 \right ) \right ) \phi_1 (k_1) \end{equation} <>= pure function phi_phi2v_m_0 (g, phi1, k1, v1, k_v1, v2, k_v2) result (phi2) complex(kind=default), intent(in) :: g, phi1 type(momentum), intent(in) :: k1, k_v1, k_v2 type(momentum) :: k2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: phi2 k2 = - k1 - k_v1 - k_v2 phi2 = g * phi1 * & ( (v1 * k_v2) * (v2 * k_v1) * (k1 * k2) & - (v1 * v2) * (k_v1 * k_v2) * (k1 * k2) ) end function phi_phi2v_m_0 @ \begin{equation} V_2^\mu =g \left ( k_{V_1}^\mu \left ( V_1 \cdot k_{V_2} \right ) \left ( k_1 \cdot k_2 \right ) - V_1^\mu \left ( k_{V_1} \cdot k_{V_2} \right ) \left ( k_1 \cdot k_2 \right ) \right ) \phi_1 (k_1) \phi_2 (k_2)) \end{equation} <>= pure function v_phi2v_m_0 (g, phi1, k1, phi2, k2, v1, k_v1) result (v2) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2, k_v1 type(vector), intent(in) :: v1 type(momentum) :: k_v2 type(vector) :: v2 k_v2 = - k_v1 - k1 - k2 v2 = g * phi1 * phi2 * & ( k_v1 * (v1 * k_v2) * (k1 * k2) & - v1 * (k_v2 * k_v1) * (k1 * k2) ) end function v_phi2v_m_0 @ \begin{equation} \phi_2(k_2) = g \left (\left ( V_1 \cdot V_2 \right ) \left ( k_1 \cdot k_{V_2} \right ) \left ( k_2 \cdot k_{V_1} \right ) + (\left ( V_1 \cdot V_2 \right ) \left ( k_1 \cdot k_{V_1} \right ) \left ( k_2 \cdot k_{V_2} \right ) \\ + (\left ( V_1 \cdot k_2 \right ) \left ( V_2 \cdot k_1 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) + (\left ( V_1 \cdot k_1 \right ) \left ( V_2 \cdot k_2 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \\ - (\left ( V_1 \cdot k_{V_2} \right ) \left ( V_2 \cdot k_2 \right ) \left ( k_1 \cdot k_{V_1} \right ) - (\left ( V_1 \cdot k_2 \right ) \left ( V_2 \cdot k_{V_1} \right ) \left ( k_1 \cdot k_{V_2} \right ) \\ - (\left ( V_1 \cdot k_{V_2} \right ) \left ( V_2 \cdot k_1 \right ) \left ( k_2 \cdot k_{V_1} \right ) - (\left ( V_1 \cdot k_1 \right ) \left ( V_2 \cdot k_{V_1} \right ) \left ( k_2 \cdot k_{V_2} \right ) \right ) \phi_1 (k_1) \end{equation} <>= pure function phi_phi2v_m_1 (g, phi1, k1, v1, k_v1, v2, k_v2) result (phi2) complex(kind=default), intent(in) :: g, phi1 type(momentum), intent(in) :: k1, k_v1, k_v2 type(momentum) :: k2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: phi2 k2 = - k1 - k_v1 - k_v2 phi2 = g * phi1 * & ( (v1 * v2) * (k1 * k_v2) * (k2 * k_v1) & + (v1 * v2) * (k1 * k_v1) * (k2 * k_v2) & + (v1 * k2) * (v2 * k1) * (k_v1 * k_v2) & + (v1 * k1) * (v2 * k2) * (k_v1 * k_v2) & - (v1 * k_v2) * (v2 * k2) * (k1 * k_v1) & - (v1 * k2) * (v2 * k_v1) * (k1 * k_v2) & - (v1 * k_v2) * (v2 * k1) * (k2 * k_v1) & - (v1 * k1) * (v2 * k_v1) * (k2 * k_v2) ) end function phi_phi2v_m_1 @ \begin{equation} V_2^\mu =g \left ( k_1^\mu \left ( V_1 \cdot k_2 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \\ + k_2^\mu \left ( V_1 \cdot k_1 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \\ + V_1^\mu \left ( k_{V_1} \cdot k_1 \right ) \left ( k_{V_2} \cdot k_2 \right ) \\ + V_1^\mu \left ( k_{V_1} \cdot k_2 \right ) \left ( k_{V_2} \cdot k_1 \right ) \\ - k_1^\mu \left ( V_1 \cdot k_{V_2} \right ) \left ( k_{V_1} \cdot k_2 \right ) \\ - k_2^\mu \left ( V_1 \cdot k_{V_2} \right ) \left ( k_{V_1} \cdot k_1 \right ) \\ - k_{V_1}^\mu \left ( V_1 \cdot k_1 \right ) \left ( k_{V_2} \cdot k_2 \right ) \\ - k_{V_1}^\mu \left ( V_1 \cdot k_2 \right ) \left ( k_{V_2} \cdot k_1 \right ) \right ) \\ \phi_1 (k_1) \phi_2 (k_2) \end{equation} <>= pure function v_phi2v_m_1 (g, phi1, k1, phi2, k2, v1, k_v1) result (v2) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2, k_v1 type(vector), intent(in) :: v1 type(momentum) :: k_v2 type(vector) :: v2 k_v2 = - k_v1 - k1 - k2 v2 = g * phi1 * phi2 * & ( k1 * (v1 * k2) * (k_v1 * k_v2) & + k2 * (v1 * k1) * (k_v1 * k_v2) & + v1 * (k_v1 * k1) * (k_v2 * k2) & + v1 * (k_v1 * k2) * (k_v2 * k1) & - k1 * (v1 * k_v2) * (k_v1 * k2) & - k2 * (v1 * k_v2) * (k_v1 * k1) & - k_v1 * (v1 * k1) * (k_v2 * k2) & - k_v1 * (v1 * k2) * (k_v2 * k1) ) end function v_phi2v_m_1 @ \begin{equation} \phi_2(k_2) = g \left (\left ( V_1 \cdot k_{V_2} \right ) \left ( k_1 \cdot V_2 \right ) \left ( k_2 \cdot k_{V_1} \right ) + (\left ( V_1 \cdot k_{V_2} \right ) \left ( k_1 \cdot k_{V_1} \right ) \left ( k_2 \cdot k_{V_2} \right ) \\ + (\left ( V_1 \cdot k_1 \right ) \left ( V_2 \cdot k_{V_1} \right ) \left ( k_2 \cdot k_{V_2} \right ) + (\left ( V_1 \cdot k_2 \right ) \left ( V_2 \cdot k_{V_1} \right ) \left ( k_1 \cdot k_{V_2} \right ) \\ - (\left ( V_1 \cdot V_2 \right ) \left ( k_1 \cdot k_{V_2} \right ) \left ( k_2 \cdot k_{V_1} \right ) - (\left ( V_1 \cdot V_2 \right ) \left ( k_1 \cdot k_{V_1} \right ) \left ( k_2 \cdot k_{V_2} \right ) \\ - (\left ( V_1 \cdot k_2 \right ) \left ( V_2 \cdot k_1 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) - (\left ( V_1 \cdot k_1 \right ) \left ( V_2 \cdot k_2 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \right ) \phi_1 (k_1) \end{equation} <>= pure function phi_phi2v_m_7 (g, phi1, k1, v1, k_v1, v2, k_v2) result (phi2) complex(kind=default), intent(in) :: g, phi1 type(momentum), intent(in) :: k1, k_v1, k_v2 type(momentum) :: k2 type(vector), intent(in) :: v1, v2 complex(kind=default) :: phi2 k2 = - k1 - k_v1 - k_v2 phi2 = g * phi1 * & ( (v1 * k_v2) * (k1 * v2) * (k2 * k_v1) & + (v1 * k_v2) * (k1 * k_v1) * (k2 * v2) & + (v1 * k1) * (v2 * k_v1) * (k2 * k_v2) & + (v1 * k2) * (v2 * k_v1) * (k1 * k_v2) & - (v1 * v2) * (k1 * k_v2) * (k2 * k_v1) & - (v1 * v2) * (k1 * k_v1) * (k2 * k_v2) & - (v1 * k2) * (v2 * k1) * (k_v1 * k_v2) & - (v1 * k1) * (v2 * k2) * (k_v1 * k_v2) ) end function phi_phi2v_m_7 @ \begin{equation} V_2^\mu =g \left ( k_1^\mu \left ( V_1 \cdot k_{V_2} \right ) \left ( k_2 \cdot k_{V_1} \right ) \\ + k_2^\mu \left ( V_1 \cdot k_{V_2} \right ) \left ( k_1 \cdot k_{V_1} \right ) \\ + k_{V_1}^\mu \left ( V_1 \cdot k_1 \right ) \left ( k_2 \cdot k_{V_2} \right ) \\ + k_{V_1}^\mu \left ( V_1 \cdot k_2 \right ) \left ( k_1 \cdot k_{V_2} \right ) \\ - k_1^\mu \left ( V_1 \cdot k_2 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \\ - k_2^\mu \left ( V_1 \cdot k_1 \right ) \left ( k_{V_1} \cdot k_{V_2} \right ) \\ - k_{V_1}^\mu \left ( k_1 \cdot k_{V_2} \right ) \left ( k_2 \cdot k_{V_1} \right ) \\ - k_{V_1}^\mu \left ( k_1 \cdot k_{V_1} \right ) \left ( k_2 \cdot k_{V_2} \right ) \right ) \\ \phi_1 (k_1) \phi_2 (k_2) \end{equation} <>= pure function v_phi2v_m_7 (g, phi1, k1, phi2, k2, v1, k_v1) result (v2) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2, k_v1 type(vector), intent(in) :: v1 type(momentum) :: k_v2 type(vector) :: v2 k_v2 = - k_v1 - k1 - k2 v2 = g * phi1 * phi2 * & ( k1 * (v1 * k_v2) * (k2 * k_v1) & + k2 * (v1 * k_v2) * (k1 * k_v1) & + k_v1 * (v1 * k1) * (k2 * k_v2) & + k_v1 * (v1 * k2) * (k1 * k_v2) & - k1 * (v1 * k2) * (k_v1 * k_v2) & - k2 * (v1 * k1) * (k_v1 * k_v2) & - v1 * (k1 * k_v2) * (k2 * k_v1) & - v1 * (k1 * k_v1) * (k2 * k_v2) ) end function v_phi2v_m_7 @ \section{Transversal Gauge4 Dim-8 Couplings} <>= public :: g_dim8g3_t_0, g_dim8g3_t_1, g_dim8g3_t_2 @ \begin{equation} V_1^\mu = g \left [ k_2^\mu \left ( k_1 \cdot V_2 \right ) - V_2^\mu \left ( k_1 \cdot k_2 \right ) \right ] \left [ \left ( k_3 \cdot V_4 \right) \left ( k_4 \cdot V_3 \right ) - \left (V_3 \cdot V_4 \right ) \left ( k_3 \cdot k_4 \right ) \right ] \end{equation} <>= pure function g_dim8g3_t_0 (g, v2, k2, v3, k3, v4, k4) result (v1) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v2, v3, v4 type(momentum), intent(in) :: k2, k3, k4 type(vector) :: v1 type(momentum) :: k1 k1 = - k2 - k3 - k4 v1 = g * (k2 * (k1 * v2) - v2 * (k1 * k2)) & * ((k3 * v4) * (k4 * v3) - (v3 * v4) * (k3 * k4)) end function g_dim8g3_t_0 @ \begin{equation} V_1^\mu = g \left [ k_2^\mu \left ( k_1 \cdot V_2 \right ) - V_2^\mu \left ( k_1 \cdot k_2 \right ) \right ] \left [ \left ( k_3 \cdot V_4 \right) \left ( k_4 \cdot V_3 \right ) - \left (V_3 \cdot V_4 \right ) \left ( k_3 \cdot k_4 \right ) \right ] \end{equation} <>= pure function g_dim8g3_t_1 (g, v2, k2, v3, k3, v4, k4) result (v1) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v2, v3, v4 type(momentum), intent(in) :: k2, k3, k4 type(vector) :: v1 type(momentum) :: k1 k1 = - k2 - k3 - k4 v1 = g * (v3 * (v2 * k4) * (k1 * k3) * (k2 * v4) & + v4 * (v2 * k3) * (k1 * k4) * (k2 * v3) & + k3 * (v2 * v4) * (k1 * v3) * (k2 * k4) & + k4 * (v2 * v3) * (k1 * v4) * (k2 * k3) & - v3 * (v2 * v4) * (k1 * k3) * (k2 * k4) & - v4 * (v2 * v3) * (k1 * k4) * (k2 * k3) & - k3 * (v2 * k4) * (k1 * v3) * (k2 * v4) & - k4 * (v2 * k3) * (k1 * v4) * (k2 * v3)) end function g_dim8g3_t_1 @ \begin{equation} V_1^\mu = g \left [ k_2^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_1\right ) \\ + k_3^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_2\right ) \\ + k_2^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot k_1\right ) \left (V_4 \cdot k_3\right ) \\ + k_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_2\right ) \left (V_4 \cdot k_3\right ) \\ + k_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_2\right ) \\ + k_3^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_2\right ) \\ - k_3^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_4\right ) \left (k_1 \cdot k_2\right ) \\ - V_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot k_4\right ) \left (k_1 \cdot k_2\right ) \\ - k_4^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_3\right ) \left (k_1 \cdot k_2\right ) \\ - V_3^\mu \left (V_2 \cdot k_4\right ) \left (V_4 \cdot k_3\right ) \left (k_1 \cdot k_2\right ) \\ - k_2^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_3\right ) \\ + k_2^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_4\right ) \left (k_1 \cdot k_3\right ) \\ - V_2^\mu \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_2\right ) \left (k_1 \cdot k_3\right ) \\ - k_2^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_4\right ) \\ + k_2^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_3\right ) \left (k_1 \cdot k_4\right ) \\ - V_2^\mu \left (V_3 \cdot k_2\right ) \left (V_4 \cdot k_3\right ) \left (k_1 \cdot k_4\right ) \\ - k_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot V_4\right ) \left (k_2 \cdot k_3\right ) \\ + V_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_4\right ) \left (k_2 \cdot k_3\right ) \\ - V_2^\mu \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_1\right ) \left (k_2 \cdot k_3\right ) \\ + V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_4\right ) \left (k_2 \cdot k_3\right ) \\ - k_3^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot V_4\right ) \left (k_2 \cdot k_4\right ) \\ + V_3^\mu \left (V_2 \cdot k_1\right ) \left (V_4 \cdot k_3\right ) \left (k_2 \cdot k_4\right ) \\ - V_2^\mu \left (V_3 \cdot k_1\right ) \left (V_4 \cdot k_3\right ) \left (k_2 \cdot k_4\right ) \\ + V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_3\right ) \left (k_2 \cdot k_4\right ) \\ - k_2^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_1\right ) \left (k_3 \cdot k_4\right ) \\ - V_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_2\right ) \left (k_3 \cdot k_4\right ) \\ - k_2^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_1\right ) \left (k_3 \cdot k_4\right ) \\ + V_2^\mu \left (V_3 \cdot k_2\right ) \left (V_4 \cdot k_1\right ) \left (k_3 \cdot k_4\right ) \\ - V_3^\mu \left (V_2 \cdot k_1\right ) \left (V_4 \cdot k_2\right ) \left (k_3 \cdot k_4\right ) \\ + V_2^\mu \left (V_3 \cdot k_1\right ) \left (V_4 \cdot k_2\right ) \left (k_3 \cdot k_4\right ) \\ + V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_1 \cdot k_2\right ) \left (k_3 \cdot k_4\right ) \\ + V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_1 \cdot k_2\right ) \left (k_3 \cdot k_4\right ) \right ] \end{equation} <>= pure function g_dim8g3_t_2 (g, v2, k2, v3, k3, v4, k4) result (v1) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v2, v3, v4 type(momentum), intent(in) :: k2, k3, k4 type(vector) :: v1 type(momentum) :: k1 k1 = - k2 - k3 - k4 v1 = g * (k2 * (v2 * k3) * (v3 * k4) * (v4 * k1) & + k3 * (v2 * k1) * (v3 * k4) * (v4 * k2) & + k2 * (v2 * k4) * (v3 * k1) * (v4 * k3) & + k4 * (v2 * k1) * (v3 * k2) * (v4 * k3) & + k4 * (v2 * k3) * (v3 * v4) * (k1 * k2) & + k3 * (v2 * k4) * (v3 * v4) * (k1 * k2) & - k3 * (v2 * v4) * (v3 * k4) * (k1 * k2) & - v4 * (v2 * k3) * (v3 * k4) * (k1 * k2) & - k4 * (v2 * v3) * (v4 * k3) * (k1 * k2) & - v3 * (v2 * k4) * (v4 * k3) * (k1 * k2) & - k2 * (v2 * k4) * (v3 * v4) * (k1 * k3) & + k2 * (v2 * v4) * (v3 * k4) * (k1 * k3) & - v2 * (v3 * k4) * (v4 * k2) * (k1 * k3) & - k2 * (v2 * k3) * (v3 * v4) * (k1 * k4) & + k2 * (v2 * v3) * (v4 * k3) * (k1 * k4) & - v2 * (v3 * k2) * (v4 * k3) * (k1 * k4) & - k4 * (v2 * k1) * (v3 * v4) * (k2 * k3) & + v4 * (v2 * k1) * (v3 * k4) * (k2 * k3) & - v2 * (v3 * k4) * (v4 * k1) * (k2 * k3) & + v2 * (v3 * v4) * (k1 * k4) * (k2 * k3) & - k3 * (v2 * k1) * (v3 * v4) * (k2 * k4) & + v3 * (v2 * k1) * (v4 * k3) * (k2 * k4) & - v2 * (v3 * k1) * (v4 * k3) * (k2 * k4) & + v2 * (v3 * v4) * (k1 * k3) * (k2 * k4) & - k2 * (v2 * v4) * (v3 * k1) * (k3 * k4) & - v4 * (v2 * k1) * (v3 * k2) * (k3 * k4) & - k2 * (v2 * v3) * (v4 * k1) * (k3 * k4) & + v2 * (v3 * k2) * (v4 * k1) * (k3 * k4) & - v3 * (v2 * k1) * (v4 * k2) * (k3 * k4) & + v2 * (v3 * k1) * (v4 * k2) * (k3 * k4) & + v4 * (v2 * v3) * (k1 * k2) * (k3 * k4) & + v3 * (v2 * v4) * (k1 * k2) * (k3 * k4)) end function g_dim8g3_t_2 @ \section{Mixed Gauge4 Dim-8 Couplings} <>= public :: g_dim8g3_m_0, g_dim8g3_m_1, g_dim8g3_m_7 @ \begin{equation} V_1^\mu = g_1 \left [ V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_2\right ) \\ - k_2^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot V_4\right ) \\ \right ] \\ + g_2 \left [ V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_3 \cdot k_4\right ) \\ - V_2^\mu \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_3\right ) \\ \right ] \end{equation} <>= pure function g_dim8g3_m_0 (g1, g2, v2, k2, v3, k3, v4, k4) result (v1) complex(kind=default), intent(in) :: g1, g2 type(vector), intent(in) :: v2, v3, v4 type(momentum), intent(in) :: k2, k3, k4 type(vector) :: v1 type(momentum) :: k1 k1 = - k2 - k3 - k4 v1 = g1 * (v2 * (v3 * v4) * (k1 * k2) & - k2 * (v2 * k1) * (v3 * v4)) & + g2 * (v2 * (v3 * v4) * (k3 * k4) & - v2 * (v3 * k4) * (v4 * k3)) end function g_dim8g3_m_0 @ \begin{equation} V_1^\mu = g_1 \left [ k_2^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_1\right ) \\ + V_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_2\right ) \\ + k_2^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_1\right ) \\ + V_3^\mu \left (V_2 \cdot k_1\right ) \left (V_4 \cdot k_2\right ) \\ - V_2^\mu \left (V_3 \cdot k_2\right ) \left (V_4 \cdot k_1\right ) \\ - V_2^\mu \left (V_3 \cdot k_1\right ) \left (V_4 \cdot k_2\right ) \\ - V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_1 \cdot k_2\right ) \\ - V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_1 \cdot k_2\right ) \\ \right ] \\ + g_2 \left [ k_3^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_4\right ) \\ - k_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot V_4\right ) \\ - k_3^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot V_4\right ) \\ + V_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot k_4\right ) \\ + k_4^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_3\right ) \\ + V_3^\mu \left (V_2 \cdot k_4\right ) \left (V_4 \cdot k_3\right ) \\ - V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_3 \cdot k_4\right ) \\ - V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_3 \cdot k_4\right ) \\ \right ] \end{equation} <>= pure function g_dim8g3_m_1 (g1, g2, v2, k2, v3, k3, v4, k4) result (v1) complex(kind=default), intent(in) :: g1, g2 type(vector), intent(in) :: v2, v3, v4 type(momentum), intent(in) :: k2, k3, k4 type(vector) :: v1 type(momentum) :: k1 k1 = - k2 - k3 - k4 v1 = g1 * (k2 * (v2 * v4) * (v3 * k1) & + v4 * (v2 * k1) * (v3 * k2) & + k2 * (v2 * v3) * (v4 * k1) & + v3 * (v2 * k1) * (v4 * k2) & - v2 * (v3 * k2) * (v4 * k1) & - v2 * (v3 * k1) * (v4 * k2) & - v4 * (v2 * v3) * (k1 * k2) & - v3 * (v2 * v4) * (k1 * k2)) & + g2 * (k3 * (v2 * v4) * (v3 * k4) & - k4 * (v2 * k3) * (v3 * v4) & - k3 * (v2 * k4) * (v3 * v4) & + v4 * (v2 * k3) * (v3 * k4) & + k4 * (v2 * v3) * (v4 * k3) & + v3 * (v2 * k4) * (v4 * k3) & - v4 * (v2 * v3) * (k3 * k4) & - v3 * (v2 * v4) * (k3 * k4)) end function g_dim8g3_m_1 @ \begin{equation} V_1^\mu = g_1 \left [ V_2^\mu \left (V_3 \cdot k_2\right ) \left (V_4 \cdot k_1\right ) \\ + V_2^\mu \left (V_4 \cdot k_1\right ) \left (V_4 \cdot k_2\right ) \\ + V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_1 \cdot k_2\right ) \\ + V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_1 \cdot k_2\right ) \\ - k_2^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_1\right ) \\ - V_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_2\right ) \\ - k_2^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_1\right ) \\ - V_3^\mu \left (V_2 \cdot k_1\right ) \left (V_4 \cdot k_2\right ) \\ \right ] \\ + g_2 \left [ k_3^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot V_4\right ) \\ + k_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot V_4\right ) \\ + k_2^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot V_4\right ) \\ + k_2^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot V_4\right ) \\ + V_4^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot k_1\right ) \\ + k_4^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_2\right ) \\ + V_3^\mu \left (V_2 \cdot k_3\right ) \left (V_4 \cdot k_1\right ) \\ + V_2^\mu \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_1\right ) \\ + V_3^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_2\right ) \\ + V_2^\mu \left (V_3 \cdot k_4\right ) \left (V_4 \cdot k_2\right ) \\ + V_2^\mu \left (V_3 \cdot k_1\right ) \left (V_4 \cdot k_3\right ) \\ + V_2^\mu \left (V_3 \cdot k_2\right ) \left (V_4 \cdot k_3\right ) \\ + V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_1 \cdot k_3\right ) \\ + V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_1 \cdot k_4\right ) \\ + V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_2 \cdot k_3\right ) \\ + V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_2 \cdot k_4\right ) \\ - k_4^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_1\right ) \\ - V_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot k_1\right ) \\ - k_3^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_2\right ) \\ - V_4^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot k_2\right ) \\ - k_2^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_4\right ) \\ - V_4^\mu \left (V_2 \cdot k_1\right ) \left (V_3 \cdot k_4\right ) \\ - k_3^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_1\right ) \\ - V_3^\mu \left (V_2 \cdot k_4\right ) \left (V_4 \cdot k_1\right ) \\ - k_4^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_2\right ) \\ - V_3^\mu \left (V_2 \cdot k_3\right ) \left (V_4 \cdot k_2\right ) \\ - k_2^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_3\right ) \\ - V_3^\mu \left (V_2 \cdot k_1\right ) \left (V_4 \cdot k_3\right ) \\ - V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_3\right ) \\ - V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_1 \cdot k_4\right ) \\ - V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_2 \cdot k_3\right ) \\ - V_2^\mu \left (V_3 \cdot V_4\right ) \left (k_2 \cdot k_4\right ) \\ \right ] + g_3 \left [ k_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot V_4\right ) \\ + k_3^\mu \left (V_2 \cdot k_4\right ) \left (V_3 \cdot V_4\right ) \\ + V_4^\mu \left (V_2 \cdot V_3\right ) \left (k_3 \cdot k_4\right ) \\ + V_3^\mu \left (V_2 \cdot V_4\right ) \left (k_3 \cdot k_4\right ) \\ - k_3^\mu \left (V_2 \cdot V_4\right ) \left (V_3 \cdot k_4\right ) \\ - V_4^\mu \left (V_2 \cdot k_3\right ) \left (V_3 \cdot k_4\right ) \\ - k_4^\mu \left (V_2 \cdot V_3\right ) \left (V_4 \cdot k_3\right ) \\ - V_3^\mu \left (V_2 \cdot k_4\right ) \left (V_4 \cdot k_3\right ) \\ \right ] \end{equation} <>= pure function g_dim8g3_m_7 (g1, g2, g3, v2, k2, v3, k3, v4, k4) result (v1) complex(kind=default), intent(in) :: g1, g2, g3 type(vector), intent(in) :: v2, v3, v4 type(momentum), intent(in) :: k2, k3, k4 type(vector) :: v1 type(momentum) :: k1 k1 = - k2 - k3 - k4 v1 = g1 * (v2 * (v3 * k2) * (v4 * k1) & + v2 * (v3 * k1) * (v4 * k2) & + v4 * (v2 * v3) * (k1 * k2) & + v3 * (v2 * v4) * (k1 * k2) & - k2 * (v2 * v4) * (v3 * k1) & - v4 * (v2 * k1) * (v3 * k2) & - k2 * (v2 * v3) * (v4 * k1) & - v3 * (v2 * k1) * (v4 * k2)) & + g2 * (k3 * (v2 * k1) * (v3 * v4) & + k4 * (v2 * k1) * (v3 * v4) & + k2 * (v2 * k3) * (v3 * v4) & + k2 * (v2 * k4) * (v3 * v4) & + v4 * (v2 * k4) * (v3 * k1) & + k4 * (v2 * v4) * (v3 * k2) & + v3 * (v2 * k3) * (v4 * k1) & + v2 * (v3 * k4) * (v4 * k1) & + k3 * (v2 * v3) * (v4 * k2) & + v2 * (v3 * k4) * (v4 * k2) & + v2 * (v3 * k1) * (v4 * k3) & + v2 * (v3 * k2) * (v4 * k3) & + v4 * (v2 * v3) * (k1 * k3) & + v3 * (v2 * v4) * (k1 * k4) & + v3 * (v2 * v4) * (k2 * k3) & + v4 * (v2 * v3) * (k2 * k4) & - k4 * (v2 * v4) * (v3 * k1) & - v4 * (v2 * k3) * (v3 * k1) & - k3 * (v2 * v4) * (v3 * k2) & - v4 * (v2 * k4) * (v3 * k2) & - k2 * (v2 * v4) * (v3 * k4) & - v4 * (v2 * k1) * (v3 * k4) & - k3 * (v2 * v3) * (v4 * k1) & - v3 * (v2 * k4) * (v4 * k1) & - k4 * (v2 * v3) * (v4 * k2) & - v3 * (v2 * k3) * (v4 * k2) & - k2 * (v2 * v3) * (v4 * k3) & - v3 * (v2 * k1) * (v4 * k3) & - v2 * (v3 * v4) * (k1 * k3) & - v2 * (v3 * v4) * (k1 * k4) & - v2 * (v3 * v4) * (k2 * k3) & - v2 * (v3 * v4) * (k2 * k4)) & + g3 * (k4 * (v2 * k3) * (v3 * v4) & + k3 * (v2 * k4) * (v3 * v4) & + v4 * (v2 * v3) * (k3 * k4) & + v3 * (v2 * v4) * (k3 * k4) & - k3 * (v2 * v4) * (v3 * k4) & - v4 * (v2 * k3) * (v3 * k4) & - k4 * (v2 * v3) * (v4 * k3) & - v3 * (v2 * k4) * (v4 * k3)) end function g_dim8g3_m_7 @ \section{Graviton Couplings} <>= public :: s_gravs, v_gravv, grav_ss, grav_vv @ <>= pure function s_gravs (g, m, k1, k2, t, s) result (phi) complex(kind=default), intent(in) :: g, s real(kind=default), intent(in) :: m type(momentum), intent(in) :: k1, k2 type(tensor), intent(in) :: t complex(kind=default) :: phi, t_tr t_tr = t%t(0,0) - t%t(1,1) - t%t(2,2) - t%t(3,3) phi = g * s * (((t*k1)*k2) + ((t*k2)*k1) & - g * (m**2 + (k1*k2))*t_tr)/2.0_default end function s_gravs @ <>= pure function grav_ss (g, m, k1, k2, s1, s2) result (t) complex(kind=default), intent(in) :: g, s1, s2 real(kind=default), intent(in) :: m type(momentum), intent(in) :: k1, k2 type(tensor) :: t_metric, t t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default t = g*s1*s2/2.0_default * (-(m**2 + (k1*k2)) * t_metric & + (k1.tprod.k2) + (k2.tprod.k1)) end function grav_ss @ <>= pure function v_gravv (g, m, k1, k2, t, v) result (vec) complex(kind=default), intent(in) :: g real(kind=default), intent(in) :: m type(momentum), intent(in) :: k1, k2 type(vector), intent(in) :: v type(tensor), intent(in) :: t complex(kind=default) :: t_tr real(kind=default) :: xi type(vector) :: vec xi = 1.0_default t_tr = t%t(0,0) - t%t(1,1) - t%t(2,2) - t%t(3,3) vec = (-g)/ 2.0_default * (((k1*k2) + m**2) * & (t*v + v*t - t_tr * v) + t_tr * (k1*v) * k2 & - (k1*v) * ((k2*t) + (t*k2)) & - ((k1*(t*v)) + (v*(t*k1))) * k2 & + ((k1*(t*k2)) + (k2*(t*k1))) * v) !!! Unitarity gauge: xi -> Infinity !!! + (1.0_default/xi) * (t_tr * ((k1*v)*k2) + & !!! (k2*v)*k2 + (k2*v)*k1 - (k1*(t*v))*k1 + & !!! (k2*v)*(k2*t) - (v*(t*k1))*k1 - (k2*v)*(t*k2))) end function v_gravv @ <>= pure function grav_vv (g, m, k1, k2, v1, v2) result (t) complex(kind=default), intent(in) :: g type(momentum), intent(in) :: k1, k2 real(kind=default), intent(in) :: m real(kind=default) :: xi type(vector), intent (in) :: v1, v2 type(tensor) :: t_metric, t xi = 0.00001_default t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default t = (-g)/2.0_default * ( & ((k1*k2) + m**2) * ( & (v1.tprod.v2) + (v2.tprod.v1) - (v1*v2) * t_metric) & + (v1*k2)*(v2*k1)*t_metric & - (k2*v1)*((v2.tprod.k1) + (k1.tprod.v2)) & - (k1*v2)*((v1.tprod.k2) + (k2.tprod.v1)) & + (v1*v2)*((k1.tprod.k2) + (k2.tprod.k1))) !!! Unitarity gauge: xi -> Infinity !!! + (1.0_default/xi) * ( & !!! ((k1*v1)*(k1*v2) + (k2*v1)*(k2*v2) + (k1*v1)*(k2*v2))* & !!! t_metric) - (k1*v1) * ((k1.tprod.v2) + (v2.tprod.k1)) & !!! - (k2*v2) * ((k2.tprod.v1) + (v1.tprod.k2))) end function grav_vv @ \section{Tensor Couplings} <>= public :: t2_vv, v_t2v, t2_vv_cf, v_t2v_cf, & t2_vv_1, v_t2v_1, t2_vv_t, v_t2v_t, & t2_phi2, phi_t2phi, t2_phi2_cf, phi_t2phi_cf @ \begin{equation} T_{\mu\nu} = g * V_{1 \,\mu} V_{2\,\nu} + V_{1\,\nu} V_{2\,\mu} \end{equation} <>= pure function t2_vv (g, v1, v2) result (t) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(tensor) :: t type(tensor) :: tmp tmp = v1.tprod.v2 t%t = g * (tmp%t + transpose (tmp%t)) end function t2_vv @ \begin{equation} V_{1\,\mu} = g * T_{\mu \nu} V_{2}^{\nu}+ T_{\nu \mu} V_{2}^{\nu} \end{equation} <>= pure function v_t2v (g, t, v) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t type(vector), intent(in) :: v type(vector) :: tv type(tensor) :: tmp tmp%t = t%t + transpose (t%t) tv = g * (tmp * v) end function v_t2v @ \begin{equation} T_{\mu\nu} =- \frac{g}{2} V_1^\rho V_{2 \,\rho} \end{equation} <>= pure function t2_vv_cf (g, v1, v2) result (t) complex(kind=default), intent(in) :: g complex(kind=default) :: tmp_s type(vector), intent(in) :: v1, v2 type(tensor) :: t_metric, t t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default tmp_s = v1 * v2 t%t = - (g /2.0_default) * tmp_s * t_metric%t end function t2_vv_cf @ \begin{equation} V_{1\,\mu} = -\frac{g}{2} T^{\nu}_{ \nu} V_{2}^{\mu} \end{equation} <>= pure function v_t2v_cf (g, t, v) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t type(vector), intent(in) :: v type(vector) :: tv, tmp_tv tmp_tv = ( t%t(0,0)-t%t(1,1)-t%t(2,2)-t%t(3,3) ) * v tv = - ( g /2.0_default) * tmp_tv end function v_t2v_cf @ \begin{equation} T_{\mu\nu} = g * \left ( k_{1 \,\mu} k_{2\,\nu} + k_{1\,\nu} k_{2\,\mu} \right ) \phi_1 \left ( k_1 \right ) \phi_1 \left ( k_2 \right ) \end{equation} <>= pure function t2_phi2 (g, phi1, k1, phi2, k2) result (t) complex(kind=default), intent(in) :: g, phi1, phi2 type(momentum), intent(in) :: k1, k2 type(tensor) :: t type(tensor) :: tmp tmp = k1.tprod.k2 t%t = g * (tmp%t + transpose (tmp%t)) * phi1 * phi2 end function t2_phi2 @ \begin{equation} \phi_{1} (k_1) =g * \left ( T_{\mu \nu} k_{1}^{\mu}k_{2}^{\nu} + T_{\nu \mu} k_{2}^{\mu}k_{1}^{\nu} \right ) \phi_2 \left (k_2 \right ) \end{equation} <>= pure function phi_t2phi (g, t, kt, phi2, k2) result (phi1) complex(kind=default), intent(in) :: g, phi2 type(tensor), intent(in) :: t type(momentum), intent(in) :: kt, k2 type(momentum) :: k1 complex(kind=default) :: phi1 type(tensor) :: tmp k1 = -kt - k2 tmp%t = t%t + transpose (t%t) phi1 = g * ( (tmp * k2) * k1) * phi2 end function phi_t2phi @ \begin{equation} T_{\mu\nu} =- \frac{g}{2} k_1^\rho k_{2 \,\rho} \phi_1 \left ( k_1 \right ) \phi_2 \left ( k_2 \right ) \end{equation} <>= pure function t2_phi2_cf (g, phi1, k1, phi2, k2) result (t) complex(kind=default), intent(in) :: g, phi1, phi2 complex(kind=default) :: tmp_s type(momentum), intent(in) :: k1, k2 type(tensor) :: t_metric, t t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default tmp_s = (k1 * k2) * phi1 * phi2 t%t = - (g /2.0_default) * tmp_s * t_metric%t end function t2_phi2_cf @ \begin{equation} \phi_1 (k_1) = - \frac{g}{2} T^{\nu}_{ \nu} \left (k_1 \cdot k_2 \right ) \phi_2 (k_2) \end{equation} <>= pure function phi_t2phi_cf (g, t, kt, phi2, k2) result (phi1) complex(kind=default), intent(in) :: g, phi2 type(tensor), intent(in) :: t type(momentum), intent(in) :: kt, k2 type(momentum) :: k1 complex(kind=default) :: tmp_ts, phi1 k1 = - kt - k2 tmp_ts = ( t%t(0,0)-t%t(1,1)-t%t(2,2)-t%t(3,3) ) phi1 = - ( g /2.0_default) * tmp_ts * (k1 * k2) * phi2 end function phi_t2phi_cf @ <>= pure function t2_vv_1 (g, v1, v2) result (t) complex(kind=default), intent(in) :: g complex(kind=default) :: tmp_s type(vector), intent(in) :: v1, v2 type(tensor) :: tmp type(tensor) :: t_metric, t t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default tmp = v1.tprod.v2 tmp_s = v1 * v2 t%t = g * (tmp%t + transpose (tmp%t) - tmp_s * t_metric%t ) end function t2_vv_1 @ <>= pure function v_t2v_1 (g, t, v) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t type(vector), intent(in) :: v type(vector) :: tv, tmp_tv type(tensor) :: tmp tmp_tv = ( t%t(0,0)-t%t(1,1)-t%t(2,2)-t%t(3,3) ) * v tmp%t = t%t + transpose (t%t) tv = g * (tmp * v - tmp_tv) end function v_t2v_1 @ <>= pure function t2_vv_t (g, v1, k1, v2, k2) result (t) complex(kind=default), intent(in) :: g complex(kind=default) :: tmp_s type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(tensor) :: tmp, tmp_v1k2, tmp_v2k1, tmp_k1k2, tmp2 type(tensor) :: t_metric, t t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default tmp = v1.tprod.v2 tmp_s = v1 * v2 tmp_v1k2 = (v2 * k1) * (v1.tprod.k2) tmp_v2k1 = (v1 * k2) * (v2.tprod.k1) tmp_k1k2 = tmp_s * (k1.tprod.k2) tmp2%t = tmp_v1k2%t + tmp_v2k1%t - tmp_k1k2%t t%t = g * ( (k1*k2) * (tmp%t + transpose (tmp%t) - tmp_s * t_metric%t ) & + ((v1 * k2) * (v2 * k1)) * t_metric%t & - tmp2%t - transpose(tmp2%t)) end function t2_vv_t @ <>= pure function v_t2v_t (g, t, kt, v, kv) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t type(vector), intent(in) :: v type(momentum), intent(in) :: kt, kv type(momentum) :: kout type(vector) :: tv, tmp_tv type(tensor) :: tmp kout = - (kt + kv) tmp_tv = ( t%t(0,0)-t%t(1,1)-t%t(2,2)-t%t(3,3) ) * v tmp%t = t%t + transpose (t%t) tv = g * ( (tmp * v - tmp_tv) * (kv * kout )& + ( t%t(0,0)-t%t(1,1)-t%t(2,2)-t%t(3,3) ) * (kout * v ) * kv & - (kout * v) * ( tmp * kv) & - (v* (t * kout) + kout * (t * v)) * kv & + (kout* (t * kv) + kv * (t * kout)) * v) end function v_t2v_t @ <>= public :: t2_vv_d5_1, v_t2v_d5_1 @ <>= pure function t2_vv_d5_1 (g, v1, k1, v2, k2) result (t) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(tensor) :: t t = (g * (v1 * v2)) * (k1-k2).tprod.(k1-k2) end function t2_vv_d5_1 @ <>= pure function v_t2v_d5_1 (g, t1, k1, v2, k2) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t1 type(vector), intent(in) :: v2 type(momentum), intent(in) :: k1, k2 type(vector) :: tv tv = (g * ((k1+2*k2).tprod.(k1+2*k2) * t1)) * v2 end function v_t2v_d5_1 @ <>= public :: t2_vv_d5_2, v_t2v_d5_2 @ <>= pure function t2_vv_d5_2 (g, v1, k1, v2, k2) result (t) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(tensor) :: t t = (g * (k2 * v1)) * (k2-k1).tprod.v2 t%t = t%t + transpose (t%t) end function t2_vv_d5_2 @ <>= pure function v_t2v_d5_2 (g, t1, k1, v2, k2) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t1 type(vector), intent(in) :: v2 type(momentum), intent(in) :: k1, k2 type(vector) :: tv type(tensor) :: tmp type(momentum) :: k1_k2, k1_2k2 k1_k2 = k1 + k2 k1_2k2 = k1_k2 + k2 tmp%t = t1%t + transpose (t1%t) tv = (g * (k1_k2 * v2)) * (k1_2k2 * tmp) end function v_t2v_d5_2 @ <>= public :: t2_vv_d7, v_t2v_d7 @ <>= pure function t2_vv_d7 (g, v1, k1, v2, k2) result (t) complex(kind=default), intent(in) :: g type(vector), intent(in) :: v1, v2 type(momentum), intent(in) :: k1, k2 type(tensor) :: t t = (g * (k2 * v1) * (k1 * v2)) * (k1-k2).tprod.(k1-k2) end function t2_vv_d7 @ <>= pure function v_t2v_d7 (g, t1, k1, v2, k2) result (tv) complex(kind=default), intent(in) :: g type(tensor), intent(in) :: t1 type(vector), intent(in) :: v2 type(momentum), intent(in) :: k1, k2 type(vector) :: tv type(vector) :: k1_k2, k1_2k2 k1_k2 = k1 + k2 k1_2k2 = k1_k2 + k2 tv = (- g * (k1_k2 * v2) * (k1_2k2.tprod.k1_2k2 * t1)) * k2 end function v_t2v_d7 @ \section{Spinor Couplings} <<[[omega_spinor_couplings.f90]]>>= <> module omega_spinor_couplings use kinds use constants use omega_spinors use omega_vectors use omega_tensors use omega_couplings implicit none private <> <> <> <> integer, parameter, public :: omega_spinor_cpls_2010_01_A = 0 contains <> <> <> <> end module omega_spinor_couplings @ See table~\ref{tab:fermionic-currents} for the names of Fortran functions. We could have used long names instead, but this would increase the chance of running past continuation line limits without adding much to the legibility. @ \subsection{Fermionic Vector and Axial Couplings} There's more than one chiral representation. This one is compatible with HELAS~\cite{HELAS}. \begin{equation} \gamma^0 = \begin{pmatrix} 0 & \mathbf{1} \\ \mathbf{1} & 0 \end{pmatrix},\; \gamma^i = \begin{pmatrix} 0 & \sigma^i \\ -\sigma^i & 0 \end{pmatrix},\; \gamma_5 = i\gamma^0\gamma^1\gamma^2\gamma^3 = \begin{pmatrix} -\mathbf{1} & 0 \\ 0 & \mathbf{1} \end{pmatrix} \end{equation} Therefore \begin{subequations} \begin{align} g_S + g_P\gamma_5 &= \begin{pmatrix} g_S - g_P & 0 & 0 & 0 \\ 0 & g_S - g_P & 0 & 0 \\ 0 & 0 & g_S + g_P & 0 \\ 0 & 0 & 0 & g_S + g_P \end{pmatrix} \\ g_V\gamma^0 - g_A\gamma^0\gamma_5 &= \begin{pmatrix} 0 & 0 & g_V - g_A & 0 \\ 0 & 0 & 0 & g_V - g_A \\ g_V + g_A & 0 & 0 & 0 \\ 0 & g_V + g_A & 0 & 0 \end{pmatrix} \\ g_V\gamma^1 - g_A\gamma^1\gamma_5 &= \begin{pmatrix} 0 & 0 & 0 & g_V - g_A \\ 0 & 0 & g_V - g_A & 0 \\ 0 & - g_V - g_A & 0 & 0 \\ - g_V - g_A & 0 & 0 & 0 \end{pmatrix} \\ g_V\gamma^2 - g_A\gamma^2\gamma_5 &= \begin{pmatrix} 0 & 0 & 0 & -\ii(g_V - g_A) \\ 0 & 0 & \ii(g_V - g_A) & 0 \\ 0 & \ii(g_V + g_A) & 0 & 0 \\ -\ii(g_V + g_A) & 0 & 0 & 0 \end{pmatrix} \\ g_V\gamma^3 - g_A\gamma^3\gamma_5 &= \begin{pmatrix} 0 & 0 & g_V - g_A & 0 \\ 0 & 0 & 0 & - g_V + g_A \\ - g_V - g_A & 0 & 0 & 0 \\ 0 & g_V + g_A & 0 & 0 \end{pmatrix} \end{align} \end{subequations} \begin{table} \begin{center} \begin{tabular}{>{$}l<{$}|>{$}l<{$}} \bar\psi(g_V\gamma^\mu - g_A\gamma^\mu\gamma_5)\psi & \text{\texttt{va\_ff}}(g_V,g_A,\bar\psi,\psi) \\ g_V\bar\psi\gamma^\mu\psi & \text{\texttt{v\_ff}}(g_V,\bar\psi,\psi) \\ g_A\bar\psi\gamma_5\gamma^\mu\psi & \text{\texttt{a\_ff}}(g_A,\bar\psi,\psi) \\ g_L\bar\psi\gamma^\mu(1-\gamma_5)\psi & \text{\texttt{vl\_ff}}(g_L,\bar\psi,\psi) \\ g_R\bar\psi\gamma^\mu(1+\gamma_5)\psi & \text{\texttt{vr\_ff}}(g_R,\bar\psi,\psi) \\\hline \fmslash{V}(g_V - g_A\gamma_5)\psi & \text{\texttt{f\_vaf}}(g_V,g_A,V,\psi) \\ g_V\fmslash{V}\psi & \text{\texttt{f\_vf}}(g_V,V,\psi) \\ g_A\gamma_5\fmslash{V}\psi & \text{\texttt{f\_af}}(g_A,V,\psi) \\ g_L\fmslash{V}(1-\gamma_5)\psi & \text{\texttt{f\_vlf}}(g_L,V,\psi) \\ g_R\fmslash{V}(1+\gamma_5)\psi & \text{\texttt{f\_vrf}}(g_R,V,\psi) \\\hline \bar\psi\fmslash{V}(g_V - g_A\gamma_5) & \text{\texttt{f\_fva}}(g_V,g_A,\bar\psi,V) \\ g_V\bar\psi\fmslash{V} & \text{\texttt{f\_fv}}(g_V,\bar\psi,V) \\ g_A\bar\psi\gamma_5\fmslash{V} & \text{\texttt{f\_fa}}(g_A,\bar\psi,V) \\ g_L\bar\psi\fmslash{V}(1-\gamma_5) & \text{\texttt{f\_fvl}}(g_L,\bar\psi,V) \\ g_R\bar\psi\fmslash{V}(1+\gamma_5) & \text{\texttt{f\_fvr}}(g_R,\bar\psi,V) \end{tabular} \end{center} \caption{\label{tab:fermionic-currents} Mnemonically abbreviated names of Fortran functions implementing fermionic vector and axial currents.} \end{table} \begin{table} \begin{center} \begin{tabular}{>{$}l<{$}|>{$}l<{$}} \bar\psi(g_S + g_P\gamma_5)\psi & \text{\texttt{sp\_ff}}(g_S,g_P,\bar\psi,\psi) \\ g_S\bar\psi\psi & \text{\texttt{s\_ff}}(g_S,\bar\psi,\psi) \\ g_P\bar\psi\gamma_5\psi & \text{\texttt{p\_ff}}(g_P,\bar\psi,\psi) \\ g_L\bar\psi(1-\gamma_5)\psi & \text{\texttt{sl\_ff}}(g_L,\bar\psi,\psi) \\ g_R\bar\psi(1+\gamma_5)\psi & \text{\texttt{sr\_ff}}(g_R,\bar\psi,\psi) \\\hline \phi(g_S + g_P\gamma_5)\psi & \text{\texttt{f\_spf}}(g_S,g_P,\phi,\psi) \\ g_S\phi\psi & \text{\texttt{f\_sf}}(g_S,\phi,\psi) \\ g_P\phi\gamma_5\psi & \text{\texttt{f\_pf}}(g_P,\phi,\psi) \\ g_L\phi(1-\gamma_5)\psi & \text{\texttt{f\_slf}}(g_L,\phi,\psi) \\ g_R\phi(1+\gamma_5)\psi & \text{\texttt{f\_srf}}(g_R,\phi,\psi) \\\hline \bar\psi\phi(g_S + g_P\gamma_5) & \text{\texttt{f\_fsp}}(g_S,g_P,\bar\psi,\phi) \\ g_S\bar\psi\phi & \text{\texttt{f\_fs}}(g_S,\bar\psi,\phi) \\ g_P\bar\psi\phi\gamma_5 & \text{\texttt{f\_fp}}(g_P,\bar\psi,\phi) \\ g_L\bar\psi\phi(1-\gamma_5) & \text{\texttt{f\_fsl}}(g_L,\bar\psi,\phi) \\ g_R\bar\psi\phi(1+\gamma_5) & \text{\texttt{f\_fsr}}(g_R,\bar\psi,\phi) \end{tabular} \end{center} \caption{\label{tab:fermionic-scalar currents} Mnemonically abbreviated names of Fortran functions implementing fermionic scalar and pseudo scalar ``currents''.} \end{table} <>= public :: va_ff, v_ff, a_ff, vl_ff, vr_ff, vlr_ff, grav_ff, va2_ff, & tva_ff, tlr_ff, trl_ff, tvam_ff, tlrm_ff, trlm_ff, va3_ff @ <>= pure function va_ff (gv, ga, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 gl = gv + ga gr = gv - ga g13 = psibar%a(1)*psi%a(3) g14 = psibar%a(1)*psi%a(4) g23 = psibar%a(2)*psi%a(3) g24 = psibar%a(2)*psi%a(4) g31 = psibar%a(3)*psi%a(1) g32 = psibar%a(3)*psi%a(2) g41 = psibar%a(4)*psi%a(1) g42 = psibar%a(4)*psi%a(2) j%t = gr * ( g13 + g24) + gl * ( g31 + g42) j%x(1) = gr * ( g14 + g23) - gl * ( g32 + g41) j%x(2) = (gr * ( - g14 + g23) + gl * ( g32 - g41)) * (0, 1) j%x(3) = gr * ( g13 - g24) + gl * ( - g31 + g42) end function va_ff @ <>= pure function va2_ff (gva, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in), dimension(2) :: gva type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 gl = gva(1) + gva(2) gr = gva(1) - gva(2) g13 = psibar%a(1)*psi%a(3) g14 = psibar%a(1)*psi%a(4) g23 = psibar%a(2)*psi%a(3) g24 = psibar%a(2)*psi%a(4) g31 = psibar%a(3)*psi%a(1) g32 = psibar%a(3)*psi%a(2) g41 = psibar%a(4)*psi%a(1) g42 = psibar%a(4)*psi%a(2) j%t = gr * ( g13 + g24) + gl * ( g31 + g42) j%x(1) = gr * ( g14 + g23) - gl * ( g32 + g41) j%x(2) = (gr * ( - g14 + g23) + gl * ( g32 - g41)) * (0, 1) j%x(3) = gr * ( g13 - g24) + gl * ( - g31 + g42) end function va2_ff @ <>= pure function va3_ff (gv, ga, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = va_ff (gv, ga, psibar, psi) j%t = 0.0_default end function va3_ff @ <>= pure function tva_ff (gv, ga, psibar, psi) result (t) type(tensor2odd) :: t complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: g12, g21, g1m2, g34, g43, g3m4 gr = gv + ga gl = gv - ga g12 = psibar%a(1)*psi%a(2) g21 = psibar%a(2)*psi%a(1) g1m2 = psibar%a(1)*psi%a(1) - psibar%a(2)*psi%a(2) g34 = psibar%a(3)*psi%a(4) g43 = psibar%a(4)*psi%a(3) g3m4 = psibar%a(3)*psi%a(3) - psibar%a(4)*psi%a(4) t%e(1) = (gl * ( - g12 - g21) + gr * ( g34 + g43)) * (0, 1) t%e(2) = gl * ( - g12 + g21) + gr * ( g34 - g43) t%e(3) = (gl * ( - g1m2 ) + gr * ( g3m4 )) * (0, 1) t%b(1) = gl * ( g12 + g21) + gr * ( g34 + g43) t%b(2) = (gl * ( - g12 + g21) + gr * ( - g34 + g43)) * (0, 1) t%b(3) = gl * ( g1m2 ) + gr * ( g3m4 ) end function tva_ff @ <>= pure function tlr_ff (gl, gr, psibar, psi) result (t) type(tensor2odd) :: t complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi t = tva_ff (gr+gl, gr-gl, psibar, psi) end function tlr_ff @ <>= pure function trl_ff (gr, gl, psibar, psi) result (t) type(tensor2odd) :: t complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi t = tva_ff (gr+gl, gr-gl, psibar, psi) end function trl_ff @ <>= pure function tvam_ff (gv, ga, psibar, psi, p) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi type(momentum), intent(in) :: p j = (tva_ff(gv, ga, psibar, psi) * p) * (0,1) end function tvam_ff @ <>= pure function tlrm_ff (gl, gr, psibar, psi, p) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi type(momentum), intent(in) :: p j = tvam_ff (gr+gl, gr-gl, psibar, psi, p) end function tlrm_ff @ <>= pure function trlm_ff (gr, gl, psibar, psi, p) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi type(momentum), intent(in) :: p j = tvam_ff (gr+gl, gr-gl, psibar, psi, p) end function trlm_ff @ Special cases that avoid some multiplications <>= pure function v_ff (gv, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 g13 = psibar%a(1)*psi%a(3) g14 = psibar%a(1)*psi%a(4) g23 = psibar%a(2)*psi%a(3) g24 = psibar%a(2)*psi%a(4) g31 = psibar%a(3)*psi%a(1) g32 = psibar%a(3)*psi%a(2) g41 = psibar%a(4)*psi%a(1) g42 = psibar%a(4)*psi%a(2) j%t = gv * ( g13 + g24 + g31 + g42) j%x(1) = gv * ( g14 + g23 - g32 - g41) j%x(2) = gv * ( - g14 + g23 + g32 - g41) * (0, 1) j%x(3) = gv * ( g13 - g24 - g31 + g42) end function v_ff @ <>= pure function a_ff (ga, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: ga type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 g13 = psibar%a(1)*psi%a(3) g14 = psibar%a(1)*psi%a(4) g23 = psibar%a(2)*psi%a(3) g24 = psibar%a(2)*psi%a(4) g31 = psibar%a(3)*psi%a(1) g32 = psibar%a(3)*psi%a(2) g41 = psibar%a(4)*psi%a(1) g42 = psibar%a(4)*psi%a(2) j%t = ga * ( - g13 - g24 + g31 + g42) j%x(1) = - ga * ( g14 + g23 + g32 + g41) j%x(2) = ga * ( g14 - g23 + g32 - g41) * (0, 1) j%x(3) = ga * ( - g13 + g24 - g31 + g42) end function a_ff @ <>= pure function vl_ff (gl, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: gl2 complex(kind=default) :: g31, g32, g41, g42 gl2 = 2 * gl g31 = psibar%a(3)*psi%a(1) g32 = psibar%a(3)*psi%a(2) g41 = psibar%a(4)*psi%a(1) g42 = psibar%a(4)*psi%a(2) j%t = gl2 * ( g31 + g42) j%x(1) = - gl2 * ( g32 + g41) j%x(2) = gl2 * ( g32 - g41) * (0, 1) j%x(3) = gl2 * ( - g31 + g42) end function vl_ff @ <>= pure function vr_ff (gr, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi complex(kind=default) :: gr2 complex(kind=default) :: g13, g14, g23, g24 gr2 = 2 * gr g13 = psibar%a(1)*psi%a(3) g14 = psibar%a(1)*psi%a(4) g23 = psibar%a(2)*psi%a(3) g24 = psibar%a(2)*psi%a(4) j%t = gr2 * ( g13 + g24) j%x(1) = gr2 * ( g14 + g23) j%x(2) = gr2 * ( - g14 + g23) * (0, 1) j%x(3) = gr2 * ( g13 - g24) end function vr_ff @ <>= pure function grav_ff (g, m, kb, k, psibar, psi) result (j) type(tensor) :: j complex(kind=default), intent(in) :: g real(kind=default), intent(in) :: m type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi type(momentum), intent(in) :: kb, k complex(kind=default) :: g2, g8, c_dum type(vector) :: v_dum type(tensor) :: t_metric t_metric%t = 0 t_metric%t(0,0) = 1.0_default t_metric%t(1,1) = - 1.0_default t_metric%t(2,2) = - 1.0_default t_metric%t(3,3) = - 1.0_default g2 = g/2.0_default g8 = g/8.0_default v_dum = v_ff(g8, psibar, psi) c_dum = (- m) * s_ff (g2, psibar, psi) - (kb+k)*v_dum j = c_dum*t_metric - (((kb+k).tprod.v_dum) + & (v_dum.tprod.(kb+k))) end function grav_ff @ \begin{equation} g_L\gamma_\mu(1-\gamma_5) + g_R\gamma_\mu(1+\gamma_5) = (g_L+g_R)\gamma_\mu - (g_L-g_R)\gamma_\mu\gamma_5 = g_V\gamma_\mu - g_A\gamma_\mu\gamma_5 \end{equation} \ldots{} give the compiler the benefit of the doubt that it will optimize the function all. If not, we could inline it \ldots <>= pure function vlr_ff (gl, gr, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = va_ff (gl+gr, gl-gr, psibar, psi) end function vlr_ff @ and \begin{equation} \fmslash{v} - \fmslash{a}\gamma_5 = \begin{pmatrix} 0 & 0 & v_- - a_- & - v^* + a^* \\ 0 & 0 & - v + a & v_+ - a_+ \\ v_+ + a_+ & v^* + a^* & 0 & 0 \\ v + a & v_- + a_- & 0 & 0 \end{pmatrix} \end{equation} with $v_\pm=v_0\pm v_3$, $a_\pm=a_0\pm a_3$, $v=v_1+\ii v_2$, $v^*=v_1-\ii v_2$, $a=a_1+\ii a_2$, and $a^*=a_1-\ii a_2$. But note that~$\cdot^*$ is \emph{not} complex conjugation for complex~$v_\mu$ or~$a_\mu$. <>= public :: f_vaf, f_vf, f_af, f_vlf, f_vrf, f_vlrf, f_va2f, & f_tvaf, f_tlrf, f_trlf, f_tvamf, f_tlrmf, f_trlmf, f_va3f @ <>= pure function f_vaf (gv, ga, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gv, ga type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gv + ga gr = gv - ga vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gl * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_vaf @ <>= pure function f_va2f (gva, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in), dimension(2) :: gva type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gva(1) + gva(2) gr = gva(1) - gva(2) vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gl * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_va2f @ <>= pure function f_va3f (gv, ga, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gv, ga type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gv + ga gr = gv - ga vp = v%x(3) !+ v%t vm = - v%x(3) !+ v%t v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gl * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_va3f @ <>= pure function f_tvaf (gv, ga, t, psi) result (tpsi) type(spinor) :: tpsi complex(kind=default), intent(in) :: gv, ga type(tensor2odd), intent(in) :: t type(spinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: e21, e21s, b12, b12s, be3, be3s gr = gv + ga gl = gv - ga e21 = t%e(2) + t%e(1)*(0,1) e21s = t%e(2) - t%e(1)*(0,1) b12 = t%b(1) + t%b(2)*(0,1) b12s = t%b(1) - t%b(2)*(0,1) be3 = t%b(3) + t%e(3)*(0,1) be3s = t%b(3) - t%e(3)*(0,1) tpsi%a(1) = 2*gl * ( psi%a(1) * be3 + psi%a(2) * ( e21 +b12s)) tpsi%a(2) = 2*gl * ( - psi%a(2) * be3 + psi%a(1) * (-e21s+b12 )) tpsi%a(3) = 2*gr * ( psi%a(3) * be3s + psi%a(4) * (-e21 +b12s)) tpsi%a(4) = 2*gr * ( - psi%a(4) * be3s + psi%a(3) * ( e21s+b12 )) end function f_tvaf @ <>= pure function f_tlrf (gl, gr, t, psi) result (tpsi) type(spinor) :: tpsi complex(kind=default), intent(in) :: gl, gr type(tensor2odd), intent(in) :: t type(spinor), intent(in) :: psi tpsi = f_tvaf (gr+gl, gr-gl, t, psi) end function f_tlrf @ <>= pure function f_trlf (gr, gl, t, psi) result (tpsi) type(spinor) :: tpsi complex(kind=default), intent(in) :: gl, gr type(tensor2odd), intent(in) :: t type(spinor), intent(in) :: psi tpsi = f_tvaf (gr+gl, gr-gl, t, psi) end function f_trlf @ <>= pure function f_tvamf (gv, ga, v, psi, k) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gv, ga type(vector), intent(in) :: v type(spinor), intent(in) :: psi type(momentum), intent(in) :: k type(tensor2odd) :: t t = (v.wedge.k) * (0, 0.5) vpsi = f_tvaf(gv, ga, t, psi) end function f_tvamf @ <>= pure function f_tlrmf (gl, gr, v, psi, k) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gl, gr type(vector), intent(in) :: v type(spinor), intent(in) :: psi type(momentum), intent(in) :: k vpsi = f_tvamf (gr+gl, gr-gl, v, psi, k) end function f_tlrmf @ <>= pure function f_trlmf (gr, gl, v, psi, k) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gl, gr type(vector), intent(in) :: v type(spinor), intent(in) :: psi type(momentum), intent(in) :: k vpsi = f_tvamf (gr+gl, gr-gl, v, psi, k) end function f_trlmf @ <>= pure function f_vf (gv, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gv type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: vp, vm, v12, v12s vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gv * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gv * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gv * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gv * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_vf @ <>= pure function f_af (ga, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: ga type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: vp, vm, v12, v12s vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = ga * ( - vm * psi%a(3) + v12s * psi%a(4)) vpsi%a(2) = ga * ( v12 * psi%a(3) - vp * psi%a(4)) vpsi%a(3) = ga * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = ga * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_af @ <>= pure function f_vlf (gl, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gl type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: gl2 complex(kind=default) :: vp, vm, v12, v12s gl2 = 2 * gl vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = 0 vpsi%a(2) = 0 vpsi%a(3) = gl2 * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl2 * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_vlf @ <>= pure function f_vrf (gr, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gr type(vector), intent(in) :: v type(spinor), intent(in) :: psi complex(kind=default) :: gr2 complex(kind=default) :: vp, vm, v12, v12s gr2 = 2 * gr vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr2 * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr2 * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = 0 vpsi%a(4) = 0 end function f_vrf @ <>= pure function f_vlrf (gl, gr, v, psi) result (vpsi) type(spinor) :: vpsi complex(kind=default), intent(in) :: gl, gr type(vector), intent(in) :: v type(spinor), intent(in) :: psi vpsi = f_vaf (gl+gr, gl-gr, v, psi) end function f_vlrf @ <>= public :: f_fva, f_fv, f_fa, f_fvl, f_fvr, f_fvlr, f_fva2, & f_ftva, f_ftlr, f_ftrl, f_ftvam, f_ftlrm, f_ftrlm, f_fva3 @ <>= pure function f_fva (gv, ga, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gv + ga gr = gv - ga vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = gl * ( psibar%a(3) * vp + psibar%a(4) * v12) psibarv%a(2) = gl * ( psibar%a(3) * v12s + psibar%a(4) * vm ) psibarv%a(3) = gr * ( psibar%a(1) * vm - psibar%a(2) * v12) psibarv%a(4) = gr * ( - psibar%a(1) * v12s + psibar%a(2) * vp ) end function f_fva @ <>= pure function f_fva2 (gva, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in), dimension(2) :: gva type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gva(1) + gva(2) gr = gva(1) - gva(2) vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = gl * ( psibar%a(3) * vp + psibar%a(4) * v12) psibarv%a(2) = gl * ( psibar%a(3) * v12s + psibar%a(4) * vm ) psibarv%a(3) = gr * ( psibar%a(1) * vm - psibar%a(2) * v12) psibarv%a(4) = gr * ( - psibar%a(1) * v12s + psibar%a(2) * vp ) end function f_fva2 @ <>= pure function f_fva3 (gv, ga, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gv + ga gr = gv - ga vp = v%x(3) !+ v%t vm = - v%x(3) !+ v%t v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = gl * ( psibar%a(3) * vp + psibar%a(4) * v12) psibarv%a(2) = gl * ( psibar%a(3) * v12s + psibar%a(4) * vm ) psibarv%a(3) = gr * ( psibar%a(1) * vm - psibar%a(2) * v12) psibarv%a(4) = gr * ( - psibar%a(1) * v12s + psibar%a(2) * vp ) end function f_fva3 @ <>= pure function f_ftva (gv, ga, psibar, t) result (psibart) type(conjspinor) :: psibart complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(tensor2odd), intent(in) :: t complex(kind=default) :: gl, gr complex(kind=default) :: e21, e21s, b12, b12s, be3, be3s gr = gv + ga gl = gv - ga e21 = t%e(2) + t%e(1)*(0,1) e21s = t%e(2) - t%e(1)*(0,1) b12 = t%b(1) + t%b(2)*(0,1) b12s = t%b(1) - t%b(2)*(0,1) be3 = t%b(3) + t%e(3)*(0,1) be3s = t%b(3) - t%e(3)*(0,1) psibart%a(1) = 2*gl * ( psibar%a(1) * be3 + psibar%a(2) * (-e21s+b12 )) psibart%a(2) = 2*gl * ( - psibar%a(2) * be3 + psibar%a(1) * ( e21 +b12s)) psibart%a(3) = 2*gr * ( psibar%a(3) * be3s + psibar%a(4) * ( e21s+b12 )) psibart%a(4) = 2*gr * ( - psibar%a(4) * be3s + psibar%a(3) * (-e21 +b12s)) end function f_ftva @ <>= pure function f_ftlr (gl, gr, psibar, t) result (psibart) type(conjspinor) :: psibart complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(tensor2odd), intent(in) :: t psibart = f_ftva (gr+gl, gr-gl, psibar, t) end function f_ftlr @ <>= pure function f_ftrl (gr, gl, psibar, t) result (psibart) type(conjspinor) :: psibart complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(tensor2odd), intent(in) :: t psibart = f_ftva (gr+gl, gr-gl, psibar, t) end function f_ftrl @ <>= pure function f_ftvam (gv, ga, psibar, v, k) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gv, ga type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v type(momentum), intent(in) :: k type(tensor2odd) :: t t = (v.wedge.k) * (0, 0.5) psibarv = f_ftva(gv, ga, psibar, t) end function f_ftvam @ <>= pure function f_ftlrm (gl, gr, psibar, v, k) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v type(momentum), intent(in) :: k psibarv = f_ftvam (gr+gl, gr-gl, psibar, v, k) end function f_ftlrm @ <>= pure function f_ftrlm (gr, gl, psibar, v, k) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v type(momentum), intent(in) :: k psibarv = f_ftvam (gr+gl, gr-gl, psibar, v, k) end function f_ftrlm @ <>= pure function f_fv (gv, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gv type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v complex(kind=default) :: vp, vm, v12, v12s vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = gv * ( psibar%a(3) * vp + psibar%a(4) * v12) psibarv%a(2) = gv * ( psibar%a(3) * v12s + psibar%a(4) * vm ) psibarv%a(3) = gv * ( psibar%a(1) * vm - psibar%a(2) * v12) psibarv%a(4) = gv * ( - psibar%a(1) * v12s + psibar%a(2) * vp ) end function f_fv @ <>= pure function f_fa (ga, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: ga type(vector), intent(in) :: v type(conjspinor), intent(in) :: psibar complex(kind=default) :: vp, vm, v12, v12s vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = ga * ( psibar%a(3) * vp + psibar%a(4) * v12) psibarv%a(2) = ga * ( psibar%a(3) * v12s + psibar%a(4) * vm ) psibarv%a(3) = ga * ( - psibar%a(1) * vm + psibar%a(2) * v12) psibarv%a(4) = ga * ( psibar%a(1) * v12s - psibar%a(2) * vp ) end function f_fa @ <>= pure function f_fvl (gl, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gl type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v complex(kind=default) :: gl2 complex(kind=default) :: vp, vm, v12, v12s gl2 = 2 * gl vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = gl2 * ( psibar%a(3) * vp + psibar%a(4) * v12) psibarv%a(2) = gl2 * ( psibar%a(3) * v12s + psibar%a(4) * vm ) psibarv%a(3) = 0 psibarv%a(4) = 0 end function f_fvl @ <>= pure function f_fvr (gr, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gr type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v complex(kind=default) :: gr2 complex(kind=default) :: vp, vm, v12, v12s gr2 = 2 * gr vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) psibarv%a(1) = 0 psibarv%a(2) = 0 psibarv%a(3) = gr2 * ( psibar%a(1) * vm - psibar%a(2) * v12) psibarv%a(4) = gr2 * ( - psibar%a(1) * v12s + psibar%a(2) * vp ) end function f_fvr @ <>= pure function f_fvlr (gl, gr, psibar, v) result (psibarv) type(conjspinor) :: psibarv complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(vector), intent(in) :: v psibarv = f_fva (gl+gr, gl-gr, psibar, v) end function f_fvlr @ \subsection{Fermionic Scalar and Pseudo Scalar Couplings} <>= public :: sp_ff, s_ff, p_ff, sl_ff, sr_ff, slr_ff @ <>= pure function sp_ff (gs, gp, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gs, gp type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = (gs - gp) * (psibar%a(1)*psi%a(1) + psibar%a(2)*psi%a(2)) & + (gs + gp) * (psibar%a(3)*psi%a(3) + psibar%a(4)*psi%a(4)) end function sp_ff @ <>= pure function s_ff (gs, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gs type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = gs * (psibar * psi) end function s_ff @ <>= pure function p_ff (gp, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gp type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = gp * ( psibar%a(3)*psi%a(3) + psibar%a(4)*psi%a(4) & - psibar%a(1)*psi%a(1) - psibar%a(2)*psi%a(2)) end function p_ff @ <>= pure function sl_ff (gl, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = 2 * gl * (psibar%a(1)*psi%a(1) + psibar%a(2)*psi%a(2)) end function sl_ff @ <>= pure function sr_ff (gr, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = 2 * gr * (psibar%a(3)*psi%a(3) + psibar%a(4)*psi%a(4)) end function sr_ff @ \begin{equation} g_L(1-\gamma_5) + g_R(1+\gamma_5) = (g_R+g_L) + (g_R-g_L)\gamma_5 = g_S + g_P\gamma_5 \end{equation} <>= pure function slr_ff (gl, gr, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar type(spinor), intent(in) :: psi j = sp_ff (gr+gl, gr-gl, psibar, psi) end function slr_ff @ <>= public :: f_spf, f_sf, f_pf, f_slf, f_srf, f_slrf @ <>= pure function f_spf (gs, gp, phi, psi) result (phipsi) type(spinor) :: phipsi complex(kind=default), intent(in) :: gs, gp complex(kind=default), intent(in) :: phi type(spinor), intent(in) :: psi phipsi%a(1:2) = ((gs - gp) * phi) * psi%a(1:2) phipsi%a(3:4) = ((gs + gp) * phi) * psi%a(3:4) end function f_spf @ <>= pure function f_sf (gs, phi, psi) result (phipsi) type(spinor) :: phipsi complex(kind=default), intent(in) :: gs complex(kind=default), intent(in) :: phi type(spinor), intent(in) :: psi phipsi%a = (gs * phi) * psi%a end function f_sf @ <>= pure function f_pf (gp, phi, psi) result (phipsi) type(spinor) :: phipsi complex(kind=default), intent(in) :: gp complex(kind=default), intent(in) :: phi type(spinor), intent(in) :: psi phipsi%a(1:2) = (- gp * phi) * psi%a(1:2) phipsi%a(3:4) = ( gp * phi) * psi%a(3:4) end function f_pf @ <>= pure function f_slf (gl, phi, psi) result (phipsi) type(spinor) :: phipsi complex(kind=default), intent(in) :: gl complex(kind=default), intent(in) :: phi type(spinor), intent(in) :: psi phipsi%a(1:2) = (2 * gl * phi) * psi%a(1:2) phipsi%a(3:4) = 0 end function f_slf @ <>= pure function f_srf (gr, phi, psi) result (phipsi) type(spinor) :: phipsi complex(kind=default), intent(in) :: gr complex(kind=default), intent(in) :: phi type(spinor), intent(in) :: psi phipsi%a(1:2) = 0 phipsi%a(3:4) = (2 * gr * phi) * psi%a(3:4) end function f_srf @ <>= pure function f_slrf (gl, gr, phi, psi) result (phipsi) type(spinor) :: phipsi complex(kind=default), intent(in) :: gl, gr complex(kind=default), intent(in) :: phi type(spinor), intent(in) :: psi phipsi = f_spf (gr+gl, gr-gl, phi, psi) end function f_slrf @ <>= public :: f_fsp, f_fs, f_fp, f_fsl, f_fsr, f_fslr @ <>= pure function f_fsp (gs, gp, psibar, phi) result (psibarphi) type(conjspinor) :: psibarphi complex(kind=default), intent(in) :: gs, gp type(conjspinor), intent(in) :: psibar complex(kind=default), intent(in) :: phi psibarphi%a(1:2) = ((gs - gp) * phi) * psibar%a(1:2) psibarphi%a(3:4) = ((gs + gp) * phi) * psibar%a(3:4) end function f_fsp @ <>= pure function f_fs (gs, psibar, phi) result (psibarphi) type(conjspinor) :: psibarphi complex(kind=default), intent(in) :: gs type(conjspinor), intent(in) :: psibar complex(kind=default), intent(in) :: phi psibarphi%a = (gs * phi) * psibar%a end function f_fs @ <>= pure function f_fp (gp, psibar, phi) result (psibarphi) type(conjspinor) :: psibarphi complex(kind=default), intent(in) :: gp type(conjspinor), intent(in) :: psibar complex(kind=default), intent(in) :: phi psibarphi%a(1:2) = (- gp * phi) * psibar%a(1:2) psibarphi%a(3:4) = ( gp * phi) * psibar%a(3:4) end function f_fp @ <>= pure function f_fsl (gl, psibar, phi) result (psibarphi) type(conjspinor) :: psibarphi complex(kind=default), intent(in) :: gl type(conjspinor), intent(in) :: psibar complex(kind=default), intent(in) :: phi psibarphi%a(1:2) = (2 * gl * phi) * psibar%a(1:2) psibarphi%a(3:4) = 0 end function f_fsl @ <>= pure function f_fsr (gr, psibar, phi) result (psibarphi) type(conjspinor) :: psibarphi complex(kind=default), intent(in) :: gr type(conjspinor), intent(in) :: psibar complex(kind=default), intent(in) :: phi psibarphi%a(1:2) = 0 psibarphi%a(3:4) = (2 * gr * phi) * psibar%a(3:4) end function f_fsr @ <>= pure function f_fslr (gl, gr, psibar, phi) result (psibarphi) type(conjspinor) :: psibarphi complex(kind=default), intent(in) :: gl, gr type(conjspinor), intent(in) :: psibar complex(kind=default), intent(in) :: phi psibarphi = f_fsp (gr+gl, gr-gl, psibar, phi) end function f_fslr <>= public :: f_gravf, f_fgrav @ <>= pure function f_gravf (g, m, kb, k, t, psi) result (tpsi) type(spinor) :: tpsi complex(kind=default), intent(in) :: g real(kind=default), intent(in) :: m type(spinor), intent(in) :: psi type(tensor), intent(in) :: t type(momentum), intent(in) :: kb, k complex(kind=default) :: g2, g8, t_tr type(vector) :: kkb kkb = k + kb g2 = g / 2.0_default g8 = g / 8.0_default t_tr = t%t(0,0) - t%t(1,1) - t%t(2,2) - t%t(3,3) tpsi = (- f_sf (g2, cmplx (m,0.0, kind=default), psi) & - f_vf ((g8*m), kkb, psi)) * t_tr - & f_vf (g8,(t*kkb + kkb*t),psi) end function f_gravf @ <>= pure function f_fgrav (g, m, kb, k, psibar, t) result (psibart) type(conjspinor) :: psibart complex(kind=default), intent(in) :: g real(kind=default), intent(in) :: m type(conjspinor), intent(in) :: psibar type(tensor), intent(in) :: t type(momentum), intent(in) :: kb, k type(vector) :: kkb complex(kind=default) :: g2, g8, t_tr kkb = k + kb g2 = g / 2.0_default g8 = g / 8.0_default t_tr = t%t(0,0) - t%t(1,1) - t%t(2,2) - t%t(3,3) psibart = (- f_fs (g2, psibar, cmplx (m, 0.0, kind=default)) & - f_fv ((g8 * m), psibar, kkb)) * t_tr - & f_fv (g8,psibar,(t*kkb + kkb*t)) end function f_fgrav @ \subsection{On Shell Wave Functions} <>= public :: u, ubar, v, vbar private :: chi_plus, chi_minus @ \begin{subequations} \begin{align} \chi_+(\vec p) &= \frac{1}{\sqrt{2|\vec p|(|\vec p|+p_3)}} \begin{pmatrix} |\vec p|+p_3 \\ p_1 + \ii p_2 \end{pmatrix} \\ \chi_-(\vec p) &= \frac{1}{\sqrt{2|\vec p|(|\vec p|+p_3)}} \begin{pmatrix} - p_1 + \ii p_2 \\ |\vec p|+p_3 \end{pmatrix} \end{align} \end{subequations} <>= pure function chi_plus (p) result (chi) complex(kind=default), dimension(2) :: chi type(momentum), intent(in) :: p real(kind=default) :: pabs pabs = sqrt (dot_product (p%x, p%x)) if (pabs + p%x(3) <= 1000 * epsilon (pabs) * pabs) then chi = (/ cmplx ( 0.0, 0.0, kind=default), & cmplx ( 1.0, 0.0, kind=default) /) else chi = 1 / sqrt (2*pabs*(pabs + p%x(3))) & * (/ cmplx (pabs + p%x(3), kind=default), & cmplx (p%x(1), p%x(2), kind=default) /) end if end function chi_plus @ <>= pure function chi_minus (p) result (chi) complex(kind=default), dimension(2) :: chi type(momentum), intent(in) :: p real(kind=default) :: pabs pabs = sqrt (dot_product (p%x, p%x)) if (pabs + p%x(3) <= 1000 * epsilon (pabs) * pabs) then chi = (/ cmplx (-1.0, 0.0, kind=default), & cmplx ( 0.0, 0.0, kind=default) /) else chi = 1 / sqrt (2*pabs*(pabs + p%x(3))) & * (/ cmplx (-p%x(1), p%x(2), kind=default), & cmplx (pabs + p%x(3), kind=default) /) end if end function chi_minus @ \begin{equation} u_\pm(p,|m|) = \begin{pmatrix} \sqrt{p_0\mp|\vec p|} \cdot \chi_\pm(\vec p) \\ \sqrt{p_0\pm|\vec p|} \cdot \chi_\pm(\vec p) \end{pmatrix}\qquad u_\pm(p,-|m|) = \begin{pmatrix} - i \sqrt{p_0\mp|\vec p|} \cdot \chi_\pm(\vec p) \\ + i \sqrt{p_0\pm|\vec p|} \cdot \chi_\pm(\vec p) \end{pmatrix} \end{equation} Determining the mass from the momenta is a numerically haphazardous for light particles. Therefore, we accept some redundancy and pass the mass explicitely. Even if the mass is not used in the chiral representation, we do so for symmetry with polarization vectors and to be prepared for other representations. <>= pure function u (mass, p, s) result (psi) type(spinor) :: psi real(kind=default), intent(in) :: mass type(momentum), intent(in) :: p integer, intent(in) :: s complex(kind=default), dimension(2) :: chi real(kind=default) :: pabs, delta, m m = abs(mass) pabs = sqrt (dot_product (p%x, p%x)) if (m < epsilon (m) * pabs) then delta = 0 else delta = sqrt (max (p%t - pabs, 0._default)) end if select case (s) case (1) chi = chi_plus (p) psi%a(1:2) = delta * chi psi%a(3:4) = sqrt (p%t + pabs) * chi case (-1) chi = chi_minus (p) psi%a(1:2) = sqrt (p%t + pabs) * chi psi%a(3:4) = delta * chi case default pabs = m ! make the compiler happy and use m psi%a = 0 end select if (mass < 0) then psi%a(1:2) = - imago * psi%a(1:2) psi%a(3:4) = + imago * psi%a(3:4) end if end function u @ <>= pure function ubar (m, p, s) result (psibar) type(conjspinor) :: psibar real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type(spinor) :: psi psi = u (m, p, s) psibar%a(1:2) = conjg (psi%a(3:4)) psibar%a(3:4) = conjg (psi%a(1:2)) end function ubar @ \begin{equation} v_\pm(p) = \begin{pmatrix} \mp\sqrt{p_0\pm|\vec p|} \cdot \chi_\mp(\vec p) \\ \pm\sqrt{p_0\mp|\vec p|} \cdot \chi_\mp(\vec p) \end{pmatrix} \end{equation} <>= pure function v (mass, p, s) result (psi) type(spinor) :: psi real(kind=default), intent(in) :: mass type(momentum), intent(in) :: p integer, intent(in) :: s complex(kind=default), dimension(2) :: chi real(kind=default) :: pabs, delta, m m = abs(mass) pabs = sqrt (dot_product (p%x, p%x)) if (m < epsilon (m) * pabs) then delta = 0 else delta = sqrt (max (p%t - pabs, 0._default)) end if select case (s) case (1) chi = chi_minus (p) psi%a(1:2) = - sqrt (p%t + pabs) * chi psi%a(3:4) = delta * chi case (-1) chi = chi_plus (p) psi%a(1:2) = delta * chi psi%a(3:4) = - sqrt (p%t + pabs) * chi case default pabs = m ! make the compiler happy and use m psi%a = 0 end select if (mass < 0) then psi%a(1:2) = - imago * psi%a(1:2) psi%a(3:4) = + imago * psi%a(3:4) end if end function v @ <>= pure function vbar (m, p, s) result (psibar) type(conjspinor) :: psibar real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type(spinor) :: psi psi = v (m, p, s) psibar%a(1:2) = conjg (psi%a(3:4)) psibar%a(3:4) = conjg (psi%a(1:2)) end function vbar @ \subsection{Off Shell Wave Functions} I've just taken this over from Christian Schwinn's version. <>= public :: brs_u, brs_ubar, brs_v, brs_vbar @ The off-shell wave functions needed for gauge checking are obtained from the LSZ-formulas: \begin{subequations} \begin{align} \Braket{\text{Out}|d^\dagger|\text{In}}&=i\int d^4x \bar v e^{-ikx}(i\fmslash\partial-m)\Braket{\text{Out}|\psi|\text{In}}\\ \Braket{\text{Out}|b|\text{In}}&=-i\int d^4x \bar u e^{ikx}(i\fmslash\partial-m)\Braket{\text{Out}|\psi|\text{In}}\\ \Braket{\text{Out}|d|\text{In}}&= i\int d^4x \Braket{\text{Out}|\bar \psi| \text{In}}(-i\fmslash{\overleftarrow\partial}-m)v e^{ikx}\\ \Braket{\text{Out}|b^\dagger|\text{In}}&= -i\int d^4x \Braket{\text{Out}|\bar \psi| \text{In}}(-i\fmslash{\overleftarrow\partial}-m)u e^{-ikx} \end{align} \end{subequations} Since the relative sign between fermions and antifermions is ignored for on-shell amplitudes we must also ignore it here, so all wavefunctions must have a $(-i)$ factor. In momentum space we have: \begin{equation} brs u(p)=(-i) (\fmslash p-m)u(p) \end{equation} <>= pure function brs_u (m, p, s) result (dpsi) type(spinor) :: dpsi,psi real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type (vector)::vp complex(kind=default), parameter :: one = (1, 0) vp=p psi=u(m,p,s) dpsi=cmplx(0.0,-1.0)*(f_vf(one,vp,psi)-m*psi) end function brs_u @ \begin{equation} brs v(p)=i (\fmslash p+m)v(p) \end{equation} <>= pure function brs_v (m, p, s) result (dpsi) type(spinor) :: dpsi, psi real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type (vector)::vp complex(kind=default), parameter :: one = (1, 0) vp=p psi=v(m,p,s) dpsi=cmplx(0.0,1.0)*(f_vf(one,vp,psi)+m*psi) end function brs_v @ \begin{equation} brs \bar{u}(p)=(-i)\bar u(p)(\fmslash p-m) \end{equation} <>= pure function brs_ubar (m, p, s)result (dpsibar) type(conjspinor) :: dpsibar, psibar real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type (vector)::vp complex(kind=default), parameter :: one = (1, 0) vp=p psibar=ubar(m,p,s) dpsibar=cmplx(0.0,-1.0)*(f_fv(one,psibar,vp)-m*psibar) end function brs_ubar @ \begin{equation} brs \bar{v}(p)=(i)\bar v(p)(\fmslash p+m) \end{equation} <>= pure function brs_vbar (m, p, s) result (dpsibar) type(conjspinor) :: dpsibar,psibar real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type(vector)::vp complex(kind=default), parameter :: one = (1, 0) vp=p psibar=vbar(m,p,s) dpsibar=cmplx(0.0,1.0)*(f_fv(one,psibar,vp)+m*psibar) end function brs_vbar @ NB: The remarks on momentum flow in the propagators don't apply here since the incoming momenta are flipped for the wave functions. @ \subsection{Propagators} NB: the common factor of~$\ii$ is extracted: <>= public :: pr_psi, pr_psibar public :: pj_psi, pj_psibar public :: pg_psi, pg_psibar @ \begin{equation} \frac{i(-\fmslash{p}+m)}{p^2-m^2+\ii m\Gamma}\psi \end{equation} NB: the sign of the momentum comes about because all momenta are treated as \emph{outgoing} and the particle charge flow is therefore opposite to the momentum. <>= pure function pr_psi (p, m, w, cms, psi) result (ppsi) type(spinor) :: ppsi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(spinor), intent(in) :: psi logical, intent(in) :: cms type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) complex(kind=default) :: num_mass vp = p if (cms) then num_mass = sqrt(cmplx(m**2, -m*w, kind=default)) else num_mass = cmplx (m, 0, kind=default) end if ppsi = (1 / cmplx (p*p - m**2, m*w, kind=default)) & * (- f_vf (one, vp, psi) + num_mass * psi) end function pr_psi @ \begin{equation} \sqrt{\frac{\pi}{M\Gamma}} (-\fmslash{p}+m)\psi \end{equation} <>= pure function pj_psi (p, m, w, psi) result (ppsi) type(spinor) :: ppsi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(spinor), intent(in) :: psi type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) vp = p ppsi = (0, -1) * sqrt (PI / m / w) * (- f_vf (one, vp, psi) + m * psi) end function pj_psi @ <>= pure function pg_psi (p, m, w, psi) result (ppsi) type(spinor) :: ppsi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(spinor), intent(in) :: psi type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) vp = p ppsi = gauss(p*p, m, w) * (- f_vf (one, vp, psi) + m * psi) end function pg_psi @ \begin{equation} \bar\psi \frac{i(\fmslash{p}+m)}{p^2-m^2+\ii m\Gamma} \end{equation} NB: the sign of the momentum comes about because all momenta are treated as \emph{outgoing} and the antiparticle charge flow is therefore parallel to the momentum. <>= pure function pr_psibar (p, m, w, cms, psibar) result (ppsibar) type(conjspinor) :: ppsibar type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(conjspinor), intent(in) :: psibar logical, intent(in) :: cms type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) complex(kind=default) :: num_mass vp = p if (cms) then num_mass = sqrt(cmplx(m**2, -m*w, kind=default)) else num_mass = cmplx (m, 0, kind=default) end if ppsibar = (1 / cmplx (p*p - m**2, m*w, kind=default)) & * (f_fv (one, psibar, vp) + num_mass * psibar) end function pr_psibar @ \begin{equation} \sqrt{\frac{\pi}{M\Gamma}} \bar\psi (\fmslash{p}+m) \end{equation} NB: the sign of the momentum comes about because all momenta are treated as \emph{outgoing} and the antiparticle charge flow is therefore parallel to the momentum. <>= pure function pj_psibar (p, m, w, psibar) result (ppsibar) type(conjspinor) :: ppsibar type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(conjspinor), intent(in) :: psibar type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) vp = p ppsibar = (0, -1) * sqrt (PI / m / w) * (f_fv (one, psibar, vp) + m * psibar) end function pj_psibar @ <>= pure function pg_psibar (p, m, w, psibar) result (ppsibar) type(conjspinor) :: ppsibar type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(conjspinor), intent(in) :: psibar type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) vp = p ppsibar = gauss (p*p, m, w) * (f_fv (one, psibar, vp) + m * psibar) end function pg_psibar @ \begin{equation} \frac{i(-\fmslash{p}+m)}{p^2-m^2+\ii m\Gamma} \sum_n \psi_n\otimes\bar\psi_n \end{equation} NB: the temporary variables [[psi(1:4)]] are not nice, but the compilers should be able to optimize the unnecessary copies away. In any case, even if the copies are performed, they are (probably) negligible compared to the floating point multiplications anyway \ldots <<(Not used yet) Declaration of operations for spinors>>= type, public :: spinordyad ! private (omegalib needs access, but DON'T TOUCH IT!) complex(kind=default), dimension(4,4) :: a end type spinordyad @ <<(Not used yet) Implementation of spinor propagators>>= pure function pr_dyadleft (p, m, w, psipsibar) result (psipsibarp) type(spinordyad) :: psipsibarp type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(spinordyad), intent(in) :: psipsibar integer :: i type(vector) :: vp type(spinor), dimension(4) :: psi complex(kind=default) :: pole complex(kind=default), parameter :: one = (1, 0) vp = p pole = 1 / cmplx (p*p - m**2, m*w, kind=default) do i = 1, 4 psi(i)%a = psipsibar%a(:,i) psi(i) = pole * (- f_vf (one, vp, psi(i)) + m * psi(i)) psipsibarp%a(:,i) = psi(i)%a end do end function pr_dyadleft @ \begin{equation} \sum_n \psi_n\otimes\bar\psi_n \frac{i(\fmslash{p}+m)}{p^2-m^2+\ii m\Gamma} \end{equation} <<(Not used yet) Implementation of spinor propagators>>= pure function pr_dyadright (p, m, w, psipsibar) result (psipsibarp) type(spinordyad) :: psipsibarp type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(spinordyad), intent(in) :: psipsibar integer :: i type(vector) :: vp type(conjspinor), dimension(4) :: psibar complex(kind=default) :: pole complex(kind=default), parameter :: one = (1, 0) vp = p pole = 1 / cmplx (p*p - m**2, m*w, kind=default) do i = 1, 4 psibar(i)%a = psipsibar%a(i,:) psibar(i) = pole * (f_fv (one, psibar(i), vp) + m * psibar(i)) psipsibarp%a(i,:) = psibar(i)%a end do end function pr_dyadright @ \section{Spinor Couplings Revisited} <<[[omega_bispinor_couplings.f90]]>>= <> module omega_bispinor_couplings use kinds use constants use omega_bispinors use omega_vectorspinors use omega_vectors use omega_couplings implicit none private <> <> <> <> integer, parameter, public :: omega_bispinor_cpls_2010_01_A = 0 contains <> <> <> <> end module omega_bispinor_couplings @ See table~\ref{tab:fermionic-currents} for the names of Fortran functions. We could have used long names instead, but this would increase the chance of running past continuation line limits without adding much to the legibility. @ \subsection{Fermionic Vector and Axial Couplings} +\label{sec:dirac-matrices-jrr} There's more than one chiral representation. This one is compatible with HELAS~\cite{HELAS}. \begin{subequations} \begin{align} & \gamma^0 = \begin{pmatrix} 0 & \mathbf{1} \\ \mathbf{1} & 0 \end{pmatrix},\; \gamma^i = \begin{pmatrix} 0 & \sigma^i \\ -\sigma^i & 0 \end{pmatrix},\; \gamma_5 = i\gamma^0\gamma^1\gamma^2\gamma^3 = \begin{pmatrix} -\mathbf{1} & 0 \\ 0 & \mathbf{1} \end{pmatrix}, \\ & C = \begin{pmatrix} \epsilon & 0 \\ 0 & - \epsilon \end{pmatrix} \; , \qquad \epsilon = \begin{pmatrix} 0 & 1 \\ -1 & 0 \end{pmatrix} . \end{align} \end{subequations} Therefore \begin{subequations} \begin{align} g_S + g_P\gamma_5 &= \begin{pmatrix} g_S - g_P & 0 & 0 & 0 \\ 0 & g_S - g_P & 0 & 0 \\ 0 & 0 & g_S + g_P & 0 \\ 0 & 0 & 0 & g_S + g_P \end{pmatrix} \\ g_V\gamma^0 - g_A\gamma^0\gamma_5 &= \begin{pmatrix} 0 & 0 & g_V - g_A & 0 \\ 0 & 0 & 0 & g_V - g_A \\ g_V + g_A & 0 & 0 & 0 \\ 0 & g_V + g_A & 0 & 0 \end{pmatrix} \\ g_V\gamma^1 - g_A\gamma^1\gamma_5 &= \begin{pmatrix} 0 & 0 & 0 & g_V - g_A \\ 0 & 0 & g_V - g_A & 0 \\ 0 & - g_V - g_A & 0 & 0 \\ - g_V - g_A & 0 & 0 & 0 \end{pmatrix} \\ g_V\gamma^2 - g_A\gamma^2\gamma_5 &= \begin{pmatrix} 0 & 0 & 0 & -\ii(g_V - g_A) \\ 0 & 0 & \ii(g_V - g_A) & 0 \\ 0 & \ii(g_V + g_A) & 0 & 0 \\ -\ii(g_V + g_A) & 0 & 0 & 0 \end{pmatrix} \\ g_V\gamma^3 - g_A\gamma^3\gamma_5 &= \begin{pmatrix} 0 & 0 & g_V - g_A & 0 \\ 0 & 0 & 0 & - g_V + g_A \\ - g_V - g_A & 0 & 0 & 0 \\ 0 & g_V + g_A & 0 & 0 \end{pmatrix} \end{align} \end{subequations} and \begin{subequations} \begin{align} C(g_S + g_P\gamma_5) &= \begin{pmatrix} 0 & g_S - g_P & 0 & 0 \\ - g_S + g_P & 0 & 0 & 0 \\ 0 & 0 & 0 & - g_S - g_P \\ 0 & 0 & g_S + g_P & 0 \end{pmatrix} \\ C(g_V\gamma^0 - g_A\gamma^0\gamma_5) &= \begin{pmatrix} 0 & 0 & 0 & g_V - g_A \\ 0 & 0 & - g_V + g_A & 0 \\ 0 & - g_V - g_A & 0 & 0 \\ g_V + g_A & 0 & 0 & 0 \end{pmatrix} \\ C(g_V\gamma^1 - g_A\gamma^1\gamma_5) &= \begin{pmatrix} 0 & 0 & g_V - g_A & 0 \\ 0 & 0 & 0 & - g_V + g_A \\ g_V + g_A & 0 & 0 & 0 \\ 0 & - g_V - g_A & 0 & 0 \end{pmatrix} \\ C(g_V\gamma^2 - g_A\gamma^2\gamma_5) &= \begin{pmatrix} 0 & 0 & \ii(g_V - g_A) & 0 \\ 0 & 0 & 0 & \ii(g_V - g_A) \\ \ii(g_V + g_A) & 0 & 0 & 0 \\ 0 & \ii(g_V + g_A) & 0 & 0 \end{pmatrix} \\ C(g_V\gamma^3 - g_A\gamma^3\gamma_5) &= \begin{pmatrix} 0 & 0 & 0 & - g_V + g_A \\ 0 & 0 & - g_V + g_A & 0 \\ 0 & - g_V - g_A & 0 & 0 \\ - g_V - g_A & 0 & 0 & 0 \end{pmatrix} \end{align} \end{subequations} <>= public :: va_ff, v_ff, a_ff, vl_ff, vr_ff, vlr_ff, va2_ff, tva_ff, tvam_ff, & tlr_ff, tlrm_ff @ <>= pure function va_ff (gv, ga, psil, psir) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv, ga type(bispinor), intent(in) :: psil, psir complex(kind=default) :: gl, gr complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 gl = gv + ga gr = gv - ga g13 = psil%a(1)*psir%a(3) g14 = psil%a(1)*psir%a(4) g23 = psil%a(2)*psir%a(3) g24 = psil%a(2)*psir%a(4) g31 = psil%a(3)*psir%a(1) g32 = psil%a(3)*psir%a(2) g41 = psil%a(4)*psir%a(1) g42 = psil%a(4)*psir%a(2) j%t = gr * ( g14 - g23) + gl * ( - g32 + g41) j%x(1) = gr * ( g13 - g24) + gl * ( g31 - g42) j%x(2) = (gr * ( g13 + g24) + gl * ( g31 + g42)) * (0, 1) j%x(3) = gr * ( - g14 - g23) + gl * ( - g32 - g41) end function va_ff @ <>= pure function va2_ff (gva, psil, psir) result (j) type(vector) :: j complex(kind=default), intent(in), dimension(2) :: gva type(bispinor), intent(in) :: psil, psir complex(kind=default) :: gl, gr complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 gl = gva(1) + gva(2) gr = gva(1) - gva(2) g13 = psil%a(1)*psir%a(3) g14 = psil%a(1)*psir%a(4) g23 = psil%a(2)*psir%a(3) g24 = psil%a(2)*psir%a(4) g31 = psil%a(3)*psir%a(1) g32 = psil%a(3)*psir%a(2) g41 = psil%a(4)*psir%a(1) g42 = psil%a(4)*psir%a(2) j%t = gr * ( g14 - g23) + gl * ( - g32 + g41) j%x(1) = gr * ( g13 - g24) + gl * ( g31 - g42) j%x(2) = (gr * ( g13 + g24) + gl * ( g31 + g42)) * (0, 1) j%x(3) = gr * ( - g14 - g23) + gl * ( - g32 - g41) end function va2_ff @ <>= pure function v_ff (gv, psil, psir) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv type(bispinor), intent(in) :: psil, psir complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 g13 = psil%a(1)*psir%a(3) g14 = psil%a(1)*psir%a(4) g23 = psil%a(2)*psir%a(3) g24 = psil%a(2)*psir%a(4) g31 = psil%a(3)*psir%a(1) g32 = psil%a(3)*psir%a(2) g41 = psil%a(4)*psir%a(1) g42 = psil%a(4)*psir%a(2) j%t = gv * ( g14 - g23 - g32 + g41) j%x(1) = gv * ( g13 - g24 + g31 - g42) j%x(2) = gv * ( g13 + g24 + g31 + g42) * (0, 1) j%x(3) = gv * ( - g14 - g23 - g32 - g41) end function v_ff @ <>= pure function a_ff (ga, psil, psir) result (j) type(vector) :: j complex(kind=default), intent(in) :: ga type(bispinor), intent(in) :: psil, psir complex(kind=default) :: g13, g14, g23, g24, g31, g32, g41, g42 g13 = psil%a(1)*psir%a(3) g14 = psil%a(1)*psir%a(4) g23 = psil%a(2)*psir%a(3) g24 = psil%a(2)*psir%a(4) g31 = psil%a(3)*psir%a(1) g32 = psil%a(3)*psir%a(2) g41 = psil%a(4)*psir%a(1) g42 = psil%a(4)*psir%a(2) j%t = -ga * ( g14 - g23 + g32 - g41) j%x(1) = -ga * ( g13 - g24 - g31 + g42) j%x(2) = -ga * ( g13 + g24 - g31 - g42) * (0, 1) j%x(3) = -ga * ( - g14 - g23 + g32 + g41) end function a_ff @ <>= pure function vl_ff (gl, psil, psir) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl type(bispinor), intent(in) :: psil, psir complex(kind=default) :: gl2 complex(kind=default) :: g31, g32, g41, g42 gl2 = 2 * gl g31 = psil%a(3)*psir%a(1) g32 = psil%a(3)*psir%a(2) g41 = psil%a(4)*psir%a(1) g42 = psil%a(4)*psir%a(2) j%t = gl2 * ( - g32 + g41) j%x(1) = gl2 * ( g31 - g42) j%x(2) = gl2 * ( g31 + g42) * (0, 1) j%x(3) = gl2 * ( - g32 - g41) end function vl_ff @ <>= pure function vr_ff (gr, psil, psir) result (j) type(vector) :: j complex(kind=default), intent(in) :: gr type(bispinor), intent(in) :: psil, psir complex(kind=default) :: gr2 complex(kind=default) :: g13, g14, g23, g24 gr2 = 2 * gr g13 = psil%a(1)*psir%a(3) g14 = psil%a(1)*psir%a(4) g23 = psil%a(2)*psir%a(3) g24 = psil%a(2)*psir%a(4) j%t = gr2 * ( g14 - g23) j%x(1) = gr2 * ( g13 - g24) j%x(2) = gr2 * ( g13 + g24) * (0, 1) j%x(3) = gr2 * ( - g14 - g23) end function vr_ff @ <>= pure function vlr_ff (gl, gr, psibar, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psibar type(bispinor), intent(in) :: psi j = va_ff (gl+gr, gl-gr, psibar, psi) end function vlr_ff @ <>= pure function tva_ff (gv, ga, psibar, psi) result (t) type(tensor2odd) :: t complex(kind=default), intent(in) :: gv, ga type(bispinor), intent(in) :: psibar type(bispinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: g11, g22, g33, g44, g1p2, g3p4 gr = gv + ga gl = gv - ga g11 = psibar%a(1)*psi%a(1) g22 = psibar%a(2)*psi%a(2) g1p2 = psibar%a(1)*psi%a(2) + psibar%a(2)*psi%a(1) g3p4 = psibar%a(3)*psi%a(4) + psibar%a(4)*psi%a(3) g33 = psibar%a(3)*psi%a(3) g44 = psibar%a(4)*psi%a(4) t%e(1) = (gl * ( - g11 + g22) + gr * ( - g33 + g44)) * (0, 1) t%e(2) = gl * ( g11 + g22) + gr * ( g33 + g44) t%e(3) = (gl * ( g1p2 ) + gr * ( g3p4 )) * (0, 1) t%b(1) = gl * ( g11 - g22) + gr * ( - g33 + g44) t%b(2) = (gl * ( g11 + g22) + gr * ( - g33 - g44)) * (0, 1) t%b(3) = gl * ( - g1p2 ) + gr * ( g3p4 ) end function tva_ff @ <>= pure function tlr_ff (gl, gr, psibar, psi) result (t) type(tensor2odd) :: t complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psibar type(bispinor), intent(in) :: psi t = tva_ff (gr+gl, gr-gl, psibar, psi) end function tlr_ff @ <>= pure function tvam_ff (gv, ga, psibar, psi, p) result (j) type(vector) :: j complex(kind=default), intent(in) :: gv, ga type(bispinor), intent(in) :: psibar type(bispinor), intent(in) :: psi type(momentum), intent(in) :: p j = (tva_ff(gv, ga, psibar, psi) * p) * (0,1) end function tvam_ff @ <>= pure function tlrm_ff (gl, gr, psibar, psi, p) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psibar type(bispinor), intent(in) :: psi type(momentum), intent(in) :: p j = tvam_ff (gr+gl, gr-gl, psibar, psi, p) end function tlrm_ff @ and \begin{equation} \fmslash{v} - \fmslash{a}\gamma_5 = \begin{pmatrix} 0 & 0 & v_- - a_- & - v^* + a^* \\ 0 & 0 & - v + a & v_+ - a_+ \\ v_+ + a_+ & v^* + a^* & 0 & 0 \\ v + a & v_- + a_- & 0 & 0 \end{pmatrix} \end{equation} with $v_\pm=v_0\pm v_3$, $a_\pm=a_0\pm a_3$, $v=v_1+\ii v_2$, $v^*=v_1-\ii v_2$, $a=a_1+\ii a_2$, and $a^*=a_1-\ii a_2$. But note that~$\cdot^*$ is \emph{not} complex conjugation for complex~$v_\mu$ or~$a_\mu$. <>= public :: f_vaf, f_vf, f_af, f_vlf, f_vrf, f_vlrf, f_va2f, & f_tvaf, f_tlrf, f_tvamf, f_tlrmf @ <>= pure function f_vaf (gv, ga, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gv, ga type(vector), intent(in) :: v type(bispinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gv + ga gr = gv - ga vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gl * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_vaf @ <>= pure function f_va2f (gva, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in), dimension(2) :: gva type(vector), intent(in) :: v type(bispinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: vp, vm, v12, v12s gl = gva(1) + gva(2) gr = gva(1) - gva(2) vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gl * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_va2f @ <>= pure function f_vf (gv, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gv type(vector), intent(in) :: v type(bispinor), intent(in) :: psi complex(kind=default) :: vp, vm, v12, v12s vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gv * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gv * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = gv * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gv * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_vf @ <>= pure function f_af (ga, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: ga type(vector), intent(in) :: v type(bispinor), intent(in) :: psi complex(kind=default) :: vp, vm, v12, v12s vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = ga * ( - vm * psi%a(3) + v12s * psi%a(4)) vpsi%a(2) = ga * ( v12 * psi%a(3) - vp * psi%a(4)) vpsi%a(3) = ga * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = ga * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_af @ <>= pure function f_vlf (gl, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gl type(vector), intent(in) :: v type(bispinor), intent(in) :: psi complex(kind=default) :: gl2 complex(kind=default) :: vp, vm, v12, v12s gl2 = 2 * gl vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = 0 vpsi%a(2) = 0 vpsi%a(3) = gl2 * ( vp * psi%a(1) + v12s * psi%a(2)) vpsi%a(4) = gl2 * ( v12 * psi%a(1) + vm * psi%a(2)) end function f_vlf @ <>= pure function f_vrf (gr, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gr type(vector), intent(in) :: v type(bispinor), intent(in) :: psi complex(kind=default) :: gr2 complex(kind=default) :: vp, vm, v12, v12s gr2 = 2 * gr vp = v%t + v%x(3) vm = v%t - v%x(3) v12 = v%x(1) + (0,1)*v%x(2) v12s = v%x(1) - (0,1)*v%x(2) vpsi%a(1) = gr2 * ( vm * psi%a(3) - v12s * psi%a(4)) vpsi%a(2) = gr2 * ( - v12 * psi%a(3) + vp * psi%a(4)) vpsi%a(3) = 0 vpsi%a(4) = 0 end function f_vrf @ <>= pure function f_vlrf (gl, gr, v, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gl, gr type(vector), intent(in) :: v type(bispinor), intent(in) :: psi vpsi = f_vaf (gl+gr, gl-gr, v, psi) end function f_vlrf @ <>= pure function f_tvaf (gv, ga, t, psi) result (tpsi) type(bispinor) :: tpsi complex(kind=default), intent(in) :: gv, ga type(tensor2odd), intent(in) :: t type(bispinor), intent(in) :: psi complex(kind=default) :: gl, gr complex(kind=default) :: e21, e21s, b12, b12s, be3, be3s gr = gv + ga gl = gv - ga e21 = t%e(2) + t%e(1)*(0,1) e21s = t%e(2) - t%e(1)*(0,1) b12 = t%b(1) + t%b(2)*(0,1) b12s = t%b(1) - t%b(2)*(0,1) be3 = t%b(3) + t%e(3)*(0,1) be3s = t%b(3) - t%e(3)*(0,1) tpsi%a(1) = 2*gl * ( psi%a(1) * be3 + psi%a(2) * ( e21 +b12s)) tpsi%a(2) = 2*gl * ( - psi%a(2) * be3 + psi%a(1) * (-e21s+b12 )) tpsi%a(3) = 2*gr * ( psi%a(3) * be3s + psi%a(4) * (-e21 +b12s)) tpsi%a(4) = 2*gr * ( - psi%a(4) * be3s + psi%a(3) * ( e21s+b12 )) end function f_tvaf @ <>= pure function f_tlrf (gl, gr, t, psi) result (tpsi) type(bispinor) :: tpsi complex(kind=default), intent(in) :: gl, gr type(tensor2odd), intent(in) :: t type(bispinor), intent(in) :: psi tpsi = f_tvaf (gr+gl, gr-gl, t, psi) end function f_tlrf @ <>= pure function f_tvamf (gv, ga, v, psi, k) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gv, ga type(vector), intent(in) :: v type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k type(tensor2odd) :: t t = (v.wedge.k) * (0, 0.5) vpsi = f_tvaf(gv, ga, t, psi) end function f_tvamf @ <>= pure function f_tlrmf (gl, gr, v, psi, k) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: gl, gr type(vector), intent(in) :: v type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k vpsi = f_tvamf (gr+gl, gr-gl, v, psi, k) end function f_tlrmf @ \subsection{Fermionic Scalar and Pseudo Scalar Couplings} <>= public :: sp_ff, s_ff, p_ff, sl_ff, sr_ff, slr_ff @ <>= pure function sp_ff (gs, gp, psil, psir) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gs, gp type(bispinor), intent(in) :: psil, psir j = (gs - gp) * (psil%a(1)*psir%a(2) - psil%a(2)*psir%a(1)) & + (gs + gp) * (- psil%a(3)*psir%a(4) + psil%a(4)*psir%a(3)) end function sp_ff @ <>= pure function s_ff (gs, psil, psir) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gs type(bispinor), intent(in) :: psil, psir j = gs * (psil * psir) end function s_ff @ <>= pure function p_ff (gp, psil, psir) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gp type(bispinor), intent(in) :: psil, psir j = gp * (- psil%a(1)*psir%a(2) + psil%a(2)*psir%a(1) & - psil%a(3)*psir%a(4) + psil%a(4)*psir%a(3)) end function p_ff @ <>= pure function sl_ff (gl, psil, psir) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl type(bispinor), intent(in) :: psil, psir j = 2 * gl * (psil%a(1)*psir%a(2) - psil%a(2)*psir%a(1)) end function sl_ff @ <>= pure function sr_ff (gr, psil, psir) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gr type(bispinor), intent(in) :: psil, psir j = 2 * gr * (- psil%a(3)*psir%a(4) + psil%a(4)*psir%a(3)) end function sr_ff @ <>= pure function slr_ff (gl, gr, psibar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psibar type(bispinor), intent(in) :: psi j = sp_ff (gr+gl, gr-gl, psibar, psi) end function slr_ff @ <>= public :: f_spf, f_sf, f_pf, f_slf, f_srf, f_slrf @ <>= pure function f_spf (gs, gp, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gs, gp complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi%a(1:2) = ((gs - gp) * phi) * psi%a(1:2) phipsi%a(3:4) = ((gs + gp) * phi) * psi%a(3:4) end function f_spf @ <>= pure function f_sf (gs, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gs complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi%a = (gs * phi) * psi%a end function f_sf @ <>= pure function f_pf (gp, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gp complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi%a(1:2) = (- gp * phi) * psi%a(1:2) phipsi%a(3:4) = ( gp * phi) * psi%a(3:4) end function f_pf @ <>= pure function f_slf (gl, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gl complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi%a(1:2) = (2 * gl * phi) * psi%a(1:2) phipsi%a(3:4) = 0 end function f_slf @ <>= pure function f_srf (gr, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gr complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi%a(1:2) = 0 phipsi%a(3:4) = (2 * gr * phi) * psi%a(3:4) end function f_srf @ <>= pure function f_slrf (gl, gr, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gl, gr complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi = f_spf (gr+gl, gr-gl, phi, psi) end function f_slrf @ \subsection{Couplings for BRST Transformations} \subsubsection{3-Couplings} The lists of needed gamma matrices can be found in the next subsection with the gravitino couplings. <>= private :: vv_ff, f_vvf @ <>= public :: vmom_ff, mom_ff, mom5_ff, moml_ff, momr_ff, lmom_ff, rmom_ff @ <>= pure function vv_ff (psibar, psi, k) result (psibarpsi) type(vector) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: k complex(kind=default) :: kp, km, k12, k12s type(bispinor) :: kgpsi1, kgpsi2, kgpsi3, kgpsi4 kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) kgpsi1%a(1) = -k%x(3) * psi%a(1) - k12s * psi%a(2) kgpsi1%a(2) = -k12 * psi%a(1) + k%x(3) * psi%a(2) kgpsi1%a(3) = k%x(3) * psi%a(3) + k12s * psi%a(4) kgpsi1%a(4) = k12 * psi%a(3) - k%x(3) * psi%a(4) kgpsi2%a(1) = ((0,-1) * k%x(2)) * psi%a(1) - km * psi%a(2) kgpsi2%a(2) = - kp * psi%a(1) + ((0,1) * k%x(2)) * psi%a(2) kgpsi2%a(3) = ((0,-1) * k%x(2)) * psi%a(3) + kp * psi%a(4) kgpsi2%a(4) = km * psi%a(3) + ((0,1) * k%x(2)) * psi%a(4) kgpsi3%a(1) = (0,1) * (k%x(1) * psi%a(1) + km * psi%a(2)) kgpsi3%a(2) = (0,-1) * (kp * psi%a(1) + k%x(1) * psi%a(2)) kgpsi3%a(3) = (0,1) * (k%x(1) * psi%a(3) - kp * psi%a(4)) kgpsi3%a(4) = (0,1) * (km * psi%a(3) - k%x(1) * psi%a(4)) kgpsi4%a(1) = -k%t * psi%a(1) - k12s * psi%a(2) kgpsi4%a(2) = k12 * psi%a(1) + k%t * psi%a(2) kgpsi4%a(3) = k%t * psi%a(3) - k12s * psi%a(4) kgpsi4%a(4) = k12 * psi%a(3) - k%t * psi%a(4) psibarpsi%t = 2 * (psibar * kgpsi1) psibarpsi%x(1) = 2 * (psibar * kgpsi2) psibarpsi%x(2) = 2 * (psibar * kgpsi3) psibarpsi%x(3) = 2 * (psibar * kgpsi4) end function vv_ff @ <>= pure function f_vvf (v, psi, k) result (kvpsi) type(bispinor) :: kvpsi type(bispinor), intent(in) :: psi type(vector), intent(in) :: k, v complex(kind=default) :: kv30, kv21, kv01, kv31, kv02, kv32 complex(kind=default) :: ap, am, bp, bm, bps, bms kv30 = k%x(3) * v%t - k%t * v%x(3) kv21 = (0,1) * (k%x(2) * v%x(1) - k%x(1) * v%x(2)) kv01 = k%t * v%x(1) - k%x(1) * v%t kv31 = k%x(3) * v%x(1) - k%x(1) * v%x(3) kv02 = (0,1) * (k%t * v%x(2) - k%x(2) * v%t) kv32 = (0,1) * (k%x(3) * v%x(2) - k%x(2) * v%x(3)) ap = 2 * (kv30 + kv21) am = 2 * (-kv30 + kv21) bp = 2 * (kv01 + kv31 + kv02 + kv32) bm = 2 * (kv01 - kv31 + kv02 - kv32) bps = 2 * (kv01 + kv31 - kv02 - kv32) bms = 2 * (kv01 - kv31 - kv02 + kv32) kvpsi%a(1) = am * psi%a(1) + bms * psi%a(2) kvpsi%a(2) = bp * psi%a(1) - am * psi%a(2) kvpsi%a(3) = ap * psi%a(3) - bps * psi%a(4) kvpsi%a(4) = -bm * psi%a(3) - ap * psi%a(4) end function f_vvf @ <>= pure function vmom_ff (g, psibar, psi, k) result (psibarpsi) type(vector) :: psibarpsi complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k type(vector) :: vk vk = k psibarpsi = g * vv_ff (psibar, psi, vk) end function vmom_ff @ <>= pure function mom_ff (g, m, psibar, psi, k) result (psibarpsi) complex(kind=default) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g, m type(bispinor) :: kmpsi complex(kind=default) :: kp, km, k12, k12s kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) kmpsi%a(1) = km * psi%a(3) - k12s * psi%a(4) kmpsi%a(2) = kp * psi%a(4) - k12 * psi%a(3) kmpsi%a(3) = kp * psi%a(1) + k12s * psi%a(2) kmpsi%a(4) = k12 * psi%a(1) + km * psi%a(2) psibarpsi = g * (psibar * kmpsi) + s_ff (m, psibar, psi) end function mom_ff @ <>= pure function mom5_ff (g, m, psibar, psi, k) result (psibarpsi) complex(kind=default) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g, m type(bispinor) :: g5psi g5psi%a(1:2) = - psi%a(1:2) g5psi%a(3:4) = psi%a(3:4) psibarpsi = mom_ff (g, m, psibar, g5psi, k) end function mom5_ff @ <>= pure function moml_ff (g, m, psibar, psi, k) result (psibarpsi) complex(kind=default) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g, m type(bispinor) :: leftpsi leftpsi%a(1:2) = 2 * psi%a(1:2) leftpsi%a(3:4) = 0 psibarpsi = mom_ff (g, m, psibar, leftpsi, k) end function moml_ff @ <>= pure function momr_ff (g, m, psibar, psi, k) result (psibarpsi) complex(kind=default) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g, m type(bispinor) :: rightpsi rightpsi%a(1:2) = 0 rightpsi%a(3:4) = 2 * psi%a(3:4) psibarpsi = mom_ff (g, m, psibar, rightpsi, k) end function momr_ff @ <>= pure function lmom_ff (g, m, psibar, psi, k) result (psibarpsi) complex(kind=default) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g, m psibarpsi = mom_ff (g, m, psibar, psi, k) + & mom5_ff (g,-m, psibar, psi, k) end function lmom_ff @ <>= pure function rmom_ff (g, m, psibar, psi, k) result (psibarpsi) complex(kind=default) :: psibarpsi type(bispinor), intent(in) :: psibar, psi type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g, m psibarpsi = mom_ff (g, m, psibar, psi, k) - & mom5_ff (g,-m, psibar, psi, k) end function rmom_ff @ <>= public :: f_vmomf, f_momf, f_mom5f, f_momlf, f_momrf, f_lmomf, f_rmomf @ <>= pure function f_vmomf (g, v, psi, k) result (kvpsi) type(bispinor) :: kvpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: g type(momentum), intent(in) :: k type(vector), intent(in) :: v type(vector) :: vk vk = k kvpsi = g * f_vvf (v, psi, vk) end function f_vmomf @ <>= pure function f_momf (g, m, phi, psi, k) result (kmpsi) type(bispinor) :: kmpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: phi, g, m type(momentum), intent(in) :: k complex(kind=default) :: kp, km, k12, k12s kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) kmpsi%a(1) = km * psi%a(3) - k12s * psi%a(4) kmpsi%a(2) = -k12 * psi%a(3) + kp * psi%a(4) kmpsi%a(3) = kp * psi%a(1) + k12s * psi%a(2) kmpsi%a(4) = k12 * psi%a(1) + km * psi%a(2) kmpsi = g * (phi * kmpsi) + f_sf (m, phi, psi) end function f_momf @ <>= pure function f_mom5f (g, m, phi, psi, k) result (kmpsi) type(bispinor) :: kmpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: phi, g, m type(momentum), intent(in) :: k type(bispinor) :: g5psi g5psi%a(1:2) = - psi%a(1:2) g5psi%a(3:4) = psi%a(3:4) kmpsi = f_momf (g, m, phi, g5psi, k) end function f_mom5f @ <>= pure function f_momlf (g, m, phi, psi, k) result (kmpsi) type(bispinor) :: kmpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: phi, g, m type(momentum), intent(in) :: k type(bispinor) :: leftpsi leftpsi%a(1:2) = 2 * psi%a(1:2) leftpsi%a(3:4) = 0 kmpsi = f_momf (g, m, phi, leftpsi, k) end function f_momlf @ <>= pure function f_momrf (g, m, phi, psi, k) result (kmpsi) type(bispinor) :: kmpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: phi, g, m type(momentum), intent(in) :: k type(bispinor) :: rightpsi rightpsi%a(1:2) = 0 rightpsi%a(3:4) = 2 * psi%a(3:4) kmpsi = f_momf (g, m, phi, rightpsi, k) end function f_momrf @ <>= pure function f_lmomf (g, m, phi, psi, k) result (kmpsi) type(bispinor) :: kmpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: phi, g, m type(momentum), intent(in) :: k kmpsi = f_momf (g, m, phi, psi, k) + & f_mom5f (g,-m, phi, psi, k) end function f_lmomf @ <>= pure function f_rmomf (g, m, phi, psi, k) result (kmpsi) type(bispinor) :: kmpsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: phi, g, m type(momentum), intent(in) :: k kmpsi = f_momf (g, m, phi, psi, k) - & f_mom5f (g,-m, phi, psi, k) end function f_rmomf @ \subsubsection{4-Couplings} <>= public :: v2_ff, sv1_ff, sv2_ff, pv1_ff, pv2_ff, svl1_ff, svl2_ff, & svr1_ff, svr2_ff, svlr1_ff, svlr2_ff @ <>= pure function v2_ff (g, psibar, v, psi) result (v2) type(vector) :: v2 complex (kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: v v2 = (-g) * vv_ff (psibar, psi, v) end function v2_ff @ <>= pure function sv1_ff (g, psibar, v, psi) result (phi) complex(kind=default) :: phi type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: g phi = psibar * f_vf (g, v, psi) end function sv1_ff @ <>= pure function sv2_ff (g, psibar, phi, psi) result (v) type(vector) :: v complex(kind=default), intent(in) :: phi, g type(bispinor), intent(in) :: psibar, psi v = phi * v_ff (g, psibar, psi) end function sv2_ff @ <>= pure function pv1_ff (g, psibar, v, psi) result (phi) complex(kind=default) :: phi type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: g phi = - (psibar * f_af (g, v, psi)) end function pv1_ff @ <>= pure function pv2_ff (g, psibar, phi, psi) result (v) type(vector) :: v complex(kind=default), intent(in) :: phi, g type(bispinor), intent(in) :: psibar, psi v = -(phi * a_ff (g, psibar, psi)) end function pv2_ff @ <>= pure function svl1_ff (g, psibar, v, psi) result (phi) complex(kind=default) :: phi type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: g phi = psibar * f_vlf (g, v, psi) end function svl1_ff @ <>= pure function svl2_ff (g, psibar, phi, psi) result (v) type(vector) :: v complex(kind=default), intent(in) :: phi, g type(bispinor), intent(in) :: psibar, psi v = phi * vl_ff (g, psibar, psi) end function svl2_ff @ <>= pure function svr1_ff (g, psibar, v, psi) result (phi) complex(kind=default) :: phi type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: g phi = psibar * f_vrf (g, v, psi) end function svr1_ff @ <>= pure function svr2_ff (g, psibar, phi, psi) result (v) type(vector) :: v complex(kind=default), intent(in) :: phi, g type(bispinor), intent(in) :: psibar, psi v = phi * vr_ff (g, psibar, psi) end function svr2_ff @ <>= pure function svlr1_ff (gl, gr, psibar, v, psi) result (phi) complex(kind=default) :: phi type(bispinor), intent(in) :: psibar, psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: gl, gr phi = psibar * f_vlrf (gl, gr, v, psi) end function svlr1_ff @ <>= pure function svlr2_ff (gl, gr, psibar, phi, psi) result (v) type(vector) :: v complex(kind=default), intent(in) :: phi, gl, gr type(bispinor), intent(in) :: psibar, psi v = phi * vlr_ff (gl, gr, psibar, psi) end function svlr2_ff @ <>= public :: f_v2f, f_svf, f_pvf, f_svlf, f_svrf, f_svlrf @ <>= pure function f_v2f (g, v1, v2, psi) result (vpsi) type(bispinor) :: vpsi complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psi type(vector), intent(in) :: v1, v2 vpsi = g * f_vvf (v2, psi, v1) end function f_v2f @ <>= pure function f_svf (g, phi, v, psi) result (pvpsi) type(bispinor) :: pvpsi complex(kind=default), intent(in) :: g, phi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v pvpsi = phi * f_vf (g, v, psi) end function f_svf @ <>= pure function f_pvf (g, phi, v, psi) result (pvpsi) type(bispinor) :: pvpsi complex(kind=default), intent(in) :: g, phi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v pvpsi = -(phi * f_af (g, v, psi)) end function f_pvf @ <>= pure function f_svlf (g, phi, v, psi) result (pvpsi) type(bispinor) :: pvpsi complex(kind=default), intent(in) :: g, phi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v pvpsi = phi * f_vlf (g, v, psi) end function f_svlf @ <>= pure function f_svrf (g, phi, v, psi) result (pvpsi) type(bispinor) :: pvpsi complex(kind=default), intent(in) :: g, phi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v pvpsi = phi * f_vrf (g, v, psi) end function f_svrf @ <>= pure function f_svlrf (gl, gr, phi, v, psi) result (pvpsi) type(bispinor) :: pvpsi complex(kind=default), intent(in) :: gl, gr, phi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v pvpsi = phi * f_vlrf (gl, gr, v, psi) end function f_svlrf @ \subsection{Gravitino Couplings} <>= public :: pot_grf, pot_fgr, s_grf, s_fgr, p_grf, p_fgr, & sl_grf, sl_fgr, sr_grf, sr_fgr, slr_grf, slr_fgr @ <>= private :: fgvgr, fgvg5gr, fggvvgr, grkgf, grkggf, grkkggf, & fgkgr, fg5gkgr, grvgf, grg5vgf, grkgggf, fggkggr @ <>= pure function pot_grf (g, gravbar, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vectorspinor) :: gamma_psi gamma_psi%psi(1)%a(1) = psi%a(3) gamma_psi%psi(1)%a(2) = psi%a(4) gamma_psi%psi(1)%a(3) = psi%a(1) gamma_psi%psi(1)%a(4) = psi%a(2) gamma_psi%psi(2)%a(1) = psi%a(4) gamma_psi%psi(2)%a(2) = psi%a(3) gamma_psi%psi(2)%a(3) = - psi%a(2) gamma_psi%psi(2)%a(4) = - psi%a(1) gamma_psi%psi(3)%a(1) = (0,-1) * psi%a(4) gamma_psi%psi(3)%a(2) = (0,1) * psi%a(3) gamma_psi%psi(3)%a(3) = (0,1) * psi%a(2) gamma_psi%psi(3)%a(4) = (0,-1) * psi%a(1) gamma_psi%psi(4)%a(1) = psi%a(3) gamma_psi%psi(4)%a(2) = - psi%a(4) gamma_psi%psi(4)%a(3) = - psi%a(1) gamma_psi%psi(4)%a(4) = psi%a(2) j = g * (gravbar * gamma_psi) end function pot_grf @ <>= pure function pot_fgr (g, psibar, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(bispinor) :: gamma_grav gamma_grav%a(1) = grav%psi(1)%a(3) - grav%psi(2)%a(4) + & ((0,1)*grav%psi(3)%a(4)) - grav%psi(4)%a(3) gamma_grav%a(2) = grav%psi(1)%a(4) - grav%psi(2)%a(3) - & ((0,1)*grav%psi(3)%a(3)) + grav%psi(4)%a(4) gamma_grav%a(3) = grav%psi(1)%a(1) + grav%psi(2)%a(2) - & ((0,1)*grav%psi(3)%a(2)) + grav%psi(4)%a(1) gamma_grav%a(4) = grav%psi(1)%a(2) + grav%psi(2)%a(1) + & ((0,1)*grav%psi(3)%a(1)) - grav%psi(4)%a(2) j = g * (psibar * gamma_grav) end function pot_fgr @ <>= pure function grvgf (gravbar, psi, k) result (j) complex(kind=default) :: j complex(kind=default) :: kp, km, k12, k12s type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vector), intent(in) :: k type(vectorspinor) :: kg_psi kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) !!! Since we are taking the spinor product here, NO explicit !!! charge conjugation matrix is needed! kg_psi%psi(1)%a(1) = km * psi%a(1) - k12s * psi%a(2) kg_psi%psi(1)%a(2) = (-k12) * psi%a(1) + kp * psi%a(2) kg_psi%psi(1)%a(3) = kp * psi%a(3) + k12s * psi%a(4) kg_psi%psi(1)%a(4) = k12 * psi%a(3) + km * psi%a(4) kg_psi%psi(2)%a(1) = k12s * psi%a(1) - km * psi%a(2) kg_psi%psi(2)%a(2) = (-kp) * psi%a(1) + k12 * psi%a(2) kg_psi%psi(2)%a(3) = k12s * psi%a(3) + kp * psi%a(4) kg_psi%psi(2)%a(4) = km * psi%a(3) + k12 * psi%a(4) kg_psi%psi(3)%a(1) = (0,1) * (k12s * psi%a(1) + km * psi%a(2)) kg_psi%psi(3)%a(2) = (0,1) * (- kp * psi%a(1) - k12 * psi%a(2)) kg_psi%psi(3)%a(3) = (0,1) * (k12s * psi%a(3) - kp * psi%a(4)) kg_psi%psi(3)%a(4) = (0,1) * (km * psi%a(3) - k12 * psi%a(4)) kg_psi%psi(4)%a(1) = (-km) * psi%a(1) - k12s * psi%a(2) kg_psi%psi(4)%a(2) = k12 * psi%a(1) + kp * psi%a(2) kg_psi%psi(4)%a(3) = kp * psi%a(3) - k12s * psi%a(4) kg_psi%psi(4)%a(4) = k12 * psi%a(3) - km * psi%a(4) j = gravbar * kg_psi end function grvgf @ <>= pure function grg5vgf (gravbar, psi, k) result (j) complex(kind=default) :: j type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vector), intent(in) :: k type(bispinor) :: g5_psi g5_psi%a(1:2) = - psi%a(1:2) g5_psi%a(3:4) = psi%a(3:4) j = grvgf (gravbar, g5_psi, k) end function grg5vgf @ <>= pure function s_grf (g, gravbar, psi, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k type(vector) :: vk vk = k j = g * grvgf (gravbar, psi, vk) end function s_grf @ <>= pure function sl_grf (gl, gravbar, psi, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_l type(momentum), intent(in) :: k psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 j = s_grf (gl, gravbar, psi_l, k) end function sl_grf @ <>= pure function sr_grf (gr, gravbar, psi, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gr type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_r type(momentum), intent(in) :: k psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) j = s_grf (gr, gravbar, psi_r, k) end function sr_grf @ <>= pure function slr_grf (gl, gr, gravbar, psi, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k j = sl_grf (gl, gravbar, psi, k) + sr_grf (gr, gravbar, psi, k) end function slr_grf @ <>= pure function fgkgr (psibar, grav, k) result (j) complex(kind=default) :: j complex(kind=default) :: kp, km, k12, k12s type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: k type(bispinor) :: gk_grav kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) !!! Since we are taking the spinor product here, NO explicit !!! charge conjugation matrix is needed! gk_grav%a(1) = kp * grav%psi(1)%a(1) + k12s * grav%psi(1)%a(2) & - k12 * grav%psi(2)%a(1) - km * grav%psi(2)%a(2) & + (0,1) * k12 * grav%psi(3)%a(1) & + (0,1) * km * grav%psi(3)%a(2) & - kp * grav%psi(4)%a(1) - k12s * grav%psi(4)%a(2) gk_grav%a(2) = k12 * grav%psi(1)%a(1) + km * grav%psi(1)%a(2) & - kp * grav%psi(2)%a(1) - k12s * grav%psi(2)%a(2) & - (0,1) * kp * grav%psi(3)%a(1) & - (0,1) * k12s * grav%psi(3)%a(2) & + k12 * grav%psi(4)%a(1) + km * grav%psi(4)%a(2) gk_grav%a(3) = km * grav%psi(1)%a(3) - k12s * grav%psi(1)%a(4) & - k12 * grav%psi(2)%a(3) + kp * grav%psi(2)%a(4) & + (0,1) * k12 * grav%psi(3)%a(3) & - (0,1) * kp * grav%psi(3)%a(4) & + km * grav%psi(4)%a(3) - k12s * grav%psi(4)%a(4) gk_grav%a(4) = - k12 * grav%psi(1)%a(3) + kp * grav%psi(1)%a(4) & + km * grav%psi(2)%a(3) - k12s * grav%psi(2)%a(4) & + (0,1) * km * grav%psi(3)%a(3) & - (0,1) * k12s * grav%psi(3)%a(4) & + k12 * grav%psi(4)%a(3) - kp * grav%psi(4)%a(4) j = psibar * gk_grav end function fgkgr @ <>= pure function fg5gkgr (psibar, grav, k) result (j) complex(kind=default) :: j type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: k type(bispinor) :: psibar_g5 psibar_g5%a(1:2) = - psibar%a(1:2) psibar_g5%a(3:4) = psibar%a(3:4) j = fgkgr (psibar_g5, grav, k) end function fg5gkgr @ <>= pure function s_fgr (g, psibar, grav, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(momentum), intent(in) :: k type(vector) :: vk vk = k j = g * fgkgr (psibar, grav, vk) end function s_fgr @ <>= pure function sl_fgr (gl, psibar, grav, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_l type(vectorspinor), intent(in) :: grav type(momentum), intent(in) :: k psibar_l%a(1:2) = psibar%a(1:2) psibar_l%a(3:4) = 0 j = s_fgr (gl, psibar_l, grav, k) end function sl_fgr @ <>= pure function sr_fgr (gr, psibar, grav, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gr type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_r type(vectorspinor), intent(in) :: grav type(momentum), intent(in) :: k psibar_r%a(1:2) = 0 psibar_r%a(3:4) = psibar%a(3:4) j = s_fgr (gr, psibar_r, grav, k) end function sr_fgr @ @ <>= pure function slr_fgr (gl, gr, psibar, grav, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(momentum), intent(in) :: k j = sl_fgr (gl, psibar, grav, k) + sr_fgr (gr, psibar, grav, k) end function slr_fgr @ <>= pure function p_grf (g, gravbar, psi, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k type(vector) :: vk vk = k j = g * grg5vgf (gravbar, psi, vk) end function p_grf @ <>= pure function p_fgr (g, psibar, grav, k) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(momentum), intent(in) :: k type(vector) :: vk vk = k j = g * fg5gkgr (psibar, grav, vk) end function p_fgr @ <>= public :: f_potgr, f_sgr, f_pgr, f_vgr, f_vlrgr, f_slgr, f_srgr, f_slrgr @ <>= pure function f_potgr (g, phi, psi) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(vectorspinor), intent(in) :: psi phipsi%a(1) = (g * phi) * (psi%psi(1)%a(3) - psi%psi(2)%a(4) + & ((0,1)*psi%psi(3)%a(4)) - psi%psi(4)%a(3)) phipsi%a(2) = (g * phi) * (psi%psi(1)%a(4) - psi%psi(2)%a(3) - & ((0,1)*psi%psi(3)%a(3)) + psi%psi(4)%a(4)) phipsi%a(3) = (g * phi) * (psi%psi(1)%a(1) + psi%psi(2)%a(2) - & ((0,1)*psi%psi(3)%a(2)) + psi%psi(4)%a(1)) phipsi%a(4) = (g * phi) * (psi%psi(1)%a(2) + psi%psi(2)%a(1) + & ((0,1)*psi%psi(3)%a(1)) - psi%psi(4)%a(2)) end function f_potgr @ The slashed notation: \begin{equation} \fmslash{k} = \begin{pmatrix} 0 & 0 & k_- & - k^* \\ 0 & 0 & - k & k_+ \\ k_+ & k^* & 0 & 0 \\ k & k_- & 0 & 0 \end{pmatrix} , \qquad \fmslash{k}\gamma_5 = \begin{pmatrix} 0 & 0 & k_- & - k^* \\ 0 & 0 & - k & k_+ \\ - k_+ & - k^* & 0 & 0 \\ - k & - k_- & 0 & 0 \end{pmatrix} \end{equation} with $k_\pm=k_0\pm k_3$, $k=k_1+\ii k_2$, $k^*=k_1-\ii k_2$. But note that~$\cdot^*$ is \emph{not} complex conjugation for complex~$k_\mu$. \begin{subequations} \begin{alignat}{2} \gamma^0 \fmslash{k} &= \begin{pmatrix} k_+ & k^* & 0 & 0 \\ k & k_- & 0 & 0 \\ 0 & 0 & k_- & - k^* \\ 0 & 0 & - k & k_+ \end{pmatrix} , & \qquad \gamma^0 \fmslash{k} \gamma^5 & = \begin{pmatrix} - k_+ & - k^* & 0 & 0 \\ - k & - k_- & 0 & 0 \\ 0 & 0 & k_- & - k^* \\ 0 & 0 & - k & k_+ \end{pmatrix} \\ \gamma^1 \fmslash{k} &= \begin{pmatrix} k & k_- & 0 & 0 \\ k_+ & k^* & 0 & 0 \\ 0 & 0 & k & - k_+ \\ 0 & 0 & - k_- & k^* \end{pmatrix}, & \qquad \gamma^1 \fmslash{k} \gamma^5 & = \begin{pmatrix} - k & - k_- & 0 & 0 \\ - k_+ & - k^* & 0 & 0 \\ 0 & 0 & k & - k_+ \\ 0 & 0 & - k_- & k^* \end{pmatrix} \\ \gamma^2 \fmslash{k} &= \begin{pmatrix} - \ii k & - \ii k_- & 0 & 0 \\ \ii k_+ & \ii k^* & 0 & 0 \\ 0 & 0 & - \ii k & \ii k_+ \\ 0 & 0 & - \ii k_- & \ii k^* \end{pmatrix}, & \qquad \gamma^2 \fmslash{k} \gamma^5 & = \begin{pmatrix} \ii k & \ii k_- & 0 & 0 \\ - \ii k_+ & - \ii k^* & 0 & 0 \\ 0 & 0 & - \ii k & \ii k_+ \\ 0 & 0 & - \ii k_- & \ii k^* \end{pmatrix} \\ \gamma^3 \fmslash{k} &= \begin{pmatrix} k_+ & k^* & 0 & 0 \\ - k & - k_- & 0 & 0 \\ 0 & 0 & - k_- & k^* \\ 0 & 0 & - k & k_+ \end{pmatrix}, & \qquad \gamma^3 \fmslash{k} \gamma^5 & = \begin{pmatrix} - k_+ & - k^* & 0 & 0 \\ k & k_- & 0 & 0 \\ 0 & 0 & - k_- & k^* \\ 0 & 0 & - k & k_+ \end{pmatrix} \end{alignat} \end{subequations} and \begin{subequations} \begin{alignat}{2} \fmslash{k} \gamma^0&= \begin{pmatrix} k_- & - k^* & 0 & 0 \\ - k & k_+ & 0 & 0 \\ 0 & 0 & k_+ & k^* \\ 0 & 0 & k & k_- \end{pmatrix} , & \qquad \fmslash{k} \gamma^0 \gamma^5 & = \begin{pmatrix} - k_- & k^* & 0 & 0 \\ k & - k_+ & 0 & 0 \\ 0 & 0 & k_+ & k^* \\ 0 & 0 & k & k_- \end{pmatrix} \\ \fmslash{k} \gamma^1 &= \begin{pmatrix} k^* & - k_- & 0 & 0 \\ - k_+ & k & 0 & 0 \\ 0 & 0 & k^* & k_+ \\ 0 & 0 & k_- & k \end{pmatrix}, & \qquad \fmslash{k} \gamma^1 \gamma^5 & = \begin{pmatrix} - k^* & k_- & 0 & 0 \\ k_+ & - k & 0 & 0 \\ 0 & 0 & k^* & k_+ \\ 0 & 0 & k_- & k \end{pmatrix} \\ \fmslash{k} \gamma^2 &= \begin{pmatrix} \ii k^* & \ii k_- & 0 & 0 \\ - \ii k_+ & - \ii k & 0 & 0 \\ 0 & 0 & \ii k^* & - \ii k_+ \\ 0 & 0 & \ii k_- & - \ii k \end{pmatrix}, & \qquad \fmslash{k} \gamma^2 \gamma^5 & = \begin{pmatrix} - \ii k^* & - \ii k_- & 0 & 0 \\ \ii k_+ & \ii k & 0 & 0 \\ 0 & 0 & \ii k^* & - \ii k_+ \\ 0 & 0 & \ii k_- & - \ii k \end{pmatrix} \\ \fmslash{k} \gamma^3 &= \begin{pmatrix} - k_- & - k^* & 0 & 0 \\ k & k_+ & 0 & 0 \\ 0 & 0 & k_+ & - k^* \\ 0 & 0 & k & - k_- \end{pmatrix}, & \qquad \fmslash{k} \gamma^3 \gamma^5 & = \begin{pmatrix} k_- & k^* & 0 & 0 \\ - k & - k_+ & 0 & 0 \\ 0 & 0 & k_+ & - k^* \\ 0 & 0 & k & - k_- \end{pmatrix} \end{alignat} \end{subequations} and \begin{subequations} \begin{alignat}{2} C \gamma^0 \fmslash{k} &= \begin{pmatrix} k & k_- & 0 & 0 \\ - k_+ & - k^* & 0 & 0 \\ 0 & 0 & k & - k_+ \\ 0 & 0 & k_- & - k^* \end{pmatrix} , & \qquad C \gamma^0 \fmslash{k} \gamma^5 & = \begin{pmatrix} - k & - k_- & 0 & 0 \\ k_+ & k^* & 0 & 0 \\ 0 & 0 & k & - k_+ \\ 0 & 0 & k_- & - k^* \end{pmatrix} \\ C \gamma^1 \fmslash{k} &= \begin{pmatrix} k_+ & k^* & 0 & 0 \\ - k & - k_- & 0 & 0 \\ 0 & 0 & k_- & - k^* \\ 0 & 0 & k & - k_+ \end{pmatrix}, & \qquad C \gamma^1 \fmslash{k} \gamma^5 & = \begin{pmatrix} - k_+ & - k^* & 0 & 0 \\ k & k_- & 0 & 0 \\ 0 & 0 & k_- & - k^* \\ 0 & 0 & k & - k_+ \end{pmatrix} \\ C \gamma^2 \fmslash{k} &= \begin{pmatrix} \ii k_+ & \ii k^* & 0 & 0 \\ \ii k & \ii k_- & 0 & 0 \\ 0 & 0 & \ii k_- & - \ii k^* \\ 0 & 0 & - \ii k & \ii k_+ \end{pmatrix}, & \qquad C \gamma^2 \fmslash{k} \gamma^5 & = \begin{pmatrix} - \ii k_+ & - \ii k^* & 0 & 0 \\ - \ii k & - \ii k_- & 0 & 0 \\ 0 & 0 & \ii k_- & - \ii k^* \\ 0 & 0 & - \ii k & \ii k_+ \end{pmatrix} \\ C \gamma^3 \fmslash{k} &= \begin{pmatrix} - k & - k_- & 0 & 0 \\ - k_+ & - k^* & 0 & 0 \\ 0 & 0 & k & - k_+ \\ 0 & 0 & - k_- & k^* \end{pmatrix}, & \qquad C \gamma^3 \fmslash{k} \gamma^5 & = \begin{pmatrix} k & k_- & 0 & 0 \\ k_+ & k^* & 0 & 0 \\ 0 & 0 & k & - k_+ \\ 0 & 0 & - k_- & k^* \end{pmatrix} \end{alignat} \end{subequations} and \begin{subequations} \begin{alignat}{2} C \fmslash{k} \gamma^0&= \begin{pmatrix} - k & k^+ & 0 & 0 \\ - k_- & k^* & 0 & 0 \\ 0 & 0 & - k & - k_- \\ 0 & 0 & k_+ & k^* \end{pmatrix} , & \qquad C \fmslash{k} \gamma^0 \gamma^5 & = \begin{pmatrix} k & - k_+ & 0 & 0 \\ k_- & - k^* & 0 & 0 \\ 0 & 0 & - k & - k_- \\ 0 & 0 & k_+ & k^* \end{pmatrix} \\ C \fmslash{k} \gamma^1 &= \begin{pmatrix} - k_+ & k & 0 & 0 \\ - k^* & k_- & 0 & 0 \\ 0 & 0 & - k_- & - k \\ 0 & 0 & k^* & k_+ \end{pmatrix}, & \qquad C \fmslash{k} \gamma^1 \gamma^5 & = \begin{pmatrix} k_+ & - k & 0 & 0 \\ k^* & - k_- & 0 & 0 \\ 0 & 0 & - k_- & - k \\ 0 & 0 & k^* & k_+ \end{pmatrix} \\ C \fmslash{k} \gamma^2 &= \begin{pmatrix} - \ii k_+ & - \ii k & 0 & 0 \\ - \ii k^* & - \ii k_- & 0 & 0 \\ 0 & 0 & - \ii k_- & \ii k \\ 0 & 0 & \ii k^* & - \ii k_+ \end{pmatrix}, & \qquad C \fmslash{k} \gamma^2 \gamma^5 & = \begin{pmatrix} \ii k_+ & \ii k & 0 & 0 \\ \ii k^* & \ii k_- & 0 & 0 \\ 0 & 0 & - \ii k_- & \ii k \\ 0 & 0 & \ii k^* & - \ii k_+ \end{pmatrix} \\ C \fmslash{k} \gamma^3 &= \begin{pmatrix} k & k_+ & 0 & 0 \\ k_- & k^* & 0 & 0 \\ 0 & 0 & - k & k_- \\ 0 & 0 & k_+ & - k^* \end{pmatrix}, & \qquad C \fmslash{k} \gamma^3 \gamma^5 & = \begin{pmatrix} - k & - k_+ & 0 & 0 \\ - k_- & - k^* & 0 & 0 \\ 0 & 0 & - k & k_- \\ 0 & 0 & k_+ & - k^* \end{pmatrix} \end{alignat} \end{subequations} <>= pure function fgvgr (psi, k) result (kpsi) type(bispinor) :: kpsi complex(kind=default) :: kp, km, k12, k12s type(vector), intent(in) :: k type(vectorspinor), intent(in) :: psi kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) kpsi%a(1) = kp * psi%psi(1)%a(1) + k12s * psi%psi(1)%a(2) & - k12 * psi%psi(2)%a(1) - km * psi%psi(2)%a(2) & + (0,1) * k12 * psi%psi(3)%a(1) + (0,1) * km * psi%psi(3)%a(2) & - kp * psi%psi(4)%a(1) - k12s * psi%psi(4)%a(2) kpsi%a(2) = k12 * psi%psi(1)%a(1) + km * psi%psi(1)%a(2) & - kp * psi%psi(2)%a(1) - k12s * psi%psi(2)%a(2) & - (0,1) * kp * psi%psi(3)%a(1) - (0,1) * k12s * psi%psi(3)%a(2) & + k12 * psi%psi(4)%a(1) + km * psi%psi(4)%a(2) kpsi%a(3) = km * psi%psi(1)%a(3) - k12s * psi%psi(1)%a(4) & - k12 * psi%psi(2)%a(3) + kp * psi%psi(2)%a(4) & + (0,1) * k12 * psi%psi(3)%a(3) - (0,1) * kp * psi%psi(3)%a(4) & + km * psi%psi(4)%a(3) - k12s * psi%psi(4)%a(4) kpsi%a(4) = - k12 * psi%psi(1)%a(3) + kp * psi%psi(1)%a(4) & + km * psi%psi(2)%a(3) - k12s * psi%psi(2)%a(4) & + (0,1) * km * psi%psi(3)%a(3) - (0,1) * k12s * psi%psi(3)%a(4) & + k12 * psi%psi(4)%a(3) - kp * psi%psi(4)%a(4) end function fgvgr @ <>= pure function f_sgr (g, phi, psi, k) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(momentum), intent(in) :: k type(vectorspinor), intent(in) :: psi type(vector) :: vk vk = k phipsi = (g * phi) * fgvgr (psi, vk) end function f_sgr @ <>= pure function f_slgr (gl, phi, psi, k) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gl complex(kind=default), intent(in) :: phi type(momentum), intent(in) :: k type(vectorspinor), intent(in) :: psi phipsi = f_sgr (gl, phi, psi, k) phipsi%a(3:4) = 0 end function f_slgr @ <>= pure function f_srgr (gr, phi, psi, k) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: gr complex(kind=default), intent(in) :: phi type(momentum), intent(in) :: k type(vectorspinor), intent(in) :: psi phipsi = f_sgr (gr, phi, psi, k) phipsi%a(1:2) = 0 end function f_srgr @ <>= pure function f_slrgr (gl, gr, phi, psi, k) result (phipsi) type(bispinor) :: phipsi, phipsi_l, phipsi_r complex(kind=default), intent(in) :: gl, gr complex(kind=default), intent(in) :: phi type(momentum), intent(in) :: k type(vectorspinor), intent(in) :: psi phipsi_l = f_slgr (gl, phi, psi, k) phipsi_r = f_srgr (gr, phi, psi, k) phipsi%a(1:2) = phipsi_l%a(1:2) phipsi%a(3:4) = phipsi_r%a(3:4) end function f_slrgr @ <>= pure function fgvg5gr (psi, k) result (kpsi) type(bispinor) :: kpsi type(vector), intent(in) :: k type(vectorspinor), intent(in) :: psi type(bispinor) :: kpsi_dum kpsi_dum = fgvgr (psi, k) kpsi%a(1:2) = - kpsi_dum%a(1:2) kpsi%a(3:4) = kpsi_dum%a(3:4) end function fgvg5gr @ <>= pure function f_pgr (g, phi, psi, k) result (phipsi) type(bispinor) :: phipsi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(momentum), intent(in) :: k type(vectorspinor), intent(in) :: psi type(vector) :: vk vk = k phipsi = (g * phi) * fgvg5gr (psi, vk) end function f_pgr @ The needed construction of gamma matrices involving the commutator of two gamma matrices. For the slashed terms we use as usual the abbreviations $k_\pm=k_0\pm k_3$, $k=k_1+\ii k_2$, $k^*=k_1-\ii k_2$ and analogous expressions for the vector $v^\mu$. We remind you that~$\cdot^*$ is \emph{not} complex conjugation for complex~$k_\mu$. Furthermore we introduce (in what follows the brackets around the vector indices have the usual meaning of antisymmetrizing with respect to the indices inside the brackets, here without a factor two in the denominator) \begin{subequations} \begin{alignat}{2} a_+ &= \; k_+ v_- + k v^* - k_- v_+ - k^* v & \; = & \; 2 (k_{[3} v_{0]} + \ii k_{[2} v_{1]}) \\ a_- &= \; k_- v_+ + k v^* - k_+ v_- - k^* v & \; = & \; 2 (-k_{[3} v_{0]} + \ii k_{[2} v_{1]}) \\ b_+ &= \; 2 (k_+ v - k v_+) & \; = & \; 2 (k_{[0} v_{1]} + k_{[3} v_{1]} + \ii k_{[0} v_{2]} + \ii k_{[3} v_{2]}) \\ b_- &= \; 2 (k_- v - k v_-) & \; = & \; 2 (k_{[0} v_{1]} - k_{[3} v_{1]} + \ii k_{[0} v_{2]} - \ii k_{[3} v_{2]}) \\ b_{+*} &= \; 2 (k_+ v^* - k^* v_+) & \; = & \; 2 (k_{[0} v_{1]} + k_{[3} v_{1]} - \ii k_{[0} v_{2]} - \ii k_{[3} v_{2]}) \\ b_{-*} &= \; 2 (k_- v^* - k^* v_-) & \; = & \; 2 (k_{[0} v_{1]} - k_{[3} v_{1]} - \ii k_{[0} v_{2]} + \ii k_{[3} v_{2]}) \end{alignat} \end{subequations} Of course, one could introduce a more advanced notation, but we don't want to become confused. \begin{subequations} \begin{align} \lbrack \fmslash{k} , \gamma^0 \rbrack &= \begin{pmatrix} -2k_3 & -2 k^* & 0 & 0 \\ -2k & 2k_3 & 0 & 0 \\ 0 & 0 & 2k_3 & 2k^* \\ 0 & 0 & 2k & -2k_3 \end{pmatrix} \\ \lbrack \fmslash{k} , \gamma^1 \rbrack &= \begin{pmatrix} -2\ii k_2 & -2k_- & 0 & 0 \\ -2k_+ & 2\ii k_2 & 0 & 0 \\ 0 & 0 & -2\ii k_2 & 2k_+ \\ 0 & 0 & 2k_- & 2\ii k_2 \end{pmatrix} \\ \lbrack \fmslash{k} , \gamma^2 \rbrack &= \begin{pmatrix} 2\ii k_1 & 2\ii k_- & 0 & 0 \\ -2\ii k_+ & -2\ii k_1 & 0 & 0 \\ 0 & 0 & 2\ii k_1 & -2\ii k_+ \\ 0 & 0 & 2\ii k_- & -2\ii k_1 \end{pmatrix} \\ \lbrack \fmslash{k} , \gamma^3 \rbrack &= \begin{pmatrix} -2k_0 & -2k^* & 0 & 0 \\ 2k & 2k_0 & 0 & 0 \\ 0 & 0 & 2k_0 & -2k^* \\ 0 & 0 & 2k & -2k_0 \end{pmatrix} \\ \lbrack \fmslash{k} , \fmslash{V} \rbrack &= \begin{pmatrix} a_- & b_{-*} & 0 & 0 \\ b_+ & -a_- & 0 & 0 \\ 0 & 0 & a_+ & -b_{+*} \\ 0 & 0 & -b_- & -a_+ \end{pmatrix} \\ \gamma^5\gamma^0 \lbrack \fmslash{k} , \fmslash{V} \rbrack &= \begin{pmatrix} 0 & 0 & - a_+ & b_{+*} \\ 0 & 0 & b_- & a_+ \\ a_- & b_{-*} & 0 & 0 \\ b_+ & - a_- & 0 & 0 \end{pmatrix} \\ \gamma^5\gamma^1 \lbrack \fmslash{k} , \fmslash{V} \rbrack &= \begin{pmatrix} 0 & 0 & b_- & a_+ \\ 0 & 0 & -a_+ & b_{+*} \\ -b_+ & a_- & 0 & 0 & \\ -a_- & -b_{-*} & 0 & 0 \end{pmatrix} \\ \gamma^5\gamma^2 \lbrack \fmslash{k} , \fmslash{V} \rbrack &= \begin{pmatrix} 0 & 0 & -\ii b_- & -\ii a_+ \\ 0 & 0 & -\ii a_+ & \ii b_{+*} \\ \ii b_+ & -\ii a_- & 0 & 0 \\ -\ii a_- & -\ii b_{-*} & 0 & 0 \end{pmatrix} \\ \gamma^5\gamma^3 \lbrack \fmslash{k} , \fmslash{V} \rbrack &= \begin{pmatrix} 0 & 0 & -a_+ & b_{+*} \\ 0 & 0 & -b_- & -a_+ \\ -a_- & -b_{-*} & 0 & 0 \\ b_+ & -a_- & 0 & 0 \end{pmatrix} \end{align} \end{subequations} and \begin{subequations} \begin{align} \lbrack \fmslash{k} , \fmslash{V} \rbrack \gamma^0 \gamma^5 &= \begin{pmatrix} 0 & 0 & a_- & b_{-*} \\ 0 & 0 & b_+ & -a_- \\ -a_+ & b_{+*} & 0 & 0 \\ b_- & a_+ & 0 & 0 \end{pmatrix} \\ \lbrack \fmslash{k} , \fmslash{V} \rbrack \gamma^1 \gamma^5 &= \begin{pmatrix} 0 & 0 & b_{-*} & a_- \\ 0 & 0 & -a_- & b_+ \\ -b_{+*} & a_+ & 0 & 0 \\ -a_+ & -b_- & 0 & 0 \end{pmatrix} \\ \lbrack \fmslash{k} , \fmslash{V} \rbrack \gamma^2 \gamma^5 &= \begin{pmatrix} 0 & 0 & \ii b_{-*} & -\ii a_- \\ 0 & 0 & -\ii a_- & -\ii b_+ \\ -\ii b_{+*} & -\ii a_+ & 0 & 0 \\ -\ii a_+ & \ii b_- & 0 & 0 \end{pmatrix} \\ \lbrack \fmslash{k} , \fmslash{V} \rbrack \gamma^3 \gamma^5 &= \begin{pmatrix} 0 & 0 & a_- & - b_{-*} \\ 0 & 0 & b_+ & a_- \\ a_+ & b_{+*} & 0 & 0 \\ -b_- & a_+ & 0 & 0 \end{pmatrix} \end{align} \end{subequations} In what follows $l$ always means twice the value of $k$, e.g. $l_+$ = $2 k_+$. We use the abbreviation $C^{\mu\nu} \equiv C \lbrack \fmslash{k}, \gamma^\mu \rbrack \gamma^\nu \gamma^5$. \begin{subequations} \begin{alignat}{2} C^{00} &= \begin{pmatrix} 0 & 0 & -l & -l_3 \\ 0 & 0 & l_3 & l^* \\ l & -l_3 & 0 & 0 \\ -l_3 & -l^* & 0 & 0 \end{pmatrix} , & \qquad C^{20} &= \begin{pmatrix} 0 & 0 & -\ii l_+ & -\ii l_1 \\ 0 & 0 & -\ii l_1 & -\ii l_- \\ \ii l_- & -\ii l_1 & 0 & 0 \\ -\ii l_1 & \ii l_+ & 0 & 0 \end{pmatrix} \\ C^{01} &= \begin{pmatrix} 0 & 0 & l_3 & -l \\ 0 & 0 & l^* & l_3 \\ l_3 & -l & 0 & 0 \\ l^* & l_3 & 0 & 0 \end{pmatrix} , & \qquad C^{21} &= \begin{pmatrix} 0 & 0 & -\ii l_1 & -\ii l_+ \\ 0 & 0 & -\ii l_- & -\ii l_1 \\ \ii l_1 & -\ii l_- & 0 & 0 \\ -\ii l_+ & \ii l_1 & 0 & 0 \end{pmatrix} \\ C^{02} &= \begin{pmatrix} 0 & 0 & \ii l_3 & \ii l \\ 0 & 0 & \ii l^* & -\ii l_3 \\ \ii l_3 & \ii l & 0 & 0 \\ \ii l^* & -\ii l_3 & 0 & 0 \end{pmatrix} , & \qquad C^{22} &= \begin{pmatrix} 0 & 0 & l_1 & -l_+ \\ 0 & 0 & l_- & -l_1 \\ -l_1 & -l_- & 0 & 0 \\ l_+ & l_1 & 0 & 0 \end{pmatrix} \\ C^{03} &= \begin{pmatrix} 0 & 0 & -l & -l_3 \\ 0 & 0 & l_3 & -l^* \\ -l & -l_3 & 0 & 0 \\ l_3 & -l^* & 0 & 0 \end{pmatrix} , & \qquad C^{23} &= \begin{pmatrix} 0 & 0 & -\ii l_+ & \ii l_1 \\ 0 & 0 & -\ii l_1 & \ii l_- \\ -\ii l_- & -\ii l_1 & 0 & 0 \\ \ii l_1 & \ii l_+ & 0 & 0 \end{pmatrix} \\ C^{10} &= \begin{pmatrix} 0 & 0 & -l_+ & \ii l_2 \\ 0 & 0 & \ii l_2 & l_- \\ l_- & \ii l_2 & 0 & 0 \\ \ii l_2 & -l_+ & 0 & 0 \end{pmatrix} , & \qquad C^{30} &= \begin{pmatrix} 0 & 0 & l & l_0 \\ 0 & 0 & l_0 & l^* \\ l & -l_0 & 0 & 0 \\ -l_0 & l^* & 0 & 0 \end{pmatrix} \\ C^{11} &= \begin{pmatrix} 0 & 0 & \ii l_2 & -l_+ \\ 0 & 0 & l_- & \ii l_2 \\ -\ii l_2 & -l_- & 0 & 0 \\ l_+ & -\ii l_2 & 0 & 0 \end{pmatrix} , & \qquad C^{31} &= \begin{pmatrix} 0 & 0 & l_0 & l \\ 0 & 0 & l^* & l_0 \\ l_0 & -l & 0 & 0 \\ -l^* & l_0 & 0 & 0 \end{pmatrix} \\ C^{12} &= \begin{pmatrix} 0 & 0 & -l_2 & \ii l_+ \\ 0 & 0 & \ii l_- & l_2 \\ l_2 & \ii l_- & 0 & 0 \\ \ii l_+ & -l_2 & 0 & 0 \end{pmatrix} , & \qquad C^{32} &= \begin{pmatrix} 0 & 0 & \ii l_0 & -\ii l \\ 0 & 0 & \ii l^* & -\ii l_0 \\ \ii l_0 & \ii l & 0 & 0 \\ -\ii l^* & -\ii l_0 & 0 & 0 \end{pmatrix} \\ C^{13} &= \begin{pmatrix} 0 & 0 & -l_+ & -\ii l_2 \\ 0 & 0 & \ii l_2 & - l_- \\ -l_- & \ii l_2 & 0 & 0 \\ -\ii l_2 & -l_+ & 0 & 0 \end{pmatrix} , & \qquad C^{33} &= \begin{pmatrix} 0 & 0 & l & -l_0 \\ 0 & 0 & l_0 & -l^* \\ -l & -l_0 & 0 & 0 \\ l_0 & l^* & 0 & 0 \end{pmatrix} \end{alignat} \end{subequations} and, with the abbreviation $\tilde{C}^{\mu\nu} \equiv C \gamma^5 \gamma^\nu \lbrack \fmslash{k} , \gamma^\mu \rbrack$ (note the reversed order of the indices!) \begin{subequations} \begin{alignat}{2} \tilde{C}^{00} &= \begin{pmatrix} 0 & 0 & -l & l_3 \\ 0 & 0 & l_3 & l^* \\ l & -l_3 & 0 & 0 \\ -l_3 & -l^* & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{20} &= \begin{pmatrix} 0 & 0 & -\ii l_- & \ii l_1 \\ 0 & 0 & \ii l_1 & -\ii l_+ \\ \ii l_+ & \ii l_1 & 0 & 0 \\ \ii l_1 & \ii l_- & 0 & 0 \end{pmatrix} \\ \tilde{C}^{01} &= \begin{pmatrix} 0 & 0 & -l_3 & -l^* \\ 0 & 0 & l & -l_3 \\ -l_3 & -l^* & 0 & 0 \\ l & -l_3 & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{21} &= \begin{pmatrix} 0 & 0 & -\ii l_1 & \ii l_+ \\ 0 & 0 & \ii l_- & -\ii l_1 \\ \ii l_1 & \ii l_- & 0 & 0 \\ \ii l_+ & \ii l_1 & 0 & 0 \end{pmatrix} \\ \tilde{C}^{02} &= \begin{pmatrix} 0 & 0 & -\ii l_3 & -\ii l^* \\ 0 & 0 & -\ii l & \ii l_3 \\ -\ii l_3 & -\ii l^* & 0 & 0 \\ -\ii l & \ii l_3 & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{22} &= \begin{pmatrix} 0 & 0 & l_1 & -l_+ \\ 0 & 0 & l_- & -l_1 \\ -l_1 & -l_- & 0 & 0 \\ l_+ & l_1 & 0 & 0 \end{pmatrix} \\ \tilde{C}^{03} &= \begin{pmatrix} 0 & 0 & l & -l_3 \\ 0 & 0 & l_3 & l^* \\ l & -l_3 & 0 & 0 \\ l_3 & l^* & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{23} &= \begin{pmatrix} 0 & 0 & \ii l_- & -\ii l_1 \\ 0 & 0 & \ii l_1 & -\ii l_+ \\ \ii l_+ & \ii l_1 & 0 & 0 \\ -\ii l_1 & -\ii l_- & 0 & 0 \end{pmatrix} \\ \tilde{C}^{10} &= \begin{pmatrix} 0 & 0 & -l_- & -\ii l_2 \\ 0 & 0 & -\ii l_2 & l_+ \\ l_+ & -\ii l_2 & 0 & 0 \\ -\ii l_2 & -l_- & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{30} &= \begin{pmatrix} 0 & 0 & -l & l_0 \\ 0 & 0 & l_0 & -l^* \\ -l & -l_0 & 0 & 0 \\ -l_0 & -l^* & 0 & 0 \end{pmatrix} \\ \tilde{C}^{11} &= \begin{pmatrix} 0 & 0 & \ii l_2 & -l_+ \\ 0 & 0 & l_- & \ii l_2 \\ -\ii l_2 & -l_- & 0 & 0 \\ l_+ & -\ii l_2 & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{31} &= \begin{pmatrix} 0 & 0 & -l_0 & l^* \\ 0 & 0 & l & -l_0 \\ -l_0 & -l^* & 0 & 0 \\ -l & -l_0 & 0 & 0 \end{pmatrix} \\ \tilde{C}^{12} &= \begin{pmatrix} 0 & 0 & -l_2 & -\ii l_+ \\ 0 & 0 & -\ii l_- & l_2 \\ l_2 & -\ii l_- & 0 & 0 \\ -\ii l_+ & -l_2 & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{32} &= \begin{pmatrix} 0 & 0 & -\ii l_0 & \ii l^* \\ 0 & 0 & -\ii l & \ii l_0 \\ -\ii l_0 & -\ii l^* & 0 & 0 \\ \ii l & \ii l_0 & 0 & 0 \end{pmatrix} \\ \tilde{C}^{13} &= \begin{pmatrix} 0 & 0 & l_- & \ii l_2 \\ 0 & 0 & -\ii l_2 & l_+ \\ l_+ & -\ii l_2 & 0 & 0 \\ \ii l_2 & l_- & 0 & 0 \end{pmatrix} , & \qquad \tilde{C}^{33} &= \begin{pmatrix} 0 & 0 & l & -l_0 \\ 0 & 0 & l_0 & -l^* \\ -l & -l_0 & 0 & 0 \\ l_0 & l^* & 0 & 0 \end{pmatrix} \end{alignat} \end{subequations} <>= pure function fggvvgr (v, psi, k) result (psikv) type(bispinor) :: psikv type(vectorspinor), intent(in) :: psi type(vector), intent(in) :: v, k complex(kind=default) :: kv30, kv21, kv01, kv31, kv02, kv32 complex(kind=default) :: ap, am, bp, bm, bps, bms kv30 = k%x(3) * v%t - k%t * v%x(3) kv21 = (0,1) * (k%x(2) * v%x(1) - k%x(1) * v%x(2)) kv01 = k%t * v%x(1) - k%x(1) * v%t kv31 = k%x(3) * v%x(1) - k%x(1) * v%x(3) kv02 = (0,1) * (k%t * v%x(2) - k%x(2) * v%t) kv32 = (0,1) * (k%x(3) * v%x(2) - k%x(2) * v%x(3)) ap = 2 * (kv30 + kv21) am = 2 * (-kv30 + kv21) bp = 2 * (kv01 + kv31 + kv02 + kv32) bm = 2 * (kv01 - kv31 + kv02 - kv32) bps = 2 * (kv01 + kv31 - kv02 - kv32) bms = 2 * (kv01 - kv31 - kv02 + kv32) psikv%a(1) = (-ap) * psi%psi(1)%a(3) + bps * psi%psi(1)%a(4) & + (-bm) * psi%psi(2)%a(3) + (-ap) * psi%psi(2)%a(4) & + (0,1) * (bm * psi%psi(3)%a(3) + ap * psi%psi(3)%a(4)) & + ap * psi%psi(4)%a(3) + (-bps) * psi%psi(4)%a(4) psikv%a(2) = bm * psi%psi(1)%a(3) + ap * psi%psi(1)%a(4) & + ap * psi%psi(2)%a(3) + (-bps) * psi%psi(2)%a(4) & + (0,1) * (ap * psi%psi(3)%a(3) - bps * psi%psi(3)%a(4)) & + bm * psi%psi(4)%a(3) + ap * psi%psi(4)%a(4) psikv%a(3) = am * psi%psi(1)%a(1) + bms * psi%psi(1)%a(2) & + bp * psi%psi(2)%a(1) + (-am) * psi%psi(2)%a(2) & + (0,-1) * (bp * psi%psi(3)%a(1) + (-am) * psi%psi(3)%a(2)) & + am * psi%psi(4)%a(1) + bms * psi%psi(4)%a(2) psikv%a(4) = bp * psi%psi(1)%a(1) + (-am) * psi%psi(1)%a(2) & + am * psi%psi(2)%a(1) + bms * psi%psi(2)%a(2) & + (0,1) * (am * psi%psi(3)%a(1) + bms * psi%psi(3)%a(2)) & + (-bp) * psi%psi(4)%a(1) + am * psi%psi(4)%a(2) end function fggvvgr @ <>= pure function f_vgr (g, v, psi, k) result (psikkkv) type(bispinor) :: psikkkv type(vectorspinor), intent(in) :: psi type(vector), intent(in) :: v type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g type(vector) :: vk vk = k psikkkv = g * (fggvvgr (v, psi, vk)) end function f_vgr @ <>= pure function f_vlrgr (gl, gr, v, psi, k) result (psikv) type(bispinor) :: psikv type(vectorspinor), intent(in) :: psi type(vector), intent(in) :: v type(momentum), intent(in) :: k complex(kind=default), intent(in) :: gl, gr type(vector) :: vk vk = k psikv = fggvvgr (v, psi, vk) psikv%a(1:2) = gl * psikv%a(1:2) psikv%a(3:4) = gr * psikv%a(3:4) end function f_vlrgr @ <>= public :: gr_potf, gr_sf, gr_pf, gr_vf, gr_vlrf, gr_slf, gr_srf, gr_slrf @ <>= pure function gr_potf (g, phi, psi) result (phipsi) type(vectorspinor) :: phipsi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi phipsi%psi(1)%a(1) = (g * phi) * psi%a(3) phipsi%psi(1)%a(2) = (g * phi) * psi%a(4) phipsi%psi(1)%a(3) = (g * phi) * psi%a(1) phipsi%psi(1)%a(4) = (g * phi) * psi%a(2) phipsi%psi(2)%a(1) = (g * phi) * psi%a(4) phipsi%psi(2)%a(2) = (g * phi) * psi%a(3) phipsi%psi(2)%a(3) = ((-g) * phi) * psi%a(2) phipsi%psi(2)%a(4) = ((-g) * phi) * psi%a(1) phipsi%psi(3)%a(1) = ((0,-1) * g * phi) * psi%a(4) phipsi%psi(3)%a(2) = ((0,1) * g * phi) * psi%a(3) phipsi%psi(3)%a(3) = ((0,1) * g * phi) * psi%a(2) phipsi%psi(3)%a(4) = ((0,-1) * g * phi) * psi%a(1) phipsi%psi(4)%a(1) = (g * phi) * psi%a(3) phipsi%psi(4)%a(2) = ((-g) * phi) * psi%a(4) phipsi%psi(4)%a(3) = ((-g) * phi) * psi%a(1) phipsi%psi(4)%a(4) = (g * phi) * psi%a(2) end function gr_potf @ <>= pure function grkgf (psi, k) result (kpsi) type(vectorspinor) :: kpsi complex(kind=default) :: kp, km, k12, k12s type(bispinor), intent(in) :: psi type(vector), intent(in) :: k kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) kpsi%psi(1)%a(1) = km * psi%a(1) - k12s * psi%a(2) kpsi%psi(1)%a(2) = (-k12) * psi%a(1) + kp * psi%a(2) kpsi%psi(1)%a(3) = kp * psi%a(3) + k12s * psi%a(4) kpsi%psi(1)%a(4) = k12 * psi%a(3) + km * psi%a(4) kpsi%psi(2)%a(1) = k12s * psi%a(1) - km * psi%a(2) kpsi%psi(2)%a(2) = (-kp) * psi%a(1) + k12 * psi%a(2) kpsi%psi(2)%a(3) = k12s * psi%a(3) + kp * psi%a(4) kpsi%psi(2)%a(4) = km * psi%a(3) + k12 * psi%a(4) kpsi%psi(3)%a(1) = (0,1) * (k12s * psi%a(1) + km * psi%a(2)) kpsi%psi(3)%a(2) = (0,-1) * (kp * psi%a(1) + k12 * psi%a(2)) kpsi%psi(3)%a(3) = (0,1) * (k12s * psi%a(3) - kp * psi%a(4)) kpsi%psi(3)%a(4) = (0,1) * (km * psi%a(3) - k12 * psi%a(4)) kpsi%psi(4)%a(1) = -(km * psi%a(1) + k12s * psi%a(2)) kpsi%psi(4)%a(2) = k12 * psi%a(1) + kp * psi%a(2) kpsi%psi(4)%a(3) = kp * psi%a(3) - k12s * psi%a(4) kpsi%psi(4)%a(4) = k12 * psi%a(3) - km * psi%a(4) end function grkgf @ <>= pure function gr_sf (g, phi, psi, k) result (phipsi) type(vectorspinor) :: phipsi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k type(vector) :: vk vk = k phipsi = (g * phi) * grkgf (psi, vk) end function gr_sf @ <>= pure function gr_slf (gl, phi, psi, k) result (phipsi) type(vectorspinor) :: phipsi complex(kind=default), intent(in) :: gl complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi type(bispinor) :: psi_l type(momentum), intent(in) :: k psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 phipsi = gr_sf (gl, phi, psi_l, k) end function gr_slf @ <>= pure function gr_srf (gr, phi, psi, k) result (phipsi) type(vectorspinor) :: phipsi complex(kind=default), intent(in) :: gr complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi type(bispinor) :: psi_r type(momentum), intent(in) :: k psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) phipsi = gr_sf (gr, phi, psi_r, k) end function gr_srf @ <>= pure function gr_slrf (gl, gr, phi, psi, k) result (phipsi) type(vectorspinor) :: phipsi complex(kind=default), intent(in) :: gl, gr complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k phipsi = gr_slf (gl, phi, psi, k) + gr_srf (gr, phi, psi, k) end function gr_slrf @ <>= pure function grkggf (psi, k) result (kpsi) type(vectorspinor) :: kpsi complex(kind=default) :: kp, km, k12, k12s type(bispinor), intent(in) :: psi type(vector), intent(in) :: k kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) kpsi%psi(1)%a(1) = (-km) * psi%a(1) + k12s * psi%a(2) kpsi%psi(1)%a(2) = k12 * psi%a(1) - kp * psi%a(2) kpsi%psi(1)%a(3) = kp * psi%a(3) + k12s * psi%a(4) kpsi%psi(1)%a(4) = k12 * psi%a(3) + km * psi%a(4) kpsi%psi(2)%a(1) = (-k12s) * psi%a(1) + km * psi%a(2) kpsi%psi(2)%a(2) = kp * psi%a(1) - k12 * psi%a(2) kpsi%psi(2)%a(3) = k12s * psi%a(3) + kp * psi%a(4) kpsi%psi(2)%a(4) = km * psi%a(3) + k12 * psi%a(4) kpsi%psi(3)%a(1) = (0,-1) * (k12s * psi%a(1) + km * psi%a(2)) kpsi%psi(3)%a(2) = (0,1) * (kp * psi%a(1) + k12 * psi%a(2)) kpsi%psi(3)%a(3) = (0,1) * (k12s * psi%a(3) - kp * psi%a(4)) kpsi%psi(3)%a(4) = (0,1) * (km * psi%a(3) - k12 * psi%a(4)) kpsi%psi(4)%a(1) = km * psi%a(1) + k12s * psi%a(2) kpsi%psi(4)%a(2) = -(k12 * psi%a(1) + kp * psi%a(2)) kpsi%psi(4)%a(3) = kp * psi%a(3) - k12s * psi%a(4) kpsi%psi(4)%a(4) = k12 * psi%a(3) - km * psi%a(4) end function grkggf @ <>= pure function gr_pf (g, phi, psi, k) result (phipsi) type(vectorspinor) :: phipsi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi type(bispinor), intent(in) :: psi type(momentum), intent(in) :: k type(vector) :: vk vk = k phipsi = (g * phi) * grkggf (psi, vk) end function gr_pf @ <>= pure function grkkggf (v, psi, k) result (psikv) type(vectorspinor) :: psikv type(bispinor), intent(in) :: psi type(vector), intent(in) :: v, k complex(kind=default) :: kv30, kv21, kv01, kv31, kv02, kv32 complex(kind=default) :: ap, am, bp, bm, bps, bms, imago imago = (0.0_default,1.0_default) kv30 = k%x(3) * v%t - k%t * v%x(3) kv21 = imago * (k%x(2) * v%x(1) - k%x(1) * v%x(2)) kv01 = k%t * v%x(1) - k%x(1) * v%t kv31 = k%x(3) * v%x(1) - k%x(1) * v%x(3) kv02 = imago * (k%t * v%x(2) - k%x(2) * v%t) kv32 = imago * (k%x(3) * v%x(2) - k%x(2) * v%x(3)) ap = 2 * (kv30 + kv21) am = 2 * ((-kv30) + kv21) bp = 2 * (kv01 + kv31 + kv02 + kv32) bm = 2 * (kv01 - kv31 + kv02 - kv32) bps = 2 * (kv01 + kv31 - kv02 - kv32) bms = 2 * (kv01 - kv31 - kv02 + kv32) psikv%psi(1)%a(1) = am * psi%a(3) + bms * psi%a(4) psikv%psi(1)%a(2) = bp * psi%a(3) + (-am) * psi%a(4) psikv%psi(1)%a(3) = (-ap) * psi%a(1) + bps * psi%a(2) psikv%psi(1)%a(4) = bm * psi%a(1) + ap * psi%a(2) psikv%psi(2)%a(1) = bms * psi%a(3) + am * psi%a(4) psikv%psi(2)%a(2) = (-am) * psi%a(3) + bp * psi%a(4) psikv%psi(2)%a(3) = (-bps) * psi%a(1) + ap * psi%a(2) psikv%psi(2)%a(4) = (-ap) * psi%a(1) + (-bm) * psi%a(2) psikv%psi(3)%a(1) = imago * (bms * psi%a(3) - am * psi%a(4)) psikv%psi(3)%a(2) = (-imago) * (am * psi%a(3) + bp * psi%a(4)) psikv%psi(3)%a(3) = (-imago) * (bps * psi%a(1) + ap * psi%a(2)) psikv%psi(3)%a(4) = imago * ((-ap) * psi%a(1) + bm * psi%a(2)) psikv%psi(4)%a(1) = am * psi%a(3) + (-bms) * psi%a(4) psikv%psi(4)%a(2) = bp * psi%a(3) + am * psi%a(4) psikv%psi(4)%a(3) = ap * psi%a(1) + bps * psi%a(2) psikv%psi(4)%a(4) = (-bm) * psi%a(1) + ap * psi%a(2) end function grkkggf @ <>= pure function gr_vf (g, v, psi, k) result (psikv) type(vectorspinor) :: psikv type(bispinor), intent(in) :: psi type(vector), intent(in) :: v type(momentum), intent(in) :: k complex(kind=default), intent(in) :: g type(vector) :: vk vk = k psikv = g * (grkkggf (v, psi, vk)) end function gr_vf @ <>= pure function gr_vlrf (gl, gr, v, psi, k) result (psikv) type(vectorspinor) :: psikv type(bispinor), intent(in) :: psi type(bispinor) :: psi_l, psi_r type(vector), intent(in) :: v type(momentum), intent(in) :: k complex(kind=default), intent(in) :: gl, gr type(vector) :: vk vk = k psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) psikv = gl * grkkggf (v, psi_l, vk) + gr * grkkggf (v, psi_r, vk) end function gr_vlrf @ <>= public :: v_grf, v_fgr @ <>= public :: vlr_grf, vlr_fgr @ $V^\mu = \psi_\rho^T C^{\mu\rho} \psi$ <>= pure function grkgggf (psil, psir, k) result (j) type(vector) :: j type(vectorspinor), intent(in) :: psil type(bispinor), intent(in) :: psir type(vector), intent(in) :: k type(vectorspinor) :: c_psir0, c_psir1, c_psir2, c_psir3 complex(kind=default) :: kp, km, k12, k12s, ik2 kp = k%t + k%x(3) km = k%t - k%x(3) k12 = (k%x(1) + (0,1)*k%x(2)) k12s = (k%x(1) - (0,1)*k%x(2)) ik2 = (0,1) * k%x(2) !!! New version: c_psir0%psi(1)%a(1) = (-k%x(3)) * psir%a(3) + (-k12s) * psir%a(4) c_psir0%psi(1)%a(2) = (-k12) * psir%a(3) + k%x(3) * psir%a(4) c_psir0%psi(1)%a(3) = (-k%x(3)) * psir%a(1) + (-k12s) * psir%a(2) c_psir0%psi(1)%a(4) = (-k12) * psir%a(1) + k%x(3) * psir%a(2) c_psir0%psi(2)%a(1) = (-k12s) * psir%a(3) + (-k%x(3)) * psir%a(4) c_psir0%psi(2)%a(2) = k%x(3) * psir%a(3) + (-k12) * psir%a(4) c_psir0%psi(2)%a(3) = k12s * psir%a(1) + k%x(3) * psir%a(2) c_psir0%psi(2)%a(4) = (-k%x(3)) * psir%a(1) + k12 * psir%a(2) c_psir0%psi(3)%a(1) = (0,1) * ((-k12s) * psir%a(3) + k%x(3) * psir%a(4)) c_psir0%psi(3)%a(2) = (0,1) * (k%x(3) * psir%a(3) + k12 * psir%a(4)) c_psir0%psi(3)%a(3) = (0,1) * (k12s * psir%a(1) + (-k%x(3)) * psir%a(2)) c_psir0%psi(3)%a(4) = (0,1) * ((-k%x(3)) * psir%a(1) + (-k12) * psir%a(2)) c_psir0%psi(4)%a(1) = (-k%x(3)) * psir%a(3) + k12s * psir%a(4) c_psir0%psi(4)%a(2) = (-k12) * psir%a(3) + (-k%x(3)) * psir%a(4) c_psir0%psi(4)%a(3) = k%x(3) * psir%a(1) + (-k12s) * psir%a(2) c_psir0%psi(4)%a(4) = k12 * psir%a(1) + k%x(3) * psir%a(2) !!! c_psir1%psi(1)%a(1) = (-ik2) * psir%a(3) + (-km) * psir%a(4) c_psir1%psi(1)%a(2) = (-kp) * psir%a(3) + ik2 * psir%a(4) c_psir1%psi(1)%a(3) = ik2 * psir%a(1) + (-kp) * psir%a(2) c_psir1%psi(1)%a(4) = (-km) * psir%a(1) + (-ik2) * psir%a(2) c_psir1%psi(2)%a(1) = (-km) * psir%a(3) + (-ik2) * psir%a(4) c_psir1%psi(2)%a(2) = ik2 * psir%a(3) + (-kp) * psir%a(4) c_psir1%psi(2)%a(3) = kp * psir%a(1) + (-ik2) * psir%a(2) c_psir1%psi(2)%a(4) = ik2 * psir%a(1) + km * psir%a(2) c_psir1%psi(3)%a(1) = ((0,-1) * km) * psir%a(3) + (-k%x(2)) * psir%a(4) c_psir1%psi(3)%a(2) = (-k%x(2)) * psir%a(3) + ((0,1) * kp) * psir%a(4) c_psir1%psi(3)%a(3) = ((0,1) * kp) * psir%a(1) + (-k%x(2)) * psir%a(2) c_psir1%psi(3)%a(4) = (-k%x(2)) * psir%a(1) + ((0,-1) * km) * psir%a(2) c_psir1%psi(4)%a(1) = (-ik2) * psir%a(3) + km * psir%a(4) c_psir1%psi(4)%a(2) = (-kp) * psir%a(3) + (-ik2) * psir%a(4) c_psir1%psi(4)%a(3) = (-ik2) * psir%a(1) + (-kp) * psir%a(2) c_psir1%psi(4)%a(4) = km * psir%a(1) + (-ik2) * psir%a(2) !!! c_psir2%psi(1)%a(1) = (0,1) * (k%x(1) * psir%a(3) + km * psir%a(4)) c_psir2%psi(1)%a(2) = (0,-1) * (kp * psir%a(3) + k%x(1) * psir%a(4)) c_psir2%psi(1)%a(3) = (0,1) * ((-k%x(1)) * psir%a(1) + kp * psir%a(2)) c_psir2%psi(1)%a(4) = (0,1) * ((-km) * psir%a(1) + k%x(1) * psir%a(2)) c_psir2%psi(2)%a(1) = (0,1) * (km * psir%a(3) + k%x(1) * psir%a(4)) c_psir2%psi(2)%a(2) = (0,-1) * (k%x(1) * psir%a(3) + kp * psir%a(4)) c_psir2%psi(2)%a(3) = (0,-1) * (kp * psir%a(1) + (-k%x(1)) * psir%a(2)) c_psir2%psi(2)%a(4) = (0,-1) * (k%x(1) * psir%a(1) + (-km) * psir%a(2)) c_psir2%psi(3)%a(1) = (-km) * psir%a(3) + k%x(1) * psir%a(4) c_psir2%psi(3)%a(2) = k%x(1) * psir%a(3) + (-kp) * psir%a(4) c_psir2%psi(3)%a(3) = kp * psir%a(1) + k%x(1) * psir%a(2) c_psir2%psi(3)%a(4) = k%x(1) * psir%a(1) + km * psir%a(2) c_psir2%psi(4)%a(1) = (0,1) * (k%x(1) * psir%a(3) + (-km) * psir%a(4)) c_psir2%psi(4)%a(2) = (0,1) * ((-kp) * psir%a(3) + k%x(1) * psir%a(4)) c_psir2%psi(4)%a(3) = (0,1) * (k%x(1) * psir%a(1) + kp * psir%a(2)) c_psir2%psi(4)%a(4) = (0,1) * (km * psir%a(1) + k%x(1) * psir%a(2)) !!! c_psir3%psi(1)%a(1) = (-k%t) * psir%a(3) - k12s * psir%a(4) c_psir3%psi(1)%a(2) = k12 * psir%a(3) + k%t * psir%a(4) c_psir3%psi(1)%a(3) = (-k%t) * psir%a(1) + k12s * psir%a(2) c_psir3%psi(1)%a(4) = (-k12) * psir%a(1) + k%t * psir%a(2) c_psir3%psi(2)%a(1) = (-k12s) * psir%a(3) + (-k%t) * psir%a(4) c_psir3%psi(2)%a(2) = k%t * psir%a(3) + k12 * psir%a(4) c_psir3%psi(2)%a(3) = (-k12s) * psir%a(1) + k%t * psir%a(2) c_psir3%psi(2)%a(4) = (-k%t) * psir%a(1) + k12 * psir%a(2) c_psir3%psi(3)%a(1) = (0,-1) * (k12s * psir%a(3) + (-k%t) * psir%a(4)) c_psir3%psi(3)%a(2) = (0,1) * (k%t * psir%a(3) + (-k12) * psir%a(4)) c_psir3%psi(3)%a(3) = (0,-1) * (k12s * psir%a(1) + k%t * psir%a(2)) c_psir3%psi(3)%a(4) = (0,-1) * (k%t * psir%a(1) + k12 * psir%a(2)) c_psir3%psi(4)%a(1) = (-k%t) * psir%a(3) + k12s * psir%a(4) c_psir3%psi(4)%a(2) = k12 * psir%a(3) + (-k%t) * psir%a(4) c_psir3%psi(4)%a(3) = k%t * psir%a(1) + k12s * psir%a(2) c_psir3%psi(4)%a(4) = k12 * psir%a(1) + k%t * psir%a(2) j%t = 2 * (psil * c_psir0) j%x(1) = 2 * (psil * c_psir1) j%x(2) = 2 * (psil * c_psir2) j%x(3) = 2 * (psil * c_psir3) end function grkgggf @ <>= pure function v_grf (g, psil, psir, k) result (j) type(vector) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: psil type(bispinor), intent(in) :: psir type(momentum), intent(in) :: k type(vector) :: vk vk = k j = g * grkgggf (psil, psir, vk) end function v_grf @ <>= pure function vlr_grf (gl, gr, psil, psir, k) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: psil type(bispinor), intent(in) :: psir type(bispinor) :: psir_l, psir_r type(momentum), intent(in) :: k type(vector) :: vk vk = k psir_l%a(1:2) = psir%a(1:2) psir_l%a(3:4) = 0 psir_r%a(1:2) = 0 psir_r%a(3:4) = psir%a(3:4) j = gl * grkgggf (psil, psir_l, vk) + gr * grkgggf (psil, psir_r, vk) end function vlr_grf @ $V^\mu = \psi^T \tilde{C}^{\mu\rho} \psi_\rho$; remember the reversed index order in $\tilde{C}$. <>= pure function fggkggr (psil, psir, k) result (j) type(vector) :: j type(vectorspinor), intent(in) :: psir type(bispinor), intent(in) :: psil type(vector), intent(in) :: k type(bispinor) :: c_psir0, c_psir1, c_psir2, c_psir3 complex(kind=default) :: kp, km, k12, k12s, ik1, ik2 kp = k%t + k%x(3) km = k%t - k%x(3) k12 = k%x(1) + (0,1)*k%x(2) k12s = k%x(1) - (0,1)*k%x(2) ik1 = (0,1) * k%x(1) ik2 = (0,1) * k%x(2) c_psir0%a(1) = k%x(3) * (psir%psi(1)%a(4) + psir%psi(4)%a(4) & + psir%psi(2)%a(3) + (0,1) * psir%psi(3)%a(3)) & - k12 * (psir%psi(1)%a(3) + psir%psi(4)%a(3)) & + k12s * (psir%psi(2)%a(4) + (0,1) * psir%psi(3)%a(4)) c_psir0%a(2) = k%x(3) * (psir%psi(1)%a(3) - psir%psi(4)%a(3) + & psir%psi(2)%a(4) - (0,1) * psir%psi(3)%a(4)) + & k12s * (psir%psi(1)%a(4) - psir%psi(4)%a(4)) - & k12 * (psir%psi(2)%a(3) - (0,1) * psir%psi(3)%a(3)) c_psir0%a(3) = k%x(3) * (-psir%psi(1)%a(2) + psir%psi(4)%a(2) + & psir%psi(2)%a(1) + (0,1) * psir%psi(3)%a(1)) + & k12 * (psir%psi(1)%a(1) - psir%psi(4)%a(1)) + & k12s * (psir%psi(2)%a(2) + (0,1) * psir%psi(3)%a(2)) c_psir0%a(4) = k%x(3) * (-psir%psi(1)%a(1) - psir%psi(4)%a(1) + & psir%psi(2)%a(2) - (0,1) * psir%psi(3)%a(2)) - & k12s * (psir%psi(1)%a(2) + psir%psi(4)%a(2)) - & k12 * (psir%psi(2)%a(1) - (0,1) * psir%psi(3)%a(1)) !!! c_psir1%a(1) = ik2 * (-psir%psi(1)%a(4) - psir%psi(4)%a(4) - & psir%psi(2)%a(3) - (0,1) * psir%psi(3)%a(3)) - & km * (psir%psi(1)%a(3) + psir%psi(4)%a(3)) + & kp * (psir%psi(2)%a(4) + (0,1) * psir%psi(3)%a(4)) c_psir1%a(2) = ik2 * (-psir%psi(1)%a(3) - psir%psi(2)%a(4) + & psir%psi(4)%a(3) + (0,1) * psir%psi(3)%a(4)) + & kp * (psir%psi(1)%a(4) - psir%psi(4)%a(4)) - & km * (psir%psi(2)%a(3) - (0,1) * psir%psi(3)%a(3)) c_psir1%a(3) = ik2 * (-psir%psi(1)%a(2) + psir%psi(2)%a(1) + & psir%psi(4)%a(2) + (0,1) * psir%psi(3)%a(1)) + & kp * (psir%psi(1)%a(1) - psir%psi(4)%a(1)) + & km * (psir%psi(2)%a(2) + (0,1) * psir%psi(3)%a(2)) c_psir1%a(4) = ik2 * (-psir%psi(1)%a(1) + psir%psi(2)%a(2) - & psir%psi(4)%a(1) - (0,1) * psir%psi(3)%a(2)) - & km * (psir%psi(1)%a(2) + psir%psi(4)%a(2)) - & kp * (psir%psi(2)%a(1) - (0,1) * psir%psi(3)%a(1)) !!! c_psir2%a(1) = ik1 * (psir%psi(2)%a(3) + psir%psi(1)%a(4) & + psir%psi(4)%a(4) + (0,1) * psir%psi(3)%a(3)) - & ((0,1)*km) * (psir%psi(1)%a(3) + psir%psi(4)%a(3)) & + kp * (psir%psi(3)%a(4) - (0,1) * psir%psi(2)%a(4)) c_psir2%a(2) = ik1 * (psir%psi(1)%a(3) + psir%psi(2)%a(4) - & psir%psi(4)%a(3) - (0,1) * psir%psi(3)%a(4)) - & ((0,1)*kp) * (psir%psi(1)%a(4) - psir%psi(4)%a(4)) & - km * (psir%psi(3)%a(3) + (0,1) * psir%psi(2)%a(3)) c_psir2%a(3) = ik1 * (psir%psi(1)%a(2) - psir%psi(2)%a(1) - & psir%psi(4)%a(2) - (0,1) * psir%psi(3)%a(1)) + & ((0,1)*kp) * (psir%psi(1)%a(1) - psir%psi(4)%a(1)) & + km * (psir%psi(3)%a(2) - (0,1) * psir%psi(2)%a(2)) c_psir2%a(4) = ik1 * (psir%psi(1)%a(1) - psir%psi(2)%a(2) + & psir%psi(4)%a(1) + (0,1) * psir%psi(3)%a(2)) + & ((0,1)*km) * (psir%psi(1)%a(2) + psir%psi(4)%a(2)) - & kp * (psir%psi(3)%a(1) + (0,1) * psir%psi(2)%a(1)) !!! c_psir3%a(1) = k%t * (psir%psi(1)%a(4) + psir%psi(4)%a(4) + & psir%psi(2)%a(3) + (0,1) * psir%psi(3)%a(3)) - & k12 * (psir%psi(1)%a(3) + psir%psi(4)%a(3)) - & k12s * (psir%psi(2)%a(4) + (0,1) * psir%psi(3)%a(4)) c_psir3%a(2) = k%t * (psir%psi(1)%a(3) - psir%psi(4)%a(3) + & psir%psi(2)%a(4) - (0,1) * psir%psi(3)%a(4)) - & k12s * (psir%psi(1)%a(4) - psir%psi(4)%a(4)) - & k12 * (psir%psi(2)%a(3) - (0,1) * psir%psi(3)%a(3)) c_psir3%a(3) = k%t * (-psir%psi(1)%a(2) + psir%psi(2)%a(1) + & psir%psi(4)%a(2) + (0,1) * psir%psi(3)%a(1)) - & k12 * (psir%psi(1)%a(1) - psir%psi(4)%a(1)) + & k12s * (psir%psi(2)%a(2) + (0,1) * psir%psi(3)%a(2)) c_psir3%a(4) = k%t * (-psir%psi(1)%a(1) + psir%psi(2)%a(2) - & psir%psi(4)%a(1) - (0,1) * psir%psi(3)%a(2)) - & k12s * (psir%psi(1)%a(2) + psir%psi(4)%a(2)) + & k12 * (psir%psi(2)%a(1) - (0,1) * psir%psi(3)%a(1)) !!! Because we explicitly multiplied the charge conjugation matrix !!! we have to omit it from the spinor product and take the !!! ordinary product! j%t = 2 * dot_product (conjg (psil%a), c_psir0%a) j%x(1) = 2 * dot_product (conjg (psil%a), c_psir1%a) j%x(2) = 2 * dot_product (conjg (psil%a), c_psir2%a) j%x(3) = 2 * dot_product (conjg (psil%a), c_psir3%a) end function fggkggr @ <>= pure function v_fgr (g, psil, psir, k) result (j) type(vector) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: psir type(bispinor), intent(in) :: psil type(momentum), intent(in) :: k type(vector) :: vk vk = k j = g * fggkggr (psil, psir, vk) end function v_fgr @ <>= pure function vlr_fgr (gl, gr, psil, psir, k) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: psir type(bispinor), intent(in) :: psil type(bispinor) :: psil_l type(bispinor) :: psil_r type(momentum), intent(in) :: k type(vector) :: vk vk = k psil_l%a(1:2) = psil%a(1:2) psil_l%a(3:4) = 0 psil_r%a(1:2) = 0 psil_r%a(3:4) = psil%a(3:4) j = gl * fggkggr (psil_l, psir, vk) + gr * fggkggr (psil_r, psir, vk) end function vlr_fgr @ \subsection{Gravitino 4-Couplings} <>= public :: f_s2gr, f_svgr, f_slvgr, f_srvgr, f_slrvgr, f_pvgr, f_v2gr, f_v2lrgr @ <>= pure function f_s2gr (g, phi1, phi2, psi) result (phipsi) type(bispinor) :: phipsi type(vectorspinor), intent(in) :: psi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi1, phi2 phipsi = phi2 * f_potgr (g, phi1, psi) end function f_s2gr @ <>= pure function f_svgr (g, phi, v, grav) result (phigrav) type(bispinor) :: phigrav type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v complex(kind=default), intent(in) :: g, phi phigrav = (g * phi) * fgvg5gr (grav, v) end function f_svgr @ <>= pure function f_slvgr (gl, phi, v, grav) result (phigrav) type(bispinor) :: phigrav, phidum type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v complex(kind=default), intent(in) :: gl, phi phidum = (gl * phi) * fgvg5gr (grav, v) phigrav%a(1:2) = phidum%a(1:2) phigrav%a(3:4) = 0 end function f_slvgr @ <>= pure function f_srvgr (gr, phi, v, grav) result (phigrav) type(bispinor) :: phigrav, phidum type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v complex(kind=default), intent(in) :: gr, phi phidum = (gr * phi) * fgvg5gr (grav, v) phigrav%a(1:2) = 0 phigrav%a(3:4) = phidum%a(3:4) end function f_srvgr @ <>= pure function f_slrvgr (gl, gr, phi, v, grav) result (phigrav) type(bispinor) :: phigrav type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v complex(kind=default), intent(in) :: gl, gr, phi phigrav = f_slvgr (gl, phi, v, grav) + f_srvgr (gr, phi, v, grav) end function f_slrvgr @ <>= pure function f_pvgr (g, phi, v, grav) result (phigrav) type(bispinor) :: phigrav type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v complex(kind=default), intent(in) :: g, phi phigrav = (g * phi) * fgvgr (grav, v) end function f_pvgr @ <>= pure function f_v2gr (g, v1, v2, grav) result (psi) type(bispinor) :: psi complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v1, v2 psi = g * fggvvgr (v2, grav, v1) end function f_v2gr @ <>= pure function f_v2lrgr (gl, gr, v1, v2, grav) result (psi) type(bispinor) :: psi complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v1, v2 psi = fggvvgr (v2, grav, v1) psi%a(1:2) = gl * psi%a(1:2) psi%a(3:4) = gr * psi%a(3:4) end function f_v2lrgr @ <>= public :: gr_s2f, gr_svf, gr_pvf, gr_slvf, gr_srvf, gr_slrvf, gr_v2f, gr_v2lrf @ <>= pure function gr_s2f (g, phi1, phi2, psi) result (phipsi) type(vectorspinor) :: phipsi type(bispinor), intent(in) :: psi complex(kind=default), intent(in) :: g complex(kind=default), intent(in) :: phi1, phi2 phipsi = phi2 * gr_potf (g, phi1, psi) end function gr_s2f @ <>= pure function gr_svf (g, phi, v, psi) result (phipsi) type(vectorspinor) :: phipsi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: g, phi phipsi = (g * phi) * grkggf (psi, v) end function gr_svf @ <>= pure function gr_slvf (gl, phi, v, psi) result (phipsi) type(vectorspinor) :: phipsi type(bispinor), intent(in) :: psi type(bispinor) :: psi_l type(vector), intent(in) :: v complex(kind=default), intent(in) :: gl, phi psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 phipsi = (gl * phi) * grkggf (psi_l, v) end function gr_slvf @ <>= pure function gr_srvf (gr, phi, v, psi) result (phipsi) type(vectorspinor) :: phipsi type(bispinor), intent(in) :: psi type(bispinor) :: psi_r type(vector), intent(in) :: v complex(kind=default), intent(in) :: gr, phi psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) phipsi = (gr * phi) * grkggf (psi_r, v) end function gr_srvf @ <>= pure function gr_slrvf (gl, gr, phi, v, psi) result (phipsi) type(vectorspinor) :: phipsi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: gl, gr, phi phipsi = gr_slvf (gl, phi, v, psi) + gr_srvf (gr, phi, v, psi) end function gr_slrvf @ <>= pure function gr_pvf (g, phi, v, psi) result (phipsi) type(vectorspinor) :: phipsi type(bispinor), intent(in) :: psi type(vector), intent(in) :: v complex(kind=default), intent(in) :: g, phi phipsi = (g * phi) * grkgf (psi, v) end function gr_pvf @ <>= pure function gr_v2f (g, v1, v2, psi) result (vvpsi) type(vectorspinor) :: vvpsi complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psi type(vector), intent(in) :: v1, v2 vvpsi = g * grkkggf (v2, psi, v1) end function gr_v2f @ <>= pure function gr_v2lrf (gl, gr, v1, v2, psi) result (vvpsi) type(vectorspinor) :: vvpsi complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psi type(bispinor) :: psi_l, psi_r type(vector), intent(in) :: v1, v2 psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) vvpsi = gl * grkkggf (v2, psi_l, v1) + gr * grkkggf (v2, psi_r, v1) end function gr_v2lrf @ <>= public :: s2_grf, s2_fgr, sv1_grf, sv2_grf, sv1_fgr, sv2_fgr, & slv1_grf, slv2_grf, slv1_fgr, slv2_fgr, & srv1_grf, srv2_grf, srv1_fgr, srv2_fgr, & slrv1_grf, slrv2_grf, slrv1_fgr, slrv2_fgr, & pv1_grf, pv2_grf, pv1_fgr, pv2_fgr, v2_grf, v2_fgr, & v2lr_grf, v2lr_fgr @ <>= pure function s2_grf (g, gravbar, phi, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g, phi type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi j = phi * pot_grf (g, gravbar, psi) end function s2_grf @ <>= pure function s2_fgr (g, psibar, phi, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g, phi type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav j = phi * pot_fgr (g, psibar, grav) end function s2_fgr @ <>= pure function sv1_grf (g, gravbar, v, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vector), intent(in) :: v j = g * grg5vgf (gravbar, psi, v) end function sv1_grf @ <>= pure function slv1_grf (gl, gravbar, v, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_l type(vector), intent(in) :: v psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 j = gl * grg5vgf (gravbar, psi_l, v) end function slv1_grf @ <>= pure function srv1_grf (gr, gravbar, v, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gr type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_r type(vector), intent(in) :: v psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) j = gr * grg5vgf (gravbar, psi_r, v) end function srv1_grf @ <>= pure function slrv1_grf (gl, gr, gravbar, v, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_l, psi_r type(vector), intent(in) :: v psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) j = gl * grg5vgf (gravbar, psi_l, v) + gr * grg5vgf (gravbar, psi_r, v) end function slrv1_grf @ \begin{subequations} \begin{align} C \gamma^0 \gamma^0 = - C \gamma^1 \gamma^1 = - C \gamma^2 \gamma^2 = C \gamma^3 \gamma^3 = C &= \begin{pmatrix} 0 & 1 & 0 & 0 \\ -1 & 0 & 0 & 0 \\ 0 & 0 & 0 & -1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \\ C \gamma^0 \gamma^1 = - C \gamma^1 \gamma^0 &= \begin{pmatrix} -1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & -1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \\ C \gamma^0 \gamma^2 = - C \gamma^2 \gamma^0 &= \begin{pmatrix} -\ii & 0 & 0 & 0 \\ 0 & -\ii & 0 & 0 \\ 0 & 0 & -\ii & 0 \\ 0 & 0 & 0 & -\ii \end{pmatrix} \\ C \gamma^0 \gamma^3 = - C \gamma^3 \gamma^0 &= \begin{pmatrix} 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{pmatrix} \\ C \gamma^1 \gamma^2 = - C \gamma^2 \gamma^1 &= \begin{pmatrix} 0 & \ii & 0 & 0 \\ \ii & 0 & 0 & 0 \\ 0 & 0 & 0 & -\ii \\ 0 & 0 & -\ii & 0 \end{pmatrix} \\ C \gamma^1 \gamma^3 = - C \gamma^3 \gamma^1 &= \begin{pmatrix} -1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} \\ C \gamma^2 \gamma^3 = - C \gamma^3 \gamma^2 &= \begin{pmatrix} -\ii & 0 & 0 & 0 \\ 0 & \ii & 0 & 0 \\ 0 & 0 & \ii & 0 \\ 0 & 0 & 0 & -\ii \end{pmatrix} \end{align} \end{subequations} @ <>= pure function sv2_grf (g, gravbar, phi, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: g, phi type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vectorspinor) :: g0_psi, g1_psi, g2_psi, g3_psi g0_psi%psi(1)%a(1:2) = - psi%a(1:2) g0_psi%psi(1)%a(3:4) = psi%a(3:4) g0_psi%psi(2)%a(1) = psi%a(2) g0_psi%psi(2)%a(2) = psi%a(1) g0_psi%psi(2)%a(3) = psi%a(4) g0_psi%psi(2)%a(4) = psi%a(3) g0_psi%psi(3)%a(1) = (0,-1) * psi%a(2) g0_psi%psi(3)%a(2) = (0,1) * psi%a(1) g0_psi%psi(3)%a(3) = (0,-1) * psi%a(4) g0_psi%psi(3)%a(4) = (0,1) * psi%a(3) g0_psi%psi(4)%a(1) = psi%a(1) g0_psi%psi(4)%a(2) = - psi%a(2) g0_psi%psi(4)%a(3) = psi%a(3) g0_psi%psi(4)%a(4) = - psi%a(4) g1_psi%psi(1)%a(1:4) = - g0_psi%psi(2)%a(1:4) g1_psi%psi(2)%a(1:4) = - g0_psi%psi(1)%a(1:4) g1_psi%psi(3)%a(1) = (0,1) * psi%a(1) g1_psi%psi(3)%a(2) = (0,-1) * psi%a(2) g1_psi%psi(3)%a(3) = (0,-1) * psi%a(3) g1_psi%psi(3)%a(4) = (0,1) * psi%a(4) g1_psi%psi(4)%a(1) = - psi%a(2) g1_psi%psi(4)%a(2) = psi%a(1) g1_psi%psi(4)%a(3) = psi%a(4) g1_psi%psi(4)%a(4) = - psi%a(3) g2_psi%psi(1)%a(1:4) = - g0_psi%psi(3)%a(1:4) g2_psi%psi(2)%a(1:4) = - g1_psi%psi(3)%a(1:4) g2_psi%psi(3)%a(1:4) = - g0_psi%psi(1)%a(1:4) g2_psi%psi(4)%a(1) = (0,1) * psi%a(2) g2_psi%psi(4)%a(2) = (0,1) * psi%a(1) g2_psi%psi(4)%a(3) = (0,-1) * psi%a(4) g2_psi%psi(4)%a(4) = (0,-1) * psi%a(3) g3_psi%psi(1)%a(1:4) = - g0_psi%psi(4)%a(1:4) g3_psi%psi(2)%a(1:4) = - g1_psi%psi(4)%a(1:4) g3_psi%psi(3)%a(1:4) = - g2_psi%psi(4)%a(1:4) g3_psi%psi(4)%a(1:4) = - g0_psi%psi(1)%a(1:4) j%t = (g * phi) * (gravbar * g0_psi) j%x(1) = (g * phi) * (gravbar * g1_psi) j%x(2) = (g * phi) * (gravbar * g2_psi) j%x(3) = (g * phi) * (gravbar * g3_psi) end function sv2_grf @ <>= pure function slv2_grf (gl, gravbar, phi, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, phi type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_l psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 j = sv2_grf (gl, gravbar, phi, psi_l) end function slv2_grf @ <>= pure function srv2_grf (gr, gravbar, phi, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gr, phi type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_r psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) j = sv2_grf (gr, gravbar, phi, psi_r) end function srv2_grf @ <>= pure function slrv2_grf (gl, gr, gravbar, phi, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr, phi type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_l, psi_r psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) j = sv2_grf (gl, gravbar, phi, psi_l) + sv2_grf (gr, gravbar, phi, psi_r) end function slrv2_grf @ <>= pure function sv1_fgr (g, psibar, v, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v j = g * fg5gkgr (psibar, grav, v) end function sv1_fgr @ <>= pure function slv1_fgr (gl, psibar, v, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_l type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v psibar_l%a(1:2) = psibar%a(1:2) psibar_l%a(3:4) = 0 j = gl * fg5gkgr (psibar_l, grav, v) end function slv1_fgr @ <>= pure function srv1_fgr (gr, psibar, v, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gr type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_r type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v psibar_r%a(1:2) = 0 psibar_r%a(3:4) = psibar%a(3:4) j = gr * fg5gkgr (psibar_r, grav, v) end function srv1_fgr @ <>= pure function slrv1_fgr (gl, gr, psibar, v, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: gl, gr type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_l, psibar_r type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v psibar_l%a(1:2) = psibar%a(1:2) psibar_l%a(3:4) = 0 psibar_r%a(1:2) = 0 psibar_r%a(3:4) = psibar%a(3:4) j = gl * fg5gkgr (psibar_l, grav, v) + gr * fg5gkgr (psibar_r, grav, v) end function slrv1_fgr @ <>= pure function sv2_fgr (g, psibar, phi, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: g, phi type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(bispinor) :: g0_grav, g1_grav, g2_grav, g3_grav g0_grav%a(1) = -grav%psi(1)%a(1) + grav%psi(2)%a(2) - & (0,1) * grav%psi(3)%a(2) + grav%psi(4)%a(1) g0_grav%a(2) = -grav%psi(1)%a(2) + grav%psi(2)%a(1) + & (0,1) * grav%psi(3)%a(1) - grav%psi(4)%a(2) g0_grav%a(3) = grav%psi(1)%a(3) + grav%psi(2)%a(4) - & (0,1) * grav%psi(3)%a(4) + grav%psi(4)%a(3) g0_grav%a(4) = grav%psi(1)%a(4) + grav%psi(2)%a(3) + & (0,1) * grav%psi(3)%a(3) - grav%psi(4)%a(4) !!! g1_grav%a(1) = grav%psi(1)%a(2) - grav%psi(2)%a(1) + & (0,1) * grav%psi(3)%a(1) - grav%psi(4)%a(2) g1_grav%a(2) = grav%psi(1)%a(1) - grav%psi(2)%a(2) - & (0,1) * grav%psi(3)%a(2) + grav%psi(4)%a(1) g1_grav%a(3) = grav%psi(1)%a(4) + grav%psi(2)%a(3) - & (0,1) * grav%psi(3)%a(3) + grav%psi(4)%a(4) g1_grav%a(4) = grav%psi(1)%a(3) + grav%psi(2)%a(4) + & (0,1) * grav%psi(3)%a(4) - grav%psi(4)%a(3) !!! g2_grav%a(1) = (0,1) * (-grav%psi(1)%a(2) - grav%psi(2)%a(1) + & grav%psi(4)%a(2)) - grav%psi(3)%a(1) g2_grav%a(2) = (0,1) * (grav%psi(1)%a(1) + grav%psi(2)%a(2) + & grav%psi(4)%a(1)) - grav%psi(3)%a(2) g2_grav%a(3) = (0,1) * (-grav%psi(1)%a(4) + grav%psi(2)%a(3) - & grav%psi(4)%a(4)) + grav%psi(3)%a(3) g2_grav%a(4) = (0,1) * (grav%psi(1)%a(3) - grav%psi(2)%a(4) - & grav%psi(4)%a(3)) + grav%psi(3)%a(4) !!! g3_grav%a(1) = -grav%psi(1)%a(2) + grav%psi(2)%a(2) - & (0,1) * grav%psi(3)%a(2) - grav%psi(4)%a(1) g3_grav%a(2) = grav%psi(1)%a(1) - grav%psi(2)%a(1) - & (0,1) * grav%psi(3)%a(1) - grav%psi(4)%a(2) g3_grav%a(3) = -grav%psi(1)%a(2) - grav%psi(2)%a(4) + & (0,1) * grav%psi(3)%a(4) + grav%psi(4)%a(3) g3_grav%a(4) = -grav%psi(1)%a(4) + grav%psi(2)%a(3) + & (0,1) * grav%psi(3)%a(3) + grav%psi(4)%a(4) j%t = (g * phi) * (psibar * g0_grav) j%x(1) = (g * phi) * (psibar * g1_grav) j%x(2) = (g * phi) * (psibar * g2_grav) j%x(3) = (g * phi) * (psibar * g3_grav) end function sv2_fgr @ <>= pure function slv2_fgr (gl, psibar, phi, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, phi type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_l type(vectorspinor), intent(in) :: grav psibar_l%a(1:2) = psibar%a(1:2) psibar_l%a(3:4) = 0 j = sv2_fgr (gl, psibar_l, phi, grav) end function slv2_fgr @ <>= pure function srv2_fgr (gr, psibar, phi, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: gr, phi type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_r type(vectorspinor), intent(in) :: grav psibar_r%a(1:2) = 0 psibar_r%a(3:4) = psibar%a(3:4) j = sv2_fgr (gr, psibar_r, phi, grav) end function srv2_fgr @ <>= pure function slrv2_fgr (gl, gr, psibar, phi, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr, phi type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_l, psibar_r type(vectorspinor), intent(in) :: grav psibar_l%a(1:2) = psibar%a(1:2) psibar_l%a(3:4) = 0 psibar_r%a(1:2) = 0 psibar_r%a(3:4) = psibar%a(3:4) j = sv2_fgr (gl, psibar_l, phi, grav) + sv2_fgr (gr, psibar_r, phi, grav) end function slrv2_fgr @ <>= pure function pv1_grf (g, gravbar, v, psi) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vector), intent(in) :: v j = g * grvgf (gravbar, psi, v) end function pv1_grf @ <>= pure function pv2_grf (g, gravbar, phi, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: g, phi type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: g5_psi g5_psi%a(1:2) = - psi%a(1:2) g5_psi%a(3:4) = psi%a(3:4) j = sv2_grf (g, gravbar, phi, g5_psi) end function pv2_grf @ <>= pure function pv1_fgr (g, psibar, v, grav) result (j) complex(kind=default) :: j complex(kind=default), intent(in) :: g type(bispinor), intent(in) :: psibar type(vectorspinor), intent(in) :: grav type(vector), intent(in) :: v j = g * fgkgr (psibar, grav, v) end function pv1_fgr @ <>= pure function pv2_fgr (g, psibar, phi, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: g, phi type(vectorspinor), intent(in) :: grav type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_g5 psibar_g5%a(1:2) = - psibar%a(1:2) psibar_g5%a(3:4) = psibar%a(3:4) j = sv2_fgr (g, psibar_g5, phi, grav) end function pv2_fgr @ <>= pure function v2_grf (g, gravbar, v, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(vector), intent(in) :: v j = -g * grkgggf (gravbar, psi, v) end function v2_grf @ <>= pure function v2lr_grf (gl, gr, gravbar, v, psi) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: gravbar type(bispinor), intent(in) :: psi type(bispinor) :: psi_l, psi_r type(vector), intent(in) :: v psi_l%a(1:2) = psi%a(1:2) psi_l%a(3:4) = 0 psi_r%a(1:2) = 0 psi_r%a(3:4) = psi%a(3:4) j = -(gl * grkgggf (gravbar, psi_l, v) + gr * grkgggf (gravbar, psi_r, v)) end function v2lr_grf @ <>= pure function v2_fgr (g, psibar, v, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: g type(vectorspinor), intent(in) :: grav type(bispinor), intent(in) :: psibar type(vector), intent(in) :: v j = -g * fggkggr (psibar, grav, v) end function v2_fgr @ <>= pure function v2lr_fgr (gl, gr, psibar, v, grav) result (j) type(vector) :: j complex(kind=default), intent(in) :: gl, gr type(vectorspinor), intent(in) :: grav type(bispinor), intent(in) :: psibar type(bispinor) :: psibar_l, psibar_r type(vector), intent(in) :: v psibar_l%a(1:2) = psibar%a(1:2) psibar_l%a(3:4) = 0 psibar_r%a(1:2) = 0 psibar_r%a(3:4) = psibar%a(3:4) j = -(gl * fggkggr (psibar_l, grav, v) + gr * fggkggr (psibar_r, grav, v)) end function v2lr_fgr @ \subsection{On Shell Wave Functions} <>= public :: u, v, ghost @ \begin{subequations} \begin{align} \chi_+(\vec p) &= \frac{1}{\sqrt{2|\vec p|(|\vec p|+p_3)}} \begin{pmatrix} |\vec p|+p_3 \\ p_1 + \ii p_2 \end{pmatrix} \\ \chi_-(\vec p) &= \frac{1}{\sqrt{2|\vec p|(|\vec p|+p_3)}} \begin{pmatrix} - p_1 + \ii p_2 \\ |\vec p|+p_3 \end{pmatrix} \end{align} \end{subequations} @ \begin{equation} u_\pm(p) = \begin{pmatrix} \sqrt{p_0\mp|\vec p|} \cdot \chi_\pm(\vec p) \\ \sqrt{p_0\pm|\vec p|} \cdot \chi_\pm(\vec p) \end{pmatrix} \end{equation} <>= pure function u (mass, p, s) result (psi) type(bispinor) :: psi real(kind=default), intent(in) :: mass type(momentum), intent(in) :: p integer, intent(in) :: s complex(kind=default), dimension(2) :: chip, chim real(kind=default) :: pabs, norm, delta, m m = abs(mass) pabs = sqrt (dot_product (p%x, p%x)) if (m < epsilon (m) * pabs) then delta = 0 else delta = sqrt (max (p%t - pabs, 0._default)) end if if (pabs + p%x(3) <= 1000 * epsilon (pabs) * pabs) then chip = (/ cmplx ( 0.0, 0.0, kind=default), & cmplx ( 1.0, 0.0, kind=default) /) chim = (/ cmplx (-1.0, 0.0, kind=default), & cmplx ( 0.0, 0.0, kind=default) /) else norm = 1 / sqrt (2*pabs*(pabs + p%x(3))) chip = norm * (/ cmplx (pabs + p%x(3), kind=default), & cmplx (p%x(1), p%x(2), kind=default) /) chim = norm * (/ cmplx (-p%x(1), p%x(2), kind=default), & cmplx (pabs + p%x(3), kind=default) /) end if if (s > 0) then psi%a(1:2) = delta * chip psi%a(3:4) = sqrt (p%t + pabs) * chip else psi%a(1:2) = sqrt (p%t + pabs) * chim psi%a(3:4) = delta * chim end if pabs = m ! make the compiler happy and use m if (mass < 0) then psi%a(1:2) = - imago * psi%a(1:2) psi%a(3:4) = + imago * psi%a(3:4) end if end function u @ \begin{equation} v_\pm(p) = \begin{pmatrix} \mp\sqrt{p_0\pm|\vec p|} \cdot \chi_\mp(\vec p) \\ \pm\sqrt{p_0\mp|\vec p|} \cdot \chi_\mp(\vec p) \end{pmatrix} \end{equation} <>= pure function v (mass, p, s) result (psi) type(bispinor) :: psi real(kind=default), intent(in) :: mass type(momentum), intent(in) :: p integer, intent(in) :: s complex(kind=default), dimension(2) :: chip, chim real(kind=default) :: pabs, norm, delta, m pabs = sqrt (dot_product (p%x, p%x)) m = abs(mass) if (m < epsilon (m) * pabs) then delta = 0 else delta = sqrt (max (p%t - pabs, 0._default)) end if if (pabs + p%x(3) <= 1000 * epsilon (pabs) * pabs) then chip = (/ cmplx ( 0.0, 0.0, kind=default), & cmplx ( 1.0, 0.0, kind=default) /) chim = (/ cmplx (-1.0, 0.0, kind=default), & cmplx ( 0.0, 0.0, kind=default) /) else norm = 1 / sqrt (2*pabs*(pabs + p%x(3))) chip = norm * (/ cmplx (pabs + p%x(3), kind=default), & cmplx (p%x(1), p%x(2), kind=default) /) chim = norm * (/ cmplx (-p%x(1), p%x(2), kind=default), & cmplx (pabs + p%x(3), kind=default) /) end if if (s > 0) then psi%a(1:2) = - sqrt (p%t + pabs) * chim psi%a(3:4) = delta * chim else psi%a(1:2) = delta * chip psi%a(3:4) = - sqrt (p%t + pabs) * chip end if pabs = m ! make the compiler happy and use m if (mass < 0) then psi%a(1:2) = - imago * psi%a(1:2) psi%a(3:4) = + imago * psi%a(3:4) end if end function v @ <>= pure function ghost (m, p, s) result (psi) type(bispinor) :: psi real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s psi%a(:) = 0 select case (s) case (1) psi%a(1) = 1 psi%a(2:4) = 0 case (2) psi%a(1) = 0 psi%a(2) = 1 psi%a(3:4) = 0 case (3) psi%a(1:2) = 0 psi%a(3) = 1 psi%a(4) = 0 case (4) psi%a(1:3) = 0 psi%a(4) = 1 case (5) psi%a(1) = 1.4 psi%a(2) = - 2.3 psi%a(3) = - 71.5 psi%a(4) = 0.1 end select end function ghost @ \subsection{Off Shell Wave Functions} This is the same as for the Dirac fermions except that the expressions for [ubar] and [vbar] are missing. <>= public :: brs_u, brs_v @ In momentum space we have: \begin{equation} brs u(p)=(-i) (\fmslash p-m)u(p) \end{equation} <>= pure function brs_u (m, p, s) result (dpsi) type(bispinor) :: dpsi, psi real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type (vector)::vp complex(kind=default), parameter :: one = (1, 0) vp=p psi=u(m,p,s) dpsi=cmplx(0.0,-1.0)*(f_vf(one,vp,psi)-m*psi) end function brs_u @ \begin{equation} brs v(p)=i (\fmslash p+m)v(p) \end{equation} <>= pure function brs_v (m, p, s) result (dpsi) type(bispinor) :: dpsi, psi real(kind=default), intent(in) :: m type(momentum), intent(in) :: p integer, intent(in) :: s type (vector)::vp complex(kind=default), parameter :: one = (1, 0) vp=p psi=v(m,p,s) dpsi=cmplx(0.0,1.0)*(f_vf(one,vp,psi)+m*psi) end function brs_v @ \subsection{Propagators} <>= public :: pr_psi, pr_grav public :: pj_psi, pg_psi @ \begin{equation} \frac{\ii(-\fmslash{p}+m)}{p^2-m^2+\ii m\Gamma}\psi \end{equation} NB: the sign of the momentum comes about because all momenta are treated as \emph{outgoing} and the particle charge flow is therefore opposite to the momentum. <>= pure function pr_psi (p, m, w, cms, psi) result (ppsi) type(bispinor) :: ppsi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(bispinor), intent(in) :: psi logical, intent(in) :: cms type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) complex(kind=default) :: num_mass vp = p if (cms) then num_mass = sqrt(cmplx(m**2, -m*w, kind=default)) else num_mass = cmplx (m, 0, kind=default) end if ppsi = (1 / cmplx (p*p - m**2, m*w, kind=default)) & * (- f_vf (one, vp, psi) + num_mass * psi) end function pr_psi @ \begin{equation} \sqrt{\frac{\pi}{M\Gamma}} (-\fmslash{p}+m)\psi \end{equation} <>= pure function pj_psi (p, m, w, psi) result (ppsi) type(bispinor) :: ppsi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(bispinor), intent(in) :: psi type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) vp = p ppsi = (0, -1) * sqrt (PI / m / w) * (- f_vf (one, vp, psi) + m * psi) end function pj_psi @ <>= pure function pg_psi (p, m, w, psi) result (ppsi) type(bispinor) :: ppsi type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(bispinor), intent(in) :: psi type(vector) :: vp complex(kind=default), parameter :: one = (1, 0) vp = p ppsi = gauss (p*p, m, w) * (- f_vf (one, vp, psi) + m * psi) end function pg_psi @ \begin{equation} \dfrac{\ii\biggl\{(-\fmslash{p} + m)\left(-\eta_{\mu\nu} + \dfrac{p_\mu p_\nu}{m^2}\right) + \dfrac{1}{3} \left(\gamma_\mu -\dfrac{p_\mu}{m}\right) (\fmslash{p} + m)\left(\gamma_\nu - \dfrac{p_\nu}{m}\right)\biggr\}}{p^2 - m^2 + \ii m \Gamma} \; \psi^\nu \end{equation} <>= pure function pr_grav (p, m, w, grav) result (propgrav) type(vectorspinor) :: propgrav type(momentum), intent(in) :: p real(kind=default), intent(in) :: m, w type(vectorspinor), intent(in) :: grav type(vector) :: vp type(bispinor) :: pgrav, ggrav, ggrav1, ggrav2, ppgrav type(vectorspinor) :: etagrav_dum, etagrav, pppgrav, & gg_grav_dum, gg_grav complex(kind=default), parameter :: one = (1, 0) real(kind=default) :: minv integer :: i vp = p minv = 1/m pgrav = p%t * grav%psi(1) - p%x(1) * grav%psi(2) - & p%x(2) * grav%psi(3) - p%x(3) * grav%psi(4) ggrav%a(1) = grav%psi(1)%a(3) - grav%psi(2)%a(4) + (0,1) * & grav%psi(3)%a(4) - grav%psi(4)%a(3) ggrav%a(2) = grav%psi(1)%a(4) - grav%psi(2)%a(3) - (0,1) * & grav%psi(3)%a(3) + grav%psi(4)%a(4) ggrav%a(3) = grav%psi(1)%a(1) + grav%psi(2)%a(2) - (0,1) * & grav%psi(3)%a(2) + grav%psi(4)%a(1) ggrav%a(4) = grav%psi(1)%a(2) + grav%psi(2)%a(1) + (0,1) * & grav%psi(3)%a(1) - grav%psi(4)%a(2) ggrav1 = ggrav - minv * pgrav ggrav2 = f_vf (one, vp, ggrav1) + m * ggrav - pgrav ppgrav = (-minv**2) * f_vf (one, vp, pgrav) + minv * pgrav do i = 1, 4 etagrav_dum%psi(i) = f_vf (one, vp, grav%psi(i)) end do etagrav = etagrav_dum - m * grav pppgrav%psi(1) = p%t * ppgrav pppgrav%psi(2) = p%x(1) * ppgrav pppgrav%psi(3) = p%x(2) * ppgrav pppgrav%psi(4) = p%x(3) * ppgrav gg_grav_dum%psi(1) = p%t * ggrav2 gg_grav_dum%psi(2) = p%x(1) * ggrav2 gg_grav_dum%psi(3) = p%x(2) * ggrav2 gg_grav_dum%psi(4) = p%x(3) * ggrav2 gg_grav = gr_potf (one, one, ggrav2) - minv * gg_grav_dum propgrav = (1 / cmplx (p*p - m**2, m*w, kind=default)) * & (etagrav + pppgrav + (1/3.0_default) * gg_grav) end function pr_grav @ \section{Polarization vectorspinors} Here we construct the wavefunctions for (massive) gravitinos out of the wavefunctions of (massive) vectorbosons and (massive) Majorana fermions. \begin{subequations} \begin{align} \psi^\mu_{(u; 3/2)} (k) &= \; \epsilon^\mu_+ (k) \cdot u (k, +) \\ \psi^\mu_{(u; 1/2)} (k) &= \; \sqrt{\dfrac{1}{3}} \, \epsilon^\mu_+ (k) \cdot u (k, -) + \sqrt{\dfrac{2}{3}} \, \epsilon^\mu_0 (k) \cdot u (k, +) \\ \psi^\mu_{(u; -1/2)} (k) &= \; \sqrt{\dfrac{2}{3}} \, \epsilon^\mu_0 (k) \cdot u (k, -) + \sqrt{\dfrac{1}{3}} \, \epsilon^\mu_- (k) \cdot u (k, +) \\ \psi^\mu_{(u; -3/2)} (k) &= \; \epsilon^\mu_- (k) \cdot u (k, -) \end{align} \end{subequations} and in the same manner for $\psi^\mu_{(v; s)}$ with $u$ replaced by $v$ and with the conjugated polarization vectors. These gravitino wavefunctions obey the Dirac equation, they are transverse and they fulfill the irreducibility condition \begin{equation} \gamma_\mu \psi^\mu_{(u/v; s)} = 0 . \end{equation} <<[[omega_vspinor_polarizations.f90]]>>= <> module omega_vspinor_polarizations use kinds use constants use omega_vectors use omega_bispinors use omega_bispinor_couplings use omega_vectorspinors implicit none <> integer, parameter, public :: omega_vspinor_pols_2010_01_A = 0 contains <> end module omega_vspinor_polarizations @ <>= public :: ueps, veps private :: eps private :: outer_product @ Here we implement the polarization vectors for vectorbosons with trigonometric functions, without the rotating of components done in HELAS~\cite{HELAS}. These are only used for generating the polarization vectorspinors. \begin{subequations} \begin{align} \epsilon^\mu_+(k) &= \frac{- e^{+\ii\phi}}{\sqrt{2}} \left(0; \cos\theta\cos\phi - \ii\sin\phi, \cos\theta\sin\phi + \ii\cos\phi, -\sin\theta \right) \\ \epsilon^\mu_-(k) &= \frac{e^{-\ii\phi}}{\sqrt{2}} \left(0; \cos\theta\cos\phi + \ii \sin\phi, \cos\theta\sin\phi - \ii \cos\phi, - \sin\theta \right) \\ \epsilon^\mu_0(k) &= \frac{1}{m} \left(|\vec k|; k^0\sin\theta\cos\phi, k^0\sin\theta\sin\phi, k^0\cos\theta\right) \end{align} \end{subequations} Determining the mass from the momenta is a numerically haphazardous for light particles. Therefore, we accept some redundancy and pass the mass explicitely. For the case that the momentum lies totally in the $z$-direction we take the convention $\cos\phi=1$ and $\sin\phi=0$. <>= pure function eps (mass, k, s) result (e) type(vector) :: e real(kind=default), intent(in) :: mass type(momentum), intent(in) :: k integer, intent(in) :: s real(kind=default) :: kabs, kabs2, sqrt2, m real(kind=default) :: cos_phi, sin_phi, cos_th, sin_th complex(kind=default) :: epiphi, emiphi sqrt2 = sqrt (2.0_default) kabs2 = dot_product (k%x, k%x) m = abs(mass) if (kabs2 > 0) then kabs = sqrt (kabs2) if ((k%x(1) == 0) .and. (k%x(2) == 0)) then cos_phi = 1 sin_phi = 0 else cos_phi = k%x(1) / sqrt(k%x(1)**2 + k%x(2)**2) sin_phi = k%x(2) / sqrt(k%x(1)**2 + k%x(2)**2) end if cos_th = k%x(3) / kabs sin_th = sqrt(1 - cos_th**2) epiphi = cos_phi + (0,1) * sin_phi emiphi = cos_phi - (0,1) * sin_phi e%t = 0 e%x = 0 select case (s) case (1) e%x(1) = epiphi * (-cos_th * cos_phi + (0,1) * sin_phi) / sqrt2 e%x(2) = epiphi * (-cos_th * sin_phi - (0,1) * cos_phi) / sqrt2 e%x(3) = epiphi * ( sin_th / sqrt2) case (-1) e%x(1) = emiphi * ( cos_th * cos_phi + (0,1) * sin_phi) / sqrt2 e%x(2) = emiphi * ( cos_th * sin_phi - (0,1) * cos_phi) / sqrt2 e%x(3) = emiphi * (-sin_th / sqrt2) case (0) if (m > 0) then e%t = kabs / m e%x = k%t / (m*kabs) * k%x end if case (4) if (m > 0) then e = (1 / m) * k else e = (1 / k%t) * k end if end select else !!! for particles in their rest frame defined to be !!! polarized along the 3-direction e%t = 0 e%x = 0 select case (s) case (1) e%x(1) = cmplx ( - 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, 1, kind=default) / sqrt2 case (-1) e%x(1) = cmplx ( 1, 0, kind=default) / sqrt2 e%x(2) = cmplx ( 0, 1, kind=default) / sqrt2 case (0) if (m > 0) then e%x(3) = 1 end if case (4) if (m > 0) then e = (1 / m) * k else e = (1 / k%t) * k end if end select end if end function eps @ <>= pure function ueps (m, k, s) result (t) type(vectorspinor) :: t real(kind=default), intent(in) :: m type(momentum), intent(in) :: k integer, intent(in) :: s integer :: i type(vector) :: ep, e0, em type(bispinor) :: up, um do i = 1, 4 t%psi(i)%a = 0 end do select case (s) case (2) ep = eps (m, k, 1) up = u (m, k, 1) t = outer_product (ep, up) case (1) ep = eps (m, k, 1) e0 = eps (m, k, 0) up = u (m, k, 1) um = u (m, k, -1) t = (1 / sqrt (3.0_default)) * (outer_product (ep, um) & + sqrt (2.0_default) * outer_product (e0, up)) case (-1) e0 = eps (m, k, 0) em = eps (m, k, -1) up = u (m, k, 1) um = u (m, k, -1) t = (1 / sqrt (3.0_default)) * (sqrt (2.0_default) * & outer_product (e0, um) + outer_product (em, up)) case (-2) em = eps (m, k, -1) um = u (m, k, -1) t = outer_product (em, um) end select end function ueps @ <>= pure function veps (m, k, s) result (t) type(vectorspinor) :: t real(kind=default), intent(in) :: m type(momentum), intent(in) :: k integer, intent(in) :: s integer :: i type(vector) :: ep, e0, em type(bispinor) :: vp, vm do i = 1, 4 t%psi(i)%a = 0 end do select case (s) case (2) ep = conjg(eps (m, k, 1)) vp = v (m, k, 1) t = outer_product (ep, vp) case (1) ep = conjg(eps (m, k, 1)) e0 = conjg(eps (m, k, 0)) vp = v (m, k, 1) vm = v (m, k, -1) t = (1 / sqrt (3.0_default)) * (outer_product (ep, vm) & + sqrt (2.0_default) * outer_product (e0, vp)) case (-1) e0 = conjg(eps (m, k, 0)) em = conjg(eps (m, k, -1)) vp = v (m, k, 1) vm = v (m, k, -1) t = (1 / sqrt (3.0_default)) * (sqrt (2.0_default) & * outer_product (e0, vm) + outer_product (em, vp)) case (-2) em = conjg(eps (m, k, -1)) vm = v (m, k, -1) t = outer_product (em, vm) end select end function veps @ <>= pure function outer_product (ve, sp) result (vs) type(vectorspinor) :: vs type(vector), intent(in) :: ve type(bispinor), intent(in) :: sp integer :: i vs%psi(1)%a(1:4) = ve%t * sp%a(1:4) do i = 1, 3 vs%psi((i+1))%a(1:4) = ve%x(i) * sp%a(1:4) end do end function outer_product @ \section{Color} <<[[omega_color.f90]]>>= <> module omega_color use kinds implicit none private <> <> integer, parameter, public :: omega_color_2010_01_A = 0 contains <> end module omega_color @ \subsection{Color Sum} <>= public :: omega_color_factor type omega_color_factor integer :: i1, i2 real(kind=default) :: factor end type omega_color_factor @ <>= public :: omega_color_sum @ The [[!$omp]] instruction will result in parallel code if compiled with support for OpenMP otherwise it is ignored. @ <>= <<[[pure]] unless OpenMP>> function omega_color_sum (flv, hel, amp, cf) result (amp2) complex(kind=default) :: amp2 integer, intent(in) :: flv, hel complex(kind=default), dimension(:,:,:), intent(in) :: amp type(omega_color_factor), dimension(:), intent(in) :: cf integer :: n amp2 = 0 !$omp parallel do reduction(+:amp2) do n = 1, size (cf) amp2 = amp2 + cf(n)%factor * & amp(flv,cf(n)%i1,hel) * conjg (amp(flv,cf(n)%i2,hel)) end do !$omp end parallel do end function omega_color_sum @ In the bytecode for the OVM, we only save the symmetric part of the color factor table. This almost halves the size of $n$ gluon amplitudes for $n>6$. For $2\,\to\,(5,6)\,g$ the reduced color factor table still amounts for $\sim(75,93)\%$ of the bytecode, making it desirable to omit it completely by computing it dynamically to reduce memory requirements. Note that $2\text{Re}(A_{i_1}A_{i_2}^*)=A_{i_1}A_{i_2}^*+A_{i_2}A_{i_1}^*$. <>= public :: ovm_color_sum @ <>= <<[[pure]] unless OpenMP>> function ovm_color_sum (flv, hel, amp, cf) result (amp2) real(kind=default) :: amp2 integer, intent(in) :: flv, hel complex(kind=default), dimension(:,:,:), intent(in) :: amp type(omega_color_factor), dimension(:), intent(in) :: cf integer :: n amp2 = 0 !$omp parallel do reduction(+:amp2) do n = 1, size (cf) if (cf(n)%i1 == cf(n)%i2) then amp2 = amp2 + cf(n)%factor * & real(amp(flv,cf(n)%i1,hel) * conjg(amp(flv,cf(n)%i2,hel))) else amp2 = amp2 + cf(n)%factor * 2 * & real(amp(flv,cf(n)%i1,hel) * conjg(amp(flv,cf(n)%i2,hel))) end if end do !$omp end parallel do end function ovm_color_sum @ \section{Utilities} <<[[omega_utils.f90]]>>= <> module omega_utils use kinds use omega_vectors use omega_polarizations implicit none private <> <> integer, parameter, public :: omega_utils_2010_01_A = 0 contains <> end module omega_utils @ \subsection{Helicity Selection Rule Heuristics} <>= public :: omega_update_helicity_selection @ <>= pure subroutine omega_update_helicity_selection & (count, amp, max_abs, sum_abs, mask, threshold, cutoff, mask_dirty) integer, intent(inout) :: count complex(kind=default), dimension(:,:,:), intent(in) :: amp real(kind=default), dimension(:), intent(inout) :: max_abs real(kind=default), intent(inout) :: sum_abs logical, dimension(:), intent(inout) :: mask real(kind=default), intent(in) :: threshold integer, intent(in) :: cutoff logical, intent(out) :: mask_dirty integer :: h real(kind=default) :: avg mask_dirty = .false. if (threshold > 0) then count = count + 1 if (count <= cutoff) then forall (h = lbound (amp, 3) : ubound (amp, 3)) max_abs(h) = max (max_abs(h), maxval (abs (amp(:,:,h)))) end forall sum_abs = sum_abs + sum (abs (amp)) if (count == cutoff) then avg = sum_abs / size (amp) / cutoff mask = max_abs >= threshold * epsilon (avg) * avg mask_dirty = .true. end if end if end if end subroutine omega_update_helicity_selection @ \subsection{Diagnostics} <>= public :: omega_report_helicity_selection @ We shoul try to use [[msg_message]] from WHIZARD's [[diagnostics]] module, but this would spoil independent builds. <>= subroutine omega_report_helicity_selection (mask, spin_states, threshold, unit) logical, dimension(:), intent(in) :: mask integer, dimension(:,:), intent(in) :: spin_states real(kind=default), intent(in) :: threshold integer, intent(in), optional :: unit integer :: u integer :: h, i if (present(unit)) then u = unit else u = 6 end if if (u >= 0) then write (unit = u, & fmt = "('| ','Contributing Helicity Combinations: ', I5, ' of ', I5)") & count (mask), size (mask) write (unit = u, & fmt = "('| ','Threshold: amp / avg > ', E9.2, ' = ', E9.2, ' * epsilon()')") & threshold * epsilon (threshold), threshold i = 0 do h = 1, size (mask) if (mask(h)) then i = i + 1 write (unit = u, fmt = "('| ',I4,': ',20I4)") i, spin_states (:, h) end if end do end if end subroutine omega_report_helicity_selection @ <>= public :: omega_ward_warn, omega_ward_panic @ The O'Mega amplitudes have only one particle off shell and are the sum of \emph{all} possible diagrams with the other particles on-shell. \begin{dubious} The problem with these gauge checks is that are numerically very small amplitudes that vanish analytically and that violate transversality. The hard part is to determine the thresholds that make threse tests usable. \end{dubious} <>= subroutine omega_ward_warn (name, m, k, e) character(len=*), intent(in) :: name real(kind=default), intent(in) :: m type(momentum), intent(in) :: k type(vector), intent(in) :: e type(vector) :: ek real(kind=default) :: abs_eke, abs_ek_abs_e ek = eps (m, k, 4) abs_eke = abs (ek * e) abs_ek_abs_e = abs (ek) * abs (e) print *, name, ":", abs_eke / abs_ek_abs_e, abs (ek), abs (e) if (abs_eke > 1000 * epsilon (abs_ek_abs_e)) then print *, "O'Mega: warning: non-transverse vector field: ", & name, ":", abs_eke / abs_ek_abs_e, abs (e) end if end subroutine omega_ward_warn @ <>= subroutine omega_ward_panic (name, m, k, e) character(len=*), intent(in) :: name real(kind=default), intent(in) :: m type(momentum), intent(in) :: k type(vector), intent(in) :: e type(vector) :: ek real(kind=default) :: abs_eke, abs_ek_abs_e ek = eps (m, k, 4) abs_eke = abs (ek * e) abs_ek_abs_e = abs (ek) * abs (e) if (abs_eke > 1000 * epsilon (abs_ek_abs_e)) then print *, "O'Mega: panic: non-transverse vector field: ", & name, ":", abs_eke / abs_ek_abs_e, abs (e) stop end if end subroutine omega_ward_panic @ <>= public :: omega_slavnov_warn, omega_slavnov_panic @ <>= subroutine omega_slavnov_warn (name, m, k, e, phi) character(len=*), intent(in) :: name real(kind=default), intent(in) :: m type(momentum), intent(in) :: k type(vector), intent(in) :: e complex(kind=default), intent(in) :: phi type(vector) :: ek real(kind=default) :: abs_eke, abs_ek_abs_e ek = eps (m, k, 4) abs_eke = abs (ek * e - phi) abs_ek_abs_e = abs (ek) * abs (e) print *, name, ":", abs_eke / abs_ek_abs_e, abs (ek), abs (e) if (abs_eke > 1000 * epsilon (abs_ek_abs_e)) then print *, "O'Mega: warning: non-transverse vector field: ", & name, ":", abs_eke / abs_ek_abs_e, abs (e) end if end subroutine omega_slavnov_warn @ <>= subroutine omega_slavnov_panic (name, m, k, e, phi) character(len=*), intent(in) :: name real(kind=default), intent(in) :: m type(momentum), intent(in) :: k type(vector), intent(in) :: e complex(kind=default), intent(in) :: phi type(vector) :: ek real(kind=default) :: abs_eke, abs_ek_abs_e ek = eps (m, k, 4) abs_eke = abs (ek * e - phi) abs_ek_abs_e = abs (ek) * abs (e) if (abs_eke > 1000 * epsilon (abs_ek_abs_e)) then print *, "O'Mega: panic: non-transverse vector field: ", & name, ":", abs_eke / abs_ek_abs_e, abs (e) stop end if end subroutine omega_slavnov_panic @ <>= public :: omega_check_arguments_warn, omega_check_arguments_panic @ <>= subroutine omega_check_arguments_warn (n, k) integer, intent(in) :: n real(kind=default), dimension(0:,:), intent(in) :: k integer :: i i = size(k,dim=1) if (i /= 4) then print *, "O'Mega: warning: wrong # of dimensions:", i end if i = size(k,dim=2) if (i /= n) then print *, "O'Mega: warning: wrong # of momenta:", i, & ", expected", n end if end subroutine omega_check_arguments_warn @ <>= subroutine omega_check_arguments_panic (n, k) integer, intent(in) :: n real(kind=default), dimension(0:,:), intent(in) :: k logical :: error integer :: i error = .false. i = size(k,dim=1) if (i /= n) then print *, "O'Mega: warning: wrong # of dimensions:", i error = .true. end if i = size(k,dim=2) if (i /= n) then print *, "O'Mega: warning: wrong # of momenta:", i, & ", expected", n error = .true. end if if (error) then stop end if end subroutine omega_check_arguments_panic @ <>= public :: omega_check_helicities_warn, omega_check_helicities_panic private :: omega_check_helicity @ <>= function omega_check_helicity (m, smax, s) result (error) real(kind=default), intent(in) :: m integer, intent(in) :: smax, s logical :: error select case (smax) case (0) error = (s /= 0) case (1) error = (abs (s) /= 1) case (2) if (m == 0.0_default) then error = .not. (abs (s) == 1 .or. abs (s) == 4) else error = .not. (abs (s) <= 1 .or. abs (s) == 4) end if case (4) error = .true. case default error = .true. end select end function omega_check_helicity @ <>= subroutine omega_check_helicities_warn (m, smax, s) real(kind=default), dimension(:), intent(in) :: m integer, dimension(:), intent(in) :: smax, s integer :: i do i = 1, size (m) if (omega_check_helicity (m(i), smax(i), s(i))) then print *, "O'Mega: warning: invalid helicity", s(i) end if end do end subroutine omega_check_helicities_warn @ <>= subroutine omega_check_helicities_panic (m, smax, s) real(kind=default), dimension(:), intent(in) :: m integer, dimension(:), intent(in) :: smax, s logical :: error logical :: error1 integer :: i error = .false. do i = 1, size (m) error1 = omega_check_helicity (m(i), smax(i), s(i)) if (error1) then print *, "O'Mega: panic: invalid helicity", s(i) error = .true. end if end do if (error) then stop end if end subroutine omega_check_helicities_panic @ <>= public :: omega_check_momenta_warn, omega_check_momenta_panic private :: check_momentum_conservation, check_mass_shell @ <>= integer, parameter, private :: MOMENTUM_TOLERANCE = 10000 @ <>= function check_momentum_conservation (k) result (error) real(kind=default), dimension(0:,:), intent(in) :: k logical :: error error = any (abs (sum (k(:,3:), dim = 2) - k(:,1) - k(:,2)) > & MOMENTUM_TOLERANCE * epsilon (maxval (abs (k), dim = 2))) if (error) then print *, sum (k(:,3:), dim = 2) - k(:,1) - k(:,2) print *, MOMENTUM_TOLERANCE * epsilon (maxval (abs (k), dim = 2)), & maxval (abs (k), dim = 2) end if end function check_momentum_conservation @ <>= integer, parameter, private :: ON_SHELL_TOLERANCE = 1000000 @ <>= function check_mass_shell (m, k) result (error) real(kind=default), intent(in) :: m real(kind=default), dimension(0:), intent(in) :: k real(kind=default) :: e2 logical :: error e2 = k(1)**2 + k(2)**2 + k(3)**2 + m**2 error = abs (k(0)**2 - e2) > ON_SHELL_TOLERANCE * epsilon (max (k(0)**2, e2)) if (error) then print *, k(0)**2 - e2 print *, ON_SHELL_TOLERANCE * epsilon (max (k(0)**2, e2)), max (k(0)**2, e2) end if end function check_mass_shell @ <>= subroutine omega_check_momenta_warn (m, k) real(kind=default), dimension(:), intent(in) :: m real(kind=default), dimension(0:,:), intent(in) :: k integer :: i if (check_momentum_conservation (k)) then print *, "O'Mega: warning: momentum not conserved" end if do i = 1, size(m) if (check_mass_shell (m(i), k(:,i))) then print *, "O'Mega: warning: particle #", i, "not on-shell" end if end do end subroutine omega_check_momenta_warn @ <>= subroutine omega_check_momenta_panic (m, k) real(kind=default), dimension(:), intent(in) :: m real(kind=default), dimension(0:,:), intent(in) :: k logical :: error logical :: error1 integer :: i error = check_momentum_conservation (k) if (error) then print *, "O'Mega: panic: momentum not conserved" end if do i = 1, size(m) error1 = check_mass_shell (m(i), k(0:,i)) if (error1) then print *, "O'Mega: panic: particle #", i, "not on-shell" error = .true. end if end do if (error) then stop end if end subroutine omega_check_momenta_panic @ \subsection{Obsolete Summation} \subsubsection{Spin/Helicity Summation} <>= public :: omega_sum, omega_sum_nonzero, omega_nonzero private :: state_index @ <>= pure function omega_sum (omega, p, states, fixed) result (sigma) real(kind=default) :: sigma real(kind=default), dimension(0:,:), intent(in) :: p integer, dimension(:), intent(in), optional :: states, fixed <<[[interface]] for O'Mega Amplitude>> integer, dimension(size(p,dim=2)) :: s, nstates integer :: j complex(kind=default) :: a if (present (states)) then nstates = states else nstates = 2 end if sigma = 0 s = -1 sum_spins: do if (present (fixed)) then !!! print *, 's = ', s, ', fixed = ', fixed, ', nstates = ', nstates, & !!! ', fixed|s = ', merge (fixed, s, mask = nstates == 0) a = omega (p, merge (fixed, s, mask = nstates == 0)) else a = omega (p, s) end if sigma = sigma + a * conjg(a) <> end do sum_spins sigma = sigma / num_states (2, nstates(1:2)) end function omega_sum @ We're looping over all spins like a $n$-ary numbers $(-1,\ldots,-1,-1)$, $(-1,\ldots,-1,0)$, $(-1,\ldots,-1,1)$, $(-1,\ldots,0,-1)$, \ldots, $(1,\ldots,1,0)$, $(1,\ldots,1,1)$: <>= do j = size (p, dim = 2), 1, -1 select case (nstates (j)) case (3) ! massive vectors s(j) = modulo (s(j) + 2, 3) - 1 case (2) ! spinors, massless vectors s(j) = - s(j) case (1) ! scalars s(j) = -1 case (0) ! fized spin s(j) = -1 case default ! ??? s(j) = -1 end select if (s(j) /= -1) then cycle sum_spins end if end do exit sum_spins @ The dual operation evaluates an $n$-number: <>= pure function state_index (s, states) result (n) integer, dimension(:), intent(in) :: s integer, dimension(:), intent(in), optional :: states integer :: n integer :: j, p n = 1 p = 1 if (present (states)) then do j = size (s), 1, -1 select case (states(j)) case (3) n = n + p * (s(j) + 1) case (2) n = n + p * (s(j) + 1) / 2 end select p = p * states(j) end do else do j = size (s), 1, -1 n = n + p * (s(j) + 1) / 2 p = p * 2 end do end if end function state_index @ <<[[interface]] for O'Mega Amplitude>>= interface pure function omega (p, s) result (me) use kinds implicit none complex(kind=default) :: me real(kind=default), dimension(0:,:), intent(in) :: p integer, dimension(:), intent(in) :: s end function omega end interface @ <>= public :: num_states @ <>= pure function num_states (n, states) result (ns) integer, intent(in) :: n integer, dimension(:), intent(in), optional :: states integer :: ns if (present (states)) then ns = product (states, mask = states == 2 .or. states == 3) else ns = 2**n end if end function num_states @ \section{\texttt{omega95}} <<[[omega95.f90]]>>= <> module omega95 use constants use omega_spinors use omega_vectors use omega_polarizations use omega_tensors use omega_tensor_polarizations use omega_couplings use omega_spinor_couplings use omega_color use omega_utils public end module omega95 @ \section{\texttt{omega95} Revisited} <<[[omega95_bispinors.f90]]>>= <> module omega95_bispinors use constants use omega_bispinors use omega_vectors use omega_vectorspinors use omega_polarizations use omega_vspinor_polarizations use omega_couplings use omega_bispinor_couplings use omega_color use omega_utils public end module omega95_bispinors @ \section{Testing} <<[[omega_testtools.f90]]>>= <> module omega_testtools use kinds implicit none private real(kind=default), parameter, private :: ABS_THRESHOLD_DEFAULT = 1E-17 real(kind=default), parameter, private :: THRESHOLD_DEFAULT = 0.6 real(kind=default), parameter, private :: THRESHOLD_WARN = 0.8 <> contains <> end module omega_testtools @ Quantify the agreement of two real or complex numbers \begin{equation} \text{agreement}(x,y) = \frac{\ln \Delta(x,y)}{\ln\epsilon} \in[0,1] \end{equation} with \begin{equation} \Delta(x,y) = \frac{|x-y|}{\max(|x|,|y|)} \end{equation} and values outside~$[0,1]$ replaced the closed value in the interval. In other words \begin{itemize} \item $1$ for $x-y=\max(|x|,|y|)\cdot\mathcal{O}(\epsilon)$ and \item $0$~for $x-y=\max(|x|,|y|)\cdot\mathcal{O}(1)$ \end{itemize} with logarithmic interpolation. The cases~$x=0$ and~$y=0$ must be treated separately. <>= public :: agreement interface agreement module procedure agreement_real, agreement_complex, & agreement_real_complex, agreement_complex_real, & agreement_integer_complex, agreement_complex_integer, & agreement_integer_real, agreement_real_integer end interface private :: agreement_real, agreement_complex, & agreement_real_complex, agreement_complex_real, & agreement_integer_complex, agreement_complex_integer, & agreement_integer_real, agreement_real_integer @ <>= elemental function agreement_real (x, y, base) result (a) real(kind=default) :: a real(kind=default), intent(in) :: x, y real(kind=default), intent(in), optional :: base real(kind=default) :: scale, dxy if (present (base)) then scale = max (abs (x), abs (y), abs (base)) else scale = max (abs (x), abs (y)) end if if (ieee_is_nan (x) .or. ieee_is_nan (y)) then a = 0 else if (scale <= 0) then a = -1 else dxy = abs (x - y) / scale if (dxy <= 0.0_default) then a = 1 else a = log (dxy) / log (epsilon (scale)) a = max (0.0_default, min (1.0_default, a)) if (ieee_is_nan (a)) then a = 0 end if end if end if if (ieee_is_nan (a)) then a = 0 end if end function agreement_real @ Poor man's replacement <>= elemental function ieee_is_nan (x) result (yorn) logical :: yorn real (kind=default), intent(in) :: x yorn = (x /= x) end function ieee_is_nan @ <>= elemental function agreement_complex (x, y, base) result (a) real(kind=default) :: a complex(kind=default), intent(in) :: x, y real(kind=default), intent(in), optional :: base real(kind=default) :: scale, dxy if (present (base)) then scale = max (abs (x), abs (y), abs (base)) else scale = max (abs (x), abs (y)) end if if ( ieee_is_nan (real (x, kind=default)) .or. ieee_is_nan (aimag (x)) & .or. ieee_is_nan (real (y, kind=default)) .or. ieee_is_nan (aimag (y))) then a = 0 else if (scale <= 0) then a = -1 else dxy = abs (x - y) / scale if (dxy <= 0.0_default) then a = 1 else a = log (dxy) / log (epsilon (scale)) a = max (0.0_default, min (1.0_default, a)) if (ieee_is_nan (a)) then a = 0 end if end if end if if (ieee_is_nan (a)) then a = 0 end if end function agreement_complex @ <>= elemental function agreement_real_complex (x, y, base) result (a) real(kind=default) :: a real(kind=default), intent(in) :: x complex(kind=default), intent(in) :: y real(kind=default), intent(in), optional :: base a = agreement_complex (cmplx (x, kind=default), y, base) end function agreement_real_complex @ <>= elemental function agreement_complex_real (x, y, base) result (a) real(kind=default) :: a complex(kind=default), intent(in) :: x real(kind=default), intent(in) :: y real(kind=default), intent(in), optional :: base a = agreement_complex (x, cmplx (y, kind=default), base) end function agreement_complex_real @ <>= elemental function agreement_integer_complex (x, y, base) result (a) real(kind=default) :: a integer, intent(in) :: x complex(kind=default), intent(in) :: y real(kind=default), intent(in), optional :: base a = agreement_complex (cmplx (x, kind=default), y, base) end function agreement_integer_complex @ <>= elemental function agreement_complex_integer (x, y, base) result (a) real(kind=default) :: a complex(kind=default), intent(in) :: x integer, intent(in) :: y real(kind=default), intent(in), optional :: base a = agreement_complex (x, cmplx (y, kind=default), base) end function agreement_complex_integer @ <>= elemental function agreement_integer_real (x, y, base) result (a) real(kind=default) :: a integer, intent(in) :: x real(kind=default), intent(in) :: y real(kind=default), intent(in), optional :: base a = agreement_real (real(x, kind=default), y, base) end function agreement_integer_real @ <>= elemental function agreement_real_integer (x, y, base) result (a) real(kind=default) :: a real(kind=default), intent(in) :: x integer, intent(in) :: y real(kind=default), intent(in), optional :: base a = agreement_real (x, real (y, kind=default), base) end function agreement_real_integer @ <>= public:: vanishes interface vanishes module procedure vanishes_real, vanishes_complex end interface private :: vanishes_real, vanishes_complex @ <>= elemental function vanishes_real (x, scale) result (a) real(kind=default) :: a real(kind=default), intent(in) :: x real(kind=default), intent(in), optional :: scale real(kind=default) :: scaled_x if (x == 0.0_default) then a = 1 return else if (ieee_is_nan (x)) then a = 0 return end if scaled_x = x if (present (scale)) then if (scale /= 0) then scaled_x = x / abs (scale) else a = 0 return end if else end if a = log (abs (scaled_x)) / log (epsilon (scaled_x)) a = max (0.0_default, min (1.0_default, a)) if (ieee_is_nan (a)) then a = 0 end if end function vanishes_real @ <>= elemental function vanishes_complex (x, scale) result (a) real(kind=default) :: a complex(kind=default), intent(in) :: x real(kind=default), intent(in), optional :: scale a = vanishes_real (abs (x), scale) end function vanishes_complex @ <>= public :: expect interface expect module procedure expect_integer, expect_real, expect_complex, & expect_real_integer, expect_integer_real, & expect_complex_integer, expect_integer_complex, & expect_complex_real, expect_real_complex end interface private :: expect_integer, expect_real, expect_complex, & expect_real_integer, expect_integer_real, & expect_complex_integer, expect_integer_complex, & expect_complex_real, expect_real_complex @ <>= subroutine expect_integer (x, x0, msg, passed, quiet, buffer, unit) integer, intent(in) :: x, x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed logical, intent(in), optional :: quiet character(len=*), intent(inout), optional :: buffer integer, intent(in), optional :: unit logical :: failed, verbose character(len=*), parameter :: fmt = "(1X,A,': ',A)" character(len=*), parameter :: & fmt_verbose = "(1X,A,': ',A,' [expected ',I6,', got ',I6,']')" failed = .false. verbose = .true. if (present (quiet)) then verbose = .not.quiet end if if (x == x0) then if (verbose) then if (.not. (present (buffer) .or. present (unit))) then write (unit = *, fmt = fmt) msg, "passed" end if if (present (unit)) then write (unit = unit, fmt = fmt) msg, "passed" end if if (present (buffer)) then write (unit = buffer, fmt = fmt) msg, "passed" end if end if else if (.not. (present (buffer) .or. present (unit))) then write (unit = *, fmt = fmt_verbose) msg, "failed", x0, x end if if (present (unit)) then write (unit = unit, fmt = fmt_verbose) msg, "failed", x0, x end if if (present (buffer)) then write (unit = buffer, fmt = fmt_verbose) msg, "failed", x0, x end if failed = .true. end if if (present (passed)) then passed = passed .and. .not.failed end if end subroutine expect_integer @ <>= subroutine expect_real (x, x0, msg, passed, threshold, quiet, abs_threshold) real(kind=default), intent(in) :: x, x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold real(kind=default), intent(in), optional :: abs_threshold logical, intent(in), optional :: quiet logical :: failed, verbose real(kind=default) :: agreement_threshold, abs_agreement_threshold character(len=*), parameter :: fmt = "(1X,A,': ',A,' at ',I4,'%')" character(len=*), parameter :: fmt_verbose = "(1X,A,': ',A,' at ',I4,'%'," // & "' [expected ',E10.3,', got ',E10.3,']')" real(kind=default) :: a failed = .false. verbose = .true. if (present (quiet)) then verbose = .not.quiet end if if (x == x0) then if (verbose) then write (unit = *, fmt = fmt) msg, "passed", 100 end if else if (x0 == 0) then a = vanishes (x) else a = agreement (x, x0) end if if (present (threshold)) then agreement_threshold = threshold else agreement_threshold = THRESHOLD_DEFAULT end if if (present (abs_threshold)) then abs_agreement_threshold = abs_threshold else abs_agreement_threshold = ABS_THRESHOLD_DEFAULT end if if (a >= agreement_threshold .or. & max(abs(x), abs(x0)) <= abs_agreement_threshold) then if (verbose) then if (a >= THRESHOLD_WARN) then write (unit = *, fmt = fmt) msg, "passed", int (a * 100) else write (unit = *, fmt = fmt_verbose) msg, "passed", int (a * 100), x0, x end if end if else failed = .true. write (unit = *, fmt = fmt_verbose) msg, "failed", int (a * 100), x0, x end if end if if (present (passed)) then passed = passed .and. .not. failed end if end subroutine expect_real @ <>= subroutine expect_complex (x, x0, msg, passed, threshold, quiet, abs_threshold) complex(kind=default), intent(in) :: x, x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold real(kind=default), intent(in), optional :: abs_threshold logical, intent(in), optional :: quiet logical :: failed, verbose real(kind=default) :: agreement_threshold, abs_agreement_threshold character(len=*), parameter :: fmt = "(1X,A,': ',A,' at ',I4,'%')" character(len=*), parameter :: fmt_verbose = "(1X,A,': ',A,' at ',I4,'%'," // & "' [expected (',E10.3,',',E10.3,'), got (',E10.3,',',E10.3,')]')" character(len=*), parameter :: fmt_phase = "(1X,A,': ',A,' at ',I4,'%'," // & "' [modulus passed at ',I4,'%',', phases ',F5.3,' vs. ',F5.3,']')" real(kind=default) :: a, a_modulus failed = .false. verbose = .true. if (present (quiet)) then verbose = .not.quiet end if if (x == x0) then if (verbose) then write (unit = *, fmt = fmt) msg, "passed", 100 end if else if (x0 == 0) then a = vanishes (x) else a = agreement (x, x0) end if if (present (threshold)) then agreement_threshold = threshold else agreement_threshold = THRESHOLD_DEFAULT end if if (present (abs_threshold)) then abs_agreement_threshold = abs_threshold else abs_agreement_threshold = ABS_THRESHOLD_DEFAULT end if if (a >= agreement_threshold .or. & max(abs(x), abs(x0)) <= abs_agreement_threshold) then if (verbose) then if (a >= THRESHOLD_WARN) then write (unit = *, fmt = fmt) msg, "passed", int (a * 100) else write (unit = *, fmt = fmt_verbose) msg, "passed", int (a * 100), x0, x end if end if else a_modulus = agreement (abs (x), abs (x0)) if (a_modulus >= agreement_threshold) then write (unit = *, fmt = fmt_phase) msg, "failed", int (a * 100), & int (a_modulus * 100), & atan2 (real (x, kind=default), aimag (x)), & atan2 (real (x0, kind=default), aimag (x0)) else write (unit = *, fmt = fmt_verbose) msg, "failed", int (a * 100), x0, x end if failed = .true. end if end if if (present (passed)) then passed = passed .and. .not.failed end if end subroutine expect_complex @ <>= subroutine expect_real_integer (x, x0, msg, passed, threshold, quiet) real(kind=default), intent(in) :: x integer, intent(in) :: x0 character(len=*), intent(in) :: msg real(kind=default), intent(in), optional :: threshold logical, intent(inout), optional :: passed logical, intent(in), optional :: quiet call expect_real (x, real (x0, kind=default), msg, passed, threshold, quiet) end subroutine expect_real_integer @ <>= subroutine expect_integer_real (x, x0, msg, passed, threshold, quiet) integer, intent(in) :: x real(kind=default), intent(in) :: x0 character(len=*), intent(in) :: msg real(kind=default), intent(in), optional :: threshold logical, intent(inout), optional :: passed logical, intent(in), optional :: quiet call expect_real (real (x, kind=default), x0, msg, passed, threshold, quiet) end subroutine expect_integer_real @ <>= subroutine expect_complex_integer (x, x0, msg, passed, threshold, quiet) complex(kind=default), intent(in) :: x integer, intent(in) :: x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold logical, intent(in), optional :: quiet call expect_complex (x, cmplx (x0, kind=default), msg, passed, threshold, quiet) end subroutine expect_complex_integer @ <>= subroutine expect_integer_complex (x, x0, msg, passed, threshold, quiet) integer, intent(in) :: x complex(kind=default), intent(in) :: x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold logical, intent(in), optional :: quiet call expect_complex (cmplx (x, kind=default), x0, msg, passed, threshold, quiet) end subroutine expect_integer_complex @ <>= subroutine expect_complex_real (x, x0, msg, passed, threshold, quiet) complex(kind=default), intent(in) :: x real(kind=default), intent(in) :: x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold logical, intent(in), optional :: quiet call expect_complex (x, cmplx (x0, kind=default), msg, passed, threshold, quiet) end subroutine expect_complex_real @ <>= subroutine expect_real_complex (x, x0, msg, passed, threshold, quiet) real(kind=default), intent(in) :: x complex(kind=default), intent(in) :: x0 character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold logical, intent(in), optional :: quiet call expect_complex (cmplx (x, kind=default), x0, msg, passed, threshold, quiet) end subroutine expect_real_complex @ <>= public :: expect_zero interface expect_zero module procedure expect_zero_integer, expect_zero_real, expect_zero_complex end interface private :: expect_zero_integer, expect_zero_real, expect_zero_complex @ <>= subroutine expect_zero_integer (x, msg, passed) integer, intent(in) :: x character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed call expect_integer (x, 0, msg, passed) end subroutine expect_zero_integer @ <>= subroutine expect_zero_real (x, scale, msg, passed, threshold, quiet) real(kind=default), intent(in) :: x, scale character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold logical, intent(in), optional :: quiet logical :: failed, verbose real(kind=default) :: agreement_threshold character(len=*), parameter :: fmt = "(1X,A,': ',A,' at ',I4,'%')" character(len=*), parameter :: fmt_verbose = "(1X,A,': ',A,' at ',I4,'%'," // & "' [expected 0 (relative to ',E10.3,') got ',E10.3,']')" real(kind=default) :: a failed = .false. verbose = .true. if (present (quiet)) then verbose = .not.quiet end if if (x == 0) then if (verbose) then write (unit = *, fmt = fmt) msg, "passed", 100 end if else a = vanishes (x, scale = scale) if (present (threshold)) then agreement_threshold = threshold else agreement_threshold = THRESHOLD_DEFAULT end if if (a >= agreement_threshold) then if (verbose) then if (a >= THRESHOLD_WARN) then write (unit = *, fmt = fmt) msg, "passed", int (a * 100) else write (unit = *, fmt = fmt_verbose) msg, "passed", int (a * 100), scale, x end if end if else failed = .true. write (unit = *, fmt = fmt_verbose) msg, "failed", int (a * 100), scale, x end if end if if (present (passed)) then passed = passed .and. .not.failed end if end subroutine expect_zero_real @ <>= subroutine expect_zero_complex (x, scale, msg, passed, threshold, quiet) complex(kind=default), intent(in) :: x real(kind=default), intent(in) :: scale character(len=*), intent(in) :: msg logical, intent(inout), optional :: passed real(kind=default), intent(in), optional :: threshold logical, intent(in), optional :: quiet call expect_zero_real (abs (x), scale, msg, passed, threshold, quiet) end subroutine expect_zero_complex @ <>= subroutine print_matrix (a) complex(kind=default), dimension(:,:), intent(in) :: a integer :: row do row = 1, size (a, dim=1) write (unit = *, fmt = "(10(tr2, f5.2, '+', f5.2, 'I'))") a(row,:) end do end subroutine print_matrix @ <>= public :: print_matrix @ <<[[test_omega95.f90]]>>= <> program test_omega95 use kinds use omega95 use omega_testtools implicit none real(kind=default) :: m, pabs, qabs, w real(kind=default), dimension(0:3) :: r complex(kind=default) :: c_one, c_nil type(momentum) :: p, q, p0 type(vector) :: vp, vq, vtest, v0 type(tensor) :: ttest type(spinor) :: test_psi, test_spinor1, test_spinor2 type(conjspinor) :: test_psibar, test_conjspinor1, test_conjspinor2 integer, dimension(8) :: date_time integer :: rsize, i logical :: passed call date_and_time (values = date_time) call random_seed (size = rsize) call random_seed (put = spread (product (date_time), dim = 1, ncopies = rsize)) w = 1.4142 c_one = 1.0_default c_nil = 0.0_default m = 13 pabs = 42 qabs = 137 call random_number (r) vtest%t = cmplx (10.0_default * r(0), kind=default) vtest%x(1:3) = cmplx (10.0_default * r(1:3), kind=default) ttest = vtest.tprod.vtest call random_momentum (p, pabs, m) call random_momentum (q, qabs, m) call random_momentum (p0, 0.0_default, m) vp = p vq = q v0 = p0 passed = .true. <> if (.not. passed) then stop 1 end if end program test_omega95 @ <>= print *, "*** Checking the equations of motion ***:" call expect (abs(f_vf(c_one,vp,u(m,p,+1))-m*u(m,p,+1)), 0, "|[p-m]u(+)|=0", passed) call expect (abs(f_vf(c_one,vp,u(m,p,-1))-m*u(m,p,-1)), 0, "|[p-m]u(-)|=0", passed) call expect (abs(f_vf(c_one,vp,v(m,p,+1))+m*v(m,p,+1)), 0, "|[p+m]v(+)|=0", passed) call expect (abs(f_vf(c_one,vp,v(m,p,-1))+m*v(m,p,-1)), 0, "|[p+m]v(-)|=0", passed) call expect (abs(f_fv(c_one,ubar(m,p,+1),vp)-m*ubar(m,p,+1)), 0, "|ubar(+)[p-m]|=0", passed) call expect (abs(f_fv(c_one,ubar(m,p,-1),vp)-m*ubar(m,p,-1)), 0, "|ubar(-)[p-m]|=0", passed) call expect (abs(f_fv(c_one,vbar(m,p,+1),vp)+m*vbar(m,p,+1)), 0, "|vbar(+)[p+m]|=0", passed) call expect (abs(f_fv(c_one,vbar(m,p,-1),vp)+m*vbar(m,p,-1)), 0, "|vbar(-)[p+m]|=0", passed) print *, "*** Checking the equations of motion for negative mass***:" call expect (abs(f_vf(c_one,vp,u(-m,p,+1))+m*u(-m,p,+1)), 0, "|[p+m]u(+)|=0", passed) call expect (abs(f_vf(c_one,vp,u(-m,p,-1))+m*u(-m,p,-1)), 0, "|[p+m]u(-)|=0", passed) call expect (abs(f_vf(c_one,vp,v(-m,p,+1))-m*v(-m,p,+1)), 0, "|[p-m]v(+)|=0", passed) call expect (abs(f_vf(c_one,vp,v(-m,p,-1))-m*v(-m,p,-1)), 0, "|[p-m]v(-)|=0", passed) call expect (abs(f_fv(c_one,ubar(-m,p,+1),vp)+m*ubar(-m,p,+1)), 0, "|ubar(+)[p+m]|=0", passed) call expect (abs(f_fv(c_one,ubar(-m,p,-1),vp)+m*ubar(-m,p,-1)), 0, "|ubar(-)[p+m]|=0", passed) call expect (abs(f_fv(c_one,vbar(-m,p,+1),vp)-m*vbar(-m,p,+1)), 0, "|vbar(+)[p-m]|=0", passed) call expect (abs(f_fv(c_one,vbar(-m,p,-1),vp)-m*vbar(-m,p,-1)), 0, "|vbar(-)[p-m]|=0", passed) @ <>= print *, "*** Spin Sums" test_psi%a = [one, two, three, four] test_spinor1 = f_vf (c_one, vp, test_psi) + m * test_psi test_spinor2 = u (m, p, +1) * (ubar (m, p, +1) * test_psi) + & u (m, p, -1) * (ubar (m, p, -1) * test_psi) do i = 1, 4 call expect (test_spinor1%a(i), test_spinor2%a(i), "(p+m)1=(sum u ubar)1", passed) end do test_spinor1 = f_vf (c_one, vp, test_psi) - m * test_psi test_spinor2 = v (m, p, +1) * (vbar (m, p, +1) * test_psi) + & v (m, p, -1) * (vbar (m, p, -1) * test_psi) do i = 1, 4 call expect (test_spinor1%a(i), test_spinor2%a(i), "(p-m)1=(sum v vbar)1", passed) end do test_psibar%a = [one, two, three, four] test_conjspinor1 = f_fv (c_one, test_psibar, vp) - m * test_psibar test_conjspinor2 = (test_psibar * v (m, p, +1)) * vbar (m, p, +1) + & (test_psibar * v (m, p, -1)) * vbar (m, p, -1) do i = 1, 4 call expect (test_conjspinor1%a(i), test_conjspinor2%a(i), "(p-m)1=(sum v vbar)1", passed) end do @ <>= print *, "*** Checking the normalization ***:" call expect (ubar(m,p,+1)*u(m,p,+1), +2*m, "ubar(+)*u(+)=+2m", passed) call expect (ubar(m,p,-1)*u(m,p,-1), +2*m, "ubar(-)*u(-)=+2m", passed) call expect (vbar(m,p,+1)*v(m,p,+1), -2*m, "vbar(+)*v(+)=-2m", passed) call expect (vbar(m,p,-1)*v(m,p,-1), -2*m, "vbar(-)*v(-)=-2m", passed) call expect (ubar(m,p,+1)*v(m,p,+1), 0, "ubar(+)*v(+)=0 ", passed) call expect (ubar(m,p,-1)*v(m,p,-1), 0, "ubar(-)*v(-)=0 ", passed) call expect (vbar(m,p,+1)*u(m,p,+1), 0, "vbar(+)*u(+)=0 ", passed) call expect (vbar(m,p,-1)*u(m,p,-1), 0, "vbar(-)*u(-)=0 ", passed) print *, "*** Checking the normalization for negative masses***:" call expect (ubar(-m,p,+1)*u(-m,p,+1), -2*m, "ubar(+)*u(+)=-2m", passed) call expect (ubar(-m,p,-1)*u(-m,p,-1), -2*m, "ubar(-)*u(-)=-2m", passed) call expect (vbar(-m,p,+1)*v(-m,p,+1), +2*m, "vbar(+)*v(+)=+2m", passed) call expect (vbar(-m,p,-1)*v(-m,p,-1), +2*m, "vbar(-)*v(-)=+2m", passed) call expect (ubar(-m,p,+1)*v(-m,p,+1), 0, "ubar(+)*v(+)=0 ", passed) call expect (ubar(-m,p,-1)*v(-m,p,-1), 0, "ubar(-)*v(-)=0 ", passed) call expect (vbar(-m,p,+1)*u(-m,p,+1), 0, "vbar(+)*u(+)=0 ", passed) call expect (vbar(-m,p,-1)*u(-m,p,-1), 0, "vbar(-)*u(-)=0 ", passed) @ <>= print *, "*** Checking the currents ***:" call expect (abs(v_ff(c_one,ubar(m,p,+1),u(m,p,+1))-2*vp), 0, "ubar(+).V.u(+)=2p", passed) call expect (abs(v_ff(c_one,ubar(m,p,-1),u(m,p,-1))-2*vp), 0, "ubar(-).V.u(-)=2p", passed) call expect (abs(v_ff(c_one,vbar(m,p,+1),v(m,p,+1))-2*vp), 0, "vbar(+).V.v(+)=2p", passed) call expect (abs(v_ff(c_one,vbar(m,p,-1),v(m,p,-1))-2*vp), 0, "vbar(-).V.v(-)=2p", passed) print *, "*** Checking the currents for negative masses***:" call expect (abs(v_ff(c_one,ubar(-m,p,+1),u(-m,p,+1))-2*vp), 0, "ubar(+).V.u(+)=2p", passed) call expect (abs(v_ff(c_one,ubar(-m,p,-1),u(-m,p,-1))-2*vp), 0, "ubar(-).V.u(-)=2p", passed) call expect (abs(v_ff(c_one,vbar(-m,p,+1),v(-m,p,+1))-2*vp), 0, "vbar(+).V.v(+)=2p", passed) call expect (abs(v_ff(c_one,vbar(-m,p,-1),v(-m,p,-1))-2*vp), 0, "vbar(-).V.v(-)=2p", passed) @ <>= print *, "*** Checking current conservation ***:" call expect ((vp-vq)*v_ff(c_one,ubar(m,p,+1),u(m,q,+1)), 0, "d(ubar(+).V.u(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,ubar(m,p,-1),u(m,q,-1)), 0, "d(ubar(-).V.u(-))=0", passed) call expect ((vp-vq)*v_ff(c_one,vbar(m,p,+1),v(m,q,+1)), 0, "d(vbar(+).V.v(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,vbar(m,p,-1),v(m,q,-1)), 0, "d(vbar(-).V.v(-))=0", passed) print *, "*** Checking current conservation for negative masses***:" call expect ((vp-vq)*v_ff(c_one,ubar(-m,p,+1),u(-m,q,+1)), 0, "d(ubar(+).V.u(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,ubar(-m,p,-1),u(-m,q,-1)), 0, "d(ubar(-).V.u(-))=0", passed) call expect ((vp-vq)*v_ff(c_one,vbar(-m,p,+1),v(-m,q,+1)), 0, "d(vbar(+).V.v(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,vbar(-m,p,-1),v(-m,q,-1)), 0, "d(vbar(-).V.v(-))=0", passed) @ <>= if (m == 0) then print *, "*** Checking axial current conservation ***:" call expect ((vp-vq)*a_ff(c_one,ubar(m,p,+1),u(m,q,+1)), 0, "d(ubar(+).A.u(+))=0", passed) call expect ((vp-vq)*a_ff(c_one,ubar(m,p,-1),u(m,q,-1)), 0, "d(ubar(-).A.u(-))=0", passed) call expect ((vp-vq)*a_ff(c_one,vbar(m,p,+1),v(m,q,+1)), 0, "d(vbar(+).A.v(+))=0", passed) call expect ((vp-vq)*a_ff(c_one,vbar(m,p,-1),v(m,q,-1)), 0, "d(vbar(-).A.v(-))=0", passed) end if @ <>= print *, "*** Checking implementation of the sigma vertex funktions ***:" call expect ((vp*tvam_ff(c_one,c_nil,ubar(m,p,+1),u(m,q,+1),q) - (p*q-m**2)*(ubar(m,p,+1)*u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).u(q,+)] - (p*q-m^2)*ubar(p,+).u(q,+) = 0", passed) call expect ((vp*tvam_ff(c_one,c_nil,ubar(m,p,-1),u(m,q,-1),q) - (p*q-m**2)*(ubar(m,p,-1)*u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).u(q,-)] - (p*q-m^2)*ubar(p,-).u(q,-) = 0", passed) call expect ((vp*tvam_ff(c_one,c_nil,vbar(m,p,+1),v(m,q,+1),q) - (p*q-m**2)*(vbar(m,p,+1)*v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).v(q,+)] - (p*q-m^2)*vbar(p,+).v(q,+) = 0", passed) call expect ((vp*tvam_ff(c_one,c_nil,vbar(m,p,-1),v(m,q,-1),q) - (p*q-m**2)*(vbar(m,p,-1)*v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).v(q,-)] - (p*q-m^2)*vbar(p,-).v(q,-) = 0", passed) call expect ((ubar(m,p,+1)*f_tvamf(c_one,c_nil,vp,u(m,q,+1),q) - (p*q-m**2)*(ubar(m,p,+1)*u(m,q,+1))), 0, & "ubar(p,+).[p*(Isigma*q).u(q,+)] - (p*q-m^2)*ubar(p,+).u(q,+) = 0", passed) call expect ((ubar(m,p,-1)*f_tvamf(c_one,c_nil,vp,u(m,q,-1),q) - (p*q-m**2)*(ubar(m,p,-1)*u(m,q,-1))), 0, & "ubar(p,-).[p*(Isigma*q).u(q,-)] - (p*q-m^2)*ubar(p,-).u(q,-) = 0", passed) call expect ((vbar(m,p,+1)*f_tvamf(c_one,c_nil,vp,v(m,q,+1),q) - (p*q-m**2)*(vbar(m,p,+1)*v(m,q,+1))), 0, & "vbar(p,+).[p*(Isigma*q).v(q,+)] - (p*q-m^2)*vbar(p,+).v(q,+) = 0", passed) call expect ((vbar(m,p,-1)*f_tvamf(c_one,c_nil,vp,v(m,q,-1),q) - (p*q-m**2)*(vbar(m,p,-1)*v(m,q,-1))), 0, & "vbar(p,-).[p*(Isigma*q).v(q,-)] - (p*q-m^2)*vbar(p,-).v(q,-) = 0", passed) call expect ((f_ftvam(c_one,c_nil,ubar(m,p,+1),vp,q)*u(m,q,+1) - (p*q-m**2)*(ubar(m,p,+1)*u(m,q,+1))), 0, & "[ubar(p,+).p*(Isigma*q)].u(q,+) - (p*q-m^2)*ubar(p,+).u(q,+) = 0", passed) call expect ((f_ftvam(c_one,c_nil,ubar(m,p,-1),vp,q)*u(m,q,-1) - (p*q-m**2)*(ubar(m,p,-1)*u(m,q,-1))), 0, & "[ubar(p,-).p*(Isigma*q)].u(q,-) - (p*q-m^2)*ubar(p,-).u(q,-) = 0", passed) call expect ((f_ftvam(c_one,c_nil,vbar(m,p,+1),vp,q)*v(m,q,+1) - (p*q-m**2)*(vbar(m,p,+1)*v(m,q,+1))), 0, & "[vbar(p,+).p*(Isigma*q)].v(q,+) - (p*q-m^2)*vbar(p,+).v(q,+) = 0", passed) call expect ((f_ftvam(c_one,c_nil,vbar(m,p,-1),vp,q)*v(m,q,-1) - (p*q-m**2)*(vbar(m,p,-1)*v(m,q,-1))), 0, & "[vbar(p,-).p*(Isigma*q)].v(q,-) - (p*q-m^2)*vbar(p,-).v(q,-) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,ubar(m,p,+1),u(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,ubar(m,p,+1),u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).g5.u(q,+)] - (p*q+m^2)*ubar(p,+).g5.u(q,+) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,ubar(m,p,-1),u(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,ubar(m,p,-1),u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).g5.u(q,-)] - (p*q+m^2)*ubar(p,-).g5.u(q,-) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,vbar(m,p,+1),v(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,vbar(m,p,+1),v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).g5.v(q,+)] - (p*q+m^2)*vbar(p,+).g5.v(q,+) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,vbar(m,p,-1),v(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,vbar(m,p,-1),v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).g5.v(q,-)] - (p*q+m^2)*vbar(p,-).g5.v(q,-) = 0", passed) call expect ((ubar(m,p,+1)*f_tvamf(c_nil,c_one,vp,u(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,ubar(m,p,+1),u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).g5.u(q,+)] - (p*q+m^2)*ubar(p,+).g5.u(q,+) = 0", passed) call expect ((ubar(m,p,-1)*f_tvamf(c_nil,c_one,vp,u(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,ubar(m,p,-1),u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).g5.u(q,-)] - (p*q+m^2)*ubar(p,-).g5.u(q,-) = 0", passed) call expect ((vbar(m,p,+1)*f_tvamf(c_nil,c_one,vp,v(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,vbar(m,p,+1),v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).g5.v(q,+)] - (p*q+m^2)*vbar(p,+).g5.v(q,+) = 0", passed) call expect ((vbar(m,p,-1)*f_tvamf(c_nil,c_one,vp,v(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,vbar(m,p,-1),v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).g5.v(q,-)] - (p*q+m^2)*vbar(p,-).g5.v(q,-) = 0", passed) call expect ((f_ftvam(c_nil,c_one,ubar(m,p,+1),vp,q)*u(m,q,+1) - (p*q+m**2)*p_ff(c_one,ubar(m,p,+1),u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).g5.u(q,+)] - (p*q+m^2)*ubar(p,+).g5.u(q,+) = 0", passed) call expect ((f_ftvam(c_nil,c_one,ubar(m,p,-1),vp,q)*u(m,q,-1) - (p*q+m**2)*p_ff(c_one,ubar(m,p,-1),u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).g5.u(q,-)] - (p*q+m^2)*ubar(p,-).g5.u(q,-) = 0", passed) call expect ((f_ftvam(c_nil,c_one,vbar(m,p,+1),vp,q)*v(m,q,+1) - (p*q+m**2)*p_ff(c_one,vbar(m,p,+1),v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).g5.v(q,+)] - (p*q+m^2)*vbar(p,+).g5.v(q,+) = 0", passed) call expect ((f_ftvam(c_nil,c_one,vbar(m,p,-1),vp,q)*v(m,q,-1) - (p*q+m**2)*p_ff(c_one,vbar(m,p,-1),v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).g5.v(q,-)] - (p*q+m^2)*vbar(p,-).g5.v(q,-) = 0", passed) @ <>= print *, "*** Checking polarisation vectors: ***" call expect (conjg(eps(m,p, 1))*eps(m,p, 1), -1, "e( 1).e( 1)=-1", passed) call expect (conjg(eps(m,p, 1))*eps(m,p,-1), 0, "e( 1).e(-1)= 0", passed) call expect (conjg(eps(m,p,-1))*eps(m,p, 1), 0, "e(-1).e( 1)= 0", passed) call expect (conjg(eps(m,p,-1))*eps(m,p,-1), -1, "e(-1).e(-1)=-1", passed) call expect ( p*eps(m,p, 1), 0, " p.e( 1)= 0", passed) call expect ( p*eps(m,p,-1), 0, " p.e(-1)= 0", passed) if (m > 0) then call expect (conjg(eps(m,p, 1))*eps(m,p, 0), 0, "e( 1).e( 0)= 0", passed) call expect (conjg(eps(m,p, 0))*eps(m,p, 1), 0, "e( 0).e( 1)= 0", passed) call expect (conjg(eps(m,p, 0))*eps(m,p, 0), -1, "e( 0).e( 0)=-1", passed) call expect (conjg(eps(m,p, 0))*eps(m,p,-1), 0, "e( 0).e(-1)= 0", passed) call expect (conjg(eps(m,p,-1))*eps(m,p, 0), 0, "e(-1).e( 0)= 0", passed) call expect ( p*eps(m,p, 0), 0, " p.e( 0)= 0", passed) end if @ <>= print *, "*** Checking epsilon tensor: ***" call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & - pseudo_scalar(eps(m,q,1),eps(m,p,1),eps(m,p,0),eps(m,q,0)), "eps(1<->2)", passed) call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & - pseudo_scalar(eps(m,p,0),eps(m,q,1),eps(m,p,1),eps(m,q,0)), "eps(1<->3)", passed) call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & - pseudo_scalar(eps(m,q,0),eps(m,q,1),eps(m,p,0),eps(m,p,1)), "eps(1<->4)", passed) call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & - pseudo_scalar(eps(m,p,1),eps(m,p,0),eps(m,q,1),eps(m,q,0)), "eps(2<->3)", passed) call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & - pseudo_scalar(eps(m,p,1),eps(m,q,0),eps(m,p,0),eps(m,q,1)), "eps(2<->4)", passed) call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & - pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,q,0),eps(m,p,0)), "eps(3<->4)", passed) call expect ( pseudo_scalar(eps(m,p,1),eps(m,q,1),eps(m,p,0),eps(m,q,0)), & eps(m,p,1)*pseudo_vector(eps(m,q,1),eps(m,p,0),eps(m,q,0)), "eps'", passed) @ \begin{equation} \frac{1}{2} [x\wedge y]^*_{\mu\nu} [x\wedge y]^{\mu\nu} = \frac{1}{2} (x^*_\mu y^*_\nu-x^*_\nu y^*_\mu) (x^\mu y^\nu-x^\nu y^\mu) = (x^*x) (y^*y) - (x^*y) (y^*x) \end{equation} <>= print *, "*** Checking tensors: ***" call expect (conjg(p.wedge.q)*(p.wedge.q), (p*p)*(q*q)-(p*q)**2, & "[p,q].[q,p]=p.p*q.q-p.q^2", passed) call expect (conjg(p.wedge.q)*(q.wedge.p), (p*q)**2-(p*p)*(q*q), & "[p,q].[q,p]=p.q^2-p.p*q.q", passed) @ i.\,e. \begin{equation} \frac{1}{2} [p\wedge\epsilon(p,i)]^*_{\mu\nu} [p\wedge\epsilon(p,j)]^{\mu\nu} = - p^2 \delta_{ij} \end{equation} <>= call expect (conjg(p.wedge.eps(m,p, 1))*(p.wedge.eps(m,p, 1)), -p*p, & "[p,e( 1)].[p,e( 1)]=-p.p", passed) call expect (conjg(p.wedge.eps(m,p, 1))*(p.wedge.eps(m,p,-1)), 0, & "[p,e( 1)].[p,e(-1)]=0", passed) call expect (conjg(p.wedge.eps(m,p,-1))*(p.wedge.eps(m,p, 1)), 0, & "[p,e(-1)].[p,e( 1)]=0", passed) call expect (conjg(p.wedge.eps(m,p,-1))*(p.wedge.eps(m,p,-1)), -p*p, & "[p,e(-1)].[p,e(-1)]=-p.p", passed) if (m > 0) then call expect (conjg(p.wedge.eps(m,p, 1))*(p.wedge.eps(m,p, 0)), 0, & "[p,e( 1)].[p,e( 0)]=0", passed) call expect (conjg(p.wedge.eps(m,p, 0))*(p.wedge.eps(m,p, 1)), 0, & "[p,e( 0)].[p,e( 1)]=0", passed) call expect (conjg(p.wedge.eps(m,p, 0))*(p.wedge.eps(m,p, 0)), -p*p, & "[p,e( 0)].[p,e( 0)]=-p.p", passed) call expect (conjg(p.wedge.eps(m,p, 0))*(p.wedge.eps(m,p,-1)), 0, & "[p,e( 1)].[p,e(-1)]=0", passed) call expect (conjg(p.wedge.eps(m,p,-1))*(p.wedge.eps(m,p, 0)), 0, & "[p,e(-1)].[p,e( 0)]=0", passed) end if @ also \begin{align} [x\wedge y]_{\mu\nu} z^\nu &= x_\mu (yz) - y_\mu (xz) \\ z_\mu [x\wedge y]^{\mu\nu} &= (zx) y^\nu - (zy) x^\nu \end{align} <>= call expect (abs ((p.wedge.eps(m,p, 1))*p + (p*p)*eps(m,p, 1)), 0, & "[p,e( 1)].p=-p.p*e( 1)]", passed) call expect (abs ((p.wedge.eps(m,p, 0))*p + (p*p)*eps(m,p, 0)), 0, & "[p,e( 0)].p=-p.p*e( 0)]", passed) call expect (abs ((p.wedge.eps(m,p,-1))*p + (p*p)*eps(m,p,-1)), 0, & "[p,e(-1)].p=-p.p*e(-1)]", passed) call expect (abs (p*(p.wedge.eps(m,p, 1)) - (p*p)*eps(m,p, 1)), 0, & "p.[p,e( 1)]=p.p*e( 1)]", passed) call expect (abs (p*(p.wedge.eps(m,p, 0)) - (p*p)*eps(m,p, 0)), 0, & "p.[p,e( 0)]=p.p*e( 0)]", passed) call expect (abs (p*(p.wedge.eps(m,p,-1)) - (p*p)*eps(m,p,-1)), 0, & "p.[p,e(-1)]=p.p*e(-1)]", passed) @ <>= print *, "*** Checking polarisation tensors: ***" call expect (conjg(eps2(m,p, 2))*eps2(m,p, 2), 1, "e2( 2).e2( 2)=1", passed) call expect (conjg(eps2(m,p, 2))*eps2(m,p,-2), 0, "e2( 2).e2(-2)=0", passed) call expect (conjg(eps2(m,p,-2))*eps2(m,p, 2), 0, "e2(-2).e2( 2)=0", passed) call expect (conjg(eps2(m,p,-2))*eps2(m,p,-2), 1, "e2(-2).e2(-2)=1", passed) if (m > 0) then call expect (conjg(eps2(m,p, 2))*eps2(m,p, 1), 0, "e2( 2).e2( 1)=0", passed) call expect (conjg(eps2(m,p, 2))*eps2(m,p, 0), 0, "e2( 2).e2( 0)=0", passed) call expect (conjg(eps2(m,p, 2))*eps2(m,p,-1), 0, "e2( 2).e2(-1)=0", passed) call expect (conjg(eps2(m,p, 1))*eps2(m,p, 2), 0, "e2( 1).e2( 2)=0", passed) call expect (conjg(eps2(m,p, 1))*eps2(m,p, 1), 1, "e2( 1).e2( 1)=1", passed) call expect (conjg(eps2(m,p, 1))*eps2(m,p, 0), 0, "e2( 1).e2( 0)=0", passed) call expect (conjg(eps2(m,p, 1))*eps2(m,p,-1), 0, "e2( 1).e2(-1)=0", passed) call expect (conjg(eps2(m,p, 1))*eps2(m,p,-2), 0, "e2( 1).e2(-2)=0", passed) call expect (conjg(eps2(m,p, 0))*eps2(m,p, 2), 0, "e2( 0).e2( 2)=0", passed) call expect (conjg(eps2(m,p, 0))*eps2(m,p, 1), 0, "e2( 0).e2( 1)=0", passed) call expect (conjg(eps2(m,p, 0))*eps2(m,p, 0), 1, "e2( 0).e2( 0)=1", passed) call expect (conjg(eps2(m,p, 0))*eps2(m,p,-1), 0, "e2( 0).e2(-1)=0", passed) call expect (conjg(eps2(m,p, 0))*eps2(m,p,-2), 0, "e2( 0).e2(-2)=0", passed) call expect (conjg(eps2(m,p,-1))*eps2(m,p, 2), 0, "e2(-1).e2( 2)=0", passed) call expect (conjg(eps2(m,p,-1))*eps2(m,p, 1), 0, "e2(-1).e2( 1)=0", passed) call expect (conjg(eps2(m,p,-1))*eps2(m,p, 0), 0, "e2(-1).e2( 0)=0", passed) call expect (conjg(eps2(m,p,-1))*eps2(m,p,-1), 1, "e2(-1).e2(-1)=1", passed) call expect (conjg(eps2(m,p,-1))*eps2(m,p,-2), 0, "e2(-1).e2(-2)=0", passed) call expect (conjg(eps2(m,p,-2))*eps2(m,p, 1), 0, "e2(-2).e2( 1)=0", passed) call expect (conjg(eps2(m,p,-2))*eps2(m,p, 0), 0, "e2(-2).e2( 0)=0", passed) call expect (conjg(eps2(m,p,-2))*eps2(m,p,-1), 0, "e2(-2).e2(-1)=0", passed) end if @ <>= call expect ( abs(p*eps2(m,p, 2) ), 0, " |p.e2( 2)| =0", passed) call expect ( abs(eps2(m,p, 2)*p), 0, " |e2( 2).p|=0", passed) call expect ( abs(p*eps2(m,p,-2) ), 0, " |p.e2(-2)| =0", passed) call expect ( abs(eps2(m,p,-2)*p), 0, " |e2(-2).p|=0", passed) if (m > 0) then call expect ( abs(p*eps2(m,p, 1) ), 0, " |p.e2( 1)| =0", passed) call expect ( abs(eps2(m,p, 1)*p), 0, " |e2( 1).p|=0", passed) call expect ( abs(p*eps2(m,p, 0) ), 0, " |p.e2( 0)| =0", passed) call expect ( abs(eps2(m,p, 0)*p), 0, " |e2( 0).p|=0", passed) call expect ( abs(p*eps2(m,p,-1) ), 0, " |p.e2(-1)| =0", passed) call expect ( abs(eps2(m,p,-1)*p), 0, " |e2(-1).p|=0", passed) end if @ <>= print *, " *** Checking the polarization tensors for massive gravitons:" call expect (abs(p * eps2(m,p,2)), 0, "p.e(+2)=0", passed) call expect (abs(p * eps2(m,p,1)), 0, "p.e(+1)=0", passed) call expect (abs(p * eps2(m,p,0)), 0, "p.e( 0)=0", passed) call expect (abs(p * eps2(m,p,-1)), 0, "p.e(-1)=0", passed) call expect (abs(p * eps2(m,p,-2)), 0, "p.e(-2)=0", passed) call expect (abs(trace(eps2 (m,p,2))), 0, "Tr[e(+2)]=0", passed) call expect (abs(trace(eps2 (m,p,1))), 0, "Tr[e(+1)]=0", passed) call expect (abs(trace(eps2 (m,p,0))), 0, "Tr[e( 0)]=0", passed) call expect (abs(trace(eps2 (m,p,-1))), 0, "Tr[e(-1)]=0", passed) call expect (abs(trace(eps2 (m,p,-2))), 0, "Tr[e(-2)]=0", passed) call expect (abs(eps2(m,p,2) * eps2(m,p,2)), 1, & "e(2).e(2) = 1", passed) call expect (abs(eps2(m,p,2) * eps2(m,p,1)), 0, & "e(2).e(1) = 0", passed) call expect (abs(eps2(m,p,2) * eps2(m,p,0)), 0, & "e(2).e(0) = 0", passed) call expect (abs(eps2(m,p,2) * eps2(m,p,-1)), 0, & "e(2).e(-1) = 0", passed) call expect (abs(eps2(m,p,2) * eps2(m,p,-2)), 0, & "e(2).e(-2) = 0", passed) call expect (abs(eps2(m,p,1) * eps2(m,p,1)), 1, & "e(1).e(1) = 1", passed) call expect (abs(eps2(m,p,1) * eps2(m,p,0)), 0, & "e(1).e(0) = 0", passed) call expect (abs(eps2(m,p,1) * eps2(m,p,-1)), 0, & "e(1).e(-1) = 0", passed) call expect (abs(eps2(m,p,1) * eps2(m,p,-2)), 0, & "e(1).e(-2) = 0", passed) call expect (abs(eps2(m,p,0) * eps2(m,p,0)), 1, & "e(0).e(0) = 1", passed) call expect (abs(eps2(m,p,0) * eps2(m,p,-1)), 0, & "e(0).e(-1) = 0", passed) call expect (abs(eps2(m,p,0) * eps2(m,p,-2)), 0, & "e(0).e(-2) = 0", passed) call expect (abs(eps2(m,p,-1) * eps2(m,p,-1)), 1, & "e(-1).e(-1) = 1", passed) call expect (abs(eps2(m,p,-1) * eps2(m,p,-2)), 0, & "e(-1).e(-2) = 0", passed) call expect (abs(eps2(m,p,-2) * eps2(m,p,-2)), 1, & "e(-2).e(-2) = 1", passed) @ <>= print *, " *** Checking the graviton propagator:" call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_tensor(p,m,w,eps2(m,p,-2)))), 0, "p.pr.e(-2)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_tensor(p,m,w,eps2(m,p,-1)))), 0, "p.pr.e(-1)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_tensor(p,m,w,eps2(m,p,0)))), 0, "p.pr.e(0)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_tensor(p,m,w,eps2(m,p,1)))), 0, "p.pr.e(1)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_tensor(p,m,w,eps2(m,p,2)))), 0, "p.pr.e(2)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_tensor(p,m,w,ttest))), 0, "p.pr.ttest", passed) @ <<[[test_omega95_bispinors.f90]]>>= <> program test_omega95_bispinors use kinds use omega95_bispinors use omega_vspinor_polarizations use omega_testtools implicit none integer :: i, j real(kind=default) :: m, pabs, qabs, tabs, zabs, w real(kind=default), dimension(4) :: r complex(kind=default) :: c_nil, c_one, c_two type(momentum) :: p, q, t, z, p_0 type(vector) :: vp, vq, vt, vz type(vectorspinor) :: testv type(bispinor) :: vv logical :: passed call random_seed () c_nil = 0.0_default c_one = 1.0_default c_two = 2.0_default w = 1.4142 m = 13 pabs = 42 qabs = 137 tabs = 84 zabs = 3.1415 p_0%t = m p_0%x = 0 call random_momentum (p, pabs, m) call random_momentum (q, qabs, m) call random_momentum (t, tabs, m) call random_momentum (z, zabs, m) call random_number (r) do i = 1, 4 testv%psi(1)%a(i) = (0.0_default, 0.0_default) end do do i = 2, 3 do j = 1, 4 testv%psi(i)%a(j) = cmplx (10.0_default * r(j), kind=default) end do end do testv%psi(4)%a(1) = (1.0_default, 0.0_default) testv%psi(4)%a(2) = (0.0_default, 2.0_default) testv%psi(4)%a(3) = (1.0_default, 0.0_default) testv%psi(4)%a(4) = (3.0_default, 0.0_default) vp = p vq = q vt = t vz = z passed = .true. vv%a(1) = (1.0_default, 0.0_default) vv%a(2) = (0.0_default, 2.0_default) vv%a(3) = (1.0_default, 0.0_default) vv%a(4) = (3.0_default, 0.0_default) vv = pr_psi(p, m, w, .false., vv) <> if (.not. passed) then stop 1 end if end program test_omega95_bispinors @ <>= print *, "*** Checking the equations of motion ***:" call expect (abs(f_vf(c_one,vp,u(m,p,+1))-m*u(m,p,+1)), 0, "|[p-m]u(+)|=0", passed) call expect (abs(f_vf(c_one,vp,u(m,p,-1))-m*u(m,p,-1)), 0, "|[p-m]u(-)|=0", passed) call expect (abs(f_vf(c_one,vp,v(m,p,+1))+m*v(m,p,+1)), 0, "|[p+m]v(+)|=0", passed) call expect (abs(f_vf(c_one,vp,v(m,p,-1))+m*v(m,p,-1)), 0, "|[p+m]v(-)|=0", passed) print *, "*** Checking the equations of motion for negative masses***:" call expect (abs(f_vf(c_one,vp,u(-m,p,+1))+m*u(-m,p,+1)), 0, "|[p+m]u(+)|=0", passed) call expect (abs(f_vf(c_one,vp,u(-m,p,-1))+m*u(-m,p,-1)), 0, "|[p+m]u(-)|=0", passed) call expect (abs(f_vf(c_one,vp,v(-m,p,+1))-m*v(-m,p,+1)), 0, "|[p-m]v(+)|=0", passed) call expect (abs(f_vf(c_one,vp,v(-m,p,-1))-m*v(-m,p,-1)), 0, "|[p-m]v(-)|=0", passed) @ <>= print *, "*** Checking the normalization ***:" call expect (s_ff(c_one,v(m,p,+1),u(m,p,+1)), +2*m, "ubar(+)*u(+)=+2m", passed) call expect (s_ff(c_one,v(m,p,-1),u(m,p,-1)), +2*m, "ubar(-)*u(-)=+2m", passed) call expect (s_ff(c_one,u(m,p,+1),v(m,p,+1)), -2*m, "vbar(+)*v(+)=-2m", passed) call expect (s_ff(c_one,u(m,p,-1),v(m,p,-1)), -2*m, "vbar(-)*v(-)=-2m", passed) call expect (s_ff(c_one,v(m,p,+1),v(m,p,+1)), 0, "ubar(+)*v(+)=0 ", passed) call expect (s_ff(c_one,v(m,p,-1),v(m,p,-1)), 0, "ubar(-)*v(-)=0 ", passed) call expect (s_ff(c_one,u(m,p,+1),u(m,p,+1)), 0, "vbar(+)*u(+)=0 ", passed) call expect (s_ff(c_one,u(m,p,-1),u(m,p,-1)), 0, "vbar(-)*u(-)=0 ", passed) print *, "*** Checking the normalization for negative masses***:" call expect (s_ff(c_one,v(-m,p,+1),u(-m,p,+1)), -2*m, "ubar(+)*u(+)=-2m", passed) call expect (s_ff(c_one,v(-m,p,-1),u(-m,p,-1)), -2*m, "ubar(-)*u(-)=-2m", passed) call expect (s_ff(c_one,u(-m,p,+1),v(-m,p,+1)), +2*m, "vbar(+)*v(+)=+2m", passed) call expect (s_ff(c_one,u(-m,p,-1),v(-m,p,-1)), +2*m, "vbar(-)*v(-)=+2m", passed) call expect (s_ff(c_one,v(-m,p,+1),v(-m,p,+1)), 0, "ubar(+)*v(+)=0 ", passed) call expect (s_ff(c_one,v(-m,p,-1),v(-m,p,-1)), 0, "ubar(-)*v(-)=0 ", passed) call expect (s_ff(c_one,u(-m,p,+1),u(-m,p,+1)), 0, "vbar(+)*u(+)=0 ", passed) call expect (s_ff(c_one,u(-m,p,-1),u(-m,p,-1)), 0, "vbar(-)*u(-)=0 ", passed) @ <>= print *, "*** Checking the currents ***:" call expect (abs(v_ff(c_one,v(m,p,+1),u(m,p,+1))-2*vp), 0, "ubar(+).V.u(+)=2p", passed) call expect (abs(v_ff(c_one,v(m,p,-1),u(m,p,-1))-2*vp), 0, "ubar(-).V.u(-)=2p", passed) call expect (abs(v_ff(c_one,u(m,p,+1),v(m,p,+1))-2*vp), 0, "vbar(+).V.v(+)=2p", passed) call expect (abs(v_ff(c_one,u(m,p,-1),v(m,p,-1))-2*vp), 0, "vbar(-).V.v(-)=2p", passed) print *, "*** Checking the currents for negative masses***:" call expect (abs(v_ff(c_one,v(-m,p,+1),u(-m,p,+1))-2*vp), 0, "ubar(+).V.u(+)=2p", passed) call expect (abs(v_ff(c_one,v(-m,p,-1),u(-m,p,-1))-2*vp), 0, "ubar(-).V.u(-)=2p", passed) call expect (abs(v_ff(c_one,u(-m,p,+1),v(-m,p,+1))-2*vp), 0, "vbar(+).V.v(+)=2p", passed) call expect (abs(v_ff(c_one,u(-m,p,-1),v(-m,p,-1))-2*vp), 0, "vbar(-).V.v(-)=2p", passed) @ <>= print *, "*** Checking current conservation ***:" call expect ((vp-vq)*v_ff(c_one,v(m,p,+1),u(m,q,+1)), 0, "d(ubar(+).V.u(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,v(m,p,-1),u(m,q,-1)), 0, "d(ubar(-).V.u(-))=0", passed) call expect ((vp-vq)*v_ff(c_one,u(m,p,+1),v(m,q,+1)), 0, "d(vbar(+).V.v(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,u(m,p,-1),v(m,q,-1)), 0, "d(vbar(-).V.v(-))=0", passed) <>= print *, "*** Checking current conservation for negative masses***:" call expect ((vp-vq)*v_ff(c_one,v(-m,p,+1),u(-m,q,+1)), 0, "d(ubar(+).V.u(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,v(-m,p,-1),u(-m,q,-1)), 0, "d(ubar(-).V.u(-))=0", passed) call expect ((vp-vq)*v_ff(c_one,u(-m,p,+1),v(-m,q,+1)), 0, "d(vbar(+).V.v(+))=0", passed) call expect ((vp-vq)*v_ff(c_one,u(-m,p,-1),v(-m,q,-1)), 0, "d(vbar(-).V.v(-))=0", passed) @ <>= if (m == 0) then print *, "*** Checking axial current conservation ***:" call expect ((vp-vq)*a_ff(c_one,v(m,p,+1),u(m,q,+1)), 0, "d(ubar(+).A.u(+))=0", passed) call expect ((vp-vq)*a_ff(c_one,v(m,p,-1),u(m,q,-1)), 0, "d(ubar(-).A.u(-))=0", passed) call expect ((vp-vq)*a_ff(c_one,u(m,p,+1),v(m,q,+1)), 0, "d(vbar(+).A.v(+))=0", passed) call expect ((vp-vq)*a_ff(c_one,u(m,p,-1),v(m,q,-1)), 0, "d(vbar(-).A.v(-))=0", passed) end if <>= print *, "*** Checking implementation of the sigma vertex funktions ***:" call expect ((vp*tvam_ff(c_one,c_nil,v(m,p,+1),u(m,q,+1),q) - (p*q-m**2)*(v(m,p,+1)*u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).u(q,+)] - (p*q-m^2)*ubar(p,+).u(q,+) = 0", passed) call expect ((vp*tvam_ff(c_one,c_nil,v(m,p,-1),u(m,q,-1),q) - (p*q-m**2)*(v(m,p,-1)*u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).u(q,-)] - (p*q-m^2)*ubar(p,-).u(q,-) = 0", passed) call expect ((vp*tvam_ff(c_one,c_nil,u(m,p,+1),v(m,q,+1),q) - (p*q-m**2)*(u(m,p,+1)*v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).v(q,+)] - (p*q-m^2)*vbar(p,+).v(q,+) = 0", passed) call expect ((vp*tvam_ff(c_one,c_nil,u(m,p,-1),v(m,q,-1),q) - (p*q-m**2)*(u(m,p,-1)*v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).v(q,-)] - (p*q-m^2)*vbar(p,-).v(q,-) = 0", passed) call expect ((v(m,p,+1)*f_tvamf(c_one,c_nil,vp,u(m,q,+1),q) - (p*q-m**2)*(v(m,p,+1)*u(m,q,+1))), 0, & "ubar(p,+).[p*(Isigma*q).u(q,+)] - (p*q-m^2)*ubar(p,+).u(q,+) = 0", passed) call expect ((v(m,p,-1)*f_tvamf(c_one,c_nil,vp,u(m,q,-1),q) - (p*q-m**2)*(v(m,p,-1)*u(m,q,-1))), 0, & "ubar(p,-).[p*(Isigma*q).u(q,-)] - (p*q-m^2)*ubar(p,-).u(q,-) = 0", passed) call expect ((u(m,p,+1)*f_tvamf(c_one,c_nil,vp,v(m,q,+1),q) - (p*q-m**2)*(u(m,p,+1)*v(m,q,+1))), 0, & "vbar(p,+).[p*(Isigma*q).v(q,+)] - (p*q-m^2)*vbar(p,+).v(q,+) = 0", passed) call expect ((u(m,p,-1)*f_tvamf(c_one,c_nil,vp,v(m,q,-1),q) - (p*q-m**2)*(u(m,p,-1)*v(m,q,-1))), 0, & "vbar(p,-).[p*(Isigma*q).v(q,-)] - (p*q-m^2)*vbar(p,-).v(q,-) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,v(m,p,+1),u(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,v(m,p,+1),u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).g5.u(q,+)] - (p*q+m^2)*ubar(p,+).g5.u(q,+) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,v(m,p,-1),u(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,v(m,p,-1),u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).g5.u(q,-)] - (p*q+m^2)*ubar(p,-).g5.u(q,-) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,u(m,p,+1),v(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,u(m,p,+1),v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).g5.v(q,+)] - (p*q+m^2)*vbar(p,+).g5.v(q,+) = 0", passed) call expect ((vp*tvam_ff(c_nil,c_one,u(m,p,-1),v(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,u(m,p,-1),v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).g5.v(q,-)] - (p*q+m^2)*vbar(p,-).g5.v(q,-) = 0", passed) call expect ((v(m,p,+1)*f_tvamf(c_nil,c_one,vp,u(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,v(m,p,+1),u(m,q,+1))), 0, & "p*[ubar(p,+).(Isigma*q).g5.u(q,+)] - (p*q+m^2)*ubar(p,+).g5.u(q,+) = 0", passed) call expect ((v(m,p,-1)*f_tvamf(c_nil,c_one,vp,u(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,v(m,p,-1),u(m,q,-1))), 0, & "p*[ubar(p,-).(Isigma*q).g5.u(q,-)] - (p*q+m^2)*ubar(p,-).g5.u(q,-) = 0", passed) call expect ((u(m,p,+1)*f_tvamf(c_nil,c_one,vp,v(m,q,+1),q) - (p*q+m**2)*p_ff(c_one,u(m,p,+1),v(m,q,+1))), 0, & "p*[vbar(p,+).(Isigma*q).g5.v(q,+)] - (p*q+m^2)*vbar(p,+).g5.v(q,+) = 0", passed) call expect ((u(m,p,-1)*f_tvamf(c_nil,c_one,vp,v(m,q,-1),q) - (p*q+m**2)*p_ff(c_one,u(m,p,-1),v(m,q,-1))), 0, & "p*[vbar(p,-).(Isigma*q).g5.v(q,-)] - (p*q+m^2)*vbar(p,-).g5.v(q,-) = 0", passed) @ <>= print *, "*** Checking polarization vectors: ***" call expect (conjg(eps(m,p, 1))*eps(m,p, 1), -1, "e( 1).e( 1)=-1", passed) call expect (conjg(eps(m,p, 1))*eps(m,p,-1), 0, "e( 1).e(-1)= 0", passed) call expect (conjg(eps(m,p,-1))*eps(m,p, 1), 0, "e(-1).e( 1)= 0", passed) call expect (conjg(eps(m,p,-1))*eps(m,p,-1), -1, "e(-1).e(-1)=-1", passed) call expect ( p*eps(m,p, 1), 0, " p.e( 1)= 0", passed) call expect ( p*eps(m,p,-1), 0, " p.e(-1)= 0", passed) if (m > 0) then call expect (conjg(eps(m,p, 1))*eps(m,p, 0), 0, "e( 1).e( 0)= 0", passed) call expect (conjg(eps(m,p, 0))*eps(m,p, 1), 0, "e( 0).e( 1)= 0", passed) call expect (conjg(eps(m,p, 0))*eps(m,p, 0), -1, "e( 0).e( 0)=-1", passed) call expect (conjg(eps(m,p, 0))*eps(m,p,-1), 0, "e( 0).e(-1)= 0", passed) call expect (conjg(eps(m,p,-1))*eps(m,p, 0), 0, "e(-1).e( 0)= 0", passed) call expect ( p*eps(m,p, 0), 0, " p.e( 0)= 0", passed) end if @ <>= print *, "*** Checking polarization vectorspinors: ***" call expect (abs(p * ueps(m, p, 2)), 0, "p.ueps ( 2)= 0", passed) call expect (abs(p * ueps(m, p, 1)), 0, "p.ueps ( 1)= 0", passed) call expect (abs(p * ueps(m, p, -1)), 0, "p.ueps (-1)= 0", passed) call expect (abs(p * ueps(m, p, -2)), 0, "p.ueps (-2)= 0", passed) call expect (abs(p * veps(m, p, 2)), 0, "p.veps ( 2)= 0", passed) call expect (abs(p * veps(m, p, 1)), 0, "p.veps ( 1)= 0", passed) call expect (abs(p * veps(m, p, -1)), 0, "p.veps (-1)= 0", passed) call expect (abs(p * veps(m, p, -2)), 0, "p.veps (-2)= 0", passed) print *, "*** Checking polarization vectorspinors (neg. masses): ***" call expect (abs(p * ueps(-m, p, 2)), 0, "p.ueps ( 2)= 0", passed) call expect (abs(p * ueps(-m, p, 1)), 0, "p.ueps ( 1)= 0", passed) call expect (abs(p * ueps(-m, p, -1)), 0, "p.ueps (-1)= 0", passed) call expect (abs(p * ueps(-m, p, -2)), 0, "p.ueps (-2)= 0", passed) call expect (abs(p * veps(-m, p, 2)), 0, "p.veps ( 2)= 0", passed) call expect (abs(p * veps(-m, p, 1)), 0, "p.veps ( 1)= 0", passed) call expect (abs(p * veps(-m, p, -1)), 0, "p.veps (-1)= 0", passed) call expect (abs(p * veps(-m, p, -2)), 0, "p.veps (-2)= 0", passed) print *, "*** in the rest frame ***" call expect (abs(p_0 * ueps(m, p_0, 2)), 0, "p0.ueps ( 2)= 0", passed) call expect (abs(p_0 * ueps(m, p_0, 1)), 0, "p0.ueps ( 1)= 0", passed) call expect (abs(p_0 * ueps(m, p_0, -1)), 0, "p0.ueps (-1)= 0", passed) call expect (abs(p_0 * ueps(m, p_0, -2)), 0, "p0.ueps (-2)= 0", passed) call expect (abs(p_0 * veps(m, p_0, 2)), 0, "p0.veps ( 2)= 0", passed) call expect (abs(p_0 * veps(m, p_0, 1)), 0, "p0.veps ( 1)= 0", passed) call expect (abs(p_0 * veps(m, p_0, -1)), 0, "p0.veps (-1)= 0", passed) call expect (abs(p_0 * veps(m, p_0, -2)), 0, "p0.veps (-2)= 0", passed) print *, "*** in the rest frame (neg. masses) ***" call expect (abs(p_0 * ueps(-m, p_0, 2)), 0, "p0.ueps ( 2)= 0", passed) call expect (abs(p_0 * ueps(-m, p_0, 1)), 0, "p0.ueps ( 1)= 0", passed) call expect (abs(p_0 * ueps(-m, p_0, -1)), 0, "p0.ueps (-1)= 0", passed) call expect (abs(p_0 * ueps(-m, p_0, -2)), 0, "p0.ueps (-2)= 0", passed) call expect (abs(p_0 * veps(-m, p_0, 2)), 0, "p0.veps ( 2)= 0", passed) call expect (abs(p_0 * veps(-m, p_0, 1)), 0, "p0.veps ( 1)= 0", passed) call expect (abs(p_0 * veps(-m, p_0, -1)), 0, "p0.veps (-1)= 0", passed) call expect (abs(p_0 * veps(-m, p_0, -2)), 0, "p0.veps (-2)= 0", passed) @ <>= print *, "*** Checking the irreducibility condition: ***" call expect (abs(f_potgr (c_one, c_one, ueps(m, p, 2))), 0, "g.ueps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p, 1))), 0, "g.ueps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p, -1))), 0, "g.ueps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p, -2))), 0, "g.ueps (-2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p, 2))), 0, "g.veps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p, 1))), 0, "g.veps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p, -1))), 0, "g.veps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p, -2))), 0, "g.veps (-2)", passed) print *, "*** Checking the irreducibility condition (neg. masses): ***" call expect (abs(f_potgr (c_one, c_one, ueps(-m, p, 2))), 0, "g.ueps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(-m, p, 1))), 0, "g.ueps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(-m, p, -1))), 0, "g.ueps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(-m, p, -2))), 0, "g.ueps (-2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(-m, p, 2))), 0, "g.veps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(-m, p, 1))), 0, "g.veps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(-m, p, -1))), 0, "g.veps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(-m, p, -2))), 0, "g.veps (-2)", passed) print *, "*** in the rest frame ***" call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, 2))), 0, "g.ueps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, 1))), 0, "g.ueps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, -1))), 0, "g.ueps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, -2))), 0, "g.ueps (-2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, 2))), 0, "g.veps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, 1))), 0, "g.veps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, -1))), 0, "g.veps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, -2))), 0, "g.veps (-2)", passed) print *, "*** in the rest frame (neg. masses) ***" call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, 2))), 0, "g.ueps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, 1))), 0, "g.ueps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, -1))), 0, "g.ueps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, ueps(m, p_0, -2))), 0, "g.ueps (-2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, 2))), 0, "g.veps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, 1))), 0, "g.veps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, -1))), 0, "g.veps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, veps(m, p_0, -2))), 0, "g.veps (-2)", passed) @ <>= print *, "*** Testing vectorspinor normalization ***" call expect (veps(m,p, 2)*ueps(m,p, 2), -2*m, "ueps( 2).ueps( 2)= -2m", passed) call expect (veps(m,p, 1)*ueps(m,p, 1), -2*m, "ueps( 1).ueps( 1)= -2m", passed) call expect (veps(m,p,-1)*ueps(m,p,-1), -2*m, "ueps(-1).ueps(-1)= -2m", passed) call expect (veps(m,p,-2)*ueps(m,p,-2), -2*m, "ueps(-2).ueps(-2)= -2m", passed) call expect (ueps(m,p, 2)*veps(m,p, 2), 2*m, "veps( 2).veps( 2)= +2m", passed) call expect (ueps(m,p, 1)*veps(m,p, 1), 2*m, "veps( 1).veps( 1)= +2m", passed) call expect (ueps(m,p,-1)*veps(m,p,-1), 2*m, "veps(-1).veps(-1)= +2m", passed) call expect (ueps(m,p,-2)*veps(m,p,-2), 2*m, "veps(-2).veps(-2)= +2m", passed) call expect (ueps(m,p, 2)*ueps(m,p, 2), 0, "ueps( 2).veps( 2)= 0", passed) call expect (ueps(m,p, 1)*ueps(m,p, 1), 0, "ueps( 1).veps( 1)= 0", passed) call expect (ueps(m,p,-1)*ueps(m,p,-1), 0, "ueps(-1).veps(-1)= 0", passed) call expect (ueps(m,p,-2)*ueps(m,p,-2), 0, "ueps(-2).veps(-2)= 0", passed) call expect (veps(m,p, 2)*veps(m,p, 2), 0, "veps( 2).ueps( 2)= 0", passed) call expect (veps(m,p, 1)*veps(m,p, 1), 0, "veps( 1).ueps( 1)= 0", passed) call expect (veps(m,p,-1)*veps(m,p,-1), 0, "veps(-1).ueps(-1)= 0", passed) call expect (veps(m,p,-2)*veps(m,p,-2), 0, "veps(-2).ueps(-2)= 0", passed) print *, "*** Testing vectorspinor normalization (neg. masses) ***" call expect (veps(-m,p, 2)*ueps(-m,p, 2), +2*m, "ueps( 2).ueps( 2)= +2m", passed) call expect (veps(-m,p, 1)*ueps(-m,p, 1), +2*m, "ueps( 1).ueps( 1)= +2m", passed) call expect (veps(-m,p,-1)*ueps(-m,p,-1), +2*m, "ueps(-1).ueps(-1)= +2m", passed) call expect (veps(-m,p,-2)*ueps(-m,p,-2), +2*m, "ueps(-2).ueps(-2)= +2m", passed) call expect (ueps(-m,p, 2)*veps(-m,p, 2), -2*m, "veps( 2).veps( 2)= -2m", passed) call expect (ueps(-m,p, 1)*veps(-m,p, 1), -2*m, "veps( 1).veps( 1)= -2m", passed) call expect (ueps(-m,p,-1)*veps(-m,p,-1), -2*m, "veps(-1).veps(-1)= -2m", passed) call expect (ueps(-m,p,-2)*veps(-m,p,-2), -2*m, "veps(-2).veps(-2)= -2m", passed) call expect (ueps(-m,p, 2)*ueps(-m,p, 2), 0, "ueps( 2).veps( 2)= 0", passed) call expect (ueps(-m,p, 1)*ueps(-m,p, 1), 0, "ueps( 1).veps( 1)= 0", passed) call expect (ueps(-m,p,-1)*ueps(-m,p,-1), 0, "ueps(-1).veps(-1)= 0", passed) call expect (ueps(-m,p,-2)*ueps(-m,p,-2), 0, "ueps(-2).veps(-2)= 0", passed) call expect (veps(-m,p, 2)*veps(-m,p, 2), 0, "veps( 2).ueps( 2)= 0", passed) call expect (veps(-m,p, 1)*veps(-m,p, 1), 0, "veps( 1).ueps( 1)= 0", passed) call expect (veps(-m,p,-1)*veps(-m,p,-1), 0, "veps(-1).ueps(-1)= 0", passed) call expect (veps(-m,p,-2)*veps(-m,p,-2), 0, "veps(-2).ueps(-2)= 0", passed) print *, "*** in the rest frame ***" call expect (veps(m,p_0, 2)*ueps(m,p_0, 2), -2*m, "ueps( 2).ueps( 2)= -2m", passed) call expect (veps(m,p_0, 1)*ueps(m,p_0, 1), -2*m, "ueps( 1).ueps( 1)= -2m", passed) call expect (veps(m,p_0,-1)*ueps(m,p_0,-1), -2*m, "ueps(-1).ueps(-1)= -2m", passed) call expect (veps(m,p_0,-2)*ueps(m,p_0,-2), -2*m, "ueps(-2).ueps(-2)= -2m", passed) call expect (ueps(m,p_0, 2)*veps(m,p_0, 2), 2*m, "veps( 2).veps( 2)= +2m", passed) call expect (ueps(m,p_0, 1)*veps(m,p_0, 1), 2*m, "veps( 1).veps( 1)= +2m", passed) call expect (ueps(m,p_0,-1)*veps(m,p_0,-1), 2*m, "veps(-1).veps(-1)= +2m", passed) call expect (ueps(m,p_0,-2)*veps(m,p_0,-2), 2*m, "veps(-2).veps(-2)= +2m", passed) call expect (ueps(m,p_0, 2)*ueps(m,p_0, 2), 0, "ueps( 2).veps( 2)= 0", passed) call expect (ueps(m,p_0, 1)*ueps(m,p_0, 1), 0, "ueps( 1).veps( 1)= 0", passed) call expect (ueps(m,p_0,-1)*ueps(m,p_0,-1), 0, "ueps(-1).veps(-1)= 0", passed) call expect (ueps(m,p_0,-2)*ueps(m,p_0,-2), 0, "ueps(-2).veps(-2)= 0", passed) call expect (veps(m,p_0, 2)*veps(m,p_0, 2), 0, "veps( 2).ueps( 2)= 0", passed) call expect (veps(m,p_0, 1)*veps(m,p_0, 1), 0, "veps( 1).ueps( 1)= 0", passed) call expect (veps(m,p_0,-1)*veps(m,p_0,-1), 0, "veps(-1).ueps(-1)= 0", passed) call expect (veps(m,p_0,-2)*veps(m,p_0,-2), 0, "veps(-2).ueps(-2)= 0", passed) print *, "*** in the rest frame (neg. masses) ***" call expect (veps(-m,p_0, 2)*ueps(-m,p_0, 2), +2*m, "ueps( 2).ueps( 2)= +2m", passed) call expect (veps(-m,p_0, 1)*ueps(-m,p_0, 1), +2*m, "ueps( 1).ueps( 1)= +2m", passed) call expect (veps(-m,p_0,-1)*ueps(-m,p_0,-1), +2*m, "ueps(-1).ueps(-1)= +2m", passed) call expect (veps(-m,p_0,-2)*ueps(-m,p_0,-2), +2*m, "ueps(-2).ueps(-2)= +2m", passed) call expect (ueps(-m,p_0, 2)*veps(-m,p_0, 2), -2*m, "veps( 2).veps( 2)= -2m", passed) call expect (ueps(-m,p_0, 1)*veps(-m,p_0, 1), -2*m, "veps( 1).veps( 1)= -2m", passed) call expect (ueps(-m,p_0,-1)*veps(-m,p_0,-1), -2*m, "veps(-1).veps(-1)= -2m", passed) call expect (ueps(-m,p_0,-2)*veps(-m,p_0,-2), -2*m, "veps(-2).veps(-2)= -2m", passed) call expect (ueps(-m,p_0, 2)*ueps(-m,p_0, 2), 0, "ueps( 2).veps( 2)= 0", passed) call expect (ueps(-m,p_0, 1)*ueps(-m,p_0, 1), 0, "ueps( 1).veps( 1)= 0", passed) call expect (ueps(-m,p_0,-1)*ueps(-m,p_0,-1), 0, "ueps(-1).veps(-1)= 0", passed) call expect (ueps(-m,p_0,-2)*ueps(-m,p_0,-2), 0, "ueps(-2).veps(-2)= 0", passed) call expect (veps(-m,p_0, 2)*veps(-m,p_0, 2), 0, "veps( 2).ueps( 2)= 0", passed) call expect (veps(-m,p_0, 1)*veps(-m,p_0, 1), 0, "veps( 1).ueps( 1)= 0", passed) call expect (veps(-m,p_0,-1)*veps(-m,p_0,-1), 0, "veps(-1).ueps(-1)= 0", passed) call expect (veps(-m,p_0,-2)*veps(-m,p_0,-2), 0, "veps(-2).ueps(-2)= 0", passed) @ <>= print *, "*** Majorana properties of gravitino vertices: ***" call expect (abs(u (m,q,1) * f_sgr (c_one, c_one, ueps(m,p,2), t) + & ueps(m,p,2) * gr_sf(c_one,c_one,u(m,q,1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_sgr (c_one, c_one, ueps(m,p,2), t) + & !!! ueps(m,p,2) * gr_sf(c_one,c_one,u(m,q,-1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,1) * f_sgr (c_one, c_one, ueps(m,p,1), t) + & !!! ueps(m,p,1) * gr_sf(c_one,c_one,u(m,q,1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_sgr (c_one, c_one, ueps(m,p,1), t) + & !!! ueps(m,p,1) * gr_sf(c_one,c_one,u(m,q,-1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,1) * f_sgr (c_one, c_one, ueps(m,p,-1), t) + & !!! ueps(m,p,-1) * gr_sf(c_one,c_one,u(m,q,1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_sgr (c_one, c_one, ueps(m,p,-1), t) + & !!! ueps(m,p,-1) * gr_sf(c_one,c_one,u(m,q,-1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,1) * f_sgr (c_one, c_one, ueps(m,p,-2), t) + & !!! ueps(m,p,-2) * gr_sf(c_one,c_one,u(m,q,1),t)), 0, "f_sgr + gr_sf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_sgr (c_one, c_one, ueps(m,p,-2), t) + & !!! ueps(m,p,-2) * gr_sf(c_one,c_one,u(m,q,-1),t)), 0, "f_sgr + gr_sf = 0", passed) call expect (abs(u (m,q,1) * f_slgr (c_one, c_one, ueps(m,p,2), t) + & ueps(m,p,2) * gr_slf(c_one,c_one,u(m,q,1),t)), 0, "f_slgr + gr_slf = 0", passed, threshold = 0.5_default) call expect (abs(u (m,q,1) * f_srgr (c_one, c_one, ueps(m,p,2), t) + & ueps(m,p,2) * gr_srf(c_one,c_one,u(m,q,1),t)), 0, "f_srgr + gr_srf = 0", passed, threshold = 0.5_default) call expect (abs(u (m,q,1) * f_slrgr (c_one, c_two, c_one, ueps(m,p,2), t) + & ueps(m,p,2) * gr_slrf(c_one,c_two,c_one,u(m,q,1),t)), 0, "f_slrgr + gr_slrf = 0", passed, threshold = 0.5_default) call expect (abs(u (m,q,1) * f_pgr (c_one, c_one, ueps(m,p,2), t) + & ueps(m,p,2) * gr_pf(c_one,c_one,u(m,q,1),t)), 0, "f_pgr + gr_pf = 0", passed, threshold = 0.5_default) call expect (abs(u (m,q,1) * f_vgr (c_one, vt, ueps(m,p,2), p+q) + & ueps(m,p,2) * gr_vf(c_one,vt,u(m,q,1),p+q)), 0, "f_vgr + gr_vf = 0", passed, threshold = 0.5_default) call expect (abs(u (m,q,1) * f_vlrgr (c_one, c_two, vt, ueps(m,p,2), p+q) + & ueps(m,p,2) * gr_vlrf(c_one,c_two,vt,u(m,q,1),p+q)), 0, "f_vlrgr + gr_vlrf = 0", & passed, threshold = 0.5_default) !!! call expect (abs(u (m,q,-1) * f_vgr (c_one, vt, ueps(m,p,2), p+q) + & !!! ueps(m,p,2) * gr_vf(c_one,vt,u(m,q,-1),p+q)), 0, "f_vgr + gr_vf = 0", passed) !!! call expect (abs(u (m,q,1) * f_vgr (c_one, vt, ueps(m,p,1), p+q) + & !!! ueps(m,p,1) * gr_vf(c_one,vt,u(m,q,1),p+q)), 0, "f_vgr + gr_vf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_vgr (c_one, vt, ueps(m,p,1), p+q) + & !!! ueps(m,p,1) * gr_vf(c_one,vt,u(m,q,-1),p+q)), 0, "f_vgr + gr_vf = 0", passed) !!! call expect (abs(u (m,q,1) * f_vgr (c_one, vt, ueps(m,p,-1), p+q) + & !!! ueps(m,p,-1) * gr_vf(c_one,vt,u(m,q,1),p+q)), 0, "f_vgr + gr_vf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_vgr (c_one, vt, veps(m,p,-1), p+q) + & !!! veps(m,p,-1) * gr_vf(c_one,vt,u(m,q,-1),p+q)), 0, "f_vgr + gr_vf = 0", passed) !!! call expect (abs(v (m,q,1) * f_vgr (c_one, vt, ueps(m,p,-2), p+q) + & !!! ueps(m,p,-2) * gr_vf(c_one,vt,v(m,q,1),p+q)), 0, "f_vgr + gr_vf = 0", passed) !!! call expect (abs(u (m,q,-1) * f_vgr (c_one, vt, ueps(m,p,-2), p+q) + & !!! ueps(m,p,-2) * gr_vf(c_one,vt,u(m,q,-1),p+q)), 0, "f_vgr + gr_vf = 0", passed) call expect (abs(s_grf (c_one, ueps(m,p,2), u(m,q,1),t) + & s_fgr(c_one,u(m,q,1),ueps(m,p,2),t)), 0, "s_grf + s_fgr = 0", passed) call expect (abs(sl_grf (c_one, ueps(m,p,2), u(m,q,1),t) + & sl_fgr(c_one,u(m,q,1),ueps(m,p,2),t)), 0, "sl_grf + sl_fgr = 0", passed) call expect (abs(sr_grf (c_one, ueps(m,p,2), u(m,q,1),t) + & sr_fgr(c_one,u(m,q,1),ueps(m,p,2),t)), 0, "sr_grf + sr_fgr = 0", passed) call expect (abs(slr_grf (c_one, c_two, ueps(m,p,2), u(m,q,1),t) + & slr_fgr(c_one,c_two,u(m,q,1),ueps(m,p,2),t)), 0, "slr_grf + slr_fgr = 0", passed) call expect (abs(p_grf (c_one, ueps(m,p,2), u(m,q,1),t) + & p_fgr(c_one,u(m,q,1),ueps(m,p,2),t)), 0, "p_grf + p_fgr = 0", passed) call expect (abs(v_grf (c_one, ueps(m,p,2), u(m,q,1),t) + & v_fgr(c_one,u(m,q,1),ueps(m,p,2),t)), 0, "v_grf + v_fgr = 0", passed) call expect (abs(vlr_grf (c_one, c_two, ueps(m,p,2), u(m,q,1),t) + & vlr_fgr(c_one,c_two,u(m,q,1),ueps(m,p,2),t)), 0, "vlr_grf + vlr_fgr = 0", passed) call expect (abs(u(m,p,1) * f_potgr (c_one,c_one,testv) - testv * gr_potf & (c_one,c_one,u (m,p,1))), 0, "f_potgr - gr_potf = 0", passed) call expect (abs (pot_fgr (c_one,u(m,p,1),testv) - pot_grf(c_one, & testv,u(m,p,1))), 0, "pot_fgr - pot_grf = 0", passed) call expect (abs(u(m,p,1) * f_s2gr (c_one,c_one,c_one,testv) - testv * gr_s2f & (c_one,c_one,c_one,u (m,p,1))), 0, "f_s2gr - gr_s2f = 0", passed) call expect (abs (s2_fgr (c_one,u(m,p,1),c_one,testv) - s2_grf(c_one, & testv,c_one,u(m,p,1))), 0, "s2_fgr - s2_grf = 0", passed) call expect (abs(u (m,q,1) * f_svgr (c_one, c_one, vt, ueps(m,p,2)) + & ueps(m,p,2) * gr_svf(c_one,c_one,vt,u(m,q,1))), 0, "f_svgr + gr_svf = 0", passed) call expect (abs(u (m,q,1) * f_slvgr (c_one, c_one, vt, ueps(m,p,2)) + & ueps(m,p,2) * gr_slvf(c_one,c_one,vt,u(m,q,1))), 0, "f_slvgr + gr_slvf = 0", passed) call expect (abs(u (m,q,1) * f_srvgr (c_one, c_one, vt, ueps(m,p,2)) + & ueps(m,p,2) * gr_srvf(c_one,c_one,vt,u(m,q,1))), 0, "f_srvgr + gr_srvf = 0", passed) call expect (abs(u (m,q,1) * f_slrvgr (c_one, c_two, c_one, vt, ueps(m,p,2)) + & ueps(m,p,2) * gr_slrvf(c_one,c_two,c_one,vt,u(m,q,1))), 0, "f_slrvgr + gr_slrvf = 0", passed) call expect (abs (sv1_fgr (c_one,u(m,p,1),vt,ueps(m,q,2)) + sv1_grf(c_one, & ueps(m,q,2),vt,u(m,p,1))), 0, "sv1_fgr + sv1_grf = 0", passed) call expect (abs (sv2_fgr (c_one,u(m,p,1),c_one,ueps(m,q,2)) + sv2_grf(c_one, & ueps(m,q,2),c_one,u(m,p,1))), 0, "sv2_fgr + sv2_grf = 0", passed) call expect (abs (slv1_fgr (c_one,u(m,p,1),vt,ueps(m,q,2)) + slv1_grf(c_one, & ueps(m,q,2),vt,u(m,p,1))), 0, "slv1_fgr + slv1_grf = 0", passed) call expect (abs (srv2_fgr (c_one,u(m,p,1),c_one,ueps(m,q,2)) + srv2_grf(c_one, & ueps(m,q,2),c_one,u(m,p,1))), 0, "srv2_fgr + srv2_grf = 0", passed) call expect (abs (slrv1_fgr (c_one,c_two,u(m,p,1),vt,ueps(m,q,2)) + slrv1_grf(c_one,c_two, & ueps(m,q,2),vt,u(m,p,1))), 0, "slrv1_fgr + slrv1_grf = 0", passed) call expect (abs (slrv2_fgr (c_one,c_two,u(m,p,1),c_one,ueps(m,q,2)) + slrv2_grf(c_one, & c_two,ueps(m,q,2),c_one,u(m,p,1))), 0, "slrv2_fgr + slrv2_grf = 0", passed) call expect (abs(u (m,q,1) * f_pvgr (c_one, c_one, vt, ueps(m,p,2)) + & ueps(m,p,2) * gr_pvf(c_one,c_one,vt,u(m,q,1))), 0, "f_pvgr + gr_pvf = 0", passed) call expect (abs (pv1_fgr (c_one,u(m,p,1),vt,ueps(m,q,2)) + pv1_grf(c_one, & ueps(m,q,2),vt,u(m,p,1))), 0, "pv1_fgr + pv1_grf = 0", passed) call expect (abs (pv2_fgr (c_one,u(m,p,1),c_one,ueps(m,q,2)) + pv2_grf(c_one, & ueps(m,q,2),c_one,u(m,p,1))), 0, "pv2_fgr + pv2_grf = 0", passed) call expect (abs(u (m,q,1) * f_v2gr (c_one, vt, vz, ueps(m,p,2)) + & ueps(m,p,2) * gr_v2f(c_one,vt,vz,u(m,q,1))), 0, "f_v2gr + gr_v2f = 0", passed) call expect (abs(u (m,q,1) * f_v2lrgr (c_one, c_two, vt, vz, ueps(m,p,2)) + & ueps(m,p,2) * gr_v2lrf(c_one,c_two,vt,vz,u(m,q,1))), 0, "f_v2lrgr + gr_v2lrf = 0", passed) call expect (abs (v2_fgr (c_one,u(m,p,1),vt,ueps(m,q,2)) + v2_grf(c_one, & ueps(m,q,2),vt,u(m,p,1))), 0, "v2_fgr + v2_grf = 0", passed) call expect (abs (v2lr_fgr (c_one,c_two,u(m,p,1),vt,ueps(m,q,2)) + v2lr_grf(c_one, c_two, & ueps(m,q,2),vt,u(m,p,1))), 0, "v2lr_fgr + v2lr_grf = 0", passed) @ <>= print *, "*** Testing the gravitino propagator: ***" print *, "Transversality:" call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,testv))), 0, "p.pr.test", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,ueps(m,p,2)))), 0, "p.pr.ueps ( 2)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,ueps(m,p,1)))), 0, "p.pr.ueps ( 1)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,ueps(m,p,-1)))), 0, "p.pr.ueps (-1)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,ueps(m,p,-2)))), 0, "p.pr.ueps (-2)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,veps(m,p,2)))), 0, "p.pr.veps ( 2)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,veps(m,p,1)))), 0, "p.pr.veps ( 1)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,veps(m,p,-1)))), 0, "p.pr.veps (-1)", passed) call expect (abs(p * (cmplx (p*p - m**2, m*w, kind=default) * & pr_grav(p,m,w,veps(m,p,-2)))), 0, "p.pr.veps (-2)", passed) print *, "Irreducibility:" call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,testv)))), 0, "g.pr.test", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,ueps(m,p,2))))), 0, & "g.pr.ueps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,ueps(m,p,1))))), 0, & "g.pr.ueps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,ueps(m,p,-1))))), 0, & "g.pr.ueps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,ueps(m,p,-2))))), 0, & "g.pr.ueps (-2)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,veps(m,p,2))))), 0, & "g.pr.veps ( 2)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,veps(m,p,1))))), 0, & "g.pr.veps ( 1)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,veps(m,p,-1))))), 0, & "g.pr.veps (-1)", passed) call expect (abs(f_potgr (c_one, c_one, (cmplx (p*p - m**2, m*w, & kind=default) * pr_grav(p,m,w,veps(m,p,-2))))), 0, & "g.pr.veps (-2)", passed) @ <<[[omega_bundle.f90]]>>= <<[[omega_vectors.f90]]>> <<[[omega_spinors.f90]]>> <<[[omega_bispinors.f90]]>> <<[[omega_vectorspinors.f90]]>> <<[[omega_polarizations.f90]]>> <<[[omega_tensors.f90]]>> <<[[omega_tensor_polarizations.f90]]>> <<[[omega_couplings.f90]]>> <<[[omega_spinor_couplings.f90]]>> <<[[omega_bispinor_couplings.f90]]>> <<[[omega_vspinor_polarizations.f90]]>> <<[[omega_utils.f90]]>> <<[[omega95.f90]]>> <<[[omega95_bispinors.f90]]>> <<[[omega_parameters.f90]]>> <<[[omega_parameters_madgraph.f90]]>> @ <<[[omega_bundle_whizard.f90]]>>= <<[[omega_bundle.f90]]>> <<[[omega_parameters_whizard.f90]]>> @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{O'Mega Virtual Machine} This module defines the O'Mega Virtual Machine (OVM) completely, whereby all environmental dependencies like masses, widths and couplings have to be given to the constructor [[vm%init]] at runtime. Support for Majorana particles and vectorspinors is only partially, especially all fusions are missing. Maybe it would be easier to make an additional [[omegavm95_bispinors]] to avoid namespace issues. Non-type specific chunks could be reused <<[[omegavm95.f90]]>>= <> module omegavm95 use kinds, only: default use constants use iso_varying_string, string_t => varying_string use, intrinsic :: iso_fortran_env, only : input_unit, output_unit, error_unit use omega95 use omega95_bispinors, only: bispinor, vectorspinor, veps, pr_grav use omega95_bispinors, only: bi_u => u use omega95_bispinors, only: bi_v => v use omega95_bispinors, only: bi_pr_psi => pr_psi use omega_bispinors, only: operator (*), operator (+) use omega_color, only: ovm_color_sum, OCF => omega_color_factor implicit none private <> <> <> contains <> <> end module omegavm95 @ This might not be the proper place but I don't know where to put it <>= integer, parameter, public :: stdin = input_unit integer, parameter, public :: stdout = output_unit integer, parameter, public :: stderr = error_unit integer, parameter :: MIN_UNIT = 11, MAX_UNIT = 99 @ <>= subroutine find_free_unit (u, iostat) integer, intent(out) :: u integer, intent(out), optional :: iostat logical :: exists, is_open integer :: i, status do i = MIN_UNIT, MAX_UNIT inquire (unit = i, exist = exists, opened = is_open, & iostat = status) if (status == 0) then if (exists .and. .not. is_open) then u = i if (present (iostat)) then iostat = 0 end if return end if end if end do if (present (iostat)) then iostat = -1 end if u = -1 end subroutine find_free_unit @ These abstract data types would ideally be the interface to communicate quantum numbers between O'Mega and Whizard. This gives full flexibility to change the representation at any time <>= public :: color_t type color_t contains procedure :: write => color_write end type color_t public :: col_discrete type, extends(color_t) :: col_discrete integer :: i end type col_discrete public :: flavor_t type flavor_t contains procedure :: write => flavor_write end type flavor_t public :: flv_discrete type, extends(flavor_t) :: flv_discrete integer :: i end type flv_discrete public :: helicity_t type :: helicity_t contains procedure :: write => helicity_write end type helicity_t public :: hel_discrete type, extends(helicity_t) :: hel_discrete integer :: i end type hel_discrete public :: hel_trigonometric type, extends(helicity_t) :: hel_trigonometric real :: theta end type hel_trigonometric public :: hel_exponential type, extends(helicity_t) :: hel_exponential real :: phi end type hel_exponential public :: hel_spherical type, extends(helicity_t) :: hel_spherical real :: theta, phi end type hel_spherical <>= subroutine color_write (color, fh) class(color_t), intent(in) :: color integer, intent(in) :: fh select type(color) type is (col_discrete) write(fh, *) 'color_discrete%i = ', color%i end select end subroutine color_write subroutine helicity_write (helicity, fh) class(helicity_t), intent(in) :: helicity integer, intent(in) :: fh select type(helicity) type is (hel_discrete) write(fh, *) 'helicity_discrete%i = ', helicity%i type is (hel_trigonometric) write(fh, *) 'helicity_trigonometric%theta = ', helicity%theta type is (hel_exponential) write(fh, *) 'helicity_exponential%phi = ', helicity%phi type is (hel_spherical) write(fh, *) 'helicity_spherical%phi = ', helicity%phi write(fh, *) 'helicity_spherical%theta = ', helicity%theta end select end subroutine helicity_write subroutine flavor_write (flavor, fh) class(flavor_t), intent(in) :: flavor integer, intent(in) :: fh select type(flavor) type is (flv_discrete) write(fh, *) 'flavor_discrete%i = ', flavor%i end select end subroutine flavor_write @ \subsection{Memory Layout} Some internal parameters <>= integer, parameter :: len_instructions = 8 integer, parameter :: N_version_lines = 2 ! Comment lines including the first header description line integer, parameter :: N_comments = 6 ! Actual data lines plus intermediate description lines ! 'description \n 1 2 3 \n description \n 3 2 1' would count as 3 integer, parameter :: N_header_lines = 5 real(default), parameter, public :: N_ = three @ This is the basic type of a VM <>= type :: basic_vm_t private logical :: verbose type(string_t) :: bytecode_file integer :: bytecode_fh, out_fh integer :: N_instructions, N_levels integer :: N_table_lines integer, dimension(:, :), allocatable :: instructions integer, dimension(:), allocatable :: levels end type @ To allow for a lazy evaluation of amplitudes, we have to keep track whether a wave function has already been computed, to avoid multiple-computing that would arise when the bytecode has redundant fusions, which is necessary for flavor and color MC (and helicity MC when we use Weyl-van-der-Waerden-spinors) <>= type :: vm_scalar logical :: c complex(kind=default) :: v end type type :: vm_spinor logical :: c type(spinor) :: v end type type :: vm_conjspinor logical :: c type(conjspinor) :: v end type type :: vm_bispinor logical :: c type(bispinor) :: v end type type :: vm_vector logical :: c type(vector) :: v end type type :: vm_tensor_2 logical :: c type(tensor) :: v end type type :: vm_tensor_1 logical :: c type(tensor2odd) :: v end type type :: vm_vectorspinor logical :: c type(vectorspinor) :: v end type @ We need a memory pool for all the intermediate results <>= type, public, extends (basic_vm_t) :: vm_t private type(string_t) :: version type(string_t) :: model integer :: N_momenta, N_particles, N_prt_in, N_prt_out, N_amplitudes ! helicities = helicity combinations integer :: N_helicities, N_col_flows, N_col_indices, N_flavors, N_col_factors integer :: N_scalars, N_spinors, N_conjspinors, N_bispinors integer :: N_vectors, N_tensors_2, N_tensors_1, N_vectorspinors integer :: N_coupl_real, N_coupl_real2, N_coupl_cmplx, N_coupl_cmplx2 integer, dimension(:, :), allocatable :: table_flavor integer, dimension(:, :, :), allocatable :: table_color_flows integer, dimension(:, :), allocatable :: table_spin logical, dimension(:, :), allocatable :: table_ghost_flags type(OCF), dimension(:), allocatable :: table_color_factors logical, dimension(:, :), allocatable :: table_flv_col_is_allowed real(default), dimension(:), allocatable :: coupl_real real(default), dimension(:, :), allocatable :: coupl_real2 complex(default), dimension(:), allocatable :: coupl_cmplx complex(default), dimension(:, :), allocatable :: coupl_cmplx2 real(default), dimension(:), allocatable :: mass real(default), dimension(:), allocatable :: width type(momentum), dimension(:), allocatable :: momenta complex(default), dimension(:), allocatable :: amplitudes complex(default), dimension(:, :, :), allocatable :: table_amplitudes class(flavor_t), dimension(:), allocatable :: flavor class(color_t), dimension(:), allocatable :: color ! gfortran 4.7 !class(helicity_t), dimension(:), pointer :: helicity => null() integer, dimension(:), allocatable :: helicity type(vm_scalar), dimension(:), allocatable :: scalars type(vm_spinor), dimension(:), allocatable :: spinors type(vm_conjspinor), dimension(:), allocatable :: conjspinors type(vm_bispinor), dimension(:), allocatable :: bispinors type(vm_vector), dimension(:), allocatable :: vectors type(vm_tensor_2), dimension(:), allocatable :: tensors_2 type(vm_tensor_1), dimension(:), allocatable :: tensors_1 type(vm_vectorspinor), dimension(:), allocatable :: vectorspinors logical, dimension(:), allocatable :: hel_is_allowed real(default), dimension(:), allocatable :: hel_max_abs real(default) :: hel_sum_abs = 0, hel_threshold = 1E10 integer :: hel_count = 0, hel_cutoff = 100 integer, dimension(:), allocatable :: hel_map integer :: hel_finite logical :: cms logical :: openmp contains <> end type @ <>= subroutine alloc_arrays (vm) type(vm_t), intent(inout) :: vm integer :: i allocate (vm%table_flavor(vm%N_particles, vm%N_flavors)) allocate (vm%table_color_flows(vm%N_col_indices, vm%N_particles, & vm%N_col_flows)) allocate (vm%table_spin(vm%N_particles, vm%N_helicities)) allocate (vm%table_ghost_flags(vm%N_particles, vm%N_col_flows)) allocate (vm%table_color_factors(vm%N_col_factors)) allocate (vm%table_flv_col_is_allowed(vm%N_flavors, vm%N_col_flows)) allocate (vm%momenta(vm%N_momenta)) allocate (vm%amplitudes(vm%N_amplitudes)) allocate (vm%table_amplitudes(vm%N_flavors, vm%N_col_flows, & vm%N_helicities)) vm%table_amplitudes = zero allocate (vm%scalars(vm%N_scalars)) allocate (vm%spinors(vm%N_spinors)) allocate (vm%conjspinors(vm%N_conjspinors)) allocate (vm%bispinors(vm%N_bispinors)) allocate (vm%vectors(vm%N_vectors)) allocate (vm%tensors_2(vm%N_tensors_2)) allocate (vm%tensors_1(vm%N_tensors_1)) allocate (vm%vectorspinors(vm%N_vectorspinors)) allocate (vm%hel_is_allowed(vm%N_helicities)) vm%hel_is_allowed = .True. allocate (vm%hel_max_abs(vm%N_helicities)) vm%hel_max_abs = 0 allocate (vm%hel_map(vm%N_helicities)) vm%hel_map = (/(i, i = 1, vm%N_helicities)/) vm%hel_finite = vm%N_helicities end subroutine alloc_arrays @ \subsection{Controlling the VM} These type-bound procedures steer the VM <>= procedure :: init => vm_init procedure :: write => vm_write procedure :: reset => vm_reset procedure :: run => vm_run procedure :: final => vm_final @ The [[init]] completely sets the environment for the OVM. Parameters can be changed with [[reset]] without reloading the bytecode. <>= subroutine vm_init (vm, bytecode_file, version, model, & coupl_real, coupl_real2, coupl_cmplx, coupl_cmplx2, & mass, width, verbose, out_fh, openmp) class(vm_t), intent(out) :: vm type(string_t), intent(in) :: bytecode_file type(string_t), intent(in) :: version type(string_t), intent(in) :: model real(default), dimension(:), optional, intent(in) :: coupl_real real(default), dimension(:, :), optional, intent(in) :: coupl_real2 complex(default), dimension(:), optional, intent(in) :: coupl_cmplx complex(default), dimension(:, :), optional, intent(in) :: coupl_cmplx2 real(default), dimension(:), optional, intent(in) :: mass real(default), dimension(:), optional, intent(in) :: width logical, optional, intent(in) :: verbose integer, optional, intent(in) :: out_fh logical, optional, intent(in) :: openmp vm%bytecode_file = bytecode_file vm%version = version vm%model = model if (present (coupl_real)) then allocate (vm%coupl_real (size (coupl_real)), source=coupl_real) end if if (present (coupl_real2)) then allocate (vm%coupl_real2 (2, size (coupl_real2, 2)), source=coupl_real2) end if if (present (coupl_cmplx)) then allocate (vm%coupl_cmplx (size (coupl_cmplx)), source=coupl_cmplx) end if if (present (coupl_cmplx2)) then allocate (vm%coupl_cmplx2 (2, size (coupl_cmplx2, 2)), & source=coupl_cmplx2) end if if (present (mass)) then allocate (vm%mass(size(mass)), source=mass) end if if (present (width)) then allocate (vm%width(size (width)), source=width) end if if (present (openmp)) then vm%openmp = openmp else vm%openmp = .false. end if vm%cms = .false. call basic_init (vm, verbose, out_fh) end subroutine vm_init @ <>= subroutine vm_reset (vm, & coupl_real, coupl_real2, coupl_cmplx, coupl_cmplx2, & mass, width, verbose, out_fh) class(vm_t), intent(inout) :: vm real(default), dimension(:), optional, intent(in) :: coupl_real real(default), dimension(:, :), optional, intent(in) :: coupl_real2 complex(default), dimension(:), optional, intent(in) :: coupl_cmplx complex(default), dimension(:, :), optional, intent(in) :: coupl_cmplx2 real(default), dimension(:), optional, intent(in) :: mass real(default), dimension(:), optional, intent(in) :: width logical, optional, intent(in) :: verbose integer, optional, intent(in) :: out_fh if (present (coupl_real)) then vm%coupl_real = coupl_real end if if (present (coupl_real2)) then vm%coupl_real2 = coupl_real2 end if if (present (coupl_cmplx)) then vm%coupl_cmplx = coupl_cmplx end if if (present (coupl_cmplx2)) then vm%coupl_cmplx2 = coupl_cmplx2 end if if (present (mass)) then vm%mass = mass end if if (present (width)) then vm%width = width end if if (present (verbose)) then vm%verbose = verbose end if if (present (out_fh)) then vm%out_fh = out_fh end if end subroutine vm_reset @ Mainly for debugging <>= subroutine vm_write (vm) class(vm_t), intent(in) :: vm integer :: i, j, k call basic_write (vm) write(vm%out_fh, *) 'table_flavor = ', vm%table_flavor write(vm%out_fh, *) 'table_color_flows = ', vm%table_color_flows write(vm%out_fh, *) 'table_spin = ', vm%table_spin write(vm%out_fh, *) 'table_ghost_flags = ', vm%table_ghost_flags write(vm%out_fh, *) 'table_color_factors = ' do i = 1, size(vm%table_color_factors) write(vm%out_fh, *) vm%table_color_factors(i)%i1, & vm%table_color_factors(i)%i2, & vm%table_color_factors(i)%factor end do write(vm%out_fh, *) 'table_flv_col_is_allowed = ', & vm%table_flv_col_is_allowed do i = 1, vm%N_flavors do j = 1, vm%N_col_flows do k = 1, vm%N_helicities write(vm%out_fh, *) 'table_amplitudes(f,c,h), f, c, h = ', vm%table_amplitudes(i,j,k), i, j, k end do end do end do if (allocated(vm%coupl_real)) then write(vm%out_fh, *) 'coupl_real = ', vm%coupl_real end if if (allocated(vm%coupl_real2)) then write(vm%out_fh, *) 'coupl_real2 = ', vm%coupl_real2 end if if (allocated(vm%coupl_cmplx)) then write(vm%out_fh, *) 'coupl_cmplx = ', vm%coupl_cmplx end if if (allocated(vm%coupl_cmplx2)) then write(vm%out_fh, *) 'coupl_cmplx2 = ', vm%coupl_cmplx2 end if write(vm%out_fh, *) 'mass = ', vm%mass write(vm%out_fh, *) 'width = ', vm%width write(vm%out_fh, *) 'momenta = ', vm%momenta ! gfortran 4.7 !do i = 1, size(vm%flavor) !call vm%flavor(i)%write (vm%out_fh) !end do !do i = 1, size(vm%color) !call vm%color(i)%write (vm%out_fh) !end do !do i = 1, size(vm%helicity) !call vm%helicity(i)%write (vm%out_fh) !end do write(vm%out_fh, *) 'helicity = ', vm%helicity write(vm%out_fh, *) 'amplitudes = ', vm%amplitudes write(vm%out_fh, *) 'scalars = ', vm%scalars write(vm%out_fh, *) 'spinors = ', vm%spinors write(vm%out_fh, *) 'conjspinors = ', vm%conjspinors write(vm%out_fh, *) 'bispinors = ', vm%bispinors write(vm%out_fh, *) 'vectors = ', vm%vectors write(vm%out_fh, *) 'tensors_2 = ', vm%tensors_2 write(vm%out_fh, *) 'tensors_1 = ', vm%tensors_1 !!! !!! !!! Regression with ifort 16.0.0 !!! write(vm%out_fh, *) 'vectorspinors = ', vm%vectorspinors write(vm%out_fh, *) 'N_momenta = ', vm%N_momenta write(vm%out_fh, *) 'N_particles = ', vm%N_particles write(vm%out_fh, *) 'N_prt_in = ', vm%N_prt_in write(vm%out_fh, *) 'N_prt_out = ', vm%N_prt_out write(vm%out_fh, *) 'N_amplitudes = ', vm%N_amplitudes write(vm%out_fh, *) 'N_helicities = ', vm%N_helicities write(vm%out_fh, *) 'N_col_flows = ', vm%N_col_flows write(vm%out_fh, *) 'N_col_indices = ', vm%N_col_indices write(vm%out_fh, *) 'N_flavors = ', vm%N_flavors write(vm%out_fh, *) 'N_col_factors = ', vm%N_col_factors write(vm%out_fh, *) 'N_scalars = ', vm%N_scalars write(vm%out_fh, *) 'N_spinors = ', vm%N_spinors write(vm%out_fh, *) 'N_conjspinors = ', vm%N_conjspinors write(vm%out_fh, *) 'N_bispinors = ', vm%N_bispinors write(vm%out_fh, *) 'N_vectors = ', vm%N_vectors write(vm%out_fh, *) 'N_tensors_2 = ', vm%N_tensors_2 write(vm%out_fh, *) 'N_tensors_1 = ', vm%N_tensors_1 write(vm%out_fh, *) 'N_vectorspinors = ', vm%N_vectorspinors write(vm%out_fh, *) 'Overall size of VM: ' ! GNU extension ! write(vm%out_fh, *) 'sizeof(wavefunctions) = ', & ! sizeof(vm%scalars) + sizeof(vm%spinors) + sizeof(vm%conjspinors) + & ! sizeof(vm%bispinors) + sizeof(vm%vectors) + sizeof(vm%tensors_2) + & ! sizeof(vm%tensors_1) + sizeof(vm%vectorspinors) ! write(vm%out_fh, *) 'sizeof(mometa) = ', sizeof(vm%momenta) ! write(vm%out_fh, *) 'sizeof(amplitudes) = ', sizeof(vm%amplitudes) ! write(vm%out_fh, *) 'sizeof(tables) = ', & ! sizeof(vm%table_amplitudes) + sizeof(vm%table_spin) + & ! sizeof(vm%table_flavor) + sizeof(vm%table_flv_col_is_allowed) + & ! sizeof(vm%table_color_flows) + sizeof(vm%table_color_factors) + & ! sizeof(vm%table_ghost_flags) end subroutine vm_write @ Most of this is redundant (Fortran will deallocate when we leave the scope) but when we change from [[allocatable]]s to [[pointer]]s, it is necessary to avoid leaks <>= subroutine vm_final (vm) class(vm_t), intent(inout) :: vm deallocate (vm%table_flavor) deallocate (vm%table_color_flows) deallocate (vm%table_spin) deallocate (vm%table_ghost_flags) deallocate (vm%table_color_factors) deallocate (vm%table_flv_col_is_allowed) if (allocated (vm%coupl_real)) then deallocate (vm%coupl_real) end if if (allocated (vm%coupl_real2)) then deallocate (vm%coupl_real2) end if if (allocated (vm%coupl_cmplx)) then deallocate (vm%coupl_cmplx) end if if (allocated (vm%coupl_cmplx2)) then deallocate (vm%coupl_cmplx2) end if if (allocated (vm%mass)) then deallocate (vm%mass) end if if (allocated (vm%width)) then deallocate (vm%width) end if deallocate (vm%momenta) deallocate (vm%flavor) deallocate (vm%color) deallocate (vm%helicity) deallocate (vm%amplitudes) deallocate (vm%table_amplitudes) deallocate (vm%scalars) deallocate (vm%spinors) deallocate (vm%conjspinors) deallocate (vm%bispinors) deallocate (vm%vectors) deallocate (vm%tensors_2) deallocate (vm%tensors_1) deallocate (vm%vectorspinors) end subroutine vm_final @ Handing over the polymorph object helicity didn't work out as planned. A work-around is the use of [[pointer]]s. [[flavor]] and [[color]] are not yet used but would have to be changed to [[pointer]]s as well. At least this potentially avoids copying. Actually, neither the allocatable nor the pointer version works in [[gfortran 4.7]] due to the broken [[select type]]. Back to Stone Age, i.e. integers. <>= subroutine vm_run (vm, mom, flavor, color, helicity) class(vm_t), intent(inout) :: vm real(default), dimension(0:3, *), intent(in) :: mom class(flavor_t), dimension(:), optional, intent(in) :: flavor class(color_t), dimension(:), optional, intent(in) :: color ! gfortran 4.7 !class(helicity_t), dimension(:), optional, target, intent(in) :: helicity integer, dimension(:), optional, intent(in) :: helicity integer :: i, h, hi do i = 1, vm%N_particles if (i <= vm%N_prt_in) then vm%momenta(i) = - mom(:, i) ! incoming, crossing symmetry else vm%momenta(i) = mom(:, i) ! outgoing end if end do if (present (flavor)) then allocate(vm%flavor(size(flavor)), source=flavor) else if (.not. (allocated (vm%flavor))) then allocate(flv_discrete::vm%flavor(vm%N_particles)) end if end if if (present (color)) then allocate(vm%color(size(color)), source=color) else if (.not. (allocated (vm%color))) then allocate(col_discrete::vm%color(vm%N_col_flows)) end if end if ! gfortran 4.7 if (present (helicity)) then !vm%helicity => helicity vm%helicity = helicity call vm_run_one_helicity (vm, 1) else !if (.not. (associated (vm%helicity))) then !allocate(hel_discrete::vm%helicity(vm%N_particles)) !end if if (.not. (allocated (vm%helicity))) then allocate(vm%helicity(vm%N_particles)) end if if (vm%hel_finite == 0) return do hi = 1, vm%hel_finite h = vm%hel_map(hi) !> vm%helicity = vm%table_spin(:,h) call vm_run_one_helicity (vm, h) end do end if end subroutine vm_run @ This only removes the [[ICE]] but still leads to a segmentation fault in [[gfortran 4.7]]. I am running out of ideas how to make this compiler work with arrays of polymorph datatypes. <>= integer :: hj <>= do hj = 1, size(vm%helicity) select type (hel => vm%helicity(hj)) type is (hel_discrete) hel%i = vm%table_spin(hj,h) end select end do @ <>= select type (hel => vm%helicity) type is (hel_discrete) hel(:)%i = vm%table_spin(:,h) end select @ <>= subroutine vm_run_one_helicity (vm, h) class(vm_t), intent(inout) :: vm integer, intent(in) :: h integer :: f, c, i vm%amplitudes = zero if (vm%N_levels > 0) then call null_all_wfs (vm) call iterate_instructions (vm) end if i = 1 do c = 1, vm%N_col_flows do f = 1, vm%N_flavors if (vm%table_flv_col_is_allowed(f,c)) then vm%table_amplitudes(f,c,h) = vm%amplitudes(i) i = i + 1 end if end do end do end subroutine @ <>= subroutine null_all_wfs (vm) type(vm_t), intent(inout) :: vm integer :: i, j vm%scalars%c = .False. vm%scalars%v = zero vm%spinors%c = .False. vm%conjspinors%c = .False. vm%bispinors%c = .False. vm%vectorspinors%c = .False. do i = 1, 4 vm%spinors%v%a(i) = zero vm%conjspinors%v%a(i) = zero vm%bispinors%v%a(i) = zero do j = 1, 4 vm%vectorspinors%v%psi(i)%a(j) = zero end do end do vm%vectors%c = .False. vm%vectors%v%t = zero vm%tensors_1%c = .False. vm%tensors_2%c = .False. do i = 1, 3 vm%vectors%v%x(i) = zero vm%tensors_1%v%e(i) = zero vm%tensors_1%v%b(i) = zero do j = 1, 3 vm%tensors_2%v%t(i,j) = zero end do end do end subroutine @ \subsection{Reading the bytecode} <>= subroutine load_header (vm, IO) type(vm_t), intent(inout) :: vm integer, intent(inout) :: IO integer, dimension(len_instructions) :: line read(vm%bytecode_fh, fmt = *, iostat = IO) line vm%N_momenta = line(1) vm%N_particles = line(2) vm%N_prt_in = line(3) vm%N_prt_out = line(4) vm%N_amplitudes = line(5) vm%N_helicities = line(6) vm%N_col_flows = line(7) if (vm%N_momenta == 0) then vm%N_col_indices = 2 else vm%N_col_indices = line(8) end if read(vm%bytecode_fh, fmt = *, iostat = IO) read(vm%bytecode_fh, fmt = *, iostat = IO) line vm%N_flavors = line(1) vm%N_col_factors = line(2) vm%N_scalars = line(3) vm%N_spinors = line(4) vm%N_conjspinors = line(5) vm%N_bispinors = line(6) vm%N_vectors = line(7) vm%N_tensors_2 = line(8) read(vm%bytecode_fh, fmt = *, iostat = IO) read(vm%bytecode_fh, fmt = *, iostat = IO) line vm%N_tensors_1 = line(1) vm%N_vectorspinors = line(2) ! Add 1 for seperating label lines like 'Another table' vm%N_table_lines = vm%N_helicities + 1 + vm%N_flavors + 1 + vm%N_col_flows & + 1 + vm%N_col_flows + 1 + vm%N_col_factors + 1 + vm%N_col_flows end subroutine load_header @ <>= subroutine read_tables (vm, IO) type(vm_t), intent(inout) :: vm integer, intent(inout) :: IO integer :: i integer, dimension(2) :: tmpcf integer, dimension(3) :: tmpfactor integer, dimension(vm%N_flavors) :: tmpF integer, dimension(vm%N_particles) :: tmpP real(default) :: factor do i = 1, vm%N_helicities read(vm%bytecode_fh, fmt = *, iostat = IO) vm%table_spin(:, i) end do read(vm%bytecode_fh, fmt = *, iostat = IO) do i = 1, vm%N_flavors read(vm%bytecode_fh, fmt = *, iostat = IO) vm%table_flavor(:, i) end do read(vm%bytecode_fh, fmt = *, iostat = IO) do i = 1, vm%N_col_flows read(vm%bytecode_fh, fmt = *, iostat = IO) vm%table_color_flows(:, :, i) end do read(vm%bytecode_fh, fmt = *, iostat = IO) do i = 1, vm%N_col_flows read(vm%bytecode_fh, fmt = *, iostat = IO) tmpP vm%table_ghost_flags(:, i) = int_to_log(tmpP) end do read(vm%bytecode_fh, fmt = *, iostat = IO) do i = 1, vm%N_col_factors read(vm%bytecode_fh, fmt = '(2I9)', iostat = IO, advance='no') tmpcf factor = zero do read(vm%bytecode_fh, fmt = '(3I9)', iostat = IO, advance='no', EOR=10) tmpfactor factor = factor + color_factor(tmpfactor(1), tmpfactor(2), tmpfactor(3)) end do 10 vm%table_color_factors(i) = OCF(tmpcf(1), tmpcf(2), factor) end do read(vm%bytecode_fh, fmt = *, iostat = IO) do i = 1, vm%N_col_flows read(vm%bytecode_fh, fmt = *, iostat = IO) tmpF vm%table_flv_col_is_allowed(:, i) = int_to_log(tmpF) end do end subroutine read_tables @ This checking has proven useful more than once <>= subroutine extended_version_check (vm, IO) type(vm_t), intent(in) :: vm integer, intent(inout) :: IO character(256) :: buffer read(vm%bytecode_fh, fmt = *, iostat = IO) buffer if (vm%model /= buffer) then print *, "Warning: Bytecode has been generated with an older SVN revision." else if (vm%verbose) then write (vm%out_fh, fmt = *) "Using the model: " write (vm%out_fh, fmt = *) char(vm%model) end if end if end subroutine extended_version_check @ This chunk is copied verbatim from the [[basic_vm]] <>= subroutine basic_init (vm, verbose, out_fh) type(vm_t), intent(inout) :: vm logical, optional, intent(in) :: verbose integer, optional, intent(in) :: out_fh if (present (verbose)) then vm%verbose = verbose else vm%verbose = .true. end if if (present (out_fh)) then vm%out_fh = out_fh else vm%out_fh = stdout end if call set_stream (vm) call alloc_and_count (vm) if (vm%N_levels > 0) then call read_bytecode (vm) call sanity_check (vm) end if close (vm%bytecode_fh) end subroutine basic_init subroutine basic_write (vm) type(vm_t), intent(in) :: vm integer :: i write (vm%out_fh, *) '=====> VM ', char(vm%version), ' <=====' write (vm%out_fh, *) 'verbose = ', vm%verbose write (vm%out_fh, *) 'bytecode_file = ', char (vm%bytecode_file) write (vm%out_fh, *) 'N_instructions = ', vm%N_instructions write (vm%out_fh, *) 'N_levels = ', vm%N_levels write (vm%out_fh, *) 'instructions = ' do i = 1, vm%N_instructions write (vm%out_fh, *) vm%instructions(:, i) end do write (vm%out_fh, *) 'levels = ', vm%levels end subroutine basic_write subroutine alloc_and_count (vm) type(vm_t), intent(inout) :: vm integer, dimension(len_instructions) :: line character(256) :: buffer integer :: i, IO read(vm%bytecode_fh, fmt = *, iostat = IO) buffer if (vm%version /= buffer) then print *, "Warning: Bytecode has been generated with an older SVN revision." else if (vm%verbose) then write (vm%out_fh, fmt = *) "Bytecode version fits." end if end if call extended_version_check (vm, IO) if (vm%verbose) then write (vm%out_fh, fmt = *) "Trying to allocate." end if do i = 1, N_comments read(vm%bytecode_fh, fmt = *, iostat = IO) end do call load_header (vm, IO) call alloc_arrays (vm) if (vm%N_momenta /= 0) then do i = 1, vm%N_table_lines + 1 read(vm%bytecode_fh, fmt = *, iostat = IO) end do vm%N_instructions = 0 vm%N_levels = 0 do read(vm%bytecode_fh, fmt = *, end = 42) line if (line(1) /= 0) then vm%N_instructions = vm%N_instructions + 1 else vm%N_levels = vm%N_levels + 1 end if end do 42 rewind(vm%bytecode_fh, iostat = IO) allocate (vm%instructions(len_instructions, vm%N_instructions)) allocate (vm%levels(vm%N_levels)) if (IO /= 0) then print *, "Error: vm.alloc : Couldn't load bytecode!" stop 1 end if end if end subroutine alloc_and_count subroutine read_bytecode (vm) type(vm_t), intent(inout) :: vm integer, dimension(len_instructions) :: line integer :: i, j, IO ! Jump over version number, comments, header and first table description do i = 1, N_version_lines + N_comments + N_header_lines + 1 read (vm%bytecode_fh, fmt = *, iostat = IO) end do call read_tables (vm, IO) read (vm%bytecode_fh, fmt = *, iostat = IO) i = 0; j = 0 do read (vm%bytecode_fh, fmt = *, iostat = IO) line if (IO /= 0) exit if (line(1) == 0) then if (j <= vm%N_levels) then j = j + 1 vm%levels(j) = i ! last index of a level is saved else print *, 'Error: vm.read_bytecode: File has more levels than anticipated!' stop 1 end if else if (i <= vm%N_instructions) then i = i + 1 ! A valid instruction line vm%instructions(:, i) = line else print *, 'Error: vm.read_bytecode: File is larger than anticipated!' stop 1 end if end if end do end subroutine read_bytecode subroutine iterate_instructions (vm) type(vm_t), intent(inout) :: vm integer :: i, j if (vm%openmp) then !$omp parallel do j = 1, vm%N_levels - 1 !$omp do schedule (static) do i = vm%levels (j) + 1, vm%levels (j + 1) call decode (vm, i) end do !$omp end do end do !$omp end parallel else do j = 1, vm%N_levels - 1 do i = vm%levels (j) + 1, vm%levels (j + 1) call decode (vm, i) end do end do end if end subroutine iterate_instructions subroutine set_stream (vm) type(vm_t), intent(inout) :: vm integer :: IO call find_free_unit (vm%bytecode_fh, IO) open (vm%bytecode_fh, file = char (vm%bytecode_file), form = 'formatted', & access = 'sequential', status = 'old', position = 'rewind', iostat = IO, & action = 'read') if (IO /= 0) then print *, "Error: vm.set_stream: Bytecode file '", char(vm%bytecode_file), & "' not found!" stop 1 end if end subroutine set_stream subroutine sanity_check (vm) type(vm_t), intent(in) :: vm if (vm%levels(1) /= 0) then print *, "Error: vm.vm_init: levels(1) != 0" stop 1 end if if (vm%levels(vm%N_levels) /= vm%N_instructions) then print *, "Error: vm.vm_init: levels(N_levels) != N_instructions" stop 1 end if if (vm%verbose) then write(vm%out_fh, *) "vm passed sanity check. Starting calculation." end if end subroutine sanity_check @ \subsection{Main Decode Function} This is the heart of the OVM <>= ! pure & ! if no warnings subroutine decode (vm, instruction_index) type(vm_t), intent(inout) :: vm integer, intent(in) :: instruction_index integer, dimension(len_instructions) :: i, curr complex(default) :: braket integer :: tmp real(default) :: w i = vm%instructions (:, instruction_index) select case (i(1)) case ( : -1) ! Jump over subinstructions <<[[case]]s of [[decode]]>> case (0) print *, 'Error: Levelbreak put in decode! Line:', & instruction_index stop 1 case default print *, "Error: Decode has case not catched! Line: ", & instruction_index stop 1 end select end subroutine decode @ \subsubsection{Momenta} The most trivial instruction <>= integer, parameter :: ovm_ADD_MOMENTA = 1 @ <<[[case]]s of [[decode]]>>= case (ovm_ADD_MOMENTA) vm%momenta(i(4)) = vm%momenta(i(5)) + vm%momenta(i(6)) if (i(7) > 0) then vm%momenta(i(4)) = vm%momenta(i(4)) + vm%momenta(i(7)) end if @ \subsubsection{Loading External states} <>= integer, parameter :: ovm_LOAD_SCALAR = 10 integer, parameter :: ovm_LOAD_SPINOR_INC = 11 integer, parameter :: ovm_LOAD_SPINOR_OUT = 12 integer, parameter :: ovm_LOAD_CONJSPINOR_INC = 13 integer, parameter :: ovm_LOAD_CONJSPINOR_OUT = 14 integer, parameter :: ovm_LOAD_MAJORANA_INC = 15 integer, parameter :: ovm_LOAD_MAJORANA_OUT = 16 integer, parameter :: ovm_LOAD_VECTOR_INC = 17 integer, parameter :: ovm_LOAD_VECTOR_OUT = 18 integer, parameter :: ovm_LOAD_VECTORSPINOR_INC = 19 integer, parameter :: ovm_LOAD_VECTORSPINOR_OUT = 20 integer, parameter :: ovm_LOAD_TENSOR2_INC = 21 integer, parameter :: ovm_LOAD_TENSOR2_OUT = 22 integer, parameter :: ovm_LOAD_BRS_SCALAR = 30 integer, parameter :: ovm_LOAD_BRS_SPINOR_INC = 31 integer, parameter :: ovm_LOAD_BRS_SPINOR_OUT = 32 integer, parameter :: ovm_LOAD_BRS_CONJSPINOR_INC = 33 integer, parameter :: ovm_LOAD_BRS_CONJSPINOR_OUT = 34 integer, parameter :: ovm_LOAD_BRS_VECTOR_INC = 37 integer, parameter :: ovm_LOAD_BRS_VECTOR_OUT = 38 integer, parameter :: ovm_LOAD_MAJORANA_GHOST_INC = 23 integer, parameter :: ovm_LOAD_MAJORANA_GHOST_OUT = 24 integer, parameter :: ovm_LOAD_BRS_MAJORANA_INC = 35 integer, parameter :: ovm_LOAD_BRS_MAJORANA_OUT = 36 @ <<[[case]]s of [[decode]]>>= case (ovm_LOAD_SCALAR) vm%scalars(i(4))%v = one vm%scalars(i(4))%c = .True. case (ovm_LOAD_SPINOR_INC) call load_spinor(vm%spinors(i(4)), - <

>, <>, & vm%helicity(i(5)), ovm_LOAD_SPINOR_INC) case (ovm_LOAD_SPINOR_OUT) call load_spinor(vm%spinors(i(4)), <

>, <>, & vm%helicity(i(5)), ovm_LOAD_SPINOR_OUT) case (ovm_LOAD_CONJSPINOR_INC) call load_conjspinor(vm%conjspinors(i(4)), - <

>, & <>, vm%helicity(i(5)), ovm_LOAD_CONJSPINOR_INC) case (ovm_LOAD_CONJSPINOR_OUT) call load_conjspinor(vm%conjspinors(i(4)), <

>, & <>, vm%helicity(i(5)), ovm_LOAD_CONJSPINOR_OUT) case (ovm_LOAD_MAJORANA_INC) call load_bispinor(vm%bispinors(i(4)), - <

>, & <>, vm%helicity(i(5)), ovm_LOAD_MAJORANA_INC) case (ovm_LOAD_MAJORANA_OUT) call load_bispinor(vm%bispinors(i(4)), <

>, <>, & vm%helicity(i(5)), ovm_LOAD_MAJORANA_OUT) case (ovm_LOAD_VECTOR_INC) call load_vector(vm%vectors(i(4)), - <

>, <>, & vm%helicity(i(5)), ovm_LOAD_VECTOR_INC) case (ovm_LOAD_VECTOR_OUT) call load_vector(vm%vectors(i(4)), <

>, <>, & vm%helicity(i(5)), ovm_LOAD_VECTOR_OUT) case (ovm_LOAD_VECTORSPINOR_INC) !select type (h => vm%helicity(i(5))) !type is (hel_discrete) !vm%vectorspinors(i(4))%v = veps(<>, - <

>, & !h%i) !end select vm%vectorspinors(i(4))%v = veps(<>, - <

>, & vm%helicity(i(5))) vm%vectorspinors(i(4))%c = .True. case (ovm_LOAD_VECTORSPINOR_OUT) !select type (h => vm%helicity(i(5))) !type is (hel_discrete) !vm%vectorspinors(i(4))%v = veps(<>, <

>, & !h%i) !end select vm%vectorspinors(i(4))%v = veps(<>, <

>, & vm%helicity(i(5))) vm%vectorspinors(i(4))%c = .True. case (ovm_LOAD_TENSOR2_INC) !select type (h => vm%helicity(i(5))) !type is (hel_discrete) !vm%tensors_2(i(4))%v = eps2(<>, - <

>, & !h%i) !end select vm%tensors_2(i(4))%c = .True. case (ovm_LOAD_TENSOR2_OUT) !select type (h => vm%helicity(i(5))) !type is (hel_discrete) !vm%tensors_2(i(4))%v = eps2(<>, <

>, h%i) !end select vm%tensors_2(i(4))%c = .True. case (ovm_LOAD_BRS_SCALAR) vm%scalars(i(4))%v = (0, -1) * (<

> * <

> - & <>**2) vm%scalars(i(4))%c = .True. case (ovm_LOAD_BRS_SPINOR_INC) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_SPINOR_OUT) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_CONJSPINOR_INC) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_CONJSPINOR_OUT) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_VECTOR_INC) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_VECTOR_OUT) print *, 'not implemented' stop 1 case (ovm_LOAD_MAJORANA_GHOST_INC) print *, 'not implemented' stop 1 case (ovm_LOAD_MAJORANA_GHOST_OUT) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_MAJORANA_INC) print *, 'not implemented' stop 1 case (ovm_LOAD_BRS_MAJORANA_OUT) print *, 'not implemented' stop 1 @ \subsubsection{Brakets and Fusions} NB: during, execution, the type of the coupling constant is implicit in the instruction <>= integer, parameter :: ovm_CALC_BRAKET = 2 integer, parameter :: ovm_FUSE_V_FF = -1 integer, parameter :: ovm_FUSE_F_VF = -2 integer, parameter :: ovm_FUSE_F_FV = -3 integer, parameter :: ovm_FUSE_VA_FF = -4 integer, parameter :: ovm_FUSE_F_VAF = -5 integer, parameter :: ovm_FUSE_F_FVA = -6 integer, parameter :: ovm_FUSE_VA2_FF = -7 integer, parameter :: ovm_FUSE_F_VA2F = -8 integer, parameter :: ovm_FUSE_F_FVA2 = -9 integer, parameter :: ovm_FUSE_A_FF = -10 integer, parameter :: ovm_FUSE_F_AF = -11 integer, parameter :: ovm_FUSE_F_FA = -12 integer, parameter :: ovm_FUSE_VL_FF = -13 integer, parameter :: ovm_FUSE_F_VLF = -14 integer, parameter :: ovm_FUSE_F_FVL = -15 integer, parameter :: ovm_FUSE_VR_FF = -16 integer, parameter :: ovm_FUSE_F_VRF = -17 integer, parameter :: ovm_FUSE_F_FVR = -18 integer, parameter :: ovm_FUSE_VLR_FF = -19 integer, parameter :: ovm_FUSE_F_VLRF = -20 integer, parameter :: ovm_FUSE_F_FVLR = -21 integer, parameter :: ovm_FUSE_SP_FF = -22 integer, parameter :: ovm_FUSE_F_SPF = -23 integer, parameter :: ovm_FUSE_F_FSP = -24 integer, parameter :: ovm_FUSE_S_FF = -25 integer, parameter :: ovm_FUSE_F_SF = -26 integer, parameter :: ovm_FUSE_F_FS = -27 integer, parameter :: ovm_FUSE_P_FF = -28 integer, parameter :: ovm_FUSE_F_PF = -29 integer, parameter :: ovm_FUSE_F_FP = -30 integer, parameter :: ovm_FUSE_SL_FF = -31 integer, parameter :: ovm_FUSE_F_SLF = -32 integer, parameter :: ovm_FUSE_F_FSL = -33 integer, parameter :: ovm_FUSE_SR_FF = -34 integer, parameter :: ovm_FUSE_F_SRF = -35 integer, parameter :: ovm_FUSE_F_FSR = -36 integer, parameter :: ovm_FUSE_SLR_FF = -37 integer, parameter :: ovm_FUSE_F_SLRF = -38 integer, parameter :: ovm_FUSE_F_FSLR = -39 integer, parameter :: ovm_FUSE_G_GG = -40 integer, parameter :: ovm_FUSE_V_SS = -41 integer, parameter :: ovm_FUSE_S_VV = -42 integer, parameter :: ovm_FUSE_S_VS = -43 integer, parameter :: ovm_FUSE_V_SV = -44 integer, parameter :: ovm_FUSE_S_SS = -45 integer, parameter :: ovm_FUSE_S_SVV = -46 integer, parameter :: ovm_FUSE_V_SSV = -47 integer, parameter :: ovm_FUSE_S_SSS = -48 integer, parameter :: ovm_FUSE_V_VVV = -49 integer, parameter :: ovm_FUSE_S_G2 = -50 integer, parameter :: ovm_FUSE_G_SG = -51 integer, parameter :: ovm_FUSE_G_GS = -52 integer, parameter :: ovm_FUSE_S_G2_SKEW = -53 integer, parameter :: ovm_FUSE_G_SG_SKEW = -54 integer, parameter :: ovm_FUSE_G_GS_SKEW = -55 @ Shorthands <

>= vm%momenta(i(5)) <>= vm%mass(i(2)) <>= vm%momenta(curr(6)) <>= vm%momenta(curr(8)) <>= vm%vectors(curr(5))%v <>= vm%vectors(curr(7))%v <>= vm%scalars(curr(5))%v <>= vm%scalars(curr(7))%v <>= sgn_coupl_cmplx(vm, curr(2)) <>= sgn_coupl_cmplx2(vm, curr(2), 1) <>= sgn_coupl_cmplx2(vm, curr(2), 2) @ <>= if ((i(4) == o%cols(1)) .or. (i(4) == o%cols(2)) .or. & ((mode%col_MC .eq. FULL_SUM) .or. (mode%col_MC .eq. DIAG_COL))) then @ Just a stub for now. Will be reimplemented with the polymorph type [[color]] similar to the [[select type(helicity)]] when we need it. <>= @ <<[[case]]s of [[decode]]>>= case (ovm_CALC_BRAKET) <> tmp = instruction_index + 1 do if (tmp > vm%N_instructions) exit curr = vm%instructions(:, tmp) if (curr(1) >= 0) exit ! End of fusions select case (curr(1)) case (ovm_FUSE_V_FF, ovm_FUSE_VL_FF, ovm_FUSE_VR_FF) braket = vm%vectors(curr(4))%v * vec_ff(vm, curr) case (ovm_FUSE_F_VF, ovm_FUSE_F_VLF, ovm_FUSE_F_VRF) braket = vm%conjspinors(curr(4))%v * ferm_vf(vm, curr) case (ovm_FUSE_F_FV, ovm_FUSE_F_FVL, ovm_FUSE_F_FVR) braket = ferm_fv(vm, curr) * vm%spinors(curr(4))%v case (ovm_FUSE_VA_FF) braket = vm%vectors(curr(4))%v * vec_ff2(vm, curr) case (ovm_FUSE_F_VAF) braket = vm%conjspinors(curr(4))%v * ferm_vf2(vm, curr) case (ovm_FUSE_F_FVA) braket = ferm_fv2(vm, curr) * vm%spinors(curr(4))%v case (ovm_FUSE_S_FF, ovm_FUSE_SP_FF) braket = vm%scalars(curr(4))%v * scal_ff(vm, curr) case (ovm_FUSE_F_SF, ovm_FUSE_F_SPF) braket = vm%conjspinors(curr(4))%v * ferm_sf(vm, curr) case (ovm_FUSE_F_FS, ovm_FUSE_F_FSP) braket = ferm_fs(vm, curr) * vm%spinors(curr(4))%v case (ovm_FUSE_G_GG) braket = vm%vectors(curr(4))%v * & g_gg(<>, & <>, <>, & <>, <>) case (ovm_FUSE_S_VV) braket = vm%scalars(curr(4))%v * <> * & (<> * vm%vectors(curr(6))%v) case (ovm_FUSE_V_SS) braket = vm%vectors(curr(4))%v * & v_ss(<>, <>, <>, & <>, <>) case (ovm_FUSE_S_G2, ovm_FUSE_S_G2_SKEW) braket = vm%scalars(curr(4))%v * scal_g2(vm, curr) case (ovm_FUSE_G_SG, ovm_FUSE_G_GS, ovm_FUSE_G_SG_SKEW, ovm_FUSE_G_GS_SKEW) braket = vm%vectors(curr(4))%v * gauge_sg(vm, curr) case (ovm_FUSE_S_VS) braket = vm%scalars(curr(4))%v * & s_vs(<>, & <>, <>, & <>, <>) case (ovm_FUSE_V_SV) braket = (vm%vectors(curr(4))%v * vm%vectors(curr(6))%v) * & (<> * <>) case (ovm_FUSE_S_SS) braket = vm%scalars(curr(4))%v * & <> * & (<> * vm%scalars(curr(6))%v) case (ovm_FUSE_S_SSS) braket = vm%scalars(curr(4))%v * & <> * & (<> * vm%scalars(curr(6))%v * & <>) case (ovm_FUSE_S_SVV) braket = vm%scalars(curr(4))%v * & <> * & <> * (vm%vectors(curr(6))%v * & <>) case (ovm_FUSE_V_SSV) braket = vm%vectors(curr(4))%v * & (<> * <> * & vm%scalars(curr(6))%v) * <> case (ovm_FUSE_V_VVV) braket = <> * & (<> * vm%vectors(curr(6))%v) * & (vm%vectors(curr(4))%v * <>) case default print *, 'Braket', curr(1), 'not implemented' stop 1 end select vm%amplitudes(i(4)) = vm%amplitudes(i(4)) + curr(3) * braket tmp = tmp + 1 end do vm%amplitudes(i(4)) = vm%amplitudes(i(4)) * i(2) if (i(5) > 1) then vm%amplitudes(i(4)) = vm%amplitudes(i(4)) * & ! Symmetry factor (one / sqrt(real(i(5), kind=default))) end if @ \subsubsection{Propagators} <>= integer, parameter :: ovm_PROPAGATE_SCALAR = 51 integer, parameter :: ovm_PROPAGATE_COL_SCALAR = 52 integer, parameter :: ovm_PROPAGATE_GHOST = 53 integer, parameter :: ovm_PROPAGATE_SPINOR = 54 integer, parameter :: ovm_PROPAGATE_CONJSPINOR = 55 integer, parameter :: ovm_PROPAGATE_MAJORANA = 56 integer, parameter :: ovm_PROPAGATE_COL_MAJORANA = 57 integer, parameter :: ovm_PROPAGATE_UNITARITY = 58 integer, parameter :: ovm_PROPAGATE_COL_UNITARITY = 59 integer, parameter :: ovm_PROPAGATE_FEYNMAN = 60 integer, parameter :: ovm_PROPAGATE_COL_FEYNMAN = 61 integer, parameter :: ovm_PROPAGATE_VECTORSPINOR = 62 integer, parameter :: ovm_PROPAGATE_TENSOR2 = 63 integer, parameter :: ovm_PROPAGATE_NONE = 64 @ <>= if ((mode%col_MC .eq. FULL_SUM) .or. (mode%col_MC .eq. DIAG_COL)) then select case(i(1)) case (ovm_PROPAGATE_PSI) go = .not. vm%spinors%c(i(4)) case (ovm_PROPAGATE_PSIBAR) go = .not. vm%conjspinors%c(i(4)) case (ovm_PROPAGATE_UNITARITY, ovm_PROPAGATE_FEYNMAN, & ovm_PROPAGATE_COL_FEYNMAN) go = .not. vm%vectors%c(i(4)) end select else go = (i(8) == o%cols(1)) .or. (i(8) == o%cols(2)) end if if (go) then <<[[case]]s of [[decode]]>>= <> case (ovm_PROPAGATE_SCALAR : ovm_PROPAGATE_NONE) tmp = instruction_index + 1 do curr = vm%instructions(:,tmp) if (curr(1) >= 0) exit ! End of fusions select case (curr(1)) case (ovm_FUSE_V_FF, ovm_FUSE_VL_FF, ovm_FUSE_VR_FF) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + curr(3) * & vec_ff(vm, curr) case (ovm_FUSE_F_VF, ovm_FUSE_F_VLF, ovm_FUSE_F_VRF) vm%spinors(curr(4))%v = vm%spinors(curr(4))%v + curr(3) * & ferm_vf(vm, curr) case (ovm_FUSE_F_FV, ovm_FUSE_F_FVL, ovm_FUSE_F_FVR) vm%conjspinors(curr(4))%v = vm%conjspinors(curr(4))%v + curr(3) * & ferm_fv(vm, curr) case (ovm_FUSE_VA_FF) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + curr(3) * & vec_ff2(vm, curr) case (ovm_FUSE_F_VAF) vm%spinors(curr(4))%v = vm%spinors(curr(4))%v + curr(3) * & ferm_vf2(vm, curr) case (ovm_FUSE_F_FVA) vm%conjspinors(curr(4))%v = vm%conjspinors(curr(4))%v + curr(3) * & ferm_fv2(vm, curr) case (ovm_FUSE_S_FF, ovm_FUSE_SP_FF) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + curr(3) * & scal_ff(vm, curr) case (ovm_FUSE_F_SF, ovm_FUSE_F_SPF) vm%spinors(curr(4))%v = vm%spinors(curr(4))%v + curr(3) * & ferm_sf(vm, curr) case (ovm_FUSE_F_FS, ovm_FUSE_F_FSP) vm%conjspinors(curr(4))%v = vm%conjspinors(curr(4))%v + curr(3) * & ferm_fs(vm, curr) case (ovm_FUSE_G_GG) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + curr(3) * & g_gg(<>, <>, & <>, <>, & <>) case (ovm_FUSE_S_VV) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + curr(3) * & <> * & (<> * vm%vectors(curr(6))%v) case (ovm_FUSE_V_SS) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + curr(3) * & v_ss(<>, <>, <>, & <>, <>) case (ovm_FUSE_S_G2, ovm_FUSE_S_G2_SKEW) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + & scal_g2(vm, curr) * curr(3) case (ovm_FUSE_G_SG, ovm_FUSE_G_GS, ovm_FUSE_G_SG_SKEW, ovm_FUSE_G_GS_SKEW) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + & gauge_sg(vm, curr) * curr(3) case (ovm_FUSE_S_VS) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + & s_vs(<>, & <>, <>, & <>, <>) * curr(3) case (ovm_FUSE_V_SV) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + & vm%vectors(curr(6))%v * & (<> * <> * curr(3)) case (ovm_FUSE_S_SS) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + & <> * & (<> * vm%scalars(curr(6))%v) * curr(3) case (ovm_FUSE_S_SSS) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + & <> * & (<> * vm%scalars(curr(6))%v * & <>) * curr(3) case (ovm_FUSE_S_SVV) vm%scalars(curr(4))%v = vm%scalars(curr(4))%v + & <> * & <> * (vm%vectors(curr(6))%v * & <>) * curr(3) case (ovm_FUSE_V_SSV) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + & (<> * <> * & vm%scalars(curr(6))%v) * <> * curr(3) case (ovm_FUSE_V_VVV) vm%vectors(curr(4))%v = vm%vectors(curr(4))%v + & (<> * (<> * & vm%vectors(curr(6))%v)) * curr(3) * <> case default print *, 'Fusion', curr(1), 'not implemented' stop 1 end select tmp = tmp + 1 end do select case (i(3)) case (0) w = zero case (1) w = vm%width(i(2)) vm%cms = .false. case (2) w = wd_tl(<

>, vm%width(i(2))) case (3) w = vm%width(i(2)) vm%cms = .true. case (4) w = wd_run(<

>, <>, vm%width(i(2))) case default print *, 'not implemented' stop 1 end select select case (i(1)) <> end select @ <>= case (ovm_PROPAGATE_SCALAR) vm%scalars(i(4))%v = pr_phi(<

>, <>, & w, vm%scalars(i(4))%v) vm%scalars(i(4))%c = .True. case (ovm_PROPAGATE_COL_SCALAR) vm%scalars(i(4))%v = - one / N_ * pr_phi(<

>, & <>, w, vm%scalars(i(4))%v) vm%scalars(i(4))%c = .True. case (ovm_PROPAGATE_GHOST) vm%scalars(i(4))%v = imago * pr_phi(<

>, <>, & w, vm%scalars(i(4))%v) vm%scalars(i(4))%c = .True. case (ovm_PROPAGATE_SPINOR) vm%spinors(i(4))%v = pr_psi(<

>, <>, & w, vm%cms, vm%spinors(i(4))%v) vm%spinors(i(4))%c = .True. case (ovm_PROPAGATE_CONJSPINOR) vm%conjspinors(i(4))%v = pr_psibar(<

>, <>, & w, vm%cms, vm%conjspinors(i(4))%v) vm%conjspinors(i(4))%c = .True. case (ovm_PROPAGATE_MAJORANA) vm%bispinors(i(4))%v = bi_pr_psi(<

>, <>, & w, vm%cms, vm%bispinors(i(4))%v) vm%bispinors(i(4))%c = .True. case (ovm_PROPAGATE_COL_MAJORANA) vm%bispinors(i(4))%v = (- one / N_) * & bi_pr_psi(<

>, <>, & w, vm%cms, vm%bispinors(i(4))%v) vm%bispinors(i(4))%c = .True. case (ovm_PROPAGATE_UNITARITY) vm%vectors(i(4))%v = pr_unitarity(<

>, <>, & w, vm%cms, vm%vectors(i(4))%v) vm%vectors(i(4))%c = .True. case (ovm_PROPAGATE_COL_UNITARITY) vm%vectors(i(4))%v = - one / N_ * pr_unitarity(<

>, & <>, w, vm%cms, vm%vectors(i(4))%v) vm%vectors(i(4))%c = .True. case (ovm_PROPAGATE_FEYNMAN) vm%vectors(i(4))%v = pr_feynman(<

>, vm%vectors(i(4))%v) vm%vectors(i(4))%c = .True. case (ovm_PROPAGATE_COL_FEYNMAN) vm%vectors(i(4))%v = - one / N_ * & pr_feynman(<

>, vm%vectors(i(4))%v) vm%vectors(i(4))%c = .True. case (ovm_PROPAGATE_VECTORSPINOR) vm%vectorspinors(i(4))%v = pr_grav(<

>, <>, & w, vm%vectorspinors(i(4))%v) vm%vectorspinors(i(4))%c = .True. case (ovm_PROPAGATE_TENSOR2) vm%tensors_2(i(4))%v = pr_tensor(<

>, <>, & w, vm%tensors_2(i(4))%v) vm%tensors_2(i(4))%c = .True. case (ovm_PROPAGATE_NONE) ! This will not work with color MC. Appropriate type%c has to be set to ! .True. @ \subsection{Helper functions} Factoring out these parts helps a lot to keep sane but might hurt the performance of the VM noticably. In that case, we have to copy \& paste to avoid the additional function calls. Note that with preprocessor macros, we could maintain this factorized form (and factor out even more since types don't have to match), in case we would decide to allow this <>= !select type (h) !type is (hel_trigonometric) !wf%v = (cos (h%theta) * load_wf (m, p, + 1) + & !sin (h%theta) * load_wf (m, p, - 1)) * sqrt2 !type is (hel_exponential) !wf%v = exp (+ imago * h%phi) * load_wf (m, p, + 1) + & !exp (- imago * h%phi) * load_wf (m, p, - 1) !type is (hel_spherical) !wf%v = (exp (+ imago * h%phi) * cos (h%theta) * load_wf (m, p, + 1) + & !exp (- imago * h%phi) * sin (h%theta) * load_wf (m, p, - 1)) * & !sqrt2 !type is(hel_discrete) !wf%v = load_wf (m, p, h%i) !end select wf%v = load_wf (m, p, h) wf%c = .True. @ Caveat: Helicity MC not tested with Majorana particles but should be fine <>= if ((mode%col_MC .eq. FULL_SUM) .or. (mode%col_MC .eq. DIAG_COL)) then go = .not. vm%spinors%c(i(4)) else go = (i(8) == o%cols(1)) .or. (i(8) == o%cols(2)) end if if (go) .. <>= subroutine load_bispinor(wf, p, m, h, opcode) type(vm_bispinor), intent(out) :: wf type(momentum), intent(in) :: p real(default), intent(in) :: m !class(helicity_t), intent(in) :: h integer, intent(in) :: h integer, intent(in) :: opcode procedure(bi_u), pointer :: load_wf <> select case (opcode) case (ovm_LOAD_MAJORANA_INC) load_wf => bi_u case (ovm_LOAD_MAJORANA_OUT) load_wf => bi_v case default load_wf => null() end select <> end subroutine load_bispinor subroutine load_spinor(wf, p, m, h, opcode) type(vm_spinor), intent(out) :: wf type(momentum), intent(in) :: p real(default), intent(in) :: m !class(helicity_t), intent(in) :: h integer, intent(in) :: h integer, intent(in) :: opcode procedure(u), pointer :: load_wf <> select case (opcode) case (ovm_LOAD_SPINOR_INC) load_wf => u case (ovm_LOAD_SPINOR_OUT) load_wf => v case default load_wf => null() end select <> end subroutine load_spinor subroutine load_conjspinor(wf, p, m, h, opcode) type(vm_conjspinor), intent(out) :: wf type(momentum), intent(in) :: p real(default), intent(in) :: m !class(helicity_t), intent(in) :: h integer, intent(in) :: h integer, intent(in) :: opcode procedure(ubar), pointer :: load_wf <> select case (opcode) case (ovm_LOAD_CONJSPINOR_INC) load_wf => vbar case (ovm_LOAD_CONJSPINOR_OUT) load_wf => ubar case default load_wf => null() end select <> end subroutine load_conjspinor subroutine load_vector(wf, p, m, h, opcode) type(vm_vector), intent(out) :: wf type(momentum), intent(in) :: p real(default), intent(in) :: m !class(helicity_t), intent(in) :: h integer, intent(in) :: h integer, intent(in) :: opcode procedure(eps), pointer :: load_wf <> load_wf => eps <> if (opcode == ovm_LOAD_VECTOR_OUT) then wf%v = conjg(wf%v) end if end subroutine load_vector @ <>= function ferm_vf(vm, curr) result (x) type(spinor) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(f_vf), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_F_VF) load_wf => f_vf case (ovm_FUSE_F_VLF) load_wf => f_vlf case (ovm_FUSE_F_VRF) load_wf => f_vrf case default load_wf => null() end select x = load_wf(<>, <>, vm%spinors(curr(6))%v) end function ferm_vf function ferm_vf2(vm, curr) result (x) type(spinor) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(f_vaf), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_F_VAF) load_wf => f_vaf case default load_wf => null() end select x = f_vaf(<>, <>, <>, vm%spinors(curr(6))%v) end function ferm_vf2 function ferm_sf(vm, curr) result (x) type(spinor) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr select case (curr(1)) case (ovm_FUSE_F_SF) x = f_sf(<>, <>, vm%spinors(curr(6))%v) case (ovm_FUSE_F_SPF) x = f_spf(<>, <>, <>, vm%spinors(curr(6))%v) case default end select end function ferm_sf function ferm_fv(vm, curr) result (x) type(conjspinor) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(f_fv), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_F_FV) load_wf => f_fv case (ovm_FUSE_F_FVL) load_wf => f_fvl case (ovm_FUSE_F_FVR) load_wf => f_fvr case default load_wf => null() end select x = load_wf(<>, vm%conjspinors(curr(5))%v, vm%vectors(curr(6))%v) end function ferm_fv function ferm_fv2(vm, curr) result (x) type(conjspinor) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(f_fva), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_F_FVA) load_wf => f_fva case default load_wf => null() end select x = f_fva(<>, <>, & vm%conjspinors(curr(5))%v, vm%vectors(curr(6))%v) end function ferm_fv2 function ferm_fs(vm, curr) result (x) type(conjspinor) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(f_fs), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_F_FS) x = f_fs(<>, vm%conjspinors(curr(5))%v, vm%scalars(curr(6))%v) case (ovm_FUSE_F_FSP) x = f_fsp(<>, <>, & vm%conjspinors(curr(5))%v, vm%scalars(curr(6))%v) case default x%a = zero end select end function ferm_fs function vec_ff(vm, curr) result (x) type(vector) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(v_ff), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_V_FF) load_wf => v_ff case (ovm_FUSE_VL_FF) load_wf => vl_ff case (ovm_FUSE_VR_FF) load_wf => vr_ff case default load_wf => null() end select x = load_wf(<>, vm%conjspinors(curr(5))%v, vm%spinors(curr(6))%v) end function vec_ff function vec_ff2(vm, curr) result (x) type(vector) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr procedure(va_ff), pointer :: load_wf select case (curr(1)) case (ovm_FUSE_VA_FF) load_wf => va_ff case default load_wf => null() end select x = load_wf(<>, <>, & vm%conjspinors(curr(5))%v, vm%spinors(curr(6))%v) end function vec_ff2 function scal_ff(vm, curr) result (x) complex(default) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr select case (curr(1)) case (ovm_FUSE_S_FF) x = s_ff(<>, & vm%conjspinors(curr(5))%v, vm%spinors(curr(6))%v) case (ovm_FUSE_SP_FF) x = sp_ff(<>, <>, & vm%conjspinors(curr(5))%v, vm%spinors(curr(6))%v) case default x = zero end select end function scal_ff function scal_g2(vm, curr) result (x) complex(default) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr select case (curr(1)) case (ovm_FUSE_S_G2) x = <> * ((<> * <>) * & (<> * <>) - & (<> * <>) * & (<> * <>)) case (ovm_FUSE_S_G2_SKEW) x = - phi_vv(<>, <>, <>, & <>, <>) case default x = zero end select end function scal_g2 pure function gauge_sg(vm, curr) result (x) type(vector) :: x class(vm_t), intent(in) :: vm integer, dimension(:), intent(in) :: curr select case (curr(1)) case (ovm_FUSE_G_SG) x = <> * <> * ( & -((<> + <>) * & <>) * <> - & (-(<> + <>) * & <>) * <>) case (ovm_FUSE_G_GS) x = <> * <> * ( & -((<> + <>) * & <>) * <> - & (-(<> + <>) * & <>) * <>) case (ovm_FUSE_G_SG_SKEW) x = - v_phiv(<>, <>, <>, & <>, <>) case (ovm_FUSE_G_GS_SKEW) x = - v_phiv(<>, <>, <>, & <>, <>) case default x = [zero, zero, zero, zero] end select end function gauge_sg @ Some really tiny ones that hopefully get inlined by the compiler <>= elemental function sgn_coupl_cmplx(vm, j) result (s) class(vm_t), intent(in) :: vm integer, intent(in) :: j complex(default) :: s s = isign(1, j) * vm%coupl_cmplx(abs(j)) end function sgn_coupl_cmplx elemental function sgn_coupl_cmplx2(vm, j, i) result (s) class(vm_t), intent(in) :: vm integer, intent(in) :: j, i complex(default) :: s if (i == 1) then s = isign(1, j) * vm%coupl_cmplx2(i, abs(j)) else s = isign(1, j) * vm%coupl_cmplx2(i, abs(j)) end if end function sgn_coupl_cmplx2 elemental function int_to_log(i) result(yorn) integer, intent(in) :: i logical :: yorn if (i /= 0) then yorn = .true. else yorn = .false. end if end function elemental function color_factor(num, den, pwr) result (cf) integer, intent(in) :: num, den, pwr real(kind=default) :: cf if (pwr == 0) then cf = (one * num) / den else cf = (one * num) / den * (N_**pwr) end if end function color_factor @ \subsection{O'Mega Interface} We want to keep the interface close to the native Fortran code but of course one has to hand over the [[vm]] additionally <>= procedure :: number_particles_in => vm_number_particles_in procedure :: number_particles_out => vm_number_particles_out procedure :: number_color_indices => vm_number_color_indices procedure :: reset_helicity_selection => vm_reset_helicity_selection procedure :: new_event => vm_new_event procedure :: color_sum => vm_color_sum procedure :: spin_states => vm_spin_states procedure :: number_spin_states => vm_number_spin_states procedure :: number_color_flows => vm_number_color_flows procedure :: flavor_states => vm_flavor_states procedure :: number_flavor_states => vm_number_flavor_states procedure :: color_flows => vm_color_flows procedure :: color_factors => vm_color_factors procedure :: number_color_factors => vm_number_color_factors procedure :: is_allowed => vm_is_allowed procedure :: get_amplitude => vm_get_amplitude @ <>= elemental function vm_number_particles_in (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_prt_in end function vm_number_particles_in elemental function vm_number_particles_out (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_prt_out end function vm_number_particles_out elemental function vm_number_spin_states (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_helicities end function vm_number_spin_states pure subroutine vm_spin_states (vm, a) class(vm_t), intent(in) :: vm integer, dimension(:,:), intent(out) :: a a = vm%table_spin end subroutine vm_spin_states elemental function vm_number_flavor_states (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_flavors end function vm_number_flavor_states pure subroutine vm_flavor_states (vm, a) class(vm_t), intent(in) :: vm integer, dimension(:,:), intent(out) :: a a = vm%table_flavor end subroutine vm_flavor_states elemental function vm_number_color_indices (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_col_indices end function vm_number_color_indices elemental function vm_number_color_flows (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_col_flows end function vm_number_color_flows pure subroutine vm_color_flows (vm, a, g) class(vm_t), intent(in) :: vm integer, dimension(:,:,:), intent(out) :: a logical, dimension(:,:), intent(out) :: g a = vm%table_color_flows g = vm%table_ghost_flags end subroutine vm_color_flows elemental function vm_number_color_factors (vm) result (n) class(vm_t), intent(in) :: vm integer :: n n = vm%N_col_factors end function vm_number_color_factors pure subroutine vm_color_factors (vm, cf) class(vm_t), intent(in) :: vm type(OCF), dimension(:), intent(out) :: cf cf = vm%table_color_factors end subroutine vm_color_factors ! pure & ! pure unless OpenMp function vm_color_sum (vm, flv, hel) result (amp2) class(vm_t), intent(in) :: vm integer, intent(in) :: flv, hel real(default) :: amp2 amp2 = ovm_color_sum (flv, hel, vm%table_amplitudes, vm%table_color_factors) end function vm_color_sum subroutine vm_new_event (vm, p) class(vm_t), intent(inout) :: vm real(default), dimension(0:3,*), intent(in) :: p logical :: mask_dirty integer :: hel call vm%run (p) if ((vm%hel_threshold .gt. 0) .and. (vm%hel_count .le. vm%hel_cutoff)) then call omega_update_helicity_selection (vm%hel_count, vm%table_amplitudes, & vm%hel_max_abs, vm%hel_sum_abs, vm%hel_is_allowed, vm%hel_threshold, & vm%hel_cutoff, mask_dirty) if (mask_dirty) then vm%hel_finite = 0 do hel = 1, vm%N_helicities if (vm%hel_is_allowed(hel)) then vm%hel_finite = vm%hel_finite + 1 vm%hel_map(vm%hel_finite) = hel end if end do end if end if end subroutine vm_new_event pure subroutine vm_reset_helicity_selection (vm, threshold, cutoff) class(vm_t), intent(inout) :: vm real(kind=default), intent(in) :: threshold integer, intent(in) :: cutoff integer :: i vm%hel_is_allowed = .True. vm%hel_max_abs = 0 vm%hel_sum_abs = 0 vm%hel_count = 0 vm%hel_threshold = threshold vm%hel_cutoff = cutoff vm%hel_map = (/(i, i = 1, vm%N_helicities)/) vm%hel_finite = vm%N_helicities end subroutine vm_reset_helicity_selection pure function vm_is_allowed (vm, flv, hel, col) result (yorn) class(vm_t), intent(in) :: vm logical :: yorn integer, intent(in) :: flv, hel, col yorn = vm%table_flv_col_is_allowed(flv,col) .and. vm%hel_is_allowed(hel) end function vm_is_allowed pure function vm_get_amplitude (vm, flv, hel, col) result (amp_result) class(vm_t), intent(in) :: vm complex(kind=default) :: amp_result integer, intent(in) :: flv, hel, col amp_result = vm%table_amplitudes(flv, col, hel) end function vm_get_amplitude @ @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <>= ! omegalib.nw -- ! ! Copyright (C) 1999-2020 by ! Wolfgang Kilian ! Thorsten Ohl ! Juergen Reuter ! with contributions from ! Fabian Bach ! Bijan Chokoufe Nejad ! Christian Speckner ! ! WHIZARD is free software; you can redistribute it and/or modify it ! under the terms of the GNU General Public License as published by ! the Free Software Foundation; either version 2, or (at your option) ! any later version. ! ! WHIZARD is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program; if not, write to the Free Software ! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Index: trunk/omega/src/omega_SM_Majorana.ml =================================================================== --- trunk/omega/src/omega_SM_Majorana.ml (revision 0) +++ trunk/omega/src/omega_SM_Majorana.ml (revision 8416) @@ -0,0 +1,36 @@ +(* omega_SM_Maj.ml -- + + Copyright (C) 1999-2020 by + + Wolfgang Kilian + Thorsten Ohl + Juergen Reuter + with contributions from + Christian Speckner + + WHIZARD is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + WHIZARD is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) + +module O = Omega.Make + (Fusion.Mixed23_Majorana)(Targets.Fortran_Majorana) + (Modellib_SM.SM(Modellib_SM.SM_no_anomalous)) +let _ = O.main () + +(*i + * Local Variables: + * mode:caml + * indent-tabs-mode:nil + * page-delimiter:"^(\\* .*\n" + * End: +i*) Index: trunk/omega/src/targets.ml =================================================================== --- trunk/omega/src/targets.ml (revision 8415) +++ trunk/omega/src/targets.ml (revision 8416) @@ -1,8292 +1,8326 @@ (* targets.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Fabian Bach (only parts of this file) Marco Sekulla (only parts of this file) Bijan Chokoufe Nejad (only parts of this file) So Young Shim WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) module Dummy (F : Fusion.Maker) (P : Momentum.T) (M : Model.T) = struct type amplitudes = Fusion.Multi(F)(P)(M).amplitudes type diagnostic = All | Arguments | Momenta | Gauge let options = Options.empty let amplitudes_to_channel _ _ _ = failwith "Targets.Dummy" let parameters_to_channel _ = failwith "Targets.Dummy" end (* \thocwmodulesection{O'Mega Virtual Machine with \texttt{Fortran\;90/95}} *) (* \thocwmodulesubsection{Preliminaries} *) module VM (Fusion_Maker : Fusion.Maker) (P : Momentum.T) (M : Model.T) = struct open Coupling open Format module CM = Colorize.It(M) module F = Fusion_Maker(P)(M) module CF = Fusion.Multi(Fusion_Maker)(P)(M) module CFlow = Color.Flow type amplitudes = CF.amplitudes (* Options. *) type diagnostic = All | Arguments | Momenta | Gauge let wrapper_module = ref "ovm_wrapper" let parameter_module_external = ref "some_external_module_with_model_info" let bytecode_file = ref "bytecode.hbc" let md5sum = ref None let openmp = ref false let kind = ref "default" let whizard = ref false let options = Options.create [ "wrapper_module", Arg.String (fun s -> wrapper_module := s), "name of wrapper module"; "bytecode_file", Arg.String (fun s -> bytecode_file := s), "bytecode file to be used in wrapper"; "parameter_module_external", Arg.String (fun s -> parameter_module_external := s), "external parameter module to be used in wrapper"; "md5sum", Arg.String (fun s -> md5sum := Some s), "transfer MD5 checksum in wrapper"; "whizard", Arg.Set whizard, "include WHIZARD interface in wrapper"; "openmp", Arg.Set openmp, "activate parallel computation of amplitude with OpenMP"] (* Integers encode the opcodes (operation codes). *) let ovm_ADD_MOMENTA = 1 let ovm_CALC_BRAKET = 2 let ovm_LOAD_SCALAR = 10 let ovm_LOAD_SPINOR_INC = 11 let ovm_LOAD_SPINOR_OUT = 12 let ovm_LOAD_CONJSPINOR_INC = 13 let ovm_LOAD_CONJSPINOR_OUT = 14 let ovm_LOAD_MAJORANA_INC = 15 let ovm_LOAD_MAJORANA_OUT = 16 let ovm_LOAD_VECTOR_INC = 17 let ovm_LOAD_VECTOR_OUT = 18 let ovm_LOAD_VECTORSPINOR_INC = 19 let ovm_LOAD_VECTORSPINOR_OUT = 20 let ovm_LOAD_TENSOR2_INC = 21 let ovm_LOAD_TENSOR2_OUT = 22 let ovm_LOAD_BRS_SCALAR = 30 let ovm_LOAD_BRS_SPINOR_INC = 31 let ovm_LOAD_BRS_SPINOR_OUT = 32 let ovm_LOAD_BRS_CONJSPINOR_INC = 33 let ovm_LOAD_BRS_CONJSPINOR_OUT = 34 let ovm_LOAD_BRS_VECTOR_INC = 37 let ovm_LOAD_BRS_VECTOR_OUT = 38 let ovm_LOAD_MAJORANA_GHOST_INC = 23 let ovm_LOAD_MAJORANA_GHOST_OUT = 24 let ovm_LOAD_BRS_MAJORANA_INC = 35 let ovm_LOAD_BRS_MAJORANA_OUT = 36 let ovm_PROPAGATE_SCALAR = 51 let ovm_PROPAGATE_COL_SCALAR = 52 let ovm_PROPAGATE_GHOST = 53 let ovm_PROPAGATE_SPINOR = 54 let ovm_PROPAGATE_CONJSPINOR = 55 let ovm_PROPAGATE_MAJORANA = 56 let ovm_PROPAGATE_COL_MAJORANA = 57 let ovm_PROPAGATE_UNITARITY = 58 let ovm_PROPAGATE_COL_UNITARITY = 59 let ovm_PROPAGATE_FEYNMAN = 60 let ovm_PROPAGATE_COL_FEYNMAN = 61 let ovm_PROPAGATE_VECTORSPINOR = 62 let ovm_PROPAGATE_TENSOR2 = 63 (* \begin{dubious} [ovm_PROPAGATE_NONE] has to be split up to different types to work in conjunction with color MC \dots \end{dubious} *) let ovm_PROPAGATE_NONE = 64 let ovm_FUSE_V_FF = -1 let ovm_FUSE_F_VF = -2 let ovm_FUSE_F_FV = -3 let ovm_FUSE_VA_FF = -4 let ovm_FUSE_F_VAF = -5 let ovm_FUSE_F_FVA = -6 let ovm_FUSE_VA2_FF = -7 let ovm_FUSE_F_VA2F = -8 let ovm_FUSE_F_FVA2 = -9 let ovm_FUSE_A_FF = -10 let ovm_FUSE_F_AF = -11 let ovm_FUSE_F_FA = -12 let ovm_FUSE_VL_FF = -13 let ovm_FUSE_F_VLF = -14 let ovm_FUSE_F_FVL = -15 let ovm_FUSE_VR_FF = -16 let ovm_FUSE_F_VRF = -17 let ovm_FUSE_F_FVR = -18 let ovm_FUSE_VLR_FF = -19 let ovm_FUSE_F_VLRF = -20 let ovm_FUSE_F_FVLR = -21 let ovm_FUSE_SP_FF = -22 let ovm_FUSE_F_SPF = -23 let ovm_FUSE_F_FSP = -24 let ovm_FUSE_S_FF = -25 let ovm_FUSE_F_SF = -26 let ovm_FUSE_F_FS = -27 let ovm_FUSE_P_FF = -28 let ovm_FUSE_F_PF = -29 let ovm_FUSE_F_FP = -30 let ovm_FUSE_SL_FF = -31 let ovm_FUSE_F_SLF = -32 let ovm_FUSE_F_FSL = -33 let ovm_FUSE_SR_FF = -34 let ovm_FUSE_F_SRF = -35 let ovm_FUSE_F_FSR = -36 let ovm_FUSE_SLR_FF = -37 let ovm_FUSE_F_SLRF = -38 let ovm_FUSE_F_FSLR = -39 let ovm_FUSE_G_GG = -40 let ovm_FUSE_V_SS = -41 let ovm_FUSE_S_VV = -42 let ovm_FUSE_S_VS = -43 let ovm_FUSE_V_SV = -44 let ovm_FUSE_S_SS = -45 let ovm_FUSE_S_SVV = -46 let ovm_FUSE_V_SSV = -47 let ovm_FUSE_S_SSS = -48 let ovm_FUSE_V_VVV = -49 let ovm_FUSE_S_G2 = -50 let ovm_FUSE_G_SG = -51 let ovm_FUSE_G_GS = -52 let ovm_FUSE_S_G2_SKEW = -53 let ovm_FUSE_G_SG_SKEW = -54 let ovm_FUSE_G_GS_SKEW = -55 let inst_length = 8 (* Some helper functions. *) let printi ~lhs:l ~rhs1:r1 ?coupl:(cp = 0) ?coeff:(co = 0) ?rhs2:(r2 = 0) ?rhs3:(r3 = 0) ?rhs4:(r4 = 0) code = printf "@\n%d %d %d %d %d %d %d %d" code cp co l r1 r2 r3 r4 let nl () = printf "@\n" let print_int_lst lst = nl (); lst |> List.iter (printf "%d ") let print_str_lst lst = nl (); lst |> List.iter (printf "%s ") let break () = printi ~lhs:0 ~rhs1:0 0 (* Copied from below. Needed for header. *) (* \begin{dubious} Could be fused with [lorentz_ordering]. \end{dubious} *) type declarations = { scalars : F.wf list; spinors : F.wf list; conjspinors : F.wf list; realspinors : F.wf list; ghostspinors : F.wf list; vectorspinors : F.wf list; vectors : F.wf list; ward_vectors : F.wf list; massive_vectors : F.wf list; tensors_1 : F.wf list; tensors_2 : F.wf list; brs_scalars : F.wf list; brs_spinors : F.wf list; brs_conjspinors : F.wf list; brs_realspinors : F.wf list; brs_vectorspinors : F.wf list; brs_vectors : F.wf list; brs_massive_vectors : F.wf list } let rec classify_wfs' acc = function | [] -> acc | wf :: rest -> classify_wfs' (match CM.lorentz (F.flavor wf) with | Scalar -> {acc with scalars = wf :: acc.scalars} | Spinor -> {acc with spinors = wf :: acc.spinors} | ConjSpinor -> {acc with conjspinors = wf :: acc.conjspinors} | Majorana -> {acc with realspinors = wf :: acc.realspinors} | Maj_Ghost -> {acc with ghostspinors = wf :: acc.ghostspinors} | Vectorspinor -> {acc with vectorspinors = wf :: acc.vectorspinors} | Vector -> {acc with vectors = wf :: acc.vectors} | Massive_Vector -> {acc with massive_vectors = wf :: acc.massive_vectors} | Tensor_1 -> {acc with tensors_1 = wf :: acc.tensors_1} | Tensor_2 -> {acc with tensors_2 = wf :: acc.tensors_2} | BRS Scalar -> {acc with brs_scalars = wf :: acc.brs_scalars} | BRS Spinor -> {acc with brs_spinors = wf :: acc.brs_spinors} | BRS ConjSpinor -> {acc with brs_conjspinors = wf :: acc.brs_conjspinors} | BRS Majorana -> {acc with brs_realspinors = wf :: acc.brs_realspinors} | BRS Vectorspinor -> {acc with brs_vectorspinors = wf :: acc.brs_vectorspinors} | BRS Vector -> {acc with brs_vectors = wf :: acc.brs_vectors} | BRS Massive_Vector -> {acc with brs_massive_vectors = wf :: acc.brs_massive_vectors} | BRS _ -> invalid_arg "Targets.classify_wfs': not needed here") rest let classify_wfs wfs = classify_wfs' { scalars = []; spinors = []; conjspinors = []; realspinors = []; ghostspinors = []; vectorspinors = []; vectors = []; ward_vectors = []; massive_vectors = []; tensors_1 = []; tensors_2 = []; brs_scalars = []; brs_spinors = []; brs_conjspinors = []; brs_realspinors = []; brs_vectorspinors = []; brs_vectors = []; brs_massive_vectors = [] } wfs (* \thocwmodulesubsection{Sets and maps} *) (* The OVM identifies all objects via integers. Therefore, we need maps which assign the abstract object a unique ID. *) (* I want [int list]s with less elements to come first. Used in conjunction with the int list representation of momenta, this will set the outer particles at first position and allows the OVM to set them without further instructions. *) (* \begin{dubious} Using the Momentum module might give better performance than integer lists? \end{dubious} *) let rec int_lst_compare (e1 : int list) (e2 : int list) = match e1,e2 with | [], [] -> 0 | _, [] -> +1 | [], _ -> -1 | [_;_], [_] -> +1 | [_], [_;_] -> -1 | hd1 :: tl1, hd2 :: tl2 -> let c = compare hd1 hd2 in if (c != 0 && List.length tl1 = List.length tl2) then c else int_lst_compare tl1 tl2 (* We need a canonical ordering for the different types of wfs. Copied, and slightly modified to order [wf]s, from \texttt{fusion.ml}. *) let lorentz_ordering wf = match CM.lorentz (F.flavor wf) with | Scalar -> 0 | Spinor -> 1 | ConjSpinor -> 2 | Majorana -> 3 | Vector -> 4 | Massive_Vector -> 5 | Tensor_2 -> 6 | Tensor_1 -> 7 | Vectorspinor -> 8 | BRS Scalar -> 9 | BRS Spinor -> 10 | BRS ConjSpinor -> 11 | BRS Majorana -> 12 | BRS Vector -> 13 | BRS Massive_Vector -> 14 | BRS Tensor_2 -> 15 | BRS Tensor_1 -> 16 | BRS Vectorspinor -> 17 | Maj_Ghost -> invalid_arg "lorentz_ordering: not implemented" | BRS _ -> invalid_arg "lorentz_ordering: not needed" let wf_compare (wf1, mult1) (wf2, mult2) = let c1 = compare (lorentz_ordering wf1) (lorentz_ordering wf2) in if c1 <> 0 then c1 else let c2 = compare wf1 wf2 in if c2 <> 0 then c2 else compare mult1 mult2 let amp_compare amp1 amp2 = let cflow a = CM.flow (F.incoming a) (F.outgoing a) in let c1 = compare (cflow amp1) (cflow amp2) in if c1 <> 0 then c1 else let process_sans_color a = (List.map CM.flavor_sans_color (F.incoming a), List.map CM.flavor_sans_color (F.outgoing a)) in compare (process_sans_color amp1) (process_sans_color amp2) let level_compare (f1, amp1) (f2, amp2) = let p1 = F.momentum_list (F.lhs f1) and p2 = F.momentum_list (F.lhs f2) in let c1 = int_lst_compare p1 p2 in if c1 <> 0 then c1 else let c2 = compare f1 f2 in if c2 <> 0 then c2 else amp_compare amp1 amp2 module ISet = Set.Make (struct type t = int list let compare = int_lst_compare end) module WFSet = Set.Make (struct type t = CF.wf * int let compare = wf_compare end) module CSet = Set.Make (struct type t = CM.constant let compare = compare end) module FSet = Set.Make (struct type t = F.fusion * F.amplitude let compare = level_compare end) (* \begin{dubious} It might be preferable to use a [PMap] which maps mom to int, instead of this way. More standard functions like [mem] could be used. Also, [get_ID] would be faster, $\mathcal{O}(\log N)$ instead of $\mathcal{O}(N)$, and simpler. For 8 gluons: N=127 momenta. Minor performance issue. \end{dubious} *) module IMap = Map.Make (struct type t = int let compare = compare end) (* For [wf]s it is crucial for the performance to use a different type of [Map]s. *) module WFMap = Map.Make (struct type t = CF.wf * int let compare = wf_compare end) type lookups = { pmap : int list IMap.t; wfmap : int WFMap.t; cmap : CM.constant IMap.t * CM.constant IMap.t; amap : F.amplitude IMap.t; n_wfs : int list; amplitudes : CF.amplitudes; dict : F.amplitude -> F.wf -> int } let largest_key imap = if (IMap.is_empty imap) then failwith "largest_key: Map is empty!" else fst (IMap.max_binding imap) (* OCaml's [compare] from pervasives cannot compare functional types, e.g. for type [amplitude], if no specific equality function is given ("equal: functional value"). Therefore, we allow to specify the ordering. *) let get_ID' comp map elt : int = let smallmap = IMap.filter (fun _ x -> (comp x elt) = 0 ) map in if IMap.is_empty smallmap then raise Not_found else fst (IMap.min_binding smallmap) (* \begin{dubious} Trying to curry [map] here leads to type errors of the polymorphic function [get_ID]? \end{dubious} *) let get_ID map = match map with | map -> get_ID' compare map let get_const_ID map x = match map with | (map1, map2) -> try get_ID' compare map1 x with _ -> try get_ID' compare map2 x with _ -> failwith "Impossible" (* Creating an integer map of a list with an optional argument that indicates where the map should start counting. *) let map_of_list ?start:(st=1) lst = let g (ind, map) wf = (succ ind, IMap.add ind wf map) in lst |> List.fold_left g (st, IMap.empty) |> snd let wf_map_of_list ?start:(st=1) lst = let g (ind, map) wf = (succ ind, WFMap.add wf ind map) in lst |> List.fold_left g (st, WFMap.empty) |> snd (* \thocwmodulesubsection{Header} *) (* \begin{dubious} It would be nice to safe the creation date as comment. However, the Unix module doesn't seem to be loaded on default. \end{dubious} *) let version = String.concat " " [Config.version; Config.status; Config.date] let model_name = let basename = Filename.basename Sys.executable_name in try Filename.chop_extension basename with | _ -> basename let print_description cmdline = printf "Model %s\n" model_name; printf "OVM %s\n" version; printf "@\nBytecode file generated automatically by O'Mega for OVM"; printf "@\nDo not delete any lines. You called O'Mega with"; printf "@\n %s" cmdline; (*i let t = Unix.localtime (Unix.time() ) in printf "@\n on %5d %5d %5d" (succ t.Unix.tm_mon) t.Unix.tm_mday t.Unix.tm_year; i*) printf "@\n" let num_classified_wfs wfs = let wfs' = classify_wfs wfs in List.map List.length [ wfs'.scalars @ wfs'.brs_scalars; wfs'.spinors @ wfs'.brs_spinors; wfs'.conjspinors @ wfs'.brs_conjspinors; wfs'.realspinors @ wfs'.brs_realspinors @ wfs'.ghostspinors; wfs'.vectors @ wfs'.massive_vectors @ wfs'.brs_vectors @ wfs'.brs_massive_vectors @ wfs'.ward_vectors; wfs'.tensors_2; wfs'.tensors_1; wfs'.vectorspinors ] let description_classified_wfs = [ "N_scalars"; "N_spinors"; "N_conjspinors"; "N_bispinors"; "N_vectors"; "N_tensors_2"; "N_tensors_1"; "N_vectorspinors" ] let num_particles_in amp = match CF.flavors amp with | [] -> 0 | (fin, _) :: _ -> List.length fin let num_particles_out amp = match CF.flavors amp with | [] -> 0 | (_, fout) :: _ -> List.length fout let num_particles amp = match CF.flavors amp with | [] -> 0 | (fin, fout) :: _ -> List.length fin + List.length fout let num_color_indices_default = 2 (* Standard model and non-color-exotica *) let num_color_indices amp = try CFlow.rank (List.hd (CF.color_flows amp)) with _ -> num_color_indices_default let num_color_factors amp = let table = CF.color_factors amp in let n_cflow = Array.length table and n_cfactors = ref 0 in for c1 = 0 to pred n_cflow do for c2 = 0 to pred n_cflow do if c1 <= c2 then begin match table.(c1).(c2) with | [] -> () | _ -> incr n_cfactors end done done; !n_cfactors let num_helicities amp = amp |> CF.helicities |> List.length let num_flavors amp = amp |> CF.flavors |> List.length let num_ks amp = amp |> CF.processes |> List.length let num_color_flows amp = amp |> CF.color_flows |> List.length (* Use [fst] since [WFSet.t = F.wf * int]. *) let num_wfs wfset = wfset |> WFSet.elements |> List.map fst |> num_classified_wfs (* [largest_key] gives the number of momenta if applied to [pmap]. *) let num_lst lookups wfset = [ largest_key lookups.pmap; num_particles lookups.amplitudes; num_particles_in lookups.amplitudes; num_particles_out lookups.amplitudes; num_ks lookups.amplitudes; num_helicities lookups.amplitudes; num_color_flows lookups.amplitudes; num_color_indices lookups.amplitudes; num_flavors lookups.amplitudes; num_color_factors lookups.amplitudes ] @ num_wfs wfset let description_lst = [ "N_momenta"; "N_particles"; "N_prt_in"; "N_prt_out"; "N_amplitudes"; "N_helicities"; "N_col_flows"; "N_col_indices"; "N_flavors"; "N_col_factors" ] @ description_classified_wfs let print_header' numbers = let chopped_num_lst = ThoList.chopn inst_length numbers and chopped_desc_lst = ThoList.chopn inst_length description_lst and printer a b = print_str_lst a; print_int_lst b in List.iter2 printer chopped_desc_lst chopped_num_lst let print_header lookups wfset = print_header' (num_lst lookups wfset) let print_zero_header () = let rec zero_list' j = if j < 1 then [] else 0 :: zero_list' (j - 1) in let zero_list i = zero_list' (i + 1) in description_lst |> List.length |> zero_list |> print_header' (* \thocwmodulesubsection{Tables} *) let print_spin_table' tuples = match tuples with | [] -> () | _ -> tuples |> List.iter ( fun (tuple1, tuple2) -> tuple1 @ tuple2 |> List.map (Printf.sprintf "%d ") |> String.concat "" |> printf "@\n%s" ) let print_spin_table amplitudes = printf "@\nSpin states table"; print_spin_table' @@ CF.helicities amplitudes let print_flavor_table tuples = match tuples with | [] -> () | _ -> List.iter ( fun tuple -> tuple |> List.map (fun f -> Printf.sprintf "%d " @@ M.pdg f) |> String.concat "" |> printf "@\n%s" ) tuples let print_flavor_tables amplitudes = printf "@\nFlavor states table"; print_flavor_table @@ List.map (fun (fin, fout) -> fin @ fout) @@ CF.flavors amplitudes let print_color_flows_table' tuple = match CFlow.to_lists tuple with | [] -> () | cfs -> printf "@\n%s" @@ String.concat "" @@ List.map ( fun cf -> cf |> List.map (Printf.sprintf "%d ") |> String.concat "" ) cfs let print_color_flows_table tuples = match tuples with | [] -> () | _ -> List.iter print_color_flows_table' tuples let print_ghost_flags_table tuples = match tuples with | [] -> () | _ -> List.iter (fun tuple -> match CFlow.ghost_flags tuple with | [] -> () | gfs -> printf "@\n"; List.iter (fun gf -> printf "%s " (if gf then "1" else "0") ) gfs ) tuples let format_power { CFlow.num = num; CFlow.den = den; CFlow.power = pwr } = match num, den, pwr with | _, 0, _ -> invalid_arg "targets.format_power: zero denominator" | n, d, p -> [n; d; p] let format_powers = function | [] -> [0] | powers -> List.flatten (List.map format_power powers) (*i (* We go through the array line by line and collect all colorfactors which * are nonzero because their corresponding color flows match. * With the gained intset, we would be able to print only the necessary * coefficients of the symmetric matrix and indicate from where the OVM * can copy the rest. However, this approach gets really slow for many * gluons and we can save at most 3 numbers per line.*) let print_color_factor_table_funct table = let n_cflow = Array.length table in let (intset, _, _ ) = let rec fold_array (set, cf1, cf2) = if cf1 > pred n_cflow then (set, 0, 0) else let returnset = match table.(cf1).(cf2) with | [] -> set | cf -> ISet.add ([succ cf1; succ cf2] @ (format_powers cf)) set in if cf2 < pred n_cflow then fold_array (returnset, cf1, succ cf2) else fold_array (returnset, succ cf1, 0) in fold_array (ISet.empty, 0, 0) in let map = map_of_list (ISet.elements intset) in List.iter (fun x -> printf "@\n"; let xth = List.nth x in if (xth 0 <= xth 1) then List.iter (printf "%d ") x else printf "%d %d" 0 (get_ID map x)) (ISet.elements intset) let print_color_factor_table_old table = let n_cflow = Array.length table in let (intlsts, _, _ ) = let rec fold_array (lsts, cf1, cf2) = if cf1 > pred n_cflow then (lsts, 0, 0) else let returnlsts = match table.(cf1).(cf2) with | [] -> lsts | cf -> ([succ cf1; succ cf2] @ (format_powers cf)) :: lsts in if cf2 < pred n_cflow then fold_array (returnlsts, cf1, succ cf2) else fold_array (returnlsts, succ cf1, 0) in fold_array ([], 0, 0) in let intlsts = List.rev intlsts in List.iter (fun x -> printf "@\n"; List.iter (printf "%d ") x ) intlsts i*) (* Straightforward iteration gives a great speedup compared to the fancier approach which only collects nonzero colorfactors. *) let print_color_factor_table table = let n_cflow = Array.length table in if n_cflow > 0 then begin for c1 = 0 to pred n_cflow do for c2 = 0 to pred n_cflow do if c1 <= c2 then begin match table.(c1).(c2) with | [] -> () | cf -> printf "@\n"; List.iter (printf "%9d") ([succ c1; succ c2] @ (format_powers cf)); end done done end let option_to_binary = function | Some _ -> "1" | None -> "0" let print_flavor_color_table n_flv n_cflow table = if n_flv > 0 then begin for c = 0 to pred n_cflow do printf "@\n"; for f = 0 to pred n_flv do printf "%s " (option_to_binary table.(f).(c)) done; done; end let print_color_tables amplitudes = let cflows = CF.color_flows amplitudes and cfactors = CF.color_factors amplitudes in printf "@\nColor flows table: [ (i, j) (k, l) -> (m, n) ...]"; print_color_flows_table cflows; printf "@\nColor ghost flags table:"; print_ghost_flags_table cflows; printf "@\nColor factors table: [ i, j: num den power], %s" "i, j are indexed color flows"; print_color_factor_table cfactors; printf "@\nFlavor color combination is allowed:"; print_flavor_color_table (num_flavors amplitudes) (List.length (CF.color_flows amplitudes)) (CF.process_table amplitudes) (* \thocwmodulesubsection{Momenta} *) (* Add the momenta of a WFSet to a Iset. For now, we are throwing away the information to which amplitude the momentum belongs. This could be optimized for random color flow computations. *) let momenta_set wfset = let get_mom wf = wf |> fst |> F.momentum_list in let momenta = List.map get_mom (WFSet.elements wfset) in momenta |> List.fold_left (fun set x -> set |> ISet.add x) ISet.empty let chop_in_3 lst = let ceil_div i j = if (i mod j = 0) then i/j else i/j + 1 in ThoList.chopn (ceil_div (List.length lst) 3) lst (* Assign momenta via instruction code. External momenta [[_]] are already set by the OVM. To avoid unnecessary look-ups of IDs we seperate two cases. If we have more, we split up in two or three parts. *) let add_mom p pmap = let print_mom lhs rhs1 rhs2 rhs3 = if (rhs1!= 0) then printi ~lhs:lhs ~rhs1:rhs1 ~rhs2:rhs2 ~rhs3:rhs3 ovm_ADD_MOMENTA in let get_p_ID = get_ID pmap in match p with | [] | [_] -> print_mom 0 0 0 0 | [rhs1;rhs2] -> print_mom (get_p_ID [rhs1;rhs2]) rhs1 rhs2 0 | [rhs1;rhs2;rhs3] -> print_mom (get_p_ID [rhs1;rhs2;rhs3]) rhs1 rhs2 rhs3 | more -> let ids = List.map get_p_ID (chop_in_3 more) in if (List.length ids = 3) then print_mom (get_p_ID more) (List.nth ids 0) (List.nth ids 1) (List.nth ids 2) else print_mom (get_p_ID more) (List.nth ids 0) (List.nth ids 1) 0 (* Hand through the current level and print level seperators if necessary. *) let add_all_mom lookups pset = let add_all' level p = let level' = List.length p in if (level' > level && level' > 3) then break (); add_mom p lookups.pmap; level' in ignore (pset |> ISet.elements |> List.fold_left add_all' 1) (* Expand a set of momenta to contain all needed momenta for the computation in the OVM. For this, we create a list of sets which contains the chopped momenta and unify them afterwards. If the set has become larger, we expand again. *) let rec expand_pset p = let momlst = ISet.elements p in let pset_of lst = List.fold_left (fun s x -> ISet.add x s) ISet.empty lst in let sets = List.map (fun x -> pset_of (chop_in_3 x) ) momlst in let bigset = List.fold_left ISet.union ISet.empty sets in let biggerset = ISet.union bigset p in if (List.length momlst < List.length (ISet.elements biggerset) ) then expand_pset biggerset else biggerset let mom_ID pmap wf = get_ID pmap (F.momentum_list wf) (* \thocwmodulesubsection{Wavefunctions and externals} *) (* [mult_wf] is needed because the [wf] with same combination of flavor and momentum can have different dependencies and content. *) let mult_wf dict amplitude wf = try wf, dict amplitude wf with | Not_found -> wf, 0 (* Build the union of all [wf]s of all amplitudes and a map of the amplitudes. *) let wfset_amps amplitudes = let amap = amplitudes |> CF.processes |> List.sort amp_compare |> map_of_list and dict = CF.dictionary amplitudes in let wfset_amp amp = let f = mult_wf dict amp in let lst = List.map f ((F.externals amp) @ (F.variables amp)) in lst |> List.fold_left (fun s x -> WFSet.add x s) WFSet.empty in let list_of_sets = amplitudes |> CF.processes |> List.map wfset_amp in List.fold_left WFSet.union WFSet.empty list_of_sets, amap (* To obtain the Fortran index, we substract the number of precedent wave functions. *) let lorentz_ordering_reduced wf = match CM.lorentz (F.flavor wf) with | Scalar | BRS Scalar -> 0 | Spinor | BRS Spinor -> 1 | ConjSpinor | BRS ConjSpinor -> 2 | Majorana | BRS Majorana -> 3 | Vector | BRS Vector | Massive_Vector | BRS Massive_Vector -> 4 | Tensor_2 | BRS Tensor_2 -> 5 | Tensor_1 | BRS Tensor_1 -> 6 | Vectorspinor | BRS Vectorspinor -> 7 | Maj_Ghost -> invalid_arg "lorentz_ordering: not implemented" | BRS _ -> invalid_arg "lorentz_ordering: not needed" let wf_index wfmap num_lst (wf, i) = let wf_ID = WFMap.find (wf, i) wfmap and sum lst = List.fold_left (fun x y -> x+y) 0 lst in wf_ID - sum (ThoList.hdn (lorentz_ordering_reduced wf) num_lst) let print_ext lookups amp_ID inc (wf, i) = let mom = (F.momentum_list wf) in let outer_index = if List.length mom = 1 then List.hd mom else failwith "targets.print_ext: called with non-external particle" and f = F.flavor wf in let pdg = CM.pdg f and wf_code = match CM.lorentz f with | Scalar -> ovm_LOAD_SCALAR | BRS Scalar -> ovm_LOAD_BRS_SCALAR | Spinor -> if inc then ovm_LOAD_SPINOR_INC else ovm_LOAD_SPINOR_OUT | BRS Spinor -> if inc then ovm_LOAD_BRS_SPINOR_INC else ovm_LOAD_BRS_SPINOR_OUT | ConjSpinor -> if inc then ovm_LOAD_CONJSPINOR_INC else ovm_LOAD_CONJSPINOR_OUT | BRS ConjSpinor -> if inc then ovm_LOAD_BRS_CONJSPINOR_INC else ovm_LOAD_BRS_CONJSPINOR_OUT | Vector | Massive_Vector -> if inc then ovm_LOAD_VECTOR_INC else ovm_LOAD_VECTOR_OUT | BRS Vector | BRS Massive_Vector -> if inc then ovm_LOAD_BRS_VECTOR_INC else ovm_LOAD_BRS_VECTOR_OUT | Tensor_2 -> if inc then ovm_LOAD_TENSOR2_INC else ovm_LOAD_TENSOR2_OUT | Vectorspinor | BRS Vectorspinor -> if inc then ovm_LOAD_VECTORSPINOR_INC else ovm_LOAD_VECTORSPINOR_OUT | Majorana -> if inc then ovm_LOAD_MAJORANA_INC else ovm_LOAD_MAJORANA_OUT | BRS Majorana -> if inc then ovm_LOAD_BRS_MAJORANA_INC else ovm_LOAD_BRS_MAJORANA_OUT | Maj_Ghost -> if inc then ovm_LOAD_MAJORANA_GHOST_INC else ovm_LOAD_MAJORANA_GHOST_OUT | Tensor_1 -> invalid_arg "targets.print_ext: Tensor_1 only internal" | BRS _ -> failwith "targets.print_ext: Not implemented" and wf_ind = wf_index lookups.wfmap lookups.n_wfs (wf, i) in printi wf_code ~lhs:wf_ind ~coupl:(abs(pdg)) ~rhs1:outer_index ~rhs4:amp_ID let print_ext_amp lookups amplitude = let incoming = (List.map (fun _ -> true) (F.incoming amplitude) @ List.map (fun _ -> false) (F.outgoing amplitude)) and amp_ID = get_ID' amp_compare lookups.amap amplitude in let wf_tpl wf = mult_wf lookups.dict amplitude wf in let print_ext_wf inc wf = wf |> wf_tpl |> print_ext lookups amp_ID inc in List.iter2 print_ext_wf incoming (F.externals amplitude) let print_externals lookups seen_wfs amplitude = let externals = List.combine (F.externals amplitude) (List.map (fun _ -> true) (F.incoming amplitude) @ List.map (fun _ -> false) (F.outgoing amplitude)) in List.fold_left (fun seen (wf, incoming) -> let amp_ID = get_ID' amp_compare lookups.amap amplitude in let wf_tpl = mult_wf lookups.dict amplitude wf in if not (WFSet.mem wf_tpl seen) then begin wf_tpl |> print_ext lookups amp_ID incoming end; WFSet.add wf_tpl seen) seen_wfs externals (* [print_externals] and [print_ext_amp] do in principle the same thing but [print_externals] filters out dublicate external wave functions. Even with [print_externals] the same (numerically) external wave function will be loaded if it belongs to a different color flow, just as in the native Fortran code. For color MC, [print_ext_amp] has to be used (redundant instructions but only one flow is computed) and the filtering of duplicate fusions has to be disabled. *) let print_ext_amps lookups = let print_external_amp s x = print_externals lookups s x in ignore ( List.fold_left print_external_amp WFSet.empty (CF.processes lookups.amplitudes) ) (*i List.iter (print_ext_amp lookups) (CF.processes lookups.amplitudes) i*) (* \thocwmodulesubsection{Currents} *) (* Parallelization issues: All fusions have to be completed before the propagation takes place. Preferably each fusion and propagation is done by one thread. Solution: All fusions are subinstructions, i.e. if they are read by the main loop they are skipped. If a propagation occurs, all fusions have to be computed first. The additional control bit is the sign of the first int of an instruction. *) (*i TODO: (bcn 2014-07-21) Majorana support will come some day maybe i*) let print_fermion_current code_a code_b code_c coeff lhs c wf1 wf2 fusion = let printc code r1 r2 = printi code ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:r1 ~rhs2:r2 in match fusion with | F13 -> printc code_a wf1 wf2 | F31 -> printc code_a wf2 wf1 | F23 -> printc code_b wf1 wf2 | F32 -> printc code_b wf2 wf1 | F12 -> printc code_c wf1 wf2 | F21 -> printc code_c wf2 wf1 let ferm_print_current = function | coeff, Psibar, V, Psi -> print_fermion_current ovm_FUSE_V_FF ovm_FUSE_F_VF ovm_FUSE_F_FV coeff | coeff, Psibar, VA, Psi -> print_fermion_current ovm_FUSE_VA_FF ovm_FUSE_F_VAF ovm_FUSE_F_FVA coeff | coeff, Psibar, VA2, Psi -> print_fermion_current ovm_FUSE_VA2_FF ovm_FUSE_F_VA2F ovm_FUSE_F_FVA2 coeff | coeff, Psibar, A, Psi -> print_fermion_current ovm_FUSE_A_FF ovm_FUSE_F_AF ovm_FUSE_F_FA coeff | coeff, Psibar, VL, Psi -> print_fermion_current ovm_FUSE_VL_FF ovm_FUSE_F_VLF ovm_FUSE_F_FVL coeff | coeff, Psibar, VR, Psi -> print_fermion_current ovm_FUSE_VR_FF ovm_FUSE_F_VRF ovm_FUSE_F_FVR coeff | coeff, Psibar, VLR, Psi -> print_fermion_current ovm_FUSE_VLR_FF ovm_FUSE_F_VLRF ovm_FUSE_F_FVLR coeff | coeff, Psibar, SP, Psi -> print_fermion_current ovm_FUSE_SP_FF ovm_FUSE_F_SPF ovm_FUSE_F_FSP coeff | coeff, Psibar, S, Psi -> print_fermion_current ovm_FUSE_S_FF ovm_FUSE_F_SF ovm_FUSE_F_FS coeff | coeff, Psibar, P, Psi -> print_fermion_current ovm_FUSE_P_FF ovm_FUSE_F_PF ovm_FUSE_F_FP coeff | coeff, Psibar, SL, Psi -> print_fermion_current ovm_FUSE_SL_FF ovm_FUSE_F_SLF ovm_FUSE_F_FSL coeff | coeff, Psibar, SR, Psi -> print_fermion_current ovm_FUSE_SR_FF ovm_FUSE_F_SRF ovm_FUSE_F_FSR coeff | coeff, Psibar, SLR, Psi -> print_fermion_current ovm_FUSE_SLR_FF ovm_FUSE_F_SLRF ovm_FUSE_F_FSLR coeff | _, Psibar, _, Psi -> invalid_arg "Targets.Fortran.VM: no superpotential here" | _, Chibar, _, _ | _, _, _, Chi -> invalid_arg "Targets.Fortran.VM: Majorana spinors not handled" | _, Gravbar, _, _ | _, _, _, Grav -> invalid_arg "Targets.Fortran.VM: Gravitinos not handled" let children2 rhs = match F.children rhs with | [wf1; wf2] -> (wf1, wf2) | _ -> failwith "Targets.children2: can't happen" let children3 rhs = match F.children rhs with | [wf1; wf2; wf3] -> (wf1, wf2, wf3) | _ -> invalid_arg "Targets.children3: can't happen" let print_vector4 c lhs wf1 wf2 wf3 fusion (coeff, contraction) = let printc r1 r2 r3 = printi ovm_FUSE_V_VVV ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:r1 ~rhs2:r2 ~rhs3:r3 in match contraction, fusion with | C_12_34, (F341|F431|F342|F432|F123|F213|F124|F214) | C_13_42, (F241|F421|F243|F423|F132|F312|F134|F314) | C_14_23, (F231|F321|F234|F324|F142|F412|F143|F413) -> printc wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243|F312|F321|F412|F421) | C_13_42, (F124|F142|F324|F342|F213|F231|F413|F431) | C_14_23, (F123|F132|F423|F432|F214|F241|F314|F341) -> printc wf2 wf3 wf1 | C_12_34, (F314|F413|F324|F423|F132|F231|F142|F241) | C_13_42, (F214|F412|F234|F432|F123|F321|F143|F341) | C_14_23, (F213|F312|F243|F342|F124|F421|F134|F431) -> printc wf1 wf3 wf2 let print_current lookups lhs amplitude rhs = let f = mult_wf lookups.dict amplitude in match F.coupling rhs with | V3 (vertex, fusion, constant) -> let ch1, ch2 = children2 rhs in let wf1 = wf_index lookups.wfmap lookups.n_wfs (f ch1) and wf2 = wf_index lookups.wfmap lookups.n_wfs (f ch2) and p1 = mom_ID lookups.pmap ch1 and p2 = mom_ID lookups.pmap ch2 and const_ID = get_const_ID lookups.cmap constant in let c = if (F.sign rhs) < 0 then - const_ID else const_ID in begin match vertex with | FBF (coeff, fb, b, f) -> begin match coeff, fb, b, f with | _, Psibar, VLRM, Psi | _, Psibar, SPM, Psi | _, Psibar, TVA, Psi | _, Psibar, TVAM, Psi | _, Psibar, TLR, Psi | _, Psibar, TLRM, Psi | _, Psibar, TRL, Psi | _, Psibar, TRLM, Psi -> failwith "print_current: V3: Momentum dependent fermion couplings not implemented" | _, _, _, _ -> ferm_print_current (coeff, fb, b, f) lhs c wf1 wf2 fusion end | PBP (_, _, _, _) -> failwith "print_current: V3: PBP not implemented" | BBB (_, _, _, _) -> failwith "print_current: V3: BBB not implemented" | GBG (_, _, _, _) -> failwith "print_current: V3: GBG not implemented" | Gauge_Gauge_Gauge coeff -> let printc r1 r2 r3 r4 = printi ovm_FUSE_G_GG ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:r1 ~rhs2:r2 ~rhs3:r3 ~rhs4:r4 in begin match fusion with | (F23|F31|F12) -> printc wf1 p1 wf2 p2 | (F32|F13|F21) -> printc wf2 p2 wf1 p1 end | I_Gauge_Gauge_Gauge _ -> failwith "print_current: I_Gauge_Gauge_Gauge: not implemented" | Scalar_Vector_Vector coeff -> let printc code r1 r2 = printi code ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:r1 ~rhs2:r2 in begin match fusion with | (F23|F32) -> printc ovm_FUSE_S_VV wf1 wf2 | (F12|F13) -> printc ovm_FUSE_V_SV wf1 wf2 | (F21|F31) -> printc ovm_FUSE_V_SV wf2 wf1 end | Scalar_Scalar_Scalar coeff -> printi ovm_FUSE_S_SS ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:wf1 ~rhs2:wf2 | Vector_Scalar_Scalar coeff -> let printc code ?flip:(f = 1) r1 r2 r3 r4 = printi code ~lhs:lhs ~coupl:(c*f) ~coeff:coeff ~rhs1:r1 ~rhs2:r2 ~rhs3:r3 ~rhs4:r4 in begin match fusion with | F23 -> printc ovm_FUSE_V_SS wf1 p1 wf2 p2 | F32 -> printc ovm_FUSE_V_SS wf2 p2 wf1 p1 | F12 -> printc ovm_FUSE_S_VS wf1 p1 wf2 p2 | F21 -> printc ovm_FUSE_S_VS wf2 p2 wf1 p1 | F13 -> printc ovm_FUSE_S_VS wf1 p1 wf2 p2 ~flip:(-1) | F31 -> printc ovm_FUSE_S_VS wf2 p2 wf1 p1 ~flip:(-1) end | Aux_Vector_Vector _ -> failwith "print_current: V3: not implemented" | Aux_Scalar_Scalar _ -> failwith "print_current: V3: not implemented" | Aux_Scalar_Vector _ -> failwith "print_current: V3: not implemented" | Graviton_Scalar_Scalar _ -> failwith "print_current: V3: not implemented" | Graviton_Vector_Vector _ -> failwith "print_current: V3: not implemented" | Graviton_Spinor_Spinor _ -> failwith "print_current: V3: not implemented" | Dim4_Vector_Vector_Vector_T _ -> failwith "print_current: V3: not implemented" | Dim4_Vector_Vector_Vector_L _ -> failwith "print_current: V3: not implemented" | Dim6_Gauge_Gauge_Gauge _ -> failwith "print_current: V3: not implemented" | Dim4_Vector_Vector_Vector_T5 _ -> failwith "print_current: V3: not implemented" | Dim4_Vector_Vector_Vector_L5 _ -> failwith "print_current: V3: not implemented" | Dim6_Gauge_Gauge_Gauge_5 _ -> failwith "print_current: V3: not implemented" | Aux_DScalar_DScalar _ -> failwith "print_current: V3: not implemented" | Aux_Vector_DScalar _ -> failwith "print_current: V3: not implemented" | Dim5_Scalar_Gauge2 coeff -> let printc code r1 r2 r3 r4 = printi code ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:r1 ~rhs2:r2 ~rhs3:r3 ~rhs4:r4 in begin match fusion with | (F23|F32) -> printc ovm_FUSE_S_G2 wf1 p1 wf2 p2 | (F12|F13) -> printc ovm_FUSE_G_SG wf1 p1 wf2 p2 | (F21|F31) -> printc ovm_FUSE_G_GS wf2 p2 wf1 p1 end | Dim5_Scalar_Gauge2_Skew coeff -> let printc code ?flip:(f = 1) r1 r2 r3 r4 = printi code ~lhs:lhs ~coupl:(c*f) ~coeff:coeff ~rhs1:r1 ~rhs2:r2 ~rhs3:r3 ~rhs4:r4 in begin match fusion with | (F23|F32) -> printc ovm_FUSE_S_G2_SKEW wf1 p1 wf2 p2 | (F12|F13) -> printc ovm_FUSE_G_SG_SKEW wf1 p1 wf2 p2 | (F21|F31) -> printc ovm_FUSE_G_GS_SKEW wf2 p1 wf1 p2 ~flip:(-1) end | Dim5_Scalar_Vector_Vector_T _ -> failwith "print_current: V3: not implemented" | Dim5_Scalar_Vector_Vector_U _ -> failwith "print_current: V3: not implemented" | Dim5_Scalar_Scalar2 _ -> failwith "print_current: V3: not implemented" | Dim6_Vector_Vector_Vector_T _ -> failwith "print_current: V3: not implemented" | Tensor_2_Vector_Vector _ -> failwith "print_current: V3: not implemented" | Tensor_2_Scalar_Scalar _ -> failwith "print_current: V3: not implemented" | Dim5_Tensor_2_Vector_Vector_1 _ -> failwith "print_current: V3: not implemented" | Dim5_Tensor_2_Vector_Vector_2 _ -> failwith "print_current: V3: not implemented" | Dim7_Tensor_2_Vector_Vector_T _ -> failwith "print_current: V3: not implemented" | Dim5_Scalar_Vector_Vector_TU _ -> failwith "print_current: V3: not implemented" | Scalar_Vector_Vector_t _ -> failwith "print_current: V3: not implemented" | Tensor_2_Vector_Vector_cf _ -> failwith "print_current: V3: not implemented" | Tensor_2_Scalar_Scalar_cf _ -> failwith "print_current: V3: not implemented" | Tensor_2_Vector_Vector_1 _ -> failwith "print_current: V3: not implemented" | Tensor_2_Vector_Vector_t _ -> failwith "print_current: V3: not implemented" | TensorVector_Vector_Vector _ -> failwith "print_current: V3: not implemented" | TensorVector_Vector_Vector_cf _ -> failwith "print_current: V3: not implemented" | TensorVector_Scalar_Scalar _ -> failwith "print_current: V3: not implemented" | TensorVector_Scalar_Scalar_cf _ -> failwith "print_current: V3: not implemented" | TensorScalar_Vector_Vector _ -> failwith "print_current: V3: not implemented" | TensorScalar_Vector_Vector_cf _ -> failwith "print_current: V3: not implemented" | TensorScalar_Scalar_Scalar _ -> failwith "print_current: V3: not implemented" | TensorScalar_Scalar_Scalar_cf _ -> failwith "print_current: V3: not implemented" | Dim6_Scalar_Vector_Vector_D _ -> failwith "print_current: V3: not implemented" | Dim6_Scalar_Vector_Vector_DP _ -> failwith "print_current: V3: not implemented" | Dim6_HAZ_D _ -> failwith "print_current: V3: not implemented" | Dim6_HAZ_DP _ -> failwith "print_current: V3: not implemented" | Dim6_HHH _ -> failwith "print_current: V3: not implemented" | Dim6_Gauge_Gauge_Gauge_i _ -> failwith "print_current: V3: not implemented" | Gauge_Gauge_Gauge_i _ -> failwith "print_current: V3: not implemented" | Dim6_GGG _ -> failwith "print_current: V3: not implemented" | Dim6_AWW_DP _ -> failwith "print_current: V3: not implemented" | Dim6_AWW_DW _ -> failwith "print_current: V3: not implemented" | Dim6_WWZ_DPWDW _ -> failwith "print_current: V3: not implemented" | Dim6_WWZ_DW _ -> failwith "print_current: V3: not implemented" | Dim6_WWZ_D _ -> failwith "print_current: V3: not implemented" | Aux_Gauge_Gauge _ -> failwith "print_current: V3 (Aux_Gauge_Gauge): not implemented" end (* Flip the sign in [c] to account for the~$\mathrm{i}^2$ relative to diagrams with only cubic couplings. *) | V4 (vertex, fusion, constant) -> let ch1, ch2, ch3 = children3 rhs in let wf1 = wf_index lookups.wfmap lookups.n_wfs (f ch1) and wf2 = wf_index lookups.wfmap lookups.n_wfs (f ch2) and wf3 = wf_index lookups.wfmap lookups.n_wfs (f ch3) (*i (*and p1 = mom_ID lookups.pmap ch1*) (*and p2 = mom_ID lookups.pmap ch2*) (*and p3 = mom_ID lookups.pmap ch2*) i*) and const_ID = get_const_ID lookups.cmap constant in let c = if (F.sign rhs) < 0 then const_ID else - const_ID in begin match vertex with | Scalar4 coeff -> printi ovm_FUSE_S_SSS ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:wf1 ~rhs2:wf2 ~rhs3:wf3 | Scalar2_Vector2 coeff -> let printc code r1 r2 r3 = printi code ~lhs:lhs ~coupl:c ~coeff:coeff ~rhs1:r1 ~rhs2:r2 ~rhs3:r3 in begin match fusion with | F134 | F143 | F234 | F243 -> printc ovm_FUSE_S_SVV wf1 wf2 wf3 | F314 | F413 | F324 | F423 -> printc ovm_FUSE_S_SVV wf2 wf1 wf3 | F341 | F431 | F342 | F432 -> printc ovm_FUSE_S_SVV wf3 wf1 wf2 | F312 | F321 | F412 | F421 -> printc ovm_FUSE_V_SSV wf2 wf3 wf1 | F231 | F132 | F241 | F142 -> printc ovm_FUSE_V_SSV wf1 wf3 wf2 | F123 | F213 | F124 | F214 -> printc ovm_FUSE_V_SSV wf1 wf2 wf3 end | Vector4 contractions -> List.iter (print_vector4 c lhs wf1 wf2 wf3 fusion) contractions | Vector4_K_Matrix_tho _ | Vector4_K_Matrix_jr _ | Vector4_K_Matrix_cf_t0 _ | Vector4_K_Matrix_cf_t1 _ | Vector4_K_Matrix_cf_t2 _ | Vector4_K_Matrix_cf_t_rsi _ | Vector4_K_Matrix_cf_m0 _ | Vector4_K_Matrix_cf_m1 _ | Vector4_K_Matrix_cf_m7 _ | DScalar2_Vector2_K_Matrix_ms _ | DScalar2_Vector2_m_0_K_Matrix_cf _ | DScalar2_Vector2_m_1_K_Matrix_cf _ | DScalar2_Vector2_m_7_K_Matrix_cf _ | DScalar4_K_Matrix_ms _ -> failwith "print_current: V4: K_Matrix not implemented" | Dim8_Scalar2_Vector2_1 _ | Dim8_Scalar2_Vector2_2 _ | Dim8_Scalar2_Vector2_m_0 _ | Dim8_Scalar2_Vector2_m_1 _ | Dim8_Scalar2_Vector2_m_7 _ | Dim8_Scalar4 _ -> failwith "print_current: V4: not implemented" | Dim8_Vector4_t_0 _ -> failwith "print_current: V4: not implemented" | Dim8_Vector4_t_1 _ -> failwith "print_current: V4: not implemented" | Dim8_Vector4_t_2 _ -> failwith "print_current: V4: not implemented" | Dim8_Vector4_m_0 _ -> failwith "print_current: V4: not implemented" | Dim8_Vector4_m_1 _ -> failwith "print_current: V4: not implemented" | Dim8_Vector4_m_7 _ -> failwith "print_current: V4: not implemented" | GBBG _ -> failwith "print_current: V4: GBBG not implemented" | DScalar4 _ | DScalar2_Vector2 _ -> failwith "print_current: V4: DScalars not implemented" | Dim6_H4_P2 _ -> failwith "print_current: V4: not implemented" | Dim6_AHWW_DPB _ -> failwith "print_current: V4: not implemented" | Dim6_AHWW_DPW _ -> failwith "print_current: V4: not implemented" | Dim6_AHWW_DW _ -> failwith "print_current: V4: not implemented" | Dim6_Vector4_DW _ -> failwith "print_current: V4: not implemented" | Dim6_Vector4_W _ -> failwith "print_current: V4: not implemented" | Dim6_Scalar2_Vector2_D _ -> failwith "print_current: V4: not implemented" | Dim6_Scalar2_Vector2_DP _ -> failwith "print_current: V4: not implemented" | Dim6_HWWZ_DW _ -> failwith "print_current: V4: not implemented" | Dim6_HWWZ_DPB _ -> failwith "print_current: V4: not implemented" | Dim6_HWWZ_DDPW _ -> failwith "print_current: V4: not implemented" | Dim6_HWWZ_DPW _ -> failwith "print_current: V4: not implemented" | Dim6_AHHZ_D _ -> failwith "print_current: V4: not implemented" | Dim6_AHHZ_DP _ -> failwith "print_current: V4: not implemented" | Dim6_AHHZ_PB _ -> failwith "print_current: V4: not implemented" | Dim6_Scalar2_Vector2_PB _ -> failwith "print_current: V4: not implemented" | Dim6_HHZZ_T _ -> failwith "print_current: V4: not implemented" end | Vn (_, _, _) -> invalid_arg "Targets.print_current: n-ary fusion." (* \thocwmodulesubsection{Fusions} *) let print_fusion lookups lhs_momID fusion amplitude = if F.on_shell amplitude (F.lhs fusion) then failwith "print_fusion: on_shell projectors not implemented!"; if F.is_gauss amplitude (F.lhs fusion) then failwith "print_fusion: gauss amplitudes not implemented!"; let lhs_wf = mult_wf lookups.dict amplitude (F.lhs fusion) in let lhs_wfID = wf_index lookups.wfmap lookups.n_wfs lhs_wf in let f = F.flavor (F.lhs fusion) in let pdg = CM.pdg f in let w = begin match CM.width f with | Vanishing | Fudged -> 0 | Constant -> 1 | Timelike -> 2 | Complex_Mass -> 3 | Running -> 4 | Custom _ -> failwith "Targets.VM: custom width not available" end in let propagate code = printi code ~lhs:lhs_wfID ~rhs1:lhs_momID ~coupl:(abs(pdg)) ~coeff:w ~rhs4:(get_ID' amp_compare lookups.amap amplitude) in begin match CM.propagator f with | Prop_Scalar -> propagate ovm_PROPAGATE_SCALAR | Prop_Col_Scalar -> propagate ovm_PROPAGATE_COL_SCALAR | Prop_Ghost -> propagate ovm_PROPAGATE_GHOST | Prop_Spinor -> propagate ovm_PROPAGATE_SPINOR | Prop_ConjSpinor -> propagate ovm_PROPAGATE_CONJSPINOR | Prop_Majorana -> propagate ovm_PROPAGATE_MAJORANA | Prop_Col_Majorana -> propagate ovm_PROPAGATE_COL_MAJORANA | Prop_Unitarity -> propagate ovm_PROPAGATE_UNITARITY | Prop_Col_Unitarity -> propagate ovm_PROPAGATE_COL_UNITARITY | Prop_Feynman -> propagate ovm_PROPAGATE_FEYNMAN | Prop_Col_Feynman -> propagate ovm_PROPAGATE_COL_FEYNMAN | Prop_Vectorspinor -> propagate ovm_PROPAGATE_VECTORSPINOR | Prop_Tensor_2 -> propagate ovm_PROPAGATE_TENSOR2 | Aux_Col_Scalar | Aux_Col_Vector | Aux_Col_Tensor_1 -> failwith "print_fusion: Aux_Col_* not implemented!" | Aux_Vector | Aux_Tensor_1 | Aux_Scalar | Aux_Spinor | Aux_ConjSpinor | Aux_Majorana | Only_Insertion -> propagate ovm_PROPAGATE_NONE | Prop_Gauge _ -> failwith "print_fusion: Prop_Gauge not implemented!" | Prop_Tensor_pure -> failwith "print_fusion: Prop_Tensor_pure not implemented!" | Prop_Vector_pure -> failwith "print_fusion: Prop_Vector_pure not implemented!" | Prop_Rxi _ -> failwith "print_fusion: Prop_Rxi not implemented!" | Prop_UFO _ -> failwith "print_fusion: Prop_UFO not implemented!" end; (* Since the OVM knows that we want to propagate a wf, we can send the necessary fusions now. *) List.iter (print_current lookups lhs_wfID amplitude) (F.rhs fusion) let print_all_fusions lookups = let fusions = CF.fusions lookups.amplitudes in let fset = List.fold_left (fun s x -> FSet.add x s) FSet.empty fusions in ignore (List.fold_left (fun level (f, amplitude) -> let wf = F.lhs f in let lhs_momID = mom_ID lookups.pmap wf in let level' = List.length (F.momentum_list wf) in if (level' > level && level' > 2) then break (); print_fusion lookups lhs_momID f amplitude; level') 1 (FSet.elements fset) ) (* \thocwmodulesubsection{Brakets} *) let print_braket lookups amplitude braket = let bra = F.bra braket and ket = F.ket braket in let braID = wf_index lookups.wfmap lookups.n_wfs (mult_wf lookups.dict amplitude bra) in List.iter (print_current lookups braID amplitude) ket (* \begin{equation} \ii T = \ii^{\#\text{vertices}}\ii^{\#\text{propagators}} \cdots = \ii^{n-2}\ii^{n-3} \cdots = -\ii(-1)^n \cdots \end{equation} *) (* All brakets for one cflow amplitude should be calculated by one thread to avoid multiple access on the same memory (amplitude).*) let print_brakets lookups (amplitude, i) = let n = List.length (F.externals amplitude) in let sign = if n mod 2 = 0 then -1 else 1 and sym = F.symmetry amplitude in printi ovm_CALC_BRAKET ~lhs:i ~rhs1:sym ~coupl:sign; amplitude |> F.brakets |> List.iter (print_braket lookups amplitude) (* Fortran arrays/OCaml lists start on 1/0. The amplitude list is sorted by [amp_compare] according to their color flows. In this way the amp array is sorted in the same way as [table_color_factors]. *) let print_all_brakets lookups = let g i elt = print_brakets lookups (elt, i+1) in lookups.amplitudes |> CF.processes |> List.sort amp_compare |> ThoList.iteri g 0 (* \thocwmodulesubsection{Couplings} *) (* For now we only care to catch the arrays [gncneu], [gnclep], [gncup] and [gncdown] of the SM. This will need an overhaul when it is clear how we store the type information of coupling constants. *) let strip_array_tag = function | Real_Array x -> x | Complex_Array x -> x let array_constants_list = let params = M.parameters() and strip_to_constant (lhs, _) = strip_array_tag lhs in List.map strip_to_constant params.derived_arrays let is_array x = List.mem x array_constants_list let constants_map = let first = fun (x, _, _) -> x in let second = fun (_, y, _) -> y in let third = fun (_, _, z) -> z in let v3 = List.map third (first (M.vertices () )) and v4 = List.map third (second (M.vertices () )) in let set = List.fold_left (fun s x -> CSet.add x s) CSet.empty (v3 @ v4) in let (arrays, singles) = CSet.partition is_array set in (singles |> CSet.elements |> map_of_list, arrays |> CSet.elements |> map_of_list) (* \thocwmodulesubsection{Output calls} *) let amplitudes_to_channel (cmdline : string) (oc : out_channel) (diagnostics : (diagnostic * bool) list ) (amplitudes : CF.amplitudes) = set_formatter_out_channel oc; if (num_particles amplitudes = 0) then begin print_description cmdline; print_zero_header (); nl () end else begin let (wfset, amap) = wfset_amps amplitudes in let pset = expand_pset (momenta_set wfset) and n_wfs = num_wfs wfset in let wfmap = wf_map_of_list (WFSet.elements wfset) and pmap = map_of_list (ISet.elements pset) and cmap = constants_map in let lookups = {pmap = pmap; wfmap = wfmap; cmap = cmap; amap = amap; n_wfs = n_wfs; amplitudes = amplitudes; dict = CF.dictionary amplitudes} in print_description cmdline; print_header lookups wfset; print_spin_table amplitudes; print_flavor_tables amplitudes; print_color_tables amplitudes; printf "@\n%s" ("OVM instructions for momenta addition," ^ " fusions and brakets start here: "); break (); add_all_mom lookups pset; print_ext_amps lookups; break (); print_all_fusions lookups; break (); print_all_brakets lookups; break (); nl (); print_flush () end let parameters_to_fortran oc _ = (*i The -params options is used as wrapper between OVM and Whizard. Most * trouble for the OVM comes from the array dimensionalities of couplings * but O'Mega should also know whether a constant is real or complex. * Hopefully all will be clearer with the fully general Lorentz structures * and UFO support. For now, we stick with this brute-force solution. i*) set_formatter_out_channel oc; let arrays_to_set = not (IMap.is_empty (snd constants_map)) in let set_coupl ty dim cmap = IMap.iter (fun key elt -> printf " %s(%s%d) = %s" ty dim key (M.constant_symbol elt); nl () ) cmap in let declarations () = printf " complex(%s), dimension(%d) :: ovm_coupl_cmplx" !kind (constants_map |> fst |> largest_key); nl (); if arrays_to_set then printf " complex(%s), dimension(2, %d) :: ovm_coupl_cmplx2" !kind (constants_map |> snd |> largest_key); nl () in let print_line str = printf "%s" str; nl() in let print_md5sum = function | Some s -> print_line " function md5sum ()"; print_line " character(len=32) :: md5sum"; print_line (" bytecode_file = '" ^ !bytecode_file ^ "'"); print_line " call initialize_vm (vm, bytecode_file)"; print_line " ! DON'T EVEN THINK of modifying the following line!"; print_line (" md5sum = '" ^ s ^ "'"); print_line " end function md5sum"; | None -> () in let print_inquiry_function_openmp () = begin print_line " pure function openmp_supported () result (status)"; print_line " logical :: status"; print_line (" status = " ^ (if !openmp then ".true." else ".false.")); print_line " end function openmp_supported"; nl () end in let print_interface whizard = if whizard then begin print_line " subroutine init (par, scheme)"; print_line " real(kind=default), dimension(*), intent(in) :: par"; print_line " integer, intent(in) :: scheme"; print_line (" bytecode_file = '" ^ !bytecode_file ^ "'"); print_line " call import_from_whizard (par, scheme)"; print_line " call initialize_vm (vm, bytecode_file)"; print_line " end subroutine init"; nl (); print_line " subroutine final ()"; print_line " call vm%final ()"; print_line " end subroutine final"; nl (); print_line " subroutine update_alpha_s (alpha_s)"; print_line (" real(kind=" ^ !kind ^ "), intent(in) :: alpha_s"); print_line " call model_update_alpha_s (alpha_s)"; print_line " end subroutine update_alpha_s"; nl () end else begin print_line " subroutine init ()"; print_line (" bytecode_file = '" ^ !bytecode_file ^ "'"); print_line " call init_parameters ()"; print_line " call initialize_vm (vm, bytecode_file)"; print_line " end subroutine" end in let print_lookup_functions () = begin print_line " pure function number_particles_in () result (n)"; print_line " integer :: n"; print_line " n = vm%number_particles_in ()"; print_line " end function number_particles_in"; nl(); print_line " pure function number_particles_out () result (n)"; print_line " integer :: n"; print_line " n = vm%number_particles_out ()"; print_line " end function number_particles_out"; nl(); print_line " pure function number_spin_states () result (n)"; print_line " integer :: n"; print_line " n = vm%number_spin_states ()"; print_line " end function number_spin_states"; nl(); print_line " pure subroutine spin_states (a)"; print_line " integer, dimension(:,:), intent(out) :: a"; print_line " call vm%spin_states (a)"; print_line " end subroutine spin_states"; nl(); print_line " pure function number_flavor_states () result (n)"; print_line " integer :: n"; print_line " n = vm%number_flavor_states ()"; print_line " end function number_flavor_states"; nl(); print_line " pure subroutine flavor_states (a)"; print_line " integer, dimension(:,:), intent(out) :: a"; print_line " call vm%flavor_states (a)"; print_line " end subroutine flavor_states"; nl(); print_line " pure function number_color_indices () result (n)"; print_line " integer :: n"; print_line " n = vm%number_color_indices ()"; print_line " end function number_color_indices"; nl(); print_line " pure function number_color_flows () result (n)"; print_line " integer :: n"; print_line " n = vm%number_color_flows ()"; print_line " end function number_color_flows"; nl(); print_line " pure subroutine color_flows (a, g)"; print_line " integer, dimension(:,:,:), intent(out) :: a"; print_line " logical, dimension(:,:), intent(out) :: g"; print_line " call vm%color_flows (a, g)"; print_line " end subroutine color_flows"; nl(); print_line " pure function number_color_factors () result (n)"; print_line " integer :: n"; print_line " n = vm%number_color_factors ()"; print_line " end function number_color_factors"; nl(); print_line " pure subroutine color_factors (cf)"; print_line " use omega_color"; print_line " type(omega_color_factor), dimension(:), intent(out) :: cf"; print_line " call vm%color_factors (cf)"; print_line " end subroutine color_factors"; nl(); print_line " !pure unless OpenMP"; print_line " !pure function color_sum (flv, hel) result (amp2)"; print_line " function color_sum (flv, hel) result (amp2)"; print_line " use kinds"; print_line " integer, intent(in) :: flv, hel"; print_line " real(kind=default) :: amp2"; print_line " amp2 = vm%color_sum (flv, hel)"; print_line " end function color_sum"; nl(); print_line " subroutine new_event (p)"; print_line " use kinds"; print_line " real(kind=default), dimension(0:3,*), intent(in) :: p"; print_line " call vm%new_event (p)"; print_line " end subroutine new_event"; nl(); print_line " subroutine reset_helicity_selection (threshold, cutoff)"; print_line " use kinds"; print_line " real(kind=default), intent(in) :: threshold"; print_line " integer, intent(in) :: cutoff"; print_line " call vm%reset_helicity_selection (threshold, cutoff)"; print_line " end subroutine reset_helicity_selection"; nl(); print_line " pure function is_allowed (flv, hel, col) result (yorn)"; print_line " logical :: yorn"; print_line " integer, intent(in) :: flv, hel, col"; print_line " yorn = vm%is_allowed (flv, hel, col)"; print_line " end function is_allowed"; nl(); print_line " pure function get_amplitude (flv, hel, col) result (amp_result)"; print_line " use kinds"; print_line " complex(kind=default) :: amp_result"; print_line " integer, intent(in) :: flv, hel, col"; print_line " amp_result = vm%get_amplitude(flv, hel, col)"; print_line " end function get_amplitude"; nl(); end in print_line ("module " ^ !wrapper_module); print_line (" use " ^ !parameter_module_external); print_line " use iso_varying_string, string_t => varying_string"; print_line " use kinds"; print_line " use omegavm95"; print_line " implicit none"; print_line " private"; print_line " type(vm_t) :: vm"; print_line " type(string_t) :: bytecode_file"; print_line (" public :: number_particles_in, number_particles_out," ^ " number_spin_states, &"); print_line (" spin_states, number_flavor_states, flavor_states," ^ " number_color_indices, &"); print_line (" number_color_flows, color_flows," ^ " number_color_factors, color_factors, &"); print_line (" color_sum, new_event, reset_helicity_selection," ^ " is_allowed, get_amplitude, &"); print_line (" init, " ^ (match !md5sum with Some _ -> "md5sum, " | None -> "") ^ "openmp_supported"); if !whizard then print_line (" public :: final, update_alpha_s") else print_line (" public :: initialize_vm"); declarations (); print_line "contains"; print_line " subroutine setup_couplings ()"; set_coupl "ovm_coupl_cmplx" "" (fst constants_map); if arrays_to_set then set_coupl "ovm_coupl_cmplx2" ":," (snd constants_map); print_line " end subroutine setup_couplings"; print_line " subroutine initialize_vm (vm, bytecode_file)"; print_line " class(vm_t), intent(out) :: vm"; print_line " type(string_t), intent(in) :: bytecode_file"; print_line " type(string_t) :: version"; print_line " type(string_t) :: model"; print_line (" version = 'OVM " ^ version ^ "'"); print_line (" model = 'Model " ^ model_name ^ "'"); print_line " call setup_couplings ()"; print_line " call vm%init (bytecode_file, version, model, verbose=.False., &"; print_line " coupl_cmplx=ovm_coupl_cmplx, &"; if arrays_to_set then print_line " coupl_cmplx2=ovm_coupl_cmplx2, &"; print_line (" mass=mass, width=width, openmp=" ^ (if !openmp then ".true." else ".false.") ^ ")"); print_line " end subroutine initialize_vm"; nl(); print_md5sum !md5sum; print_inquiry_function_openmp (); print_interface !whizard; print_lookup_functions (); print_line ("end module " ^ !wrapper_module) let parameters_to_channel oc = parameters_to_fortran oc (CM.parameters ()) end (* \thocwmodulesection{\texttt{Fortran\,90/95}} *) (* \thocwmodulesubsection{Dirac Fermions} We factor out the code for fermions so that we can use the simpler implementation for Dirac fermions if the model contains no Majorana fermions. *) module type Fermions = sig open Coupling val psi_type : string val psibar_type : string val chi_type : string val grav_type : string val psi_incoming : string val brs_psi_incoming : string val psibar_incoming : string val brs_psibar_incoming : string val chi_incoming : string val brs_chi_incoming : string val grav_incoming : string val psi_outgoing : string val brs_psi_outgoing : string val psibar_outgoing : string val brs_psibar_outgoing : string val chi_outgoing : string val brs_chi_outgoing : string val grav_outgoing : string val psi_propagator : string val psibar_propagator : string val chi_propagator : string val grav_propagator : string val psi_projector : string val psibar_projector : string val chi_projector : string val grav_projector : string val psi_gauss : string val psibar_gauss : string val chi_gauss : string val grav_gauss : string val print_current : int * fermionbar * boson * fermion -> string -> string -> string -> fuse2 -> unit val print_current_mom : int * fermionbar * boson * fermion -> string -> string -> string -> string -> string -> string -> fuse2 -> unit val print_current_p : int * fermion * boson * fermion -> string -> string -> string -> fuse2 -> unit val print_current_b : int * fermionbar * boson * fermionbar -> string -> string -> string -> fuse2 -> unit val print_current_g : int * fermionbar * boson * fermion -> string -> string -> string -> string -> string -> string -> fuse2 -> unit val print_current_g4 : int * fermionbar * boson2 * fermion -> string -> string -> string -> string -> fuse3 -> unit - val reverse_braket : lorentz -> bool + val reverse_braket : bool -> lorentz -> lorentz list -> bool val use_module : string val require_library : string list end module Fortran_Fermions : Fermions = struct open Coupling open Format let psi_type = "spinor" let psibar_type = "conjspinor" let chi_type = "???" let grav_type = "???" let psi_incoming = "u" let brs_psi_incoming = "brs_u" let psibar_incoming = "vbar" let brs_psibar_incoming = "brs_vbar" let chi_incoming = "???" let brs_chi_incoming = "???" let grav_incoming = "???" let psi_outgoing = "v" let brs_psi_outgoing = "brs_v" let psibar_outgoing = "ubar" let brs_psibar_outgoing = "brs_ubar" let chi_outgoing = "???" let brs_chi_outgoing = "???" let grav_outgoing = "???" let psi_propagator = "pr_psi" let psibar_propagator = "pr_psibar" let chi_propagator = "???" let grav_propagator = "???" let psi_projector = "pj_psi" let psibar_projector = "pj_psibar" let chi_projector = "???" let grav_projector = "???" let psi_gauss = "pg_psi" let psibar_gauss = "pg_psibar" let chi_gauss = "???" let grav_gauss = "???" let format_coupling coeff c = match coeff with | 1 -> c | -1 -> "(-" ^ c ^")" | coeff -> string_of_int coeff ^ "*" ^ c let format_coupling_2 coeff c = match coeff with | 1 -> c | -1 -> "-" ^ c | coeff -> string_of_int coeff ^ "*" ^ c (* \begin{dubious} JR's coupling constant HACK, necessitated by tho's bad design descition. \end{dubious} *) let fastener s i ?p ?q () = try let offset = (String.index s '(') in if ((String.get s (String.length s - 1)) != ')') then failwith "fastener: wrong usage of parentheses" else let func_name = (String.sub s 0 offset) and tail = (String.sub s (succ offset) (String.length s - offset - 2)) in if (String.contains func_name ')') || (String.contains tail '(') || (String.contains tail ')') then failwith "fastener: wrong usage of parentheses" else func_name ^ "(" ^ string_of_int i ^ "," ^ tail ^ ")" with | Not_found -> if (String.contains s ')') then failwith "fastener: wrong usage of parentheses" else match p with | None -> s ^ "(" ^ string_of_int i ^ ")" | Some p -> match q with | None -> s ^ "(" ^ p ^ "*" ^ p ^ "," ^ string_of_int i ^ ")" | Some q -> s ^ "(" ^ p ^ "," ^ q ^ "," ^ string_of_int i ^ ")" let print_fermion_current coeff f c wf1 wf2 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 | F31 -> printf "%s_ff(%s,%s,%s)" f c wf2 wf1 | F23 -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 | F12 -> printf "f_f%s(%s,%s,%s)" f c wf1 wf2 | F21 -> printf "f_f%s(%s,%s,%s)" f c wf2 wf1 (* \begin{dubious} Using a two element array for the combined vector-axial and scalar-pseudo couplings helps to support HELAS as well. Since we will probably never support general boson couplings with HELAS, it might be retired in favor of two separate variables. For this [Model.constant_symbol] has to be generalized. \end{dubious} *) (* \begin{dubious} NB: passing the array instead of two separate constants would be a \emph{bad} idea, because the support for Majorana spinors below will have to flip signs! \end{dubious} *) let print_fermion_current2 coeff f c wf1 wf2 fusion = let c = format_coupling_2 coeff c in let c1 = fastener c 1 () and c2 = fastener c 2 () in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F31 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf2 wf1 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf2 wf1 | F12 -> printf "f_f%s(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F21 -> printf "f_f%s(%s,%s,%s,%s)" f c1 c2 wf2 wf1 let print_fermion_current_mom_v1 coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f (c1 ~p:p12 ()) (c2 ~p:p12 ()) wf1 wf2 | F31 -> printf "%s_ff(%s,%s,%s,%s)" f (c1 ~p:p12 ()) (c2 ~p:p12 ()) wf2 wf1 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f (c1 ~p:p1 ()) (c2 ~p:p1 ()) wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f (c1 ~p:p2 ()) (c2 ~p:p2 ()) wf2 wf1 | F12 -> printf "f_f%s(%s,%s,%s,%s)" f (c1 ~p:p2 ()) (c2 ~p:p2 ()) wf1 wf2 | F21 -> printf "f_f%s(%s,%s,%s,%s)" f (c1 ~p:p1 ()) (c2 ~p:p1 ()) wf2 wf1 let print_fermion_current_mom_v2 coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,@,%s,%s,%s)" f (c1 ~p:p12 ()) (c2 ~p:p12 ()) wf1 wf2 p12 | F31 -> printf "%s_ff(%s,%s,@,%s,%s,%s)" f (c1 ~p:p12 ()) (c2 ~p:p12 ()) wf2 wf1 p12 | F23 -> printf "f_%sf(%s,%s,@,%s,%s,%s)" f (c1 ~p:p1 ()) (c2 ~p:p1 ()) wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,@,%s,%s,%s)" f (c1 ~p:p2 ()) (c2 ~p:p2 ()) wf2 wf1 p2 | F12 -> printf "f_f%s(%s,%s,@,%s,%s,%s)" f (c1 ~p:p2 ()) (c2 ~p:p2 ()) wf1 wf2 p2 | F21 -> printf "f_f%s(%s,%s,@,%s,%s,%s)" f (c1 ~p:p1 ()) (c2 ~p:p1 ()) wf2 wf1 p1 let print_fermion_current_mom_ff coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f (c1 ~p:p1 ~q:p2 ()) (c2 ~p:p1 ~q:p2 ()) wf1 wf2 | F31 -> printf "%s_ff(%s,%s,%s,%s)" f (c1 ~p:p1 ~q:p2 ()) (c2 ~p:p1 ~q:p2 ()) wf2 wf1 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f (c1 ~p:p12 ~q:p2 ()) (c2 ~p:p12 ~q:p2 ()) wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f (c1 ~p:p12 ~q:p1 ()) (c2 ~p:p12 ~q:p1 ()) wf2 wf1 | F12 -> printf "f_f%s(%s,%s,%s,%s)" f (c1 ~p:p12 ~q:p1 ()) (c2 ~p:p12 ~q:p1 ()) wf1 wf2 | F21 -> printf "f_f%s(%s,%s,%s,%s)" f (c1 ~p:p12 ~q:p2 ()) (c2 ~p:p12 ~q:p2 ()) wf2 wf1 let print_current = function | coeff, Psibar, VA, Psi -> print_fermion_current2 coeff "va" | coeff, Psibar, VA2, Psi -> print_fermion_current coeff "va2" | coeff, Psibar, VA3, Psi -> print_fermion_current coeff "va3" | coeff, Psibar, V, Psi -> print_fermion_current coeff "v" | coeff, Psibar, A, Psi -> print_fermion_current coeff "a" | coeff, Psibar, VL, Psi -> print_fermion_current coeff "vl" | coeff, Psibar, VR, Psi -> print_fermion_current coeff "vr" | coeff, Psibar, VLR, Psi -> print_fermion_current2 coeff "vlr" | coeff, Psibar, SP, Psi -> print_fermion_current2 coeff "sp" | coeff, Psibar, S, Psi -> print_fermion_current coeff "s" | coeff, Psibar, P, Psi -> print_fermion_current coeff "p" | coeff, Psibar, SL, Psi -> print_fermion_current coeff "sl" | coeff, Psibar, SR, Psi -> print_fermion_current coeff "sr" | coeff, Psibar, SLR, Psi -> print_fermion_current2 coeff "slr" | _, Psibar, _, Psi -> invalid_arg "Targets.Fortran_Fermions: no superpotential here" | _, Chibar, _, _ | _, _, _, Chi -> invalid_arg "Targets.Fortran_Fermions: Majorana spinors not handled" | _, Gravbar, _, _ | _, _, _, Grav -> invalid_arg "Targets.Fortran_Fermions: Gravitinos not handled" let print_current_mom = function | coeff, Psibar, VLRM, Psi -> print_fermion_current_mom_v1 coeff "vlr" | coeff, Psibar, VAM, Psi -> print_fermion_current_mom_ff coeff "va" | coeff, Psibar, VA3M, Psi -> print_fermion_current_mom_ff coeff "va3" | coeff, Psibar, SPM, Psi -> print_fermion_current_mom_v1 coeff "sp" | coeff, Psibar, TVA, Psi -> print_fermion_current_mom_v1 coeff "tva" | coeff, Psibar, TVAM, Psi -> print_fermion_current_mom_v2 coeff "tvam" | coeff, Psibar, TLR, Psi -> print_fermion_current_mom_v1 coeff "tlr" | coeff, Psibar, TLRM, Psi -> print_fermion_current_mom_v2 coeff "tlrm" | coeff, Psibar, TRL, Psi -> print_fermion_current_mom_v1 coeff "trl" | coeff, Psibar, TRLM, Psi -> print_fermion_current_mom_v2 coeff "trlm" | _, Psibar, _, Psi -> invalid_arg "Targets.Fortran_Fermions: only sigma tensor coupling here" | _, Chibar, _, _ | _, _, _, Chi -> invalid_arg "Targets.Fortran_Fermions: Majorana spinors not handled" | _, Gravbar, _, _ | _, _, _, Grav -> invalid_arg "Targets.Fortran_Fermions: Gravitinos not handled" let print_current_p = function | _, _, _, _ -> invalid_arg "Targets.Fortran_Fermions: No clashing arrows here" let print_current_b = function | _, _, _, _ -> invalid_arg "Targets.Fortran_Fermions: No clashing arrows here" let print_current_g = function | _, _, _, _ -> invalid_arg "Targets.Fortran_Fermions: No gravitinos here" let print_current_g4 = function | _, _, _, _ -> invalid_arg "Targets.Fortran_Fermions: No gravitinos here" - let reverse_braket= function + let reverse_braket vintage bra ket = + match bra with | Spinor -> true | _ -> false let use_module = "omega95" let require_library = ["omega_spinors_2010_01_A"; "omega_spinor_cpls_2010_01_A"] end (* \thocwmodulesubsection{Main Functor} *) module Make_Fortran (Fermions : Fermions) (Fusion_Maker : Fusion.Maker) (P : Momentum.T) (M : Model.T) = struct let require_library = Fermions.require_library @ [ "omega_vectors_2010_01_A"; "omega_polarizations_2010_01_A"; "omega_couplings_2010_01_A"; "omega_color_2010_01_A"; "omega_utils_2010_01_A" ] module CM = Colorize.It(M) module F = Fusion_Maker(P)(M) module CF = Fusion.Multi(Fusion_Maker)(P)(M) type amplitudes = CF.amplitudes open Coupling open Format type output_mode = | Single_Function | Single_Module of int | Single_File of int | Multi_File of int let line_length = ref 80 let continuation_lines = ref (-1) (* 255 *) let kind = ref "default" let fortran95 = ref true let module_name = ref "omega_amplitude" let output_mode = ref (Single_Module 10) let use_modules = ref [] let whizard = ref false let amp_triv = ref false let parameter_module = ref "" let md5sum = ref None let no_write = ref false let km_write = ref false let km_pure = ref false let km_2_write = ref false let km_2_pure = ref false let openmp = ref false let pure_unless_openmp = false let options = Options.create [ "90", Arg.Clear fortran95, "don't use Fortran95 features that are not in Fortran90"; "kind", Arg.String (fun s -> kind := s), "real and complex kind (default: " ^ !kind ^ ")"; "width", Arg.Int (fun w -> line_length := w), "maximum line length"; "continuation", Arg.Int (fun l -> continuation_lines := l), "maximum # of continuation lines"; "module", Arg.String (fun s -> module_name := s), "module name"; "single_function", Arg.Unit (fun () -> output_mode := Single_Function), "compute the matrix element(s) in a monolithic function"; "split_function", Arg.Int (fun n -> output_mode := Single_Module n), "split the matrix element(s) into small functions [default, size = 10]"; "split_module", Arg.Int (fun n -> output_mode := Single_File n), "split the matrix element(s) into small modules"; "split_file", Arg.Int (fun n -> output_mode := Multi_File n), "split the matrix element(s) into small files"; "use", Arg.String (fun s -> use_modules := s :: !use_modules), "use module"; "parameter_module", Arg.String (fun s -> parameter_module := s), "parameter_module"; "md5sum", Arg.String (fun s -> md5sum := Some s), "transfer MD5 checksum"; "whizard", Arg.Set whizard, "include WHIZARD interface"; "amp_triv", Arg.Set amp_triv, "only print trivial amplitude"; "no_write", Arg.Set no_write, "no 'write' statements"; "kmatrix_write", Arg.Set km_2_write, "write K matrix functions"; "kmatrix_2_write", Arg.Set km_write, "write K matrix 2 functions"; "kmatrix_write_pure", Arg.Set km_pure, "write K matrix pure functions"; "kmatrix_2_write_pure", Arg.Set km_2_pure, "write Kmatrix2pure functions"; "openmp", Arg.Set openmp, "activate OpenMP support in generated code"] (* Fortran style line continuation: *) let nl = Format_Fortran.newline let print_list = function | [] -> () | a :: rest -> print_string a; List.iter (fun s -> printf ",@ %s" s) rest (* \thocwmodulesubsection{Variables and Declarations} *) (* ["NC"] is already used up in the module ["constants"]: *) let nc_parameter = "N_" let omega_color_factor_abbrev = "OCF" let openmp_tld_type = "thread_local_data" let openmp_tld = "tld" let flavors_symbol ?(decl = false) flavors = (if !openmp && not decl then openmp_tld ^ "%" else "" ) ^ "oks_" ^ String.concat "" (List.map CM.flavor_symbol flavors) let p2s p = if p >= 0 && p <= 9 then string_of_int p else if p <= 36 then String.make 1 (Char.chr (Char.code 'A' + p - 10)) else "_" let format_momentum p = "p" ^ String.concat "" (List.map p2s p) let format_p wf = String.concat "" (List.map p2s (F.momentum_list wf)) let ext_momentum wf = match F.momentum_list wf with | [n] -> n | _ -> invalid_arg "Targets.Fortran.ext_momentum" module PSet = Set.Make (struct type t = int list let compare = compare end) module WFSet = Set.Make (struct type t = F.wf let compare = compare end) let add_tag wf name = match F.wf_tag wf with | None -> name | Some tag -> name ^ "_" ^ tag let variable ?(decl = false) wf = (if !openmp && not decl then openmp_tld ^ "%" else "") ^ add_tag wf ("owf_" ^ CM.flavor_symbol (F.flavor wf) ^ "_" ^ format_p wf) let momentum wf = "p" ^ format_p wf let spin wf = "s(" ^ string_of_int (ext_momentum wf) ^ ")" let format_multiple_variable ?(decl = false) wf i = variable ~decl wf ^ "_X" ^ string_of_int i let multiple_variable ?(decl = false) amplitude dictionary wf = try format_multiple_variable ~decl wf (dictionary amplitude wf) with | Not_found -> variable wf let multiple_variables ?(decl = false) multiplicity wf = try List.map (format_multiple_variable ~decl wf) (ThoList.range 1 (multiplicity wf)) with | Not_found -> [variable ~decl wf] let declaration_chunk_size = 64 let declare_list_chunk multiplicity t = function | [] -> () | wfs -> printf " @[<2>%s :: " t; print_list (ThoList.flatmap (multiple_variables ~decl:true multiplicity) wfs); nl () let declare_list multiplicity t = function | [] -> () | wfs -> List.iter (declare_list_chunk multiplicity t) (ThoList.chopn declaration_chunk_size wfs) type declarations = { scalars : F.wf list; spinors : F.wf list; conjspinors : F.wf list; realspinors : F.wf list; ghostspinors : F.wf list; vectorspinors : F.wf list; vectors : F.wf list; ward_vectors : F.wf list; massive_vectors : F.wf list; tensors_1 : F.wf list; tensors_2 : F.wf list; brs_scalars : F.wf list; brs_spinors : F.wf list; brs_conjspinors : F.wf list; brs_realspinors : F.wf list; brs_vectorspinors : F.wf list; brs_vectors : F.wf list; brs_massive_vectors : F.wf list } let rec classify_wfs' acc = function | [] -> acc | wf :: rest -> classify_wfs' (match CM.lorentz (F.flavor wf) with | Scalar -> {acc with scalars = wf :: acc.scalars} | Spinor -> {acc with spinors = wf :: acc.spinors} | ConjSpinor -> {acc with conjspinors = wf :: acc.conjspinors} | Majorana -> {acc with realspinors = wf :: acc.realspinors} | Maj_Ghost -> {acc with ghostspinors = wf :: acc.ghostspinors} | Vectorspinor -> {acc with vectorspinors = wf :: acc.vectorspinors} | Vector -> {acc with vectors = wf :: acc.vectors} (*i | Ward_Vector -> {acc with ward_vectors = wf :: acc.ward_vectors} i*) | Massive_Vector -> {acc with massive_vectors = wf :: acc.massive_vectors} | Tensor_1 -> {acc with tensors_1 = wf :: acc.tensors_1} | Tensor_2 -> {acc with tensors_2 = wf :: acc.tensors_2} | BRS Scalar -> {acc with brs_scalars = wf :: acc.brs_scalars} | BRS Spinor -> {acc with brs_spinors = wf :: acc.brs_spinors} | BRS ConjSpinor -> {acc with brs_conjspinors = wf :: acc.brs_conjspinors} | BRS Majorana -> {acc with brs_realspinors = wf :: acc.brs_realspinors} | BRS Vectorspinor -> {acc with brs_vectorspinors = wf :: acc.brs_vectorspinors} | BRS Vector -> {acc with brs_vectors = wf :: acc.brs_vectors} | BRS Massive_Vector -> {acc with brs_massive_vectors = wf :: acc.brs_massive_vectors} | BRS _ -> invalid_arg "Targets.wfs_classify': not needed here") rest let classify_wfs wfs = classify_wfs' { scalars = []; spinors = []; conjspinors = []; realspinors = []; ghostspinors = []; vectorspinors = []; vectors = []; ward_vectors = []; massive_vectors = []; tensors_1 = []; tensors_2 = []; brs_scalars = [] ; brs_spinors = []; brs_conjspinors = []; brs_realspinors = []; brs_vectorspinors = []; brs_vectors = []; brs_massive_vectors = []} wfs (* \thocwmodulesubsection{Parameters} *) type 'a parameters = { real_singles : 'a list; real_arrays : ('a * int) list; complex_singles : 'a list; complex_arrays : ('a * int) list } let rec classify_singles acc = function | [] -> acc | Real p :: rest -> classify_singles { acc with real_singles = p :: acc.real_singles } rest | Complex p :: rest -> classify_singles { acc with complex_singles = p :: acc.complex_singles } rest let rec classify_arrays acc = function | [] -> acc | (Real_Array p, rhs) :: rest -> classify_arrays { acc with real_arrays = (p, List.length rhs) :: acc.real_arrays } rest | (Complex_Array p, rhs) :: rest -> classify_arrays { acc with complex_arrays = (p, List.length rhs) :: acc.complex_arrays } rest let classify_parameters params = classify_arrays (classify_singles { real_singles = []; real_arrays = []; complex_singles = []; complex_arrays = [] } (List.map fst params.derived)) params.derived_arrays let schisma = ThoList.chopn let schisma_num i n l = ThoList.enumerate i (schisma n l) let declare_parameters' t = function | [] -> () | plist -> printf " @[<2>%s(kind=%s), public, save :: " t !kind; print_list (List.map CM.constant_symbol plist); nl () let declare_parameters t plist = List.iter (declare_parameters' t) plist let declare_parameter_array t (p, n) = printf " @[<2>%s(kind=%s), dimension(%d), public, save :: %s" t !kind n (CM.constant_symbol p); nl () (* NB: we use [string_of_float] to make sure that a decimal point is included to make Fortran compilers happy. *) let default_parameter (x, v) = printf "@ %s = %s_%s" (CM.constant_symbol x) (string_of_float v) !kind let declare_default_parameters t = function | [] -> () | p :: plist -> printf " @[<2>%s(kind=%s), public, save ::" t !kind; default_parameter p; List.iter (fun p' -> printf ","; default_parameter p') plist; nl () let format_constant = function | I -> "(0,1)" | Integer c -> if c < 0 then sprintf "(%d.0_%s)" c !kind else sprintf "%d.0_%s" c !kind | Float x -> if x < 0. then sprintf "(%g_%s)" x !kind else sprintf "%g_%s" x !kind | _ -> invalid_arg "format_constant" let rec eval_parameter' = function | (I | Integer _ | Float _) as c -> printf "%s" (format_constant c) | Atom x -> printf "%s" (CM.constant_symbol x) | Sum [] -> printf "0.0_%s" !kind | Sum [x] -> eval_parameter' x | Sum (x :: xs) -> printf "@,("; eval_parameter' x; List.iter (fun x -> printf "@, + "; eval_parameter' x) xs; printf ")" | Diff (x, y) -> printf "@,("; eval_parameter' x; printf " - "; eval_parameter' y; printf ")" | Neg x -> printf "@,( - "; eval_parameter' x; printf ")" | Prod [] -> printf "1.0_%s" !kind | Prod [x] -> eval_parameter' x | Prod (x :: xs) -> printf "@,("; eval_parameter' x; List.iter (fun x -> printf " * "; eval_parameter' x) xs; printf ")" | Quot (x, y) -> printf "@,("; eval_parameter' x; printf " / "; eval_parameter' y; printf ")" | Rec x -> printf "@, (1.0_%s / " !kind; eval_parameter' x; printf ")" | Pow (x, n) -> printf "@,("; eval_parameter' x; printf "**%d" n; printf ")" | PowX (x, y) -> printf "@,("; eval_parameter' x; printf "**"; eval_parameter' y; printf ")" | Sqrt x -> printf "@,sqrt ("; eval_parameter' x; printf ")" | Sin x -> printf "@,sin ("; eval_parameter' x; printf ")" | Cos x -> printf "@,cos ("; eval_parameter' x; printf ")" | Tan x -> printf "@,tan ("; eval_parameter' x; printf ")" | Cot x -> printf "@,cot ("; eval_parameter' x; printf ")" | Asin x -> printf "@,asin ("; eval_parameter' x; printf ")" | Acos x -> printf "@,acos ("; eval_parameter' x; printf ")" | Atan x -> printf "@,atan ("; eval_parameter' x; printf ")" | Atan2 (y, x) -> printf "@,atan2 ("; eval_parameter' y; printf ",@ "; eval_parameter' x; printf ")" | Sinh x -> printf "@,sinh ("; eval_parameter' x; printf ")" | Cosh x -> printf "@,cosh ("; eval_parameter' x; printf ")" | Tanh x -> printf "@,tanh ("; eval_parameter' x; printf ")" | Exp x -> printf "@,exp ("; eval_parameter' x; printf ")" | Log x -> printf "@,log ("; eval_parameter' x; printf ")" | Log10 x -> printf "@,log10 ("; eval_parameter' x; printf ")" | Conj (Integer _ | Float _ as x) -> eval_parameter' x | Conj x -> printf "@,cconjg ("; eval_parameter' x; printf ")" let strip_single_tag = function | Real x -> x | Complex x -> x let strip_array_tag = function | Real_Array x -> x | Complex_Array x -> x let eval_parameter (lhs, rhs) = let x = CM.constant_symbol (strip_single_tag lhs) in printf " @[<2>%s = " x; eval_parameter' rhs; nl () let eval_para_list n l = printf " subroutine setup_parameters_%03d ()" n; nl (); List.iter eval_parameter l; printf " end subroutine setup_parameters_%03d" n; nl () let eval_parameter_pair (lhs, rhs) = let x = CM.constant_symbol (strip_array_tag lhs) in let _ = List.fold_left (fun i rhs' -> printf " @[<2>%s(%d) = " x i; eval_parameter' rhs'; nl (); succ i) 1 rhs in () let eval_para_pair_list n l = printf " subroutine setup_parameters_%03d ()" n; nl (); List.iter eval_parameter_pair l; printf " end subroutine setup_parameters_%03d" n; nl () let print_echo fmt p = let s = CM.constant_symbol p in printf " write (unit = *, fmt = fmt_%s) \"%s\", %s" fmt s s; nl () let print_echo_array fmt (p, n) = let s = CM.constant_symbol p in for i = 1 to n do printf " write (unit = *, fmt = fmt_%s_array) " fmt ; printf "\"%s\", %d, %s(%d)" s i s i; nl () done let contains params couplings = List.exists (fun (name, _) -> List.mem (CM.constant_symbol name) params) couplings.input let rec depends_on params = function | I | Integer _ | Float _ -> false | Atom name -> List.mem (CM.constant_symbol name) params | Sum es | Prod es -> List.exists (depends_on params) es | Diff (e1, e2) | Quot (e1, e2) | PowX (e1, e2) -> depends_on params e1 || depends_on params e2 | Neg e | Rec e | Pow (e, _) -> depends_on params e | Sqrt e | Exp e | Log e | Log10 e | Sin e | Cos e | Tan e | Cot e | Asin e | Acos e | Atan e | Sinh e | Cosh e | Tanh e | Conj e -> depends_on params e | Atan2 (e1, e2) -> depends_on params e1 || depends_on params e2 let dependencies params couplings = if contains params couplings then List.rev (fst (List.fold_left (fun (deps, plist) (param, v) -> match param with | Real name | Complex name -> if depends_on plist v then ((param, v) :: deps, CM.constant_symbol name :: plist) else (deps, plist)) ([], params) couplings.derived)) else [] let dependencies_arrays params couplings = if contains params couplings then List.rev (fst (List.fold_left (fun (deps, plist) (param, vlist) -> match param with | Real_Array name | Complex_Array name -> if List.exists (depends_on plist) vlist then ((param, vlist) :: deps, CM.constant_symbol name :: plist) else (deps, plist)) ([], params) couplings.derived_arrays)) else [] let parameters_to_fortran oc params = Format_Fortran.set_formatter_out_channel ~width:!line_length oc; let declarations = classify_parameters params in printf "module %s" !parameter_module; nl (); printf " use kinds"; nl (); printf " use constants"; nl (); printf " implicit none"; nl (); printf " private"; nl (); printf " @[<2>public :: setup_parameters"; printf ",@ import_from_whizard"; printf ",@ model_update_alpha_s"; if !no_write then begin printf "! No print_parameters"; end else begin printf ",@ print_parameters"; end; nl (); declare_default_parameters "real" params.input; declare_parameters "real" (schisma 69 declarations.real_singles); List.iter (declare_parameter_array "real") declarations.real_arrays; declare_parameters "complex" (schisma 69 declarations.complex_singles); List.iter (declare_parameter_array "complex") declarations.complex_arrays; printf " interface cconjg"; nl (); printf " module procedure cconjg_real, cconjg_complex"; nl (); printf " end interface"; nl (); printf " private :: cconjg_real, cconjg_complex"; nl (); printf "contains"; nl (); printf " function cconjg_real (x) result (xc)"; nl (); printf " real(kind=default), intent(in) :: x"; nl (); printf " real(kind=default) :: xc"; nl (); printf " xc = x"; nl (); printf " end function cconjg_real"; nl (); printf " function cconjg_complex (z) result (zc)"; nl (); printf " complex(kind=default), intent(in) :: z"; nl (); printf " complex(kind=default) :: zc"; nl (); printf " zc = conjg (z)"; nl (); printf " end function cconjg_complex"; nl (); printf " ! derived parameters:"; nl (); let shredded = schisma_num 1 120 params.derived in let shredded_arrays = schisma_num 1 120 params.derived_arrays in let num_sub = List.length shredded in let num_sub_arrays = List.length shredded_arrays in List.iter (fun (i,l) -> eval_para_list i l) shredded; List.iter (fun (i,l) -> eval_para_pair_list (num_sub + i) l) shredded_arrays; printf " subroutine setup_parameters ()"; nl (); for i = 1 to num_sub + num_sub_arrays do printf " call setup_parameters_%03d ()" i; nl (); done; printf " end subroutine setup_parameters"; nl (); printf " subroutine import_from_whizard (par_array, scheme)"; nl (); printf " real(%s), dimension(%d), intent(in) :: par_array" !kind (List.length params.input); nl (); printf " integer, intent(in) :: scheme"; nl (); let i = ref 1 in List.iter (fun (p, _) -> printf " %s = par_array(%d)" (CM.constant_symbol p) !i; nl (); incr i) params.input; printf " call setup_parameters ()"; nl (); printf " end subroutine import_from_whizard"; nl (); printf " subroutine model_update_alpha_s (alpha_s)"; nl (); printf " real(%s), intent(in) :: alpha_s" !kind; nl (); begin match (dependencies ["aS"] params, dependencies_arrays ["aS"] params) with | [], [] -> printf " ! 'aS' not among the input parameters"; nl (); | deps, deps_arrays -> printf " aS = alpha_s"; nl (); List.iter eval_parameter deps; List.iter eval_parameter_pair deps_arrays end; printf " end subroutine model_update_alpha_s"; nl (); if !no_write then begin printf "! No print_parameters"; nl (); end else begin printf " subroutine print_parameters ()"; nl (); printf " @[<2>character(len=*), parameter ::"; printf "@ fmt_real = \"(A12,4X,' = ',E25.18)\","; printf "@ fmt_complex = \"(A12,4X,' = ',E25.18,' + i*',E25.18)\","; printf "@ fmt_real_array = \"(A12,'(',I2.2,')',' = ',E25.18)\","; printf "@ fmt_complex_array = "; printf "\"(A12,'(',I2.2,')',' = ',E25.18,' + i*',E25.18)\""; nl (); printf " @[<2>write (unit = *, fmt = \"(A)\") @,"; printf "\"default values for the input parameters:\""; nl (); List.iter (fun (p, _) -> print_echo "real" p) params.input; printf " @[<2>write (unit = *, fmt = \"(A)\") @,"; printf "\"derived parameters:\""; nl (); List.iter (print_echo "real") declarations.real_singles; List.iter (print_echo "complex") declarations.complex_singles; List.iter (print_echo_array "real") declarations.real_arrays; List.iter (print_echo_array "complex") declarations.complex_arrays; printf " end subroutine print_parameters"; nl (); end; printf "end module %s" !parameter_module; nl () (* \thocwmodulesubsection{Run-Time Diagnostics} *) type diagnostic = All | Arguments | Momenta | Gauge type diagnostic_mode = Off | Warn | Panic let warn mode = match !mode with | Off -> false | Warn -> true | Panic -> true let panic mode = match !mode with | Off -> false | Warn -> false | Panic -> true let suffix mode = if panic mode then "panic" else "warn" let diagnose_arguments = ref Off let diagnose_momenta = ref Off let diagnose_gauge = ref Off let rec parse_diagnostic = function | All, panic -> parse_diagnostic (Arguments, panic); parse_diagnostic (Momenta, panic); parse_diagnostic (Gauge, panic) | Arguments, panic -> diagnose_arguments := if panic then Panic else Warn | Momenta, panic -> diagnose_momenta := if panic then Panic else Warn | Gauge, panic -> diagnose_gauge := if panic then Panic else Warn (* If diagnostics are required, we have to switch off Fortran95 features like pure functions. *) let parse_diagnostics = function | [] -> () | diagnostics -> fortran95 := false; List.iter parse_diagnostic diagnostics (* \thocwmodulesubsection{Amplitude} *) let declare_momenta_chunk = function | [] -> () | momenta -> printf " @[<2>type(momentum) :: "; print_list (List.map format_momentum momenta); nl () let declare_momenta = function | [] -> () | momenta -> List.iter declare_momenta_chunk (ThoList.chopn declaration_chunk_size momenta) let declare_wavefunctions multiplicity wfs = let wfs' = classify_wfs wfs in declare_list multiplicity ("complex(kind=" ^ !kind ^ ")") (wfs'.scalars @ wfs'.brs_scalars); declare_list multiplicity ("type(" ^ Fermions.psi_type ^ ")") (wfs'.spinors @ wfs'.brs_spinors); declare_list multiplicity ("type(" ^ Fermions.psibar_type ^ ")") (wfs'.conjspinors @ wfs'.brs_conjspinors); declare_list multiplicity ("type(" ^ Fermions.chi_type ^ ")") (wfs'.realspinors @ wfs'.brs_realspinors @ wfs'.ghostspinors); declare_list multiplicity ("type(" ^ Fermions.grav_type ^ ")") wfs'.vectorspinors; declare_list multiplicity "type(vector)" (wfs'.vectors @ wfs'.massive_vectors @ wfs'.brs_vectors @ wfs'.brs_massive_vectors @ wfs'.ward_vectors); declare_list multiplicity "type(tensor2odd)" wfs'.tensors_1; declare_list multiplicity "type(tensor)" wfs'.tensors_2 let flavors a = F.incoming a @ F.outgoing a let declare_brakets_chunk = function | [] -> () | amplitudes -> printf " @[<2>complex(kind=%s) :: " !kind; print_list (List.map (fun a -> flavors_symbol ~decl:true (flavors a)) amplitudes); nl () let declare_brakets = function | [] -> () | amplitudes -> List.iter declare_brakets_chunk (ThoList.chopn declaration_chunk_size amplitudes) let print_variable_declarations amplitudes = let multiplicity = CF.multiplicity amplitudes and processes = CF.processes amplitudes in if not !amp_triv then begin declare_momenta (PSet.elements (List.fold_left (fun set a -> PSet.union set (List.fold_right (fun wf -> PSet.add (F.momentum_list wf)) (F.externals a) PSet.empty)) PSet.empty processes)); declare_momenta (PSet.elements (List.fold_left (fun set a -> PSet.union set (List.fold_right (fun wf -> PSet.add (F.momentum_list wf)) (F.variables a) PSet.empty)) PSet.empty processes)); if !openmp then begin printf " type %s@[<2>" openmp_tld_type; nl (); end ; declare_wavefunctions multiplicity (WFSet.elements (List.fold_left (fun set a -> WFSet.union set (List.fold_right WFSet.add (F.externals a) WFSet.empty)) WFSet.empty processes)); declare_wavefunctions multiplicity (WFSet.elements (List.fold_left (fun set a -> WFSet.union set (List.fold_right WFSet.add (F.variables a) WFSet.empty)) WFSet.empty processes)); declare_brakets processes; if !openmp then begin printf "@] end type %s\n" openmp_tld_type; printf " type(%s) :: %s" openmp_tld_type openmp_tld; nl (); end; end (* [print_current] is the most important function that has to match the functions in \verb+omega95+ (see appendix~\ref{sec:fortran}). It offers plentiful opportunities for making mistakes, in particular those related to signs. We start with a few auxiliary functions: *) let children2 rhs = match F.children rhs with | [wf1; wf2] -> (wf1, wf2) | _ -> failwith "Targets.children2: can't happen" let children3 rhs = match F.children rhs with | [wf1; wf2; wf3] -> (wf1, wf2, wf3) | _ -> invalid_arg "Targets.children3: can't happen" (* Note that it is (marginally) faster to multiply the two scalar products with the coupling constant than the four vector components. \begin{dubious} This could be part of \verb+omegalib+ as well \ldots \end{dubious} *) let format_coeff = function | 1 -> "" | -1 -> "-" | coeff -> "(" ^ string_of_int coeff ^ ")*" let format_coupling coeff c = match coeff with | 1 -> c | -1 -> "(-" ^ c ^")" | coeff -> string_of_int coeff ^ "*" ^ c (* \begin{dubious} The following is error prone and should be generated automagically. \end{dubious} *) let print_vector4 c wf1 wf2 wf3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F341|F431|F342|F432|F123|F213|F124|F214) | C_13_42, (F241|F421|F243|F423|F132|F312|F134|F314) | C_14_23, (F231|F321|F234|F324|F142|F412|F143|F413) -> printf "((%s%s)*(%s*%s))*%s" (format_coeff coeff) c wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243|F312|F321|F412|F421) | C_13_42, (F124|F142|F324|F342|F213|F231|F413|F431) | C_14_23, (F123|F132|F423|F432|F214|F241|F314|F341) -> printf "((%s%s)*(%s*%s))*%s" (format_coeff coeff) c wf2 wf3 wf1 | C_12_34, (F314|F413|F324|F423|F132|F231|F142|F241) | C_13_42, (F214|F412|F234|F432|F123|F321|F143|F341) | C_14_23, (F213|F312|F243|F342|F124|F421|F134|F431) -> printf "((%s%s)*(%s*%s))*%s" (format_coeff coeff) c wf1 wf3 wf2 let print_vector4_t_0 c wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "g_dim8g3_t_0(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "g_dim8g3_t_0(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "g_dim8g3_t_0(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 let print_vector4_t_1 c wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "g_dim8g3_t_1(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "g_dim8g3_t_1(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "g_dim8g3_t_1(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 let print_vector4_t_2 c wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "g_dim8g3_t_2(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "g_dim8g3_t_2(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "g_dim8g3_t_2(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 let print_vector4_m_0 c wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "g_dim8g3_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "g_dim8g3_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "g_dim8g3_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 let print_vector4_m_1 c wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "g_dim8g3_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "g_dim8g3_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "g_dim8g3_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 let print_vector4_m_7 c wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "g_dim8g3_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "g_dim8g3_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "g_dim8g3_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 let print_add_vector4 c wf1 wf2 wf3 fusion (coeff, contraction) = printf "@ + "; print_vector4 c wf1 wf2 wf3 fusion (coeff, contraction) let print_vector4_km c pa pb wf1 wf2 wf3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F341|F431|F342|F432|F123|F213|F124|F214) | C_13_42, (F241|F421|F243|F423|F132|F312|F134|F314) | C_14_23, (F231|F321|F234|F324|F142|F412|F143|F413) -> printf "((%s%s%s+%s))*(%s*%s))*%s" (format_coeff coeff) c pa pb wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243|F312|F321|F412|F421) | C_13_42, (F124|F142|F324|F342|F213|F231|F413|F431) | C_14_23, (F123|F132|F423|F432|F214|F241|F314|F341) -> printf "((%s%s%s+%s))*(%s*%s))*%s" (format_coeff coeff) c pa pb wf2 wf3 wf1 | C_12_34, (F314|F413|F324|F423|F132|F231|F142|F241) | C_13_42, (F214|F412|F234|F432|F123|F321|F143|F341) | C_14_23, (F213|F312|F243|F342|F124|F421|F134|F431) -> printf "((%s%s%s+%s))*(%s*%s))*%s" (format_coeff coeff) c pa pb wf1 wf3 wf2 let print_vector4_km_t_0 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 let print_vector4_km_t_1 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 let print_vector4_km_t_2 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_2(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_2(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_2(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 let print_vector4_km_t_rsi c pa pb pc wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))*((%s+%s)*(%s+%s)/((%s+%s)*(%s+%s)))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 pa pb pa pb pb pc pb pc | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> printf "@[(%s%s%s+%s)*g_dim8g3_t_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))*((%s+%s)*(%s+%s)/((%s+%s)*(%s+%s)))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 pa pb pa pb pa pc pa pc let print_vector4_km_m_0 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*g_dim8g3_m_0(cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 else printf "@[((%s%s%s+%s))*g_dim8g3_m_0(cmplx(costhw**(-2),kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*g_dim8g3_m_0(cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 else printf "@[(%s%s%s+%s)*g_dim8g3_m_0(cmplx(costhw**(-2),kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*g_dim8g3_m_0(cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 else printf "@[(%s%s%s+%s)*g_dim8g3_m_0(cmplx(costhw**(-2),kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 let print_vector4_km_m_1 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*g_dim8g3_m_1(cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 else printf "@[(%s%s%s+%s)*g_dim8g3_m_1(cmplx(costhw**(-2),kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*g_dim8g3_m_1(cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 else printf "@[(%s%s%s+%s)*g_dim8g3_m_1(cmplx(costhw**(-2),kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*g_dim8g3_m_1(cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 else printf "@[(%s%s%s+%s)*g_dim8g3_m_1(cmplx(costhw**(-2),kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 let print_vector4_km_m_7 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F234|F243|F134|F143|F421|F321|F412|F312) | C_13_42, (F324|F342|F124|F142|F431|F231|F413|F213) | C_14_23, (F423|F432|F123|F132|F341|F241|F314|F214) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*@ g_dim8g3_m_7(cmplx(1,kind=default),cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 else printf "@[(%s%s%s+%s)*@ g_dim8g3_m_7(cmplx(costhw**(-2),kind=default),cmplx(1,kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F324|F314|F423|F413|F142|F132|F241|F231) | C_13_42, (F234|F214|F432|F412|F143|F123|F341|F321) | C_14_23, (F243|F213|F342|F312|F134|F124|F431|F421) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*@ g_dim8g3_m_7(cmplx(1,kind=default),cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 else printf "@[(%s%s%s+%s)*@ g_dim8g3_m_7(cmplx(costhw**(-2),kind=default),cmplx(1,kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F342|F341|F432|F431|F124|F123|F214|F213) | C_13_42, (F243|F241|F423|F421|F134|F132|F314|F312) | C_14_23, (F234|F231|F324|F321|F143|F142|F413|F412) -> if (String.contains c 'w' || String.contains c '4') then printf "@[(%s%s%s+%s)*@ g_dim8g3_m_7(cmplx(1,kind=default),cmplx(1,kind=default),cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 else printf "@[(%s%s%s+%s)*@ g_dim8g3_m_7(cmplx(costhw**(-2),kind=default),cmplx(1,kind=default),cmplx(costhw**2,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p1 wf2 p2 let print_add_vector4_km c pa pb wf1 wf2 wf3 fusion (coeff, contraction) = printf "@ + "; print_vector4_km c pa pb wf1 wf2 wf3 fusion (coeff, contraction) let print_dscalar4 c wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F341|F431|F342|F432|F123|F213|F124|F214) | C_13_42, (F241|F421|F243|F423|F132|F312|F134|F314) | C_14_23, (F231|F321|F234|F324|F142|F412|F143|F413) -> printf "((%s%s)*(%s*%s)*(%s*%s)*%s*%s*%s)" (format_coeff coeff) c p1 p2 p3 p123 wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243|F312|F321|F412|F421) | C_13_42, (F124|F142|F324|F342|F213|F231|F413|F431) | C_14_23, (F123|F132|F423|F432|F214|F241|F314|F341) -> printf "((%s%s)*(%s*%s)*(%s*%s)*%s*%s*%s)" (format_coeff coeff) c p2 p3 p1 p123 wf1 wf2 wf3 | C_12_34, (F314|F413|F324|F423|F132|F231|F142|F241) | C_13_42, (F214|F412|F234|F432|F123|F321|F143|F341) | C_14_23, (F213|F312|F243|F342|F124|F421|F134|F431) -> printf "((%s%s)*(%s*%s)*(%s*%s)*%s*%s*%s)" (format_coeff coeff) c p1 p3 p2 p123 wf1 wf2 wf3 let print_add_dscalar4 c wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = printf "@ + "; print_dscalar4 c wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) let print_dscalar2_vector2 c wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F123|F213|F124|F214) -> printf "(%s%s)*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c p1 p2 wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243) -> printf "(%s%s)*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c p1 p123 wf2 wf3 wf1 | C_12_34, (F132|F231|F142|F241) -> printf "(%s%s)*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c p1 p3 wf1 wf3 wf2 | C_12_34, (F312|F321|F412|F421) -> printf "(%s%s)*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c p2 p3 wf2 wf3 wf1 | C_12_34, (F314|F413|F324|F423) -> printf "(%s%s)*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c p2 p123 wf1 wf3 wf2 | C_12_34, (F341|F431|F342|F432) -> printf "(%s%s)*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c p3 p123 wf1 wf2 wf3 | C_13_42, (F123|F214) | C_14_23, (F124|F213) -> printf "((%s%s)*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c wf1 p1 wf3 wf2 p2 | C_13_42, (F124|F213) | C_14_23, (F123|F214) -> printf "((%s%s)*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c wf2 p2 wf3 wf1 p1 | C_13_42, (F132|F241) | C_14_23, (F142|F231) -> printf "((%s%s)*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c wf1 p1 wf2 wf3 p3 | C_13_42, (F142|F231) | C_14_23, (F132|F241) -> printf "((%s%s)*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c wf3 p3 wf2 wf1 p1 | C_13_42, (F312|F421) | C_14_23, (F412|F321) -> printf "((%s%s)*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c wf2 p2 wf1 wf3 p3 | C_13_42, (F321|F412) | C_14_23, (F421|F312) -> printf "((%s%s)*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c wf3 p3 wf1 wf2 p2 | C_13_42, (F134|F243) | C_14_23, (F143|F234) -> printf "((%s%s)*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c wf3 p123 wf1 p1 wf2 | C_13_42, (F143|F234) | C_14_23, (F134|F243) -> printf "((%s%s)*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c wf2 p123 wf1 p1 wf3 | C_13_42, (F314|F423) | C_14_23, (F413|F324) -> printf "((%s%s)*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c wf3 p123 wf2 p2 wf1 | C_13_42, (F324|F413) | C_14_23, (F423|F314) -> printf "((%s%s)*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c wf1 p123 wf2 p2 wf3 | C_13_42, (F341|F432) | C_14_23, (F431|F342) -> printf "((%s%s)*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c wf2 p123 wf3 p3 wf1 | C_13_42, (F342|F431) | C_14_23, (F432|F341) -> printf "((%s%s)*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c wf1 p123 wf3 p3 wf2 let print_add_dscalar2_vector2 c wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = printf "@ + "; print_dscalar2_vector2 c wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) let print_dscalar2_vector2_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F123|F213|F124|F214) -> printf "(%s%s%s+%s))*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c pa pb p1 p2 wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243) -> printf "(%s%s%s+%s))*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c pa pb p1 p123 wf2 wf3 wf1 | C_12_34, (F132|F231|F142|F241) -> printf "(%s%s%s+%s))*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c pa pb p1 p3 wf1 wf3 wf2 | C_12_34, (F312|F321|F412|F421) -> printf "(%s%s%s+%s))*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c pa pb p2 p3 wf2 wf3 wf1 | C_12_34, (F314|F413|F324|F423) -> printf "(%s%s%s+%s))*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c pa pb p2 p123 wf1 wf3 wf2 | C_12_34, (F341|F431|F342|F432) -> printf "(%s%s%s+%s))*(%s*%s)*(%s*%s)*%s" (format_coeff coeff) c pa pb p3 p123 wf1 wf2 wf3 | C_13_42, (F123|F214) | C_14_23, (F124|F213) -> printf "((%s%s%s+%s))*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c pa pb wf1 p1 wf3 wf2 p2 | C_13_42, (F124|F213) | C_14_23, (F123|F214) -> printf "((%s%s%s+%s))*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c pa pb wf2 p2 wf3 wf1 p1 | C_13_42, (F132|F241) | C_14_23, (F142|F231) -> printf "((%s%s%s+%s))*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c pa pb wf1 p1 wf2 wf3 p3 | C_13_42, (F142|F231) | C_14_23, (F132|F241) -> printf "((%s%s%s+%s))*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c pa pb wf3 p3 wf2 wf1 p1 | C_13_42, (F312|F421) | C_14_23, (F412|F321) -> printf "((%s%s%s+%s))*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c pa pb wf2 p2 wf1 wf3 p3 | C_13_42, (F321|F412) | C_14_23, (F421|F312) -> printf "((%s%s%s+%s))*(%s*%s*%s)*%s*%s)" (format_coeff coeff) c pa pb wf3 p3 wf1 wf2 p2 | C_13_42, (F134|F243) | C_14_23, (F143|F234) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c pa pb wf3 p123 wf1 p1 wf2 | C_13_42, (F143|F234) | C_14_23, (F134|F243) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c pa pb wf2 p123 wf1 p1 wf3 | C_13_42, (F314|F423) | C_14_23, (F413|F324) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c pa pb wf3 p123 wf2 p2 wf1 | C_13_42, (F324|F413) | C_14_23, (F423|F314) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c pa pb wf1 p123 wf2 p2 wf3 | C_13_42, (F341|F432) | C_14_23, (F431|F342) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c pa pb wf2 p123 wf3 p3 wf1 | C_13_42, (F342|F431) | C_14_23, (F432|F341) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s*%s))" (format_coeff coeff) c pa pb wf1 p123 wf3 p3 wf2 let print_add_dscalar2_vector2_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = printf "@ + "; print_dscalar2_vector2_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) let print_dscalar2_vector2_m_0_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F123|F213|F124|F214) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F134|F143|F234|F243) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F132|F231|F142|F241) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf3 p3 wf2 p2 | C_12_34, (F312|F321|F412|F421) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p2 wf1 p1 | C_12_34, (F314|F413|F324|F423) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F341|F431|F342|F432) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p2 wf1 p1 | C_13_42, (F123|F214) | C_14_23, (F124|F213) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p3 wf3 p2 | C_13_42, (F124|F213) | C_14_23, (F123|F214) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p3 wf3 p1 | C_13_42, (F132|F241) | C_14_23, (F142|F231) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf3 p2 wf2 p3 | C_13_42, (F142|F231) | C_14_23, (F132|F241) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p2 wf2 p1 | C_13_42, (F312|F421) | C_14_23, (F412|F321) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf3 p1 wf1 p3 | C_13_42, (F321|F412) | C_14_23, (F421|F312) -> printf "@[((%s%s%s+%s))*v_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p1 wf1 p2 | C_13_42, (F134|F243) | C_14_23, (F143|F234) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p3 wf3 p1 wf2 p2 | C_13_42, (F143|F234) | C_14_23, (F134|F243) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p2 wf2 p1 wf3 p3 | C_13_42, (F314|F423) | C_14_23, (F413|F324) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p3 wf3 p2 wf1 p1 | C_13_42, (F324|F413) | C_14_23, (F423|F314) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p1 wf1 p2 wf3 p3 | C_13_42, (F341|F432) | C_14_23, (F431|F342) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p2 wf2 p3 wf1 p1 | C_13_42, (F342|F431) | C_14_23, (F432|F341) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_0(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p1 wf1 p3 wf2 p2 let print_add_dscalar2_vector2_m_0_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) = printf "@ + "; print_dscalar2_vector2_m_0_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) let print_dscalar2_vector2_m_1_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F123|F213|F124|F214) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F134|F143|F234|F243) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F132|F231|F142|F241) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf3 p3 wf2 p2 | C_12_34, (F312|F321|F412|F421) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p2 wf1 p1 | C_12_34, (F314|F413|F324|F423) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F341|F431|F342|F432) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p2 wf1 p1 | C_13_42, (F123|F214) | C_14_23, (F124|F213) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p3 wf3 p2 | C_13_42, (F124|F213) | C_14_23, (F123|F214) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p3 wf3 p1 | C_13_42, (F132|F241) | C_14_23, (F142|F231) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf3 p2 wf2 p3 | C_13_42, (F142|F231) | C_14_23, (F132|F241) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p2 wf2 p1 | C_13_42, (F312|F421) | C_14_23, (F412|F321) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf3 p1 wf1 p3 | C_13_42, (F321|F412) | C_14_23, (F421|F312) -> printf "@[((%s%s%s+%s))*v_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p1 wf1 p2 | C_13_42, (F134|F243) | C_14_23, (F143|F234) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p3 wf3 p1 wf2 p2 | C_13_42, (F143|F234) | C_14_23, (F134|F243) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p2 wf2 p1 wf3 p3 | C_13_42, (F314|F423) | C_14_23, (F413|F324) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p3 wf3 p2 wf1 p1 | C_13_42, (F324|F413) | C_14_23, (F423|F314) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p1 wf1 p2 wf3 p3 | C_13_42, (F341|F432) | C_14_23, (F431|F342) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p2 wf2 p3 wf1 p1 | C_13_42, (F342|F431) | C_14_23, (F432|F341) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_1(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p1 wf1 p3 wf2 p2 let print_add_dscalar2_vector2_m_1_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) = printf "@ + "; print_dscalar2_vector2_m_1_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) let print_dscalar2_vector2_m_7_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F123|F213|F124|F214) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F134|F143|F234|F243) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p2 wf3 p3 | C_12_34, (F132|F231|F142|F241) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf3 p3 wf2 p2 | C_12_34, (F312|F321|F412|F421) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p2 wf1 p1 | C_12_34, (F314|F413|F324|F423) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p1 wf3 p3 | C_12_34, (F341|F431|F342|F432) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p2 wf1 p1 | C_13_42, (F123|F214) | C_14_23, (F124|F213) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf2 p3 wf3 p2 | C_13_42, (F124|F213) | C_14_23, (F123|F214) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf1 p3 wf3 p1 | C_13_42, (F132|F241) | C_14_23, (F142|F231) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p1 wf3 p2 wf2 p3 | C_13_42, (F142|F231) | C_14_23, (F132|F241) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf1 p2 wf2 p1 | C_13_42, (F312|F421) | C_14_23, (F412|F321) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p2 wf3 p1 wf1 p3 | C_13_42, (F321|F412) | C_14_23, (F421|F312) -> printf "@[((%s%s%s+%s))*v_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p3 wf2 p1 wf1 p2 | C_13_42, (F134|F243) | C_14_23, (F143|F234) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p3 wf3 p1 wf2 p2 | C_13_42, (F143|F234) | C_14_23, (F134|F243) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf1 p2 wf2 p1 wf3 p3 | C_13_42, (F314|F423) | C_14_23, (F413|F324) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p3 wf3 p2 wf1 p1 | C_13_42, (F324|F413) | C_14_23, (F423|F314) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf2 p1 wf1 p2 wf3 p3 | C_13_42, (F341|F432) | C_14_23, (F431|F342) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p2 wf2 p3 wf1 p1 | C_13_42, (F342|F431) | C_14_23, (F432|F341) -> printf "@[((%s%s%s+%s))*phi_phi2v_m_7(cmplx(1,kind=default),@ %s,%s,%s,%s,%s,%s))@]" (format_coeff coeff) c pa pb wf3 p1 wf1 p3 wf2 p2 let print_add_dscalar2_vector2_m_7_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) = printf "@ + "; print_dscalar2_vector2_m_7_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion (coeff, contraction) let print_dscalar4_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = match contraction, fusion with | C_12_34, (F341|F431|F342|F432|F123|F213|F124|F214) | C_13_42, (F241|F421|F243|F423|F132|F312|F134|F314) | C_14_23, (F231|F321|F234|F324|F142|F412|F143|F413) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s)*%s*%s*%s)" (format_coeff coeff) c pa pb p1 p2 p3 p123 wf1 wf2 wf3 | C_12_34, (F134|F143|F234|F243|F312|F321|F412|F421) | C_13_42, (F124|F142|F324|F342|F213|F231|F413|F431) | C_14_23, (F123|F132|F423|F432|F214|F241|F314|F341) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s)*%s*%s*%s)" (format_coeff coeff) c pa pb p2 p3 p1 p123 wf1 wf2 wf3 | C_12_34, (F314|F413|F324|F423|F132|F231|F142|F241) | C_13_42, (F214|F412|F234|F432|F123|F321|F143|F341) | C_14_23, (F213|F312|F243|F342|F124|F421|F134|F431) -> printf "((%s%s%s+%s))*(%s*%s)*(%s*%s)*%s*%s*%s)" (format_coeff coeff) c pa pb p1 p3 p2 p123 wf1 wf2 wf3 let print_add_dscalar4_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) = printf "@ + "; print_dscalar4_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion (coeff, contraction) let print_current amplitude dictionary rhs = match F.coupling rhs with | V3 (vertex, fusion, constant) -> let ch1, ch2 = children2 rhs in let wf1 = multiple_variable amplitude dictionary ch1 and wf2 = multiple_variable amplitude dictionary ch2 and p1 = momentum ch1 and p2 = momentum ch2 and m1 = CM.mass_symbol (F.flavor ch1) and m2 = CM.mass_symbol (F.flavor ch2) in let c = CM.constant_symbol constant in printf "@, %s " (if (F.sign rhs) < 0 then "-" else "+"); begin match vertex with (* Fermionic currents $\bar\psi\fmslash{A}\psi$ and $\bar\psi\phi\psi$ are handled by the [Fermions] module, since they depend on the choice of Feynman rules: Dirac or Majorana. *) | FBF (coeff, fb, b, f) -> begin match coeff, fb, b, f with | _, _, (VLRM|SPM|VAM|VA3M|TVA|TVAM|TLR|TLRM|TRL|TRLM), _ -> let p12 = Printf.sprintf "(-%s-%s)" p1 p2 in Fermions.print_current_mom (coeff, fb, b, f) c wf1 wf2 p1 p2 p12 fusion | _, _, _, _ -> Fermions.print_current (coeff, fb, b, f) c wf1 wf2 fusion end | PBP (coeff, f1, b, f2) -> Fermions.print_current_p (coeff, f1, b, f2) c wf1 wf2 fusion | BBB (coeff, fb1, b, fb2) -> Fermions.print_current_b (coeff, fb1, b, fb2) c wf1 wf2 fusion | GBG (coeff, fb, b, f) -> let p12 = Printf.sprintf "(-%s-%s)" p1 p2 in Fermions.print_current_g (coeff, fb, b, f) c wf1 wf2 p1 p2 p12 fusion (* Table~\ref{tab:dim4-bosons} is a bit misleading, since if includes totally antisymmetric structure constants. The space-time part alone is also totally antisymmetric: *) | Gauge_Gauge_Gauge coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F31|F12) -> printf "g_gg(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F32|F13|F21) -> printf "g_gg(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | I_Gauge_Gauge_Gauge coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F31|F12) -> printf "g_gg((0,1)*(%s),%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F32|F13|F21) -> printf "g_gg((0,1)*(%s),%s,%s,%s,%s)" c wf2 p2 wf1 p1 end (* In [Aux_Gauge_Gauge], we can not rely on antisymmetry alone, because of the different Lorentz representations of the auxialiary and the gauge field. Instead we have to provide the sign in \begin{equation} (V_2 \wedge V_3) \cdot T_1 = \begin{cases} V_2 \cdot (T_1 \cdot V_3) = - V_2 \cdot (V_3 \cdot T_1) & \\ V_3 \cdot (V_2 \cdot T_1) = - V_3 \cdot (T_1 \cdot V_2) & \end{cases} \end{equation} ourselves. Alternatively, one could provide \verb+g_xg+ mirroring \verb+g_gx+. *) | Aux_Gauge_Gauge coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "x_gg(%s,%s,%s)" c wf1 wf2 | F32 -> printf "x_gg(%s,%s,%s)" c wf2 wf1 | F12 -> printf "g_gx(%s,%s,%s)" c wf2 wf1 | F21 -> printf "g_gx(%s,%s,%s)" c wf1 wf2 | F13 -> printf "(-1)*g_gx(%s,%s,%s)" c wf2 wf1 | F31 -> printf "(-1)*g_gx(%s,%s,%s)" c wf1 wf2 end (* These cases are symmetric and we just have to juxtapose the correct fields and provide parentheses to minimize the number of multiplications. *) | Scalar_Vector_Vector coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "%s*(%s*%s)" c wf1 wf2 | (F12|F13) -> printf "(%s*%s)*%s" c wf1 wf2 | (F21|F31) -> printf "(%s*%s)*%s" c wf2 wf1 end | Aux_Vector_Vector coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "%s*(%s*%s)" c wf1 wf2 | (F12|F13) -> printf "(%s*%s)*%s" c wf1 wf2 | (F21|F31) -> printf "(%s*%s)*%s" c wf2 wf1 end (* Even simpler: *) | Scalar_Scalar_Scalar coeff -> printf "(%s*%s*%s)" (format_coupling coeff c) wf1 wf2 | Aux_Scalar_Scalar coeff -> printf "(%s*%s*%s)" (format_coupling coeff c) wf1 wf2 | Aux_Scalar_Vector coeff -> let c = format_coupling coeff c in begin match fusion with | (F13|F31) -> printf "%s*(%s*%s)" c wf1 wf2 | (F23|F21) -> printf "(%s*%s)*%s" c wf1 wf2 | (F32|F12) -> printf "(%s*%s)*%s" c wf2 wf1 end | Vector_Scalar_Scalar coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "v_ss(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "v_ss(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "s_vs(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "s_vs(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1)*s_vs(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1)*s_vs(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Graviton_Scalar_Scalar coeff -> let c = format_coupling coeff c in begin match fusion with | F12 -> printf "s_gravs(%s,%s,-(%s+%s),%s,%s,%s)" c m2 p1 p2 p2 wf1 wf2 | F21 -> printf "s_gravs(%s,%s,-(%s+%s),%s,%s,%s)" c m1 p1 p2 p1 wf2 wf1 | F13 -> printf "s_gravs(%s,%s,%s,-(%s+%s),%s,%s)" c m2 p2 p1 p2 wf1 wf2 | F31 -> printf "s_gravs(%s,%s,%s,-(%s+%s),%s,%s)" c m1 p1 p1 p2 wf2 wf1 | F23 -> printf "grav_ss(%s,%s,%s,%s,%s,%s)" c m1 p1 p2 wf1 wf2 | F32 -> printf "grav_ss(%s,%s,%s,%s,%s,%s)" c m1 p2 p1 wf2 wf1 end (* In producing a vector in the fusion we always contract the rightmost index with the vector wavefunction from [rhs]. So the first momentum is always the one of the vector boson produced in the fusion, while the second one is that from the [rhs]. This makes the cases [F12] and [F13] as well as [F21] and [F31] equal. In principle, we could have already done this for the [Graviton_Scalar_Scalar] case. *) | Graviton_Vector_Vector coeff -> let c = format_coupling coeff c in begin match fusion with | (F12|F13) -> printf "v_gravv(%s,%s,-(%s+%s),%s,%s,%s)" c m2 p1 p2 p2 wf1 wf2 | (F21|F31) -> printf "v_gravv(%s,%s,-(%s+%s),%s,%s,%s)" c m1 p1 p2 p1 wf2 wf1 | F23 -> printf "grav_vv(%s,%s,%s,%s,%s,%s)" c m1 p1 p2 wf1 wf2 | F32 -> printf "grav_vv(%s,%s,%s,%s,%s,%s)" c m1 p2 p1 wf2 wf1 end | Graviton_Spinor_Spinor coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "f_gravf(%s,%s,-(%s+%s),(-%s),%s,%s)" c m2 p1 p2 p2 wf1 wf2 | F32 -> printf "f_gravf(%s,%s,-(%s+%s),(-%s),%s,%s)" c m1 p1 p2 p1 wf2 wf1 | F12 -> printf "f_fgrav(%s,%s,%s,%s+%s,%s,%s)" c m1 p1 p1 p2 wf1 wf2 | F21 -> printf "f_fgrav(%s,%s,%s,%s+%s,%s,%s)" c m2 p2 p1 p2 wf2 wf1 | F13 -> printf "grav_ff(%s,%s,%s,(-%s),%s,%s)" c m1 p1 p2 wf1 wf2 | F31 -> printf "grav_ff(%s,%s,%s,(-%s),%s,%s)" c m1 p2 p1 wf2 wf1 end | Dim4_Vector_Vector_Vector_T coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "tkv_vv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "tkv_vv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "tv_kvv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "tv_kvv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1)*tv_kvv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1)*tv_kvv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim4_Vector_Vector_Vector_L coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "lkv_vv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "lkv_vv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 | F13 -> printf "lv_kvv(%s,%s,%s,%s)" c wf1 p1 wf2 | F21 | F31 -> printf "lv_kvv(%s,%s,%s,%s)" c wf2 p2 wf1 end | Dim6_Gauge_Gauge_Gauge coeff -> let c = format_coupling coeff c in begin match fusion with | F23 | F31 | F12 -> printf "kg_kgkg(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 | F13 | F21 -> printf "kg_kgkg(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim4_Vector_Vector_Vector_T5 coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "t5kv_vv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "t5kv_vv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 | F13 -> printf "t5v_kvv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 | F31 -> printf "t5v_kvv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim4_Vector_Vector_Vector_L5 coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "l5kv_vv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "l5kv_vv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "l5v_kvv(%s,%s,%s,%s)" c wf1 p1 wf2 | F21 -> printf "l5v_kvv(%s,%s,%s,%s)" c wf2 p2 wf1 | F13 -> printf "(-1)*l5v_kvv(%s,%s,%s,%s)" c wf1 p1 wf2 | F31 -> printf "(-1)*l5v_kvv(%s,%s,%s,%s)" c wf2 p2 wf1 end | Dim6_Gauge_Gauge_Gauge_5 coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "kg5_kgkg(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "kg5_kgkg(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "kg_kg5kg(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "kg_kg5kg(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1)*kg_kg5kg(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1)*kg_kg5kg(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Aux_DScalar_DScalar coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "%s*(%s*%s)*(%s*%s)" c p1 p2 wf1 wf2 | (F12|F13) -> printf "%s*(-((%s+%s)*%s))*(%s*%s)" c p1 p2 p2 wf1 wf2 | (F21|F31) -> printf "%s*(-((%s+%s)*%s))*(%s*%s)" c p1 p2 p1 wf1 wf2 end | Aux_Vector_DScalar coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "%s*(%s*%s)*%s" c wf1 p2 wf2 | F32 -> printf "%s*(%s*%s)*%s" c wf2 p1 wf1 | F12 -> printf "%s*(-((%s+%s)*%s))*%s" c p1 p2 wf2 wf1 | F21 -> printf "%s*(-((%s+%s)*%s))*%s" c p1 p2 wf1 wf2 | (F13|F31) -> printf "(-(%s+%s))*(%s*%s*%s)" p1 p2 c wf1 wf2 end | Dim5_Scalar_Gauge2 coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "(%s)*((%s*%s)*(%s*%s) - (%s*%s)*(%s*%s))" c p1 wf2 p2 wf1 p1 p2 wf2 wf1 | (F12|F13) -> printf "(%s)*%s*((-((%s+%s)*%s))*%s - ((-(%s+%s)*%s))*%s)" c wf1 p1 p2 wf2 p2 p1 p2 p2 wf2 | (F21|F31) -> printf "(%s)*%s*((-((%s+%s)*%s))*%s - ((-(%s+%s)*%s))*%s)" c wf2 p2 p1 wf1 p1 p1 p2 p1 wf1 end | Dim5_Scalar_Gauge2_Skew coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "(- phi_vv (%s, %s, %s, %s, %s))" c p1 p2 wf1 wf2 | (F12|F13) -> printf "(- v_phiv (%s, %s, %s, %s, %s))" c wf1 p1 p2 wf2 | (F21|F31) -> printf "v_phiv (%s, %s, %s, %s, %s)" c wf2 p1 p2 wf1 end | Dim5_Scalar_Vector_Vector_T coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "(%s)*(%s*%s)*(%s*%s)" c p1 wf2 p2 wf1 | (F12|F13) -> printf "(%s)*%s*(-((%s+%s)*%s))*%s" c wf1 p1 p2 wf2 p2 | (F21|F31) -> printf "(%s)*%s*(-((%s+%s)*%s))*%s" c wf2 p2 p1 wf1 p1 end | Dim5_Scalar_Vector_Vector_U coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "phi_u_vv (%s, %s, %s, %s, %s)" c p1 p2 wf1 wf2 | (F12|F13) -> printf "v_u_phiv (%s, %s, %s, %s, %s)" c wf1 p1 p2 wf2 | (F21|F31) -> printf "v_u_phiv (%s, %s, %s, %s, %s)" c wf2 p2 p1 wf1 end | Dim5_Scalar_Vector_Vector_TU coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "(%s)*((%s*%s)*(-(%s+%s)*%s) - (-(%s+%s)*%s)*(%s*%s))" c p1 wf2 p1 p2 wf1 p1 p2 p1 wf1 wf2 | F32 -> printf "(%s)*((%s*%s)*(-(%s+%s)*%s) - (-(%s+%s)*%s)*(%s*%s))" c p2 wf1 p1 p2 wf2 p1 p2 p2 wf1 wf2 | F12 -> printf "(%s)*%s*((%s*%s)*%s - (%s*%s)*%s)" c wf1 p1 wf2 p2 p1 p2 wf2 | F21 -> printf "(%s)*%s*((%s*%s)*%s - (%s*%s)*%s)" c wf2 p2 wf1 p1 p1 p2 wf1 | F13 -> printf "(%s)*%s*((-(%s+%s)*%s)*%s - (-(%s+%s)*%s)*%s)" c wf1 p1 p2 wf2 p1 p1 p2 p1 wf2 | F31 -> printf "(%s)*%s*((-(%s+%s)*%s)*%s - (-(%s+%s)*%s)*%s)" c wf2 p1 p2 wf1 p2 p1 p2 p2 wf1 end | Dim5_Scalar_Scalar2 coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "phi_dim5s2(%s, %s ,%s, %s, %s)" c wf1 p1 wf2 p2 | (F12|F13) -> let p12 = Printf.sprintf "(-%s-%s)" p1 p2 in printf "phi_dim5s2(%s,%s,%s,%s,%s)" c wf1 p12 wf2 p2 | (F21|F31) -> let p12 = Printf.sprintf "(-%s-%s)" p1 p2 in printf "phi_dim5s2(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p12 end | Scalar_Vector_Vector_t coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "s_vv_t(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_sv_t(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_sv_t(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_Vector_Vector_Vector_T coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "(%s)*(%s*%s)*(%s*%s)*(%s-%s)" c p2 wf1 p1 wf2 p1 p2 | F32 -> printf "(%s)*(%s*%s)*(%s*%s)*(%s-%s)" c p1 wf2 p2 wf1 p2 p1 | (F12|F13) -> printf "(%s)*((%s+2*%s)*%s)*(-((%s+%s)*%s))*%s" c p1 p2 wf1 p1 p2 wf2 p2 | (F21|F31) -> printf "(%s)*((-((%s+%s)*%s))*(%s+2*%s)*%s)*%s" c p2 p1 wf1 p2 p1 wf2 p1 end | Tensor_2_Vector_Vector coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_vv(%s,%s,%s)" c wf1 wf2 | (F12|F13) -> printf "v_t2v(%s,%s,%s)" c wf1 wf2 | (F21|F31) -> printf "v_t2v(%s,%s,%s)" c wf2 wf1 end | Tensor_2_Scalar_Scalar coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_phi2(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "phi_t2phi(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "phi_t2phi(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Tensor_2_Vector_Vector_1 coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_vv_1(%s,%s,%s)" c wf1 wf2 | (F12|F13) -> printf "v_t2v_1(%s,%s,%s)" c wf1 wf2 | (F21|F31) -> printf "v_t2v_1(%s,%s,%s)" c wf2 wf1 end | Tensor_2_Vector_Vector_cf coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_vv_cf(%s,%s,%s)" c wf1 wf2 | (F12|F13) -> printf "v_t2v_cf(%s,%s,%s)" c wf1 wf2 | (F21|F31) -> printf "v_t2v_cf(%s,%s,%s)" c wf2 wf1 end | Tensor_2_Scalar_Scalar_cf coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_phi2_cf(%s,%s,%s,%s, %s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "phi_t2phi_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "phi_t2phi_cf(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim5_Tensor_2_Vector_Vector_1 coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_vv_d5_1(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_t2v_d5_1(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_t2v_d5_1(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Tensor_2_Vector_Vector_t coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "t2_vv_t(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_t2v_t(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_t2v_t(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim5_Tensor_2_Vector_Vector_2 coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "t2_vv_d5_2(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "t2_vv_d5_2(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | (F12|F13) -> printf "v_t2v_d5_2(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_t2v_d5_2(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | TensorVector_Vector_Vector coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "dv_vv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_dvv(%s,%s,%s,%s)" c wf1 p1 wf2 | (F21|F31) -> printf "v_dvv(%s,%s,%s,%s)" c wf2 p2 wf1 end | TensorVector_Vector_Vector_cf coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "dv_vv_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_dvv_cf(%s,%s,%s,%s)" c wf1 p1 wf2 | (F21|F31) -> printf "v_dvv_cf(%s,%s,%s,%s)" c wf2 p2 wf1 end | TensorVector_Scalar_Scalar coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "dv_phi2(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "phi_dvphi(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "phi_dvphi(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | TensorVector_Scalar_Scalar_cf coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "dv_phi2_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "phi_dvphi_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "phi_dvphi_cf(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | TensorScalar_Vector_Vector coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "tphi_vv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_tphiv(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_tphiv(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | TensorScalar_Vector_Vector_cf coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "tphi_vv_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_tphiv_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_tphiv_cf(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | TensorScalar_Scalar_Scalar coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "tphi_ss(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "s_tphis(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "s_tphis(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | TensorScalar_Scalar_Scalar_cf coeff-> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "tphi_ss_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "s_tphis_cf(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "s_tphis_cf(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim7_Tensor_2_Vector_Vector_T coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "t2_vv_d7(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "t2_vv_d7(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | (F12|F13) -> printf "v_t2v_d7(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_t2v_d7(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_Scalar_Vector_Vector_D coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "s_vv_6D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_sv_6D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_sv_6D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_Scalar_Vector_Vector_DP coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32) -> printf "s_vv_6DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F12|F13) -> printf "v_sv_6DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F21|F31) -> printf "v_sv_6DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_HAZ_D coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "h_az_D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "h_az_D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "a_hz_D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "a_hz_D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "z_ah_D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F21 -> printf "z_ah_D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 end | Dim6_HAZ_DP coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "h_az_DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "h_az_DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "a_hz_DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "a_hz_DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "z_ah_DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F21 -> printf "z_ah_DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 end | Gauge_Gauge_Gauge_i coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "g_gg_23(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "g_gg_23(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "g_gg_13(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "g_gg_13(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "(-1) * g_gg_13(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "(-1) * g_gg_13(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_GGG coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "g_gg_6(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "g_gg_6(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "g_gg_6(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "g_gg_6(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1) * g_gg_6(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1) * g_gg_6(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_AWW_DP coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "a_ww_DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "a_ww_DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "w_aw_DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "w_aw_DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "(-1) * w_aw_DP(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "(-1) * w_aw_DP(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_AWW_DW coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "a_ww_DW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "a_ww_DW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1) * a_ww_DW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1) * a_ww_DW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "a_ww_DW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "a_ww_DW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_Gauge_Gauge_Gauge_i coeff -> let c = format_coupling coeff c in begin match fusion with | F23 | F31 | F12 -> printf "kg_kgkg_i(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 | F13 | F21 -> printf "kg_kgkg_i(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_HHH coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F32|F12|F21|F13|F31) -> printf "h_hh_6(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 end | Dim6_WWZ_DPWDW coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "w_wz_DPW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "w_wz_DPW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1) * w_wz_DPW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1) * w_wz_DPW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "z_ww_DPW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "z_ww_DPW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_WWZ_DW coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "w_wz_DW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "w_wz_DW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1) * w_wz_DW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1) * w_wz_DW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "z_ww_DW(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "z_ww_DW(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end | Dim6_WWZ_D coeff -> let c = format_coupling coeff c in begin match fusion with | F23 -> printf "w_wz_D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F32 -> printf "w_wz_D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F13 -> printf "(-1) * w_wz_D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F31 -> printf "(-1) * w_wz_D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 | F12 -> printf "z_ww_D(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | F21 -> printf "z_ww_D(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end (*i | Dim6_Glu_Glu_Glu coeff -> let c = format_coupling coeff c in begin match fusion with | (F23|F31|F12) -> printf "g_gg_glu(%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 | (F32|F13|F21) -> printf "g_gg_glu(%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 end i*) end (* Flip the sign to account for the~$\mathrm{i}^2$ relative to diagrams with only cubic couplings. \label{hack:sign(V4)} *) (* \begin{dubious} That's an \emph{slightly dangerous} hack!!! How do we accnount for such signs when treating $n$-ary vertices uniformly? \end{dubious} *) | V4 (vertex, fusion, constant) -> let c = CM.constant_symbol constant and ch1, ch2, ch3 = children3 rhs in let wf1 = multiple_variable amplitude dictionary ch1 and wf2 = multiple_variable amplitude dictionary ch2 and wf3 = multiple_variable amplitude dictionary ch3 and p1 = momentum ch1 and p2 = momentum ch2 and p3 = momentum ch3 in printf "@, %s " (if (F.sign rhs) < 0 then "+" else "-"); begin match vertex with | Scalar4 coeff -> printf "(%s*%s*%s*%s)" (format_coupling coeff c) wf1 wf2 wf3 | Scalar2_Vector2 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 -> printf "%s*%s*(%s*%s)" c wf1 wf2 wf3 | F314 | F413 | F324 | F423 -> printf "%s*%s*(%s*%s)" c wf2 wf1 wf3 | F341 | F431 | F342 | F432 -> printf "%s*%s*(%s*%s)" c wf3 wf1 wf2 | F312 | F321 | F412 | F421 -> printf "(%s*%s*%s)*%s" c wf2 wf3 wf1 | F231 | F132 | F241 | F142 -> printf "(%s*%s*%s)*%s" c wf1 wf3 wf2 | F123 | F213 | F124 | F214 -> printf "(%s*%s*%s)*%s" c wf1 wf2 wf3 end | Vector4 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> printf "("; print_vector4 c wf1 wf2 wf3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; printf ")" end | Dim8_Vector4_t_0 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> print_vector4_t_0 c wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; end | Dim8_Vector4_t_1 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> print_vector4_t_1 c wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; end | Dim8_Vector4_t_2 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> print_vector4_t_2 c wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; end | Dim8_Vector4_m_0 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> print_vector4_m_0 c wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; end | Dim8_Vector4_m_1 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> print_vector4_m_1 c wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; end | Dim8_Vector4_m_7 contractions -> begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4 []" | head :: tail -> print_vector4_m_7 c wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4 c wf1 wf2 wf3 fusion) tail; end | Vector4_K_Matrix_tho (_, poles) -> let pa, pb = begin match fusion with | (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in printf "(%s*(%s*%s)*(%s*%s)*(%s*%s)@,*(" c p1 wf1 p2 wf2 p3 wf3; List.iter (fun (coeff, pole) -> printf "+%s/((%s+%s)*(%s+%s)-%s)" (CM.constant_symbol coeff) pa pb pa pb (CM.constant_symbol pole)) poles; printf ")*(-%s-%s-%s))" p1 p2 p3 | Vector4_K_Matrix_jr (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_jr []" | head :: tail -> printf "("; print_vector4_km c pa pb wf1 wf2 wf3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_t0 (disc, contractions) -> let pa, pb, pc = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2, p3) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3, p1) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3, p2) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2, p3) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3, p1) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3, p2) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_t0 []" | head :: tail -> printf "("; print_vector4_km_t_0 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_t1 (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_t1 []" | head :: tail -> printf "("; print_vector4_km_t_1 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_t2 (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_t2 []" | head :: tail -> printf "("; print_vector4_km_t_2 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_t_rsi (disc, contractions) -> let pa, pb, pc = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2, p3) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3, p1) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3, p2) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2, p3) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3, p1) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3, p2) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_t_rsi []" | head :: tail -> printf "("; print_vector4_km_t_rsi c pa pb pc wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_m0 (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_m0 []" | head :: tail -> printf "("; print_vector4_km_m_0 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_m1 (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_m1 []" | head :: tail -> printf "("; print_vector4_km_m_1 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | Vector4_K_Matrix_cf_m7 (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: Vector4_K_Matrix_cf_m7 []" | head :: tail -> printf "("; print_vector4_km_m_7 c pa pb wf1 p1 wf2 p2 wf3 p3 fusion head; List.iter (print_add_vector4_km c pa pb wf1 wf2 wf3 fusion) tail; printf ")" end | DScalar2_Vector2_K_Matrix_ms (disc, contractions) -> let p123 = Printf.sprintf "(-%s-%s-%s)" p1 p2 p3 in let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 4, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 4, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 4, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 5, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 5, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 5, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 6, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 6, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 6, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 7, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 7, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 7, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 8, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 8, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 8, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar2_Vector4_K_Matrix_ms []" | head :: tail -> printf "("; print_dscalar2_vector2_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion head; List.iter (print_add_dscalar2_vector2_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion) tail; printf ")" end | DScalar2_Vector2_m_0_K_Matrix_cf (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 4, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 4, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 4, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 5, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 5, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 5, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 6, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 6, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 6, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 7, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 7, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 7, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 8, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 8, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 8, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar2_Vector4_K_Matrix_cf_m0 []" | head :: tail -> printf "("; print_dscalar2_vector2_m_0_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion head; List.iter (print_add_dscalar2_vector2_m_0_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion) tail; printf ")" end | DScalar2_Vector2_m_1_K_Matrix_cf (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 4, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 4, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 4, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 5, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 5, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 5, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 6, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 6, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 6, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 7, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 7, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 7, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 8, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 8, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 8, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar2_Vector4_K_Matrix_cf_m1 []" | head :: tail -> printf "("; print_dscalar2_vector2_m_1_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion head; List.iter (print_add_dscalar2_vector2_m_1_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion) tail; printf ")" end | DScalar2_Vector2_m_7_K_Matrix_cf (disc, contractions) -> let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 4, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 4, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 4, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 5, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 5, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 5, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | 6, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 6, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 6, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 7, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 7, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 7, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | 8, (F134|F132|F314|F312|F241|F243|F421|F423) -> (p1, p2) | 8, (F213|F413|F231|F431|F124|F324|F142|F342) -> (p2, p3) | 8, (F143|F123|F341|F321|F412|F214|F432|F234) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar2_Vector4_K_Matrix_cf_m7 []" | head :: tail -> printf "("; print_dscalar2_vector2_m_7_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion head; List.iter (print_add_dscalar2_vector2_m_7_km c pa pb wf1 wf2 wf3 p1 p2 p3 fusion) tail; printf ")" end | DScalar4_K_Matrix_ms (disc, contractions) -> let p123 = Printf.sprintf "(-%s-%s-%s)" p1 p2 p3 in let pa, pb = begin match disc, fusion with | 3, (F143|F413|F142|F412|F321|F231|F324|F234) -> (p1, p2) | 3, (F314|F341|F214|F241|F132|F123|F432|F423) -> (p2, p3) | 3, (F134|F431|F124|F421|F312|F213|F342|F243) -> (p1, p3) | _, (F341|F431|F342|F432|F123|F213|F124|F214) -> (p1, p2) | _, (F134|F143|F234|F243|F312|F321|F412|F421) -> (p2, p3) | _, (F314|F413|F324|F423|F132|F231|F142|F241) -> (p1, p3) end in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar4_K_Matrix_ms []" | head :: tail -> printf "("; print_dscalar4_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion head; List.iter (print_add_dscalar4_km c pa pb wf1 wf2 wf3 p1 p2 p3 p123 fusion) tail; printf ")" end | Dim8_Scalar2_Vector2_1 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 -> printf "phi_phi2v_1(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F314 | F413 | F324 | F423 -> printf "phi_phi2v_1(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F341 | F431 | F342 | F432 -> printf "phi_phi2v_1(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F312 | F321 | F412 | F421 -> printf "v_phi2v_1(%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 | F231 | F132 | F241 | F142 -> printf "v_phi2v_1(%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 | F123 | F213 | F124 | F214 -> printf "v_phi2v_1(%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 end | Dim8_Scalar2_Vector2_2 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 -> printf "phi_phi2v_2(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F314 | F413 | F324 | F423 -> printf "phi_phi2v_2(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F341 | F431 | F342 | F432 -> printf "phi_phi2v_2(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F312 | F321 | F412 | F421 -> printf "v_phi2v_2(%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 | F231 | F132 | F241 | F142 -> printf "v_phi2v_2(%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 | F123 | F213 | F124 | F214 -> printf "v_phi2v_2(%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 end | Dim8_Scalar2_Vector2_m_0 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 -> printf "phi_phi2v_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F314 | F413 | F324 | F423 -> printf "phi_phi2v_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F341 | F431 | F342 | F432 -> printf "phi_phi2v_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F312 | F321 | F412 | F421 -> printf "v_phi2v_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F231 | F132 | F241 | F142 -> printf "v_phi2v_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F123 | F213 | F124 | F214 -> printf "v_phi2v_m_0(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 end | Dim8_Scalar2_Vector2_m_1 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 -> printf "phi_phi2v_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F314 | F413 | F324 | F423 -> printf "phi_phi2v_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F341 | F431 | F342 | F432 -> printf "phi_phi2v_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F312 | F321 | F412 | F421 -> printf "v_phi2v_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F231 | F132 | F241 | F142 -> printf "v_phi2v_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F123 | F213 | F124 | F214 -> printf "v_phi2v_m_1(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 end | Dim8_Scalar2_Vector2_m_7 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 -> printf "phi_phi2v_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F314 | F413 | F324 | F423 -> printf "phi_phi2v_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F341 | F431 | F342 | F432 -> printf "phi_phi2v_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F312 | F321 | F412 | F421 -> printf "v_phi2v_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F231 | F132 | F241 | F142 -> printf "v_phi2v_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F123 | F213 | F124 | F214 -> printf "v_phi2v_m_7(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 end | Dim8_Scalar4 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 | F314 | F413 | F324 | F423 | F341 | F431 | F342 | F432 | F312 | F321 | F412 | F421 | F231 | F132 | F241 | F142 | F123 | F213 | F124 | F214 -> printf "s_dim8s3 (%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 end | GBBG (coeff, fb, b, f) -> Fermions.print_current_g4 (coeff, fb, b, f) c wf1 wf2 wf3 fusion | Dim6_H4_P2 coeff -> let c = format_coupling coeff c in begin match fusion with | F134 | F143 | F234 | F243 | F314 | F413 | F324 | F423 | F341 | F431 | F342 | F432 | F312 | F321 | F412 | F421 | F231 | F132 | F241 | F142 | F123 | F213 | F124 | F214 -> printf "hhhh_p2 (%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 end | Dim6_AHWW_DPB coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "a_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "a_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "a_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "a_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "a_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "a_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_aww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_aww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_aww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_aww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_aww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_aww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "(-1)*w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "(-1)*w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "(-1)*w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "(-1)*w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "(-1)*w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "(-1)*w_ahw_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_AHWW_DPW coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "a_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "a_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "a_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "a_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "a_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "a_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_aww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_aww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_aww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_aww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_aww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_aww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "(-1)*w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "(-1)*w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "(-1)*w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "(-1)*w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "(-1)*w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "(-1)*w_ahw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_AHWW_DW coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "w3_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "w3_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "w3_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "w3_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "w3_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "w3_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "w4_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "w4_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "w4_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "w4_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "w4_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "w4_ahw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 (*i | F234 | F134 | F124 | F123 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 | F143 | F142 | F132 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 | F341 | F241 | F231 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 | F314 | F214 | F213 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 | F413 | F412 | F312 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 | F431 | F421 | F321 -> printf "a_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 i*) end | Dim6_Scalar2_Vector2_D coeff -> let c = format_coupling coeff c in begin match fusion with | F234 | F134 -> printf "h_hww_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 | F143 -> printf "h_hww_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 | F341 -> printf "h_hww_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 | F314 -> printf "h_hww_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 | F413 -> printf "h_hww_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 | F431 -> printf "h_hww_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 | F123 -> printf "w_hhw_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 | F132 -> printf "w_hhw_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 | F231 -> printf "w_hhw_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 | F213 -> printf "w_hhw_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 | F312 -> printf "w_hhw_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 | F321 -> printf "w_hhw_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_Scalar2_Vector2_DP coeff -> let c = format_coupling coeff c in begin match fusion with | F234 | F134 -> printf "h_hww_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F342 | F341 -> printf "h_hww_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F423 | F413 -> printf "h_hww_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F243 | F143 -> printf "h_hww_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F324 | F314 -> printf "h_hww_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F432 | F431 -> printf "h_hww_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 | F124 -> printf "w_hhw_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F231 | F241-> printf "w_hhw_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F312 | F412 -> printf "w_hhw_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F132 | F142-> printf "w_hhw_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F213 | F214 -> printf "w_hhw_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F321 | F421 -> printf "w_hhw_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 (*i | F234 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "w_hhw_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 i*) end | Dim6_Scalar2_Vector2_PB coeff -> let c = format_coupling coeff c in begin match fusion with | F234 | F134 -> printf "h_hvv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F342 | F341 -> printf "h_hvv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F423 | F413 -> printf "h_hvv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F243 | F143 -> printf "h_hvv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F324 | F314 -> printf "h_hvv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F432 | F431 -> printf "h_hvv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 | F124 -> printf "v_hhv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F231 | F241-> printf "v_hhv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F312 | F412 -> printf "v_hhv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F132 | F142-> printf "v_hhv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F213 | F214 -> printf "v_hhv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F321 | F421 -> printf "v_hhv_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_HHZZ_T coeff -> let c = format_coupling coeff c in begin match fusion with | F234 | F134 -> printf "(%s)*(%s)*(%s)*(%s)" c wf1 wf2 wf3 | F342 | F341 -> printf "(%s)*(%s)*(%s)*(%s)" c wf3 wf1 wf2 | F423 | F413 -> printf "(%s)*(%s)*(%s)*(%s)" c wf2 wf3 wf1 | F243 | F143 -> printf "(%s)*(%s)*(%s)*(%s)" c wf1 wf3 wf2 | F324 | F314 -> printf "(%s)*(%s)*(%s)*(%s)" c wf2 wf1 wf3 | F432 | F431 -> printf "(%s)*(%s)*(%s)*(%s)" c wf3 wf2 wf1 | F123 | F124 | F231 | F241 | F312 | F412 -> printf "(%s)*(%s)*(%s)*(%s)" c wf1 wf2 wf3 | F132 | F142 | F213 | F214 | F321 | F421 -> printf "(%s)*(%s)*(%s)*(%s)" c wf1 wf2 wf3 end | Dim6_Vector4_DW coeff -> let c = format_coupling coeff c in begin match fusion with | F234 | F134 -> printf "a_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F342 | F341 -> printf "a_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F423 | F413 -> printf "a_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F243 | F143 -> printf "a_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F324 | F314 -> printf "a_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F432 | F431 -> printf "a_aww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 | F123 -> printf "w_aaw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F241 | F231 -> printf "w_aaw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F412 | F312 -> printf "w_aaw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F142 | F132 -> printf "w_aaw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F214 | F213 -> printf "w_aaw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F421 | F321 -> printf "w_aaw_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_Vector4_W coeff -> let c = format_coupling coeff c in begin match fusion with | F234 | F134 -> printf "a_aww_W(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F342 | F341 -> printf "a_aww_W(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F423 | F413 -> printf "a_aww_W(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F243 | F143 -> printf "a_aww_W(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F324 | F314 -> printf "a_aww_W(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F432 | F431 -> printf "a_aww_W(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 | F124 -> printf "w_aaw_W(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F231 | F241-> printf "w_aaw_W(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F312 | F412 -> printf "w_aaw_W(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F132 | F142-> printf "w_aaw_W(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F213 | F214 -> printf "w_aaw_W(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F321 | F421 -> printf "w_aaw_W(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_HWWZ_DW coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "h_wwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "h_wwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "h_wwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "h_wwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "h_wwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "h_wwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "(-1)*w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "(-1)*w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "(-1)*w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "(-1)*w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "(-1)*w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "(-1)*w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "w_hwz_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_hww_DW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_HWWZ_DPB coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "h_wwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "h_wwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "h_wwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "h_wwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "h_wwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "h_wwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "(-1)*w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "(-1)*w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "(-1)*w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "(-1)*w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "(-1)*w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "(-1)*w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "w_hwz_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_hww_DPB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_HWWZ_DDPW coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "h_wwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "h_wwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "h_wwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "h_wwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "h_wwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "h_wwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "(-1)*w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "(-1)*w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "(-1)*w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "(-1)*w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "(-1)*w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "(-1)*w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "w_hwz_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_hww_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_hww_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_hww_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_hww_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_hww_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_hww_DDPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_HWWZ_DPW coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "h_wwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "h_wwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "h_wwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "h_wwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "h_wwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "h_wwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "(-1)*w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "(-1)*w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "(-1)*w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "(-1)*w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "(-1)*w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "(-1)*w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "w_hwz_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_hww_DPW(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_AHHZ_D coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "a_hhz_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "a_hhz_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "a_hhz_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "a_hhz_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "a_hhz_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "a_hhz_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_ahz_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_ahh_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_ahh_D(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_ahh_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_ahh_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_ahh_D(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_ahh_D(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_AHHZ_DP coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "a_hhz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "a_hhz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "a_hhz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "a_hhz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "a_hhz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "a_hhz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_ahz_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_ahh_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_ahh_DP(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_ahh_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_ahh_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_ahh_DP(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_ahh_DP(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end | Dim6_AHHZ_PB coeff -> let c = format_coupling coeff c in begin match fusion with | F234 -> printf "a_hhz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F243 -> printf "a_hhz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F342 -> printf "a_hhz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F324 -> printf "a_hhz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F423 -> printf "a_hhz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F432 -> printf "a_hhz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F124 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F142 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F241 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F214 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F412 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F421 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F134 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F143 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F341 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F314 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F413 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F431 -> printf "h_ahz_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 | F123 -> printf "z_ahh_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf2 p2 wf3 p3 | F132 -> printf "z_ahh_PB(%s,%s,%s,%s,%s,%s,%s)" c wf1 p1 wf3 p3 wf2 p2 | F231 -> printf "z_ahh_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf1 p1 wf2 p2 | F213 -> printf "z_ahh_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf1 p1 wf3 p3 | F312 -> printf "z_ahh_PB(%s,%s,%s,%s,%s,%s,%s)" c wf2 p2 wf3 p3 wf1 p1 | F321 -> printf "z_ahh_PB(%s,%s,%s,%s,%s,%s,%s)" c wf3 p3 wf2 p2 wf1 p1 end (* \begin{dubious} In principle, [p4] could be obtained from the left hand side \ldots \end{dubious} *) | DScalar4 contractions -> let p123 = Printf.sprintf "(-%s-%s-%s)" p1 p2 p3 in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar4 []" | head :: tail -> printf "("; print_dscalar4 c wf1 wf2 wf3 p1 p2 p3 p123 fusion head; List.iter (print_add_dscalar4 c wf1 wf2 wf3 p1 p2 p3 p123 fusion) tail; printf ")" end | DScalar2_Vector2 contractions -> let p123 = Printf.sprintf "(-%s-%s-%s)" p1 p2 p3 in begin match contractions with | [] -> invalid_arg "Targets.print_current: DScalar4 []" | head :: tail -> printf "("; print_dscalar2_vector2 c wf1 wf2 wf3 p1 p2 p3 p123 fusion head; List.iter (print_add_dscalar2_vector2 c wf1 wf2 wf3 p1 p2 p3 p123 fusion) tail; printf ")" end end (* \begin{dubious} This reproduces the hack on page~\pageref{hack:sign(V4)} and gives the correct results up to quartic vertices. Make sure that it is also correct in light of~\eqref{eq:factors-of-i}, i.\,e. \begin{equation*} \ii T = \ii^{\#\text{vertices}}\ii^{\#\text{propagators}} \cdots = \ii^{n-2}\ii^{n-3} \cdots = -\ii(-1)^n \cdots \end{equation*} \end{dubious} *) - | Vn (UFO (c, v, s, _, color), fusion, constant) -> + | Vn (UFO (c, v, s, fl, color), fusion, constant) -> if Color.Vertex.trivial color then let g = CM.constant_symbol constant and chn = F.children rhs in let wfs = List.map (multiple_variable amplitude dictionary) chn and ps = List.map momentum chn in let n = List.length fusion in let eps = if n mod 2 = 0 then -1 else 1 in printf "@, %s " (if (eps * F.sign rhs) < 0 then "-" else "+"); - UFO.Targets.Fortran.fuse c v s g wfs ps fusion + UFO.Targets.Fortran.fuse c v s fl g wfs ps fusion else failwith "print_current: nontrivial color structure" let print_propagator f p m gamma = let minus_third = "(-1.0_" ^ !kind ^ "/3.0_" ^ !kind ^ ")" in let w = begin match CM.width f with | Vanishing | Fudged -> "0.0_" ^ !kind | Constant | Complex_Mass -> gamma | Timelike -> "wd_tl(" ^ p ^ "," ^ gamma ^ ")" | Running -> "wd_run(" ^ p ^ "," ^ m ^ "," ^ gamma ^ ")" | Custom f -> f ^ "(" ^ p ^ "," ^ gamma ^ ")" end in let cms = begin match CM.width f with | Complex_Mass -> ".true." | _ -> ".false." end in match CM.propagator f with | Prop_Scalar -> printf "pr_phi(%s,%s,%s," p m w | Prop_Col_Scalar -> printf "%s * pr_phi(%s,%s,%s," minus_third p m w | Prop_Ghost -> printf "(0,1) * pr_phi(%s, %s, %s," p m w | Prop_Spinor -> printf "%s(%s,%s,%s,%s," Fermions.psi_propagator p m w cms | Prop_ConjSpinor -> printf "%s(%s,%s,%s,%s," Fermions.psibar_propagator p m w cms | Prop_Majorana -> printf "%s(%s,%s,%s,%s," Fermions.chi_propagator p m w cms | Prop_Col_Majorana -> printf "%s * %s(%s,%s,%s,%s," minus_third Fermions.chi_propagator p m w cms | Prop_Unitarity -> printf "pr_unitarity(%s,%s,%s,%s," p m w cms | Prop_Col_Unitarity -> printf "%s * pr_unitarity(%s,%s,%s,%s," minus_third p m w cms | Prop_Feynman -> printf "pr_feynman(%s," p | Prop_Col_Feynman -> printf "%s * pr_feynman(%s," minus_third p | Prop_Gauge xi -> printf "pr_gauge(%s,%s," p (CM.gauge_symbol xi) | Prop_Rxi xi -> printf "pr_rxi(%s,%s,%s,%s," p m w (CM.gauge_symbol xi) | Prop_Tensor_2 -> printf "pr_tensor(%s,%s,%s," p m w | Prop_Tensor_pure -> printf "pr_tensor_pure(%s,%s,%s," p m w | Prop_Vector_pure -> printf "pr_vector_pure(%s,%s,%s," p m w | Prop_Vectorspinor -> printf "pr_grav(%s,%s,%s," p m w | Aux_Scalar | Aux_Spinor | Aux_ConjSpinor | Aux_Majorana | Aux_Vector | Aux_Tensor_1 -> printf "(" | Aux_Col_Scalar | Aux_Col_Vector | Aux_Col_Tensor_1 -> printf "%s * (" minus_third | Only_Insertion -> printf "(" | Prop_UFO name -> printf "pr_U_%s(%s,%s,%s," name p m w let print_projector f p m gamma = let minus_third = "(-1.0_" ^ !kind ^ "/3.0_" ^ !kind ^ ")" in match CM.propagator f with | Prop_Scalar -> printf "pj_phi(%s,%s," m gamma | Prop_Col_Scalar -> printf "%s * pj_phi(%s,%s," minus_third m gamma | Prop_Ghost -> printf "(0,1) * pj_phi(%s,%s," m gamma | Prop_Spinor -> printf "%s(%s,%s,%s," Fermions.psi_projector p m gamma | Prop_ConjSpinor -> printf "%s(%s,%s,%s," Fermions.psibar_projector p m gamma | Prop_Majorana -> printf "%s(%s,%s,%s," Fermions.chi_projector p m gamma | Prop_Col_Majorana -> printf "%s * %s(%s,%s,%s," minus_third Fermions.chi_projector p m gamma | Prop_Unitarity -> printf "pj_unitarity(%s,%s,%s," p m gamma | Prop_Col_Unitarity -> printf "%s * pj_unitarity(%s,%s,%s," minus_third p m gamma | Prop_Feynman | Prop_Col_Feynman -> invalid_arg "no on-shell Feynman propagator!" | Prop_Gauge _ -> invalid_arg "no on-shell massless gauge propagator!" | Prop_Rxi _ -> invalid_arg "no on-shell Rxi propagator!" | Prop_Vectorspinor -> printf "pj_grav(%s,%s,%s," p m gamma | Prop_Tensor_2 -> printf "pj_tensor(%s,%s,%s," p m gamma | Prop_Tensor_pure -> invalid_arg "no on-shell pure Tensor propagator!" | Prop_Vector_pure -> invalid_arg "no on-shell pure Vector propagator!" | Aux_Scalar | Aux_Spinor | Aux_ConjSpinor | Aux_Majorana | Aux_Vector | Aux_Tensor_1 -> printf "(" | Aux_Col_Scalar | Aux_Col_Vector | Aux_Col_Tensor_1 -> printf "%s * (" minus_third | Only_Insertion -> printf "(" | Prop_UFO name -> invalid_arg "no on shell UFO propagator" let print_gauss f p m gamma = let minus_third = "(-1.0_" ^ !kind ^ "/3.0_" ^ !kind ^ ")" in match CM.propagator f with | Prop_Scalar -> printf "pg_phi(%s,%s,%s," p m gamma | Prop_Ghost -> printf "(0,1) * pg_phi(%s,%s,%s," p m gamma | Prop_Spinor -> printf "%s(%s,%s,%s," Fermions.psi_projector p m gamma | Prop_ConjSpinor -> printf "%s(%s,%s,%s," Fermions.psibar_projector p m gamma | Prop_Majorana -> printf "%s(%s,%s,%s," Fermions.chi_projector p m gamma | Prop_Col_Majorana -> printf "%s * %s(%s,%s,%s," minus_third Fermions.chi_projector p m gamma | Prop_Unitarity -> printf "pg_unitarity(%s,%s,%s," p m gamma | Prop_Feynman | Prop_Col_Feynman -> invalid_arg "no on-shell Feynman propagator!" | Prop_Gauge _ -> invalid_arg "no on-shell massless gauge propagator!" | Prop_Rxi _ -> invalid_arg "no on-shell Rxi propagator!" | Prop_Tensor_2 -> printf "pg_tensor(%s,%s,%s," p m gamma | Prop_Tensor_pure -> invalid_arg "no pure tensor propagator!" | Prop_Vector_pure -> invalid_arg "no pure vector propagator!" | Aux_Scalar | Aux_Spinor | Aux_ConjSpinor | Aux_Majorana | Aux_Vector | Aux_Tensor_1 -> printf "(" | Only_Insertion -> printf "(" | Prop_UFO name -> invalid_arg "no UFO gauss insertion" | _ -> invalid_arg "targets:print_gauss: not available" let print_fusion_diagnostics amplitude dictionary fusion = if warn diagnose_gauge then begin let lhs = F.lhs fusion in let f = F.flavor lhs and v = variable lhs and p = momentum lhs in let mass = CM.mass_symbol f in match CM.propagator f with | Prop_Gauge _ | Prop_Feynman | Prop_Rxi _ | Prop_Unitarity -> printf " @[<2>%s =" v; List.iter (print_current amplitude dictionary) (F.rhs fusion); nl (); begin match CM.goldstone f with | None -> printf " call omega_ward_%s(\"%s\",%s,%s,%s)" (suffix diagnose_gauge) v mass p v; nl () | Some (g, phase) -> let gv = add_tag lhs (CM.flavor_symbol g ^ "_" ^ format_p lhs) in printf " call omega_slavnov_%s" (suffix diagnose_gauge); printf "(@[\"%s\",%s,%s,%s,@,%s*%s)" v mass p v (format_constant phase) gv; nl () end | _ -> () end let print_fusion amplitude dictionary fusion = let lhs = F.lhs fusion in let f = F.flavor lhs in printf " @[<2>%s =@, " (multiple_variable amplitude dictionary lhs); if F.on_shell amplitude lhs then print_projector f (momentum lhs) (CM.mass_symbol f) (CM.width_symbol f) else if F.is_gauss amplitude lhs then print_gauss f (momentum lhs) (CM.mass_symbol f) (CM.width_symbol f) else print_propagator f (momentum lhs) (CM.mass_symbol f) (CM.width_symbol f); List.iter (print_current amplitude dictionary) (F.rhs fusion); printf ")"; nl () let print_momenta seen_momenta amplitude = List.fold_left (fun seen f -> let wf = F.lhs f in let p = F.momentum_list wf in if not (PSet.mem p seen) then begin let rhs1 = List.hd (F.rhs f) in printf " %s = %s" (momentum wf) (String.concat " + " (List.map momentum (F.children rhs1))); nl () end; PSet.add p seen) seen_momenta (F.fusions amplitude) let print_fusions dictionary fusions = List.iter (fun (f, amplitude) -> print_fusion_diagnostics amplitude dictionary f; print_fusion amplitude dictionary f) fusions +(* \begin{dubious} + The following will need a bit more work, because + the decision when to [reverse_braket] for UFO models + with Majorana fermions needs collaboration + from [UFO.Targets.Fortran.fuse] which is called by + [print_current]. See the function + [UFO_targets.Fortran.jrr_print_majorana_current_transposing] + for illustration (the function is never used and only for + documentation). + \end{dubious} *) + + let spins_of_rhs rhs = + List.map (fun wf -> CM.lorentz (F.flavor wf)) (F.children rhs) + + let spins_of_ket ket = + match ThoList.uniq (List.map spins_of_rhs ket) with + | [spins] -> spins + | [] -> failwith "Targets.Fortran.spins_of_ket: empty" + | _ -> [] (* HACK! *) + let print_braket amplitude dictionary name braket = let bra = F.bra braket and ket = F.ket braket in + let spin_bra = CM.lorentz (F.flavor bra) + and spins_ket = spins_of_ket ket in + let vintage = true (* [F.vintage] *) in printf " @[<2>%s = %s@, + " name name; - begin match Fermions.reverse_braket (CM.lorentz (F.flavor bra)) with - | false -> - printf "%s*@,(" (multiple_variable amplitude dictionary bra); - List.iter (print_current amplitude dictionary) ket; - printf ")" - | true -> + if Fermions.reverse_braket vintage spin_bra spins_ket then + begin printf "@,("; List.iter (print_current amplitude dictionary) ket; printf ")*%s" (multiple_variable amplitude dictionary bra) - end; nl () + end + else + begin + printf "%s*@,(" (multiple_variable amplitude dictionary bra); + List.iter (print_current amplitude dictionary) ket; + printf ")" + end; + nl () (* \begin{equation} \label{eq:factors-of-i} \ii T = \ii^{\#\text{vertices}}\ii^{\#\text{propagators}} \cdots = \ii^{n-2}\ii^{n-3} \cdots = -\ii(-1)^n \cdots \end{equation} *) (* \begin{dubious} [tho:] we write some brakets twice using different names. Is it useful to cache them? \end{dubious} *) let print_brakets dictionary amplitude = let name = flavors_symbol (flavors amplitude) in printf " %s = 0" name; nl (); List.iter (print_braket amplitude dictionary name) (F.brakets amplitude); let n = List.length (F.externals amplitude) in if n mod 2 = 0 then begin printf " @[<2>%s =@, - %s ! %d vertices, %d propagators" name name (n - 2) (n - 3); nl () end else begin printf " ! %s = %s ! %d vertices, %d propagators" name name (n - 2) (n - 3); nl () end; let s = F.symmetry amplitude in if s > 1 then printf " @[<2>%s =@, %s@, / sqrt(%d.0_%s) ! symmetry factor" name name s !kind else printf " ! unit symmetry factor"; nl () let print_incoming wf = let p = momentum wf and s = spin wf and f = F.flavor wf in let m = CM.mass_symbol f in match CM.lorentz f with | Scalar -> printf "1" | BRS Scalar -> printf "(0,-1) * (%s * %s - %s**2)" p p m | Spinor -> printf "%s (%s, - %s, %s)" Fermions.psi_incoming m p s | BRS Spinor -> printf "%s (%s, - %s, %s)" Fermions.brs_psi_incoming m p s | ConjSpinor -> printf "%s (%s, - %s, %s)" Fermions.psibar_incoming m p s | BRS ConjSpinor -> printf "%s (%s, - %s, %s)" Fermions.brs_psibar_incoming m p s | Majorana -> printf "%s (%s, - %s, %s)" Fermions.chi_incoming m p s | Maj_Ghost -> printf "ghost (%s, - %s, %s)" m p s | BRS Majorana -> printf "%s (%s, - %s, %s)" Fermions.brs_chi_incoming m p s | Vector | Massive_Vector -> printf "eps (%s, - %s, %s)" m p s (*i | Ward_Vector -> printf "%s" p i*) | BRS Vector | BRS Massive_Vector -> printf "(0,1) * (%s * %s - %s**2) * eps (%s, -%s, %s)" p p m m p s | Vectorspinor | BRS Vectorspinor -> printf "%s (%s, - %s, %s)" Fermions.grav_incoming m p s | Tensor_1 -> invalid_arg "Tensor_1 only internal" | Tensor_2 -> printf "eps2 (%s, - %s, %s)" m p s | _ -> invalid_arg "no such BRST transformations" let print_outgoing wf = let p = momentum wf and s = spin wf and f = F.flavor wf in let m = CM.mass_symbol f in match CM.lorentz f with | Scalar -> printf "1" | BRS Scalar -> printf "(0,-1) * (%s * %s - %s**2)" p p m | Spinor -> printf "%s (%s, %s, %s)" Fermions.psi_outgoing m p s | BRS Spinor -> printf "%s (%s, %s, %s)" Fermions.brs_psi_outgoing m p s | ConjSpinor -> printf "%s (%s, %s, %s)" Fermions.psibar_outgoing m p s | BRS ConjSpinor -> printf "%s (%s, %s, %s)" Fermions.brs_psibar_outgoing m p s | Majorana -> printf "%s (%s, %s, %s)" Fermions.chi_outgoing m p s | BRS Majorana -> printf "%s (%s, %s, %s)" Fermions.brs_chi_outgoing m p s | Maj_Ghost -> printf "ghost (%s, %s, %s)" m p s | Vector | Massive_Vector -> printf "conjg (eps (%s, %s, %s))" m p s (*i | Ward_Vector -> printf "%s" p i*) | BRS Vector | BRS Massive_Vector -> printf "(0,1) * (%s*%s-%s**2) * (conjg (eps (%s, %s, %s)))" p p m m p s | Vectorspinor | BRS Vectorspinor -> printf "%s (%s, %s, %s)" Fermions.grav_incoming m p s | Tensor_1 -> invalid_arg "Tensor_1 only internal" | Tensor_2 -> printf "conjg (eps2 (%s, %s, %s))" m p s | BRS _ -> invalid_arg "no such BRST transformations" (*i unused value let twice_spin wf = match CM.lorentz (F.flavor wf) with | Scalar | BRS Scalar -> "0" | Spinor | ConjSpinor | Majorana | Maj_Ghost | Vectorspinor | BRS Spinor | BRS ConjSpinor | BRS Majorana | BRS Vectorspinor -> "1" | Vector | BRS Vector | Massive_Vector | BRS Massive_Vector -> "2" | Tensor_1 -> "2" | Tensor_2 -> "4" | BRS _ -> invalid_arg "Targets.twice_spin: no such BRST transformation" i*) (*i unused value let print_argument_diagnostics amplitude = let externals = (F.externals amplitude) in let n = List.length externals and masses = List.map (fun wf -> CM.mass_symbol (F.flavor wf)) externals in if warn diagnose_arguments then begin printf " call omega_check_arguments_%s (%d, k)" (suffix diagnose_arguments) n; nl () end; if warn diagnose_momenta then begin printf " @[<2>call omega_check_momenta_%s ((/ " (suffix diagnose_momenta); print_list masses; printf " /), k)"; nl () end i*) let print_external_momenta amplitude = let externals = List.combine (F.externals amplitude) (List.map (fun _ -> true) (F.incoming amplitude) @ List.map (fun _ -> false) (F.outgoing amplitude)) in List.iter (fun (wf, incoming) -> if incoming then printf " %s = - k(:,%d) ! incoming" (momentum wf) (ext_momentum wf) else printf " %s = k(:,%d) ! outgoing" (momentum wf) (ext_momentum wf); nl ()) externals let print_externals seen_wfs amplitude = let externals = List.combine (F.externals amplitude) (List.map (fun _ -> true) (F.incoming amplitude) @ List.map (fun _ -> false) (F.outgoing amplitude)) in List.fold_left (fun seen (wf, incoming) -> if not (WFSet.mem wf seen) then begin printf " @[<2>%s =@, " (variable wf); (if incoming then print_incoming else print_outgoing) wf; nl () end; WFSet.add wf seen) seen_wfs externals (*i unused value let flavors_to_string flavors = String.concat " " (List.map CM.flavor_to_string flavors) i*) (*i unused value let process_to_string amplitude = flavors_to_string (F.incoming amplitude) ^ " -> " ^ flavors_to_string (F.outgoing amplitude) i*) let flavors_sans_color_to_string flavors = String.concat " " (List.map M.flavor_to_string flavors) let process_sans_color_to_string (fin, fout) = flavors_sans_color_to_string fin ^ " -> " ^ flavors_sans_color_to_string fout let print_fudge_factor amplitude = let name = flavors_symbol (flavors amplitude) in List.iter (fun wf -> let p = momentum wf and f = F.flavor wf in match CM.width f with | Fudged -> let m = CM.mass_symbol f and w = CM.width_symbol f in printf " if (%s > 0.0_%s) then" w !kind; nl (); printf " @[<2>%s = %s@ * (%s*%s - %s**2)" name name p p m; printf "@ / cmplx (%s*%s - %s**2, %s*%s, kind=%s)" p p m m w !kind; nl (); printf " end if"; nl () | _ -> ()) (F.s_channel amplitude) let num_helicities amplitudes = List.length (CF.helicities amplitudes) (* \thocwmodulesubsection{Spin, Flavor \&\ Color Tables} *) (* The following abomination is required to keep the number of continuation lines as low as possible. FORTRAN77-style \texttt{DATA} statements are actually a bit nicer here, but they are nor available for \emph{constant} arrays. *) (* \begin{dubious} We used to have a more elegant design with a sentinel~0 added to each initializer, but some revisions of the Compaq/Digital Compiler have a bug that causes it to reject this variant. \end{dubious} *) (* \begin{dubious} The actual table writing code using \texttt{reshape} should be factored, since it's the same algorithm every time. \end{dubious} *) let print_integer_parameter name value = printf " @[<2>integer, parameter :: %s = %d" name value; nl () let print_real_parameter name value = printf " @[<2>real(kind=%s), parameter :: %s = %d" !kind name value; nl () let print_logical_parameter name value = printf " @[<2>logical, parameter :: %s = .%s." name (if value then "true" else "false"); nl () let num_particles_in amplitudes = match CF.flavors amplitudes with | [] -> 0 | (fin, _) :: _ -> List.length fin let num_particles_out amplitudes = match CF.flavors amplitudes with | [] -> 0 | (_, fout) :: _ -> List.length fout let num_particles amplitudes = match CF.flavors amplitudes with | [] -> 0 | (fin, fout) :: _ -> List.length fin + List.length fout module CFlow = Color.Flow let num_color_flows amplitudes = List.length (CF.color_flows amplitudes) let num_color_indices_default = 2 (* Standard model *) let num_color_indices amplitudes = try CFlow.rank (List.hd (CF.color_flows amplitudes)) with _ -> num_color_indices_default let color_to_string c = "(" ^ (String.concat "," (List.map (Printf.sprintf "%3d") c)) ^ ")" let cflow_to_string cflow = String.concat " " (List.map color_to_string (CFlow.in_to_lists cflow)) ^ " -> " ^ String.concat " " (List.map color_to_string (CFlow.out_to_lists cflow)) let protected = ", protected" (* Fortran 2003! *) (*i unused value let print_spin_table_old abbrev name = function | [] -> printf " @[<2>integer, dimension(n_prt,0) ::"; printf "@ table_spin_%s" name; nl () | _ :: tuples' as tuples -> ignore (List.fold_left (fun i (tuple1, tuple2) -> printf " @[<2>integer, dimension(n_prt), parameter, private ::"; printf "@ %s%04d = (/ %s /)" abbrev i (String.concat ", " (List.map (Printf.sprintf "%2d") (tuple1 @ tuple2))); nl (); succ i) 1 tuples); printf " @[<2>integer, dimension(n_prt,n_hel), parameter ::"; printf "@ table_spin_%s =@ reshape ( (/" name; printf "@ %s%04d" abbrev 1; ignore (List.fold_left (fun i tuple -> printf ",@ %s%04d" abbrev i; succ i) 2 tuples'); printf "@ /), (/ n_prt, n_hel /) )"; nl () i*) let print_spin_table name tuples = printf " @[<2>integer, dimension(n_prt,n_hel), save%s :: table_spin_%s" protected name; nl (); match tuples with | [] -> () | _ -> ignore (List.fold_left (fun i (tuple1, tuple2) -> printf " @[<2>data table_spin_%s(:,%4d) / %s /" name i (String.concat ", " (List.map (Printf.sprintf "%2d") (tuple1 @ tuple2))); nl (); succ i) 1 tuples) let print_spin_tables amplitudes = (* [print_spin_table_old "s" "states_old" (CF.helicities amplitudes);] *) print_spin_table "states" (CF.helicities amplitudes); nl () (*i unused value let print_flavor_table_old n abbrev name = function | [] -> printf " @[<2>integer, dimension(n_prt,0) ::"; printf "@ table_flavor_%s" name; nl () | _ :: tuples' as tuples -> ignore (List.fold_left (fun i tuple -> printf " @[<2>integer, dimension(n_prt), parameter, private ::"; printf "@ %s%04d = (/ %s /) ! %s" abbrev i (String.concat ", " (List.map (fun f -> Printf.sprintf "%3d" (M.pdg f)) tuple)) (String.concat " " (List.map M.flavor_to_string tuple)); nl (); succ i) 1 tuples); printf " @[<2>integer, dimension(n_prt,n_flv), parameter ::"; printf "@ table_flavor_%s =@ reshape ( (/" name; printf "@ %s%04d" abbrev 1; ignore (List.fold_left (fun i tuple -> printf ",@ %s%04d" abbrev i; succ i) 2 tuples'); printf "@ /), (/ n_prt, n_flv /) )"; nl () i*) let print_flavor_table name tuples = printf " @[<2>integer, dimension(n_prt,n_flv), save%s :: table_flavor_%s" protected name; nl (); match tuples with | [] -> () | _ -> ignore (List.fold_left (fun i tuple -> printf " @[<2>data table_flavor_%s(:,%4d) / %s / ! %s" name i (String.concat ", " (List.map (fun f -> Printf.sprintf "%3d" (M.pdg f)) tuple)) (String.concat " " (List.map M.flavor_to_string tuple)); nl (); succ i) 1 tuples) let print_flavor_tables amplitudes = (* [let n = num_particles amplitudes in] *) (* [print_flavor_table_old n "f" "states_old" (List.map (fun (fin, fout) -> fin @ fout) (CF.flavors amplitudes));] *) print_flavor_table "states" (List.map (fun (fin, fout) -> fin @ fout) (CF.flavors amplitudes)); nl () let num_flavors amplitudes = List.length (CF.flavors amplitudes) (*i unused value let print_color_flows_table_old abbrev = function | [] -> printf " @[<2>integer, dimension(n_cindex, n_prt, n_cflow) ::"; printf "@ table_color_flows"; nl () | _ :: tuples' as tuples -> ignore (List.fold_left (fun i tuple -> printf " @[<2>integer, dimension(n_cindex, n_prt), parameter, private ::"; printf "@ %s%04d = reshape ( (/ " abbrev i; begin match CFlow.to_lists tuple with | [] -> () | cf1 :: cfn -> printf "@ %s" (String.concat "," (List.map string_of_int cf1)); List.iter (function cf -> printf ",@ %s" (String.concat "," (List.map string_of_int cf))) cfn end; printf "@ /),@ (/ n_cindex, n_prt /) )"; nl (); succ i) 1 tuples); printf " @[<2>integer, dimension(n_cindex, n_prt, n_cflow), parameter ::"; printf "@ table_color_flows_old =@ reshape ( (/"; printf "@ %s%04d" abbrev 1; ignore (List.fold_left (fun i tuple -> printf ",@ %s%04d" abbrev i; succ i) 2 tuples'); printf "@ /),@ (/ n_cindex, n_prt, n_cflow /) )"; nl () i*) (*i unused value let print_ghost_flags_table_old abbrev = function | [] -> printf " @[<2>logical, dimension(n_prt, n_cflow) ::"; printf "@ table_ghost_flags"; nl () | _ :: tuples' as tuples -> ignore (List.fold_left (fun i tuple -> printf " @[<2>logical, dimension(n_prt), parameter, private ::"; printf "@ %s%04d = (/ " abbrev i; begin match CFlow.ghost_flags tuple with | [] -> () | gf1 :: gfn -> printf "@ %s" (if gf1 then "T" else "F"); List.iter (function gf -> printf ",@ %s" (if gf then "T" else "F")) gfn end; printf "@ /)"; nl (); succ i) 1 tuples); printf " @[<2>logical, dimension(n_prt, n_cflow), parameter ::"; printf "@ table_ghost_flags_old =@ reshape ( (/"; printf "@ %s%04d" abbrev 1; ignore (List.fold_left (fun i tuple -> printf ",@ %s%04d" abbrev i; succ i) 2 tuples'); printf "@ /),@ (/ n_prt, n_cflow /) )"; nl () i*) let print_color_flows_table tuples = printf " @[<2>integer, dimension(n_cindex,n_prt,n_cflow), save%s :: table_color_flows" protected; nl (); match tuples with | [] -> () | _ :: _ as tuples -> ignore (List.fold_left (fun i tuple -> begin match CFlow.to_lists tuple with | [] -> () | cf1 :: cfn -> printf " @[<2>data table_color_flows(:,:,%4d) /" i; printf "@ %s" (String.concat "," (List.map string_of_int cf1)); List.iter (function cf -> printf ",@ %s" (String.concat "," (List.map string_of_int cf))) cfn; printf "@ /"; nl () end; succ i) 1 tuples) let print_ghost_flags_table tuples = printf " @[<2>logical, dimension(n_prt,n_cflow), save%s :: table_ghost_flags" protected; nl (); match tuples with | [] -> () | _ -> ignore (List.fold_left (fun i tuple -> begin match CFlow.ghost_flags tuple with | [] -> () | gf1 :: gfn -> printf " @[<2>data table_ghost_flags(:,%4d) /" i; printf "@ %s" (if gf1 then "T" else "F"); List.iter (function gf -> printf ",@ %s" (if gf then "T" else "F")) gfn; printf " /"; nl () end; succ i) 1 tuples) let format_power_of x { Color.Flow.num = num; Color.Flow.den = den; Color.Flow.power = pwr } = match num, den, pwr with | _, 0, _ -> invalid_arg "format_power_of: zero denominator" | 0, _, _ -> "+zero" | 1, 1, 0 | -1, -1, 0 -> "+one" | -1, 1, 0 | 1, -1, 0 -> "-one" | 1, 1, 1 | -1, -1, 1 -> "+" ^ x | -1, 1, 1 | 1, -1, 1 -> "-" ^ x | 1, 1, -1 | -1, -1, -1 -> "+1/" ^ x | -1, 1, -1 | 1, -1, -1 -> "-1/" ^ x | 1, 1, p | -1, -1, p -> "+" ^ (if p > 0 then "" else "1/") ^ x ^ "**" ^ string_of_int (abs p) | -1, 1, p | 1, -1, p -> "-" ^ (if p > 0 then "" else "1/") ^ x ^ "**" ^ string_of_int (abs p) | n, 1, 0 -> (if n < 0 then "-" else "+") ^ string_of_int (abs n) ^ ".0_" ^ !kind | n, d, 0 -> (if n * d < 0 then "-" else "+") ^ string_of_int (abs n) ^ ".0_" ^ !kind ^ "/" ^ string_of_int (abs d) | n, 1, 1 -> (if n < 0 then "-" else "+") ^ string_of_int (abs n) ^ "*" ^ x | n, 1, -1 -> (if n < 0 then "-" else "+") ^ string_of_int (abs n) ^ "/" ^ x | n, d, 1 -> (if n * d < 0 then "-" else "+") ^ string_of_int (abs n) ^ ".0_" ^ !kind ^ "/" ^ string_of_int (abs d) ^ "*" ^ x | n, d, -1 -> (if n * d < 0 then "-" else "+") ^ string_of_int (abs n) ^ ".0_" ^ !kind ^ "/" ^ string_of_int (abs d) ^ "/" ^ x | n, 1, p -> (if n < 0 then "-" else "+") ^ string_of_int (abs n) ^ (if p > 0 then "*" else "/") ^ x ^ "**" ^ string_of_int (abs p) | n, d, p -> (if n * d < 0 then "-" else "+") ^ string_of_int (abs n) ^ ".0_" ^ !kind ^ "/" ^ string_of_int (abs d) ^ (if p > 0 then "*" else "/") ^ x ^ "**" ^ string_of_int (abs p) let format_powers_of x = function | [] -> "zero" | powers -> String.concat "" (List.map (format_power_of x) powers) (*i unused value let print_color_factor_table_old table = let n_cflow = Array.length table in let n_cfactors = ref 0 in for c1 = 0 to pred n_cflow do for c2 = 0 to pred n_cflow do match table.(c1).(c2) with | [] -> () | _ -> incr n_cfactors done done; print_integer_parameter "n_cfactors" !n_cfactors; if n_cflow <= 0 then begin printf " @[<2>type(%s), dimension(n_cfactors) ::" omega_color_factor_abbrev; printf "@ table_color_factors"; nl () end else begin printf " @[<2>type(%s), dimension(n_cfactors), parameter ::" omega_color_factor_abbrev; printf "@ table_color_factors = (/@ "; let comma = ref "" in for c1 = 0 to pred n_cflow do for c2 = 0 to pred n_cflow do match table.(c1).(c2) with | [] -> () | cf -> printf "%s@ %s(%d,%d,%s)" !comma omega_color_factor_abbrev (succ c1) (succ c2) (format_powers_of nc_parameter cf); comma := "," done done; printf "@ /)"; nl () end i*) (* \begin{dubious} We can optimize the following slightly by reusing common color factor [parameter]s. \end{dubious} *) let print_color_factor_table table = let n_cflow = Array.length table in let n_cfactors = ref 0 in for c1 = 0 to pred n_cflow do for c2 = 0 to pred n_cflow do match table.(c1).(c2) with | [] -> () | _ -> incr n_cfactors done done; print_integer_parameter "n_cfactors" !n_cfactors; printf " @[<2>type(%s), dimension(n_cfactors), save%s ::" omega_color_factor_abbrev protected; printf "@ table_color_factors"; nl (); let i = ref 1 in if n_cflow > 0 then begin for c1 = 0 to pred n_cflow do for c2 = 0 to pred n_cflow do match table.(c1).(c2) with | [] -> () | cf -> printf " @[<2>real(kind=%s), parameter, private :: color_factor_%06d = %s" !kind !i (format_powers_of nc_parameter cf); nl (); printf " @[<2>data table_color_factors(%6d) / %s(%d,%d,color_factor_%06d) /" !i omega_color_factor_abbrev (succ c1) (succ c2) !i; incr i; nl (); done done end let print_color_tables amplitudes = let cflows = CF.color_flows amplitudes and cfactors = CF.color_factors amplitudes in (* [print_color_flows_table_old "c" cflows; nl ();] *) print_color_flows_table cflows; nl (); (* [print_ghost_flags_table_old "g" cflows; nl ();] *) print_ghost_flags_table cflows; nl (); (* [print_color_factor_table_old cfactors; nl ();] *) print_color_factor_table cfactors; nl () let option_to_logical = function | Some _ -> "T" | None -> "F" (*i unused value let print_flavor_color_table_old abbrev n_flv n_cflow table = if n_flv <= 0 || n_cflow <= 0 then begin printf " @[<2>logical, dimension(n_flv, n_cflow) ::"; printf "@ flv_col_is_allowed"; nl () end else begin for c = 0 to pred n_cflow do printf " @[<2>logical, dimension(n_flv), parameter, private ::"; printf "@ %s%04d = (/@ %s" abbrev (succ c) (option_to_logical table.(0).(c)); for f = 1 to pred n_flv do printf ",@ %s" (option_to_logical table.(f).(c)) done; printf "@ /)"; nl () done; printf " @[<2>logical, dimension(n_flv, n_cflow), parameter ::"; printf "@ flv_col_is_allowed_old =@ reshape ( (/@ %s%04d" abbrev 1; for c = 1 to pred n_cflow do printf ",@ %s%04d" abbrev (succ c) done; printf "@ /),@ (/ n_flv, n_cflow /) )"; nl () end i*) let print_flavor_color_table n_flv n_cflow table = printf " @[<2>logical, dimension(n_flv, n_cflow), save%s :: @ flv_col_is_allowed" protected; nl (); if n_flv > 0 then begin for c = 0 to pred n_cflow do printf " @[<2>data flv_col_is_allowed(:,%4d) /" (succ c); printf "@ %s" (option_to_logical table.(0).(c)); for f = 1 to pred n_flv do printf ",@ %s" (option_to_logical table.(f).(c)) done; printf "@ /"; nl () done; end let print_amplitude_table a = (* [print_flavor_color_table_old "a" (num_flavors a) (List.length (CF.color_flows a)) (CF.process_table a); nl ();] *) print_flavor_color_table (num_flavors a) (List.length (CF.color_flows a)) (CF.process_table a); nl (); printf " @[<2>complex(kind=%s), dimension(n_flv, n_cflow, n_hel), save :: amp" !kind; nl (); nl () let print_helicity_selection_table () = printf " @[<2>logical, dimension(n_hel), save :: "; printf "hel_is_allowed = T"; nl (); printf " @[<2>real(kind=%s), dimension(n_hel), save :: " !kind; printf "hel_max_abs = 0"; nl (); printf " @[<2>real(kind=%s), save :: " !kind; printf "hel_sum_abs = 0, "; printf "hel_threshold = 1E10_%s" !kind; nl (); printf " @[<2>integer, save :: "; printf "hel_count = 0, "; printf "hel_cutoff = 100"; nl (); printf " @[<2>integer :: "; printf "i"; nl (); printf " @[<2>integer, save, dimension(n_hel) :: "; printf "hel_map = (/(i, i = 1, n_hel)/)"; nl (); printf " @[<2>integer, save :: hel_finite = n_hel"; nl (); nl () (* \thocwmodulesubsection{Optional MD5 sum function} *) let print_md5sum_functions = function | Some s -> printf " @[<5>"; if !fortran95 then printf "pure "; printf "function md5sum ()"; nl (); printf " character(len=32) :: md5sum"; nl (); printf " ! DON'T EVEN THINK of modifying the following line!"; nl (); printf " md5sum = \"%s\"" s; nl (); printf " end function md5sum"; nl (); nl () | None -> () (* \thocwmodulesubsection{Maintenance \&\ Inquiry Functions} *) let print_maintenance_functions () = if !whizard then begin printf " subroutine init (par, scheme)"; nl (); printf " real(kind=%s), dimension(*), intent(in) :: par" !kind; nl (); printf " integer, intent(in) :: scheme"; nl (); printf " call import_from_whizard (par, scheme)"; nl (); printf " end subroutine init"; nl (); nl (); printf " subroutine final ()"; nl (); printf " end subroutine final"; nl (); nl (); printf " subroutine update_alpha_s (alpha_s)"; nl (); printf " real(kind=%s), intent(in) :: alpha_s" !kind; nl (); printf " call model_update_alpha_s (alpha_s)"; nl (); printf " end subroutine update_alpha_s"; nl (); nl () end let print_inquiry_function_openmp () = begin printf " pure function openmp_supported () result (status)"; nl (); printf " logical :: status"; nl (); printf " status = %s" (if !openmp then ".true." else ".false."); nl (); printf " end function openmp_supported"; nl (); nl () end (*i unused value let print_inquiry_function_declarations name = printf " @[<2>public :: number_%s,@ %s" name name; nl () i*) (*i unused value let print_numeric_inquiry_functions () = printf " @[<5>"; if !fortran95 then printf "pure "; printf "function number_particles_in () result (n)"; nl (); printf " integer :: n"; nl (); printf " n = n_in"; nl (); printf " end function number_particles_in"; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "function number_particles_out () result (n)"; nl (); printf " integer :: n"; nl (); printf " n = n_out"; nl (); printf " end function number_particles_out"; nl (); nl () i*) let print_numeric_inquiry_functions (f, v) = printf " @[<5>"; if !fortran95 then printf "pure "; printf "function %s () result (n)" f; nl (); printf " integer :: n"; nl (); printf " n = %s" v; nl (); printf " end function %s" f; nl (); nl () let print_inquiry_functions name = printf " @[<5>"; if !fortran95 then printf "pure "; printf "function number_%s () result (n)" name; nl (); printf " integer :: n"; nl (); printf " n = size (table_%s, dim=2)" name; nl (); printf " end function number_%s" name; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "subroutine %s (a)" name; nl (); printf " integer, dimension(:,:), intent(out) :: a"; nl (); printf " a = table_%s" name; nl (); printf " end subroutine %s" name; nl (); nl () let print_color_flows () = printf " @[<5>"; if !fortran95 then printf "pure "; printf "function number_color_indices () result (n)"; nl (); printf " integer :: n"; nl (); printf " n = size (table_color_flows, dim=1)"; nl (); printf " end function number_color_indices"; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "function number_color_flows () result (n)"; nl (); printf " integer :: n"; nl (); printf " n = size (table_color_flows, dim=3)"; nl (); printf " end function number_color_flows"; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "subroutine color_flows (a, g)"; nl (); printf " integer, dimension(:,:,:), intent(out) :: a"; nl (); printf " logical, dimension(:,:), intent(out) :: g"; nl (); printf " a = table_color_flows"; nl (); printf " g = table_ghost_flags"; nl (); printf " end subroutine color_flows"; nl (); nl () let print_color_factors () = printf " @[<5>"; if !fortran95 then printf "pure "; printf "function number_color_factors () result (n)"; nl (); printf " integer :: n"; nl (); printf " n = size (table_color_factors)"; nl (); printf " end function number_color_factors"; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "subroutine color_factors (cf)"; nl (); printf " type(%s), dimension(:), intent(out) :: cf" omega_color_factor_abbrev; nl (); printf " cf = table_color_factors"; nl (); printf " end subroutine color_factors"; nl (); nl (); printf " @[<5>"; if !fortran95 && pure_unless_openmp then printf "pure "; printf "function color_sum (flv, hel) result (amp2)"; nl (); printf " integer, intent(in) :: flv, hel"; nl (); printf " real(kind=%s) :: amp2" !kind; nl (); printf " amp2 = real (omega_color_sum (flv, hel, amp, table_color_factors))"; nl (); printf " end function color_sum"; nl (); nl () let print_dispatch_functions () = printf " @[<5>"; printf "subroutine new_event (p)"; nl (); printf " real(kind=%s), dimension(0:3,*), intent(in) :: p" !kind; nl (); printf " logical :: mask_dirty"; nl (); printf " integer :: hel"; nl (); printf " call calculate_amplitudes (amp, p, hel_is_allowed)"; nl (); printf " if ((hel_threshold .gt. 0) .and. (hel_count .le. hel_cutoff)) then"; nl (); printf " call @[<3>omega_update_helicity_selection@ (hel_count,@ amp,@ "; printf "hel_max_abs,@ hel_sum_abs,@ hel_is_allowed,@ hel_threshold,@ hel_cutoff,@ mask_dirty)"; nl (); printf " if (mask_dirty) then"; nl (); printf " hel_finite = 0"; nl (); printf " do hel = 1, n_hel"; nl (); printf " if (hel_is_allowed(hel)) then"; nl (); printf " hel_finite = hel_finite + 1"; nl (); printf " hel_map(hel_finite) = hel"; nl (); printf " end if"; nl (); printf " end do"; nl (); printf " end if"; nl (); printf " end if"; nl (); printf " end subroutine new_event"; nl (); nl (); printf " @[<5>"; printf "subroutine reset_helicity_selection (threshold, cutoff)"; nl (); printf " real(kind=%s), intent(in) :: threshold" !kind; nl (); printf " integer, intent(in) :: cutoff"; nl (); printf " integer :: i"; nl (); printf " hel_is_allowed = T"; nl (); printf " hel_max_abs = 0"; nl (); printf " hel_sum_abs = 0"; nl (); printf " hel_count = 0"; nl (); printf " hel_threshold = threshold"; nl (); printf " hel_cutoff = cutoff"; nl (); printf " hel_map = (/(i, i = 1, n_hel)/)"; nl (); printf " hel_finite = n_hel"; nl (); printf " end subroutine reset_helicity_selection"; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "function is_allowed (flv, hel, col) result (yorn)"; nl (); printf " logical :: yorn"; nl (); printf " integer, intent(in) :: flv, hel, col"; nl (); printf " yorn = hel_is_allowed(hel) .and. "; printf "flv_col_is_allowed(flv,col)"; nl (); printf " end function is_allowed"; nl (); nl (); printf " @[<5>"; if !fortran95 then printf "pure "; printf "function get_amplitude (flv, hel, col) result (amp_result)"; nl (); printf " complex(kind=%s) :: amp_result" !kind; nl (); printf " integer, intent(in) :: flv, hel, col"; nl (); printf " amp_result = amp(flv, col, hel)"; nl (); printf " end function get_amplitude"; nl (); nl () (* \thocwmodulesubsection{Main Function} *) let format_power_of_nc { Color.Flow.num = num; Color.Flow.den = den; Color.Flow.power = pwr } = match num, den, pwr with | _, 0, _ -> invalid_arg "format_power_of_nc: zero denominator" | 0, _, _ -> "" | 1, 1, 0 | -1, -1, 0 -> "+ 1" | -1, 1, 0 | 1, -1, 0 -> "- 1" | 1, 1, 1 | -1, -1, 1 -> "+ N" | -1, 1, 1 | 1, -1, 1 -> "- N" | 1, 1, -1 | -1, -1, -1 -> "+ 1/N" | -1, 1, -1 | 1, -1, -1 -> "- 1/N" | 1, 1, p | -1, -1, p -> "+ " ^ (if p > 0 then "" else "1/") ^ "N^" ^ string_of_int (abs p) | -1, 1, p | 1, -1, p -> "- " ^ (if p > 0 then "" else "1/") ^ "N^" ^ string_of_int (abs p) | n, 1, 0 -> (if n < 0 then "- " else "+ ") ^ string_of_int (abs n) | n, d, 0 -> (if n * d < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ "/" ^ string_of_int (abs d) | n, 1, 1 -> (if n < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ "N" | n, 1, -1 -> (if n < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ "/N" | n, d, 1 -> (if n * d < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ "/" ^ string_of_int (abs d) ^ "N" | n, d, -1 -> (if n * d < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ "/" ^ string_of_int (abs d) ^ "/N" | n, 1, p -> (if n < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ (if p > 0 then "*" else "/") ^ "N^" ^ string_of_int (abs p) | n, d, p -> (if n * d < 0 then "- " else "+ ") ^ string_of_int (abs n) ^ "/" ^ string_of_int (abs d) ^ (if p > 0 then "*" else "/") ^ "N^" ^ string_of_int (abs p) let format_powers_of_nc = function | [] -> "0" | powers -> String.concat " " (List.map format_power_of_nc powers) let print_description cmdline amplitudes () = printf "! File generated automatically by O'Mega %s %s %s" Config.version Config.status Config.date; nl (); + List.iter (fun s -> printf "! %s" s; nl ()) (M.caveats ()); printf "!"; nl (); printf "! %s" cmdline; nl (); printf "!"; nl (); printf "! with all scattering amplitudes for the process(es)"; nl (); printf "!"; nl (); printf "! flavor combinations:"; nl (); printf "!"; nl (); ThoList.iteri (fun i process -> printf "! %3d: %s" i (process_sans_color_to_string process); nl ()) 1 (CF.flavors amplitudes); printf "!"; nl (); printf "! color flows:"; nl (); if not !amp_triv then begin printf "!"; nl (); ThoList.iteri (fun i cflow -> printf "! %3d: %s" i (cflow_to_string cflow); nl ()) 1 (CF.color_flows amplitudes); printf "!"; nl (); printf "! NB: i.g. not all color flows contribute to all flavor"; nl (); printf "! combinations. Consult the array FLV_COL_IS_ALLOWED"; nl (); printf "! below for the allowed combinations."; nl (); end; printf "!"; nl (); printf "! Color Factors:"; nl (); printf "!"; nl (); if not !amp_triv then begin let cfactors = CF.color_factors amplitudes in for c1 = 0 to pred (Array.length cfactors) do for c2 = 0 to c1 do match cfactors.(c1).(c2) with | [] -> () | cfactor -> printf "! (%3d,%3d): %s" (succ c1) (succ c2) (format_powers_of_nc cfactor); nl () done done; end; printf "!"; nl (); printf "! vanishing or redundant flavor combinations:"; nl (); printf "!"; nl (); List.iter (fun process -> printf "! %s" (process_sans_color_to_string process); nl ()) (CF.vanishing_flavors amplitudes); printf "!"; nl (); begin match CF.constraints amplitudes with | None -> () | Some s -> printf "! diagram selection (MIGHT BREAK GAUGE INVARIANCE!!!):"; nl (); printf "!"; nl (); printf "! %s" s; nl (); printf "!"; nl () end; printf "!"; nl () (* \thocwmodulesubsection{Printing Modules} *) type accessibility = | Public | Private | Protected (* Fortran 2003 *) let accessibility_to_string = function | Public -> "public" | Private -> "private" | Protected -> "protected" type used_symbol = | As_Is of string | Aliased of string * string let print_used_symbol = function | As_Is name -> printf "%s" name | Aliased (orig, alias) -> printf "%s => %s" alias orig type used_module = | Full of string | Full_Aliased of string * (string * string) list | Subset of string * used_symbol list let print_used_module = function | Full name | Full_Aliased (name, []) | Subset (name, []) -> printf " use %s" name; nl () | Full_Aliased (name, aliases) -> printf " @[<5>use %s" name; List.iter (fun (orig, alias) -> printf ", %s => %s" alias orig) aliases; nl () | Subset (name, used_symbol :: used_symbols) -> printf " @[<5>use %s, only: " name; print_used_symbol used_symbol; List.iter (fun s -> printf ", "; print_used_symbol s) used_symbols; nl () type fortran_module = { module_name : string; default_accessibility : accessibility; used_modules : used_module list; public_symbols : string list; print_declarations : (unit -> unit) list; print_implementations : (unit -> unit) list } let print_public = function | name1 :: names -> printf " @[<2>public :: %s" name1; List.iter (fun n -> printf ",@ %s" n) names; nl () | [] -> () (*i unused value let print_public_interface generic procedures = printf " public :: %s" generic; nl (); begin match procedures with | name1 :: names -> printf " interface %s" generic; nl (); printf " @[<2>module procedure %s" name1; List.iter (fun n -> printf ",@ %s" n) names; nl (); printf " end interface"; nl (); print_public procedures | [] -> () end i*) let print_module m = printf "module %s" m.module_name; nl (); List.iter print_used_module m.used_modules; printf " implicit none"; nl (); printf " %s" (accessibility_to_string m.default_accessibility); nl (); print_public m.public_symbols; nl (); begin match m.print_declarations with | [] -> () | print_declarations -> List.iter (fun f -> f ()) print_declarations; nl () end; begin match m.print_implementations with | [] -> () | print_implementations -> printf "contains"; nl (); nl (); List.iter (fun f -> f ()) print_implementations; nl (); end; printf "end module %s" m.module_name; nl () let print_modules modules = List.iter print_module modules; print_flush () let module_to_file line_length oc prelude m = output_string oc (m.module_name ^ "\n"); let filename = m.module_name ^ ".f90" in let channel = open_out filename in Format_Fortran.set_formatter_out_channel ~width:line_length channel; prelude (); print_modules [m]; close_out channel let modules_to_file line_length oc prelude = function | [] -> () | m :: mlist -> module_to_file line_length oc prelude m; List.iter (module_to_file line_length oc (fun () -> ())) mlist (* \thocwmodulesubsection{Chopping Up Amplitudes} *) let num_fusions_brakets size amplitudes = let num_fusions = max 1 size in let count_brakets = List.fold_left (fun sum process -> sum + List.length (F.brakets process)) 0 (CF.processes amplitudes) and count_processes = List.length (CF.processes amplitudes) in if count_brakets > 0 then let num_brakets = max 1 ((num_fusions * count_processes) / count_brakets) in (num_fusions, num_brakets) else (num_fusions, 1) let chop_amplitudes size amplitudes = let num_fusions, num_brakets = num_fusions_brakets size amplitudes in (ThoList.enumerate 1 (ThoList.chopn num_fusions (CF.fusions amplitudes)), ThoList.enumerate 1 (ThoList.chopn num_brakets (CF.processes amplitudes))) let print_compute_fusions1 dictionary (n, fusions) = if not !amp_triv then begin if !openmp then begin printf " subroutine compute_fusions_%04d (%s)" n openmp_tld; nl (); printf " @[<5>type(%s), intent(inout) :: %s" openmp_tld_type openmp_tld; nl (); end else begin printf " @[<5>subroutine compute_fusions_%04d ()" n; nl (); end; print_fusions dictionary fusions; printf " end subroutine compute_fusions_%04d" n; nl (); end and print_compute_brakets1 dictionary (n, processes) = if not !amp_triv then begin if !openmp then begin printf " subroutine compute_brakets_%04d (%s)" n openmp_tld; nl (); printf " @[<5>type(%s), intent(inout) :: %s" openmp_tld_type openmp_tld; nl (); end else begin printf " @[<5>subroutine compute_brakets_%04d ()" n; nl (); end; List.iter (print_brakets dictionary) processes; printf " end subroutine compute_brakets_%04d" n; nl (); end (* \thocwmodulesubsection{Common Stuff} *) let omega_public_symbols = ["number_particles_in"; "number_particles_out"; "number_color_indices"; "reset_helicity_selection"; "new_event"; "is_allowed"; "get_amplitude"; "color_sum"; "openmp_supported"] @ ThoList.flatmap (fun n -> ["number_" ^ n; n]) ["spin_states"; "flavor_states"; "color_flows"; "color_factors"] let whizard_public_symbols md5sum = ["init"; "final"; "update_alpha_s"] @ (match md5sum with Some _ -> ["md5sum"] | None -> []) let used_modules () = [Full "kinds"; Full Fermions.use_module; Full_Aliased ("omega_color", ["omega_color_factor", omega_color_factor_abbrev])] @ List.map (fun m -> Full m) (match !parameter_module with | "" -> !use_modules | pm -> pm :: !use_modules) let public_symbols () = if !whizard then omega_public_symbols @ (whizard_public_symbols !md5sum) else omega_public_symbols let print_constants amplitudes = printf " ! DON'T EVEN THINK of removing the following!"; nl (); printf " ! If the compiler complains about undeclared"; nl (); printf " ! or undefined variables, you are compiling"; nl (); printf " ! against an incompatible omega95 module!"; nl (); printf " @[<2>integer, dimension(%d), parameter, private :: " (List.length require_library); printf "require =@ (/ @["; print_list require_library; printf " /)"; nl (); nl (); (* Using these parameters makes sense for documentation, but in practice, there is no need to ever change them. *) List.iter (function name, value -> print_integer_parameter name (value amplitudes)) [ ("n_prt", num_particles); ("n_in", num_particles_in); ("n_out", num_particles_out); ("n_cflow", num_color_flows); (* Number of different color amplitudes. *) ("n_cindex", num_color_indices); (* Maximum rank of color tensors. *) ("n_flv", num_flavors); (* Number of different flavor amplitudes. *) ("n_hel", num_helicities) (* Number of different helicty amplitudes. *) ]; nl (); (* Abbreviations. *) printf " ! NB: you MUST NOT change the value of %s here!!!" nc_parameter; nl (); printf " ! It is defined here for convenience only and must be"; nl (); printf " ! compatible with hardcoded values in the amplitude!"; nl (); print_real_parameter nc_parameter (CM.nc ()); (* $N_C$ *) List.iter (function name, value -> print_logical_parameter name value) [ ("F", false); ("T", true) ]; nl (); print_spin_tables amplitudes; print_flavor_tables amplitudes; print_color_tables amplitudes; print_amplitude_table amplitudes; print_helicity_selection_table () let print_interface () = print_md5sum_functions !md5sum; print_maintenance_functions (); List.iter print_numeric_inquiry_functions [("number_particles_in", "n_in"); ("number_particles_out", "n_out")]; List.iter print_inquiry_functions ["spin_states"; "flavor_states"]; print_inquiry_function_openmp (); print_color_flows (); print_color_factors (); print_dispatch_functions (); nl (); (* Is this really necessary? *) Format_Fortran.switch_line_continuation false; if !km_write || !km_pure then (Targets_Kmatrix.Fortran.print !km_pure); if !km_2_write || !km_2_pure then (Targets_Kmatrix_2.Fortran.print !km_2_pure); Format_Fortran.switch_line_continuation true; nl () let print_calculate_amplitudes declarations computations amplitudes = printf " @[<5>subroutine calculate_amplitudes (amp, k, mask)"; nl (); printf " complex(kind=%s), dimension(:,:,:), intent(out) :: amp" !kind; nl (); printf " real(kind=%s), dimension(0:3,*), intent(in) :: k" !kind; nl (); printf " logical, dimension(:), intent(in) :: mask"; nl (); printf " integer, dimension(n_prt) :: s"; nl (); printf " integer :: h, hi"; nl (); declarations (); if not !amp_triv then begin begin match CF.processes amplitudes with | p :: _ -> print_external_momenta p | _ -> () end; ignore (List.fold_left print_momenta PSet.empty (CF.processes amplitudes)); end; printf " amp = 0"; nl (); if not !amp_triv then begin if num_helicities amplitudes > 0 then begin printf " if (hel_finite == 0) return"; nl (); if !openmp then begin printf "!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(s, h, %s) SCHEDULE(STATIC)" openmp_tld; nl (); end; printf " do hi = 1, hel_finite"; nl (); printf " h = hel_map(hi)"; nl (); printf " s = table_spin_states(:,h)"; nl (); ignore (List.fold_left print_externals WFSet.empty (CF.processes amplitudes)); computations (); List.iter print_fudge_factor (CF.processes amplitudes); (* This sorting should slightly improve cache locality. *) let triple_snd = fun (_, x, _) -> x in let triple_fst = fun (x, _, _) -> x in let rec builder1 flvi flowi flows = match flows with | (Some a) :: tl -> (flvi, flowi, flavors_symbol (flavors a)) :: (builder1 flvi (flowi + 1) tl) | None :: tl -> builder1 flvi (flowi + 1) tl | [] -> [] in let rec builder2 flvi flvs = match flvs with | flv :: tl -> (builder1 flvi 1 flv) @ (builder2 (flvi + 1) tl) | [] -> [] in let unsorted = builder2 1 (List.map Array.to_list (Array.to_list (CF.process_table amplitudes))) in let sorted = List.sort (fun a b -> if (triple_snd a != triple_snd b) then triple_snd a - triple_snd b else (triple_fst a - triple_fst b)) unsorted in List.iter (fun (flvi, flowi, flv) -> (printf " amp(%d,%d,h) = %s" flvi flowi flv; nl ();)) sorted; (*i printf " else"; nl (); printf " amp(:,h,:) = 0"; nl (); i*) printf " end do"; nl (); if !openmp then begin printf "!$OMP END PARALLEL DO"; nl (); end; end; end; printf " end subroutine calculate_amplitudes"; nl () let print_compute_chops chopped_fusions chopped_brakets () = List.iter (fun (i, _) -> printf " call compute_fusions_%04d (%s)" i (if !openmp then openmp_tld else ""); nl ()) chopped_fusions; List.iter (fun (i, _) -> printf " call compute_brakets_%04d (%s)" i (if !openmp then openmp_tld else ""); nl ()) chopped_brakets (* \thocwmodulesubsection{UFO Fusions} *) module VSet = Set.Make (struct type t = F.constant Coupling.t let compare = compare end) let ufo_fusions_used amplitudes = let couplings = List.fold_left (fun acc p -> let fusions = ThoList.flatmap F.rhs (F.fusions p) and brakets = ThoList.flatmap F.ket (F.brakets p) in let couplings = VSet.of_list (List.map F.coupling (fusions @ brakets)) in VSet.union acc couplings) VSet.empty (CF.processes amplitudes) in VSet.fold (fun v acc -> match v with | Coupling.Vn (Coupling.UFO (_, v, _, _, _), _, _) -> Sets.String.add v acc | _ -> acc) couplings Sets.String.empty (* \thocwmodulesubsection{Single Function} *) let amplitudes_to_channel_single_function cmdline oc amplitudes = let print_declarations () = print_constants amplitudes and print_implementations () = print_interface (); print_calculate_amplitudes (fun () -> print_variable_declarations amplitudes) (fun () -> print_fusions (CF.dictionary amplitudes) (CF.fusions amplitudes); List.iter (print_brakets (CF.dictionary amplitudes)) (CF.processes amplitudes)) amplitudes in let fortran_module = { module_name = !module_name; used_modules = used_modules (); default_accessibility = Private; public_symbols = public_symbols (); print_declarations = [print_declarations]; print_implementations = [print_implementations] } in Format_Fortran.set_formatter_out_channel ~width:!line_length oc; print_description cmdline amplitudes (); print_modules [fortran_module] (* \thocwmodulesubsection{Single Module} *) let amplitudes_to_channel_single_module cmdline oc size amplitudes = let print_declarations () = print_constants amplitudes; print_variable_declarations amplitudes and print_implementations () = print_interface () in let chopped_fusions, chopped_brakets = chop_amplitudes size amplitudes in let dictionary = CF.dictionary amplitudes in let print_compute_amplitudes () = print_calculate_amplitudes (fun () -> ()) (print_compute_chops chopped_fusions chopped_brakets) amplitudes and print_compute_fusions () = List.iter (print_compute_fusions1 dictionary) chopped_fusions and print_compute_brakets () = List.iter (print_compute_brakets1 dictionary) chopped_brakets in let fortran_module = { module_name = !module_name; used_modules = used_modules (); default_accessibility = Private; public_symbols = public_symbols (); print_declarations = [print_declarations]; print_implementations = [print_implementations; print_compute_amplitudes; print_compute_fusions; print_compute_brakets] } in Format_Fortran.set_formatter_out_channel ~width:!line_length oc; print_description cmdline amplitudes (); print_modules [fortran_module] (* \thocwmodulesubsection{Multiple Modules} *) let modules_of_amplitudes _ _ size amplitudes = let name = !module_name in let print_declarations () = print_constants amplitudes and print_variables () = print_variable_declarations amplitudes in let constants_module = { module_name = name ^ "_constants"; used_modules = used_modules (); default_accessibility = Public; public_symbols = []; print_declarations = [print_declarations]; print_implementations = [] } in let variables_module = { module_name = name ^ "_variables"; used_modules = used_modules (); default_accessibility = Public; public_symbols = []; print_declarations = [print_variables]; print_implementations = [] } in let dictionary = CF.dictionary amplitudes in let print_compute_fusions (n, fusions) () = if not !amp_triv then begin if !openmp then begin printf " subroutine compute_fusions_%04d (%s)" n openmp_tld; nl (); printf " @[<5>type(%s), intent(inout) :: %s" openmp_tld_type openmp_tld; nl (); end else begin printf " @[<5>subroutine compute_fusions_%04d ()" n; nl (); end; print_fusions dictionary fusions; printf " end subroutine compute_fusions_%04d" n; nl (); end in let print_compute_brakets (n, processes) () = if not !amp_triv then begin if !openmp then begin printf " subroutine compute_brakets_%04d (%s)" n openmp_tld; nl (); printf " @[<5>type(%s), intent(inout) :: %s" openmp_tld_type openmp_tld; nl (); end else begin printf " @[<5>subroutine compute_brakets_%04d ()" n; nl (); end; List.iter (print_brakets dictionary) processes; printf " end subroutine compute_brakets_%04d" n; nl (); end in let fusions_module (n, _ as fusions) = let tag = Printf.sprintf "_fusions_%04d" n in { module_name = name ^ tag; used_modules = (used_modules () @ [Full constants_module.module_name; Full variables_module.module_name]); default_accessibility = Private; public_symbols = ["compute" ^ tag]; print_declarations = []; print_implementations = [print_compute_fusions fusions] } in let brakets_module (n, _ as processes) = let tag = Printf.sprintf "_brakets_%04d" n in { module_name = name ^ tag; used_modules = (used_modules () @ [Full constants_module.module_name; Full variables_module.module_name]); default_accessibility = Private; public_symbols = ["compute" ^ tag]; print_declarations = []; print_implementations = [print_compute_brakets processes] } in let chopped_fusions, chopped_brakets = chop_amplitudes size amplitudes in let fusions_modules = List.map fusions_module chopped_fusions in let brakets_modules = List.map brakets_module chopped_brakets in let print_implementations () = print_interface (); print_calculate_amplitudes (fun () -> ()) (print_compute_chops chopped_fusions chopped_brakets) amplitudes in let public_module = { module_name = name; used_modules = (used_modules () @ [Full constants_module.module_name; Full variables_module.module_name ] @ List.map (fun m -> Full m.module_name) (fusions_modules @ brakets_modules)); default_accessibility = Private; public_symbols = public_symbols (); print_declarations = []; print_implementations = [print_implementations] } and private_modules = [constants_module; variables_module] @ fusions_modules @ brakets_modules in (public_module, private_modules) let amplitudes_to_channel_single_file cmdline oc size amplitudes = let public_module, private_modules = modules_of_amplitudes cmdline oc size amplitudes in Format_Fortran.set_formatter_out_channel ~width:!line_length oc; print_description cmdline amplitudes (); print_modules (private_modules @ [public_module]) let amplitudes_to_channel_multi_file cmdline oc size amplitudes = let public_module, private_modules = modules_of_amplitudes cmdline oc size amplitudes in modules_to_file !line_length oc (print_description cmdline amplitudes) (public_module :: private_modules) (* \thocwmodulesubsection{Dispatch} *) let amplitudes_to_channel cmdline oc diagnostics amplitudes = parse_diagnostics diagnostics; let ufo_fusions = let ufo_fusions_set = ufo_fusions_used amplitudes in if Sets.String.is_empty ufo_fusions_set then None else Some ufo_fusions_set in begin match ufo_fusions with | Some only -> let name = !module_name ^ "_ufo" and fortran_module = Fermions.use_module in use_modules := name :: !use_modules; UFO.Targets.Fortran.lorentz_module ~only ~name ~fortran_module (Format_Fortran.formatter_of_out_channel oc) () | None -> () end; match !output_mode with | Single_Function -> amplitudes_to_channel_single_function cmdline oc amplitudes | Single_Module size -> amplitudes_to_channel_single_module cmdline oc size amplitudes | Single_File size -> amplitudes_to_channel_single_file cmdline oc size amplitudes | Multi_File size -> amplitudes_to_channel_multi_file cmdline oc size amplitudes let parameters_to_channel oc = parameters_to_fortran oc (CM.parameters ()) end module Fortran = Make_Fortran(Fortran_Fermions) (* \thocwmodulesubsection{Majorana Fermions} *) (* \begin{JR} For this function we need a different approach due to our aim of implementing the fermion vertices with the right line as ingoing (in a calculational sense) and the left line in a fusion as outgoing. In defining all external lines and the fermionic wavefunctions built out of them as ingoing we have to invert the left lines to make them outgoing. This happens by multiplying them with the inverse charge conjugation matrix in an appropriate representation and then transposing it. We must distinguish whether the direction of calculation and the physical direction of the fermion number flow are parallel or antiparallel. In the first case we can use the "normal" Feynman rules for Dirac particles, while in the second, according to the paper of Denner et al., we have to reverse the sign of the vector and antisymmetric bilinears of the Dirac spinors, cf. the [Coupling] module. Note the subtlety for the left- and righthanded couplings: Only the vector part of these couplings changes in the appropriate cases its sign, changing the chirality to the negative of the opposite. \end{JR} *) module Fortran_Majorana_Fermions : Fermions = struct open Coupling open Format let psi_type = "bispinor" let psibar_type = "bispinor" let chi_type = "bispinor" let grav_type = "vectorspinor" (* \begin{JR} Because of our rules for fermions we are going to give all incoming fermions a [u] spinor and all outgoing fermions a [v] spinor, no matter whether they are Dirac fermions, antifermions or Majorana fermions. \end{JR} *) let psi_incoming = "u" let brs_psi_incoming = "brs_u" let psibar_incoming = "u" let brs_psibar_incoming = "brs_u" let chi_incoming = "u" let brs_chi_incoming = "brs_u" let grav_incoming = "ueps" let psi_outgoing = "v" let brs_psi_outgoing = "brs_v" let psibar_outgoing = "v" let brs_psibar_outgoing = "brs_v" let chi_outgoing = "v" let brs_chi_outgoing = "brs_v" let grav_outgoing = "veps" let psi_propagator = "pr_psi" let psibar_propagator = "pr_psi" let chi_propagator = "pr_psi" let grav_propagator = "pr_grav" let psi_projector = "pj_psi" let psibar_projector = "pj_psi" let chi_projector = "pj_psi" let grav_projector = "pj_grav" let psi_gauss = "pg_psi" let psibar_gauss = "pg_psi" let chi_gauss = "pg_psi" let grav_gauss = "pg_grav" let format_coupling coeff c = match coeff with | 1 -> c | -1 -> "(-" ^ c ^")" | coeff -> string_of_int coeff ^ "*" ^ c let format_coupling_2 coeff c = match coeff with | 1 -> c | -1 -> "-" ^ c | coeff -> string_of_int coeff ^ "*" ^ c (* \begin{dubious} JR's coupling constant HACK, necessitated by tho's bad design descition. \end{dubious} *) let fastener s i = try let offset = (String.index s '(') in if ((String.get s (String.length s - 1)) != ')') then failwith "fastener: wrong usage of parentheses" else let func_name = (String.sub s 0 offset) and tail = (String.sub s (succ offset) (String.length s - offset - 2)) in if (String.contains func_name ')') || (String.contains tail '(') || (String.contains tail ')') then failwith "fastener: wrong usage of parentheses" else func_name ^ "(" ^ string_of_int i ^ "," ^ tail ^ ")" with | Not_found -> if (String.contains s ')') then failwith "fastener: wrong usage of parentheses" else s ^ "(" ^ string_of_int i ^ ")" let print_fermion_current coeff f c wf1 wf2 fusion = let c = format_coupling coeff c in match fusion with | F13 | F31 -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 | F23 | F21 -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 | F32 | F12 -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 let print_fermion_current2 coeff f c wf1 wf2 fusion = let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 | F31 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F23 | F21 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F32 | F12 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf2 wf1 let print_fermion_current_mom_v1 coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F31 -> printf "%s_ff(-(%s),%s,%s,%s)" f c1 c2 wf1 wf2 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf2 wf1 | F12 -> printf "f_f%s(-(%s),%s,%s,%s)" f c1 c2 wf2 wf1 | F21 -> printf "f_f%s(-(%s),%s,%s,%s)" f c1 c2 wf1 wf2 let print_fermion_current_mom_v1_chiral coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F31 -> printf "%s_ff(-(%s),-(%s),%s,%s)" f c2 c1 wf1 wf2 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf2 wf1 | F12 -> printf "f_f%s(-(%s),-(%s),%s,%s)" f c2 c1 wf2 wf1 | F21 -> printf "f_f%s(-(%s),-(%s),%s,%s)" f c2 c1 wf2 wf1 let print_fermion_current_mom_v2 coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F31 -> printf "%s_ff(-(%s),%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F12 -> printf "f_f%s(-(%s),%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F21 -> printf "f_f%s(-(%s),%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 let print_fermion_current_mom_v2_chiral coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F31 -> printf "%s_ff(-(%s),-(%s),%s,%s,%s)" f c2 c1 wf2 wf1 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F12 -> printf "f_f%s(-(%s),-(%s),%s,%s,%s)" f c2 c1 wf1 wf2 p2 | F21 -> printf "f_f%s(-(%s),-(%s),%s,%s,%s)" f c2 c1 wf2 wf1 p1 let print_fermion_current_vector coeff f c wf1 wf2 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_ff(%s,%s,%s)" f c wf1 wf2 | F31 -> printf "%s_ff(-%s,%s,%s)" f c wf1 wf2 | F23 -> printf "f_%sf(%s,%s,%s)" f c wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s)" f c wf2 wf1 | F12 -> printf "f_%sf(-%s,%s,%s)" f c wf2 wf1 | F21 -> printf "f_%sf(-%s,%s,%s)" f c wf1 wf2 let print_fermion_current2_vector coeff f c wf1 wf2 fusion = let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F31 -> printf "%s_ff(-(%s),%s,%s,%s)" f c1 c2 wf1 wf2 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf2 wf1 | F12 -> printf "f_%sf(-(%s),%s,%s,%s)" f c1 c2 wf2 wf1 | F21 -> printf "f_%sf(-(%s),%s,%s,%s)" f c1 c2 wf1 wf2 let print_fermion_current_chiral coeff f1 f2 c wf1 wf2 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_ff(%s,%s,%s)" f1 c wf1 wf2 | F31 -> printf "%s_ff(-%s,%s,%s)" f2 c wf1 wf2 | F23 -> printf "f_%sf(%s,%s,%s)" f1 c wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s)" f1 c wf2 wf1 | F12 -> printf "f_%sf(-%s,%s,%s)" f2 c wf2 wf1 | F21 -> printf "f_%sf(-%s,%s,%s)" f2 c wf1 wf2 let print_fermion_current2_chiral coeff f c wf1 wf2 fusion = let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F31 -> printf "%s_ff(-(%s),-(%s),%s,%s)" f c2 c1 wf1 wf2 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf1 wf2 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f c1 c2 wf2 wf1 | F12 -> printf "f_%sf(-(%s),-(%s),%s,%s)" f c2 c1 wf2 wf1 | F21 -> printf "f_%sf(-(%s),-(%s),%s,%s)" f c2 c1 wf1 wf2 let print_current = function | coeff, _, VA, _ -> print_fermion_current2_vector coeff "va" | coeff, _, V, _ -> print_fermion_current_vector coeff "v" | coeff, _, A, _ -> print_fermion_current coeff "a" | coeff, _, VL, _ -> print_fermion_current_chiral coeff "vl" "vr" | coeff, _, VR, _ -> print_fermion_current_chiral coeff "vr" "vl" | coeff, _, VLR, _ -> print_fermion_current2_chiral coeff "vlr" | coeff, _, SP, _ -> print_fermion_current2 coeff "sp" | coeff, _, S, _ -> print_fermion_current coeff "s" | coeff, _, P, _ -> print_fermion_current coeff "p" | coeff, _, SL, _ -> print_fermion_current coeff "sl" | coeff, _, SR, _ -> print_fermion_current coeff "sr" | coeff, _, SLR, _ -> print_fermion_current2 coeff "slr" | coeff, _, POT, _ -> print_fermion_current_vector coeff "pot" | _, _, _, _ -> invalid_arg "Targets.Fortran_Majorana_Fermions: Not needed in the models" let print_current_p = function | coeff, Psi, SL, Psi -> print_fermion_current coeff "sl" | coeff, Psi, SR, Psi -> print_fermion_current coeff "sr" | coeff, Psi, SLR, Psi -> print_fermion_current2 coeff "slr" | _, _, _, _ -> invalid_arg "Targets.Fortran_Majorana_Fermions: Not needed in the used models" let print_current_b = function | coeff, Psibar, SL, Psibar -> print_fermion_current coeff "sl" | coeff, Psibar, SR, Psibar -> print_fermion_current coeff "sr" | coeff, Psibar, SLR, Psibar -> print_fermion_current2 coeff "slr" | _, _, _, _ -> invalid_arg "Targets.Fortran_Majorana_Fermions: Not needed in the used models" (* This function is for the vertices with three particles including two fermions but also a momentum, therefore with a dimensionful coupling constant, e.g. the gravitino vertices. One has to dinstinguish between the two kinds of canonical orders in the string of gamma matrices. Of course, the direction of the string of gamma matrices is reversed if one goes from the [Gravbar, _, Psi] to the [Psibar, _, Grav] vertices, and the same is true for the couplings of the gravitino to the Majorana fermions. For more details see the tables in the [coupling] implementation. *) (* We now have to fix the directions of the momenta. For making the compiler happy and because we don't want to make constructions of infinite complexity we list the momentum including vertices without gravitinos here; the pattern matching says that's better. Perhaps we have to find a better name now. For the cases of $MOM$, $MOM5$, $MOML$ and $MOMR$ which arise only in BRST transformations we take the mass as a coupling constant. For $VMOM$ we don't need a mass either. These vertices are like kinetic terms and so need not have a coupling constant. By this we avoid a strange and awful construction with a new variable. But be careful with a generalization if you want to use these vertices for other purposes. *) let format_coupling_mom coeff c = match coeff with | 1 -> c | -1 -> "(-" ^ c ^")" | coeff -> string_of_int coeff ^ "*" ^ c let commute_proj f = match f with | "moml" -> "lmom" | "momr" -> "rmom" | "lmom" -> "moml" | "rmom" -> "momr" | "svl" -> "svr" | "svr" -> "svl" | "sl" -> "sr" | "sr" -> "sl" | "s" -> "s" | "p" -> "p" | _ -> invalid_arg "Targets:Fortran_Majorana_Fermions: wrong case" let print_fermion_current_mom coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling_mom coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F31 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F12 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F21 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 (*i unused value let print_fermion_current_mom_vector coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling_mom coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F31 -> printf "%s_ff(-%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F12 -> printf "f_%sf(-%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F21 -> printf "f_%sf(-%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 i*) let print_fermion_current_mom_sign coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling_mom coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F31 -> printf "%s_ff(%s,%s,%s,%s,-(%s))" f c1 c2 wf1 wf2 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F12 -> printf "f_%sf(%s,%s,%s,%s,-(%s))" f c1 c2 wf2 wf1 p2 | F21 -> printf "f_%sf(%s,%s,%s,%s,-(%s))" f c1 c2 wf1 wf2 p1 let print_fermion_current_mom_sign_1 coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s)" f c wf1 wf2 p12 | F31 -> printf "%s_ff(%s,%s,%s,-(%s))" f c wf1 wf2 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s)" f c wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s)" f c wf2 wf1 p2 | F12 -> printf "f_%sf(%s,%s,%s,-(%s))" f c wf2 wf1 p2 | F21 -> printf "f_%sf(%s,%s,%s,-(%s))" f c wf1 wf2 p1 let print_fermion_current_mom_chiral coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling_mom coeff c and cf = commute_proj f in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | F13 -> printf "%s_ff(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p12 | F31 -> printf "%s_ff(%s,%s,%s, %s,-(%s))" cf c1 c2 wf1 wf2 p12 | F23 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf1 wf2 p1 | F32 -> printf "f_%sf(%s,%s,%s,%s,%s)" f c1 c2 wf2 wf1 p2 | F12 -> printf "f_%sf(%s,%s,%s,%s,-(%s))" cf c1 c2 wf2 wf1 p2 | F21 -> printf "f_%sf(%s,%s,%s,%s,-(%s))" cf c1 c2 wf1 wf2 p1 let print_fermion_g_current coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_grf(%s,%s,%s,%s)" f c wf1 wf2 p12 | F31 -> printf "%s_fgr(%s,%s,%s,%s)" f c wf1 wf2 p12 | F23 -> printf "gr_%sf(%s,%s,%s,%s)" f c wf1 wf2 p1 | F32 -> printf "gr_%sf(%s,%s,%s,%s)" f c wf2 wf1 p2 | F12 -> printf "f_%sgr(%s,%s,%s,%s)" f c wf2 wf1 p2 | F21 -> printf "f_%sgr(%s,%s,%s,%s)" f c wf1 wf2 p1 let print_fermion_g_2_current coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_grf(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p12 | F31 -> printf "%s_fgr(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p12 | F23 -> printf "gr_%sf(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p1 | F32 -> printf "gr_%sf(%s(1),%s(2),%s,%s,%s)" f c c wf2 wf1 p2 | F12 -> printf "f_%sgr(%s(1),%s(2),%s,%s,%s)" f c c wf2 wf1 p2 | F21 -> printf "f_%sgr(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p1 let print_fermion_g_current_rev coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_fgr(%s,%s,%s,%s)" f c wf1 wf2 p12 | F31 -> printf "%s_grf(%s,%s,%s,%s)" f c wf1 wf2 p12 | F23 -> printf "f_%sgr(%s,%s,%s,%s)" f c wf1 wf2 p1 | F32 -> printf "f_%sgr(%s,%s,%s,%s)" f c wf2 wf1 p2 | F12 -> printf "gr_%sf(%s,%s,%s,%s)" f c wf2 wf1 p2 | F21 -> printf "gr_%sf(%s,%s,%s,%s)" f c wf1 wf2 p1 let print_fermion_g_2_current_rev coeff f c wf1 wf2 p1 p2 p12 fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_fgr(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p12 | F31 -> printf "%s_grf(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p12 | F23 -> printf "f_%sgr(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p1 | F32 -> printf "f_%sgr(%s(1),%s(2),%s,%s,%s)" f c c wf2 wf1 p2 | F12 -> printf "gr_%sf(%s(1),%s(2),%s,%s,%s)" f c c wf2 wf1 p2 | F21 -> printf "gr_%sf(%s(1),%s(2),%s,%s,%s)" f c c wf1 wf2 p1 let print_fermion_g_current_vector coeff f c wf1 wf2 _ _ _ fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_grf(%s,%s,%s)" f c wf1 wf2 | F31 -> printf "%s_fgr(-%s,%s,%s)" f c wf1 wf2 | F23 -> printf "gr_%sf(%s,%s,%s)" f c wf1 wf2 | F32 -> printf "gr_%sf(%s,%s,%s)" f c wf2 wf1 | F12 -> printf "f_%sgr(-%s,%s,%s)" f c wf2 wf1 | F21 -> printf "f_%sgr(-%s,%s,%s)" f c wf1 wf2 let print_fermion_g_current_vector_rev coeff f c wf1 wf2 _ _ _ fusion = let c = format_coupling coeff c in match fusion with | F13 -> printf "%s_fgr(%s,%s,%s)" f c wf1 wf2 | F31 -> printf "%s_grf(-%s,%s,%s)" f c wf1 wf2 | F23 -> printf "f_%sgr(%s,%s,%s)" f c wf1 wf2 | F32 -> printf "f_%sgr(%s,%s,%s)" f c wf2 wf1 | F12 -> printf "gr_%sf(-%s,%s,%s)" f c wf2 wf1 | F21 -> printf "gr_%sf(-%s,%s,%s)" f c wf1 wf2 let print_current_g = function | coeff, _, MOM, _ -> print_fermion_current_mom_sign coeff "mom" | coeff, _, MOM5, _ -> print_fermion_current_mom coeff "mom5" | coeff, _, MOML, _ -> print_fermion_current_mom_chiral coeff "moml" | coeff, _, MOMR, _ -> print_fermion_current_mom_chiral coeff "momr" | coeff, _, LMOM, _ -> print_fermion_current_mom_chiral coeff "lmom" | coeff, _, RMOM, _ -> print_fermion_current_mom_chiral coeff "rmom" | coeff, _, VMOM, _ -> print_fermion_current_mom_sign_1 coeff "vmom" | coeff, Gravbar, S, _ -> print_fermion_g_current coeff "s" | coeff, Gravbar, SL, _ -> print_fermion_g_current coeff "sl" | coeff, Gravbar, SR, _ -> print_fermion_g_current coeff "sr" | coeff, Gravbar, SLR, _ -> print_fermion_g_2_current coeff "slr" | coeff, Gravbar, P, _ -> print_fermion_g_current coeff "p" | coeff, Gravbar, V, _ -> print_fermion_g_current coeff "v" | coeff, Gravbar, VLR, _ -> print_fermion_g_2_current coeff "vlr" | coeff, Gravbar, POT, _ -> print_fermion_g_current_vector coeff "pot" | coeff, _, S, Grav -> print_fermion_g_current_rev coeff "s" | coeff, _, SL, Grav -> print_fermion_g_current_rev coeff "sl" | coeff, _, SR, Grav -> print_fermion_g_current_rev coeff "sr" | coeff, _, SLR, Grav -> print_fermion_g_2_current_rev coeff "slr" | coeff, _, P, Grav -> print_fermion_g_current_rev (-coeff) "p" | coeff, _, V, Grav -> print_fermion_g_current_rev coeff "v" | coeff, _, VLR, Grav -> print_fermion_g_2_current_rev coeff "vlr" | coeff, _, POT, Grav -> print_fermion_g_current_vector_rev coeff "pot" | _, _, _, _ -> invalid_arg "Targets.Fortran_Majorana_Fermions: not used in the models" let print_current_mom = function | coeff, _, TVA, _ -> print_fermion_current_mom_v1 coeff "tva" | coeff, _, TVAM, _ -> print_fermion_current_mom_v2 coeff "tvam" | coeff, _, TLR, _ -> print_fermion_current_mom_v1_chiral coeff "tlr" | coeff, _, TLRM, _ -> print_fermion_current_mom_v2_chiral coeff "tlrm" | _, _, _, _ -> invalid_arg "Targets.Fortran_Majorana_Fermions: Not needed in the models" (* We need support for dimension-5 vertices with two fermions and two bosons, appearing in theories of supergravity and also together with in insertions of the supersymmetric current. There is a canonical order [fermionbar], [boson_1], [boson_2], [fermion], so what one has to do is a mapping from the fusions [F123] etc. to the order of the three wave functions [wf1], [wf2] and [wf3]. *) (* The function [d_p] (for distinct the particle) distinguishes which particle (scalar or vector) must be fused to in the special functions. *) let d_p = function | 1, ("sv"|"pv"|"svl"|"svr"|"slrv") -> "1" | 1, _ -> "" | 2, ("sv"|"pv"|"svl"|"svr"|"slrv") -> "2" | 2, _ -> "" | _, _ -> invalid_arg "Targets.Fortran_Majorana_Fermions: not used" let wf_of_f wf1 wf2 wf3 f = match f with | (F123|F423) -> [wf2; wf3; wf1] | (F213|F243|F143|F142|F413|F412) -> [wf1; wf3; wf2] | (F132|F432) -> [wf3; wf2; wf1] | (F231|F234|F134|F124|F431|F421) -> [wf1; wf2; wf3] | (F312|F342) -> [wf3; wf1; wf2] | (F321|F324|F314|F214|F341|F241) -> [wf2; wf1; wf3] let print_fermion_g4_brs_vector_current coeff f c wf1 wf2 wf3 fusion = let cf = commute_proj f and cp = format_coupling coeff c and cm = if f = "pv" then format_coupling coeff c else format_coupling (-coeff) c and d1 = d_p (1,f) and d2 = d_p (2,f) and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sf(%s,%s,%s,%s)" cf cm f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "f_%sf(%s,%s,%s,%s)" f cp f1 f2 f3 | (F134|F143|F314) -> printf "%s%s_ff(%s,%s,%s,%s)" f d1 cp f1 f2 f3 | (F124|F142|F214) -> printf "%s%s_ff(%s,%s,%s,%s)" f d2 cp f1 f2 f3 | (F413|F431|F341) -> printf "%s%s_ff(%s,%s,%s,%s)" cf d1 cm f1 f2 f3 | (F241|F412|F421) -> printf "%s%s_ff(%s,%s,%s,%s)" cf d2 cm f1 f2 f3 let print_fermion_g4_svlr_current coeff _ c wf1 wf2 wf3 fusion = let c = format_coupling_2 coeff c and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_svlrf(-(%s),-(%s),%s,%s,%s)" c2 c1 f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "f_svlrf(%s,%s,%s,%s,%s)" c1 c2 f1 f2 f3 | (F134|F143|F314) -> printf "svlr2_ff(%s,%s,%s,%s,%s)" c1 c2 f1 f2 f3 | (F124|F142|F214) -> printf "svlr1_ff(%s,%s,%s,%s,%s)" c1 c2 f1 f2 f3 | (F413|F431|F341) -> printf "svlr2_ff(-(%s),-(%s),%s,%s,%s)" c2 c1 f1 f2 f3 | (F241|F412|F421) -> printf "svlr1_ff(-(%s),-(%s),%s,%s,%s)" c2 c1 f1 f2 f3 let print_fermion_s2_current coeff f c wf1 wf2 wf3 fusion = let cp = format_coupling coeff c and cm = if f = "p" then format_coupling (-coeff) c else format_coupling coeff c and cf = commute_proj f and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "%s * f_%sf(%s,%s,%s)" f1 cf cm f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "%s * f_%sf(%s,%s,%s)" f1 f cp f2 f3 | (F134|F143|F314) -> printf "%s * %s_ff(%s,%s,%s)" f2 f cp f1 f3 | (F124|F142|F214) -> printf "%s * %s_ff(%s,%s,%s)" f2 f cp f1 f3 | (F413|F431|F341) -> printf "%s * %s_ff(%s,%s,%s)" f2 cf cm f1 f3 | (F241|F412|F421) -> printf "%s * %s_ff(%s,%s,%s)" f2 cf cm f1 f3 let print_fermion_s2p_current coeff f c wf1 wf2 wf3 fusion = let c = format_coupling_2 coeff c and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "%s * f_%sf(%s,-(%s),%s,%s)" f1 f c1 c2 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "%s * f_%sf(%s,%s,%s,%s)" f1 f c1 c2 f2 f3 | (F134|F143|F314) -> printf "%s * %s_ff(%s,%s,%s,%s)" f2 f c1 c2 f1 f3 | (F124|F142|F214) -> printf "%s * %s_ff(%s,%s,%s,%s)" f2 f c1 c2 f1 f3 | (F413|F431|F341) -> printf "%s * %s_ff(%s,-(%s),%s,%s)" f2 f c1 c2 f1 f3 | (F241|F412|F421) -> printf "%s * %s_ff(%s,-(%s),%s,%s)" f2 f c1 c2 f1 f3 let print_fermion_s2lr_current coeff f c wf1 wf2 wf3 fusion = let c = format_coupling_2 coeff c and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "%s * f_%sf(%s,%s,%s,%s)" f1 f c2 c1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "%s * f_%sf(%s,%s,%s,%s)" f1 f c1 c2 f2 f3 | (F134|F143|F314) -> printf "%s * %s_ff(%s,%s,%s,%s)" f2 f c1 c2 f1 f3 | (F124|F142|F214) -> printf "%s * %s_ff(%s,%s,%s,%s)" f2 f c1 c2 f1 f3 | (F413|F431|F341) -> printf "%s * %s_ff(%s,%s,%s,%s)" f2 f c2 c1 f1 f3 | (F241|F412|F421) -> printf "%s * %s_ff(%s,%s,%s,%s)" f2 f c2 c1 f1 f3 let print_fermion_g4_current coeff f c wf1 wf2 wf3 fusion = let c = format_coupling coeff c and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sgr(-%s,%s,%s,%s)" f c f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "gr_%sf(%s,%s,%s,%s)" f c f1 f2 f3 | (F134|F143|F314|F124|F142|F214) -> printf "%s_grf(%s,%s,%s,%s)" f c f1 f2 f3 | (F413|F431|F341|F241|F412|F421) -> printf "%s_fgr(-%s,%s,%s,%s)" f c f1 f2 f3 (*i unused value let print_fermion_2_g4_current coeff f c wf1 wf2 wf3 fusion = let f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sgr(-(%s),-(%s),%s,%s,%s)" f c2 c1 f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "gr_%sf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F134|F143|F314|F124|F142|F214) -> printf "%s_grf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F413|F431|F341|F241|F412|F421) -> printf "%s_fgr(-(%s),-(%s),%s,%s,%s)" f c2 c1 f1 f2 f3 i*) let print_fermion_2_g4_current coeff f c wf1 wf2 wf3 fusion = let f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sgr(-(%s),-(%s),%s,%s,%s)" f c2 c1 f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "gr_%sf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F134|F143|F314|F124|F142|F214) -> printf "%s_grf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F413|F431|F341|F241|F412|F421) -> printf "%s_fgr(-(%s),-(%s),%s,%s,%s)" f c2 c1 f1 f2 f3 let print_fermion_g4_current_rev coeff f c wf1 wf2 wf3 fusion = let c = format_coupling coeff c and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sgr(%s,%s,%s,%s)" f c f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "gr_%sf(-%s,%s,%s,%s)" f c f1 f2 f3 | (F134|F143|F314|F124|F142|F214) -> printf "%s_grf(-%s,%s,%s,%s)" f c f1 f2 f3 | (F413|F431|F341|F241|F412|F421) -> printf "%s_fgr(%s,%s,%s,%s)" f c f1 f2 f3 (* Here we have to distinguish which of the two bosons is produced in the fusion of three particles which include both fermions. *) let print_fermion_g4_vector_current coeff f c wf1 wf2 wf3 fusion = let c = format_coupling coeff c and d1 = d_p (1,f) and d2 = d_p (2,f) and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sgr(%s,%s,%s,%s)" f c f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "gr_%sf(%s,%s,%s,%s)" f c f1 f2 f3 | (F134|F143|F314) -> printf "%s%s_grf(%s,%s,%s,%s)" f d1 c f1 f2 f3 | (F124|F142|F214) -> printf "%s%s_grf(%s,%s,%s,%s)" f d2 c f1 f2 f3 | (F413|F431|F341) -> printf "%s%s_fgr(%s,%s,%s,%s)" f d1 c f1 f2 f3 | (F241|F412|F421) -> printf "%s%s_fgr(%s,%s,%s,%s)" f d2 c f1 f2 f3 let print_fermion_2_g4_vector_current coeff f c wf1 wf2 wf3 fusion = let d1 = d_p (1,f) and d2 = d_p (2,f) and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "f_%sgr(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "gr_%sf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F134|F143|F314) -> printf "%s%s_grf(%s,%s,%s,%s,%s)" f d1 c1 c2 f1 f2 f3 | (F124|F142|F214) -> printf "%s%s_grf(%s,%s,%s,%s,%s)" f d2 c1 c2 f1 f2 f3 | (F413|F431|F341) -> printf "%s%s_fgr(%s,%s,%s,%s,%s)" f d1 c1 c2 f1 f2 f3 | (F241|F412|F421) -> printf "%s%s_fgr(%s,%s,%s,%s,%s)" f d2 c1 c2 f1 f2 f3 let print_fermion_g4_vector_current_rev coeff f c wf1 wf2 wf3 fusion = let c = format_coupling coeff c and d1 = d_p (1,f) and d2 = d_p (2,f) and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "gr_%sf(%s,%s,%s,%s)" f c f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "f_%sgr(%s,%s,%s,%s)" f c f1 f2 f3 | (F134|F143|F314) -> printf "%s%s_fgr(%s,%s,%s,%s)" f d1 c f1 f2 f3 | (F124|F142|F214) -> printf "%s%s_fgr(%s,%s,%s,%s)" f d2 c f1 f2 f3 | (F413|F431|F341) -> printf "%s%s_grf(%s,%s,%s,%s)" f d1 c f1 f2 f3 | (F241|F412|F421) -> printf "%s%s_grf(%s,%s,%s,%s)" f d2 c f1 f2 f3 let print_fermion_2_g4_current_rev coeff f c wf1 wf2 wf3 fusion = let c = format_coupling_2 coeff c in let c1 = fastener c 1 and c2 = fastener c 2 and d1 = d_p (1,f) and d2 = d_p (2,f) in let f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "gr_%sf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "f_%sgr(-(%s),-(%s),%s,%s,%s)" f c1 c2 f1 f2 f3 | (F134|F143|F314) -> printf "%s%s_fgr(-(%s),-(%s),%s,%s,%s)" f d1 c1 c2 f1 f2 f3 | (F124|F142|F214) -> printf "%s%s_fgr(-(%s),-(%s),%s,%s,%s)" f d2 c1 c2 f1 f2 f3 | (F413|F431|F341) -> printf "%s%s_grf(%s,%s,%s,%s,%s)" f d1 c1 c2 f1 f2 f3 | (F241|F412|F421) -> printf "%s%s_grf(%s,%s,%s,%s,%s)" f d2 c1 c2 f1 f2 f3 let print_fermion_2_g4_vector_current_rev coeff f c wf1 wf2 wf3 fusion = (* Here we put in the extra minus sign from the coeff. *) let c = format_coupling coeff c in let c1 = fastener c 1 and c2 = fastener c 2 in let d1 = d_p (1,f) and d2 = d_p (2,f) and f1 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 0) and f2 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 1) and f3 = (List.nth (wf_of_f wf1 wf2 wf3 fusion) 2) in match fusion with | (F123|F213|F132|F231|F312|F321) -> printf "gr_%sf(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F423|F243|F432|F234|F342|F324) -> printf "f_%sgr(%s,%s,%s,%s,%s)" f c1 c2 f1 f2 f3 | (F134|F143|F314) -> printf "%s%s_fgr(%s,%s,%s,%s,%s)" f d1 c1 c2 f1 f2 f3 | (F124|F142|F214) -> printf "%s%s_fgr(%s,%s,%s,%s,%s)" f d2 c1 c2 f1 f2 f3 | (F413|F431|F341) -> printf "%s%s_grf(%s,%s,%s,%s,%s)" f d1 c1 c2 f1 f2 f3 | (F241|F412|F421) -> printf "%s%s_grf(%s,%s,%s,%s,%s)" f d2 c1 c2 f1 f2 f3 let print_current_g4 = function | coeff, Gravbar, S2, _ -> print_fermion_g4_current coeff "s2" | coeff, Gravbar, SV, _ -> print_fermion_g4_vector_current coeff "sv" | coeff, Gravbar, SLV, _ -> print_fermion_g4_vector_current coeff "slv" | coeff, Gravbar, SRV, _ -> print_fermion_g4_vector_current coeff "srv" | coeff, Gravbar, SLRV, _ -> print_fermion_2_g4_vector_current coeff "slrv" | coeff, Gravbar, PV, _ -> print_fermion_g4_vector_current coeff "pv" | coeff, Gravbar, V2, _ -> print_fermion_g4_current coeff "v2" | coeff, Gravbar, V2LR, _ -> print_fermion_2_g4_current coeff "v2lr" | _, Gravbar, _, _ -> invalid_arg "print_current_g4: not implemented" | coeff, _, S2, Grav -> print_fermion_g4_current_rev coeff "s2" | coeff, _, SV, Grav -> print_fermion_g4_vector_current_rev (-coeff) "sv" | coeff, _, SLV, Grav -> print_fermion_g4_vector_current_rev (-coeff) "slv" | coeff, _, SRV, Grav -> print_fermion_g4_vector_current_rev (-coeff) "srv" | coeff, _, SLRV, Grav -> print_fermion_2_g4_vector_current_rev coeff "slrv" | coeff, _, PV, Grav -> print_fermion_g4_vector_current_rev coeff "pv" | coeff, _, V2, Grav -> print_fermion_g4_vector_current_rev coeff "v2" | coeff, _, V2LR, Grav -> print_fermion_2_g4_current_rev coeff "v2lr" | _, _, _, Grav -> invalid_arg "print_current_g4: not implemented" | coeff, _, S2, _ -> print_fermion_s2_current coeff "s" | coeff, _, P2, _ -> print_fermion_s2_current coeff "p" | coeff, _, S2P, _ -> print_fermion_s2p_current coeff "sp" | coeff, _, S2L, _ -> print_fermion_s2_current coeff "sl" | coeff, _, S2R, _ -> print_fermion_s2_current coeff "sr" | coeff, _, S2LR, _ -> print_fermion_s2lr_current coeff "slr" | coeff, _, V2, _ -> print_fermion_g4_brs_vector_current coeff "v2" | coeff, _, SV, _ -> print_fermion_g4_brs_vector_current coeff "sv" | coeff, _, PV, _ -> print_fermion_g4_brs_vector_current coeff "pv" | coeff, _, SLV, _ -> print_fermion_g4_brs_vector_current coeff "svl" | coeff, _, SRV, _ -> print_fermion_g4_brs_vector_current coeff "svr" | coeff, _, SLRV, _ -> print_fermion_g4_svlr_current coeff "svlr" | _, _, V2LR, _ -> invalid_arg "Targets.print_current: not available" - let reverse_braket _ = false + let reverse_braket vintage bra ket = + if vintage then + false + else + match bra, ket with + | Majorana, Majorana :: _ -> true + | _, _ -> false let use_module = "omega95_bispinors" let require_library = ["omega_bispinors_2010_01_A"; "omega_bispinor_cpls_2010_01_A"] end module Fortran_Majorana = Make_Fortran(Fortran_Majorana_Fermions) (* \thocwmodulesubsection{\texttt{FORTRAN\,77}} *) module Fortran77 = Dummy (* \thocwmodulesection{\texttt{C}} *) module C = Dummy (* \thocwmodulesubsection{\texttt{C++}} *) module Cpp = Dummy (* \thocwmodulesubsection{Java} *) module Java = Dummy (* \thocwmodulesection{O'Caml} *) module Ocaml = Dummy (* \thocwmodulesection{\LaTeX} *) module LaTeX = Dummy Index: trunk/omega/src/modellib_PSSSM.ml =================================================================== --- trunk/omega/src/modellib_PSSSM.ml (revision 8415) +++ trunk/omega/src/modellib_PSSSM.ml (revision 8416) @@ -1,1974 +1,1974 @@ (* modellib_PSSSM.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Extended Supersymmetric Standard Model(s)} *) (* This is based on the NMSSM implementation by Felix Braam, and extended to the exotica -- leptoquarks, leptoquarkinos, additional Higgses etc. -- by Daniel Wiesler. Note that for the Higgs sector vertices the conventions of the Franke/Fraas paper have been used. *) module type extMSSM_flags = sig val ckm_present : bool end module PSSSM : extMSSM_flags = struct let ckm_present = false end module PSSSM_QCD : extMSSM_flags = struct let ckm_present = false end module ExtMSSM (Flags : extMSSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] - + let caveats () = [] (*additional combinatorics *) (* yields a list of tuples consistig of the off-diag combinations of the elements in "set" *) let choose2 set = List.map (function [x;y] -> (x,y) | _ -> failwith "choose2") (Combinatorics.choose 2 set) (* [pairs] *) (* [pairs] appends the diagonal combinations to [choose2] *) let rec diag = function | [] -> [] | x1 :: rest -> (x1, x1) :: diag rest let pairs l = choose2 l @ diag l (* [triples] *) (* rank 3 generalization of [pairs] *) let rec cloop set i j k = if i > ((List.length set)-1) then [] else if j > i then cloop set (succ i) (j-i-1) (j-i-1) else if k > j then cloop set i (succ j) (k-j-1) else (List.nth set i, List.nth set j, List.nth set k) :: cloop set i j (succ k) let triples set = cloop set 0 0 0 (* [two_and_one] *) let rec two_and_one' l1 z n = if n < 0 then [] else ((fst (List.nth (pairs l1) n)),(snd (List.nth (pairs l1) n)), z):: two_and_one' l1 z (pred n) let two_and_one l1 l2 = let f z = two_and_one' l1 z ((List.length (pairs l1))-1) in List.flatten ( List.map f l2 ) type gen = | G of int | GG of gen*gen let rec string_of_gen = function | G n when n > 0 -> string_of_int n | G n -> string_of_int (abs n) ^ "c" | GG (g1,g2) -> string_of_gen g1 ^ "_" ^ string_of_gen g2 (* With this we distinguish the flavour. *) type sff = | SL | SN | SU | SD let string_of_sff = function | SL -> "sl" | SN -> "sn" | SU -> "su" | SD -> "sd" (* With this we distinguish the mass eigenstates. At the moment we have to cheat a little bit for the sneutrinos. Because we are dealing with massless neutrinos there is only one sort of sneutrino. *) type sfm = | M1 | M2 let string_of_sfm = function | M1 -> "1" | M2 -> "2" (* We also introduce special types for the charginos and neutralinos. *) type char = | C1 | C2 | C1c | C2c | C3 | C3c | C4 | C4c type neu = | N1 | N2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10 | N11 let int_of_char = function | C1 -> 1 | C2 -> 2 | C1c -> -1 | C2c -> -2 | C3 -> 3 | C4 -> 4 | C3c -> -3 | C4c -> -4 let string_of_char c = string_of_int (int_of_char c) let conj_char = function | C1 -> C1c | C2 -> C2c | C1c -> C1 | C2c -> C2 | C3 -> C3c | C4 -> C4c | C3c -> C3 | C4c -> C4 let string_of_neu = function | N1 -> "1" | N2 -> "2" | N3 -> "3" | N4 -> "4" | N5 -> "5" | N6 -> "6" | N7 -> "7" | N8 -> "8" | N9 -> "9" | N10 -> "10"| N11 -> "11" (* For NMSSM-like the Higgs bosons, we follow the conventions of Franke/Fraas. Daniel Wiesler: extended to E6 models. *) type shiggs = | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 type phiggs = | P1 | P2 | P3 | P4 | P5 | P6 | P7 (* [HCx] is always the $H^+$, [HCxc] the $H^-$. *) type chiggs = | HC1 | HC2 | HC3 | HC4 | HC5 | HC1c | HC2c | HC3c | HC4c | HC5c let conj_chiggs = function | HC1 -> HC1c | HC2 -> HC2c | HC1c -> HC1 | HC2c -> HC2 | HC3 -> HC3c | HC4 -> HC4c | HC3c -> HC3 | HC4c -> HC4 | HC5 -> HC5c | HC5c -> HC5 let string_of_shiggs = function | S1 -> "1" | S2 -> "2" | S3 -> "3" | S4 -> "4" | S5 -> "5" | S6 -> "6" | S7 -> "7" | S8 -> "8" | S9 -> "9" let string_of_phiggs = function | P1 -> "1" | P2 -> "2" | P3 -> "3" | P4 -> "4" | P5 -> "5" | P6 -> "6" | P7 -> "7" let nlist = [ N1; N2; N3; N4; N5; N6; N7; N8; N9; N10; N11 ] let slist = [ S1; S2; S3; S4; S5; S6; S7; S8; S9 ] let plist = [ P1; P2; P3; P4; P5; P6; P7 ] let clist = [ HC1; HC2; HC3; HC4; HC5; HC1c; HC2c; HC3c; HC4c; HC5c ] let charlist = [ C1; C2; C3; C4; C1c; C2c; C3c; C4c ] type flavor = | L of int | N of int | U of int | D of int | Sup of sfm*int | Sdown of sfm*int | Ga | Wp | Wm | Z | Gl | Slepton of sfm*int | Sneutrino of int | Neutralino of neu | Chargino of char | Gluino | SHiggs of shiggs | PHiggs of phiggs | CHiggs of chiggs | LQ of sfm*int | LQino of int let string_of_fermion_type = function | L _ -> "l" | U _ -> "u" | D _ -> "d" | N _ -> "n" | _ -> failwith "Modellib_PSSSM.ExtMSSM.string_of_fermion_type: invalid fermion type" let string_of_fermion_gen = function | L g | U g | D g | N g -> string_of_int (abs (g)) | _ -> failwith "Modellib_PSSSM.ExtMSSM.string_of_fermion_gen: invalid fermion type" type gauge = unit let gauge_symbol () = failwith "Modellib_PSSSM.ExtMSSM.gauge_symbol: internal error" (* At this point we will forget graviton and -ino. *) let family g = [ L g; N g; Slepton (M1,g); Slepton (M2,g); Sneutrino g; U g; D g; Sup (M1,g); Sup (M2,g); Sdown (M1,g); Sdown (M2,g); LQ (M1,g); LQ (M2,g); LQino g ] let external_flavors () = [ "1st Generation matter", ThoList.flatmap family [1; -1]; "2nd Generation matter", ThoList.flatmap family [2; -2]; "3rd Generation matter", ThoList.flatmap family [3; -3]; "Gauge Bosons", [Ga; Z; Wp; Wm; Gl]; "Charginos", List.map (fun a -> Chargino a) charlist; "Neutralinos", List.map (fun a -> Neutralino a) nlist; "Higgs Bosons", List.map (fun a -> SHiggs a) slist @ List.map (fun a -> PHiggs a) plist @ List.map (fun a -> CHiggs a) clist; "Gluino", [Gluino]] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n m = if n >= 0 && m >= 0 then Spinor else if n <= 0 && m <=0 then ConjSpinor else invalid_arg "Modellib_PSSSM.ExtMSSM.spinor: internal error" let lorentz = function | L g -> spinor g 0 | N g -> spinor g 0 | U g -> spinor g 0 | D g -> spinor g 0 | LQino g -> spinor g 0 | Chargino c -> spinor (int_of_char c) 0 | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector | SHiggs _ | PHiggs _ | CHiggs _ | Sup _ | Sdown _ | Slepton _ | Sneutrino _ | LQ _ -> Scalar | Neutralino _ | Gluino -> Majorana let color = function | U g -> Color.SUN (if g > 0 then 3 else -3) | Sup (m,g) -> Color.SUN (if g > 0 then 3 else -3) | D g -> Color.SUN (if g > 0 then 3 else -3) | Sdown (m,g) -> Color.SUN (if g > 0 then 3 else -3) | LQ (m,g) -> Color.SUN (if g > 0 then 3 else -3) | LQino g -> Color.SUN (if g > 0 then 3 else -3) | Gl | Gluino -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n m = if n >= 0 && m >=0 then Prop_Spinor else if n <=0 && m <=0 then Prop_ConjSpinor else invalid_arg "Modellib_PSSSM.ExtMSSM.prop_spinor: internal error" let propagator = function | L g -> prop_spinor g 0 | N g -> prop_spinor g 0 | U g -> prop_spinor g 0 | D g -> prop_spinor g 0 | LQino g -> prop_spinor g 0 | Chargino c -> prop_spinor (int_of_char c) 0 | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity | SHiggs _ | PHiggs _ | CHiggs _ -> Prop_Scalar | Sup _ | Sdown _ | Slepton _ | Sneutrino _ -> Prop_Scalar | LQ _ -> Prop_Scalar | Gluino -> Prop_Majorana | Neutralino _ -> Prop_Majorana (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | Wp | Wm | U 3 | U (-3) -> Fudged | _ -> !default_width else !default_width let goldstone _ = None let conjugate = function | L g -> L (-g) | N g -> N (-g) | U g -> U (-g) | D g -> D (-g) | Sup (m,g) -> Sup (m,-g) | Sdown (m,g) -> Sdown (m,-g) | Slepton (m,g) -> Slepton (m,-g) | Sneutrino g -> Sneutrino (-g) | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | SHiggs s -> SHiggs s | PHiggs p -> PHiggs p | CHiggs c -> CHiggs (conj_chiggs c) | Gluino -> Gluino | Neutralino n -> Neutralino n | Chargino c -> Chargino (conj_char c) | LQino g -> LQino (-g) | LQ (m,g) -> LQ (m,-g) let fermion = function | L g -> if g > 0 then 1 else -1 | N g -> if g > 0 then 1 else -1 | U g -> if g > 0 then 1 else -1 | D g -> if g > 0 then 1 else -1 | Gl | Ga | Z | Wp | Wm -> 0 | SHiggs _ | PHiggs _ | CHiggs _ -> 0 | Neutralino _ -> 2 | Chargino c -> if (int_of_char c) > 0 then 1 else -1 | Sup _ -> 0 | Sdown _ -> 0 | Slepton _ -> 0 | Sneutrino _ -> 0 | Gluino -> 2 | LQ _ -> 0 | LQino g -> if g > 0 then 1 else -1 (* This model does NOT have a conserved generation quantum number. *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let charge = function | L n -> if n > 0 then -1//1 else 1//1 | Slepton (_,n) -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | Sneutrino n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | Sup (_,n) -> if n > 0 then 2//3 else -2//3 | D n | LQ (_,n) | LQino n -> if n > 0 then -1//3 else 1//3 | Sdown (_,n) -> if n > 0 then -1//3 else 1//3 | Gl | Ga | Z | Neutralino _ | Gluino -> 0//1 | Wp -> 1//1 | Wm -> -1//1 | SHiggs _ | PHiggs _ -> 0//1 | CHiggs (HC1|HC2|HC3|HC4|HC5) -> 1//1 | CHiggs (HC1c|HC2c|HC3c|HC4c|HC5c) -> -1//1 | Chargino (C1|C2|C3|C4) -> 1//1 | Chargino (C1c|C2c|C3c|C4c) -> -1//1 let lepton = function | L n | N n -> if n > 0 then 1//1 else -1//1 | Slepton (_,n) | Sneutrino n -> if n > 0 then 1//1 else -1//1 | LQ (_,n) | LQino n -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let baryon = function | U n | D n -> if n > 0 then 1//1 else -1//1 | Sup (_,n) | Sdown (_,n) -> if n > 0 then 1//1 else -1//1 | LQ (_,n) | LQino n -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] (* We introduce a Boolean type vc as a pseudonym for Vertex Conjugator to distinguish between vertices containing complex mixing matrices like the CKM--matrix or the sfermion or neutralino/chargino--mixing matrices, which have to become complex conjugated. The true--option stands for the conjugated vertex, the false--option for the unconjugated vertex. *) type vc = bool type constant = | E | G | Q_lepton | Q_up | Q_down | Q_charg | G_Z | G_CC | G_CCQ of vc*int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_PZWW | G_PPWW | G_strong | G_SS | I_G_S | Gs | G_NZN of neu*neu | G_CZC of char*char | G_YUK_FFS of flavor*flavor*shiggs | G_YUK_FFP of flavor*flavor*phiggs | G_YUK_LCN of int | G_YUK_UCD of int*int | G_YUK_DCU of int*int | G_NHC of vc*neu*char | G_YUK_C of vc*flavor*char*sff*sfm | G_YUK_Q of vc*int*flavor*char*sff*sfm | G_YUK_N of vc*flavor*neu*sff*sfm | G_YUK_G of vc*flavor*sff*sfm | G_NWC of neu*char | G_CWN of char*neu | G_CSC of char*char*shiggs | G_CPC of char*char*phiggs | G_WSQ of vc*int*int*sfm*sfm | G_SLSNW of vc*int*sfm | G_ZSF of sff*int*sfm*sfm | G_CICIS of neu*neu*shiggs | G_CICIP of neu*neu*phiggs | G_GH_WPC of phiggs | G_GH_WSC of shiggs | G_GH_ZSP of shiggs*phiggs | G_GH_WWS of shiggs | G_GH_ZZS of shiggs | G_GH_ZCC | G_GH_GaCC | G_GH4_ZZPP of phiggs*phiggs | G_GH4_ZZSS of shiggs*shiggs | G_GH4_ZZCC | G_GH4_GaGaCC | G_GH4_ZGaCC | G_GH4_WWCC | G_GH4_WWPP of phiggs*phiggs | G_GH4_WWSS of shiggs*shiggs | G_GH4_ZWSC of shiggs | G_GH4_GaWSC of shiggs | G_GH4_ZWPC of phiggs | G_GH4_GaWPC of phiggs | G_WWSFSF of sff*int*sfm*sfm | G_WPSLSN of vc*int*sfm | G_H3_SCC of shiggs | G_H3_SSS of shiggs*shiggs*shiggs | G_H3_SPP of shiggs*phiggs*phiggs | G_SFSFS of shiggs*sff*int*sfm*sfm | G_SFSFP of phiggs*sff*int*sfm*sfm | G_HSNSL of vc*int*sfm | G_HSUSD of vc*sfm*sfm*int*int | G_WPSUSD of vc*sfm*sfm*int*int | G_WZSUSD of vc*sfm*sfm*int*int | G_WZSLSN of vc*int*sfm | G_GlGlSQSQ | G_PPSFSF of sff | G_ZZSFSF of sff*int*sfm*sfm | G_ZPSFSF of sff*int*sfm*sfm | G_GlZSFSF of sff*int*sfm*sfm | G_GlPSQSQ | G_GlWSUSD of vc*sfm*sfm*int*int | G_YUK_LQ_S of int*shiggs*int | G_YUK_LQ_P of int*phiggs*int | G_LQ_NEU of sfm*int*int*neu | G_LQ_EC_UC of vc*sfm*int*int*int | G_LQ_GG of sfm*int*int | G_LQ_SSU of sfm*sfm*sfm*int*int*int | G_LQ_SSD of sfm*sfm*int*int*int | G_LQ_S of sfm*sfm*int*shiggs*int | G_LQ_P of sfm*sfm*int*phiggs*int | G_ZLQ of int*sfm*sfm | G_ZZLQLQ | G_ZPLQLQ | G_PPLQLQ | G_ZGlLQLQ | G_PGlLQLQ | G_NLQC | G_GlGlLQLQ (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} Here we must perhaps allow for complex input parameters. So split them into their modulus and their phase. At first, we leave them real; the generalization to complex parameters is obvious. *) let parameters () = { input = []; derived = []; derived_arrays = [] } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* For the couplings there are generally two possibilities concerning the sign of the covariant derivative. \begin{equation} {\rm CD}^\pm = \partial_\mu \pm \ii g T^a A^a_\mu \end{equation} The particle data group defines the signs consistently to be positive. Since the convention for that signs also influence the phase definitions of the gaugino/higgsino fields via the off-diagonal entries in their mass matrices it would be the best to adopt that convention. *) (*** REVISED: Compatible with CD+. FB ***) let electromagnetic_currents_3 g = [ ((L (-g), Ga, L g), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-g), Ga, U g), FBF (1, Psibar, V, Psi), Q_up); ((D (-g), Ga, D g), FBF (1, Psibar, V, Psi), Q_down)] (*** REVISED: Compatible with CD+. FB***) let electromagnetic_sfermion_currents g m = [ ((Ga, Slepton (m,-g), Slepton (m,g)), Vector_Scalar_Scalar 1, Q_lepton); ((Ga, Sup (m,-g), Sup (m,g)), Vector_Scalar_Scalar 1, Q_up); ((Ga, Sdown (m,-g), Sdown (m,g)), Vector_Scalar_Scalar 1, Q_down)] (*** REVISED: Compatible with CD+. FB***) let electromagnetic_currents_2 c = let cc = conj_char c in [ ((Chargino cc, Ga, Chargino c), FBF (1, Psibar, V, Psi), Q_charg) ] (*** REVISED: Compatible with CD+. FB***) let neutral_currents g = [ ((L (-g), Z, L g), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-g), Z, N g), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-g), Z, U g), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-g), Z, D g), FBF (1, Psibar, VA, Psi), G_NC_down)] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = \mp \frac{g}{2\sqrt2} \sum_i \bar\psi_i \gamma^\mu (1-\gamma_5)(T^+W^+_\mu+T^-W^-_\mu)\psi_i , \end{equation} where the sign corresponds to $\text{CD}_\pm$, respectively. *) (*** REVISED: Compatible with CD+. ***) (* Remark: The definition with the other sign compared to the SM files comes from the fact that $g_{cc} = 1/(2\sqrt{2})$ is used overwhelmingly often in the SUSY Feynman rules, so that JR decided to use a different definiton for [g_cc] in SM and MSSM. *) (** FB **) let charged_currents g = [ ((L (-g), Wm, N g), FBF ((-1), Psibar, VL, Psi), G_CC); ((N (-g), Wp, L g), FBF ((-1), Psibar, VL, Psi), G_CC) ] (* The quark with the inverted generation (the antiparticle) is the outgoing one, the other the incoming. The vertex attached to the outgoing up-quark contains the CKM matrix element {\em not} complex conjugated, while the vertex with the outgoing down-quark has the conjugated CKM matrix element. *) (*** REVISED: Compatible with CD+. FB ***) let charged_quark_currents g h = [ ((D (-g), Wm, U h), FBF ((-1), Psibar, VL, Psi), G_CCQ (true,g,h)); ((U (-g), Wp, D h), FBF ((-1), Psibar, VL, Psi), G_CCQ (false,h,g))] (*** REVISED: Compatible with CD+.FB ***) let charged_chargino_currents n c = let cc = conj_char c in [ ((Chargino cc, Wp, Neutralino n), FBF (1, Psibar, VLR, Chi), G_CWN (c,n)); ((Neutralino n, Wm, Chargino c), FBF (1, Chibar, VLR, Psi), G_NWC (n,c)) ] (*** REVISED: Compatible with CD+. FB***) let charged_slepton_currents g m = [ ((Wm, Slepton (m,-g), Sneutrino g), Vector_Scalar_Scalar (-1), G_SLSNW (true,g,m)); ((Wp, Slepton (m,g), Sneutrino (-g)), Vector_Scalar_Scalar 1, G_SLSNW (false,g,m)) ] (*** REVISED: Compatible with CD+. FB***) let charged_squark_currents' g h m1 m2 = [ ((Wm, Sup (m1,g), Sdown (m2,-h)), Vector_Scalar_Scalar (-1), G_WSQ (true,g,h,m1,m2)); ((Wp, Sup (m1,-g), Sdown (m2,h)), Vector_Scalar_Scalar 1, G_WSQ (false,g,h,m1,m2)) ] let charged_squark_currents g h = List.flatten (Product.list2 (charged_squark_currents' g h) [M1;M2] [M1;M2] ) (*** REVISED: Compatible with CD+. FB ***) let neutral_sfermion_currents' g m1 m2 = [ ((Z, Slepton (m1,-g), Slepton (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SL,g,m1,m2)); ((Z, Sup (m1,-g), Sup (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SU,g,m1,m2)); ((Z, Sdown (m1,-g), Sdown (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SD,g,m1,m2))] let neutral_sfermion_currents g = List.flatten (Product.list2 (neutral_sfermion_currents' g) [M1;M2] [M1;M2]) @ [ ((Z, Sneutrino (-g), Sneutrino g), Vector_Scalar_Scalar (-1), G_ZSF (SN,g,M1,M1)) ] (* The reality of the coupling of the Z-boson to two identical neutralinos makes the vector part of the coupling vanish. So we distinguish them not by the name but by the structure of the couplings. *) (*** REVISED: Compatible with CD+. FB***) let neutral_Z (n,m) = [ ((Neutralino n, Z, Neutralino m), FBF (1, Chibar, VA, Chi), (G_NZN (n,m))) ] (*** REVISED: Compatible with CD+. FB***) let charged_Z c1 c2 = let cc1 = conj_char c1 in ((Chargino cc1, Z, Chargino c2), FBF ((-1), Psibar, VA , Psi), G_CZC (c1,c2)) (*** REVISED: Compatible with CD+. Remark: This is pure octet. FB***) let yukawa_v = [ (Gluino, Gl, Gluino), FBF (1, Chibar, V, Chi), Gs] (*** REVISED: Independent of the sign of CD. ***) (*** REVISED: Felix Braam: Compact version using new COMBOS + FF-Couplings *) let yukawa_higgs_FFS f s = [((conjugate f, SHiggs s, f ), FBF (1, Psibar, S, Psi), G_YUK_FFS (conjugate f, f, s))] let yukawa_higgs_FFP f p = [((conjugate f, PHiggs p, f), FBF (1, Psibar, P, Psi), G_YUK_FFP (conjugate f ,f , p))] (* JR: Only the first charged Higgs. *) let yukawa_higgs_NLC g = [ ((N (-g), CHiggs HC1, L g), FBF (1, Psibar, Coupling.SR, Psi), G_YUK_LCN g); ((L (-g), CHiggs HC1c, N g), FBF (1, Psibar, Coupling.SL, Psi), G_YUK_LCN g)] let yukawa_higgs g = yukawa_higgs_NLC g @ List.flatten ( Product.list2 yukawa_higgs_FFS [L g; U g; D g] [S1; S2; S3]) @ List.flatten ( Product.list2 yukawa_higgs_FFP [L g; U g; D g] [P1; P2]) (* JR: Only the first charged Higgs. *) (*** REVISED: Independent of the sign of CD. FB***) let yukawa_higgs_quark (g,h) = [ ((U (-g), CHiggs HC1, D h), FBF (1, Psibar, SLR, Psi), G_YUK_UCD (g, h)); ((D (-h), CHiggs HC1c, U g), FBF (1, Psibar, SLR, Psi), G_YUK_DCU (g, h)) ] (*** REVISED: Compatible with CD+.FB*) (*** REVISED: Compact version using new COMBOS*) let yukawa_shiggs_2 c1 c2 s = let cc1 = conj_char c1 in ((Chargino cc1, SHiggs s, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CSC (c1,c2,s)) let yukawa_phiggs_2 c1 c2 p = let cc1 = conj_char c1 in ((Chargino cc1, PHiggs p, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CPC (c1,c2,p)) let yukawa_higgs_2 = Product.list3 yukawa_shiggs_2 [C1;C2] [C1;C2] [S1;S2;S3] @ Product.list3 yukawa_phiggs_2 [C1;C2] [C1;C2] [P1;P2] (* JR: Only the first charged Higgs. *) (*** REVISED: Compatible with CD+.FB ***) let higgs_charg_neutr n c = let cc = conj_char c in [ ((Neutralino n, CHiggs HC1c, Chargino c), FBF (-1, Chibar, SLR, Psi), G_NHC (false,n,c)); ((Chargino cc, CHiggs HC1, Neutralino n), FBF (-1, Psibar, SLR, Chi), G_NHC (true,n,c)) ] (*** REVISED: Compatible with CD+. FB***) (*** REVISED: Compact version using new COMBOS*) let shiggs_neutr (n,m,s) = ((Neutralino n, SHiggs s, Neutralino m), FBF (1, Chibar, SP, Chi), G_CICIS (n,m,s)) let phiggs_neutr (n,m,p) = ((Neutralino n, PHiggs p, Neutralino m), FBF (1, Chibar, SP, Chi), G_CICIP (n,m,p)) let higgs_neutr = List.map shiggs_neutr (two_and_one [N1;N2;N3;N4;N5] [S1;S2;S3]) @ List.map phiggs_neutr (two_and_one [N1;N2;N3;N4;N5] [P1;P2]) (*** REVISED: Compatible with CD+. FB***) let yukawa_n_2 n m g = [ ((Neutralino n, Slepton (m,-g), L g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,L g,n,SL,m)); ((L (-g), Slepton (m,g), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,L g,n,SL,m)); ((Neutralino n, Sup (m,-g), U g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,U g,n,SU,m)); ((U (-g), Sup (m,g), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,U g,n,SU,m)); ((Neutralino n, Sdown (m,-g), D g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,D g,n,SD,m)); ((D (-g), Sdown (m,g), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,D g,n,SD,m)) ] let yukawa_n_3 n g = [ ((Neutralino n, Sneutrino (-g), N g), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,N g,n,SN,M1)); ((N (-g), Sneutrino g, Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,N g, n,SN,M1)) ] let yukawa_n_5 g m = [ ((U (-g), Sup (m,g), Gluino), FBF (1, Psibar, SLR, Chi), G_YUK_G (false,U g,SU,m)); ((D (-g), Sdown (m,g), Gluino), FBF (1, Psibar, SLR, Chi), G_YUK_G (false,D g,SD,m)); ((Gluino, Sup (m,-g), U g), FBF (1, Chibar, SLR, Psi), G_YUK_G (true,U g,SU,m)); ((Gluino, Sdown (m,-g), D g), FBF (1, Chibar, SLR, Psi), G_YUK_G (true,D g,SD,m))] let yukawa_n = List.flatten (Product.list3 yukawa_n_2 [N1;N2;N3;N4;N5] [M1;M2] [1;2;3]) @ List.flatten (Product.list2 yukawa_n_3 [N1;N2;N3;N4;N5] [1;2;3]) @ List.flatten (Product.list2 yukawa_n_5 [1;2;3] [M1;M2]) (*** REVISED: Compatible with CD+.FB ***) let yukawa_c_2 c g = let cc = conj_char c in [ ((L (-g), Sneutrino g, Chargino cc), BBB (1, Psibar, SLR, Psibar), G_YUK_C (true,L g,c,SN,M1)); ((Chargino c, Sneutrino (-g), L g), PBP (1, Psi, SLR, Psi), G_YUK_C (false,L g,c,SN,M1)) ] let yukawa_c_3 c m g = let cc = conj_char c in [ ((N (-g), Slepton (m,g), Chargino c), FBF (1, Psibar, SLR, Psi), G_YUK_C (true,N g,c,SL,m)); ((Chargino cc, Slepton (m,-g), N g), FBF (1, Psibar, SLR, Psi), G_YUK_C (false,N g,c,SL,m)) ] let yukawa_c c = ThoList.flatmap (yukawa_c_2 c) [1;2;3] @ List.flatten (Product.list2 (yukawa_c_3 c) [M1;M2] [1;2;3]) (*** REVISED: Compatible with CD+. FB***) let yukawa_cq' c (g,h) m = let cc = conj_char c in [ ((Chargino c, Sup (m,-g), D h), PBP (1, Psi, SLR, Psi), G_YUK_Q (false,g,D h,c,SU,m)); ((D (-h), Sup (m,g), Chargino cc), BBB (1, Psibar, SLR, Psibar), G_YUK_Q (true,g,D h,c,SU,m)); ((Chargino cc, Sdown (m,-g), U h), FBF (1, Psibar, SLR, Psi), G_YUK_Q (true,g,U h,c,SD,m)); ((U (-h), Sdown (m,g), Chargino c), FBF (1, Psibar, SLR, Psi), G_YUK_Q (false,g,U h,c,SD,m)) ] let yukawa_cq c = if Flags.ckm_present then List.flatten (Product.list2 (yukawa_cq' c) [(1,1);(1,2);(2,1);(2,2);(1,3);(2,3);(3,3);(3,2);(3,1)] [M1;M2]) else List.flatten (Product.list2 (yukawa_cq' c) [(1,1);(2,2);(3,3)] [M1;M2]) (*** REVISED: Compatible with CD+. Remark: Singlet and octet gluon exchange. The coupling is divided by sqrt(2) to account for the correct normalization of the Lie algebra generators. **FB*) let col_currents g = [ ((D (-g), Gl, D g), FBF ((-1), Psibar, V, Psi), Gs); ((U (-g), Gl, U g), FBF ((-1), Psibar, V, Psi), Gs)] (*** REVISED: Compatible with CD+. Remark: Singlet and octet gluon exchange. The coupling is divided by sqrt(2) to account for the correct normalization of the Lie algebra generators. **FB*) (** LQ-coupl. **DW**) let chg = function | M1 -> M2 | M2 -> M1 (** LQ - Yuk's **) let yuk_lqino_se_uc1' g1 g2 g3 m = let cm = chg m in [ ((U (-g3), Slepton (m,-g2), LQino g1), FBF (1, Psibar, SLR, Psi), G_LQ_EC_UC (true,cm,g1,g2,g3)) ] let yuk_lqino_se_uc1 g1 g2 g3 = ThoList.flatmap (yuk_lqino_se_uc1' g1 g2 g3) [M1;M2] let yuk_lqino_se_uc2' g1 g2 g3 m = let cm = chg m in [ ((LQino (-g1), Slepton (m,g2), U g3), FBF (1, Psibar, SLR, Psi), G_LQ_EC_UC (false,cm,g1,g2,g3)) ] let yuk_lqino_se_uc2 g1 g2 g3 = ThoList.flatmap (yuk_lqino_se_uc2' g1 g2 g3) [M1;M2] let yuk_lqino_sn_dc1 g1 g2 g3 = [ ((D (-g3), Sneutrino (-g2), LQino g1), FBF (-1, Psibar, SLR, Psi), G_LQ_EC_UC (true,M2,g1,g2,g3)) ] let yuk_lqino_sn_dc2 g1 g2 g3 = [ ((LQino (-g1), Sneutrino g2, D g3), FBF (-1, Psibar, SLR, Psi), G_LQ_EC_UC (false,M2,g1,g2,g3)) ] let yuk_lqino_ec_su1' g1 g2 g3 m = let cm = chg m in [ ((LQino (-g1), Sup (m,g3), L g2), FBF (1, Psibar, SLR, Psi), G_LQ_EC_UC (true,cm,g1,g2,g3)) ] let yuk_lqino_ec_su1 g1 g2 g3 = ThoList.flatmap (yuk_lqino_ec_su1' g1 g2 g3) [M1;M2] let yuk_lqino_ec_su2' g1 g2 g3 m = let cm = chg m in [ ((L (-g2), Sup (m,-g3), LQino (g1)), FBF (1, Psibar, SLR, Psi), G_LQ_EC_UC (false,cm,g1,g2,g3)) ] let yuk_lqino_ec_su2 g1 g2 g3 = ThoList.flatmap (yuk_lqino_ec_su2' g1 g2 g3) [M1;M2] let yuk_lqino_nc_sd1 g1 g2 g3 = [ ((LQino (-g1), Sdown (M1,g3), N g2), FBF (-1, Psibar, SLR, Psi), G_LQ_EC_UC (true,M2,g1,g2,g3)) ] let yuk_lqino_nc_sd2 g1 g2 g3 = [ ((N (-g2), Sdown (M1,-g3), LQino (g1)), FBF (-1, Psibar, SLR, Psi), G_LQ_EC_UC (false,M2,g1,g2,g3)) ] let yuk_lq_ec_uc' g1 g2 g3 m = [ ((L (-g2), LQ (m,g1), U (-g3)), BBB (1, Psibar, SLR, Psibar), G_LQ_EC_UC (false,m,g1,g2,g3)) ] let yuk_lq_ec_uc g1 g2 g3 = ThoList.flatmap (yuk_lq_ec_uc' g1 g2 g3) [M1;M2] let yuk_lq_ec_uc2' g1 g2 g3 m = [ ((L (g2), LQ (m,-g1), U (g3)), PBP (1, Psi, SLR, Psi), G_LQ_EC_UC (true,m,g1,g2,g3)) ] let yuk_lq_ec_uc2 g1 g2 g3 = ThoList.flatmap (yuk_lq_ec_uc2' g1 g2 g3) [M1;M2] let yuk_lq_nc_dc g1 g2 g3 = [ ((N (-g2), LQ (M2,g1), D (-g3)), BBB (-1, Psibar, SLR, Psibar), G_LQ_EC_UC (false,M2,g1,g2,g3)) ] let yuk_lq_nc_dc2 g1 g2 g3 = [ ((N (g2), LQ (M2,-g1), D (g3)), PBP (-1, Psi, SLR, Psi), G_LQ_EC_UC (true,M2,g1,g2,g3)) ] (*** Daniel Wiesler: LQ - F-Term w/ vev ***) let lq_se_su' g1 g2 g3 m1 m2 m3 = [ ((LQ (m1,g1), Slepton (m2,-g2), Sup (m3,-g3)), Scalar_Scalar_Scalar 1, G_LQ_SSU (m1,m2,m3,g1,g2,g3)) ] let lq_se_su g1 g2 g3 = List.flatten (Product.list3 (lq_se_su' g1 g2 g3) [M1;M2] [M1;M2] [M1;M2] ) let lq_snu_sd' g1 g2 g3 m1 m2 = [ ((LQ (m1,g1), Sdown (m2,-g2), Sneutrino (-g3)), Scalar_Scalar_Scalar 1, G_LQ_SSD (m1,m2,g1,g2,g3)) ] let lq_snu_sd g1 g2 g3 = List.flatten (Product.list2 (lq_snu_sd' g1 g2 g3) [M1;M2] [M1;M2] ) (*** Daniel Wiesler: LQ - Higgs ***) let lq_shiggs' g1 s g2 m1 m2 = [ ((LQ (m1,g1), SHiggs s, LQ (m2,-g2)), Scalar_Scalar_Scalar 1, G_LQ_S (m1,m2,g1,s,g2))] let lq_shiggs g1 s g2 = List.flatten ( Product.list2 (lq_shiggs' g1 s g2) [M1;M2] [M1;M2]) let lq_phiggs' g1 p g2 m1 m2 = [ ((LQ (m1,g1), PHiggs p, LQ (m2,-g2)), Scalar_Scalar_Scalar 1, G_LQ_P (m1,m2,g1,p,g2))] let lq_phiggs g1 p g2 = List.flatten ( Product.list2 (lq_phiggs' g1 p g2) [M1;M2] [M1;M2]) let yuk_lqino_shiggs g1 s g2 = [ ((LQino (-g1), SHiggs s, LQino g2), FBF (1, Psibar, SLR, Psi), G_YUK_LQ_S (g1,s,g2)) ] let yuk_lqino_phiggs g1 p g2 = [ ((LQino (-g1), PHiggs p, LQino g2), FBF (1, Psibar, SLR, Psi), G_YUK_LQ_P (g1,p,g2)) ] (*** Daniel Wiesler: LQ - Neutralinos. ***) let lqino_lq_neu' n g1 g2 m = [ ((Neutralino n, LQ (m,-g1), LQino g2), FBF (1, Chibar, SLR, Psi), G_LQ_NEU (m,g1,g2,n)) ] let lqino_lq_neu n g1 g2 = ThoList.flatmap (lqino_lq_neu' n g1 g2) [M1;M2] let lqino_lq_neu2' n g1 g2 m = [ ((LQino (-g2), LQ (m,g1), Neutralino n), FBF (1, Psibar, SLR, Chi), G_LQ_NEU (m,g1,g2,n)) ] let lqino_lq_neu2 n g1 g2 = ThoList.flatmap (lqino_lq_neu2' n g1 g2) [M1;M2] (*** Daniel Wiesler: LQ-LQino-Gluino ***) let lqino_lq_gg' g1 g2 m = [ ((Gluino, LQ (m,-g1), LQino g2), FBF (1, Chibar, SLR, Psi), G_LQ_GG (m,g1,g2)) ] let lqino_lq_gg g1 g2 = ThoList.flatmap (lqino_lq_gg' g1 g2) [M1;M2] (*** Daniel Wiesler: LQ - Gauge ***) let col_lqino_currents g = [ ((LQino (-g), Gl, LQino g), FBF ((-1), Psibar, V, Psi), Gs)] let neutr_lqino_current g = [ ((LQino (-g), Z, LQino g), FBF (1, Psibar, V, Psi), G_NLQC)] let col_lq_currents m g = [ ((Gl, LQ (m,-g), LQ (m,g)), Vector_Scalar_Scalar (-1), Gs)] let lq_neutr_Z g m1 m2 = [ ((Z, LQ (m1,-g), LQ (m2,g)), Vector_Scalar_Scalar (-1), G_ZLQ (g,m1,m2))] let em_lq_currents g m = [ ((Ga, LQ (m,-g), LQ (m,g)), Vector_Scalar_Scalar 1, Q_down)] let em_lqino_currents g = [ ((LQino (-g), Ga, LQino g), FBF (1, Psibar, V, Psi), Q_down)] let gluon2_lq2' g m = [ ((LQ (m,g), LQ (m,-g), Gl, Gl), Scalar2_Vector2 2, G_GlGlLQLQ)] let gluon2_lq2 g = ThoList.flatmap (gluon2_lq2' g) [M1;M2] let lq_gauge4' g m = [ ((Z, Z, LQ (m,g), LQ (m,-g)), Scalar2_Vector2 1, G_ZZLQLQ); ((Z, Ga, LQ (m,g), LQ (m,-g)), Scalar2_Vector2 1, G_ZPLQLQ); ((Ga, Ga, LQ (m,g), LQ (m,-g)), Scalar2_Vector2 1, G_PPLQLQ)] let lq_gauge4 g = ThoList.flatmap (lq_gauge4' g) [M1;M2] let lq_gg_gauge2' g m = [ ((Z, Gl, LQ (m,g), LQ (m,-g)), Scalar2_Vector2 1, G_ZGlLQLQ); ((Ga, Gl, LQ (m,g), LQ (m,-g)), Scalar2_Vector2 1, G_PGlLQLQ)] let lq_gg_gauge2 g = ThoList.flatmap (lq_gg_gauge2' g) [M1;M2] let col_sfermion_currents g m = [ ((Gl, Sup (m,-g), Sup (m,g)), Vector_Scalar_Scalar (-1), Gs); ((Gl, Sdown (m,-g), Sdown (m,g)), Vector_Scalar_Scalar (-1), Gs)] (*** REVISED: Compatible with CD+. **FB*) let triple_gauge = [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_G_S)] (*** REVISED: Independent of the sign of CD. **FB*) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_PZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_PPWW; (Gl, Gl, Gl, Gl), gauge4, G_SS] (* The [Scalar_Vector_Vector] couplings do not depend on the choice of the sign of the covariant derivative since they are quadratic in the gauge couplings. *) (* JR: Only the first charged Higgs. *) (*** REVISED: Compatible with CD+. ***) (*** Revision: 2005-03-10: first two vertices corrected. ***) (*** REVISED: Felix Braam: Compact version using new COMBOS*) (*** REVISED: Felix Braam: Couplings adjusted to FF-convention*) let gauge_higgs_WPC p= [ ((Wm, CHiggs HC1, PHiggs p), Vector_Scalar_Scalar 1, G_GH_WPC p); ((Wp, CHiggs HC1c, PHiggs p), Vector_Scalar_Scalar 1, G_GH_WPC p)] let gauge_higgs_WSC s= [((Wm, CHiggs HC1, SHiggs s),Vector_Scalar_Scalar 1, G_GH_WSC s); ((Wp, CHiggs HC1c, SHiggs s),Vector_Scalar_Scalar (-1), G_GH_WSC s)] let gauge_higgs_ZSP s p = [((Z, SHiggs s, PHiggs p),Vector_Scalar_Scalar 1, G_GH_ZSP (s,p))] let gauge_higgs_WWS s= ((SHiggs s, Wp, Wm),Scalar_Vector_Vector 1, G_GH_WWS s) let gauge_higgs_ZZS s= ((SHiggs s, Z, Z), Scalar_Vector_Vector 1, G_GH_ZZS s) let gauge_higgs_ZCC = ((Z, CHiggs HC1, CHiggs HC1c),Vector_Scalar_Scalar 1, G_GH_ZCC ) let gauge_higgs_GaCC = ((Ga, CHiggs HC1, CHiggs HC1c),Vector_Scalar_Scalar 1, G_GH_GaCC ) let gauge_higgs = ThoList.flatmap gauge_higgs_WPC [P1;P2] @ ThoList.flatmap gauge_higgs_WSC [S1;S2;S3] @ List.flatten (Product.list2 gauge_higgs_ZSP [S1;S2;S3] [P1;P2]) @ List.map gauge_higgs_WWS [S1;S2;S3] @ List.map gauge_higgs_ZZS [S1;S2;S3] @ [gauge_higgs_ZCC] @ [gauge_higgs_GaCC] (*** REVISED: Compact version using new COMBOS*) (*** REVISED: Couplings adjusted to FF-convention*) let gauge_higgs4_ZZPP (p1,p2) = ((PHiggs p1, PHiggs p2, Z, Z), Scalar2_Vector2 1, G_GH4_ZZPP (p1,p2)) let gauge_higgs4_ZZSS (s1,s2) = ((SHiggs s1, SHiggs s2 , Z, Z), Scalar2_Vector2 1, G_GH4_ZZSS (s1,s2)) (* JR: Only the first charged Higgs. *) let gauge_higgs4_ZZCC = ((CHiggs HC1, CHiggs HC1c, Z, Z), Scalar2_Vector2 1, G_GH4_ZZCC) let gauge_higgs4_GaGaCC = ((CHiggs HC1, CHiggs HC1c, Ga, Ga), Scalar2_Vector2 1, G_GH4_GaGaCC) let gauge_higgs4_ZGaCC = ((CHiggs HC1, CHiggs HC1c, Ga, Z), Scalar2_Vector2 1, G_GH4_ZGaCC ) let gauge_higgs4_WWCC = ((CHiggs HC1, CHiggs HC1c, Wp, Wm), Scalar2_Vector2 1, G_GH4_WWCC ) let gauge_higgs4_WWPP (p1,p2) = ((PHiggs p1, PHiggs p2, Wp, Wm), Scalar2_Vector2 1, G_GH4_WWPP (p1,p2)) let gauge_higgs4_WWSS (s1,s2) = ((SHiggs s1, SHiggs s2, Wp, Wm), Scalar2_Vector2 1, G_GH4_WWSS (s1,s2)) (* JR: Only the first charged Higgs. *) let gauge_higgs4_ZWSC s = [ ((CHiggs HC1, SHiggs s, Wm, Z), Scalar2_Vector2 1, G_GH4_ZWSC s); ((CHiggs HC1c, SHiggs s, Wp, Z), Scalar2_Vector2 1, G_GH4_ZWSC s)] let gauge_higgs4_GaWSC s = [ ((CHiggs HC1, SHiggs s, Wm, Ga), Scalar2_Vector2 1, G_GH4_GaWSC s); ((CHiggs HC1c, SHiggs s, Wp, Ga), Scalar2_Vector2 1, G_GH4_GaWSC s) ] let gauge_higgs4_ZWPC p = [ ((CHiggs HC1, PHiggs p, Wm, Z), Scalar2_Vector2 1, G_GH4_ZWPC p); ((CHiggs HC1c, PHiggs p, Wp, Z), Scalar2_Vector2 (-1), G_GH4_ZWPC p)] let gauge_higgs4_GaWPC p = [ ((CHiggs HC1, PHiggs p, Wm, Ga), Scalar2_Vector2 1, G_GH4_GaWPC p); ((CHiggs HC1c, PHiggs p, Wp, Ga), Scalar2_Vector2 (-1), G_GH4_GaWPC p) ] let gauge_higgs4 = List.map gauge_higgs4_ZZPP (pairs [P1;P2]) @ List.map gauge_higgs4_ZZSS (pairs [S1;S2;S3]) @ [gauge_higgs4_ZZCC] @ [gauge_higgs4_GaGaCC] @ [gauge_higgs4_ZGaCC] @ [gauge_higgs4_WWCC] @ List.map gauge_higgs4_WWPP (pairs [P1;P2]) @ List.map gauge_higgs4_WWSS (pairs [S1;S2;S3]) @ ThoList.flatmap gauge_higgs4_ZWSC [S1;S2;S3] @ ThoList.flatmap gauge_higgs4_GaWSC [S1;S2;S3] @ ThoList.flatmap gauge_higgs4_ZWPC [P1;P2] @ ThoList.flatmap gauge_higgs4_GaWPC [P1;P2] (*** Added by Felix Braam. ***) let gauge_sfermion4' g m1 m2 = [ ((Wp, Wm, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SL,g,m1,m2)); ((Z, Ga, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SL,g,m1,m2)); ((Z, Z, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SL,g,m1,m2)); ((Wp, Wm, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SU,g,m1,m2)); ((Wp, Wm, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SD,g,m1,m2)); ((Z, Z, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SU,g,m1,m2)); ((Z, Z, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SD,g,m1,m2)); ((Z, Ga, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SU,g,m1,m2)); ((Z, Ga, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SD,g,m1,m2)) ] let gauge_sfermion4'' g m = [ ((Wp, Ga, Slepton (m,g), Sneutrino (-g)), Scalar2_Vector2 1, G_WPSLSN (false,g,m)); ((Wm, Ga, Slepton (m,-g), Sneutrino g), Scalar2_Vector2 1, G_WPSLSN (true,g,m)); ((Wp, Z, Slepton (m,g), Sneutrino (-g)), Scalar2_Vector2 1, G_WZSLSN (false,g,m)); ((Wm, Z, Slepton (m,-g), Sneutrino g), Scalar2_Vector2 1, G_WZSLSN (true,g,m)); ((Ga, Ga, Slepton (m,g), Slepton (m,-g)), Scalar2_Vector2 1, G_PPSFSF SL); ((Ga, Ga, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 1, G_PPSFSF SU); ((Ga, Ga, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 1, G_PPSFSF SD)] let gauge_sfermion4 g = List.flatten (Product.list2 (gauge_sfermion4' g) [M1;M2] [M1;M2]) @ ThoList.flatmap (gauge_sfermion4'' g) [M1;M2] @ [ ((Wp, Wm, Sneutrino g, Sneutrino (-g)), Scalar2_Vector2 1, G_WWSFSF (SN,g,M1,M1)); ((Z, Z, Sneutrino g, Sneutrino (-g)), Scalar2_Vector2 1, G_ZZSFSF (SN,g,M1,M1)) ] (*** Modified by Felix Braam. ***) let gauge_squark4'' g h m1 m2 = [ ((Wp, Ga, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_WPSUSD (false,m1,m2,g,h)); ((Wm, Ga, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_WPSUSD (true,m1,m2,g,h)); ((Wp, Z, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_WZSUSD (false,m1,m2,g,h)); ((Wm, Z, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_WZSUSD (true,m1,m2,g,h)) ] let gauge_squark4' g h = List.flatten (Product.list2 (gauge_squark4'' g h) [M1;M2] [M1;M2]) let gauge_squark4 = if Flags.ckm_present then List.flatten (Product.list2 gauge_squark4' [1;2;3] [1;2;3]) else ThoList.flatmap (fun g -> gauge_squark4' g g) [1;2;3] let gluon_w_squark'' g h m1 m2 = [ ((Gl, Wp, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_GlWSUSD (false,m1,m2,g,h)); ((Gl, Wm, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_GlWSUSD (true,m1,m2,g,h)) ] let gluon_w_squark' g h = List.flatten (Product.list2 (gluon_w_squark'' g h) [M1;M2] [M1;M2]) let gluon_w_squark = if Flags.ckm_present then List.flatten (Product.list2 gluon_w_squark' [1;2;3] [1;2;3]) else ThoList.flatmap (fun g -> gluon_w_squark' g g) [1;2;3] (*** Modified by Felix Braam. ***) let gluon_gauge_squark' g m1 m2 = [ ((Gl, Z, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 2, G_GlZSFSF (SU,g,m1,m2)); ((Gl, Z, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 2, G_GlZSFSF (SD,g,m1,m2)) ] let gluon_gauge_squark'' g m = [ ((Gl, Ga, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 2, G_GlPSQSQ); ((Gl, Ga, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 (-1), G_GlPSQSQ) ] (*** Modified by Felix Braam. ***) let gluon_gauge_squark g = List.flatten (Product.list2 (gluon_gauge_squark' g) [M1;M2] [M1;M2]) @ ThoList.flatmap (gluon_gauge_squark'' g) [M1;M2] let gluon2_squark2' g m = [ ((Gl, Gl, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 2, G_GlGlSQSQ); ((Gl, Gl, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 2, G_GlGlSQSQ) ] let gluon2_squark2 g = ThoList.flatmap (gluon2_squark2' g) [M1;M2] (* JR: Only the first charged Higgs. *) (*** REVISED: Independent of the sign of CD. ***) (*** REVISED: Felix Braam: Compact version using new COMBOS *) (*** REVISED: Felix Braam: Couplings adjusted to FF-convention *) let higgs_SCC s = ((CHiggs HC1, CHiggs HC1c, SHiggs s), Scalar_Scalar_Scalar 1, G_H3_SCC s ) let higgs_SSS (s1,s2,s3)= ((SHiggs s1, SHiggs s2, SHiggs s3), Scalar_Scalar_Scalar 1, G_H3_SSS (s1,s2,s3)) let higgs_SPP (p1,p2,s) = ((SHiggs s, PHiggs p1, PHiggs p2), Scalar_Scalar_Scalar 1, G_H3_SPP (s,p1,p2)) let higgs = List.map higgs_SCC [S1;S2;S3]@ List.map higgs_SSS (triples [S1;S2;S3])@ List.map higgs_SPP (two_and_one [P1;P2] [S1;S2;S3]) let higgs4 = [] (* The vertices of the type Higgs - Sfermion - Sfermion are independent of the choice of the CD sign since they are quadratic in the gauge coupling. *) (* JR: Only the first charged Higgs. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_sneutrino' s g = ((SHiggs s, Sneutrino g, Sneutrino (-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SN,g,M1,M1)) let higgs_sneutrino'' g m = [((CHiggs HC1, Sneutrino (-g), Slepton (m,g)), Scalar_Scalar_Scalar 1, G_HSNSL (false,g,m)); ((CHiggs HC1c, Sneutrino g, Slepton (m,-g)), Scalar_Scalar_Scalar 1, G_HSNSL (true,g,m))] let higgs_sneutrino = Product.list2 higgs_sneutrino' [S1;S2;S3] [1;2;3] @ List.flatten ( Product.list2 higgs_sneutrino'' [1;2;3] [M1;M2] ) (* Under the assumption that there is no mixing between the left- and right-handed sfermions for the first two generations there is only a coupling of the form Higgs - sfermion1 - sfermion2 for the third generation. All the others are suppressed by $m_f/M_W$. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_sfermion_S s g m1 m2 = [ ((SHiggs s, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SL,g,m1,m2)); ((SHiggs s, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SU,g,m1,m2)); ((SHiggs s, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFS (s,SD,g,m1,m2))] let higgs_sfermion' g m1 m2 = (higgs_sfermion_S S1 g m1 m2) @ (higgs_sfermion_S S2 g m1 m2) @ (higgs_sfermion_S S3 g m1 m2) let higgs_sfermion_P p g m1 m2 = [ ((PHiggs p, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFP (p,SL,g,m1,m2)); ((PHiggs p, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFP (p,SU,g,m1,m2)); ((PHiggs p, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_SFSFP (p,SD,g,m1,m2)) ] let higgs_sfermion'' g m1 m2 = (higgs_sfermion_P P1 g m1 m2) @ (higgs_sfermion_P P2 g m1 m2) let higgs_sfermion = List.flatten (Product.list3 higgs_sfermion' [1;2;3] [M1;M2] [M1;M2]) @ List.flatten (Product.list3 higgs_sfermion'' [1;2;3] [M1;M2] [M1;M2]) (* JR: Only the first charged Higgs. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_squark' g h m1 m2 = [ ((CHiggs HC1, Sup (m1,-g), Sdown (m2,h)), Scalar_Scalar_Scalar 1, G_HSUSD (false,m1,m2,g,h)); ((CHiggs HC1c, Sup (m1,g), Sdown (m2,-h)), Scalar_Scalar_Scalar 1, G_HSUSD (true,m1,m2,g,h)) ] let higgs_squark_a g h = higgs_squark' g h M1 M1 let higgs_squark_b (g,h) = List.flatten (Product.list2 (higgs_squark' g h) [M1;M2] [M1;M2]) let higgs_squark = if Flags.ckm_present then List.flatten (Product.list2 higgs_squark_a [1;2] [1;2]) @ ThoList.flatmap higgs_squark_b [(1,3);(2,3);(3,3);(3,1);(3,2)] else higgs_squark_a 1 1 @ higgs_squark_a 2 2 @ higgs_squark_b (3,3) let vertices3 = (ThoList.flatmap electromagnetic_currents_3 [1;2;3] @ ThoList.flatmap electromagnetic_currents_2 [C1;C2] @ List.flatten (Product.list2 electromagnetic_sfermion_currents [1;2;3] [M1;M2]) @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_sfermion_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ List.flatten (Product.list2 charged_slepton_currents [1;2;3] [M1;M2]) @ (if Flags.ckm_present then List.flatten (Product.list2 charged_quark_currents [1;2;3] [1;2;3]) @ List.flatten (Product.list2 charged_squark_currents [1;2;3] [1;2;3]) @ ThoList.flatmap yukawa_higgs_quark [(1,3);(2,3);(3,3);(3,1);(3,2)] else charged_quark_currents 1 1 @ charged_quark_currents 2 2 @ charged_quark_currents 3 3 @ charged_squark_currents 1 1 @ charged_squark_currents 2 2 @ charged_squark_currents 3 3 @ ThoList.flatmap yukawa_higgs_quark [(3,3)]) @ (*i ThoList.flatmap yukawa_higgs [1;2;3] @ i*) yukawa_higgs 3 @ yukawa_n @ ThoList.flatmap yukawa_c [C1;C2] @ ThoList.flatmap yukawa_cq [C1;C2] @ List.flatten (Product.list2 charged_chargino_currents [N1;N2;N3;N4;N5] [C1;C2]) @ triple_gauge @ ThoList.flatmap neutral_Z (pairs [N1;N2;N3;N4;N5]) @ Product.list2 charged_Z [C1;C2] [C1;C2] @ gauge_higgs @ higgs @ yukawa_higgs_2 @ (*i List.flatten (Product.list2 yukawa_higgs_quark [1;2;3] [1;2;3]) @ i*) List.flatten (Product.list2 higgs_charg_neutr [N1;N2;N3;N4;N5] [C1;C2]) @ higgs_neutr @ higgs_sneutrino @ higgs_sfermion @ higgs_squark @ yukawa_v @ ThoList.flatmap col_currents [1;2;3] @ List.flatten (Product.list2 col_sfermion_currents [1;2;3] [M1;M2])) @ List.flatten (Product.list2 col_lq_currents [M1;M2] [1;2;3]) @ ThoList.flatmap col_lqino_currents [1;2;3] @ ThoList.flatmap em_lqino_currents [1;2;3] @ ThoList.flatmap neutr_lqino_current [1;2;3] @ List.flatten (Product.list3 yuk_lqino_se_uc1 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_se_uc2 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_ec_su1 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_ec_su2 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_sn_dc1 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_sn_dc2 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_nc_sd1 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_nc_sd2 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lq_ec_uc [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lq_ec_uc2 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lq_nc_dc [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 yuk_lq_nc_dc2 [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 lq_neutr_Z [1;2;3] [M1;M2] [M1;M2]) @ List.flatten (Product.list2 em_lq_currents [1;2;3] [M1;M2]) @ List.flatten (Product.list3 lq_shiggs [1;2;3] [S1;S2;S3;S4;S5;S6;S7;S8;S9] [1;2;3]) @ List.flatten (Product.list3 lq_phiggs [1;2;3] [P1;P2;P3;P4;P5;P6;P7] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_shiggs [1;2;3] [S1;S2;S3;S4;S5;S6;S7;S8;S9] [1;2;3]) @ List.flatten (Product.list3 yuk_lqino_phiggs [1;2;3] [P1;P2;P3;P4;P5;P6;P7] [1;2;3]) @ List.flatten (Product.list3 lqino_lq_neu nlist [1;2;3] [1;2;3]) @ List.flatten (Product.list3 lqino_lq_neu2 nlist [1;2;3] [1;2;3]) @ List.flatten (Product.list3 lq_se_su [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list3 lq_snu_sd [1;2;3] [1;2;3] [1;2;3]) @ List.flatten (Product.list2 lqino_lq_gg [1;2;3] [1;2;3]) let vertices4 = (quartic_gauge @ higgs4 @ gauge_higgs4 @ ThoList.flatmap gauge_sfermion4 [1;2;3] @ gauge_squark4 @ gluon_w_squark @ ThoList.flatmap gluon2_squark2 [1;2;3] @ ThoList.flatmap gluon_gauge_squark [1;2;3] @ ThoList.flatmap gluon2_lq2 [1;2;3] @ ThoList.flatmap lq_gauge4 [1;2;3] @ ThoList.flatmap lq_gg_gauge2 [1;2;3]) let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 (* SLHA2-Nomenclature for neutral Higgses *) let flavor_of_string s = match s with | "e-" -> L 1 | "e+" -> L (-1) | "mu-" -> L 2 | "mu+" -> L (-2) | "tau-" -> L 3 | "tau+" -> L (-3) | "nue" -> N 1 | "nuebar" -> N (-1) | "numu" -> N 2 | "numubar" -> N (-2) | "nutau" -> N 3 | "nutaubar" -> N (-3) | "se1-" -> Slepton (M1,1) | "se1+" -> Slepton (M1,-1) | "smu1-" -> Slepton (M1,2) | "smu1+" -> Slepton (M1,-2) | "stau1-" -> Slepton (M1,3) | "stau1+" -> Slepton (M1,-3) | "se2-" -> Slepton (M2,1) | "se2+" -> Slepton (M2,-1) | "smu2-" -> Slepton (M2,2) | "smu2+" -> Slepton (M2,-2) | "stau2-" -> Slepton (M2,3) | "stau2+" -> Slepton (M2,-3) | "snue" -> Sneutrino 1 | "snue*" -> Sneutrino (-1) | "snumu" -> Sneutrino 2 | "snumu*" -> Sneutrino (-2) | "snutau" -> Sneutrino 3 | "snutau*" -> Sneutrino (-3) | "u" -> U 1 | "ubar" -> U (-1) | "c" -> U 2 | "cbar" -> U (-2) | "t" -> U 3 | "tbar" -> U (-3) | "d" -> D 1 | "dbar" -> D (-1) | "s" -> D 2 | "sbar" -> D (-2) | "b" -> D 3 | "bbar" -> D (-3) | "A" -> Ga | "Z" | "Z0" -> Z | "W+" -> Wp | "W-" -> Wm | "gl" | "g" -> Gl | "h01" -> SHiggs S1 | "h02" -> SHiggs S2 | "h03" -> SHiggs S3 | "A01" -> PHiggs P1 | "A02" -> PHiggs P2 | "h04" -> SHiggs S4 | "h05" -> SHiggs S5 | "h06" -> SHiggs S6 | "A03" -> PHiggs P3 | "A04" -> PHiggs P4 | "h07" -> SHiggs S7 | "h08" -> SHiggs S8 | "h09" -> SHiggs S9 | "A05" -> PHiggs P5 | "A06" -> PHiggs P6 | "A07" -> PHiggs P7 (* JR: Only the first charged Higgs. *) | "H+" -> CHiggs HC1 | "H-" -> CHiggs HC1c | "su1" -> Sup (M1,1) | "su1c" -> Sup (M1,-1) | "sc1" -> Sup (M1,2) | "sc1c" -> Sup (M1,-2) | "st1" -> Sup (M1,3) | "st1c" -> Sup (M1,-3) | "su2" -> Sup (M2,1) | "su2c" -> Sup (M2,-1) | "sc2" -> Sup (M2,2) | "sc2c" -> Sup (M2,-2) | "st2" -> Sup (M2,3) | "st2c" -> Sup (M2,-3) | "sgl" | "sg" -> Gluino | "sd1" -> Sdown (M1,1) | "sd1c" -> Sdown (M1,-1) | "ss1" -> Sdown (M1,2) | "ss1c" -> Sdown (M1,-2) | "sb1" -> Sdown (M1,3) | "sb1c" -> Sdown (M1,-3) | "sd2" -> Sdown (M2,1) | "sd2c" -> Sdown (M2,-1) | "ss2" -> Sdown (M2,2) | "ss2c" -> Sdown (M2,-2) | "sb2" -> Sdown (M2,3) | "sb2c" -> Sdown (M2,-3) | "neu1" -> Neutralino N1 | "neu2" -> Neutralino N2 | "neu3" -> Neutralino N3 | "neu4" -> Neutralino N4 | "neu5" -> Neutralino N5 | "neu6" -> Neutralino N6 | "neu7" -> Neutralino N7 | "neu8" -> Neutralino N8 | "neu9" -> Neutralino N9 | "neu10" -> Neutralino N10 | "neu11" -> Neutralino N11 | "ch1+" -> Chargino C1 | "ch2+" -> Chargino C2 | "ch1-" -> Chargino C1c | "ch2-" -> Chargino C2c | "ch3+" -> Chargino C3 | "ch4+" -> Chargino C4 | "ch3-" -> Chargino C3c | "ch4-" -> Chargino C4c | "lq11" -> LQ (M1,1) | "lq11c" -> LQ (M1,-1) | "lq12" -> LQ (M2,1) | "lq12c" -> LQ (M2,-1) | "lq21" -> LQ (M1,2) | "lq21c" -> LQ (M1,-2) | "lq22" -> LQ (M2,2) | "lq22c" -> LQ (M2,-2) | "lq31" -> LQ (M1,3) | "lq31c" -> LQ (M1,-3) | "lq32" -> LQ (M2,3) | "lq32c" -> LQ (M2,-3) | "lqino1" -> LQino 1 | "lqino1b" -> LQino (-1) | "lqino2" -> LQino 2 | "lqino2b" -> LQino (-2) | "lqino3" -> LQino 3 | "lqino3b" -> LQino (-3) | s -> invalid_arg ("HUBABUBA: %s Modellib_PSSSM.ExtMSSM.flavor_of_string:" ^ s) let flavor_to_string = function | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_string: invalid down type quark" | Gl -> "gl" | Gluino -> "sgl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | SHiggs S1 -> "h01" | SHiggs S2 -> "h02" | SHiggs S3 -> "h03" | PHiggs P1 -> "A01" | PHiggs P2 -> "A02" | SHiggs S4 -> "h04" | SHiggs S5 -> "h05" | SHiggs S6 -> "h06" | PHiggs P3 -> "A03" | PHiggs P4 -> "A04" | SHiggs S7 -> "h07" | SHiggs S8 -> "h08" | SHiggs S9 -> "h09" | PHiggs P5 -> "A05" | PHiggs P6 -> "A06" | PHiggs P7 -> "A07" (* JR: Only the first charged Higgs. *) | CHiggs HC1 -> "H+" | CHiggs HC1c -> "H-" | CHiggs HC2 -> "HX_1+" | CHiggs HC2c -> "HX_1-" | CHiggs HC3 -> "HX_2+" | CHiggs HC3c -> "HX_2-" | CHiggs HC4 -> "HX_3+" | CHiggs HC4c -> "HX_3-" | CHiggs HC5 -> "HX_4+" | CHiggs HC5c -> "HX_4-" | Slepton (M1,1) -> "se1-" | Slepton (M1,-1) -> "se1+" | Slepton (M1,2) -> "smu1-" | Slepton (M1,-2) -> "smu1+" | Slepton (M1,3) -> "stau1-" | Slepton (M1,-3) -> "stau1+" | Slepton (M2,1) -> "se2-" | Slepton (M2,-1) -> "se2+" | Slepton (M2,2) -> "smu2-" | Slepton (M2,-2) -> "smu2+" | Slepton (M2,3) -> "stau2-" | Slepton (M2,-3) -> "stau2+" | Sneutrino 1 -> "snue" | Sneutrino (-1) -> "snue*" | Sneutrino 2 -> "snumu" | Sneutrino (-2) -> "snumu*" | Sneutrino 3 -> "snutau" | Sneutrino (-3) -> "snutau*" | Sup (M1,1) -> "su1" | Sup (M1,-1) -> "su1c" | Sup (M1,2) -> "sc1" | Sup (M1,-2) -> "sc1c" | Sup (M1,3) -> "st1" | Sup (M1,-3) -> "st1c" | Sup (M2,1) -> "su2" | Sup (M2,-1) -> "su2c" | Sup (M2,2) -> "sc2" | Sup (M2,-2) -> "sc2c" | Sup (M2,3) -> "st2" | Sup (M2,-3) -> "st2c" | Sdown (M1,1) -> "sd1" | Sdown (M1,-1) -> "sd1c" | Sdown (M1,2) -> "ss1" | Sdown (M1,-2) -> "ss1c" | Sdown (M1,3) -> "sb1" | Sdown (M1,-3) -> "sb1c" | Sdown (M2,1) -> "sd2" | Sdown (M2,-1) -> "sd2c" | Sdown (M2,2) -> "ss2" | Sdown (M2,-2) -> "ss2c" | Sdown (M2,3) -> "sb2" | Sdown (M2,-3) -> "sb2c" | Neutralino n -> "neu" ^ string_of_neu n | Chargino C1 -> "ch1+" | Chargino C1c -> "ch1-" | Chargino C2 -> "ch2+" | Chargino C2c -> "ch2-" | Chargino C3 -> "ch3+" | Chargino C3c -> "ch3-" | Chargino C4 -> "ch4+" | Chargino C4c -> "ch4-" | LQ (M1,1) -> "lq11" | LQ (M1,-1) -> "lq11c" | LQ (M2,1) -> "lq12" | LQ (M2,-1) -> "lq12c" | LQ (M1,2) -> "lq21" | LQ (M1,-2) -> "lq21c" | LQ (M2,2) -> "lq22" | LQ (M2,-2) -> "lq22c" | LQ (M1,3) -> "lq31" | LQ (M1,-3) -> "lq31c" | LQ (M2,3) -> "lq32" | LQ (M2,-3) -> "lq32c" | LQino 1 -> "lqino1" | LQino (-1) -> "lqino1b" | LQino 2 -> "lqino2" | LQino (-2) -> "lqino2b" | LQino 3 -> "lqino3" | LQino (-3) -> "lqino3b" | _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_string" let flavor_to_TeX = function | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | L _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid lepton" | N _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid neutrino" | U _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid up type quark" | D _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid down type quark" | Gl -> "g" | Gluino -> "\\widetilde{g}" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | SHiggs S1 -> "S_1" | SHiggs S2 -> "S_2" | SHiggs S3 -> "S_3" | SHiggs S4 -> "S_4" | SHiggs S5 -> "S_5" | SHiggs S6 -> "S_6" | SHiggs S7 -> "S_7" | SHiggs S8 -> "S_8" | SHiggs S9 -> "S_9" | PHiggs P1 -> "P_1" | PHiggs P2 -> "P_2" | PHiggs P3 -> "P_3" | PHiggs P4 -> "P_4" | PHiggs P5 -> "P_5" | PHiggs P6 -> "P_6" | PHiggs P7 -> "P_7" | CHiggs HC1 -> "H^+" | CHiggs HC1c -> "H^-" | CHiggs HC2 -> "X_{H,1}^+" | CHiggs HC2c -> "X_{H,1}^-" | CHiggs HC3 -> "X_{H,2}^+" | CHiggs HC3c -> "X_{H,2}^-" | CHiggs HC4 -> "X_{H,3}^+" | CHiggs HC4c -> "X_{H,3}^-" | CHiggs HC5 -> "X_{H,4}^+" | CHiggs HC5c -> "X_{H,4}^-" | Slepton (M1,1) -> "\\widetilde{e}_1^-" | Slepton (M1,-1) -> "\\widetilde{e}_1^+" | Slepton (M1,2) -> "\\widetilde{\\mu}_1^-" | Slepton (M1,-2) -> "\\widetilde{\\mu}_1^+" | Slepton (M1,3) -> "\\widetilde{\\tau}_1^-" | Slepton (M1,-3) -> "\\widetilde{\\tau}_1^+" | Slepton (M2,1) -> "\\widetilde{e}_2^-" | Slepton (M2,-1) -> "\\widetilde{e}_2^+" | Slepton (M2,2) -> "\\widetilde{\\mu}_2^-" | Slepton (M2,-2) -> "\\widetilde{\\mu}_2^+" | Slepton (M2,3) -> "\\widetilde{\\tau}_2^-" | Slepton (M2,-3) -> "\\widetilde{\\tau}_2^+" | Sneutrino 1 -> "\\widetilde{\\nu}_e" | Sneutrino (-1) -> "\\widetilde{\\nu}_e^*" | Sneutrino 2 -> "\\widetilde{\\nu}_\\mu" | Sneutrino (-2) -> "\\widetilde{\\nu}_\\mu^*" | Sneutrino 3 -> "\\widetilde{\\nu}_\\tau" | Sneutrino (-3) -> "\\widetilde{\\nu}_\\tau^*" | Sup (M1,1) -> "\\widetilde{u}_1" | Sup (M1,-1) -> "\\widetilde{u}_1^*" | Sup (M1,2) -> "\\widetilde{c}_1" | Sup (M1,-2) -> "\\widetilde{c}_1^*" | Sup (M1,3) -> "\\widetilde{t}_1" | Sup (M1,-3) -> "\\widetilde{t}_1^*" | Sup (M2,1) -> "\\widetilde{u}_2" | Sup (M2,-1) -> "\\widetilde{u}_2^*" | Sup (M2,2) -> "\\widetilde{c}_2" | Sup (M2,-2) -> "\\widetilde{c}_2^*" | Sup (M2,3) -> "\\widetilde{t}_2" | Sup (M2,-3) -> "\\widetilde{t}_2^*" | Sdown (M1,1) -> "\\widetilde{d}_1" | Sdown (M1,-1) -> "\\widetilde{d}_1^*" | Sdown (M1,2) -> "\\widetilde{s}_1" | Sdown (M1,-2) -> "\\widetilde{s}_1^*" | Sdown (M1,3) -> "\\widetilde{b}_1" | Sdown (M1,-3) -> "\\widetilde{b}_1^*" | Sdown (M2,1) -> "\\widetilde{d}_2" | Sdown (M2,-1) -> "\\widetilde{d}_2^*" | Sdown (M2,2) -> "\\widetilde{s}_2" | Sdown (M2,-2) -> "\\widetilde{s}_2^*" | Sdown (M2,3) -> "\\widetilde{b}_2" | Sdown (M2,-3) -> "\\widetilde{b}_2^*" | Neutralino N1 -> "\\widetilde{\\chi}^0_1" | Neutralino N2 -> "\\widetilde{\\chi}^0_2" | Neutralino N3 -> "\\widetilde{\\chi}^0_3" | Neutralino N4 -> "\\widetilde{\\chi}^0_4" | Neutralino N5 -> "\\widetilde{\\chi}^0_5" | Neutralino N6 -> "\\widetilde{\\chi}^0_6" | Neutralino N7 -> "\\widetilde{\\chi}^0_7" | Neutralino N8 -> "\\widetilde{\\chi}^0_8" | Neutralino N9 -> "\\widetilde{\\chi}^0_9" | Neutralino N10 -> "\\widetilde{\\chi}^0_{10}" | Neutralino N11 -> "\\widetilde{\\chi}^0_{11}" | Slepton _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid slepton" | Sneutrino _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid sneutrino" | Sup _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid up type squark" | Sdown _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid down type squark" | Chargino C1 -> "\\widetilde{\\chi}_1^+" | Chargino C1c -> "\\widetilde{\\chi}_1^-" | Chargino C2 -> "\\widetilde{\\chi}_2^+" | Chargino C2c -> "\\widetilde{\\chi}_2^-" | Chargino C3 -> "\\widetilde{\\chi}_3^+" | Chargino C3c -> "\\widetilde{\\chi}_3^-" | Chargino C4 -> "\\widetilde{\\chi}_4^+" | Chargino C4c -> "\\widetilde{\\chi}_4^-" | LQ (M1,1) -> "D_{1,,1}" | LQ (M1,-1) -> "D_{1,,1}^*" | LQ (M2,1) -> "D_{1,,2}" | LQ (M2,-1) -> "D_{1,,2}^*" | LQ (M1,2) -> "D_{2,,1}" | LQ (M1,-2) -> "D_{2,,1}^*" | LQ (M2,2) -> "D_{2,,2}" | LQ (M2,-2) -> "D_{2,,2}^*" | LQ (M1,3) -> "D_{3,,1}" | LQ (M1,-3) -> "D_{3,,1}^*" | LQ (M2,3) -> "D_{3,,2}" | LQ (M2,-3) -> "D_{3,,2}^*" | LQino 1 -> "\\widetilde{D}_1" | LQino (-1) -> "\\bar\\widetilde{D}_1" | LQino 2 -> "\\widetilde{D}_2" | LQino (-2) -> "\\bar\\widetilde{D}_2" | LQino 3 -> "\\widetilde{D}_3" | LQino (-3) -> "\\bar\\widetilde{D}_3" | LQ _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid leptoquark type" | LQino _ -> invalid_arg "Modellib_PSSSM.ExtMSSM.flavor_to_TeX: invalid leptoquarkino type" let flavor_symbol = function | L g when g > 0 -> "l" ^ string_of_int g | L g -> "l" ^ string_of_int (abs g) ^ "b" | N g when g > 0 -> "n" ^ string_of_int g | N g -> "n" ^ string_of_int (abs g) ^ "b" | U g when g > 0 -> "u" ^ string_of_int g | U g -> "u" ^ string_of_int (abs g) ^ "b" | D g when g > 0 -> "d" ^ string_of_int g | D g -> "d" ^ string_of_int (abs g) ^ "b" | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | Slepton (M1,g) when g > 0 -> "sl1" ^ string_of_int g | Slepton (M1,g) -> "sl1c" ^ string_of_int (abs g) | Slepton (M2,g) when g > 0 -> "sl2" ^ string_of_int g | Slepton (M2,g) -> "sl2c" ^ string_of_int (abs g) | Sneutrino g when g > 0 -> "sn" ^ string_of_int g | Sneutrino g -> "snc" ^ string_of_int (abs g) | Sup (M1,g) when g > 0 -> "su1" ^ string_of_int g | Sup (M1,g) -> "su1c" ^ string_of_int (abs g) | Sup (M2,g) when g > 0 -> "su2" ^ string_of_int g | Sup (M2,g) -> "su2c" ^ string_of_int (abs g) | Sdown (M1,g) when g > 0 -> "sd1" ^ string_of_int g | Sdown (M1,g) -> "sd1c" ^ string_of_int (abs g) | Sdown (M2,g) when g > 0 -> "sd2" ^ string_of_int g | Sdown (M2,g) -> "sd2c" ^ string_of_int (abs g) | Neutralino n -> "neu" ^ (string_of_neu n) | Chargino c when (int_of_char c) > 0 -> "cp" ^ string_of_char c | Chargino c -> "cm" ^ string_of_int (abs (int_of_char c)) | Gluino -> "sgl" | SHiggs s -> "h0" ^ (string_of_shiggs s) | PHiggs p -> "A0" ^ (string_of_phiggs p) | CHiggs HC1 -> "hp" | CHiggs HC1c -> "hm" | CHiggs _ -> invalid_arg "charged Higgs not yet implemented" | LQ (M1,g) when g > 0 -> "lq" ^ string_of_int g ^ "1" | LQ (M1,g) -> "lq" ^ string_of_int (abs g) ^ "1c" | LQ (M2,g) when g > 0 -> "lq" ^ string_of_int g ^ "2" | LQ (M2,g) -> "lq" ^ string_of_int (abs g) ^ "2c" | LQino g when g > 0 -> "lqino" ^ string_of_int g | LQino g -> "lqino" ^ string_of_int (abs g) ^ "b" let pdg = function | L g when g > 0 -> 9 + 2*g | L g -> - 9 + 2*g | N g when g > 0 -> 10 + 2*g | N g -> - 10 + 2*g | U g when g > 0 -> 2*g | U g -> 2*g | D g when g > 0 -> - 1 + 2*g | D g -> 1 + 2*g | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | SHiggs S1 -> 25 | SHiggs S2 -> 35 | PHiggs P1 -> 36 (* JR: Only the first charged Higgs. *) | CHiggs HC1 -> 37 | CHiggs HC1c -> (-37) | CHiggs _ -> invalid_arg "charged Higgs not yet implemented" | Slepton (M1,g) when g > 0 -> 1000009 + 2*g | Slepton (M1,g) -> - 1000009 + 2*g | Slepton (M2,g) when g > 0 -> 2000009 + 2*g | Slepton (M2,g) -> - 2000009 + 2*g | Sneutrino g when g > 0 -> 1000010 + 2*g | Sneutrino g -> - 1000010 + 2*g | Sup (M1,g) when g > 0 -> 1000000 + 2*g | Sup (M1,g) -> - 1000000 + 2*g | Sup (M2,g) when g > 0 -> 2000000 + 2*g | Sup (M2,g) -> - 2000000 + 2*g | Sdown (M1,g) when g > 0 -> 999999 + 2*g | Sdown (M1,g) -> - 999999 + 2*g | Sdown (M2,g) when g > 0 -> 1999999 + 2*g | Sdown (M2,g) -> - 1999999 + 2*g | Gluino -> 1000021 (* JR: only the first two charginos. *) | Chargino C1 -> 1000024 | Chargino C1c -> (-1000024) | Chargino C2 -> 1000037 | Chargino C2c -> (-1000037) | Chargino C3 -> 1000039 | Chargino C3c -> (-1000039) | Chargino C4 -> 1000041 | Chargino C4c -> (-1000041) | Neutralino N1 -> 1000022 | Neutralino N2 -> 1000023 | Neutralino N3 -> 1000025 | Neutralino N4 -> 1000035 (* According to SLHA2 (not anymore ?!?)*) | Neutralino N5 -> 1000045 | Neutralino N6 -> 1000046 | Neutralino N7 -> 1000047 | Neutralino N8 -> 1000048 | Neutralino N9 -> 1000049 | Neutralino N10 -> 1000050 | Neutralino N11 -> 1000051 | PHiggs P2 -> 46 | PHiggs P3 -> 47 | PHiggs P4 -> 48 | PHiggs P5 -> 49 | PHiggs P6 -> 50 | PHiggs P7 -> 51 | SHiggs S3 -> 45 | SHiggs S4 -> 52 | SHiggs S5 -> 53 | SHiggs S6 -> 54 | SHiggs S7 -> 55 | SHiggs S8 -> 56 | SHiggs S9 -> 57 | LQ (M1,g) when g > 0 -> 1000059 + g | LQ (M1,g) -> - 1000059 + g | LQ (M2,g) when g > 0 -> 2000059 + g | LQ (M2,g) -> - 2000059 + g | LQino g when g > 0 -> 59 + g | LQino g -> -59 + g (* We must take care of the pdg numbers for the two different kinds of sfermions in the MSSM. The particle data group in its Monte Carlo particle numbering scheme takes only into account mixtures of the third generation squarks and the stau. For the other sfermions we will use the number of the lefthanded field for the lighter mixed state and the one for the righthanded for the heavier. Below are the official pdg numbers from the Particle Data Group. In order not to produce arrays with some million entries in the Fortran code for the masses and the widths we introduce our private pdg numbering scheme which only extends not too far beyond 42. Our private scheme then has the following pdf numbers (for the sparticles the subscripts $L/R$ and $1/2$ are taken synonymously): \begin{center} \renewcommand{\arraystretch}{1.2} \begin{tabular}{|r|l|l|}\hline $d$ & down-quark & 1 \\\hline $u$ & up-quark & 2 \\\hline $s$ & strange-quark & 3 \\\hline $c$ & charm-quark & 4 \\\hline $b$ & bottom-quark & 5 \\\hline $t$ & top-quark & 6 \\\hline\hline $e^-$ & electron & 11 \\\hline $\nu_e$ & electron-neutrino & 12 \\\hline $\mu^-$ & muon & 13 \\\hline $\nu_\mu$ & muon-neutrino & 14 \\\hline $\tau^-$ & tau & 15 \\\hline $\nu_\tau$ & tau-neutrino & 16 \\\hline\hline $g$ & gluon & (9) 21 \\\hline $\gamma$ & photon & 22 \\\hline $Z^0$ & Z-boson & 23 \\\hline $W^+$ & W-boson & 24 \\\hline\hline $h^0$ & light Higgs boson & 25 \\\hline $H^0$ & heavy Higgs boson & 35 \\\hline $A^0$ & pseudoscalar Higgs & 36 \\\hline $H^+$ & charged Higgs & 37 \\\hline\hline $\tilde{d}_L$ & down-squark 1 & 41 \\\hline $\tilde{u}_L$ & up-squark 1 & 42 \\\hline $\tilde{s}_L$ & strange-squark 1 & 43 \\\hline $\tilde{c}_L$ & charm-squark 1 & 44 \\\hline $\tilde{b}_L$ & bottom-squark 1 & 45 \\\hline $\tilde{t}_L$ & top-squark 1 & 46 \\\hline $\tilde{d}_R$ & down-squark 2 & 47 \\\hline $\tilde{u}_R$ & up-squark 2 & 48 \\\hline $\tilde{s}_R$ & strange-squark 2 & 49 \\\hline $\tilde{c}_R$ & charm-squark 2 & 50 \\\hline $\tilde{b}_R$ & bottom-squark 2 & 51 \\\hline $\tilde{t}_R$ & top-squark 2 & 52 \\\hline\hline $\tilde{e}_L$ & selectron 1 & 53 \\\hline $\tilde{\nu}_{e,L}$ & electron-sneutrino & 54 \\\hline $\tilde{\mu}_L$ & smuon 1 & 55 \\\hline $\tilde{\nu}_{\mu,L}$ & muon-sneutrino & 56 \\\hline $\tilde{\tau}_L$ & stau 1 & 57 \\\hline $\tilde{\nu}_{\tau,L}$ & tau-sneutrino & 58 \\\hline $\tilde{e}_R$ & selectron 2 & 59 \\\hline $\tilde{\mu}_R$ & smuon 2 & 61 \\\hline $\tilde{\tau}_R$ & stau 2 & 63 \\\hline\hline $\tilde{g}$ & gluino & 64 \\\hline $\tilde{\chi}^0_1$ & neutralino 1 & 65 \\\hline $\tilde{\chi}^0_2$ & neutralino 2 & 66 \\\hline $\tilde{\chi}^0_3$ & neutralino 3 & 67 \\\hline $\tilde{\chi}^0_4$ & neutralino 4 & 68 \\\hline $\tilde{\chi}^0_4$ & neutralino 5 & 69 \\\hline $\tilde{\chi4}^+_1$ & chargino 1 & 70 \\\hline $\tilde{\chi}^+_2$ & chargino 2 & 71 \\\hline\hline $a$ & pseudoscalar & 72 \\\hline $s$ & scalar singlet & 73 \\\hline $\tilde{G}$ & gravitino & -- \\\hline\hline \end{tabular} \end{center} *) let pdg_mw = function | L g when g > 0 -> 9 + 2*g | L g -> - 9 + 2*g | N g when g > 0 -> 10 + 2*g | N g -> - 10 + 2*g | U g when g > 0 -> 2*g | U g -> 2*g | D g when g > 0 -> - 1 + 2*g | D g -> 1 + 2*g | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | SHiggs S1 -> 25 | SHiggs S2 -> 35 | PHiggs P1 -> 36 (* JR: Only the first charged Higgs. *) | CHiggs HC1 -> 37 | CHiggs HC1c -> (-37) | CHiggs _ -> invalid_arg "charged Higgs not yet implemented" | Sup (M1,g) when g > 0 -> 40 + 2*g | Sup (M1,g) -> - 40 + 2*g | Sup (M2,g) when g > 0 -> 46 + 2*g | Sup (M2,g) -> - 46 + 2*g | Sdown (M1,g) when g > 0 -> 39 + 2*g | Sdown (M1,g) -> - 39 + 2*g | Sdown (M2,g) when g > 0 -> 45 + 2*g | Sdown (M2,g) -> - 45 + 2*g | Slepton (M1,g) when g > 0 -> 51 + 2*g | Slepton (M1,g) -> - 51 + 2*g | Slepton (M2,g) when g > 0 -> 57 + 2*g | Slepton (M2,g) -> - 57 + 2*g | Sneutrino g when g > 0 -> 52 + 2*g | Sneutrino g -> - 52 + 2*g | Gluino -> 64 (* JR: Only the first two charginos. *) | Chargino C1 -> 70 | Chargino C1c -> (-70) | Chargino C2 -> 71 | Chargino C2c -> (-71) | Chargino C3 -> 106 | Chargino C3c -> (-106) | Chargino C4 -> 107 | Chargino C4c -> (-107) | Neutralino N1 -> 65 | Neutralino N2 -> 66 | Neutralino N3 -> 67 | Neutralino N4 -> 68 | Neutralino N5 -> 69 | Neutralino N6 -> 100 | Neutralino N7 -> 101 | Neutralino N8 -> 102 | Neutralino N9 -> 103 | Neutralino N10 -> 104 | Neutralino N11 -> 105 | PHiggs P2 -> 72 | PHiggs P3 -> 89 | PHiggs P4 -> 90 | PHiggs P5 -> 91 | PHiggs P6 -> 92 | PHiggs P7 -> 93 | SHiggs S3 -> 73 | SHiggs S4 -> 94 | SHiggs S5 -> 95 | SHiggs S6 -> 96 | SHiggs S7 -> 97 | SHiggs S8 -> 98 | SHiggs S9 -> 99 | LQ (M1,g) when g > 0 -> 78 + 2*g | LQ (M1,g) -> - 78 + 2*g | LQ (M2,g) when g > 0 -> 79 + 2*g | LQ (M2,g) -> - 79 + 2*g | LQino g when g > 0 -> 85 + g | LQino g -> - 85 + g let mass_symbol f = "mass(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let conj_symbol = function | false, str -> str | true, str -> str ^ "_c" let constant_symbol = function | E -> "e" | G -> "g" | G_Z -> "gz" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_charg -> "qchar" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCQ (vc,g1,g2) -> conj_symbol (vc, "g_ccq" ) ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ ")" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_PZWW -> "gpzww" | G_PPWW -> "gppww" | G_GH4_ZZPP (p1,p2) -> "g_ZZA0A0(" ^ string_of_phiggs p1 ^ "," ^ string_of_phiggs p2 ^ ")" | G_GH4_ZZSS (s1,s2) -> "g_ZZh0h0(" ^ string_of_shiggs s1 ^ "," ^ string_of_shiggs s2 ^ ")" | G_GH4_ZZCC -> "g_zzhphm" | G_GH4_GaGaCC -> "g_AAhphm" | G_GH4_ZGaCC -> "g_zAhphm" | G_GH4_WWCC -> "g_wwhphm" | G_GH4_WWPP (p1,p2) -> "g_WWA0A0(" ^ string_of_phiggs p1 ^ "," ^ string_of_phiggs p2 ^ ")" | G_GH4_WWSS (s1,s2) -> "g_WWh0h0(" ^ string_of_shiggs s1 ^ "," ^ string_of_shiggs s2 ^ ")" | G_GH4_ZWSC s -> "g_ZWhph0(" ^ string_of_shiggs s ^")" | G_GH4_GaWSC s -> "g_AWhph0(" ^ string_of_shiggs s ^")" | G_GH4_ZWPC p -> "g_ZWhpA0(" ^ string_of_phiggs p ^")" | G_GH4_GaWPC p -> "g_AWhpA0(" ^ string_of_phiggs p ^")" | G_CICIS (n1,n2,s) -> "g_neuneuh0(" ^ string_of_neu n1 ^ "," ^ string_of_neu n2 ^ "," ^ string_of_shiggs s ^ ")" | G_CICIP (n1,n2,p) -> "g_neuneuA0(" ^ string_of_neu n1 ^ "," ^ string_of_neu n2 ^ "," ^ string_of_phiggs p ^ ")" | G_H3_SCC s -> "g_h0hphm(" ^ string_of_shiggs s ^ ")" | G_H3_SPP (s,p1,p2) -> "g_h0A0A0(" ^ string_of_shiggs s ^ "," ^ string_of_phiggs p1 ^ "," ^ string_of_phiggs p2 ^ ")" | G_H3_SSS (s1,s2,s3) -> "g_h0h0h0(" ^ string_of_shiggs s1 ^ "," ^ string_of_shiggs s2 ^ "," ^ string_of_shiggs s3 ^ ")" | G_CSC (c1,c2,s) -> "g_chchh0(" ^ string_of_char c1 ^ "," ^ string_of_char c2 ^ "," ^ string_of_shiggs s ^ ")" | G_CPC (c1,c2,p) -> "g_chchA0(" ^ string_of_char c1 ^ "," ^ string_of_char c2 ^ "," ^ string_of_phiggs p ^")" | G_YUK_FFS (f1,f2,s) -> "g_yuk_h0_" ^ string_of_fermion_type f1 ^ string_of_fermion_type f2 ^ "(" ^ string_of_shiggs s ^ "," ^ string_of_fermion_gen f1 ^ ")" | G_YUK_FFP (f1,f2,p) -> "g_yuk_A0_" ^ string_of_fermion_type f1 ^ string_of_fermion_type f2 ^ "(" ^ string_of_phiggs p ^ "," ^ string_of_fermion_gen f1 ^ ")" | G_YUK_LCN g -> "g_yuk_hp_ln(" ^ string_of_int g ^ ")" | G_NWC (n,c) -> "g_nwc(" ^ string_of_char c ^ "," ^ string_of_neu n ^ ")" | G_CWN (c,n) -> "g_cwn(" ^ string_of_char c ^ "," ^ string_of_neu n ^ ")" | G_SLSNW (vc,g,m) -> conj_symbol (vc, "g_wslsn") ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m ^ ")" | G_NZN (n1,n2) -> "g_zneuneu(" ^ string_of_neu n1 ^ "," ^ string_of_neu n2 ^ ")" | G_CZC (c1,c2) -> "g_zchch(" ^ string_of_char c1 ^ "," ^ string_of_char c2 ^ ")" | Gs -> "gs" | G_YUK_UCD (n,m) -> "g_yuk_hp_ud(" ^ string_of_int n ^ "," ^ string_of_int m ^ ")" | G_YUK_DCU (n,m) -> "g_yuk_hm_du(" ^ string_of_int n ^ "," ^ string_of_int m ^ ")" | G_YUK_N (vc,f,n,sf,m) -> conj_symbol (vc, "g_yuk_neu_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_fermion_gen f ^ "," ^ string_of_neu n ^ "," ^ string_of_sfm m ^ ")" | G_YUK_G (vc,f,sf,m) -> conj_symbol (vc, "g_yuk_gluino_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_fermion_gen f ^ "," ^ string_of_sfm m ^ ")" | G_YUK_C (vc,f,c,sf,m) -> conj_symbol (vc, "g_yuk_char_" ^ string_of_fermion_type f ^ string_of_sff sf) ^ "(" ^ string_of_fermion_gen f ^ "," ^ string_of_char c ^ "," ^ string_of_sfm m ^ ")" | G_YUK_Q (vc,g1,f,c,sf,m) -> conj_symbol (vc, "g_yuk_char_" ^ string_of_fermion_type f ^ string_of_sff sf) ^"("^string_of_int g1 ^ "," ^ string_of_fermion_gen f ^ "," ^ string_of_char c ^ "," ^ string_of_sfm m ^ ")" | G_WPSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_wA_susd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_WZSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_wz_susd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" (* 3vertex: Higgs-Gauge a la Franke-Fraas *) (* Nomenclature consistent with [flavor_of_string] *) | G_GH_ZSP (s,p) -> "g_zh0a0(" ^ string_of_shiggs s ^ "," ^ string_of_phiggs p ^ ")" | G_GH_WSC s -> "g_Whph0(" ^ string_of_shiggs s ^ ")" | G_GH_WPC p -> "g_WhpA0(" ^ string_of_phiggs p^ ")" | G_GH_ZZS s -> "g_ZZh0(" ^ string_of_shiggs s ^ ")" | G_GH_WWS s -> "g_WWh0(" ^ string_of_shiggs s ^ ")" | G_GH_ZCC -> "g_Zhmhp" | G_GH_GaCC -> "g_Ahmhp" | G_ZSF (f,g,m1,m2) -> "g_z" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_HSNSL (vc,g,m) -> conj_symbol (vc, "g_hp_sl" ^ string_of_sfm m ^ "sn1" ) ^ "(" ^ string_of_int g ^ ")" | G_GlGlSQSQ -> "g_gg_sqsq" | G_PPSFSF f -> "g_AA_" ^ string_of_sff f ^ string_of_sff f | G_ZZSFSF (f,g,m1,m2) -> "g_zz_" ^ string_of_sff f ^string_of_sff f ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_ZPSFSF (f,g,m1,m2) -> "g_zA_" ^ string_of_sff f ^string_of_sff f ^ "(" ^ string_of_int g ^","^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_GlPSQSQ -> "g_gA_sqsq" | G_GlZSFSF (f,g,m1,m2) -> "g_gz_" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_GlWSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_gw_susd") ^ "(" ^ string_of_int g1 ^ "," ^string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_strong -> "gs" | G_SS -> "gs**2" | I_G_S -> "igs" | G_NHC (vc,n,c) -> conj_symbol(vc,"g_neuhmchar") ^ "(" ^ string_of_neu n ^ "," ^ string_of_char c ^ ")" | G_WWSFSF (f,g,m1,m2) -> "g_ww_" ^ string_of_sff f ^ string_of_sff f ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_WPSLSN (vc,g,m) -> conj_symbol (vc, "g_wA_slsn") ^"("^ string_of_int g ^ "," ^ string_of_sfm m ^ ")" | G_WZSLSN (vc,g,m) -> conj_symbol (vc, "g_wz_slsn") ^ "(" ^ string_of_int g ^ "," ^ string_of_sfm m ^ ")" | G_SFSFS (s,f,g,m1,m2) -> "g_h0_"^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "(" ^ string_of_shiggs s ^ "," ^ string_of_int g ^ ")" | G_SFSFP (p,f,g,m1,m2) -> "g_A0_"^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "(" ^ string_of_phiggs p ^ "," ^ string_of_int g ^ ")" | G_HSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "g_hp_su" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ) ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ ")" | G_WSQ (vc,g1,g2,m1,m2) -> conj_symbol (vc, "g_wsusd") ^ "(" ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_YUK_LQ_S (g1,s,g3) -> "g_yuk_lq_s(" ^ string_of_int g1 ^ "," ^ string_of_shiggs s ^"," ^ string_of_int g3 ^")" | G_YUK_LQ_P (g1,p,g3) -> "g_yuk_lq_p(" ^ string_of_int g1 ^ "," ^ string_of_phiggs p ^ "," ^ string_of_int g3 ^ ")" | G_LQ_NEU (m,g1,g2,n) -> "g_lq_neu(" ^ string_of_sfm m ^ "," ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_neu n ^ ")" | G_LQ_GG (m,g1,g2) -> "g_lq_gg(" ^ string_of_sfm m ^ "," ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ ")" | G_LQ_EC_UC (vc,m,g1,g2,g3) -> conj_symbol(vc,"g_lq_ec_uc") ^ "(" ^ string_of_sfm m ^ "," ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_int g3 ^ ")" | G_LQ_SSU (m1,m2,m3,g1,g2,g3) -> "g_lq_sst(" ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ "," ^ string_of_sfm m3 ^ "," ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_int g3 ^ ")" | G_LQ_SSD (m1,m2,g1,g2,g3) -> "g_lq_ssta(" ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ "," ^ string_of_int g1 ^ "," ^ string_of_int g2 ^ "," ^ string_of_int g3 ^ ")" | G_LQ_S (m1,m2,g1,s,g2) -> "g_lq_s(" ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ "," ^ string_of_int g1 ^ "," ^ string_of_shiggs s ^ "," ^ string_of_int g2 ^ ")" | G_LQ_P (m1,m2,g1,p,g2) -> "g_lq_s(" ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ "," ^ string_of_int g1 ^ "," ^ string_of_phiggs p ^ "," ^ string_of_int g2 ^ ")" | G_ZLQ (g,m1,m2) -> "g_zlqlq(" ^ string_of_int g ^ "," ^ string_of_sfm m1 ^ "," ^ string_of_sfm m2 ^ ")" | G_ZZLQLQ -> "g_zz_lqlq" | G_ZPLQLQ -> "g_zA_lqlq" | G_PPLQLQ -> "g_AA_lqlq" | G_ZGlLQLQ -> "g_zg_lqlq" | G_PGlLQLQ -> "g_Ag_lqlq" | G_GlGlLQLQ -> "g_gg_lqlq" | G_NLQC -> "g_nlqc" end Index: trunk/omega/src/modellib_Zprime.ml =================================================================== --- trunk/omega/src/modellib_Zprime.ml (revision 8415) +++ trunk/omega/src/modellib_Zprime.ml (revision 8416) @@ -1,630 +1,631 @@ (* modellib_Zprime.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{SM with additional Z'} *) module type SM_flags = sig val include_anomalous : bool val k_matrix : bool end module SM_no_anomalous : SM_flags = struct let include_anomalous = false let k_matrix = false end module Zprime (Flags : SM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width" ] + let caveats () = [] (* We do not introduce the Goldstones for the heavy vectors here. *) type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl | ZH type other = Phip | Phim | Phi0 | H type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Models.Zprime.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl; ZH]; "Higgs", [O H]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z | ZH -> Massive_Vector end | O f -> Scalar let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z | ZH -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | ZH -> ZH end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm | ZH -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("Zprime.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z | ZH -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_NC_h_neutrino | G_NC_h_lepton | G_NC_h_up | G_NC_h_down | I_Q_W | I_G_ZWW | I_G_WWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | Gs | I_Gs | G2 | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)); nc_coupling G_NC_h_neutrino half (Integer 0); nc_coupling G_NC_h_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_h_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_h_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF (1, Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF (1, Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* We want to allow for (almost) completely general couplings but maintain universality (generation independence). Maybe we should also separate the coupling to the top quark since the third generation is somewhat special. *) let neutral_heavy_currents n = List.map mgm [ ((L (-n), ZH, L n), FBF (1, Psibar, VA, Psi), G_NC_h_lepton); ((N (-n), ZH, N n), FBF (1, Psibar, VA, Psi), G_NC_h_neutrino); ((U (-n), ZH, U n), FBF (1, Psibar, VA, Psi), G_NC_h_up); ((D (-n), ZH, D n), FBF (1, Psibar, VA, Psi), G_NC_h_down); ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] let gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_heavy_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "ZH" | "ZH0" | "Zh" | "Zh0" -> G ZH | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | _ -> invalid_arg "Models.Zprime.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Models.Zprime.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Models.Zprime.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Models.Zprime.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Models.Zprime.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | ZH -> "ZH" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Models.Zprime.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Models.Zprime.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Models.Zprime.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Models.Zprime.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | ZH -> "Z_H" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | ZH -> "zh" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" end (* There are PDG numbers for Z', Z'', W', 32-34, respectively. We just introduce a number 38 for Y0 as a Z'''. As well, there is the number 8 for a t'. *) let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | ZH -> 32 end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_NC_h_lepton -> "gnchlep" | G_NC_h_neutrino -> "gnchneu" | G_NC_h_up -> "gnchup" | G_NC_h_down -> "gnchdwn" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_G_WWW -> "igwww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end Index: trunk/omega/src/omega_SYM.ml =================================================================== --- trunk/omega/src/omega_SYM.ml (revision 8415) +++ trunk/omega/src/omega_SYM.ml (revision 8416) @@ -1,333 +1,334 @@ (* omega_SYM.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) module SYM = struct open Coupling let options = Options.empty + let caveats () = [] let nc = 3 type flavor = | Q of int | SQ of int | G of int | SG of int | Phi let generations = ThoList.range 1 1 let generations_pairs = List.map (function [a;b] -> (a, b) | _ -> failwith "omega_SYM.generations_pairs") (Product.power 2 generations) let generations_triples = List.map (function [a;b;c] -> (a, b, c) | _ -> failwith "omega_SYM.generations_triples") (Product.power 3 generations) let generations_quadruples = List.map (function [a;b;c;d] -> (a, b, c, d) | _ -> failwith "omega_SYM.generations_quadruples") (Product.power 4 generations) let external_flavors () = [ "Quarks", List.map (fun i -> Q i) generations; "Anti-Quarks", List.map (fun i -> Q (-i)) generations; "SQuarks", List.map (fun i -> SQ i) generations; "Anti-SQuarks", List.map (fun i -> SQ (-i)) generations; "Gluons", List.map (fun i -> G i) generations; "SGluons", List.map (fun i -> SG i) generations; "Other", [Phi]] let flavors () = ThoList.flatmap snd (external_flavors ()) type gauge = unit type constant = | G_saa of int * int | G_saaa of int * int * int | G3 of int * int * int | I_G3 of int * int * int | G4 of int * int * int * int type orders = unit let orders = function | _ -> () let lorentz = function | Q i -> if i > 0 then Spinor else if i < 0 then ConjSpinor else invalid_arg "SYM.lorentz (Q 0)" | SQ _ | Phi -> Scalar | G _ -> Vector | SG _ -> Majorana let color = function | Q i | SQ i -> Color.SUN (if i > 0 then nc else if i < 0 then -nc else invalid_arg "SYM.color (Q 0)") | G _ | SG _ -> Color.AdjSUN nc | Phi -> Color.Singlet let nc () = nc let propagator = function | Q i -> if i > 0 then Prop_Spinor else if i < 0 then Prop_ConjSpinor else invalid_arg "SYM.lorentz (Q 0)" | SQ _ | Phi -> Prop_Scalar | G _ -> Prop_Feynman | SG _ -> Prop_Majorana (*i let propagator _ = Only_Insertion i*) let width _ = Timelike let goldstone _ = None let conjugate = function | Q i -> Q (-i) | SQ i -> SQ (-i) | (G _ | SG _ | Phi) as p -> p let fermion = function | Q i -> if i > 0 then 1 else if i < 0 then -1 else invalid_arg "SYM.fermion (Q 0)" | SQ _ | G _ | Phi -> 0 | SG _ -> 2 module Ch = Charges.Null let charges _ = () module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let quark_current = List.map (fun (i, j, k) -> ((Q (-i), G j, Q k), FBF (-1, Psibar, V, Psi), G3 (i, j, k))) generations_triples let squark_current = List.map (fun (i, j, k) -> ((G j, SQ i, SQ (-k)), Vector_Scalar_Scalar 1, G3 (i, j, k))) generations_triples let three_gluon = List.map (fun (i, j, k) -> ((G i, G j, G k), Gauge_Gauge_Gauge 1, I_G3 (i, j, k))) generations_triples let gluon2_phi = List.map (fun (i, j) -> ((Phi, G i, G j), Dim5_Scalar_Gauge2 1, G_saa (i, j))) generations_pairs let vertices3 = quark_current @ squark_current @ three_gluon @ gluon2_phi let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let squark_seagull = List.map (fun (i, j, k, l) -> ((SQ i, SQ (-j), G k, G l), Scalar2_Vector2 1, G4 (i, j, k, l))) generations_quadruples let four_gluon = List.map (fun (i, j, k, l) -> ((G i, G j, G k, G l), gauge4, G4 (i, j, k, l))) generations_quadruples (*i let gluon3_phi = List.map (fun (i, j, k) -> ((Phi, G i, G j, G k), Dim6_Scalar_Gauge3 1, G_saaa (i, j, k))) generations_triples i*) (* \begin{dubious} We need at least a [Dim6_Scalar_Gauge3] vertex to support this. \end{dubious} *) let gluon3_phi = [] let vertices4 = squark_seagull @ four_gluon @ gluon3_phi let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let parameters () = { input = []; derived = []; derived_arrays = [] } let invalid_flavor s = invalid_arg ("omega_SYM.flavor_of_string: " ^ s) let flavor_of_string s = let l = String.length s in if l < 2 then invalid_flavor s else if l = 2 then if String.sub s 0 1 = "q" then Q (int_of_string (String.sub s 1 1)) else if String.sub s 0 1 = "Q" then Q (- (int_of_string (String.sub s 1 1))) else if String.sub s 0 1 = "g" then G (int_of_string (String.sub s 1 1)) else invalid_flavor s else if l = 3 then if s = "phi" then Phi else if String.sub s 0 2 = "sq" then SQ (int_of_string (String.sub s 2 1)) else if String.sub s 0 2 = "sQ" then SQ (- (int_of_string (String.sub s 2 1))) else if String.sub s 0 2 = "sg" then SG (int_of_string (String.sub s 2 1)) else invalid_flavor s else invalid_flavor s let flavor_to_string = function | Q i -> if i > 0 then "q" ^ string_of_int i else if i < 0 then "Q" ^ string_of_int (-i) else invalid_arg "SYM.flavor_to_string (Q 0)" | SQ i -> if i > 0 then "sq" ^ string_of_int i else if i < 0 then "sQ" ^ string_of_int (-i) else invalid_arg "SYM.flavor_to_string (SQ 0)" | G i -> "g" ^ string_of_int i | SG i -> "sg" ^ string_of_int i | Phi -> "phi" let flavor_to_TeX = function | Q i -> if i > 0 then "q_{" ^ string_of_int i ^ "}" else if i < 0 then "{\bar q}_{" ^ string_of_int (-i) ^ "}" else invalid_arg "SYM.flavor_to_string (Q 0)" | SQ i -> if i > 0 then "{\tilde q}_{" ^ string_of_int i ^ "}" else if i < 0 then "{\bar{\tilde q}}_{" ^ string_of_int (-i) ^ "}" else invalid_arg "SYM.flavor_to_string (SQ 0)" | G i -> "g_{" ^ string_of_int i ^ "}" | SG i -> "{\tilde g}_{" ^ string_of_int i ^ "}" | Phi -> "phi" let flavor_symbol = function | Q i -> if i > 0 then "q" ^ string_of_int i else if i < 0 then "qbar" ^ string_of_int (-i) else invalid_arg "SYM.flavor_to_string (Q 0)" | SQ i -> if i > 0 then "sq" ^ string_of_int i else if i < 0 then "sqbar" ^ string_of_int (-i) else invalid_arg "SYM.flavor_to_string (SQ 0)" | G i -> "g" ^ string_of_int i | SG i -> "sg" ^ string_of_int i | Phi -> "phi" let gauge_symbol () = failwith "omega_SYM.gauge_symbol: internal error" let pdg _ = 0 let mass_symbol _ = "0.0_default" let width_symbol _ = "0.0_default" let string_of_int_list int_list = "(" ^ String.concat "," (List.map string_of_int int_list) ^ ")" let constant_symbol = function | G_saa (i, j) -> "g_saa" ^ string_of_int_list [i;j] | G_saaa (i, j, k) -> "g_saaa" ^ string_of_int_list [i;j;k] | G3 (i, j, k) -> "g3" ^ string_of_int_list [i;j;k] | I_G3 (i, j, k) -> "ig3" ^ string_of_int_list [i;j;k] | G4 (i, j, k, l) -> "g4" ^ string_of_int_list [i;j;k;l] end module O = Omega.Make(Fusion.Mixed23)(Targets.Fortran_Majorana)(SYM) let _ = O.main () (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/modellib_MSSM.ml =================================================================== --- trunk/omega/src/modellib_MSSM.ml (revision 8415) +++ trunk/omega/src/modellib_MSSM.ml (revision 8416) @@ -1,2648 +1,2649 @@ (* modellib_MSSM.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* modellib_MSSM.ml -- *) (* \thocwmodulesection{Minimal Supersymmetric Standard Model} *) module type MSSM_flags = sig val include_goldstone : bool val include_four : bool val ckm_present : bool val gravitino : bool val higgs_triangle : bool end module MSSM_no_goldstone : MSSM_flags = struct let include_goldstone = false let include_four = true let ckm_present = false let gravitino = false let higgs_triangle = false end module MSSM_goldstone : MSSM_flags = struct let include_goldstone = true let include_four = true let ckm_present = false let gravitino = false let higgs_triangle = false end module MSSM_no_4 : MSSM_flags = struct let include_goldstone = false let include_four = false let ckm_present = false let gravitino = false let higgs_triangle = false end module MSSM_no_4_ckm : MSSM_flags = struct let include_goldstone = false let include_four = false let ckm_present = true let gravitino = false let higgs_triangle = false end module MSSM_Grav : MSSM_flags = struct let include_goldstone = false let include_four = false let ckm_present = false let gravitino = true let higgs_triangle = false end module MSSM_Hgg : MSSM_flags = struct let include_goldstone = false let include_four = false let ckm_present = false let gravitino = false let higgs_triangle = true end module MSSM (Flags : MSSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type gen = | G of int | GG of gen*gen let rec string_of_gen = function | G n when n > 0 -> string_of_int n | G n -> string_of_int (abs n) ^ "c" | GG (g1,g2) -> string_of_gen g1 ^ "_" ^ string_of_gen g2 (* With this we distinguish the flavour. *) type sff = | SL | SN | SU | SD let string_of_sff = function | SL -> "sl" | SN -> "sn" | SU -> "su" | SD -> "sd" (* With this we distinguish the mass eigenstates. At the moment we have to cheat a little bit for the sneutrinos. Because we are dealing with massless neutrinos there is only one sort of sneutrino. *) type sfm = | M1 | M2 let string_of_sfm = function | M1 -> "1" | M2 -> "2" (* We also introduce special types for the charginos and neutralinos. *) type char = | C1 | C2 | C1c | C2c type neu = | N1 | N2 | N3 | N4 let int_of_char = function | C1 -> 1 | C2 -> 2 | C1c -> -1 | C2c -> -2 let string_of_char = function | C1 -> "1" | C2 -> "2" | C1c -> "-1" | C2c -> "-2" let conj_char = function | C1 -> C1c | C2 -> C2c | C1c -> C1 | C2c -> C2 let string_of_neu = function | N1 -> "1" | N2 -> "2" | N3 -> "3" | N4 -> "4" (* Also we need types to distinguish the Higgs bosons. We follow the conventions of Kuroda, which means \begin{align} \label{eq:higgs3} H_1 &= \begin{pmatrix} \frac{1}{\sqrt{2}} \bigl( v_1 + H^0 \cos\alpha - h^0 \sin\alpha + \ii A^0 \sin\beta - \ii \phi^0 \cos\beta \bigr) \\ H^- \sin\beta - \phi^- \cos\beta \end{pmatrix}, \\ & \notag \\ H_2 & = \begin{pmatrix} H^+ \cos\beta + \phi^+ \sin\beta \\ \frac{1}{\sqrt{2}} \bigl( v_2 + H^0 \sin\alpha + h^0 \cos\alpha + \ii A^0 \cos\beta + \ii \phi^0 \sin\beta \bigr) \end{pmatrix} \label{eq:higgs4} \end{align} This is a different sign convention compared to, e.g., Weinberg's volume iii. We will refer to it as [GS+]. *) type higgs = | H1 (* the light scalar Higgs *) | H2 (* the heavy scalar Higgs *) | H3 (* the pseudoscalar Higgs *) | H4 (* the charged Higgs *) | H5 (* the neutral Goldstone boson *) | H6 (* the charged Goldstone boson *) | DH of higgs*higgs let rec string_of_higgs = function | H1 -> "h1" | H2 -> "h2" | H3 -> "h3" | H4 -> "h4" | H5 -> "p1" | H6 -> "p2" | DH (h1,h2) -> string_of_higgs h1 ^ string_of_higgs h2 type flavor = | L of int | N of int | U of int | D of int | Sup of sfm*int | Sdown of sfm*int | Ga | Wp | Wm | Z | Gl | Slepton of sfm*int | Sneutrino of int | Neutralino of neu | Chargino of char | Gluino | Grino | Phip | Phim | Phi0 | H_Heavy | H_Light | Hp | Hm | A type gauge = unit let gauge_symbol () = failwith "Modellib_MSSM.MSSM.gauge_symbol: internal error" (* At this point we will forget graviton and -tino. *) let lep_family g = [ L g; N g; Slepton (M1,g); Slepton (M2,g); Sneutrino g ] let family g = [ L g; N g; Slepton (M1,g); Slepton (M2,g); Sneutrino g; U g; D g; Sup (M1,g); Sup (M2,g); Sdown (M1,g); Sdown (M2,g)] let external_flavors'' = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", [Ga; Z; Wp; Wm; Gl]; "Charginos", [Chargino C1; Chargino C2; Chargino C1c; Chargino C2c]; "Neutralinos", [Neutralino N1; Neutralino N2; Neutralino N3; Neutralino N4]; "Higgs Bosons", [H_Heavy; H_Light; Hp; Hm; A]; "Gluinos", [Gluino]] let external_flavors' = if Flags.gravitino then external_flavors'' @ ["Gravitino", [Grino]] else external_flavors'' let external_flavors () = if Flags.include_goldstone then external_flavors' @ ["Goldstone Bosons", [Phip; Phim; Phi0]] else external_flavors' let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else if n <= 0 then ConjSpinor else invalid_arg "Modellib_MSSM.MSSM.spinor: internal error" let lorentz = function | L g -> spinor g | N g -> spinor g | U g -> spinor g | D g -> spinor g | Chargino c -> spinor (int_of_char c) | Ga -> Vector (*i | Ga -> Ward_Vector i*) | Gl -> Vector | Wp | Wm | Z -> Massive_Vector | H_Heavy | H_Light | Hp | Hm | A -> Scalar | Phip | Phim | Phi0 -> Scalar | Sup _ | Sdown _ | Slepton _ | Sneutrino _ -> Scalar | Neutralino _ -> Majorana | Gluino -> Majorana | Grino -> Vectorspinor let color = function | U g -> Color.SUN (if g > 0 then 3 else -3) | Sup (m,g) -> Color.SUN (if g > 0 then 3 else -3) | D g -> Color.SUN (if g > 0 then 3 else -3) | Sdown (m,g) -> Color.SUN (if g > 0 then 3 else -3) | Gl | Gluino -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else if n <=0 then Prop_ConjSpinor else invalid_arg "Modellib_MSSM.MSSM.prop_spinor: internal error" let propagator = function | L g -> prop_spinor g | N g -> prop_spinor g | U g -> prop_spinor g | D g -> prop_spinor g | Chargino c -> prop_spinor (int_of_char c) | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity | H_Heavy | H_Light | Hp | Hm | A -> Prop_Scalar | Phip | Phim | Phi0 -> if Flags.include_goldstone then Prop_Scalar else Only_Insertion | Slepton _ | Sneutrino _ | Sup _ | Sdown _ -> Prop_Scalar | Gluino -> Prop_Majorana | Neutralino _ -> Prop_Majorana | Grino -> Only_Insertion (* Note, that we define the gravitino only as an insertion since when using propagators we are effectively going to a higher order in the gravitational coupling. This would enforce us to also include higher-dimensional vertices with two gravitinos for a consistent power counting in $1/M_{\text{Planck}}$. *) (*i | Grino -> Prop_Vectorspinor i*) (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | Wp | Wm | U 3 | U (-3) -> Fudged | _ -> !default_width else !default_width (* For the Goldstone bosons we adopt the conventions of the Kuroda paper. \begin{subequations} \begin{equation} H_1 \equiv \begin{pmatrix} \left( v_1 + H^0 \cos\alpha - h^0 \sin \alpha + \ii A^0 \sin\beta - \ii \cos\beta \phi^0 \right) / \sqrt{2} \\ H^- \sin\beta - \phi^- \cos\beta \end{pmatrix} \end{equation} \begin{equation} H_2 \equiv \begin{pmatrix} H^+ \cos\beta + \phi^+ \sin\beta \\ \left( v_2 + H^0 \sin\alpha + h^0 \cos\alpha + \ii A^0 \cos\beta + \ii \phi^0 \sin\beta \right) / \sqrt{2} \end{pmatrix} \end{equation} \end{subequations} *) let goldstone = function | Wp -> Some (Phip, Coupling.Integer 1) | Wm -> Some (Phim, Coupling.Integer 1) | Z -> Some (Phi0, Coupling.Integer 1) | _ -> None let conjugate = function | L g -> L (-g) | N g -> N (-g) | U g -> U (-g) | D g -> D (-g) | Sup (m,g) -> Sup (m,-g) | Sdown (m,g) -> Sdown (m,-g) | Slepton (m,g) -> Slepton (m,-g) | Sneutrino g -> Sneutrino (-g) | Gl -> Gl (* | Gl0 -> Gl0 *) | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | H_Heavy -> H_Heavy | H_Light -> H_Light | A -> A | Hp -> Hm | Hm -> Hp | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | Gluino -> Gluino | Grino -> Grino | Neutralino n -> Neutralino n | Chargino c -> Chargino (conj_char c) let fermion = function | L g -> if g > 0 then 1 else -1 | N g -> if g > 0 then 1 else -1 | U g -> if g > 0 then 1 else -1 | D g -> if g > 0 then 1 else -1 | Gl | Ga | Z | Wp | Wm -> 0 (* | Gl0 -> 0 *) | H_Heavy | H_Light | Hp | Hm | A -> 0 | Phip | Phim | Phi0 -> 0 | Neutralino _ -> 2 | Chargino c -> if (int_of_char c) > 0 then 1 else -1 | Sup _ -> 0 | Sdown _ -> 0 | Slepton _ -> 0 | Sneutrino _ -> 0 | Gluino | Grino -> 2 (* Because the O'Caml compiler only allows 248 constructors we must divide the constants into subgroups of constants, e.g. for the Higgs couplings. In the MSSM there are a lot of angles among the parameters, the Weinberg-angle, the angle describing the Higgs vacuum structure, the mixing angle of the real parts of the Higgs dubletts, the mixing angles of the sfermions. Therefore we are going to define the trigonometric functions of those angles not as constants but as functors of the angels. Sums and differences of angles are only used as arguments for the $\alpha$ and $\beta$ angles, so it makes no sense to define special functions for differences and sums of angles. *) type angle = | Thw | Al | Be | Th_SF of sff*int | Delta | CKM_12 | CKM_13 | CKM_23 let string_of_angle = function | Thw -> "thw" | Al -> "al" | Be -> "be" | Delta -> "d" | CKM_12 -> "ckm12" | CKM_13 -> "ckm13" | CKM_23 -> "ckm23" | Th_SF (f,g) -> "th" ^ string_of_sff f ^ string_of_int g (* We introduce a Boolean type vc as a pseudonym for Vertex Conjugator to distinguish between vertices containing complex mixing matrices like the CKM--matrix or the sfermion or neutralino/chargino--mixing matrices, which have to become complex conjugated. The true--option stands for the conjugated vertex, the false--option for the unconjugated vertex. *) type vc = bool type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sin of angle | Cos of angle | E | G | Vev | Tanb | Tana | Cos2be | Cos2al | Sin2be | Sin2al | Sin4al | Sin4be | Cos4be | Cosapb | Cosamb | Sinapb | Sinamb | Cos2am2b | Sin2am2b | Eidelta | Mu | AU of int | AD of int | AL of int | V_CKM of int*int | M_SF of sff*int*sfm*sfm | M_V of char*char (* left chargino mixing matrix *) | M_U of char*char (* right chargino mixing matrix *) | M_N of neu*neu (* neutralino mixing matrix *) | V_0 of neu*neu | A_0 of neu*neu | V_P of char*char | A_P of char*char | L_CN of char*neu | R_CN of char*neu | L_NC of neu*char | R_NC of neu*char (*i | L_NF of neu*sff*sfm | R_NF of neu*sff*sfm i*) | S_NNH1 of neu*neu | P_NNH1 of neu*neu | S_NNH2 of neu*neu | P_NNH2 of neu*neu | S_NNA of neu*neu | P_NNA of neu*neu | S_NNG of neu*neu | P_NNG of neu*neu | L_CNG of char*neu | R_CNG of char*neu | L_NCH of neu*char | R_NCH of neu*char | Q_lepton | Q_up | Q_down | Q_charg | G_Z | G_CC | G_CCQ of vc*int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_PZWW | G_PPWW | G_strong | G_SS | I_G_S | G_S_Sqrt | Gs | M of flavor | W of flavor | G_NZN of neu*neu | G_CZC of char*char | G_NNA | G_YUK of int*int | G_YUK_1 of int*int | G_YUK_2 of int*int | G_YUK_3 of int*int | G_YUK_4 of int*int | G_NHC of neu*char | G_CHN of char*neu | G_YUK_C of vc*int*char*sff*sfm | G_YUK_Q of vc*int*int*char*sff*sfm | G_YUK_N of vc*int*neu*sff*sfm | G_YUK_G of vc*int*sff*sfm | G_NGC of neu*char | G_CGN of char*neu | SUM_1 | G_NWC of neu*char | G_CWN of char*neu | G_CH1C of char*char | G_CH2C of char*char | G_CAC of char*char | G_CGC of char*char | G_SWS of vc*int*int*sfm*sfm | G_SLSNW of vc*int*sfm | G_ZSF of sff*int*sfm*sfm | G_CICIH1 of neu*neu | G_CICIH2 of neu*neu | G_CICIA of neu*neu | G_CICIG of neu*neu | G_GH of int | G_GHGo of int | G_GLGLH | G_GLGLHH | G_GLGLA | G_PPH | G_PPHH | G_PPA | G_WWSFSF of sff*int*sfm*sfm | G_WPSLSN of vc*int*sfm | G_H3 of int | G_H4 of int | G_HGo3 of int | G_HGo4 of int | G_GG4 of int | G_H1SFSF of sff*int*sfm*sfm | G_H2SFSF of sff*int*sfm*sfm | G_ASFSF of sff*int*sfm*sfm | G_HSNSL of vc*int*sfm | G_GoSFSF of sff*int*sfm*sfm | G_GoSNSL of vc*int*sfm | G_HSUSD of vc*sfm*sfm*int*int | G_GSUSD of vc*sfm*sfm*int*int | G_WPSUSD of vc*sfm*sfm*int*int | G_WZSUSD of vc*sfm*sfm*int*int | G_WZSLSN of vc*int*sfm | G_GlGlSQSQ | G_PPSFSF of sff | G_ZZSFSF of sff*int*sfm*sfm | G_ZPSFSF of sff*int*sfm*sfm | G_GlZSFSF of sff*int*sfm*sfm | G_GlPSQSQ | G_GlWSUSD of vc*sfm*sfm*int*int | G_GH4 of int | G_GHGo4 of int | G_H1H2SFSF of sff*sfm*sfm*int | G_H1H1SFSF of sff*sfm*sfm*int | G_H2H2SFSF of sff*sfm*sfm*int | G_HHSFSF of sff*sfm*sfm*int | G_AASFSF of sff*sfm*sfm*int | G_HH1SLSN of vc*sfm*int | G_HH2SLSN of vc*sfm*int | G_HASLSN of vc*sfm*int | G_HH1SUSD of vc*sfm*sfm*int*int | G_HH2SUSD of vc*sfm*sfm*int*int | G_HASUSD of vc*sfm*sfm*int*int | G_AG0SFSF of sff*sfm*sfm*int | G_HGSFSF of sff*sfm*sfm*int | G_GGSFSF of sff*sfm*sfm*int | G_G0G0SFSF of sff*sfm*sfm*int | G_HGSNSL of vc*sfm*int | G_H1GSNSL of vc*sfm*int | G_H2GSNSL of vc*sfm*int | G_AGSNSL of vc*sfm*int | G_GGSNSL of vc*sfm*int | G_HGSUSD of vc*sfm*sfm*int*int | G_H1GSUSD of vc*sfm*sfm*int*int | G_H2GSUSD of vc*sfm*sfm*int*int | G_AGSUSD of vc*sfm*sfm*int*int | G_GGSUSD of vc*sfm*sfm*int*int | G_SN4 of int*int | G_SN2SL2_1 of sfm*sfm*int*int | G_SN2SL2_2 of sfm*sfm*int*int | G_SF4 of sff*sff*sfm*sfm*sfm*sfm*int*int | G_SF4_3 of sff*sff*sfm*sfm*sfm*sfm*int*int*int | G_SF4_4 of sff*sff*sfm*sfm*sfm*sfm*int*int*int*int | G_SL4 of sfm*sfm*sfm*sfm*int | G_SL4_2 of sfm*sfm*sfm*sfm*int*int | G_SN2SQ2 of sff*sfm*sfm*int*int | G_SL2SQ2 of sff*sfm*sfm*sfm*sfm*int*int | G_SUSDSNSL of vc*sfm*sfm*sfm*int*int*int | G_SU4 of sfm*sfm*sfm*sfm*int | G_SU4_2 of sfm*sfm*sfm*sfm*int*int | G_SD4 of sfm*sfm*sfm*sfm*int | G_SD4_2 of sfm*sfm*sfm*sfm*int*int | G_SU2SD2 of sfm*sfm*sfm*sfm*int*int*int*int | G_HSF31 of higgs*int*sfm*sfm*sff*sff | G_HSF32 of higgs*int*int*sfm*sfm*sff*sff | G_HSF41 of higgs*int*sfm*sfm*sff*sff | G_HSF42 of higgs*int*int*sfm*sfm*sff*sff | G_Grav | G_Gr_Ch of char | G_Gr_Z_Neu of neu | G_Gr_A_Neu of neu | G_Gr4_Neu of neu | G_Gr4_A_Ch of char | G_Gr4_Z_Ch of char | G_Grav_N | G_Grav_U of int*sfm | G_Grav_D of int*sfm | G_Grav_L of int*sfm | G_Grav_Uc of int*sfm | G_Grav_Dc of int*sfm | G_Grav_Lc of int*sfm | G_GravGl | G_Gr_H_Ch of char | G_Gr_H1_Neu of neu | G_Gr_H2_Neu of neu | G_Gr_H3_Neu of neu | G_Gr4A_Sl of int*sfm | G_Gr4A_Slc of int*sfm | G_Gr4A_Su of int*sfm | G_Gr4A_Suc of int*sfm | G_Gr4A_Sd of int*sfm | G_Gr4A_Sdc of int*sfm | G_Gr4Z_Sn | G_Gr4Z_Snc | G_Gr4Z_Sl of int*sfm | G_Gr4Z_Slc of int*sfm | G_Gr4Z_Su of int*sfm | G_Gr4Z_Suc of int*sfm | G_Gr4Z_Sd of int*sfm | G_Gr4Z_Sdc of int*sfm | G_Gr4W_Sl of int*sfm | G_Gr4W_Slc of int*sfm | G_Gr4W_Su of int*sfm | G_Gr4W_Suc of int*sfm | G_Gr4W_Sd of int*sfm | G_Gr4W_Sdc of int*sfm | G_Gr4W_Sn | G_Gr4W_Snc | G_Gr4Gl_Su of int*sfm | G_Gr4Gl_Suc of int*sfm | G_Gr4Gl_Sd of int*sfm | G_Gr4Gl_Sdc of int*sfm | G_Gr4_Z_H1 of neu | G_Gr4_Z_H2 of neu | G_Gr4_Z_H3 of neu | G_Gr4_W_H of neu | G_Gr4_W_Hc of neu | G_Gr4_H_A of char | G_Gr4_H_Z of char (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let ferm_of_sff = function | SL, g -> (L g) | SN, g -> (N g) | SU, g -> (U g) | SD, g -> (D g) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} Here we must perhaps allow for complex input parameters. So split them into their modulus and their phase. At first, we leave them real; the generalization to complex parameters is obvious. *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("MSSM.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | L n | N n | U n | D n | Sup (_,n) | Sdown (_,n) | Slepton (_,n) | Sneutrino n -> generation' n | _ -> [0//1; 0//1; 0//1] let charge = function | L n -> if n > 0 then -1//1 else 1//1 | Slepton (_,n) -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | Sneutrino n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | Sup (_,n) -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 | Sdown (_,n) -> if n > 0 then -1//3 else 1//3 | Gl | Ga | Z | Neutralino _ | Gluino -> 0//1 | Wp -> 1//1 | Wm -> -1//1 | H_Heavy | H_Light | Phi0 -> 0//1 | Hp | Phip -> 1//1 | Hm | Phim -> -1//1 | Chargino (C1 | C2) -> 1//1 | Chargino (C1c | C2c) -> -1//1 | _ -> 0//1 let lepton = function | L n | N n -> if n > 0 then 1//1 else -1//1 | Slepton (_,n) | Sneutrino n -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let baryon = function | U n | D n -> if n > 0 then 1//1 else -1//1 | Sup (_,n) | Sdown (_,n) -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f let parameters () = { input = []; derived = []; derived_arrays = [] } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* For the couplings there are generally two possibilities concerning the sign of the covariant derivative. \begin{equation} {\rm CD}^\pm = \partial_\mu \pm \ii g T^a A^a_\mu \end{equation} The particle data group defines the signs consistently to be positive. Since the convention for that signs also influence the phase definitions of the gaugino/higgsino fields via the off-diagonal entries in their mass matrices it would be the best to adopt that convention. *) (*** REVISED: Compatible with CD+. ***) let electromagnetic_currents_3 g = [((U (-g), Ga, U g), FBF (1, Psibar, V, Psi), Q_up); ((D (-g), Ga, D g), FBF (1, Psibar, V, Psi), Q_down); ((L (-g), Ga, L g), FBF (1, Psibar, V, Psi), Q_lepton) ] (*** REVISED: Compatible with CD+. ***) let electromagnetic_sfermion_currents g m = [ ((Ga, Slepton (m,-g), Slepton (m,g)), Vector_Scalar_Scalar 1, Q_lepton); ((Ga, Sup (m,-g), Sup (m,g)), Vector_Scalar_Scalar 1, Q_up); ((Ga, Sdown (m,-g), Sdown (m,g)), Vector_Scalar_Scalar 1, Q_down) ] (*** REVISED: Compatible with CD+. ***) let electromagnetic_currents_2 c = let cc = conj_char c in [ ((Chargino cc, Ga, Chargino c), FBF (1, Psibar, V, Psi), Q_charg) ] (*** REVISED: Compatible with CD+. ***) let neutral_currents g = [ ((L (-g), Z, L g), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-g), Z, N g), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-g), Z, U g), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-g), Z, D g), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = \mp \frac{g}{2\sqrt2} \sum_i \bar\psi_i \gamma^\mu (1-\gamma_5)(T^+W^+_\mu+T^-W^-_\mu)\psi_i , \end{equation} where the sign corresponds to $\text{CD}_\pm$, respectively. *) (*** REVISED: Compatible with CD+. ***) (* Remark: The definition with the other sign compared to the SM files comes from the fact that $g_{cc} = 1/(2\sqrt{2})$ is used overwhelmingly often in the SUSY Feynman rules, so that JR decided to use a different definiton for [g_cc] in SM and MSSM. *) let charged_currents g = [ ((L (-g), Wm, N g), FBF ((-1), Psibar, VL, Psi), G_CC); ((N (-g), Wp, L g), FBF ((-1), Psibar, VL, Psi), G_CC) ] (* The quark with the inverted generation (the antiparticle) is the outgoing one, the other the incoming. The vertex attached to the outgoing up-quark contains the CKM matrix element {\em not} complex conjugated, while the vertex with the outgoing down-quark has the conjugated CKM matrix element. *) (*** REVISED: Compatible with CD+. ***) let charged_quark_currents g h = [ ((D (-g), Wm, U h), FBF ((-1), Psibar, VL, Psi), G_CCQ (true,g,h)); ((U (-g), Wp, D h), FBF ((-1), Psibar, VL, Psi), G_CCQ (false,h,g))] (*** REVISED: Compatible with CD+. ***) let charged_chargino_currents n c = let cc = conj_char c in [ ((Chargino cc, Wp, Neutralino n), FBF (1, Psibar, VLR, Chi), G_CWN (c,n)); ((Neutralino n, Wm, Chargino c), FBF (1, Chibar, VLR, Psi), G_NWC (n,c)) ] (*** REVISED: Compatible with CD+. ***) let charged_slepton_currents g m = [ ((Wm, Slepton (m,-g), Sneutrino g), Vector_Scalar_Scalar (-1), G_SLSNW (true,g,m)); ((Wp, Slepton (m,g), Sneutrino (-g)), Vector_Scalar_Scalar 1, G_SLSNW (false,g,m)) ] (*** REVISED: Compatible with CD+. ***) let charged_squark_currents' g h m1 m2 = [ ((Wm, Sup (m1,g), Sdown (m2,-h)), Vector_Scalar_Scalar (-1), G_SWS (true,g,h,m1,m2)); ((Wp, Sup (m1,-g), Sdown (m2,h)), Vector_Scalar_Scalar 1, G_SWS (false,g,h,m1,m2)) ] let charged_squark_currents g h = List.flatten (Product.list2 (charged_squark_currents' g h) [M1;M2] [M1;M2]) (*** REVISED: Compatible with CD+. ***) let neutral_sfermion_currents' g m1 m2 = [ ((Z, Slepton (m1,-g), Slepton (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SL,g,m1,m2)); ((Z, Sup (m1,-g), Sup (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SU,g,m1,m2)); ((Z, Sdown (m1,-g), Sdown (m2,g)), Vector_Scalar_Scalar (-1), G_ZSF (SD,g,m1,m2)) ] let neutral_sfermion_currents g = List.flatten (Product.list2 (neutral_sfermion_currents' g) [M1;M2] [M1;M2]) @ [ ((Z, Sneutrino (-g), Sneutrino g), Vector_Scalar_Scalar (-1), G_ZSF (SN,g,M1,M1)) ] (* The reality of the coupling of the Z-boson to two identical neutralinos makes the vector part of the coupling vanish. So we distinguish them not by the name but by the structure of the couplings. *) (*** REVISED: Compatible with CD+. ***) let neutral_Z_1 (n,m) = [ ((Neutralino n, Z, Neutralino m), FBF (1, Chibar, VA, Chi), (G_NZN (n,m))) ] (*** REVISED: Compatible with CD+. ***) let neutral_Z_2 n = [ ((Neutralino n, Z, Neutralino n), FBF (1, Chibar, Coupling.A, Chi), (G_NZN (n,n)) )] (* For very compressed spectra, radiative decays of the next-to-lightest neutralino become important. The formula can be found Haber/Wyler, 1989. In abuse, we include this loop-induced coupling together in the same model variant with the triangle Higgs couplings. *) let neutral_A = if Flags.higgs_triangle then [ ((Neutralino N2, Ga, Neutralino N1), FBF (1, Chibar, TVAM, Chi), G_NNA) ] else [] (*** REVISED: Compatible with CD+. ***) let charged_Z c1 c2 = let cc1 = conj_char c1 in ((Chargino cc1, Z, Chargino c2), FBF ((-1), Psibar, VA, Psi), G_CZC (c1,c2)) (*** REVISED: Compatible with CD+. ***) let yukawa_v = [ ((Gluino, Gl, Gluino), FBF (1, Chibar, V, Chi), Gs) ] (*** REVISED: Independent of the sign of CD. ***) let yukawa_higgs g = [ ((N (-g), Hp, L g), FBF (1, Psibar, Coupling.SR, Psi), G_YUK (6,g)); ((L (-g), Hm, N g), FBF (1, Psibar, Coupling.SL, Psi), G_YUK (6,g)); ((L (-g), H_Heavy, L g), FBF (1, Psibar, S, Psi), G_YUK (7,g)); ((L (-g), H_Light, L g), FBF (1, Psibar, S, Psi), G_YUK (8,g)); ((L (-g), A, L g), FBF (1, Psibar, P, Psi), G_YUK (9,g)); ((U (-g), H_Heavy, U g), FBF (1, Psibar, S, Psi), G_YUK (10,g)); ((U (-g), H_Light, U g), FBF (1, Psibar, S, Psi), G_YUK (11,g)); ((U (-g), A, U g), FBF (1, Psibar, P, Psi), G_YUK (12,g)); ((D (-g), H_Heavy, D g), FBF (1, Psibar, S, Psi), G_YUK (13,g)); ((D (-g), H_Light, D g), FBF (1, Psibar, S, Psi), G_YUK (14,g)); ((D (-g), A, D g), FBF (1, Psibar, P, Psi), G_YUK (15,g)) ] (*** REVISED: Compatible with CD+ and GS+. ***) let yukawa_goldstone g = [ ((N (-g), Phip, L g), FBF (1, Psibar, Coupling.SR, Psi), G_YUK (19,g)); ((L (-g), Phim, N g), FBF (1, Psibar, Coupling.SL, Psi), G_YUK (19,g)); ((L (-g), Phi0, L g), FBF (1, Psibar, P, Psi), G_YUK (16,g)); ((U (-g), Phi0, U g), FBF (1, Psibar, P, Psi), G_YUK (17,g)); ((D (-g), Phi0, D g), FBF (1, Psibar, P, Psi), G_YUK (18,g)) ] (*** REVISED: Independent of the sign of CD. ***) let yukawa_higgs_quark (g,h) = [ ((U (-g), Hp, D h), FBF (1, Psibar, SLR, Psi), G_YUK_1 (g, h)); ((D (-h), Hm, U g), FBF (1, Psibar, SLR, Psi), G_YUK_2 (g, h)) ] (*** REVISED: Compatible with CD+ and GS+. ***) let yukawa_goldstone_quark g h = [ ((U (-g), Phip, D h), FBF (1, Psibar, SLR, Psi), G_YUK_3 (g, h)); ((D (-h), Phim, U g), FBF (1, Psibar, SLR, Psi), G_YUK_4 (g, h)) ] (*** REVISED: Compatible with CD+. *) let yukawa_higgs_2' (c1,c2) = let cc1 = conj_char c1 in [ ((Chargino cc1, H_Heavy, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CH2C (c1,c2)); ((Chargino cc1, H_Light, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CH1C (c1,c2)); ((Chargino cc1, A, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CAC (c1,c2)) ] let yukawa_higgs_2'' c = let cc = conj_char c in [ ((Chargino cc, H_Heavy, Chargino c), FBF (1, Psibar, S, Psi), G_CH2C (c,c)); ((Chargino cc, H_Light, Chargino c), FBF (1, Psibar, S, Psi), G_CH1C (c,c)); ((Chargino cc, A, Chargino c), FBF (1, Psibar, P, Psi), G_CAC (c,c)) ] let yukawa_higgs_2 = ThoList.flatmap yukawa_higgs_2' [(C1,C2);(C2,C1)] @ ThoList.flatmap yukawa_higgs_2'' [C1;C2] (*** REVISED: Compatible with CD+ and GS+. ***) let yukawa_goldstone_2' (c1,c2) = let cc1 = conj_char c1 in [ ((Chargino cc1, Phi0, Chargino c2), FBF (1, Psibar, SLR, Psi), G_CGC (c1,c2)) ] let yukawa_goldstone_2'' c = let cc = conj_char c in [ ((Chargino cc, Phi0, Chargino c), FBF (1, Psibar, P, Psi), G_CGC (c,c)) ] let yukawa_goldstone_2 = ThoList.flatmap yukawa_goldstone_2' [(C1,C2);(C2,C1)] @ ThoList.flatmap yukawa_goldstone_2'' [C1;C2] (*** REVISED: Compatible with CD+. ***) let higgs_charg_neutr n c = let cc = conj_char c in [ ((Neutralino n, Hm, Chargino c), FBF (-1, Chibar, SLR, Psi), G_NHC (n,c)); ((Chargino cc, Hp, Neutralino n), FBF (-1, Psibar, SLR, Chi), G_CHN (c,n)) ] (*** REVISED: Compatible with CD+ and GS+. ***) let goldstone_charg_neutr n c = let cc = conj_char c in [ ((Neutralino n, Phim, Chargino c), FBF (1, Chibar, SLR, Psi), G_NGC (n,c)); ((Chargino cc, Phip, Neutralino n), FBF (1, Psibar, SLR, Chi), G_CGN (c,n)) ] (*** REVISED: Compatible with CD+. ***) let higgs_neutr' (n,m) = [ ((Neutralino n, H_Heavy, Neutralino m), FBF (1, Chibar, SP, Chi), G_CICIH2 (n,m)); ((Neutralino n, H_Light, Neutralino m), FBF (1, Chibar, SP, Chi), G_CICIH1 (n,m)); ((Neutralino n, A, Neutralino m), FBF (1, Chibar, SP, Chi), G_CICIA (n,m)) ] let higgs_neutr'' n = [ ((Neutralino n, H_Heavy, Neutralino n), FBF (1, Chibar, S, Chi), G_CICIH2 (n,n)); ((Neutralino n, H_Light, Neutralino n), FBF (1, Chibar, S, Chi), G_CICIH1 (n,n)); ((Neutralino n, A, Neutralino n), FBF (1, Chibar, P, Chi), G_CICIA (n,n)) ] let higgs_neutr = ThoList.flatmap higgs_neutr' [(N1,N2);(N1,N3);(N1,N4); (N2,N3);(N2,N4);(N3,N4)] @ ThoList.flatmap higgs_neutr'' [N1;N2;N3;N4] (*** REVISED: Compatible with CD+ and GS+. ***) let goldstone_neutr' (n,m) = [ ((Neutralino n, Phi0, Neutralino m), FBF (1, Chibar, SP, Chi), G_CICIG (n,m)) ] let goldstone_neutr'' n = [ ((Neutralino n, Phi0, Neutralino n), FBF (1, Chibar, P, Chi), G_CICIG (n,n)) ] let goldstone_neutr = ThoList.flatmap goldstone_neutr' [(N1,N2);(N1,N3);(N1,N4); (N2,N3);(N2,N4);(N3,N4)] @ ThoList.flatmap goldstone_neutr'' [N1;N2;N3;N4] (*** REVISED: Compatible with CD+. ***) let yukawa_n_1 n g = [ ((Neutralino n, Slepton (M1,-g), L g), FBF (1, Chibar, Coupling.SL, Psi), G_YUK_N (true,g,n,SL,M1)); ((Neutralino n, Slepton (M2,-g), L g), FBF (1, Chibar, SR, Psi), G_YUK_N (true,g,n,SL,M2)); ((L (-g), Slepton (M1,g), Neutralino n), FBF (1, Psibar, SR, Chi), G_YUK_N (false,g,n,SL,M1)); ((L (-g), Slepton (M2,g), Neutralino n), FBF (1, Psibar, Coupling.SL, Chi), G_YUK_N (false,g,n,SL,M2)); ((Neutralino n, Sup (M1,-g), U g), FBF (1, Chibar, Coupling.SL, Psi), G_YUK_N (true,g,n,SU,M1)); ((Neutralino n, Sup (M2,-g), U g), FBF (1, Chibar, SR, Psi), G_YUK_N (true,g,n,SU,M2)); ((U (-g), Sup (M1,g), Neutralino n), FBF (1, Psibar, SR, Chi), G_YUK_N (false,g,n,SU,M1)); ((U (-g), Sup (M2,g), Neutralino n), FBF (1, Psibar, Coupling.SL, Chi), G_YUK_N (false,g,n,SU,M2)); ((Neutralino n, Sdown (M1,-g), D g), FBF (1, Chibar, Coupling.SL, Psi), G_YUK_N (true,g,n,SD,M1)); ((Neutralino n, Sdown (M2,-g), D g), FBF (1, Chibar, SR, Psi), G_YUK_N (true,g,n,SD,M2)); ((D (-g), Sdown (M1,g), Neutralino n), FBF (1, Psibar, SR, Chi), G_YUK_N (false,g,n,SD,M1)); ((D (-g), Sdown (M2,g), Neutralino n), FBF (1, Psibar, Coupling.SL, Chi), G_YUK_N (false,g,n,SD,M2)) ] let yukawa_n_2 n m = [ ((Neutralino n, Slepton (m,-3), L 3), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,3,n,SL,m)); ((L (-3), Slepton (m,3), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,3,n,SL,m)); ((Neutralino n, Sup (m,-3), U 3), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,3,n,SU,m)); ((U (-3), Sup (m,3), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,3,n,SU,m)); ((Neutralino n, Sdown (m,-3), D 3), FBF (1, Chibar, SLR, Psi), G_YUK_N (true,3,n,SD,m)); ((D (-3), Sdown (m,3), Neutralino n), FBF (1, Psibar, SLR, Chi), G_YUK_N (false,3,n,SD,m)) ] let yukawa_n_3 n g = [ ((Neutralino n, Sneutrino (-g), N g), FBF (1, Chibar, Coupling.SL, Psi), G_YUK_N (true,g,n,SN,M1)); ((N (-g), Sneutrino g, Neutralino n), FBF (1, Psibar, SR, Chi), G_YUK_N (false,g,n,SN,M1)) ] let yukawa_n_4 g = [ ((U (-g), Sup (M1,g), Gluino), FBF ((-1), Psibar, SR, Chi), G_S_Sqrt); ((D (-g), Sdown (M1,g), Gluino), FBF ((-1), Psibar, SR, Chi), G_S_Sqrt); ((Gluino, Sup (M1,-g), U g), FBF ((-1), Chibar, Coupling.SL, Psi), G_S_Sqrt); ((Gluino, Sdown (M1,-g), D g), FBF ((-1), Chibar, Coupling.SL, Psi), G_S_Sqrt); ((U (-g), Sup (M2,g), Gluino), FBF (1, Psibar, Coupling.SL, Chi), G_S_Sqrt); ((D (-g), Sdown (M2,g), Gluino), FBF (1, Psibar, Coupling.SL, Chi), G_S_Sqrt); ((Gluino, Sup (M2,-g), U g), FBF (1, Chibar, SR, Psi), G_S_Sqrt); ((Gluino, Sdown (M2,-g), D g), FBF (1, Chibar, SR, Psi), G_S_Sqrt)] let yukawa_n_5 m = [ ((U (-3), Sup (m,3), Gluino), FBF (1, Psibar, SLR, Chi), G_YUK_G (false,3,SU,m)); ((D (-3), Sdown (m,3), Gluino), FBF (1, Psibar, SLR, Chi), G_YUK_G (false,3,SD,m)); ((Gluino, Sup (m,-3), U 3), FBF (1, Chibar, SLR, Psi), G_YUK_G (true,3,SU,m)); ((Gluino, Sdown (m,-3), D 3), FBF (1, Chibar, SLR, Psi), G_YUK_G (true,3,SD,m))] let yukawa_n = List.flatten (Product.list2 yukawa_n_1 [N1;N2;N3;N4] [1;2]) @ List.flatten (Product.list2 yukawa_n_2 [N1;N2;N3;N4] [M1;M2]) @ List.flatten (Product.list2 yukawa_n_3 [N1;N2;N3;N4] [1;2;3]) @ ThoList.flatmap yukawa_n_4 [1;2] @ ThoList.flatmap yukawa_n_5 [M1;M2] (*** REVISED: Compatible with CD+. ***) let yukawa_c_1 c g = let cc = conj_char c in [ ((L (-g), Sneutrino g, Chargino cc), BBB (1, Psibar, Coupling.SR, Psibar), G_YUK_C (true,g,c,SN,M1)); ((Chargino c, Sneutrino (-g), L g), PBP (1, Psi, Coupling.SL, Psi), G_YUK_C (false,g,c,SN,M1)) ] let yukawa_c_2 c = let cc = conj_char c in [ ((L (-3), Sneutrino 3, Chargino cc), BBB (1, Psibar, SLR, Psibar), G_YUK_C (true,3,c,SN,M1)); ((Chargino c, Sneutrino (-3), L 3), PBP (1, Psi, SLR, Psi), G_YUK_C (false,3,c,SN,M1)) ] let yukawa_c_3 c m g = let cc = conj_char c in [ ((N (-g), Slepton (m,g), Chargino c), FBF (1, Psibar, Coupling.SR, Psi), G_YUK_C (true,g,c,SL,m)); ((Chargino cc, Slepton (m,-g), N g), FBF (1, Psibar, Coupling.SL, Psi), G_YUK_C (false,g,c,SL,m)) ] let yukawa_c c = ThoList.flatmap (yukawa_c_1 c) [1;2] @ yukawa_c_2 c @ List.flatten (Product.list2 (yukawa_c_3 c) [M1] [1;2]) @ List.flatten (Product.list2 (yukawa_c_3 c) [M1;M2] [3]) (*** REVISED: Compatible with CD+. ***) let yukawa_cq' c (g,h) m = let cc = conj_char c in [ ((Chargino c, Sup (m,-g), D h), PBP (1, Psi, SLR, Psi), G_YUK_Q (false,g,h,c,SU,m)); ((D (-h), Sup (m,g), Chargino cc), BBB (1, Psibar, SLR, Psibar), G_YUK_Q (true,g,h,c,SU,m)); ((Chargino cc, Sdown (m,-h), U g), FBF (1, Psibar, SLR, Psi), G_YUK_Q (true,g,h,c,SD,m)); ((U (-g), Sdown (m,h), Chargino c), FBF (1, Psibar, SLR, Psi), G_YUK_Q (false,g,h,c,SD,m)) ] let yukawa_cq'' c (g,h) = let cc = conj_char c in [ ((Chargino c, Sup (M1,-g), D h), PBP (1, Psi, Coupling.SL, Psi), G_YUK_Q (false,g,h,c,SU,M1)); ((D (-h), Sup (M1,g), Chargino cc), BBB (1, Psibar, Coupling.SR, Psibar), G_YUK_Q (true,g,h,c,SU,M1)); ((Chargino cc, Sdown (M1,-h), U g), FBF (1, Psibar, Coupling.SL, Psi), G_YUK_Q (true,g,h,c,SD,M1)); ((U (-g), Sdown (M1,h), Chargino c), FBF (1, Psibar, Coupling.SR, Psi), G_YUK_Q (false,g,h,c,SD,M1)) ] let yukawa_cq c = if Flags.ckm_present then List.flatten (Product.list2 (yukawa_cq' c) [(1,3);(2,3);(3,3); (3,2);(3,1)] [M1;M2]) @ ThoList.flatmap (yukawa_cq'' c) [(1,1);(1,2);(2,1);(2,2)] else ThoList.flatmap (yukawa_cq' c (3,3)) [M1;M2] @ ThoList.flatmap (yukawa_cq'' c) [(1,1);(2,2)] (*** REVISED: Compatible with CD+. Remark: Singlet and octet gluon exchange. The coupling is divided by sqrt(2) to account for the correct normalization of the Lie algebra generators. ***) let col_currents g = [ ((D (-g), Gl, D g), FBF ((-1), Psibar, V, Psi), Gs); ((U (-g), Gl, U g), FBF ((-1), Psibar, V, Psi), Gs)] (*** REVISED: Compatible with CD+. Remark: Singlet and octet gluon exchange. The coupling is divided by sqrt(2) to account for the correct normalization of the Lie algebra generators. ***) let col_sfermion_currents g m = [ ((Gl, Sup (m,-g), Sup (m,g)), Vector_Scalar_Scalar (-1), Gs); ((Gl, Sdown (m,-g), Sdown (m,g)), Vector_Scalar_Scalar (-1), Gs)] (* The gravitino coupling is generically $1/(4 M_{Pl.})$ *) (*** Triple vertices containing graivitinos. ***) let triple_gravitino' g = [ ((Grino, Sneutrino (-g), N g), GBG (1, Gravbar, Coupling.SL, Psi), G_Grav_N); ((N (-g), Sneutrino g, Grino), GBG (1, Psibar, Coupling.SL, Grav), G_Grav_N)] let triple_gravitino'' g m = [ ((Grino, Slepton (m, -g), L g), GBG (1, Gravbar, SLR, Psi), G_Grav_L (g,m)); ((L (-g), Slepton (m, g), Grino), GBG (1, Psibar, SLR, Grav), G_Grav_Lc (g,m)); ((Grino, Sup (m, -g), U g), GBG (1, Gravbar, SLR, Psi), G_Grav_U (g,m)); ((U (-g), Sup (m, g), Grino), GBG (1, Psibar, SLR, Grav), G_Grav_Uc (g,m)); ((Grino, Sdown (m, -g), D g), GBG (1, Gravbar, SLR, Psi), G_Grav_D (g,m)); ((D (-g), Sdown (m, g), Grino), GBG (1, Psibar, SLR, Grav), G_Grav_Dc (g,m)) ] let higgs_ch_gravitino c = let cc = conj_char c in [ ((Grino, Hm, Chargino c), GBG (1, Gravbar, SLR, Psi), G_Gr_H_Ch c); ((Chargino cc, Hp, Grino), GBG (1, Psibar, SLR, Grav), G_Gr_H_Ch cc) ] let higgs_neu_gravitino n = [ ((Grino, H_Light, Neutralino n), GBG (1, Gravbar, SLR, Chi), G_Gr_H1_Neu n); ((Grino, H_Heavy, Neutralino n), GBG (1, Gravbar, SLR, Chi), G_Gr_H2_Neu n); ((Grino, A, Neutralino n), GBG (1, Gravbar, SLR, Chi), G_Gr_H3_Neu n) ] let gravitino_gaugino_3 = [ ((Grino, Gl, Gluino), GBG (1, Gravbar, V, Chi), G_Grav); ((Gluino, Gl, Grino), GBG (1, Chibar, V, Grav), G_Grav); ((Chargino C1c, Wp, Grino), GBG (1, Psibar, VLR, Grav), G_Gr_Ch C1); ((Chargino C2c, Wp, Grino), GBG (1, Psibar, VLR, Grav), G_Gr_Ch C2); ((Grino, Wm, Chargino C1), GBG (1, Gravbar, VLR, Psi), G_Gr_Ch C1c); ((Grino, Wm, Chargino C2), GBG (1, Gravbar, VLR, Psi), G_Gr_Ch C2c); ((Grino, Z, Neutralino N1), GBG (1, Gravbar, VLR, Chi), G_Gr_Z_Neu N1); ((Grino, Z, Neutralino N2), GBG (1, Gravbar, VLR, Chi), G_Gr_Z_Neu N2); ((Grino, Z, Neutralino N3), GBG (1, Gravbar, VLR, Chi), G_Gr_Z_Neu N3); ((Grino, Z, Neutralino N4), GBG (1, Gravbar, VLR, Chi), G_Gr_Z_Neu N4); ((Grino, Ga, Neutralino N1), GBG (1, Gravbar, VLR, Chi), G_Gr_A_Neu N1); ((Grino, Ga, Neutralino N2), GBG (1, Gravbar, VLR, Chi), G_Gr_A_Neu N2); ((Grino, Ga, Neutralino N3), GBG (1, Gravbar, VLR, Chi), G_Gr_A_Neu N3); ((Grino, Ga, Neutralino N4), GBG (1, Gravbar, VLR, Chi), G_Gr_A_Neu N4) ] let triple_gravitino = ThoList.flatmap triple_gravitino' [1;2;3] @ List.flatten (Product.list2 triple_gravitino'' [1;2;3] [M1; M2]) @ ThoList.flatmap higgs_ch_gravitino [C1; C2] @ ThoList.flatmap higgs_neu_gravitino [N1; N2; N3; N4] @ gravitino_gaugino_3 (*** REVISED: Compatible with CD+. ***) let triple_gauge = [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_G_S)] (*** REVISED: Independent of the sign of CD. ***) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let gluon4 = Vector4 [(-1, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_PZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_PPWW; (Gl, Gl, Gl, Gl), gauge4, G_SS] (* The [Scalar_Vector_Vector] couplings do not depend on the choice of the sign of the covariant derivative since they are quadratic in the gauge couplings. *) (*** REVISED: Compatible with CD+. ***) (*** Revision: 2005-03-10: first two vertices corrected. ***) let gauge_higgs = [ ((Wm, Hp, A), Vector_Scalar_Scalar 1, G_GH 1); ((Wp, Hm, A), Vector_Scalar_Scalar 1, G_GH 1); ((Z, H_Heavy, A), Vector_Scalar_Scalar 1, G_GH 3); ((Z, H_Light, A), Vector_Scalar_Scalar 1, G_GH 2); ((H_Heavy, Wp, Wm), Scalar_Vector_Vector 1, G_GH 5); ((H_Light, Wp, Wm), Scalar_Vector_Vector 1, G_GH 4); ((Wm, Hp, H_Heavy), Vector_Scalar_Scalar 1, G_GH 7); ((Wp, Hm, H_Heavy), Vector_Scalar_Scalar (-1), G_GH 7); ((Wm, Hp, H_Light), Vector_Scalar_Scalar 1, G_GH 6); ((Wp, Hm, H_Light), Vector_Scalar_Scalar (-1), G_GH 6); ((H_Heavy, Z, Z), Scalar_Vector_Vector 1, G_GH 9); ((H_Light, Z, Z), Scalar_Vector_Vector 1, G_GH 8); ((Z, Hp, Hm), Vector_Scalar_Scalar 1, G_GH 10); ((Ga, Hp, Hm), Vector_Scalar_Scalar 1, G_GH 11) ] @ (if Flags.higgs_triangle then [((H_Light, Gl, Gl), Dim5_Scalar_Gauge2 1, G_GLGLH); ((H_Heavy, Gl, Gl), Dim5_Scalar_Gauge2 1, G_GLGLHH); ((A, Gl, Gl), Dim5_Scalar_Gauge2_Skew 1, G_GLGLA); ((H_Light, Ga, Ga), Dim5_Scalar_Gauge2 1, G_PPH); ((H_Heavy, Ga, Ga), Dim5_Scalar_Gauge2 1, G_PPHH); ((A, Ga, Ga), Dim5_Scalar_Gauge2 1, G_PPA)] else []) (*** REVISED: Compatible with CD+ and GS+. ***) let gauge_higgs_gold = [ ((Wp, Phi0, Phim), Vector_Scalar_Scalar 1, G_GH 1); ((Wm, Phi0, Phip), Vector_Scalar_Scalar 1, G_GH 1); ((Z, H_Heavy, Phi0), Vector_Scalar_Scalar 1, G_GH 2); ((Z, H_Light, Phi0), Vector_Scalar_Scalar (-1), G_GH 3); ((Wp, H_Heavy, Phim), Vector_Scalar_Scalar 1, G_GH 6); ((Wm, H_Heavy, Phip), Vector_Scalar_Scalar (-1), G_GH 6); ((Wp, H_Light, Phim), Vector_Scalar_Scalar (-1), G_GH 7); ((Wm, H_Light, Phip), Vector_Scalar_Scalar 1, G_GH 7); ((Phim, Wp, Ga), Scalar_Vector_Vector 1, G_GHGo 1); ((Phip, Wm, Ga), Scalar_Vector_Vector 1, G_GHGo 1); ((Phim, Wp, Z), Scalar_Vector_Vector 1, G_GHGo 2); ((Phip, Wm, Z), Scalar_Vector_Vector 1, G_GHGo 2); ((Z, Phip, Phim), Vector_Scalar_Scalar 1, G_GH 10); ((Ga, Phip, Phim), Vector_Scalar_Scalar 1, G_GH 11) ] let gauge_higgs4 = [ ((A, A, Z, Z), Scalar2_Vector2 1, G_GH4 1); ((H_Heavy, H_Heavy, Z, Z), Scalar2_Vector2 1, G_GH4 3); ((H_Light, H_Light, Z, Z), Scalar2_Vector2 1, G_GH4 2); ((Hp, Hm, Z, Z), Scalar2_Vector2 1, G_GH4 4); ((Hp, Hm, Ga, Ga), Scalar2_Vector2 1, G_GH4 5); ((Hp, Hm, Ga, Z), Scalar2_Vector2 1, G_GH4 6); ((Hp, H_Heavy, Wm, Z), Scalar2_Vector2 1, G_GH4 8); ((Hm, H_Heavy, Wp, Z), Scalar2_Vector2 1, G_GH4 8); ((Hp, H_Light, Wm, Z), Scalar2_Vector2 1, G_GH4 7); ((Hm, H_Light, Wp, Z), Scalar2_Vector2 1, G_GH4 7); ((Hp, H_Heavy, Wm, Ga), Scalar2_Vector2 1, G_GH4 10); ((Hm, H_Heavy, Wp, Ga), Scalar2_Vector2 1, G_GH4 10); ((Hp, H_Light, Wm, Ga), Scalar2_Vector2 1, G_GH4 9); ((Hm, H_Light, Wp, Ga), Scalar2_Vector2 1, G_GH4 9); ((A, A, Wp, Wm), Scalar2_Vector2 1, G_GH4 11); ((H_Heavy, H_Heavy, Wp, Wm), Scalar2_Vector2 1, G_GH4 13); ((H_Light, H_Light, Wp, Wm), Scalar2_Vector2 1, G_GH4 12); ((Hp, Hm, Wp, Wm), Scalar2_Vector2 1, G_GH4 14); ((Hp, A, Wm, Z), Scalar2_Vector2 1, G_GH4 15); ((Hm, A, Wp, Z), Scalar2_Vector2 (-1), G_GH4 15); ((Hp, A, Wm, Ga), Scalar2_Vector2 1, G_GH4 16); ((Hm, A, Wp, Ga), Scalar2_Vector2 (-1), G_GH4 16) ] let gauge_higgs_gold4 = [ ((Z, Z, Phi0, Phi0), Scalar2_Vector2 1, G_GHGo4 1); ((Z, Z, Phip, Phim), Scalar2_Vector2 1, G_GHGo4 2); ((Ga, Ga, Phip, Phim), Scalar2_Vector2 1, G_GHGo4 3); ((Z, Ga, Phip, Phim), Scalar2_Vector2 1, G_GHGo4 4); ((Wp, Wm, Phip, Phim), Scalar2_Vector2 1, G_GHGo4 5); ((Wp, Wm, Phi0, Phi0), Scalar2_Vector2 1, G_GHGo4 5); ((Wp, Z, Phim, Phi0), Scalar2_Vector2 1, G_GHGo4 6); ((Wm, Z, Phip, Phi0), Scalar2_Vector2 (-1), G_GHGo4 6); ((Wp, Ga, Phim, Phi0), Scalar2_Vector2 1, G_GHGo4 7); ((Wm, Ga, Phip, Phi0), Scalar2_Vector2 (-1), G_GHGo4 7); ((Wp, Z, Phim, H_Heavy), Scalar2_Vector2 1, G_GHGo4 9); ((Wm, Z, Phip, H_Heavy), Scalar2_Vector2 1, G_GHGo4 9); ((Wp, Ga, Phim, H_Heavy), Scalar2_Vector2 1, G_GHGo4 11); ((Wm, Ga, Phip, H_Heavy), Scalar2_Vector2 1, G_GHGo4 11); ((Wp, Z, Phim, H_Light), Scalar2_Vector2 1, G_GHGo4 8); ((Wm, Z, Phip, H_Light), Scalar2_Vector2 1, G_GHGo4 8); ((Wp, Ga, Phim, H_Light), Scalar2_Vector2 1, G_GHGo4 10); ((Wm, Ga, Phip, H_Light), Scalar2_Vector2 1, G_GHGo4 10) ] let gauge_sfermion4' g m1 m2 = [ ((Wp, Wm, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SL,g,m1,m2)); ((Z, Ga, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SL,g,m1,m2)); ((Z, Z, Slepton (m1,g), Slepton (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SL,g,m1,m2)); ((Wp, Wm, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SU,g,m1,m2)); ((Wp, Wm, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_WWSFSF (SD,g,m1,m2)); ((Z, Z, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SU,g,m1,m2)); ((Z, Z, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_ZZSFSF (SD,g,m1,m2)); ((Z, Ga, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SU,g,m1,m2)); ((Z, Ga, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 1, G_ZPSFSF (SD,g,m1,m2)) ] let gauge_sfermion4'' g m = [ ((Wp, Ga, Slepton (m,g), Sneutrino (-g)), Scalar2_Vector2 1, G_WPSLSN (false,g,m)); ((Wm, Ga, Slepton (m,-g), Sneutrino g), Scalar2_Vector2 1, G_WPSLSN (true,g,m)); ((Wp, Z, Slepton (m,g), Sneutrino (-g)), Scalar2_Vector2 1, G_WZSLSN (false,g,m)); ((Wm, Z, Slepton (m,-g), Sneutrino g), Scalar2_Vector2 1, G_WZSLSN (true,g,m)); ((Ga, Ga, Slepton (m,g), Slepton (m,-g)), Scalar2_Vector2 1, G_PPSFSF SL); ((Ga, Ga, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 1, G_PPSFSF SU); ((Ga, Ga, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 1, G_PPSFSF SD)] let gauge_sfermion4 g = List.flatten (Product.list2 (gauge_sfermion4' g) [M1;M2] [M1;M2]) @ ThoList.flatmap (gauge_sfermion4'' g) [M1;M2] @ [ ((Wp, Wm, Sneutrino g, Sneutrino (-g)), Scalar2_Vector2 1, G_WWSFSF (SN,g,M1,M1)); ((Z, Z, Sneutrino g, Sneutrino (-g)), Scalar2_Vector2 1, G_ZZSFSF (SN,g,M1,M1)) ] let gauge_squark4'' g h m1 m2 = [ ((Wp, Ga, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_WPSUSD (false,m1,m2,g,h)); ((Wm, Ga, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_WPSUSD (true,m1,m2,g,h)); ((Wp, Z, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_WZSUSD (false,m1,m2,g,h)); ((Wm, Z, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_WZSUSD (true,m1,m2,g,h)) ] let gauge_squark4' g h = List.flatten (Product.list2 (gauge_squark4'' g h) [M1;M2] [M1;M2]) let gauge_squark4 = if Flags.ckm_present then List.flatten (Product.list2 gauge_squark4' [1;2;3] [1;2;3]) else ThoList.flatmap (fun g -> gauge_squark4' g g) [1;2;3] let gluon_w_squark'' g h m1 m2 = [ ((Gl, Wp, Sup (m1,-g), Sdown (m2,h)), Scalar2_Vector2 1, G_GlWSUSD (false,m1,m2,g,h)); ((Gl, Wm, Sup (m1,g), Sdown (m2,-h)), Scalar2_Vector2 1, G_GlWSUSD (true,m1,m2,g,h)) ] let gluon_w_squark' g h = List.flatten (Product.list2 (gluon_w_squark'' g h) [M1;M2] [M1;M2]) let gluon_w_squark = if Flags.ckm_present then List.flatten (Product.list2 gluon_w_squark' [1;2;3] [1;2;3]) else ThoList.flatmap (fun g -> gluon_w_squark' g g) [1;2;3] let gluon_gauge_squark' g m1 m2 = [ ((Gl, Z, Sup (m1,g), Sup (m2,-g)), Scalar2_Vector2 2, G_GlZSFSF (SU,g,m1,m2)); ((Gl, Z, Sdown (m1,g), Sdown (m2,-g)), Scalar2_Vector2 2, G_GlZSFSF (SD,g,m1,m2)) ] let gluon_gauge_squark'' g m = [ ((Gl, Ga, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 2, G_GlPSQSQ); ((Gl, Ga, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 (-1), G_GlPSQSQ) ] let gluon_gauge_squark g = List.flatten (Product.list2 (gluon_gauge_squark' g) [M1;M2] [M1;M2]) @ ThoList.flatmap (gluon_gauge_squark'' g) [M1;M2] let gluon2_squark2 g m = [ ((Gl, Gl, Sup (m,g), Sup (m,-g)), Scalar2_Vector2 1, G_GlGlSQSQ); ((Gl, Gl, Sdown (m,g), Sdown (m,-g)), Scalar2_Vector2 1, G_GlGlSQSQ)] (*** REVISED: Independent of the sign of CD. ***) let higgs = [ ((Hp, Hm, H_Heavy), Scalar_Scalar_Scalar 1, G_H3 1); ((Hp, Hm, H_Light), Scalar_Scalar_Scalar 1, G_H3 2); ((H_Heavy, H_Heavy, H_Light), Scalar_Scalar_Scalar 1, G_H3 3); ((H_Heavy, H_Heavy, H_Heavy), Scalar_Scalar_Scalar 1, G_H3 4); ((H_Light, H_Light, H_Light), Scalar_Scalar_Scalar 1, G_H3 5); ((H_Heavy, H_Light, H_Light), Scalar_Scalar_Scalar 1, G_H3 6); ((H_Heavy, A, A), Scalar_Scalar_Scalar 1, G_H3 7); ((H_Light, A, A), Scalar_Scalar_Scalar 1, G_H3 8) ] (*** REVISED: Compatible with GS+, independent of the sign of CD. ***) let higgs_gold = [ ((H_Heavy, A, Phi0), Scalar_Scalar_Scalar 1, G_HGo3 1); ((H_Light, A, Phi0), Scalar_Scalar_Scalar 1, G_HGo3 2); ((H_Heavy, Hp, Phim), Scalar_Scalar_Scalar 1, G_HGo3 3); ((H_Heavy, Hm, Phip), Scalar_Scalar_Scalar 1, G_HGo3 3); ((H_Light, Hp, Phim), Scalar_Scalar_Scalar 1, G_HGo3 4); ((H_Light, Hm, Phip), Scalar_Scalar_Scalar 1, G_HGo3 4); ((A, Hp, Phim), Scalar_Scalar_Scalar (-1), G_HGo3 5); ((A, Hm, Phip), Scalar_Scalar_Scalar 1, G_HGo3 5); ((H_Heavy, Phi0, Phi0), Scalar_Scalar_Scalar (-1), G_H3 7); ((H_Heavy, Phip, Phim), Scalar_Scalar_Scalar (-1), G_H3 7); ((H_Light, Phi0, Phi0), Scalar_Scalar_Scalar (-1), G_H3 8); ((H_Light, Phip, Phim), Scalar_Scalar_Scalar (-1), G_H3 8) ] (* Here follow purely scalar quartic vertices which are only available for the no-Whizard colored version. *) (*** REVISED: Independent of the sign of CD. ***) let higgs4 = [ ((Hp, Hm, Hp, Hm), Scalar4 1, G_H4 1); ((Hp, Hm, H_Heavy, H_Heavy), Scalar4 1, G_H4 2); ((Hp, Hm, H_Light, H_Light), Scalar4 1, G_H4 3); ((Hp, Hm, H_Heavy, H_Light), Scalar4 1, G_H4 4); ((Hp, Hm, A, A), Scalar4 1, G_H4 5); ((H_Heavy, H_Heavy, H_Heavy, H_Heavy), Scalar4 1, G_H4 6); ((H_Light, H_Light, H_Light, H_Light), Scalar4 1, G_H4 6); ((H_Heavy, H_Heavy, H_Light, H_Light), Scalar4 1, G_H4 7); ((H_Heavy, H_Light, H_Light, H_Light), Scalar4 1, G_H4 8); ((H_Heavy, H_Heavy, H_Heavy, H_Light), Scalar4 (-1), G_H4 8); ((H_Heavy, H_Heavy, A, A), Scalar4 1, G_H4 9); ((H_Light, H_Light, A, A), Scalar4 (-1), G_H4 9); ((H_Heavy, H_Light, A, A), Scalar4 1, G_H4 10); ((A, A, A, A), Scalar4 1, G_H4 11) ] (*** REVISED: Compatible with GS+, independent of the sign of CD. ***) let higgs_gold4 = [ ((H_Heavy, H_Heavy, A, Phi0), Scalar4 1, G_HGo4 1); ((H_Heavy, H_Light, A, Phi0), Scalar4 1, G_HGo4 2); ((H_Light, H_Light, A, Phi0), Scalar4 (-1), G_HGo4 1); ((A, A, A, Phi0), Scalar4 3, G_HGo4 3); ((Hp, Hm, A, Phi0), Scalar4 1, G_HGo4 3); ((H_Heavy, H_Heavy, Hp, Phim), Scalar4 1, G_HGo4 4); ((H_Heavy, H_Heavy, Hm, Phip), Scalar4 1, G_HGo4 4); ((H_Heavy, H_Light, Hp, Phim), Scalar4 1, G_HGo4 5); ((H_Heavy, H_Light, Hm, Phip), Scalar4 1, G_HGo4 5); ((H_Light, H_Light, Hp, Phim), Scalar4 (-1), G_HGo4 4); ((H_Light, H_Light, Hm, Phip), Scalar4 (-1), G_HGo4 4); ((A, A, Hp, Phim), Scalar4 1, G_HGo4 6); ((A, A, Hm, Phip), Scalar4 1, G_HGo4 6); ((H_Heavy, A, Hp, Phim), Scalar4 1, G_HGo4 7); ((H_Heavy, A, Hm, Phip), Scalar4 (-1), G_HGo4 7); ((H_Light, A, Hp, Phim), Scalar4 1, G_HGo4 8); ((H_Light, A, Hm, Phip), Scalar4 (-1), G_HGo4 8); ((Hp, Hm, Hp, Phim), Scalar4 2, G_HGo4 6); ((Hp, Hm, Hm, Phip), Scalar4 2, G_HGo4 6); ((H_Heavy, H_Heavy, Phi0, Phi0), Scalar4 (-1), G_H4 9); ((H_Heavy, H_Light, Phi0, Phi0), Scalar4 (-1), G_H4 10); ((H_Light, H_Light, Phi0, Phi0), Scalar4 1, G_H4 9); ((A, A, Phi0, Phi0), Scalar4 1, G_HGo4 9); ((Hp, Hm, Phi0, Phi0), Scalar4 1, G_HGo4 10); ((H_Heavy, Hp, Phim, Phi0), Scalar4 1, G_HGo4 8); ((H_Heavy, Hm, Phip, Phi0), Scalar4 (-1), G_HGo4 8); ((H_Light, Hp, Phim, Phi0), Scalar4 (-1), G_HGo4 7); ((H_Light, Hm, Phip, Phi0), Scalar4 1, G_HGo4 7); ((A, Hp, Phim, Phi0), Scalar4 1, G_HGo4 11); ((A, Hm, Phip, Phi0), Scalar4 1, G_HGo4 11); ((H_Heavy, H_Heavy, Phip, Phim), Scalar4 1, G_HGo4 12); ((H_Heavy, H_Light, Phip, Phim), Scalar4 1, G_HGo4 13); ((H_Light, H_Light, Phip, Phim), Scalar4 1, G_HGo4 14); ((A, A, Phip, Phim), Scalar4 1, G_HGo4 15); ((Hp, Hm, Phip, Phim), Scalar4 1, G_HGo4 16); ((Hp, Hp, Phim, Phim), Scalar4 1, G_HGo4 17); ((Hm, Hm, Phip, Phip), Scalar4 1, G_HGo4 17); ((Hp, Phim, Phi0, Phi0), Scalar4 (-1), G_HGo4 6); ((Hm, Phip, Phi0, Phi0), Scalar4 (-1), G_HGo4 6); ((A, Phi0, Phi0, Phi0), Scalar4 (-3), G_HGo4 6); ((A, Phi0, Phip, Phim), Scalar4 (-1), G_HGo4 6); ((Hp, Phim, Phip, Phim), Scalar4 (-2), G_HGo4 6); ((Hm, Phip, Phip, Phim), Scalar4 (-2), G_HGo4 6) ] (*** REVISED: Independent of the sign of CD and GS. ***) let goldstone4 = [ ((Phi0, Phi0, Phi0, Phi0), Scalar4 1, G_GG4 1); ((Phip, Phim, Phi0, Phi0), Scalar4 1, G_GG4 2); ((Phip, Phim, Phip, Phim), Scalar4 1, G_GG4 3) ] (* The vertices of the type Higgs - Sfermion - Sfermion are independent of the choice of the CD sign since they are quadratic in the gauge coupling. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_sneutrino' g = [ ((H_Heavy, Sneutrino g, Sneutrino (-g)), Scalar_Scalar_Scalar 1, G_H2SFSF (SN,g,M1,M1)); ((H_Light, Sneutrino g, Sneutrino (-g)), Scalar_Scalar_Scalar 1, G_H1SFSF (SN,g,M1,M1)); ((Hp, Sneutrino (-g), Slepton (M1,g)), Scalar_Scalar_Scalar 1, G_HSNSL (false,g,M1)); ((Hm, Sneutrino g, Slepton (M1,-g)), Scalar_Scalar_Scalar 1, G_HSNSL (true,g,M1)) ] let higgs_sneutrino'' = [ ((Hp, Sneutrino (-3), Slepton (M2,3)), Scalar_Scalar_Scalar 1, G_HSNSL (false,3,M2)); ((Hm, Sneutrino 3, Slepton (M2,-3)), Scalar_Scalar_Scalar 1, G_HSNSL (false,3,M2)) ] let higgs_sneutrino = ThoList.flatmap higgs_sneutrino' [1;2;3] @ higgs_sneutrino'' (* Under the assumption that there is no mixing between the left- and right-handed sfermions for the first two generations there is only a coupling of the form Higgs - sfermion1 - sfermion2 for the third generation. All the others are suppressed by $m_f/M_W$. *) (*** REVISED: Independent of the sign of CD. ***) let higgs_sfermion' g m1 m2 = [ ((H_Heavy, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_H2SFSF (SL,g,m1,m2)); ((H_Light, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_H1SFSF (SL,g,m1,m2)); ((H_Heavy, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_H2SFSF (SU,g,m1,m2)); ((H_Heavy, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_H2SFSF (SD,g,m1,m2)); ((H_Light, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_H1SFSF (SU,g,m1,m2)); ((H_Light, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_H1SFSF (SD,g,m1,m2)) ] let higgs_sfermion'' m1 m2 = [ ((A, Slepton (m1,3), Slepton (m2,-3)), Scalar_Scalar_Scalar 1, G_ASFSF (SL,3,m1,m2)); ((A, Sup (m1,3), Sup (m2,-3)), Scalar_Scalar_Scalar 1, G_ASFSF (SU,3,m1,m2)); ((A, Sdown (m1,3), Sdown (m2,-3)), Scalar_Scalar_Scalar 1, G_ASFSF (SD,3,m1,m2)) ] let higgs_sfermion = List.flatten (Product.list2 (higgs_sfermion' 3) [M1;M2] [M1;M2]) @ (higgs_sfermion' 1 M1 M1) @ (higgs_sfermion' 1 M2 M2) @ (higgs_sfermion' 2 M1 M1) @ (higgs_sfermion' 2 M2 M2) @ List.flatten (Product.list2 higgs_sfermion'' [M1;M2] [M1;M2]) (*i let higgs_sfermion g = List.flatten (Product.list2 (higgs_sfermion' g) [M1;M2] [M1;M2]) i*) (*** REVISED: Independent of the sign of CD, compatible with GS+. ***) let goldstone_sfermion' g m1 m2 = [ ((Phi0, Slepton (m1,g), Slepton (m2,-g)), Scalar_Scalar_Scalar 1, G_GoSFSF (SL,g,m1,m2)); ((Phi0, Sup (m1,g), Sup (m2,-g)), Scalar_Scalar_Scalar 1, G_GoSFSF (SU,g,m1,m2)); ((Phi0, Sdown (m1,g), Sdown (m2,-g)), Scalar_Scalar_Scalar 1, G_GoSFSF (SD,g,m1,m2))] let goldstone_sfermion'' g = [ ((Phip, Sneutrino (-g), Slepton (M1,g)), Scalar_Scalar_Scalar 1, G_GoSNSL (false,g,M1)); ((Phim, Sneutrino g, Slepton (M1,-g)), Scalar_Scalar_Scalar 1, G_GoSNSL (true,g,M1)) ] let goldstone_sfermion''' g = [ ((Phip, Sneutrino (-g), Slepton (M2,g)), Scalar_Scalar_Scalar 1, G_GoSNSL (false,g,M2)); ((Phim, Sneutrino g, Slepton (M2,-g)), Scalar_Scalar_Scalar 1, G_GoSNSL (true,g,M2))] let goldstone_sfermion = List.flatten (Product.list2 (goldstone_sfermion' 3) [M1;M2] [M1;M2]) @ ThoList.flatmap goldstone_sfermion'' [1;2;3] @ goldstone_sfermion''' 3 (*** REVISED: Independent of the sign of CD. ***) let higgs_squark' g h m1 m2 = [ ((Hp, Sup (m1,-g), Sdown (m2,h)), Scalar_Scalar_Scalar 1, G_HSUSD (false,m1,m2,g,h)); ((Hm, Sup (m1,g), Sdown (m2,-h)), Scalar_Scalar_Scalar 1, G_HSUSD (true,m1,m2,g,h)) ] let higgs_squark_a g h = higgs_squark' g h M1 M1 let higgs_squark_b (g,h) = List.flatten (Product.list2 (higgs_squark' g h) [M1;M2] [M1;M2]) let higgs_squark = if Flags.ckm_present then List.flatten (Product.list2 higgs_squark_a [1;2] [1;2]) @ ThoList.flatmap higgs_squark_b [(1,3);(2,3);(3,3);(3,1);(3,2)] else higgs_squark_a 1 1 @ higgs_squark_a 2 2 @ higgs_squark_b (3,3) (*** REVISED: Independent of the sign of CD, compatible with GS+. ***) let goldstone_squark' g h m1 m2 = [ ((Phip, Sup (m1,-g), Sdown (m2,h)), Scalar_Scalar_Scalar 1, G_GSUSD (false,m1,m2,g,h)); ((Phim, Sup (m1,g), Sdown (m2,-h)), Scalar_Scalar_Scalar 1, G_GSUSD (true,m1,m2,g,h)) ] let goldstone_squark_a g h = goldstone_squark' g h M1 M1 let goldstone_squark_b (g,h) = List.flatten (Product.list2 (goldstone_squark' g h) [M1;M2] [M1;M2]) let goldstone_squark = List.flatten (Product.list2 goldstone_squark_a [1;2] [1;2]) @ ThoList.flatmap goldstone_squark_b [(1,3);(2,3);(3,3);(3,1);(3,2)] (* BAUSTELLE: For the quartic scalar coupligs we does not allow [whiz_col]. *) let higgs_sneutrino4' g m = [ ((Hp, H_Heavy, Slepton (m,g), Sneutrino (-g)), Scalar4 1, G_HH2SLSN (false,m,g)); ((Hm, H_Heavy, Slepton (m,-g), Sneutrino g), Scalar4 1, G_HH2SLSN (true,m,g)); ((Hp, H_Light, Slepton (m,g), Sneutrino (-g)), Scalar4 1, G_HH1SLSN (false,m,g)); ((Hm, H_Light, Slepton (m,-g), Sneutrino g), Scalar4 1, G_HH1SLSN (true,m,g)); ((Hp, A, Slepton (m,g), Sneutrino (-g)), Scalar4 1, G_HASLSN (false,m,g)); ((Hm, A, Slepton (m,-g), Sneutrino g), Scalar4 1, G_HASLSN (true,m,g)) ] let higgs_sneutrino4 g = ThoList.flatmap (higgs_sneutrino4' g) [M1;M2] @ [ ((H_Heavy, H_Heavy, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_H2H2SFSF (SN,M1,M1,g)); ((H_Heavy, H_Light, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_H1H2SFSF (SN,M1,M1,g)); ((H_Light, H_Light, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_H1H1SFSF (SN,M1,M1,g)); ((Hp, Hm, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_HHSFSF (SN,M1,M1,g)) ] let higgs_sfermion4' g m1 m2 = [ ((H_Heavy, H_Heavy, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_H2H2SFSF (SL,m1,m2,g)); ((H_Heavy, H_Light, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_H1H2SFSF (SL,m1,m2,g)); ((H_Light, H_Light, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_H1H1SFSF (SL,m1,m2,g)); ((A, A, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_AASFSF (SL,m1,m2,g)); ((Hp, Hm, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_HHSFSF (SL,m1,m2,g)); ((H_Heavy, H_Heavy, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_H2H2SFSF (SU,m1,m2,g)); ((H_Heavy, H_Heavy, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_H2H2SFSF (SD,m1,m2,g)); ((H_Light, H_Light, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_H1H1SFSF (SU,m1,m2,g)); ((H_Light, H_Light, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_H1H1SFSF (SD,m1,m2,g)); ((H_Light, H_Heavy, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_H1H2SFSF (SU,m1,m2,g)); ((H_Light, H_Heavy, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_H1H2SFSF (SD,m1,m2,g)); ((Hp, Hm, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_HHSFSF (SU,m1,m2,g)); ((Hp, Hm, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_HHSFSF (SD,m1,m2,g)); ((A, A, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_AASFSF (SU,m1,m2,g)); ((A, A, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_AASFSF (SD,m1,m2,g)) ] let higgs_sfermion4 g = List.flatten (Product.list2 (higgs_sfermion4' g) [M1;M2] [M1;M2]) let higgs_squark4' g h m1 m2 = [ ((Hp, H_Light, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_HH1SUSD (false,m1,m2,g,h)); ((Hm, H_Light, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_HH1SUSD (true,m1,m2,g,h)); ((Hp, H_Heavy, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_HH2SUSD (false,m1,m2,g,h)); ((Hm, H_Heavy, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_HH2SUSD (true,m1,m2,g,h)); ((Hp, A, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_HASUSD (false,m1,m2,g,h)); ((Hm, A, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_HASUSD (true,m1,m2,g,h)) ] let higgs_squark4 g h = List.flatten (Product.list2 (higgs_squark4' g h) [M1;M2] [M1;M2]) let higgs_gold_sneutrino' g m = [ ((Hp, Phi0, Sneutrino (-g), Slepton (m,g)), Scalar4 1, G_HGSNSL (false,m,g)); ((Hm, Phi0, Sneutrino g, Slepton (m,-g)), Scalar4 1, G_HGSNSL (true,m,g)); ((H_Heavy, Phip, Sneutrino (-g), Slepton (m,g)), Scalar4 1, G_H2GSNSL (false,m,g)); ((H_Heavy, Phim, Sneutrino g, Slepton (m,-g)), Scalar4 1, G_H2GSNSL (true,m,g)); ((H_Light, Phip, Sneutrino (-g), Slepton (m,g)), Scalar4 1, G_H1GSNSL (false,m,g)); ((H_Light, Phim, Sneutrino g, Slepton (m,-g)), Scalar4 1, G_H1GSNSL (true,m,g)); ((A, Phip, Sneutrino (-g), Slepton (m,g)), Scalar4 1, G_AGSNSL (false,m,g)); ((A, Phim, Sneutrino g, Slepton (m,-g)), Scalar4 1, G_AGSNSL (true,m,g)); ((Phi0, Phip, Sneutrino (-g), Slepton (m,g)), Scalar4 1, G_GGSNSL (false,m,g)); ((Phi0, Phim, Sneutrino g, Slepton (m,-g)), Scalar4 1, G_GGSNSL (true,m,g))] let higgs_gold_sneutrino g = ThoList.flatmap (higgs_gold_sneutrino' g) [M1;M2] @ [ ((A, Phi0, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_AG0SFSF (SN,M1,M1,g)); ((Hp, Phim, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_HGSFSF (SN,M1,M1,g)); ((Hm, Phip, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_HGSFSF (SN,M1,M1,g)); ((Phip, Phim, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_GGSFSF (SN,M1,M1,g)); ((Phi0, Phi0, Sneutrino g, Sneutrino (-g)), Scalar4 1, G_G0G0SFSF (SN,M1,M1,g)) ] let higgs_gold_sfermion' g m1 m2 = [ ((A, Phi0, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_AG0SFSF (SL,m1,m2,g)); ((Hp, Phim, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_HGSFSF (SL,m1,m2,g)); ((Hm, Phip, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_HGSFSF (SL,m1,m2,g)); ((Phip, Phim, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_GGSFSF (SL,m1,m2,g)); ((Phi0, Phi0, Slepton (m1,g), Slepton (m2,-g)), Scalar4 1, G_G0G0SFSF (SL,m1,m2,g)); ((A, Phi0, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_AG0SFSF (SU,m1,m2,g)); ((A, Phi0, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_AG0SFSF (SD,m1,m2,g)); ((Hp, Phim, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_HGSFSF (SU,m1,m2,g)); ((Hm, Phip, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_HGSFSF (SU,m1,m2,g)); ((Hp, Phim, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_HGSFSF (SD,m1,m2,g)); ((Hm, Phip, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_HGSFSF (SD,m1,m2,g)); ((Phip, Phim, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_GGSFSF (SU,m1,m2,g)); ((Phip, Phim, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_GGSFSF (SD,m1,m2,g)); ((Phi0, Phi0, Sup (m1,g), Sup (m2,-g)), Scalar4 1, G_G0G0SFSF (SU,m1,m2,g)); ((Phi0, Phi0, Sdown (m1,g), Sdown (m2,-g)), Scalar4 1, G_G0G0SFSF (SD,m1,m2,g)) ] let higgs_gold_sfermion g = List.flatten (Product.list2 (higgs_gold_sfermion' g) [M1;M2] [M1;M2]) let higgs_gold_squark' g h m1 m2 = [ ((Hp, Phi0, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_HGSUSD (false,m1,m2,g,h)); ((Hm, Phi0, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_HGSUSD (true,m1,m2,g,h)); ((H_Heavy, Phip, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_H2GSUSD (false,m1,m2,g,h)); ((H_Heavy, Phim, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_H2GSUSD (true,m1,m2,g,h)); ((H_Light, Phip, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_H1GSUSD (false,m1,m2,g,h)); ((H_Light, Phim, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_H1GSUSD (true,m1,m2,g,h)); ((A, Phip, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_AGSUSD (false,m1,m2,g,h)); ((A, Phim, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_AGSUSD (true,m1,m2,g,h)); ((Phi0, Phip, Sup (m1,-g), Sdown (m2,h)), Scalar4 1, G_GGSUSD (false,m1,m2,g,h)); ((Phi0, Phim, Sup (m1,g), Sdown (m2,-h)), Scalar4 1, G_GGSUSD (true,m1,m2,g,h)) ] let higgs_gold_squark g h = List.flatten (Product.list2 (higgs_gold_squark' g h) [M1;M2] [M1;M2]) let sneutrino4' (g,h) = [ ((Sneutrino g, Sneutrino h, Sneutrino (-g), Sneutrino (-h)), Scalar4 1, G_SN4 (g,h))] let sneutrino4 = ThoList.flatmap sneutrino4' [(1,1);(1,2);(1,3);(2,2);(2,3);(3,3)] let sneu2_slep2_1' g h m1 m2 = ((Sneutrino (-g), Sneutrino g, Slepton (m1,-h), Slepton (m2,h)), Scalar4 1, G_SN2SL2_1 (m1,m2,g,h)) let sneu2_slep2_2' (g,h) m1 m2 = ((Sneutrino g, Sneutrino (-h), Slepton (m1,-g), Slepton (m2,h)), Scalar4 1, G_SN2SL2_2 (m1,m2,g,h)) let sneu2_slep2_1 g h = Product.list2 (sneu2_slep2_1' g h) [M1;M2] [M1;M2] let sneu2_slep2_2 (g,h) = Product.list2 (sneu2_slep2_2' (g,h)) [M1;M2] [M1;M2] (* The 4-slepton-vertices have the following structure: The sleptons come up in pairs of a positive and a negative slepton of the same generation; there is no vertex with e.g. two negative selectrons and two positive smuons, that of course would be a contradiction to the conservation of the separate slepton numbers of each generation which is not implemented in the MSSM. Because there is no CKM-mixing for the sleptons (in case of massless neutrinos) we maximally have two different generations of sleptons in a 4-slepton-vertex. *) let slepton4_1gen' g (m1,m2,m3,m4) = [ ((Slepton (m1,-g), Slepton (m2,g), Slepton (m3,-g), Slepton (m4,g)), Scalar4 1, G_SL4 (m1,m2,m3,m4,g)) ] let slepton4_1gen g = ThoList.flatmap (slepton4_1gen' g) [(M1,M1,M1,M1); (M1,M1,M1,M2); (M1,M1,M2,M1); (M1,M1,M2,M2); (M1,M2,M1,M2); (M1,M2,M2,M1); (M1,M2,M2,M2); (M2,M1,M2,M2); (M2,M2,M2,M2) ] let slepton4_2gen' (g,h) (m1,m2) (m3,m4) = ((Slepton (m1,-g), Slepton (m2,g), Slepton (m3,-h), Slepton (m4,h)), Scalar4 1, G_SL4_2 (m1,m2,m3,m4,g,h)) let slepton4_2gen (g,h) = Product.list2 (slepton4_2gen' (g,h)) [(M1,M1);(M1,M2);(M2,M1);(M2,M2)] [(M1,M1);(M1,M2);(M2,M1);(M2,M2)] let sneu2_squark2' g h m1 m2 = [ ((Sneutrino (-g), Sneutrino g, Sup (m1,-h), Sup (m2,h)), Scalar4 1, G_SN2SQ2 (SU,m1,m2,g,h)); ((Sneutrino (-g), Sneutrino g, Sdown (m1,-h), Sdown (m2,h)), Scalar4 1, G_SN2SQ2 (SD,m1,m2,g,h)) ] let sneu2_squark2 g h = List.flatten (Product.list2 (sneu2_squark2' g h) [M1;M2] [M1;M2]) let slepton2_squark2'' g h m1 m2 m3 m4 = [ ((Slepton (m1,-g), Slepton (m2,g), Sup (m3,-h), Sup (m4,h)), Scalar4 1, G_SL2SQ2 (SU,m1,m2,m3,m4,g,h)); ((Slepton (m1,-g), Slepton (m2,g), Sdown (m3,-h), Sdown (m4,h)), Scalar4 1, G_SL2SQ2 (SD,m1,m2,m3,m4,g,h)) ] let slepton2_squark2' g h m1 m2 = List.flatten (Product.list2 (slepton2_squark2'' g h m1 m2) [M1;M2] [M1;M2]) let slepton2_squark2 g h = List.flatten (Product.list2 (slepton2_squark2' g h) [M1;M2] [M1;M2]) let slep_sneu_squark2'' g1 g2 g3 m1 m2 m3 = [ ((Sup (m1,-g1), Sdown (m2,g2), Slepton (m3,-g3), Sneutrino g3), Scalar4 1, G_SUSDSNSL (false,m1,m2,m3,g1,g2,g3)); ((Sup (m1,g1), Sdown (m2,-g2), Slepton (m3,g3), Sneutrino (-g3)), Scalar4 1, G_SUSDSNSL (true,m1,m2,m3,g1,g2,g3)) ] let slep_sneu_squark2' g1 g2 g3 m1 = List.flatten (Product.list2 (slep_sneu_squark2'' g1 g2 g3 m1) [M1;M2] [M1;M2]) let slep_sneu_squark2 g1 g2 = List.flatten (Product.list2 (slep_sneu_squark2' g1 g2) [1;2;3] [M1;M2]) (* There are three kinds of 4-squark-vertices: Four up-Squarks, four down-squarks or two up- and two down-squarks. *) let sup4_1gen' g (m1,m2,m3,m4) = [ ((Sup (m1,-g), Sup (m2,g), Sup (m3,-g), Sup (m4,g)), Scalar4 1, G_SU4 (m1,m2,m3,m4,g)) ] let sup4_1gen g = ThoList.flatmap (sup4_1gen' g) [(M1,M1,M1,M1); (M1,M1,M1,M2); (M1,M1,M2,M1); (M1,M1,M2,M2); (M1,M2,M1,M2); (M1,M2,M2,M1); (M1,M2,M2,M2); (M2,M1,M2,M2); (M2,M2,M2,M2) ] let sup4_2gen' (g,h) (m1,m2) (m3,m4) = ((Sup (m1,-g), Sup (m2,g), Sup (m3,-h), Sup (m4,h)), Scalar4 1, G_SU4_2 (m1,m2,m3,m4,g,h)) let sup4_2gen (g,h) = Product.list2 (sup4_2gen' (g,h)) [(M1,M1);(M1,M2);(M2,M1);(M2,M2)] [(M1,M1);(M1,M2);(M2,M1);(M2,M2)] let sdown4_1gen' g (m1,m2,m3,m4) = [ ((Sdown (m1,-g), Sdown (m2,g), Sdown (m3,-g), Sdown (m4,g)), Scalar4 1, G_SD4 (m1,m2,m3,m4,g)) ] let sdown4_1gen g = ThoList.flatmap (sdown4_1gen' g) [(M1,M1,M1,M1); (M1,M1,M1,M2); (M1,M1,M2,M1); (M1,M1,M2,M2); (M1,M2,M1,M2); (M1,M2,M2,M1); (M1,M2,M2,M2); (M2,M1,M2,M2); (M2,M2,M2,M2) ] let sdown4_2gen' (g,h) (m1,m2) (m3,m4) = ((Sdown (m1,-g), Sdown (m2,g), Sdown (m3,-h), Sdown (m4,h)), Scalar4 1, G_SD4_2 (m1,m2,m3,m4,g,h)) let sdown4_2gen (g,h) = Product.list2 (sdown4_2gen' (g,h)) [(M1,M1);(M1,M2);(M2,M1);(M2,M2)] [(M1,M1);(M1,M2);(M2,M1);(M2,M2)] let sup2_sdown2_3 g1 g2 g3 g4 m1 m2 m3 m4 = ((Sup (m1,-g1), Sup (m2,g2), Sdown (m3,-g3), Sdown (m4,g4)), Scalar4 1, G_SU2SD2 (m1,m2,m3,m4,g1,g2,g3,g4)) let sup2_sdown2_2 g1 g2 g3 g4 m1 m2 = Product.list2 (sup2_sdown2_3 g1 g2 g3 g4 m1 m2) [M1;M2] [M1;M2] let sup2_sdown2_1 g1 g2 g3 g4 = List.flatten (Product.list2 (sup2_sdown2_2 g1 g2 g3 g4) [M1;M2] [M1;M2]) let sup2_sdown2 g1 g2 = List.flatten (Product.list2 (sup2_sdown2_1 g1 g2) [1;2;3] [1;2;3]) let quartic_grav_gauge g m = [ ((Grino, Slepton (m, -g), Ga, L g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4A_Sl (g,m)); ((L (-g), Slepton (m, g), Ga, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4A_Slc (g,m)); ((Grino, Sup (m, -g), Ga, U g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4A_Su (g,m)); ((U (-g), Sup (m, g), Ga, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4A_Suc (g,m)); ((Grino, Sdown (m, -g), Ga, D g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4A_Sd (g,m)); ((D (-g), Sdown (m, g), Ga, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4A_Sdc (g,m)); ((Grino, Slepton (m, -g), Z, L g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4Z_Sl (g,m)); ((L (-g), Slepton (m, g), Z, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4Z_Slc (g,m)); ((Grino, Sup (m, -g), Z, U g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4Z_Su (g,m)); ((U (-g), Sup (m, g), Z, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4Z_Suc (g,m)); ((Grino, Sdown (m, -g), Z, D g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4Z_Sd (g,m)); ((D (-g), Sdown (m, g), Z, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4Z_Sdc (g,m)); ((Grino, Sup (m, -g), Gl, U g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4Gl_Su (g,m)); ((U (-g), Sup (m, g), Gl, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4Gl_Suc (g,m)); ((Grino, Sdown (m, -g), Gl, D g), GBBG (1, Gravbar, SLRV, Psi), G_Gr4Gl_Sd (g,m)); ((D (-g), Sdown (m, g), Gl, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4Gl_Sdc (g,m)); ((Grino, Slepton (m, -g), Wm, N g), GBBG (1, Gravbar, SLV, Psi), G_Gr4W_Sl (g,m)); ((N (-g), Slepton (m, g), Wp, Grino), GBBG (1, Psibar, SLV, Grav), G_Gr4Z_Slc (g,m)); ((Grino, Sup (m, -g), Wp, D g), GBBG (1, Gravbar, SLV, Psi), G_Gr4W_Su (g,m)); ((D (-g), Sup (m, g), Wm, Grino), GBBG (1, Psibar, SLV, Grav), G_Gr4W_Suc (g,m)); ((Grino, Sdown (m, -g), Wm, U g), GBBG (1, Gravbar, SLV, Psi), G_Gr4W_Sd (g,m)); ((U (-g), Sdown (m, g), Wp, Grino), GBBG (1, Psibar, SLV, Grav), G_Gr4W_Sdc (g,m)) ] let quartic_grav_sneutrino g = [ ((Grino, Sneutrino (-g), Z, N g), GBBG (1, Gravbar, SLV, Psi), G_Gr4Z_Sn); ((N (-g), Sneutrino g, Z, Grino), GBBG (1, Psibar, SLV, Grav), G_Gr4Z_Snc); ((Grino, Sneutrino (-g), Wp, L g), GBBG (1, Gravbar, SLV, Psi), G_Gr4W_Sn); ((L (-g), Sneutrino g, Wm, Grino), GBBG (1, Psibar, SLV, Grav), G_Gr4W_Snc) ] let quartic_grav_neu n = [ ((Grino, Wp, Wm, Neutralino n), GBBG (1, Gravbar, V2LR, Chi), G_Gr4_Neu n); ((Grino, H_Light, Z, Neutralino n), GBBG (1, Gravbar, SLRV, Chi), G_Gr4_Z_H1 n); ((Grino, H_Heavy, Z, Neutralino n), GBBG (1, Gravbar, SLRV, Chi), G_Gr4_Z_H2 n); ((Grino, A, Z, Neutralino n), GBBG (1, Gravbar, SLRV, Chi), G_Gr4_Z_H3 n); ((Grino, Hm, Wp, Neutralino n), GBBG (1, Gravbar, SLRV, Chi), G_Gr4_W_H n); ((Grino, Hp, Wm, Neutralino n), GBBG (1, Gravbar, SLRV, Chi), G_Gr4_W_Hc n) ] let quartic_grav_char c = let cc = conj_char c in [ ((Grino, Wm, Ga, Chargino c), GBBG (1, Gravbar, V2LR, Psi), G_Gr4_A_Ch c); ((Grino, Wm, Z, Chargino c), GBBG (1, Gravbar, V2LR, Psi), G_Gr4_Z_Ch c); ((Chargino cc, Wp, Ga, Grino), GBBG ((-1), Psibar, V2LR, Grav), G_Gr4_A_Ch cc); ((Chargino cc, Wp, Z, Grino), GBBG ((-1), Psibar, V2LR, Grav), G_Gr4_Z_Ch cc); ((Grino, Hm, Ga, Chargino c), GBBG (1, Gravbar, SLRV, Psi), G_Gr4_H_A c); ((Chargino cc, Hp, Ga, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4_H_A cc); ((Grino, Hm, Z, Chargino c), GBBG (1, Gravbar, SLRV, Psi), G_Gr4_H_Z c); ((Chargino cc, Hp, Z, Grino), GBBG (1, Psibar, SLRV, Grav), G_Gr4_H_Z cc)] let quartic_gravitino = [ ((Grino, Gl, Gl, Gluino), GBBG (1, Gravbar, V2, Chi), G_GravGl)] @ ThoList.flatmap quartic_grav_neu [N1; N2; N3; N4] @ ThoList.flatmap quartic_grav_char [C1; C2] @ List.flatten (Product.list2 quartic_grav_gauge [1; 2; 3] [M1; M2]) @ ThoList.flatmap quartic_grav_sneutrino [1; 2; 3] let vertices3'' = if Flags.ckm_present then (ThoList.flatmap electromagnetic_currents_3 [1;2;3] @ ThoList.flatmap electromagnetic_currents_2 [C1;C2] @ List.flatten (Product.list2 electromagnetic_sfermion_currents [1;2;3] [M1;M2]) @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_sfermion_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ List.flatten (Product.list2 charged_slepton_currents [1;2;3] [M1;M2]) @ List.flatten (Product.list2 charged_quark_currents [1;2;3] [1;2;3]) @ List.flatten (Product.list2 charged_squark_currents [1;2;3] [1;2;3]) @ ThoList.flatmap yukawa_higgs_quark [(1,3);(2,3);(3,3);(3,1);(3,2)] @ yukawa_higgs 3 @ yukawa_n @ ThoList.flatmap yukawa_c [C1;C2] @ ThoList.flatmap yukawa_cq [C1;C2] @ List.flatten (Product.list2 charged_chargino_currents [N1;N2;N3;N4] [C1;C2]) @ triple_gauge @ ThoList.flatmap neutral_Z_1 [(N1,N2);(N1,N3);(N1,N4);(N2,N3);(N2,N4); (N3,N4)] @ ThoList.flatmap neutral_Z_2 [N1;N2;N3;N4] @ neutral_A @ Product.list2 charged_Z [C1;C2] [C1;C2] @ gauge_higgs @ higgs @ yukawa_higgs_2 @ List.flatten (Product.list2 higgs_charg_neutr [N1;N2;N3;N4] [C1;C2]) @ higgs_neutr @ higgs_sneutrino @ higgs_sfermion @ higgs_squark @ yukawa_v @ ThoList.flatmap col_currents [1;2;3] @ List.flatten (Product.list2 col_sfermion_currents [1;2;3] [M1;M2])) else (ThoList.flatmap electromagnetic_currents_3 [1;2;3] @ ThoList.flatmap electromagnetic_currents_2 [C1;C2] @ List.flatten (Product.list2 electromagnetic_sfermion_currents [1;2;3] [M1;M2]) @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_sfermion_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ List.flatten (Product.list2 charged_slepton_currents [1;2;3] [M1;M2]) @ charged_quark_currents 1 1 @ charged_quark_currents 2 2 @ charged_quark_currents 3 3 @ charged_squark_currents 1 1 @ charged_squark_currents 2 2 @ charged_squark_currents 3 3 @ ThoList.flatmap yukawa_higgs_quark [(3,3)] @ yukawa_higgs 3 @ yukawa_n @ ThoList.flatmap yukawa_c [C1;C2] @ ThoList.flatmap yukawa_cq [C1;C2] @ List.flatten (Product.list2 charged_chargino_currents [N1;N2;N3;N4] [C1;C2]) @ triple_gauge @ ThoList.flatmap neutral_Z_1 [(N1,N2);(N1,N3);(N1,N4);(N2,N3);(N2,N4); (N3,N4)] @ ThoList.flatmap neutral_Z_2 [N1;N2;N3;N4] @ neutral_A @ Product.list2 charged_Z [C1;C2] [C1;C2] @ gauge_higgs @ higgs @ yukawa_higgs_2 @ List.flatten (Product.list2 higgs_charg_neutr [N1;N2;N3;N4] [C1;C2]) @ higgs_neutr @ higgs_sneutrino @ higgs_sfermion @ higgs_squark @ yukawa_v @ ThoList.flatmap col_currents [1;2;3] @ List.flatten (Product.list2 col_sfermion_currents [1;2;3] [M1;M2])) let vertices3' = if Flags.gravitino then (vertices3'' @ triple_gravitino) else vertices3'' let vertices3 = if Flags.include_goldstone then (vertices3' @ yukawa_goldstone 3 @ gauge_higgs_gold @ higgs_gold @ yukawa_goldstone_2 @ (if Flags.ckm_present then List.flatten (Product.list2 yukawa_goldstone_quark [1;2;3] [1;2;3]) @ List.flatten (Product.list2 goldstone_charg_neutr [N1;N2;N3;N4] [C1;C2]) else yukawa_goldstone_quark 1 1 @ yukawa_goldstone_quark 2 2 @ yukawa_goldstone_quark 3 3) @ goldstone_neutr @ goldstone_sfermion @ goldstone_squark) else vertices3' let vertices4''' = (quartic_gauge @ higgs4 @ gauge_higgs4 @ ThoList.flatmap gauge_sfermion4 [1;2;3] @ gauge_squark4 @ gluon_w_squark @ List.flatten (Product.list2 gluon2_squark2 [1;2;3] [M1;M2]) @ ThoList.flatmap gluon_gauge_squark [1;2;3]) let vertices4'' = if Flags.gravitino then (vertices4''' @ quartic_gravitino) else vertices4''' let vertices4' = if Flags.include_four then (vertices4'' @ ThoList.flatmap higgs_sfermion4 [1;2;3] @ ThoList.flatmap higgs_sneutrino4 [1;2;3] @ List.flatten (Product.list2 higgs_squark4 [1;2;3] [1;2;3]) @ sneutrino4 @ List.flatten (Product.list2 sneu2_slep2_1 [1;2;3] [1;2;3]) @ ThoList.flatmap sneu2_slep2_2 [(1,2);(1,3);(2,3);(2,1);(3,1);(3,2)] @ ThoList.flatmap slepton4_1gen [1;2;3] @ ThoList.flatmap slepton4_2gen [(1,2);(1,3);(2,3)] @ List.flatten (Product.list2 sneu2_squark2 [1;2;3] [1;2;3]) @ List.flatten (Product.list2 slepton2_squark2 [1;2;3] [1;2;3]) @ List.flatten (Product.list2 slep_sneu_squark2 [1;2;3] [1;2;3]) @ ThoList.flatmap sup4_1gen [1;2;3] @ ThoList.flatmap sup4_2gen [(1,2);(1,3);(2,3)] @ ThoList.flatmap sdown4_1gen [1;2;3] @ ThoList.flatmap sdown4_2gen [(1,2);(1,3);(2,3)] @ List.flatten (Product.list2 sup2_sdown2 [1;2;3] [1;2;3])) else vertices4'' let vertices4 = if Flags.include_goldstone then (vertices4' @ higgs_gold4 @ gauge_higgs_gold4 @ goldstone4 @ ThoList.flatmap higgs_gold_sneutrino [1;2;3] @ ThoList.flatmap higgs_gold_sfermion [1;2;3] @ List.flatten (Product.list2 higgs_gold_squark [1;2;3] [1;2;3])) else vertices4' let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string s = match s with | "e-" -> L 1 | "e+" -> L (-1) | "mu-" -> L 2 | "mu+" -> L (-2) | "tau-" -> L 3 | "tau+" -> L (-3) | "nue" -> N 1 | "nuebar" -> N (-1) | "numu" -> N 2 | "numubar" -> N (-2) | "nutau" -> N 3 | "nutaubar" -> N (-3) | "se1-" -> Slepton (M1,1) | "se1+" -> Slepton (M1,-1) | "smu1-" -> Slepton (M1,2) | "smu1+" -> Slepton (M1,-2) | "stau1-" -> Slepton (M1,3) | "stau1+" -> Slepton (M1,-3) | "se2-" -> Slepton (M2,1) | "se2+" -> Slepton (M2,-1) | "smu2-" -> Slepton (M2,2) | "smu2+" -> Slepton (M2,-2) | "stau2-" -> Slepton (M2,3) | "stau2+" -> Slepton (M2,-3) | "snue" -> Sneutrino 1 | "snue*" -> Sneutrino (-1) | "snumu" -> Sneutrino 2 | "snumu*" -> Sneutrino (-2) | "snutau" -> Sneutrino 3 | "snutau*" -> Sneutrino (-3) | "u" -> U 1 | "ubar" -> U (-1) | "c" -> U 2 | "cbar" -> U (-2) | "t" -> U 3 | "tbar" -> U (-3) | "d" -> D 1 | "dbar" -> D (-1) | "s" -> D 2 | "sbar" -> D (-2) | "b" -> D 3 | "bbar" -> D (-3) | "A" -> Ga | "Z" | "Z0" -> Z | "W+" -> Wp | "W-" -> Wm | "gl" | "g" -> Gl | "H" -> H_Heavy | "h" -> H_Light | "A0" -> A | "H+" -> Hp | "H-" -> Hm | "phi0" -> Phi0 | "phi+" -> Phip | "phim" -> Phim | "su1" -> Sup (M1,1) | "su1c" -> Sup (M1,-1) | "sc1" -> Sup (M1,2) | "sc1c" -> Sup (M1,-2) | "st1" -> Sup (M1,3) | "st1c" -> Sup (M1,-3) | "su2" -> Sup (M2,1) | "su2c" -> Sup (M2,-1) | "sc2" -> Sup (M2,2) | "sc2c" -> Sup (M2,-2) | "st2" -> Sup (M2,3) | "st2c" -> Sup (M2,-3) | "sgl" | "sg" -> Gluino | "sd1" -> Sdown (M1,1) | "sd1c" -> Sdown (M1,-1) | "ss1" -> Sdown (M1,2) | "ss1c" -> Sdown (M1,-2) | "sb1" -> Sdown (M1,3) | "sb1c" -> Sdown (M1,-3) | "sd2" -> Sdown (M2,1) | "sd2c" -> Sdown (M2,-1) | "ss2" -> Sdown (M2,2) | "ss2c" -> Sdown (M2,-2) | "sb2" -> Sdown (M2,3) | "sb2c" -> Sdown (M2,-3) | "neu1" -> Neutralino N1 | "neu2" -> Neutralino N2 | "neu3" -> Neutralino N3 | "neu4" -> Neutralino N4 | "ch1+" -> Chargino C1 | "ch2+" -> Chargino C2 | "ch1-" -> Chargino C1c | "ch2-" -> Chargino C2c | "GR" -> Grino | _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_of_string" let flavor_to_string = function | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | L _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid lepton" | N _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid neutrino" | U _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid up type quark" | D _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid down type quark" | Gl -> "gl" | Gluino -> "sgl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H_Heavy -> "H" | H_Light -> "h" | A -> "A0" | Hp -> "H+" | Hm -> "H-" | Slepton (M1,1) -> "se1-" | Slepton (M1,-1) -> "se1+" | Slepton (M1,2) -> "smu1-" | Slepton (M1,-2) -> "smu1+" | Slepton (M1,3) -> "stau1-" | Slepton (M1,-3) -> "stau1+" | Slepton (M2,1) -> "se2-" | Slepton (M2,-1) -> "se2+" | Slepton (M2,2) -> "smu2-" | Slepton (M2,-2) -> "smu2+" | Slepton (M2,3) -> "stau2-" | Slepton (M2,-3) -> "stau2+" | Sneutrino 1 -> "snue" | Sneutrino (-1) -> "snue*" | Sneutrino 2 -> "snumu" | Sneutrino (-2) -> "snumu*" | Sneutrino 3 -> "snutau" | Sneutrino (-3) -> "snutau*" | Sup (M1,1) -> "su1" | Sup (M1,-1) -> "su1c" | Sup (M1,2) -> "sc1" | Sup (M1,-2) -> "sc1c" | Sup (M1,3) -> "st1" | Sup (M1,-3) -> "st1c" | Sup (M2,1) -> "su2" | Sup (M2,-1) -> "su2c" | Sup (M2,2) -> "sc2" | Sup (M2,-2) -> "sc2c" | Sup (M2,3) -> "st2" | Sup (M2,-3) -> "st2c" | Sdown (M1,1) -> "sd1" | Sdown (M1,-1) -> "sd1c" | Sdown (M1,2) -> "ss1" | Sdown (M1,-2) -> "ss1c" | Sdown (M1,3) -> "sb1" | Sdown (M1,-3) -> "sb1c" | Sdown (M2,1) -> "sd2" | Sdown (M2,-1) -> "sd2c" | Sdown (M2,2) -> "ss2" | Sdown (M2,-2) -> "ss2c" | Sdown (M2,3) -> "sb2" | Sdown (M2,-3) -> "sb2c" | Neutralino N1 -> "neu1" | Neutralino N2 -> "neu2" | Neutralino N3 -> "neu3" | Neutralino N4 -> "neu4" | Slepton _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid slepton" | Sneutrino _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid sneutrino" | Sup _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid up type squark" | Sdown _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_string: invalid down type squark" | Chargino C1 -> "ch1+" | Chargino C1c -> "ch1-" | Chargino C2 -> "ch2+" | Chargino C2c -> "ch2-" | Grino -> "GR" let flavor_symbol = function | L g when g > 0 -> "l" ^ string_of_int g | L g -> "l" ^ string_of_int (abs g) ^ "b" | N g when g > 0 -> "n" ^ string_of_int g | N g -> "n" ^ string_of_int (abs g) ^ "b" | U g when g > 0 -> "u" ^ string_of_int g | U g -> "u" ^ string_of_int (abs g) ^ "b" | D g when g > 0 -> "d" ^ string_of_int g | D g -> "d" ^ string_of_int (abs g) ^ "b" | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | Slepton (M1,g) when g > 0 -> "sl1" ^ string_of_int g | Slepton (M1,g) -> "sl1c" ^ string_of_int (abs g) | Slepton (M2,g) when g > 0 -> "sl2" ^ string_of_int g | Slepton (M2,g) -> "sl2c" ^ string_of_int (abs g) | Sneutrino g when g > 0 -> "sn" ^ string_of_int g | Sneutrino g -> "snc" ^ string_of_int (abs g) | Sup (M1,g) when g > 0 -> "su1" ^ string_of_int g | Sup (M1,g) -> "su1c" ^ string_of_int (abs g) | Sup (M2,g) when g > 0 -> "su2" ^ string_of_int g | Sup (M2,g) -> "su2c" ^ string_of_int (abs g) | Sdown (M1,g) when g > 0 -> "sd1" ^ string_of_int g | Sdown (M1,g) -> "sd1c" ^ string_of_int (abs g) | Sdown (M2,g) when g > 0 -> "sd2" ^ string_of_int g | Sdown (M2,g) -> "sd2c" ^ string_of_int (abs g) | Neutralino n -> "neu" ^ (string_of_neu n) | Chargino c when (int_of_char c) > 0 -> "cp" ^ string_of_char c | Chargino c -> "cm" ^ string_of_int (abs (int_of_char c)) | Gluino -> "sgl" | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H_Heavy -> "h0h" | H_Light -> "h0l" | A -> "a0" | Hp -> "hp" | Hm -> "hm" | Grino -> "gv" let flavor_to_TeX = function | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | L _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid lepton" | N _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid neutrino" | U _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid up type quark" | D _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid down type quark" | Gl -> "g" | Gluino -> "\\widetilde{g}" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H_Heavy -> "H^0" | H_Light -> "h^0" | A -> "A^0" | Hp -> "H^+" | Hm -> "H^-" | Slepton (M1,1) -> "\\widetilde{e}_1^-" | Slepton (M1,-1) -> "\\widetilde{e}_1^+" | Slepton (M1,2) -> "\\widetilde{\\mu}_1^-" | Slepton (M1,-2) -> "\\widetilde{\\mu}_1^+" | Slepton (M1,3) -> "\\widetilde{\\tau}_1^-" | Slepton (M1,-3) -> "\\widetilde{\\tau}_1^+" | Slepton (M2,1) -> "\\widetilde{e}_2^-" | Slepton (M2,-1) -> "\\widetilde{e}_2^+" | Slepton (M2,2) -> "\\widetilde{\\mu}_2^-" | Slepton (M2,-2) -> "\\widetilde{\\mu}_2^+" | Slepton (M2,3) -> "\\widetilde{\\tau}_2^-" | Slepton (M2,-3) -> "\\widetilde{\\tau}_2^+" | Sneutrino 1 -> "\\widetilde{\\nu}_e" | Sneutrino (-1) -> "\\widetilde{\\nu}_e^*" | Sneutrino 2 -> "\\widetilde{\\nu}_\\mu" | Sneutrino (-2) -> "\\widetilde{\\nu}_\\mu^*" | Sneutrino 3 -> "\\widetilde{\\nu}_\\tau" | Sneutrino (-3) -> "\\widetilde{\\nu}_\\tau^*" | Sup (M1,1) -> "\\widetilde{u}_1" | Sup (M1,-1) -> "\\widetilde{u}_1^*" | Sup (M1,2) -> "\\widetilde{c}_1" | Sup (M1,-2) -> "\\widetilde{c}_1^*" | Sup (M1,3) -> "\\widetilde{t}_1" | Sup (M1,-3) -> "\\widetilde{t}_1^*" | Sup (M2,1) -> "\\widetilde{u}_2" | Sup (M2,-1) -> "\\widetilde{u}_2^*" | Sup (M2,2) -> "\\widetilde{c}_2" | Sup (M2,-2) -> "\\widetilde{c}_2^*" | Sup (M2,3) -> "\\widetilde{t}_2" | Sup (M2,-3) -> "\\widetilde{t}_2^*" | Sdown (M1,1) -> "\\widetilde{d}_1" | Sdown (M1,-1) -> "\\widetilde{d}_1^*" | Sdown (M1,2) -> "\\widetilde{s}_1" | Sdown (M1,-2) -> "\\widetilde{s}_1^*" | Sdown (M1,3) -> "\\widetilde{b}_1" | Sdown (M1,-3) -> "\\widetilde{b}_1^*" | Sdown (M2,1) -> "\\widetilde{d}_2" | Sdown (M2,-1) -> "\\widetilde{d}_2^*" | Sdown (M2,2) -> "\\widetilde{s}_2" | Sdown (M2,-2) -> "\\widetilde{s}_2^*" | Sdown (M2,3) -> "\\widetilde{b}_2" | Sdown (M2,-3) -> "\\widetilde{b}_2^*" | Neutralino N1 -> "\\widetilde{\\chi}^0_1" | Neutralino N2 -> "\\widetilde{\\chi}^0_2" | Neutralino N3 -> "\\widetilde{\\chi}^0_3" | Neutralino N4 -> "\\widetilde{\\chi}^0_4" | Slepton _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid slepton" | Sneutrino _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid sneutrino" | Sup _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid up type squark" | Sdown _ -> invalid_arg "Modellib_MSSM.MSSM.flavor_to_TeX: invalid down type squark" | Chargino C1 -> "\\widetilde{\\chi}_1^+" | Chargino C1c -> "\\widetilde{\\chi}_1^-" | Chargino C2 -> "\\widetilde{\\chi}_2^+" | Chargino C2c -> "\\widetilde{\\chi}_2^-" | Grino -> "\\widetilde{G}" let pdg = function | L g when g > 0 -> 9 + 2*g | L g -> - 9 + 2*g | N g when g > 0 -> 10 + 2*g | N g -> - 10 + 2*g | U g when g > 0 -> 2*g | U g -> 2*g | D g when g > 0 -> - 1 + 2*g | D g -> 1 + 2*g | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | H_Light -> 25 | H_Heavy -> 35 | A -> 36 | Hp -> 37 | Hm -> (-37) | Phip | Phim -> 27 | Phi0 -> 26 | Slepton (M1,g) when g > 0 -> 1000009 + 2*g | Slepton (M1,g) -> - 1000009 + 2*g | Slepton (M2,g) when g > 0 -> 2000009 + 2*g | Slepton (M2,g) -> - 2000009 + 2*g | Sneutrino g when g > 0 -> 1000010 + 2*g | Sneutrino g -> - 1000010 + 2*g | Sup (M1,g) when g > 0 -> 1000000 + 2*g | Sup (M1,g) -> - 1000000 + 2*g | Sup (M2,g) when g > 0 -> 2000000 + 2*g | Sup (M2,g) -> - 2000000 + 2*g | Sdown (M1,g) when g > 0 -> 999999 + 2*g | Sdown (M1,g) -> - 999999 + 2*g | Sdown (M2,g) when g > 0 -> 1999999 + 2*g | Sdown (M2,g) -> - 1999999 + 2*g | Gluino -> 1000021 | Grino -> 1000039 | Chargino C1 -> 1000024 | Chargino C1c -> (-1000024) | Chargino C2 -> 1000037 | Chargino C2c -> (-1000037) | Neutralino N1 -> 1000022 | Neutralino N2 -> 1000023 | Neutralino N3 -> 1000025 | Neutralino N4 -> 1000035 (* We must take care of the pdg numbers for the two different kinds of sfermions in the MSSM. The particle data group in its Monte Carlo particle numbering scheme takes only into account mixtures of the third generation squarks and the stau. For the other sfermions we will use the number of the lefthanded field for the lighter mixed state and the one for the righthanded for the heavier. Below are the official pdg numbers from the Particle Data Group. In order not to produce arrays with some million entries in the Fortran code for the masses and the widths we introduce our private pdg numbering scheme which only extends not too far beyond 42. Our private scheme then has the following pdf numbers (for the sparticles the subscripts $L/R$ and $1/2$ are taken synonymously): \begin{center} \renewcommand{\arraystretch}{1.2} \begin{tabular}{|r|l|l|}\hline $d$ & down-quark & 1 \\\hline $u$ & up-quark & 2 \\\hline $s$ & strange-quark & 3 \\\hline $c$ & charm-quark & 4 \\\hline $b$ & bottom-quark & 5 \\\hline $t$ & top-quark & 6 \\\hline\hline $e^-$ & electron & 11 \\\hline $\nu_e$ & electron-neutrino & 12 \\\hline $\mu^-$ & muon & 13 \\\hline $\nu_\mu$ & muon-neutrino & 14 \\\hline $\tau^-$ & tau & 15 \\\hline $\nu_\tau$ & tau-neutrino & 16 \\\hline\hline $g$ & gluon & (9) 21 \\\hline $\gamma$ & photon & 22 \\\hline $Z^0$ & Z-boson & 23 \\\hline $W^+$ & W-boson & 24 \\\hline\hline $h^0$ & light Higgs boson & 25 \\\hline $H^0$ & heavy Higgs boson & 35 \\\hline $A^0$ & pseudoscalar Higgs & 36 \\\hline $H^+$ & charged Higgs & 37 \\\hline\hline $\widetilde{\psi}_\mu$ & gravitino & 39 \\\hline\hline $\widetilde{d}_L$ & down-squark 1 & 41 \\\hline $\widetilde{u}_L$ & up-squark 1 & 42 \\\hline $\widetilde{s}_L$ & strange-squark 1 & 43 \\\hline $\widetilde{c}_L$ & charm-squark 1 & 44 \\\hline $\widetilde{b}_L$ & bottom-squark 1 & 45 \\\hline $\widetilde{t}_L$ & top-squark 1 & 46 \\\hline $\widetilde{d}_R$ & down-squark 2 & 47 \\\hline $\widetilde{u}_R$ & up-squark 2 & 48 \\\hline $\widetilde{s}_R$ & strange-squark 2 & 49 \\\hline $\widetilde{c}_R$ & charm-squark 2 & 50 \\\hline $\widetilde{b}_R$ & bottom-squark 2 & 51 \\\hline $\widetilde{t}_R$ & top-squark 2 & 52 \\\hline\hline $\widetilde{e}_L$ & selectron 1 & 53 \\\hline $\widetilde{\nu}_{e,L}$ & electron-sneutrino & 54 \\\hline $\widetilde{\mu}_L$ & smuon 1 & 55 \\\hline $\widetilde{\nu}_{\mu,L}$ & muon-sneutrino & 56 \\\hline $\widetilde{\tau}_L$ & stau 1 & 57 \\\hline $\widetilde{\nu}_{\tau,L}$ & tau-sneutrino & 58 \\\hline $\widetilde{e}_R$ & selectron 2 & 59 \\\hline $\widetilde{\mu}_R$ & smuon 2 & 61 \\\hline $\widetilde{\tau}_R$ & stau 2 & 63 \\\hline\hline $\widetilde{g}$ & gluino & 64 \\\hline $\widetilde{\chi}^0_1$ & neutralino 1 & 65 \\\hline $\widetilde{\chi}^0_2$ & neutralino 2 & 66 \\\hline $\widetilde{\chi}^0_3$ & neutralino 3 & 67 \\\hline $\widetilde{\chi}^0_4$ & neutralino 4 & 68 \\\hline $\widetilde{\chi}^+_1$ & chargino 1 & 69 \\\hline $\widetilde{\chi}^+_2$ & chargino 2 & 70 \\\hline\hline \end{tabular} \end{center} *) let pdg_mw = function | L g when g > 0 -> 9 + 2*g | L g -> - 9 + 2*g | N g when g > 0 -> 10 + 2*g | N g -> - 10 + 2*g | U g when g > 0 -> 2*g | U g -> 2*g | D g when g > 0 -> - 1 + 2*g | D g -> 1 + 2*g | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | H_Light -> 25 | H_Heavy -> 35 | A -> 36 | Hp -> 37 | Hm -> (-37) | Phip | Phim -> 27 | Phi0 -> 26 | Sup (M1,g) when g > 0 -> 40 + 2*g | Sup (M1,g) -> - 40 + 2*g | Sup (M2,g) when g > 0 -> 46 + 2*g | Sup (M2,g) -> - 46 + 2*g | Sdown (M1,g) when g > 0 -> 39 + 2*g | Sdown (M1,g) -> - 39 + 2*g | Sdown (M2,g) when g > 0 -> 45 + 2*g | Sdown (M2,g) -> - 45 + 2*g | Slepton (M1,g) when g > 0 -> 51 + 2*g | Slepton (M1,g) -> - 51 + 2*g | Slepton (M2,g) when g > 0 -> 57 + 2*g | Slepton (M2,g) -> - 57 + 2*g | Sneutrino g when g > 0 -> 52 + 2*g | Sneutrino g -> - 52 + 2*g | Grino -> 39 | Gluino -> 64 | Chargino C1 -> 69 | Chargino C1c -> (-69) | Chargino C2 -> 70 | Chargino C2c -> (-70) | Neutralino N1 -> 65 | Neutralino N2 -> 66 | Neutralino N3 -> 67 | Neutralino N4 -> 68 let mass_symbol f = "mass(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let conj_symbol = function | false, str -> str | true, str -> str ^ "_c" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Eidelta -> "eidelta" | Mu -> "mu" | G_Z -> "gz" | Sin a -> "sin" ^ string_of_angle a | Cos a -> "cos" ^ string_of_angle a | Sin2am2b -> "sin2am2b" | Cos2am2b -> "cos2am2b" | Sinamb -> "sinamb" | Sinapb -> "sinapb" | Cosamb -> "cosamb" | Cosapb -> "cosapb" | Cos4be -> "cos4be" | Sin4be -> "sin4be" | Sin4al -> "sin4al" | Sin2al -> "sin2al" | Cos2al -> "cos2al" | Sin2be -> "sin2be" | Cos2be -> "cos2be" | Tana -> "tana" | Tanb -> "tanb" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_charg -> "qchar" | V_CKM (g1,g2) -> "vckm_" ^ string_of_int g1 ^ string_of_int g2 | M_SF (f,g,m1,m2) -> "mix_" ^ string_of_sff f ^ string_of_int g ^ string_of_sfm m1 ^ string_of_sfm m2 | AL g -> "al_" ^ string_of_int g | AD g -> "ad_" ^ string_of_int g | AU g -> "au_" ^ string_of_int g | A_0 (n1,n2) -> "a0_" ^ string_of_neu n1 ^ string_of_neu n2 | A_P (c1,c2) -> "ap_" ^ string_of_char c1 ^ string_of_char c2 | V_0 (n1,n2) -> "v0_" ^ string_of_neu n1 ^ string_of_neu n2 | V_P (c1,c2) -> "vp_" ^ string_of_char c1 ^ string_of_char c2 | M_N (n1,n2) -> "mn_" ^ string_of_neu n1 ^ string_of_neu n2 | M_U (c1,c2) -> "mu_" ^ string_of_char c1 ^ string_of_char c2 | M_V (c1,c2) -> "mv_" ^ string_of_char c1 ^ string_of_char c2 | L_NC (n,c) -> "lnc_" ^ string_of_neu n ^ string_of_char c | R_NC (n,c) -> "rnc_" ^ string_of_neu n ^ string_of_char c | L_CN (c,n) -> "lcn_" ^ string_of_char c ^ string_of_neu n | R_CN (c,n) -> "rcn_" ^ string_of_char c ^ string_of_neu n | L_NCH (n,c) -> "lnch_" ^ string_of_neu n ^ string_of_char c | R_NCH (n,c) -> "rnch_" ^ string_of_neu n ^ string_of_char c | L_CNG (c,n) -> "lcng_" ^ string_of_char c ^ string_of_neu n | R_CNG (c,n) -> "rcng_" ^ string_of_char c ^ string_of_neu n | S_NNA (n1,n2) -> "snna_" ^ string_of_neu n1 ^ string_of_neu n2 | P_NNA (n1,n2) -> "pnna_" ^ string_of_neu n1 ^ string_of_neu n2 | S_NNG (n1,n2) -> "snng_" ^ string_of_neu n1 ^ string_of_neu n2 | P_NNG (n1,n2) -> "pnng_" ^ string_of_neu n1 ^ string_of_neu n2 | S_NNH1 (n1,n2) -> "snnh1_" ^ string_of_neu n1 ^ string_of_neu n2 | P_NNH1 (n1,n2) -> "pnnh1_" ^ string_of_neu n1 ^ string_of_neu n2 | S_NNH2 (n1,n2) -> "snnh2_" ^ string_of_neu n1 ^ string_of_neu n2 | P_NNH2 (n1,n2) -> "pnnh2_" ^ string_of_neu n1 ^ string_of_neu n2 | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCQ (vc,g1,g2) -> conj_symbol (vc, "gccq_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_PZWW -> "gpzww" | G_PPWW -> "gppww" | G_GH 1 -> "ghaw" | G_GH 2 -> "gh1az" | G_GH 3 -> "gh2az" | G_GH 4 -> "gh1ww" | G_GH 5 -> "gh2ww" | G_GH 6 -> "ghh1w" | G_GH 7 -> "ghh2w" | G_GH 8 -> "gh1zz" | G_GH 9 -> "gh2zz" | G_GH 10 -> "ghhz" | G_GH 11 -> "ghhp" | G_GH _ -> failwith "this G_GH coupling is not available" | G_GLGLH -> "gglglh" | G_GLGLHH -> "gglglhh" | G_GLGLA -> "gglgla" | G_PPH -> "gpph" | G_PPHH -> "gpphh" | G_PPA -> "gppa" | G_GHGo n -> "g_hgh(" ^ string_of_int n ^ ")" | G_GH4 1 -> "gaazz" | G_GH4 2 -> "gh1h1zz" | G_GH4 3 -> "gh2h2zz" | G_GH4 4 -> "ghphmzz" | G_GH4 5 -> "ghphmpp" | G_GH4 6 -> "ghphmpz" | G_GH4 7 -> "ghh1wz" | G_GH4 8 -> "ghh2wz" | G_GH4 9 -> "ghh1wp" | G_GH4 10 -> "ghh2wp" | G_GH4 11 -> "gaaww" | G_GH4 12 -> "gh1h1ww" | G_GH4 13 -> "gh2h2ww" | G_GH4 14 -> "ghhww" | G_GH4 15 -> "ghawz" | G_GH4 16 -> "ghawp" | G_GH4 _ -> failwith "this G_GH4 coupling is not available" | G_CICIH1 (n1,n2) -> "gcicih1_" ^ string_of_neu n1 ^ "_" ^ string_of_neu n2 | G_CICIH2 (n1,n2) -> "gcicih2_" ^ string_of_neu n1 ^ "_" ^ string_of_neu n2 | G_CICIA (n1,n2) -> "gcicia_" ^ string_of_neu n1 ^ "_" ^ string_of_neu n2 | G_CICIG (n1,n2) -> "gcicig_" ^ string_of_neu n1 ^ "_" ^ string_of_neu n2 | G_H3 n -> "gh3_" ^ string_of_int n | G_H4 n -> "gh4_" ^ string_of_int n | G_HGo3 n -> "ghg3_" ^ string_of_int n | G_HGo4 n -> "ghg4_" ^ string_of_int n | G_GG4 n -> "ggg4_" ^ string_of_int n | G_strong -> "gs" | G_SS -> "gs**2" | Gs -> "gs" | I_G_S -> "igs" | G_S_Sqrt -> "gssq" | G_NWC (n,c) -> "gnwc_" ^ string_of_neu n ^ "_" ^ string_of_char c | G_CWN (c,n) -> "gcwn_" ^ string_of_char c ^ "_" ^ string_of_neu n | G_CH1C (c1,c2) -> "gch1c_" ^ string_of_char c1 ^ "_" ^ string_of_char c2 | G_CH2C (c1,c2) -> "gch2c_" ^ string_of_char c1 ^ "_" ^ string_of_char c2 | G_CAC (c1,c2) -> "gcac_" ^ string_of_char c1 ^ "_" ^ string_of_char c2 | G_CGC (c1,c2) -> "gcgc_" ^ string_of_char c1 ^ "_" ^ string_of_char c2 | G_YUK (i,g) -> "g_yuk" ^ string_of_int i ^ "_" ^ string_of_int g | G_NZN (n1,n2) -> "gnzn_" ^ string_of_neu n1 ^ "_" ^ string_of_neu n2 | G_NNA -> "gnna" | G_CZC (c1,c2) -> "gczc_" ^ string_of_char c1 ^ "_" ^ string_of_char c2 | G_YUK_1 (n,m) -> "g_yuk1_" ^ string_of_int n ^ "_" ^ string_of_int m | G_YUK_2 (n,m) -> "g_yuk2_" ^ string_of_int n ^ "_" ^ string_of_int m | G_YUK_3 (n,m) -> "g_yuk3_" ^ string_of_int n ^ "_" ^ string_of_int m | G_YUK_4 (n,m) -> "g_yuk4_" ^ string_of_int n ^ "_" ^ string_of_int m | G_YUK_C (vc,g,c,sf,m) -> conj_symbol (vc, "g_yuk_ch" ^ string_of_char c ^ "_" ^ string_of_sff sf ^ string_of_sfm m ^ "_" ^ string_of_int g ) | G_YUK_N (vc,g,n,sf,m) -> conj_symbol (vc, "g_yuk_n" ^ string_of_neu n ^ "_" ^ string_of_sff sf ^ string_of_sfm m ^ "_" ^ string_of_int g ) | G_YUK_G (vc,g,sf,m) -> conj_symbol (vc, "g_yuk_g" ^ string_of_sff sf ^ string_of_sfm m ^ "_" ^ string_of_int g) | G_YUK_Q (vc,g1,g2,c,sf,m) -> conj_symbol (vc, "g_yuk_ch" ^ string_of_char c ^ "_" ^ string_of_sff sf ^ string_of_sfm m ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_NHC (n,c) -> "g_nhc_" ^ string_of_neu n ^ "_" ^ string_of_char c | G_CHN (c,n) -> "g_chn_" ^ string_of_neu n ^ "_" ^ string_of_char c | G_NGC (n,c) -> "g_ngc_" ^ string_of_neu n ^ string_of_char c | G_CGN (c,n) -> "g_cgn_" ^ string_of_char c ^ string_of_neu n | SUM_1 -> "sum1" | G_SLSNW (vc,g,m) -> conj_symbol (vc, "gsl" ^ string_of_sfm m ^ "_" ^ string_of_int g ^ "snw") | G_ZSF (f,g,m1,m2) -> "g" ^ string_of_sff f ^ string_of_sfm m1 ^ "z" ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_WWSFSF (f,g,m1,m2) -> "gww" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_WPSLSN (vc,g,m) -> conj_symbol (vc, "gpwsl" ^ string_of_sfm m ^ "sn_" ^ string_of_int g) | G_WZSLSN (vc,g,m) -> conj_symbol (vc, "gwzsl" ^ string_of_sfm m ^ "sn_" ^ string_of_int g) | G_H1SFSF (f,g,m1,m2) -> "gh1" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_H2SFSF (f,g,m1,m2) -> "gh2" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_ASFSF (f,g,m1,m2) -> "ga" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_HSNSL (vc,g,m) -> conj_symbol (vc, "ghsnsl" ^ string_of_sfm m ^ "_" ^ string_of_int g) | G_GoSFSF (f,g,m1,m2) -> "ggo" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_GoSNSL (vc,g,m) -> conj_symbol (vc, "ggosnsl" ^ string_of_sfm m ^ "_" ^ string_of_int g) | G_HSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "ghsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_GSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "ggsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_WPSUSD (vc,m1,m2,n,m) -> conj_symbol (vc, "gpwpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int n ^ "_" ^ string_of_int m) | G_WZSUSD (vc,m1,m2,n,m) -> conj_symbol (vc, "gzwpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int n ^ "_" ^ string_of_int m) | G_SWS (vc,g1,g2,m1,m2) -> conj_symbol (vc, "gs" ^ string_of_sfm m1 ^ "ws" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_GlGlSQSQ -> "gglglsqsq" | G_PPSFSF f -> "gpp" ^ string_of_sff f ^ string_of_sff f | G_ZZSFSF (f,g,m1,m2) -> "gzz" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_ZPSFSF (f,g,m1,m2) -> "gzp" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_GlPSQSQ -> "gglpsqsq" | G_GlZSFSF (f,g,m1,m2) -> "ggl" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g | G_GlWSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "gglwsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_GHGo4 1 -> "gzzg0g0" | G_GHGo4 2 -> "gzzgpgm" | G_GHGo4 3 -> "gppgpgm" | G_GHGo4 4 -> "gzpgpgm" | G_GHGo4 5 -> "gwwgpgm" | G_GHGo4 6 -> "gwwg0g0" | G_GHGo4 7 -> "gwzg0g" | G_GHGo4 8 -> "gwzg0g" | G_GHGo4 9 -> "gwzh1g" | G_GHGo4 10 -> "gwzh2g" | G_GHGo4 11 -> "gwph1g" | G_GHGo4 12 -> "gwph2g" | G_GHGo4 _ -> failwith "Coupling G_GHGo4 is not available" | G_HSF31 (h,g,m1,m2,f1,f2) -> "g_" ^ string_of_higgs h ^ string_of_int g ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sff f1 ^ string_of_sff f2 | G_HSF32 (h,g1,g2,m1,m2,f1,f2) -> "g_" ^ string_of_higgs h ^ string_of_int g1 ^ "_" ^ string_of_int g2 ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sff f1 ^ string_of_sff f2 | G_HSF41 (h,g,m1,m2,f1,f2) -> "g_" ^ string_of_higgs h ^ string_of_int g ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sff f1 ^ string_of_sff f2 | G_HSF42 (h,g1,g2,m1,m2,f1,f2) -> "g_" ^ string_of_higgs h ^ string_of_int g1 ^ "_" ^ string_of_int g2 ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sff f1 ^ string_of_sff f2 | G_H1H1SFSF (f,m1,m2,n) -> "gh1h1" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_H1H2SFSF (f,m1,m2,n) -> "gh1h2" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_H2H2SFSF (f,m1,m2,n) -> "gh2h2" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_HHSFSF (f,m1,m2,n) -> "ghh" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_AASFSF (f,m1,m2,n) -> "gaa" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_HH1SUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "ghh1su" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_HH2SUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "ghh2su" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_HASUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "ghasu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2 ^ "_c") | G_HH1SLSN (vc,m,g) -> conj_symbol (vc, "ghh1sl" ^ string_of_sfm m ^ "sn_" ^ string_of_int g) | G_HH2SLSN (vc,m,g) -> conj_symbol (vc, "ghh2sl" ^ string_of_sfm m ^ "sn_" ^ string_of_int g) | G_HASLSN (vc,m,g) -> conj_symbol (vc, "ghasl" ^ string_of_sfm m ^ "sn_" ^ string_of_int g) | G_AG0SFSF (f,m1,m2,n) -> "gag0" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_HGSFSF (f,m1,m2,n) -> "ghg" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m1 ^ "_" ^ string_of_int n | G_GGSFSF (f,m1,m2,n) -> "ggg" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_G0G0SFSF (f,m1,m2,n) -> "gg0g0" ^ string_of_sff f ^ string_of_sfm m1 ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int n | G_HGSNSL (vc,m,n) -> conj_symbol (vc, "ghgsnsl" ^ string_of_sfm m ^ "_" ^ string_of_int n) | G_H1GSNSL (vc,m,n) -> conj_symbol (vc, "gh1gsnsl" ^ string_of_sfm m ^ "_" ^ string_of_int n) | G_H2GSNSL (vc,m,n) -> conj_symbol (vc, "gh2gsnsl" ^ string_of_sfm m ^ "_" ^ string_of_int n) | G_AGSNSL (vc,m,n) -> conj_symbol (vc, "gagsnsl" ^ string_of_sfm m ^ "_" ^ string_of_int n) | G_GGSNSL (vc,m,n) -> conj_symbol (vc, "gggsnsl" ^ string_of_sfm m ^ "_" ^ string_of_int n) | G_HGSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "gghpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_H1GSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "gh1gpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_H2GSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "gh2gpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_AGSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "gagpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_GGSUSD (vc,m1,m2,g1,g2) -> conj_symbol (vc, "gggpsu" ^ string_of_sfm m1 ^ "sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2) | G_SN4 (g1,g2) -> "gsn4_" ^ string_of_int g1 ^ "_" ^ string_of_int g2 | G_SN2SL2_1 (m1,m2,g1,g2) -> "gsl_" ^ string_of_int g1 ^ "_sl_" ^ string_of_int g1 ^ "_sl" ^ string_of_sfm m1 ^ "_" ^ string_of_int g2 ^ "_sl" ^ string_of_sfm m2 ^ "_" ^ string_of_int g2 | G_SN2SL2_2 (m1,m2,g1,g2) -> "gsl_" ^ string_of_int g1 ^ "_sl_" ^ string_of_int g2 ^ "_sl" ^ string_of_sfm m1 ^ "_" ^ string_of_int g1 ^ "_sl" ^ string_of_sfm m2 ^ "_" ^ string_of_int g2 ^ "_mix" | G_SF4 (f1,f2,m1,m2,m3,m4,g1,g2) -> "gsf" ^ string_of_sff f1 ^ string_of_sff f2 ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sfm m3 ^ string_of_sfm m4 ^ string_of_int g1 ^ string_of_int g2 | G_SF4_3 (f1,f2,m1,m2,m3,m4,g1,g2,g3) -> "gsf" ^ string_of_sff f1 ^ string_of_sff f2 ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sfm m3 ^ string_of_sfm m4 ^ string_of_int g1 ^ string_of_int g2 ^ "_" ^ string_of_int g3 | G_SF4_4 (f1,f2,m1,m2,m3,m4,g1,g2,g3,g4) -> "gsf" ^ string_of_sff f1 ^ string_of_sff f2 ^ string_of_sfm m1 ^ string_of_sfm m2 ^ string_of_sfm m3 ^ string_of_sfm m4 ^ string_of_int g1 ^ "_" ^ string_of_int g2 ^ string_of_int g3 ^ "_" ^ string_of_int g4 | G_SL4 (m1,m2,m3,m4,g) -> "gsl" ^ string_of_sfm m1 ^ "_" ^ "sl" ^ string_of_sfm m2 ^ "_" ^ "sl" ^ string_of_sfm m3 ^ "_" ^ "sl" ^ string_of_sfm m4 ^ "_" ^ string_of_int g | G_SL4_2 (m1,m2,m3,m4,g1,g2) -> "gsl" ^ string_of_sfm m1 ^ "_" ^ "sl" ^ string_of_sfm m2 ^ "_" ^ "sl" ^ string_of_sfm m3 ^ "_" ^ "sl" ^ string_of_sfm m4 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2 | G_SN2SQ2 (f,m1,m2,g1,g2) -> "gsn_" ^ string_of_int g1 ^ "_sn_" ^ string_of_int g1 ^ "_" ^ string_of_sff f ^ string_of_sfm m1 ^ "_" ^ string_of_int g2 ^ "_" ^ string_of_sff f ^ string_of_sfm m2 ^ "_" ^ string_of_int g2 | G_SL2SQ2 (f,m1,m2,m3,m4,g1,g2) -> "gsl" ^ string_of_sfm m1 ^ "_" ^ string_of_int g1 ^ "_sl" ^ string_of_sfm m2 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_sff f ^ string_of_sfm m3 ^ "_" ^ string_of_int g2 ^ "_" ^ string_of_sff f ^ string_of_sfm m4 ^ "_" ^ string_of_int g2 | G_SUSDSNSL (vc,m1,m2,m3,g1,g2,g3) -> conj_symbol (vc, "gsl" ^ string_of_sfm m3 ^ "_" ^ string_of_int g3 ^ "_sn_" ^ string_of_int g3 ^ "_su" ^ string_of_sfm m1 ^ "_" ^ string_of_int g1 ^ "_sd" ^ string_of_sfm m2 ^ "_" ^ string_of_int g2) | G_SU4 (m1,m2,m3,m4,g) -> "gsu" ^ string_of_sfm m1 ^ "_" ^ "_su" ^ string_of_sfm m2 ^ "_" ^ "_su" ^ string_of_sfm m3 ^ "_" ^ "_su" ^ string_of_sfm m4 ^ "_" ^ string_of_int g | G_SU4_2 (m1,m2,m3,m4,g1,g2) -> "gsu" ^ string_of_sfm m1 ^ "_" ^ "_su" ^ string_of_sfm m2 ^ "_" ^ "_su" ^ string_of_sfm m3 ^ "_" ^ "_su" ^ string_of_sfm m4 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2 | G_SD4 (m1,m2,m3,m4,g) -> "gsd" ^ string_of_sfm m1 ^ "_" ^ "_sd" ^ string_of_sfm m2 ^ "_" ^ "_sd" ^ string_of_sfm m3 ^ "_" ^ "_sd" ^ string_of_sfm m4 ^ "_" ^ string_of_int g | G_SD4_2 (m1,m2,m3,m4,g1,g2) -> "gsd" ^ string_of_sfm m1 ^ "_" ^ "_sd" ^ string_of_sfm m2 ^ "_" ^ "_sd" ^ string_of_sfm m3 ^ "_" ^ "_sd" ^ string_of_sfm m4 ^ "_" ^ string_of_int g1 ^ "_" ^ string_of_int g2 | G_SU2SD2 (m1,m2,m3,m4,g1,g2,g3,g4) -> "gsu" ^ string_of_sfm m1 ^ "_" ^ string_of_int g1 ^ "_su" ^ string_of_sfm m2 ^ "_" ^ string_of_int g2 ^ "_sd" ^ string_of_sfm m3 ^ "_" ^ string_of_int g3 ^ "_sd" ^ string_of_sfm m4 ^ "_" ^ string_of_int g4 | M f -> "mass" ^ flavor_symbol f | W f -> "width" ^ flavor_symbol f | G_Grav -> "ggrav" | G_Gr_Ch C1 -> "ggrch1" | G_Gr_Ch C2 -> "ggrch2" | G_Gr_Ch C1c -> "ggrch1c" | G_Gr_Ch C2c -> "ggrch2c" | G_Gr_Z_Neu n -> "ggrzneu" ^ string_of_neu n | G_Gr_A_Neu n -> "ggraneu" ^ string_of_neu n | G_Gr4_Neu n -> "ggr4neu" ^ string_of_neu n | G_Gr4_A_Ch C1 -> "ggr4ach1" | G_Gr4_A_Ch C2 -> "ggr4ach2" | G_Gr4_A_Ch C1c -> "ggr4ach1c" | G_Gr4_A_Ch C2c -> "ggr4ach2c" | G_Gr4_Z_Ch C1 -> "ggr4zch1" | G_Gr4_Z_Ch C2 -> "ggr4zch2" | G_Gr4_Z_Ch C1c -> "ggr4zch1c" | G_Gr4_Z_Ch C2c -> "ggr4zch2c" | G_Grav_N -> "ggravn" | G_GravGl -> "gs * ggrav" | G_Grav_L (g,m) -> "ggravl" ^ string_of_int g ^ string_of_sfm m | G_Grav_Lc (g,m) -> "ggravl" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Grav_U (g,m) -> "ggravu" ^ string_of_int g ^ string_of_sfm m | G_Grav_Uc (g,m) -> "ggravu" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Grav_D (g,m) -> "ggravd" ^ string_of_int g ^ string_of_sfm m | G_Grav_Dc (g,m) -> "ggravd" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr_H_Ch C1 -> "ggrhch1" | G_Gr_H_Ch C2 -> "ggrhch2" | G_Gr_H_Ch C1c -> "ggrhch1c" | G_Gr_H_Ch C2c -> "ggrhch2c" | G_Gr_H1_Neu n -> "ggrh1neu" ^ string_of_neu n | G_Gr_H2_Neu n -> "ggrh2neu" ^ string_of_neu n | G_Gr_H3_Neu n -> "ggrh3neu" ^ string_of_neu n | G_Gr4A_Sl (g,m) -> "ggr4asl" ^ string_of_int g ^ string_of_sfm m | G_Gr4A_Slc (g,m) -> "ggr4asl" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4A_Su (g,m) -> "ggr4asu" ^ string_of_int g ^ string_of_sfm m | G_Gr4A_Suc (g,m) -> "ggr4asu" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4A_Sd (g,m) -> "ggr4asd" ^ string_of_int g ^ string_of_sfm m | G_Gr4A_Sdc (g,m) -> "ggr4asd" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4Z_Sn -> "ggr4zsn" | G_Gr4Z_Snc -> "ggr4zsnc" | G_Gr4Z_Sl (g,m) -> "ggr4zsl" ^ string_of_int g ^ string_of_sfm m | G_Gr4Z_Slc (g,m) -> "ggr4zsl" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4Z_Su (g,m) -> "ggr4zsu" ^ string_of_int g ^ string_of_sfm m | G_Gr4Z_Suc (g,m) -> "ggr4zsu" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4Z_Sd (g,m) -> "ggr4zsd" ^ string_of_int g ^ string_of_sfm m | G_Gr4Z_Sdc (g,m) -> "ggr4zsd" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4W_Sl (g,m) -> "ggr4wsl" ^ string_of_int g ^ string_of_sfm m | G_Gr4W_Slc (g,m) -> "ggr4wsl" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4W_Su (g,m) -> "ggr4wsu" ^ string_of_int g ^ string_of_sfm m | G_Gr4W_Suc (g,m) -> "ggr4wsu" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4W_Sd (g,m) -> "ggr4wsd" ^ string_of_int g ^ string_of_sfm m | G_Gr4W_Sdc (g,m) -> "ggr4wsd" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4Gl_Su (g,m) -> "ggr4glsu" ^ string_of_int g ^ string_of_sfm m | G_Gr4Gl_Suc (g,m) -> "ggr4glsu" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4Gl_Sd (g,m) -> "ggr4glsd" ^ string_of_int g ^ string_of_sfm m | G_Gr4Gl_Sdc (g,m) -> "ggr4glsd" ^ string_of_int g ^ string_of_sfm m ^ "c" | G_Gr4_Z_H1 n -> "ggr4zh1_" ^ string_of_neu n | G_Gr4_Z_H2 n -> "ggr4zh2_" ^ string_of_neu n | G_Gr4_Z_H3 n -> "ggr4zh3_" ^ string_of_neu n | G_Gr4_W_H n -> "ggr4wh_" ^ string_of_neu n | G_Gr4_W_Hc n -> "ggr4whc_" ^ string_of_neu n | G_Gr4_H_A C1 -> "ggr4ha1" | G_Gr4_H_A C2 -> "ggr4ha2" | G_Gr4_H_A C1c -> "ggr4ha1c" | G_Gr4_H_A C2c -> "ggr4ha2c" | G_Gr4_H_Z C1 -> "ggr4hz1" | G_Gr4_H_Z C2 -> "ggr4hz2" | G_Gr4_H_Z C1c -> "ggr4hz1c" | G_Gr4_H_Z C2c -> "ggr4hz2c" | G_Gr4W_Sn -> "ggr4wsn" | G_Gr4W_Snc -> "ggr4wsnc" end (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/modellib_BSM.ml =================================================================== --- trunk/omega/src/modellib_BSM.ml (revision 8415) +++ trunk/omega/src/modellib_BSM.ml (revision 8416) @@ -1,15247 +1,15259 @@ (* modellib_BSM.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from cf. main AUTHORS file WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Littlest Higgs Model} *) module type BSM_flags = sig val u1_gauged : bool val anom_ferm_ass : bool end module BSM_bsm : BSM_flags = struct let u1_gauged = true let anom_ferm_ass = false end module BSM_ungauged : BSM_flags = struct let u1_gauged = false let anom_ferm_ass = false end module BSM_anom : BSM_flags = struct let u1_gauged = false let anom_ferm_ass = true end module Littlest (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme" ; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width" ] + let caveats () = [] let gauge_symbol () = failwith "Modellib_BSM.Littlest.gauge_symbol: internal error" type matter_field = L of int | N of int | U of int | D of int | TopH | TopHb type gauge_boson = Ga | Wp | Wm | Z | Gl | WHp | WHm | ZH | AH type other = Phip | Phim | Phi0 | H | Eta | Psi0 | Psi1 | Psip | Psim | Psipp | Psimm type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.Littlest.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] (* Since [Phi] already belongs to the EW Goldstone bosons we use [Psi] for the TeV scale complex triplet. *) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Heavy Quarks", List.map matter_field [TopH; TopHb]; "Heavy Scalars", List.map other [Psi0; Psi1; Psip; Psim; Psipp; Psimm]; "Gauge Bosons", List.map gauge_boson (if Flags.u1_gauged then [Ga; Z; Wp; Wm; Gl; WHp; WHm; ZH; AH] else [Ga; Z; Wp; Wm; Gl; WHp; WHm; ZH]); "Higgs", List.map other (if Flags.u1_gauged then [H] else [H; Eta]); "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n | TopH -> Spinor | TopHb -> ConjSpinor end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z | WHp | WHm | ZH | AH -> Massive_Vector end | O f -> begin match f with | Phip | Phim | Phi0 | H | Eta | Psi0 | Psi1 | Psip | Psim | Psipp | Psimm -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | M TopH -> Color.SUN 3 | M TopHb -> Color.SUN (-3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n | TopH -> Prop_Spinor | TopHb -> Prop_ConjSpinor end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z | WHp | WHm | ZH | AH -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H | Eta | Psi0 | Psi1 | Psip | Psim | Psipp | Psimm -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) | G WHp | G WHm | G ZH | G AH | M TopH | M TopHb -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) | TopH -> TopHb | TopHb -> TopH end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | WHm -> WHp | WHp -> WHm | ZH -> ZH | AH -> AH end) | O f -> O (begin match f with | Psi0 -> Psi0 | Psi1 -> Psi1 | Psip -> Psim | Psim -> Psip | Psipp -> Psimm | Psimm -> Psipp | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Eta -> Eta end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 | TopH -> 1 | TopHb -> -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm | WHp | WHm | AH | ZH -> 0 end | O f -> begin match f with | Psi0 | Psi1 | Psip | Psim | Psipp | Psimm | Phip | Phim | Phi0 | H | Eta -> 0 end (* This model does NOT have a conserved generation charge even in absence of CKM mixing because of the heavy top admixture. *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 | TopH -> 2//3 | TopHb -> -2//3 end | G f -> begin match f with | Gl | Ga | Z | AH | ZH -> 0//1 | Wp | WHp -> 1//1 | Wm | WHm -> -1//1 end | O f -> begin match f with | H | Phi0 | Eta | Psi1 | Psi0 -> 0//1 | Phip | Psip -> 1//1 | Phim | Psim -> -1//1 | Psipp -> 2//1 | Psimm -> -2//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ | _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 | TopH -> 1//1 | TopHb -> -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | VHeavy | Supp | Supp2 | Sinpsi | Cospsi | Atpsi | Sccs (* Mixing angles of SU(2) *) | Q_lepton | Q_up | Q_down | Q_Z_up | G_CC | G_CCtop | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_NC_heavy | G_NC_h_neutrino | G_NC_h_lepton | G_NC_h_up | G_NC_h_down | G_CC_heavy | G_ZHTHT | G_ZTHT | G_AHTHTH | G_AHTHT | G_AHTT | G_CC_WH | G_CC_W | I_Q_W | I_G_ZWW | I_G_WWW | I_G_AHWW | I_G_ZHWW | I_G_ZWHW | I_G_AHWHWH | I_G_ZHWHWH | I_G_AHWHW | I_Q_H | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_WH4 | G_WHWHWW | G_WHWWW | G_WH3W | G_WWAAH | G_WWAZH | G_WWZZH | G_WWZAH | G_WHWHAAH | G_WHWHAZH | G_WHWHZZH | G_WHWHZAH | G_WWZHAH | G_WHWHZHAH | G_WHWZZ | G_WHWAZ | G_WHWAAH | G_WHWZAH | G_WHWZHZH | G_WHWZHAH | G_WHWAZH | G_WHWZZH | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_PsiWW | G_PsiWHW | G_PsiZZ | G_PsiZHZH | G_PsiZHZ | G_PsiZAH | G_PsiZHAH | G_PsiAHAH | G_PsiZW | G_PsiZWH | G_PsiAHW | G_PsiAHWH | G_PsiZHW | G_PsiZHWH | G_PsippWW | G_PsippWHW | G_PsippWHWH | G_PsiHW | G_PsiHWH | G_Psi0W | G_Psi0WH | G_Psi1W | G_Psi1WH | G_PsiPPW | G_PsiPPWH | G_Psi1HAH | G_Psi01AH | G_AHPsip | G_Psi1HZ | G_Psi1HZH | G_Psi01Z | G_Psi01ZH | G_ZPsip | G_ZPsipp | G_ZHPsipp | G_HHAA | G_HHWHW | G_HHZHZ | G_HHAHZ | G_HHZHAH | G_HPsi0WW | G_HPsi0WHW | G_HPsi0ZZ | G_HPsi0ZHZH | G_HPsi0ZHZ | G_HPsi0AHAH | G_HPsi0ZAH | G_HPsi0ZHAH | G_HPsipWA | G_HPsipWHA | G_HPsipWZ | G_HPsipWHZ | G_HPsipWAH | G_HPsipWHAH | G_HPsipWZH | G_HPsipWHZH | G_HPsippWW | G_HPsippWHWH | G_HPsippWHW | G_Psi00ZH | G_Psi00AH | G_Psi00ZHAH | G_Psi0pWA | G_Psi0pWHA | G_Psi0pWZ | G_Psi0pWHZ | G_Psi0pWAH | G_Psi0pWHAH | G_Psi0pWZH | G_Psi0pWHZH | G_Psi0ppWW | G_Psi0ppWHWH | G_Psi0ppWHW | I_G_Psi0pWA | I_G_Psi0pWHA | I_G_Psi0pWZ | I_G_Psi0pWHZ | I_G_Psi0pWAH | I_G_Psi0pWHAH | I_G_Psi0pWZH | I_G_Psi0pWHZH | I_G_Psi0ppWW | I_G_Psi0ppWHWH | I_G_Psi0ppWHW | G_PsippZZ | G_PsippZHZH | G_PsippAZ | G_PsippAAH | G_PsippZAH | G_PsippWA | G_PsippWHA | G_PsippWZ | G_PsippWHZ | G_PsippWAH | G_PsippWHAH | G_PsippWZH | G_PsippWHZH | G_PsiccZZ | G_PsiccAZ | G_PsiccAAH | G_PsiccZZH | G_PsiccAZH | G_PsiccZAH | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | G_Hthth | G_Htht | G_Ethth | G_Etht | G_Ett | G_HHtt | G_HHthth | G_HHtht | G_Psi0tt | G_Psi0bb | G_Psi0cc | G_Psi0tautau | G_Psi1tt | G_Psi1bb | G_Psi1cc | G_Psi1tautau | G_Psipq3 | G_Psipq2 | G_Psipl3 | G_Psi0tth | G_Psi1tth | G_Psipbth | G_Ebb | G_HGaGa | G_HGaZ | G_EGaGa | G_EGaZ | G_EGlGl | Gs | I_Gs | G2 | G_HWHW | G_HWHWH | G_HAHAH | G_HZHZ | G_HZHAH | G_HAHZ | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)); nc_coupling G_NC_h_neutrino half (Integer 0); nc_coupling G_NC_h_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_h_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_h_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mhm ((m1, h, m2), fbf, c) = ((M m1, O h, M m2), fbf, c) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let hgg ((h, g1, g2), coup, c) = ((O h, G g1, G g2), coup, c) let ghh ((g, h1, h2), coup, c) = ((G g, O h1, O h2), coup, c) let hhgg ((h1, h2, g1, g2), coup, c) = ((O h1, O h2, G g1, G g2), coup, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* The sign of this coupling is just the one of the T3, being -(1/2) for leptons and down quarks, and +(1/2) for neutrinos and up quarks. *) let neutral_heavy_currents n = List.map mgm ([ ((L (-n), ZH, L n), FBF ((-1), Psibar, VL, Psi), G_NC_heavy); ((N (-n), ZH, N n), FBF (1, Psibar, VL, Psi), G_NC_heavy); ((U (-n), ZH, U n), FBF (1, Psibar, VL, Psi), G_NC_heavy); ((D (-n), ZH, D n), FBF ((-1), Psibar, VL, Psi), G_NC_heavy)] @ (if Flags.u1_gauged then [ ((L (-n), AH, L n), FBF (1, Psibar, VA, Psi), G_NC_h_lepton); ((N (-n), AH, N n), FBF (1, Psibar, VA, Psi), G_NC_h_neutrino); ((D (-n), AH, D n), FBF (1, Psibar, VA, Psi), G_NC_h_down)] else [])) let color_currents n = List.map mgm [ ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs); ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs)] let heavy_top_currents = List.map mgm ([ ((TopHb, Ga, TopH), FBF (1, Psibar, V, Psi), Q_up); ((TopHb, Z, TopH), FBF (1, Psibar, V, Psi), Q_Z_up); ((TopHb, Gl, TopH), FBF (1, Psibar, V, Psi), Gs); ((TopHb, Z, U 3), FBF (1, Psibar, VL, Psi), G_ZTHT); ((U (-3), Z, TopH), FBF (1, Psibar, VL, Psi), G_ZTHT); ((TopHb, ZH, U 3), FBF (1, Psibar, VL, Psi), G_ZHTHT); ((U (-3), ZH, TopH), FBF (1, Psibar, VL, Psi), G_ZHTHT); ((U (-3), Wp, D 3), FBF (1, Psibar, VL, Psi), G_CCtop); ((D (-3), Wm, U 3), FBF (1, Psibar, VL, Psi), G_CCtop); ((TopHb, WHp, D 3), FBF (1, Psibar, VL, Psi), G_CC_WH); ((D (-3), WHm, TopH), FBF (1, Psibar, VL, Psi), G_CC_WH); ((TopHb, Wp, D 3), FBF (1, Psibar, VL, Psi), G_CC_W); ((D (-3), Wm, TopH), FBF (1, Psibar, VL, Psi), G_CC_W)] @ (if Flags.u1_gauged then [ ((U (-3), AH, U 3), FBF (1, Psibar, VA, Psi), G_AHTT); ((TopHb, AH, TopH), FBF (1, Psibar, VA, Psi), G_AHTHTH); ((TopHb, AH, U 3), FBF (1, Psibar, VR, Psi), G_AHTHT); ((U (-3), AH, TopH), FBF (1, Psibar, VR, Psi), G_AHTHT)] else [])) (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_heavy_currents n = List.map mgm ([ ((L (-n), WHm, N n), FBF (1, Psibar, VL, Psi), G_CC_heavy); ((N (-n), WHp, L n), FBF (1, Psibar, VL, Psi), G_CC_heavy); ((D (-n), WHm, U n), FBF (1, Psibar, VL, Psi), G_CC_heavy); ((U (-n), WHp, D n), FBF (1, Psibar, VL, Psi), G_CC_heavy)] @ (if Flags.u1_gauged then [ ((U (-n), AH, U n), FBF (1, Psibar, VA, Psi), G_NC_h_up)] else [])) (* We specialize the third generation since there is an additional shift coming from the admixture of the heavy top quark. The universal shift, coming from the mixing in the non-Abelian gauge boson sector is unobservable. (Redefinition of coupling constants by measured ones. *) let yukawa = List.map mhm [ ((U (-3), H, U 3), FBF (1, Psibar, S, Psi), G_Htt); ((D (-3), H, D 3), FBF (1, Psibar, S, Psi), G_Hbb); ((U (-2), H, U 2), FBF (1, Psibar, S, Psi), G_Hcc); ((L (-3), H, L 3), FBF (1, Psibar, S, Psi), G_Htautau)] let yukawa_add' = List.map mhm [ ((TopHb, H, TopH), FBF (1, Psibar, S, Psi), G_Hthth); ((TopHb, H, U 3), FBF (1, Psibar, SLR, Psi), G_Htht); ((U (-3), H, TopH), FBF (1, Psibar, SLR, Psi), G_Htht); ((U (-3), Psi0, U 3), FBF (1, Psibar, S, Psi), G_Psi0tt); ((D (-3), Psi0, D 3), FBF (1, Psibar, S, Psi), G_Psi0bb); ((U (-2), Psi0, U 2), FBF (1, Psibar, S, Psi), G_Psi0cc); ((L (-3), Psi0, L 3), FBF (1, Psibar, S, Psi), G_Psi0tautau); ((U (-3), Psi1, U 3), FBF (1, Psibar, P, Psi), G_Psi1tt); ((D (-3), Psi1, D 3), FBF (1, Psibar, P, Psi), G_Psi1bb); ((U (-2), Psi1, U 2), FBF (1, Psibar, P, Psi), G_Psi1cc); ((L (-3), Psi1, L 3), FBF (1, Psibar, P, Psi), G_Psi1tautau); ((U (-3), Psip, D 3), FBF (1, Psibar, SLR, Psi), G_Psipq3); ((U (-2), Psip, D 2), FBF (1, Psibar, SLR, Psi), G_Psipq2); ((N (-3), Psip, L 3), FBF (1, Psibar, SR, Psi), G_Psipl3); ((D (-3), Psim, U 3), FBF (1, Psibar, SLR, Psi), G_Psipq3); ((D (-2), Psim, U 2), FBF (1, Psibar, SLR, Psi), G_Psipq2); ((L (-3), Psim, N 3), FBF (1, Psibar, SL, Psi), G_Psipl3); ((TopHb, Psi0, U 3), FBF (1, Psibar, SL, Psi), G_Psi0tth); ((U (-3), Psi0, TopH), FBF (1, Psibar, SR, Psi), G_Psi0tth); ((TopHb, Psi1, U 3), FBF (1, Psibar, SL, Psi), G_Psi1tth); ((U (-3), Psi1, TopH), FBF (1, Psibar, SR, Psi), G_Psi1tth); ((TopHb, Psip, D 3), FBF (1, Psibar, SL, Psi), G_Psipbth); ((D (-3), Psim, TopH), FBF (1, Psibar, SR, Psi), G_Psipbth)] let yukawa_add = if Flags.u1_gauged then yukawa_add' else yukawa_add' @ List.map mhm [ ((U (-3), Eta, U 3), FBF (1, Psibar, P, Psi), G_Ett); ((TopHb, Eta, U 3), FBF (1, Psibar, SLR, Psi), G_Etht); ((D (-3), Eta, D 3), FBF (1, Psibar, P, Psi), G_Ebb); ((U (-3), Eta, TopH), FBF (1, Psibar, SLR, Psi), G_Etht)] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs) ] let heavy_triple_gauge = List.map tgc ([ ((Ga, WHm, WHp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, WHm, WHp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((ZH, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZHWW); ((Z, WHm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWHW); ((Z, Wm, WHp), Gauge_Gauge_Gauge (-1), I_G_ZWHW); ((ZH, WHm, Wp), Gauge_Gauge_Gauge 1, I_G_WWW); ((ZH, Wm, WHp), Gauge_Gauge_Gauge (-1), I_G_WWW); ((ZH, WHm, WHp), Gauge_Gauge_Gauge (-1), I_G_ZHWHWH)] @ (if Flags.u1_gauged then [ ((AH, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_AHWW); ((AH, WHm, Wp), Gauge_Gauge_Gauge 1, I_G_AHWHW); ((AH, Wm, WHp), Gauge_Gauge_Gauge (-1), I_G_AHWHW); ((AH, WHm, WHp), Gauge_Gauge_Gauge 1, I_G_AHWHWH)] else [])) let triple_gauge = standard_triple_gauge @ heavy_triple_gauge let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] let heavy_quartic_gauge = List.map qgc ([ (WHm, Wp, WHm, Wp), gauge4, G_WWWW; (Wm, WHp, Wm, WHp), gauge4, G_WWWW; (WHm, WHp, WHm, WHp), gauge4, G_WH4; (Wm, Wp, WHm, WHp), gauge4, G_WHWHWW; (Wm, Wp, Wm, WHp), gauge4, G_WHWWW; (Wm, Wp, WHm, Wp), gauge4, G_WHWWW; (WHm, WHp, Wm, WHp), gauge4, G_WH3W; (WHm, WHp, WHm, Wp), gauge4, G_WH3W; (WHm, Z, WHp, Z), minus_gauge4, G_ZZWW; (WHm, Z, WHp, Ga), minus_gauge4, G_AZWW; (WHm, Ga, WHp, ZH), minus_gauge4, G_AAWW; (WHm, Z, WHp, ZH), minus_gauge4, G_ZZWW; (Wm, ZH, Wp, ZH), minus_gauge4, G_WWWW; (Wm, Ga, Wp, ZH), minus_gauge4, G_WWAZH; (Wm, Z, Wp, ZH), minus_gauge4, G_WWZZH; (WHm, Ga, WHp, ZH), minus_gauge4, G_WHWHAZH; (WHm, Z, WHp, ZH), minus_gauge4, G_WHWHZZH; (WHm, ZH, WHp, ZH), minus_gauge4, G_WH4; (WHm, Z, Wp, Z), minus_gauge4, G_WHWZZ; (Wm, Z, WHp, Z), minus_gauge4, G_WHWZZ; (WHm, Ga, Wp, Z), minus_gauge4, G_WHWAZ; (Wm, Ga, WHp, Z), minus_gauge4, G_WHWAZ; (WHm, ZH, Wp, ZH), minus_gauge4, G_WHWZHZH; (Wm, ZH, WHp, ZH), minus_gauge4, G_WHWZHZH; (WHm, Ga, Wp, ZH), minus_gauge4, G_WHWAZH; (Wm, Ga, WHp, ZH), minus_gauge4, G_WHWAZH; (WHm, Z, Wp, ZH), minus_gauge4, G_WHWZZH; (Wm, Z, WHp, ZH), minus_gauge4, G_WHWZZH] @ (if Flags.u1_gauged then [ (Wm, Ga, Wp, AH), minus_gauge4, G_WWAAH; (Wm, Z, Wp, AH), minus_gauge4, G_WWZAH; (WHm, Ga, WHp, AH), minus_gauge4, G_WHWHAAH; (WHm, Z, WHp, AH), minus_gauge4, G_WHWHZAH; (Wm, ZH, Wp, AH), minus_gauge4, G_WWZHAH; (WHm, ZH, WHp, AH), minus_gauge4, G_WHWHZHAH; (WHm, Ga, Wp, AH), minus_gauge4, G_WHWAAH; (Wm, Ga, WHp, AH), minus_gauge4, G_WHWAAH; (WHm, Z, Wp, AH), minus_gauge4, G_WHWZAH; (Wm, Z, WHp, AH), minus_gauge4, G_WHWZAH; (WHm, ZH, Wp, AH), minus_gauge4, G_WHWZHAH; (Wm, ZH, WHp, AH), minus_gauge4, G_WHWZHAH] else [])) let quartic_gauge = standard_quartic_gauge @ heavy_quartic_gauge let standard_gauge_higgs' = List.map hgg [ ((H, Wp, Wm), Scalar_Vector_Vector 1, G_HWW); ((H, Z, Z), Scalar_Vector_Vector 1, G_HZZ) ] let heavy_gauge_higgs = List.map hgg ([ ((H, Wp, WHm), Scalar_Vector_Vector 1, G_HWHW); ((H, WHp, Wm), Scalar_Vector_Vector 1, G_HWHW); ((H, WHp, WHm), Scalar_Vector_Vector 1, G_HWHWH); ((H, ZH, ZH), Scalar_Vector_Vector 1, G_HWHWH); ((H, ZH, Z), Scalar_Vector_Vector 1, G_HZHZ); ((H, Wp, Wm), Scalar_Vector_Vector 1, G_HZHAH)] @ (if Flags.u1_gauged then [((H, AH, AH), Scalar_Vector_Vector 1, G_HAHAH); ((H, Z, AH), Scalar_Vector_Vector 1, G_HAHZ)] else [])) let triplet_gauge_higgs = List.map hgg ([ ((Psi0, Wp, Wm), Scalar_Vector_Vector 1, G_PsiWW); ((Psi0, WHp, WHm), Scalar_Vector_Vector (-1), G_PsiWW); ((Psi0, WHp, Wm), Scalar_Vector_Vector 1, G_PsiWHW); ((Psi0, WHm, Wp), Scalar_Vector_Vector 1, G_PsiWHW); ((Psi0, Z, Z), Scalar_Vector_Vector 1, G_PsiZZ); ((Psi0, ZH, ZH), Scalar_Vector_Vector 1, G_PsiZHZH); ((Psi0, ZH, Z), Scalar_Vector_Vector 1, G_PsiZHZ); ((Psim, Wp, Z), Scalar_Vector_Vector 1, G_PsiZW); ((Psip, Wm, Z), Scalar_Vector_Vector 1, G_PsiZW); ((Psim, WHp, Z), Scalar_Vector_Vector 1, G_PsiZWH); ((Psip, WHm, Z), Scalar_Vector_Vector 1, G_PsiZWH); ((Psim, Wp, ZH), Scalar_Vector_Vector 1, G_PsiZHW); ((Psip, Wm, ZH), Scalar_Vector_Vector 1, G_PsiZHW); ((Psim, WHp, ZH), Scalar_Vector_Vector 1, G_PsiZHWH); ((Psip, WHm, ZH), Scalar_Vector_Vector 1, G_PsiZHWH); ((Psimm, Wp, Wp), Scalar_Vector_Vector 1, G_PsippWW); ((Psipp, Wm, Wm), Scalar_Vector_Vector 1, G_PsippWW); ((Psimm, WHp, Wp), Scalar_Vector_Vector 1, G_PsippWHW); ((Psipp, WHm, Wm), Scalar_Vector_Vector 1, G_PsippWHW); ((Psimm, WHp, WHp), Scalar_Vector_Vector 1, G_PsippWHWH); ((Psipp, WHm, WHm), Scalar_Vector_Vector 1, G_PsippWHWH)] @ (if Flags.u1_gauged then [((Psi0, AH, Z), Scalar_Vector_Vector 1, G_PsiZAH); ((Psi0, AH, ZH), Scalar_Vector_Vector 1, G_PsiZHAH); ((Psi0, AH, AH), Scalar_Vector_Vector 1, G_PsiAHAH); ((Psim, Wp, AH), Scalar_Vector_Vector 1, G_PsiAHW); ((Psip, Wm, AH), Scalar_Vector_Vector 1, G_PsiAHW); ((Psim, WHp, AH), Scalar_Vector_Vector 1, G_PsiAHWH); ((Psip, WHm, AH), Scalar_Vector_Vector 1, G_PsiAHWH)] else [])) let triplet_gauge2_higgs = List.map ghh ([ ((Wp, H, Psim), Vector_Scalar_Scalar 1, G_PsiHW); ((Wm, H, Psip), Vector_Scalar_Scalar 1, G_PsiHW); ((WHp, H, Psim), Vector_Scalar_Scalar 1, G_PsiHWH); ((WHm, H, Psip), Vector_Scalar_Scalar 1, G_PsiHWH); ((Wp, Psi0, Psim), Vector_Scalar_Scalar 1, G_Psi0W); ((Wm, Psi0, Psip), Vector_Scalar_Scalar 1, G_Psi0W); ((WHp, Psi0, Psim), Vector_Scalar_Scalar 1, G_Psi0WH); ((WHm, Psi0, Psip), Vector_Scalar_Scalar 1, G_Psi0WH); ((Wp, Psi1, Psim), Vector_Scalar_Scalar 1, G_Psi1W); ((Wm, Psi1, Psip), Vector_Scalar_Scalar (-1), G_Psi1W); ((WHp, Psi1, Psim), Vector_Scalar_Scalar 1, G_Psi1WH); ((WHm, Psi1, Psip), Vector_Scalar_Scalar (-1), G_Psi1WH); ((Wp, Psip, Psimm), Vector_Scalar_Scalar 1, G_PsiPPW); ((Wm, Psim, Psipp), Vector_Scalar_Scalar 1, G_PsiPPW); ((WHp, Psip, Psimm), Vector_Scalar_Scalar 1, G_PsiPPWH); ((WHm, Psim, Psipp), Vector_Scalar_Scalar 1, G_PsiPPWH); ((Ga, Psip, Psim), Vector_Scalar_Scalar 1, Q_lepton); ((Ga, Psipp, Psimm), Vector_Scalar_Scalar 2, Q_lepton); ((Z, H, Psi1), Vector_Scalar_Scalar 1, G_Psi1HZ); ((ZH, H, Psi1), Vector_Scalar_Scalar 1, G_Psi1HZH); ((Z, Psi0, Psi1), Vector_Scalar_Scalar 1, G_Psi01Z); ((ZH, Psi0, Psi1), Vector_Scalar_Scalar 1, G_Psi01ZH); ((Z, Psip, Psim), Vector_Scalar_Scalar 1, G_ZPsip); ((Z, Psipp, Psimm), Vector_Scalar_Scalar 2, G_ZPsipp); ((ZH, Psipp, Psimm), Vector_Scalar_Scalar 2, G_ZHPsipp)] @ (if Flags.u1_gauged then [((AH, H, Psi1), Vector_Scalar_Scalar 1, G_Psi1HAH); ((AH, Psi0, Psi1), Vector_Scalar_Scalar 1, G_Psi01AH); ((AH, Psip, Psim), Vector_Scalar_Scalar 1, G_AHPsip); ((AH, Psipp, Psimm), Vector_Scalar_Scalar 2, G_AHPsip)] else [])) let standard_gauge_higgs = standard_gauge_higgs' @ heavy_gauge_higgs @ triplet_gauge_higgs @ triplet_gauge2_higgs let standard_gauge_higgs4 = List.map hhgg [ (H, H, Wp, Wm), Scalar2_Vector2 1, G_HHWW; (H, H, Z, Z), Scalar2_Vector2 1, G_HHZZ ] let littlest_gauge_higgs4 = List.map hhgg ([ (H, H, WHp, WHm), Scalar2_Vector2 (-1), G_HHWW; (H, H, ZH, ZH), Scalar2_Vector2 (-1), G_HHWW; (H, H, Wp, WHm), Scalar2_Vector2 1, G_HHWHW; (H, H, WHp, Wm), Scalar2_Vector2 1, G_HHWHW; (H, H, ZH, Z), Scalar2_Vector2 (-1), G_HHZHZ; (H, Psi0, Wp, Wm), Scalar2_Vector2 1, G_HPsi0WW; (H, Psi0, WHp, WHm), Scalar2_Vector2 (-1), G_HPsi0WW; (H, Psi0, WHp, Wm), Scalar2_Vector2 1, G_HPsi0WHW; (H, Psi0, Wp, WHm), Scalar2_Vector2 1, G_HPsi0WHW; (H, Psi0, Z, Z), Scalar2_Vector2 1, G_HPsi0ZZ; (H, Psi0, ZH, ZH), Scalar2_Vector2 1, G_HPsi0ZHZH; (H, Psi0, ZH, Z), Scalar2_Vector2 1, G_HPsi0ZHZ; (H, Psim, Wp, Ga), Scalar2_Vector2 1, G_HPsipWA; (H, Psip, Wm, Ga), Scalar2_Vector2 1, G_HPsipWA; (H, Psim, WHp, Ga), Scalar2_Vector2 1, G_HPsipWHA; (H, Psip, WHm, Ga), Scalar2_Vector2 1, G_HPsipWHA; (H, Psim, Wp, Z), Scalar2_Vector2 1, G_HPsipWZ; (H, Psip, Wm, Z), Scalar2_Vector2 1, G_HPsipWZ; (H, Psim, WHp, Z), Scalar2_Vector2 1, G_HPsipWHZ; (H, Psip, WHm, Z), Scalar2_Vector2 1, G_HPsipWHZ; (H, Psim, Wp, ZH), Scalar2_Vector2 1, G_HPsipWZH; (H, Psip, Wm, ZH), Scalar2_Vector2 1, G_HPsipWZH; (H, Psim, WHp, ZH), Scalar2_Vector2 1, G_HPsipWHZH; (H, Psip, WHm, ZH), Scalar2_Vector2 1, G_HPsipWHZH; (H, Psimm, Wp, Wp), Scalar2_Vector2 1, G_HPsippWW; (H, Psipp, Wm, Wm), Scalar2_Vector2 1, G_HPsippWW; (H, Psimm, WHp, WHp), Scalar2_Vector2 1, G_HPsippWHWH; (H, Psipp, WHm, WHm), Scalar2_Vector2 1, G_HPsippWHWH; (H, Psimm, WHp, Wp), Scalar2_Vector2 1, G_HPsippWHW; (H, Psipp, WHm, Wm), Scalar2_Vector2 1, G_HPsippWHW; (Psi0, Psi0, Wp, Wm), Scalar2_Vector2 2, G_HHWW; (Psi0, Psi0, WHp, WHm), Scalar2_Vector2 (-2), G_HHWW; (Psi0, Psi0, Z, Z), Scalar2_Vector2 4, G_HHZZ; (Psi0, Psi0, ZH, ZH), Scalar2_Vector2 1, G_Psi00ZH; (Psi0, Psi0, WHp, Wm), Scalar2_Vector2 2, G_HHWHW; (Psi0, Psi0, Wp, WHm), Scalar2_Vector2 2, G_HHWHW; (Psi0, Psi0, Z, ZH), Scalar2_Vector2 4, G_HHZHZ; (Psi0, Psim, Wp, Ga), Scalar2_Vector2 1, G_Psi0pWA; (Psi0, Psip, Wm, Ga), Scalar2_Vector2 1, G_Psi0pWA; (Psi0, Psim, WHp, Ga), Scalar2_Vector2 1, G_Psi0pWHA; (Psi0, Psip, WHm, Ga), Scalar2_Vector2 1, G_Psi0pWHA; (Psi0, Psim, Wp, Z), Scalar2_Vector2 1, G_Psi0pWZ; (Psi0, Psip, Wm, Z), Scalar2_Vector2 1, G_Psi0pWZ; (Psi0, Psim, WHp, Z), Scalar2_Vector2 1, G_Psi0pWHZ; (Psi0, Psip, WHm, Z), Scalar2_Vector2 1, G_Psi0pWHZ; (Psi0, Psim, Wp, ZH), Scalar2_Vector2 1, G_Psi0pWZH; (Psi0, Psip, Wm, ZH), Scalar2_Vector2 1, G_Psi0pWZH; (Psi0, Psim, WHp, ZH), Scalar2_Vector2 1, G_Psi0pWHZH; (Psi0, Psip, WHm, ZH), Scalar2_Vector2 1, G_Psi0pWHZH; (Psi0, Psimm, Wp, Wp), Scalar2_Vector2 1, G_Psi0ppWW; (Psi0, Psipp, Wm, Wm), Scalar2_Vector2 1, G_Psi0ppWW; (Psi0, Psimm, WHp, WHp), Scalar2_Vector2 1, G_Psi0ppWHWH; (Psi0, Psipp, WHm, WHm), Scalar2_Vector2 1, G_Psi0ppWHWH; (Psi0, Psimm, WHp, Wp), Scalar2_Vector2 1, G_Psi0ppWHW; (Psi0, Psipp, WHm, Wm), Scalar2_Vector2 1, G_Psi0ppWHW; (Psi1, Psi1, Wp, Wm), Scalar2_Vector2 2, G_HHWW; (Psi1, Psi1, WHp, WHm), Scalar2_Vector2 (-2), G_HHWW; (Psi1, Psi1, Z, Z), Scalar2_Vector2 4, G_HHZZ; (Psi1, Psi1, ZH, ZH), Scalar2_Vector2 1, G_Psi00ZH; (Psi1, Psi1, WHp, Wm), Scalar2_Vector2 2, G_HHWHW; (Psi1, Psi1, Wp, WHm), Scalar2_Vector2 2, G_HHWHW; (Psi1, Psi1, Z, ZH), Scalar2_Vector2 4, G_HHZHZ; (Psi1, Psim, Wp, Ga), Scalar2_Vector2 1, I_G_Psi0pWA; (Psi1, Psip, Wm, Ga), Scalar2_Vector2 (-1), I_G_Psi0pWA; (Psi1, Psim, WHp, Ga), Scalar2_Vector2 1, I_G_Psi0pWHA; (Psi1, Psip, WHm, Ga), Scalar2_Vector2 (-1), I_G_Psi0pWHA; (Psi1, Psim, Wp, Z), Scalar2_Vector2 1, I_G_Psi0pWZ; (Psi1, Psip, Wm, Z), Scalar2_Vector2 (-1), I_G_Psi0pWZ; (Psi1, Psim, WHp, Z), Scalar2_Vector2 1, I_G_Psi0pWHZ; (Psi1, Psip, WHm, Z), Scalar2_Vector2 (-1), I_G_Psi0pWHZ; (Psi1, Psim, Wp, ZH), Scalar2_Vector2 1, I_G_Psi0pWZH; (Psi1, Psip, Wm, ZH), Scalar2_Vector2 (-1), I_G_Psi0pWZH; (Psi1, Psim, WHp, ZH), Scalar2_Vector2 1, I_G_Psi0pWHZH; (Psi1, Psip, WHm, ZH), Scalar2_Vector2 (-1), I_G_Psi0pWHZH; (Psi1, Psimm, Wp, Wp), Scalar2_Vector2 1, I_G_Psi0ppWW; (Psi1, Psipp, Wm, Wm), Scalar2_Vector2 (-1), I_G_Psi0ppWW; (Psi1, Psimm, WHp, WHp), Scalar2_Vector2 1, I_G_Psi0ppWHWH; (Psi1, Psipp, WHm, WHm), Scalar2_Vector2 (-1), I_G_Psi0ppWHWH; (Psi1, Psimm, WHp, Wp), Scalar2_Vector2 1, I_G_Psi0ppWHW; (Psi1, Psipp, WHm, Wm), Scalar2_Vector2 (-1), I_G_Psi0ppWHW; (Psip, Psim, Wp, Wm), Scalar2_Vector2 4, G_HHWW; (Psip, Psim, WHp, WHm), Scalar2_Vector2 1, G_Psi00ZH; (Psip, Psim, WHp, Wm), Scalar2_Vector2 4, G_HHWHW; (Psip, Psim, Wp, WHm), Scalar2_Vector2 4, G_HHWHW; (Psip, Psim, Z, Z), Scalar2_Vector2 1, G_PsippZZ; (Psip, Psim, Ga, Ga), Scalar2_Vector2 2, G_AAWW; (Psip, Psim, ZH, ZH), Scalar2_Vector2 1, G_PsippZHZH; (Psip, Psim, Ga, Z), Scalar2_Vector2 4, G_PsippAZ; (Psip, Psimm, Wp, Ga), Scalar2_Vector2 1, G_PsippWA; (Psim, Psipp, Wm, Ga), Scalar2_Vector2 1, G_PsippWA; (Psip, Psimm, WHp, Ga), Scalar2_Vector2 1, G_PsippWHA; (Psim, Psipp, WHm, Ga), Scalar2_Vector2 1, G_PsippWHA; (Psip, Psimm, Wp, Z), Scalar2_Vector2 1, G_PsippWZ; (Psim, Psipp, Wm, Z), Scalar2_Vector2 1, G_PsippWZ; (Psip, Psimm, WHp, Z), Scalar2_Vector2 1, G_PsippWHZ; (Psim, Psipp, WHm, Z), Scalar2_Vector2 1, G_PsippWHZ; (Psip, Psimm, Wp, ZH), Scalar2_Vector2 1, G_PsippWZH; (Psim, Psipp, Wm, ZH), Scalar2_Vector2 1, G_PsippWZH; (Psip, Psimm, WHp, ZH), Scalar2_Vector2 1, G_PsippWHZH; (Psim, Psipp, WHm, ZH), Scalar2_Vector2 1, G_PsippWHZH; (Psipp, Psimm, Wp, Wm), Scalar2_Vector2 2, G_HHWW; (Psipp, Psimm, WHp, WHm), Scalar2_Vector2 (-2), G_HHWW; (Psipp, Psimm, WHp, Wm), Scalar2_Vector2 2, G_HHWHW; (Psipp, Psimm, Wp, WHm), Scalar2_Vector2 2, G_HHWHW; (Psipp, Psimm, Z, Z), Scalar2_Vector2 1, G_PsiccZZ; (Psipp, Psimm, Ga, Ga), Scalar2_Vector2 8, G_AAWW; (Psipp, Psimm, ZH, ZH), Scalar2_Vector2 1, G_Psi00ZH; (Psipp, Psimm, Ga, Z), Scalar2_Vector2 1, G_PsiccAZ; (Psipp, Psimm, Z, ZH), Scalar2_Vector2 4, G_PsiccZZH; (Psipp, Psimm, Ga, ZH), Scalar2_Vector2 4, G_PsiccAZH] @ (if Flags.u1_gauged then [(H, H, AH, AH), Scalar2_Vector2 1, G_HHAA; (H, H, AH, Z), Scalar2_Vector2 (-1), G_HHAHZ; (H, H, ZH, AH), Scalar2_Vector2 (-1), G_HHZHAH; (H, Psi0, AH, AH), Scalar2_Vector2 1, G_HPsi0AHAH; (H, Psi0, Z, AH), Scalar2_Vector2 1, G_HPsi0ZAH; (H, Psi0, ZH, AH), Scalar2_Vector2 1, G_HPsi0ZHAH; (H, Psim, Wp, AH), Scalar2_Vector2 1, G_HPsipWAH; (H, Psip, Wm, AH), Scalar2_Vector2 1, G_HPsipWAH; (H, Psim, WHp, AH), Scalar2_Vector2 1, G_HPsipWHAH; (H, Psip, WHm, AH), Scalar2_Vector2 1, G_HPsipWHAH; (Psi0, Psi0, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psi0, Psi0, Z, AH), Scalar2_Vector2 4, G_HHAHZ; (Psi0, Psi0, AH, ZH), Scalar2_Vector2 1, G_Psi00ZHAH; (Psi0, Psim, Wp, AH), Scalar2_Vector2 1, G_Psi0pWAH; (Psi0, Psip, Wm, AH), Scalar2_Vector2 1, G_Psi0pWAH; (Psi0, Psim, WHp, AH), Scalar2_Vector2 1, G_Psi0pWHAH; (Psi0, Psip, WHm, AH), Scalar2_Vector2 1, G_Psi0pWHAH; (Psi1, Psi1, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psi1, Psi1, Z, AH), Scalar2_Vector2 4, G_HHAHZ; (Psi1, Psi1, AH, ZH), Scalar2_Vector2 1, G_Psi00ZHAH; (Psi1, Psim, Wp, AH), Scalar2_Vector2 1, I_G_Psi0pWAH; (Psi1, Psip, Wm, AH), Scalar2_Vector2 (-1), I_G_Psi0pWAH; (Psi1, Psim, WHp, AH), Scalar2_Vector2 1, I_G_Psi0pWHAH; (Psi1, Psip, WHm, AH), Scalar2_Vector2 (-1), I_G_Psi0pWHAH; (Psip, Psim, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psip, Psim, Ga, AH), Scalar2_Vector2 4, G_PsippAAH; (Psip, Psim, Z, AH), Scalar2_Vector2 4, G_PsippZAH; (Psip, Psimm, Wp, AH), Scalar2_Vector2 1, G_PsippWAH; (Psim, Psipp, Wm, AH), Scalar2_Vector2 1, G_PsippWAH; (Psip, Psimm, WHp, AH), Scalar2_Vector2 1, G_PsippWHAH; (Psim, Psipp, WHm, AH), Scalar2_Vector2 1, G_PsippWHAH; (Psipp, Psimm, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psipp, Psimm, AH, ZH), Scalar2_Vector2 (-1), G_Psi00ZHAH; (Psipp, Psimm, Ga, AH), Scalar2_Vector2 4, G_PsiccAAH; (Psipp, Psimm, Z, AH), Scalar2_Vector2 4, G_PsiccZAH] else [])) let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let anomaly_higgs = List.map hgg [ (Eta, Gl, Gl), Dim5_Scalar_Gauge2_Skew 1, G_EGlGl; (Eta, Ga, Ga), Dim5_Scalar_Gauge2_Skew 1, G_EGaGa; (Eta, Ga, Z), Dim5_Scalar_Gauge2_Skew 1, G_EGaZ] (* @ [ (H, Ga, Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (H, Ga, Z), Dim5_Scalar_Gauge2 1, G_HGaZ ] *) let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let gauge_higgs = standard_gauge_higgs let gauge_higgs4 = standard_gauge_higgs4 let higgs = standard_higgs let higgs4 = standard_higgs4 let top_quartic = [ ((M (U (-3)), O H, O H, M (U 3)), GBBG (1, Psibar, S2, Psi), G_HHtt); ((M (TopHb), O H, O H, M TopH), GBBG (1, Psibar, S2, Psi), G_HHthth); ((M (U (-3)), O H, O H, M TopH), GBBG (1, Psibar, S2LR, Psi), G_HHtht); ((M (TopHb), O H, O H, M (U 3)), GBBG (1, Psibar, S2LR, Psi), G_HHtht)] let goldstone_vertices = List.map hgg [ ((Phi0, Wm, Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((Phip, Ga, Wm), Scalar_Vector_Vector 1, I_Q_W); ((Phip, Z, Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((Phim, Wp, Ga), Scalar_Vector_Vector 1, I_Q_W); ((Phim, Wp, Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_heavy_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ ThoList.flatmap charged_heavy_currents [1;2;3] @ heavy_top_currents @ (if Flags.u1_gauged then [] else anomaly_higgs) @ yukawa @ yukawa_add @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 @ top_quartic let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "th" -> M TopH | "thbar" -> M TopHb | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "AH" | "AH0" | "Ah" | "Ah0" -> G AH | "ZH" | "ZH0" | "Zh" | "Zh0" -> G ZH | "W+" -> G Wp | "W-" -> G Wm | "WH+" -> G WHp | "WH-" -> G WHm | "H" | "h" -> O H | "eta" | "Eta" -> O Eta | "Psi" | "Psi0" | "psi" | "psi0" -> O Psi0 | "Psi1" | "psi1" -> O Psi1 | "Psi+" | "psi+" | "Psip" | "psip" -> O Psip | "Psi-" | "psi-" | "Psim" | "psim" -> O Psim | "Psi++" | "psi++" | "Psipp" | "psipp" -> O Psipp | "Psi--" | "psi--" | "Psimm" | "psimm" -> O Psimm | _ -> invalid_arg "Modellib_BSM.Littlest.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_string" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_string" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_string" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_string" | TopH -> "th" | TopHb -> "thbar" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | ZH -> "ZH" | AH -> "AH" | WHp -> "WHp" | WHm -> "WHm" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Eta -> "Eta" | Psi0 -> "Psi0" | Psi1 -> "Psi1" | Psip -> "Psi+" | Psim -> "Psi-" | Psipp -> "Psi++" | Psimm -> "Psi--" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_TeX" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_TeX" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_TeX" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.Littlest.flavor_to_TeX" | TopH -> "T" | TopHb -> "\\bar{T}" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | ZH -> "Z_H" | AH -> "\\gamma_H" | WHp -> "W_H^+" | WHm -> "W_H^-" end | O f -> begin match f with | Phip -> "\\Phi^+" | Phim -> "\\Phi^-" | Phi0 -> "\\Phi^0" | H -> "H" | Eta -> "\\eta" | Psi0 -> "\\Psi_S" | Psi1 -> "\\Psi_P" | Psip -> "\\Psi^+" | Psim -> "\\Psi^-" | Psipp -> "\\Psi^{++}" | Psimm -> "\\Psi^{--}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" | TopH -> "th" | TopHb -> "thb" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | ZH -> "zh" | AH -> "ah" | WHp -> "whp" | WHm -> "whm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Eta -> "eta" | Psi0 -> "psi0" | Psi1 -> "psi1" | Psip -> "psip" | Psim -> "psim" | Psipp -> "psipp" | Psimm -> "psimm" end (* There are PDG numbers for Z', Z'', W', 32-34, respectively. We just introduce a number 38 for Y0 as a Z'''. As well, there is the number 8 for a t'. But we cheat a little bit and take the number 35 which is reserved for a heavy scalar Higgs for the Eta scalar. For the heavy Higgs states we take 35 and 36 for the neutral ones, 37 for the charged and 38 for the doubly-charged. The pseudoscalar gets the 39. *) let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n | TopH -> 8 | TopHb -> (-8) end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | AH -> 32 | ZH -> 33 | WHp -> 34 | WHm -> (-34) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | Psi0 -> 35 | Psi1 -> 36 | Psip -> 37 | Psim -> (-37) | Psipp -> 38 | Psimm -> (-38) | H -> 25 | Eta -> 39 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | VHeavy -> "vheavy" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Sinpsi -> "sinpsi" | Cospsi -> "cospsi" | Atpsi -> "atpsi" | Sccs -> "sccs" | Supp -> "vF" | Supp2 -> "v2F2" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_Z_up -> "qzup" | G_ZHTHT -> "gzhtht" | G_ZTHT -> "gztht" | G_AHTHTH -> "gahthth" | G_AHTHT -> "gahtht" | G_AHTT -> "gahtt" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCtop -> "gcctop" | G_CC_heavy -> "gcch" | G_CC_WH -> "gccwh" | G_CC_W -> "gccw" | G_NC_h_lepton -> "gnchlep" | G_NC_h_neutrino -> "gnchneu" | G_NC_h_up -> "gnchup" | G_NC_h_down -> "gnchdwn" | G_NC_heavy -> "gnch" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_G_WWW -> "igwww" | I_G_AHWW -> "igahww" | I_G_ZHWW -> "igzhww" | I_G_ZWHW -> "igzwhw" | I_G_AHWHWH -> "igahwhwh" | I_G_ZHWHWH -> "igzhwhwh" | I_G_AHWHW -> "igahwhw" | I_Q_H -> "iqh" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_WH4 -> "gwh4" | G_WHWHWW -> "gwhwhww" | G_WHWWW -> "gwhwww" | G_WH3W -> "gwh3w" | G_WWAAH -> "gwwaah" | G_WWAZH -> "gwwazh" | G_WWZZH -> "gwwzzh" | G_WWZAH -> "gwwzah" | G_WHWHAAH -> "gwhwhaah" | G_WHWHAZH -> "gwhwhazh" | G_WHWHZZH -> "gwhwhzzh" | G_WHWHZAH -> "gwhwhzah" | G_WWZHAH -> "gwwzhah" | G_WHWHZHAH -> "gwhwhzhah" | G_WHWZZ -> "gwhwzz" | G_WHWAZ -> "gwhwaz" | G_WHWAAH -> "gwhwaah" | G_WHWZAH -> "gwhwzah" | G_WHWZHZH -> "gwhwzhzh" | G_WHWZHAH -> "gwhwzhah" | G_WHWAZH -> "gwhwazh" | G_WHWZZH -> "gwhwzzh" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_HWHW -> "ghwhw" | G_HWHWH -> "ghwhwh" | G_HAHAH -> "ghahah" | G_HZHZ -> "ghzhz" | G_HZHAH -> "ghzhah" | G_HAHZ -> "ghahz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hthth -> "ghthth" | G_Htht -> "ghtht" | G_HHtt -> "ghhtt" | G_HHthth -> "ghhthth" | G_HHtht -> "ghhtht" | G_Psi0tt -> "gpsi0tt" | G_Psi0bb -> "gpsi0bb" | G_Psi0cc -> "gpsi0cc" | G_Psi0tautau -> "gpsi0tautau" | G_Psi1tt -> "gpsi1tt" | G_Psi1bb -> "gpsi1bb" | G_Psi1cc -> "gpsi1cc" | G_Psi1tautau -> "gpsi1tautau" | G_Psipq3 -> "gpsipq3" | G_Psipq2 -> "gpsipq2" | G_Psipl3 -> "gpsipl3" | G_Psi0tth -> "gpsi0tth" | G_Psi1tth -> "gpsi1tth" | G_Psipbth -> "gpsipbth" | G_Ethth -> "gethth" | G_Etht -> "getht" | G_Ett -> "gett" | G_Ebb -> "gebb" | G_HGaGa -> "ghgaga" | G_HGaZ -> "ghgaz" | G_EGaGa -> "geaa" | G_EGaZ -> "geaz" | G_EGlGl -> "gegg" | G_H3 -> "gh3" | G_H4 -> "gh4" | G_PsiWW -> "gpsiww" | G_PsiWHW -> "gpsiwhw" | G_PsiZZ -> "gpsizz" | G_PsiZHZH -> "gpsizhzh" | G_PsiZHZ -> "gpsizhz" | G_PsiZAH -> "gpsizah" | G_PsiZHAH -> "gpsizhah" | G_PsiAHAH -> "gpsiahah" | G_PsiZW -> "gpsizw" | G_PsiZWH -> "gpsizwh" | G_PsiAHW -> "gpsiahw" | G_PsiAHWH -> "gpsiahwh" | G_PsiZHW -> "gpsizhw" | G_PsiZHWH -> "gpsizhwh" | G_PsippWW -> "gpsippww" | G_PsippWHW -> "gpsippwhw" | G_PsippWHWH -> "gpsippwhwh" | Gs -> "gs" | G2 -> "gs**2" | I_Gs -> "igs" | G_PsiHW -> "gpsihw" | G_PsiHWH -> "gpsihwh" | G_Psi0W -> "gpsi0w" | G_Psi0WH -> "gpsi0wh" | G_Psi1W -> "gpsi1w" | G_Psi1WH -> "gpsi1wh" | G_PsiPPW -> "gpsippw" | G_PsiPPWH -> "gpsippwh" | G_Psi1HAH -> "gpsihah" | G_Psi01AH -> "gpsi0ah" | G_AHPsip -> "gahpsip" | G_Psi1HZ -> "gpsi1hz" | G_Psi1HZH -> "gpsi1hzh" | G_Psi01Z -> "gpsi01z" | G_Psi01ZH -> "gpsi01zh" | G_ZPsip -> "gzpsip" | G_ZPsipp -> "gzpsipp" | G_ZHPsipp -> "gzhpsipp" | G_HHAA -> "ghhaa" | G_HHWHW -> "ghhwhw" | G_HHZHZ -> "ghhzhz" | G_HHAHZ -> "ghhahz" | G_HHZHAH -> "ghhzhah" | G_HPsi0WW -> "ghpsi0ww" | G_HPsi0WHW -> "ghpsi0whw" | G_HPsi0ZZ -> "ghpsi0zz" | G_HPsi0ZHZH -> "ghpsi0zhzh" | G_HPsi0ZHZ -> "ghpsi0zhz" | G_HPsi0AHAH -> "ghpsi0ahah" | G_HPsi0ZAH -> "ghpsi0zah" | G_HPsi0ZHAH -> "ghpsi0zhah" | G_HPsipWA -> "ghpsipwa" | G_HPsipWHA -> "ghpsipwha" | G_HPsipWZ -> "ghpsipwz" | G_HPsipWHZ -> "ghpsiwhz" | G_HPsipWAH -> "ghpsipwah" | G_HPsipWHAH -> "ghpsipwhah" | G_HPsipWZH -> "ghpsipwzh" | G_HPsipWHZH -> "ghpsipwhzh" | G_HPsippWW -> "ghpsippww" | G_HPsippWHWH -> "ghpsippwhwh" | G_HPsippWHW -> "ghpsippwhw" | G_Psi00ZH -> "gpsi00zh" | G_Psi00AH -> "gpsi00ah" | G_Psi00ZHAH -> "gpsi00zhah" | G_Psi0pWA -> "gpsi0pwa" | G_Psi0pWHA -> "gpsi0pwha" | G_Psi0pWZ -> "gpsi0pwz" | G_Psi0pWHZ -> "gpsi0pwhz" | G_Psi0pWAH -> "gpsi0pwah" | G_Psi0pWHAH -> "gpsi0pwhah" | G_Psi0pWZH -> "gpsi0pwzh" | G_Psi0pWHZH -> "gpsi0pwhzh" | G_Psi0ppWW -> "gpsi0ppww" | G_Psi0ppWHWH -> "gpsi0ppwhwh" | G_Psi0ppWHW -> "gpsi0ppwhw" | I_G_Psi0pWA -> "i_gpsi0pwa" | I_G_Psi0pWHA -> "i_gpsi0pwha" | I_G_Psi0pWZ -> "i_gpsi0pwz" | I_G_Psi0pWHZ -> "i_gpsi0pwhz" | I_G_Psi0pWAH -> "i_gpsi0pwah" | I_G_Psi0pWHAH -> "i_gpsi0pwhah" | I_G_Psi0pWZH -> "i_gpsi0pwzh" | I_G_Psi0pWHZH -> "i_gpsi0pwhzh" | I_G_Psi0ppWW -> "i_gpsi0ppww" | I_G_Psi0ppWHWH -> "i_gpsi0ppwhwh" | I_G_Psi0ppWHW -> "i_gpsi0ppwhw" | G_PsippZZ -> "gpsippzz" | G_PsippZHZH -> "gpsippzhzh" | G_PsippAZ -> "gpsippaz" | G_PsippAAH -> "gpsippaah" | G_PsippZAH -> "gpsippzah" | G_PsippWA -> "gpsippwa" | G_PsippWHA -> "gpsippwha" | G_PsippWZ -> "gpsippwz" | G_PsippWHZ -> "gpsippwhz" | G_PsippWAH -> "gpsippwah" | G_PsippWHAH -> "gpsippwhah" | G_PsippWZH -> "gpsippwzh" | G_PsippWHZH -> "gpsippwhzh" | G_PsiccZZ -> "gpsicczz" | G_PsiccAZ -> "gpsiccaz" | G_PsiccAAH -> "gpsiccaah" | G_PsiccZZH -> "gpsicczzh" | G_PsiccAZH -> "gpsiccazh" | G_PsiccZAH -> "gpsicczah" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module Littlest_Tpar (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type flavor = L of int | N of int | U of int | D of int | Topp | Toppb | Ga | Wp | Wm | Z | Gl | Lodd of int | Nodd of int | Uodd of int | Dodd of int | WHp | WHm | ZH | AH | Phip | Phim | Phi0 | H | Eta | Psi0 | Psi1 | Psip | Psim | Psipp | Psimm type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.Littlest_Tpar.gauge_symbol: internal error" let family n = [ L n; N n; U n; D n; Dodd n; Nodd n; Lodd n; Uodd n ] (* Since [Phi] already belongs to the EW Goldstone bosons we use [Psi] for the TeV scale complex triplet. We use the notation Todd1 = Uodd 3, Todd2 = Uodd 4. *) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Heavy Quarks", [Topp; Toppb; Uodd 4; Uodd (-4)]; "Heavy Scalars", [Psi0; Psi1; Psip; Psim; Psipp; Psimm]; "Gauge Bosons", if Flags.u1_gauged then [Ga; Z; Wp; Wm; Gl; WHp; WHm; ZH; AH] else [Ga; Z; Wp; Wm; Gl; WHp; WHm; ZH]; "Higgs", if Flags.u1_gauged then [H] else [H; Eta]; "Goldstone Bosons", [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n | Topp -> Spinor | Toppb -> ConjSpinor | Ga | Gl -> Vector | Wp | Wm | Z | WHp | WHm | ZH | AH -> Massive_Vector | _ -> Scalar let color = function | U n -> Color.SUN (if n > 0 then 3 else -3) | Uodd n -> Color.SUN (if n > 0 then 3 else -3) | D n -> Color.SUN (if n > 0 then 3 else -3) | Dodd n -> Color.SUN (if n > 0 then 3 else -3) | Topp -> Color.SUN 3 | Toppb -> Color.SUN (-3) | Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | L n -> prop_spinor n | N n -> prop_spinor n | Lodd n -> prop_spinor n | Nodd n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n | Uodd n -> prop_spinor n | Dodd n -> prop_spinor n | Topp -> Prop_Spinor | Toppb -> Prop_ConjSpinor | Ga | Gl -> Prop_Feynman | Wp | Wm | Z | WHp | WHm | ZH | AH -> Prop_Unitarity | Phip | Phim | Phi0 -> Only_Insertion | H | Eta | Psi0 | Psi1 | Psip | Psim | Psipp | Psimm -> Prop_Scalar (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | Wp | Wm | U 3 | U (-3) | WHp | WHm | ZH | AH | Uodd _ | Dodd _ | Nodd _ | Lodd _ | Topp | Toppb -> Fudged | _ -> !default_width else !default_width let goldstone = function | Wp -> Some (Phip, Coupling.Integer 1) | Wm -> Some (Phim, Coupling.Integer 1) | Z -> Some (Phi0, Coupling.Integer 1) | _ -> None let conjugate = function | L n -> L (-n) | N n -> N (-n) | Lodd n -> L (-n) | Nodd n -> N (-n) | U n -> U (-n) | D n -> D (-n) | Uodd n -> U (-n) | Dodd n -> D (-n) | Topp -> Toppb | Toppb -> Topp | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | WHm -> WHp | WHp -> WHm | ZH -> ZH | AH -> AH | Psi0 -> Psi0 | Psi1 -> Psi1 | Psip -> Psim | Psim -> Psip | Psipp -> Psimm | Psimm -> Psipp | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Eta -> Eta let fermion = function | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 | Lodd n -> if n > 0 then 1 else -1 | Nodd n -> if n > 0 then 1 else -1 | Uodd n -> if n > 0 then 1 else -1 | Dodd n -> if n > 0 then 1 else -1 | Topp -> 1 | Toppb -> -1 | Gl | Ga | Z | Wp | Wm | WHp | WHm | AH | ZH -> 0 | _ -> 0 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let charge = function | L n | Lodd n -> if n > 0 then -1//1 else 1//1 | N n | Nodd n -> 0//1 | U n | Uodd n -> if n > 0 then 2//3 else -2//3 | D n | Dodd n -> if n > 0 then -1//3 else 1//3 | Topp -> 2//3 | Toppb -> -2//3 | Gl | Ga | Z | AH | ZH -> 0//1 | Wp | WHp -> 1//1 | Wm | WHm -> -1//1 | H | Phi0 | Eta | Psi1 | Psi0 -> 0//1 | Phip | Psip -> 1//1 | Phim | Psim -> -1//1 | Psipp -> 2//1 | Psimm -> -2//1 let lepton = function | L n | N n | Lodd n | Nodd n -> if n > 0 then 1//1 else -1//1 | U _ | D _ | _ -> 0//1 let baryon = function | L _ | N _ -> 0//1 | U n | D n | Uodd n | Dodd n -> if n > 0 then 1//1 else -1//1 | Topp -> 1//1 | Toppb -> -1//1 | _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | VHeavy | Supp | Supp2 | Sinpsi | Cospsi | Atpsi | Sccs (* Mixing angles of SU(2) *) | Q_lepton | Q_up | Q_down | Q_Z_up | G_CC | G_CCtop | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_NC_heavy | G_NC_h_neutrino | G_NC_h_lepton | G_NC_h_up | G_NC_h_down | G_CC_heavy | G_ZHTHT | G_ZTHT | G_AHTHTH | G_AHTHT | G_AHTT | G_CC_WH | G_CC_W | Gs | I_Gs | G2 | I_Q_W | I_G_ZWW | I_G_WWW | I_G_AHWW | I_G_ZHWW | I_G_ZWHW | I_G_AHWHWH | I_G_ZHWHWH | I_G_AHWHW | I_Q_H | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_WH4 | G_WHWHWW | G_WHWWW | G_WH3W | G_WWAAH | G_WWAZH | G_WWZZH | G_WWZAH | G_WHWHAAH | G_WHWHAZH | G_WHWHZZH | G_WHWHZAH | G_WWZHAH | G_WHWHZHAH | G_WHWZZ | G_WHWAZ | G_WHWAAH | G_WHWZAH | G_WHWZHZH | G_WHWZHAH | G_WHWAZH | G_WHWZZH | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_PsiWW | G_PsiWHW | G_PsiZZ | G_PsiZHZH | G_PsiZHZ | G_PsiZAH | G_PsiZHAH | G_PsiAHAH | G_PsiZW | G_PsiZWH | G_PsiAHW | G_PsiAHWH | G_PsiZHW | G_PsiZHWH | G_PsippWW | G_PsippWHW | G_PsippWHWH | G_PsiHW | G_PsiHWH | G_Psi0W | G_Psi0WH | G_Psi1W | G_Psi1WH | G_PsiPPW | G_PsiPPWH | G_Psi1HAH | G_Psi01AH | G_AHPsip | G_Psi1HZ | G_Psi1HZH | G_Psi01Z | G_Psi01ZH | G_ZPsip | G_ZPsipp | G_ZHPsipp | G_HHAA | G_HHWHW | G_HHZHZ | G_HHAHZ | G_HHZHAH | G_HPsi0WW | G_HPsi0WHW | G_HPsi0ZZ | G_HPsi0ZHZH | G_HPsi0ZHZ | G_HPsi0AHAH | G_HPsi0ZAH | G_HPsi0ZHAH | G_HPsipWA | G_HPsipWHA | G_HPsipWZ | G_HPsipWHZ | G_HPsipWAH | G_HPsipWHAH | G_HPsipWZH | G_HPsipWHZH | G_HPsippWW | G_HPsippWHWH | G_HPsippWHW | G_Psi00ZH | G_Psi00AH | G_Psi00ZHAH | G_Psi0pWA | G_Psi0pWHA | G_Psi0pWZ | G_Psi0pWHZ | G_Psi0pWAH | G_Psi0pWHAH | G_Psi0pWZH | G_Psi0pWHZH | G_Psi0ppWW | G_Psi0ppWHWH | G_Psi0ppWHW | I_G_Psi0pWA | I_G_Psi0pWHA | I_G_Psi0pWZ | I_G_Psi0pWHZ | I_G_Psi0pWAH | I_G_Psi0pWHAH | I_G_Psi0pWZH | I_G_Psi0pWHZH | I_G_Psi0ppWW | I_G_Psi0ppWHWH | I_G_Psi0ppWHW | G_PsippZZ | G_PsippZHZH | G_PsippAZ | G_PsippAAH | G_PsippZAH | G_PsippWA | G_PsippWHA | G_PsippWZ | G_PsippWHZ | G_PsippWAH | G_PsippWHAH | G_PsippWZH | G_PsippWHZH | G_PsiccZZ | G_PsiccAZ | G_PsiccAAH | G_PsiccZZH | G_PsiccAZH | G_PsiccZAH | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | G_Hthth | G_Htht | G_Ethth | G_Etht | G_Ett | G_HHtt | G_HHthth | G_HHtht | G_Psi0tt | G_Psi0bb | G_Psi0cc | G_Psi0tautau | G_Psi1tt | G_Psi1bb | G_Psi1cc | G_Psi1tautau | G_Psipq3 | G_Psipq2 | G_Psipl3 | G_Psi0tth | G_Psi1tth | G_Psipbth | G_Ebb | G_HGaGa | G_HGaZ | G_EGaGa | G_EGaZ | G_EGlGl | G_HWHW | G_HWHWH | G_HAHAH | G_HZHZ | G_HZHAH | G_HAHZ | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)); nc_coupling G_NC_h_neutrino half (Integer 0); nc_coupling G_NC_h_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_h_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_h_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let electromagnetic_currents n = [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down); ((Lodd (-n), Ga, Lodd n), FBF (1, Psibar, V, Psi), Q_lepton); ((Uodd (-n), Ga, Uodd n), FBF (1, Psibar, V, Psi), Q_up); ((Dodd (-n), Ga, Dodd n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs); ((Uodd (-n), Gl, Uodd n), FBF ((-1), Psibar, V, Psi), Gs); ((Dodd (-n), Gl, Dodd n), FBF ((-1), Psibar, V, Psi), Gs) ] let neutral_currents n = [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* The sign of this coupling is just the one of the T3, being -(1/2) for leptons and down quarks, and +(1/2) for neutrinos and up quarks. *) let neutral_heavy_currents n = ([ ((L (-n), ZH, L n), FBF ((-1), Psibar, VL, Psi), G_NC_heavy); ((N (-n), ZH, N n), FBF (1, Psibar, VL, Psi), G_NC_heavy); ((U (-n), ZH, U n), FBF (1, Psibar, VL, Psi), G_NC_heavy); ((D (-n), ZH, D n), FBF ((-1), Psibar, VL, Psi), G_NC_heavy)] @ (if Flags.u1_gauged then [ ((L (-n), AH, L n), FBF (1, Psibar, VA, Psi), G_NC_h_lepton); ((N (-n), AH, N n), FBF (1, Psibar, VA, Psi), G_NC_h_neutrino); ((D (-n), AH, D n), FBF (1, Psibar, VA, Psi), G_NC_h_down)] else [])) let heavy_top_currents = ([ ((Toppb, Ga, Topp), FBF (1, Psibar, V, Psi), Q_up); ((Toppb, Z, Topp), FBF (1, Psibar, V, Psi), Q_Z_up); ((Toppb, Gl, Topp), FBF (1, Psibar, V, Psi), Gs); ((Toppb, Z, U 3), FBF (1, Psibar, VL, Psi), G_ZTHT); ((U (-3), Z, Topp), FBF (1, Psibar, VL, Psi), G_ZTHT); ((Toppb, ZH, U 3), FBF (1, Psibar, VL, Psi), G_ZHTHT); ((U (-3), ZH, Topp), FBF (1, Psibar, VL, Psi), G_ZHTHT); ((U (-3), Wp, D 3), FBF (1, Psibar, VL, Psi), G_CCtop); ((D (-3), Wm, U 3), FBF (1, Psibar, VL, Psi), G_CCtop); ((Toppb, WHp, D 3), FBF (1, Psibar, VL, Psi), G_CC_WH); ((D (-3), WHm, Topp), FBF (1, Psibar, VL, Psi), G_CC_WH); ((Toppb, Wp, D 3), FBF (1, Psibar, VL, Psi), G_CC_W); ((D (-3), Wm, Topp), FBF (1, Psibar, VL, Psi), G_CC_W)] @ (if Flags.u1_gauged then [ ((U (-3), AH, U 3), FBF (1, Psibar, VA, Psi), G_AHTT); ((Toppb, AH, Topp), FBF (1, Psibar, VA, Psi), G_AHTHTH); ((Toppb, AH, U 3), FBF (1, Psibar, VR, Psi), G_AHTHT); ((U (-3), AH, Topp), FBF (1, Psibar, VR, Psi), G_AHTHT)] else [])) (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents n = [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((L (-n), WHm, N n), FBF (1, Psibar, VL, Psi), G_CC_heavy); ((N (-n), WHp, L n), FBF (1, Psibar, VL, Psi), G_CC_heavy); ((D (-n), WHm, U n), FBF (1, Psibar, VL, Psi), G_CC_heavy); ((U (-n), WHp, D n), FBF (1, Psibar, VL, Psi), G_CC_heavy)] let quark_currents n = ([ ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC)] @ (if Flags.u1_gauged then [ ((U (-n), AH, U n), FBF (1, Psibar, VA, Psi), G_NC_h_up)] else [])) (* We specialize the third generation since there is an additional shift coming from the admixture of the heavy top quark. The universal shift, coming from the mixing in the non-Abelian gauge boson sector is unobservable. (Redefinition of coupling constants by measured ones. *) let yukawa = [ ((U (-3), H, U 3), FBF (1, Psibar, S, Psi), G_Htt); ((D (-3), H, D 3), FBF (1, Psibar, S, Psi), G_Hbb); ((U (-2), H, U 2), FBF (1, Psibar, S, Psi), G_Hcc); ((L (-3), H, L 3), FBF (1, Psibar, S, Psi), G_Htautau)] let yukawa_add' = [ ((Toppb, H, Topp), FBF (1, Psibar, S, Psi), G_Hthth); ((Toppb, H, U 3), FBF (1, Psibar, SLR, Psi), G_Htht); ((U (-3), H, Topp), FBF (1, Psibar, SLR, Psi), G_Htht); ((U (-3), Psi0, U 3), FBF (1, Psibar, S, Psi), G_Psi0tt); ((D (-3), Psi0, D 3), FBF (1, Psibar, S, Psi), G_Psi0bb); ((U (-2), Psi0, U 2), FBF (1, Psibar, S, Psi), G_Psi0cc); ((L (-3), Psi0, L 3), FBF (1, Psibar, S, Psi), G_Psi0tautau); ((U (-3), Psi1, U 3), FBF (1, Psibar, P, Psi), G_Psi1tt); ((D (-3), Psi1, D 3), FBF (1, Psibar, P, Psi), G_Psi1bb); ((U (-2), Psi1, U 2), FBF (1, Psibar, P, Psi), G_Psi1cc); ((L (-3), Psi1, L 3), FBF (1, Psibar, P, Psi), G_Psi1tautau); ((U (-3), Psip, D 3), FBF (1, Psibar, SLR, Psi), G_Psipq3); ((U (-2), Psip, D 2), FBF (1, Psibar, SLR, Psi), G_Psipq2); ((N (-3), Psip, L 3), FBF (1, Psibar, SR, Psi), G_Psipl3); ((D (-3), Psim, U 3), FBF (1, Psibar, SLR, Psi), G_Psipq3); ((D (-2), Psim, U 2), FBF (1, Psibar, SLR, Psi), G_Psipq2); ((L (-3), Psim, N 3), FBF (1, Psibar, SL, Psi), G_Psipl3); ((Toppb, Psi0, U 3), FBF (1, Psibar, SL, Psi), G_Psi0tth); ((U (-3), Psi0, Topp), FBF (1, Psibar, SR, Psi), G_Psi0tth); ((Toppb, Psi1, U 3), FBF (1, Psibar, SL, Psi), G_Psi1tth); ((U (-3), Psi1, Topp), FBF (1, Psibar, SR, Psi), G_Psi1tth); ((Toppb, Psip, D 3), FBF (1, Psibar, SL, Psi), G_Psipbth); ((D (-3), Psim, Topp), FBF (1, Psibar, SR, Psi), G_Psipbth)] let yukawa_add = if Flags.u1_gauged then yukawa_add' else yukawa_add' @ [ ((U (-3), Eta, U 3), FBF (1, Psibar, P, Psi), G_Ett); ((Toppb, Eta, U 3), FBF (1, Psibar, SLR, Psi), G_Etht); ((D (-3), Eta, D 3), FBF (1, Psibar, P, Psi), G_Ebb); ((U (-3), Eta, Topp), FBF (1, Psibar, SLR, Psi), G_Etht)] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Check. *) let standard_triple_gauge = [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs) ] let heavy_triple_gauge = ([ ((Ga, WHm, WHp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, WHm, WHp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((ZH, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZHWW); ((Z, WHm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWHW); ((Z, Wm, WHp), Gauge_Gauge_Gauge (-1), I_G_ZWHW); ((ZH, WHm, Wp), Gauge_Gauge_Gauge 1, I_G_WWW); ((ZH, Wm, WHp), Gauge_Gauge_Gauge (-1), I_G_WWW); ((ZH, WHm, WHp), Gauge_Gauge_Gauge (-1), I_G_ZHWHWH)] @ (if Flags.u1_gauged then [ ((AH, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_AHWW); ((AH, WHm, Wp), Gauge_Gauge_Gauge 1, I_G_AHWHW); ((AH, Wm, WHp), Gauge_Gauge_Gauge (-1), I_G_AHWHW); ((AH, WHm, WHp), Gauge_Gauge_Gauge 1, I_G_AHWHWH)] else [])) let triple_gauge = standard_triple_gauge @ heavy_triple_gauge let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2] let heavy_quartic_gauge = [ (WHm, Wp, WHm, Wp), gauge4, G_WWWW; (Wm, WHp, Wm, WHp), gauge4, G_WWWW; (WHm, WHp, WHm, WHp), gauge4, G_WH4; (Wm, Wp, WHm, WHp), gauge4, G_WHWHWW; (Wm, Wp, Wm, WHp), gauge4, G_WHWWW; (Wm, Wp, WHm, Wp), gauge4, G_WHWWW; (WHm, WHp, Wm, WHp), gauge4, G_WH3W; (WHm, WHp, WHm, Wp), gauge4, G_WH3W; (WHm, Z, WHp, Z), minus_gauge4, G_ZZWW; (WHm, Z, WHp, Ga), minus_gauge4, G_AZWW; (WHm, Ga, WHp, ZH), minus_gauge4, G_AAWW; (WHm, Z, WHp, ZH), minus_gauge4, G_ZZWW; (Wm, ZH, Wp, ZH), minus_gauge4, G_WWWW; (Wm, Ga, Wp, ZH), minus_gauge4, G_WWAZH; (Wm, Z, Wp, ZH), minus_gauge4, G_WWZZH; (WHm, Ga, WHp, ZH), minus_gauge4, G_WHWHAZH; (WHm, Z, WHp, ZH), minus_gauge4, G_WHWHZZH; (WHm, ZH, WHp, ZH), minus_gauge4, G_WH4; (WHm, Z, Wp, Z), minus_gauge4, G_WHWZZ; (Wm, Z, WHp, Z), minus_gauge4, G_WHWZZ; (WHm, Ga, Wp, Z), minus_gauge4, G_WHWAZ; (Wm, Ga, WHp, Z), minus_gauge4, G_WHWAZ; (WHm, ZH, Wp, ZH), minus_gauge4, G_WHWZHZH; (Wm, ZH, WHp, ZH), minus_gauge4, G_WHWZHZH; (WHm, Ga, Wp, ZH), minus_gauge4, G_WHWAZH; (Wm, Ga, WHp, ZH), minus_gauge4, G_WHWAZH; (WHm, Z, Wp, ZH), minus_gauge4, G_WHWZZH; (Wm, Z, WHp, ZH), minus_gauge4, G_WHWZZH] @ (if Flags.u1_gauged then [ (Wm, Ga, Wp, AH), minus_gauge4, G_WWAAH; (Wm, Z, Wp, AH), minus_gauge4, G_WWZAH; (WHm, Ga, WHp, AH), minus_gauge4, G_WHWHAAH; (WHm, Z, WHp, AH), minus_gauge4, G_WHWHZAH; (Wm, ZH, Wp, AH), minus_gauge4, G_WWZHAH; (WHm, ZH, WHp, AH), minus_gauge4, G_WHWHZHAH; (WHm, Ga, Wp, AH), minus_gauge4, G_WHWAAH; (Wm, Ga, WHp, AH), minus_gauge4, G_WHWAAH; (WHm, Z, Wp, AH), minus_gauge4, G_WHWZAH; (Wm, Z, WHp, AH), minus_gauge4, G_WHWZAH; (WHm, ZH, Wp, AH), minus_gauge4, G_WHWZHAH; (Wm, ZH, WHp, AH), minus_gauge4, G_WHWZHAH] else []) let quartic_gauge = standard_quartic_gauge @ heavy_quartic_gauge let standard_gauge_higgs' = [ ((H, Wp, Wm), Scalar_Vector_Vector 1, G_HWW); ((H, Z, Z), Scalar_Vector_Vector 1, G_HZZ) ] let heavy_gauge_higgs = [ ((H, Wp, WHm), Scalar_Vector_Vector 1, G_HWHW); ((H, WHp, Wm), Scalar_Vector_Vector 1, G_HWHW); ((H, WHp, WHm), Scalar_Vector_Vector 1, G_HWHWH); ((H, ZH, ZH), Scalar_Vector_Vector 1, G_HWHWH); ((H, ZH, Z), Scalar_Vector_Vector 1, G_HZHZ); ((H, Wp, Wm), Scalar_Vector_Vector 1, G_HZHAH)] @ (if Flags.u1_gauged then [((H, AH, AH), Scalar_Vector_Vector 1, G_HAHAH); ((H, Z, AH), Scalar_Vector_Vector 1, G_HAHZ)] else []) let triplet_gauge_higgs = [ ((Psi0, Wp, Wm), Scalar_Vector_Vector 1, G_PsiWW); ((Psi0, WHp, WHm), Scalar_Vector_Vector (-1), G_PsiWW); ((Psi0, WHp, Wm), Scalar_Vector_Vector 1, G_PsiWHW); ((Psi0, WHm, Wp), Scalar_Vector_Vector 1, G_PsiWHW); ((Psi0, Z, Z), Scalar_Vector_Vector 1, G_PsiZZ); ((Psi0, ZH, ZH), Scalar_Vector_Vector 1, G_PsiZHZH); ((Psi0, ZH, Z), Scalar_Vector_Vector 1, G_PsiZHZ); ((Psim, Wp, Z), Scalar_Vector_Vector 1, G_PsiZW); ((Psip, Wm, Z), Scalar_Vector_Vector 1, G_PsiZW); ((Psim, WHp, Z), Scalar_Vector_Vector 1, G_PsiZWH); ((Psip, WHm, Z), Scalar_Vector_Vector 1, G_PsiZWH); ((Psim, Wp, ZH), Scalar_Vector_Vector 1, G_PsiZHW); ((Psip, Wm, ZH), Scalar_Vector_Vector 1, G_PsiZHW); ((Psim, WHp, ZH), Scalar_Vector_Vector 1, G_PsiZHWH); ((Psip, WHm, ZH), Scalar_Vector_Vector 1, G_PsiZHWH); ((Psimm, Wp, Wp), Scalar_Vector_Vector 1, G_PsippWW); ((Psipp, Wm, Wm), Scalar_Vector_Vector 1, G_PsippWW); ((Psimm, WHp, Wp), Scalar_Vector_Vector 1, G_PsippWHW); ((Psipp, WHm, Wm), Scalar_Vector_Vector 1, G_PsippWHW); ((Psimm, WHp, WHp), Scalar_Vector_Vector 1, G_PsippWHWH); ((Psipp, WHm, WHm), Scalar_Vector_Vector 1, G_PsippWHWH)] @ (if Flags.u1_gauged then [((Psi0, AH, Z), Scalar_Vector_Vector 1, G_PsiZAH); ((Psi0, AH, ZH), Scalar_Vector_Vector 1, G_PsiZHAH); ((Psi0, AH, AH), Scalar_Vector_Vector 1, G_PsiAHAH); ((Psim, Wp, AH), Scalar_Vector_Vector 1, G_PsiAHW); ((Psip, Wm, AH), Scalar_Vector_Vector 1, G_PsiAHW); ((Psim, WHp, AH), Scalar_Vector_Vector 1, G_PsiAHWH); ((Psip, WHm, AH), Scalar_Vector_Vector 1, G_PsiAHWH)] else []) let triplet_gauge2_higgs = [ ((Wp, H, Psim), Vector_Scalar_Scalar 1, G_PsiHW); ((Wm, H, Psip), Vector_Scalar_Scalar 1, G_PsiHW); ((WHp, H, Psim), Vector_Scalar_Scalar 1, G_PsiHWH); ((WHm, H, Psip), Vector_Scalar_Scalar 1, G_PsiHWH); ((Wp, Psi0, Psim), Vector_Scalar_Scalar 1, G_Psi0W); ((Wm, Psi0, Psip), Vector_Scalar_Scalar 1, G_Psi0W); ((WHp, Psi0, Psim), Vector_Scalar_Scalar 1, G_Psi0WH); ((WHm, Psi0, Psip), Vector_Scalar_Scalar 1, G_Psi0WH); ((Wp, Psi1, Psim), Vector_Scalar_Scalar 1, G_Psi1W); ((Wm, Psi1, Psip), Vector_Scalar_Scalar (-1), G_Psi1W); ((WHp, Psi1, Psim), Vector_Scalar_Scalar 1, G_Psi1WH); ((WHm, Psi1, Psip), Vector_Scalar_Scalar (-1), G_Psi1WH); ((Wp, Psip, Psimm), Vector_Scalar_Scalar 1, G_PsiPPW); ((Wm, Psim, Psipp), Vector_Scalar_Scalar 1, G_PsiPPW); ((WHp, Psip, Psimm), Vector_Scalar_Scalar 1, G_PsiPPWH); ((WHm, Psim, Psipp), Vector_Scalar_Scalar 1, G_PsiPPWH); ((Ga, Psip, Psim), Vector_Scalar_Scalar 1, Q_lepton); ((Ga, Psipp, Psimm), Vector_Scalar_Scalar 2, Q_lepton); ((Z, H, Psi1), Vector_Scalar_Scalar 1, G_Psi1HZ); ((ZH, H, Psi1), Vector_Scalar_Scalar 1, G_Psi1HZH); ((Z, Psi0, Psi1), Vector_Scalar_Scalar 1, G_Psi01Z); ((ZH, Psi0, Psi1), Vector_Scalar_Scalar 1, G_Psi01ZH); ((Z, Psip, Psim), Vector_Scalar_Scalar 1, G_ZPsip); ((Z, Psipp, Psimm), Vector_Scalar_Scalar 2, G_ZPsipp); ((ZH, Psipp, Psimm), Vector_Scalar_Scalar 2, G_ZHPsipp)] @ (if Flags.u1_gauged then [((AH, H, Psi1), Vector_Scalar_Scalar 1, G_Psi1HAH); ((AH, Psi0, Psi1), Vector_Scalar_Scalar 1, G_Psi01AH); ((AH, Psip, Psim), Vector_Scalar_Scalar 1, G_AHPsip); ((AH, Psipp, Psimm), Vector_Scalar_Scalar 2, G_AHPsip)] else []) let standard_gauge_higgs = standard_gauge_higgs' @ heavy_gauge_higgs @ triplet_gauge_higgs @ triplet_gauge2_higgs let standard_gauge_higgs4 = [ (H, H, Wp, Wm), Scalar2_Vector2 1, G_HHWW; (H, H, Z, Z), Scalar2_Vector2 1, G_HHZZ ] let littlest_gauge_higgs4 = [ (H, H, WHp, WHm), Scalar2_Vector2 (-1), G_HHWW; (H, H, ZH, ZH), Scalar2_Vector2 (-1), G_HHWW; (H, H, Wp, WHm), Scalar2_Vector2 1, G_HHWHW; (H, H, WHp, Wm), Scalar2_Vector2 1, G_HHWHW; (H, H, ZH, Z), Scalar2_Vector2 (-1), G_HHZHZ; (H, Psi0, Wp, Wm), Scalar2_Vector2 1, G_HPsi0WW; (H, Psi0, WHp, WHm), Scalar2_Vector2 (-1), G_HPsi0WW; (H, Psi0, WHp, Wm), Scalar2_Vector2 1, G_HPsi0WHW; (H, Psi0, Wp, WHm), Scalar2_Vector2 1, G_HPsi0WHW; (H, Psi0, Z, Z), Scalar2_Vector2 1, G_HPsi0ZZ; (H, Psi0, ZH, ZH), Scalar2_Vector2 1, G_HPsi0ZHZH; (H, Psi0, ZH, Z), Scalar2_Vector2 1, G_HPsi0ZHZ; (H, Psim, Wp, Ga), Scalar2_Vector2 1, G_HPsipWA; (H, Psip, Wm, Ga), Scalar2_Vector2 1, G_HPsipWA; (H, Psim, WHp, Ga), Scalar2_Vector2 1, G_HPsipWHA; (H, Psip, WHm, Ga), Scalar2_Vector2 1, G_HPsipWHA; (H, Psim, Wp, Z), Scalar2_Vector2 1, G_HPsipWZ; (H, Psip, Wm, Z), Scalar2_Vector2 1, G_HPsipWZ; (H, Psim, WHp, Z), Scalar2_Vector2 1, G_HPsipWHZ; (H, Psip, WHm, Z), Scalar2_Vector2 1, G_HPsipWHZ; (H, Psim, Wp, ZH), Scalar2_Vector2 1, G_HPsipWZH; (H, Psip, Wm, ZH), Scalar2_Vector2 1, G_HPsipWZH; (H, Psim, WHp, ZH), Scalar2_Vector2 1, G_HPsipWHZH; (H, Psip, WHm, ZH), Scalar2_Vector2 1, G_HPsipWHZH; (H, Psimm, Wp, Wp), Scalar2_Vector2 1, G_HPsippWW; (H, Psipp, Wm, Wm), Scalar2_Vector2 1, G_HPsippWW; (H, Psimm, WHp, WHp), Scalar2_Vector2 1, G_HPsippWHWH; (H, Psipp, WHm, WHm), Scalar2_Vector2 1, G_HPsippWHWH; (H, Psimm, WHp, Wp), Scalar2_Vector2 1, G_HPsippWHW; (H, Psipp, WHm, Wm), Scalar2_Vector2 1, G_HPsippWHW; (Psi0, Psi0, Wp, Wm), Scalar2_Vector2 2, G_HHWW; (Psi0, Psi0, WHp, WHm), Scalar2_Vector2 (-2), G_HHWW; (Psi0, Psi0, Z, Z), Scalar2_Vector2 4, G_HHZZ; (Psi0, Psi0, ZH, ZH), Scalar2_Vector2 1, G_Psi00ZH; (Psi0, Psi0, WHp, Wm), Scalar2_Vector2 2, G_HHWHW; (Psi0, Psi0, Wp, WHm), Scalar2_Vector2 2, G_HHWHW; (Psi0, Psi0, Z, ZH), Scalar2_Vector2 4, G_HHZHZ; (Psi0, Psim, Wp, Ga), Scalar2_Vector2 1, G_Psi0pWA; (Psi0, Psip, Wm, Ga), Scalar2_Vector2 1, G_Psi0pWA; (Psi0, Psim, WHp, Ga), Scalar2_Vector2 1, G_Psi0pWHA; (Psi0, Psip, WHm, Ga), Scalar2_Vector2 1, G_Psi0pWHA; (Psi0, Psim, Wp, Z), Scalar2_Vector2 1, G_Psi0pWZ; (Psi0, Psip, Wm, Z), Scalar2_Vector2 1, G_Psi0pWZ; (Psi0, Psim, WHp, Z), Scalar2_Vector2 1, G_Psi0pWHZ; (Psi0, Psip, WHm, Z), Scalar2_Vector2 1, G_Psi0pWHZ; (Psi0, Psim, Wp, ZH), Scalar2_Vector2 1, G_Psi0pWZH; (Psi0, Psip, Wm, ZH), Scalar2_Vector2 1, G_Psi0pWZH; (Psi0, Psim, WHp, ZH), Scalar2_Vector2 1, G_Psi0pWHZH; (Psi0, Psip, WHm, ZH), Scalar2_Vector2 1, G_Psi0pWHZH; (Psi0, Psimm, Wp, Wp), Scalar2_Vector2 1, G_Psi0ppWW; (Psi0, Psipp, Wm, Wm), Scalar2_Vector2 1, G_Psi0ppWW; (Psi0, Psimm, WHp, WHp), Scalar2_Vector2 1, G_Psi0ppWHWH; (Psi0, Psipp, WHm, WHm), Scalar2_Vector2 1, G_Psi0ppWHWH; (Psi0, Psimm, WHp, Wp), Scalar2_Vector2 1, G_Psi0ppWHW; (Psi0, Psipp, WHm, Wm), Scalar2_Vector2 1, G_Psi0ppWHW; (Psi1, Psi1, Wp, Wm), Scalar2_Vector2 2, G_HHWW; (Psi1, Psi1, WHp, WHm), Scalar2_Vector2 (-2), G_HHWW; (Psi1, Psi1, Z, Z), Scalar2_Vector2 4, G_HHZZ; (Psi1, Psi1, ZH, ZH), Scalar2_Vector2 1, G_Psi00ZH; (Psi1, Psi1, WHp, Wm), Scalar2_Vector2 2, G_HHWHW; (Psi1, Psi1, Wp, WHm), Scalar2_Vector2 2, G_HHWHW; (Psi1, Psi1, Z, ZH), Scalar2_Vector2 4, G_HHZHZ; (Psi1, Psim, Wp, Ga), Scalar2_Vector2 1, I_G_Psi0pWA; (Psi1, Psip, Wm, Ga), Scalar2_Vector2 (-1), I_G_Psi0pWA; (Psi1, Psim, WHp, Ga), Scalar2_Vector2 1, I_G_Psi0pWHA; (Psi1, Psip, WHm, Ga), Scalar2_Vector2 (-1), I_G_Psi0pWHA; (Psi1, Psim, Wp, Z), Scalar2_Vector2 1, I_G_Psi0pWZ; (Psi1, Psip, Wm, Z), Scalar2_Vector2 (-1), I_G_Psi0pWZ; (Psi1, Psim, WHp, Z), Scalar2_Vector2 1, I_G_Psi0pWHZ; (Psi1, Psip, WHm, Z), Scalar2_Vector2 (-1), I_G_Psi0pWHZ; (Psi1, Psim, Wp, ZH), Scalar2_Vector2 1, I_G_Psi0pWZH; (Psi1, Psip, Wm, ZH), Scalar2_Vector2 (-1), I_G_Psi0pWZH; (Psi1, Psim, WHp, ZH), Scalar2_Vector2 1, I_G_Psi0pWHZH; (Psi1, Psip, WHm, ZH), Scalar2_Vector2 (-1), I_G_Psi0pWHZH; (Psi1, Psimm, Wp, Wp), Scalar2_Vector2 1, I_G_Psi0ppWW; (Psi1, Psipp, Wm, Wm), Scalar2_Vector2 (-1), I_G_Psi0ppWW; (Psi1, Psimm, WHp, WHp), Scalar2_Vector2 1, I_G_Psi0ppWHWH; (Psi1, Psipp, WHm, WHm), Scalar2_Vector2 (-1), I_G_Psi0ppWHWH; (Psi1, Psimm, WHp, Wp), Scalar2_Vector2 1, I_G_Psi0ppWHW; (Psi1, Psipp, WHm, Wm), Scalar2_Vector2 (-1), I_G_Psi0ppWHW; (Psip, Psim, Wp, Wm), Scalar2_Vector2 4, G_HHWW; (Psip, Psim, WHp, WHm), Scalar2_Vector2 1, G_Psi00ZH; (Psip, Psim, WHp, Wm), Scalar2_Vector2 4, G_HHWHW; (Psip, Psim, Wp, WHm), Scalar2_Vector2 4, G_HHWHW; (Psip, Psim, Z, Z), Scalar2_Vector2 1, G_PsippZZ; (Psip, Psim, Ga, Ga), Scalar2_Vector2 2, G_AAWW; (Psip, Psim, ZH, ZH), Scalar2_Vector2 1, G_PsippZHZH; (Psip, Psim, Ga, Z), Scalar2_Vector2 4, G_PsippAZ; (Psip, Psimm, Wp, Ga), Scalar2_Vector2 1, G_PsippWA; (Psim, Psipp, Wm, Ga), Scalar2_Vector2 1, G_PsippWA; (Psip, Psimm, WHp, Ga), Scalar2_Vector2 1, G_PsippWHA; (Psim, Psipp, WHm, Ga), Scalar2_Vector2 1, G_PsippWHA; (Psip, Psimm, Wp, Z), Scalar2_Vector2 1, G_PsippWZ; (Psim, Psipp, Wm, Z), Scalar2_Vector2 1, G_PsippWZ; (Psip, Psimm, WHp, Z), Scalar2_Vector2 1, G_PsippWHZ; (Psim, Psipp, WHm, Z), Scalar2_Vector2 1, G_PsippWHZ; (Psip, Psimm, Wp, ZH), Scalar2_Vector2 1, G_PsippWZH; (Psim, Psipp, Wm, ZH), Scalar2_Vector2 1, G_PsippWZH; (Psip, Psimm, WHp, ZH), Scalar2_Vector2 1, G_PsippWHZH; (Psim, Psipp, WHm, ZH), Scalar2_Vector2 1, G_PsippWHZH; (Psipp, Psimm, Wp, Wm), Scalar2_Vector2 2, G_HHWW; (Psipp, Psimm, WHp, WHm), Scalar2_Vector2 (-2), G_HHWW; (Psipp, Psimm, WHp, Wm), Scalar2_Vector2 2, G_HHWHW; (Psipp, Psimm, Wp, WHm), Scalar2_Vector2 2, G_HHWHW; (Psipp, Psimm, Z, Z), Scalar2_Vector2 1, G_PsiccZZ; (Psipp, Psimm, Ga, Ga), Scalar2_Vector2 8, G_AAWW; (Psipp, Psimm, ZH, ZH), Scalar2_Vector2 1, G_Psi00ZH; (Psipp, Psimm, Ga, Z), Scalar2_Vector2 1, G_PsiccAZ; (Psipp, Psimm, Z, ZH), Scalar2_Vector2 4, G_PsiccZZH; (Psipp, Psimm, Ga, ZH), Scalar2_Vector2 4, G_PsiccAZH] @ (if Flags.u1_gauged then [(H, H, AH, AH), Scalar2_Vector2 1, G_HHAA; (H, H, AH, Z), Scalar2_Vector2 (-1), G_HHAHZ; (H, H, ZH, AH), Scalar2_Vector2 (-1), G_HHZHAH; (H, Psi0, AH, AH), Scalar2_Vector2 1, G_HPsi0AHAH; (H, Psi0, Z, AH), Scalar2_Vector2 1, G_HPsi0ZAH; (H, Psi0, ZH, AH), Scalar2_Vector2 1, G_HPsi0ZHAH; (H, Psim, Wp, AH), Scalar2_Vector2 1, G_HPsipWAH; (H, Psip, Wm, AH), Scalar2_Vector2 1, G_HPsipWAH; (H, Psim, WHp, AH), Scalar2_Vector2 1, G_HPsipWHAH; (H, Psip, WHm, AH), Scalar2_Vector2 1, G_HPsipWHAH; (Psi0, Psi0, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psi0, Psi0, Z, AH), Scalar2_Vector2 4, G_HHAHZ; (Psi0, Psi0, AH, ZH), Scalar2_Vector2 1, G_Psi00ZHAH; (Psi0, Psim, Wp, AH), Scalar2_Vector2 1, G_Psi0pWAH; (Psi0, Psip, Wm, AH), Scalar2_Vector2 1, G_Psi0pWAH; (Psi0, Psim, WHp, AH), Scalar2_Vector2 1, G_Psi0pWHAH; (Psi0, Psip, WHm, AH), Scalar2_Vector2 1, G_Psi0pWHAH; (Psi1, Psi1, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psi1, Psi1, Z, AH), Scalar2_Vector2 4, G_HHAHZ; (Psi1, Psi1, AH, ZH), Scalar2_Vector2 1, G_Psi00ZHAH; (Psi1, Psim, Wp, AH), Scalar2_Vector2 1, I_G_Psi0pWAH; (Psi1, Psip, Wm, AH), Scalar2_Vector2 (-1), I_G_Psi0pWAH; (Psi1, Psim, WHp, AH), Scalar2_Vector2 1, I_G_Psi0pWHAH; (Psi1, Psip, WHm, AH), Scalar2_Vector2 (-1), I_G_Psi0pWHAH; (Psip, Psim, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psip, Psim, Ga, AH), Scalar2_Vector2 4, G_PsippAAH; (Psip, Psim, Z, AH), Scalar2_Vector2 4, G_PsippZAH; (Psip, Psimm, Wp, AH), Scalar2_Vector2 1, G_PsippWAH; (Psim, Psipp, Wm, AH), Scalar2_Vector2 1, G_PsippWAH; (Psip, Psimm, WHp, AH), Scalar2_Vector2 1, G_PsippWHAH; (Psim, Psipp, WHm, AH), Scalar2_Vector2 1, G_PsippWHAH; (Psipp, Psimm, AH, AH), Scalar2_Vector2 1, G_Psi00AH; (Psipp, Psimm, AH, ZH), Scalar2_Vector2 (-1), G_Psi00ZHAH; (Psipp, Psimm, Ga, AH), Scalar2_Vector2 4, G_PsiccAAH; (Psipp, Psimm, Z, AH), Scalar2_Vector2 4, G_PsiccZAH] else []) let standard_higgs = [ (H, H, H), Scalar_Scalar_Scalar 1, G_H3 ] let anomaly_higgs = [ (Eta, Gl, Gl), Dim5_Scalar_Gauge2_Skew 1, G_EGlGl; (Eta, Ga, Ga), Dim5_Scalar_Gauge2_Skew 1, G_EGaGa; (Eta, Ga, Z), Dim5_Scalar_Gauge2_Skew 1, G_EGaZ] (* @ [ (H, Ga, Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (H, Ga, Z), Dim5_Scalar_Gauge2 1, G_HGaZ ] *) let standard_higgs4 = [ (H, H, H, H), Scalar4 1, G_H4 ] let gauge_higgs = standard_gauge_higgs let gauge_higgs4 = standard_gauge_higgs4 let higgs = standard_higgs let higgs4 = standard_higgs4 let top_quartic = [ ((U (-3), H, H, U 3), GBBG (1, Psibar, S2, Psi), G_HHtt); ((Toppb, H, H, Topp), GBBG (1, Psibar, S2, Psi), G_HHthth); ((U (-3), H, H, Topp), GBBG (1, Psibar, S2LR, Psi), G_HHtht); ((Toppb, H, H, U 3), GBBG (1, Psibar, S2LR, Psi), G_HHtht)] let goldstone_vertices = [ ((Phi0, Wm, Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((Phip, Ga, Wm), Scalar_Vector_Vector 1, I_Q_W); ((Phip, Z, Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((Phim, Wp, Ga), Scalar_Vector_Vector 1, I_Q_W); ((Phim, Wp, Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_heavy_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ ThoList.flatmap quark_currents [1;2] @ heavy_top_currents @ (if Flags.u1_gauged then [] else anomaly_higgs) @ yukawa @ yukawa_add @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 @ top_quartic let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> L 1 | "e+" -> L (-1) | "mu-" -> L 2 | "mu+" -> L (-2) | "tau-" -> L 3 | "tau+" -> L (-3) | "nue" -> N 1 | "nuebar" -> N (-1) | "numu" -> N 2 | "numubar" -> N (-2) | "nutau" -> N 3 | "nutaubar" -> N (-3) | "u" -> U 1 | "ubar" -> U (-1) | "c" -> U 2 | "cbar" -> U (-2) | "t" -> U 3 | "tbar" -> U (-3) | "d" -> D 1 | "dbar" -> D (-1) | "s" -> D 2 | "sbar" -> D (-2) | "b" -> D 3 | "bbar" -> D (-3) | "tp" -> Topp | "tpbar" -> Toppb | "g" -> Gl | "A" -> Ga | "Z" | "Z0" -> Z | "AH" | "AH0" | "Ah" | "Ah0" -> AH | "ZH" | "ZH0" | "Zh" | "Zh0" -> ZH | "W+" -> Wp | "W-" -> Wm | "WH+" -> WHp | "WH-" -> WHm | "H" | "h" -> H | "eta" | "Eta" -> Eta | "Psi" | "Psi0" | "psi" | "psi0" -> Psi0 | "Psi1" | "psi1" -> Psi1 | "Psi+" | "psi+" | "Psip" | "psip" -> Psip | "Psi-" | "psi-" | "Psim" | "psim" -> Psim | "Psi++" | "psi++" | "Psipp" | "psipp" -> Psipp | "Psi--" | "psi--" | "Psimm" | "psimm" -> Psimm | _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_of_string" let flavor_to_string = function | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | Lodd 1 -> "l1odd-" | Lodd (-1) -> "l1odd+" | Lodd 2 -> "l2odd-" | Lodd (-2) -> "l2odd+" | Lodd 3 -> "l3odd-" | Lodd (-3) -> "l3odd+" | Lodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | Nodd 1 -> "n1odd" | Nodd (-1) -> "n1oddbar" | Nodd 2 -> "n2odd" | Nodd (-2) -> "n2oddbar" | Nodd 3 -> "n3odd" | Nodd (-3) -> "n3oddbar" | Nodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | Uodd 1 -> "uodd" | Uodd (-1) -> "uoddbar" | Uodd 2 -> "codd" | Uodd (-2) -> "coddbar" | Uodd 3 -> "t1odd" | Uodd (-3) -> "t1oddbar" | Uodd 4 -> "t2odd" | Uodd (-4) -> "t2oddbar" | Uodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | Dodd 1 -> "dodd" | Dodd (-1) -> "doddbar" | Dodd 2 -> "sodd" | Dodd (-2) -> "soddbar" | Dodd 3 -> "bodd" | Dodd (-3) -> "boddbar" | Dodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_string" | Topp -> "tp" | Toppb -> "tpbar" | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | ZH -> "ZH" | AH -> "AH" | WHp -> "WHp" | WHm -> "WHm" | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Eta -> "Eta" | Psi0 -> "Psi0" | Psi1 -> "Psi1" | Psip -> "Psi+" | Psim -> "Psi-" | Psipp -> "Psi++" | Psimm -> "Psi--" let flavor_to_TeX = function | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | Lodd 1 -> "L_1^-" | Lodd (-1) -> "L_1^+" | Lodd 2 -> "L_2^-" | Lodd (-2) -> "L_2^+" | Lodd 3 -> "L_3^-" | Lodd (-3) -> "L_3^+" | Lodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | Nodd 1 -> "N_1" | Nodd (-1) -> "\\bar{N}_1" | Nodd 2 -> "N_2" | Nodd (-2) -> "\\bar{N}_2" | Nodd 3 -> "N_3" | Nodd (-3) -> "\\bar{N}_3" | Nodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | Uodd 1 -> "U" | Uodd (-1) -> "\\bar{U}" | Uodd 2 -> "C" | Uodd (-2) -> "\\bar{C}" | Uodd 3 -> "T_1" | Uodd (-3) -> "\\bar{T}_1" | Uodd 4 -> "T_2" | Uodd (-4) -> "\\bar{T}_2" | Uodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | Dodd 1 -> "D" | Dodd (-1) -> "\\bar{D}" | Dodd 2 -> "S" | Dodd (-2) -> "\\bar{S}" | Dodd 3 -> "B" | Dodd (-3) -> "\\bar{B}" | Dodd _ -> invalid_arg "Modellib_BSM.Littlest_Tpar.flavor_to_TeX" | Topp -> "T^\\prime" | Toppb -> "\\bar{T}^\\prime" | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | ZH -> "Z_H" | AH -> "\\gamma_H" | WHp -> "W_H^+" | WHm -> "W_H^-" | Phip -> "\\Phi^+" | Phim -> "\\Phi^-" | Phi0 -> "\\Phi^0" | H -> "H" | Eta -> "\\eta" | Psi0 -> "\\Psi_S" | Psi1 -> "\\Psi_P" | Psip -> "\\Psi^+" | Psim -> "\\Psi^-" | Psipp -> "\\Psi^{++}" | Psimm -> "\\Psi^{--}" let flavor_symbol = function | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | Lodd n when n > 0 -> "lodd" ^ string_of_int n | Lodd n -> "lodd" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | Nodd n when n > 0 -> "nodd" ^ string_of_int n | Nodd n -> "nodd" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" | Uodd n when n > 0 -> "uodd" ^ string_of_int n | Uodd n -> "uodd" ^ string_of_int (abs n) ^ "b" | Dodd n when n > 0 -> "dodd" ^ string_of_int n | Dodd n -> "dodd" ^ string_of_int (abs n) ^ "b" | Topp -> "tp" | Toppb -> "tpb" | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | ZH -> "zh" | AH -> "ah" | WHp -> "whp" | WHm -> "whm" | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Eta -> "eta" | Psi0 -> "psi0" | Psi1 -> "psi1" | Psip -> "psip" | Psim -> "psim" | Psipp -> "psipp" | Psimm -> "psimm" (* There are PDG numbers for Z', Z'', W', 32-34, respectively. We just introduce a number 38 for Y0 as a Z'''. As well, there is the number 8 for a t'. But we cheat a little bit and take the number 35 which is reserved for a heavy scalar Higgs for the Eta scalar. For the heavy Higgs states we take 35 and 36 for the neutral ones, 37 for the charged and 38 for the doubly-charged. The pseudoscalar gets the 39. For the odd fermions we add 40 to the values for the SM particles. *) let pdg = function | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n | Lodd n when n > 0 -> 49 + 2*n | Lodd n -> - 49 + 2*n | Nodd n when n > 0 -> 50 + 2*n | Nodd n -> - 50 + 2*n | Uodd n when n > 0 -> 40 + 2*n | Uodd n -> -40 + 2*n | Dodd n when n > 0 -> 39 + 2*n | Dodd n -> -39 + 2*n | Topp -> 8 | Toppb -> (-8) | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | AH -> 32 | ZH -> 33 | WHp -> 34 | WHm -> (-34) | Phip | Phim -> 27 | Phi0 -> 26 | Psi0 -> 35 | Psi1 -> 36 | Psip -> 37 | Psim -> (-37) | Psipp -> 38 | Psimm -> (-38) | H -> 25 | Eta -> 39 let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | VHeavy -> "vheavy" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Sinpsi -> "sinpsi" | Cospsi -> "cospsi" | Atpsi -> "atpsi" | Sccs -> "sccs" | Supp -> "vF" | Supp2 -> "v2F2" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_Z_up -> "qzup" | G_ZHTHT -> "gzhtht" | G_ZTHT -> "gztht" | G_AHTHTH -> "gahthth" | G_AHTHT -> "gahtht" | G_AHTT -> "gahtt" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCtop -> "gcctop" | G_CC_heavy -> "gcch" | G_CC_WH -> "gccwh" | G_CC_W -> "gccw" | G_NC_h_lepton -> "gnchlep" | G_NC_h_neutrino -> "gnchneu" | G_NC_h_up -> "gnchup" | G_NC_h_down -> "gnchdwn" | G_NC_heavy -> "gnch" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_G_WWW -> "igwww" | I_G_AHWW -> "igahww" | I_G_ZHWW -> "igzhww" | I_G_ZWHW -> "igzwhw" | I_G_AHWHWH -> "igahwhwh" | I_G_ZHWHWH -> "igzhwhwh" | I_G_AHWHW -> "igahwhw" | I_Q_H -> "iqh" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_WH4 -> "gwh4" | G_WHWHWW -> "gwhwhww" | G_WHWWW -> "gwhwww" | G_WH3W -> "gwh3w" | G_WWAAH -> "gwwaah" | G_WWAZH -> "gwwazh" | G_WWZZH -> "gwwzzh" | G_WWZAH -> "gwwzah" | G_WHWHAAH -> "gwhwhaah" | G_WHWHAZH -> "gwhwhazh" | G_WHWHZZH -> "gwhwhzzh" | G_WHWHZAH -> "gwhwhzah" | G_WWZHAH -> "gwwzhah" | G_WHWHZHAH -> "gwhwhzhah" | G_WHWZZ -> "gwhwzz" | G_WHWAZ -> "gwhwaz" | G_WHWAAH -> "gwhwaah" | G_WHWZAH -> "gwhwzah" | G_WHWZHZH -> "gwhwzhzh" | G_WHWZHAH -> "gwhwzhah" | G_WHWAZH -> "gwhwazh" | G_WHWZZH -> "gwhwzzh" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_HWHW -> "ghwhw" | G_HWHWH -> "ghwhwh" | G_HAHAH -> "ghahah" | G_HZHZ -> "ghzhz" | G_HZHAH -> "ghzhah" | G_HAHZ -> "ghahz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hthth -> "ghthth" | G_Htht -> "ghtht" | G_HHtt -> "ghhtt" | G_HHthth -> "ghhthth" | G_HHtht -> "ghhtht" | G_Psi0tt -> "gpsi0tt" | G_Psi0bb -> "gpsi0bb" | G_Psi0cc -> "gpsi0cc" | G_Psi0tautau -> "gpsi0tautau" | G_Psi1tt -> "gpsi1tt" | G_Psi1bb -> "gpsi1bb" | G_Psi1cc -> "gpsi1cc" | G_Psi1tautau -> "gpsi1tautau" | G_Psipq3 -> "gpsipq3" | G_Psipq2 -> "gpsipq2" | G_Psipl3 -> "gpsipl3" | G_Psi0tth -> "gpsi0tth" | G_Psi1tth -> "gpsi1tth" | G_Psipbth -> "gpsipbth" | G_Ethth -> "gethth" | G_Etht -> "getht" | G_Ett -> "gett" | G_Ebb -> "gebb" | G_HGaGa -> "ghgaga" | G_HGaZ -> "ghgaz" | G_EGaGa -> "geaa" | G_EGaZ -> "geaz" | G_EGlGl -> "gegg" | G_H3 -> "gh3" | G_H4 -> "gh4" | G_PsiWW -> "gpsiww" | G_PsiWHW -> "gpsiwhw" | G_PsiZZ -> "gpsizz" | G_PsiZHZH -> "gpsizhzh" | G_PsiZHZ -> "gpsizhz" | G_PsiZAH -> "gpsizah" | G_PsiZHAH -> "gpsizhah" | G_PsiAHAH -> "gpsiahah" | G_PsiZW -> "gpsizw" | G_PsiZWH -> "gpsizwh" | G_PsiAHW -> "gpsiahw" | G_PsiAHWH -> "gpsiahwh" | G_PsiZHW -> "gpsizhw" | G_PsiZHWH -> "gpsizhwh" | G_PsippWW -> "gpsippww" | G_PsippWHW -> "gpsippwhw" | G_PsippWHWH -> "gpsippwhwh" | G_PsiHW -> "gpsihw" | G_PsiHWH -> "gpsihwh" | G_Psi0W -> "gpsi0w" | G_Psi0WH -> "gpsi0wh" | G_Psi1W -> "gpsi1w" | G_Psi1WH -> "gpsi1wh" | G_PsiPPW -> "gpsippw" | G_PsiPPWH -> "gpsippwh" | G_Psi1HAH -> "gpsihah" | G_Psi01AH -> "gpsi0ah" | G_AHPsip -> "gahpsip" | G_Psi1HZ -> "gpsi1hz" | G_Psi1HZH -> "gpsi1hzh" | G_Psi01Z -> "gpsi01z" | G_Psi01ZH -> "gpsi01zh" | G_ZPsip -> "gzpsip" | G_ZPsipp -> "gzpsipp" | G_ZHPsipp -> "gzhpsipp" | G_HHAA -> "ghhaa" | G_HHWHW -> "ghhwhw" | G_HHZHZ -> "ghhzhz" | G_HHAHZ -> "ghhahz" | G_HHZHAH -> "ghhzhah" | G_HPsi0WW -> "ghpsi0ww" | G_HPsi0WHW -> "ghpsi0whw" | G_HPsi0ZZ -> "ghpsi0zz" | G_HPsi0ZHZH -> "ghpsi0zhzh" | G_HPsi0ZHZ -> "ghpsi0zhz" | G_HPsi0AHAH -> "ghpsi0ahah" | G_HPsi0ZAH -> "ghpsi0zah" | G_HPsi0ZHAH -> "ghpsi0zhah" | G_HPsipWA -> "ghpsipwa" | G_HPsipWHA -> "ghpsipwha" | G_HPsipWZ -> "ghpsipwz" | G_HPsipWHZ -> "ghpsiwhz" | G_HPsipWAH -> "ghpsipwah" | G_HPsipWHAH -> "ghpsipwhah" | G_HPsipWZH -> "ghpsipwzh" | G_HPsipWHZH -> "ghpsipwhzh" | G_HPsippWW -> "ghpsippww" | G_HPsippWHWH -> "ghpsippwhwh" | G_HPsippWHW -> "ghpsippwhw" | G_Psi00ZH -> "gpsi00zh" | G_Psi00AH -> "gpsi00ah" | G_Psi00ZHAH -> "gpsi00zhah" | G_Psi0pWA -> "gpsi0pwa" | G_Psi0pWHA -> "gpsi0pwha" | G_Psi0pWZ -> "gpsi0pwz" | G_Psi0pWHZ -> "gpsi0pwhz" | G_Psi0pWAH -> "gpsi0pwah" | G_Psi0pWHAH -> "gpsi0pwhah" | G_Psi0pWZH -> "gpsi0pwzh" | G_Psi0pWHZH -> "gpsi0pwhzh" | G_Psi0ppWW -> "gpsi0ppww" | G_Psi0ppWHWH -> "gpsi0ppwhwh" | G_Psi0ppWHW -> "gpsi0ppwhw" | I_G_Psi0pWA -> "i_gpsi0pwa" | I_G_Psi0pWHA -> "i_gpsi0pwha" | I_G_Psi0pWZ -> "i_gpsi0pwz" | I_G_Psi0pWHZ -> "i_gpsi0pwhz" | I_G_Psi0pWAH -> "i_gpsi0pwah" | I_G_Psi0pWHAH -> "i_gpsi0pwhah" | I_G_Psi0pWZH -> "i_gpsi0pwzh" | I_G_Psi0pWHZH -> "i_gpsi0pwhzh" | I_G_Psi0ppWW -> "i_gpsi0ppww" | I_G_Psi0ppWHWH -> "i_gpsi0ppwhwh" | I_G_Psi0ppWHW -> "i_gpsi0ppwhw" | G_PsippZZ -> "gpsippzz" | G_PsippZHZH -> "gpsippzhzh" | G_PsippAZ -> "gpsippaz" | G_PsippAAH -> "gpsippaah" | G_PsippZAH -> "gpsippzah" | G_PsippWA -> "gpsippwa" | G_PsippWHA -> "gpsippwha" | G_PsippWZ -> "gpsippwz" | G_PsippWHZ -> "gpsippwhz" | G_PsippWAH -> "gpsippwah" | G_PsippWHAH -> "gpsippwhah" | G_PsippWZH -> "gpsippwzh" | G_PsippWHZH -> "gpsippwhzh" | G_PsiccZZ -> "gpsicczz" | G_PsiccAZ -> "gpsiccaz" | G_PsiccAAH -> "gpsiccaah" | G_PsiccZZH -> "gpsicczzh" | G_PsiccAZH -> "gpsiccazh" | G_PsiccZAH -> "gpsicczah" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module Simplest (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] (* We do not introduce the Goldstones for the heavy vectors here. The heavy quarks are simply numerated by their generation, the assignments whether they are up- or down-type will be defined by the model. *) type flavor = L of int | N of int | U of int | D of int | QH of int | NH of int | Wp | Wm | Ga | Z | Xp | Xm | X0 | Y0 | ZH | Phip | Phim | Phi0 | H | Eta | Gl type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.Simplest.gauge_symbol: internal error" let family n = [ L n; N n; U n; D n; QH n; NH n ] (* Note that we add all heavy quarks, [U], [D], [C], [S], in order to have both embeddings included. *) let external_flavors () = [ "1st Generation (incl. heavy)", ThoList.flatmap family [1; -1]; "2nd Generation (incl. heavy)", ThoList.flatmap family [2; -2]; "3rd Generation (incl. heavy)", ThoList.flatmap family [3; -3]; "Gauge Bosons", [Ga; Z; Wp; Wm; Gl; Xp; Xm; X0; Y0; ZH]; "Higgs", [H; Eta]; "Goldstone Bosons", [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n | QH n -> spinor n | NH n -> spinor n | Ga | Gl -> Vector | Wp | Wm | Z | Xp | Xm | X0 | Y0 | ZH -> Massive_Vector | _ -> Scalar let color = function | U n -> Color.SUN (if n > 0 then 3 else -3) | D n -> Color.SUN (if n > 0 then 3 else -3) | QH n -> Color.SUN (if n > 0 then 3 else -3) | Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n | QH n -> prop_spinor n | NH n -> prop_spinor n | Ga | Gl -> Prop_Feynman | Wp | Wm | Z | Xp | Xm | X0 | Y0 | ZH -> Prop_Unitarity | Phip | Phim | Phi0 -> Only_Insertion | H | Eta -> Prop_Scalar (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | Wp | Wm | U 3 | U (-3) | QH _ | NH _ -> Fudged | _ -> !default_width else !default_width let goldstone = function | Wp -> Some (Phip, Coupling.Integer 1) | Wm -> Some (Phim, Coupling.Integer 1) | Z -> Some (Phi0, Coupling.Integer 1) | _ -> None let conjugate = function | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) | QH n -> QH (-n) | NH n -> NH (-n) | Ga -> Ga | Gl -> Gl | Z -> Z | Wp -> Wm | Wm -> Wp | Xp -> Xm | Xm -> Xp | X0 -> X0 | Y0 -> Y0 | ZH -> ZH | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Eta -> Eta let fermion = function | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 | QH n -> if n > 0 then 1 else -1 | NH n -> if n > 0 then 1 else -1 | Ga | Gl | Z | Wp | Wm | Xp | Xm | X0 | Y0 | ZH -> 0 | _ -> 0 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let charge = function | L n -> if n > 0 then -1//1 else 1//1 | N n | NH n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | QH 3 -> 2//3 | QH (-3) -> -2//3 | QH (1|2) -> if Flags.anom_ferm_ass then 2//3 else -1//3 | QH ((-1)|(-2)) -> if Flags.anom_ferm_ass then -2//3 else 1//3 | QH n -> invalid_arg ("Simplest.charge: QH " ^ string_of_int n) | D n -> if n > 0 then -1//3 else 1//3 | Gl | Ga | Z | ZH | X0 | Y0 -> 0//1 | Wp | Xp -> 1//1 | Wm | Xm -> -1//1 | H | Phi0 | Eta -> 0//1 | Phip -> 1//1 | Phim -> -1//1 let lepton = function | L n | N n | NH n -> if n > 0 then 1//1 else -1//1 | U _ | D _ | _ -> 0//1 let baryon = function | L _ | N _ -> 0//1 | U n | D n | QH n -> if n > 0 then 1//1 else -1//1 | _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | VHeavy | Supp | Supp2 | Sinpsi | Cospsi | Atpsi | Sccs (* Mixing angles of SU(2) *) | Q_lepton | Q_up | Q_down | Q_Z_up | G_CC | I_G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_NC_X | G_NC_X_t | G_NC_Y | G_NC_Y_t | G_NC_H | G_NC_h_neutrino | G_NC_h_lepton | G_NC_h_up | G_NC_h_down | G_NC_h_top | G_NC_h_bot | G_NCH_N | G_NCH_U | G_NCH_D | G_NCHt | G_zhthth | I_Q_W | I_G_ZWW | I_G_WWW | I_G_Z1 | I_G_Z2 | I_G_Z3 | I_G_Z4 | I_G_Z5 | I_G_Z6 | I_Q_H | Gs | I_Gs | G2 | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | I_Q_ZH | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_HHZZH | G_heavy_HVV | G_heavy_HWW | G_heavy_HZZ | G_HHthth | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | G_Hthth | G_Htht | G_Ethth | G_Etht | G_Ett | G_Hqhq | G_Ebb | G_ZEH | G_ZHEH | G_Hgg | G_HGaGa | G_HGaZ | G_EGaGa | G_EGaZ | G_EGlGl | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) (* \begin{dubious} The current abstract syntax for parameter dependencies is admittedly tedious. Later, there will be a parser for a convenient concrete syntax as a part of a concrete syntax for models. But as these examples show, it should include simple functions. \end{dubious} *) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)); nc_coupling G_NC_h_neutrino half (Integer 0); nc_coupling G_NC_h_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_h_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_h_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let electromagnetic_currents n = [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = [ ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs); ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((QH (-n), Gl, QH n), FBF ((-1), Psibar, V, Psi), Gs)] let neutral_currents n = [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let xy_currents = ThoList.flatmap (fun n -> [ ((N (-n), X0, N n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((L (-n), Xm, N n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((N (-n), Xp, L n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((N (-n), Y0, N n), FBF ((-1), Psibar, VL, Psi), G_NC_Y); ((NH (-n), X0, N n), FBF ((-1), Psibar, VL, Psi), G_CC); ((N (-n), X0, NH n), FBF ((-1), Psibar, VL, Psi), G_CC); ((NH (-n), Y0, N n), FBF ((-1), Psibar, VL, Psi), I_G_CC); ((N (-n), Y0, NH n), FBF ((-1), Psibar, VL, Psi), I_G_CC); ((L (-n), Xm, NH n), FBF ((-1), Psibar, VL, Psi), G_CC); ((NH (-n), Xp, L n), FBF ((-1), Psibar, VL, Psi), G_CC)]) [1;2;3] @ [ ((U (-3), X0, U 3), FBF (1, Psibar, VL, Psi), G_NC_X_t); ((U (-3), Y0, U 3), FBF (1, Psibar, VL, Psi), G_NC_Y_t); ((U (-3), X0, QH 3), FBF (1, Psibar, VL, Psi), G_CC); ((QH (-3), X0, U 3), FBF (1, Psibar, VL, Psi), G_CC); ((U (-3), Y0, QH 3), FBF (1, Psibar, VL, Psi), I_G_CC); ((QH (-3), Y0, U 3), FBF (1, Psibar, VL, Psi), I_G_CC); ((D (-3), Xm, U 3), FBF (1, Psibar, VL, Psi), G_NC_X_t); ((U (-3), Xp, D 3), FBF (1, Psibar, VL, Psi), G_NC_X_t); ((D (-3), Xm, QH 3), FBF (1, Psibar, VL, Psi), G_CC); ((QH (-3), Xp, D 3), FBF (1, Psibar, VL, Psi), G_CC); ((QH (-3), Wp, D 3), FBF (1, Psibar, VL, Psi), G_NC_X_t); ((D (-3), Wm, QH 3), FBF (1, Psibar, VL, Psi), G_NC_X_t); ((QH (-3), Z, U 3), FBF (1, Psibar, VL, Psi), G_NCHt); ((U (-3), Z, QH 3), FBF (1, Psibar, VL, Psi), G_NCHt)] @ ThoList.flatmap (fun n -> if Flags.anom_ferm_ass then [ ((U (-n), X0, U n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((U (-n), Y0, U n), FBF ((-1), Psibar, VL, Psi), G_NC_Y); ((D (-n), Xm, U n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((U (-n), Xp, D n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((QH (-n), X0, U n), FBF ((-1), Psibar, VL, Psi), G_CC); ((U (-n), X0, QH n), FBF ((-1), Psibar, VL, Psi), G_CC); ((QH (-n), Y0, U n), FBF ((-1), Psibar, VL, Psi), I_G_CC); ((U (-n), Y0, QH n), FBF ((-1), Psibar, VL, Psi), I_G_CC); ((D (-n), Xm, QH n), FBF ((-1), Psibar, VL, Psi), G_CC); ((QH (-n), Xp, D n), FBF ((-1), Psibar, VL, Psi), G_CC); ((QH (-n), Wp, D n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((D (-n), Wm, QH n), FBF ((-1), Psibar, VL, Psi), G_NC_X); ((QH (-n), Z, U n), FBF (1, Psibar, VL, Psi), G_NC_H); ((U (-n), Z, QH n), FBF (1, Psibar, VL, Psi), G_NC_H)] else [ ((D (-n), X0, D n), FBF (1, Psibar, VL, Psi), G_NC_X); ((D (-n), Y0, D n), FBF (1, Psibar, VL, Psi), G_NC_Y); ((D (-n), Xm, U n), FBF (1, Psibar, VL, Psi), G_NC_X); ((U (-n), Xp, D n), FBF (1, Psibar, VL, Psi), G_NC_X); ((QH (-n), X0, D n), FBF ((-1), Psibar, VL, Psi), G_CC); ((D (-n), X0, QH n), FBF ((-1), Psibar, VL, Psi), G_CC); ((QH (-n), Y0, D n), FBF ((-1), Psibar, VL, Psi), I_G_CC); ((D (-n), Y0, QH n), FBF ((-1), Psibar, VL, Psi), I_G_CC); ((QH (-n), Xm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Xp, QH n), FBF (1, Psibar, VL, Psi), G_CC); ((QH (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_NC_X); ((U (-n), Wp, QH n), FBF (1, Psibar, VL, Psi), G_NC_X); ((QH (-n), Z, D n), FBF (1, Psibar, VL, Psi), G_NC_H); ((D (-n), Z, QH n), FBF (1, Psibar, VL, Psi), G_NC_H)]) [1; 2] (* The sign of this coupling is just the one of the T3, being -(1/2) for leptons and down quarks, and +(1/2) for neutrinos and up quarks. *) let neutral_heavy_currents n = [ ((L (-n), ZH, L n), FBF (1, Psibar, VLR, Psi), G_NC_h_lepton); ((N (-n), ZH, N n), FBF ((-1), Psibar, VLR, Psi), G_NC_h_neutrino); ((U (-n), ZH, U n), FBF ((-1), Psibar, VLR, Psi), (if n = 3 then G_NC_h_top else G_NC_h_up)); ((D (-n), ZH, D n), FBF (1, Psibar, VLR, Psi), (if n = 3 then G_NC_h_bot else G_NC_h_down)); ((NH (-n), ZH, NH n), FBF (1, Psibar, VLR, Psi), G_NCH_N); ((QH (-n), ZH, QH n), FBF (1, Psibar, VLR, Psi), (if n = 3 then G_NCH_U else if Flags.anom_ferm_ass then G_NCH_U else G_NCH_D))] let heavy_currents n = [ ((QH (-n), Ga, QH n), FBF (1, Psibar, V, Psi), (if n=3 then Q_up else if Flags.anom_ferm_ass then Q_up else Q_down))] let charged_currents n = [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = [ ((U (-3), H, U 3), FBF (1, Psibar, S, Psi), G_Htt); ((D (-3), H, D 3), FBF (1, Psibar, S, Psi), G_Hbb); ((U (-2), H, U 2), FBF (1, Psibar, S, Psi), G_Hcc); ((L (-3), H, L 3), FBF (1, Psibar, S, Psi), G_Htautau) ] let yukawa_add = [ ((QH (-3), H, U 3), FBF (1, Psibar, SL, Psi), G_Htht); ((U (-3), H, QH 3), FBF (1, Psibar, SR, Psi), G_Htht); ((QH (-3), Eta, U 3), FBF (1, Psibar, SR, Psi), G_Etht); ((U (-3), Eta, QH 3), FBF (1, Psibar, SL, Psi), G_Etht); ((D (-3), Eta, D 3), FBF (1, Psibar, P, Psi), G_Ebb); ((U (-3), Eta, U 3), FBF (1, Psibar, P, Psi), G_Ett)] @ ThoList.flatmap (fun n -> if Flags.anom_ferm_ass then [ ((QH (-n), H, U n), FBF (1, Psibar, SL, Psi), G_Hqhq); ((U (-n), H, QH n), FBF (1, Psibar, SR, Psi), G_Hqhq)] else [ ((QH (-n), H, D n), FBF (1, Psibar, SL, Psi), G_Hqhq); ((D (-n), H, QH n), FBF (1, Psibar, SR, Psi), G_Hqhq)]) [1;2] let standard_triple_gauge = [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] let heavy_triple_gauge = [ ((Ga, Xm, Xp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Xm, Xp), Gauge_Gauge_Gauge 1, I_Q_ZH); ((Z, X0, Y0), Gauge_Gauge_Gauge 1, I_G_Z1); ((ZH, X0, Y0), Gauge_Gauge_Gauge 1, I_G_Z2); ((Y0, Wm, Xp), Gauge_Gauge_Gauge 1, I_G_Z3); ((Y0, Wp, Xm), Gauge_Gauge_Gauge (-1), I_G_Z3); ((X0, Wm, Xp), Gauge_Gauge_Gauge 1, I_G_Z4); ((X0, Wp, Xm), Gauge_Gauge_Gauge 1, I_G_Z4); ((ZH, Xm, Xp), Gauge_Gauge_Gauge 1, I_G_Z5); ((ZH, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_Z6)] let triple_gauge = standard_triple_gauge @ heavy_triple_gauge let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2] let heavy_quartic_gauge = [] let quartic_gauge = standard_quartic_gauge @ heavy_quartic_gauge let standard_gauge_higgs' = [ ((H, Wp, Wm), Scalar_Vector_Vector 1, G_HWW); ((H, Z, Z), Scalar_Vector_Vector 1, G_HZZ) ] let heavy_gauge_higgs = [ ((H, Wp, Xm), Scalar_Vector_Vector 1, G_heavy_HWW); ((H, Wm, Xp), Scalar_Vector_Vector 1, G_heavy_HWW); ((H, Z, X0), Scalar_Vector_Vector 1, G_heavy_HVV); ((H, ZH, X0), Scalar_Vector_Vector 1, G_heavy_HVV)] let standard_gauge_higgs = standard_gauge_higgs' @ heavy_gauge_higgs let standard_gauge_higgs4 = [ (H, H, Wp, Wm), Scalar2_Vector2 1, G_HHWW; (H, H, Z, Z), Scalar2_Vector2 1, G_HHZZ ] let heavy_gauge_higgs4 = [ (H, H, Z, ZH), Scalar2_Vector2 1, G_HHZZH; (H, H, Xp, Xm), Scalar2_Vector2 (-1), G_HHWW; (H, H, ZH, ZH), Scalar2_Vector2 (-1), G_HHZZ ] let standard_higgs = [ (H, H, H), Scalar_Scalar_Scalar 1, G_H3 ] let anomaly_higgs = [ (Eta, Gl, Gl), Dim5_Scalar_Gauge2_Skew 1, G_EGlGl; (Eta, Ga, Ga), Dim5_Scalar_Gauge2_Skew 1, G_EGaGa; (Eta, Ga, Z), Dim5_Scalar_Gauge2_Skew 1, G_EGaZ ] (* @ [ (H, Ga, Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (H, Ga, Z), Dim5_Scalar_Gauge2 1, G_HGaZ ] *) let standard_higgs4 = [ (H, H, H, H), Scalar4 1, G_H4 ] let gauge_higgs = standard_gauge_higgs let gauge_higgs4 = standard_gauge_higgs4 @ heavy_gauge_higgs4 let higgs = standard_higgs let eta_higgs_gauge = [ (Z, Eta, H), Vector_Scalar_Scalar 1, G_ZEH; (ZH, Eta, H), Vector_Scalar_Scalar 1, G_ZHEH; (X0, Eta, H), Vector_Scalar_Scalar 1, G_CC ] let top_quartic = [ ((QH (-3), H, H, QH 3), GBBG (1, Psibar, S2, Psi), G_HHthth)] let higgs4 = standard_higgs4 let goldstone_vertices = [ ((Phi0, Wm, Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((Phip, Ga, Wm), Scalar_Vector_Vector 1, I_Q_W); ((Phip, Z, Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((Phim, Wp, Ga), Scalar_Vector_Vector 1, I_Q_W); ((Phim, Wp, Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap neutral_heavy_currents [1;2;3] @ ThoList.flatmap heavy_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ xy_currents @ anomaly_higgs @ eta_higgs_gauge @ yukawa @ yukawa_add @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> L 1 | "e+" -> L (-1) | "mu-" -> L 2 | "mu+" -> L (-2) | "tau-" -> L 3 | "tau+" -> L (-3) | "nue" -> N 1 | "nuebar" -> N (-1) | "numu" -> N 2 | "numubar" -> N (-2) | "nutau" -> N 3 | "nutaubar" -> N (-3) | "nh1" -> NH 1 | "nh1bar" -> NH (-1) | "nh2" -> NH 2 | "nh2bar" -> NH (-2) | "nh3" -> NH 3 | "nh3bar" -> NH (-3) | "u" -> U 1 | "ubar" -> U (-1) | "c" -> U 2 | "cbar" -> U (-2) | "t" -> U 3 | "tbar" -> U (-3) | "d" -> D 1 | "dbar" -> D (-1) | "s" -> D 2 | "sbar" -> D (-2) | "b" -> D 3 | "bbar" -> D (-3) | "uh" -> if Flags.anom_ferm_ass then QH 1 else invalid_arg "Modellib_BSM.Simplest.flavor_of_string" | "dh" -> if Flags.anom_ferm_ass then invalid_arg "Modellib_BSM.Simplest.flavor_of_string" else QH 1 | "uhbar" -> if Flags.anom_ferm_ass then QH (-1) else invalid_arg "Modellib_BSM.Simplest.flavor_of_string" | "dhbar" -> if Flags.anom_ferm_ass then invalid_arg "Modellib_BSM.Simplest.flavor_of_string" else QH (-1) | "ch" -> if Flags.anom_ferm_ass then QH 2 else invalid_arg "Modellib_BSM.Simplest.flavor_of_string" | "sh" -> if Flags.anom_ferm_ass then invalid_arg "Modellib_BSM.Simplest.flavor_of_string" else QH 2 | "chbar" -> if Flags.anom_ferm_ass then QH (-2) else invalid_arg "Modellib_BSM.Simplest.flavor_of_string" | "shbar" -> if Flags.anom_ferm_ass then invalid_arg "Modellib_BSM.Simplest.flavor_of_string" else QH (-2) | "th" -> QH 3 | "thbar" -> QH (-3) | "eta" | "Eta" -> Eta | "A" -> Ga | "Z" | "Z0" -> Z | "g" | "gl" -> Gl | "ZH" | "ZH0" | "Zh" | "Zh0" -> ZH | "W+" -> Wp | "W-" -> Wm | "X+" -> Xp | "X-" -> Xm | "X0" -> X0 | "Y0" -> Y0 | "H" -> H | _ -> invalid_arg "Modellib_BSM.Simplest.flavor_of_string" let flavor_to_string = function | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_string: invalid down type quark" | QH 1 -> if Flags.anom_ferm_ass then "uh" else "dh" | QH 2 -> if Flags.anom_ferm_ass then "ch" else "sh" | QH 3 -> "th" | QH (-1) -> if Flags.anom_ferm_ass then "uhbar" else "dhbar" | QH (-2) -> if Flags.anom_ferm_ass then "chbar" else "shbar" | QH (-3) -> "thbar" | QH _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_string: invalid heavy quark" | NH n when n > 0 -> "nh" ^ string_of_int n | NH n -> "nh" ^ string_of_int (abs n) ^ "bar" | Ga -> "A" | Z -> "Z" | Gl -> "gl" | Wp -> "W+" | Wm -> "W-" | Xp -> "X+" | Xm -> "X-" | X0 -> "X0" | Y0 -> "Y0" | ZH -> "ZH" | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Eta -> "Eta" let flavor_to_TeX = function | L 1 -> "e^-" | L (-1) -> "\\e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_TeX: invalid down type quark" | QH 1 -> if Flags.anom_ferm_ass then "U" else "D" | QH 2 -> if Flags.anom_ferm_ass then "C" else "S" | QH 3 -> "T" | QH (-1) -> if Flags.anom_ferm_ass then "\\bar{U}" else "\\bar{D}" | QH (-2) -> if Flags.anom_ferm_ass then "\\bar{C}" else "\\bar{S}" | QH (-3) -> "thbar" | QH _ -> invalid_arg "Modellib_BSM.Simplest.flavor_to_TeX: invalid heavy quark" | NH n when n > 0 -> "N_" ^ string_of_int n | NH n -> "\\bar{N}_" ^ string_of_int (abs n) | Ga -> "\\gamma" | Z -> "Z" | Gl -> "g" | Wp -> "W^+" | Wm -> "W^-" | Xp -> "X^+" | Xm -> "X^-" | X0 -> "X^0" | Y0 -> "Y^0" | ZH -> "Z_H" | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | Eta -> "\\eta" let flavor_symbol = function | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" | NH n when n > 0 -> "nh" ^ string_of_int n | NH n -> "nh" ^ string_of_int (abs n) ^ "b" | QH n when n > 0 -> "qh" ^ string_of_int n | QH n -> "qh" ^ string_of_int (abs n) ^ "b" | Ga -> "a" | Z -> "z" | Gl -> "gl" | Wp -> "wp" | Wm -> "wm" | Xp -> "xp" | Xm -> "xm" | X0 -> "x0" | Y0 -> "y0" | ZH -> "zh" | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Eta -> "eta" (* There are PDG numbers for Z', Z'', W', 32-34, respectively. We just introduce a number 38 for Y0 as a Z'''. As well, there is the number 8 for a t'. But we cheat a little bit and take the number 35 which is reserved for a heavy scalar Higgs for the Eta scalar. We abuse notation for the heavy quarks and take the PDG code for their SUSY partners!!! (What about an update of the PDG numbering scheme?) Thereby we take only those for up-type (s)quarks. The heavy neutrinos get the numbers of the sneutrinos. *) let pdg = function | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n | NH n when n > 0 -> 1000010 + 2*n | NH n -> - 1000010 + 2*n | QH 3 -> 1000006 | QH (-3) -> - 1000006 | QH n when n > 0 -> if Flags.anom_ferm_ass then 1000000 + 2*n else 999999 + 2*n | QH n -> if Flags.anom_ferm_ass then - 1000000 + 2*n else - 999999 + 2*n | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | Xp -> 34 | Xm -> (-34) | ZH -> 32 | X0 -> 33 | Y0 -> 38 | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Eta -> 36 (* As in the case of SUSY we introduce an internal dummy pdf code in order to have manageable arrays. Heavy neutrinos get numbers 41,43,45, while the heavy quarks have the numbers 40,42,44. I take them all as up type here. *) let pdg_mw = function | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n | NH n when n > 0 -> 39 + 2*n | NH n -> - 39 + 2*n | QH n when n > 0 -> 38 + 2*n | QH n -> - 38 + 2*n | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | Xp -> 34 | Xm -> (-34) | ZH -> 32 | X0 -> 33 | Y0 -> 38 | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Eta -> 36 let mass_symbol f = "mass(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg_mw f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | VHeavy -> "vheavy" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Sinpsi -> "sinpsi" | Cospsi -> "cospsi" | Atpsi -> "atpsi" | Sccs -> "sccs" | Supp -> "vF" | Supp2 -> "v2F2" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_Z_up -> "qzup" | G_zhthth -> "gzhthth" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_NC_X -> "gncx" | G_NC_X_t -> "gncxt" | G_NC_Y -> "gncy" | G_NC_Y_t -> "gncyt" | G_NC_H -> "gnch" | G_CC -> "gcc" | I_G_CC -> "i_gcc" | G_NC_h_lepton -> "gnchlep" | G_NC_h_neutrino -> "gnchneu" | G_NC_h_up -> "gnchup" | G_NC_h_down -> "gnchdwn" | G_NC_h_top -> "gnchtop" | G_NC_h_bot -> "gnchbot" | G_NCH_N -> "gnchn" | G_NCH_U -> "gnchu" | G_NCH_D -> "gnchd" | G_NCHt -> "gncht" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_G_WWW -> "igwww" | I_Q_H -> "iqh" | I_Q_ZH -> "iqzh" | I_G_Z1 -> "igz1" | I_G_Z2 -> "igz2" | I_G_Z3 -> "igz3" | I_G_Z4 -> "igz4" | I_G_Z5 -> "igz5" | I_G_Z6 -> "igz6" | G_HHthth -> "ghhthth" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_heavy_HVV -> "ghyhvv" | G_heavy_HWW -> "ghyhww" | G_heavy_HZZ -> "ghyhzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_HHZZH -> "ghhzzh" | G_Hgg -> "ghgg" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hthth -> "ghthth" | G_Htht -> "ghtht" | G_Hqhq -> "ghqhq" | G_Ethth -> "gethth" | G_Etht -> "getht" | G_Ett -> "gett" | G_Ebb -> "gebb" | G_HGaGa -> "ghgaga" | G_HGaZ -> "ghgaz" | G_EGaGa -> "geaa" | G_EGaZ -> "geaz" | G_EGlGl -> "gegg" | G_ZEH -> "gzeh" | G_ZHEH -> "gzheh" | G_H3 -> "gh3" | G_H4 -> "gh4" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" end module Xdim (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H | Grav type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.Xdim.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [H]; "Graviton", List.map other [Grav]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> begin match f with | Grav -> Tensor_2 | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H -> Prop_Scalar | Grav -> Prop_Tensor_2 end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) | O Grav -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Grav -> Grav end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("Xdim.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 | Grav -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | Gs | I_Gs | G2 | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | G_HGaZ | G_HGaGa | G_Hgg | G_Grav | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let gravity_currents n = List.map mom [ ((L (-n), Grav, L n), Graviton_Spinor_Spinor 1, G_Grav); ((N (-n), Grav, N n), Graviton_Spinor_Spinor 1, G_Grav); ((U (-n), Grav, U n), Graviton_Spinor_Spinor 1, G_Grav); ((D (-n), Grav, D n), Graviton_Spinor_Spinor 1, G_Grav) ] let yukawa = List.map mom [ ((U (-3), H, U 3), FBF (1, Psibar, S, Psi), G_Htt); ((D (-3), H, D 3), FBF (1, Psibar, S, Psi), G_Hbb); ((U (-2), H, U 2), FBF (1, Psibar, S, Psi), G_Hcc); ((L (-3), H, L 3), FBF (1, Psibar, S, Psi), G_Htautau) ] let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs) ] let triple_gauge = standard_triple_gauge let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2] let quartic_gauge = standard_quartic_gauge let gravity_gauge = [ (O Grav, G Z, G Z), Graviton_Vector_Vector 1, G_Grav; (O Grav, G Wp, G Wm), Graviton_Vector_Vector 1, G_Grav; (O Grav, G Ga, G Ga), Graviton_Vector_Vector 1, G_Grav; (O Grav, G Gl, G Gl), Graviton_Vector_Vector 1, G_Grav ] let standard_gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let standard_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let gravity_higgs = [ (O Grav, O H, O H), Graviton_Scalar_Scalar 1, G_Grav] let anomalous_gauge_higgs = [] let anomalous_gauge_higgs4 = [] let anomalous_higgs = [] let anomaly_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg ] let anomalous_higgs4 = [] let gauge_higgs = standard_gauge_higgs let gauge_higgs4 = standard_gauge_higgs4 let higgs = standard_higgs @ gravity_higgs let higgs4 = standard_higgs4 let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ ThoList.flatmap gravity_currents [1;2;3] @ yukawa @ triple_gauge @ gravity_gauge @ gauge_higgs @ higgs @ anomaly_higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "GG" -> O Grav | _ -> invalid_arg "Modellib_BSM.Xdim.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Grav -> "GG" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.Xdim.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | Grav -> "G" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Grav -> "gv" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Grav -> 39 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_H3 -> "gh3" | G_H4 -> "gh4" | G_Grav -> "ggrav" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module UED (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int | L_K1_L of int | L_K1_R of int | N_K1 of int | L_K2_L of int | L_K2_R of int | N_K2 of int | U_K1_L of int | U_K2_L of int | D_K1_L of int | D_K2_L of int | U_K1_R of int | U_K2_R of int | D_K1_R of int | D_K2_R of int type gauge_boson = Ga | Wp | Wm | Z | Gl | Gl_K1 | Gl_K2 | B1 | B2 | Z1 | Z2 | Wp1 | Wm1 | Wp2 | Wm2 type other = Phip | Phim | Phi0 | H | H1up | H1um | H1dp | H1dm | H2up |H2um | H2dp |H2dm | Grav type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.UED.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n; L_K1_L n; L_K1_R n; L_K2_L n; L_K2_R n; N_K1 n; N_K2 n; U_K1_L n; U_K2_L n; D_K1_L n; D_K2_L n; U_K1_R n; U_K2_R n; D_K1_R n; D_K2_R n] (* We don't introduce a special index for the higher excitations but make them parts of the particles' names. *) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl; Gl_K1; Gl_K2; B1; B2; Z1; Z2; Wp1 ; Wm1; Wp2; Wm2]; "Higgs", List.map other [H; H1up; H1um; H1dp; H1dm; H2up; H2um; H2dp; H2dm]; "Graviton", List.map other [Grav]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n | L_K1_L n -> spinor n | L_K1_R n -> spinor n | L_K2_L n -> spinor n | L_K2_R n -> spinor n | N_K1 n -> spinor n | N_K2 n -> spinor n | U_K1_L n -> spinor n | U_K1_R n -> spinor n | U_K2_L n -> spinor n | U_K2_R n -> spinor n | D_K1_L n -> spinor n | D_K1_R n -> spinor n | D_K2_L n -> spinor n | D_K2_R n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z | Gl_K1 | Gl_K2 | B1 | B2 | Z1 | Z2 | Wp1 | Wm1 | Wp2 | Wm2 -> Massive_Vector end | O f -> begin match f with | Grav -> Tensor_2 | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | M (U_K1_L n) -> Color.SUN (if n > 0 then 3 else -3) | M (D_K1_L n) -> Color.SUN (if n > 0 then 3 else -3) | M (U_K1_R n) -> Color.SUN (if n > 0 then 3 else -3) | M (D_K1_R n) -> Color.SUN (if n > 0 then 3 else -3) | M (U_K2_L n) -> Color.SUN (if n > 0 then 3 else -3) | M (D_K2_L n) -> Color.SUN (if n > 0 then 3 else -3) | M (U_K2_R n) -> Color.SUN (if n > 0 then 3 else -3) | M (D_K2_R n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl | G Gl_K1 | G Gl_K2 -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n | L_K1_L n -> prop_spinor n | L_K1_R n -> prop_spinor n | L_K2_L n -> prop_spinor n | L_K2_R n -> prop_spinor n | N_K1 n -> prop_spinor n | N_K2 n -> prop_spinor n | U_K1_L n -> prop_spinor n | U_K1_R n -> prop_spinor n | U_K2_L n -> prop_spinor n | U_K2_R n -> prop_spinor n | D_K1_L n -> prop_spinor n | D_K1_R n -> prop_spinor n | D_K2_L n -> prop_spinor n | D_K2_R n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z | Gl_K1 | Gl_K2 | B1 | B2 | Z1 | Z2 | Wp1 | Wm1 | Wp2 | Wm2 -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H | H1up | H1um | H1dp | H1dm | H2up | H2um | H2dp | H2dm -> Prop_Scalar | Grav -> Prop_Tensor_2 end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) | O Grav -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) | L_K1_L n -> L_K1_L (-n) | L_K1_R n -> L_K1_R (-n) | L_K2_L n -> L_K2_L (-n) | L_K2_R n -> L_K2_R (-n) | N_K1 n -> N_K1 (-n) | N_K2 n -> N_K2 (-n) | U_K1_L n -> U_K1_L (-n) | U_K1_R n -> U_K1_R (-n) | U_K2_L n -> U_K2_L (-n) | U_K2_R n -> U_K2_R (-n) | D_K1_L n -> D_K1_L (-n) | D_K1_R n -> D_K1_R (-n) | D_K2_L n -> D_K2_L (-n) | D_K2_R n -> D_K2_R (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | Gl_K1 -> Gl_K1 | Gl_K2 -> Gl_K2 | B1 -> B1 | B2 -> B2 | Z1 -> Z1 | Z2 -> Z2 | Wp1 -> Wm1 | Wm1 -> Wp1 | Wp2 -> Wm2 | Wm2 -> Wp2 end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | H1up -> H1um | H1um -> H1up | H1dp -> H1dm | H1dm -> H1dp | H2up -> H2um | H2um -> H2up | H2dp -> H2dm | H2dm -> H2dp | Grav -> Grav end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 | L_K1_L n -> if n > 0 then 1 else -1 | L_K2_L n -> if n > 0 then 1 else -1 | L_K1_R n -> if n > 0 then 1 else -1 | L_K2_R n -> if n > 0 then 1 else -1 | U_K1_L n -> if n > 0 then 1 else -1 | U_K2_L n -> if n > 0 then 1 else -1 | U_K1_R n -> if n > 0 then 1 else -1 | U_K2_R n -> if n > 0 then 1 else -1 | D_K1_L n -> if n > 0 then 1 else -1 | D_K2_L n -> if n > 0 then 1 else -1 | D_K1_R n -> if n > 0 then 1 else -1 | D_K2_R n -> if n > 0 then 1 else -1 | N_K1 n -> if n > 0 then 1 else -1 | N_K2 n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm | Gl_K1 | Gl_K2 | B1 | B2 | Z1 | Z2 | Wp1 | Wm1 | Wp2 | Wm2 -> 0 end | O _ -> 0 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n | L_K1_L n | L_K2_L n | L_K1_R n | L_K2_R n | N_K1 n | N_K2 n | U_K1_L n | U_K2_L n | U_K1_R n | U_K2_R n | D_K1_L n | D_K2_L n | D_K1_R n | D_K2_R n ) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n | L_K1_L n | L_K2_L n | L_K1_R n | L_K2_R n -> if n > 0 then -1//1 else 1//1 | N n | N_K1 n | N_K2 n -> 0//1 | U n | U_K1_L n | U_K2_L n | U_K1_R n | U_K2_R n -> if n > 0 then 2//3 else -2//3 | D n | D_K1_L n | D_K2_L n | D_K1_R n | D_K2_R n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Gl_K1 | Gl_K2 | Ga | Z | B1 | B2 | Z1 | Z2 -> 0//1 | Wp | Wp1 | Wp2 -> 1//1 | Wm | Wm1 | Wm2 -> -1//1 end | O f -> begin match f with | H | Phi0 | Grav -> 0//1 | H1up | H1dp | H2up | H2dp | Phip -> 1//1 | H1um | H1dm | H2um | H2dm | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n | L_K1_L n | L_K1_R n | L_K2_L n | L_K2_R n | N_K1 n | N_K2 n -> if n > 0 then 1//1 else -1//1 | U _ | D _ | _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | U n | D n | U_K1_L n | U_K1_R n | U_K2_L n | U_K2_R n | D_K1_L n | D_K1_R n | D_K2_L n | D_K2_R n -> if n > 0 then 1//1 else -1//1 | L _ | N _ | _ -> 0//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | I_Q_W_K | I_G_ZWW_K1 | I_G_ZWW_K2 | I_G_ZWW_K3 | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | G_HGaZ | G_HGaGa | G_Hgg | Gs | I_Gs | I_GsRt2 | G2 | G22 | G_Grav | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] let gravity_currents n = List.map mom [ ((L (-n), Grav, L n), Graviton_Spinor_Spinor 1, G_Grav); ((N (-n), Grav, N n), Graviton_Spinor_Spinor 1, G_Grav); ((U (-n), Grav, U n), Graviton_Spinor_Spinor 1, G_Grav); ((D (-n), Grav, D n), Graviton_Spinor_Spinor 1, G_Grav) ] let yukawa = List.map mom [ ((U (-3), H, U 3), FBF (1, Psibar, S, Psi), G_Htt); ((D (-3), H, D 3), FBF (1, Psibar, S, Psi), G_Hbb); ((U (-2), H, U 2), FBF (1, Psibar, S, Psi), G_Hcc); ((L (-3), H, L 3), FBF (1, Psibar, S, Psi), G_Htautau) ] let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) (* Gluons should be included in just that way. *) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Ga, Wm1, Wp1), Gauge_Gauge_Gauge 1, I_Q_W_K); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Z, Wm1, Wp1), Gauge_Gauge_Gauge 1, I_G_ZWW_K1); ((Z1, Wm, Wp1), Gauge_Gauge_Gauge 1, I_G_ZWW_K2); ((Z1, Wm1, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW_K2); ((Z2, Wm1, Wp2), Gauge_Gauge_Gauge 1, I_G_ZWW_K3); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs); ((Gl, Gl_K2, Gl_K2), Gauge_Gauge_Gauge (-1), I_Gs); ((Gl, Gl_K1, Gl_K1), Gauge_Gauge_Gauge 1, I_Gs); ((Gl_K2, Gl_K1, Gl_K1), Gauge_Gauge_Gauge 1, I_GsRt2)] let triple_gauge = standard_triple_gauge let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; ((Gl, Gl, Gl, Gl), gauge4, G2); ((Gl, Gl, Gl_K1, Gl_K1), gauge4, G2); ((Gl, Gl, Gl_K2, Gl_K2), gauge4, G2); ((Gl_K1, Gl_K1, Gl_K2, Gl_K2), gauge4, G2); ((Gl_K2, Gl_K2, Gl_K2, Gl_K2), gauge4, G22)] let quartic_gauge = standard_quartic_gauge let gravity_gauge = [ (O Grav, G Z, G Z), Graviton_Vector_Vector 1, G_Grav; (O Grav, G Wp, G Wm), Graviton_Vector_Vector 1, G_Grav; (O Grav, G Ga, G Ga), Graviton_Vector_Vector 1, G_Grav; (O Grav, G Gl, G Gl), Graviton_Vector_Vector 1, G_Grav ] let standard_gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let standard_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let gravity_higgs = [ (O Grav, O H, O H), Graviton_Scalar_Scalar 1, G_Grav] let anomalous_gauge_higgs = [] let anomalous_gauge_higgs4 = [] let anomalous_higgs = [] let anomaly_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg ] let anomalous_higgs4 = [] let gauge_higgs = standard_gauge_higgs let gauge_higgs4 = standard_gauge_higgs4 let higgs = standard_higgs @ gravity_higgs let higgs4 = standard_higgs4 let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap gravity_currents [1;2;3] @ yukawa @ triple_gauge @ gravity_gauge @ gauge_higgs @ higgs @ anomaly_higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "uk1l" -> M (U_K1_L 1) | "uk1lbar" -> M (U_K1_L (-1)) | "ck1l" -> M (U_K1_L 2) | "ck1lbar" -> M (U_K1_L (-2)) | "tk1l" -> M (U_K1_L 3) | "tk1lbar" -> M (U_K1_L (-3)) | "dk1l" -> M (D_K1_L 1) | "dk1lbar" -> M (D_K1_L (-1)) | "sk1l" -> M (D_K1_L 2) | "sk1lbar" -> M (D_K1_L (-2)) | "bk1l" -> M (D_K1_L 3) | "bk1lbar" -> M (D_K1_L (-3)) | "uk1r" -> M (U_K1_R 1) | "uk1rbar" -> M (U_K1_R (-1)) | "ck1r" -> M (U_K1_R 2) | "ck1rbar" -> M (U_K1_R (-2)) | "tk1r" -> M (U_K1_R 3) | "tk1rbar" -> M (U_K1_R (-3)) | "dk1r" -> M (D_K1_R 1) | "dk1rbar" -> M (D_K1_R (-1)) | "sk1r" -> M (D_K1_R 2) | "sk1rbar" -> M (D_K1_R (-2)) | "bk1r" -> M (D_K1_R 3) | "bk1rbar" -> M (D_K1_R (-3)) | "uk2l" -> M (U_K2_L 1) | "uk2lbar" -> M (U_K2_L (-1)) | "ck2l" -> M (U_K2_L 2) | "ck2lbar" -> M (U_K2_L (-2)) | "tk2l" -> M (U_K2_L 3) | "tk2lbar" -> M (U_K2_L (-3)) | "dk2l" -> M (D_K2_L 1) | "dk2lbar" -> M (D_K2_L (-1)) | "sk2l" -> M (D_K2_L 2) | "sk2lbar" -> M (D_K2_L (-2)) | "bk2l" -> M (D_K2_L 3) | "bk2lbar" -> M (D_K2_L (-3)) | "uk2r" -> M (U_K2_R 1) | "uk2rbar" -> M (U_K2_R (-1)) | "ck2r" -> M (U_K2_R 2) | "ck2rbar" -> M (U_K2_R (-2)) | "tk2r" -> M (U_K2_R 3) | "tk2rbar" -> M (U_K2_R (-3)) | "dk2r" -> M (D_K2_R 1) | "dk2rbar" -> M (D_K2_R (-1)) | "sk2r" -> M (D_K2_R 2) | "sk2rbar" -> M (D_K2_R (-2)) | "bk2r" -> M (D_K2_R 3) | "bk2rbar" -> M (D_K2_R (-3)) | "g" | "gl" -> G Gl | "g_k1" | "gl_k1" -> G Gl_K1 | "g_k2" | "gl_k2" -> G Gl_K2 | "b1" -> G B1 | "b2" -> G B2 | "z1" -> G Z1 | "z2" -> G Z2 | "W1+" -> G Wp1 | "W1-" -> G Wm1 | "W2+" -> G Wp2 | "W2-" -> G Wm2 | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "H1u+" -> O H1up | "H1u-" -> O H1um | "H1d+" -> O H1dp | "H1d-" -> O H1dm | "H2u+" -> O H2up | "H2u-" -> O H2um | "H2d+" -> O H2dp | "H2d-" -> O H2dm | "GG" -> O Grav | "ek1l-" -> M (L_K1_L 1) | "ek1l+" -> M (L_K1_L (-1)) | "muk1l-" -> M (L_K1_L 2) | "mu1l+" -> M (L_K1_L (-2)) | "tauk1l-" -> M (L_K1_L 3) | "tauk1l+" -> M (L_K1_L (-3)) | "ek1r-" -> M (L_K1_R 1) | "ek1r+" -> M (L_K1_R (-1)) | "muk1r-" -> M (L_K1_R 2) | "mu1r+" -> M (L_K1_R (-2)) | "tau1r-" -> M (L_K1_R 3) | "tauk1r+" -> M (L_K1_R (-3)) | "ek2l-" -> M (L_K2_L 1) | "ek2l+" -> M (L_K2_L (-1)) | "muk2l-" -> M (L_K2_L 2) | "mu2l+" -> M (L_K2_L (-2)) | "tauk2l-" -> M (L_K2_L 3) | "tauk2l+" -> M (L_K2_L (-3)) | "ek2r-" -> M (L_K2_R 1) | "ek2r+" -> M (L_K2_R (-1)) | "muk2r-" -> M (L_K2_R 2) | "mu2r+" -> M (L_K2_R (-2)) | "tau2r-" -> M (L_K2_R 3) | "tauk2r+" -> M (L_K2_R (-3)) | "nuek1" -> M (N_K1 1) | "nuek1bar" -> M (N_K1 (-1)) | "numuk1" -> M (N_K1 2) | "numuk1bar" -> M (N_K1 (-2)) | "nutauk1" -> M (N_K1 3) | "nutauk1bar" -> M (N_K1 (-3)) | "nuek2" -> M (N_K2 1) | "nuek2bar" -> M (N_K2 (-1)) | "numuk2" -> M (N_K2 2) | "numuk2bar" -> M (N_K2 (-2)) | "nutauk2" -> M (N_K2 3) | "nutauk2bar" -> M (N_K2 (-3)) | _ -> invalid_arg "Modellib_BSM.UED.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid down type quark" | U_K1_L 1 -> "uk1l" | U_K1_L (-1) -> "uk1lbar" | U_K1_L 2 -> "ck1l" | U_K1_L (-2) -> "ck1lbar" | U_K1_L 3 -> "tk1l" | U_K1_L (-3) -> "tk1lbar" | U_K1_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid up type quark" | D_K1_L 1 -> "dk1l" | D_K1_L (-1) -> "dk1lbar" | D_K1_L 2 -> "sk1l" | D_K1_L (-2) -> "sk1lbar" | D_K1_L 3 -> "bk1l" | D_K1_L (-3) -> "bk1lbar" | D_K1_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid down type quark" | U_K1_R 1 -> "uk1r" | U_K1_R (-1) -> "uk1rbar" | U_K1_R 2 -> "ck1r" | U_K1_R (-2) -> "ck1rbar" | U_K1_R 3 -> "tk1r" | U_K1_R (-3) -> "tk1rbar" | U_K1_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid up type quark" | D_K1_R 1 -> "dk1r" | D_K1_R (-1) -> "dk1rbar" | D_K1_R 2 -> "sk1r" | D_K1_R (-2) -> "sk1rbar" | D_K1_R 3 -> "bk1r" | D_K1_R (-3) -> "bk1rbar" | D_K1_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid down type quark" | U_K2_L 1 -> "uk2l" | U_K2_L (-1) -> "uk2lbar" | U_K2_L 2 -> "ck2l" | U_K2_L (-2) -> "ck2lbar" | U_K2_L 3 -> "tk2l" | U_K2_L (-3) -> "tk2lbar" | U_K2_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid up type quark" | D_K2_L 1 -> "dk2l" | D_K2_L (-1) -> "dk2lbar" | D_K2_L 2 -> "sk2l" | D_K2_L (-2) -> "sk2lbar" | D_K2_L 3 -> "bk2l" | D_K2_L (-3) -> "bk2lbar" | D_K2_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid down type quark" | U_K2_R 1 -> "uk2r" | U_K2_R (-1) -> "uk2rbar" | U_K2_R 2 -> "ck2r" | U_K2_R (-2) -> "ck2rbar" | U_K2_R 3 -> "tk2r" | U_K2_R (-3) -> "tk2rbar" | U_K2_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid up type quark" | D_K2_R 1 -> "dk2r" | D_K2_R (-1) -> "dk2rbar" | D_K2_R 2 -> "sk2r" | D_K2_R (-2) -> "sk2rbar" | D_K2_R 3 -> "bk2r" | D_K2_R (-3) -> "bk2rbar" | D_K2_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid down type quark" | L_K1_L 1 -> "ek1l-" | L_K1_L (-1) -> "ek1l+" | L_K1_L 2 -> "muk1l-" | L_K1_L (-2) -> "muk1l+" | L_K1_L 3 -> "tauk1l-" | L_K1_L (-3) -> "tauk1l+" | L_K1_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid lepton" | L_K1_R 1 -> "ek1r-" | L_K1_R (-1) -> "ek1r+" | L_K1_R 2 -> "muk1r-" | L_K1_R (-2) -> "muk1r+" | L_K1_R 3 -> "tauk1r-" | L_K1_R (-3) -> "tauk1r+" | L_K1_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid lepton" | L_K2_L 1 -> "ek2l-" | L_K2_L (-1) -> "ek2l+" | L_K2_L 2 -> "muk2l-" | L_K2_L (-2) -> "muk2l+" | L_K2_L 3 -> "tauk2l-" | L_K2_L (-3) -> "tauk2l+" | L_K2_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid lepton" | L_K2_R 1 -> "ek2r-" | L_K2_R (-1) -> "ek2r+" | L_K2_R 2 -> "muk2r-" | L_K2_R (-2) -> "muk2r+" | L_K2_R 3 -> "tauk2r-" | L_K2_R (-3) -> "tauk2r+" | L_K2_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid lepton" | N_K1 1 -> "nuek1" | N_K1 (-1) -> "nuek1bar" | N_K1 2 -> "numuk1" | N_K1 (-2) -> "numuk1bar" | N_K1 3 -> "nutauk1" | N_K1 (-3) -> "nutauk1bar" | N_K1 _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid neutrino" | N_K2 1 -> "nuek2" | N_K2 (-1) -> "nuek2bar" | N_K2 2 -> "numuk2" | N_K2 (-2) -> "numuk2bar" | N_K2 3 -> "nutauk2" | N_K2 (-3) -> "nutauk2bar" | N_K2 _ -> invalid_arg "Modellib_BSM.UED.flavor_to_string: invalid neutrino" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | Gl_K1 -> "gk1" | Gl_K2 -> "gk2" | B1 -> "b1" | B2 -> "b2" | Z1 -> "z1" | Z2 -> "z2" | Wp1 -> "W1+" | Wm1 -> "W1-" | Wp2 -> "W2+" | Wm2 -> "W2-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | H1up -> "H1u+" | H1um -> "H1u-" | H1dp -> "H1d+" | H1dm -> "H1d-" | H2up -> "H2u+" | H2um -> "H2u-" | H2dp -> "H2d+" | H2dm -> "H2d-" | Grav -> "GG" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid down type quark" | U_K1_L 1 -> "u^\\prime_L" | U_K1_L (-1) -> "\\bar{u}^\\prime_L" | U_K1_L 2 -> "c^\\prime_L" | U_K1_L (-2) -> "\\bar{c}^\\prime_L" | U_K1_L 3 -> "t^\\prime_L" | U_K1_L (-3) -> "\\bar{t}^\\prime_L" | U_K1_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid up type quark" | D_K1_L 1 -> "d^\\prime_L" | D_K1_L (-1) -> "\\bar{d}^\\prime_L" | D_K1_L 2 -> "s^\\prime_L" | D_K1_L (-2) -> "\\bar{s}^\\prime_L" | D_K1_L 3 -> "b^\\prime_L" | D_K1_L (-3) -> "\\bar{b}^\\prime_L" | D_K1_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid down type quark" | U_K1_R 1 -> "u^\\prime_R" | U_K1_R (-1) -> "\\bar{u}^\\prime_R" | U_K1_R 2 -> "c^\\prime_R" | U_K1_R (-2) -> "\\bar{c}^\\prime_R" | U_K1_R 3 -> "t^\\prime_R" | U_K1_R (-3) -> "\\bar{t}^\\prime_R" | U_K1_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid up type quark" | D_K1_R 1 -> "d^\\prime_R" | D_K1_R (-1) -> "\\bar{d}^\\prime_R" | D_K1_R 2 -> "s^\\prime_R" | D_K1_R (-2) -> "\\bar{s}^\\prime_R" | D_K1_R 3 -> "b^\\prime_R" | D_K1_R (-3) -> "\\bar{b}^\\prime_R" | D_K1_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid down type quark" | U_K2_L 1 -> "u^{\\prime\\prime}_L" | U_K2_L (-1) -> "\\bar{u}^{\\prime\\prime}_L" | U_K2_L 2 -> "c^{\\prime\\prime}_L" | U_K2_L (-2) -> "\\bar{c}^{\\prime\\prime}_L" | U_K2_L 3 -> "t^{\\prime\\prime}_L" | U_K2_L (-3) -> "\\bar{t}^{\\prime\\prime}_L" | U_K2_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid up type quark" | D_K2_L 1 -> "d^{\\prime\\prime}_L" | D_K2_L (-1) -> "\\bar{d}^{\\prime\\prime}_L" | D_K2_L 2 -> "s^{\\prime\\prime}_L" | D_K2_L (-2) -> "\\bar{s}^{\\prime\\prime}_L" | D_K2_L 3 -> "b^{\\prime\\prime}_L" | D_K2_L (-3) -> "\\bar{b}^{\\prime\\prime}_L" | D_K2_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid down type quark" | U_K2_R 1 -> "u^{\\prime\\prime}_R" | U_K2_R (-1) -> "\\bar{u}^{\\prime\\prime}_R" | U_K2_R 2 -> "c^{\\prime\\prime}_R" | U_K2_R (-2) -> "\\bar{c}^{\\prime\\prime}_R" | U_K2_R 3 -> "t^{\\prime\\prime}_R" | U_K2_R (-3) -> "\\bar{t}^{\\prime\\prime}_R" | U_K2_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid up type quark" | D_K2_R 1 -> "d^\\prime_R" | D_K2_R (-1) -> "\\bar{d}^{\\prime\\prime}_R" | D_K2_R 2 -> "s^\\prime_R" | D_K2_R (-2) -> "\\bar{s}^{\\prime\\prime}_R" | D_K2_R 3 -> "b^\\prime_R" | D_K2_R (-3) -> "\\bar{b}^{\\prime\\prime}_R" | D_K2_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid down type quark" | L_K1_L 1 -> "e_L^{\\prime,,-}" | L_K1_L (-1) -> "\\bar{e}_L^{\\prime,,+}" | L_K1_L 2 -> "\\mu_L^{\\prime,,-}" | L_K1_L (-2) -> "\\bar{\\mu}_L^{{\\prime,,+}" | L_K1_L 3 -> "\\tau_L^{\\prime,,-}" | L_K1_L (-3) -> "\\bar{\\tau}_L^{\\prime,,+}" | L_K1_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid lepton" | L_K1_R 1 -> "e_R^{\\prime,,-}" | L_K1_R (-1) -> "\\bar{e}_R^{\\prime,,+}" | L_K1_R 2 -> "\\mu_R{\\prime,,-}" | L_K1_R (-2) -> "\\bar{\\mu}_R^{\\prime,,+}" | L_K1_R 3 -> "\\tau_R¬{\\prime,,-}" | L_K1_R (-3) -> "\\bar{\\tau}_R¬{\\prime,,+}" | L_K1_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid lepton" | L_K2_L 1 -> "e^{\\prime\\prime,,-}_L" | L_K2_L (-1) -> "\\bar{e}_L^{\\prime\\prime,,+}" | L_K2_L 2 -> "\\mu_L^{\\prime\\prime,,-}" | L_K2_L (-2) -> "\\bar{\\mu}_L^{\\prime\\prime,,+}" | L_K2_L 3 -> "\\tau_L^{\\prime\\prime,,-}" | L_K2_L (-3) -> "\\bar{\\tau}_L^{\\prime\\prime,,+}" | L_K2_L _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid lepton" | L_K2_R 1 -> "e_R^{\\prime\\prime,,-}" | L_K2_R (-1) -> "\\bar{e}_R^{\\prime\\prime,,+}" | L_K2_R 2 -> "\\mu_R^{\\prime\\prime,,-}" | L_K2_R (-2) -> "\\bar{\\mu}_R^{\\prime\\prime,,+}" | L_K2_R 3 -> "\\tau_R{\\prime\\prime,,-}" | L_K2_R (-3) -> "\\bar{\\tau}_R^{\\prime\\prime,,+}" | L_K2_R _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid lepton" | N_K1 1 -> "\\nu_e^\\prime" | N_K1 (-1) -> "\\bar{\\nu}_e^\\prime" | N_K1 2 -> "\\nu_\\mu^\\prime" | N_K1 (-2) -> "\\bar{\\nu}_\\mu^\\prime" | N_K1 3 -> "\\nu_\\tau^\\prime" | N_K1 (-3) -> "\\bar{\\nu}_\\tau^\\prime" | N_K1 _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid neutrino" | N_K2 1 -> "\\nu_e^{\\prime\\prime}" | N_K2 (-1) -> "\\bar{\\nu}_e^{\\prime\\prime}" | N_K2 2 -> "\\nu_\\mu^{\\prime\\prime}" | N_K2 (-2) -> "\\bar{\\nu}_\\mu^{\\prime\\prime}" | N_K2 3 -> "\\nu_\\tau^{\\prime\\prime}" | N_K2 (-3) -> "\\bar{\\nu}_\\tau^{\\prime\\prime}" | N_K2 _ -> invalid_arg "Modellib_BSM.UED.flavor_to_TeX: invalid neutrino" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | Gl_K1 -> "g^\\prime" | Gl_K2 -> "g^{\\prime\\prime}" | B1 -> "B^\\prime" | B2 -> "B^{\\prime\\prime}" | Z1 -> "Z^\\prime" | Z2 -> "Z^{\\prime\\prime}" | Wp1 -> "W^{\\prime,,+}" | Wm1 -> "W^{\\prime,,-}" | Wp2 -> "W^{\\prime\\prime,,+}" | Wm2 -> "W^{\\prime\\prime,,-}" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | H1up -> "H1u+" | H1um -> "H1u-" | H1dp -> "H1d+" | H1dm -> "H1d-" | H2up -> "H2u+" | H2um -> "H2u-" | H2dp -> "H2d+" | H2dm -> "H2d-" | Grav -> "G^\\prime" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" | L_K1_L n when n > 0 -> "lk1l" ^ string_of_int n | L_K1_L n -> "lk1l" ^ string_of_int (abs n) ^ "b" | L_K1_R n when n > 0 -> "lk1r" ^ string_of_int n | L_K1_R n -> "lk1r" ^ string_of_int (abs n) ^ "b" | L_K2_L n when n > 0 -> "lk2l" ^ string_of_int n | L_K2_L n -> "lk2l" ^ string_of_int (abs n) ^ "b" | L_K2_R n when n > 0 -> "lk2r" ^ string_of_int n | L_K2_R n -> "lk2r" ^ string_of_int (abs n) ^ "b" | U_K1_L n when n > 0 -> "uk1l" ^ string_of_int n | U_K1_L n -> "uk1l" ^ string_of_int (abs n) ^ "b" | U_K1_R n when n > 0 -> "uk1r" ^ string_of_int n | U_K1_R n -> "uk1r" ^ string_of_int (abs n) ^ "b" | U_K2_L n when n > 0 -> "uk2l" ^ string_of_int n | U_K2_L n -> "uk2l" ^ string_of_int (abs n) ^ "b" | U_K2_R n when n > 0 -> "uk2r" ^ string_of_int n | U_K2_R n -> "uk2r" ^ string_of_int (abs n) ^ "b" | D_K1_L n when n > 0 -> "dk1l" ^ string_of_int n | D_K1_L n -> "dk1l" ^ string_of_int (abs n) ^ "b" | D_K1_R n when n > 0 -> "dk1r" ^ string_of_int n | D_K1_R n -> "dk1r" ^ string_of_int (abs n) ^ "b" | D_K2_L n when n > 0 -> "dk2l" ^ string_of_int n | D_K2_L n -> "dk2l" ^ string_of_int (abs n) ^ "b" | D_K2_R n when n > 0 -> "dk2r" ^ string_of_int n | D_K2_R n -> "dk2r" ^ string_of_int (abs n) ^ "b" | N_K1 n when n > 0 -> "nk1" ^ string_of_int n | N_K1 n -> "nk1" ^ string_of_int (abs n) ^ "b" | N_K2 n when n > 0 -> "nk2" ^ string_of_int n | N_K2 n -> "nk2" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | Gl_K1 -> "gk1" | Gl_K2 -> "gk2" | B1 -> "b1" | B2 -> "b2" | Z1 -> "z1" | Z2 -> "z2" | Wp1 -> "wp1" | Wm1 -> "wm1" | Wp2 -> "wp2" | Wm2 -> "wm2" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | H1up -> "h1up" | H1um -> "h1um" | H1dp -> "h1dp" | H1dm -> "h1dm" | H2up -> "h2up" | H2um -> "h2um" | H2dp -> "h2dp" | H2dm -> "h2dm" | Grav -> "gv" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n | U_K1_L n when n > 0 -> 4000000 + 2*n | U_K1_L n -> - 4000000 + 2*n | D_K1_L n when n > 0 -> 3999999 + 2*n | D_K1_L n -> - 3999999 + 2*n | U_K1_R n when n > 0 -> 5000000 + 2*n | U_K1_R n -> - 5000000 + 2*n | D_K1_R n when n > 0 -> 4999999 + 2*n | D_K1_R n -> - 4999999 + 2*n | U_K2_L n when n > 0 -> 6000000 + 2*n | U_K2_L n -> - 6000000 + 2*n | D_K2_L n when n > 0 -> 5999999 + 2*n | D_K2_L n -> - 5999999 + 2*n | U_K2_R n when n > 7000000 -> 2*n | U_K2_R n -> - 7000000 + 2*n | D_K2_R n when n > 0 -> 6999999 + 2*n | D_K2_R n -> - 6999999 + 2*n | L_K1_L n when n > 0 -> 4000009 + 2*n | L_K1_L n -> - 4000009 + 2*n | L_K1_R n when n > 0 -> 5000009 + 2*n | L_K1_R n -> - 5000009 + 2*n | L_K2_L n when n > 0 -> 6000009 + 2*n | L_K2_L n -> - 6000009 + 2*n | L_K2_R n when n > 0 -> 7000009 + 2*n | L_K2_R n -> - 7000009 + 2*n | N_K1 n when n > 0 -> 4000010 + 2*n | N_K1 n -> - 4000010 + 2*n | N_K2 n when n > 0 -> 6000010 + 2*n | N_K2 n -> - 6000010 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | Gl_K1 -> 4000021 | Gl_K2 -> 6000021 | B1 -> 4000022 | B2 -> 6000022 | Z1 -> 4000023 | Z2 -> 6000024 | Wp1 -> 4000024 | Wm1 -> (-4000024) | Wp2 -> 6000024 | Wm2 -> (-6000024) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | H1up -> 4000036 | H1um -> (-4000036) | H1dp -> 4000037 | H1dm -> (-4000037) | H2up -> 6000036 | H2um -> (-6000036) | H2dp -> 6000037 | H2dm -> (-6000037) | Grav -> 39 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_Q_W_K -> "iqwk" | I_G_ZWW_K1 -> "igzwwk1" | I_G_ZWW_K2 -> "igzwwk2" | I_G_ZWW_K3 -> "igzwwk3" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_H3 -> "gh3" | G_H4 -> "gh4" | G2 -> "gs**2" | Gs -> "gs" | I_Gs -> "igs" | I_GsRt2 -> "igs/sqrt(2.0_default)" | G22 -> "gs**2/2.0_default" | G_Grav -> "ggrav" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module GravTest (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int | SL of int type gauge_boson = Ga | Wp | Wm | Z | Gl | Phino type other = Phip | Phim | Phi0 | H | Grino type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.SM.gauge_symbol: internal error" let family n = List.map matter_field [ L n; SL n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl; Phino]; "Higgs", List.map other [H]; "Gravitino", List.map other [Grino]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n | SL _ -> Scalar end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector | Phino -> Majorana end | O f -> begin match f with | Grino -> Vectorspinor | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n | SL n -> Prop_Scalar end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity | Phino -> Prop_Majorana end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H -> Prop_Scalar | Grino -> Prop_Vectorspinor end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) | O Grino -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) | SL n -> SL (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp | Phino -> Phino end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Grino -> Grino end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 | SL _ -> 0 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 | Phino -> 2 end | O f -> begin match f with | Grino -> 2 | _ -> 0 end module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM3.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n | SL n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | SL n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z | Phino -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 | Grino -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n | SL n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ | SL _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | G_HGaZ | G_HGaGa | G_Hgg | G_strong | G_Grav | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = List.map mom [ ((U (-3), H, U 3), FBF (1, Psibar, S, Psi), G_Htt); ((D (-3), H, D 3), FBF (1, Psibar, S, Psi), G_Hbb); ((U (-2), H, U 2), FBF (1, Psibar, S, Psi), G_Hcc); ((L (-3), H, L 3), FBF (1, Psibar, S, Psi), G_Htautau) ] let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW) ] let triple_gauge = standard_triple_gauge let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW ] let quartic_gauge = standard_quartic_gauge let standard_gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let standard_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let anomalous_gauge_higgs = [] let anomalous_gauge_higgs4 = [] let anomalous_higgs = [] let anomaly_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg ] let gravitino_coup n = [ (O Grino, M (SL (-n)), M (L n)), GBG (1, Gravbar, POT, Psi), G_Grav; (M (L (-n)), M (SL n), O Grino), GBG (1, Psibar, POT, Grav), G_Grav] let gravitino_gauge = [ (O Grino, G Ga, G Phino), GBG (1, Gravbar, V, Chi), G_Grav ] let anomalous_higgs4 = [] let gauge_higgs = standard_gauge_higgs let gauge_higgs4 = standard_gauge_higgs4 let higgs = standard_higgs let higgs4 = standard_higgs4 let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ ThoList.flatmap gravitino_coup [1;2;3] @ gravitino_gauge @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ anomaly_higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "se-" -> M (SL 1) | "se+" -> M (SL (-1)) | "smu-" -> M (SL 2) | "smu+" -> M (SL (-2)) | "stau-" -> M (SL 3) | "stau+" -> M (SL (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "GG" -> O Grino | "phino" | "Phino" -> G Phino | _ -> invalid_arg "Modellib_BSM.GravTest.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_string: invalid lepton" | SL 1 -> "se-" | SL (-1) -> "se+" | SL 2 -> "smu-" | SL (-2) -> "smu+" | SL 3 -> "stau-" | SL (-3) -> "stau+" | SL _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_string: invalid slepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.SM.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" | Phino -> "phino" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Grino -> "GG" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_TeX: invalid lepton" | SL 1 -> "\\tilde{e}^-" | SL (-1) -> "\\tilde{e}^+" | SL 2 -> "\\tilde{\\mu}^-" | SL (-2) -> "\\tilde{\\mu}^+" | SL 3 -> "\\tilde{\\tau}^-" | SL (-3) -> "\\tilde{\\tau}^+" | SL _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_TeX: invalid slepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.SM.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.GravTest.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" | Phino -> "\\tilde{\\phi}" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | Grino -> "\\tilde{G}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | SL n when n > 0 -> "sl" ^ string_of_int n | SL n -> "sl" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" | Phino -> "phino" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Grino -> "gv" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | SL n when n > 0 -> 39 + 2*n | SL n -> - 39 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) | Phino -> 46 end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Grino -> 39 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_H3 -> "gh3" | G_H4 -> "gh4" | G_strong -> "gs" | G_Grav -> "ggrav" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module Template (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.Template.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [H]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> Scalar let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("Template.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Hmm | G_Htautau | G_H3 | G_H4 | G_HGaZ | G_HGaGa | G_Hgg | Gs | I_Gs | G2 | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-2)), O H, M (L 2)), FBF (1, Psibar, S, Psi), G_Hmm); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs) ] let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2] let gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let anomaly_higgs = [] (* [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg] *) let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ anomaly_higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | _ -> invalid_arg "Modellib_BSM.Template.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.Template.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.Template.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.Template.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.Template.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.Template.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.Template.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.Template.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.Template.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hmm -> "ghmm" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module HSExt (Flags : BSM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H | S type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.HSExt.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [H; S]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> Scalar let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H | S -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | S -> S end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("HSExt.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 | S -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_SWW | G_SSWW | G_SZZ | G_SSZZ | G_HSWW | G_HSZZ | G_Htt | G_Hbb | G_Hcc | G_Hmm | G_Htautau | G_H3 | G_H4_1 | G_H4_2 | G_H4_3 | G_H4_4 | G_H4_5 | G_Stt | G_Sbb | G_Scc | G_Smm | G_Stautau | G_HSS | G_HHS | G_HGaZ | G_HGaGa | G_Hgg | G_SGaZ | G_SGaGa | G_Sgg | Gs | I_Gs | G2 | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, Coupling.S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, Coupling.S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, Coupling.S, Psi), G_Hcc); ((M (L (-2)), O H, M (L 2)), FBF (1, Psibar, Coupling.S, Psi), G_Hmm); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, Coupling.S, Psi), G_Htautau); ((M (U (-3)), O S, M (U 3)), FBF (1, Psibar, Coupling.S, Psi), G_Stt); ((M (D (-3)), O S, M (D 3)), FBF (1, Psibar, Coupling.S, Psi), G_Sbb); ((M (U (-2)), O S, M (U 2)), FBF (1, Psibar, Coupling.S, Psi), G_Scc); ((M (L (-2)), O S, M (L 2)), FBF (1, Psibar, Coupling.S, Psi), G_Smm); ((M (L (-3)), O S, M (L 3)), FBF (1, Psibar, Coupling.S, Psi), G_Stautau) ] let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs) ] let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2] let gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ); ((O S, G Wp, G Wm), Scalar_Vector_Vector 1, G_SWW); ((O S, G Z, G Z), Scalar_Vector_Vector 1, G_SZZ) ] let gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ; (O H, O S, G Wp, G Wm), Scalar2_Vector2 1, G_HSWW; (O H, O S, G Z, G Z), Scalar2_Vector2 1, G_HSZZ; (O S, O S, G Wp, G Wm), Scalar2_Vector2 1, G_SSWW; (O S, O S, G Z, G Z), Scalar2_Vector2 1, G_SSZZ ] let higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3; (O S, O H, O H), Scalar_Scalar_Scalar 1, G_HHS; (O S, O S, O H), Scalar_Scalar_Scalar 1, G_HSS ] let higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4_1; (O H, O H, O H, O S), Scalar4 1, G_H4_2; (O H, O H, O S, O S), Scalar4 1, G_H4_3; (O H, O S, O S, O S), Scalar4 1, G_H4_4; (O S, O S, O S, O S), Scalar4 1, G_H4_5 ] let anomaly_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg; (O S, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_SGaGa; (O S, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_SGaZ; (O S, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Sgg ] let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ anomaly_higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "S" -> O S | _ -> invalid_arg "Modellib_BSM.HSExt.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | S -> "S" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.HSExt.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | S -> "S" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | S -> "s" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | S -> 35 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_SWW -> "gsww" | G_SZZ -> "gszz" | G_SSWW -> "gssww" | G_SSZZ -> "gsszz" | G_HSWW -> "ghsww" | G_HSZZ -> "ghszz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hmm -> "ghmm" | G_Stt -> "gstt" | G_Sbb -> "gsbb" | G_Stautau -> "gstautau" | G_Scc -> "gscc" | G_Smm -> "gsmm" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_SGaZ -> "gsgaz" | G_SGaGa -> "gsgaga" | G_Sgg -> "gsgg" | G_H3 -> "gh3" | G_H4_1 -> "gh4_1" | G_H4_2 -> "gh4_2" | G_H4_3 -> "gh4_3" | G_H4_4 -> "gh4_4" | G_H4_5 -> "gh4_5" | G_HHS -> "ghhs" | G_HSS -> "ghss" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end (* \thocwmodulesection{Three-Site Higgsless Model} *) module type Threeshl_options = sig val include_ckm: bool val include_hf: bool val diet: bool end module Threeshl_no_ckm: Threeshl_options = struct let include_ckm = false let include_hf = true let diet = false end module Threeshl_ckm: Threeshl_options = struct let include_ckm = true let include_hf = true let diet = false end module Threeshl_no_ckm_no_hf: Threeshl_options = struct let include_ckm = false let include_hf = false let diet = false end module Threeshl_ckm_no_hf: Threeshl_options = struct let include_ckm = true let include_hf = false let diet = false end module Threeshl_diet_no_hf: Threeshl_options = struct let include_ckm = false let include_hf = false let diet = true end module Threeshl_diet: Threeshl_options = struct let include_ckm = false let include_hf = true let diet = true end (* We use one generic implementation of the model and implement different features via option modules given to a functor *) module Threeshl (Module_options: Threeshl_options) = struct open Coupling let modname = "Modellib_BSM.Threeshl" (* Shamelessly stolen from Modellib.SM3, but with no support for fudged width yet *) let default_width = ref Timelike (* If this flag is set true, all gauge bosons are assumed to be massless and are assigned feynman gauge propagators. This in conjunction with the unbroken three site model is intended for checking gauge invariance via the ward identites. *) let all_feynman = ref false let options = Options.create [ "constant_width", Arg.Unit (fun _ -> default_width := Constant), "use constant width (also in t-channel)"; "custom_width", Arg.String (fun x -> default_width := Custom x), "use custom width"; "cancel_widths", Arg.Unit (fun _ -> default_width := Vanishing), "use vanishing width"; "all_feynman", Arg.Unit (fun _ -> all_feynman := true), "assign feynman gauge propagators to all gauge bosons\n" ^ "\t(for checking the ward identities); use only if you *really* know\n" ^ "\twhat you are doing"] - + let caveats () = [] + (* The quantum numbers that are carried by the particles. \verb$csign$ is \emph{not} the charge carried by the particle, but differentiates between particles (\verb$Pos$) and antiparticles (\verb$Neg$) *) type kkmode = Light | Heavy type generation = Gen0 | Gen1 | Gen2 type csign = Pos | Neg type isospin = Iso_up | Iso_down (* Necessary to represent the indices of the couplings defined in FORTRAN *) type kk2 = Light2 | Heavy2 | Light_Heavy (* Map the different types to the constants used in the FORTRAN module *) let fspec_of_kkmode = function Light -> "l_mode" | Heavy -> "h_mode" let fspec_of_kk2 = function Light2 -> "l_mode" | Heavy2 -> "h_mode" | Light_Heavy -> "lh_mode" let fspec_of_gen = function Gen0 -> "gen_0" | Gen1 -> "gen_1" | Gen2 -> "gen_2" let fspec_of_iso = function Iso_up -> "iso_up" | Iso_down -> "iso_down" (* Covert the ``charge sign'' into a numeric sign (used e.g. in the determination of the MCID codes) *) let int_of_csign = function Pos -> 1 | Neg -> -1 (* Convert the generation into an integer (dito) *) let int_of_gen = function Gen0 -> 1 | Gen1 -> 2 | Gen2 -> 3 (* The type \verb$flavor$ is implemented as a variant. Fermions are implemented as a variant differentating between leptons and quarks (seemed the most natural way as this is also the way in which the FORTRAN code is structured). Bosons are implemented as a variant the differentiates between $W$, $Z$ and $A$. All other quantum numbers that are required for identifying the particles are carried by the variant constructors. *) type fermion = | Lepton of (kkmode * csign * generation * isospin) | Quark of (kkmode * csign * generation * isospin) type boson = | W of (kkmode * csign) | Z of kkmode | A | G type flavor = Fermion of fermion | Boson of boson (* Helpers to construct particles from quantum numbers *) let lepton kk cs gen iso = Lepton (kk, cs, gen, iso) let quark kk cs gen iso = Quark (kk, cs, gen, iso) let w kk cs = W (kk, cs) let z kk = Z kk let flavor_of_f x = Fermion x let flavor_of_b x = Boson x (* Map a list of functions to the list (partially) applied to a value *) let revmap funs v = List.map (fun x -> x v) funs (* The same for a list of values; the result is flattened *) let revmap2 funs vals = ThoList.flatmap (revmap funs) vals (* Functions to loop the constructors over quantum numbers for list creation purposes *) let loop_kk flist = revmap2 flist [Light; Heavy] let loop_cs flist = revmap2 flist [Pos; Neg] let loop_gen flist = revmap2 flist [Gen0; Gen1; Gen2] let loop_iso flist = revmap2 flist [Iso_up; Iso_down] let loop_kk2 flist = revmap2 flist [Light2; Heavy2; Light_Heavy] (* Conditional looping over kk modes depending on whether to include heavy fermions *) let cloop_kk flist = match Module_options.include_hf with | true -> loop_kk flist | false -> revmap flist Light let cloop_kk2 flist = match Module_options.include_hf with | true -> loop_kk2 flist | false -> revmap flist Light2 (* Having defined the necessary helpers, the magic of currying makes building lists of particles as easy as nesting the loop functions in the correct order... *) let all_leptons = loop_iso (loop_gen (loop_cs (cloop_kk [lepton] ))) let all_quarks = loop_iso( loop_gen (loop_cs (cloop_kk [quark] ))) let all_bosons = (loop_cs (loop_kk [w] )) @ [Z Light; Z Heavy; A; G] (* Converts a flavor spec to the BCD identifier defined in the FORTRAN module. Splitting the function into two parts \verb$prefix$ and \verb$rump$ removes a lot of redundancy. *) let bcdi_of_flavor = let prefix = function | Fermion (Lepton (Heavy, _, _, _)) | Fermion (Quark (Heavy, _, _, _)) | Boson (W (Heavy, _)) | Boson (Z Heavy) -> "h" | _ -> "" in let rump = function | Fermion (Lepton spec) -> (match spec with | (_, _, Gen0, Iso_up) -> "nue" | (_, _, Gen0, Iso_down) -> "e" | (_, _, Gen1, Iso_up) -> "numu" | (_, _, Gen1, Iso_down) -> "mu" | (_, _, Gen2, Iso_up) -> "nutau" | (_, _, Gen2, Iso_down) -> "tau") | Fermion (Quark spec) -> (match spec with | (_, _, Gen0, Iso_up) -> "u" | (_, _, Gen0, Iso_down) -> "d" | (_, _, Gen1, Iso_up) -> "c" | (_, _, Gen1, Iso_down) -> "s" | (_, _, Gen2, Iso_up) -> "t" | (_, _, Gen2, Iso_down) -> "b") | Boson (W _) -> "w" | Boson (Z _) -> "z" | Boson A -> invalid_arg (modname ^ ".bcd_of_flavor: no bcd for photon!") | Boson G -> invalid_arg (modname ^ ".bcd_of_flavor: no bcd for gluon!") in function x -> (prefix x) ^ (rump x) ^ "_bcd" (* The function defined in the model signature which returns the colour representation of a particle *) let color = let quarkrep = function | (_, Pos, _, _) -> Color.SUN 3 | (_, Neg, _, _) -> Color.SUN (-3) in function | Fermion (Quark x) -> quarkrep x | Boson G -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 (* Function for calculating the MCID code of a particle. Convenctions have been choosen such that the heavy modes are identified by the same numbers as the light ones, prefixed with \verb$99$. This is supposedly in accord with the conventions for adding new particles to the list of MCID codes. This function is required by the signature. *) let pdg = let iso_delta = function Iso_down -> 0 | Iso_up -> 1 in let gen_delta = function Gen0 -> 0 | Gen1 -> 2 | Gen2 -> 4 in let kk_delta = function Light -> 0 | Heavy -> 9900 in function | Fermion ( Lepton (kk, cs, gen, iso)) -> (int_of_csign cs) * (11 + (gen_delta gen) + (iso_delta iso) + (kk_delta kk)) | Fermion ( Quark (kk, cs, gen, iso)) -> (int_of_csign cs) * (1 + (gen_delta gen) + (iso_delta iso)+ (kk_delta kk)) | Boson (W (kk, cs)) -> (int_of_csign cs) * (24 + (kk_delta kk)) | Boson (Z kk) -> 23 + (kk_delta kk) | Boson A -> 22 | Boson G -> 21 (* Returns the lorentz representation of a particle; required by the signature. *) let lorentz = let spinor = function | (_, Pos, _, _) -> Spinor | (_, Neg, _, _) -> ConjSpinor in function | Fermion (Lepton x) | Fermion (Quark x) -> spinor x | Boson (W _) | Boson (Z _) -> Massive_Vector | Boson A -> Vector | Boson G -> Vector (* O'Mega supports models that allow different gauges; however, we only implement unitary gauge and therefore stub this (SM3 does the same thing). The \verb$gauge$ type as well as \verb$gauge_symbol$ are required by the signature. *) type gauge = unit let gauge_symbol () = failwith (modname ^ ".gauge_symbol: internal error") (* Returns the propagator for a given particle type. Required by signature. *) let propagator = let spinorprop = function | (_, Pos, _, _) -> Prop_Spinor | (_, Neg, _, _) -> Prop_ConjSpinor in function | Fermion (Lepton x) | Fermion (Quark x) -> spinorprop x | Boson (W _) | Boson (Z _) -> (match !all_feynman with false -> Prop_Unitarity | true -> Prop_Feynman) | Boson A -> Prop_Feynman | Boson G -> Prop_Feynman (* Return the width of a particle, required by signature. \\ \emph{TODO:} Refine such that stable particles always are treade via vanishing width, as this might speed up the generated code a bit. *) let width _ = !default_width (* Returns the conjugate particle; required by signature. *) let conjugate = let conj_csign = function | Pos -> Neg | Neg -> Pos in function | Fermion (Lepton (kk, cs, gen, iso)) -> Fermion (Lepton (kk, conj_csign cs, gen, iso)) | Fermion (Quark (kk, cs, gen, iso)) -> Fermion (Quark (kk, conj_csign cs, gen, iso)) | Boson (W (kk, cs)) -> Boson (W (kk, conj_csign cs)) | x -> x (* Tells the diagram generator whether a particle is a fermion, a conjugate fermion or a boson. Required by signature *) let fermion = function | Fermion (Lepton (_, cs, _, _)) | Fermion (Quark (_, cs, _, _)) -> int_of_csign cs | Boson _ -> 0 (* Charges are: charge, lepton number, baryon number, generation. Required by signature *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let qn_charge = function | Boson b -> (match b with | W (_, c) -> (int_of_csign (c)) // 1 | _ -> 0//1) | Fermion f -> (match f with | Lepton (_, c, _, Iso_up) -> 0//1 | Lepton (_, c, _, Iso_down) -> (-1 * int_of_csign (c)) // 1 | Quark (_, c, _, Iso_up) -> (2 * int_of_csign (c)) // 3 | Quark (_, c, _, Iso_down) -> (-1 * int_of_csign (c)) // 3) let qn_lepton = function | Fermion (Lepton (_, c, _, _)) -> int_of_csign (c) // 1 | _ -> 0//1 let qn_baryon = function | Fermion (Quark (_, c, _, _)) -> int_of_csign (c) // 1 | _ -> 0//1 (* Generation is conditional: if we enable the nontrivial CKM matrix, all particles carry generation [0; 0; 0] *) let qn_generation x = let qn cs gen = let c = int_of_csign (cs) in match gen with | Gen0 -> [c//1; 0//1; 0//1] | Gen1 -> [0//1; c//1; 0//1] | Gen2 -> [0//1; 0//1; c//1] in if Module_options.include_ckm then [0//1; 0//1; 0//1] else match x with | Fermion (Lepton (_, c, g, _)) -> qn c g | Fermion (Quark (_, c, g, _)) -> qn c g | _ -> [0//1; 0//1; 0//1] let charges x = [qn_charge x; qn_lepton x; qn_baryon x] @ (qn_generation x) (* A variant to represent the different coupling constants, choosen to mimic the FORTRAN part. Required by signature. *) type constant = | G_a_lep | G_a_quark of isospin | G_aww | G_aaww | G_w_lep of (kkmode * kkmode * generation * kkmode * generation) | G_w_quark of (kkmode * kkmode * generation * kkmode * generation) | G_z_lep of (kkmode * kk2 * generation * isospin) | G_z_quark of (kkmode * kk2 * generation * isospin) | G_wwz of (kk2 * kkmode) | G_wwzz of (kk2 * kk2) | G_wwza of (kk2 * kkmode) | G_wwww of int | G_s | IG_s | G_s2 (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) (* Functions for the construction of constants from indices *) let g_a_quark x = G_a_quark x let g_w_lep kk1 kk2 gen1 kk3 gen2 = G_w_lep (kk1, kk2, gen1, kk3, gen2) let g_w_quark kk1 kk2 gen1 kk3 gen2 = G_w_quark (kk1, kk2, gen1, kk3, gen2) let g_z_lep kk1 kk2 gen iso = G_z_lep (kk1, kk2, gen, iso) let g_z_quark kk1 kk2 gen iso = G_z_quark (kk1, kk2, gen, iso) let g_wwz kk1 kk2 = G_wwz (kk1, kk2) let g_wwzz kk1 kk2 = G_wwzz (kk1, kk2) let g_wwza kk1 kk2 = G_wwza (kk1, kk2) let g_wwww nhw = if (nhw >= 0) && (nhw <= 4) then G_wwww nhw else failwith (modname ^ ".g_wwww: invalid integer, very bad") (* Build a list of the different constants *) let clist = [G_a_lep; G_aww; G_aaww] @ (loop_iso [g_a_quark]) @ (loop_gen (cloop_kk (loop_gen (cloop_kk (loop_kk [g_w_lep] ))))) @ (loop_gen (cloop_kk (loop_gen (cloop_kk (loop_kk [g_w_quark] ))))) @ (loop_iso (loop_gen (cloop_kk2 (loop_kk [g_z_lep] )))) @ (loop_iso (loop_gen (cloop_kk2 (loop_kk [g_z_quark] )))) @ (loop_kk (loop_kk2 [g_wwz] )) @ (loop_kk2 (loop_kk2 [g_wwzz] )) @ (loop_kk (loop_kk2 [g_wwza] )) @ (List.map g_wwww [0; 1; 2; 3; 4]) (* Maximum number of lines meeting at a vertex, required by signature. *) let max_degree () = 4 (* Transform a pair of kk identifiers into a kk2 identifier *) let get_kk2 = function (Light, Light) -> Light2 | (Heavy, Heavy) -> Heavy2 | (Light, Heavy) | (Heavy, Light) -> Light_Heavy (* Flip isospin *) let conj_iso = function Iso_up -> Iso_down | Iso_down -> Iso_up (* Below, lists of couplings are generated which ultimately are joined into a list of all couplings in the model. The generated lists can be viewed using the \verb$dump.ml$ script in the O'Mega toplevel directory. \\ The individual couplings are defined as 5-tupels resp. 6-tupels consisting in this order of the particles meeting at the vertex, the coupling type (see \verb$couplings.ml$) and the coupling constant. *) (* List of $llA$ type vertices *) let vertices_all = let vgen kk gen = ((Fermion (Lepton (kk, Neg, gen, Iso_down)), Boson A, Fermion (Lepton (kk, Pos, gen, Iso_down))), FBF(1, Psibar, V, Psi), G_a_lep) in loop_gen (cloop_kk [vgen]) (* List of $qqA$ type vertices *) let vertices_aqq = let vgen kk gen iso = ((Fermion (Quark (kk, Neg, gen, iso)), Boson A, Fermion (Quark (kk, Pos, gen, iso))), FBF(1, Psibar, V, Psi), G_a_quark iso) in loop_iso (loop_gen (cloop_kk [vgen])) (* List of $\nu lW$ type vertices *) let vertices_wll = let vgen kkw kk_f kk_fbar iso_f gen = ((Fermion (Lepton (kk_fbar, Neg, gen, conj_iso iso_f)), Boson (W (kkw, (match iso_f with Iso_up -> Neg | _ -> Pos))), Fermion (Lepton (kk_f, Pos, gen, iso_f))), FBF (1, Psibar, VA2, Psi), G_w_lep (kkw, (match iso_f with Iso_up -> kk_f | _ -> kk_fbar), gen, (match iso_f with Iso_up -> kk_fbar | _ -> kk_f), gen) ) in loop_gen (loop_iso (cloop_kk (cloop_kk (loop_kk [vgen] )))) (* The same list, but without couplings between the $W^\prime$ and light fermions *) let vertices_wll_diet = let filter = function | ((Fermion (Lepton (Light, _, _, _)), Boson (W (Heavy, _)), Fermion (Lepton (Light, _, _, _))), _, _) -> false | _ -> true in List.filter filter vertices_wll (* List of $udW$ type vertices, flavor-diagonal *) let vertices_wqq_no_ckm = let vgen kkw kk_f kk_fbar iso_f gen = ((Fermion (Quark (kk_fbar, Neg, gen, conj_iso iso_f)), Boson (W (kkw, (match iso_f with Iso_up -> Neg | _ -> Pos))), Fermion (Quark (kk_f, Pos, gen, iso_f))), FBF (1, Psibar, VA2, Psi), G_w_quark (kkw, (match iso_f with Iso_up -> kk_f | _ -> kk_fbar), gen, (match iso_f with Iso_up -> kk_fbar | _ -> kk_f), gen) ) in loop_gen (loop_iso (cloop_kk (cloop_kk (loop_kk [vgen] )))) (* The same list, but without couplings between the $W^\prime$ and the first two generations of quarks *) let vertices_wqq_no_ckm_diet = let filter = function | ((Fermion (Quark (Light, _, gen, _)), Boson (W (Heavy, _)), Fermion (Quark (Light, _, _, _))), _, _) -> (match gen with Gen2 -> true | _ -> false) | _ -> true in List.filter filter vertices_wqq_no_ckm (* List of $udW$ type vertices, including non flavor-diagonal couplings *) let vertices_wqq = let vgen kkw kk_f gen_f kk_fbar gen_fbar iso_f = ((Fermion (Quark (kk_fbar, Neg, gen_fbar, conj_iso iso_f)), Boson (W (kkw, (match iso_f with Iso_up -> Neg | _ -> Pos))), Fermion (Quark (kk_f, Pos, gen_f, iso_f))), FBF (1, Psibar, VA2, Psi), G_w_quark (match iso_f with | Iso_up -> (kkw, kk_f, gen_f, kk_fbar, gen_fbar) | Iso_down -> (kkw, kk_fbar, gen_fbar, kk_f, gen_f))) in loop_iso (loop_gen (cloop_kk (loop_gen (cloop_kk (loop_kk [vgen] ))))) (* List of $llZ$ / $\nu\nu Z$ type vertices *) let vertices_zll = let vgen kkz kk_f kk_fbar gen iso = ((Fermion (Lepton (kk_fbar, Neg, gen, iso)), Boson (Z kkz), Fermion (Lepton (kk_f, Pos, gen, iso))), FBF (1, Psibar, VA2, Psi), G_z_lep (kkz, get_kk2 (kk_f, kk_fbar), gen, iso)) in loop_iso (loop_gen (cloop_kk (cloop_kk (loop_kk [vgen] )))) (* List of $qqZ$ type vertices *) let vertices_zqq = let vgen kkz kk_f kk_fbar gen iso = ((Fermion (Quark (kk_fbar, Neg, gen, iso)), Boson (Z kkz), Fermion (Quark (kk_f, Pos, gen, iso))), FBF (1, Psibar, VA2, Psi), G_z_quark (kkz, get_kk2 (kk_f, kk_fbar), gen, iso)) in loop_iso (loop_gen (cloop_kk (cloop_kk (loop_kk [vgen] )))) (* $gq\bar{q}$ *) let vertices_gqq = let vgen kk gen iso = ((Fermion (Quark (kk, Neg, gen, iso)), Boson G, Fermion (Quark (kk, Pos, gen, iso))), FBF (1, Psibar, V, Psi), G_s) in loop_iso (loop_gen (cloop_kk [vgen])) (* AWW *) let vertices_aww = let vgen kk = ( (Boson A, Boson (W (kk, Pos)), Boson (W (kk, Neg))), Gauge_Gauge_Gauge 1, G_aww) in loop_kk [vgen] (* ZWW *) let vertices_zww = let vgen kkz kkwp kkwm = ((Boson (Z kkz), Boson (W (kkwp, Pos)), Boson (W (kkwm, Neg))), Gauge_Gauge_Gauge 1, G_wwz (get_kk2 (kkwp, kkwm), kkz)) in loop_kk (loop_kk (loop_kk [vgen])) (* $ggg$ *) let vertices_ggg = [(Boson G, Boson G, Boson G), Gauge_Gauge_Gauge (-1), IG_s] (* Stolen from Modellib.SM; the signs seem to be OK. See \verb$couplings.ml$ for more docs. *) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] (* AAWW *) let vertices_aaww = let vgen kk = ((Boson A, Boson (W (kk, Pos)), Boson A, Boson (W (kk, Neg))), minus_gauge4, G_aaww) in loop_kk [vgen] (* WWZZ *) let vertices_wwzz = let vgen kkwp kkwm kk2z = ((Boson (Z (match kk2z with Heavy2 -> Heavy | Light2 | Light_Heavy -> Light)), Boson (W (kkwp, Pos)), Boson (Z (match kk2z with Heavy2 | Light_Heavy -> Heavy | Light2 -> Light)), Boson (W (kkwm, Neg))), minus_gauge4, G_wwzz (get_kk2 (kkwp, kkwm), kk2z)) in loop_kk2 (loop_kk (loop_kk [vgen])) (* WWZA *) let vertices_wwza = let vgen kkwp kkwm kkz = ((Boson A, Boson (W (kkwp, Pos)), Boson (Z kkz), Boson (W (kkwm, Neg))), minus_gauge4, G_wwza (get_kk2 (kkwp, kkwm), kkz)) in loop_kk (loop_kk (loop_kk [vgen])) (* WWWW *) let vertices_wwww = let count = function Light2 -> 0 | Light_Heavy -> 1 | Heavy2 -> 2 in let vgen kk2wp kk2wm = ((Boson (W ((match kk2wp with Heavy2 -> Heavy | Light2 | Light_Heavy -> Light), Pos)), Boson (W ((match kk2wm with Heavy2 -> Heavy | Light2 | Light_Heavy -> Light), Neg)), Boson (W ((match kk2wp with Heavy2 | Light_Heavy -> Heavy | Light2 -> Light), Pos)), Boson (W ((match kk2wm with Heavy2 | Light_Heavy -> Heavy | Light2 -> Light), Neg))), gauge4, G_wwww ((count kk2wp) + (count kk2wm))) in loop_kk2 (loop_kk2 [vgen]) (* gggg *) let vertices_gggg = [(Boson G, Boson G, Boson G, Boson G), gauge4, G_s2] (* The list of couplings is transformed into the fusion lists required by the generator by the Model.Fusions functor. *) (* This is copy\& paste from the other models; check again with Thorsten if it is correct *) module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end ) (* Not sure yet whether F.fusex also creates the conjugate vertices; by looking at the implementation of the other models, I assume it doesn't. Still, better ask Thorsten to be sure!!!\\ \emph{Update:} Still didn't get to ask, but since the results are consistent, I suspect my assertion is correct. \\ The stuff below is required by the signature. *) let vertices () = (vertices_all @ vertices_aqq @ (match Module_options.diet with | false -> vertices_wll | true -> vertices_wll_diet) @ (match (Module_options.include_ckm, Module_options.diet) with | (true, false) -> vertices_wqq | (false, false) -> vertices_wqq_no_ckm | (false, true) -> vertices_wqq_no_ckm_diet | (true, true) -> raise (Failure ("Modules4.Threeshl.vertices: CKM matrix together with option diet is not" ^ " implemented yet!"))) @ vertices_zll @ vertices_zqq @ vertices_aww @ vertices_zww @ vertices_gqq @ vertices_ggg, vertices_aaww @ vertices_wwzz @ vertices_wwza @ vertices_wwww @ vertices_gggg , []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table (* A function that returns a list of a flavours known to the model, required by the signature. *) let flavors () = (List.map flavor_of_f (all_leptons @ all_quarks)) @ (List.map flavor_of_b all_bosons) (* dito, external flavours, also required. *) let external_flavors () = [ "light leptons", List.map flavor_of_f (loop_iso (loop_gen( loop_cs [lepton Light]))); "light quarks", List.map flavor_of_f (loop_iso (loop_gen( loop_cs [quark Light]))); "light gauge bosons", List.map flavor_of_b [W (Light, Pos); W (Light, Neg); Z Light; A]; "heavy gauge bosons", List.map flavor_of_b [W (Heavy, Pos); W (Heavy, Neg); Z Heavy]] @ (match Module_options.include_hf with | true -> [ "heavy leptons", List.map flavor_of_f (loop_iso (loop_gen( loop_cs [lepton Heavy]))); "heavy quarks", List.map flavor_of_f (loop_iso (loop_gen( loop_cs [quark Heavy])))] | false -> [] ) @ ["gluons", [Boson G]] (* Which of the particles are goldstones? $\rightarrow$ none. Required by the signature. *) let goldstone x = None (* This is wrong but handy for debugging the constant identifier generation via -params. Usually, this function would return a record consisting of the parameters as well as expression for the dependent quantities that can be used to generate FORTRAN code for calculating them. However, we have a seperate module for the threeshl, so we can abuse this for debugging. Required by signature. *) let parameters () = {input = List.map (fun x -> (x, 0.)) clist; derived = []; derived_arrays = []} (* Convert a flavour into a ID string with which it will be referred by the user interface of the compiled generator. Required by signature *) let flavor_to_string = let prefix = function | Fermion (Lepton (Heavy, _, _, _)) | Fermion (Quark (Heavy, _, _, _)) | Boson (W (Heavy, _)) | Boson (Z Heavy) -> "H" | _ -> "" in let postfix = function | Fermion (Lepton (_, cs, _, Iso_down)) -> (match cs with Pos -> "-" | Neg -> "+") | Fermion (Quark (_, Neg, _, _)) | Fermion (Lepton (_, Neg, _, Iso_up)) -> "bar" | Boson (W (_, cs)) -> (match cs with Pos -> "+" | Neg -> "-") | _ -> "" in let rump = function | Fermion (Lepton desc) -> (match desc with | (_, _, Gen0, Iso_up) -> "nue" | (_, _, Gen0, Iso_down) -> "e" | (_, _, Gen1, Iso_up) -> "numu" | (_, _, Gen1, Iso_down) -> "mu" | (_, _, Gen2, Iso_up) -> "nutau" | (_, _, Gen2, Iso_down) -> "tau") | Fermion (Quark desc) -> (match desc with | (_, _, Gen0, Iso_up) -> "u" | (_, _, Gen0, Iso_down) -> "d" | (_, _, Gen1, Iso_up) -> "c" | (_, _, Gen1, Iso_down) -> "s" | (_, _, Gen2, Iso_up) -> "t" | (_, _, Gen2, Iso_down) -> "b") | Boson (W _) -> "W" | Boson (Z _) -> "Z" | Boson A -> "A" | Boson G -> "gl" in function x -> (prefix x) ^ (rump x) ^ (postfix x) (* Conversion of the ID string into a particle flavor. Instead of going through all cases again, we generate a ``dictionary'' of flavor / ID pairs which we use to identify the correct flavor. Required by signature. *) let flavor_of_string x = let dict = List.map (fun x -> (x, flavor_to_string x)) (flavors ()) in let get_ident = function (x, _) -> x in try get_ident (List.find (fun (_, y) -> (x = y)) dict) with Not_found -> (match x with | "g" -> Boson G | _ -> invalid_arg (modname ^ ".flavor_of_string") ) (* Converts a flavor into a symbol used as identification in the generated FORTRAN code (has to comply to the conventions of valid FORTRAN identifiers therefore). We stick to the same convenctions as SM3, prefixing heavy modes with a \verb$H$. Required by signature. *) let flavor_symbol = let prefix = function | Fermion (Lepton (Heavy, _, _, _)) | Fermion (Quark (Heavy, _, _, _)) | Boson (W (Heavy, _)) | Boson (Z Heavy) -> "H" | _ -> "" in let postfix = function | Fermion (Lepton (_, Neg, _, _)) | Fermion (Quark (_, Neg, _, _)) -> "b" | _ -> "" in let rump = function | Fermion spec -> (match spec with | Lepton (_, _, gen, Iso_up) -> "n" ^ (string_of_int (int_of_gen gen)) | Lepton (_, _, gen, Iso_down) -> "l" ^ (string_of_int (int_of_gen gen)) | Quark (_, _, gen, Iso_up) -> "u" ^ (string_of_int (int_of_gen gen)) | Quark (_, _, gen, Iso_down) -> "d"^ (string_of_int (int_of_gen gen))) | Boson spec -> (match spec with | W (_, Pos) -> "wp" | W (_, Neg) -> "wm" | Z _ -> "z" | A -> "a" | G -> "gl" ) in function x -> (prefix x) ^ (rump x) ^ (postfix x) (* Generate TeX for a flavor *) let flavor_to_TeX = let bar x y = match x with Neg -> "\\overline{" ^ y ^ "}" | Pos -> y in let pm x y = match x with Neg -> "{" ^ y ^ "}^+" | Pos -> "{" ^ y ^ "}^-" in let prime x y = match x with Light -> y | Heavy -> "{" ^ y ^ "}^\\prime" in function | Fermion (Lepton desc) -> (match desc with | (kk, cs, gen, Iso_up) -> prime kk (bar cs (match gen with | Gen0 -> "\\nu_e" | Gen1 -> "\\nu_\\mu" | Gen2 -> "\\nu_\\tau")) | (kk, cs, gen, Iso_down) -> prime kk (pm cs (match gen with | Gen0 -> "e" | Gen1 -> "\\mu" | Gen2 -> "\\tau"))) | Fermion (Quark (kk, cs, gen, iso)) -> prime kk (bar cs (match (gen, iso) with | (Gen0, Iso_up) -> "u" | (Gen0, Iso_down) -> "d" | (Gen1, Iso_up) -> "c" | (Gen1, Iso_down) -> "s" | (Gen2, Iso_up) -> "t" | (Gen2, Iso_down) -> "b")) | Boson spec -> (match spec with | W (kk, cs) -> prime kk (pm (match cs with Pos -> Neg | Neg -> Pos) "W") | Z kk -> prime kk "Z" | A -> "A" | G -> "g") (* Returns the string referring to the particle mass in the generated FORTRAN code. Required by signature. *) let mass_symbol = function | Boson A | Boson G-> "0._default" | x -> "mass_array(" ^ (bcdi_of_flavor x) ^ ")" (* Dito, for width. Required by signature. *) let width_symbol = function | Boson A | Boson G -> "0._default" | x -> "width_array(" ^ (bcdi_of_flavor x) ^ ")" (* Determines the string referring to a coupling constant in the generated FORTRAN code. Required by signature. *) let constant_symbol = let c = ", " in let g_w_ferm = function (kk1, kk2, gen1, kk3, gen2) -> ":, " ^ (fspec_of_kkmode kk1) ^ c ^ (fspec_of_kkmode kk2) ^ c ^ (fspec_of_gen gen1) ^ c ^ (fspec_of_kkmode kk3) ^ c ^ (fspec_of_gen gen2) in let g_z_ferm = function (kk1, kk2, gen, iso) -> ":, " ^ (fspec_of_kkmode kk1) ^ c ^ (fspec_of_kk2 kk2) ^ c ^ (fspec_of_gen gen) ^ c ^ (fspec_of_iso iso) in function | G_a_lep -> "g_a_lep" | G_s -> "g_s_norm" | IG_s -> "ig_s_norm" | G_s2 -> "g_s_norm2" | G_a_quark iso -> "g_a_quark(" ^ (fspec_of_iso iso) ^ ")" | G_aww -> "ig_aww" | G_aaww -> "g_aaww" | G_w_lep spec -> "g_w_lep_va(" ^ (g_w_ferm spec) ^ ")" | G_w_quark spec -> "g_w_quark_va(" ^ (g_w_ferm spec) ^ ")" | G_z_lep spec -> "g_z_lep_va(" ^ (g_z_ferm spec) ^ ")" | G_z_quark spec -> "g_z_quark_va(" ^ (g_z_ferm spec) ^ ")" | G_wwz (kk1, kk2) -> "ig_wwz(" ^ (fspec_of_kk2 kk1) ^ c ^ (fspec_of_kkmode kk2) ^ ")" | G_wwzz (kk1, kk2) -> "g_wwzz(" ^ (fspec_of_kk2 kk1) ^ c ^ (fspec_of_kk2 kk2) ^ ")" | G_wwza (kk1, kk2) -> "g_wwza(" ^(fspec_of_kk2 kk1) ^ c ^ (fspec_of_kkmode kk2) ^ ")" | G_wwww nhw -> if (0 <= nhw) && (nhw <= 4) then "g_wwww(" ^ (string_of_int nhw) ^ ")" else failwith "Modules4.Threeshl.constant_symbol: invalid int for G_wwww; very bad" end (* \thocwmodulesection{THDM with and without non-trivial flavor structure} *) module type THDM_flags = sig val ckm_present : bool end module THDM : THDM_flags = struct let ckm_present = false end module THDM_CKM : THDM_flags = struct let ckm_present = true end module TwoHiggsDoublet (Flags : THDM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | Hh | HA | HH | Hp | Hm type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.TwoHiggsDoublet.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [Hh; HH; HA; Hp; Hm]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> Scalar let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | Hh | HH | HA | Hp | Hm -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | Hh -> Hh | HH -> HH | HA -> HA | Hp -> Hm | Hm -> Hp end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("Modellib_BSM.TwoHiggsDoublet.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [ 0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | Hh | HH | HA | Phi0 -> 0//1 | Hp | Phip -> 1//1 | Hm | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | I_Q_W | I_G_ZWW | I_G_WWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_htt | G_hbb | G_hcc | G_htautau | G_hmumu | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_Hmumu | I_G_Att | I_G_Abb | I_G_Acc | I_G_Atautau | I_G_Amumu | G_Htb | G_Hcs | G_Htaunu | G_Hmunu | Gs | I_Gs | G2 | G_AHpHm | G_ZHpHm | G_Zh1h2 | G_Zh1h3 | G_Zh2h3 | G_WpHmh1 | G_WpHmh2 | G_WpHmh3 | G_WmHph1 | G_WmHph2 | G_WmHph3 | G_h1ZZ | G_h2ZZ | G_h3ZZ | G_h1WpWm | G_h2WpWm | G_h3WpWm | G_hhWpWm | G_hhZZ | G_HpHmAA | G_HpHmZZ | G_HpHmAZ | G_HpHmWpWm | G_h1HpAWm | G_h2HpAWm | G_h3HpAWm | G_h1HpZWm | G_h2HpZWm | G_h3HpZWm | G_h1HpAWmC | G_h2HpAWmC | G_h3HpAWmC | G_h1HpZWmC | G_h2HpZWmC | G_h3HpZWmC | G_h1HpHm | G_h2HpHm | G_h3HpHm | G_h111 | G_h112 | G_h113 | G_h221 | G_h222 | G_h223 | G_h331 | G_h332 | G_h333 | G_h123 | G_HpHmHpHm | G_HpHm11 | G_HpHm12 | G_HpHm13 | G_HpHm22 | G_HpHm23 | G_HpHm33 | G_h1111 | G_h1112 | G_h1113 | G_h1122 | G_h1123 | G_h1133 | G_h1222 | G_h1223 | G_h1233 | G_h1333 | G_h2222 | G_h2223 | G_h2233 | G_h2333 | G_h3333 | G_h1uu | G_h2uu | G_h3uu | G_h1uc | G_h2uc | G_h3uc | G_h1ut | G_h2ut | G_h3ut | G_h1cu | G_h2cu | G_h3cu | G_h1cc | G_h2cc | G_h3cc | G_h1ct | G_h2ct | G_h3ct | G_h1tu | G_h2tu | G_h3tu | G_h1tc | G_h2tc | G_h3tc | G_h1tt | G_h2tt | G_h3tt | G_h1dd | G_h2dd | G_h3dd | G_h1ds | G_h2ds | G_h3ds | G_h1db | G_h2db | G_h3db | G_h1sd | G_h2sd | G_h3sd | G_h1ss | G_h2ss | G_h3ss | G_h1sb | G_h2sb | G_h3sb | G_h1bd | G_h2bd | G_h3bd | G_h1bs | G_h2bs | G_h3bs | G_h1bb | G_h2bb | G_h3bb | G_hud | G_hus | G_hub | G_hcd | G_hcs | G_hcb | G_htd | G_hts | G_htb | G_hdu | G_hdc | G_hdt | G_hsu | G_hsc | G_hst | G_hbu | G_hbc | G_hbt | G_he1n1 | G_he1n2 | G_he1n3 | G_he2n1 | G_he2n2 | G_he2n3 | G_he3n1 | G_he3n2 | G_he3n3 | G_hn1e1 | G_hn1e2 | G_hn1e3 | G_hn2e1 | G_hn2e2 | G_hn2e3 | G_hn3e1 | G_hn3e2 | G_hn3e3 | G_h1e1e1 | G_h2e1e1 | G_h3e1e1 | G_h1e1e2 | G_h2e1e2 | G_h3e1e2 | G_h1e1e3 | G_h2e1e3 | G_h3e1e3 | G_h1e2e1 | G_h2e2e1 | G_h3e2e1 | G_h1e2e2 | G_h2e2e2 | G_h3e2e2 | G_h1e2e3 | G_h2e2e3 | G_h3e2e3 | G_h1e3e1 | G_h2e3e1 | G_h3e3e1 | G_h1e3e2 | G_h2e3e2 | G_h3e3e2 | G_h1e3e3 | G_h2e3e3 | G_h3e3e3 | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let array_list = [G_h1uu; G_h2uu; G_h3uu; G_h1uc; G_h2uc; G_h3uc; G_h1ut; G_h2ut; G_h3ut; G_h1cu; G_h2cu; G_h3cu; G_h1cc; G_h2cc; G_h3cc; G_h1ct; G_h2ct; G_h3ct; G_h1tu; G_h2tu; G_h3tu; G_h1tc; G_h2tc; G_h3tc; G_h1tt; G_h2tt; G_h3tt; G_h1dd; G_h2dd; G_h3dd; G_h1ds; G_h2ds; G_h3ds; G_h1db; G_h2db; G_h3db; G_h1sd; G_h2sd; G_h3sd; G_h1ss; G_h2ss; G_h3ss; G_h1sb; G_h2sb; G_h3sb; G_h1bd; G_h2bd; G_h3bd; G_h1bs; G_h2bs; G_h3bs; G_h1bb; G_h2bb; G_h3bb; G_hud; G_hus; G_hub; G_hcd; G_hcs; G_hcb; G_htd; G_hts; G_htb; G_hdu; G_hdc; G_hdt; G_hsu; G_hsc; G_hst; G_hbu; G_hbc; G_hbt; G_he1n1; G_he1n2; G_he1n3; G_he2n1; G_he2n2; G_he2n3; G_he3n1; G_he3n2; G_he3n3; G_hn1e1; G_hn1e2; G_hn1e3; G_hn2e1; G_hn2e2; G_hn2e3; G_hn3e1; G_hn3e2; G_hn3e3; G_h1e1e1; G_h2e1e1; G_h3e1e1; G_h1e1e2; G_h2e1e2; G_h3e1e2; G_h1e1e3; G_h2e1e3; G_h3e1e3; G_h1e2e1; G_h2e2e1; G_h3e2e1; G_h1e2e2; G_h2e2e2; G_h3e2e2; G_h1e2e3; G_h2e2e3; G_h3e2e3; G_h1e3e1; G_h2e3e1; G_h3e3e1; G_h1e3e2; G_h2e3e2; G_h3e3e2; G_h1e3e3; G_h2e3e3; G_h3e3e3] let add_complex_array_tag c = (Complex_Array c, [Integer 0; Integer 0]) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)); ] @ (List.map add_complex_array_tag array_list) let parameters () = { input = []; derived = []; derived_arrays = derived_parameter_arrays} module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF (1, Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF (1, Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC); ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let yukawa = [ ((M (U (-1)),O Hh,M (U 1)), FBF (1,Psibar,SP,Psi), G_h1uu); ((M (U (-1)),O HH,M (U 1)), FBF (1,Psibar,SP,Psi), G_h2uu); ((M (U (-1)),O HA,M (U 1)), FBF (1,Psibar,SP,Psi), G_h3uu); ((M (U (-2)),O Hh,M (U 2)), FBF (1,Psibar,SP,Psi), G_h1cc); ((M (U (-2)),O HH,M (U 2)), FBF (1,Psibar,SP,Psi), G_h2cc); ((M (U (-2)),O HA,M (U 2)), FBF (1,Psibar,SP,Psi), G_h3cc); ((M (U (-3)),O Hh,M (U 3)), FBF (1,Psibar,SP,Psi), G_h1tt); ((M (U (-3)),O HH,M (U 3)), FBF (1,Psibar,SP,Psi), G_h2tt); ((M (U (-3)),O HA,M (U 3)), FBF (1,Psibar,SP,Psi), G_h3tt); ((M (D (-1)),O Hh,M (D 1)), FBF (1,Psibar,SP,Psi), G_h1dd); ((M (D (-1)),O HH,M (D 1)), FBF (1,Psibar,SP,Psi), G_h2dd); ((M (D (-1)),O HA,M (D 1)), FBF (1,Psibar,SP,Psi), G_h3dd); ((M (D (-2)),O Hh,M (D 2)), FBF (1,Psibar,SP,Psi), G_h1ss); ((M (D (-2)),O HH,M (D 2)), FBF (1,Psibar,SP,Psi), G_h2ss); ((M (D (-2)),O HA,M (D 2)), FBF (1,Psibar,SP,Psi), G_h3ss); ((M (D (-3)),O Hh,M (D 3)), FBF (1,Psibar,SP,Psi), G_h1bb); ((M (D (-3)),O HH,M (D 3)), FBF (1,Psibar,SP,Psi), G_h2bb); ((M (D (-3)),O HA,M (D 3)), FBF (1,Psibar,SP,Psi), G_h3bb); ((M (U (-1)),O Hp,M (D 1)), FBF (1,Psibar,SP,Psi), G_hud); ((M (U (-2)),O Hp,M (D 2)), FBF (1,Psibar,SP,Psi), G_hcs); ((M (U (-3)),O Hp,M (D 3)), FBF (1,Psibar,SP,Psi), G_htb); ((M (D (-1)),O Hm,M (U 1)), FBF (1,Psibar,SP,Psi), G_hdu); ((M (D (-2)),O Hm,M (U 2)), FBF (1,Psibar,SP,Psi), G_hsc); ((M (D (-3)),O Hm,M (U 3)), FBF (1,Psibar,SP,Psi), G_hbt); ((M (L (-1)),O Hh,M (L 1)), FBF (1,Psibar,SP,Psi), G_h1e1e1); ((M (L (-1)),O HH,M (L 1)), FBF (1,Psibar,SP,Psi), G_h2e1e1); ((M (L (-1)),O HA,M (L 1)), FBF (1,Psibar,SP,Psi), G_h3e1e1); ((M (L (-2)),O Hh,M (L 2)), FBF (1,Psibar,SP,Psi), G_h1e2e2); ((M (L (-2)),O HH,M (L 2)), FBF (1,Psibar,SP,Psi), G_h2e2e2); ((M (L (-2)),O HA,M (L 2)), FBF (1,Psibar,SP,Psi), G_h3e2e2); ((M (L (-3)),O Hh,M (L 3)), FBF (1,Psibar,SP,Psi), G_h1e3e3); ((M (L (-3)),O HH,M (L 3)), FBF (1,Psibar,SP,Psi), G_h2e3e3); ((M (L (-3)),O HA,M (L 3)), FBF (1,Psibar,SP,Psi), G_h3e3e3) (*i ((M (N (-1)),O Hp,M (L 1)), FBF (1,Psibar,SR,Psi), G_hn1e1); ((M (N (-2)),O Hp,M (L 2)), FBF (1,Psibar,SR,Psi), G_hn2e2); ((M (N (-3)),O Hp,M (L 3)), FBF (1,Psibar,SR,Psi), G_hn3e3); ((M (L (-1)),O Hm,M (N 1)), FBF (1,Psibar,SL,Psi), G_he1n1); ((M (L (-2)),O Hm,M (N 2)), FBF (1,Psibar,SL,Psi), G_he2n2); ((M (L (-3)),O Hm,M (N 3)), FBF (1,Psibar,SL,Psi), G_he3n3); i*) ] @ if Flags.ckm_present then [((M (U (-1)),O Hh, M (U 2)), FBF (1,Psibar,SP,Psi), G_h1uc); ((M (U (-1)),O Hh, M (U 3)), FBF (1,Psibar,SP,Psi), G_h1ut); ((M (U (-2)),O Hh,M (U 1)), FBF (1,Psibar,SP,Psi), G_h1cu); ((M (U (-2)),O Hh,M (U 3)), FBF (1,Psibar,SP,Psi), G_h1ct); ((M (U (-1)),O HH,M (U 2)), FBF (1,Psibar,SP,Psi), G_h2uc); ((M (U (-1)),O HH,M (U 3)), FBF (1,Psibar,SP,Psi), G_h2ut); ((M (U (-1)),O HA,M (U 2)), FBF (1,Psibar,SP,Psi), G_h3uc); ((M (U (-1)),O HA,M (U 3)), FBF (1,Psibar,SP,Psi), G_h3ut); ((M (U (-2)),O HH,M (U 1)), FBF (1,Psibar,SP,Psi), G_h2cu); ((M (U (-2)),O HH,M (U 3)), FBF (1,Psibar,SP,Psi), G_h2ct); ((M (U (-2)),O HA,M (U 1)), FBF (1,Psibar,SP,Psi), G_h3cu); ((M (U (-2)),O HA,M (U 3)), FBF (1,Psibar,SP,Psi), G_h3ct); ((M (U (-3)),O Hh,M (U 1)), FBF (1,Psibar,SP,Psi), G_h1tu); ((M (U (-3)),O Hh,M (U 2)), FBF (1,Psibar,SP,Psi), G_h1tc); ((M (U (-3)),O HH,M (U 1)), FBF (1,Psibar,SP,Psi), G_h2tu); ((M (U (-3)),O HH,M (U 2)), FBF (1,Psibar,SP,Psi), G_h2tc); ((M (U (-3)),O HA,M (U 1)), FBF (1,Psibar,SP,Psi), G_h3tu); ((M (U (-3)),O HA,M (U 2)), FBF (1,Psibar,SP,Psi), G_h3tc); ((M (D (-1)),O Hh,M (D 2)), FBF (1,Psibar,SP,Psi), G_h1ds); ((M (D (-1)),O Hh,M (D 3)), FBF (1,Psibar,SP,Psi), G_h1db); ((M (D (-1)),O HH,M (D 2)), FBF (1,Psibar,SP,Psi), G_h2ds); ((M (D (-1)),O HH,M (D 3)), FBF (1,Psibar,SP,Psi), G_h2db); ((M (D (-1)),O HA,M (D 2)), FBF (1,Psibar,SP,Psi), G_h3ds); ((M (D (-1)),O HA,M (D 3)), FBF (1,Psibar,SP,Psi), G_h3db); ((M (D (-2)),O Hh,M (D 1)), FBF (1,Psibar,SP,Psi), G_h1sd); ((M (D (-2)),O Hh,M (D 3)), FBF (1,Psibar,SP,Psi), G_h1sb); ((M (D (-2)),O HH,M (D 1)), FBF (1,Psibar,SP,Psi), G_h2sd); ((M (D (-2)),O HH,M (D 3)), FBF (1,Psibar,SP,Psi), G_h2sb); ((M (D (-2)),O HA,M (D 1)), FBF (1,Psibar,SP,Psi), G_h3sd); (*i ((M (N (-1)),O Hp,M (L 2)), FBF (1,Psibar,SR,Psi), G_hn1e2); ((M (N (-1)),O Hp,M (L 3)), FBF (1,Psibar,SR,Psi), G_hn1e3); ((M (N (-2)),O Hp,M (L 1)), FBF (1,Psibar,SR,Psi), G_hn2e1); ((M (N (-2)),O Hp,M (L 3)), FBF (1,Psibar,SR,Psi), G_hn2e3); ((M (N (-3)),O Hp,M (L 1)), FBF (1,Psibar,SR,Psi), G_hn3e1); ((M (N (-3)),O Hp,M (L 2)), FBF (1,Psibar,SR,Psi), G_hn3e2); ((M (L (-1)),O Hm,M (N 2)), FBF (1,Psibar,SL,Psi), G_he1n2); ((M (L (-1)),O Hm,M (N 3)), FBF (1,Psibar,SL,Psi), G_he1n3); ((M (L (-2)),O Hm,M (N 1)), FBF (1,Psibar,SL,Psi), G_he2n1); ((M (L (-2)),O Hm,M (N 3)), FBF (1,Psibar,SL,Psi), G_he2n3); ((M (L (-3)),O Hm,M (N 1)), FBF (1,Psibar,SL,Psi), G_he3n1); ((M (L (-3)),O Hm,M (N 2)), FBF (1,Psibar,SL,Psi), G_he3n2); i*) ((M (L (-1)),O Hh,M (L 2)), FBF (1,Psibar,SP,Psi), G_h1e1e2); ((M (L (-1)),O Hh,M (L 3)), FBF (1,Psibar,SP,Psi), G_h1e1e3); ((M (L (-1)),O HH,M (L 2)), FBF (1,Psibar,SP,Psi), G_h2e1e2); ((M (L (-1)),O HH,M (L 3)), FBF (1,Psibar,SP,Psi), G_h2e1e3); ((M (L (-1)),O HA,M (L 2)), FBF (1,Psibar,SP,Psi), G_h3e1e2); ((M (L (-1)),O HA,M (L 3)), FBF (1,Psibar,SP,Psi), G_h3e1e3); ((M (L (-2)),O Hh,M (L 1)), FBF (1,Psibar,SP,Psi), G_h1e2e1); ((M (L (-2)),O Hh,M (L 3)), FBF (1,Psibar,SP,Psi), G_h1e2e3); ((M (L (-2)),O HH,M (L 1)), FBF (1,Psibar,SP,Psi), G_h2e2e1); ((M (L (-2)),O HH,M (L 3)), FBF (1,Psibar,SP,Psi), G_h2e2e3); ((M (L (-2)),O HA,M (L 1)), FBF (1,Psibar,SP,Psi), G_h3e2e1); ((M (L (-2)),O HA,M (L 3)), FBF (1,Psibar,SP,Psi), G_h3e2e3); ((M (L (-3)),O Hh,M (L 1)), FBF (1,Psibar,SP,Psi), G_h1e3e1); ((M (L (-3)),O Hh,M (L 2)), FBF (1,Psibar,SP,Psi), G_h1e3e2); ((M (L (-3)),O HH,M (L 1)), FBF (1,Psibar,SP,Psi), G_h2e3e1); ((M (L (-3)),O HH,M (L 2)), FBF (1,Psibar,SP,Psi), G_h2e3e2); ((M (L (-3)),O HA,M (L 1)), FBF (1,Psibar,SP,Psi), G_h3e3e1); ((M (L (-3)),O HA,M (L 2)), FBF (1,Psibar,SP,Psi), G_h3e3e2) ] else [] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{QGC}} = - g^2 W_{+,\mu} W_{-,\nu} W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Actually, quartic gauge couplings are a little bit more straightforward using auxiliary fields. Here we have to impose the antisymmetry manually: \begin{subequations} \begin{multline} (W^{+,\mu}_1 W^{-,\nu}_2 - W^{+,\nu}_1 W^{-,\mu}_2) (W^+_{3,\mu} W^-_{4,\nu} - W^+_{3,\nu} W^-_{4,\mu}) \\ = 2(W^+_1W^+_3)(W^-_2W^-_4) - 2(W^+_1W^-_4)(W^-_2W^+_3) \end{multline} also ($V$ can be $A$ or $Z$) \begin{multline} (W^{+,\mu}_1 V^\nu_2 - W^{+,\nu}_1 V^\mu_2) (W^-_{3,\mu} V_{4,\nu} - W^-_{3,\nu} V_{4,\mu}) \\ = 2(W^+_1W^-_3)(V_2V_4) - 2(W^+_1V_4)(V_2W^-_3) \end{multline} \end{subequations} *) (* \begin{subequations} \begin{multline} W^{+,\mu} W^{-,\nu} W^+_\mu W^-_\nu \end{multline} \end{subequations} *) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2] let gauge_higgs = [ (G Ga, O Hp, O Hm), Vector_Scalar_Scalar 1, G_AHpHm; (G Z, O Hp, O Hm), Vector_Scalar_Scalar 1, G_ZHpHm; (G Z, O Hh, O HH), Vector_Scalar_Scalar 1, G_Zh1h2; (G Z, O Hh, O HA), Vector_Scalar_Scalar 1, G_Zh1h3; (G Z, O HH, O HA), Vector_Scalar_Scalar 1, G_Zh2h3; (G Wp, O Hm, O Hh), Vector_Scalar_Scalar 1, G_WpHmh1; (G Wp, O Hm, O HH), Vector_Scalar_Scalar 1, G_WpHmh2; (G Wp, O Hm, O HA), Vector_Scalar_Scalar 1, G_WpHmh3; (G Wm, O Hp, O Hh), Vector_Scalar_Scalar 1, G_WmHph1; (G Wm, O Hp, O HH), Vector_Scalar_Scalar 1, G_WmHph2; (G Wm, O Hp, O HA), Vector_Scalar_Scalar 1, G_WmHph3; (O Hh, G Z, G Z), Scalar_Vector_Vector 1, G_h1ZZ; (O HH, G Z, G Z), Scalar_Vector_Vector 1, G_h2ZZ; (O HA, G Z, G Z), Scalar_Vector_Vector 1, G_h3ZZ; (O Hh, G Wp, G Wm), Scalar_Vector_Vector 1, G_h1WpWm; (O HH, G Wp, G Wm), Scalar_Vector_Vector 1, G_h2WpWm; (O HA, G Wp, G Wm), Scalar_Vector_Vector 1, G_h3WpWm ] let gauge_higgs4 = [ (O Hh, O Hh, G Wp, G Wm), Scalar2_Vector2 1, G_hhWpWm; (O HH, O HH, G Wp, G Wm), Scalar2_Vector2 1, G_hhWpWm; (O HA, O HA, G Wp, G Wm), Scalar2_Vector2 1, G_hhWpWm; (O Hh, O Hh, G Z, G Z), Scalar2_Vector2 1, G_hhZZ; (O HH, O HH, G Z, G Z), Scalar2_Vector2 1, G_hhZZ; (O HA, O HA, G Z, G Z), Scalar2_Vector2 1, G_hhZZ; (O Hp, O Hm, G Ga, G Ga), Scalar2_Vector2 1, G_HpHmAA; (O Hp, O Hm, G Z, G Z), Scalar2_Vector2 1, G_HpHmZZ; (O Hp, O Hm, G Ga, G Z), Scalar2_Vector2 1, G_HpHmAZ; (O Hp, O Hm, G Wp, G Wm), Scalar2_Vector2 1, G_HpHmWpWm; (O Hh, O Hp, G Ga, G Wm), Scalar2_Vector2 1, G_h1HpAWm; (O HH, O Hp, G Ga, G Wm), Scalar2_Vector2 1, G_h2HpAWm; (O HA, O Hp, G Ga, G Wm), Scalar2_Vector2 1, G_h3HpAWm; (O Hh, O Hp, G Z, G Wm), Scalar2_Vector2 1, G_h1HpZWm; (O HH, O Hp, G Z, G Wm), Scalar2_Vector2 1, G_h2HpZWm; (O HA, O Hp, G Z, G Wm), Scalar2_Vector2 1, G_h3HpZWm; (O Hh, O Hm, G Ga, G Wp), Scalar2_Vector2 1, G_h1HpAWmC; (O HH, O Hm, G Ga, G Wp), Scalar2_Vector2 1, G_h2HpAWmC; (O HA, O Hm, G Ga, G Wp), Scalar2_Vector2 1, G_h3HpAWmC; (O Hh, O Hm, G Z, G Wp), Scalar2_Vector2 1, G_h1HpZWmC; (O HH, O Hm, G Z, G Wp), Scalar2_Vector2 1, G_h2HpZWmC; (O HA, O Hm, G Z, G Wp), Scalar2_Vector2 1, G_h3HpZWmC ] let higgs = [ (O Hh, O Hp, O Hm), Scalar_Scalar_Scalar 1, G_h1HpHm; (O HH, O Hp, O Hm), Scalar_Scalar_Scalar 1, G_h2HpHm; (O HA, O Hp, O Hm), Scalar_Scalar_Scalar 1, G_h3HpHm; (O Hh, O Hh, O Hh), Scalar_Scalar_Scalar 1, G_h111; (O Hh, O Hh, O HH), Scalar_Scalar_Scalar 1, G_h112; (O Hh, O Hh, O HA), Scalar_Scalar_Scalar 1, G_h113; (O HH, O HH, O Hh), Scalar_Scalar_Scalar 1, G_h221; (O HH, O HH, O HH), Scalar_Scalar_Scalar 1, G_h222; (O HH, O HH, O HA), Scalar_Scalar_Scalar 1, G_h223; (O HA, O HA, O Hh), Scalar_Scalar_Scalar 1, G_h331; (O HA, O HA, O HH), Scalar_Scalar_Scalar 1, G_h332; (O HA, O HA, O HA), Scalar_Scalar_Scalar 1, G_h333; (O Hh, O HH, O HA), Scalar_Scalar_Scalar 1, G_h123 ] let higgs4 = [ (O Hp, O Hm, O Hp, O Hm), Scalar4 1, G_HpHmHpHm; (O Hp, O Hm, O Hh, O Hh), Scalar4 1, G_HpHm11; (O Hp, O Hm, O Hh, O HH), Scalar4 1, G_HpHm12; (O Hp, O Hm, O Hh, O HA), Scalar4 1, G_HpHm13; (O Hp, O Hm, O HH, O HH), Scalar4 1, G_HpHm22; (O Hp, O Hm, O HH, O HA), Scalar4 1, G_HpHm23; (O Hp, O Hm, O HA, O HA), Scalar4 1, G_HpHm33; (O Hh, O Hh, O Hh, O Hh), Scalar4 1, G_h1111; (O Hh, O Hh, O Hh, O HH), Scalar4 1, G_h1112; (O Hh, O Hh, O Hh, O HA), Scalar4 1, G_h1113; (O Hh, O Hh, O HH, O HH), Scalar4 1, G_h1122; (O Hh, O Hh, O HH, O HA), Scalar4 1, G_h1123; (O Hh, O Hh, O HA, O HA), Scalar4 1, G_h1133; (O Hh, O HH, O HH, O HH), Scalar4 1, G_h1222; (O Hh, O HH, O HH, O HA), Scalar4 1, G_h1223; (O Hh, O HH, O HA, O HA), Scalar4 1, G_h1233; (O Hh, O HA, O HA, O HA), Scalar4 1, G_h1333; (O HH, O HH, O HH, O HH), Scalar4 1, G_h2222; (O HH, O HH, O HH, O HA), Scalar4 1, G_h2223; (O HH, O HH, O HA, O HA), Scalar4 1, G_h2233; (O HH, O HA, O HA, O HA), Scalar4 1, G_h2333; (O HA, O HA, O HA, O HA), Scalar4 1, G_h3333 ] let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ ThoList.flatmap charged_currents [1;2;3] @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "h0" -> O Hh | "H0" -> O HH | "A0" -> O HA | _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | Hh -> "h0" | HH -> "H0" | HA -> "A0" | Hp -> "H+" | Hm -> "H-" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.TwoHiggsDoublet.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | Hh -> "h^0" | HH -> "H^0" | HA -> "A^0" | Hp -> "H^+" | Hm -> "H^-" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | Hh -> "h" | HH -> "h0" | HA -> "a0" | Hp -> "hp" | Hm -> "hm" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip -> 27 | Phim -> -27 | Phi0 -> 26 | Hh -> 25 | HH -> 35 | HA -> 36 | Hp -> 37 | Hm -> -37 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_CC -> "gcc" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | I_G_WWW -> "igwww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_htt -> "ghtt" | G_hbb -> "ghbb" | G_hcc -> "ghcc" | G_Htt -> "gh0tt" | G_Hbb -> "gh0bb" | G_Hcc -> "gh0cc" | I_G_Att -> "iga0tt" | I_G_Abb -> "iga0bb" | I_G_Acc -> "iga0cc" | G_htautau -> "ghtautau" | G_hmumu -> "ghmumu" | G_Htautau -> "gh0tautau" | G_Hmumu -> "gh0mumu" | I_G_Atautau -> "iga0tautau" | I_G_Amumu -> "iga0mumu" | G_Htb -> "ghptb" | G_Hcs -> "ghpcs" | G_Htaunu -> "ghptaunu" | G_Hmunu -> "ghpmunu" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | G_AHpHm -> "gAHpHm" | G_ZHpHm -> "gZHpHm" | G_Zh1h2 -> "gZh1h2" | G_Zh1h3 -> "gZh1h3" | G_Zh2h3 -> "gZh2h3" | G_WpHmh1 -> "gWpHmh1" | G_WpHmh2 -> "gWpHmh2" | G_WpHmh3 -> "gWpHmh3" | G_WmHph1 -> "gWmHph1" | G_WmHph2 -> "gWmHph2" | G_WmHph3 -> "gWmHph3" | G_h1ZZ -> "gh1ZZ" | G_h2ZZ -> "gh2ZZ" | G_h3ZZ -> "gh3ZZ" | G_h1WpWm -> "gh1WpWm" | G_h2WpWm -> "gh2WpWm" | G_h3WpWm -> "gh3WpWm" | G_hhWpWm -> "ghhWpWm" | G_hhZZ -> "ghhZZ" | G_HpHmAA -> "gHpHmAA" | G_HpHmZZ -> "gHpHmZZ" | G_HpHmAZ -> "gHpHmAZ" | G_HpHmWpWm -> "gHpHmWpWm" | G_h1HpAWm -> "gh1HpAWm" | G_h2HpAWm -> "gh2HpAWm" | G_h3HpAWm -> "gh3HpAWm" | G_h1HpZWm -> "gh1HpZWm" | G_h2HpZWm -> "gh2HpZWm" | G_h3HpZWm -> "gh3HpZWm" | G_h1HpAWmC -> "gh1HpAWmC" | G_h2HpAWmC -> "gh2HpAWmC" | G_h3HpAWmC -> "gh3HpAWmC" | G_h1HpZWmC -> "gh1HpZWmC" | G_h2HpZWmC -> "gh2HpZWmC" | G_h3HpZWmC -> "gh3HpZWmC" | G_h1HpHm -> "gh1HpHm" | G_h2HpHm -> "gh2HpHm" | G_h3HpHm -> "gh3HpHm" | G_h111 -> "gh111" | G_h112 -> "gh112" | G_h113 -> "gh113" | G_h221 -> "gh221" | G_h222 -> "gh222" | G_h223 -> "gh223" | G_h331 -> "gh331" | G_h332 -> "gh332" | G_h333 -> "gh333" | G_h123 -> "gh123" | G_HpHmHpHm -> "gHpHmHpHm" | G_HpHm11 -> "gHpHm11" | G_HpHm12 -> "gHpHm12" | G_HpHm13 -> "gHpHm13" | G_HpHm22 -> "gHpHm22" | G_HpHm23 -> "gHpHm23" | G_HpHm33 -> "gHpHm33" | G_h1111 -> "gh1111" | G_h1112 -> "gh1112" | G_h1113 -> "gh1113" | G_h1122 -> "gh1122" | G_h1123 -> "gh1123" | G_h1133 -> "gh1133" | G_h1222 -> "gh1222" | G_h1223 -> "gh1223" | G_h1233 -> "gh1233" | G_h1333 -> "gh1333" | G_h2222 -> "gh2222" | G_h2223 -> "gh2223" | G_h2233 -> "gh2233" | G_h2333 -> "gh2333" | G_h3333 -> "gh3333" | G_h1uu -> "gh1uu" | G_h2uu -> "gh2uu" | G_h3uu -> "gh3uu" | G_h1uc -> "gh1uc" | G_h2uc -> "gh2uc" | G_h3uc -> "gh3uc" | G_h1ut -> "gh1ut" | G_h2ut -> "gh2ut" | G_h3ut -> "gh3ut" | G_h1cu -> "gh1cu" | G_h2cu -> "gh2cu" | G_h3cu -> "gh3cu" | G_h1cc -> "gh1cc" | G_h2cc -> "gh2cc" | G_h3cc -> "gh3cc" | G_h1ct -> "gh1ct" | G_h2ct -> "gh2ct" | G_h3ct -> "gh3ct" | G_h1tu -> "gh1tu" | G_h2tu -> "gh2tu" | G_h3tu -> "gh3tu" | G_h1tc -> "gh1tc" | G_h2tc -> "gh2tc" | G_h3tc -> "gh3tc" | G_h1tt -> "gh1tt" | G_h2tt -> "gh2tt" | G_h3tt -> "gh3tt" | G_h1dd -> "gh1dd" | G_h2dd -> "gh2dd" | G_h3dd -> "gh3dd" | G_h1ds -> "gh1ds" | G_h2ds -> "gh2ds" | G_h3ds -> "gh3ds" | G_h1db -> "gh1db" | G_h2db -> "gh2db" | G_h3db -> "gh3db" | G_h1sd -> "gh1sd" | G_h2sd -> "gh2sd" | G_h3sd -> "gh3sd" | G_h1ss -> "gh1ss" | G_h2ss -> "gh2ss" | G_h3ss -> "gh3ss" | G_h1sb -> "gh1sb" | G_h2sb -> "gh2sb" | G_h3sb -> "gh3sb" | G_h1bd -> "gh1bd" | G_h2bd -> "gh2bd" | G_h3bd -> "gh3bd" | G_h1bs -> "gh1bs" | G_h2bs -> "gh2bs" | G_h3bs -> "gh3bs" | G_h1bb -> "gh1bb" | G_h2bb -> "gh2bb" | G_h3bb -> "gh3bb" | G_hud -> "ghud" | G_hus -> "ghus" | G_hub -> "ghub" | G_hcd -> "ghcd" | G_hcs -> "ghcs" | G_hcb -> "ghcb" | G_htd -> "ghtd" | G_hts -> "ghts" | G_htb -> "ghtb" | G_hdu -> "ghdu" | G_hdc -> "ghdc" | G_hdt -> "ghdt" | G_hsu -> "ghsu" | G_hsc -> "ghsc" | G_hst -> "ghst" | G_hbu -> "ghbu" | G_hbc -> "ghbc" | G_hbt -> "ghbt" | G_he1n1 -> "ghe1n1" | G_he1n2 -> "ghe1n2" | G_he1n3 -> "ghe1n3" | G_he2n1 -> "ghe2n1" | G_he2n2 -> "ghe2n2" | G_he2n3 -> "ghe2n3" | G_he3n1 -> "ghe3n1" | G_he3n2 -> "ghe3n2" | G_he3n3 -> "ghe3n3" | G_hn1e1 -> "ghn1e1" | G_hn1e2 -> "ghn1e2" | G_hn1e3 -> "ghn1e3" | G_hn2e1 -> "ghn2e1" | G_hn2e2 -> "ghn2e2" | G_hn2e3 -> "ghn2e3" | G_hn3e1 -> "ghn3e1" | G_hn3e2 -> "ghn3e2" | G_hn3e3 -> "ghn3e3" | G_h1e1e1 -> "gh1e1e1" | G_h2e1e1 -> "gh2e1e1" | G_h3e1e1 -> "gh3e1e1" | G_h1e1e2 -> "gh1e1e2" | G_h2e1e2 -> "gh2e1e2" | G_h3e1e2 -> "gh3e1e2" | G_h1e1e3 -> "gh1e1e3" | G_h2e1e3 -> "gh2e1e3" | G_h3e1e3 -> "gh3e1e3" | G_h1e2e1 -> "gh1e2e1" | G_h2e2e1 -> "gh2e2e1" | G_h3e2e1 -> "gh3e2e1" | G_h1e2e2 -> "gh1e2e2" | G_h2e2e2 -> "gh2e2e2" | G_h3e2e2 -> "gh3e2e2" | G_h1e2e3 -> "gh1e2e3" | G_h2e2e3 -> "gh2e2e3" | G_h3e2e3 -> "gh3e2e3" | G_h1e3e1 -> "gh1e3e1" | G_h2e3e1 -> "gh2e3e1" | G_h3e3e1 -> "gh3e3e1" | G_h1e3e2 -> "gh1e3e2" | G_h2e3e2 -> "gh2e3e2" | G_h3e3e2 -> "gh3e3e2" | G_h1e3e3 -> "gh1e3e3" | G_h2e3e3 -> "gh2e3e3" | G_h3e3e3 -> "gh3e3e3" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module type SSC_flags = sig val higgs_triangle : bool (* $H\gamma\gamma$, $Hg\gamma$ and $Hgg$ couplings *) val higgs_hmm : bool val triple_anom : bool val quartic_anom : bool val higgs_anom : bool val k_matrix : bool val k_matrix_tm : bool val ckm_present : bool val top_anom : bool val top_anom_4f : bool val cf_arbitrary : bool val higgs_matrix : bool end module SSC_kmatrix: SSC_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = true let higgs_anom = false let k_matrix = true let k_matrix_tm = false let ckm_present = false let top_anom = false let top_anom_4f = false let cf_arbitrary = false let higgs_matrix = false end module SSC_kmatrix_2: SSC_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = true let higgs_anom = false let k_matrix = true let k_matrix_tm = true let ckm_present = false let top_anom = false let top_anom_4f = false let cf_arbitrary = true let higgs_matrix = true end (* \thocwmodulesection{Complete Minimal Standard Model including additional Resonances} *) module SSC (Flags : SSC_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type f_aux_top = TTGG | TBWA | TBWZ | TTWW | BBWW | (*i top auxiliary field "flavors" *) QGUG | QBUB | QW | DL | DR type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H | Rsigma | Rphin | Rphisn | Rphip | Rphim | Rphipp | Rphimm | Rf | Rtn | Rtsn | Rtp | Rtm | Rtpp | Rtmm | Aux_top of int*int*int*bool*f_aux_top (*i lorentz*color*charge*top-side*flavor *) type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.SSC.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let rec aux_top_flavors (f,l,co,ch) = List.append ( List.map other [ Aux_top(l,co,ch/2,true,f); Aux_top(l,co,ch/2,false,f) ] ) ( if ch > 1 then List.append ( List.map other [ Aux_top(l,co,-ch/2,true,f); Aux_top(l,co,-ch/2,false,f) ] ) ( aux_top_flavors (f,l,co,(ch-2)) ) else [] ) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [H]; "Scalar Resonances", List.map other [Rsigma; Rphin; Rphisn; Rphip; Rphim; Rphipp; Rphimm]; "Tensor Resonances", List.map other [Rf; Rtn; Rtsn; Rtp; Rtm; Rtpp; Rtmm]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = List.append ( ThoList.flatmap snd (external_flavors ()) ) ( ThoList.flatmap aux_top_flavors [ (TTGG,2,1,1); (TBWA,2,0,2); (TBWZ,2,0,2); (TTWW,2,0,1); (BBWW,2,0,1); (QGUG,1,1,1); (QBUB,1,0,1); (QW,1,0,3); (DL,0,0,3); (DR,0,0,3) ] ) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz_aux = function | 2 -> Tensor_1 | 1 -> Vector | 0 -> Scalar | _ -> invalid_arg ("SM.lorentz_aux: wrong value") let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> begin match f with | Aux_top (l,_,_,_,_) -> lorentz_aux l | Rf | Rtn | Rtsn | Rtp | Rtm | Rtpp | Rtmm -> Tensor_2 | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | O (Aux_top (_,co,_,_,_)) -> if co == 0 then Color.Singlet else Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let prop_aux = function | 2 -> Aux_Tensor_1 | 1 -> Aux_Vector | 0 -> Aux_Scalar | _ -> invalid_arg ("SM.prop_aux: wrong value") let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H | Rsigma -> Prop_Scalar | Rphin | Rphisn | Rphip | Rphim | Rphipp | Rphimm -> Prop_Scalar | Rf -> Prop_Tensor_2 | Rtn | Rtsn | Rtp | Rtm | Rtpp | Rtmm -> Prop_Tensor_2 | Aux_top (l,_,_,_,_) -> prop_aux l end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Rsigma -> Rsigma | Rphin -> Rphin | Rphisn-> Rphisn | Rphip -> Rphim | Rphim -> Rphip | Rphipp -> Rphimm | Rphimm -> Rphipp | Rf -> Rf | Rtn -> Rtn | Rtsn -> Rtsn | Rtp -> Rtm | Rtm -> Rtp | Rtpp -> Rtmm | Rtmm -> Rtpp | Aux_top (l,co,ch,n,f) -> Aux_top (l,co,(-ch),(not n),f) end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Rsigma | Phi0 | Rphin | Rphisn | Rf | Rtn | Rtsn -> 0//1 | Phip | Rphip | Rtp -> 1//1 | Phim | Rphim | Rtm -> -1//1 | Rphipp | Rtpp -> 2//1 | Rphimm | Rtmm -> -2//1 | Aux_top (_,_,ch,_,_) -> ch//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Half | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | I_G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_TVA_ttA | G_TVA_bbA | G_VLR_ttZ | G_TVA_ttZ | G_TVA_bbZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWZ | G_TRL_tbWZ | G_TLR_btWA | G_TRL_tbWA | G_TVA_ttWW | G_TVA_bbWW | G_TVA_ttG | G_TVA_ttGG | G_SP_ttH | G_VLR_qGuG | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | I_G1_AWW | I_G1_ZWW | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_lambda_AWW | I_lambda_ZWW | G5_AWW | G5_ZWW | I_kappa5_AWW | I_kappa5_ZWW | I_lambda5_AWW | I_lambda5_ZWW | FS0_HHWW | FS0_HHZZ | FS1_HHWW | FS1_HHZZ | FM0_HHWW | FM0_HHZZ | FM1_HHWW | FM1_HHZZ | FM7_HHWW | FM7_HHZZ | Alpha_WWWW0 | Alpha_ZZWW1 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZZZ | FT0_WWWW0 | FT0_WWWW2 | FT0_ZZWW0 | FT0_ZZWW1 | FT0_ZZZZ | FT0_AAAA | FT0_AAWW0 | FT0_AAWW1 | FT0_AAZZ | FT0_AZWW0 | FT0_AZWW1 | FT0_AAAZ | FT0_AZZZ | FT1_WWWW0 | FT1_WWWW2 | FT1_ZZWW0 | FT1_ZZWW1 | FT1_ZZZZ | FT1_AAAA | FT1_AAWW0 | FT1_AAWW1 | FT1_AAZZ | FT1_AZWW0 | FT1_AZWW1 | FT1_AAAZ | FT1_AZZZ | FT2_WWWW0 | FT2_WWWW2 | FT2_ZZWW0 | FT2_ZZWW1 | FT2_ZZZZ | FT2_AAAA | FT2_AAWW0 | FT2_AAWW1 | FT2_AAZZ | FT2_AZWW0 | FT2_AZWW1 | FT2_AAAZ | FT2_AZZZ | FM0_WWWW0 | FM0_WWWW2 | FM0_ZZWW0 | FM0_ZZWW1 | FM0_ZZZZ | FM1_WWWW0 | FM1_WWWW2 | FM1_ZZWW0 | FM1_ZZWW1 | FM1_ZZZZ | FM7_WWWW0 | FM7_WWWW2 | FM7_ZZWW0 | FM7_ZZWW1 | FM7_ZZZZ | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T | D_FT0_ZZWW0_S | D_FT0_ZZWW0_T | D_FT0_ZZWW0_U | D_FT0_ZZWW1_S | D_FT0_ZZWW1_T | D_FT0_ZZWW1_U | D_FT0_WWWW0_S | D_FT0_WWWW0_T | D_FT0_WWWW0_U | D_FT0_WWWW2_S | D_FT0_WWWW2_T | D_FT0_WWWW2_U | D_FT0_ZZZZ_S | D_FT0_ZZZZ_T | D_FT0_ZZZZ_U | D_FT0_AAAA_S | D_FT0_AAAA_T | D_FT0_AAAA_U | D_FT0_AAWW0_S | D_FT0_AAWW0_T | D_FT0_AAWW0_U | D_FT0_AAWW1_S | D_FT0_AAWW1_T | D_FT0_AAWW1_U | D_FT0_AAZZ_S | D_FT0_AAZZ_T | D_FT0_AAZZ_U | D_FT0_AZWW0_S | D_FT0_AZWW0_T | D_FT0_AZWW0_U | D_FT0_AZWW1_S | D_FT0_AZWW1_T | D_FT0_AZWW1_U | D_FT0_AAAZ_S | D_FT0_AAAZ_T | D_FT0_AAAZ_U | D_FT0_AZZZ_S | D_FT0_AZZZ_T | D_FT0_AZZZ_U | D_FT1_ZZWW0_S | D_FT1_ZZWW0_T | D_FT1_ZZWW0_U | D_FT1_ZZWW1_S | D_FT1_ZZWW1_T | D_FT1_ZZWW1_U | D_FT1_WWWW0_S | D_FT1_WWWW0_T | D_FT1_WWWW0_U | D_FT1_WWWW2_S | D_FT1_WWWW2_T | D_FT1_WWWW2_U | D_FT1_ZZZZ_S | D_FT1_ZZZZ_T | D_FT1_ZZZZ_U | D_FT1_AAAA_S | D_FT1_AAAA_T | D_FT1_AAAA_U | D_FT1_AAWW0_S | D_FT1_AAWW0_T | D_FT1_AAWW0_U | D_FT1_AAWW1_S | D_FT1_AAWW1_T | D_FT1_AAWW1_U | D_FT1_AAZZ_S | D_FT1_AAZZ_T | D_FT1_AAZZ_U | D_FT1_AZWW0_S | D_FT1_AZWW0_T | D_FT1_AZWW0_U | D_FT1_AZWW1_S | D_FT1_AZWW1_T | D_FT1_AZWW1_U | D_FT1_AAAZ_S | D_FT1_AAAZ_T | D_FT1_AAAZ_U | D_FT1_AZZZ_S | D_FT1_AZZZ_T | D_FT1_AZZZ_U | D_FT2_ZZWW0_S | D_FT2_ZZWW0_T | D_FT2_ZZWW0_U | D_FT2_ZZWW1_S | D_FT2_ZZWW1_T | D_FT2_ZZWW1_U | D_FT2_WWWW0_S | D_FT2_WWWW0_T | D_FT2_WWWW0_U | D_FT2_WWWW2_S | D_FT2_WWWW2_T | D_FT2_WWWW2_U | D_FT2_ZZZZ_S | D_FT2_ZZZZ_T | D_FT2_ZZZZ_U | D_FT2_AAAA_S | D_FT2_AAAA_T | D_FT2_AAAA_U | D_FT2_AAWW0_S | D_FT2_AAWW0_T | D_FT2_AAWW0_U | D_FT2_AAWW1_S | D_FT2_AAWW1_T | D_FT2_AAWW1_U | D_FT2_AAZZ_S | D_FT2_AAZZ_T | D_FT2_AAZZ_U | D_FT2_AZWW0_S | D_FT2_AZWW0_T | D_FT2_AZWW0_U | D_FT2_AZWW1_S | D_FT2_AZWW1_T | D_FT2_AZWW1_U | D_FT2_AAAZ_S | D_FT2_AAAZ_T | D_FT2_AAAZ_U | D_FT2_AZZZ_S | D_FT2_AZZZ_T | D_FT2_AZZZ_U | D_FTrsi_ZZWW0_S | D_FTrsi_ZZWW0_T | D_FTrsi_ZZWW0_U | D_FTrsi_ZZWW1_S | D_FTrsi_ZZWW1_T | D_FTrsi_ZZWW1_U | D_FTrsi_WWWW0_S | D_FTrsi_WWWW0_T | D_FTrsi_WWWW0_U | D_FTrsi_WWWW2_S | D_FTrsi_WWWW2_T | D_FTrsi_WWWW2_U | D_FTrsi_ZZZZ_S | D_FTrsi_ZZZZ_T | D_FTrsi_ZZZZ_U | D_FTrsi_AAAA_S | D_FTrsi_AAAA_T | D_FTrsi_AAAA_U | D_FTrsi_AAWW0_S | D_FTrsi_AAWW0_T | D_FTrsi_AAWW0_U | D_FTrsi_AAWW1_S | D_FTrsi_AAWW1_T | D_FTrsi_AAWW1_U | D_FTrsi_AAZZ_S | D_FTrsi_AAZZ_T | D_FTrsi_AAZZ_U | D_FTrsi_AZWW0_S | D_FTrsi_AZWW0_T | D_FTrsi_AZWW0_U | D_FTrsi_AZWW1_S | D_FTrsi_AZWW1_T | D_FTrsi_AZWW1_U | D_FTrsi_AAAZ_S | D_FTrsi_AAAZ_T | D_FTrsi_AAAZ_U | D_FTrsi_AZZZ_S | D_FTrsi_AZZZ_T | D_FTrsi_AZZZ_U | D_FM0_ZZWW0_S | D_FM0_ZZWW0_T | D_FM0_ZZWW0_U | D_FM0_ZZWW1_S | D_FM0_ZZWW1_T | D_FM0_ZZWW1_U | D_FM0_WWWW0_S | D_FM0_WWWW0_T | D_FM0_WWWW0_U | D_FM0_WWWW2_S | D_FM0_WWWW2_T | D_FM0_WWWW2_U | D_FM0_ZZZZ_S | D_FM0_ZZZZ_T | D_FM0_ZZZZ_U | D_FM1_ZZWW0_S | D_FM1_ZZWW0_T | D_FM1_ZZWW0_U | D_FM1_ZZWW1_S | D_FM1_ZZWW1_T | D_FM1_ZZWW1_U | D_FM1_WWWW0_S | D_FM1_WWWW0_T | D_FM1_WWWW0_U | D_FM1_WWWW2_S | D_FM1_WWWW2_T | D_FM1_WWWW2_U | D_FM1_ZZZZ_S | D_FM1_ZZZZ_T | D_FM1_ZZZZ_U | D_FM7_ZZWW0_S | D_FM7_ZZWW0_T | D_FM7_ZZWW0_U | D_FM7_ZZWW1_S | D_FM7_ZZWW1_T | D_FM7_ZZWW1_U | D_FM7_WWWW0_S | D_FM7_WWWW0_T | D_FM7_WWWW0_U | D_FM7_WWWW2_S | D_FM7_WWWW2_T | D_FM7_WWWW2_U | D_FM7_ZZZZ_S | D_FM7_ZZZZ_T | D_FM7_ZZZZ_U | D_Alpha_HHHH_S | D_Alpha_HHHH_T | D_Alpha_HHZZ0_S | D_Alpha_HHWW0_S | D_Alpha_HHZZ0_T | D_Alpha_HHWW0_T | D_Alpha_HHZZ1_S | D_Alpha_HHWW1_S | D_Alpha_HHZZ1_T | D_Alpha_HHWW1_T | D_Alpha_HHZZ1_U | D_Alpha_HHWW1_U | D_FM0_HHZZ0_S | D_FM0_HHWW0_S | D_FM0_HHZZ0_T | D_FM0_HHWW0_T | D_FM0_HHZZ0_U | D_FM0_HHWW0_U | D_FM0_HHZZ1_S | D_FM0_HHWW1_S | D_FM0_HHZZ1_T | D_FM0_HHWW1_T | D_FM0_HHZZ1_U | D_FM0_HHWW1_U | D_FM1_HHZZ0_S | D_FM1_HHWW0_S | D_FM1_HHZZ0_T | D_FM1_HHWW0_T | D_FM1_HHZZ0_U | D_FM1_HHWW0_U | D_FM1_HHZZ1_S | D_FM1_HHWW1_S | D_FM1_HHZZ1_T | D_FM1_HHWW1_T | D_FM1_HHZZ1_U | D_FM1_HHWW1_U | D_FM7_HHZZ0_S | D_FM7_HHWW0_S | D_FM7_HHZZ0_T | D_FM7_HHWW0_T | D_FM7_HHZZ0_U | D_FM7_HHWW0_U | D_FM7_HHZZ1_S | D_FM7_HHWW1_S | D_FM7_HHZZ1_T | D_FM7_HHWW1_T | D_FM7_HHZZ1_U | D_FM7_HHWW1_U | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_SWW | G_SWW_T | G_SSWW | G_SZZ | G_SZZ_T | G_SSZZ | G_SHH | G_SAA_T | G_SAZ_T | G_PNWW | G_PNZZ | G_PWZ | G_PWW | G_PSNWW | G_PSNZZ | G_PSNHH | G_FWW | G_FZZ | G_FWW_CF | G_FZZ_CF | G_FWW_T | G_FZZ_T | G_FHH | G_FHH_CF | G_TNWW | G_TNZZ | G_TSNWW | G_TSNZZ | G_TWZ | G_TWW | G_TNWW_CF | G_TNZZ_CF | G_TSNWW_CF | G_TSNZZ_CF | G_TWZ_CF | G_TWW_CF | G_Htt | G_Hbb | G_Hcc | G_Hmm | G_Htautau | G_H3 | G_H4 | FS_H4 | G_HGaZ | G_HGaGa | G_Hgg | G_HGaZ_anom | G_HGaGa_anom | G_HZZ_anom | G_HWW_anom | G_HGaZ_u | G_HZZ_u | G_HWW_u | Gs | I_Gs | G2 | Mass of flavor | Width of flavor | K_Matrix_Coeff of int | K_Matrix_Pole of int (* \begin{dubious} The current abstract syntax for parameter dependencies is admittedly tedious. Later, there will be a parser for a convenient concrete syntax as a part of a concrete syntax for models. But as these examples show, it should include simple functions. \end{dubious} *) type orders = int * int let orders = function | _ -> (0,0) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} *) let input_parameters = [ Alpha_QED, 1. /. 137.0359895; Sin2thw, 0.23124; Mass (G Z), 91.187; Mass (M (N 1)), 0.0; Mass (M (L 1)), 0.51099907e-3; Mass (M (N 2)), 0.0; Mass (M (L 2)), 0.105658389; Mass (M (N 3)), 0.0; Mass (M (L 3)), 1.77705; Mass (M (U 1)), 5.0e-3; Mass (M (D 1)), 3.0e-3; Mass (M (U 2)), 1.2; Mass (M (D 2)), 0.1; Mass (M (U 3)), 174.0; Mass (M (D 3)), 4.2 ] (* \begin{subequations} \begin{align} e &= \sqrt{4\pi\alpha} \\ \sin\theta_w &= \sqrt{\sin^2\theta_w} \\ \cos\theta_w &= \sqrt{1-\sin^2\theta_w} \\ g &= \frac{e}{\sin\theta_w} \\ m_W &= \cos\theta_w m_Z \\ v &= \frac{2m_W}{g} \\ g_{CC} = -\frac{g}{2\sqrt2} &= -\frac{e}{2\sqrt2\sin\theta_w} \\ Q_{\text{lepton}} = -q_{\text{lepton}}e &= e \\ Q_{\text{up}} = -q_{\text{up}}e &= -\frac{2}{3}e \\ Q_{\text{down}} = -q_{\text{down}}e &= \frac{1}{3}e \\ \ii q_We = \ii g_{\gamma WW} &= \ii e \\ \ii g_{ZWW} &= \ii g \cos\theta_w \\ \ii g_{WWW} &= \ii g \end{align} \end{subequations} *) (* \begin{dubious} \ldots{} to be continued \ldots{} The quartic couplings can't be correct, because the dimensions are wrong! \begin{subequations} \begin{align} g_{HWW} &= g m_W = 2 \frac{m_W^2}{v}\\ g_{HHWW} &= 2 \frac{m_W^2}{v^2} = \frac{g^2}{2} \\ g_{HZZ} &= \frac{g}{\cos\theta_w}m_Z \\ g_{HHZZ} &= 2 \frac{m_Z^2}{v^2} = \frac{g^2}{2\cos\theta_w} \\ g_{Htt} &= \lambda_t \\ g_{Hbb} &= \lambda_b=\frac{m_b}{m_t}\lambda_t \\ g_{H^3} &= - \frac{3g}{2}\frac{m_H^2}{m_W} = - 3 \frac{m_H^2}{v} g_{H^4} &= - \frac{3g^2}{4} \frac{m_W^2}{v^2} = -3 \frac{m_H^2}{v^2} \end{align} \end{subequations} \end{dubious} *) let derived_parameters = [ Real E, Sqrt (Prod [Integer 4; Atom Pi; Atom Alpha_QED]); Real Sinthw, Sqrt (Atom Sin2thw); Real Costhw, Sqrt (Diff (Integer 1, Atom Sin2thw)); Real G_weak, Quot (Atom E, Atom Sinthw); Real (Mass (G Wp)), Prod [Atom Costhw; Atom (Mass (G Z))]; Real Vev, Quot (Prod [Integer 2; Atom (Mass (G Wp))], Atom G_weak); Real Q_lepton, Atom E; Real Q_up, Prod [Quot (Integer (-2), Integer 3); Atom E]; Real Q_down, Prod [Quot (Integer 1, Integer 3); Atom E]; Real G_CC, Neg (Quot (Atom G_weak, Prod [Integer 2; Sqrt (Integer 2)])); Complex I_Q_W, Prod [I; Atom E]; Complex I_G_weak, Prod [I; Atom G_weak]; Complex I_G_ZWW, Prod [I; Atom G_weak; Atom Costhw] ] (* \begin{equation} - \frac{g}{2\cos\theta_w} \end{equation} *) let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) (* \begin{subequations} \begin{align} - \frac{g}{2\cos\theta_w} g_V &= - \frac{g}{2\cos\theta_w} (T_3 - 2 q \sin^2\theta_w) \\ - \frac{g}{2\cos\theta_w} g_A &= - \frac{g}{2\cos\theta_w} T_3 \end{align} \end{subequations} *) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents' n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents'' n = List.map mgm [ ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents_triv = ThoList.flatmap charged_currents' [1;2;3] @ ThoList.flatmap charged_currents'' [1;2;3] let charged_currents_ckm = let charged_currents_2 n1 n2 = List.map mgm [ ((D (-n1), Wm, U n2), FBF (1, Psibar, VL, Psi), G_CCQ (n2,n1)); ((U (-n1), Wp, D n2), FBF (1, Psibar, VL, Psi), G_CCQ (n1,n2)) ] in ThoList.flatmap charged_currents' [1;2;3] @ List.flatten (Product.list2 charged_currents_2 [1;2;3] [1;2;3]) let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] @ if Flags.higgs_hmm then [ ((M (L (-2)), O H, M (L 2)), FBF (1, Psibar, S, Psi), G_Hmm)] else [] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] (* \begin{multline} \mathcal{L}_{\textrm{TGC}}(g_1,\kappa) = g_1 \mathcal{L}_T(V,W^+,W^-) \\ + \frac{\kappa+g_1}{2} \Bigl(\mathcal{L}_T(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr)\\ + \frac{\kappa-g_1}{2} \Bigl(\mathcal{L}_L(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr) \end{multline} *) (* \begin{dubious} The whole thing in the LEP2 workshop notation: \begin{multline} \ii\mathcal{L}_{\textrm{TGC},V} / g_{WWV} = \\ g_1^V V^\mu (W^-_{\mu\nu}W^{+,\nu}-W^+_{\mu\nu}W^{-,\nu}) + \kappa_V W^+_\mu W^-_\nu V^{\mu\nu} + \frac{\lambda_V}{m_W^2} V_{\mu\nu} W^-_{\rho\mu} W^{+,\hphantom{\nu}\rho}_{\hphantom{+,}\nu} \\ + \ii g_5^V \epsilon_{\mu\nu\rho\sigma} \left( (\partial^\rho W^{-,\mu}) W^{+,\nu} - W^{-,\mu}(\partial^\rho W^{+,\nu}) \right) V^\sigma \\ + \ii g_4^V W^-_\mu W^+_\nu (\partial^\mu V^\nu + \partial^\nu V^\mu) - \frac{\tilde\kappa_V}{2} W^-_\mu W^+_\nu \epsilon^{\mu\nu\rho\sigma} V_{\rho\sigma} - \frac{\tilde\lambda_V}{2m_W^2} W^-_{\rho\mu} W^{+,\mu}_{\hphantom{+,\mu}\nu} \epsilon^{\nu\rho\alpha\beta} V_{\alpha\beta} \end{multline} using the conventions of Itzykson and Zuber with $\epsilon^{0123} = +1$. \end{dubious} *) (* \begin{dubious} This is equivalent to the notation of Hagiwara et al.~\cite{HPZH87}, if we remember that they have opposite signs for~$g_{WWV}$: \begin{multline} \mathcal{L}_{WWV} / (-g_{WWV}) = \\ \ii g_1^V \left( W^\dagger_{\mu\nu} W^\mu - W^\dagger_\mu W^\mu_{\hphantom{\mu}\nu} \right) V^\nu + \ii \kappa_V W^\dagger_\mu W_\nu V^{\mu\nu} + \ii \frac{\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} V^{\nu\lambda} \\ - g_4^V W^\dagger_\mu W_\nu \left(\partial^\mu V^\nu + \partial^\nu V^\mu \right) + g_5^V \epsilon^{\mu\nu\lambda\sigma} \left( W^\dagger_\mu \stackrel{\leftrightarrow}{\partial_\lambda} W_\nu \right) V_\sigma\\ + \ii \tilde\kappa_V W^\dagger_\mu W_\nu \tilde{V}^{\mu\nu} + \ii\frac{\tilde\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} \tilde{V}^{\nu\lambda} \end{multline} Here $V^\mu$ stands for either the photon or the~$Z$ field, $W^\mu$ is the $W^-$ field, $W_{\mu\nu} = \partial_\mu W_\nu - \partial_\nu W_\mu$, $V_{\mu\nu} = \partial_\mu V_\nu - \partial_\nu V_\mu$, and $\tilde{V}_{\mu\nu} = \frac{1}{2} \epsilon_{\mu\nu\lambda\sigma} V^{\lambda\sigma}$. \end{dubious} *) let anomalous_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_ZWW) ] let triple_gauge = if Flags.triple_anom then anomalous_triple_gauge else standard_triple_gauge (* \begin{equation} \mathcal{L}_{\textrm{QGC}} = - g^2 W_{+,\mu} W_{-,\nu} W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Actually, quartic gauge couplings are a little bit more straightforward using auxiliary fields. Here we have to impose the antisymmetry manually: \begin{subequations} \begin{multline} (W^{+,\mu}_1 W^{-,\nu}_2 - W^{+,\nu}_1 W^{-,\mu}_2) (W^+_{3,\mu} W^-_{4,\nu} - W^+_{3,\nu} W^-_{4,\mu}) \\ = 2(W^+_1W^+_3)(W^-_2W^-_4) - 2(W^+_1W^-_4)(W^-_2W^+_3) \end{multline} also ($V$ can be $A$ or $Z$) \begin{multline} (W^{+,\mu}_1 V^\nu_2 - W^{+,\nu}_1 V^\mu_2) (W^-_{3,\mu} V_{4,\nu} - W^-_{3,\nu} V_{4,\mu}) \\ = 2(W^+_1W^-_3)(V_2V_4) - 2(W^+_1V_4)(V_2W^-_3) \end{multline} \end{subequations} *) (* \begin{subequations} \begin{multline} W^{+,\mu} W^{-,\nu} W^+_\mu W^-_\nu \end{multline} \end{subequations} *) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] (* \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \left( \frac{g^4}{2}\left( (W^+_\mu W^{-,\mu})^2 + W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} \right)\right.\notag \\ &\qquad\qquad\qquad \left. + \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \\ \mathcal{L}_5 &= \alpha_5 \left( g^4 (W^+_\mu W^{-,\mu})^2 + \frac{g^4}{\cos^2\theta_w} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \end{align} \end{subequations} or \begin{multline} \mathcal{L}_4 + \mathcal{L}_5 = (\alpha_4+2\alpha_5) g^4 \frac{1}{2} (W^+_\mu W^{-,\mu})^2 \\ + 2\alpha_4 g^4 \frac{1}{4} W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} + \alpha_4 \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu \\ + 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \frac{1}{2} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \frac{1}{8} (Z_\mu Z^\mu)^2 \end{multline} and therefore \begin{subequations} \begin{align} \alpha_{(WW)_0} &= (\alpha_4+2\alpha_5) g^4 \\ \alpha_{(WW)_2} &= 2\alpha_4 g^4 \\ \alpha_{(WZ)_0} &= 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{(WZ)_1} &= \alpha_4 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{ZZ} &= (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \end{align} \end{subequations} *) let anomalous_quartic_gauge = if Flags.quartic_anom then List.map qgc [ ((Wm, Wm, Wp, Wp), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4 [1, C_12_34], Alpha_WWWW2); ((Z, Z, Z, Z), Vector4 [(1, C_12_34); (1, C_13_42); (1, C_14_23)], Alpha_ZZZZ); ((Wm, Wp, Z, Z), Vector4 [1, C_12_34], Alpha_ZZWW0); ((Wm, Wp, Z, Z), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_ZZWW1)] @ (if Flags.k_matrix_tm then List.map qgc [((Wm, Wm, Wp, Wp), Dim8_Vector4_t_0 [1, C_13_42], FT0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_0 [1, C_14_23], FT0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_0 [1, C_12_34], FT0_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_1 [1, C_13_42], FT1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_1 [1, C_14_23], FT1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_1 [1, C_12_34], FT1_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_2 [1, C_13_42], FT2_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_2 [1, C_14_23], FT2_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_2 [1, C_12_34], FT2_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_0 [1, C_13_42], FM0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_0 [1, C_14_23], FM0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_0 [1, C_12_34], FM0_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_1 [1, C_13_42], FM1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_1 [1, C_14_23], FM1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_1 [1, C_12_34], FM1_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_7 [1, C_13_42], FM7_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_7 [1, C_14_23], FM7_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_7 [1, C_12_34], FM7_WWWW2); ((Wm, Wp, Z, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_0 [1, C_12_34], FM0_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_m_0 [1, C_13_42], FM0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_0 [1, C_14_23], FM0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_1 [1, C_12_34], FM1_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_m_1 [1, C_13_42], FM1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_1 [1, C_14_23], FM1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_7 [1, C_12_34], FM7_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_m_7 [1, C_13_42], FM7_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_7 [1, C_14_23], FM7_ZZWW1); ((Z, Z, Z, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_0 [1, C_12_34], FM0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_0 [1, C_13_42], FM0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_0 [1, C_14_23], FM0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_1 [1, C_12_34], FM1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_1 [1, C_13_42], FM1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_1 [1, C_14_23], FM1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_7 [1, C_12_34], FM7_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_7 [1, C_13_42], FM7_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_7 [1, C_14_23], FM7_ZZZZ); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAAA); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAWW0); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAWW0); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAWW0); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAWW1); ((Z, Z, Ga, Ga), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAZZ); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_0 [1, C_12_34], FT0_AZWW0); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_0 [1, C_13_42], FT0_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_0 [1, C_14_23], FT0_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_1 [1, C_12_34], FT1_AZWW0); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_1 [1, C_13_42], FT1_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_1 [1, C_14_23], FT1_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_2 [1, C_12_34], FT2_AZWW0); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_2 [1, C_13_42], FT2_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_2 [1, C_14_23], FT2_AZWW1); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAAZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_AZZZ)] else [] ) else [] (* In any diagonal channel~$\chi$, the scattering amplitude~$a_\chi(s)$ is unitary iff\footnote{% Trivial proof: \begin{equation} -1 = \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = \frac{\textrm{Im}(a_\chi^*(s))}{ |a_\chi(s)|^2 } = - \frac{\textrm{Im}(a_\chi(s))}{ |a_\chi(s)|^2 } \end{equation} i.\,e.~$\textrm{Im}(a_\chi(s)) = |a_\chi(s)|^2$.} \begin{equation} \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = -1 \end{equation} For a real perturbative scattering amplitude~$r_\chi(s)$ this can be enforced easily--and arbitrarily--by \begin{equation} \frac{1}{a_\chi(s)} = \frac{1}{r_\chi(s)} - \mathrm{i} \end{equation} *) let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_WWWW2_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZWW0_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_14_23)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_13_42); (1, C_12_34)]), D_Alpha_ZZZZ_T)] else [] let k_matrix_quartic_gauge_t_0 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t0 (2, [(1, C_12_34)]), D_FT0_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t0 (2, [(1, C_13_42)]), D_FT0_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t0 (2, [(1, C_14_23)]), D_FT0_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t0 (2, [(1, C_12_34)]), D_FT0_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t0 (2, [(1, C_13_42)]), D_FT0_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t0 (2, [(1, C_14_23)]), D_FT0_AAWW1_T); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAZZ_S); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAZZ_T); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAZZ_U); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAZZ_S); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAZZ_T); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AZZZ_U)] else [] let k_matrix_quartic_gauge_t_1 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t1 (2, [(1, C_12_34)]), D_FT1_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t1 (2, [(1, C_13_42)]), D_FT1_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t1 (2, [(1, C_14_23)]), D_FT1_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t1 (2, [(1, C_12_34)]), D_FT1_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t1 (2, [(1, C_13_42)]), D_FT1_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t1 (2, [(1, C_14_23)]), D_FT1_AAWW1_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AZZZ_U)] else [] let k_matrix_quartic_gauge_t_2 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t2 (2, [(1, C_12_34)]), D_FT2_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t2 (2, [(1, C_13_42)]), D_FT2_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t2 (2, [(1, C_14_23)]), D_FT2_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t2 (2, [(1, C_12_34)]), D_FT2_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t2 (2, [(1, C_13_42)]), D_FT2_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t2 (2, [(1, C_14_23)]), D_FT2_AAWW1_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AZZZ_U)] else [] let k_matrix_quartic_gauge_t_rsi = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_12_34)]), D_FTrsi_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_13_42)]), D_FTrsi_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_14_23)]), D_FTrsi_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_12_34)]), D_FTrsi_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_13_42)]), D_FTrsi_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_14_23)]), D_FTrsi_AAWW1_T); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAZZ_S); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAZZ_T); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAZZ_U); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAZZ_S); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAZZ_T); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AZZZ_U)] else [] let k_matrix_quartic_gauge_m_0 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m0 (1, [(1, C_12_34)]), D_FM0_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m0 (1, [(1, C_13_42)]), D_FM0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m0 (1, [(1, C_14_23)]), D_FM0_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m0 (2, [(1, C_12_34)]), D_FM0_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m0 (2, [(1, C_13_42)]), D_FM0_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m0 (2, [(1, C_14_23)]), D_FM0_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (3, [(1, C_14_23)]), D_FM0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (3, [(1, C_13_42)]), D_FM0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (3, [(1, C_12_34)]), D_FM0_ZZZZ_U)] else [] let k_matrix_quartic_gauge_m_1 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m1 (1, [(1, C_12_34)]), D_FM1_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m1 (1, [(1, C_13_42)]), D_FM1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m1 (1, [(1, C_14_23)]), D_FM1_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m1 (2, [(1, C_12_34)]), D_FM1_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m1 (2, [(1, C_13_42)]), D_FM1_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m1 (2, [(1, C_14_23)]), D_FM1_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (3, [(1, C_14_23)]), D_FM1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (3, [(1, C_13_42)]), D_FM1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (3, [(1, C_12_34)]), D_FM1_ZZZZ_U)] else [] let k_matrix_quartic_gauge_m_7 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m7 (1, [(1, C_12_34)]), D_FM7_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m7 (1, [(1, C_13_42)]), D_FM7_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m7 (1, [(1, C_14_23)]), D_FM7_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m7 (2, [(1, C_12_34)]), D_FM7_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m7 (2, [(1, C_13_42)]), D_FM7_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m7 (2, [(1, C_14_23)]), D_FM7_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (3, [(1, C_14_23)]), D_FM7_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (3, [(1, C_13_42)]), D_FM7_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (3, [(1, C_12_34)]), D_FM7_ZZZZ_U)] else [] let k_matrix_2scalar_2gauge = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_12_34)]), D_Alpha_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_13_42)]), D_Alpha_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_14_23)]), D_Alpha_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_14_23)]), D_Alpha_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_13_42)]), D_Alpha_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_12_34)]), D_Alpha_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_13_42)]), D_Alpha_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_12_34)]), D_Alpha_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_14_23)]), D_Alpha_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_12_34)]), D_Alpha_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (2, [(1, C_13_42)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (1, [(1, C_14_23)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (1, [(1, C_13_42)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (2, [(1, C_14_23)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_14_23)]), D_Alpha_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_13_42)]), D_Alpha_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (4, [(1, C_13_42)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (5, [(1, C_12_34)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (8, [(1, C_14_23)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (7, [(1, C_12_34)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (5, [(1, C_13_42)]), D_Alpha_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (4, [(1, C_12_34)]), D_Alpha_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (7, [(1, C_14_23)]), D_Alpha_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (8, [(1, C_12_34)]), D_Alpha_HHWW1_U) ] else [] else [] let k_matrix_2scalar_2gauge_m = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_12_34)]), D_FM0_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_13_42)]), D_FM0_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_14_23)]), D_FM0_HHZZ0_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_14_23)]), D_FM0_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_13_42)]), D_FM0_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_12_34)]), D_FM0_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_13_42)]), D_FM0_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_12_34)]), D_FM0_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_14_23)]), D_FM0_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_12_34)]), D_FM0_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (2, [(1, C_13_42)]), D_FM0_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (1, [(1, C_14_23)]), D_FM0_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (1, [(1, C_13_42)]), D_FM0_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (2, [(1, C_14_23)]), D_FM0_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_14_23)]), D_FM0_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_13_42)]), D_FM0_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (4, [(1, C_13_42)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (5, [(1, C_12_34)]), D_FM0_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (8, [(1, C_14_23)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (7, [(1, C_12_34)]), D_FM0_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (5, [(1, C_13_42)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (4, [(1, C_12_34)]), D_FM0_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (7, [(1, C_14_23)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (8, [(1, C_12_34)]), D_FM0_HHWW1_T) ] else [] else [] let k_matrix_2scalar_2gauge_m_1 = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_12_34)]), D_FM1_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_13_42)]), D_FM1_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_14_23)]), D_FM1_HHZZ0_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_14_23)]), D_FM1_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_13_42)]), D_FM1_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_12_34)]), D_FM1_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_13_42)]), D_FM1_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_12_34)]), D_FM1_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_14_23)]), D_FM1_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_12_34)]), D_FM1_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (2, [(1, C_13_42)]), D_FM1_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (1, [(1, C_14_23)]), D_FM1_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (1, [(1, C_13_42)]), D_FM1_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (2, [(1, C_14_23)]), D_FM1_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_14_23)]), D_FM1_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_13_42)]), D_FM1_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (4, [(1, C_13_42)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (5, [(1, C_12_34)]), D_FM1_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (8, [(1, C_14_23)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (7, [(1, C_12_34)]), D_FM1_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (5, [(1, C_13_42)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (4, [(1, C_12_34)]), D_FM1_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (7, [(1, C_14_23)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (8, [(1, C_12_34)]), D_FM1_HHWW1_T) ] else [] else [] let k_matrix_2scalar_2gauge_m_7 = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_12_34)]), D_FM7_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_13_42)]), D_FM7_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_14_23)]), D_FM7_HHZZ0_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_14_23)]), D_FM7_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_13_42)]), D_FM7_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_12_34)]), D_FM7_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_13_42)]), D_FM7_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_12_34)]), D_FM7_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_14_23)]), D_FM7_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_12_34)]), D_FM7_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (2, [(1, C_13_42)]), D_FM7_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (1, [(1, C_14_23)]), D_FM7_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (1, [(1, C_13_42)]), D_FM7_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (2, [(1, C_14_23)]), D_FM7_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_14_23)]), D_FM7_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_13_42)]), D_FM7_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (4, [(1, C_13_42)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (5, [(1, C_12_34)]), D_FM7_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (8, [(1, C_14_23)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (7, [(1, C_12_34)]), D_FM7_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (5, [(1, C_13_42)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (4, [(1, C_12_34)]), D_FM7_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (7, [(1, C_14_23)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (8, [(1, C_12_34)]), D_FM7_HHWW1_T) ] else [] else [] let k_matrix_4scalar = if Flags.k_matrix then if Flags.higgs_matrix then [ ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (0, [(1, C_12_34)]), D_Alpha_HHHH_S); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (0, [(1, C_13_42)]), D_Alpha_HHHH_T); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (0, [(1, C_14_23)]), D_Alpha_HHHH_T); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (3, [(1, C_14_23)]), D_Alpha_HHHH_S); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (3, [(1, C_13_42)]), D_Alpha_HHHH_T); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (3, [(1, C_12_34)]), D_Alpha_HHHH_T) ] else [] else [] (*i Thorsten's original implementation of the K matrix, which we keep since it still might be usefull for the future. let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 2, K_Matrix_Pole 2]), Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4_K_Matrix_tho (0, [(K_Matrix_Coeff 0, K_Matrix_Pole 0); (K_Matrix_Coeff 2, K_Matrix_Pole 2)]), Alpha_ZZWW0); ((Wm, Z, Wp, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 1, K_Matrix_Pole 1]), Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_ZZZZ) ] else [] i*) let quartic_gauge = standard_quartic_gauge @ anomalous_quartic_gauge @ k_matrix_quartic_gauge @ k_matrix_quartic_gauge_t_0 @ k_matrix_quartic_gauge_t_1 @ k_matrix_quartic_gauge_t_2 @ k_matrix_quartic_gauge_t_rsi @ k_matrix_quartic_gauge_m_0 @ k_matrix_quartic_gauge_m_1 @ k_matrix_quartic_gauge_m_7 let standard_gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let standard_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let dim8_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_1 1, FS0_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_1 1, FS0_HHZZ; (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_2 1, FS1_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_2 1, FS1_HHZZ ] let dim8_gauge_higgs4_m = [ (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_m_0 1, FM0_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_m_0 1, FM0_HHZZ; (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_m_1 1, FM1_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_m_1 1, FM1_HHZZ; (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_m_7 1, FM7_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_m_7 1, FM7_HHZZ] let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let fs_higgs4 = [ (O H, O H, O H, O H), Dim8_Scalar4 1, FS_H4 ] (* WK's couplings (apparently, he still intends to divide by $\Lambda^2_{\text{EWSB}}=16\pi^2v_{\mathrm{F}}^2$): \begin{subequations} \begin{align} \mathcal{L}^{\tau}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V^{\mu} \right\rbrack^2 \\ \mathcal{L}^{\tau}_5 &= \left\lbrack (\partial_{\mu}H)(\partial_{\nu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V_{\nu} \right\rbrack^2 \end{align} \end{subequations} with \begin{equation} V_{\mu} V_{\nu} = \frac{1}{2} \left( W^+_{\mu} W^-_{\nu} + W^+_{\nu} W^-_{\mu} \right) + \frac{1}{2\cos^2\theta_{w}} Z_{\mu} Z_{\nu} \end{equation} (note the symmetrization!), i.\,e. \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V_{\nu})^2 \\ \mathcal{L}_5 &= \alpha_5 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V^{\mu})^2 \end{align} \end{subequations} *) (* Breaking thinks up \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^4}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) \right\rbrack^2 \\ \mathcal{L}^{\tau,H^4}_5 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) \right\rbrack^2 \end{align} \end{subequations} and \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^2V^2}_4 &= \frac{g^2v_{\mathrm{F}}^2}{2} (\partial_{\mu}H)(\partial^{\mu}H) V_{\mu}V^{\mu} \\ \mathcal{L}^{\tau,H^2V^2}_5 &= \frac{g^2v_{\mathrm{F}}^2}{2} (\partial_{\mu}H)(\partial_{\nu}H) V_{\mu}V_{\nu} \end{align} \end{subequations} i.\,e. \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^2V^2}_4 &= \frac{g^2v_{\mathrm{F}}^2}{2} \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) W^+_{\nu}W^{-,\nu} + \frac{1}{2\cos^2\theta_{w}} (\partial_{\mu}H)(\partial^{\mu}H) Z_{\nu} Z^{\nu} \right\rbrack \\ \mathcal{L}^{\tau,H^2V^2}_5 &= \frac{g^2v_{\mathrm{F}}^2}{2} \left\lbrack (W^{+,\mu}\partial_{\mu}H) (W^{-,\nu}\partial_{\nu}H) + \frac{1}{2\cos^2\theta_{w}} (Z^{\mu}\partial_{\mu}H)(Z^{\nu}\partial_{\nu}H) \right\rbrack \end{align} \end{subequations} *) (* \begin{multline} \tau^4_8 \mathcal{L}^{\tau,H^2V^2}_4 + \tau^5_8 \mathcal{L}^{\tau,H^2V^2}_5 = \\ - \frac{g^2v_{\mathrm{F}}^2}{2} \Biggl\lbrack 2\tau^4_8 \frac{1}{2}(\ii\partial_{\mu}H)(\ii\partial^{\mu}H) W^+_{\nu}W^{-,\nu} + \tau^5_8 (W^{+,\mu}\ii\partial_{\mu}H) (W^{-,\nu}\ii\partial_{\nu}H) \\ + \frac{2\tau^4_8}{\cos^2\theta_{w}} \frac{1}{4} (\ii\partial_{\mu}H)(\ii\partial^{\mu}H) Z_{\nu} Z^{\nu} + \frac{\tau^5_8}{\cos^2\theta_{w}} \frac{1}{2} (Z^{\mu}\ii\partial_{\mu}H)(Z^{\nu}\ii\partial_{\nu}H) \Biggr\rbrack \end{multline} where the two powers of $\ii$ make the sign conveniently negative, i.\,e. \begin{subequations} \begin{align} \alpha_{(\partial H)^2W^2}^2 &= \tau^4_8 g^2v_{\mathrm{F}}^2\\ \alpha_{(\partial HW)^2}^2 &= \frac{\tau^5_8 g^2v_{\mathrm{F}}^2}{2} \\ \alpha_{(\partial H)^2Z^2}^2 &= \frac{\tau^4_8 g^2v_{\mathrm{F}}^2}{\cos^2\theta_{w}} \\ \alpha_{(\partial HZ)^2}^2 &=\frac{\tau^5_8 g^2v_{\mathrm{F}}^2}{2\cos^2\theta_{w}} \end{align} \end{subequations} *) let anomalous_gauge_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa_anom; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ_anom; (O H, G Z, G Z), Dim5_Scalar_Gauge2 1, G_HZZ_anom; (O H, G Wp, G Wm), Dim5_Scalar_Gauge2 1, G_HWW_anom; (O H, G Ga, G Z), Dim5_Scalar_Vector_Vector_U 1, G_HGaZ_u; (O H, G Z, G Z), Dim5_Scalar_Vector_Vector_U 1, G_HZZ_u; (O H, G Wp, G Wm), Dim5_Scalar_Vector_Vector_U 1, G_HWW_u; (O H, G Wm, G Wp), Dim5_Scalar_Vector_Vector_U 1, G_HWW_u ] let anomalous_gauge_higgs4 = [] let anomalous_higgs = [] let higgs_triangle_vertices = if Flags.higgs_triangle then [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg ] else [] let anomalous_higgs4 = [] let gauge_higgs = if Flags.higgs_anom then standard_gauge_higgs @ anomalous_gauge_higgs else standard_gauge_higgs let gauge_higgs4 = ( if Flags.higgs_anom then standard_gauge_higgs4 @ anomalous_gauge_higgs4 else standard_gauge_higgs4 ) @ ( if Flags.higgs_matrix then (dim8_gauge_higgs4 @ dim8_gauge_higgs4_m @ k_matrix_2scalar_2gauge @ k_matrix_2scalar_2gauge_m @ k_matrix_2scalar_2gauge_m_1 @ k_matrix_2scalar_2gauge_m_7) else [] ) let higgs = if Flags.higgs_anom then standard_higgs @ anomalous_higgs else standard_higgs let higgs4 = ( if Flags.higgs_anom then standard_higgs4 @ anomalous_higgs4 else standard_higgs4 ) @ ( if Flags.higgs_matrix then (fs_higgs4 @ k_matrix_4scalar ) else [] ) let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] (* New Resonances *) (* \begin{dubious} There is an extra minus in the Lagrangian to have the same sign as HWW or HZZ vertex. Effectivly this doesn't matter for SSC, because $(-1)^2=1$. This is only for completeness. \end{dubious} \begin{subequations} \begin{align} \mathbf{V}_\mu &= -\mathrm{i} g\mathbf{W}_\mu+\mathrm{i} g^\prime\mathbf{B}_\mu \\ \mathbf{W}_\mu &= W_\mu^a\frac{\tau^a}{2} \\ \mathbf{B}_\mu &= W_\mu^a\frac{\tau^3}{2} \\ \tau^{++}&= \tau^+ \otimes \tau^+ \\ \tau^+ &= \frac{1}{2} \left (\tau^+ \otimes \tau^3 + \tau^3+\tau^+ \right ) \\ \tau^0 &= \frac{1}{\sqrt{6}} \left (\tau^3\otimes\tau^3 -\tau^+ \otimes \tau^- - \tau^-+\tau^+ \right ) \\ \tau^- &= \frac{1}{2} \left (\tau^- \otimes \tau^3 + \tau^3+\tau^- \right ) \\ \tau^{--}&= \tau^- \otimes \tau^- \end{align} \end{subequations} *) (* Scalar Isoscalar Old representation \begin{equation} \mathcal{L}_{\sigma}= -\frac{g_\sigma v}{2} \text{tr} \left\lbrack \mathbf{V}_\mu \mathbf{V}^\mu \right\rbrack \sigma \end{equation} *) (* \begin{dubious} Transversal couplings like rsigma3t and rf3t are to be calculated in the new higgs matrix representation. \end{dubious} *) let rsigma3 = [ ((O Rsigma, G Wp, G Wm), Scalar_Vector_Vector 1, G_SWW); ((O Rsigma, G Z, G Z), Scalar_Vector_Vector 1, G_SZZ) ] let rsigma3h = [ ((O Rsigma, O H, O H), Dim5_Scalar_Scalar2 1, G_SHH) ] let rsigma3t = [ ((O Rsigma, G Wp, G Wm), Scalar_Vector_Vector_t 1, G_SWW_T); ((O Rsigma, G Z, G Z), Scalar_Vector_Vector_t 1, G_SZZ_T); ((O Rsigma, G Ga, G Ga), Scalar_Vector_Vector_t 1, G_SAA_T); ((O Rsigma, G Ga, G Z), Scalar_Vector_Vector_t 1, G_SAZ_T) ] let rsigma4 = [ (O Rsigma, O Rsigma, G Wp, G Wm), Scalar2_Vector2 1, G_SSWW; (O Rsigma, O Rsigma, G Z, G Z), Scalar2_Vector2 1, G_SSZZ ] (* Scalar Isotensor \begin{subequations} \begin{align} \mathcal{L}_{\phi}&= \frac{g_\phi v}{4} \text{Tr} \left \lbrack \left ( \mathbf{V}_\mu \otimes \mathbf{V}^\mu - \frac{\tau^{aa}}{6} \text{Tr} \left \lbrack \mathbf{V}_\mu \mathbf{V}^\mu \right \rbrack\right ) {\mathbf{\phi}} \right \rbrack\\ \phi&=\sqrt{2} \left (\phi^{++}\tau^{++}+\phi^+\tau^++\phi^0\tau^0+\phi^-\tau^- + \phi^{--}\tau^{--} \right ) \end{align} \end{subequations} *) let rphi3 = [ ((O Rphin, G Wp, G Wm), Scalar_Vector_Vector 1, G_PNWW); ((O Rphin, G Z, G Z), Scalar_Vector_Vector 1, G_PNZZ) ; ((O Rphisn, G Wp, G Wm), Scalar_Vector_Vector 1, G_PSNWW); ((O Rphisn, G Z, G Z), Scalar_Vector_Vector 1, G_PSNZZ) ; ((O Rphip, G Z, G Wm), Scalar_Vector_Vector 1, G_PWZ) ; ((O Rphipp, G Wm, G Wm), Scalar_Vector_Vector 1, G_PWW) ; ((O Rphim, G Wp, G Z), Scalar_Vector_Vector 1, G_PWZ) ; ((O Rphimm, G Wp, G Wp), Scalar_Vector_Vector 1, G_PWW) ] let rphi3h = [ ((O Rphisn, O H, O H), Dim5_Scalar_Scalar2 1, G_PSNHH) ] (* Tensor IsoScalar *) let rf3 = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_FWW); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_FZZ) ] let rf3cf = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_FWW); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector 1, G_FZZ); ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_FWW_CF); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_FZZ_CF) ] let rf3h = [ ((O Rf, O H, O H), Tensor_2_Scalar_Scalar 1, G_FHH); ((O Rf, O H, O H), Tensor_2_Scalar_Scalar_cf 1, G_FHH_CF) ] let rf3t = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_t 1, G_FWW_T); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_t 1, G_FZZ_T) ] (* Tensor Isotensor \begin{subequations} \begin{align} \mathcal{L}_{t} \end{align} \end{subequations} *) let rt3 = [ ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_TNWW); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_TNZZ) ; ((O Rtsn, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_TSNWW); ((O Rtsn, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_TSNZZ) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector_1 1, G_TWZ) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector_1 1, G_TWW) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector_1 1, G_TWZ) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector_1 1, G_TWW) ] let rt3cf = [ ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_TNWW); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector 1, G_TNZZ) ; ((O Rtsn, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_TSNWW); ((O Rtsn, G Z, G Z), Tensor_2_Vector_Vector 1, G_TSNZZ) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector 1, G_TWZ) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector 1, G_TWW) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector 1, G_TWZ) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector 1, G_TWW); ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_TNWW_CF); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_TNZZ_CF) ; ((O Rtsn, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_TSNWW_CF); ((O Rtsn, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_TSNZZ_CF) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector_cf 1, G_TWZ_CF) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector_cf 1, G_TWW_CF) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector_cf 1, G_TWZ_CF) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector_cf 1, G_TWW_CF) ] (* Anomalous trilinear interactions $f_i f_j V$ and $ttH$: \begin{equation} \Delta\mathcal{L}_{tt\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{t} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) t A_\mu \end{equation} *) let anomalous_ttA = if Flags.top_anom then [ ((M (U (-3)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bb\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{b} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) b A_\mu \end{equation} *) let anomalous_bbA = if Flags.top_anom then [ ((M (D (-3)), G Ga, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttg} = - g_s \frac{\upsilon}{\Lambda^2} \bar{t}\lambda^a i\sigma^{\mu\nu}k_\nu (d_V(k^2)+id_A(k^2)\gamma_5)tG^a_\mu \end{equation} *) let anomalous_ttG = if Flags.top_anom then [ ((M (U (-3)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttG) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{t} \fmslash{Z} (X_L(k^2) P_L + X_R(k^2) P_R) t + \bar{t}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)tZ_\mu\right\rbrack \end{equation} *) let anomalous_ttZ = if Flags.top_anom then [ ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_ttZ); ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2} \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)bZ_\mu \end{equation} *) let anomalous_bbZ = if Flags.top_anom then [ ((M (D (-3)), G Z, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbW} = - \frac{g}{\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\fmslash{W}^-(V_L(k^2) P_L+V_R(k^2) P_R) t + \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)tW^-_\mu\right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbW = if Flags.top_anom then [ ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tbW); ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, TLRM, Psi), G_TLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, TRLM, Psi), G_TRL_tbW) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttH} = - \frac{1}{\sqrt{2}} \bar{t} (Y_V(k^2)+iY_A(k^2)\gamma_5)t H \end{equation} *) let anomalous_ttH = if Flags.top_anom then [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, SPM, Psi), G_SP_ttH) ] else [] (* quartic fermion-gauge interactions $f_i f_j V_1 V_2$ emerging from gauge-invariant effective operators: \begin{equation} \Delta\mathcal{L}_{ttgg} = - \frac{g_s^2}{2} f_{abc} \frac{\upsilon}{\Lambda^2} \bar{t} \lambda^a \sigma^{\mu\nu} (d_V(k^2)+id_A(k^2)\gamma_5)t G^b_\mu G^c_\nu \end{equation} *) let anomalous_ttGG = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,1,0,true,TTGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttGG); ((O (Aux_top (2,1,0,false,TTGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWA} = - i\sin\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t A_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWA = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWA)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWA); ((O (Aux_top (2,0,1,false,TBWA)), G Ga, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWA)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWA); ((O (Aux_top (2,0,-1,false,TBWA)), G Wp, G Ga), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWZ} = - i\cos\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t Z_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWZ = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWZ)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWZ); ((O (Aux_top (2,0,1,false,TBWZ)), G Z, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWZ)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWZ); ((O (Aux_top (2,0,-1,false,TBWZ)), G Wp, G Z), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{t} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)t W^-_\mu W^+_\nu \end{equation} *) let anomalous_ttWW = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,0,0,true,TTWW)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttWW); ((O (Aux_top (2,0,0,false,TTWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{b} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)b W^-_\mu W^+_\nu \end{equation} *) let anomalous_bbWW = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,0,true,BBWW)), M (D 3)), FBF (1, Psibar, TVA, Psi), G_TVA_bbWW); ((O (Aux_top (2,0,0,false,BBWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* 4-fermion contact terms emerging from operator rewriting: *) let anomalous_top_qGuG_tt = [ ((M (U (-3)), O (Aux_top (1,1,0,true,QGUG)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qGuG) ] let anomalous_top_qGuG_ff n = List.map mom [ ((U (-n), Aux_top (1,1,0,false,QGUG), U n), FBF (1, Psibar, V, Psi), Unit); ((D (-n), Aux_top (1,1,0,false,QGUG), D n), FBF (1, Psibar, V, Psi), Unit) ] let anomalous_top_qGuG = if Flags.top_anom_4f then anomalous_top_qGuG_tt @ ThoList.flatmap anomalous_top_qGuG_ff [1;2;3] else [] let anomalous_top_qBuB_tt = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QBUB)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB) ] let anomalous_top_qBuB_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QBUB), U n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_u); ((D (-n), Aux_top (1,0,0,false,QBUB), D n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_d); ((L (-n), Aux_top (1,0,0,false,QBUB), L n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_e); ((N (-n), Aux_top (1,0,0,false,QBUB), N n), FBF (1, Psibar, VL, Psi), G_VL_qBuB_n) ] let anomalous_top_qBuB = if Flags.top_anom_4f then anomalous_top_qBuB_tt @ ThoList.flatmap anomalous_top_qBuB_ff [1;2;3] else [] let anomalous_top_qW_tq = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (D (-3)), O (Aux_top (1,0,-1,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (U (-3)), O (Aux_top (1,0,1,true,QW)), M (D 3)), FBF (1, Psibar, VL, Psi), G_VL_qW) ] let anomalous_top_qW_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QW), U n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((D (-n), Aux_top (1,0,0,false,QW), D n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((N (-n), Aux_top (1,0,0,false,QW), N n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((L (-n), Aux_top (1,0,0,false,QW), L n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((D (-n), Aux_top (1,0,-1,false,QW), U n), FBF (1, Psibar, VL, Psi), Half); ((U (-n), Aux_top (1,0,1,false,QW), D n), FBF (1, Psibar, VL, Psi), Half); ((L (-n), Aux_top (1,0,-1,false,QW), N n), FBF (1, Psibar, VL, Psi), Half); ((N (-n), Aux_top (1,0,1,false,QW), L n), FBF (1, Psibar, VL, Psi), Half) ] let anomalous_top_qW = if Flags.top_anom_4f then anomalous_top_qW_tq @ ThoList.flatmap anomalous_top_qW_ff [1;2;3] else [] let anomalous_top_DuDd = if Flags.top_anom_4f then [ ((M (U (-3)), O (Aux_top (0,0,0,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,0,false,DR)), M (U 3)), FBF (1, Psibar, SL, Psi), G_SL_DttR); ((M (D (-3)), O (Aux_top (0,0,0,false,DR)), M (D 3)), FBF (1, Psibar, SR, Psi), G_SR_DttR); ((M (U (-3)), O (Aux_top (0,0,0,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (D (-3)), O (Aux_top (0,0,0,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DttL); ((M (D (-3)), O (Aux_top (0,0,-1,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DR)), M (D 3)), FBF (1, Psibar, SLR, Psi), G_SLR_DbtR); ((M (D (-3)), O (Aux_top (0,0,-1,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DbtL) ] else [] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ (if Flags.ckm_present then charged_currents_ckm else charged_currents_triv) @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ higgs_triangle_vertices @ goldstone_vertices @ rsigma3 @ rsigma3t @ rphi3 @ ( if Flags.cf_arbitrary then (rf3cf @ rt3cf) else (rf3 @ rt3) ) @ rf3t @ ( if Flags.higgs_matrix then (rsigma3h @ rphi3h @ rf3h ) else [] ) @ anomalous_ttA @ anomalous_bbA @ anomalous_ttZ @ anomalous_bbZ @ anomalous_tbW @ anomalous_tbWA @ anomalous_tbWZ @ anomalous_ttWW @ anomalous_bbWW @ anomalous_ttG @ anomalous_ttGG @ anomalous_ttH @ anomalous_top_qGuG @ anomalous_top_qBuB @ anomalous_top_qW @ anomalous_top_DuDd) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "Rsigma" -> O Rsigma | "Rphi0" -> O Rphin | "Rphis0" -> O Rphisn | "Rphi+" -> O Rphip | "Rphi-" -> O Rphim | "Rphi++" -> O Rphip | "Rphi--" -> O Rphimm | "Rf" -> O Rf | "Rt0" -> O Rtn | "Rts0" -> O Rtsn | "Rt+" -> O Rtp | "Rt-" -> O Rtm | "Rt++" -> O Rtp | "Rt--" -> O Rtmm | "Aux_t_ttGG0" -> O (Aux_top (2,1, 0,true,TTGG)) | "Aux_ttGG0" -> O (Aux_top (2,1, 0,false,TTGG)) | "Aux_t_tbWA+" -> O (Aux_top (2,0, 1,true,TBWA)) | "Aux_tbWA+" -> O (Aux_top (2,0, 1,false,TBWA)) | "Aux_t_tbWA-" -> O (Aux_top (2,0,-1,true,TBWA)) | "Aux_tbWA-" -> O (Aux_top (2,0,-1,false,TBWA)) | "Aux_t_tbWZ+" -> O (Aux_top (2,0, 1,true,TBWZ)) | "Aux_tbWZ+" -> O (Aux_top (2,0, 1,false,TBWZ)) | "Aux_t_tbWZ-" -> O (Aux_top (2,0,-1,true,TBWZ)) | "Aux_tbWZ-" -> O (Aux_top (2,0,-1,false,TBWZ)) | "Aux_t_ttWW0" -> O (Aux_top (2,0, 0,true,TTWW)) | "Aux_ttWW0" -> O (Aux_top (2,0, 0,false,TTWW)) | "Aux_t_bbWW0" -> O (Aux_top (2,0, 0,true,BBWW)) | "Aux_bbWW0" -> O (Aux_top (2,0, 0,false,BBWW)) | "Aux_t_qGuG0" -> O (Aux_top (1,1, 0,true,QGUG)) | "Aux_qGuG0" -> O (Aux_top (1,1, 0,false,QGUG)) | "Aux_t_qBuB0" -> O (Aux_top (1,0, 0,true,QBUB)) | "Aux_qBuB0" -> O (Aux_top (1,0, 0,false,QBUB)) | "Aux_t_qW0" -> O (Aux_top (1,0, 0,true,QW)) | "Aux_qW0" -> O (Aux_top (1,0, 0,false,QW)) | "Aux_t_qW+" -> O (Aux_top (1,0, 1,true,QW)) | "Aux_qW+" -> O (Aux_top (1,0, 1,false,QW)) | "Aux_t_qW-" -> O (Aux_top (1,0,-1,true,QW)) | "Aux_qW-" -> O (Aux_top (1,0,-1,false,QW)) | "Aux_t_dL0" -> O (Aux_top (0,0, 0,true,DL)) | "Aux_dL0" -> O (Aux_top (0,0, 0,false,DL)) | "Aux_t_dL+" -> O (Aux_top (0,0, 1,true,DL)) | "Aux_dL+" -> O (Aux_top (0,0, 1,false,DL)) | "Aux_t_dL-" -> O (Aux_top (0,0,-1,true,DL)) | "Aux_dL-" -> O (Aux_top (0,0,-1,false,DL)) | "Aux_t_dR0" -> O (Aux_top (0,0, 0,true,DR)) | "Aux_dR0" -> O (Aux_top (0,0, 0,false,DR)) | "Aux_t_dR+" -> O (Aux_top (0,0, 1,true,DR)) | "Aux_dR+" -> O (Aux_top (0,0, 1,false,DR)) | "Aux_t_dR-" -> O (Aux_top (0,0,-1,true,DR)) | "Aux_dR-" -> O (Aux_top (0,0,-1,false,DR)) | _ -> invalid_arg "Modellib_BSM.SSC.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "gl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Rsigma -> "Rsigma" | Rphin -> "Rphin" | Rphisn -> "Rphisn" | Rphip -> "Rphi+" | Rphim -> "Rphi-" | Rphipp -> "Rphi++" | Rphimm -> "Rphi--" | Rf -> "Rf" | Rtn -> "Rtn" | Rtsn -> "Rtsn" | Rtp -> "Rt+" | Rtm -> "Rt-" | Rtpp -> "Rt++" | Rtmm -> "Rt--" | Aux_top (_,_,ch,n,v) -> "Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" end ) ^ ( if ch > 0 then "+" else if ch < 0 then "-" else "0" ) end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.SSC.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | Rsigma -> "\\sigma" | Rphip -> "\\phi^+" | Rphim -> "\\phi^-" | Rphin -> "\\phi^0" | Rphisn -> "\\phi_s^0" | Rphipp -> "\\phi^{++}" | Rphimm -> "\\phi^{--}" | Rf -> "f" | Rtp -> "t^+" | Rtm -> "t^-" | Rtn -> "t^0" | Rtsn -> "t_s^0" | Rtpp -> "t^{++}" | Rtmm -> "t^{--}" | Aux_top (_,_,ch,n,v) -> "\\textnormal{Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" end ) ^ ( if ch > 0 then "^+" else if ch < 0 then "^-" else "^0" ) ^ "}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Rsigma -> "rsi" | Rphip -> "rpp" | Rphim -> "rpm" | Rphin -> "rpn" | Rphisn -> "rpsn" | Rphipp -> "rppp" | Rphimm -> "rpmm" | Rf -> "rf" | Rtp -> "rtp" | Rtm -> "rtm" | Rtn -> "rtn" | Rtsn -> "rtsn" | Rtpp -> "rtpp" | Rtmm -> "rtmm" | Aux_top (_,_,ch,n,v) -> "aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttgg" | TBWA -> "tbwa" | TBWZ -> "tbwz" | TTWW -> "ttww" | BBWW -> "bbww" | QGUG -> "qgug" | QBUB -> "qbub" | QW -> "qw" | DL -> "dl" | DR -> "dr" end ) ^ "_" ^ ( if ch > 0 then "p" else if ch < 0 then "m" else "0" ) end (* Introducing new Resonances from 45, there are no PDG values *) let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Rsigma -> 45 | Rphin -> 46 | Rphip | Rphim -> 47 | Rphipp | Rphimm -> 48 | Rphisn -> 49 | Rf -> 52 | Rtn -> 53 | Rtp | Rtm -> 54 | Rtpp | Rtmm -> 55 | Rtsn -> 59 | Aux_top (_,_,_,_,_) -> 81 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Half -> "half" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | I_G_weak -> "ig" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_TVA_ttA -> "gtva_tta" | G_TVA_bbA -> "gtva_bba" | G_VLR_ttZ -> "gvlr_ttz" | G_TVA_ttZ -> "gtva_ttz" | G_TVA_bbZ -> "gtva_bbz" | G_VLR_btW -> "gvlr_btw" | G_VLR_tbW -> "gvlr_tbw" | G_TLR_btW -> "gtlr_btw" | G_TRL_tbW -> "gtrl_tbw" | G_TLR_btWA -> "gtlr_btwa" | G_TRL_tbWA -> "gtrl_tbwa" | G_TLR_btWZ -> "gtlr_btwz" | G_TRL_tbWZ -> "gtrl_tbwz" | G_TVA_ttWW -> "gtva_ttww" | G_TVA_bbWW -> "gtva_bbww" | G_TVA_ttG -> "gtva_ttg" | G_TVA_ttGG -> "gtva_ttgg" | G_SP_ttH -> "gsp_tth" | G_VLR_qGuG -> "gvlr_qgug" | G_VLR_qBuB -> "gvlr_qbub" | G_VLR_qBuB_u -> "gvlr_qbub_u" | G_VLR_qBuB_d -> "gvlr_qbub_d" | G_VLR_qBuB_e -> "gvlr_qbub_e" | G_VL_qBuB_n -> "gvl_qbub_n" | G_VL_qW -> "gvl_qw" | G_VL_qW_u -> "gvl_qw_u" | G_VL_qW_d -> "gvl_qw_d" | G_SL_DttR -> "gsl_dttr" | G_SR_DttR -> "gsr_dttr" | G_SL_DttL -> "gsl_dttl" | G_SLR_DbtR -> "gslr_dbtr" | G_SL_DbtL -> "gsl_dbtl" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | I_G1_AWW -> "ig1a" | I_G1_ZWW -> "ig1z" | I_G1_plus_kappa_plus_G4_AWW -> "ig1pkpg4a" | I_G1_plus_kappa_plus_G4_ZWW -> "ig1pkpg4z" | I_G1_plus_kappa_minus_G4_AWW -> "ig1pkmg4a" | I_G1_plus_kappa_minus_G4_ZWW -> "ig1pkmg4z" | I_G1_minus_kappa_plus_G4_AWW -> "ig1mkpg4a" | I_G1_minus_kappa_plus_G4_ZWW -> "ig1mkpg4z" | I_G1_minus_kappa_minus_G4_AWW -> "ig1mkmg4a" | I_G1_minus_kappa_minus_G4_ZWW -> "ig1mkmg4z" | I_lambda_AWW -> "ila" | I_lambda_ZWW -> "ilz" | G5_AWW -> "rg5a" | G5_ZWW -> "rg5z" | I_kappa5_AWW -> "ik5a" | I_kappa5_ZWW -> "ik5z" | I_lambda5_AWW -> "il5a" | I_lambda5_ZWW -> "il5z" | Alpha_WWWW0 -> "alww0" | Alpha_WWWW2 -> "alww2" | Alpha_ZZWW0 -> "alzw0" | Alpha_ZZWW1 -> "alzw1" | Alpha_ZZZZ -> "alzz" | FT0_WWWW0 -> "at0ww0" | FT0_WWWW2 -> "at0ww2" | FT0_ZZWW0 -> "at0zw0" | FT0_ZZWW1 -> "at0zw1" | FT0_ZZZZ -> "at0zz" | FT0_AAAA -> "at0aa" | FT0_AAWW0 -> "at0aw0" | FT0_AAWW1 -> "at0aw1" | FT0_AAZZ -> "at0az" | FT0_AZWW0 -> "at0azw0" | FT0_AZWW1 -> "at0azw1" | FT0_AAAZ -> "at03az" | FT0_AZZZ -> "at0a3z" | FT1_WWWW0 -> "at1ww0" | FT1_WWWW2 -> "at1ww2" | FT1_ZZWW0 -> "at1zw0" | FT1_ZZWW1 -> "at1zw1" | FT1_ZZZZ -> "at1zz" | FT1_AAAA -> "at1aa" | FT1_AAWW0 -> "at1aw0" | FT1_AAWW1 -> "at1aw1" | FT1_AAZZ -> "at1az" | FT1_AZWW0 -> "at1azw0" | FT1_AZWW1 -> "at1azw1" | FT1_AAAZ -> "at13az" | FT1_AZZZ -> "at1a3z" | FT2_WWWW0 -> "at2ww0" | FT2_WWWW2 -> "at2ww2" | FT2_ZZWW0 -> "at2zw0" | FT2_ZZWW1 -> "at2zw1" | FT2_ZZZZ -> "at2zz" | FT2_AAAA -> "at2aa" | FT2_AAWW0 -> "at2aw0" | FT2_AAWW1 -> "at2aw1" | FT2_AAZZ -> "at2az" | FT2_AZWW0 -> "at2azw0" | FT2_AZWW1 -> "at2azw1" | FT2_AAAZ -> "at23az" | FT2_AZZZ -> "at2a3z" | FM0_WWWW0 -> "am0ww0,am0ww0" | FM0_WWWW2 -> "am0ww2,am0ww2" | FM0_ZZWW0 -> "am0zw0/costhw**2,am0zw0*costhw**2" | FM0_ZZWW1 -> "am0zw1/costhw**2,am0zw1*costhw**2" | FM0_ZZZZ -> "am0zz,am0zz" | FM1_WWWW0 -> "am1ww0,am1ww0" | FM1_WWWW2 -> "am1ww2,am1ww2" | FM1_ZZWW0 -> "am1zw0/costhw**2,am1zw0*costhw**2" | FM1_ZZWW1 -> "am1zw1/costhw**2,am1zw1*costhw**2" | FM1_ZZZZ -> "am1zz,am1zz" | FM7_WWWW0 -> "am7ww0,am7ww0,am7ww0" | FM7_WWWW2 -> "am7ww2,am7ww2,am7ww2" | FM7_ZZWW0 -> "am7zw0/costhw**2,am7zw0,am7zw0*costhw**2" | FM7_ZZWW1 -> "am7zw1/costhw**2,am7zw1,am7zw1*costhw**2" | FM7_ZZZZ -> "am7zz,am7zz,am7zz" | FS0_HHWW -> "fs0hhww" | FS0_HHZZ -> "fs0hhzz" | FS1_HHWW -> "fs1hhww" | FS1_HHZZ -> "fs1hhzz" | FS_H4 -> "fsh4" | FM0_HHWW -> "fm0hhww" | FM0_HHZZ -> "fm0hhzz" | FM1_HHWW -> "fm1hhww" | FM1_HHZZ -> "fm1hhzz" | FM7_HHWW -> "fm7hhww" | FM7_HHZZ -> "fm7hhzz" | D_Alpha_ZZWW0_S -> "dalzz0_s(gkm,mkm," | D_Alpha_ZZWW0_T -> "dalzz0_t(gkm,mkm," | D_Alpha_ZZWW1_S -> "dalzz1_s(gkm,mkm," | D_Alpha_ZZWW1_T -> "dalzz1_t(gkm,mkm," | D_Alpha_ZZWW1_U -> "dalzz1_u(gkm,mkm," | D_Alpha_WWWW0_S -> "dalww0_s(gkm,mkm," | D_Alpha_WWWW0_T -> "dalww0_t(gkm,mkm," | D_Alpha_WWWW0_U -> "dalww0_u(gkm,mkm," | D_Alpha_WWWW2_S -> "dalww2_s(gkm,mkm," | D_Alpha_WWWW2_T -> "dalww2_t(gkm,mkm," | D_Alpha_ZZZZ_S -> "dalz4_s(gkm,mkm," | D_Alpha_ZZZZ_T -> "dalz4_t(gkm,mkm," | D_FT0_ZZWW0_S -> "datzz0_s_0(gkm,mkm," | D_FT0_ZZWW0_T -> "datzz0_t_0(gkm,mkm," | D_FT0_ZZWW0_U -> "datzz0_u_0(gkm,mkm," | D_FT0_ZZWW1_S -> "datzz1_s_0(gkm,mkm," | D_FT0_ZZWW1_T -> "datzz1_t_0(gkm,mkm," | D_FT0_ZZWW1_U -> "datzz1_u_0(gkm,mkm," | D_FT0_WWWW0_S -> "datww0_s_0(gkm,mkm," | D_FT0_WWWW0_T -> "datww0_t_0(gkm,mkm," | D_FT0_WWWW0_U -> "datww0_u_0(gkm,mkm," | D_FT0_WWWW2_S -> "datww2_s_0(gkm,mkm," | D_FT0_WWWW2_T -> "datww2_t_0(gkm,mkm," | D_FT0_WWWW2_U -> "datww2_u_0(gkm,mkm," | D_FT0_ZZZZ_S -> "datz4_s_0(gkm,mkm," | D_FT0_ZZZZ_T -> "datz4_t_0(gkm,mkm," | D_FT0_ZZZZ_U -> "datz4_u_0(gkm,mkm," | D_FT0_AAAA_S -> "data4_s_0(gkm,mkm," | D_FT0_AAAA_T -> "data4_t_0(gkm,mkm," | D_FT0_AAAA_U -> "data4_u_0(gkm,mkm," | D_FT0_AAWW0_S -> "dataw0_s_0(gkm,mkm," | D_FT0_AAWW0_T -> "dataw0_t_0(gkm,mkm," | D_FT0_AAWW0_U -> "dataw0_u_0(gkm,mkm," | D_FT0_AAWW1_S -> "dataw1_s_0(gkm,mkm," | D_FT0_AAWW1_T -> "dataw1_t_0(gkm,mkm," | D_FT0_AAWW1_U -> "dataw1_u_0(gkm,mkm," | D_FT0_AAZZ_S -> "dataz_s_0(gkm,mkm," | D_FT0_AAZZ_T -> "dataz_t_0(gkm,mkm," | D_FT0_AAZZ_U -> "dataz_u_0(gkm,mkm," | D_FT0_AZWW0_S -> "datazw0_s_0(gkm,mkm," | D_FT0_AZWW0_T -> "datazw0_t_0(gkm,mkm," | D_FT0_AZWW0_U -> "datazw0_u_0(gkm,mkm," | D_FT0_AZWW1_S -> "datazw1_s_0(gkm,mkm," | D_FT0_AZWW1_T -> "datazw1_t_0(gkm,mkm," | D_FT0_AZWW1_U -> "datazw1_u_0(gkm,mkm," | D_FT0_AAAZ_S -> "dat3az_s_0(gkm,mkm," | D_FT0_AAAZ_T -> "dat3az_t_0(gkm,mkm," | D_FT0_AAAZ_U -> "dat3az_u_0(gkm,mkm," | D_FT0_AZZZ_S -> "data3z_s_0(gkm,mkm," | D_FT0_AZZZ_T -> "data3z_t_0(gkm,mkm," | D_FT0_AZZZ_U -> "data3z_u_0(gkm,mkm," | D_FT1_ZZWW0_S -> "datzz0_s_1(gkm,mkm," | D_FT1_ZZWW0_T -> "datzz0_t_1(gkm,mkm," | D_FT1_ZZWW0_U -> "datzz0_u_1(gkm,mkm," | D_FT1_ZZWW1_S -> "datzz1_s_1(gkm,mkm," | D_FT1_ZZWW1_T -> "datzz1_t_1(gkm,mkm," | D_FT1_ZZWW1_U -> "datzz1_u_1(gkm,mkm," | D_FT1_WWWW0_S -> "datww0_s_1(gkm,mkm," | D_FT1_WWWW0_T -> "datww0_t_1(gkm,mkm," | D_FT1_WWWW0_U -> "datww0_u_1(gkm,mkm," | D_FT1_WWWW2_S -> "datww2_s_1(gkm,mkm," | D_FT1_WWWW2_T -> "datww2_t_1(gkm,mkm," | D_FT1_WWWW2_U -> "datww2_u_1(gkm,mkm," | D_FT1_ZZZZ_S -> "datz4_s_1(gkm,mkm," | D_FT1_ZZZZ_T -> "datz4_t_1(gkm,mkm," | D_FT1_ZZZZ_U -> "datz4_u_1(gkm,mkm," | D_FT1_AAAA_S -> "data4_s_1(gkm,mkm," | D_FT1_AAAA_T -> "data4_t_1(gkm,mkm," | D_FT1_AAAA_U -> "data4_u_1(gkm,mkm," | D_FT1_AAWW0_S -> "dataw0_s_1(gkm,mkm," | D_FT1_AAWW0_T -> "dataw0_t_1(gkm,mkm," | D_FT1_AAWW0_U -> "dataw0_u_1(gkm,mkm," | D_FT1_AAWW1_S -> "dataw1_s_1(gkm,mkm," | D_FT1_AAWW1_T -> "dataw1_t_1(gkm,mkm," | D_FT1_AAWW1_U -> "dataw1_u_1(gkm,mkm," | D_FT1_AAZZ_S -> "dataz_s_1(gkm,mkm," | D_FT1_AAZZ_T -> "dataz_t_1(gkm,mkm," | D_FT1_AAZZ_U -> "dataz_u_1(gkm,mkm," | D_FT1_AZWW0_S -> "datazw0_s_1(gkm,mkm," | D_FT1_AZWW0_T -> "datazw0_t_1(gkm,mkm," | D_FT1_AZWW0_U -> "datazw0_u_1(gkm,mkm," | D_FT1_AZWW1_S -> "datazw1_s_1(gkm,mkm," | D_FT1_AZWW1_T -> "datazw1_t_1(gkm,mkm," | D_FT1_AZWW1_U -> "datazw1_u_1(gkm,mkm," | D_FT1_AAAZ_S -> "dat3az_s_1(gkm,mkm," | D_FT1_AAAZ_T -> "dat3az_t_1(gkm,mkm," | D_FT1_AAAZ_U -> "dat3az_u_1(gkm,mkm," | D_FT1_AZZZ_S -> "data3z_s_1(gkm,mkm," | D_FT1_AZZZ_T -> "data3z_t_1(gkm,mkm," | D_FT1_AZZZ_U -> "data3z_u_1(gkm,mkm," | D_FT2_ZZWW0_S -> "datzz0_s_2(gkm,mkm," | D_FT2_ZZWW0_T -> "datzz0_t_2(gkm,mkm," | D_FT2_ZZWW0_U -> "datzz0_u_2(gkm,mkm," | D_FT2_ZZWW1_S -> "datzz1_s_2(gkm,mkm," | D_FT2_ZZWW1_T -> "datzz1_t_2(gkm,mkm," | D_FT2_ZZWW1_U -> "datzz1_u_2(gkm,mkm," | D_FT2_WWWW0_S -> "datww0_s_2(gkm,mkm," | D_FT2_WWWW0_T -> "datww0_t_2(gkm,mkm," | D_FT2_WWWW0_U -> "datww0_u_2(gkm,mkm," | D_FT2_WWWW2_S -> "datww2_s_2(gkm,mkm," | D_FT2_WWWW2_T -> "datww2_t_2(gkm,mkm," | D_FT2_WWWW2_U -> "datww2_u_2(gkm,mkm," | D_FT2_ZZZZ_S -> "datz4_s_2(gkm,mkm," | D_FT2_ZZZZ_T -> "datz4_t_2(gkm,mkm," | D_FT2_ZZZZ_U -> "datz4_u_2(gkm,mkm," | D_FT2_AAAA_S -> "data4_s_2(gkm,mkm," | D_FT2_AAAA_T -> "data4_t_2(gkm,mkm," | D_FT2_AAAA_U -> "data4_u_2(gkm,mkm," | D_FT2_AAWW0_S -> "dataw0_s_2(gkm,mkm," | D_FT2_AAWW0_T -> "dataw0_t_2(gkm,mkm," | D_FT2_AAWW0_U -> "dataw0_u_2(gkm,mkm," | D_FT2_AAWW1_S -> "dataw1_s_2(gkm,mkm," | D_FT2_AAWW1_T -> "dataw1_t_2(gkm,mkm," | D_FT2_AAWW1_U -> "dataw1_u_2(gkm,mkm," | D_FT2_AAZZ_S -> "dataz_s_2(gkm,mkm," | D_FT2_AAZZ_T -> "dataz_t_2(gkm,mkm," | D_FT2_AAZZ_U -> "dataz_u_2(gkm,mkm," | D_FT2_AZWW0_S -> "datazw0_s_2(gkm,mkm," | D_FT2_AZWW0_T -> "datazw0_t_2(gkm,mkm," | D_FT2_AZWW0_U -> "datazw0_u_2(gkm,mkm," | D_FT2_AZWW1_S -> "datazw1_s_2(gkm,mkm," | D_FT2_AZWW1_T -> "datazw1_t_2(gkm,mkm," | D_FT2_AZWW1_U -> "datazw1_u_2(gkm,mkm," | D_FT2_AAAZ_S -> "dat3az_s_2(gkm,mkm," | D_FT2_AAAZ_T -> "dat3az_t_2(gkm,mkm," | D_FT2_AAAZ_U -> "dat3az_u_2(gkm,mkm," | D_FT2_AZZZ_S -> "data3z_s_2(gkm,mkm," | D_FT2_AZZZ_T -> "data3z_t_2(gkm,mkm," | D_FT2_AZZZ_U -> "data3z_u_2(gkm,mkm," | D_FTrsi_ZZWW0_S -> "datzz0_s_rsi(gkm,mkm," | D_FTrsi_ZZWW0_T -> "datzz0_t_rsi(gkm,mkm," | D_FTrsi_ZZWW0_U -> "datzz0_u_rsi(gkm,mkm," | D_FTrsi_ZZWW1_S -> "datzz1_s_rsi(gkm,mkm," | D_FTrsi_ZZWW1_T -> "datzz1_t_rsi(gkm,mkm," | D_FTrsi_ZZWW1_U -> "datzz1_u_rsi(gkm,mkm," | D_FTrsi_WWWW0_S -> "datww0_s_rsi(gkm,mkm," | D_FTrsi_WWWW0_T -> "datww0_t_rsi(gkm,mkm," | D_FTrsi_WWWW0_U -> "datww0_u_rsi(gkm,mkm," | D_FTrsi_WWWW2_S -> "datww2_s_rsi(gkm,mkm," | D_FTrsi_WWWW2_T -> "datww2_t_rsi(gkm,mkm," | D_FTrsi_WWWW2_U -> "datww2_u_rsi(gkm,mkm," | D_FTrsi_ZZZZ_S -> "datz4_s_rsi(gkm,mkm," | D_FTrsi_ZZZZ_T -> "datz4_t_rsi(gkm,mkm," | D_FTrsi_ZZZZ_U -> "datz4_u_rsi(gkm,mkm," | D_FTrsi_AAAA_S -> "data4_s_rsi(gkm,mkm," | D_FTrsi_AAAA_T -> "data4_t_rsi(gkm,mkm," | D_FTrsi_AAAA_U -> "data4_u_rsi(gkm,mkm," | D_FTrsi_AAWW0_S -> "dataw0_s_rsi(gkm,mkm," | D_FTrsi_AAWW0_T -> "dataw0_t_rsi(gkm,mkm," | D_FTrsi_AAWW0_U -> "dataw0_u_rsi(gkm,mkm," | D_FTrsi_AAWW1_S -> "dataw1_s_rsi(gkm,mkm," | D_FTrsi_AAWW1_T -> "dataw1_t_rsi(gkm,mkm," | D_FTrsi_AAWW1_U -> "dataw1_u_rsi(gkm,mkm," | D_FTrsi_AAZZ_S -> "dataz_s_rsi(gkm,mkm," | D_FTrsi_AAZZ_T -> "dataz_t_rsi(gkm,mkm," | D_FTrsi_AAZZ_U -> "dataz_u_rsi(gkm,mkm," | D_FTrsi_AZWW0_S -> "datazw0_s_rsi(gkm,mkm," | D_FTrsi_AZWW0_T -> "datazw0_t_rsi(gkm,mkm," | D_FTrsi_AZWW0_U -> "datazw0_u_rsi(gkm,mkm," | D_FTrsi_AZWW1_S -> "datazw1_s_rsi(gkm,mkm," | D_FTrsi_AZWW1_T -> "datazw1_t_rsi(gkm,mkm," | D_FTrsi_AZWW1_U -> "datazw1_u_rsi(gkm,mkm," | D_FTrsi_AAAZ_S -> "dat3az_s_rsi(gkm,mkm," | D_FTrsi_AAAZ_T -> "dat3az_t_rsi(gkm,mkm," | D_FTrsi_AAAZ_U -> "dat3az_u_rsi(gkm,mkm," | D_FTrsi_AZZZ_S -> "data3z_s_rsi(gkm,mkm," | D_FTrsi_AZZZ_T -> "data3z_t_rsi(gkm,mkm," | D_FTrsi_AZZZ_U -> "data3z_u_rsi(gkm,mkm," | D_FM0_ZZWW0_S -> "damzz0_s_0(gkm,mkm," | D_FM0_ZZWW0_T -> "damzz0_t_0(gkm,mkm," | D_FM0_ZZWW0_U -> "damzz0_u_0(gkm,mkm," | D_FM0_ZZWW1_S -> "damzz1_s_0(gkm,mkm," | D_FM0_ZZWW1_T -> "damzz1_t_0(gkm,mkm," | D_FM0_ZZWW1_U -> "damzz1_u_0(gkm,mkm," | D_FM0_WWWW0_S -> "damww0_s_0(gkm,mkm," | D_FM0_WWWW0_T -> "damww0_t_0(gkm,mkm," | D_FM0_WWWW0_U -> "damww0_u_0(gkm,mkm," | D_FM0_WWWW2_S -> "damww2_s_0(gkm,mkm," | D_FM0_WWWW2_T -> "damww2_t_0(gkm,mkm," | D_FM0_WWWW2_U -> "damww2_u_0(gkm,mkm," | D_FM0_ZZZZ_S -> "damz4_s_0(gkm,mkm," | D_FM0_ZZZZ_T -> "damz4_t_0(gkm,mkm," | D_FM0_ZZZZ_U -> "damz4_u_0(gkm,mkm," | D_FM1_ZZWW0_S -> "damzz0_s_1(gkm,mkm," | D_FM1_ZZWW0_T -> "damzz0_t_1(gkm,mkm," | D_FM1_ZZWW0_U -> "damzz0_u_1(gkm,mkm," | D_FM1_ZZWW1_S -> "damzz1_s_1(gkm,mkm," | D_FM1_ZZWW1_T -> "damzz1_t_1(gkm,mkm," | D_FM1_ZZWW1_U -> "damzz1_u_1(gkm,mkm," | D_FM1_WWWW0_S -> "damww0_s_1(gkm,mkm," | D_FM1_WWWW0_T -> "damww0_t_1(gkm,mkm," | D_FM1_WWWW0_U -> "damww0_u_1(gkm,mkm," | D_FM1_WWWW2_S -> "damww2_s_1(gkm,mkm," | D_FM1_WWWW2_T -> "damww2_t_1(gkm,mkm," | D_FM1_WWWW2_U -> "damww2_u_1(gkm,mkm," | D_FM1_ZZZZ_S -> "damz4_s_1(gkm,mkm," | D_FM1_ZZZZ_T -> "damz4_t_1(gkm,mkm," | D_FM1_ZZZZ_U -> "damz4_u_1(gkm,mkm," | D_FM7_ZZWW0_S -> "damzz0_s_7(gkm,mkm," | D_FM7_ZZWW0_T -> "damzz0_t_7(gkm,mkm," | D_FM7_ZZWW0_U -> "damzz0_u_7(gkm,mkm," | D_FM7_ZZWW1_S -> "damzz1_s_7(gkm,mkm," | D_FM7_ZZWW1_T -> "damzz1_t_7(gkm,mkm," | D_FM7_ZZWW1_U -> "damzz1_u_7(gkm,mkm," | D_FM7_WWWW0_S -> "damww0_s_7(gkm,mkm," | D_FM7_WWWW0_T -> "damww0_t_7(gkm,mkm," | D_FM7_WWWW0_U -> "damww0_u_7(gkm,mkm," | D_FM7_WWWW2_S -> "damww2_s_7(gkm,mkm," | D_FM7_WWWW2_T -> "damww2_t_7(gkm,mkm," | D_FM7_WWWW2_U -> "damww2_u_7(gkm,mkm," | D_FM7_ZZZZ_S -> "damz4_s_7(gkm,mkm," | D_FM7_ZZZZ_T -> "damz4_t_7(gkm,mkm," | D_FM7_ZZZZ_U -> "damz4_u_7(gkm,mkm," | D_Alpha_HHHH_S -> "dalh4_s(gkm,mkm," | D_Alpha_HHHH_T -> "dalh4_t(gkm,mkm," | D_Alpha_HHWW0_S -> "dalhw0_s(gkm,mkm," | D_Alpha_HHWW0_T -> "dalhw0_t(gkm,mkm," | D_Alpha_HHZZ0_S -> "dalhz0_s(gkm,mkm," | D_Alpha_HHZZ0_T -> "dalhz0_t(gkm,mkm," | D_Alpha_HHWW1_S -> "dalhw1_s(gkm,mkm," | D_Alpha_HHWW1_T -> "dalhw1_t(gkm,mkm," | D_Alpha_HHWW1_U -> "dalhw1_u(gkm,mkm," | D_Alpha_HHZZ1_S -> "dalhz1_s(gkm,mkm," | D_Alpha_HHZZ1_T -> "dalhz1_t(gkm,mkm," | D_Alpha_HHZZ1_U -> "dalhz1_u(gkm,mkm," | D_FM0_HHWW0_S -> "damhw0_s_0(gkm,mkm," | D_FM0_HHWW0_T -> "damhw0_t_0(gkm,mkm," | D_FM0_HHWW0_U -> "damhw0_u_0(gkm,mkm," | D_FM0_HHZZ0_S -> "damhz0_s_0(gkm,mkm," | D_FM0_HHZZ0_T -> "damhz0_t_0(gkm,mkm," | D_FM0_HHZZ0_U -> "damhz0_u_0(gkm,mkm," | D_FM0_HHWW1_S -> "damhw1_s_0(gkm,mkm," | D_FM0_HHWW1_T -> "damhw1_t_0(gkm,mkm," | D_FM0_HHWW1_U -> "damhw1_u_0(gkm,mkm," | D_FM0_HHZZ1_S -> "damhz1_s_0(gkm,mkm," | D_FM0_HHZZ1_T -> "damhz1_t_0(gkm,mkm," | D_FM0_HHZZ1_U -> "damhz1_u_0(gkm,mkm," | D_FM1_HHWW0_S -> "damhw0_s_1(gkm,mkm," | D_FM1_HHWW0_T -> "damhw0_t_1(gkm,mkm," | D_FM1_HHWW0_U -> "damhw0_u_1(gkm,mkm," | D_FM1_HHZZ0_S -> "damhz0_s_1(gkm,mkm," | D_FM1_HHZZ0_T -> "damhz0_t_1(gkm,mkm," | D_FM1_HHZZ0_U -> "damhz0_u_1(gkm,mkm," | D_FM1_HHWW1_S -> "damhw1_s_1(gkm,mkm," | D_FM1_HHWW1_T -> "damhw1_t_1(gkm,mkm," | D_FM1_HHWW1_U -> "damhw1_u_1(gkm,mkm," | D_FM1_HHZZ1_S -> "damhz1_s_1(gkm,mkm," | D_FM1_HHZZ1_T -> "damhz1_t_1(gkm,mkm," | D_FM1_HHZZ1_U -> "damhz1_u_1(gkm,mkm," | D_FM7_HHWW0_S -> "damhw0_s_7(gkm,mkm," | D_FM7_HHWW0_T -> "damhw0_t_7(gkm,mkm," | D_FM7_HHWW0_U -> "damhw0_u_7(gkm,mkm," | D_FM7_HHZZ0_S -> "damhz0_s_7(gkm,mkm," | D_FM7_HHZZ0_T -> "damhz0_t_7(gkm,mkm," | D_FM7_HHZZ0_U -> "damhz0_u_7(gkm,mkm," | D_FM7_HHWW1_S -> "damhw1_s_7(gkm,mkm," | D_FM7_HHWW1_T -> "damhw1_t_7(gkm,mkm," | D_FM7_HHWW1_U -> "damhw1_u_7(gkm,mkm," | D_FM7_HHZZ1_S -> "damhz1_s_7(gkm,mkm," | D_FM7_HHZZ1_T -> "damhz1_t_7(gkm,mkm," | D_FM7_HHZZ1_U -> "damhz1_u_7(gkm,mkm," | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_SWW -> "gsww" | G_SZZ -> "gszz" | G_SHH -> "gshh" | G_SWW_T -> "gswwt" | G_SZZ_T -> "gszzt" | G_SAA_T -> "gsaat" | G_SAZ_T -> "gsazt" | G_PNWW -> "gpnww" | G_PNZZ -> "gpnzz" | G_PSNWW -> "gpsnww" | G_PSNZZ -> "gpsnzz" | G_PSNHH -> "gpsnhh" | G_PWZ -> "gpwz" | G_PWW -> "gpww" | G_FWW -> "gfww" | G_FZZ -> "gfzz" | G_FWW_CF -> "gfwwcf" | G_FZZ_CF -> "gfzzcf" | G_FHH -> "gfhh" | G_FHH_CF -> "gfhhcf" | G_FWW_T -> "gfwwt" | G_FZZ_T -> "gfzzt" | G_TNWW -> "gtnww" | G_TNZZ -> "gtnzz" | G_TNWW_CF -> "gtnwwcf" | G_TNZZ_CF -> "gtnzzcf" | G_TSNWW -> "gtsnww" | G_TSNZZ -> "gtsnzz" | G_TSNWW_CF -> "gtsnwwcf" | G_TSNZZ_CF -> "gtsnzzcf" | G_TWZ -> "gtwz" | G_TWW -> "gtww" | G_TWZ_CF -> "gtwzcf" | G_TWW_CF -> "gtwwcf" | G_SSWW -> "gssww" | G_SSZZ -> "gsszz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hmm -> "ghmm" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_HGaGa_anom -> "ghgaga_ac" | G_HGaZ_anom -> "ghgaz_ac" | G_HZZ_anom -> "ghzz_ac" | G_HWW_anom -> "ghww_ac" | G_HGaZ_u -> "ghgaz_u" | G_HZZ_u -> "ghzz_u" | G_HWW_u -> "ghww_u" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f | K_Matrix_Coeff i -> "kc" ^ string_of_int i | K_Matrix_Pole i -> "kp" ^ string_of_int i end (* \thocwmodulesection{Complete Minimal Standard Model including additional Resonances (alternate Tensor)} *) module SSC_AltT (Flags : SSC_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width"] + let caveats () = [] type f_aux_top = TTGG | TBWA | TBWZ | TTWW | BBWW | (*i top auxiliary field "flavors" *) QGUG | QBUB | QW | DL | DR type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H | Rsigma | Rphin | Rphisn | Rphip | Rphim | Rphipp | Rphimm | Rf | Rtn | Rtsn | Rtp | Rtm | Rtpp | Rtmm | Rff | Rfv | Rfphi | Aux_top of int*int*int*bool*f_aux_top (*i lorentz*color*charge*top-side*flavor *) type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib_BSM.SSC_AltT.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let rec aux_top_flavors (f,l,co,ch) = List.append ( List.map other [ Aux_top(l,co,ch/2,true,f); Aux_top(l,co,ch/2,false,f) ] ) ( if ch > 1 then List.append ( List.map other [ Aux_top(l,co,-ch/2,true,f); Aux_top(l,co,-ch/2,false,f) ] ) ( aux_top_flavors (f,l,co,(ch-2)) ) else [] ) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [H]; "Scalar Resonances", List.map other [Rsigma; Rphin; Rphisn; Rphip; Rphim; Rphipp; Rphimm]; "Tensor Resonances", List.map other [Rf; Rtn; Rtsn; Rtp; Rtm; Rtpp; Rtmm]; "Alternate Tensor", List.map other [Rff; Rfv; Rfphi]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = List.append ( ThoList.flatmap snd (external_flavors ()) ) ( ThoList.flatmap aux_top_flavors [ (TTGG,2,1,1); (TBWA,2,0,2); (TBWZ,2,0,2); (TTWW,2,0,1); (BBWW,2,0,1); (QGUG,1,1,1); (QBUB,1,0,1); (QW,1,0,3); (DL,0,0,3); (DR,0,0,3) ] ) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz_aux = function | 2 -> Tensor_1 | 1 -> Vector | 0 -> Scalar | _ -> invalid_arg ("SM.lorentz_aux: wrong value") let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> begin match f with | Aux_top (l,_,_,_,_) -> lorentz_aux l | Rf | Rtn | Rtsn | Rtp | Rtm | Rtpp | Rtmm -> Tensor_2 | Rff -> Tensor_2 | Rfv -> Vector | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | O (Aux_top (_,co,_,_,_)) -> if co == 0 then Color.Singlet else Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let prop_aux = function | 2 -> Aux_Tensor_1 | 1 -> Aux_Vector | 0 -> Aux_Scalar | _ -> invalid_arg ("SM.prop_aux: wrong value") let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H | Rsigma -> Prop_Scalar | Rphin | Rphisn | Rphip | Rphim | Rphipp | Rphimm -> Prop_Scalar | Rf -> Prop_Tensor_2 | Rff -> Prop_Tensor_pure | Rfv -> Prop_Vector_pure | Rfphi -> Prop_Scalar | Rtn | Rtsn | Rtp | Rtm | Rtpp | Rtmm -> Prop_Tensor_2 | Aux_top (l,_,_,_,_) -> prop_aux l end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Rsigma -> Rsigma | Rphin -> Rphin | Rphip -> Rphim | Rphim -> Rphip | Rphisn -> Rphisn | Rphipp -> Rphimm | Rphimm -> Rphipp | Rf -> Rf | Rff -> Rff | Rfv -> Rfv | Rfphi -> Rfphi | Rtn -> Rtn | Rtsn -> Rtsn | Rtp -> Rtm | Rtm -> Rtp | Rtpp -> Rtmm | Rtmm -> Rtpp | Aux_top (l,co,ch,n,f) -> Aux_top (l,co,(-ch),(not n),f) end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM.generation': " ^ string_of_int n) let generation f = if Flags.ckm_present then [] else match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Rsigma | Phi0 | Rphin | Rphisn | Rf | Rff | Rfv | Rfphi | Rtn | Rtsn -> 0//1 | Phip | Rphip | Rtp -> 1//1 | Phim | Rphim | Rtm -> -1//1 | Rphipp | Rtpp -> 2//1 | Rphimm | Rtmm -> -2//1 | Aux_top (_,_,ch,_,_) -> ch//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Half | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | I_G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_TVA_ttA | G_TVA_bbA | G_VLR_ttZ | G_TVA_ttZ | G_TVA_bbZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWZ | G_TRL_tbWZ | G_TLR_btWA | G_TRL_tbWA | G_TVA_ttWW | G_TVA_bbWW | G_TVA_ttG | G_TVA_ttGG | G_SP_ttH | G_VLR_qGuG | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | I_G1_AWW | I_G1_ZWW | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_lambda_AWW | I_lambda_ZWW | G5_AWW | G5_ZWW | I_kappa5_AWW | I_kappa5_ZWW | I_lambda5_AWW | I_lambda5_ZWW | FS0_HHWW | FS0_HHZZ | FS1_HHWW | FS1_HHZZ | FM0_HHWW | FM0_HHZZ | FM1_HHWW | FM1_HHZZ | FM7_HHWW | FM7_HHZZ | Alpha_WWWW0 | Alpha_ZZWW1 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZZZ | FT0_WWWW0 | FT0_WWWW2 | FT0_ZZWW0 | FT0_ZZWW1 | FT0_ZZZZ | FT0_AAAA | FT0_AAWW0 | FT0_AAWW1 | FT0_AAZZ | FT0_AZWW0 | FT0_AZWW1 | FT0_AAAZ | FT0_AZZZ | FT1_WWWW0 | FT1_WWWW2 | FT1_ZZWW0 | FT1_ZZWW1 | FT1_ZZZZ | FT1_AAAA | FT1_AAWW0 | FT1_AAWW1 | FT1_AAZZ | FT1_AZWW0 | FT1_AZWW1 | FT1_AAAZ | FT1_AZZZ | FT2_WWWW0 | FT2_WWWW2 | FT2_ZZWW0 | FT2_ZZWW1 | FT2_ZZZZ | FT2_AAAA | FT2_AAWW0 | FT2_AAWW1 | FT2_AAZZ | FT2_AZWW0 | FT2_AZWW1 | FT2_AAAZ | FT2_AZZZ | FM0_WWWW0 | FM0_WWWW2 | FM0_ZZWW0 | FM0_ZZWW1 | FM0_ZZZZ | FM1_WWWW0 | FM1_WWWW2 | FM1_ZZWW0 | FM1_ZZWW1 | FM1_ZZZZ | FM7_WWWW0 | FM7_WWWW2 | FM7_ZZWW0 | FM7_ZZWW1 | FM7_ZZZZ | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T | D_FT0_ZZWW0_S | D_FT0_ZZWW0_T | D_FT0_ZZWW0_U | D_FT0_ZZWW1_S | D_FT0_ZZWW1_T | D_FT0_ZZWW1_U | D_FT0_WWWW0_S | D_FT0_WWWW0_T | D_FT0_WWWW0_U | D_FT0_WWWW2_S | D_FT0_WWWW2_T | D_FT0_WWWW2_U | D_FT0_ZZZZ_S | D_FT0_ZZZZ_T | D_FT0_ZZZZ_U | D_FT0_AAAA_S | D_FT0_AAAA_T | D_FT0_AAAA_U | D_FT0_AAWW0_S | D_FT0_AAWW0_T | D_FT0_AAWW0_U | D_FT0_AAWW1_S | D_FT0_AAWW1_T | D_FT0_AAWW1_U | D_FT0_AAZZ_S | D_FT0_AAZZ_T | D_FT0_AAZZ_U | D_FT0_AZWW0_S | D_FT0_AZWW0_T | D_FT0_AZWW0_U | D_FT0_AZWW1_S | D_FT0_AZWW1_T | D_FT0_AZWW1_U | D_FT0_AAAZ_S | D_FT0_AAAZ_T | D_FT0_AAAZ_U | D_FT0_AZZZ_S | D_FT0_AZZZ_T | D_FT0_AZZZ_U | D_FT1_ZZWW0_S | D_FT1_ZZWW0_T | D_FT1_ZZWW0_U | D_FT1_ZZWW1_S | D_FT1_ZZWW1_T | D_FT1_ZZWW1_U | D_FT1_WWWW0_S | D_FT1_WWWW0_T | D_FT1_WWWW0_U | D_FT1_WWWW2_S | D_FT1_WWWW2_T | D_FT1_WWWW2_U | D_FT1_ZZZZ_S | D_FT1_ZZZZ_T | D_FT1_ZZZZ_U | D_FT1_AAAA_S | D_FT1_AAAA_T | D_FT1_AAAA_U | D_FT1_AAWW0_S | D_FT1_AAWW0_T | D_FT1_AAWW0_U | D_FT1_AAWW1_S | D_FT1_AAWW1_T | D_FT1_AAWW1_U | D_FT1_AAZZ_S | D_FT1_AAZZ_T | D_FT1_AAZZ_U | D_FT1_AZWW0_S | D_FT1_AZWW0_T | D_FT1_AZWW0_U | D_FT1_AZWW1_S | D_FT1_AZWW1_T | D_FT1_AZWW1_U | D_FT1_AAAZ_S | D_FT1_AAAZ_T | D_FT1_AAAZ_U | D_FT1_AZZZ_S | D_FT1_AZZZ_T | D_FT1_AZZZ_U | D_FT2_ZZWW0_S | D_FT2_ZZWW0_T | D_FT2_ZZWW0_U | D_FT2_ZZWW1_S | D_FT2_ZZWW1_T | D_FT2_ZZWW1_U | D_FT2_WWWW0_S | D_FT2_WWWW0_T | D_FT2_WWWW0_U | D_FT2_WWWW2_S | D_FT2_WWWW2_T | D_FT2_WWWW2_U | D_FT2_ZZZZ_S | D_FT2_ZZZZ_T | D_FT2_ZZZZ_U | D_FT2_AAAA_S | D_FT2_AAAA_T | D_FT2_AAAA_U | D_FT2_AAWW0_S | D_FT2_AAWW0_T | D_FT2_AAWW0_U | D_FT2_AAWW1_S | D_FT2_AAWW1_T | D_FT2_AAWW1_U | D_FT2_AAZZ_S | D_FT2_AAZZ_T | D_FT2_AAZZ_U | D_FT2_AZWW0_S | D_FT2_AZWW0_T | D_FT2_AZWW0_U | D_FT2_AZWW1_S | D_FT2_AZWW1_T | D_FT2_AZWW1_U | D_FT2_AAAZ_S | D_FT2_AAAZ_T | D_FT2_AAAZ_U | D_FT2_AZZZ_S | D_FT2_AZZZ_T | D_FT2_AZZZ_U | D_FTrsi_ZZWW0_S | D_FTrsi_ZZWW0_T | D_FTrsi_ZZWW0_U | D_FTrsi_ZZWW1_S | D_FTrsi_ZZWW1_T | D_FTrsi_ZZWW1_U | D_FTrsi_WWWW0_S | D_FTrsi_WWWW0_T | D_FTrsi_WWWW0_U | D_FTrsi_WWWW2_S | D_FTrsi_WWWW2_T | D_FTrsi_WWWW2_U | D_FTrsi_ZZZZ_S | D_FTrsi_ZZZZ_T | D_FTrsi_ZZZZ_U | D_FTrsi_AAAA_S | D_FTrsi_AAAA_T | D_FTrsi_AAAA_U | D_FTrsi_AAWW0_S | D_FTrsi_AAWW0_T | D_FTrsi_AAWW0_U | D_FTrsi_AAWW1_S | D_FTrsi_AAWW1_T | D_FTrsi_AAWW1_U | D_FTrsi_AAZZ_S | D_FTrsi_AAZZ_T | D_FTrsi_AAZZ_U | D_FTrsi_AZWW0_S | D_FTrsi_AZWW0_T | D_FTrsi_AZWW0_U | D_FTrsi_AZWW1_S | D_FTrsi_AZWW1_T | D_FTrsi_AZWW1_U | D_FTrsi_AAAZ_S | D_FTrsi_AAAZ_T | D_FTrsi_AAAZ_U | D_FTrsi_AZZZ_S | D_FTrsi_AZZZ_T | D_FTrsi_AZZZ_U | D_FM0_ZZWW0_S | D_FM0_ZZWW0_T | D_FM0_ZZWW0_U | D_FM0_ZZWW1_S | D_FM0_ZZWW1_T | D_FM0_ZZWW1_U | D_FM0_WWWW0_S | D_FM0_WWWW0_T | D_FM0_WWWW0_U | D_FM0_WWWW2_S | D_FM0_WWWW2_T | D_FM0_WWWW2_U | D_FM0_ZZZZ_S | D_FM0_ZZZZ_T | D_FM0_ZZZZ_U | D_FM1_ZZWW0_S | D_FM1_ZZWW0_T | D_FM1_ZZWW0_U | D_FM1_ZZWW1_S | D_FM1_ZZWW1_T | D_FM1_ZZWW1_U | D_FM1_WWWW0_S | D_FM1_WWWW0_T | D_FM1_WWWW0_U | D_FM1_WWWW2_S | D_FM1_WWWW2_T | D_FM1_WWWW2_U | D_FM1_ZZZZ_S | D_FM1_ZZZZ_T | D_FM1_ZZZZ_U | D_FM7_ZZWW0_S | D_FM7_ZZWW0_T | D_FM7_ZZWW0_U | D_FM7_ZZWW1_S | D_FM7_ZZWW1_T | D_FM7_ZZWW1_U | D_FM7_WWWW0_S | D_FM7_WWWW0_T | D_FM7_WWWW0_U | D_FM7_WWWW2_S | D_FM7_WWWW2_T | D_FM7_WWWW2_U | D_FM7_ZZZZ_S | D_FM7_ZZZZ_T | D_FM7_ZZZZ_U | D_Alpha_HHHH_S | D_Alpha_HHHH_T | D_Alpha_HHZZ0_S | D_Alpha_HHWW0_S | D_Alpha_HHZZ0_T | D_Alpha_HHWW0_T | D_Alpha_HHZZ1_S | D_Alpha_HHWW1_S | D_Alpha_HHZZ1_T | D_Alpha_HHWW1_T | D_Alpha_HHZZ1_U | D_Alpha_HHWW1_U | D_FM0_HHZZ0_S | D_FM0_HHWW0_S | D_FM0_HHZZ0_T | D_FM0_HHWW0_T | D_FM0_HHZZ0_U | D_FM0_HHWW0_U | D_FM0_HHZZ1_S | D_FM0_HHWW1_S | D_FM0_HHZZ1_T | D_FM0_HHWW1_T | D_FM0_HHZZ1_U | D_FM0_HHWW1_U | D_FM1_HHZZ0_S | D_FM1_HHWW0_S | D_FM1_HHZZ0_T | D_FM1_HHWW0_T | D_FM1_HHZZ0_U | D_FM1_HHWW0_U | D_FM1_HHZZ1_S | D_FM1_HHWW1_S | D_FM1_HHZZ1_T | D_FM1_HHWW1_T | D_FM1_HHZZ1_U | D_FM1_HHWW1_U | D_FM7_HHZZ0_S | D_FM7_HHWW0_S | D_FM7_HHZZ0_T | D_FM7_HHWW0_T | D_FM7_HHZZ0_U | D_FM7_HHWW0_U | D_FM7_HHZZ1_S | D_FM7_HHWW1_S | D_FM7_HHZZ1_T | D_FM7_HHWW1_T | D_FM7_HHZZ1_U | D_FM7_HHWW1_U | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_SWW | G_SWW_T | G_SSWW | G_SZZ | G_SZZ_T | G_SSZZ | G_SHH | G_SAA_T | G_SAZ_T | G_PNWW | G_PNZZ | G_PWZ | G_PWW | G_PSNWW | G_PSNZZ | G_PSNHH | G_FWW | G_FZZ | G_FWW_CF | G_FZZ_CF | G_FWW_T | G_FZZ_T | G_FHH | G_FHH_CF | G_FFWW | G_FFZZ | G_FFWW_CF | G_FFZZ_CF | G_FFHH | G_FFHH_CF | G_FVWW | G_FVZZ | G_FVHH | G_FVWW_CF | G_FVZZ_CF | G_FVHH_CF | G_FDDSWW | G_FDDSZZ | G_FDDSHH | G_FDDSWW_CF | G_FDDSZZ_CF | G_FDDSHH_CF | G_FSWW | G_FSZZ | G_FSHH | G_TNWW | G_TNZZ | G_TSNWW | G_TSNZZ | G_TWZ | G_TWW | G_TNWW_CF | G_TNZZ_CF | G_TSNWW_CF | G_TSNZZ_CF | G_TWZ_CF | G_TWW_CF | G_Htt | G_Hbb | G_Hcc | G_Hmm | G_Htautau | G_H3 | G_H4 | FS_H4 | G_HGaZ | G_HGaGa | G_Hgg | G_HGaZ_anom | G_HGaGa_anom | G_HZZ_anom | G_HWW_anom | G_HGaZ_u | G_HZZ_u | G_HWW_u | Gs | I_Gs | G2 | Mass of flavor | Width of flavor | K_Matrix_Coeff of int | K_Matrix_Pole of int (* \begin{dubious} The current abstract syntax for parameter dependencies is admittedly tedious. Later, there will be a parser for a convenient concrete syntax as a part of a concrete syntax for models. But as these examples show, it should include simple functions. \end{dubious} *) type orders = int * int let orders = function | _ -> (0,0) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} *) let input_parameters = [ Alpha_QED, 1. /. 137.0359895; Sin2thw, 0.23124; Mass (G Z), 91.187; Mass (M (N 1)), 0.0; Mass (M (L 1)), 0.51099907e-3; Mass (M (N 2)), 0.0; Mass (M (L 2)), 0.105658389; Mass (M (N 3)), 0.0; Mass (M (L 3)), 1.77705; Mass (M (U 1)), 5.0e-3; Mass (M (D 1)), 3.0e-3; Mass (M (U 2)), 1.2; Mass (M (D 2)), 0.1; Mass (M (U 3)), 174.0; Mass (M (D 3)), 4.2 ] (* \begin{subequations} \begin{align} e &= \sqrt{4\pi\alpha} \\ \sin\theta_w &= \sqrt{\sin^2\theta_w} \\ \cos\theta_w &= \sqrt{1-\sin^2\theta_w} \\ g &= \frac{e}{\sin\theta_w} \\ m_W &= \cos\theta_w m_Z \\ v &= \frac{2m_W}{g} \\ g_{CC} = -\frac{g}{2\sqrt2} &= -\frac{e}{2\sqrt2\sin\theta_w} \\ Q_{\text{lepton}} = -q_{\text{lepton}}e &= e \\ Q_{\text{up}} = -q_{\text{up}}e &= -\frac{2}{3}e \\ Q_{\text{down}} = -q_{\text{down}}e &= \frac{1}{3}e \\ \ii q_We = \ii g_{\gamma WW} &= \ii e \\ \ii g_{ZWW} &= \ii g \cos\theta_w \\ \ii g_{WWW} &= \ii g \end{align} \end{subequations} *) (* \begin{dubious} \ldots{} to be continued \ldots{} The quartic couplings can't be correct, because the dimensions are wrong! \begin{subequations} \begin{align} g_{HWW} &= g m_W = 2 \frac{m_W^2}{v}\\ g_{HHWW} &= 2 \frac{m_W^2}{v^2} = \frac{g^2}{2} \\ g_{HZZ} &= \frac{g}{\cos\theta_w}m_Z \\ g_{HHZZ} &= 2 \frac{m_Z^2}{v^2} = \frac{g^2}{2\cos\theta_w} \\ g_{Htt} &= \lambda_t \\ g_{Hbb} &= \lambda_b=\frac{m_b}{m_t}\lambda_t \\ g_{H^3} &= - \frac{3g}{2}\frac{m_H^2}{m_W} = - 3 \frac{m_H^2}{v} g_{H^4} &= - \frac{3g^2}{4} \frac{m_W^2}{v^2} = -3 \frac{m_H^2}{v^2} \end{align} \end{subequations} \end{dubious} *) let derived_parameters = [ Real E, Sqrt (Prod [Integer 4; Atom Pi; Atom Alpha_QED]); Real Sinthw, Sqrt (Atom Sin2thw); Real Costhw, Sqrt (Diff (Integer 1, Atom Sin2thw)); Real G_weak, Quot (Atom E, Atom Sinthw); Real (Mass (G Wp)), Prod [Atom Costhw; Atom (Mass (G Z))]; Real Vev, Quot (Prod [Integer 2; Atom (Mass (G Wp))], Atom G_weak); Real Q_lepton, Atom E; Real Q_up, Prod [Quot (Integer (-2), Integer 3); Atom E]; Real Q_down, Prod [Quot (Integer 1, Integer 3); Atom E]; Real G_CC, Neg (Quot (Atom G_weak, Prod [Integer 2; Sqrt (Integer 2)])); Complex I_Q_W, Prod [I; Atom E]; Complex I_G_weak, Prod [I; Atom G_weak]; Complex I_G_ZWW, Prod [I; Atom G_weak; Atom Costhw] ] (* \begin{equation} - \frac{g}{2\cos\theta_w} \end{equation} *) let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) (* \begin{subequations} \begin{align} - \frac{g}{2\cos\theta_w} g_V &= - \frac{g}{2\cos\theta_w} (T_3 - 2 q \sin^2\theta_w) \\ - \frac{g}{2\cos\theta_w} g_A &= - \frac{g}{2\cos\theta_w} T_3 \end{align} \end{subequations} *) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents' n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents'' n = List.map mgm [ ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents_triv = ThoList.flatmap charged_currents' [1;2;3] @ ThoList.flatmap charged_currents'' [1;2;3] let charged_currents_ckm = let charged_currents_2 n1 n2 = List.map mgm [ ((D (-n1), Wm, U n2), FBF (1, Psibar, VL, Psi), G_CCQ (n2,n1)); ((U (-n1), Wp, D n2), FBF (1, Psibar, VL, Psi), G_CCQ (n1,n2)) ] in ThoList.flatmap charged_currents' [1;2;3] @ List.flatten (Product.list2 charged_currents_2 [1;2;3] [1;2;3]) let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] @ if Flags.higgs_hmm then [ ((M (L (-2)), O H, M (L 2)), FBF (1, Psibar, S, Psi), G_Hmm)] else [] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] (* \begin{multline} \mathcal{L}_{\textrm{TGC}}(g_1,\kappa) = g_1 \mathcal{L}_T(V,W^+,W^-) \\ + \frac{\kappa+g_1}{2} \Bigl(\mathcal{L}_T(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr)\\ + \frac{\kappa-g_1}{2} \Bigl(\mathcal{L}_L(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr) \end{multline} *) (* \begin{dubious} The whole thing in the LEP2 workshop notation: \begin{multline} \ii\mathcal{L}_{\textrm{TGC},V} / g_{WWV} = \\ g_1^V V^\mu (W^-_{\mu\nu}W^{+,\nu}-W^+_{\mu\nu}W^{-,\nu}) + \kappa_V W^+_\mu W^-_\nu V^{\mu\nu} + \frac{\lambda_V}{m_W^2} V_{\mu\nu} W^-_{\rho\mu} W^{+,\hphantom{\nu}\rho}_{\hphantom{+,}\nu} \\ + \ii g_5^V \epsilon_{\mu\nu\rho\sigma} \left( (\partial^\rho W^{-,\mu}) W^{+,\nu} - W^{-,\mu}(\partial^\rho W^{+,\nu}) \right) V^\sigma \\ + \ii g_4^V W^-_\mu W^+_\nu (\partial^\mu V^\nu + \partial^\nu V^\mu) - \frac{\tilde\kappa_V}{2} W^-_\mu W^+_\nu \epsilon^{\mu\nu\rho\sigma} V_{\rho\sigma} - \frac{\tilde\lambda_V}{2m_W^2} W^-_{\rho\mu} W^{+,\mu}_{\hphantom{+,\mu}\nu} \epsilon^{\nu\rho\alpha\beta} V_{\alpha\beta} \end{multline} using the conventions of Itzykson and Zuber with $\epsilon^{0123} = +1$. \end{dubious} *) (* \begin{dubious} This is equivalent to the notation of Hagiwara et al.~\cite{HPZH87}, if we remember that they have opposite signs for~$g_{WWV}$: \begin{multline} \mathcal{L}_{WWV} / (-g_{WWV}) = \\ \ii g_1^V \left( W^\dagger_{\mu\nu} W^\mu - W^\dagger_\mu W^\mu_{\hphantom{\mu}\nu} \right) V^\nu + \ii \kappa_V W^\dagger_\mu W_\nu V^{\mu\nu} + \ii \frac{\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} V^{\nu\lambda} \\ - g_4^V W^\dagger_\mu W_\nu \left(\partial^\mu V^\nu + \partial^\nu V^\mu \right) + g_5^V \epsilon^{\mu\nu\lambda\sigma} \left( W^\dagger_\mu \stackrel{\leftrightarrow}{\partial_\lambda} W_\nu \right) V_\sigma\\ + \ii \tilde\kappa_V W^\dagger_\mu W_\nu \tilde{V}^{\mu\nu} + \ii\frac{\tilde\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} \tilde{V}^{\nu\lambda} \end{multline} Here $V^\mu$ stands for either the photon or the~$Z$ field, $W^\mu$ is the $W^-$ field, $W_{\mu\nu} = \partial_\mu W_\nu - \partial_\nu W_\mu$, $V_{\mu\nu} = \partial_\mu V_\nu - \partial_\nu V_\mu$, and $\tilde{V}_{\mu\nu} = \frac{1}{2} \epsilon_{\mu\nu\lambda\sigma} V^{\lambda\sigma}$. \end{dubious} *) let anomalous_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_ZWW) ] let triple_gauge = if Flags.triple_anom then anomalous_triple_gauge else standard_triple_gauge (* \begin{equation} \mathcal{L}_{\textrm{QGC}} = - g^2 W_{+,\mu} W_{-,\nu} W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Actually, quartic gauge couplings are a little bit more straightforward using auxiliary fields. Here we have to impose the antisymmetry manually: \begin{subequations} \begin{multline} (W^{+,\mu}_1 W^{-,\nu}_2 - W^{+,\nu}_1 W^{-,\mu}_2) (W^+_{3,\mu} W^-_{4,\nu} - W^+_{3,\nu} W^-_{4,\mu}) \\ = 2(W^+_1W^+_3)(W^-_2W^-_4) - 2(W^+_1W^-_4)(W^-_2W^+_3) \end{multline} also ($V$ can be $A$ or $Z$) \begin{multline} (W^{+,\mu}_1 V^\nu_2 - W^{+,\nu}_1 V^\mu_2) (W^-_{3,\mu} V_{4,\nu} - W^-_{3,\nu} V_{4,\mu}) \\ = 2(W^+_1W^-_3)(V_2V_4) - 2(W^+_1V_4)(V_2W^-_3) \end{multline} \end{subequations} *) (* \begin{subequations} \begin{multline} W^{+,\mu} W^{-,\nu} W^+_\mu W^-_\nu \end{multline} \end{subequations} *) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] (* \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \left( \frac{g^4}{2}\left( (W^+_\mu W^{-,\mu})^2 + W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} \right)\right.\notag \\ &\qquad\qquad\qquad \left. + \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \\ \mathcal{L}_5 &= \alpha_5 \left( g^4 (W^+_\mu W^{-,\mu})^2 + \frac{g^4}{\cos^2\theta_w} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \end{align} \end{subequations} or \begin{multline} \mathcal{L}_4 + \mathcal{L}_5 = (\alpha_4+2\alpha_5) g^4 \frac{1}{2} (W^+_\mu W^{-,\mu})^2 \\ + 2\alpha_4 g^4 \frac{1}{4} W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} + \alpha_4 \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu \\ + 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \frac{1}{2} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \frac{1}{8} (Z_\mu Z^\mu)^2 \end{multline} and therefore \begin{subequations} \begin{align} \alpha_{(WW)_0} &= (\alpha_4+2\alpha_5) g^4 \\ \alpha_{(WW)_2} &= 2\alpha_4 g^4 \\ \alpha_{(WZ)_0} &= 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{(WZ)_1} &= \alpha_4 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{ZZ} &= (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \end{align} \end{subequations} *) let anomalous_quartic_gauge = if Flags.quartic_anom then List.map qgc [ ((Wm, Wm, Wp, Wp), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4 [1, C_12_34], Alpha_WWWW2); ((Z, Z, Z, Z), Vector4 [(1, C_12_34); (1, C_13_42); (1, C_14_23)], Alpha_ZZZZ); ((Wm, Wp, Z, Z), Vector4 [1, C_12_34], Alpha_ZZWW0); ((Wm, Wp, Z, Z), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_ZZWW1)] @ (if Flags.k_matrix_tm then List.map qgc [((Wm, Wm, Wp, Wp), Dim8_Vector4_t_0 [1, C_13_42], FT0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_0 [1, C_14_23], FT0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_0 [1, C_12_34], FT0_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_1 [1, C_13_42], FT1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_1 [1, C_14_23], FT1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_1 [1, C_12_34], FT1_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_2 [1, C_13_42], FT2_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_2 [1, C_14_23], FT2_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_t_2 [1, C_12_34], FT2_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_0 [1, C_13_42], FM0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_0 [1, C_14_23], FM0_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_0 [1, C_12_34], FM0_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_1 [1, C_13_42], FM1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_1 [1, C_14_23], FM1_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_1 [1, C_12_34], FM1_WWWW2); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_7 [1, C_13_42], FM7_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_7 [1, C_14_23], FM7_WWWW0); ((Wm, Wm, Wp, Wp), Dim8_Vector4_m_7 [1, C_12_34], FM7_WWWW2); ((Wm, Wp, Z, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_0 [1, C_12_34], FM0_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_m_0 [1, C_13_42], FM0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_0 [1, C_14_23], FM0_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_1 [1, C_12_34], FM1_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_m_1 [1, C_13_42], FM1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_1 [1, C_14_23], FM1_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_7 [1, C_12_34], FM7_ZZWW0); ((Wm, Wp, Z, Z), Dim8_Vector4_m_7 [1, C_13_42], FM7_ZZWW1); ((Wm, Wp, Z, Z), Dim8_Vector4_m_7 [1, C_14_23], FM7_ZZWW1); ((Z, Z, Z, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_0 [1, C_12_34], FM0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_0 [1, C_13_42], FM0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_0 [1, C_14_23], FM0_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_1 [1, C_12_34], FM1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_1 [1, C_13_42], FM1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_1 [1, C_14_23], FM1_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_7 [1, C_12_34], FM7_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_7 [1, C_13_42], FM7_ZZZZ); ((Z, Z, Z, Z), Dim8_Vector4_m_7 [1, C_14_23], FM7_ZZZZ); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAAA); ((Ga, Ga, Ga, Ga), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAAA); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAWW0); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAWW0); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAWW0); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAWW1); ((Wm, Wp, Ga, Ga), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAWW1); ((Z, Z, Ga, Ga), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAZZ); ((Z, Z, Ga, Ga), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAZZ); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_0 [1, C_12_34], FT0_AZWW0); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_0 [1, C_13_42], FT0_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_0 [1, C_14_23], FT0_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_1 [1, C_12_34], FT1_AZWW0); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_1 [1, C_13_42], FT1_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_1 [1, C_14_23], FT1_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_2 [1, C_12_34], FT2_AZWW0); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_2 [1, C_13_42], FT2_AZWW1); ((Ga, Z, Wp, Wm), Dim8_Vector4_t_2 [1, C_14_23], FT2_AZWW1); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_AAAZ); ((Ga, Ga, Ga, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_AAAZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_0 [1, C_12_34], FT0_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_0 [1, C_13_42], FT0_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_0 [1, C_14_23], FT0_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_1 [1, C_12_34], FT1_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_1 [1, C_13_42], FT1_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_1 [1, C_14_23], FT1_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_2 [1, C_12_34], FT2_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_2 [1, C_13_42], FT2_AZZZ); ((Ga, Z, Z, Z), Dim8_Vector4_t_2 [1, C_14_23], FT2_AZZZ)] else [] ) else [] (* In any diagonal channel~$\chi$, the scattering amplitude~$a_\chi(s)$ is unitary iff\footnote{% Trivial proof: \begin{equation} -1 = \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = \frac{\textrm{Im}(a_\chi^*(s))}{ |a_\chi(s)|^2 } = - \frac{\textrm{Im}(a_\chi(s))}{ |a_\chi(s)|^2 } \end{equation} i.\,e.~$\textrm{Im}(a_\chi(s)) = |a_\chi(s)|^2$.} \begin{equation} \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = -1 \end{equation} For a real perturbative scattering amplitude~$r_\chi(s)$ this can be enforced easily--and arbitrarily--by \begin{equation} \frac{1}{a_\chi(s)} = \frac{1}{r_\chi(s)} - \mathrm{i} \end{equation} *) let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_WWWW2_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZWW0_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_14_23)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_13_42); (1, C_12_34)]), D_Alpha_ZZZZ_T)] else [] let k_matrix_quartic_gauge_t_0 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t0 (2, [(1, C_12_34)]), D_FT0_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t0 (2, [(1, C_13_42)]), D_FT0_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t0 (2, [(1, C_14_23)]), D_FT0_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t0 (2, [(1, C_12_34)]), D_FT0_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t0 (2, [(1, C_13_42)]), D_FT0_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t0 (2, [(1, C_14_23)]), D_FT0_AAWW1_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_12_34)]), D_FT0_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_13_42)]), D_FT0_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t0 (0, [(1, C_14_23)]), D_FT0_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t0 (1, [(1, C_12_34)]), D_FT0_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t0 (1, [(1, C_13_42)]), D_FT0_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t0 (1, [(1, C_14_23)]), D_FT0_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_12_34)]), D_FT0_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_13_42)]), D_FT0_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t0 (3, [(1, C_14_23)]), D_FT0_AZZZ_U)] else [] let k_matrix_quartic_gauge_t_1 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t1 (2, [(1, C_12_34)]), D_FT1_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t1 (2, [(1, C_13_42)]), D_FT1_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t1 (2, [(1, C_14_23)]), D_FT1_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1(0, [(1, C_12_34)]), D_FT1_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t1 (2, [(1, C_12_34)]), D_FT1_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t1 (2, [(1, C_13_42)]), D_FT1_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t1 (2, [(1, C_14_23)]), D_FT1_AAWW1_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_12_34)]), D_FT1_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_13_42)]), D_FT1_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t1 (0, [(1, C_14_23)]), D_FT1_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t1 (1, [(1, C_12_34)]), D_FT1_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t1 (1, [(1, C_13_42)]), D_FT1_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t1 (1, [(1, C_14_23)]), D_FT1_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_12_34)]), D_FT1_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_13_42)]), D_FT1_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t1 (3, [(1, C_14_23)]), D_FT1_AZZZ_U)] else [] let k_matrix_quartic_gauge_t_2 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t2 (2, [(1, C_12_34)]), D_FT2_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t2 (2, [(1, C_13_42)]), D_FT2_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t2 (2, [(1, C_14_23)]), D_FT2_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t2 (2, [(1, C_12_34)]), D_FT2_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t2 (2, [(1, C_13_42)]), D_FT2_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t2 (2, [(1, C_14_23)]), D_FT2_AAWW1_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_12_34)]), D_FT2_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_13_42)]), D_FT2_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t2 (0, [(1, C_14_23)]), D_FT2_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t2 (1, [(1, C_12_34)]), D_FT2_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t2 (1, [(1, C_13_42)]), D_FT2_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t2 (1, [(1, C_14_23)]), D_FT2_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_12_34)]), D_FT2_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_13_42)]), D_FT2_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t2 (3, [(1, C_14_23)]), D_FT2_AZZZ_U)] else [] let k_matrix_quartic_gauge_t_rsi = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_12_34)]), D_FTrsi_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_13_42)]), D_FTrsi_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_14_23)]), D_FTrsi_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_ZZZZ_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAAA_U); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAA_S); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAA_T); ((Ga, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAA_U); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAWW0_S); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAWW0_T); ((Wm, Wp, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAWW0_U); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAWW1_S); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAWW1_T); ((Wm, Ga, Wp, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AAWW1_S); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AAWW1_U); ((Wp, Ga, Ga, Wm), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AAWW1_T); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_12_34)]), D_FTrsi_AAWW1_S); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_13_42)]), D_FTrsi_AAWW1_U); ((Ga, Wp, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (2, [(1, C_14_23)]), D_FTrsi_AAWW1_T); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAZZ_S); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAZZ_T); ((Ga, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAZZ_U); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAZZ_S); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAZZ_T); ((Z, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAZZ_U); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AAZZ_S); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AAZZ_T); ((Ga, Ga, Z, Z), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AAZZ_U); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_12_34)]), D_FTrsi_AZWW0_S); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_13_42)]), D_FTrsi_AZWW0_T); ((Ga, Z, Wp, Wm), Vector4_K_Matrix_cf_t_rsi (0, [(1, C_14_23)]), D_FTrsi_AZWW0_U); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Wp, Ga, Wm, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Wm, Ga, Wp, Z), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Z, Wm, Ga, Wp), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_12_34)]), D_FTrsi_AZWW1_S); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_13_42)]), D_FTrsi_AZWW1_T); ((Wp, Z, Wm, Ga), Vector4_K_Matrix_cf_t_rsi (1, [(1, C_14_23)]), D_FTrsi_AZWW1_U); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAZ_S); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAZ_T); ((Ga, Ga, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAZ_U); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAZ_S); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAZ_T); ((Z, Ga, Ga, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAZ_U); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AAAZ_S); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AAAZ_T); ((Ga, Ga, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AAAZ_U); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AZZZ_S); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AZZZ_T); ((Z, Z, Z, Ga), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AZZZ_U); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AZZZ_S); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AZZZ_T); ((Ga, Z, Z, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AZZZ_U); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_12_34)]), D_FTrsi_AZZZ_S); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_13_42)]), D_FTrsi_AZZZ_T); ((Z, Z, Ga, Z), Vector4_K_Matrix_cf_t_rsi (3, [(1, C_14_23)]), D_FTrsi_AZZZ_U)] else [] let k_matrix_quartic_gauge_m_0 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m0 (1, [(1, C_12_34)]), D_FM0_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m0 (1, [(1, C_13_42)]), D_FM0_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m0 (1, [(1, C_14_23)]), D_FM0_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m0 (2, [(1, C_12_34)]), D_FM0_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m0 (2, [(1, C_13_42)]), D_FM0_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m0 (2, [(1, C_14_23)]), D_FM0_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_12_34)]), D_FM0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_13_42)]), D_FM0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (0, [(1, C_14_23)]), D_FM0_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (3, [(1, C_14_23)]), D_FM0_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (3, [(1, C_13_42)]), D_FM0_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m0 (3, [(1, C_12_34)]), D_FM0_ZZZZ_U)] else [] let k_matrix_quartic_gauge_m_1 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m1 (1, [(1, C_12_34)]), D_FM1_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m1 (1, [(1, C_13_42)]), D_FM1_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m1 (1, [(1, C_14_23)]), D_FM1_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m1 (2, [(1, C_12_34)]), D_FM1_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m1 (2, [(1, C_13_42)]), D_FM1_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m1 (2, [(1, C_14_23)]), D_FM1_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_12_34)]), D_FM1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_13_42)]), D_FM1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (0, [(1, C_14_23)]), D_FM1_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (3, [(1, C_14_23)]), D_FM1_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (3, [(1, C_13_42)]), D_FM1_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m1 (3, [(1, C_12_34)]), D_FM1_ZZZZ_U)] else [] let k_matrix_quartic_gauge_m_7 = if Flags.k_matrix_tm then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_WWWW2_T); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_WWWW2_U); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_ZZWW0_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_ZZWW0_U); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m7 (1, [(1, C_12_34)]), D_FM7_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m7 (1, [(1, C_13_42)]), D_FM7_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_cf_m7 (1, [(1, C_14_23)]), D_FM7_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m7 (2, [(1, C_12_34)]), D_FM7_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m7 (2, [(1, C_13_42)]), D_FM7_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_cf_m7 (2, [(1, C_14_23)]), D_FM7_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_12_34)]), D_FM7_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_13_42)]), D_FM7_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (0, [(1, C_14_23)]), D_FM7_ZZZZ_U); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (3, [(1, C_14_23)]), D_FM7_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (3, [(1, C_13_42)]), D_FM7_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_cf_m7 (3, [(1, C_12_34)]), D_FM7_ZZZZ_U)] else [] let k_matrix_2scalar_2gauge = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_12_34)]), D_Alpha_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_13_42)]), D_Alpha_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_14_23)]), D_Alpha_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_14_23)]), D_Alpha_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_13_42)]), D_Alpha_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_12_34)]), D_Alpha_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_13_42)]), D_Alpha_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_12_34)]), D_Alpha_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_14_23)]), D_Alpha_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (0, [(1, C_12_34)]), D_Alpha_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (2, [(1, C_13_42)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (1, [(1, C_14_23)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (1, [(1, C_13_42)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (2, [(1, C_14_23)]), D_Alpha_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (3, [(1, C_14_23)]), D_Alpha_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (6, [(1, C_13_42)]), D_Alpha_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (4, [(1, C_13_42)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (5, [(1, C_12_34)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (8, [(1, C_14_23)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (7, [(1, C_12_34)]), D_Alpha_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (5, [(1, C_13_42)]), D_Alpha_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (4, [(1, C_12_34)]), D_Alpha_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (7, [(1, C_14_23)]), D_Alpha_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_K_Matrix_ms (8, [(1, C_12_34)]), D_Alpha_HHWW1_U) ] else [] else [] let k_matrix_2scalar_2gauge_m = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_12_34)]), D_FM0_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_13_42)]), D_FM0_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_14_23)]), D_FM0_HHZZ0_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_14_23)]), D_FM0_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_13_42)]), D_FM0_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_12_34)]), D_FM0_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_13_42)]), D_FM0_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_12_34)]), D_FM0_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_14_23)]), D_FM0_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (0, [(1, C_12_34)]), D_FM0_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (2, [(1, C_13_42)]), D_FM0_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (1, [(1, C_14_23)]), D_FM0_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (1, [(1, C_13_42)]), D_FM0_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (2, [(1, C_14_23)]), D_FM0_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (3, [(1, C_14_23)]), D_FM0_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (6, [(1, C_13_42)]), D_FM0_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (4, [(1, C_13_42)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (5, [(1, C_12_34)]), D_FM0_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (8, [(1, C_14_23)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (7, [(1, C_12_34)]), D_FM0_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (5, [(1, C_13_42)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (4, [(1, C_12_34)]), D_FM0_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (7, [(1, C_14_23)]), D_FM0_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_0_K_Matrix_cf (8, [(1, C_12_34)]), D_FM0_HHWW1_T) ] else [] else [] let k_matrix_2scalar_2gauge_m_1 = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_12_34)]), D_FM1_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_13_42)]), D_FM1_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_14_23)]), D_FM1_HHZZ0_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_14_23)]), D_FM1_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_13_42)]), D_FM1_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_12_34)]), D_FM1_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_13_42)]), D_FM1_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_12_34)]), D_FM1_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_14_23)]), D_FM1_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (0, [(1, C_12_34)]), D_FM1_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (2, [(1, C_13_42)]), D_FM1_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (1, [(1, C_14_23)]), D_FM1_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (1, [(1, C_13_42)]), D_FM1_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (2, [(1, C_14_23)]), D_FM1_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (3, [(1, C_14_23)]), D_FM1_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (6, [(1, C_13_42)]), D_FM1_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (4, [(1, C_13_42)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (5, [(1, C_12_34)]), D_FM1_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (8, [(1, C_14_23)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (7, [(1, C_12_34)]), D_FM1_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (5, [(1, C_13_42)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (4, [(1, C_12_34)]), D_FM1_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (7, [(1, C_14_23)]), D_FM1_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_1_K_Matrix_cf (8, [(1, C_12_34)]), D_FM1_HHWW1_T) ] else [] else [] let k_matrix_2scalar_2gauge_m_7 = if Flags.k_matrix_tm then if Flags.higgs_matrix then [ ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_12_34)]), D_FM7_HHZZ0_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_13_42)]), D_FM7_HHZZ0_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_14_23)]), D_FM7_HHZZ0_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_14_23)]), D_FM7_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_13_42)]), D_FM7_HHZZ1_U); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_12_34)]), D_FM7_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_13_42)]), D_FM7_HHZZ1_S); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_12_34)]), D_FM7_HHZZ1_T); ((O H,O H,G Z,G Z), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_14_23)]), D_FM7_HHZZ1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (0, [(1, C_12_34)]), D_FM7_HHWW0_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (2, [(1, C_13_42)]), D_FM7_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (1, [(1, C_14_23)]), D_FM7_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (1, [(1, C_13_42)]), D_FM7_HHWW0_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (2, [(1, C_14_23)]), D_FM7_HHWW0_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (3, [(1, C_14_23)]), D_FM7_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (6, [(1, C_13_42)]), D_FM7_HHWW1_S); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (4, [(1, C_13_42)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (5, [(1, C_12_34)]), D_FM7_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (8, [(1, C_14_23)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (7, [(1, C_12_34)]), D_FM7_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (5, [(1, C_13_42)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (4, [(1, C_12_34)]), D_FM7_HHWW1_T); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (7, [(1, C_14_23)]), D_FM7_HHWW1_U); ((O H,O H,G Wp,G Wm), DScalar2_Vector2_m_7_K_Matrix_cf (8, [(1, C_12_34)]), D_FM7_HHWW1_T) ] else [] else [] let k_matrix_4scalar = if Flags.k_matrix then if Flags.higgs_matrix then [ ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (0, [(1, C_12_34)]), D_Alpha_HHHH_S); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (0, [(1, C_13_42)]), D_Alpha_HHHH_T); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (0, [(1, C_14_23)]), D_Alpha_HHHH_T); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (3, [(1, C_14_23)]), D_Alpha_HHHH_S); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (3, [(1, C_13_42)]), D_Alpha_HHHH_T); ((O H,O H,O H,O H), DScalar4_K_Matrix_ms (3, [(1, C_12_34)]), D_Alpha_HHHH_T) ] else [] else [] (*i Thorsten's original implementation of the K matrix, which we keep since it still might be usefull for the future. let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 2, K_Matrix_Pole 2]), Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4_K_Matrix_tho (0, [(K_Matrix_Coeff 0, K_Matrix_Pole 0); (K_Matrix_Coeff 2, K_Matrix_Pole 2)]), Alpha_ZZWW0); ((Wm, Z, Wp, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 1, K_Matrix_Pole 1]), Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_ZZZZ) ] else [] i*) let quartic_gauge = standard_quartic_gauge @ anomalous_quartic_gauge @ k_matrix_quartic_gauge @ k_matrix_quartic_gauge_t_0 @ k_matrix_quartic_gauge_t_1 @ k_matrix_quartic_gauge_t_2 @ k_matrix_quartic_gauge_t_rsi @ k_matrix_quartic_gauge_m_0 @ k_matrix_quartic_gauge_m_1 @ k_matrix_quartic_gauge_m_7 let standard_gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let standard_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let dim8_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_1 1, FS0_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_1 1, FS0_HHZZ; (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_2 1, FS1_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_2 1, FS1_HHZZ ] let dim8_gauge_higgs4_m = [ (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_m_0 1, FM0_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_m_0 1, FM0_HHZZ; (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_m_1 1, FM1_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_m_1 1, FM1_HHZZ; (O H, O H, G Wp, G Wm), Dim8_Scalar2_Vector2_m_7 1, FM7_HHWW; (O H, O H, G Z, G Z), Dim8_Scalar2_Vector2_m_7 1, FM7_HHZZ] let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let fs_higgs4 = [ (O H, O H, O H, O H), Dim8_Scalar4 1, FS_H4 ] (* WK's couplings (apparently, he still intends to divide by $\Lambda^2_{\text{EWSB}}=16\pi^2v_{\mathrm{F}}^2$): \begin{subequations} \begin{align} \mathcal{L}^{\tau}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V^{\mu} \right\rbrack^2 \\ \mathcal{L}^{\tau}_5 &= \left\lbrack (\partial_{\mu}H)(\partial_{\nu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V_{\nu} \right\rbrack^2 \end{align} \end{subequations} with \begin{equation} V_{\mu} V_{\nu} = \frac{1}{2} \left( W^+_{\mu} W^-_{\nu} + W^+_{\nu} W^-_{\mu} \right) + \frac{1}{2\cos^2\theta_{w}} Z_{\mu} Z_{\nu} \end{equation} (note the symmetrization!), i.\,e. \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V_{\nu})^2 \\ \mathcal{L}_5 &= \alpha_5 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V^{\mu})^2 \end{align} \end{subequations} *) (* Breaking thinks up \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^4}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) \right\rbrack^2 \\ \mathcal{L}^{\tau,H^4}_5 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) \right\rbrack^2 \end{align} \end{subequations} and \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^2V^2}_4 &= \frac{g^2v_{\mathrm{F}}^2}{2} (\partial_{\mu}H)(\partial^{\mu}H) V_{\mu}V^{\mu} \\ \mathcal{L}^{\tau,H^2V^2}_5 &= \frac{g^2v_{\mathrm{F}}^2}{2} (\partial_{\mu}H)(\partial_{\nu}H) V_{\mu}V_{\nu} \end{align} \end{subequations} i.\,e. \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^2V^2}_4 &= \frac{g^2v_{\mathrm{F}}^2}{2} \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) W^+_{\nu}W^{-,\nu} + \frac{1}{2\cos^2\theta_{w}} (\partial_{\mu}H)(\partial^{\mu}H) Z_{\nu} Z^{\nu} \right\rbrack \\ \mathcal{L}^{\tau,H^2V^2}_5 &= \frac{g^2v_{\mathrm{F}}^2}{2} \left\lbrack (W^{+,\mu}\partial_{\mu}H) (W^{-,\nu}\partial_{\nu}H) + \frac{1}{2\cos^2\theta_{w}} (Z^{\mu}\partial_{\mu}H)(Z^{\nu}\partial_{\nu}H) \right\rbrack \end{align} \end{subequations} *) (* \begin{multline} \tau^4_8 \mathcal{L}^{\tau,H^2V^2}_4 + \tau^5_8 \mathcal{L}^{\tau,H^2V^2}_5 = \\ - \frac{g^2v_{\mathrm{F}}^2}{2} \Biggl\lbrack 2\tau^4_8 \frac{1}{2}(\ii\partial_{\mu}H)(\ii\partial^{\mu}H) W^+_{\nu}W^{-,\nu} + \tau^5_8 (W^{+,\mu}\ii\partial_{\mu}H) (W^{-,\nu}\ii\partial_{\nu}H) \\ + \frac{2\tau^4_8}{\cos^2\theta_{w}} \frac{1}{4} (\ii\partial_{\mu}H)(\ii\partial^{\mu}H) Z_{\nu} Z^{\nu} + \frac{\tau^5_8}{\cos^2\theta_{w}} \frac{1}{2} (Z^{\mu}\ii\partial_{\mu}H)(Z^{\nu}\ii\partial_{\nu}H) \Biggr\rbrack \end{multline} where the two powers of $\ii$ make the sign conveniently negative, i.\,e. \begin{subequations} \begin{align} \alpha_{(\partial H)^2W^2}^2 &= \tau^4_8 g^2v_{\mathrm{F}}^2\\ \alpha_{(\partial HW)^2}^2 &= \frac{\tau^5_8 g^2v_{\mathrm{F}}^2}{2} \\ \alpha_{(\partial H)^2Z^2}^2 &= \frac{\tau^4_8 g^2v_{\mathrm{F}}^2}{\cos^2\theta_{w}} \\ \alpha_{(\partial HZ)^2}^2 &=\frac{\tau^5_8 g^2v_{\mathrm{F}}^2}{2\cos^2\theta_{w}} \end{align} \end{subequations} *) let anomalous_gauge_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa_anom; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ_anom; (O H, G Z, G Z), Dim5_Scalar_Gauge2 1, G_HZZ_anom; (O H, G Wp, G Wm), Dim5_Scalar_Gauge2 1, G_HWW_anom; (O H, G Ga, G Z), Dim5_Scalar_Vector_Vector_U 1, G_HGaZ_u; (O H, G Z, G Z), Dim5_Scalar_Vector_Vector_U 1, G_HZZ_u; (O H, G Wp, G Wm), Dim5_Scalar_Vector_Vector_U 1, G_HWW_u; (O H, G Wm, G Wp), Dim5_Scalar_Vector_Vector_U 1, G_HWW_u ] let anomalous_gauge_higgs4 = [] let anomalous_higgs = [] let higgs_triangle_vertices = if Flags.higgs_triangle then [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg ] else [] let anomalous_higgs4 = [] let gauge_higgs = if Flags.higgs_anom then standard_gauge_higgs @ anomalous_gauge_higgs else standard_gauge_higgs let gauge_higgs4 = ( if Flags.higgs_anom then standard_gauge_higgs4 @ anomalous_gauge_higgs4 else standard_gauge_higgs4 ) @ ( if Flags.higgs_matrix then (dim8_gauge_higgs4 @ dim8_gauge_higgs4_m @ k_matrix_2scalar_2gauge @ k_matrix_2scalar_2gauge_m @ k_matrix_2scalar_2gauge_m_1 @ k_matrix_2scalar_2gauge_m_7) else [] ) let higgs = if Flags.higgs_anom then standard_higgs @ anomalous_higgs else standard_higgs let higgs4 = ( if Flags.higgs_anom then standard_higgs4 @ anomalous_higgs4 else standard_higgs4 ) @ ( if Flags.higgs_matrix then (fs_higgs4 @ k_matrix_4scalar ) else [] ) let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] (* New Resonances *) (* \begin{dubious} There is an extra minus in the Lagrangian to have the same sign as HWW or HZZ vertex. Effectivly this doesn't matter for SSC, because $(-1)^2=1$. This is only for completeness. \end{dubious} \begin{subequations} \begin{align} \mathbf{V}_\mu &= -\mathrm{i} g\mathbf{W}_\mu+\mathrm{i} g^\prime\mathbf{B}_\mu \\ \mathbf{W}_\mu &= W_\mu^a\frac{\tau^a}{2} \\ \mathbf{B}_\mu &= W_\mu^a\frac{\tau^3}{2} \\ \tau^{++}&= \tau^+ \otimes \tau^+ \\ \tau^+ &= \frac{1}{2} \left (\tau^+ \otimes \tau^3 + \tau^3+\tau^+ \right ) \\ \tau^0 &= \frac{1}{\sqrt{6}} \left (\tau^3\otimes\tau^3 -\tau^+ \otimes \tau^- - \tau^-+\tau^+ \right ) \\ \tau^- &= \frac{1}{2} \left (\tau^- \otimes \tau^3 + \tau^3+\tau^- \right ) \\ \tau^{--}&= \tau^- \otimes \tau^- \end{align} \end{subequations} *) (* Scalar Isoscalar Old representation \begin{equation} \mathcal{L}_{\sigma}= -\frac{g_\sigma v}{2} \text{tr} \left\lbrack \mathbf{V}_\mu \mathbf{V}^\mu \right\rbrack \sigma \end{equation} *) (* \begin{dubious} Transversal couplings like rsigma3t and rf3t are to be calculated in the new higgs matrix representation. \end{dubious} *) let rsigma3 = [ ((O Rsigma, G Wp, G Wm), Scalar_Vector_Vector 1, G_SWW); ((O Rsigma, G Z, G Z), Scalar_Vector_Vector 1, G_SZZ) ] let rsigma3h = [ ((O Rsigma, O H, O H), Dim5_Scalar_Scalar2 1, G_SHH) ] let rsigma3t = [ ((O Rsigma, G Wp, G Wm), Scalar_Vector_Vector_t 1, G_SWW_T); ((O Rsigma, G Z, G Z), Scalar_Vector_Vector_t 1, G_SZZ_T); ((O Rsigma, G Ga, G Ga), Scalar_Vector_Vector_t 1, G_SAA_T); ((O Rsigma, G Ga, G Z), Scalar_Vector_Vector_t 1, G_SAZ_T) ] let rsigma4 = [ (O Rsigma, O Rsigma, G Wp, G Wm), Scalar2_Vector2 1, G_SSWW; (O Rsigma, O Rsigma, G Z, G Z), Scalar2_Vector2 1, G_SSZZ ] (* Scalar Isotensor \begin{subequations} \begin{align} \mathcal{L}_{\phi}&= \frac{g_\phi v}{4} \text{Tr} \left \lbrack \left ( \mathbf{V}_\mu \otimes \mathbf{V}^\mu - \frac{\tau^{aa}}{6} \text{Tr} \left \lbrack \mathbf{V}_\mu \mathbf{V}^\mu \right \rbrack\right ) {\mathbf{\phi}} \right \rbrack\\ \phi&=\sqrt{2} \left (\phi^{++}\tau^{++}+\phi^+\tau^++\phi^0\tau^0+\phi^-\tau^- + \phi^{--}\tau^{--} \right ) \end{align} \end{subequations} *) let rphi3 = [ ((O Rphin, G Wp, G Wm), Scalar_Vector_Vector 1, G_PNWW); ((O Rphin, G Z, G Z), Scalar_Vector_Vector 1, G_PNZZ) ; ((O Rphisn, G Wp, G Wm), Scalar_Vector_Vector 1, G_PSNWW); ((O Rphisn, G Z, G Z), Scalar_Vector_Vector 1, G_PSNZZ) ; ((O Rphip, G Z, G Wm), Scalar_Vector_Vector 1, G_PWZ) ; ((O Rphipp, G Wm, G Wm), Scalar_Vector_Vector 1, G_PWW) ; ((O Rphim, G Wp, G Z), Scalar_Vector_Vector 1, G_PWZ) ; ((O Rphimm, G Wp, G Wp), Scalar_Vector_Vector 1, G_PWW) ] let rphi3h = [ ((O Rphisn, O H, O H), Dim5_Scalar_Scalar2 1, G_PSNHH) ] (* Tensor IsoScalar *) let rf3 = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_FWW); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_FZZ) ] let rf3cf = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_FWW); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector 1, G_FZZ); ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_FWW_CF); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_FZZ_CF) ] let rff3cf = [ ((O Rff, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_FFWW); ((O Rff, G Z, G Z), Tensor_2_Vector_Vector 1, G_FFZZ); ((O Rff, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_FFWW_CF); ((O Rff, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_FFZZ_CF) ] let rfv3cf = [ ((O Rfv, G Wp, G Wm), TensorVector_Vector_Vector 1, G_FVWW); ((O Rfv, G Z, G Z), TensorVector_Vector_Vector 1, G_FVZZ); ((O Rfv, G Wp, G Wm), TensorVector_Vector_Vector_cf 1, G_FVWW_CF); ((O Rfv, G Z, G Z), TensorVector_Vector_Vector_cf 1, G_FVZZ_CF) ] let rfddphi3cf = [ ((O Rfphi, G Wp, G Wm), TensorScalar_Vector_Vector 1, G_FDDSWW); ((O Rfphi, G Z, G Z), TensorScalar_Vector_Vector 1, G_FDDSZZ); ((O Rfphi, G Wp, G Wm), TensorScalar_Vector_Vector_cf 1, G_FDDSWW_CF); ((O Rfphi, G Z, G Z), TensorScalar_Vector_Vector_cf 1, G_FDDSZZ_CF) ] let rfphi3cf = [ ((O Rfphi, G Wp, G Wm), Scalar_Vector_Vector 1, G_FSWW); ((O Rfphi, G Z, G Z), Scalar_Vector_Vector 1, G_FSZZ) ] let rf3h = [ ((O Rf, O H, O H), Tensor_2_Scalar_Scalar 1, G_FHH); ((O Rf, O H, O H), Tensor_2_Scalar_Scalar_cf 1, G_FHH_CF) ] let rff3h = [ ((O Rff, O H, O H), Tensor_2_Scalar_Scalar 1, G_FFHH); ((O Rff, O H, O H), Tensor_2_Scalar_Scalar_cf 1, G_FFHH_CF); ((O Rfv, O H, O H), TensorVector_Scalar_Scalar 1, G_FVHH); ((O Rfv, O H, O H), TensorVector_Scalar_Scalar_cf 1, G_FVHH_CF); ((O Rfphi, O H, O H), TensorScalar_Scalar_Scalar 1, G_FDDSHH); ((O Rfphi, O H, O H), TensorScalar_Scalar_Scalar_cf 1, G_FDDSHH_CF); ((O Rfphi, O H, O H), Dim5_Scalar_Scalar2 1, G_FSHH) ] let rf3t = [ ((O Rf, G Wp, G Wm), Tensor_2_Vector_Vector_t 1, G_FWW_T); ((O Rf, G Z, G Z), Tensor_2_Vector_Vector_t 1, G_FZZ_T) ] (* Tensor Isotensor \begin{subequations} \begin{align} \mathcal{L}_{t} \end{align} \end{subequations} *) let rt3 = [ ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_TNWW); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_TNZZ) ; ((O Rtsn, G Wp, G Wm), Tensor_2_Vector_Vector_1 1, G_TSNWW); ((O Rtsn, G Z, G Z), Tensor_2_Vector_Vector_1 1, G_TSNZZ) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector_1 1, G_TWZ) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector_1 1, G_TWW) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector_1 1, G_TWZ) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector_1 1, G_TWW) ] let rt3cf = [ ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_TNWW); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector 1, G_TNZZ) ; ((O Rtsn, G Wp, G Wm), Tensor_2_Vector_Vector 1, G_TSNWW); ((O Rtsn, G Z, G Z), Tensor_2_Vector_Vector 1, G_TSNZZ) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector 1, G_TWZ) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector 1, G_TWW) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector 1, G_TWZ) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector 1, G_TWW); ((O Rtn, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_TNWW_CF); ((O Rtn, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_TNZZ_CF) ; ((O Rtsn, G Wp, G Wm), Tensor_2_Vector_Vector_cf 1, G_TSNWW_CF); ((O Rtsn, G Z, G Z), Tensor_2_Vector_Vector_cf 1, G_TSNZZ_CF) ; ((O Rtp, G Z, G Wm), Tensor_2_Vector_Vector_cf 1, G_TWZ_CF) ; ((O Rtpp, G Wm, G Wm), Tensor_2_Vector_Vector_cf 1, G_TWW_CF) ; ((O Rtm, G Wp, G Z), Tensor_2_Vector_Vector_cf 1, G_TWZ_CF) ; ((O Rtmm, G Wp, G Wp), Tensor_2_Vector_Vector_cf 1, G_TWW_CF) ] (* Anomalous trilinear interactions $f_i f_j V$ and $ttH$: \begin{equation} \Delta\mathcal{L}_{tt\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{t} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) t A_\mu \end{equation} *) let anomalous_ttA = if Flags.top_anom then [ ((M (U (-3)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bb\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{b} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) b A_\mu \end{equation} *) let anomalous_bbA = if Flags.top_anom then [ ((M (D (-3)), G Ga, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttg} = - g_s \frac{\upsilon}{\Lambda^2} \bar{t}\lambda^a i\sigma^{\mu\nu}k_\nu (d_V(k^2)+id_A(k^2)\gamma_5)tG^a_\mu \end{equation} *) let anomalous_ttG = if Flags.top_anom then [ ((M (U (-3)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttG) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{t} \fmslash{Z} (X_L(k^2) P_L + X_R(k^2) P_R) t + \bar{t}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)tZ_\mu\right\rbrack \end{equation} *) let anomalous_ttZ = if Flags.top_anom then [ ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_ttZ); ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2} \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)bZ_\mu \end{equation} *) let anomalous_bbZ = if Flags.top_anom then [ ((M (D (-3)), G Z, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbW} = - \frac{g}{\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\fmslash{W}^-(V_L(k^2) P_L+V_R(k^2) P_R) t + \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)tW^-_\mu\right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbW = if Flags.top_anom then [ ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tbW); ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, TLRM, Psi), G_TLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, TRLM, Psi), G_TRL_tbW) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttH} = - \frac{1}{\sqrt{2}} \bar{t} (Y_V(k^2)+iY_A(k^2)\gamma_5)t H \end{equation} *) let anomalous_ttH = if Flags.top_anom then [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, SPM, Psi), G_SP_ttH) ] else [] (* quartic fermion-gauge interactions $f_i f_j V_1 V_2$ emerging from gauge-invariant effective operators: \begin{equation} \Delta\mathcal{L}_{ttgg} = - \frac{g_s^2}{2} f_{abc} \frac{\upsilon}{\Lambda^2} \bar{t} \lambda^a \sigma^{\mu\nu} (d_V(k^2)+id_A(k^2)\gamma_5)t G^b_\mu G^c_\nu \end{equation} *) let anomalous_ttGG = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,1,0,true,TTGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttGG); ((O (Aux_top (2,1,0,false,TTGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWA} = - i\sin\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t A_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWA = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWA)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWA); ((O (Aux_top (2,0,1,false,TBWA)), G Ga, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWA)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWA); ((O (Aux_top (2,0,-1,false,TBWA)), G Wp, G Ga), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWZ} = - i\cos\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t Z_\mu W^-_\nu \right\rbrack + \textnormal{H.c.} \end{equation} *) let anomalous_tbWZ = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWZ)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWZ); ((O (Aux_top (2,0,1,false,TBWZ)), G Z, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWZ)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWZ); ((O (Aux_top (2,0,-1,false,TBWZ)), G Wp, G Z), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{t} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)t W^-_\mu W^+_\nu \end{equation} *) let anomalous_ttWW = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,0,0,true,TTWW)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttWW); ((O (Aux_top (2,0,0,false,TTWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{b} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)b W^-_\mu W^+_\nu \end{equation} *) let anomalous_bbWW = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,0,true,BBWW)), M (D 3)), FBF (1, Psibar, TVA, Psi), G_TVA_bbWW); ((O (Aux_top (2,0,0,false,BBWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* 4-fermion contact terms emerging from operator rewriting: *) let anomalous_top_qGuG_tt = [ ((M (U (-3)), O (Aux_top (1,1,0,true,QGUG)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qGuG) ] let anomalous_top_qGuG_ff n = List.map mom [ ((U (-n), Aux_top (1,1,0,false,QGUG), U n), FBF (1, Psibar, V, Psi), Unit); ((D (-n), Aux_top (1,1,0,false,QGUG), D n), FBF (1, Psibar, V, Psi), Unit) ] let anomalous_top_qGuG = if Flags.top_anom_4f then anomalous_top_qGuG_tt @ ThoList.flatmap anomalous_top_qGuG_ff [1;2;3] else [] let anomalous_top_qBuB_tt = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QBUB)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB) ] let anomalous_top_qBuB_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QBUB), U n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_u); ((D (-n), Aux_top (1,0,0,false,QBUB), D n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_d); ((L (-n), Aux_top (1,0,0,false,QBUB), L n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_e); ((N (-n), Aux_top (1,0,0,false,QBUB), N n), FBF (1, Psibar, VL, Psi), G_VL_qBuB_n) ] let anomalous_top_qBuB = if Flags.top_anom_4f then anomalous_top_qBuB_tt @ ThoList.flatmap anomalous_top_qBuB_ff [1;2;3] else [] let anomalous_top_qW_tq = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (D (-3)), O (Aux_top (1,0,-1,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (U (-3)), O (Aux_top (1,0,1,true,QW)), M (D 3)), FBF (1, Psibar, VL, Psi), G_VL_qW) ] let anomalous_top_qW_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QW), U n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((D (-n), Aux_top (1,0,0,false,QW), D n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((N (-n), Aux_top (1,0,0,false,QW), N n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((L (-n), Aux_top (1,0,0,false,QW), L n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((D (-n), Aux_top (1,0,-1,false,QW), U n), FBF (1, Psibar, VL, Psi), Half); ((U (-n), Aux_top (1,0,1,false,QW), D n), FBF (1, Psibar, VL, Psi), Half); ((L (-n), Aux_top (1,0,-1,false,QW), N n), FBF (1, Psibar, VL, Psi), Half); ((N (-n), Aux_top (1,0,1,false,QW), L n), FBF (1, Psibar, VL, Psi), Half) ] let anomalous_top_qW = if Flags.top_anom_4f then anomalous_top_qW_tq @ ThoList.flatmap anomalous_top_qW_ff [1;2;3] else [] let anomalous_top_DuDd = if Flags.top_anom_4f then [ ((M (U (-3)), O (Aux_top (0,0,0,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,0,false,DR)), M (U 3)), FBF (1, Psibar, SL, Psi), G_SL_DttR); ((M (D (-3)), O (Aux_top (0,0,0,false,DR)), M (D 3)), FBF (1, Psibar, SR, Psi), G_SR_DttR); ((M (U (-3)), O (Aux_top (0,0,0,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (D (-3)), O (Aux_top (0,0,0,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DttL); ((M (D (-3)), O (Aux_top (0,0,-1,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DR)), M (D 3)), FBF (1, Psibar, SLR, Psi), G_SLR_DbtR); ((M (D (-3)), O (Aux_top (0,0,-1,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DbtL) ] else [] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ (if Flags.ckm_present then charged_currents_ckm else charged_currents_triv) @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ higgs_triangle_vertices @ goldstone_vertices @ rsigma3 @ rsigma3t @ rphi3 @ ( if Flags.cf_arbitrary then ( rt3cf @ rff3cf @ rfv3cf @ rfphi3cf @ rfddphi3cf ) else (rf3 @ rt3 ) ) @ rf3t @ ( if Flags.higgs_matrix then (rsigma3h @ rff3h ) else [] ) @ anomalous_ttA @ anomalous_bbA @ anomalous_ttZ @ anomalous_bbZ @ anomalous_tbW @ anomalous_tbWA @ anomalous_tbWZ @ anomalous_ttWW @ anomalous_bbWW @ anomalous_ttG @ anomalous_ttGG @ anomalous_ttH @ anomalous_top_qGuG @ anomalous_top_qBuB @ anomalous_top_qW @ anomalous_top_DuDd) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "Rsigma" -> O Rsigma | "Rphi0" -> O Rphin | "Rphis0" -> O Rphisn | "Rphi+" -> O Rphip | "Rphi-" -> O Rphim | "Rphi++" -> O Rphip | "Rphi--" -> O Rphimm | "Rf" -> O Rf | "Rff" -> O Rff | "Rfv" -> O Rfv | "Rfphi" -> O Rfphi | "Rt0" -> O Rtn | "Rts0" -> O Rtsn | "Rt+" -> O Rtp | "Rt-" -> O Rtm | "Rt++" -> O Rtp | "Rt--" -> O Rtmm | "Aux_t_ttGG0" -> O (Aux_top (2,1, 0,true,TTGG)) | "Aux_ttGG0" -> O (Aux_top (2,1, 0,false,TTGG)) | "Aux_t_tbWA+" -> O (Aux_top (2,0, 1,true,TBWA)) | "Aux_tbWA+" -> O (Aux_top (2,0, 1,false,TBWA)) | "Aux_t_tbWA-" -> O (Aux_top (2,0,-1,true,TBWA)) | "Aux_tbWA-" -> O (Aux_top (2,0,-1,false,TBWA)) | "Aux_t_tbWZ+" -> O (Aux_top (2,0, 1,true,TBWZ)) | "Aux_tbWZ+" -> O (Aux_top (2,0, 1,false,TBWZ)) | "Aux_t_tbWZ-" -> O (Aux_top (2,0,-1,true,TBWZ)) | "Aux_tbWZ-" -> O (Aux_top (2,0,-1,false,TBWZ)) | "Aux_t_ttWW0" -> O (Aux_top (2,0, 0,true,TTWW)) | "Aux_ttWW0" -> O (Aux_top (2,0, 0,false,TTWW)) | "Aux_t_bbWW0" -> O (Aux_top (2,0, 0,true,BBWW)) | "Aux_bbWW0" -> O (Aux_top (2,0, 0,false,BBWW)) | "Aux_t_qGuG0" -> O (Aux_top (1,1, 0,true,QGUG)) | "Aux_qGuG0" -> O (Aux_top (1,1, 0,false,QGUG)) | "Aux_t_qBuB0" -> O (Aux_top (1,0, 0,true,QBUB)) | "Aux_qBuB0" -> O (Aux_top (1,0, 0,false,QBUB)) | "Aux_t_qW0" -> O (Aux_top (1,0, 0,true,QW)) | "Aux_qW0" -> O (Aux_top (1,0, 0,false,QW)) | "Aux_t_qW+" -> O (Aux_top (1,0, 1,true,QW)) | "Aux_qW+" -> O (Aux_top (1,0, 1,false,QW)) | "Aux_t_qW-" -> O (Aux_top (1,0,-1,true,QW)) | "Aux_qW-" -> O (Aux_top (1,0,-1,false,QW)) | "Aux_t_dL0" -> O (Aux_top (0,0, 0,true,DL)) | "Aux_dL0" -> O (Aux_top (0,0, 0,false,DL)) | "Aux_t_dL+" -> O (Aux_top (0,0, 1,true,DL)) | "Aux_dL+" -> O (Aux_top (0,0, 1,false,DL)) | "Aux_t_dL-" -> O (Aux_top (0,0,-1,true,DL)) | "Aux_dL-" -> O (Aux_top (0,0,-1,false,DL)) | "Aux_t_dR0" -> O (Aux_top (0,0, 0,true,DR)) | "Aux_dR0" -> O (Aux_top (0,0, 0,false,DR)) | "Aux_t_dR+" -> O (Aux_top (0,0, 1,true,DR)) | "Aux_dR+" -> O (Aux_top (0,0, 1,false,DR)) | "Aux_t_dR-" -> O (Aux_top (0,0,-1,true,DR)) | "Aux_dR-" -> O (Aux_top (0,0,-1,false,DR)) | _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "gl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Rsigma -> "Rsigma" | Rphin -> "Rphin" | Rphip -> "Rphi+" | Rphim -> "Rphi-" | Rphipp -> "Rphi++" | Rphimm -> "Rphi--" | Rphisn -> "Rphisn" | Rf -> "Rf" | Rff -> "Rff" | Rfv -> "Rfv" | Rfphi -> "Rfphi" | Rtn -> "Rtn" | Rtsn -> "Rtsn" | Rtp -> "Rt+" | Rtm -> "Rt-" | Rtpp -> "Rt++" | Rtmm -> "Rt--" | Aux_top (_,_,ch,n,v) -> "Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" end ) ^ ( if ch > 0 then "+" else if ch < 0 then "-" else "0" ) end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib_BSM.SSC_AltT.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | Rsigma -> "\\sigma" | Rphip -> "\\phi^+" | Rphim -> "\\phi^-" | Rphin -> "\\phi^0" | Rphisn -> "\\phi_s^0" | Rphipp -> "\\phi^{++}" | Rphimm -> "\\phi^{--}" | Rf -> "f" | Rff -> "f^f" | Rfv -> "f^v" | Rfphi -> "f^s" | Rtp -> "t^+" | Rtm -> "t^-" | Rtn -> "t^0" | Rtsn -> "t_s^0" | Rtpp -> "t^{++}" | Rtmm -> "t^{--}" | Aux_top (_,_,ch,n,v) -> "\\textnormal{Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" end ) ^ ( if ch > 0 then "^+" else if ch < 0 then "^-" else "^0" ) ^ "}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Rsigma -> "rsi" | Rphip -> "rpp" | Rphim -> "rpm" | Rphin -> "rpn" | Rphisn -> "rpsn" | Rphipp -> "rppp" | Rphimm -> "rpmm" | Rf -> "rf" | Rff -> "rff" | Rfv -> "rfv" | Rfphi -> "rfphi" | Rtp -> "rtp" | Rtm -> "rtm" | Rtn -> "rtn" | Rtsn -> "rtsn" | Rtpp -> "rtpp" | Rtmm -> "rtmm" | Aux_top (_,_,ch,n,v) -> "aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttgg" | TBWA -> "tbwa" | TBWZ -> "tbwz" | TTWW -> "ttww" | BBWW -> "bbww" | QGUG -> "qgug" | QBUB -> "qbub" | QW -> "qw" | DL -> "dl" | DR -> "dr" end ) ^ "_" ^ ( if ch > 0 then "p" else if ch < 0 then "m" else "0" ) end (* Introducing new Resonances from 45, there are no PDG values *) let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Rsigma -> 45 | Rphin -> 46 | Rphip | Rphim -> 47 | Rphipp | Rphimm -> 48 | Rphisn -> 49 | Rf -> 52 | Rtn -> 53 | Rtp | Rtm -> 54 | Rtpp | Rtmm -> 55 | Rff -> 56 | Rfv -> 57 | Rfphi -> 58 | Rtsn -> 59 | Aux_top (_,_,_,_,_) -> 81 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Half -> "half" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | I_G_weak -> "ig" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_TVA_ttA -> "gtva_tta" | G_TVA_bbA -> "gtva_bba" | G_VLR_ttZ -> "gvlr_ttz" | G_TVA_ttZ -> "gtva_ttz" | G_TVA_bbZ -> "gtva_bbz" | G_VLR_btW -> "gvlr_btw" | G_VLR_tbW -> "gvlr_tbw" | G_TLR_btW -> "gtlr_btw" | G_TRL_tbW -> "gtrl_tbw" | G_TLR_btWA -> "gtlr_btwa" | G_TRL_tbWA -> "gtrl_tbwa" | G_TLR_btWZ -> "gtlr_btwz" | G_TRL_tbWZ -> "gtrl_tbwz" | G_TVA_ttWW -> "gtva_ttww" | G_TVA_bbWW -> "gtva_bbww" | G_TVA_ttG -> "gtva_ttg" | G_TVA_ttGG -> "gtva_ttgg" | G_SP_ttH -> "gsp_tth" | G_VLR_qGuG -> "gvlr_qgug" | G_VLR_qBuB -> "gvlr_qbub" | G_VLR_qBuB_u -> "gvlr_qbub_u" | G_VLR_qBuB_d -> "gvlr_qbub_d" | G_VLR_qBuB_e -> "gvlr_qbub_e" | G_VL_qBuB_n -> "gvl_qbub_n" | G_VL_qW -> "gvl_qw" | G_VL_qW_u -> "gvl_qw_u" | G_VL_qW_d -> "gvl_qw_d" | G_SL_DttR -> "gsl_dttr" | G_SR_DttR -> "gsr_dttr" | G_SL_DttL -> "gsl_dttl" | G_SLR_DbtR -> "gslr_dbtr" | G_SL_DbtL -> "gsl_dbtl" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | I_G1_AWW -> "ig1a" | I_G1_ZWW -> "ig1z" | I_G1_plus_kappa_plus_G4_AWW -> "ig1pkpg4a" | I_G1_plus_kappa_plus_G4_ZWW -> "ig1pkpg4z" | I_G1_plus_kappa_minus_G4_AWW -> "ig1pkmg4a" | I_G1_plus_kappa_minus_G4_ZWW -> "ig1pkmg4z" | I_G1_minus_kappa_plus_G4_AWW -> "ig1mkpg4a" | I_G1_minus_kappa_plus_G4_ZWW -> "ig1mkpg4z" | I_G1_minus_kappa_minus_G4_AWW -> "ig1mkmg4a" | I_G1_minus_kappa_minus_G4_ZWW -> "ig1mkmg4z" | I_lambda_AWW -> "ila" | I_lambda_ZWW -> "ilz" | G5_AWW -> "rg5a" | G5_ZWW -> "rg5z" | I_kappa5_AWW -> "ik5a" | I_kappa5_ZWW -> "ik5z" | I_lambda5_AWW -> "il5a" | I_lambda5_ZWW -> "il5z" | Alpha_WWWW0 -> "alww0" | Alpha_WWWW2 -> "alww2" | Alpha_ZZWW0 -> "alzw0" | Alpha_ZZWW1 -> "alzw1" | Alpha_ZZZZ -> "alzz" | FT0_WWWW0 -> "at0ww0" | FT0_WWWW2 -> "at0ww2" | FT0_ZZWW0 -> "at0zw0" | FT0_ZZWW1 -> "at0zw1" | FT0_ZZZZ -> "at0zz" | FT0_AAAA -> "at0aa" | FT0_AAWW0 -> "at0aw0" | FT0_AAWW1 -> "at0aw1" | FT0_AAZZ -> "at0az" | FT0_AZWW0 -> "at0azw0" | FT0_AZWW1 -> "at0azw1" | FT0_AAAZ -> "at03az" | FT0_AZZZ -> "at0a3z" | FT1_WWWW0 -> "at1ww0" | FT1_WWWW2 -> "at1ww2" | FT1_ZZWW0 -> "at1zw0" | FT1_ZZWW1 -> "at1zw1" | FT1_ZZZZ -> "at1zz" | FT1_AAAA -> "at1aa" | FT1_AAWW0 -> "at1aw0" | FT1_AAWW1 -> "at1aw1" | FT1_AAZZ -> "at1az" | FT1_AZWW0 -> "at1azw0" | FT1_AZWW1 -> "at1azw1" | FT1_AAAZ -> "at13az" | FT1_AZZZ -> "at1a3z" | FT2_WWWW0 -> "at2ww0" | FT2_WWWW2 -> "at2ww2" | FT2_ZZWW0 -> "at2zw0" | FT2_ZZWW1 -> "at2zw1" | FT2_ZZZZ -> "at2zz" | FT2_AAAA -> "at2aa" | FT2_AAWW0 -> "at2aw0" | FT2_AAWW1 -> "at2aw1" | FT2_AAZZ -> "at2az" | FT2_AZWW0 -> "at2azw0" | FT2_AZWW1 -> "at2azw1" | FT2_AAAZ -> "at23az" | FT2_AZZZ -> "at2a3z" | FM0_WWWW0 -> "am0ww0,am0ww0" | FM0_WWWW2 -> "am0ww2,am0ww2" | FM0_ZZWW0 -> "am0zw0/costhw**2,am0zw0*costhw**2" | FM0_ZZWW1 -> "am0zw1/costhw**2,am0zw1*costhw**2" | FM0_ZZZZ -> "am0zz,am0zz" | FM1_WWWW0 -> "am1ww0,am1ww0" | FM1_WWWW2 -> "am1ww2,am1ww2" | FM1_ZZWW0 -> "am1zw0/costhw**2,am1zw0*costhw**2" | FM1_ZZWW1 -> "am1zw1/costhw**2,am1zw1*costhw**2" | FM1_ZZZZ -> "am1zz,am1zz" | FM7_WWWW0 -> "am7ww0,am7ww0,am7ww0" | FM7_WWWW2 -> "am7ww2,am7ww2,am7ww2" | FM7_ZZWW0 -> "am7zw0/costhw**2,am7zw0,am7zw0*costhw**2" | FM7_ZZWW1 -> "am7zw1/costhw**2,am7zw1,am7zw1*costhw**2" | FM7_ZZZZ -> "am7zz,am7zz,am7zz" | FS0_HHWW -> "fs0hhww" | FS0_HHZZ -> "fs0hhzz" | FS1_HHWW -> "fs1hhww" | FS1_HHZZ -> "fs1hhzz" | FS_H4 -> "fsh4" | FM0_HHWW -> "fm0hhww" | FM0_HHZZ -> "fm0hhzz" | FM1_HHWW -> "fm1hhww" | FM1_HHZZ -> "fm1hhzz" | FM7_HHWW -> "fm7hhww" | FM7_HHZZ -> "fm7hhzz" | D_Alpha_ZZWW0_S -> "dalzz0_s(gkm,mkm," | D_Alpha_ZZWW0_T -> "dalzz0_t(gkm,mkm," | D_Alpha_ZZWW1_S -> "dalzz1_s(gkm,mkm," | D_Alpha_ZZWW1_T -> "dalzz1_t(gkm,mkm," | D_Alpha_ZZWW1_U -> "dalzz1_u(gkm,mkm," | D_Alpha_WWWW0_S -> "dalww0_s(gkm,mkm," | D_Alpha_WWWW0_T -> "dalww0_t(gkm,mkm," | D_Alpha_WWWW0_U -> "dalww0_u(gkm,mkm," | D_Alpha_WWWW2_S -> "dalww2_s(gkm,mkm," | D_Alpha_WWWW2_T -> "dalww2_t(gkm,mkm," | D_Alpha_ZZZZ_S -> "dalz4_s(gkm,mkm," | D_Alpha_ZZZZ_T -> "dalz4_t(gkm,mkm," | D_FT0_ZZWW0_S -> "datzz0_s_0(gkm,mkm," | D_FT0_ZZWW0_T -> "datzz0_t_0(gkm,mkm," | D_FT0_ZZWW0_U -> "datzz0_u_0(gkm,mkm," | D_FT0_ZZWW1_S -> "datzz1_s_0(gkm,mkm," | D_FT0_ZZWW1_T -> "datzz1_t_0(gkm,mkm," | D_FT0_ZZWW1_U -> "datzz1_u_0(gkm,mkm," | D_FT0_WWWW0_S -> "datww0_s_0(gkm,mkm," | D_FT0_WWWW0_T -> "datww0_t_0(gkm,mkm," | D_FT0_WWWW0_U -> "datww0_u_0(gkm,mkm," | D_FT0_WWWW2_S -> "datww2_s_0(gkm,mkm," | D_FT0_WWWW2_T -> "datww2_t_0(gkm,mkm," | D_FT0_WWWW2_U -> "datww2_u_0(gkm,mkm," | D_FT0_ZZZZ_S -> "datz4_s_0(gkm,mkm," | D_FT0_ZZZZ_T -> "datz4_t_0(gkm,mkm," | D_FT0_ZZZZ_U -> "datz4_u_0(gkm,mkm," | D_FT0_AAAA_S -> "data4_s_0(gkm,mkm," | D_FT0_AAAA_T -> "data4_t_0(gkm,mkm," | D_FT0_AAAA_U -> "data4_u_0(gkm,mkm," | D_FT0_AAWW0_S -> "dataw0_s_0(gkm,mkm," | D_FT0_AAWW0_T -> "dataw0_t_0(gkm,mkm," | D_FT0_AAWW0_U -> "dataw0_u_0(gkm,mkm," | D_FT0_AAWW1_S -> "dataw1_s_0(gkm,mkm," | D_FT0_AAWW1_T -> "dataw1_t_0(gkm,mkm," | D_FT0_AAWW1_U -> "dataw1_u_0(gkm,mkm," | D_FT0_AAZZ_S -> "dataz_s_0(gkm,mkm," | D_FT0_AAZZ_T -> "dataz_t_0(gkm,mkm," | D_FT0_AAZZ_U -> "dataz_u_0(gkm,mkm," | D_FT0_AZWW0_S -> "datazw0_s_0(gkm,mkm," | D_FT0_AZWW0_T -> "datazw0_t_0(gkm,mkm," | D_FT0_AZWW0_U -> "datazw0_u_0(gkm,mkm," | D_FT0_AZWW1_S -> "datazw0_s_1(gkm,mkm," | D_FT0_AZWW1_T -> "datazw0_t_1(gkm,mkm," | D_FT0_AZWW1_U -> "datazw0_u_1(gkm,mkm," | D_FT0_AAAZ_S -> "dat3az_s_0(gkm,mkm," | D_FT0_AAAZ_T -> "dat3az_t_0(gkm,mkm," | D_FT0_AAAZ_U -> "dat3az_u_0(gkm,mkm," | D_FT0_AZZZ_S -> "data3z_s_0(gkm,mkm," | D_FT0_AZZZ_T -> "data3z_t_0(gkm,mkm," | D_FT0_AZZZ_U -> "data3z_u_0(gkm,mkm," | D_FT1_ZZWW0_S -> "datzz0_s_1(gkm,mkm," | D_FT1_ZZWW0_T -> "datzz0_t_1(gkm,mkm," | D_FT1_ZZWW0_U -> "datzz0_u_1(gkm,mkm," | D_FT1_ZZWW1_S -> "datzz1_s_1(gkm,mkm," | D_FT1_ZZWW1_T -> "datzz1_t_1(gkm,mkm," | D_FT1_ZZWW1_U -> "datzz1_u_1(gkm,mkm," | D_FT1_WWWW0_S -> "datww0_s_1(gkm,mkm," | D_FT1_WWWW0_T -> "datww0_t_1(gkm,mkm," | D_FT1_WWWW0_U -> "datww0_u_1(gkm,mkm," | D_FT1_WWWW2_S -> "datww2_s_1(gkm,mkm," | D_FT1_WWWW2_T -> "datww2_t_1(gkm,mkm," | D_FT1_WWWW2_U -> "datww2_u_1(gkm,mkm," | D_FT1_ZZZZ_S -> "datz4_s_1(gkm,mkm," | D_FT1_ZZZZ_T -> "datz4_t_1(gkm,mkm," | D_FT1_ZZZZ_U -> "datz4_u_1(gkm,mkm," | D_FT1_AAAA_S -> "data4_s_1(gkm,mkm," | D_FT1_AAAA_T -> "data4_t_1(gkm,mkm," | D_FT1_AAAA_U -> "data4_u_1(gkm,mkm," | D_FT1_AAWW0_S -> "dataw0_s_1(gkm,mkm," | D_FT1_AAWW0_T -> "dataw0_t_1(gkm,mkm," | D_FT1_AAWW0_U -> "dataw0_u_1(gkm,mkm," | D_FT1_AAWW1_S -> "dataw1_s_1(gkm,mkm," | D_FT1_AAWW1_T -> "dataw1_t_1(gkm,mkm," | D_FT1_AAWW1_U -> "dataw1_u_1(gkm,mkm," | D_FT1_AAZZ_S -> "dataz_s_1(gkm,mkm," | D_FT1_AAZZ_T -> "dataz_t_1(gkm,mkm," | D_FT1_AAZZ_U -> "dataz_u_1(gkm,mkm," | D_FT1_AZWW0_S -> "datazw0_s_1(gkm,mkm," | D_FT1_AZWW0_T -> "datazw0_t_1(gkm,mkm," | D_FT1_AZWW0_U -> "datazw0_u_1(gkm,mkm," | D_FT1_AZWW1_S -> "datazw1_s_1(gkm,mkm," | D_FT1_AZWW1_T -> "datazw1_t_1(gkm,mkm," | D_FT1_AZWW1_U -> "datazw1_u_1(gkm,mkm," | D_FT1_AAAZ_S -> "dat3az_s_1(gkm,mkm," | D_FT1_AAAZ_T -> "dat3az_t_1(gkm,mkm," | D_FT1_AAAZ_U -> "dat3az_u_1(gkm,mkm," | D_FT1_AZZZ_S -> "data3z_s_1(gkm,mkm," | D_FT1_AZZZ_T -> "data3z_t_1(gkm,mkm," | D_FT1_AZZZ_U -> "data3z_u_1(gkm,mkm," | D_FT2_ZZWW0_S -> "datzz0_s_2(gkm,mkm," | D_FT2_ZZWW0_T -> "datzz0_t_2(gkm,mkm," | D_FT2_ZZWW0_U -> "datzz0_u_2(gkm,mkm," | D_FT2_ZZWW1_S -> "datzz1_s_2(gkm,mkm," | D_FT2_ZZWW1_T -> "datzz1_t_2(gkm,mkm," | D_FT2_ZZWW1_U -> "datzz1_u_2(gkm,mkm," | D_FT2_WWWW0_S -> "datww0_s_2(gkm,mkm," | D_FT2_WWWW0_T -> "datww0_t_2(gkm,mkm," | D_FT2_WWWW0_U -> "datww0_u_2(gkm,mkm," | D_FT2_WWWW2_S -> "datww2_s_2(gkm,mkm," | D_FT2_WWWW2_T -> "datww2_t_2(gkm,mkm," | D_FT2_WWWW2_U -> "datww2_u_2(gkm,mkm," | D_FT2_ZZZZ_S -> "datz4_s_2(gkm,mkm," | D_FT2_ZZZZ_T -> "datz4_t_2(gkm,mkm," | D_FT2_ZZZZ_U -> "datz4_u_2(gkm,mkm," | D_FT2_AAAA_S -> "data4_s_2(gkm,mkm," | D_FT2_AAAA_T -> "data4_t_2(gkm,mkm," | D_FT2_AAAA_U -> "data4_u_2(gkm,mkm," | D_FT2_AAWW0_S -> "dataw0_s_2(gkm,mkm," | D_FT2_AAWW0_T -> "dataw0_t_2(gkm,mkm," | D_FT2_AAWW0_U -> "dataw0_u_2(gkm,mkm," | D_FT2_AAWW1_S -> "dataw1_s_2(gkm,mkm," | D_FT2_AAWW1_T -> "dataw1_t_2(gkm,mkm," | D_FT2_AAWW1_U -> "dataw1_u_2(gkm,mkm," | D_FT2_AAZZ_S -> "dataz_s_2(gkm,mkm," | D_FT2_AAZZ_T -> "dataz_t_2(gkm,mkm," | D_FT2_AAZZ_U -> "dataz_u_2(gkm,mkm," | D_FT2_AZWW0_S -> "datazw0_s_2(gkm,mkm," | D_FT2_AZWW0_T -> "datazw0_t_2(gkm,mkm," | D_FT2_AZWW0_U -> "datazw0_u_2(gkm,mkm," | D_FT2_AZWW1_S -> "datazw1_s_2(gkm,mkm," | D_FT2_AZWW1_T -> "datazw1_t_2(gkm,mkm," | D_FT2_AZWW1_U -> "datazw1_u_2(gkm,mkm," | D_FT2_AAAZ_S -> "dat3az_s_2(gkm,mkm," | D_FT2_AAAZ_T -> "dat3az_t_2(gkm,mkm," | D_FT2_AAAZ_U -> "dat3az_u_2(gkm,mkm," | D_FT2_AZZZ_S -> "data3z_s_2(gkm,mkm," | D_FT2_AZZZ_T -> "data3z_t_2(gkm,mkm," | D_FT2_AZZZ_U -> "data3z_u_2(gkm,mkm," | D_FTrsi_ZZWW0_S -> "datzz0_s_rsi(gkm,mkm," | D_FTrsi_ZZWW0_T -> "datzz0_t_rsi(gkm,mkm," | D_FTrsi_ZZWW0_U -> "datzz0_u_rsi(gkm,mkm," | D_FTrsi_ZZWW1_S -> "datzz1_s_rsi(gkm,mkm," | D_FTrsi_ZZWW1_T -> "datzz1_t_rsi(gkm,mkm," | D_FTrsi_ZZWW1_U -> "datzz1_u_rsi(gkm,mkm," | D_FTrsi_WWWW0_S -> "datww0_s_rsi(gkm,mkm," | D_FTrsi_WWWW0_T -> "datww0_t_rsi(gkm,mkm," | D_FTrsi_WWWW0_U -> "datww0_u_rsi(gkm,mkm," | D_FTrsi_WWWW2_S -> "datww2_s_rsi(gkm,mkm," | D_FTrsi_WWWW2_T -> "datww2_t_rsi(gkm,mkm," | D_FTrsi_WWWW2_U -> "datww2_u_rsi(gkm,mkm," | D_FTrsi_ZZZZ_S -> "datz4_s_rsi(gkm,mkm," | D_FTrsi_ZZZZ_T -> "datz4_t_rsi(gkm,mkm," | D_FTrsi_ZZZZ_U -> "datz4_u_rsi(gkm,mkm," | D_FTrsi_AAAA_S -> "data4_s_rsi(gkm,mkm," | D_FTrsi_AAAA_T -> "data4_t_rsi(gkm,mkm," | D_FTrsi_AAAA_U -> "data4_u_rsi(gkm,mkm," | D_FTrsi_AAWW0_S -> "dataw0_s_rsi(gkm,mkm," | D_FTrsi_AAWW0_T -> "dataw0_t_rsi(gkm,mkm," | D_FTrsi_AAWW0_U -> "dataw0_u_rsi(gkm,mkm," | D_FTrsi_AAWW1_S -> "dataw1_s_rsi(gkm,mkm," | D_FTrsi_AAWW1_T -> "dataw1_t_rsi(gkm,mkm," | D_FTrsi_AAWW1_U -> "dataw1_u_rsi(gkm,mkm," | D_FTrsi_AAZZ_S -> "dataz_s_rsi(gkm,mkm," | D_FTrsi_AAZZ_T -> "dataz_t_rsi(gkm,mkm," | D_FTrsi_AAZZ_U -> "dataz_u_rsi(gkm,mkm," | D_FTrsi_AZWW0_S -> "datazw0_s_rsi(gkm,mkm," | D_FTrsi_AZWW0_T -> "datazw0_t_rsi(gkm,mkm," | D_FTrsi_AZWW0_U -> "datazw0_u_rsi(gkm,mkm," | D_FTrsi_AZWW1_S -> "datazw1_s_rsi(gkm,mkm," | D_FTrsi_AZWW1_T -> "datazw1_t_rsi(gkm,mkm," | D_FTrsi_AZWW1_U -> "datazw1_u_rsi(gkm,mkm," | D_FTrsi_AAAZ_S -> "dat3az_s_rsi(gkm,mkm," | D_FTrsi_AAAZ_T -> "dat3az_t_rsi(gkm,mkm," | D_FTrsi_AAAZ_U -> "dat3az_u_rsi(gkm,mkm," | D_FTrsi_AZZZ_S -> "data3z_s_rsi(gkm,mkm," | D_FTrsi_AZZZ_T -> "data3z_t_rsi(gkm,mkm," | D_FTrsi_AZZZ_U -> "data3z_u_rsi(gkm,mkm," | D_FM0_ZZWW0_S -> "damzz0_s_0(gkm,mkm," | D_FM0_ZZWW0_T -> "damzz0_t_0(gkm,mkm," | D_FM0_ZZWW0_U -> "damzz0_u_0(gkm,mkm," | D_FM0_ZZWW1_S -> "damzz1_s_0(gkm,mkm," | D_FM0_ZZWW1_T -> "damzz1_t_0(gkm,mkm," | D_FM0_ZZWW1_U -> "damzz1_u_0(gkm,mkm," | D_FM0_WWWW0_S -> "damww0_s_0(gkm,mkm," | D_FM0_WWWW0_T -> "damww0_t_0(gkm,mkm," | D_FM0_WWWW0_U -> "damww0_u_0(gkm,mkm," | D_FM0_WWWW2_S -> "damww2_s_0(gkm,mkm," | D_FM0_WWWW2_T -> "damww2_t_0(gkm,mkm," | D_FM0_WWWW2_U -> "damww2_u_0(gkm,mkm," | D_FM0_ZZZZ_S -> "damz4_s_0(gkm,mkm," | D_FM0_ZZZZ_T -> "damz4_t_0(gkm,mkm," | D_FM0_ZZZZ_U -> "damz4_u_0(gkm,mkm," | D_FM1_ZZWW0_S -> "damzz0_s_1(gkm,mkm," | D_FM1_ZZWW0_T -> "damzz0_t_1(gkm,mkm," | D_FM1_ZZWW0_U -> "damzz0_u_1(gkm,mkm," | D_FM1_ZZWW1_S -> "damzz1_s_1(gkm,mkm," | D_FM1_ZZWW1_T -> "damzz1_t_1(gkm,mkm," | D_FM1_ZZWW1_U -> "damzz1_u_1(gkm,mkm," | D_FM1_WWWW0_S -> "damww0_s_1(gkm,mkm," | D_FM1_WWWW0_T -> "damww0_t_1(gkm,mkm," | D_FM1_WWWW0_U -> "damww0_u_1(gkm,mkm," | D_FM1_WWWW2_S -> "damww2_s_1(gkm,mkm," | D_FM1_WWWW2_T -> "damww2_t_1(gkm,mkm," | D_FM1_WWWW2_U -> "damww2_u_1(gkm,mkm," | D_FM1_ZZZZ_S -> "damz4_s_1(gkm,mkm," | D_FM1_ZZZZ_T -> "damz4_t_1(gkm,mkm," | D_FM1_ZZZZ_U -> "damz4_u_1(gkm,mkm," | D_FM7_ZZWW0_S -> "damzz0_s_7(gkm,mkm," | D_FM7_ZZWW0_T -> "damzz0_t_7(gkm,mkm," | D_FM7_ZZWW0_U -> "damzz0_u_7(gkm,mkm," | D_FM7_ZZWW1_S -> "damzz1_s_7(gkm,mkm," | D_FM7_ZZWW1_T -> "damzz1_t_7(gkm,mkm," | D_FM7_ZZWW1_U -> "damzz1_u_7(gkm,mkm," | D_FM7_WWWW0_S -> "damww0_s_7(gkm,mkm," | D_FM7_WWWW0_T -> "damww0_t_7(gkm,mkm," | D_FM7_WWWW0_U -> "damww0_u_7(gkm,mkm," | D_FM7_WWWW2_S -> "damww2_s_7(gkm,mkm," | D_FM7_WWWW2_T -> "damww2_t_7(gkm,mkm," | D_FM7_WWWW2_U -> "damww2_u_7(gkm,mkm," | D_FM7_ZZZZ_S -> "damz4_s_7(gkm,mkm," | D_FM7_ZZZZ_T -> "damz4_t_7(gkm,mkm," | D_FM7_ZZZZ_U -> "damz4_u_7(gkm,mkm," | D_Alpha_HHHH_S -> "dalh4_s(gkm,mkm," | D_Alpha_HHHH_T -> "dalh4_t(gkm,mkm," | D_Alpha_HHWW0_S -> "dalhw0_s(gkm,mkm," | D_Alpha_HHWW0_T -> "dalhw0_t(gkm,mkm," | D_Alpha_HHZZ0_S -> "dalhz0_s(gkm,mkm," | D_Alpha_HHZZ0_T -> "dalhz0_t(gkm,mkm," | D_Alpha_HHWW1_S -> "dalhw1_s(gkm,mkm," | D_Alpha_HHWW1_T -> "dalhw1_t(gkm,mkm," | D_Alpha_HHWW1_U -> "dalhw1_u(gkm,mkm," | D_Alpha_HHZZ1_S -> "dalhz1_s(gkm,mkm," | D_Alpha_HHZZ1_T -> "dalhz1_t(gkm,mkm," | D_Alpha_HHZZ1_U -> "dalhz1_u(gkm,mkm," | D_FM0_HHWW0_S -> "damhw0_s_0(gkm,mkm," | D_FM0_HHWW0_T -> "damhw0_t_0(gkm,mkm," | D_FM0_HHWW0_U -> "damhw0_u_0(gkm,mkm," | D_FM0_HHZZ0_S -> "damhz0_s_0(gkm,mkm," | D_FM0_HHZZ0_T -> "damhz0_t_0(gkm,mkm," | D_FM0_HHZZ0_U -> "damhz0_u_0(gkm,mkm," | D_FM0_HHWW1_S -> "damhw1_s_0(gkm,mkm," | D_FM0_HHWW1_T -> "damhw1_t_0(gkm,mkm," | D_FM0_HHWW1_U -> "damhw1_u_0(gkm,mkm," | D_FM0_HHZZ1_S -> "damhz1_s_0(gkm,mkm," | D_FM0_HHZZ1_T -> "damhz1_t_0(gkm,mkm," | D_FM0_HHZZ1_U -> "damhz1_u_0(gkm,mkm," | D_FM1_HHWW0_S -> "damhw0_s_1(gkm,mkm," | D_FM1_HHWW0_T -> "damhw0_t_1(gkm,mkm," | D_FM1_HHWW0_U -> "damhw0_u_1(gkm,mkm," | D_FM1_HHZZ0_S -> "damhz0_s_1(gkm,mkm," | D_FM1_HHZZ0_T -> "damhz0_t_1(gkm,mkm," | D_FM1_HHZZ0_U -> "damhz0_u_1(gkm,mkm," | D_FM1_HHWW1_S -> "damhw1_s_1(gkm,mkm," | D_FM1_HHWW1_T -> "damhw1_t_1(gkm,mkm," | D_FM1_HHWW1_U -> "damhw1_u_1(gkm,mkm," | D_FM1_HHZZ1_S -> "damhz1_s_1(gkm,mkm," | D_FM1_HHZZ1_T -> "damhz1_t_1(gkm,mkm," | D_FM1_HHZZ1_U -> "damhz1_u_1(gkm,mkm," | D_FM7_HHWW0_S -> "damhw0_s_1(gkm,mkm," | D_FM7_HHWW0_T -> "damhw0_t_1(gkm,mkm," | D_FM7_HHWW0_U -> "damhw0_u_1(gkm,mkm," | D_FM7_HHZZ0_S -> "damhz0_s_1(gkm,mkm," | D_FM7_HHZZ0_T -> "damhz0_t_1(gkm,mkm," | D_FM7_HHZZ0_U -> "damhz0_u_1(gkm,mkm," | D_FM7_HHWW1_S -> "damhw1_s_1(gkm,mkm," | D_FM7_HHWW1_T -> "damhw1_t_1(gkm,mkm," | D_FM7_HHWW1_U -> "damhw1_u_1(gkm,mkm," | D_FM7_HHZZ1_S -> "damhz1_s_1(gkm,mkm," | D_FM7_HHZZ1_T -> "damhz1_t_1(gkm,mkm," | D_FM7_HHZZ1_U -> "damhz1_u_1(gkm,mkm," | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_SWW -> "gsww" | G_SZZ -> "gszz" | G_SHH -> "gshh" | G_SWW_T -> "gswwt" | G_SZZ_T -> "gszzt" | G_SAA_T -> "gsaat" | G_SAZ_T -> "gsazt" | G_PNWW -> "gpnww" | G_PNZZ -> "gpnzz" | G_PSNWW -> "gpsnww" | G_PSNZZ -> "gpsnzz" | G_PSNHH -> "gpsnhh" | G_PWZ -> "gpwz" | G_PWW -> "gpww" | G_FWW -> "gfww" | G_FZZ -> "gfzz" | G_FWW_CF -> "gfwwcf" | G_FZZ_CF -> "gfzzcf" | G_FHH -> "gfhh" | G_FHH_CF -> "gfhhcf" | G_FWW_T -> "gfwwt" | G_FZZ_T -> "gfzzt" | G_FFWW -> "gffww" | G_FFZZ -> "gffzz" | G_FFWW_CF -> "gffwwcf" | G_FFZZ_CF -> "gffzzcf" | G_FFHH -> "gffhh" | G_FFHH_CF -> "gffhhcf" | G_FVWW -> "gfvww" | G_FVZZ -> "gfvzz" | G_FVWW_CF -> "gfvwwcf" | G_FVZZ_CF -> "gfvzzcf" | G_FVHH -> "gfvhh" | G_FVHH_CF -> "gfvhhcf" | G_FDDSWW -> "gfddsww" | G_FDDSZZ -> "gfddszz" | G_FDDSWW_CF -> "gfddswwcf" | G_FDDSZZ_CF -> "gfddszzcf" | G_FDDSHH -> "gfddshh" | G_FDDSHH_CF -> "gfddshhcf" | G_FSWW -> "gfsww" | G_FSZZ -> "gfszz" | G_FSHH -> "gfshh" | G_TNWW -> "gtnww" | G_TNZZ -> "gtnzz" | G_TNWW_CF -> "gtnwwcf" | G_TNZZ_CF -> "gtnzzcf" | G_TSNWW -> "gtsnww" | G_TSNZZ -> "gtsnzz" | G_TSNWW_CF -> "gtsnwwcf" | G_TSNZZ_CF -> "gtsnzzcf" | G_TWZ -> "gtwz" | G_TWW -> "gtww" | G_TWZ_CF -> "gtwzcf" | G_TWW_CF -> "gtwwcf" | G_SSWW -> "gssww" | G_SSZZ -> "gsszz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hmm -> "ghmm" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_HGaGa_anom -> "ghgaga_ac" | G_HGaZ_anom -> "ghgaz_ac" | G_HZZ_anom -> "ghzz_ac" | G_HWW_anom -> "ghww_ac" | G_HGaZ_u -> "ghgaz_u" | G_HZZ_u -> "ghzz_u" | G_HWW_u -> "ghww_u" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f | K_Matrix_Coeff i -> "kc" ^ string_of_int i | K_Matrix_Pole i -> "kp" ^ string_of_int i end Index: trunk/omega/src/dump_ufo.sh =================================================================== --- trunk/omega/src/dump_ufo.sh (revision 8415) +++ trunk/omega/src/dump_ufo.sh (revision 8416) @@ -1,31 +1,31 @@ #! /bin/sh ######################################################################## # This script is for developers only and needs not to be portable. # This script takes TO's directory structure for granted. ######################################################################## # tl;dr : don't try this at home, kids ;) ######################################################################## jobs=12 -UFO_SM=$HOME/physics/SM/ -UFO_MSSM=$HOME/physics/MSSM_UFO/ +UFO_SM=../tests/UFO/SM/ +UFO_MSSM=../tests/UFO/MSSM/ UFO_SMEFT=$HOME/physics/SMEFTsim_A_U35_alphaScheme_UFO_v2_1/ UFO_SMEFT=$HOME/physics/SMEFT_mW_UFO/ root=$HOME/physics/whizard build=$root/_build/default omega=omega_UFO case X"$1" in X"-SM") UFO=$UFO_SM; shift;; X"-SMEFT") UFO=$UFO_SMEFT; shift;; X"-MSSM") UFO=$UFO_MSSM; omega=omega_UFO_Majorana; shift;; X"-X") UFO="$2"; shift 2;; *) UFO=$UFO_SM;; esac OCAMLFLAGS="-w -D -warn-error +P" make OCAMLFLAGS="$OCAMLFLAGS" -j $jobs -C $build/omega/src || exit 1 make -j $jobs -C $build/omega/bin $omega.opt || exit 1 $build/omega/bin/$omega.opt -model:UFO_dir $UFO -model:dump -model:exec "$@" Index: trunk/omega/src/modeltools.ml =================================================================== --- trunk/omega/src/modeltools.ml (revision 8415) +++ trunk/omega/src/modeltools.ml (revision 8416) @@ -1,573 +1,575 @@ (* modeltools.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Compilation} *) (* Flavors and coupling constants: flavors can be tested for equality and charge conjugation is defined. *) module type Flavor = sig type f type c val compare : f -> f -> int val conjugate : f -> f end (* Compiling fusions from a list of vertices: *) module type Fusions = sig type t type f type c val fuse2 : t -> f -> f -> (f * c Coupling.t) list val fuse3 : t -> f -> f -> f -> (f * c Coupling.t) list val fuse : t -> f list -> (f * c Coupling.t) list val of_vertices : (((f * f * f) * c Coupling.vertex3 * c) list * ((f * f * f * f) * c Coupling.vertex4 * c) list * (f list * c Coupling.vertexn * c) list) -> t end module Fusions (F : Flavor) : Fusions with type f = F.f and type c = F.c = struct type f = F.f type c = F.c module F2 = struct type t = f * f let hash = Hashtbl.hash let compare (f1, f2) (f1', f2') = let c1 = F.compare f1 f1' in if c1 <> 0 then c1 else F.compare f2 f2' let equal f f' = compare f f' = 0 end module F3 = struct type t = f * f * f let hash = Hashtbl.hash let compare (f1, f2, f3) (f1', f2', f3') = let c1 = F.compare f1 f1' in if c1 <> 0 then c1 else let c2 = F.compare f2 f2' in if c2 <> 0 then c2 else F.compare f3 f3' let equal f f' = compare f f' = 0 end module Fn = struct type t = f list let hash = Hashtbl.hash let compare f f' = ThoList.compare ~cmp:F.compare f f' let equal f f' = compare f f' = 0 end module H2 = Hashtbl.Make (F2) module H3 = Hashtbl.Make (F3) module Hn = Hashtbl.Make (Fn) type t = { v3 : (f * c Coupling.t) list H2.t; v4 : (f * c Coupling.t) list H3.t; vn : (f * c Coupling.t) list Hn.t } let lookup_fuse2 table f1 f2 = try H2.find table.v3 (f1, f2) with Not_found -> [] let lookup_fuse3 table f1 f2 f3 = try H3.find table.v4 (f1, f2, f3) with Not_found -> [] let lookup_fusen table f = try Hn.find table.vn f with Not_found -> [] let fuse2 table f1 f2 = List.rev_append (lookup_fusen table [f1; f2]) (lookup_fuse2 table f1 f2) let fuse3 table f1 f2 f3 = List.rev_append (lookup_fusen table [f1; f2; f3]) (lookup_fuse3 table f1 f2 f3) let fusen table f = lookup_fusen table f let fuse table = function | [] | [_] -> invalid_arg "Fusions().fuse" | [f1; f2] -> fuse2 table f1 f2 | [f1; f2; f3] -> fuse3 table f1 f2 f3 | f -> fusen table f (* Note that a pair or a triplet can appear more than once (e.\,g.~$e^+e^-\to \gamma$ and~$e^+e^-\to Z$). Therefore don't replace the entry, but augment it instead. *) let add_fusion2 table f1 f2 fusions = H2.add table.v3 (f1, f2) (fusions :: lookup_fuse2 table f1 f2) let add_fusion3 table f1 f2 f3 fusions = H3.add table.v4 (f1, f2, f3) (fusions :: lookup_fuse3 table f1 f2 f3) let add_fusionn table f fusions = Hn.add table.vn f (fusions :: lookup_fusen table f) (* \begin{dubious} Do we need to take into account the charge conjugation of the coupling constants here? \end{dubious} *) (* If some flavors are identical, we must not introduce the same vertex more than once: *) open Coupling let permute3 (f1, f2, f3) = [ (f1, f2), F.conjugate f3, F12; (f2, f1), F.conjugate f3, F21; (f2, f3), F.conjugate f1, F23; (f3, f2), F.conjugate f1, F32; (f3, f1), F.conjugate f2, F31; (f1, f3), F.conjugate f2, F13 ] (* Here we add identical permutations of pairs only once: *) module F2' = Set.Make (F2) let add_permute3 table v c set ((f1, f2 as f12), f, p) = if F2'.mem f12 set then set else begin add_fusion2 table f1 f2 (f, V3 (v, p, c)); F2'.add f12 set end let add_vertex3 table (f123, v, c) = ignore (List.fold_left (fun set f -> add_permute3 table v c set f) F2'.empty (permute3 f123)) (* \begin{dubious} Handling all the cases explicitely is OK for cubic vertices, but starts to become questionable already for quartic couplings. The advantage remains that we can check completeness in [Targets]. \end{dubious} *) let permute4 (f1, f2, f3, f4) = [ (f1, f2, f3), F.conjugate f4, F123; (f2, f3, f1), F.conjugate f4, F231; (f3, f1, f2), F.conjugate f4, F312; (f2, f1, f3), F.conjugate f4, F213; (f3, f2, f1), F.conjugate f4, F321; (f1, f3, f2), F.conjugate f4, F132; (f1, f2, f4), F.conjugate f3, F124; (f2, f4, f1), F.conjugate f3, F241; (f4, f1, f2), F.conjugate f3, F412; (f2, f1, f4), F.conjugate f3, F214; (f4, f2, f1), F.conjugate f3, F421; (f1, f4, f2), F.conjugate f3, F142; (f1, f3, f4), F.conjugate f2, F134; (f3, f4, f1), F.conjugate f2, F341; (f4, f1, f3), F.conjugate f2, F413; (f3, f1, f4), F.conjugate f2, F314; (f4, f3, f1), F.conjugate f2, F431; (f1, f4, f3), F.conjugate f2, F143; (f2, f3, f4), F.conjugate f1, F234; (f3, f4, f2), F.conjugate f1, F342; (f4, f2, f3), F.conjugate f1, F423; (f3, f2, f4), F.conjugate f1, F324; (f4, f3, f2), F.conjugate f1, F432; (f2, f4, f3), F.conjugate f1, F243 ] (* Add identical permutations of triplets only once: *) module F3' = Set.Make (F3) let add_permute4 table v c set ((f1, f2, f3 as f123), f, p) = if F3'.mem f123 set then set else begin add_fusion3 table f1 f2 f3 (f, V4 (v, p, c)); F3'.add f123 set end let add_vertex4 table (f1234, v, c) = ignore (List.fold_left (fun set f -> add_permute4 table v c set f) F3'.empty (permute4 f1234)) module Fn' = Set.Make (Fn) let permuten = function | [] -> invalid_arg "Modeltools.permuten" | f -> List.map (fun f' -> match List.split f' with | i :: i_list, f :: f_list -> (f_list, F.conjugate f, i_list @ [i]) | _ -> failwith "Modeltools.permuten: impossible") (Combinatorics.permute (ThoList.enumerate 1 f)) (* This is for debugging: it provides the same permutations than the legacy version. *) let permutations = function | [f1; f2; f3] -> [ [f1; f2; f3]; [f2; f1; f3]; [f2; f3; f1]; [f3; f2; f1]; [f3; f1; f2]; [f1; f3; f2] ] | [f1; f2; f3; f4] -> [ [f1; f2; f3; f4]; [f1; f2; f4; f3]; [f1; f3; f2; f4]; [f1; f3; f4; f2]; [f1; f4; f2; f3]; [f1; f4; f3; f2]; [f2; f1; f3; f4]; [f2; f1; f4; f3]; [f2; f3; f1; f4]; [f2; f3; f4; f1]; [f2; f4; f1; f3]; [f2; f4; f3; f1]; [f3; f1; f2; f4]; [f3; f1; f4; f2]; [f3; f2; f1; f4]; [f3; f2; f4; f1]; [f3; f4; f1; f2]; [f3; f4; f2; f1]; [f4; f1; f2; f3]; [f4; f1; f3; f2]; [f4; f2; f1; f3]; [f4; f2; f3; f1]; [f4; f3; f1; f2]; [f4; f3; f2; f1] ] | flist -> Combinatorics.permute flist let permutations = Combinatorics.permute let permuten = function | [] -> invalid_arg "Modeltools.permuten" | f -> List.map (fun f' -> match List.split (List.rev f') with | i_list, f :: f_list -> (* [Printf.eprintf "permuten: %s\n" (ThoList.to_string string_of_int (List.rev i_list));] *) (List.rev f_list, F.conjugate f, List.rev i_list) | _ -> failwith "Modeltools.permuten: impossible") (permutations (ThoList.enumerate 1 f)) let add_permuten table v c set (f12__n, f, p) = if Fn'.mem f12__n set then set else begin add_fusionn table f12__n (f, Vn (v, p, c)); Fn'.add f12__n set end (* \begin{dubious} We could apply any necessary permutations to objects that are hidden inside of the vertex [v] here instead of in [Fusion.stat_fuse] and [Colorize.fuse]. \end{dubious} *) let add_vertexn table (f12__n, v, c) = ignore (List.fold_left (fun set f -> add_permuten table v c set f) Fn'.empty (permuten f12__n)) let of_vertices (vlist3, vlist4, vlistn) = let table = { v3 = H2.create 37; v4 = H3.create 37; vn = Hn.create 37 } in List.iter (add_vertex3 table) vlist3; List.iter (add_vertex4 table) vlist4; List.iter (add_vertexn table) vlistn; table end module type Constant = sig type t val of_string : string -> t end module Constant (M : Model.T) : Constant with type t = M.constant = struct type t = M.constant module String_Key = struct type t = string let hash = Hashtbl.hash let equal = (=) end module String_Hash = Hashtbl.Make (String_Key) let table = String_Hash.create 37 let fill_table table vs = List.iter (fun (_, _, c) -> String_Hash.add table (M.constant_symbol c) c) vs (* Delay loading of the tables until the first use, so that [M.vertices] can be initialized from a file. *) let tables_filled = ref false let fill_tables () = if not !tables_filled then begin let (v3, v4, vn) = M.vertices () in fill_table table v3; fill_table table v4; fill_table table vn; tables_filled := true end let of_string name = try fill_tables (); String_Hash.find table name with | Not_found -> invalid_arg ("Constant(Model).of_string: unknown coupling constant: " ^ name) end (* \thocwmodulesection{Mutable Models} *) module Mutable (FGC : sig type f and g and c end) : Model.Mutable with type flavor = FGC.f and type gauge = FGC.g and type constant = FGC.c = struct type flavor = FGC.f type gauge = FGC.g type constant = FGC.c let init () = () let options = Options.empty + let caveats () = [] module Ch = Charges.Null let charges _ = () exception Uninitialized of string let uninitialized name = raise (Uninitialized name) (* Note that [lookup] works, by the magic of currying, for any arity. But we need to supply one argument to delay evaluation. *) (* Also note that the references are \emph{not} shared among results of functor applications. Simple module renaming causes sharing. *) let declare template = let reference = ref template in let update fct = reference := fct and lookup arg = !reference arg in (update, lookup) let set_color, color = declare (fun f -> uninitialized "color") let set_nc, nc = declare (fun f -> uninitialized "nc") let set_pdg, pdg = declare (fun f -> uninitialized "pdg") let set_lorentz, lorentz = declare (fun f -> uninitialized "lorentz") let set_propagator, propagator = declare (fun f -> uninitialized "propagator") let set_width, width = declare (fun f -> uninitialized "width") let set_goldstone, goldstone = declare (fun f -> uninitialized "goldstone") let set_conjugate, conjugate = declare (fun f -> uninitialized "conjugate") let set_fermion, fermion = declare (fun f -> uninitialized "fermion") let set_max_degree, max_degree = declare (fun () -> uninitialized "max_degree") let set_vertices, vertices = declare (fun () -> uninitialized "vertices") let set_fuse2, fuse2 = declare (fun f1 f2 -> uninitialized "fuse2") let set_fuse3, fuse3 = declare (fun f1 f2 f3 -> uninitialized "fuse3") let set_fuse, fuse = declare (fun f -> uninitialized "fuse") let set_flavors, flavors = declare (fun () -> []) let set_external_flavors, external_flavors = declare (fun () -> [("uninitialized", [])]) let set_parameters, parameters = declare (fun () -> uninitialized "parameters") let set_flavor_of_string, flavor_of_string = declare (fun f -> uninitialized "flavor_of_string") let set_flavor_to_string, flavor_to_string = declare (fun f -> uninitialized "flavor_to_string") let set_flavor_to_TeX, flavor_to_TeX = declare (fun f -> uninitialized "flavor_to_TeX") let set_flavor_symbol, flavor_symbol = declare (fun f -> uninitialized "flavor_symbol") let set_gauge_symbol, gauge_symbol = declare (fun g -> uninitialized "gauge_symbol") let set_mass_symbol, mass_symbol = declare (fun f -> uninitialized "mass_symbol") let set_width_symbol, width_symbol = declare (fun f -> uninitialized "width_symbol") let set_constant_symbol, constant_symbol = declare (fun c -> uninitialized "constant_symbol") module F = Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let max_degree_of_vertices (v3, v4, vn) = List.fold_left (fun acc (p, _, _) -> max acc (List.length p)) (max (match v3 with [] -> 0 | _ -> 3) (match v4 with [] -> 0 | _ -> 4)) vn let setup ~color ~nc ~pdg ~lorentz ~propagator ~width ~goldstone ~conjugate ~fermion ~vertices ~flavors ~parameters ~flavor_of_string ~flavor_to_string ~flavor_to_TeX ~flavor_symbol ~gauge_symbol ~mass_symbol ~width_symbol ~constant_symbol = set_color color; set_nc nc; set_pdg pdg; set_lorentz lorentz; set_propagator propagator; set_width width; set_goldstone goldstone; set_conjugate conjugate; set_fermion fermion; let v = vertices () in let max_degree = max_degree_of_vertices v in set_max_degree (fun () -> max_degree); set_vertices (fun () -> v); let table = F.of_vertices v in set_fuse2 (F.fuse2 table); set_fuse3 (F.fuse3 table); set_fuse (F.fuse table); set_external_flavors (fun () -> flavors); let flavors = ThoList.flatmap snd flavors in set_flavors (fun () -> flavors); set_parameters parameters; set_flavor_of_string flavor_of_string; set_flavor_to_string flavor_to_string; set_flavor_to_TeX flavor_to_TeX; set_flavor_symbol flavor_symbol; set_gauge_symbol gauge_symbol; set_mass_symbol mass_symbol; set_width_symbol width_symbol; set_constant_symbol constant_symbol end module Static (M : Model.T) = struct type flavor = M.flavor type gauge = M.gauge type constant = M.constant module Ch = M.Ch let color = M.color let nc = M.nc let charges = M.charges let pdg = M.pdg let lorentz = M.lorentz let propagator = M.propagator let width = M.width let conjugate = M.conjugate let fermion = M.fermion let max_degree = M.max_degree let vertices = M.vertices let fuse2 = M.fuse2 let fuse3 = M.fuse3 let fuse = M.fuse let flavors = M.flavors let external_flavors = M.external_flavors let goldstone = M.goldstone let parameters = M.parameters let flavor_of_string = M.flavor_of_string let flavor_to_string = M.flavor_to_string let flavor_to_TeX = M.flavor_to_TeX let flavor_symbol = M.flavor_symbol let gauge_symbol = M.gauge_symbol let mass_symbol = M.mass_symbol let width_symbol = M.width_symbol let constant_symbol = M.constant_symbol let options = M.options + let caveats = M.caveats let init () = () let setup ~color ~nc ~pdg ~lorentz ~propagator ~width ~goldstone ~conjugate ~fermion ~vertices ~flavors ~parameters ~flavor_of_string ~flavor_to_string ~flavor_to_TeX ~flavor_symbol ~gauge_symbol ~mass_symbol ~width_symbol ~constant_symbol = () end Index: trunk/omega/src/fusion_vintage.mli =================================================================== --- trunk/omega/src/fusion_vintage.mli (revision 8415) +++ trunk/omega/src/fusion_vintage.mli (revision 8416) @@ -1,376 +1,379 @@ (* fusion.mli -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) module type T = sig val options : Options.t +(* JRR's implementation of Majoranas needs a special case. *) + val vintage : bool + (* Wavefunctions are an abstract data type, containing a momentum~[p] and additional quantum numbers, collected in~[flavor]. *) type wf val conjugate : wf -> wf (* Obviously, [flavor] is not restricted to the physical notion of flavor, but can carry spin, color, etc. *) type flavor val flavor : wf -> flavor type flavor_sans_color val flavor_sans_color : wf -> flavor_sans_color (* Momenta are represented by an abstract datatype (defined in~[Momentum]) that is optimized for performance. They can be accessed either abstractly or as lists of indices of the external momenta. These indices are assigned sequentially by [amplitude] below. *) type p val momentum : wf -> p val momentum_list : wf -> int list (* At tree level, the wave functions are uniquely specified by [flavor] and momentum. If loops are included, we need to distinguish among orders. Also, if we build a result from an incomplete sum of diagrams, we need to add a distinguishing mark. At the moment, we assume that a [string] that can be attached to the symbol suffices. *) val wf_tag : wf -> string option (* Coupling constants *) type constant (* and right hand sides of assignments. The latter are formed from a sign from Fermi statistics, a coupling (constand and Lorentz structure) and wave functions. *) type coupling type rhs type 'a children val sign : rhs -> int val coupling : rhs -> constant Coupling.t val coupling_tag : rhs -> string option type exclusions val no_exclusions : exclusions (* In renormalized perturbation theory, couplings come in different orders of the loop expansion. Be prepared: [val order : rhs -> int] *) (* \begin{dubious} This is here only for the benefit of [Target] and shall become [val children : rhs -> wf children] later \ldots \end{dubious} *) val children : rhs -> wf list (* Fusions come in two types: fusions of wave functions to off-shell wave functions: \begin{equation*} \phi(p+q) = \phi(p)\phi(q) \end{equation*} *) type fusion val lhs : fusion -> wf val rhs : fusion -> rhs list (* and products at the keystones: \begin{equation*} \phi(-p-q)\cdot\phi(p)\phi(q) \end{equation*} *) type braket val bra : braket -> wf val ket : braket -> rhs list (* [amplitude goldstones incoming outgoing] calculates the amplitude for scattering of [incoming] to [outgoing]. If [goldstones] is true, also non-propagating off-shell Goldstone amplitudes are included to allow the checking of Slavnov-Taylor identities. *) type amplitude type amplitude_sans_color type selectors val amplitudes : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude list val amplitude_sans_color : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude_sans_color val dependencies : amplitude -> wf -> (wf, coupling) Tree2.t (* We should be precise regarding the semantics of the following functions, since modules implementating [Target] must not make any mistakes interpreting the return values. Instead of calculating the amplitude \begin{subequations} \begin{equation} \label{eq:physical-amplitude} \Braket{f_3,p_3,f_4,p_4,\ldots|T|f_1,p_1,f_2,p_2} \end{equation} directly, O'Mega calculates the---equivalent, but more symmetrical---crossed amplitude \begin{equation} \Braket{\bar f_1,-p_1,\bar f_2,-p_2,f_3,p_3,f_4,p_4,\ldots|T|0} \end{equation} Internally, all flavors are represented by their charge conjugates \begin{equation} \label{eq:internal-amplitude} A(f_1,-p_1,f_2,-p_2,\bar f_3,p_3,\bar f_4,p_4,\ldots) \end{equation} \end{subequations} The correspondence of vertex and term in the lagrangian \begin{equation} \parbox{26\unitlength}{% \fmfframe(5,3)(5,3){% \begin{fmfgraph*}(15,20) \fmfleft{v} \fmfright{p,A,e} \fmflabel{$\mathrm{e}^-$}{e} \fmflabel{$\mathrm{e}^+$}{p} \fmflabel{$\mathrm{A}$}{A} \fmf{fermion}{p,v,e} \fmf{photon}{A,v} \fmfdot{v} \end{fmfgraph*}}}: \bar\psi\fmslash{A}\psi \end{equation} suggests to denote the \emph{outgoing} particle by the flavor of the \emph{anti}particle and the \emph{outgoing} \emph{anti}particle by the flavor of the particle, since this choice allows to represent the vertex by a triple \begin{equation} \bar\psi\fmslash{A}\psi: (\mathrm{e}^+,A,\mathrm{e}^-) \end{equation} which is more intuitive than the alternative $(\mathrm{e}^-,A,\mathrm{e}^+)$. Also, when thinking in terms of building wavefunctions from the outside in, the outgoing \emph{antiparticle} is represented by a \emph{particle} propagator and vice versa\footnote{Even if this choice will appear slightly counter-intuitive on the [Target] side, one must keep in mind that much more people are expected to prepare [Model]s.}. [incoming] and [outgoing] are the physical flavors as in~(\ref{eq:physical-amplitude}) *) val incoming : amplitude -> flavor list val outgoing : amplitude -> flavor list (* [externals] are flavors and momenta as in~(\ref{eq:internal-amplitude}) *) val externals : amplitude -> wf list val variables : amplitude -> wf list val fusions : amplitude -> fusion list val brakets : amplitude -> braket list val on_shell : amplitude -> (wf -> bool) val is_gauss : amplitude -> (wf -> bool) val constraints : amplitude -> string option val symmetry : amplitude -> int val allowed : amplitude -> bool (* \thocwmodulesubsection{Performance Hacks} *) val initialize_cache : string -> unit val set_cache_name : string -> unit (* \thocwmodulesubsection{Diagnostics} *) val check_charges : unit -> flavor_sans_color list list val count_fusions : amplitude -> int val count_propagators : amplitude -> int val count_diagrams : amplitude -> int val forest : wf -> amplitude -> ((wf * coupling option, wf) Tree.t) list val poles : amplitude -> wf list list val s_channel : amplitude -> wf list val tower_to_dot : out_channel -> amplitude -> unit val amplitude_to_dot : out_channel -> amplitude -> unit (* \thocwmodulesubsection{WHIZARD} *) val phase_space_channels : out_channel -> amplitude_sans_color -> unit val phase_space_channels_flipped : out_channel -> amplitude_sans_color -> unit end (* There is more than one way to make fusions. *) module type Maker = functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant and type selectors = Cascade.Make(M)(P).selectors (*i If we want or need to expose [Make], here's how to do it: module type Stat = sig type flavor type stat exception Impossible val stat : flavor -> int -> stat val stat_fuse : stat -> stat -> flavor -> stat val stat_sign : stat -> int end module type Stat_Maker = functor (M : Model.T) -> Stat with type flavor = M.flavor module Make : functor (PT : Tuple.Poly) (Stat : Stat_Maker) (T : Topology.T with type 'a children = 'a PT.t) -> Maker i*) (* Straightforward Dirac fermions vs. slightly more complicated Majorana fermions: *) module Binary : Maker module Binary_Majorana : Maker module Mixed23 : Maker module Mixed23_Majorana : Maker module Nary : functor (B : Tuple.Bound) -> Maker module Nary_Majorana : functor (B : Tuple.Bound) -> Maker (* We can also proceed \'a la~\cite{HELAC:2000}. Empirically, this will use slightly~($O(10\%)$) fewer fusions than the symmetric factorization. Our implementation uses significantly~($O(50\%)$) fewer fusions than reported by~\cite{HELAC:2000}. Our pruning of the DAG might be responsible for this. *) module Helac : functor (B : Tuple.Bound) -> Maker module Helac_Majorana : functor (B : Tuple.Bound) -> Maker (* \thocwmodulesection{Multiple Amplitudes} *) module type Multi = sig exception Mismatch val options : Options.t type flavor type process = flavor list * flavor list type amplitude type fusion type wf type exclusions val no_exclusions : exclusions type selectors type amplitudes (* Construct all possible color flow amplitudes for a given process. *) val amplitudes : bool -> int option -> exclusions -> selectors -> process list -> amplitudes val empty : amplitudes (* Precompute the vertex table cache. *) val initialize_cache : string -> unit val set_cache_name : string -> unit (* The list of all combinations of incoming and outgoing particles with a nonvanishing scattering amplitude. *) val flavors : amplitudes -> process list (* The list of all combinations of incoming and outgoing particles that don't lead to any color flow with non vanishing scattering amplitude. *) val vanishing_flavors : amplitudes -> process list (* The list of all color flows with a nonvanishing scattering amplitude. *) val color_flows : amplitudes -> Color.Flow.t list (* The list of all valid helicity combinations. *) val helicities : amplitudes -> (int list * int list) list (* The list of all amplitudes. *) val processes : amplitudes -> amplitude list (* [(process_table a).(f).(c)] returns the amplitude for the [f]th allowed flavor combination and the [c]th allowed color flow as an [amplitude option]. *) val process_table : amplitudes -> amplitude option array array (* The list of all non redundant fusions together with the amplitudes they came from. *) val fusions : amplitudes -> (fusion * amplitude) list (* If there's more than external flavor state, the wavefunctions are \emph{not} uniquely specified by [flavor] and [Momentum.t]. This function can be used to determine how many variables must be allocated. *) val multiplicity : amplitudes -> wf -> int (* This function can be used to disambiguate wavefunctions with the same combination of [flavor] and [Momentum.t]. *) val dictionary : amplitudes -> amplitude -> wf -> int (* [(color_factors a).(c1).(c2)] power of~$N_C$ for the given product of color flows. *) val color_factors : amplitudes -> Color.Flow.factor array array (* A description of optional diagram selectors. *) val constraints : amplitudes -> string option end module type Multi_Maker = functor (Fusion_Maker : Maker) -> functor (P : Momentum.T) -> functor (M : Model.T) -> Multi with type flavor = M.flavor and type amplitude = Fusion_Maker(P)(M).amplitude and type fusion = Fusion_Maker(P)(M).fusion and type wf = Fusion_Maker(P)(M).wf and type selectors = Fusion_Maker(P)(M).selectors module Multi : Multi_Maker (* \thocwmodulesection{Tags} *) (* It appears that there are useful applications for tagging couplings and wave functions, e.\,g.~skeleton expansion and diagram selections. We can abstract this in a [Tags] signature: *) module type Tags = sig type wf type coupling type 'a children val null_wf : wf val null_coupling : coupling val fuse : coupling -> wf children -> wf val wf_to_string : wf -> string option val coupling_to_string : coupling -> string option end module type Tagger = functor (PT : Tuple.Poly) -> Tags with type 'a children = 'a PT.t module type Tagged_Maker = functor (Tagger : Tagger) -> functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant module Tagged_Binary : Tagged_Maker (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/compare_majorana_UFO.sh =================================================================== --- trunk/omega/src/compare_majorana_UFO.sh (revision 0) +++ trunk/omega/src/compare_majorana_UFO.sh (revision 8416) @@ -0,0 +1,42 @@ +#! /bin/sh +######################################################################## +# This script is for developers only and needs not to be portable. +# This script takes TO's directory structure for granted. +######################################################################## +# tl;dr : don't try this at home, kids ;) +######################################################################## + +case "$#" in + 2) mode="$1" + process="$2" + ;; + *) echo "usage: $0 [-scatter|-decay] process" 1>&2 + exit 2 + ;; +esac + +jobs=12 +width=1000 +width=80 + +root=$HOME/physics/whizard +build=$root/_build/default + +OCAMLFLAGS="-w -D -warn-error +P" +make OCAMLFLAGS="$OCAMLFLAGS" -j $jobs -C $build/omega/src || exit 1 +make -j $jobs -C $build/omega/bin \ + omega_UFO.opt omega_UFO_Majorana.opt || exit 1 + +omega_dirac="$build/omega/bin/omega_UFO.opt -model:exec -target:width $width" +omega_majorana="$build/omega/bin/omega_UFO_Majorana.opt -model:Majorana -model:exec -target:width $width" + +$omega_dirac "$mode" "$process" > omega_amplitude_dirac.f90 2>/dev/null +$omega_majorana "$mode" "$process" > omega_amplitude_majorana.f90 2>/dev/null + +if grep -q 'integer, parameter :: n_prt = 0' omega_amplitude_dirac.f90; then + echo "O'Mega Dirac empty: $mode $process" 1>&2; +elif grep -q 'integer, parameter :: n_prt = 0' omega_amplitude_majorana.f90; then + echo "O'Mega Majorana empty: $mode $process" 1>&2; +else + diff -u omega_amplitude_dirac.f90 omega_amplitude_majorana.f90 +fi Property changes on: trunk/omega/src/compare_majorana_UFO.sh ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/omega/src/thoList.ml =================================================================== --- trunk/omega/src/thoList.ml (revision 8415) +++ trunk/omega/src/thoList.ml (revision 8416) @@ -1,517 +1,619 @@ (* thoList.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Avoid refering to [Pervasives.compare], because [Pervasives] will become [Stdlib.Pervasives] in O'Caml 4.07 and [Stdlib] in O'Caml 4.08. *) let pcompare = compare let rec hdn n l = if n <= 0 then [] else match l with | x :: rest -> x :: hdn (pred n) rest | [] -> invalid_arg "ThoList.hdn" let rec tln n l = if n <= 0 then l else match l with | _ :: rest -> tln (pred n) rest | [] -> invalid_arg "ThoList.tln" let rec splitn' n l1_rev l2 = if n <= 0 then (List.rev l1_rev, l2) else match l2 with | x :: l2' -> splitn' (pred n) (x :: l1_rev) l2' | [] -> invalid_arg "ThoList.splitn n > len" let splitn n l = if n < 0 then invalid_arg "ThoList.splitn n < 0" else splitn' n [] l let split_last l = match List.rev l with | [] -> invalid_arg "ThoList.split_last []" | ln :: l12_rev -> (List.rev l12_rev, ln) (* This is [splitn'] all over again, but without the exception. *) let rec chopn'' n l1_rev l2 = if n <= 0 then (List.rev l1_rev, l2) else match l2 with | x :: l2' -> chopn'' (pred n) (x :: l1_rev) l2' | [] -> (List.rev l1_rev, []) let rec chopn' n ll_rev = function | [] -> List.rev ll_rev | l -> begin match chopn'' n [] l with | [], [] -> List.rev ll_rev | l1, [] -> List.rev (l1 :: ll_rev) | l1, l2 -> chopn' n (l1 :: ll_rev) l2 end let chopn n l = if n <= 0 then invalid_arg "ThoList.chopn n <= 0" else chopn' n [] l (* Find a member [a] in the list [l] and return the cyclically permuted list with [a] as head. *) let cycle_until a l = let rec cycle_until' acc = function | [] -> raise Not_found | a' :: l' as al' -> if a' = a then al' @ List.rev acc else cycle_until' (a' :: acc) l' in cycle_until' [] l let rec cycle' i acc l = if i <= 0 then l @ List.rev acc else match l with | [] -> invalid_arg "ThoList.cycle" | a' :: l' -> cycle' (pred i) (a' :: acc) l' let cycle n l = if n < 0 then invalid_arg "ThoList.cycle" else cycle' n [] l let of_subarray n1 n2 a = let rec of_subarray' n1 n2 = if n1 > n2 then [] else a.(n1) :: of_subarray' (succ n1) n2 in of_subarray' (max 0 n1) (min n2 (pred (Array.length a))) let range ?(stride=1) n1 n2 = if stride <= 0 then invalid_arg "ThoList.range: stride <= 0" else let rec range' n = if n > n2 then [] else n :: range' (n + stride) in range' n1 (* Tail recursive: *) let enumerate ?(stride=1) n l = let _, l_rev = List.fold_left (fun (i, acc) a -> (i + stride, (i, a) :: acc)) (n, []) l in List.rev l_rev (* Take the elements of [list] that satisfy [predicate] and form a list of pairs of an offset into the original list and the element with the offsets starting from [offset]. NB: the order of the returned alist is not specified! *) let alist_of_list ?(predicate=(fun _ -> true)) ?(offset=0) list = let _, alist = List.fold_left (fun (n, acc) x -> (succ n, if predicate x then (n, x) :: acc else acc)) (offset, []) list in alist (* This is \emph{not} tail recursive! *) let rec flatmap f = function | [] -> [] | x :: rest -> f x @ flatmap f rest (* This is! *) let rev_flatmap f l = let rec rev_flatmap' acc f = function | [] -> acc | x :: rest -> rev_flatmap' (List.rev_append (f x) acc) f rest in rev_flatmap' [] f l +let rec power = function + | [] -> [[]] + | a :: a_list -> + let power_a_list = power a_list in + power_a_list @ List.map (fun a_list -> a :: a_list) power_a_list + let fold_left2 f acc lists = List.fold_left (List.fold_left f) acc lists let fold_right2 f lists acc = List.fold_right (List.fold_right f) lists acc let iteri f start list = ignore (List.fold_left (fun i a -> f i a; succ i) start list) let iteri2 f start_outer star_inner lists = iteri (fun j -> iteri (f j) star_inner) start_outer lists let mapi f start list = let next, list' = List.fold_left (fun (i, acc) a -> (succ i, f i a :: acc)) (start, []) list in List.rev list' +let rec map3 f l1 l2 l3 = + match l1, l2, l3 with + | [], [], [] -> [] + | a1 :: l1, a2 :: l2, a3 :: l3 -> + let fa123 = f a1 a2 a3 in + fa123 :: map3 f l1 l2 l3 + | _, _, _ -> invalid_arg "ThoList.map3" + (* Is there a more efficient implementation? *) let transpose lists = let rec transpose' rest = if List.for_all ((=) []) rest then [] else List.map List.hd rest :: transpose' (List.map List.tl rest) in try transpose' lists with | Failure s -> if s = "tl" then invalid_arg "ThoList.transpose: not rectangular" else failwith ("ThoList.transpose: unexpected Failure(" ^ s ^ ")") let compare ?(cmp=pcompare) l1 l2 = let rec compare' l1' l2' = match l1', l2' with | [], [] -> 0 | [], _ -> -1 | _, [] -> 1 | n1 :: r1, n2 :: r2 -> let c = cmp n1 n2 in if c <> 0 then c else compare' r1 r2 in compare' l1 l2 let rec uniq' x = function | [] -> [] | x' :: rest -> if x' = x then uniq' x rest else x' :: uniq' x' rest let uniq = function | [] -> [] | x :: rest -> x :: uniq' x rest let rec homogeneous = function | [] | [_] -> true | a1 :: (a2 :: _ as rest) -> if a1 <> a2 then false else homogeneous rest let rec pairs' acc = function | [] -> acc | [x] -> invalid_arg "pairs: odd number of elements" | x :: y :: indices -> if x <> y then invalid_arg "pairs: not in pairs" else begin match acc with | [] -> pairs' [x] indices | x' :: _ -> if x = x' then invalid_arg "pairs: more than twice" else pairs' (x :: acc) indices end let pairs l = pairs' [] (List.sort pcompare l) (* If we needed it, we could use a polymorphic version of [Set] to speed things up from~$O(n^2)$ to~$O(n\ln n)$. But not before it matters somewhere \ldots *) let classify l = let rec add_to_class a = function | [] -> [1, a] | (n, a') :: rest -> if a = a' then (succ n, a) :: rest else (n, a') :: add_to_class a rest in let rec classify' cl = function | [] -> cl | a :: rest -> classify' (add_to_class a cl) rest in classify' [] l let rec factorize l = let rec add_to_class x y = function | [] -> [(x, [y])] | (x', ys) :: rest -> if x = x' then (x, y :: ys) :: rest else (x', ys) :: add_to_class x y rest in let rec factorize' fl = function | [] -> fl | (x, y) :: rest -> factorize' (add_to_class x y fl) rest in List.map (fun (x, ys) -> (x, List.rev ys)) (factorize' [] l) let rec clone n x = if n < 0 then invalid_arg "ThoList.clone" else if n = 0 then [] else x :: clone (pred n) x let interleave f list = let rec interleave' rev_head tail = let rev_head' = List.rev_append (f rev_head tail) rev_head in match tail with | [] -> List.rev rev_head' | x :: tail' -> interleave' (x :: rev_head') tail' in interleave' [] list let interleave_nearest f list = interleave (fun head tail -> match head, tail with | h :: _, t :: _ -> f h t | _ -> []) list let rec rev_multiply n rl l = if n < 0 then invalid_arg "ThoList.multiply" else if n = 0 then [] else List.rev_append rl (rev_multiply (pred n) rl l) let multiply n l = rev_multiply n (List.rev l) l +let filtermap f l = + let rec rev_filtermap acc = function + | [] -> List.rev acc + | a :: a_list -> + match f a with + | None -> rev_filtermap acc a_list + | Some fa -> rev_filtermap (fa :: acc) a_list + in + rev_filtermap [] l + exception Overlapping_indices exception Out_of_bounds let iset_list_union list = List.fold_right Sets.Int.union list Sets.Int.empty let complement_index_sets n index_set_lists = let index_sets = List.map Sets.Int.of_list index_set_lists in let index_set = iset_list_union index_sets in let size_index_sets = List.fold_left (fun acc s -> Sets.Int.cardinal s + acc) 0 index_sets in if size_index_sets <> Sets.Int.cardinal index_set then raise Overlapping_indices else if Sets.Int.exists (fun i -> i < 0 || i >= n) index_set then raise Overlapping_indices else match Sets.Int.elements (Sets.Int.diff (Sets.Int.of_list (range 0 (pred n))) index_set) with | [] -> index_set_lists | complement -> complement :: index_set_lists let sort_section cmp array index_set = List.iter2 (Array.set array) index_set (List.sort cmp (List.map (Array.get array) index_set)) let partitioned_sort cmp index_sets list = let array = Array.of_list list in List.fold_left (fun () -> sort_section cmp array) () (complement_index_sets (List.length list) index_sets); Array.to_list array let ariadne_sort ?(cmp=pcompare) list = let sorted = List.sort (fun (n1, a1) (n2, a2) -> cmp a1 a2) (enumerate 0 list) in (List.map snd sorted, List.map fst sorted) let ariadne_unsort (sorted, indices) = List.map snd (List.sort (fun (n1, a1) (n2, a2) -> pcompare n1 n2) (List.map2 (fun n a -> (n, a)) indices sorted)) let lexicographic ?(cmp=pcompare) l1 l2 = let rec lexicographic' = function | [], [] -> 0 | [], _ -> -1 | _, [] -> 1 | x1 :: rest1, x2 :: rest2 -> let res = cmp x1 x2 in if res <> 0 then res else lexicographic' (rest1, rest2) in lexicographic' (l1, l2) (* If there was a polymorphic [Set], we could also say [Set.elements (Set.union (Set.of_list l1) (Set.of_list l2))]. *) let common l1 l2 = List.fold_left (fun acc x1 -> if List.mem x1 l2 then x1 :: acc else acc) [] l1 let complement l1 = function | [] -> l1 | l2 -> if List.for_all (fun x -> List.mem x l1) l2 then List.filter (fun x -> not (List.mem x l2)) l1 else invalid_arg "ThoList.complement" let to_string a2s alist = "[" ^ String.concat "; " (List.map a2s alist) ^ "]" let random_int_list imax n = let imax_plus = succ imax in Array.to_list (Array.init n (fun _ -> Random.int imax_plus)) module Test = struct + let int_list2_to_string l2 = + to_string (to_string string_of_int) l2 + + (* Inefficient, must only be used for unit tests. *) + let compare_lists_by_size l1 l2 = + let lengths = pcompare (List.length l1) (List.length l2) in + if lengths = 0 then + pcompare l1 l2 + else + lengths + open OUnit + let suite_filtermap = + "filtermap" >::: + [ "filtermap Some []" >:: + (fun () -> + assert_equal ~printer:(to_string string_of_int) + [] (filtermap (fun x -> Some x) [])); + + "filtermap None []" >:: + (fun () -> + assert_equal ~printer:(to_string string_of_int) + [] (filtermap (fun x -> None) [])); + + "filtermap even_neg []" >:: + (fun () -> + assert_equal ~printer:(to_string string_of_int) + [0; -2; -4] + (filtermap + (fun n -> if n mod 2 = 0 then Some (-n) else None) + (range 0 5))); + + "filtermap odd_neg []" >:: + (fun () -> + assert_equal ~printer:(to_string string_of_int) + [-1; -3; -5] + (filtermap + (fun n -> if n mod 2 <> 0 then Some (-n) else None) + (range 0 5))) ] + + let assert_power power_a_list a_list = + assert_equal ~printer:int_list2_to_string + power_a_list + (List.sort compare_lists_by_size (power a_list)) + + let suite_power = + "power" >::: + [ "power []" >:: + (fun () -> + assert_power [[]] []); + + "power [1]" >:: + (fun () -> + assert_power [[]; [1]] [1]); + + "power [1;2]" >:: + (fun () -> + assert_power [[]; [1]; [2]; [1;2]] [1;2]); + + "power [1;2;3]" >:: + (fun () -> + assert_power + [[]; + [1]; [2]; [3]; + [1;2]; [1;3]; [2;3]; + [1;2;3]] + [1;2;3]); + + "power [1;2;3;4]" >:: + (fun () -> + assert_power + [[]; + [1]; [2]; [3]; [4]; + [1;2]; [1;3]; [1;4]; [2;3]; [2;4]; [3;4]; + [1;2;3]; [1;2;4]; [1;3;4]; [2;3;4]; + [1;2;3;4]] + [1;2;3;4]) ] + let suite_split = "split*" >::: [ "split_last []" >:: (fun () -> assert_raises (Invalid_argument "ThoList.split_last []") (fun () -> split_last [])); "split_last [1]" >:: (fun () -> assert_equal ([], 1) (split_last [1])); "split_last [2;3;1;4]" >:: (fun () -> assert_equal ([2;3;1], 4) (split_last [2;3;1;4])) ] let test_list = random_int_list 1000 100 let assert_equal_int_list = assert_equal ~printer:(to_string string_of_int) let suite_cycle = "cycle_until" >::: [ "cycle (-1) [1;2;3]" >:: (fun () -> assert_raises (Invalid_argument "ThoList.cycle") (fun () -> cycle 4 [1;2;3])); "cycle 4 [1;2;3]" >:: (fun () -> assert_raises (Invalid_argument "ThoList.cycle") (fun () -> cycle 4 [1;2;3])); "cycle 42 [...]" >:: (fun () -> let n = 42 in assert_equal_int_list (tln n test_list @ hdn n test_list) (cycle n test_list)); "cycle_until 1 []" >:: (fun () -> assert_raises (Not_found) (fun () -> cycle_until 1 [])); "cycle_until 1 [2;3;4]" >:: (fun () -> assert_raises (Not_found) (fun () -> cycle_until 1 [2;3;4])); "cycle_until 1 [1;2;3;4]" >:: (fun () -> assert_equal [1;2;3;4] (cycle_until 1 [1;2;3;4])); "cycle_until 3 [1;2;3;4]" >:: (fun () -> assert_equal [3;4;1;2] (cycle_until 3 [3;4;1;2])); "cycle_until 4 [1;2;3;4]" >:: (fun () -> assert_equal [4;1;2;3] (cycle_until 4 [4;1;2;3])) ] let suite_alist_of_list = "alist_of_list" >::: [ "simple" >:: (fun () -> assert_equal [(46, 4); (44, 2); (42, 0)] (alist_of_list ~predicate:(fun n -> n mod 2 = 0) ~offset:42 [0;1;2;3;4;5])) ] let suite_complement = "complement" >::: [ "simple" >:: (fun () -> assert_equal [2;4] (complement [1;2;3;4] [1; 3])); "empty" >:: (fun () -> assert_equal [1;2;3;4] (complement [1;2;3;4] [])); "failure" >:: (fun () -> assert_raises (Invalid_argument ("ThoList.complement")) (fun () -> complement (complement [1;2;3;4] [5]))) ] let suite = "ThoList" >::: - [suite_split; + [suite_filtermap; + suite_power; + suite_split; suite_cycle; suite_alist_of_list; suite_complement] end (*i * Local Variables: * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * compile-command:"ocamlc -o vertex thoList.ml{i,} pmap.ml{i,} vertex.ml" * End: i*) - Index: trunk/omega/src/try_ufo.sh =================================================================== --- trunk/omega/src/try_ufo.sh (revision 8415) +++ trunk/omega/src/try_ufo.sh (revision 8416) @@ -1,37 +1,37 @@ #! /bin/sh ######################################################################## # This script is for developers only and needs not to be portable. # This script takes TO's directory structure for granted. ######################################################################## # tl;dr : don't try this at home, kids ;) ######################################################################## jobs=12 -UFO_SM=$HOME/physics/SM/ -UFO_MSSM=$HOME/physics/MSSM_UFO/ +UFO_SM=../tests/UFO/SM/ +UFO_MSSM=../tests/UFO/MSSM/ UFO_SMEFT=$HOME/physics/SMEFTsim_A_U35_alphaScheme_UFO_v2_1/ UFO_SMEFT=$HOME/physics/SMEFT_mW_UFO/ root=$HOME/physics/whizard build=$root/_build/default omega=omega_UFO case X"$1" in X"-SM") UFO=$UFO_SM; shift;; X"-SMEFT") UFO=$UFO_SMEFT; shift;; X"-MSSM") UFO=$UFO_MSSM; omega=omega_UFO_Majorana; shift;; X"-X") UFO="$2"; shift 2;; *) UFO=$UFO_SM;; esac OCAMLFLAGS="-w -D -warn-error +P" make OCAMLFLAGS="$OCAMLFLAGS" -j $jobs -C $build/omega/src || exit 1 make -j $jobs -C $build/omega/bin $omega.opt || exit 1 omega="$build/omega/bin/$omega.opt -model:UFO_dir $UFO -model:exec -target:parameter_module parameters_ufo" $omega -model:write_WHIZARD > omega_amplitude.mdl ( $omega -params; $omega -scatter "$@" ) > omega_amplitude.f90 gfortran -Wall -c -I $build/omega/src/ omega_amplitude.f90 Index: trunk/omega/src/UFO_Lorentz.ml =================================================================== --- trunk/omega/src/UFO_Lorentz.ml (revision 8415) +++ trunk/omega/src/UFO_Lorentz.ml (revision 8416) @@ -1,576 +1,858 @@ (* UFO_Lorentz.ml -- Copyright (C) 1999-2017 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Processed UFO Lorentz Structures} *) module Q = Algebra.Q module QC = Algebra.QC module A = UFOx.Lorentz_Atom module D = Dirac.Chiral (* Take a [A.t list] and return the corresponding pair [A.dirac list * A.vector list * A.scalar list * A.scalar list], without preserving the order (currently, the order is reversed). *) let split_atoms atoms = List.fold_left (fun (d, v, s, i) -> function | A.Vector v' -> (d, v' :: v, s, i) | A.Dirac d' -> (d' :: d, v, s, i) | A.Scalar s' -> (d, v, s' :: s, i) | A.Inverse i' -> (d, v, s, i' :: i)) ([], [], [], []) atoms (* Just like [UFOx.Lorentz_Atom.dirac], but without the Dirac matrix indices. *) type dirac = | Gamma5 | ProjM | ProjP | Gamma of int | Sigma of int * int | C | Minus let map_indices_gamma f = function | (Gamma5 | ProjM | ProjP | C | Minus as g) -> g | Gamma mu -> Gamma (f mu) | Sigma (mu, nu) -> Sigma (f mu, f nu) (* A sandwich of a string of $\gamma$-matrices. [bra] and [ket] are positions of fields in the vertex. *) type dirac_string = { bra : int; ket : int; gammas : dirac list } let map_indices_dirac f d = { bra = f d.bra; ket = f d.ket; gammas = List.map (map_indices_gamma f) d.gammas } (* Implementation of Dirac couplings using \texttt{conjspinor\_spinor} \begin{equation} \text{\texttt{psibar0 * psi1}} = \sum_\alpha \bar\psi_{0,\alpha} \psi_{1,\alpha} = \bar\psi_0\psi_1 \end{equation} JRR's implementation of Majorana couplings using \texttt{spinor\_product} \begin{equation} \text{\texttt{chibar0 * chi1}} = \sum_{\alpha} \bar\chi_{0,\alpha} (C^T\chi_1)_\beta = \sum_{\alpha} (C\bar\chi_0^T)_\alpha \chi_{1,\alpha} = (C\bar\chi_0^T)^T \chi_1 = \tilde\chi_0^T\chi_1 \end{equation} with charge conjugation\footnote{% In detail, to make sure we understand all phases \begin{multline} \bar{\tilde\chi} = \tilde\chi^\dagger\gamma_0 = \left(C\bar\chi^T\right)^\dagger\gamma_0 = \left(C(\chi^\dagger\gamma_0)^T\right)^\dagger\gamma_0 = \left(C\gamma_0^T{\chi^\dagger}^T\right)^\dagger\gamma_0 = \left(C\gamma_0^T{\chi^T}^\dagger\right)^\dagger\gamma_0 = {\chi^T} {\gamma_0^T}^\dagger C^\dagger\gamma_0 \\ = {\chi^T} {\gamma_0^\dagger}^T C^{-1}\gamma_0 = {\chi^T} {\gamma_0}^T C^{-1}\gamma_0 = {\chi^T} C^{-1} C {\gamma_0}^T C^{-1}\gamma_0 = - {\chi^T} C^{-1} \gamma_0 \gamma_0 = - {\chi^T} C^{-1}\,. \end{multline}} \begin{subequations} \begin{align} \tilde\chi &= C\bar\chi^T \\ \bar{\tilde\chi} &= -\chi^T C^{-1} \,. \end{align} \end{subequations} So we write in JRR's implementation \begin{equation} \bar\chi_0 \Gamma \chi_1\phi = \bar\chi_0 C^T C\Gamma \chi_1\phi = (C\bar\chi_0^T)^T C\Gamma \chi_1\phi = \tilde\chi_0^T C\Gamma \chi_1\phi \end{equation} using~$C^{-1}=C^\dagger$, $C^T=-C$ and the representation dependent~$C^2=-1$ that holds in all our representation(s). Analoguously \begin{multline} \bar\chi_0 \Gamma \chi_1\phi = \left(\bar\chi_0 \Gamma \chi_1\right)^T \phi = - \chi_1^T \Gamma^T \bar\chi_0^T \phi = \bar{\tilde\chi}_1 C \Gamma^T C^{-1}\tilde\chi_0 \phi = - \chi_1^T C^{-1} C \Gamma^T C^{-1}\tilde\chi_0 \phi \\ = - \chi_1^T \Gamma^T C^{-1}\tilde\chi_0 \phi = - \chi_1^T \Gamma^T C^T \tilde\chi_0 \phi = - \chi_1^T (C\Gamma)^T \tilde\chi_0 \phi \end{multline} *) -(* \begin{dubious} - There's still something wrong with chiral projectors \ldots - \end{dubious} *) +(* In the following, we assume to be in a realization + with~$C^{-1}=-C=C^T$: *) +let inv_C = [Minus; C] + +(* In JRR's implementation of Majorana fermions + (see~\pageref{pg:JRR-Fusions}), + \emph{all} fermion-boson fusions are realized with the + \texttt{f\_}$b$\texttt{f(g,phi,chi)} functions, where + $b\in\{\text{\texttt{v}},\text{\texttt{a}},\ldots\}$. + This is different from the original Dirac implementation, where + \emph{both} \texttt{f\_}$b$\texttt{f(g,phi,psi)} + and \texttt{f\_f}$b$\texttt{(g,psibar,phi)} are used. *) + +(* However, the latter plays nicer with the permutations in the UFO + version of [fuse]. Therefore, we want to automatically map + \texttt{f\_}$b$\texttt{f(g,phi,chi)} to + \texttt{f\_f}$b$\texttt{(g,chi,phi)} by an appropriate + transformation of the $\gamma$-matrices involved. *) -(* In the following, note that~$C^{-1}=-C=C^T$: *) +(* Starting from + \begin{equation} + \text{\texttt{f\_}$b$\texttt{f(g,phi,chi)}} + \cong + \chi'_\alpha = + \sum_{\mu,\beta} \phi_\mu \Gamma^\mu_{\alpha\beta}\chi_\beta + \end{equation} + with~$\Gamma$ an appropriate product of $\gamma$-matrices, we obtain + \begin{equation} + \text{\texttt{f\_f}$b$\texttt{(g,chi,phi)}} + \cong + \chi'_\alpha + = \sum_{\mu,\beta} \phi_\mu \chi_\beta\tilde\Gamma^\mu_{\beta\alpha} + = \sum_{\mu,\beta} \phi_\mu + \left(\tilde\Gamma^\mu\right)^T_{\alpha\beta} \chi_\beta + \end{equation} + and we should require $\tilde\Gamma=\Gamma^T$. *) -let inv_c = [Minus; C] +(* We can now use the standard charge conjugation matrix relations + \begin{subequations} + \begin{align} + \mathbf{1}^T &= \mathbf{1} \\ + \gamma_\mu^T &= - C\gamma_\mu C^{-1} \\ + \sigma_{\mu\nu}^T &= C\sigma_{\nu\mu} C^{-1} + = - C\sigma_{\mu\nu} C^{-1} \\ + (\gamma_5\gamma_\mu)^T &= \gamma_\mu^T \gamma_5^T + = - C\gamma_\mu\gamma_5 C^{-1} + = C\gamma_5\gamma_\mu C^{-1} \\ + \gamma_5^T &= C\gamma_5 C^{-1} + \end{align} + \end{subequations} + to perform the transpositions symbolically. + For the chiral projectors + \begin{equation} + \gamma_\pm = \mathbf{1}\pm\gamma_5 + \end{equation} + this means\footnote{The final two equations are two different ways + to obtain the same result, of course.} + + \begin{subequations} + \begin{align} + \gamma_\pm^T + &= (\mathbf{1}\pm\gamma_5)^T + = C(\mathbf{1}\pm\gamma_5) C^{-1} = C\gamma_\pm C^{-1} \\ + (\gamma_\mu\gamma_\pm)^T + &= \gamma_\pm^T \gamma_\mu^T + = - C\gamma_\pm \gamma_\mu C^{-1} + = - C\gamma_\mu\gamma_\mp C^{-1} \\ + (\gamma_\mu\pm\gamma_\mu\gamma_5)^T + &= - C(\gamma_\mu\mp\gamma_\mu\gamma_5) C^{-1} + \end{align} + \end{subequations} + and of course + \begin{equation} + C^T = - C\,. + \end{equation} *) let transpose1 = function - | (Gamma5 | ProjM | ProjP as g) -> inv_c @ [g; C] - | (Gamma _ | Sigma (_, _) as g) -> [Minus] @ inv_c @ [g; C] + | (Gamma5 | ProjM | ProjP as g) -> [C; g] @ inv_C + | (Gamma _ | Sigma (_, _) as g) -> [Minus] @ [C; g] @ inv_C | C -> [Minus; C] | Minus -> [Minus] -let rec compress_transpose = function - | [] -> [] - | [g] -> [g] - | Minus :: Minus :: g_list -> compress_transpose g_list - | g :: g_list -> g :: compress_transpose g_list +let rec collect_signs_rev (negative, acc) = function + | [] -> (negative, acc) + | Minus :: g_list -> collect_signs_rev (not negative, acc) g_list + | g :: g_list -> collect_signs_rev (negative, g :: acc) g_list + +let rec compress_ccs_rev (negative, acc) = function + | [] -> (negative, acc) + | C :: C :: g_list -> compress_ccs_rev (not negative, acc) g_list + | g :: g_list -> compress_ccs_rev (negative, g :: acc) g_list + +let compress_signs g_list = + let negative, g_list_rev = collect_signs_rev (false, []) g_list in + match compress_ccs_rev (negative, []) g_list_rev with + | true, g_list -> Minus :: g_list + | false, g_list -> g_list let transpose d = - { d with gammas = ThoList.rev_flatmap transpose1 d.gammas } + { d with + gammas = compress_signs (ThoList.rev_flatmap transpose1 d.gammas) } + +(* Regarding the tests in \texttt{keystones\_UFO\_bispinors}, we observe% + \footnote{In components: + \begin{subequations} + \begin{align} + \text{\texttt{chi0 * f\_}$b$\texttt{f(g,phi1,chi2)}} + &\cong + \sum_{\mu,\alpha,\alpha',\beta} \phi_{1,\mu} + C_{\alpha\alpha'}\chi_{0,\alpha'} \Gamma^\mu_{\alpha\beta}\chi_{2,\beta} + = \sum_{\mu,\alpha,\alpha',\beta} \phi_{1,\mu} + \chi_{0,\alpha'} C^T_{\alpha'\alpha} + \Gamma^\mu_{\alpha\beta}\chi_{2,\beta} \\ + \text{\texttt{f\_f}$b$\texttt{(g,chi0,phi1) * chi2}} + &\cong + \sum_{\mu,\alpha,\alpha',\beta} \phi_{1,\mu} + C_{\alpha\alpha'}\chi_{0,\beta} + \tilde\Gamma^\mu_{\beta\alpha'} \chi_{2,\alpha} + =\sum_{\mu,\alpha,\alpha',\beta} \phi_{1,\mu} + \chi_{0,\beta} \tilde\Gamma^\mu_{\beta\alpha'} + C^T_{\alpha'\alpha}\chi_{2,\alpha} \\ + \text{\texttt{chi2 * f\_f}$b$\texttt{(g,chi0,phi1)}} + &\cong + \sum_{\mu,\alpha,\alpha',\beta} \phi_{1,\mu} + C_{\alpha\alpha'} \chi_{2,\alpha'} \chi_{0,\beta} + \tilde\Gamma^\mu_{\beta\alpha} + =\sum_{\mu,\alpha,\alpha',\beta} \phi_{1,\mu} + \chi_{0,\beta} + \tilde\Gamma^\mu_{\beta\alpha} C_{\alpha\alpha'} \chi_{2,\alpha'} + \end{align} + \end{subequations}} + \begin{subequations} + \begin{align} + \text{\texttt{chi0 * f\_}$b$\texttt{f(g,phi1,chi2)}} + &\cong + \phi_1^\mu (C\chi_0)^T \Gamma_\mu \chi_2 + = \phi_1^\mu \chi_0^T C^T\Gamma_\mu\chi_2 \\ + \text{\texttt{f\_f}$b$\texttt{(g,chi0,phi1) * chi2}} + &\cong + \phi_1^\mu (C(\chi_0^T\tilde\Gamma_\mu)^T)^T \chi_2 + = \phi_1 (C\tilde\Gamma_\mu^T\chi_0)^T \chi_2 + = \phi_1 \chi_0^T \tilde\Gamma_\mu C^T \chi_2 \\ + \text{\texttt{chi2 * f\_f}$b$\texttt{(g,chi0,phi1)}} + &\cong + \phi_1^\mu (C\chi_2)^T (\chi_0^T\tilde\Gamma_\mu)^T + =\phi_1^\mu \chi_0^T\tilde\Gamma_\mu C\chi_2 + \end{align} + \end{subequations} + The natural + condition~$\text{\texttt{chi0 * f\_}$b$\texttt{f(g,phi1,chi2)}} + = \text{\texttt{f\_f}$b$\texttt{(g,chi0,phi1) * chi2}}$ + can be satisfied with + \begin{equation} + C^T \Gamma_\mu = \tilde\Gamma_\mu C^T\,, + \end{equation} + i.\,e. + \begin{equation} + \tilde\Gamma_\mu = C \Gamma_\mu C^{-1}\,. + \end{equation} + This is \emph{not} compatible with with~$\tilde\Gamma_\mu=\Gamma^T_\mu$, + but we can make this work for the \texttt{keystones\_UFO\_bispinors} + tests with *) + +let conjugate d = + { d with gammas = compress_signs (C :: d.gammas @ inv_C) } + +let conjugate_transpose d = + conjugate (transpose d) + +(* The alternative + condition~$\text{\texttt{chi0 * f\_}$b$\texttt{f(g,phi1,chi2)}} + = \text{\texttt{chi2 * f\_f}$b$\texttt{(g,chi0,phi1)}}$ + would require + \begin{equation} + C^T \Gamma_\mu = \tilde\Gamma_\mu C\,, + \end{equation} + i.\,e. + \begin{equation} + \tilde\Gamma_\mu = C \Gamma_\mu C = - C \Gamma_\mu C^{-1}\,. + \end{equation} *) (* \begin{dubious} - Why not [ThoList.rev_flatmap] here? + Now make also the fusions work in + \texttt{fermi\_UFO} and \texttt{compare\_majorana\_UFO}? \end{dubious} *) -let transpose d = - { d with gammas = ThoList.flatmap transpose1 d.gammas } +let minus d = + { d with gammas = compress_signs (Minus :: d.gammas) } -let majorana1 g = - [g] +let cc_times d = + { d with gammas = compress_signs (C :: d.gammas) } -let majorana d = - { d with gammas = C :: ThoList.flatmap majorana1 d.gammas } +let times_cc_inv d = + { d with gammas = compress_signs (d.gammas @ inv_C) } (* [dirac_string bind ds] applies the mapping [bind] to the indices of $\gamma_\mu$ and~$\sigma_{\mu\nu}$ and multiplies the resulting matrices in order using complex rational arithmetic. *) module type To_Matrix = sig val dirac_string : (int -> int) -> dirac_string -> D.t end module To_Matrix : To_Matrix = struct let half = QC.make (Q.make 1 2) Q.null let half_i = QC.make Q.null (Q.make 1 2) let gamma_L = D.times half (D.sub D.unit D.gamma5) let gamma_R = D.times half (D.add D.unit D.gamma5) let sigma = Array.make_matrix 4 4 D.null let () = for mu = 0 to 3 do for nu = 0 to 3 do sigma.(mu).(nu) <- D.times half_i (D.sub (D.mul D.gamma.(mu) D.gamma.(nu)) (D.mul D.gamma.(nu) D.gamma.(mu))) done done let dirac bind_indices = function | Gamma5 -> D.gamma5 | ProjM -> gamma_L | ProjP -> gamma_R | Gamma (mu) -> D.gamma.(bind_indices mu) | Sigma (mu, nu) -> sigma.(bind_indices mu).(bind_indices nu) | C -> D.cc | Minus -> D.neg D.unit let dirac_string bind_indices ds = D.product (List.map (dirac bind_indices) ds.gammas) end let dirac_string_to_matrix = To_Matrix.dirac_string (* The Lorentz indices appearing in a term are either negative internal summation indices or positive external polarization indices. Note that the external indices are not really indices, but denote the position of the particle in the vertex. *) type 'a term = { indices : int list; atom : 'a } let map_atom f term = { term with atom = f term.atom } let map_term f_index f_atom term = { indices = List.map f_index term.indices; atom = f_atom term.atom } (* Return a pair of lists: first the (negative) summation indices, second the (positive) external indices. *) let classify_indices ilist = List.partition (fun i -> if i < 0 then true else if i > 0 then false else invalid_arg "classify_indices") ilist type contraction = { coeff : QC.t; dirac : dirac_string term list; vector : A.vector term list; scalar : A.scalar list; inverse : A.scalar list } let fermion_lines_of_contraction contraction = List.sort compare (List.map (fun term -> (term.atom.ket, term.atom.bra)) contraction.dirac) let map_indices_contraction f c = { coeff = c.coeff; dirac = List.map (map_term f (map_indices_dirac f)) c.dirac; vector = List.map (map_term f (A.map_indices_vector f)) c.vector; scalar = c.scalar; inverse = c.inverse } type t = contraction list +let rec charge_conjugate_dirac (bra, ket as fermion_line) = function + | [] -> [] + | dirac :: dirac_list -> + if dirac.atom.bra = bra && dirac.atom.ket = ket then + map_atom conjugate dirac :: dirac_list + else + dirac :: charge_conjugate_dirac fermion_line dirac_list + +let charge_conjugate_contraction fermion_line c = + { c with dirac = charge_conjugate_dirac fermion_line c.dirac } + +let charge_conjugate fermion_line l = + List.map (charge_conjugate_contraction fermion_line) l + let fermion_lines contractions = let pairs = List.map fermion_lines_of_contraction contractions in match ThoList.uniq (List.sort compare pairs) with | [] -> invalid_arg "UFO_Lorentz.fermion_lines: impossible" | [pairs] -> pairs | _ -> invalid_arg "UFO_Lorentz.fermion_lines: ambiguous" let map_indices f contractions = List.map (map_indices_contraction f) contractions let map_fermion_lines f pairs = List.map (fun (i, j) -> (f i, f j)) pairs let dirac_of_atom = function | A.Identity (_, _) -> [] | A.C (_, _) -> [C] | A.Gamma5 (_, _) -> [Gamma5] | A.ProjP (_, _) -> [ProjP] | A.ProjM (_, _) -> [ProjM] | A.Gamma (mu, _, _) -> [Gamma mu] | A.Sigma (mu, nu, _, _) -> [Sigma (mu, nu)] let dirac_indices = function | A.Identity (i, j) | A.C (i, j) | A.Gamma5 (i, j) | A.ProjP (i, j) | A.ProjM (i, j) | A.Gamma (_, i, j) | A.Sigma (_, _, i, j) -> (i, j) let rec scan_for_dirac_string stack = function | [] -> (* We're done with this pass. There must be no leftover atoms on the [stack] of spinor atoms, but we'll check this in the calling function. *) (None, List.rev stack) | atom :: atoms -> let i, j = dirac_indices atom in if i > 0 then if j > 0 then (* That's an atomic Dirac string. Collect all atoms for further processing. *) (Some { bra = i; ket = j; gammas = dirac_of_atom atom}, List.rev_append stack atoms) else (* That's the start of a new Dirac string. Search for the remaining elements, not forgetting matrices that we might pushed on the [stack] earlier. *) collect_dirac_string i j (dirac_of_atom atom) [] (List.rev_append stack atoms) else (* The interior of a Dirac string. Push it on the stack until we find the start. *) scan_for_dirac_string (atom :: stack) atoms (* Complete the string starting with [i] and the current summation index [j]. *) and collect_dirac_string i j rev_ds stack = function | [] -> (* We have consumed all atoms without finding the end of the string. *) invalid_arg "collect_dirac_string: open string" | atom :: atoms -> let i', j' = dirac_indices atom in if i' = j then if j' > 0 then (* Found the conclusion. Collect all atoms on the [stack] for further processing. *) (Some { bra = i; ket = j'; gammas = List.rev_append rev_ds (dirac_of_atom atom)}, List.rev_append stack atoms) else (* Found the continuation. Pop the stack of open indices, since we're looking for a new one. *) collect_dirac_string i j' (dirac_of_atom atom @ rev_ds) [] (List.rev_append stack atoms) else (* Either the start of another Dirac string or a non-matching continuation. Push it on the stack until we're done with the current one. *) collect_dirac_string i j rev_ds (atom :: stack) atoms let dirac_string_of_dirac_atoms atoms = scan_for_dirac_string [] atoms let rec dirac_strings_of_dirac_atoms' rev_ds atoms = match dirac_string_of_dirac_atoms atoms with | (None, []) -> List.rev rev_ds | (None, _) -> invalid_arg "dirac_string_of_dirac_atoms: leftover atoms" | (Some ds, atoms) -> dirac_strings_of_dirac_atoms' (ds :: rev_ds) atoms let dirac_strings_of_dirac_atoms atoms = dirac_strings_of_dirac_atoms' [] atoms let indices_of_vector = function | A.Epsilon (mu1, mu2, mu3, mu4) -> [mu1; mu2; mu3; mu4] | A.Metric (mu1, mu2) -> [mu1; mu2] | A.P (mu, n) -> if n > 0 then [mu] else invalid_arg "indices_of_vector: invalid momentum" let classify_vector atom = { indices = indices_of_vector atom; atom } let indices_of_dirac = function | Gamma5 | ProjM | ProjP | C | Minus -> [] | Gamma (mu) -> [mu] | Sigma (mu, nu) -> [mu; nu] let indices_of_dirac_string ds = ThoList.flatmap indices_of_dirac ds.gammas let classify_dirac atom = { indices = indices_of_dirac_string atom; atom } let contraction_of_lorentz_atoms (atoms, coeff) = let dirac_atoms, vector_atoms, scalar, inverse = split_atoms atoms in let dirac = List.map classify_dirac (dirac_strings_of_dirac_atoms dirac_atoms) and vector = List.map classify_vector vector_atoms in { coeff; dirac; vector; scalar; inverse } type redundancy = | Trace of int | Replace of int * int let rec redundant_metric' rev_atoms = function | [] -> (None, List.rev rev_atoms) | { atom = A.Metric (mu, nu) } as atom :: atoms -> if mu < 1 then if nu = mu then (Some (Trace mu), List.rev_append rev_atoms atoms) else (Some (Replace (mu, nu)), List.rev_append rev_atoms atoms) else if nu < 0 then (Some (Replace (nu, mu)), List.rev_append rev_atoms atoms) else redundant_metric' (atom :: rev_atoms) atoms | { atom = (A.Epsilon (_, _, _, _ ) | A.P (_, _) ) } as atom :: atoms -> redundant_metric' (atom :: rev_atoms) atoms let redundant_metric atoms = redundant_metric' [] atoms (* Substitude any occurance of the index [mu] by the index [nu]: *) let substitute_index_vector1 mu nu = function | A.Epsilon (mu1, mu2, mu3, mu4) as eps -> if mu = mu1 then A.Epsilon (nu, mu2, mu3, mu4) else if mu = mu2 then A.Epsilon (mu1, nu, mu3, mu4) else if mu = mu3 then A.Epsilon (mu1, mu2, nu, mu4) else if mu = mu4 then A.Epsilon (mu1, mu2, mu3, nu) else eps | A.Metric (mu1, mu2) as g -> if mu = mu1 then A.Metric (nu, mu2) else if mu = mu2 then A.Metric (mu1, nu) else g | A.P (mu1, n) as p -> if mu = mu1 then A.P (nu, n) else p let remove a alist = List.filter ((<>) a) alist let substitute_index1 mu nu mu1 = if mu = mu1 then nu else mu1 let substitute_index mu nu indices = List.map (substitute_index1 mu nu) indices (* This assumes that [mu] is a summation index and [nu] is a polarization index. *) let substitute_index_vector mu nu vectors = List.map (fun v -> { indices = substitute_index mu nu v.indices; atom = substitute_index_vector1 mu nu v.atom }) vectors (* Substitude any occurance of the index [mu] by the index [nu]: *) let substitute_index_dirac1 mu nu = function | (Gamma5 | ProjM | ProjP | C | Minus) as g -> g | Gamma (mu1) as g -> if mu = mu1 then Gamma (nu) else g | Sigma (mu1, mu2) as g -> if mu = mu1 then Sigma (nu, mu2) else if mu = mu2 then Sigma (mu1, nu) else g (* This assumes that [mu] is a summation index and [nu] is a polarization index. *) let substitute_index_dirac mu nu dirac_strings = List.map (fun ds -> { indices = substitute_index mu nu ds.indices; atom = { ds.atom with gammas = List.map (substitute_index_dirac1 mu nu) ds.atom.gammas } } ) dirac_strings let trace_metric = QC.make (Q.make 4 1) Q.null (* FIXME: can this be made typesafe by mapping to a type that \emph{only} contains [P] and [Epsilon]? *) let rec compress_metrics c = match redundant_metric c.vector with | None, _ -> c | Some (Trace mu), vector' -> compress_metrics { coeff = QC.mul trace_metric c.coeff; dirac = c.dirac; vector = vector'; scalar = c.scalar; inverse = c.inverse } | Some (Replace (mu, nu)), vector' -> compress_metrics { coeff = c.coeff; dirac = substitute_index_dirac mu nu c.dirac; vector = substitute_index_vector mu nu vector'; scalar = c.scalar; inverse = c.inverse } let dummy = [] let parse1 spins atom = compress_metrics (contraction_of_lorentz_atoms atom) let parse spins l = List.map (parse1 spins) l let i2s = UFOx.Index.to_string let vector_to_string = function | A.Epsilon (mu, nu, ka, la) -> Printf.sprintf "Epsilon(%s,%s,%s,%s)" (i2s mu) (i2s nu) (i2s ka) (i2s la) | A.Metric (mu, nu) -> Printf.sprintf "Metric(%s,%s)" (i2s mu) (i2s nu) | A.P (mu, n) -> Printf.sprintf "P(%s,%d)" (i2s mu) n let dirac_to_string = function | Gamma5 -> "g5" | ProjM -> "(1-g5)/2" | ProjP -> "(1+g5)/2" | Gamma (mu) -> Printf.sprintf "g(%s)" (i2s mu) | Sigma (mu, nu) -> Printf.sprintf "s(%s,%s)" (i2s mu) (i2s nu) | C -> "C" | Minus -> "-1" let dirac_string_to_string ds = match ds.gammas with | [] -> Printf.sprintf "<%s|%s>" (i2s ds.bra) (i2s ds.ket) | gammas -> Printf.sprintf "<%s|%s|%s>" (i2s ds.bra) (String.concat "*" (List.map dirac_to_string gammas)) (i2s ds.ket) let scalar_to_string = function | A.Mass _ -> "m" | A.Width _ -> "w" let contraction_to_string c = String.concat " * " (List.concat [if QC.is_unit c.coeff then [] else [QC.to_string c.coeff]; List.map (fun ds -> dirac_string_to_string ds.atom) c.dirac; List.map (fun v -> vector_to_string v.atom) c.vector; List.map scalar_to_string c.scalar]) ^ (match c.inverse with | [] -> "" | inverse -> " / (" ^ String.concat "*" (List.map scalar_to_string inverse) ^ ")") let fermion_lines_to_string fermion_lines = ThoList.to_string (fun (bra, ket) -> Printf.sprintf "%s->%s" (i2s bra) (i2s ket)) fermion_lines let to_string contractions = String.concat " + " (List.map contraction_to_string contractions) + +module type Test = + sig + val suite : OUnit.test + end + +module Test : Test = + struct + + open OUnit + + let braket gammas = + { bra = 11; ket = 22; gammas } + + let assert_transpose gt g = + assert_equal ~printer:dirac_string_to_string + (braket gt) (transpose (braket g)) + + let assert_conjugate_transpose gct g = + assert_equal ~printer:dirac_string_to_string + (braket gct) (conjugate_transpose (braket g)) + + let suite_transpose = + "transpose" >::: + + [ "identity" >:: + (fun () -> + assert_transpose [] []); + + "gamma_mu" >:: + (fun () -> + assert_transpose [C; Gamma 1; C] [Gamma 1]); + + "sigma_munu" >:: + (fun () -> + assert_transpose [C; Sigma (1, 2); C] [Sigma (1, 2)]); + + "gamma_5*gamma_mu" >:: + (fun () -> + assert_transpose + [C; Gamma 1; Gamma5; C] + [Gamma5; Gamma 1]); + + "gamma5" >:: + (fun () -> + assert_transpose [Minus; C; Gamma5; C] [Gamma5]); + + "gamma+" >:: + (fun () -> + assert_transpose [Minus; C; ProjP; C] [ProjP]); + + "gamma-" >:: + (fun () -> + assert_transpose [Minus; C; ProjM; C] [ProjM]); + + "gamma_mu*gamma_nu" >:: + (fun () -> + assert_transpose + [Minus; C; Gamma 2; Gamma 1; C] + [Gamma 1; Gamma 2]); + + "gamma_mu*gamma_nu*gamma_la" >:: + (fun () -> + assert_transpose + [C; Gamma 3; Gamma 2; Gamma 1; C] + [Gamma 1; Gamma 2; Gamma 3]); + + "gamma_mu*gamma+" >:: + (fun () -> + assert_transpose + [C; ProjP; Gamma 1; C] + [Gamma 1; ProjP]); + + "gamma_mu*gamma-" >:: + (fun () -> + assert_transpose + [C; ProjM; Gamma 1; C] + [Gamma 1; ProjM]) ] + + let suite_conjugate_transpose = + "conjugate_transpose" >::: + + [ "identity" >:: + (fun () -> + assert_conjugate_transpose [] []); + + "gamma_mu" >:: + (fun () -> + assert_conjugate_transpose [Minus; Gamma 1] [Gamma 1]); + + "sigma_munu" >:: + (fun () -> + assert_conjugate_transpose [Minus; Sigma (1, 2)] [Sigma (1,2)]); + + "gamma_mu*gamma5" >:: + (fun () -> + assert_conjugate_transpose + [Minus; Gamma5; Gamma 1] [Gamma 1; Gamma5]); + + "gamma5" >:: + (fun () -> + assert_conjugate_transpose [Gamma5] [Gamma5]) ] + + let suite = + "UFO_Lorentz" >::: + [suite_transpose; + suite_conjugate_transpose] + + end Index: trunk/omega/src/omega_SM_top.ml =================================================================== --- trunk/omega/src/omega_SM_top.ml (revision 8415) +++ trunk/omega/src/omega_SM_top.ml (revision 8416) @@ -1,628 +1,629 @@ (* omega_SM_top.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{SM with charge $4/3$ top} *) module type SM_flags = sig val include_anomalous : bool val k_matrix : bool end module SM_no_anomalous : SM_flags = struct let include_anomalous = false let k_matrix = false end module SM_gluons : SM_flags = struct let include_anomalous = false let k_matrix = false end module Anomtop (Flags : SM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width" ] + let caveats () = [] type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Models.Anomtop.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", [O H]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = ThoList.flatmap snd (external_flavors ()) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> Scalar let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H -> Prop_Scalar end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM_top.generation': " ^ string_of_int n) let generation f = match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U (1|2) -> 2//3 | U ((-1)|(-2)) -> -2//3 | U 3 -> -4//3 | U (-3) -> 4//3 | U n -> invalid_arg ("SM_top.charge: up quark " ^ string_of_int n) | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 -> 0//1 | Phip -> 1//1 | Phim -> -1//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | Vev | Q_lepton | Q_up | Q_down | Q_top | G_CC | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_NC_top | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Htautau | G_H3 | G_H4 | Gs | I_Gs | G2 | Mass of flavor | Width of flavor (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | _ -> (0,0) let input_parameters = [] let derived_parameters = [] let derived_parameter_arrays = [] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let electromagnetic_currents' n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let em_up_type_currents = List.map mgm [ ((U (-1), Ga, U 1), FBF (1, Psibar, V, Psi), Q_up); ((U (-2), Ga, U 2), FBF (1, Psibar, V, Psi), Q_up); ((U (-3), Ga, U 3), FBF (1, Psibar, V, Psi), Q_top)] let electromagnetic_currents = ThoList.flatmap electromagnetic_currents' [1;2;3] @ em_up_type_currents let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents' n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] let neutral_up_type_currents = List.map mgm [ ((U (-1), Z, U 1), FBF (1, Psibar, VA, Psi), G_NC_up); ((U (-2), Z, U 2), FBF (1, Psibar, VA, Psi), G_NC_up); ((U (-3), Z, U 3), FBF (1, Psibar, VA, Psi), G_NC_top) ] let neutral_currents = ThoList.flatmap neutral_currents' [1;2;3] @ neutral_up_type_currents (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents' n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_up_currents = List.map mgm [ ((U (-1), Wp, D 1), FBF (1, Psibar, VL, Psi), G_CC); ((U (-2), Wp, D 2), FBF (1, Psibar, VL, Psi), G_CC); ((U (-3), Wm, D 3), FBF (1, Psibar, VL, Psi), G_CC); ((D (-1), Wm, U 1), FBF (1, Psibar, VL, Psi), G_CC); ((D (-2), Wm, U 2), FBF (1, Psibar, VL, Psi), G_CC); ((D (-3), Wp, U 3), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents = ThoList.flatmap charged_currents' [1;2;3] @ charged_up_currents let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] let gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] let vertices3 = (electromagnetic_currents @ ThoList.flatmap color_currents [1;2;3] @ neutral_currents @ charged_currents @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ goldstone_vertices) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | _ -> invalid_arg "Models.Anomtop.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Models.Anomtop.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Models.Anomtop.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Models.Anomtop.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Models.Anomtop.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Models.Anomtop.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Models.Anomtop.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Models.Anomtop.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Models.Anomtop.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 end let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | Q_top -> "qtop" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_NC_top -> "gnctop" | G_CC -> "gcc" | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f end module O = Omega.Make(Fusion.Mixed23)(Targets.Fortran) (Anomtop(SM_no_anomalous)) let _ = O.main () (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/omega_SM_Majorana_legacy.ml =================================================================== --- trunk/omega/src/omega_SM_Majorana_legacy.ml (revision 0) +++ trunk/omega/src/omega_SM_Majorana_legacy.ml (revision 8416) @@ -0,0 +1,36 @@ +(* omega_SM_Maj.ml -- + + Copyright (C) 1999-2019 by + + Wolfgang Kilian + Thorsten Ohl + Juergen Reuter + with contributions from + Christian Speckner + + WHIZARD is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + WHIZARD is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) + +module O = Omega.Make + (Fusion_vintage.Mixed23_Majorana)(Targets.Fortran_Majorana) + (Modellib_SM.SM(Modellib_SM.SM_no_anomalous)) +let _ = O.main () + +(*i + * Local Variables: + * mode:caml + * indent-tabs-mode:nil + * page-delimiter:"^(\\* .*\n" + * End: +i*) Index: trunk/omega/src/modellib_SM.ml =================================================================== --- trunk/omega/src/modellib_SM.ml (revision 8415) +++ trunk/omega/src/modellib_SM.ml (revision 8416) @@ -1,2914 +1,2921 @@ (* modellib_SM.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Fabian Bach (only parts of this file) So Young Shim (only parts of this file) WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{$\phi^3$} *) module Phi3 = struct open Coupling let options = Options.empty + let caveats () = [] type flavor = Phi let external_flavors () = [ "", [Phi]] let flavors () = ThoList.flatmap snd (external_flavors ()) type gauge = unit type constant = G type orders = unit let orders = function | _ -> () let lorentz _ = Scalar let color _ = Color.Singlet let nc () = 0 let propagator _ = Prop_Scalar let width _ = Timelike let goldstone _ = None let conjugate f = f let fermion _ = 0 module Ch = Charges.Null let charges _ = () module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let vertices () = ([(Phi, Phi, Phi), Scalar_Scalar_Scalar 1, G], [], []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 3 let parameters () = { input = [G, 1.0]; derived = []; derived_arrays = [] } let flavor_of_string = function | "p" -> Phi | _ -> invalid_arg "Modellib.Phi3.flavor_of_string" let flavor_to_string Phi = "phi" let flavor_to_TeX Phi = "\\phi" let flavor_symbol Phi = "phi" let gauge_symbol () = failwith "Modellib.Phi3.gauge_symbol: internal error" let pdg _ = 1 let mass_symbol _ = "m" let width_symbol _ = "w" let constant_symbol G = "g" end (* \thocwmodulesection{$\lambda_3\phi^3+\lambda_4\phi^4$} *) module Phi4 = struct open Coupling let options = Options.empty + let caveats () = [] type flavor = Phi let external_flavors () = [ "", [Phi]] let flavors () = ThoList.flatmap snd (external_flavors ()) type gauge = unit type constant = G3 | G4 type orders = unit let orders = function | _ -> () let lorentz _ = Scalar let color _ = Color.Singlet let nc () = 0 let propagator _ = Prop_Scalar let width _ = Timelike let goldstone _ = None let conjugate f = f let fermion _ = 0 module Ch = Charges.Null let charges _ = () module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let vertices () = ([(Phi, Phi, Phi), Scalar_Scalar_Scalar 1, G3], [(Phi, Phi, Phi, Phi), Scalar4 1, G4], []) let fuse2 _ = failwith "Modellib.Phi4.fuse2" let fuse3 _ = failwith "Modellib.Phi4.fuse3" let fuse = function | [] | [_] -> invalid_arg "Modellib.Phi4.fuse" | [_; _] -> [Phi, V3 (Scalar_Scalar_Scalar 1, F23, G3)] | [_; _; _] -> [Phi, V4 (Scalar4 1, F234, G4)] | _ -> [] let max_degree () = 4 let parameters () = { input = [G3, 1.0; G4, 1.0]; derived = []; derived_arrays = [] } let flavor_of_string = function | "p" -> Phi | _ -> invalid_arg "Modellib.Phi4.flavor_of_string" let flavor_to_string Phi = "phi" let flavor_to_TeX Phi = "\\phi" let flavor_symbol Phi = "phi" let gauge_symbol () = failwith "Modellib.Phi4.gauge_symbol: internal error" let pdg _ = 1 let mass_symbol _ = "m" let width_symbol _ = "w" let constant_symbol = function | G3 -> "g3" | G4 -> "g4" end (* \thocwmodulesection{Quantum Electro Dynamics} *) module QED = struct open Coupling let options = Options.empty + let caveats () = [] type flavor = | Electron | Positron | Muon | AntiMuon | Tau | AntiTau | Photon let external_flavors () = [ "Leptons", [Electron; Positron; Muon; AntiMuon; Tau; AntiTau]; "Gauge Bosons", [Photon] ] let flavors () = ThoList.flatmap snd (external_flavors ()) type gauge = unit type constant = Q type orders = unit let orders = function | _ -> () let lorentz = function | Electron | Muon | Tau -> Spinor | Positron | AntiMuon | AntiTau -> ConjSpinor | Photon -> Vector let color _ = Color.Singlet let nc () = 0 let propagator = function | Electron | Muon | Tau -> Prop_Spinor | Positron | AntiMuon | AntiTau -> Prop_ConjSpinor | Photon -> Prop_Feynman let width _ = Timelike let goldstone _ = None let conjugate = function | Electron -> Positron | Positron -> Electron | Muon -> AntiMuon | AntiMuon -> Muon | Tau -> AntiTau | AntiTau -> Tau | Photon -> Photon let fermion = function | Electron | Muon | Tau -> 1 | Positron | AntiMuon | AntiTau -> -1 | Photon -> 0 (* Taking generation numbers makes electric charge redundant. *) module Ch = Charges.ZZ let charges = function | Electron -> [1; 0; 0] | Muon -> [0; 1; 0] | Tau -> [0; 0; 1] | Positron -> [-1;0; 0] | AntiMuon -> [0;-1; 0] | AntiTau -> [0; 0;-1] | Photon -> [0; 0; 0] module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let vertices () = ([(Positron, Photon, Electron), FBF (1, Psibar, V, Psi), Q; (AntiMuon, Photon, Muon), FBF (1, Psibar, V, Psi), Q; (AntiTau, Photon, Tau), FBF (1, Psibar, V, Psi), Q], [], []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 3 let parameters () = { input = [Q, 1.0]; derived = []; derived_arrays = [] } let flavor_of_string = function | "e-" -> Electron | "e+" -> Positron | "m-" -> Muon | "m+" -> AntiMuon | "t-" -> Tau | "t+" -> AntiTau | "A" -> Photon | _ -> invalid_arg "Modellib.QED.flavor_of_string" let flavor_to_string = function | Electron -> "e-" | Positron -> "e+" | Muon -> "m-" | AntiMuon -> "m+" | Tau -> "t-" | AntiTau -> "t+" | Photon -> "A" let flavor_to_TeX = function | Electron -> "e^-" | Positron -> "e^+" | Muon -> "\\mu^-" | AntiMuon -> "\\mu^+" | Tau -> "^\\tau^-" | AntiTau -> "\\tau+^" | Photon -> "\\gamma" let flavor_symbol = function | Electron -> "ele" | Positron -> "pos" | Muon -> "muo" | AntiMuon -> "amu" | Tau -> "tau" | AntiTau -> "ata" | Photon -> "gam" let gauge_symbol () = failwith "Modellib.QED.gauge_symbol: internal error" let pdg = function | Electron -> 11 | Positron -> -11 | Muon -> 13 | AntiMuon -> -13 | Tau -> 15 | AntiTau -> -15 | Photon -> 22 let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Q -> "qlep" end (* \thocwmodulesection{Quantum Chromo Dynamics} *) module QCD = struct open Coupling let options = Options.empty + let caveats () = [] type flavor = | U | Ubar | D | Dbar | C | Cbar | S | Sbar | T | Tbar | B | Bbar | Gl let external_flavors () = [ "Quarks", [U; D; C; S; T; B; Ubar; Dbar; Cbar; Sbar; Tbar; Bbar]; "Gauge Bosons", [Gl]] let flavors () = ThoList.flatmap snd (external_flavors ()) type gauge = unit type constant = Gs | G2 | I_Gs type orders = unit let orders = function | _ -> () let lorentz = function | U | D | C | S | T | B -> Spinor | Ubar | Dbar | Cbar | Sbar | Tbar | Bbar -> ConjSpinor | Gl -> Vector let color = function | U | D | C | S | T | B -> Color.SUN 3 | Ubar | Dbar | Cbar | Sbar | Tbar | Bbar -> Color.SUN (-3) | Gl -> Color.AdjSUN 3 let nc () = 3 let propagator = function | U | D | C | S | T | B -> Prop_Spinor | Ubar | Dbar | Cbar | Sbar | Tbar | Bbar -> Prop_ConjSpinor | Gl -> Prop_Feynman let width _ = Timelike let goldstone _ = None let conjugate = function | U -> Ubar | D -> Dbar | C -> Cbar | S -> Sbar | T -> Tbar | B -> Bbar | Ubar -> U | Dbar -> D | Cbar -> C | Sbar -> S | Tbar -> T | Bbar -> B | Gl -> Gl let fermion = function | U | D | C | S | T | B -> 1 | Ubar | Dbar | Cbar | Sbar | Tbar | Bbar -> -1 | Gl -> 0 module Ch = Charges.ZZ let charges = function | D -> [1; 0; 0; 0; 0; 0] | U -> [0; 1; 0; 0; 0; 0] | S -> [0; 0; 1; 0; 0; 0] | C -> [0; 0; 0; 1; 0; 0] | B -> [0; 0; 0; 0; 1; 0] | T -> [0; 0; 0; 0; 0; 1] | Dbar -> [-1; 0; 0; 0; 0; 0] | Ubar -> [0; -1; 0; 0; 0; 0] | Sbar -> [0; 0; -1; 0; 0; 0] | Cbar -> [0; 0; 0; -1; 0; 0] | Bbar -> [0; 0; 0; 0; -1; 0] | Tbar -> [0; 0; 0; 0; 0; -1] | Gl -> [0; 0; 0; 0; 0; 0] module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* This is compatible with CD+. *) let color_current = [ ((Dbar, Gl, D), FBF ((-1), Psibar, V, Psi), Gs); ((Ubar, Gl, U), FBF ((-1), Psibar, V, Psi), Gs); ((Cbar, Gl, C), FBF ((-1), Psibar, V, Psi), Gs); ((Sbar, Gl, S), FBF ((-1), Psibar, V, Psi), Gs); ((Tbar, Gl, T), FBF ((-1), Psibar, V, Psi), Gs); ((Bbar, Gl, B), FBF ((-1), Psibar, V, Psi), Gs)] let three_gluon = [ ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let four_gluon = [ ((Gl, Gl, Gl, Gl), gauge4, G2)] let vertices3 = (color_current @ three_gluon) let vertices4 = four_gluon let vertices () = (vertices3, vertices4, []) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let parameters () = { input = [Gs, 1.0]; derived = []; derived_arrays = [] } let flavor_of_string = function | "u" -> U | "d" -> D | "c" -> C | "s" -> S | "t" -> T | "b" -> B | "ubar" -> Ubar | "dbar" -> Dbar | "cbar" -> Cbar | "sbar" -> Sbar | "tbar" -> Tbar | "bbar" -> Bbar | "gl" -> Gl | _ -> invalid_arg "Modellib.QCD.flavor_of_string" let flavor_to_string = function | U -> "u" | Ubar -> "ubar" | D -> "d" | Dbar -> "dbar" | C -> "c" | Cbar -> "cbar" | S -> "s" | Sbar -> "sbar" | T -> "t" | Tbar -> "tbar" | B -> "b" | Bbar -> "bbar" | Gl -> "gl" let flavor_to_TeX = function | U -> "u" | Ubar -> "\\bar{u}" | D -> "d" | Dbar -> "\\bar{d}" | C -> "c" | Cbar -> "\\bar{c}" | S -> "s" | Sbar -> "\\bar{s}" | T -> "t" | Tbar -> "\\bar{t}" | B -> "b" | Bbar -> "\\bar{b}" | Gl -> "g" let flavor_symbol = function | U -> "u" | Ubar -> "ubar" | D -> "d" | Dbar -> "dbar" | C -> "c" | Cbar -> "cbar" | S -> "s" | Sbar -> "sbar" | T -> "t" | Tbar -> "tbar" | B -> "b" | Bbar -> "bbar" | Gl -> "gl" let gauge_symbol () = failwith "Modellib.QCD.gauge_symbol: internal error" let pdg = function | D -> 1 | Dbar -> -1 | U -> 2 | Ubar -> -2 | S -> 3 | Sbar -> -3 | C -> 4 | Cbar -> -4 | B -> 5 | Bbar -> -5 | T -> 6 | Tbar -> -6 | Gl -> 21 let mass_symbol f = "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | I_Gs -> "(0,1)*gs" | Gs -> "gs" | G2 -> "gs**2" end (* \thocwmodulesection{Complete Minimal Standard Model (Unitarity Gauge)} *) module type SM_flags = sig val higgs_triangle : bool (* $H\gamma\gamma$, $Hg\gamma$ and $Hgg$ couplings *) val higgs_hmm : bool (* $H\mu^+\mu^-$ and $He^+e^-$ couplings *) val triple_anom : bool val quartic_anom : bool val higgs_anom : bool val dim6 : bool val k_matrix : bool val ckm_present : bool val top_anom : bool val top_anom_4f : bool val tt_threshold : bool end module SM_no_anomalous : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = false let k_matrix = false let ckm_present = false let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_no_anomalous_ckm : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = false let k_matrix = false let ckm_present = true let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_anomalous : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = true let quartic_anom = true let higgs_anom = true let dim6 = false let k_matrix = false let ckm_present = false let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_anomalous_ckm : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = true let quartic_anom = true let higgs_anom = true let dim6 = false let k_matrix = false let ckm_present = true let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_k_matrix : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = true let higgs_anom = false let dim6 = false let k_matrix = true let ckm_present = false let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_Higgs : SM_flags = struct let higgs_triangle = true let higgs_hmm = true let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = false let k_matrix = false let ckm_present = false let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_Higgs_CKM : SM_flags = struct let higgs_triangle = true let higgs_hmm = true let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = false let k_matrix = false let ckm_present = true let top_anom = false let top_anom_4f = false let tt_threshold = false end module SM_anomalous_top : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = false let k_matrix = false let ckm_present = false let top_anom = true let top_anom_4f = true let tt_threshold = false end module SM_tt_threshold : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = false let k_matrix = false let ckm_present = true let top_anom = false let top_anom_4f = false let tt_threshold = true end module SM_dim6 : SM_flags = struct let higgs_triangle = false let higgs_hmm = false let triple_anom = false let quartic_anom = false let higgs_anom = false let dim6 = true let k_matrix = false let ckm_present = false let top_anom = false let top_anom_4f = false let tt_threshold = false end (* \thocwmodulesection{Complete Minimal Standard Model (including some extensions)} *) module SM (Flags : SM_flags) = struct open Coupling let default_width = ref Timelike let use_fudged_width = ref false let options = Options.create [ "constant_width", Arg.Unit (fun () -> default_width := Constant), "use constant width (also in t-channel)"; "fudged_width", Arg.Set use_fudged_width, "use fudge factor for charge particle width"; "custom_width", Arg.String (fun f -> default_width := Custom f), "use custom width"; "cancel_widths", Arg.Unit (fun () -> default_width := Vanishing), "use vanishing width"; "cms_width", Arg.Unit (fun () -> default_width := Complex_Mass), "use complex mass scheme"; "running_width", Arg.Unit (fun () -> default_width := Running), "use running width" ] + let caveats () = [] type f_aux_top = TTGG | TBWA | TBWZ | TTWW | BBWW | TCGG | TUGG (*i top auxiliary field "flavors" i*) | QGUG | QBUB | QW | DL | DR | QUQD1L | QUQD1R | QUQD8L | QUQD8R type matter_field = L of int | N of int | U of int | D of int type gauge_boson = Ga | Wp | Wm | Z | Gl type other = Phip | Phim | Phi0 | H | Aux_top of int*int*int*bool*f_aux_top (*i lorentz*color*charge*top-side*flavor i*) type flavor = M of matter_field | G of gauge_boson | O of other let matter_field f = M f let gauge_boson f = G f let other f = O f type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f type gauge = unit let gauge_symbol () = failwith "Modellib.SM.gauge_symbol: internal error" let family n = List.map matter_field [ L n; N n; U n; D n ] let rec aux_top_flavors (f,l,co,ch) = List.append ( List.map other [ Aux_top (l,co,ch/2,true,f); Aux_top (l,co,ch/2,false,f) ] ) ( if ch > 1 then List.append ( List.map other [ Aux_top (l,co,-ch/2,true,f); Aux_top (l,co,-ch/2,false,f) ] ) ( aux_top_flavors (f,l,co,(ch-2)) ) else [] ) let external_flavors () = [ "1st Generation", ThoList.flatmap family [1; -1]; "2nd Generation", ThoList.flatmap family [2; -2]; "3rd Generation", ThoList.flatmap family [3; -3]; "Gauge Bosons", List.map gauge_boson [Ga; Z; Wp; Wm; Gl]; "Higgs", List.map other [H]; "Goldstone Bosons", List.map other [Phip; Phim; Phi0] ] let flavors () = List.append ( ThoList.flatmap snd (external_flavors ()) ) ( ThoList.flatmap aux_top_flavors [ (TTGG,2,1,1); (TCGG,2,1,1); (TUGG,2,1,1); (TBWA,2,0,2); (TBWZ,2,0,2); (TTWW,2,0,1); (BBWW,2,0,1); (QGUG,1,1,1); (QBUB,1,0,1); (QW,1,0,3); (DL,0,0,3); (DR,0,0,3); (QUQD1L,0,0,3); (QUQD1R,0,0,3); (QUQD8L,0,1,3); (QUQD8R,0,1,3) ] ) let spinor n = if n >= 0 then Spinor else ConjSpinor let lorentz_aux = function | 2 -> Tensor_1 | 1 -> Vector | 0 -> Scalar | _ -> invalid_arg ("SM.lorentz_aux: wrong value") let lorentz = function | M f -> begin match f with | L n -> spinor n | N n -> spinor n | U n -> spinor n | D n -> spinor n end | G f -> begin match f with | Ga | Gl -> Vector | Wp | Wm | Z -> Massive_Vector end | O f -> begin match f with | Aux_top (l,_,_,_,_) -> lorentz_aux l | _ -> Scalar end let color = function | M (U n) -> Color.SUN (if n > 0 then 3 else -3) | M (D n) -> Color.SUN (if n > 0 then 3 else -3) | G Gl -> Color.AdjSUN 3 | O (Aux_top (_,co,_,_,_)) -> if co == 0 then Color.Singlet else Color.AdjSUN 3 | _ -> Color.Singlet let nc () = 3 let prop_spinor n = if n >= 0 then Prop_Spinor else Prop_ConjSpinor let prop_aux = function | 2 -> Aux_Tensor_1 | 1 -> Aux_Vector | 0 -> Aux_Scalar | _ -> invalid_arg ("SM.prop_aux: wrong value") let propagator = function | M f -> begin match f with | L n -> prop_spinor n | N n -> prop_spinor n | U n -> prop_spinor n | D n -> prop_spinor n end | G f -> begin match f with | Ga | Gl -> Prop_Feynman | Wp | Wm | Z -> Prop_Unitarity end | O f -> begin match f with | Phip | Phim | Phi0 -> Only_Insertion | H -> Prop_Scalar | Aux_top (l,_,_,_,_) -> prop_aux l end (* Optionally, ask for the fudge factor treatment for the widths of charged particles. Currently, this only applies to $W^\pm$ and top. *) let width f = if !use_fudged_width then match f with | G Wp | G Wm | M (U 3) | M (U (-3)) -> Fudged | _ -> !default_width else !default_width let goldstone = function | G f -> begin match f with | Wp -> Some (O Phip, Coupling.Integer 1) | Wm -> Some (O Phim, Coupling.Integer 1) | Z -> Some (O Phi0, Coupling.Integer 1) | _ -> None end | _ -> None let conjugate = function | M f -> M (begin match f with | L n -> L (-n) | N n -> N (-n) | U n -> U (-n) | D n -> D (-n) end) | G f -> G (begin match f with | Gl -> Gl | Ga -> Ga | Z -> Z | Wp -> Wm | Wm -> Wp end) | O f -> O (begin match f with | Phip -> Phim | Phim -> Phip | Phi0 -> Phi0 | H -> H | Aux_top (l,co,ch,n,f) -> Aux_top (l,co,(-ch),(not n),f) end) let fermion = function | M f -> begin match f with | L n -> if n > 0 then 1 else -1 | N n -> if n > 0 then 1 else -1 | U n -> if n > 0 then 1 else -1 | D n -> if n > 0 then 1 else -1 end | G f -> begin match f with | Gl | Ga | Z | Wp | Wm -> 0 end | O _ -> 0 (* Electrical charge, lepton number, baryon number. We could avoid the rationals altogether by multiplying the first and last by 3 \ldots *) module Ch = Charges.QQ let ( // ) = Algebra.Small_Rational.make let generation' = function | 1 -> [ 1//1; 0//1; 0//1] | 2 -> [ 0//1; 1//1; 0//1] | 3 -> [ 0//1; 0//1; 1//1] | -1 -> [-1//1; 0//1; 0//1] | -2 -> [ 0//1; -1//1; 0//1] | -3 -> [ 0//1; 0//1; -1//1] | n -> invalid_arg ("SM.generation': " ^ string_of_int n) (* Generation is not a good quantum number for models with flavor mixing, i.e. if CKM mixing is present. Also, for the FCNC vertices implemented in the SM variant with anomalous top couplings it is not a valid symmetry. *) let generation f = if (Flags.ckm_present || Flags.top_anom) then [] else match f with | M (L n | N n | U n | D n) -> generation' n | G _ | O _ -> [0//1; 0//1; 0//1] let charge = function | M f -> begin match f with | L n -> if n > 0 then -1//1 else 1//1 | N n -> 0//1 | U n -> if n > 0 then 2//3 else -2//3 | D n -> if n > 0 then -1//3 else 1//3 end | G f -> begin match f with | Gl | Ga | Z -> 0//1 | Wp -> 1//1 | Wm -> -1//1 end | O f -> begin match f with | H | Phi0 -> 0//1 | Phip -> 1//1 | Phim -> -1//1 | Aux_top (_,_,ch,_,_) -> ch//1 end let lepton = function | M f -> begin match f with | L n | N n -> if n > 0 then 1//1 else -1//1 | U _ | D _ -> 0//1 end | G _ | O _ -> 0//1 let baryon = function | M f -> begin match f with | L _ | N _ -> 0//1 | U n | D n -> if n > 0 then 1//1 else -1//1 end | G _ | O _ -> 0//1 let charges f = [ charge f; lepton f; baryon f] @ generation f type constant = | Unit | Half | Pi | Alpha_QED | Sin2thw | Sinthw | Costhw | E | G_weak | I_G_weak | Vev | Q_lepton | Q_up | Q_down | G_CC | G_CCQ of int*int | G_NC_neutrino | G_NC_lepton | G_NC_up | G_NC_down | G_TVA_ttA | G_TVA_bbA | G_TVA_tuA | G_TVA_tcA | G_TVA_tcZ | G_TVA_tuZ | G_TVA_bbZ | G_VLR_ttZ | G_TVA_ttZ | G_VLR_tcZ | G_VLR_tuZ | VA_ILC_ttA | VA_ILC_ttZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWZ | G_TRL_tbWZ | G_TLR_btWA | G_TRL_tbWA | G_TVA_ttWW | G_TVA_bbWW | G_TVA_ttG | G_TVA_ttGG | G_TVA_tcG | G_TVA_tcGG | G_TVA_tuG | G_TVA_tuGG | G_SP_ttH | G_VLR_qGuG | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | C_quqd1R_bt | C_quqd1R_tb | C_quqd1L_bt | C_quqd1L_tb | C_quqd8R_bt | C_quqd8R_tb | C_quqd8L_bt | C_quqd8L_tb | I_Q_W | I_G_ZWW | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | I_G1_AWW | I_G1_ZWW | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_lambda_AWW | I_lambda_ZWW | G5_AWW | G5_ZWW | I_kappa5_AWW | I_kappa5_ZWW | I_lambda5_AWW | I_lambda5_ZWW | Alpha_WWWW0 | Alpha_ZZWW1 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZZZ | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T | G_HWW | G_HHWW | G_HZZ | G_HHZZ | G_Htt | G_Hbb | G_Hcc | G_Hss | G_Hmm | G_Hee | G_Htautau | G_H3 | G_H4 | G_HGaZ | G_HGaGa | G_Hgg | G_HGaZ_anom | G_HGaGa_anom | G_HZZ_anom | G_HWW_anom | G_HGaZ_u | G_HZZ_u | G_HWW_u | Gs | I_Gs | G2 | Mass of flavor | Width of flavor | K_Matrix_Coeff of int | K_Matrix_Pole of int | I_Dim6_AWW_Gauge | I_Dim6_AWW_GGG | I_Dim6_AWW_DP | I_Dim6_AWW_DW | I_Dim6_WWZ_W | I_Dim6_WWZ_DPWDW | I_Dim6_WWZ_DW | I_Dim6_WWZ_D (*i | I_Dim6_GGG_G | I_Dim6_GGG_CG i*) | G_HZZ6_V3 | G_HZZ6_D | G_HZZ6_DP | G_HZZ6_PB | G_HWW_6_D | G_HWW_6_DP | G_HGaZ6_D | G_HGaZ6_DP | G_HGaZ6_PB | G_HGaGa6 | Dim6_vev3 | Dim6_Cphi | Anom_Dim6_AAWW_DW | Anom_Dim6_AAWW_W | Anom_Dim6_H4_v2 | Anom_Dim6_H4_P2 | Anom_Dim6_AHWW_DPB | Anom_Dim6_AHWW_DPW | Anom_Dim6_AHWW_DW | Anom_Dim6_HHWW_DW | Anom_Dim6_HHWW_DPW | Anom_Dim6_HWWZ_DW | Anom_Dim6_HWWZ_DDPW | Anom_Dim6_HWWZ_DPW | Anom_Dim6_HWWZ_DPB | Anom_Dim6_AHHZ_D | Anom_Dim6_AHHZ_DP | Anom_Dim6_AHHZ_PB | Anom_Dim6_AZWW_W | Anom_Dim6_AZWW_DWDPW | Anom_Dim6_WWWW_W | Anom_Dim6_WWWW_DWDPW | Anom_Dim6_WWZZ_W | Anom_Dim6_WWZZ_DWDPW | Anom_Dim6_HHAA | Anom_Dim6_HHZZ_D | Anom_Dim6_HHZZ_DP | Anom_Dim6_HHZZ_PB | Anom_Dim6_HHZZ_T (* Two integer counters for the QCD and EW order of the couplings. *) type orders = int * int let orders = function | Q_lepton | Q_up | Q_down | G_NC_lepton | G_NC_neutrino | G_NC_up | G_NC_down | G_CC | G_CCQ _ | G_Htt | G_H3 | G_Hbb | G_Hcc | G_Hss | G_Htautau | G_Hmm | G_Hee | I_Q_W | I_G_ZWW | I_G1_AWW | I_G1_ZWW | I_G_weak | G_HWW | G_HZZ | G_HWW_u | G_HZZ_u | G_HGaZ_u | G_HWW_anom | G_HZZ_anom | G_HGaZ | G_HGaGa | G_HGaZ_anom | G_HGaGa_anom | Half | Unit | I_G1_plus_kappa_plus_G4_AWW | I_G1_plus_kappa_plus_G4_ZWW | I_G1_minus_kappa_plus_G4_AWW | I_G1_minus_kappa_plus_G4_ZWW | I_G1_plus_kappa_minus_G4_AWW | I_G1_plus_kappa_minus_G4_ZWW | I_G1_minus_kappa_minus_G4_AWW | I_G1_minus_kappa_minus_G4_ZWW | I_kappa5_AWW | I_kappa5_ZWW | G5_AWW | G5_ZWW | I_lambda_AWW | I_lambda_ZWW | I_lambda5_AWW | I_lambda5_ZWW | G_TVA_ttA | G_TVA_bbA | G_TVA_tcA | G_TVA_tuA | G_VLR_ttZ | G_TVA_ttZ | G_VLR_tcZ | G_TVA_tcZ | G_TVA_bbZ | VA_ILC_ttA | VA_ILC_ttZ | G_VLR_tuZ | G_TVA_tuZ | G_VLR_btW | G_VLR_tbW | G_TLR_btW | G_TRL_tbW | G_TLR_btWA | G_TRL_tbWA | G_TLR_btWZ | G_TRL_tbWZ | G_VLR_qBuB | G_VLR_qBuB_u | G_VLR_qBuB_d | G_VLR_qBuB_e | G_VL_qBuB_n | G_VL_qW | G_VL_qW_u | G_VL_qW_d | G_SL_DttR | G_SR_DttR | G_SL_DttL | G_SLR_DbtR | G_SL_DbtL | G_HZZ6_V3 | G_HZZ6_D | G_HZZ6_DP | G_HZZ6_PB | G_HGaZ6_D | G_HGaZ6_DP | G_HGaZ6_PB | G_HWW_6_D | G_HWW_6_DP | G_HGaGa6 | I_Dim6_AWW_Gauge | I_Dim6_AWW_GGG | I_Dim6_AWW_DP | I_Dim6_AWW_DW | I_Dim6_WWZ_W | I_Dim6_WWZ_DPWDW | I_Dim6_WWZ_DW | I_Dim6_WWZ_D (*i | I_Dim6_GGG_G | I_Dim6_GGG_CG i*) | Dim6_vev3 | Dim6_Cphi | Anom_Dim6_H4_v2 | Anom_Dim6_H4_P2 | Anom_Dim6_AAWW_DW | Anom_Dim6_AAWW_W | Anom_Dim6_AHWW_DPB | Anom_Dim6_AHWW_DPW | Anom_Dim6_AHWW_DW | Anom_Dim6_HHWW_DW | Anom_Dim6_HHWW_DPW | Anom_Dim6_HWWZ_DW | Anom_Dim6_HWWZ_DDPW | Anom_Dim6_HWWZ_DPW | Anom_Dim6_HWWZ_DPB | Anom_Dim6_AHHZ_D | Anom_Dim6_AHHZ_DP | Anom_Dim6_AHHZ_PB | Anom_Dim6_AZWW_W | Anom_Dim6_AZWW_DWDPW | Anom_Dim6_WWWW_W | Anom_Dim6_WWWW_DWDPW | Anom_Dim6_WWZZ_W | Anom_Dim6_WWZZ_DWDPW | Anom_Dim6_HHAA | Anom_Dim6_HHZZ_D | Anom_Dim6_HHZZ_DP | Anom_Dim6_HHZZ_PB | Anom_Dim6_HHZZ_T | G_TVA_ttWW | G_TVA_bbWW | G_SP_ttH -> (0,1) | G_HHWW | G_HHZZ | G_H4 | G_WWWW | G_ZZWW | G_AZWW | G_AAWW | Alpha_WWWW0 | Alpha_WWWW2 | Alpha_ZZWW0 | Alpha_ZZWW1 | Alpha_ZZZZ | D_Alpha_WWWW0_S | D_Alpha_WWWW0_T | D_Alpha_WWWW0_U | D_Alpha_WWWW2_S | D_Alpha_WWWW2_T | D_Alpha_ZZWW0_S | D_Alpha_ZZWW0_T | D_Alpha_ZZWW1_S | D_Alpha_ZZWW1_T | D_Alpha_ZZWW1_U | D_Alpha_ZZZZ_S | D_Alpha_ZZZZ_T -> (0,2) | Gs | I_Gs | G_TVA_ttG | G_TVA_ttGG | G_TVA_tcG | G_TVA_tcGG | G_TVA_tuG | G_TVA_tuGG | G_VLR_qGuG | C_quqd1R_bt | C_quqd1R_tb | C_quqd1L_bt | C_quqd1L_tb | C_quqd8R_bt | C_quqd8R_tb | C_quqd8L_bt | C_quqd8L_tb -> (1,0) | G2 | G_Hgg -> (2,0) (* These constants are not used, hence initialized to zero. *) | Sinthw | Sin2thw | Costhw | Pi | Alpha_QED | G_weak | K_Matrix_Coeff _ | K_Matrix_Pole _ | Mass _ | Width _ | Vev | E -> (0,0) (* \begin{dubious} The current abstract syntax for parameter dependencies is admittedly tedious. Later, there will be a parser for a convenient concrete syntax as a part of a concrete syntax for models. But as these examples show, it should include simple functions. \end{dubious} *) (* \begin{subequations} \begin{align} \alpha_{\text{QED}} &= \frac{1}{137.0359895} \\ \sin^2\theta_w &= 0.23124 \end{align} \end{subequations} *) let input_parameters = [ Alpha_QED, 1. /. 137.0359895; Sin2thw, 0.23124; Mass (G Z), 91.187; Mass (M (N 1)), 0.0; Mass (M (L 1)), 0.51099907e-3; Mass (M (N 2)), 0.0; Mass (M (L 2)), 0.105658389; Mass (M (N 3)), 0.0; Mass (M (L 3)), 1.77705; Mass (M (U 1)), 5.0e-3; Mass (M (D 1)), 3.0e-3; Mass (M (U 2)), 1.2; Mass (M (D 2)), 0.1; Mass (M (U 3)), 174.0; Mass (M (D 3)), 4.2 ] (* \begin{subequations} \begin{align} e &= \sqrt{4\pi\alpha} \\ \sin\theta_w &= \sqrt{\sin^2\theta_w} \\ \cos\theta_w &= \sqrt{1-\sin^2\theta_w} \\ g &= \frac{e}{\sin\theta_w} \\ m_W &= \cos\theta_w m_Z \\ v &= \frac{2m_W}{g} \\ g_{CC} = -\frac{g}{2\sqrt2} &= -\frac{e}{2\sqrt2\sin\theta_w} \\ Q_{\text{lepton}} = -q_{\text{lepton}}e &= e \\ Q_{\text{up}} = -q_{\text{up}}e &= -\frac{2}{3}e \\ Q_{\text{down}} = -q_{\text{down}}e &= \frac{1}{3}e \\ \ii q_We = \ii g_{\gamma WW} &= \ii e \\ \ii g_{ZWW} &= \ii g \cos\theta_w \\ \ii g_{WWW} &= \ii g \end{align} \end{subequations} *) (* \begin{dubious} \ldots{} to be continued \ldots{} The quartic couplings can't be correct, because the dimensions are wrong! \begin{subequations} \begin{align} g_{HWW} &= g m_W = 2 \frac{m_W^2}{v}\\ g_{HHWW} &= 2 \frac{m_W^2}{v^2} = \frac{g^2}{2} \\ g_{HZZ} &= \frac{g}{\cos\theta_w}m_Z \\ g_{HHZZ} &= 2 \frac{m_Z^2}{v^2} = \frac{g^2}{2\cos\theta_w} \\ g_{Htt} &= \lambda_t \\ g_{Hbb} &= \lambda_b=\frac{m_b}{m_t}\lambda_t \\ g_{H^3} &= - \frac{3g}{2}\frac{m_H^2}{m_W} = - 3 \frac{m_H^2}{v} g_{H^4} &= - \frac{3g^2}{4} \frac{m_W^2}{v^2} = -3 \frac{m_H^2}{v^2} \end{align} \end{subequations} \end{dubious} *) let derived_parameters = [ Real E, Sqrt (Prod [Integer 4; Atom Pi; Atom Alpha_QED]); Real Sinthw, Sqrt (Atom Sin2thw); Real Costhw, Sqrt (Diff (Integer 1, Atom Sin2thw)); Real G_weak, Quot (Atom E, Atom Sinthw); Real (Mass (G Wp)), Prod [Atom Costhw; Atom (Mass (G Z))]; Real Vev, Quot (Prod [Integer 2; Atom (Mass (G Wp))], Atom G_weak); Real Q_lepton, Atom E; Real Q_up, Prod [Quot (Integer (-2), Integer 3); Atom E]; Real Q_down, Prod [Quot (Integer 1, Integer 3); Atom E]; Real G_CC, Neg (Quot (Atom G_weak, Prod [Integer 2; Sqrt (Integer 2)])); Complex I_Q_W, Prod [I; Atom E]; Complex I_G_weak, Prod [I; Atom G_weak]; Complex I_G_ZWW, Prod [I; Atom G_weak; Atom Costhw] ] (* \begin{equation} - \frac{g}{2\cos\theta_w} \end{equation} *) let g_over_2_costh = Quot (Neg (Atom G_weak), Prod [Integer 2; Atom Costhw]) (* \begin{subequations} \begin{align} - \frac{g}{2\cos\theta_w} g_V &= - \frac{g}{2\cos\theta_w} (T_3 - 2 q \sin^2\theta_w) \\ - \frac{g}{2\cos\theta_w} g_A &= - \frac{g}{2\cos\theta_w} T_3 \end{align} \end{subequations} *) let nc_coupling c t3 q = (Real_Array c, [Prod [g_over_2_costh; Diff (t3, Prod [Integer 2; q; Atom Sin2thw])]; Prod [g_over_2_costh; t3]]) let half = Quot (Integer 1, Integer 2) let derived_parameter_arrays = [ nc_coupling G_NC_neutrino half (Integer 0); nc_coupling G_NC_lepton (Neg half) (Integer (-1)); nc_coupling G_NC_up half (Quot (Integer 2, Integer 3)); nc_coupling G_NC_down (Neg half) (Quot (Integer (-1), Integer 3)) ] let parameters () = { input = input_parameters; derived = derived_parameters; derived_arrays = derived_parameter_arrays } module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* \begin{equation} \mathcal{L}_{\textrm{EM}} = - e \sum_i q_i \bar\psi_i\fmslash{A}\psi_i \end{equation} *) let mgm ((m1, g, m2), fbf, c) = ((M m1, G g, M m2), fbf, c) let mom ((m1, o, m2), fbf, c) = ((M m1, O o, M m2), fbf, c) let electromagnetic_currents n = List.map mgm [ ((L (-n), Ga, L n), FBF (1, Psibar, V, Psi), Q_lepton); ((U (-n), Ga, U n), FBF (1, Psibar, V, Psi), Q_up); ((D (-n), Ga, D n), FBF (1, Psibar, V, Psi), Q_down) ] let color_currents n = List.map mgm [ ((U (-n), Gl, U n), FBF ((-1), Psibar, V, Psi), Gs); ((D (-n), Gl, D n), FBF ((-1), Psibar, V, Psi), Gs) ] (* \begin{equation} \mathcal{L}_{\textrm{NC}} = - \frac{g}{2\cos\theta_W} \sum_i \bar\psi_i\fmslash{Z}(g_V^i-g_A^i\gamma_5)\psi_i \end{equation} *) let neutral_currents n = List.map mgm [ ((L (-n), Z, L n), FBF (1, Psibar, VA, Psi), G_NC_lepton); ((N (-n), Z, N n), FBF (1, Psibar, VA, Psi), G_NC_neutrino); ((U (-n), Z, U n), FBF (1, Psibar, VA, Psi), G_NC_up); ((D (-n), Z, D n), FBF (1, Psibar, VA, Psi), G_NC_down) ] (* \begin{equation} \mathcal{L}_{\textrm{CC}} = - \frac{g}{2\sqrt2} \sum_i \bar\psi_i (T^+\fmslash{W}^+ + T^-\fmslash{W}^-)(1-\gamma_5)\psi_i \end{equation} *) let charged_currents' n = List.map mgm [ ((L (-n), Wm, N n), FBF (1, Psibar, VL, Psi), G_CC); ((N (-n), Wp, L n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents'' n = List.map mgm [ ((D (-n), Wm, U n), FBF (1, Psibar, VL, Psi), G_CC); ((U (-n), Wp, D n), FBF (1, Psibar, VL, Psi), G_CC) ] let charged_currents_triv = ThoList.flatmap charged_currents' [1;2;3] @ ThoList.flatmap charged_currents'' [1;2;3] let charged_currents_ckm = let charged_currents_2 n1 n2 = List.map mgm [ ((D (-n1), Wm, U n2), FBF (1, Psibar, VL, Psi), G_CCQ (n2,n1)); ((U (-n1), Wp, D n2), FBF (1, Psibar, VL, Psi), G_CCQ (n1,n2)) ] in ThoList.flatmap charged_currents' [1;2;3] @ List.flatten (Product.list2 charged_currents_2 [1;2;3] [1;2;3]) let yukawa = [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, S, Psi), G_Htt); ((M (D (-3)), O H, M (D 3)), FBF (1, Psibar, S, Psi), G_Hbb); ((M (U (-2)), O H, M (U 2)), FBF (1, Psibar, S, Psi), G_Hcc); ((M (L (-3)), O H, M (L 3)), FBF (1, Psibar, S, Psi), G_Htautau) ] @ if Flags.higgs_hmm then [ ((M (D (-2)), O H, M (D 2)), FBF (1, Psibar, S, Psi), G_Hss); ((M (L (-2)), O H, M (L 2)), FBF (1, Psibar, S, Psi), G_Hmm); ((M (L (-1)), O H, M (L 1)), FBF (1, Psibar, S, Psi), G_Hee) ] else [] (* \begin{equation} \mathcal{L}_{\textrm{TGC}} = - e \partial_\mu A_\nu W_+^\mu W_-^\nu + \ldots - e \cot\theta_w \partial_\mu Z_\nu W_+^\mu W_-^\nu + \ldots \end{equation} *) let tgc ((g1, g2, g3), t, c) = ((G g1, G g2, G g3), t, c) let standard_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Gauge_Gauge_Gauge 1, I_Q_W); ((Z, Wm, Wp), Gauge_Gauge_Gauge 1, I_G_ZWW); ((Gl, Gl, Gl), Gauge_Gauge_Gauge 1, I_Gs)] (* \begin{multline} \mathcal{L}_{\textrm{TGC}}(g_1,\kappa) = g_1 \mathcal{L}_T(V,W^+,W^-) \\ + \frac{\kappa+g_1}{2} \Bigl(\mathcal{L}_T(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr)\\ + \frac{\kappa-g_1}{2} \Bigl(\mathcal{L}_L(W^-,V,W^+) - \mathcal{L}_T(W^+,V,W^-)\Bigr) \end{multline} *) (* \begin{dubious} The whole thing in the LEP2 workshop notation: \begin{multline} \ii\mathcal{L}_{\textrm{TGC},V} / g_{WWV} = \\ g_1^V V^\mu (W^-_{\mu\nu}W^{+,\nu}-W^+_{\mu\nu}W^{-,\nu}) + \kappa_V W^+_\mu W^-_\nu V^{\mu\nu} + \frac{\lambda_V}{m_W^2} V_{\mu\nu} W^-_{\rho\mu} W^{+,\hphantom{\nu}\rho}_{\hphantom{+,}\nu} \\ + \ii g_5^V \epsilon_{\mu\nu\rho\sigma} \left( (\partial^\rho W^{-,\mu}) W^{+,\nu} - W^{-,\mu}(\partial^\rho W^{+,\nu}) \right) V^\sigma \\ + \ii g_4^V W^-_\mu W^+_\nu (\partial^\mu V^\nu + \partial^\nu V^\mu) - \frac{\tilde\kappa_V}{2} W^-_\mu W^+_\nu \epsilon^{\mu\nu\rho\sigma} V_{\rho\sigma} - \frac{\tilde\lambda_V}{2m_W^2} W^-_{\rho\mu} W^{+,\mu}_{\hphantom{+,\mu}\nu} \epsilon^{\nu\rho\alpha\beta} V_{\alpha\beta} \end{multline} using the conventions of Itzykson and Zuber with $\epsilon^{0123} = +1$. \end{dubious} *) (* \begin{dubious} This is equivalent to the notation of Hagiwara et al.~\cite{HPZH87}, if we remember that they have opposite signs for~$g_{WWV}$: \begin{multline} \mathcal{L}_{WWV} / (-g_{WWV}) = \\ \ii g_1^V \left( W^\dagger_{\mu\nu} W^\mu - W^\dagger_\mu W^\mu_{\hphantom{\mu}\nu} \right) V^\nu + \ii \kappa_V W^\dagger_\mu W_\nu V^{\mu\nu} + \ii \frac{\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} V^{\nu\lambda} \\ - g_4^V W^\dagger_\mu W_\nu \left(\partial^\mu V^\nu + \partial^\nu V^\mu \right) + g_5^V \epsilon^{\mu\nu\lambda\sigma} \left( W^\dagger_\mu \stackrel{\leftrightarrow}{\partial_\lambda} W_\nu \right) V_\sigma\\ + \ii \tilde\kappa_V W^\dagger_\mu W_\nu \tilde{V}^{\mu\nu} + \ii\frac{\tilde\lambda_V}{m_W^2} W^\dagger_{\lambda\mu} W^\mu_{\hphantom{\mu}\nu} \tilde{V}^{\nu\lambda} \end{multline} Here $V^\mu$ stands for either the photon or the~$Z$ field, $W^\mu$ is the $W^-$ field, $W_{\mu\nu} = \partial_\mu W_\nu - \partial_\nu W_\mu$, $V_{\mu\nu} = \partial_\mu V_\nu - \partial_\nu V_\mu$, and $\tilde{V}_{\mu\nu} = \frac{1}{2} \epsilon_{\mu\nu\lambda\sigma} V^{\lambda\sigma}$. \end{dubious} *) let anomalous_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T (-1), I_G1_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_T 1, I_G1_plus_kappa_minus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_T (-1), I_G1_plus_kappa_plus_G4_ZWW); ((Wm, Ga, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_AWW); ((Wm, Z, Wp), Dim4_Vector_Vector_Vector_L (-1), I_G1_minus_kappa_plus_G4_ZWW); ((Wp, Ga, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_AWW); ((Wp, Z, Wm), Dim4_Vector_Vector_Vector_L 1, I_G1_minus_kappa_minus_G4_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_L5 (-1), I_kappa5_ZWW); ((Ga, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_AWW); ((Z, Wm, Wp), Dim4_Vector_Vector_Vector_T5 (-1), G5_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge (-1), I_lambda_ZWW); ((Ga, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_AWW); ((Z, Wp, Wm), Dim6_Gauge_Gauge_Gauge_5 (-1), I_lambda5_ZWW) ] let anomalous_dim6_triple_gauge = List.map tgc [ ((Ga, Wm, Wp), Dim6_Gauge_Gauge_Gauge_i 1, I_Dim6_AWW_GGG); ((Ga, Wm, Wp), Dim6_AWW_DP 1, I_Dim6_AWW_DP); ((Ga, Wm, Wp), Dim6_AWW_DW 1, I_Dim6_AWW_DW); ((Wm, Wp, Z), Dim6_Gauge_Gauge_Gauge_i 1, I_Dim6_WWZ_W); ((Wm, Wp, Z), Dim6_WWZ_DPWDW 1, I_Dim6_WWZ_DPWDW); ((Wm, Wp, Z), Dim6_WWZ_DW 1, I_Dim6_WWZ_DW); ((Wm, Wp, Z), Dim6_WWZ_D 1, I_Dim6_WWZ_D)(*i ; ((G, G, G), Dim6_Glu_Glu_Glu 1, I_Dim6_GGG_G); ((G, G, G), Gauge_Gauge_Gauge_I 1, I_Dim6_GGG_CG) i*) ] let triple_gauge = if Flags.triple_anom then anomalous_triple_gauge else if Flags.dim6 then standard_triple_gauge @ anomalous_dim6_triple_gauge else standard_triple_gauge (* \begin{equation} \mathcal{L}_{\textrm{QGC}} = - g^2 W_{+,\mu} W_{-,\nu} W_+^\mu W_-^\nu + \ldots \end{equation} *) (* Actually, quartic gauge couplings are a little bit more straightforward using auxiliary fields. Here we have to impose the antisymmetry manually: \begin{subequations} \begin{multline} (W^{+,\mu}_1 W^{-,\nu}_2 - W^{+,\nu}_1 W^{-,\mu}_2) (W^+_{3,\mu} W^-_{4,\nu} - W^+_{3,\nu} W^-_{4,\mu}) \\ = 2(W^+_1W^+_3)(W^-_2W^-_4) - 2(W^+_1W^-_4)(W^-_2W^+_3) \end{multline} also ($V$ can be $A$ or $Z$) \begin{multline} (W^{+,\mu}_1 V^\nu_2 - W^{+,\nu}_1 V^\mu_2) (W^-_{3,\mu} V_{4,\nu} - W^-_{3,\nu} V_{4,\mu}) \\ = 2(W^+_1W^-_3)(V_2V_4) - 2(W^+_1V_4)(V_2W^-_3) \end{multline} \end{subequations} *) (* \begin{subequations} \begin{multline} W^{+,\mu} W^{-,\nu} W^+_\mu W^-_\nu \end{multline} \end{subequations} *) let qgc ((g1, g2, g3, g4), t, c) = ((G g1, G g2, G g3, G g4), t, c) let gauge4 = Vector4 [(2, C_13_42); (-1, C_12_34); (-1, C_14_23)] let minus_gauge4 = Vector4 [(-2, C_13_42); (1, C_12_34); (1, C_14_23)] let standard_quartic_gauge = List.map qgc [ (Wm, Wp, Wm, Wp), gauge4, G_WWWW; (Wm, Z, Wp, Z), minus_gauge4, G_ZZWW; (Wm, Z, Wp, Ga), minus_gauge4, G_AZWW; (Wm, Ga, Wp, Ga), minus_gauge4, G_AAWW; (Gl, Gl, Gl, Gl), gauge4, G2 ] (* \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \left( \frac{g^4}{2}\left( (W^+_\mu W^{-,\mu})^2 + W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} \right)\right.\notag \\ &\qquad\qquad\qquad \left. + \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \\ \mathcal{L}_5 &= \alpha_5 \left( g^4 (W^+_\mu W^{-,\mu})^2 + \frac{g^4}{\cos^2\theta_w} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + \frac{g^4}{4\cos^4\theta_w} (Z_\mu Z^\mu)^2 \right) \end{align} \end{subequations} or \begin{multline} \mathcal{L}_4 + \mathcal{L}_5 = (\alpha_4+2\alpha_5) g^4 \frac{1}{2} (W^+_\mu W^{-,\mu})^2 \\ + 2\alpha_4 g^4 \frac{1}{4} W^+_\mu W^{+,\mu} W^-_\mu W^{-,\mu} + \alpha_4 \frac{g^4}{\cos^2\theta_w} W^+_\mu Z^\mu W^-_\nu Z^\nu \\ + 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \frac{1}{2} W^+_\mu W^{-,\mu} Z_\nu Z^\nu + (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \frac{1}{8} (Z_\mu Z^\mu)^2 \end{multline} and therefore \begin{subequations} \begin{align} \alpha_{(WW)_0} &= (\alpha_4+2\alpha_5) g^4 \\ \alpha_{(WW)_2} &= 2\alpha_4 g^4 \\ \alpha_{(WZ)_0} &= 2\alpha_5 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{(WZ)_1} &= \alpha_4 \frac{g^4}{\cos^2\theta_w} \\ \alpha_{ZZ} &= (2\alpha_4 + 2\alpha_5) \frac{g^4}{\cos^4\theta_w} \end{align} \end{subequations} *) let anomalous_quartic_gauge = if Flags.quartic_anom then List.map qgc [ ((Wm, Wm, Wp, Wp), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4 [1, C_12_34], Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4 [1, C_12_34], Alpha_ZZWW0); ((Wm, Wp, Z, Z), Vector4 [(1, C_13_42); (1, C_14_23)], Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4 [(1, C_12_34); (1, C_13_42); (1, C_14_23)], Alpha_ZZZZ) ] else [] let anomalous_dim6_quartic_gauge = if Flags.dim6 then List.map qgc [ ((Ga, Ga, Wm, Wp), Dim6_Vector4_DW 1, Anom_Dim6_AAWW_DW); ((Ga, Ga, Wm, Wp), Dim6_Vector4_W 1, Anom_Dim6_AAWW_W); ((Ga, Z, Wm, Wp), Dim6_Vector4_W 1, Anom_Dim6_AZWW_W); ((Ga, Z, Wm, Wp), Dim6_Vector4_DW 1, Anom_Dim6_AZWW_DWDPW); ((Wm, Wp, Wm, Wp), Dim6_Vector4_W 1, Anom_Dim6_WWWW_W); ((Wm, Wp, Wm, Wp), Dim6_Vector4_DW 1, Anom_Dim6_WWWW_DWDPW); ((Z, Z, Wm, Wp), Dim6_Vector4_W 1, Anom_Dim6_WWZZ_W); ((Z, Z, Wm, Wp), Dim6_Vector4_DW 1, Anom_Dim6_WWZZ_DWDPW) ] else [] (* In any diagonal channel~$\chi$, the scattering amplitude~$a_\chi(s)$ is unitary iff\footnote{% Trivial proof: \begin{equation} -1 = \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = \frac{\textrm{Im}(a_\chi^*(s))}{ |a_\chi(s)|^2 } = - \frac{\textrm{Im}(a_\chi(s))}{ |a_\chi(s)|^2 } \end{equation} i.\,e.~$\textrm{Im}(a_\chi(s)) = |a_\chi(s)|^2$.} \begin{equation} \textrm{Im}\left(\frac{1}{a_\chi(s)}\right) = -1 \end{equation} For a real perturbative scattering amplitude~$r_\chi(s)$ this can be enforced easily--and arbitrarily--by \begin{equation} \frac{1}{a_\chi(s)} = \frac{1}{r_\chi(s)} - \mathrm{i} \end{equation} *) let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW0_S); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_WWWW0_T); ((Wp, Wm, Wp, Wm), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_WWWW0_U); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_WWWW2_S); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_WWWW2_T); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW0_S); ((Wm, Wp, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZWW0_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42)]), D_Alpha_ZZWW1_T); ((Wm, Z, Wp, Z), Vector4_K_Matrix_jr (0, [(1, C_14_23)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Wp, Z, Z, Wm), Vector4_K_Matrix_jr (1, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_12_34)]), D_Alpha_ZZWW1_S); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_13_42)]), D_Alpha_ZZWW1_U); ((Z, Wp, Wm, Z), Vector4_K_Matrix_jr (2, [(1, C_14_23)]), D_Alpha_ZZWW1_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_12_34)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (0, [(1, C_13_42); (1, C_14_23)]), D_Alpha_ZZZZ_T); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_14_23)]), D_Alpha_ZZZZ_S); ((Z, Z, Z, Z), Vector4_K_Matrix_jr (3, [(1, C_13_42); (1, C_12_34)]), D_Alpha_ZZZZ_T)] else [] (*i Thorsten's original implementation of the K matrix, which we keep since it still might be usefull for the future. let k_matrix_quartic_gauge = if Flags.k_matrix then List.map qgc [ ((Wm, Wp, Wm, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_WWWW0); ((Wm, Wm, Wp, Wp), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 2, K_Matrix_Pole 2]), Alpha_WWWW2); ((Wm, Wp, Z, Z), Vector4_K_Matrix_tho (0, [(K_Matrix_Coeff 0, K_Matrix_Pole 0); (K_Matrix_Coeff 2, K_Matrix_Pole 2)]), Alpha_ZZWW0); ((Wm, Z, Wp, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 1, K_Matrix_Pole 1]), Alpha_ZZWW1); ((Z, Z, Z, Z), Vector4_K_Matrix_tho (0, [K_Matrix_Coeff 0, K_Matrix_Pole 0]), Alpha_ZZZZ) ] else [] i*) let quartic_gauge = standard_quartic_gauge @ anomalous_quartic_gauge @ anomalous_dim6_quartic_gauge @ k_matrix_quartic_gauge let standard_gauge_higgs = [ ((O H, G Wp, G Wm), Scalar_Vector_Vector 1, G_HWW); ((O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ) ] let standard_gauge_higgs4 = [ (O H, O H, G Wp, G Wm), Scalar2_Vector2 1, G_HHWW; (O H, O H, G Z, G Z), Scalar2_Vector2 1, G_HHZZ ] let standard_higgs = [ (O H, O H, O H), Scalar_Scalar_Scalar 1, G_H3 ] let standard_higgs4 = [ (O H, O H, O H, O H), Scalar4 1, G_H4 ] (* WK's couplings (apparently, he still intends to divide by $\Lambda^2_{\text{EWSB}}=16\pi^2v_{\mathrm{F}}^2$): \begin{subequations} \begin{align} \mathcal{L}^{\tau}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V^{\mu} \right\rbrack^2 \\ \mathcal{L}^{\tau}_5 &= \left\lbrack (\partial_{\mu}H)(\partial_{\nu}H) + \frac{g^2v_{\mathrm{F}}^2}{4} V_{\mu} V_{\nu} \right\rbrack^2 \end{align} \end{subequations} with \begin{equation} V_{\mu} V_{\nu} = \frac{1}{2} \left( W^+_{\mu} W^-_{\nu} + W^+_{\nu} W^-_{\mu} \right) + \frac{1}{2\cos^2\theta_{w}} Z_{\mu} Z_{\nu} \end{equation} (note the symmetrization!), i.\,e. \begin{subequations} \begin{align} \mathcal{L}_4 &= \alpha_4 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V_{\nu})^2 \\ \mathcal{L}_5 &= \alpha_5 \frac{g^4v_{\mathrm{F}}^4}{16} (V_{\mu} V^{\mu})^2 \end{align} \end{subequations} *) (* Breaking thinks up \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^4}_4 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) \right\rbrack^2 \\ \mathcal{L}^{\tau,H^4}_5 &= \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) \right\rbrack^2 \end{align} \end{subequations} and \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^2V^2}_4 &= \frac{g^2v_{\mathrm{F}}^2}{2} (\partial_{\mu}H)(\partial^{\mu}H) V_{\mu}V^{\mu} \\ \mathcal{L}^{\tau,H^2V^2}_5 &= \frac{g^2v_{\mathrm{F}}^2}{2} (\partial_{\mu}H)(\partial_{\nu}H) V_{\mu}V_{\nu} \end{align} \end{subequations} i.\,e. \begin{subequations} \begin{align} \mathcal{L}^{\tau,H^2V^2}_4 &= \frac{g^2v_{\mathrm{F}}^2}{2} \left\lbrack (\partial_{\mu}H)(\partial^{\mu}H) W^+_{\nu}W^{-,\nu} + \frac{1}{2\cos^2\theta_{w}} (\partial_{\mu}H)(\partial^{\mu}H) Z_{\nu} Z^{\nu} \right\rbrack \\ \mathcal{L}^{\tau,H^2V^2}_5 &= \frac{g^2v_{\mathrm{F}}^2}{2} \left\lbrack (W^{+,\mu}\partial_{\mu}H) (W^{-,\nu}\partial_{\nu}H) + \frac{1}{2\cos^2\theta_{w}} (Z^{\mu}\partial_{\mu}H)(Z^{\nu}\partial_{\nu}H) \right\rbrack \end{align} \end{subequations} *) (* \begin{multline} \tau^4_8 \mathcal{L}^{\tau,H^2V^2}_4 + \tau^5_8 \mathcal{L}^{\tau,H^2V^2}_5 = \\ - \frac{g^2v_{\mathrm{F}}^2}{2} \Biggl\lbrack 2\tau^4_8 \frac{1}{2}(\ii\partial_{\mu}H)(\ii\partial^{\mu}H) W^+_{\nu}W^{-,\nu} + \tau^5_8 (W^{+,\mu}\ii\partial_{\mu}H) (W^{-,\nu}\ii\partial_{\nu}H) \\ + \frac{2\tau^4_8}{\cos^2\theta_{w}} \frac{1}{4} (\ii\partial_{\mu}H)(\ii\partial^{\mu}H) Z_{\nu} Z^{\nu} + \frac{\tau^5_8}{\cos^2\theta_{w}} \frac{1}{2} (Z^{\mu}\ii\partial_{\mu}H)(Z^{\nu}\ii\partial_{\nu}H) \Biggr\rbrack \end{multline} where the two powers of $\ii$ make the sign conveniently negative, i.\,e. \begin{subequations} \begin{align} \alpha_{(\partial H)^2W^2}^2 &= \tau^4_8 g^2v_{\mathrm{F}}^2\\ \alpha_{(\partial HW)^2}^2 &= \frac{\tau^5_8 g^2v_{\mathrm{F}}^2}{2} \\ \alpha_{(\partial H)^2Z^2}^2 &= \frac{\tau^4_8 g^2v_{\mathrm{F}}^2}{\cos^2\theta_{w}} \\ \alpha_{(\partial HZ)^2}^2 &=\frac{\tau^5_8 g^2v_{\mathrm{F}}^2}{2\cos^2\theta_{w}} \end{align} \end{subequations} *) let anomalous_gauge_higgs = [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa_anom; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ_anom; (O H, G Z, G Z), Dim5_Scalar_Gauge2 1, G_HZZ_anom; (O H, G Wp, G Wm), Dim5_Scalar_Gauge2 1, G_HWW_anom; (O H, G Ga, G Z), Dim5_Scalar_Vector_Vector_TU 1, G_HGaZ_u; (O H, G Z, G Z), Dim5_Scalar_Vector_Vector_U 1, G_HZZ_u; (O H, G Wp, G Wm), Dim5_Scalar_Vector_Vector_U 1, G_HWW_u ] let anomalous_dim6_gauge_higgs = [ (O H, G Z, G Z), Scalar_Vector_Vector 1, G_HZZ6_V3; (O H, G Z, G Z), Dim6_Scalar_Vector_Vector_D 1, G_HZZ6_D; (O H, G Z, G Z), Dim6_Scalar_Vector_Vector_DP 1, G_HZZ6_DP; (O H, G Z, G Z), Scalar_Vector_Vector_t 1, G_HZZ6_PB; (O H, G Ga, G Z), Dim6_HAZ_D 1, G_HGaZ6_D; (O H, G Ga, G Z), Dim6_HAZ_DP 1, G_HGaZ6_DP; (O H, G Ga, G Z), Scalar_Vector_Vector_t 1, G_HGaZ6_PB; (O H, G Ga, G Ga), Scalar_Vector_Vector_t 1, G_HGaGa6; (O H, G Wm, G Wp), Dim6_Scalar_Vector_Vector_D 1, G_HWW_6_D; (O H, G Wm, G Wp), Dim6_Scalar_Vector_Vector_DP 1, G_HWW_6_DP ] let anomalous_gauge_higgs4 = [] let anomalous_dim6_gauge_higgs4 = [(G Ga, O H, G Wm, G Wp), Dim6_AHWW_DPB 1, Anom_Dim6_AHWW_DPB; (G Ga, O H, G Wm, G Wp), Dim6_AHWW_DPW 1, Anom_Dim6_AHWW_DPW; (G Ga, O H, G Wm, G Wp), Dim6_AHWW_DW 1, Anom_Dim6_AHWW_DW; (O H, G Wm, G Wp, G Z), Dim6_HWWZ_DW 1, Anom_Dim6_HWWZ_DW; (O H, G Wm, G Wp, G Z), Dim6_HWWZ_DDPW 1, Anom_Dim6_HWWZ_DDPW; (O H, G Wm, G Wp, G Z), Dim6_HWWZ_DPW 1, Anom_Dim6_HWWZ_DPW; (O H, G Wm, G Wp, G Z), Dim6_HWWZ_DPB 1, Anom_Dim6_HWWZ_DPB; (G Ga, O H, O H, G Z), Dim6_AHHZ_D 1, Anom_Dim6_AHHZ_D; (G Ga, O H, O H, G Z), Dim6_AHHZ_DP 1, Anom_Dim6_AHHZ_DP; (G Ga, O H, O H, G Z), Dim6_AHHZ_PB 1, Anom_Dim6_AHHZ_PB; (O H, O H, G Ga, G Ga), Dim6_Scalar2_Vector2_PB 1, Anom_Dim6_HHAA; (O H, O H, G Wm, G Wp), Dim6_Scalar2_Vector2_D 1, Anom_Dim6_HHWW_DW; (O H, O H, G Wm, G Wp), Dim6_Scalar2_Vector2_DP 1, Anom_Dim6_HHWW_DPW; (O H, O H, G Z, G Z), Dim6_HHZZ_T 1, Anom_Dim6_HHZZ_T; (O H, O H, G Z, G Z), Dim6_Scalar2_Vector2_D 1, Anom_Dim6_HHZZ_D; (O H, O H, G Z, G Z), Dim6_Scalar2_Vector2_DP 1, Anom_Dim6_HHZZ_DP; (O H, O H, G Z, G Z), Dim6_Scalar2_Vector2_PB 1, Anom_Dim6_HHZZ_PB ] let anomalous_higgs = [] let anomalous_dim6_higgs = [(O H, O H, O H), Scalar_Scalar_Scalar 1, Dim6_vev3; (O H, O H, O H), Dim6_HHH 1, Dim6_Cphi ] let higgs_triangle_vertices = if Flags.higgs_triangle then [ (O H, G Ga, G Ga), Dim5_Scalar_Gauge2 1, G_HGaGa; (O H, G Ga, G Z), Dim5_Scalar_Gauge2 1, G_HGaZ; (O H, G Gl, G Gl), Dim5_Scalar_Gauge2 1, G_Hgg ] else [] let anomalous_higgs4 = [] let anomalous_dim6_higgs4 = [(O H, O H, O H, O H), Scalar4 1, Anom_Dim6_H4_v2; (O H, O H, O H, O H), Dim6_H4_P2 1, Anom_Dim6_H4_P2] let gauge_higgs = if Flags.higgs_anom then standard_gauge_higgs @ anomalous_gauge_higgs else if Flags.dim6 then standard_gauge_higgs @ anomalous_dim6_gauge_higgs else standard_gauge_higgs let gauge_higgs4 = if Flags.higgs_anom then standard_gauge_higgs4 @ anomalous_gauge_higgs4 else if Flags.dim6 then standard_gauge_higgs4 @ anomalous_dim6_gauge_higgs4 else standard_gauge_higgs4 let higgs = if Flags.higgs_anom then standard_higgs @ anomalous_higgs else if Flags.dim6 then standard_higgs @ anomalous_dim6_higgs else standard_higgs let higgs4 = if Flags.higgs_anom then standard_higgs4 @ anomalous_higgs4 else if Flags.dim6 then standard_higgs4 @ anomalous_dim6_higgs4 else standard_higgs4 let goldstone_vertices = [ ((O Phi0, G Wm, G Wp), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phip, G Ga, G Wm), Scalar_Vector_Vector 1, I_Q_W); ((O Phip, G Z, G Wm), Scalar_Vector_Vector 1, I_G_ZWW); ((O Phim, G Wp, G Ga), Scalar_Vector_Vector 1, I_Q_W); ((O Phim, G Wp, G Z), Scalar_Vector_Vector 1, I_G_ZWW) ] (* Anomalous trilinear interactions $f_i f_j V$ and $ttH$: \begin{equation} \Delta\mathcal{L}_{tt\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{t} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) t A_\mu \end{equation} \begin{equation} \Delta\mathcal{L}_{tc\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{t} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) c A_\mu \,\text{+\,h.c.} \end{equation} *) let anomalous_ttA = if Flags.top_anom then [ ((M (U (-3)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttA); ((M (U (-3)), G Ga, M (U 2)), FBF (1, Psibar, TVAM, Psi), G_TVA_tcA); ((M (U (-2)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_tcA); ((M (U (-3)), G Ga, M (U 1)), FBF (1, Psibar, TVAM, Psi), G_TVA_tuA); ((M (U (-1)), G Ga, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_tuA)] else [] let tt_threshold_ttA = if Flags.tt_threshold then [ ((M (U (-3)), G Ga, M (U 3)), FBF (1, Psibar, VAM, Psi), VA_ILC_ttA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bb\gamma} = - e \frac{\upsilon}{\Lambda^2} \bar{b} i\sigma^{\mu\nu} k_\nu (d_V(k^2) + i d_A(k^2) \gamma_5) b A_\mu \end{equation} *) let anomalous_bbA = if Flags.top_anom then [ ((M (D (-3)), G Ga, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbA) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttg} = - g_s \frac{\upsilon}{\Lambda^2} \bar{t}\lambda^a i\sigma^{\mu\nu}k_\nu (d_V(k^2)+id_A(k^2)\gamma_5)tG^a_\mu \end{equation} \begin{equation} \Delta\mathcal{L}_{tcg} = - g_s \frac{\upsilon}{\Lambda^2} \bar{t}\lambda^a i\sigma^{\mu\nu}k_\nu (d_V(k^2)+id_A(k^2)\gamma_5)cG^a_\mu\,\text{+\,h.c.} \end{equation} *) let anomalous_ttG = if Flags.top_anom then [ ((M (U (-3)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttG); ((M (U (-3)), G Gl, M (U 2)), FBF (1, Psibar, TVAM, Psi), G_TVA_tcG); ((M (U (-2)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_tcG); ((M (U (-3)), G Gl, M (U 1)), FBF (1, Psibar, TVAM, Psi), G_TVA_tuG); ((M (U (-1)), G Gl, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_tuG)] else [] (* \begin{equation} \Delta\mathcal{L}_{ttZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{t} \fmslash{Z} (X_L(k^2) P_L + X_R(k^2) P_R) t + \bar{t}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)tZ_\mu\right\rbrack \end{equation} \begin{equation} \Delta\mathcal{L}_{tcZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{t} \fmslash{Z} (X_L(k^2) P_L + X_R(k^2) P_R) c + \bar{t}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)cZ_\mu\right\rbrack \,\text{+\,h.c.} \end{equation} *) let anomalous_ttZ = if Flags.top_anom then [ ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_ttZ); ((M (U (-3)), G Z, M (U 2)), FBF (1, Psibar, VLRM, Psi), G_VLR_tcZ); ((M (U (-2)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tcZ); ((M (U (-3)), G Z, M (U 1)), FBF (1, Psibar, VLRM, Psi), G_VLR_tuZ); ((M (U (-1)), G Z, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tuZ); ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_ttZ); ((M (U (-2)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_tcZ); ((M (U (-3)), G Z, M (U 2)), FBF (1, Psibar, TVAM, Psi), G_TVA_tcZ); ((M (U (-1)), G Z, M (U 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_tuZ); ((M (U (-3)), G Z, M (U 1)), FBF (1, Psibar, TVAM, Psi), G_TVA_tuZ)] else [] let tt_threshold_ttZ = if Flags.tt_threshold then [ ((M (U (-3)), G Z, M (U 3)), FBF (1, Psibar, VAM, Psi), VA_ILC_ttZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbZ} = - \frac{g}{2 c_W} \frac{\upsilon^2}{\Lambda^2} \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_Z} (d_V(k^2)+id_A(k^2)\gamma_5)bZ_\mu \end{equation} *) let anomalous_bbZ = if Flags.top_anom then [ ((M (D (-3)), G Z, M (D 3)), FBF (1, Psibar, TVAM, Psi), G_TVA_bbZ) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbW} = - \frac{g}{\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\fmslash{W}^-(V_L(k^2) P_L+V_R(k^2) P_R) t + \bar{b}\frac{i\sigma^{\mu\nu}k_\nu}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)tW^-_\mu\right\rbrack \,\text{+\,h.c.} \end{equation} *) let anomalous_tbW = if Flags.top_anom then [ ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, VLRM, Psi), G_VLR_tbW); ((M (D (-3)), G Wm, M (U 3)), FBF (1, Psibar, TLRM, Psi), G_TLR_btW); ((M (U (-3)), G Wp, M (D 3)), FBF (1, Psibar, TRLM, Psi), G_TRL_tbW) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttH} = - \frac{1}{\sqrt{2}} \bar{t} (Y_V(k^2)+iY_A(k^2)\gamma_5)t H \end{equation} *) let anomalous_ttH = if Flags.top_anom then [ ((M (U (-3)), O H, M (U 3)), FBF (1, Psibar, SPM, Psi), G_SP_ttH) ] else [] (* quartic fermion-gauge interactions $f_i f_j V_1 V_2$ emerging from gauge-invariant effective operators: \begin{equation} \Delta\mathcal{L}_{ttgg} = - \frac{g_s^2}{2} f_{abc} \frac{\upsilon}{\Lambda^2} \bar{t} \lambda^a \sigma^{\mu\nu} (d_V(k^2)+id_A(k^2)\gamma_5)t G^b_\mu G^c_\nu \end{equation} \begin{equation} \Delta\mathcal{L}_{tcgg} = - \frac{g_s^2}{2} f_{abc} \frac{\upsilon}{\Lambda^2} \bar{t} \lambda^a \sigma^{\mu\nu} (d_V(k^2)+id_A(k^2)\gamma_5)c G^b_\mu G^c_\nu \,\text{+\,h.c.} \end{equation} *) let anomalous_ttGG = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,1,0,true,TTGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttGG); ((M (U (-3)), O (Aux_top (2,1,0,true,TCGG)), M (U 2)), FBF (1, Psibar, TVA, Psi), G_TVA_tcGG); ((M (U (-2)), O (Aux_top (2,1,0,true,TCGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_tcGG); ((M (U (-3)), O (Aux_top (2,1,0,true,TUGG)), M (U 1)), FBF (1, Psibar, TVA, Psi), G_TVA_tuGG); ((M (U (-1)), O (Aux_top (2,1,0,true,TUGG)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_tuGG); ((O (Aux_top (2,1,0,false,TTGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs); ((O (Aux_top (2,1,0,false,TCGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs); ((O (Aux_top (2,1,0,false,TUGG)), G Gl, G Gl), Aux_Gauge_Gauge 1, I_Gs)] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWA} = - i\sin\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t A_\mu W^-_\nu \right\rbrack \,\text{+\,h.c.} \end{equation} *) let anomalous_tbWA = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWA)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWA); ((O (Aux_top (2,0,1,false,TBWA)), G Ga, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWA)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWA); ((O (Aux_top (2,0,-1,false,TBWA)), G Wp, G Ga), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{tbWZ} = - i\cos\theta_w \frac{g^2}{2\sqrt{2}} \frac{\upsilon^2}{\Lambda^2}\left\lbrack \bar{b}\frac{\sigma^{\mu\nu}}{m_W} (g_L(k^2)P_L+g_R(k^2)P_R)t Z_\mu W^-_\nu \right\rbrack \,\text{+\,h.c.} \end{equation} *) let anomalous_tbWZ = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,-1,true,TBWZ)), M (U 3)), FBF (1, Psibar, TLR, Psi), G_TLR_btWZ); ((O (Aux_top (2,0,1,false,TBWZ)), G Z, G Wm), Aux_Gauge_Gauge 1, I_G_weak); ((M (U (-3)), O (Aux_top (2,0,1,true,TBWZ)), M (D 3)), FBF (1, Psibar, TRL, Psi), G_TRL_tbWZ); ((O (Aux_top (2,0,-1,false,TBWZ)), G Wp, G Z), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{ttWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{t} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)t W^-_\mu W^+_\nu \end{equation} *) let anomalous_ttWW = if Flags.top_anom then [ ((M (U (-3)), O (Aux_top (2,0,0,true,TTWW)), M (U 3)), FBF (1, Psibar, TVA, Psi), G_TVA_ttWW); ((O (Aux_top (2,0,0,false,TTWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* \begin{equation} \Delta\mathcal{L}_{bbWW} = - i \frac{g^2}{2} \frac{\upsilon^2}{\Lambda^2} \bar{b} \frac{\sigma^{\mu\nu}}{m_W} (d_V(k^2)+id_A(k^2)\gamma_5)b W^-_\mu W^+_\nu \end{equation} *) let anomalous_bbWW = if Flags.top_anom then [ ((M (D (-3)), O (Aux_top (2,0,0,true,BBWW)), M (D 3)), FBF (1, Psibar, TVA, Psi), G_TVA_bbWW); ((O (Aux_top (2,0,0,false,BBWW)), G Wm, G Wp), Aux_Gauge_Gauge 1, I_G_weak) ] else [] (* 4-fermion contact terms emerging from operator rewriting: *) let anomalous_top_qGuG_tt = [ ((M (U (-3)), O (Aux_top (1,1,0,true,QGUG)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qGuG) ] let anomalous_top_qGuG_ff n = List.map mom [ ((U (-n), Aux_top (1,1,0,false,QGUG), U n), FBF (1, Psibar, V, Psi), Unit); ((D (-n), Aux_top (1,1,0,false,QGUG), D n), FBF (1, Psibar, V, Psi), Unit) ] let anomalous_top_qGuG = if Flags.top_anom_4f then anomalous_top_qGuG_tt @ ThoList.flatmap anomalous_top_qGuG_ff [1;2;3] else [] let anomalous_top_qBuB_tt = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QBUB)), M (U 3)), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB) ] let anomalous_top_qBuB_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QBUB), U n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_u); ((D (-n), Aux_top (1,0,0,false,QBUB), D n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_d); ((L (-n), Aux_top (1,0,0,false,QBUB), L n), FBF (1, Psibar, VLR, Psi), G_VLR_qBuB_e); ((N (-n), Aux_top (1,0,0,false,QBUB), N n), FBF (1, Psibar, VL, Psi), G_VL_qBuB_n) ] let anomalous_top_qBuB = if Flags.top_anom_4f then anomalous_top_qBuB_tt @ ThoList.flatmap anomalous_top_qBuB_ff [1;2;3] else [] let anomalous_top_qW_tq = [ ((M (U (-3)), O (Aux_top (1,0,0,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (D (-3)), O (Aux_top (1,0,-1,true,QW)), M (U 3)), FBF (1, Psibar, VL, Psi), G_VL_qW); ((M (U (-3)), O (Aux_top (1,0,1,true,QW)), M (D 3)), FBF (1, Psibar, VL, Psi), G_VL_qW) ] let anomalous_top_qW_ff n = List.map mom [ ((U (-n), Aux_top (1,0,0,false,QW), U n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((D (-n), Aux_top (1,0,0,false,QW), D n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((N (-n), Aux_top (1,0,0,false,QW), N n), FBF (1, Psibar, VL, Psi), G_VL_qW_u); ((L (-n), Aux_top (1,0,0,false,QW), L n), FBF (1, Psibar, VL, Psi), G_VL_qW_d); ((D (-n), Aux_top (1,0,-1,false,QW), U n), FBF (1, Psibar, VL, Psi), Half); ((U (-n), Aux_top (1,0,1,false,QW), D n), FBF (1, Psibar, VL, Psi), Half); ((L (-n), Aux_top (1,0,-1,false,QW), N n), FBF (1, Psibar, VL, Psi), Half); ((N (-n), Aux_top (1,0,1,false,QW), L n), FBF (1, Psibar, VL, Psi), Half) ] let anomalous_top_qW = if Flags.top_anom_4f then anomalous_top_qW_tq @ ThoList.flatmap anomalous_top_qW_ff [1;2;3] else [] let anomalous_top_DuDd = if Flags.top_anom_4f then [ ((M (U (-3)), O (Aux_top (0,0,0,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,0,false,DR)), M (U 3)), FBF (1, Psibar, SL, Psi), G_SL_DttR); ((M (D (-3)), O (Aux_top (0,0,0,false,DR)), M (D 3)), FBF (1, Psibar, SR, Psi), G_SR_DttR); ((M (U (-3)), O (Aux_top (0,0,0,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (D (-3)), O (Aux_top (0,0,0,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DttL); ((M (D (-3)), O (Aux_top (0,0,-1,true,DR)), M (U 3)), FBF (1, Psibar, SR, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DR)), M (D 3)), FBF (1, Psibar, SLR, Psi), G_SLR_DbtR); ((M (D (-3)), O (Aux_top (0,0,-1,true,DL)), M (U 3)), FBF (1, Psibar, SL, Psi), Half); ((M (U (-3)), O (Aux_top (0,0,1,false,DL)), M (D 3)), FBF (1, Psibar, SL, Psi), G_SL_DbtL) ] else [] let anomalous_top_quqd1_tq = [ ((M (D (-3)), O (Aux_top (0,0,-1,true,QUQD1R)), M (U 3)), FBF (1, Psibar, SR, Psi), C_quqd1R_bt); ((M (U (-3)), O (Aux_top (0,0, 1,true,QUQD1R)), M (D 3)), FBF (1, Psibar, SL, Psi), C_quqd1R_tb); ((M (D (-3)), O (Aux_top (0,0,-1,true,QUQD1L)), M (U 3)), FBF (1, Psibar, SL, Psi), C_quqd1L_bt); ((M (U (-3)), O (Aux_top (0,0, 1,true,QUQD1L)), M (D 3)), FBF (1, Psibar, SR, Psi), C_quqd1L_tb) ] let anomalous_top_quqd1_ff n = List.map mom [ ((U (-n), Aux_top (0,0, 1,false,QUQD1R), D n), FBF (1, Psibar, SR, Psi), Half); ((D (-n), Aux_top (0,0,-1,false,QUQD1R), U n), FBF (1, Psibar, SL, Psi), Half); ((U (-n), Aux_top (0,0, 1,false,QUQD1L), D n), FBF (1, Psibar, SL, Psi), Half); ((D (-n), Aux_top (0,0,-1,false,QUQD1L), U n), FBF (1, Psibar, SR, Psi), Half) ] let anomalous_top_quqd1 = if Flags.top_anom_4f then anomalous_top_quqd1_tq @ ThoList.flatmap anomalous_top_quqd1_ff [1;2;3] else [] let anomalous_top_quqd8_tq = [ ((M (D (-3)), O (Aux_top (0,1,-1,true,QUQD8R)), M (U 3)), FBF (1, Psibar, SR, Psi), C_quqd8R_bt); ((M (U (-3)), O (Aux_top (0,1, 1,true,QUQD8R)), M (D 3)), FBF (1, Psibar, SL, Psi), C_quqd8R_tb); ((M (D (-3)), O (Aux_top (0,1,-1,true,QUQD8L)), M (U 3)), FBF (1, Psibar, SL, Psi), C_quqd8L_bt); ((M (U (-3)), O (Aux_top (0,1, 1,true,QUQD8L)), M (D 3)), FBF (1, Psibar, SR, Psi), C_quqd8L_tb) ] let anomalous_top_quqd8_ff n = List.map mom [ ((U (-n), Aux_top (0,1, 1,false,QUQD8R), D n), FBF (1, Psibar, SR, Psi), Half); ((D (-n), Aux_top (0,1,-1,false,QUQD8R), U n), FBF (1, Psibar, SL, Psi), Half); ((U (-n), Aux_top (0,1, 1,false,QUQD8L), D n), FBF (1, Psibar, SL, Psi), Half); ((D (-n), Aux_top (0,1,-1,false,QUQD8L), U n), FBF (1, Psibar, SR, Psi), Half) ] let anomalous_top_quqd8 = if Flags.top_anom_4f then anomalous_top_quqd8_tq @ ThoList.flatmap anomalous_top_quqd8_ff [1;2;3] else [] let vertices3 = (ThoList.flatmap electromagnetic_currents [1;2;3] @ ThoList.flatmap color_currents [1;2;3] @ ThoList.flatmap neutral_currents [1;2;3] @ (if Flags.ckm_present then charged_currents_ckm else charged_currents_triv) @ yukawa @ triple_gauge @ gauge_higgs @ higgs @ higgs_triangle_vertices @ goldstone_vertices @ tt_threshold_ttA @ tt_threshold_ttZ @ anomalous_ttA @ anomalous_bbA @ anomalous_ttZ @ anomalous_bbZ @ anomalous_tbW @ anomalous_tbWA @ anomalous_tbWZ @ anomalous_ttWW @ anomalous_bbWW @ anomalous_ttG @ anomalous_ttGG @ anomalous_ttH @ anomalous_top_qGuG @ anomalous_top_qBuB @ anomalous_top_qW @ anomalous_top_DuDd @ anomalous_top_quqd1 @ anomalous_top_quqd8) let vertices4 = quartic_gauge @ gauge_higgs4 @ higgs4 let vertices () = (vertices3, vertices4, []) (* For efficiency, make sure that [F.of_vertices vertices] is evaluated only once. *) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 4 let flavor_of_string = function | "e-" -> M (L 1) | "e+" -> M (L (-1)) | "mu-" -> M (L 2) | "mu+" -> M (L (-2)) | "tau-" -> M (L 3) | "tau+" -> M (L (-3)) | "nue" -> M (N 1) | "nuebar" -> M (N (-1)) | "numu" -> M (N 2) | "numubar" -> M (N (-2)) | "nutau" -> M (N 3) | "nutaubar" -> M (N (-3)) | "u" -> M (U 1) | "ubar" -> M (U (-1)) | "c" -> M (U 2) | "cbar" -> M (U (-2)) | "t" -> M (U 3) | "tbar" -> M (U (-3)) | "d" -> M (D 1) | "dbar" -> M (D (-1)) | "s" -> M (D 2) | "sbar" -> M (D (-2)) | "b" -> M (D 3) | "bbar" -> M (D (-3)) | "g" | "gl" -> G Gl | "A" -> G Ga | "Z" | "Z0" -> G Z | "W+" -> G Wp | "W-" -> G Wm | "H" -> O H | "Aux_t_ttGG0" -> O (Aux_top (2,1, 0,true,TTGG)) | "Aux_ttGG0" -> O (Aux_top (2,1, 0,false,TTGG)) | "Aux_t_tcGG0" -> O (Aux_top (2,1, 0,true,TCGG)) | "Aux_tcGG0" -> O (Aux_top (2,1, 0,false,TCGG)) | "Aux_t_tbWA+" -> O (Aux_top (2,0, 1,true,TBWA)) | "Aux_tbWA+" -> O (Aux_top (2,0, 1,false,TBWA)) | "Aux_t_tbWA-" -> O (Aux_top (2,0,-1,true,TBWA)) | "Aux_tbWA-" -> O (Aux_top (2,0,-1,false,TBWA)) | "Aux_t_tbWZ+" -> O (Aux_top (2,0, 1,true,TBWZ)) | "Aux_tbWZ+" -> O (Aux_top (2,0, 1,false,TBWZ)) | "Aux_t_tbWZ-" -> O (Aux_top (2,0,-1,true,TBWZ)) | "Aux_tbWZ-" -> O (Aux_top (2,0,-1,false,TBWZ)) | "Aux_t_ttWW0" -> O (Aux_top (2,0, 0,true,TTWW)) | "Aux_ttWW0" -> O (Aux_top (2,0, 0,false,TTWW)) | "Aux_t_bbWW0" -> O (Aux_top (2,0, 0,true,BBWW)) | "Aux_bbWW0" -> O (Aux_top (2,0, 0,false,BBWW)) | "Aux_t_qGuG0" -> O (Aux_top (1,1, 0,true,QGUG)) | "Aux_qGuG0" -> O (Aux_top (1,1, 0,false,QGUG)) | "Aux_t_qBuB0" -> O (Aux_top (1,0, 0,true,QBUB)) | "Aux_qBuB0" -> O (Aux_top (1,0, 0,false,QBUB)) | "Aux_t_qW0" -> O (Aux_top (1,0, 0,true,QW)) | "Aux_qW0" -> O (Aux_top (1,0, 0,false,QW)) | "Aux_t_qW+" -> O (Aux_top (1,0, 1,true,QW)) | "Aux_qW+" -> O (Aux_top (1,0, 1,false,QW)) | "Aux_t_qW-" -> O (Aux_top (1,0,-1,true,QW)) | "Aux_qW-" -> O (Aux_top (1,0,-1,false,QW)) | "Aux_t_dL0" -> O (Aux_top (0,0, 0,true,DL)) | "Aux_dL0" -> O (Aux_top (0,0, 0,false,DL)) | "Aux_t_dL+" -> O (Aux_top (0,0, 1,true,DL)) | "Aux_dL+" -> O (Aux_top (0,0, 1,false,DL)) | "Aux_t_dL-" -> O (Aux_top (0,0,-1,true,DL)) | "Aux_dL-" -> O (Aux_top (0,0,-1,false,DL)) | "Aux_t_dR0" -> O (Aux_top (0,0, 0,true,DR)) | "Aux_dR0" -> O (Aux_top (0,0, 0,false,DR)) | "Aux_t_dR+" -> O (Aux_top (0,0, 1,true,DR)) | "Aux_dR+" -> O (Aux_top (0,0, 1,false,DR)) | "Aux_t_dR-" -> O (Aux_top (0,0,-1,true,DR)) | "Aux_dR-" -> O (Aux_top (0,0,-1,false,DR)) | "Aux_t_quqd1L+" -> O (Aux_top (0,0, 1,true,QUQD1L)) | "Aux_quqd1L+" -> O (Aux_top (0,0, 1,false,QUQD1L)) | "Aux_t_quqd1L-" -> O (Aux_top (0,0,-1,true,QUQD1L)) | "Aux_quqd1L-" -> O (Aux_top (0,0,-1,false,QUQD1L)) | "Aux_t_quqd1R+" -> O (Aux_top (0,0, 1,true,QUQD1R)) | "Aux_quqd1R+" -> O (Aux_top (0,0, 1,false,QUQD1R)) | "Aux_t_quqd1R-" -> O (Aux_top (0,0,-1,true,QUQD1R)) | "Aux_quqd1R-" -> O (Aux_top (0,0,-1,false,QUQD1R)) | "Aux_t_quqd8L+" -> O (Aux_top (0,1, 1,true,QUQD8L)) | "Aux_quqd8L+" -> O (Aux_top (0,1, 1,false,QUQD8L)) | "Aux_t_quqd8L-" -> O (Aux_top (0,1,-1,true,QUQD8L)) | "Aux_quqd8L-" -> O (Aux_top (0,1,-1,false,QUQD8L)) | "Aux_t_quqd8R+" -> O (Aux_top (0,1, 1,true,QUQD8R)) | "Aux_quqd8R+" -> O (Aux_top (0,1, 1,false,QUQD8R)) | "Aux_t_quqd8R-" -> O (Aux_top (0,1,-1,true,QUQD8R)) | "Aux_quqd8R-" -> O (Aux_top (0,1,-1,false,QUQD8R)) | _ -> invalid_arg "Modellib.SM.flavor_of_string" let flavor_to_string = function | M f -> begin match f with | L 1 -> "e-" | L (-1) -> "e+" | L 2 -> "mu-" | L (-2) -> "mu+" | L 3 -> "tau-" | L (-3) -> "tau+" | L _ -> invalid_arg "Modellib.SM.flavor_to_string: invalid lepton" | N 1 -> "nue" | N (-1) -> "nuebar" | N 2 -> "numu" | N (-2) -> "numubar" | N 3 -> "nutau" | N (-3) -> "nutaubar" | N _ -> invalid_arg "Modellib.SM.flavor_to_string: invalid neutrino" | U 1 -> "u" | U (-1) -> "ubar" | U 2 -> "c" | U (-2) -> "cbar" | U 3 -> "t" | U (-3) -> "tbar" | U _ -> invalid_arg "Modellib.SM.flavor_to_string: invalid up type quark" | D 1 -> "d" | D (-1) -> "dbar" | D 2 -> "s" | D (-2) -> "sbar" | D 3 -> "b" | D (-3) -> "bbar" | D _ -> invalid_arg "Modellib.SM.flavor_to_string: invalid down type quark" end | G f -> begin match f with | Gl -> "gl" | Ga -> "A" | Z -> "Z" | Wp -> "W+" | Wm -> "W-" end | O f -> begin match f with | Phip -> "phi+" | Phim -> "phi-" | Phi0 -> "phi0" | H -> "H" | Aux_top (_,_,ch,n,v) -> "Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | TCGG -> "tcgg" | TUGG -> "tugg" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" | QUQD1L -> "quqd1L" | QUQD1R -> "quqd1R" | QUQD8L -> "quqd8L" | QUQD8R -> "quqd8R" end ) ^ ( if ch > 0 then "+" else if ch < 0 then "-" else "0" ) end let flavor_to_TeX = function | M f -> begin match f with | L 1 -> "e^-" | L (-1) -> "e^+" | L 2 -> "\\mu^-" | L (-2) -> "\\mu^+" | L 3 -> "\\tau^-" | L (-3) -> "\\tau^+" | L _ -> invalid_arg "Modellib.SM.flavor_to_TeX: invalid lepton" | N 1 -> "\\nu_e" | N (-1) -> "\\bar{\\nu}_e" | N 2 -> "\\nu_\\mu" | N (-2) -> "\\bar{\\nu}_\\mu" | N 3 -> "\\nu_\\tau" | N (-3) -> "\\bar{\\nu}_\\tau" | N _ -> invalid_arg "Modellib.SM.flavor_to_TeX: invalid neutrino" | U 1 -> "u" | U (-1) -> "\\bar{u}" | U 2 -> "c" | U (-2) -> "\\bar{c}" | U 3 -> "t" | U (-3) -> "\\bar{t}" | U _ -> invalid_arg "Modellib.SM.flavor_to_TeX: invalid up type quark" | D 1 -> "d" | D (-1) -> "\\bar{d}" | D 2 -> "s" | D (-2) -> "\\bar{s}" | D 3 -> "b" | D (-3) -> "\\bar{b}" | D _ -> invalid_arg "Modellib.SM.flavor_to_TeX: invalid down type quark" end | G f -> begin match f with | Gl -> "g" | Ga -> "\\gamma" | Z -> "Z" | Wp -> "W^+" | Wm -> "W^-" end | O f -> begin match f with | Phip -> "\\phi^+" | Phim -> "\\phi^-" | Phi0 -> "\\phi^0" | H -> "H" | Aux_top (_,_,ch,n,v) -> "\\textnormal{Aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttGG" | TBWA -> "tbWA" | TBWZ -> "tbWZ" | TTWW -> "ttWW" | BBWW -> "bbWW" | TCGG -> "tcgg" | TUGG -> "tugg" | QGUG -> "qGuG" | QBUB -> "qBuB" | QW -> "qW" | DL -> "dL" | DR -> "dR" | QUQD1L -> "quqd1L" | QUQD1R -> "quqd1R" | QUQD8L -> "quqd8L" | QUQD8R -> "quqd8R" end ) ^ ( if ch > 0 then "^+" else if ch < 0 then "^-" else "^0" ) ^ "}" end let flavor_symbol = function | M f -> begin match f with | L n when n > 0 -> "l" ^ string_of_int n | L n -> "l" ^ string_of_int (abs n) ^ "b" | N n when n > 0 -> "n" ^ string_of_int n | N n -> "n" ^ string_of_int (abs n) ^ "b" | U n when n > 0 -> "u" ^ string_of_int n | U n -> "u" ^ string_of_int (abs n) ^ "b" | D n when n > 0 -> "d" ^ string_of_int n | D n -> "d" ^ string_of_int (abs n) ^ "b" end | G f -> begin match f with | Gl -> "gl" | Ga -> "a" | Z -> "z" | Wp -> "wp" | Wm -> "wm" end | O f -> begin match f with | Phip -> "pp" | Phim -> "pm" | Phi0 -> "p0" | H -> "h" | Aux_top (_,_,ch,n,v) -> "aux_" ^ (if n then "t_" else "") ^ ( begin match v with | TTGG -> "ttgg" | TBWA -> "tbwa" | TBWZ -> "tbwz" | TTWW -> "ttww" | BBWW -> "bbww" | TCGG -> "tcgg" | TUGG -> "tugg" | QGUG -> "qgug" | QBUB -> "qbub" | QW -> "qw" | DL -> "dl" | DR -> "dr" | QUQD1L -> "quqd1l" | QUQD1R -> "quqd1r" | QUQD8L -> "quqd8l" | QUQD8R -> "quqd8r" end ) ^ "_" ^ ( if ch > 0 then "p" else if ch < 0 then "m" else "0" ) end let pdg = function | M f -> begin match f with | L n when n > 0 -> 9 + 2*n | L n -> - 9 + 2*n | N n when n > 0 -> 10 + 2*n | N n -> - 10 + 2*n | U n when n > 0 -> 2*n | U n -> 2*n | D n when n > 0 -> - 1 + 2*n | D n -> 1 + 2*n end | G f -> begin match f with | Gl -> 21 | Ga -> 22 | Z -> 23 | Wp -> 24 | Wm -> (-24) end | O f -> begin match f with | Phip | Phim -> 27 | Phi0 -> 26 | H -> 25 | Aux_top (_,_,ch,t,f) -> let n = begin match f with | QW -> 0 | QUQD1R -> 1 | QUQD1L -> 2 | QUQD8R -> 3 | QUQD8L -> 4 | _ -> 5 end in (602 + 3*n - ch) * ( if t then (1) else (-1) ) end let mass_symbol f = if ( Flags.tt_threshold && (abs (pdg f)) == 6 ) then "ttv_mtpole(p12*p12)" else "mass(" ^ string_of_int (abs (pdg f)) ^ ")" let width_symbol f = "width(" ^ string_of_int (abs (pdg f)) ^ ")" let constant_symbol = function | Unit -> "unit" | Half -> "half" | Pi -> "PI" | Alpha_QED -> "alpha" | E -> "e" | G_weak -> "g" | Vev -> "vev" | I_G_weak -> "ig" | Sin2thw -> "sin2thw" | Sinthw -> "sinthw" | Costhw -> "costhw" | Q_lepton -> "qlep" | Q_up -> "qup" | Q_down -> "qdwn" | G_NC_lepton -> "gnclep" | G_NC_neutrino -> "gncneu" | G_NC_up -> "gncup" | G_NC_down -> "gncdwn" | G_TVA_ttA -> "gtva_tta" | G_TVA_bbA -> "gtva_bba" | G_VLR_ttZ -> "gvlr_ttz" | G_TVA_ttZ -> "gtva_ttz" | G_VLR_tcZ -> "gvlr_tcz" | G_TVA_tcZ -> "gtva_tcz" | G_VLR_tuZ -> "gvlr_tuz" | G_TVA_tuZ -> "gtva_tuz" | G_TVA_bbZ -> "gtva_bbz" | G_TVA_tcA -> "gtva_tca" | G_TVA_tuA -> "gtva_tua" | VA_ILC_ttA -> "va_ilc_tta" | VA_ILC_ttZ -> "va_ilc_ttz" | G_VLR_btW -> "gvlr_btw" | G_VLR_tbW -> "gvlr_tbw" | G_TLR_btW -> "gtlr_btw" | G_TRL_tbW -> "gtrl_tbw" | G_TLR_btWA -> "gtlr_btwa" | G_TRL_tbWA -> "gtrl_tbwa" | G_TLR_btWZ -> "gtlr_btwz" | G_TRL_tbWZ -> "gtrl_tbwz" | G_TVA_ttWW -> "gtva_ttww" | G_TVA_bbWW -> "gtva_bbww" | G_TVA_ttG -> "gtva_ttg" | G_TVA_ttGG -> "gtva_ttgg" | G_TVA_tcG -> "gtva_tcg" | G_TVA_tcGG -> "gtva_tcgg" | G_TVA_tuG -> "gtva_tug" | G_TVA_tuGG -> "gtva_tugg" | G_SP_ttH -> "gsp_tth" | G_VLR_qGuG -> "gvlr_qgug" | G_VLR_qBuB -> "gvlr_qbub" | G_VLR_qBuB_u -> "gvlr_qbub_u" | G_VLR_qBuB_d -> "gvlr_qbub_d" | G_VLR_qBuB_e -> "gvlr_qbub_e" | G_VL_qBuB_n -> "gvl_qbub_n" | G_VL_qW -> "gvl_qw" | G_VL_qW_u -> "gvl_qw_u" | G_VL_qW_d -> "gvl_qw_d" | G_SL_DttR -> "gsl_dttr" | G_SR_DttR -> "gsr_dttr" | G_SL_DttL -> "gsl_dttl" | G_SLR_DbtR -> "gslr_dbtr" | G_SL_DbtL -> "gsl_dbtl" | C_quqd1R_bt -> "c_quqd1_1" | C_quqd1R_tb -> "conjg(c_quqd1_1)" | C_quqd1L_bt -> "conjg(c_quqd1_2)" | C_quqd1L_tb -> "c_quqd1_2" | C_quqd8R_bt -> "c_quqd8_1" | C_quqd8R_tb -> "conjg(c_quqd8_1)" | C_quqd8L_bt -> "conjg(c_quqd8_2)" | C_quqd8L_tb -> "c_quqd8_2" | G_CC -> "gcc" | G_CCQ (n1,n2) -> "gccq" ^ string_of_int n1 ^ string_of_int n2 | I_Q_W -> "iqw" | I_G_ZWW -> "igzww" | G_WWWW -> "gw4" | G_ZZWW -> "gzzww" | G_AZWW -> "gazww" | G_AAWW -> "gaaww" | I_G1_AWW -> "ig1a" | I_G1_ZWW -> "ig1z" | I_G1_plus_kappa_plus_G4_AWW -> "ig1pkpg4a" | I_G1_plus_kappa_plus_G4_ZWW -> "ig1pkpg4z" | I_G1_plus_kappa_minus_G4_AWW -> "ig1pkmg4a" | I_G1_plus_kappa_minus_G4_ZWW -> "ig1pkmg4z" | I_G1_minus_kappa_plus_G4_AWW -> "ig1mkpg4a" | I_G1_minus_kappa_plus_G4_ZWW -> "ig1mkpg4z" | I_G1_minus_kappa_minus_G4_AWW -> "ig1mkmg4a" | I_G1_minus_kappa_minus_G4_ZWW -> "ig1mkmg4z" | I_lambda_AWW -> "ila" | I_lambda_ZWW -> "ilz" | G5_AWW -> "rg5a" | G5_ZWW -> "rg5z" | I_kappa5_AWW -> "ik5a" | I_kappa5_ZWW -> "ik5z" | I_lambda5_AWW -> "il5a" | I_lambda5_ZWW -> "il5z" | Alpha_WWWW0 -> "alww0" | Alpha_WWWW2 -> "alww2" | Alpha_ZZWW0 -> "alzw0" | Alpha_ZZWW1 -> "alzw1" | Alpha_ZZZZ -> "alzz" | D_Alpha_ZZWW0_S -> "dalzz0_s(gkm,mkm," | D_Alpha_ZZWW0_T -> "dalzz0_t(gkm,mkm," | D_Alpha_ZZWW1_S -> "dalzz1_s(gkm,mkm," | D_Alpha_ZZWW1_T -> "dalzz1_t(gkm,mkm," | D_Alpha_ZZWW1_U -> "dalzz1_u(gkm,mkm," | D_Alpha_WWWW0_S -> "dalww0_s(gkm,mkm," | D_Alpha_WWWW0_T -> "dalww0_t(gkm,mkm," | D_Alpha_WWWW0_U -> "dalww0_u(gkm,mkm," | D_Alpha_WWWW2_S -> "dalww2_s(gkm,mkm," | D_Alpha_WWWW2_T -> "dalww2_t(gkm,mkm," | D_Alpha_ZZZZ_S -> "dalz4_s(gkm,mkm," | D_Alpha_ZZZZ_T -> "dalz4_t(gkm,mkm," | G_HWW -> "ghww" | G_HZZ -> "ghzz" | G_HHWW -> "ghhww" | G_HHZZ -> "ghhzz" | G_Htt -> "ghtt" | G_Hbb -> "ghbb" | G_Hss -> "ghss" | G_Hee -> "ghee" | G_Htautau -> "ghtautau" | G_Hcc -> "ghcc" | G_Hmm -> "ghmm" | G_HGaZ -> "ghgaz" | G_HGaGa -> "ghgaga" | G_Hgg -> "ghgg" | G_HGaGa_anom -> "ghgaga_ac" | G_HGaZ_anom -> "ghgaz_ac" | G_HZZ_anom -> "ghzz_ac" | G_HWW_anom -> "ghww_ac" | G_HGaZ_u -> "ghgaz_u" | G_HZZ_u -> "ghzz_u" | G_HWW_u -> "ghww_u" | G_H3 -> "gh3" | G_H4 -> "gh4" | Gs -> "gs" | I_Gs -> "igs" | G2 -> "gs**2" | Mass f -> "mass" ^ flavor_symbol f | Width f -> "width" ^ flavor_symbol f | K_Matrix_Coeff i -> "kc" ^ string_of_int i | K_Matrix_Pole i -> "kp" ^ string_of_int i | G_HZZ6_V3 -> "ghzz6v3" | G_HZZ6_D ->"ghzz6d" | G_HZZ6_DP ->"ghzz6dp" | G_HZZ6_PB ->"ghzz6pb" | G_HGaZ6_D -> "ghaz6d" | G_HGaZ6_DP -> "ghaz6dp" | G_HGaZ6_PB -> "ghaz6pb" | G_HGaGa6 -> "ghgaga6" | G_HWW_6_D -> "ghww6d" | G_HWW_6_DP ->"ghww6dp" | I_Dim6_AWW_Gauge -> "dim6awwgauge" | I_Dim6_AWW_GGG -> "dim6awwggg" | I_Dim6_AWW_DP -> "dim6awwdp" | I_Dim6_AWW_DW -> "dim6awwdw" | I_Dim6_WWZ_W -> "dim6wwzw" | I_Dim6_WWZ_DPWDW -> "dim6wwzdpwdw" | I_Dim6_WWZ_DW -> "dim6wwzdw" | I_Dim6_WWZ_D -> "dim6wwzd" | Dim6_vev3 -> "dim6vev3" | Dim6_Cphi -> "dim6cphi" (*i | I_Dim6_GGG_G -> "dim6gggg" | I_Dim6_GGG_CG -> "dim6gggcg" i*) | Anom_Dim6_H4_v2 -> "adim6h4v2" | Anom_Dim6_H4_P2 -> "adim6h4p2" | Anom_Dim6_AHWW_DPB -> "adim6ahwwdpb" | Anom_Dim6_AHWW_DPW -> "adim6ahwwdpw" | Anom_Dim6_AHWW_DW -> "adim6ahwwdw" | Anom_Dim6_AAWW_DW -> "adim6aawwdw" | Anom_Dim6_AAWW_W -> "adim6aawww" | Anom_Dim6_HHWW_DW -> "adim6hhwwdw" | Anom_Dim6_HHWW_DPW -> "adim6hhwwdpw" | Anom_Dim6_HWWZ_DW -> "adim6hwwzdw" | Anom_Dim6_HWWZ_DDPW -> "adim6hwwzddpw" | Anom_Dim6_HWWZ_DPW -> "adim6hwwzdpw" | Anom_Dim6_HWWZ_DPB -> "adim6hwwzdpb" | Anom_Dim6_AHHZ_D -> "adim6ahhzd" | Anom_Dim6_AHHZ_DP -> "adim6ahhzdp" | Anom_Dim6_AHHZ_PB -> "adim6ahhzpb" | Anom_Dim6_AZWW_W -> "adim6azwww" | Anom_Dim6_AZWW_DWDPW -> "adim6azwwdwdpw" | Anom_Dim6_WWWW_W -> "adim6wwwww" | Anom_Dim6_WWWW_DWDPW -> "adim6wwwwdwdpw" | Anom_Dim6_WWZZ_W -> "adim6wwzzw" | Anom_Dim6_WWZZ_DWDPW -> "adim6wwzzdwdpw" | Anom_Dim6_HHAA -> "adim6hhaa" | Anom_Dim6_HHZZ_D -> "adim6hhzzd" | Anom_Dim6_HHZZ_DP -> "adim6hhzzdp" | Anom_Dim6_HHZZ_PB -> "adim6hhzzpb" | Anom_Dim6_HHZZ_T -> "adim6hhzzt" end (* \thocwmodulesection{Incomplete Standard Model in $R_\xi$ Gauge} *) (* \begin{dubious} At the end of the day, we want a functor mapping from gauge models in unitarity gauge to $R_\xi$ gauge and vice versa. For this, we will need a more abstract implementation of (spontaneously broken) gauge theories. \end{dubious} *) module SM_Rxi = struct open Coupling module SM = SM(SM_no_anomalous) let options = SM.options + let caveats = SM.caveats type flavor = SM.flavor let flavors = SM.flavors let external_flavors = SM.external_flavors (* Later: [type orders = SM.orders] *) type constant = SM.constant (* Later: [let orders = SM.orders] *) let lorentz = SM.lorentz let color = SM.color let nc = SM.nc let goldstone = SM.goldstone let conjugate = SM.conjugate let fermion = SM.fermion (* \begin{dubious} Check if it makes sense to have separate gauge fixing parameters for each vector boson. There's probably only one independent parameter for each group factor. \end{dubious} *) type gauge = | XiA | XiZ | XiW let gauge_symbol = function | XiA -> "xia" | XiZ -> "xi0" | XiW -> "xipm" (* Change the gauge boson propagators and make the Goldstone bosons propagating. *) let propagator = function | SM.G SM.Ga -> Prop_Gauge XiA | SM.G SM.Z -> Prop_Rxi XiZ | SM.G SM.Wp | SM.G SM.Wm -> Prop_Rxi XiW | SM.O SM.Phip | SM.O SM.Phim | SM.O SM.Phi0 -> Prop_Scalar | f -> SM.propagator f let width = SM.width module Ch = Charges.QQ let charges = SM.charges module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) let vertices = SM.vertices let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table let max_degree () = 3 let parameters = SM.parameters let flavor_of_string = SM.flavor_of_string let flavor_to_string = SM.flavor_to_string let flavor_to_TeX = SM.flavor_to_TeX let flavor_symbol = SM.flavor_symbol let pdg = SM.pdg let mass_symbol = SM.mass_symbol let width_symbol = SM.width_symbol let constant_symbol = SM.constant_symbol end (* \thocwmodulesection{Groves} *) module Groves (M : Model.Gauge) : Model.Gauge with module Ch = M.Ch = struct let max_generations = 5 let options = M.options + let caveats = M.caveats type matter_field = M.matter_field * int type gauge_boson = M.gauge_boson type other = M.other type field = | Matter of matter_field | Gauge of gauge_boson | Other of other type flavor = M of matter_field | G of gauge_boson | O of other let matter_field (f, g) = M (f, g) let gauge_boson f = G f let other f = O f let field = function | M f -> Matter f | G f -> Gauge f | O f -> Other f let project = function | M (f, _) -> M.matter_field f | G f -> M.gauge_boson f | O f -> M.other f let inject g f = match M.field f with | M.Matter f -> M (f, g) | M.Gauge f -> G f | M.Other f -> O f type gauge = M.gauge let gauge_symbol = M.gauge_symbol let color f = M.color (project f) let nc () = 3 let pdg f = M.pdg (project f) let lorentz f = M.lorentz (project f) let propagator f = M.propagator (project f) let fermion f = M.fermion (project f) let width f = M.width (project f) let mass_symbol f = M.mass_symbol (project f) let width_symbol f = M.width_symbol (project f) let flavor_symbol f = M.flavor_symbol (project f) type constant = M.constant (* Later: [type orders = M.orders] *) let constant_symbol = M.constant_symbol let max_degree = M.max_degree let parameters = M.parameters (* Later: [let orders = M.orders] *) let conjugate = function | M (_, g) as f -> inject g (M.conjugate (project f)) | f -> inject 0 (M.conjugate (project f)) let read_generation s = try let offset = String.index s '/' in (int_of_string (String.sub s (succ offset) (String.length s - offset - 1)), String.sub s 0 offset) with | Not_found -> (1, s) let format_generation c s = s ^ "/" ^ string_of_int c let flavor_of_string s = let g, s = read_generation s in inject g (M.flavor_of_string s) let flavor_to_string = function | M (_, g) as f -> format_generation g (M.flavor_to_string (project f)) | f -> M.flavor_to_string (project f) let flavor_to_TeX = function | M (_, g) as f -> format_generation g (M.flavor_to_TeX (project f)) | f -> M.flavor_to_TeX (project f) let goldstone = function | G _ as f -> begin match M.goldstone (project f) with | None -> None | Some (f, c) -> Some (inject 0 f, c) end | M _ | O _ -> None let clone generations flavor = match M.field flavor with | M.Matter f -> List.map (fun g -> M (f, g)) generations | M.Gauge f -> [G f] | M.Other f -> [O f] let generations = ThoList.range 1 max_generations let flavors () = ThoList.flatmap (clone generations) (M.flavors ()) let external_flavors () = List.map (fun (s, fl) -> (s, ThoList.flatmap (clone generations) fl)) (M.external_flavors ()) module Ch = M.Ch let charges f = M.charges (project f) module F = Modeltools.Fusions (struct type f = flavor type c = constant let compare = compare let conjugate = conjugate end) (* In the following functions, we might replace [_] by [(M.Gauge _ | M.Other _)], in order to allow the compiler to check completeness. However, this makes the code much less readable. *) let clone3 ((f1, f2, f3), v, c) = match M.field f1, M.field f2, M.field f3 with | M.Matter _, M.Matter _, M.Matter _ -> invalid_arg "Modellib.Groves().vertices: three matter fields!" | M.Matter f1', M.Matter f2', _ -> List.map (fun g -> ((M (f1', g), M (f2', g), inject 0 f3), v, c)) generations | M.Matter f1', _, M.Matter f3' -> List.map (fun g -> ((M (f1', g), inject 0 f2, M (f3', g)), v, c)) generations | _, M.Matter f2', M.Matter f3' -> List.map (fun g -> ((inject 0 f1, M (f2', g), M (f3', g)), v, c)) generations | M.Matter _, _, _ | _, M.Matter _, _ | _, _, M.Matter _ -> invalid_arg "Modellib.Groves().vertices: lone matter field!" | _, _, _ -> [(inject 0 f1, inject 0 f2, inject 0 f3), v, c] let clone4 ((f1, f2, f3, f4), v, c) = match M.field f1, M.field f2, M.field f3, M.field f4 with | M.Matter _, M.Matter _, M.Matter _, M.Matter _ -> invalid_arg "Modellib.Groves().vertices: four matter fields!" | M.Matter _, M.Matter _, M.Matter _, _ | M.Matter _, M.Matter _, _, M.Matter _ | M.Matter _, _, M.Matter _, M.Matter _ | _, M.Matter _, M.Matter _, M.Matter _ -> invalid_arg "Modellib.Groves().vertices: three matter fields!" | M.Matter f1', M.Matter f2', _, _ -> List.map (fun g -> ((M (f1', g), M (f2', g), inject 0 f3, inject 0 f4), v, c)) generations | M.Matter f1', _, M.Matter f3', _ -> List.map (fun g -> ((M (f1', g), inject 0 f2, M (f3', g), inject 0 f4), v, c)) generations | M.Matter f1', _, _, M.Matter f4' -> List.map (fun g -> ((M (f1', g), inject 0 f2, inject 0 f3, M (f4', g)), v, c)) generations | _, M.Matter f2', M.Matter f3', _ -> List.map (fun g -> ((inject 0 f1, M (f2', g), M (f3', g), inject 0 f4), v, c)) generations | _, M.Matter f2', _, M.Matter f4' -> List.map (fun g -> ((inject 0 f1, M (f2', g), inject 0 f3, M (f4', g)), v, c)) generations | _, _, M.Matter f3', M.Matter f4' -> List.map (fun g -> ((inject 0 f1, inject 0 f2, M (f3', g), M (f4', g)), v, c)) generations | M.Matter _, _, _, _ | _, M.Matter _, _, _ | _, _, M.Matter _, _ | _, _, _, M.Matter _ -> invalid_arg "Modellib.Groves().vertices: lone matter field!" | _, _, _, _ -> [(inject 0 f1, inject 0 f2, inject 0 f3, inject 0 f4), v, c] let clonen (fl, v, c) = match List.map M.field fl with | _ -> failwith "Modellib.Groves().vertices: incomplete" let vertices () = let vertices3, vertices4, verticesn = M.vertices () in (ThoList.flatmap clone3 vertices3, ThoList.flatmap clone4 vertices4, ThoList.flatmap clonen verticesn) let table = F.of_vertices (vertices ()) let fuse2 = F.fuse2 table let fuse3 = F.fuse3 table let fuse = F.fuse table (* \begin{dubious} The following (incomplete) alternative implementations are included for illustrative purposes only: \end{dubious} *) let injectl g fcl = List.map (fun (f, c) -> (inject g f, c)) fcl let alt_fuse2 f1 f2 = match f1, f2 with | M (f1', g1'), M (f2', g2') -> if g1' = g2' then injectl 0 (M.fuse2 (M.matter_field f1') (M.matter_field f2')) else [] | M (f1', g'), _ -> injectl g' (M.fuse2 (M.matter_field f1') (project f2)) | _, M (f2', g') -> injectl g' (M.fuse2 (project f1) (M.matter_field f2')) | _, _ -> injectl 0 (M.fuse2 (project f1) (project f2)) let alt_fuse3 f1 f2 f3 = match f1, f2, f3 with | M (f1', g1'), M (f2', g2'), M (f3', g3') -> invalid_arg "Modellib.Groves().fuse3: three matter fields!" | M (f1', g1'), M (f2', g2'), _ -> if g1' = g2' then injectl 0 (M.fuse3 (M.matter_field f1') (M.matter_field f2') (project f3)) else [] | M (f1', g1'), _, M (f3', g3') -> if g1' = g3' then injectl 0 (M.fuse3 (M.matter_field f1') (project f2) (M.matter_field f3')) else [] | _, M (f2', g2'), M (f3', g3') -> if g2' = g3' then injectl 0 (M.fuse3 (project f1) (M.matter_field f2') (M.matter_field f3')) else [] | M (f1', g'), _, _ -> injectl g' (M.fuse3 (M.matter_field f1') (project f2) (project f3)) | _, M (f2', g'), _ -> injectl g' (M.fuse3 (project f1) (M.matter_field f2') (project f3)) | _, _, M (f3', g') -> injectl g' (M.fuse3 (project f1) (project f2) (M.matter_field f3')) | _, _, _ -> injectl 0 (M.fuse3 (project f1) (project f2) (project f3)) end (* \thocwmodulesection{MSM With Cloned Families} *) module SM_clones = Groves(SM(SM_no_anomalous)) Index: trunk/omega/src/compare_majorana.sh =================================================================== --- trunk/omega/src/compare_majorana.sh (revision 0) +++ trunk/omega/src/compare_majorana.sh (revision 8416) @@ -0,0 +1,42 @@ +#! /bin/sh +######################################################################## +# This script is for developers only and needs not to be portable. +# This script takes TO's directory structure for granted. +######################################################################## +# tl;dr : don't try this at home, kids ;) +######################################################################## + +case "$#" in + 2) mode="$1" + process="$2" + ;; + *) echo "usage: $0 [-scatter|-decay] process" 1>&2 + exit 2 + ;; +esac + +jobs=12 +width=1000 +width=80 + +root=$HOME/physics/whizard +build=$root/_build/default + +OCAMLFLAGS="-w -D -warn-error +P" +make OCAMLFLAGS="$OCAMLFLAGS" -j $jobs -C $build/omega/src || exit 1 +make -j $jobs -C $build/omega/bin \ + omega_SM.opt omega_SM_Majorana.opt || exit 1 + +omega_dirac="$build/omega/bin/omega_SM.opt -target:width $width" +omega_majorana="$build/omega/bin/omega_SM_Majorana.opt -target:width $width" + +$omega_dirac "$mode" "$process" > omega_amplitude_dirac.f90 2>/dev/null +$omega_majorana "$mode" "$process" > omega_amplitude_majorana.f90 2>/dev/null + +if grep -q 'integer, parameter :: n_prt = 0' omega_amplitude_dirac.f90; then + echo "O'Mega Dirac empty: $mode $process" 1>&2; +elif grep -q 'integer, parameter :: n_prt = 0' omega_amplitude_majorana.f90; then + echo "O'Mega Majorana empty: $mode $process" 1>&2; +else + diff -u omega_amplitude_dirac.f90 omega_amplitude_majorana.f90 +fi Property changes on: trunk/omega/src/compare_majorana.sh ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/omega/src/fusion.ml =================================================================== --- trunk/omega/src/fusion.ml (revision 8415) +++ trunk/omega/src/fusion.ml (revision 8416) @@ -1,3349 +1,3427 @@ (* fusion.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Marco Sekulla WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Avoid refering to [Pervasives.compare], because [Pervasives] will become [Stdlib.Pervasives] in O'Caml 4.07 and [Stdlib] in O'Caml 4.08. *) let pcompare = compare module type T = sig val options : Options.t + val vintage : bool type wf val conjugate : wf -> wf type flavor type flavor_sans_color val flavor : wf -> flavor val flavor_sans_color : wf -> flavor_sans_color type p val momentum : wf -> p val momentum_list : wf -> int list val wf_tag : wf -> string option type constant type coupling type rhs type 'a children val sign : rhs -> int val coupling : rhs -> constant Coupling.t val coupling_tag : rhs -> string option type exclusions val no_exclusions : exclusions val children : rhs -> wf list type fusion val lhs : fusion -> wf val rhs : fusion -> rhs list type braket val bra : braket -> wf val ket : braket -> rhs list type amplitude type amplitude_sans_color type selectors val amplitudes : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude list val amplitude_sans_color : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude_sans_color val dependencies : amplitude -> wf -> (wf, coupling) Tree2.t val incoming : amplitude -> flavor list val outgoing : amplitude -> flavor list val externals : amplitude -> wf list val variables : amplitude -> wf list val fusions : amplitude -> fusion list val brakets : amplitude -> braket list val on_shell : amplitude -> (wf -> bool) val is_gauss : amplitude -> (wf -> bool) val constraints : amplitude -> string option val symmetry : amplitude -> int val allowed : amplitude -> bool val initialize_cache : string -> unit val set_cache_name : string -> unit val check_charges : unit -> flavor_sans_color list list val count_fusions : amplitude -> int val count_propagators : amplitude -> int val count_diagrams : amplitude -> int val forest : wf -> amplitude -> ((wf * coupling option, wf) Tree.t) list val poles : amplitude -> wf list list val s_channel : amplitude -> wf list val tower_to_dot : out_channel -> amplitude -> unit val amplitude_to_dot : out_channel -> amplitude -> unit val phase_space_channels : out_channel -> amplitude_sans_color -> unit val phase_space_channels_flipped : out_channel -> amplitude_sans_color -> unit end module type Maker = functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant and type selectors = Cascade.Make(M)(P).selectors (* \thocwmodulesection{Fermi Statistics} *) module type Stat = sig type flavor type stat exception Impossible val stat : flavor -> int -> stat val stat_fuse : Coupling.fermion_lines option -> stat list -> flavor -> stat val stat_keystone : Coupling.fermion_lines option -> stat list -> flavor -> stat val stat_sign : stat -> int (* debugging \ldots *) val stat_to_string : stat -> string val equal : stat -> stat -> bool val complete : stat -> bool end module type Stat_Maker = functor (M : Model.T) -> Stat with type flavor = M.flavor (* \thocwmodulesection{Dirac Fermions} *) exception Majorana module Stat_Dirac (M : Model.T) : (Stat with type flavor = M.flavor) = struct type flavor = M.flavor (* \begin{equation} \gamma_\mu\psi(1)\,G^{\mu\nu}\,\bar\psi(2)\gamma_\nu\psi(3) - \gamma_\mu\psi(3)\,G^{\mu\nu}\,\bar\psi(2)\gamma_\nu\psi(1) \end{equation} *) type stat = | Fermion of int * (int option * int option) list | AntiFermion of int * (int option * int option) list | Boson of (int option * int option) list let lines_to_string lines = ThoList.to_string (function | Some i, Some j -> Printf.sprintf "%d>%d" i j | Some i, None -> Printf.sprintf "%d>*" i | None, Some j -> Printf.sprintf "*>%d" j | None, None -> "*>*") lines let stat_to_string = function | Boson lines -> Printf.sprintf "Boson %s" (lines_to_string lines) | Fermion (p, lines) -> Printf.sprintf "Fermion (%d, %s)" p (lines_to_string lines) | AntiFermion (p, lines) -> Printf.sprintf "AntiFermion (%d, %s)" p (lines_to_string lines) let equal s1 s2 = match s1, s2 with | Boson l1, Boson l2 -> List.sort compare l1 = List.sort compare l2 | Fermion (p1, l1), Fermion (p2, l2) | AntiFermion (p1, l1), AntiFermion (p2, l2) -> p1 = p2 && List.sort compare l1 = List.sort compare l2 | _ -> false let complete = function | Boson _ -> true | _ -> false let stat f p = match M.fermion f with | 0 -> Boson [] | 1 -> Fermion (p, []) | -1 -> AntiFermion (p, []) | 2 -> raise Majorana | _ -> invalid_arg "Fusion.Stat_Dirac: invalid fermion number" exception Impossible let stat_fuse_pair_legacy f s1 s2 = match s1, s2 with | Boson l1, Boson l2 -> Boson (l1 @ l2) | Boson l1, Fermion (p, l2) -> Fermion (p, l1 @ l2) | Boson l1, AntiFermion (p, l2) -> AntiFermion (p, l1 @ l2) | Fermion (p, l1), Boson l2 -> Fermion (p, l1 @ l2) | AntiFermion (p, l1), Boson l2 -> AntiFermion (p, l1 @ l2) | AntiFermion (pbar, l1), Fermion (p, l2) -> Boson ((Some pbar, Some p) :: l1 @ l2) | Fermion (p, l1), AntiFermion (pbar, l2) -> Boson ((Some pbar, Some p) :: l1 @ l2) | Fermion _, Fermion _ | AntiFermion _, AntiFermion _ -> raise Impossible let stat_fuse_legacy s1 s23__n f = List.fold_right (stat_fuse_pair_legacy f) s23__n s1 let stat_fuse_legacy_logging s1 s23__n f = let s = stat_fuse_legacy s1 s23__n f in Printf.eprintf "Fusion.Stat_Dirac.stat_fuse_legacy: %s <- %s -> %s\n" (M.flavor_to_string f) (ThoList.to_string stat_to_string (s1 :: s23__n)) (stat_to_string s); s module IMap = Map.Make (struct type t = int let compare = compare end) type partial = { stat : stat; fermions : int IMap.t; antifermions : int IMap.t; n : int } let partial_to_string p = Printf.sprintf - "n = %d, fermions = %s, antifermions = %s, stat = %s" - p.n + "{ %s, %s, %s, %d }" (ThoList.to_string - (fun (i, f) -> Printf.sprintf "%d@%d" f i) + (fun (i, f) -> Printf.sprintf "%d@%d" i f) (IMap.bindings p.fermions)) (ThoList.to_string - (fun (i, f) -> Printf.sprintf "%d@%d" f i) + (fun (i, f) -> Printf.sprintf "%d@%d" i f) (IMap.bindings p.antifermions)) (stat_to_string p.stat) + p.n let add_lines l = function | Boson l' -> Boson (List.rev_append l l') | Fermion (n, l') -> Fermion (n, List.rev_append l l') | AntiFermion (n, l') -> AntiFermion (n, List.rev_append l l') let partial_of_slist slist = List.fold_left (fun acc s -> let n = succ acc.n in match s with | Boson l -> { acc with stat = add_lines l acc.stat; n } | Fermion (p, l) -> { acc with fermions = IMap.add n p acc.fermions; stat = add_lines l acc.stat; n } | AntiFermion (p, l) -> { acc with antifermions = IMap.add n p acc.antifermions; stat = add_lines l acc.stat; n } ) { stat = Boson []; fermions = IMap.empty; antifermions = IMap.empty; n = 0 } slist let find_opt p map = try Some (IMap.find p map) with Not_found -> None let match_fermion_line p (i, j) = if i <= p.n && j <= p.n then match find_opt i p.fermions, find_opt j p.antifermions with | (Some _ as f), (Some _ as fbar) -> { p with stat = add_lines [fbar, f] p.stat; fermions = IMap.remove i p.fermions; antifermions = IMap.remove j p.antifermions } | _ -> - invalid_arg "match_fermion_line: mismatch" + invalid_arg "match_fermion_line: mismatched boson" else if i <= p.n then match find_opt i p.fermions, p.stat with | Some f, Boson l -> { p with stat = Fermion (f, l); fermions = IMap.remove i p.fermions } | _ -> - invalid_arg "match_fermion_line: mismatch" + invalid_arg "match_fermion_line: mismatched fermion" else if j <= p.n then match find_opt j p.antifermions, p.stat with | Some fbar, Boson l -> { p with stat = AntiFermion (fbar, l); antifermions = IMap.remove j p.antifermions } | _ -> - invalid_arg "match_fermion_line: mismatch" + invalid_arg "match_fermion_line: mismatched antifermion" else failwith "match_fermion_line: impossible" let match_fermion_line_logging p (i, j) = Printf.eprintf - "Fusion.match_fermion_line <<< %s (%d, %d)\n" + "Fusion.Stat_Dirac.match_fermion_line %s (%d, %d)" (partial_to_string p) i j; let p' = match_fermion_line p (i, j) in - Printf.eprintf - "Fusion.match_fermion_line >>> %s\n" - (partial_to_string p'); + Printf.eprintf " >> %s\n" (partial_to_string p'); p' + (* [let match_fermion_line = match_fermion_line_logging] *) + let match_fermion_lines flines s1 s23__n = let p = partial_of_slist (s1 :: s23__n) in List.fold_left match_fermion_line p flines let stat_fuse_new flines s1 s23__n f = (match_fermion_lines flines s1 s23__n).stat let stat_fuse_new_checking flines s1 s23__n f = let stat = stat_fuse_new flines s1 s23__n f in if List.length flines < 2 then begin let legacy = stat_fuse_legacy s1 s23__n f in if not (equal stat legacy) then failwith (Printf.sprintf "Fusion.Stat_Dirac.stat_fuse_new: %s <> %s!" (stat_to_string stat) (stat_to_string legacy)) end; stat let stat_fuse_new_logging flines s1 s23__n f = Printf.eprintf "Fusion.Stat_Dirac.stat_fuse_new: \ connecting fermion lines %s in %s <- %s\n" (UFO_Lorentz.fermion_lines_to_string flines) (M.flavor_to_string f) (ThoList.to_string stat_to_string (s1 :: s23__n)); stat_fuse_new_checking flines s1 s23__n f + (* [let stat_fuse_new = stat_fuse_new_logging] *) + let stat_fuse flines_opt slist f = match slist with | [] -> invalid_arg "Fusion.Stat_Dirac.stat_fuse: empty" | s1 :: s23__n -> begin match flines_opt with | Some flines -> stat_fuse_new flines s1 s23__n f | None -> stat_fuse_legacy s1 s23__n f end let stat_fuse_logging flines_opt slist f = Printf.eprintf "Fusion.Stat_Dirac.stat_fuse: %s <- %s\n" (M.flavor_to_string f) (ThoList.to_string stat_to_string slist); stat_fuse flines_opt slist f let stat_keystone_legacy s1 s23__n f = let s2 = List.hd s23__n and s34__n = List.tl s23__n in stat_fuse_legacy s1 [stat_fuse_legacy s2 s34__n (M.conjugate f)] f let stat_keystone_legacy_logging s1 s23__n f = let s = stat_keystone_legacy s1 s23__n f in Printf.eprintf "Fusion.Stat_Dirac.stat_keystone_legacy: %s (%s) %s -> %s\n" (stat_to_string s1) (M.flavor_to_string f) (ThoList.to_string stat_to_string s23__n) (stat_to_string s); s let stat_keystone flines_opt slist f = match slist with | [] -> invalid_arg "Fusion.Stat_Dirac.stat_keystone: empty" - | s1 :: s23__n -> + | [s] -> invalid_arg "Fusion.Stat_Dirac.stat_keystone: singleton" + | s1 :: (s2 :: s34__n as s23__n) -> begin match flines_opt with | None -> stat_keystone_legacy s1 s23__n f | Some flines -> - let stat = stat_fuse_new flines s1 s23__n f in + (* The fermion line indices in [flines] must match + the lines on one side of the keystone. *) + let stat = + stat_fuse_legacy s1 [stat_fuse_new flines s2 s34__n f] f in if complete stat then stat else failwith (Printf.sprintf "Fusion.Stat_Dirac.stat_keystone: incomplete %s!" (stat_to_string stat)) end (* \begin{figure} \begin{displaymath} \parbox{26\unitlength}{% \begin{fmfgraph*}(25,15) \fmfstraight \fmfleft{f} \fmfright{f1,f2,f3} \fmflabel{$\psi(1)$}{f1} \fmflabel{$\bar\psi(2)$}{f2} \fmflabel{$\psi(3)$}{f3} \fmflabel{$0$}{f} \fmf{fermion}{f1,v1,f} \fmffreeze \fmf{fermion,tension=0.5}{f3,v2,f2} \fmf{photon}{v1,v2} \fmfdot{v1,v2} \end{fmfgraph*}} \qquad\qquad-\qquad \parbox{26\unitlength}{% \begin{fmfgraph*}(25,15) \fmfstraight \fmfleft{f} \fmfright{f1,f2,f3} \fmflabel{$\psi(1)$}{f1} \fmflabel{$\bar\psi(2)$}{f2} \fmflabel{$\psi(3)$}{f3} \fmflabel{$0$}{f} \fmf{fermion}{f3,v1,f} \fmffreeze \fmf{fermion,tension=0.5}{f1,v2,f2} \fmf{photon}{v1,v2} \fmfdot{v1,v2} \end{fmfgraph*}} \end{displaymath} \caption{\label{fig:stat_fuse} Relative sign from Fermi statistics.} \end{figure} *) (* \begin{equation} \epsilon \left(\left\{ (0,1), (2,3) \right\}\right) = - \epsilon \left(\left\{ (0,3), (2,1) \right\}\right) \end{equation} *) let permutation lines = let fout, fin = List.split lines in let eps_in, _ = Combinatorics.sort_signed fin and eps_out, _ = Combinatorics.sort_signed fout in (eps_in * eps_out) (* \begin{dubious} This comparing of permutations of fermion lines is a bit tedious and takes a macroscopic fraction of time. However, it's less than 20\,\%, so we don't focus on improving on it yet. \end{dubious} *) let stat_sign = function | Boson lines -> permutation lines | Fermion (p, lines) -> permutation ((None, Some p) :: lines) | AntiFermion (pbar, lines) -> permutation ((Some pbar, None) :: lines) end (* \thocwmodulesection{Tags} *) module type Tags = sig type wf type coupling type 'a children val null_wf : wf val null_coupling : coupling val fuse : coupling -> wf children -> wf val wf_to_string : wf -> string option val coupling_to_string : coupling -> string option end module type Tagger = functor (PT : Tuple.Poly) -> Tags with type 'a children = 'a PT.t module type Tagged_Maker = functor (Tagger : Tagger) -> functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant (* No tags is one option for good tags \ldots *) module No_Tags (PT : Tuple.Poly) = struct type wf = unit type coupling = unit type 'a children = 'a PT.t let null_wf = () let null_coupling = () let fuse () _ = () let wf_to_string () = None let coupling_to_string () = None end (* \begin{dubious} Here's a simple additive tag that can grow into something useful for loop calculations. \end{dubious} *) module Loop_Tags (PT : Tuple.Poly) = struct type wf = int type coupling = int type 'a children = 'a PT.t let null_wf = 0 let null_coupling = 0 let fuse c wfs = PT.fold_left (+) c wfs let wf_to_string n = Some (string_of_int n) let coupling_to_string n = Some (string_of_int n) end module Order_Tags (PT : Tuple.Poly) = struct type wf = int type coupling = int type 'a children = 'a PT.t let null_wf = 0 let null_coupling = 0 let fuse c wfs = PT.fold_left (+) c wfs let wf_to_string n = Some (string_of_int n) let coupling_to_string n = Some (string_of_int n) end (* \thocwmodulesection{[Tagged], the [Fusion.Make] Functor} *) module Tagged (Tagger : Tagger) (PT : Tuple.Poly) (Stat : Stat_Maker) (T : Topology.T with type 'a children = 'a PT.t) (P : Momentum.T) (M : Model.T) = struct + let vintage = false + type cache_mode = Cache_Use | Cache_Ignore | Cache_Overwrite let cache_option = ref Cache_Ignore type qcd_order = | QCD_order of int type ew_order = | EW_order of int let qcd_order = ref (QCD_order 99) let ew_order = ref (EW_order 99) let options = Options.create [ "ignore-cache", Arg.Unit (fun () -> cache_option := Cache_Ignore), " ignore cached model tables (default)"; "use-cache", Arg.Unit (fun () -> cache_option := Cache_Use), " use cached model tables"; "overwrite-cache", Arg.Unit (fun () -> cache_option := Cache_Overwrite), " overwrite cached model tables"; "qcd", Arg.Int (fun n -> qcd_order := QCD_order n), " set QCD order n [>= 0, default = 99] (ignored)"; "ew", Arg.Int (fun n -> ew_order := EW_order n), " set QCD order n [>=0, default = 99] (ignored)"] exception Negative_QCD_order exception Negative_EW_order exception Vanishing_couplings exception Negative_QCD_EW_orders let int_orders = match !qcd_order, !ew_order with | QCD_order n, EW_order n' when n < 0 && n' >= 0 -> raise Negative_QCD_order | QCD_order n, EW_order n' when n >= 0 && n' < 0 -> raise Negative_EW_order | QCD_order n, EW_order n' when n < 0 && n' < 0 -> raise Negative_QCD_EW_orders | QCD_order n, EW_order n' -> (n, n') open Coupling module S = Stat(M) type stat = S.stat let stat = S.stat let stat_sign = S.stat_sign (* \begin{dubious} This will do \emph{something} for 4-, 6-, \ldots fermion vertices, but not necessarily the right thing \ldots \end{dubious} *) (* \begin{dubious} This is copied from [Colorize] and should be factored! \end{dubious} *) (* \begin{dubious} In the long run, it will probably be beneficial to apply the permutations in [Modeltools.add_vertexn]! \end{dubious} *) module PosMap = Partial.Make (struct type t = int let compare = compare end) let partial_map_undoing_permutation l l' = let module P = Permutation.Default in let p = P.of_list (List.map pred l') in PosMap.of_lists l (P.list p l) let partial_map_undoing_fuse fuse = partial_map_undoing_permutation (ThoList.range 1 (List.length fuse)) fuse let undo_permutation_of_fuse fuse = PosMap.apply_with_fallback (fun _ -> invalid_arg "permutation_of_fuse") (partial_map_undoing_fuse fuse) let fermion_lines = function | Coupling.V3 _ | Coupling.V4 _ -> None | Coupling.Vn (Coupling.UFO (_, _, _, fl, _), fuse, _) -> Some (UFO_Lorentz.map_fermion_lines (undo_permutation_of_fuse fuse) fl) type constant = M.constant (* \thocwmodulesubsection{Wave Functions} *) (* \begin{dubious} The code below is not yet functional. Too often, we assign to [Tags.null_wf] instead of calling [Tags.fuse]. \end{dubious} *) (* We will need two types of amplitudes: with color and without color. Since we can build them using the same types with only [flavor] replaced, it pays to use a functor to set up the scaffolding. *) module Tags = Tagger(PT) (* In the future, we might want to have [Coupling] among the functor arguments. However, for the moment, [Coupling] is assumed to be comprehensive. *) module type Tagged_Coupling = sig type sign = int type t = { sign : sign; coupling : constant Coupling.t; coupling_tag : Tags.coupling } val sign : t -> sign val coupling : t -> constant Coupling.t val coupling_tag : t -> string option end module Tagged_Coupling : Tagged_Coupling = struct type sign = int type t = { sign : sign; coupling : constant Coupling.t; coupling_tag : Tags.coupling } let sign c = c.sign let coupling c = c.coupling let coupling_tag_raw c = c.coupling_tag let coupling_tag rhs = Tags.coupling_to_string (coupling_tag_raw rhs) end (* \thocwmodulesubsection{Amplitudes: Monochrome and Colored} *) module type Amplitude = sig module Tags : Tags type flavor type p type wf = { flavor : flavor; momentum : p; wf_tag : Tags.wf } val flavor : wf -> flavor val conjugate : wf -> wf val momentum : wf -> p val momentum_list : wf -> int list val wf_tag : wf -> string option val wf_tag_raw : wf -> Tags.wf val order_wf : wf -> wf -> int val external_wfs : int -> (flavor * int) list -> wf list type 'a children type coupling = Tagged_Coupling.t type rhs = coupling * wf children val sign : rhs -> int val coupling : rhs -> constant Coupling.t val coupling_tag : rhs -> string option type exclusions val no_exclusions : exclusions val children : rhs -> wf list type fusion = wf * rhs list val lhs : fusion -> wf val rhs : fusion -> rhs list type braket = wf * rhs list val bra : braket -> wf val ket : braket -> rhs list module D : DAG.T with type node = wf and type edge = coupling and type children = wf children val wavefunctions : braket list -> wf list type amplitude = { fusions : fusion list; brakets : braket list; on_shell : (wf -> bool); is_gauss : (wf -> bool); constraints : string option; incoming : flavor list; outgoing : flavor list; externals : wf list; symmetry : int; dependencies : (wf -> (wf, coupling) Tree2.t); fusion_tower : D.t; fusion_dag : D.t } val incoming : amplitude -> flavor list val outgoing : amplitude -> flavor list val externals : amplitude -> wf list val variables : amplitude -> wf list val fusions : amplitude -> fusion list val brakets : amplitude -> braket list val on_shell : amplitude -> (wf -> bool) val is_gauss : amplitude -> (wf -> bool) val constraints : amplitude -> string option val symmetry : amplitude -> int val dependencies : amplitude -> wf -> (wf, coupling) Tree2.t val fusion_dag : amplitude -> D.t end module Amplitude (PT : Tuple.Poly) (P : Momentum.T) (M : Model.T) : Amplitude with type p = P.t and type flavor = M.flavor and type 'a children = 'a PT.t and module Tags = Tags = struct type flavor = M.flavor type p = P.t module Tags = Tags type wf = { flavor : flavor; momentum : p; wf_tag : Tags.wf } let flavor wf = wf.flavor let conjugate wf = { wf with flavor = M.conjugate wf.flavor } let momentum wf = wf.momentum let momentum_list wf = P.to_ints wf.momentum let wf_tag wf = Tags.wf_to_string wf.wf_tag let wf_tag_raw wf = wf.wf_tag let external_wfs rank particles = List.map (fun (f, p) -> { flavor = f; momentum = P.singleton rank p; wf_tag = Tags.null_wf }) particles (* Order wavefunctions so that the external come first, then the pairs, etc. Also put possible Goldstone bosons \emph{before} their gauge bosons. *) let lorentz_ordering f = match M.lorentz f with | Coupling.Scalar -> 0 | Coupling.Spinor -> 1 | Coupling.ConjSpinor -> 2 | Coupling.Majorana -> 3 | Coupling.Vector -> 4 | Coupling.Massive_Vector -> 5 | Coupling.Tensor_2 -> 6 | Coupling.Tensor_1 -> 7 | Coupling.Vectorspinor -> 8 | Coupling.BRS Coupling.Scalar -> 9 | Coupling.BRS Coupling.Spinor -> 10 | Coupling.BRS Coupling.ConjSpinor -> 11 | Coupling.BRS Coupling.Majorana -> 12 | Coupling.BRS Coupling.Vector -> 13 | Coupling.BRS Coupling.Massive_Vector -> 14 | Coupling.BRS Coupling.Tensor_2 -> 15 | Coupling.BRS Coupling.Tensor_1 -> 16 | Coupling.BRS Coupling.Vectorspinor -> 17 | Coupling.BRS _ -> invalid_arg "Fusion.lorentz_ordering: not needed" | Coupling.Maj_Ghost -> 18 (*i | Coupling.Ward_Vector -> 19 i*) let order_flavor f1 f2 = let c = compare (lorentz_ordering f1) (lorentz_ordering f2) in if c <> 0 then c else compare f1 f2 (* Note that [Momentum().compare] guarantees that wavefunctions will be ordered according to \emph{increasing} [Momentum().rank] of their momenta. *) let order_wf wf1 wf2 = let c = P.compare wf1.momentum wf2.momentum in if c <> 0 then c else let c = order_flavor wf1.flavor wf2.flavor in if c <> 0 then c else compare wf1.wf_tag wf2.wf_tag (* This \emph{must} be a pair matching the [edge * node children] pairs of [DAG.Forest]! *) type coupling = Tagged_Coupling.t type 'a children = 'a PT.t type rhs = coupling * wf children let sign (c, _) = Tagged_Coupling.sign c let coupling (c, _) = Tagged_Coupling.coupling c let coupling_tag (c, _) = Tagged_Coupling.coupling_tag c type exclusions = { x_flavors : flavor list; x_couplings : coupling list } let no_exclusions = { x_flavors = []; x_couplings = [] } let children (_, wfs) = PT.to_list wfs type fusion = wf * rhs list let lhs (l, _) = l let rhs (_, r) = r type braket = wf * rhs list let bra (b, _) = b let ket (_, k) = k module D = DAG.Make (DAG.Forest(PT) (struct type t = wf let compare = order_wf end) (struct type t = coupling let compare = compare end)) module WFSet = Set.Make (struct type t = wf let compare = order_wf end) let wavefunctions brakets = WFSet.elements (List.fold_left (fun set (wf1, wf23) -> WFSet.add wf1 (List.fold_left (fun set' (_, wfs) -> PT.fold_right WFSet.add wfs set') set wf23)) WFSet.empty brakets) type amplitude = { fusions : fusion list; brakets : braket list; on_shell : (wf -> bool); is_gauss : (wf -> bool); constraints : string option; incoming : flavor list; outgoing : flavor list; externals : wf list; symmetry : int; dependencies : (wf -> (wf, coupling) Tree2.t); fusion_tower : D.t; fusion_dag : D.t } let incoming a = a.incoming let outgoing a = a.outgoing let externals a = a.externals let fusions a = a.fusions let brakets a = a.brakets let symmetry a = a.symmetry let on_shell a = a.on_shell let is_gauss a = a.is_gauss let constraints a = a.constraints let variables a = List.map lhs a.fusions let dependencies a = a.dependencies let fusion_dag a = a.fusion_dag end module A = Amplitude(PT)(P)(M) (* Operator insertions can be fused only if they are external. *) let is_source wf = match M.propagator wf.A.flavor with | Only_Insertion -> P.rank wf.A.momentum = 1 | _ -> true (* [is_goldstone_of g v] is [true] if and only if [g] is the Goldstone boson corresponding to the gauge particle [v]. *) let is_goldstone_of g v = match M.goldstone v with | None -> false | Some (g', _) -> g = g' (* \begin{dubious} In the end, [PT.to_list] should become redudant! \end{dubious} *) let fuse_rhs rhs = M.fuse (PT.to_list rhs) (* \thocwmodulesubsection{Vertices} *) (* Compute the set of all vertices in the model from the allowed fusions and the set of all flavors: \begin{dubious} One could think of using [M.vertices] instead of [M.fuse2], [M.fuse3] and [M.fuse] \ldots \end{dubious} *) module VSet = Map.Make(struct type t = A.flavor let compare = compare end) let add_vertices f rhs m = VSet.add f (try rhs :: VSet.find f m with Not_found -> [rhs]) m let collect_vertices rhs = List.fold_right (fun (f1, c) -> add_vertices (M.conjugate f1) (c, rhs)) (fuse_rhs rhs) (* The set of all vertices with common left fields factored. *) (* I used to think that constant initializers are a good idea to allow compile time optimizations. The down side turned out to be that the constant initializers will be evaluated \emph{every time} the functor is applied. \emph{Relying on the fact that the functor will be called only once is not a good idea!} *) type vertices = (A.flavor * (constant Coupling.t * A.flavor PT.t) list) list let vertices_nocache max_degree flavors : vertices = VSet.fold (fun f rhs v -> (f, rhs) :: v) (PT.power_fold collect_vertices flavors VSet.empty) [] (* Performance hack: *) type vertex_table = ((A.flavor * A.flavor * A.flavor) * constant Coupling.vertex3 * constant) list * ((A.flavor * A.flavor * A.flavor * A.flavor) * constant Coupling.vertex4 * constant) list * (A.flavor list * constant Coupling.vertexn * constant) list module VCache = Cache.Make (struct type t = vertex_table end) (struct type t = vertices end) let vertices_cache = ref None let hash () = VCache.hash (M.vertices ()) (* \begin{dubious} Can we do better than the executable name provided by [Config.cache_prefix]??? We need a better way to avoid collisions among the caches for different models in the same program. \end{dubious} *) let cache_name = ref (Config.cache_prefix ^ "." ^ Config.cache_suffix) let set_cache_name name = cache_name := name let initialize_cache dir = Printf.eprintf " >>> Initializing vertex table %s. This may take some time ... " !cache_name; flush stderr; VCache.write_dir (hash ()) dir !cache_name (vertices_nocache (M.max_degree ()) (M.flavors())); Printf.eprintf "done. <<< \n" let vertices max_degree flavors : vertices = match !vertices_cache with | None -> begin match !cache_option with | Cache_Use -> begin match VCache.maybe_read (hash ()) !cache_name with | VCache.Hit result -> result | VCache.Miss -> Printf.eprintf " >>> Initializing vertex table %s. This may take some time ... " !cache_name; flush stderr; let result = vertices_nocache max_degree flavors in VCache.write (hash ()) !cache_name (result); vertices_cache := Some result; Printf.eprintf "done. <<< \n"; flush stderr; result | VCache.Stale file -> Printf.eprintf " >>> Re-initializing stale vertex table %s in file %s. " !cache_name file; Printf.eprintf "This may take some time ... "; flush stderr; let result = vertices_nocache max_degree flavors in VCache.write (hash ()) !cache_name (result); vertices_cache := Some result; Printf.eprintf "done. <<< \n"; flush stderr; result end | Cache_Overwrite -> Printf.eprintf " >>> Overwriting vertex table %s. This may take some time ... " !cache_name; flush stderr; let result = vertices_nocache max_degree flavors in VCache.write (hash ()) !cache_name (result); vertices_cache := Some result; Printf.eprintf "done. <<< \n"; flush stderr; result | Cache_Ignore -> let result = vertices_nocache max_degree flavors in vertices_cache := Some result; result end | Some result -> result (* Note that we must perform any filtering of the vertices \emph{after} caching, because the restrictions \emph{must not} influence the cache (unless we tag the cache with model and restrictions). *) (*i let unpack_constant = function | Coupling.V3 (_, _, cs) -> cs | Coupling.V4 (_, _, cs) -> cs | Coupling.Vn (_, _, cs) -> cs let coupling_and_flavors_to_string (c, fs) = M.constant_symbol (unpack_constant c) ^ "[" ^ String.concat ", " (List.map M.flavor_to_string (PT.to_list fs)) ^ "]" let fusions_to_string (f, cfs) = M.flavor_to_string f ^ " <- { " ^ String.concat " | " (List.map coupling_and_flavors_to_string cfs) ^ " }" let vertices_to_string vertices = String.concat "; " (List.map fusions_to_string vertices) i*) let filter_vertices select_vtx vertices = List.fold_left (fun acc (f, cfs) -> let f' = M.conjugate f in let cfs = List.filter (fun (c, fs) -> select_vtx c f' (PT.to_list fs)) cfs in match cfs with | [] -> acc | cfs -> (f, cfs) :: acc) [] vertices (* \thocwmodulesubsection{Partitions} *) (* Vertices that are not crossing invariant need special treatment so that they're only generated for the correct combinations of momenta. NB: the [crossing] checks here are a bit redundant, because [CM.fuse] below will bring the killed vertices back to life and will have to filter once more. Nevertheless, we keep them here, for the unlikely case that anybody ever wants to use uncolored amplitudes directly. NB: the analogous problem does not occur for [select_wf], because this applies to momenta instead of vertices. *) (* \begin{dubious} This approach worked before the colorize, but has become \emph{futile}, because [CM.fuse] will bring the killed vertices back to life. We need to implement the same checks there again!!! \end{dubious} *) (* \begin{dubious} Using [PT.Mismatched_arity] is not really good style \ldots Tho's approach doesn't work since he does not catch charge conjugated processes or crossed processes. Another very strange thing is that O'Mega seems always to run in the q2 q3 timelike case, but not in the other two. (Property of how the DAG is built?). For the $ZZZZ$ vertex I add the same vertex again, but interchange 1 and 3 in the [crossing] vertex \end{dubious} *) let kmatrix_cuts c momenta = match c with | V4 (Vector4_K_Matrix_tho (disc, _), fusion, _) | V4 (Vector4_K_Matrix_jr (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t0 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t1 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t2 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t_rsi (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_m0 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_m1 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_m7 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (DScalar2_Vector2_K_Matrix_ms (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar2_Vector2_m_0_K_Matrix_cf (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar2_Vector2_m_1_K_Matrix_cf (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar2_Vector2_m_7_K_Matrix_cf (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar4_K_Matrix_ms (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | _ -> true (* Counting QCD and EW orders. *) let qcd_ew_check orders = if fst (orders) <= fst (int_orders) && snd (orders) <= snd (int_orders) then true else false (* Match a set of flavors to a set of momenta. Form the direct product for the lists of momenta two and three with the list of couplings and flavors two and three. *) let flavor_keystone select_p dim (f1, f23) (p1, p23) = ({ A.flavor = f1; A.momentum = P.of_ints dim p1; A.wf_tag = A.Tags.null_wf }, Product.fold2 (fun (c, f) p acc -> try let p' = PT.map (P.of_ints dim) p in if select_p (P.of_ints dim p1) (PT.to_list p') && kmatrix_cuts c p' then (c, PT.map2 (fun f'' p'' -> { A.flavor = f''; A.momentum = p''; A.wf_tag = A.Tags.null_wf }) f p') :: acc else acc with | PT.Mismatched_arity -> acc) f23 p23 []) (*i let cnt = ref 0 let gc_stat () = let minor, promoted, major = Gc.counters () in Printf.sprintf "(%12.0f, %12.0f, %12.0f)" minor promoted major let flavor_keystone select_p n (f1, f23) (p1, p23) = incr cnt; Gc.set { (Gc.get()) with Gc.space_overhead = 20 }; Printf.eprintf "%6d@%8.1f: %s\n" !cnt (Sys.time ()) (gc_stat ()); flush stderr; flavor_keystone select_p n (f1, f23) (p1, p23) i*) (* Produce all possible combinations of vertices (flavor keystones) and momenta by forming the direct product. The semantically equivalent [Product.list2 (flavor_keystone select_wf n) vertices keystones] with \emph{subsequent} filtering would be a \emph{very bad} idea, because a potentially huge intermediate list is built for large models. E.\,g.~for the MSSM this would lead to non-termination by thrashing for $2\to4$ processes on most PCs. *) let flavor_keystones filter select_p dim vertices keystones = Product.fold2 (fun v k acc -> filter (flavor_keystone select_p dim v k) acc) vertices keystones [] (* Flatten the nested lists of vertices into a list of attached lines. *) let flatten_keystones t = ThoList.flatmap (fun (p1, p23) -> p1 :: (ThoList.flatmap (fun (_, rhs) -> PT.to_list rhs) p23)) t (* \thocwmodulesubsection{Subtrees} *) (* Fuse a tuple of wavefunctions, keeping track of Fermi statistics. Record only the the sign \emph{relative} to the children. (The type annotation is only for documentation.) *) let fuse select_wf select_vtx wfss : (A.wf * stat * A.rhs) list = if PT.for_all (fun (wf, _) -> is_source wf) wfss then try let wfs, ss = PT.split wfss in let flavors = PT.map A.flavor wfs and momenta = PT.map A.momentum wfs (*i and wf_tags = PT.map A.wf_tag_raw wfs i*) in let p = PT.fold_left_internal P.add momenta in (*i let wft = PT.fold_left Tags.fuse wf_tags in i*) List.fold_left (fun acc (f, c) -> if select_wf f p (PT.to_list momenta) && select_vtx c f (PT.to_list flavors) && kmatrix_cuts c momenta then (* [let _ = Printf.eprintf "Fusion.fuse: %s <- %s\n" (M.flavor_to_string f) (ThoList.to_string M.flavor_to_string (PT.to_list flavors)) in] *) let s = S.stat_fuse (fermion_lines c) (PT.to_list ss) f in let flip = PT.fold_left (fun acc s' -> acc * stat_sign s') (stat_sign s) ss in ({ A.flavor = f; A.momentum = p; A.wf_tag = A.Tags.null_wf }, s, ({ Tagged_Coupling.sign = flip; Tagged_Coupling.coupling = c; Tagged_Coupling.coupling_tag = A.Tags.null_coupling }, wfs)) :: acc else acc) [] (fuse_rhs flavors) with | P.Duplicate _ | S.Impossible -> [] else [] (* \begin{dubious} Eventually, the pairs of [tower] and [dag] in [fusion_tower'] below could and should be replaced by a graded [DAG]. This will look like, but currently [tower] containts statistics information that is missing from [dag]: \begin{quote} \verb+Type node = flavor * p is not compatible with type wf * stat+ \end{quote} This should be easy to fix. However, replacing [type t = wf] with [type t = wf * stat] is \emph{not} a good idea because the variable [stat] makes it impossible to test for the existance of a particular [wf] in a [DAG]. \end{dubious} \begin{dubious} In summary, it seems that [(wf * stat) list array * A.D.t] should be replaced by [(wf -> stat) * A.D.t]. \end{dubious} *) module GF = struct module Nodes = struct type t = A.wf module G = struct type t = int let compare = compare end let compare = A.order_wf let rank wf = P.rank wf.A.momentum end module Edges = struct type t = A.coupling let compare = compare end module F = DAG.Forest(PT)(Nodes)(Edges) type node = Nodes.t type edge = F.edge type children = F.children type t = F.t let compare = F.compare let for_all = F.for_all let fold = F.fold end module D' = DAG.Graded(GF) let tower_of_dag dag = let _, max_rank = D'.min_max_rank dag in Array.init max_rank (fun n -> D'.ranked n dag) (* The function [fusion_tower'] recursively builds the tower of all fusions from bottom up to a chosen level. The argument [tower] is an array of lists, where the $i$-th sublist (counting from 0) represents all off shell wave functions depending on $i+1$~momenta and their Fermistatistics. \begin{equation} \begin{aligned} \Bigl\lbrack & \{ \phi_1(p_1), \phi_2(p_2), \phi_3(p_3), \ldots \}, \\ & \{ \phi_{12}(p_1+p_2), \phi'_{12}(p_1+p_2), \ldots, \phi_{13}(p_1+p_3), \ldots, \phi_{23}(p_2+p_3), \ldots \}, \\ & \ldots \\ & \{ \phi_{1\cdots n}(p_1+\cdots+p_n), \phi'_{1\cdots n}(p_1+\cdots+p_n), \ldots \} \Bigr\rbrack \end{aligned} \end{equation} The argument [dag] is a DAG representing all the fusions calculated so far. NB: The outer array in [tower] is always very short, so we could also have accessed a list with [List.nth]. Appending of new members at the end brings no loss of performance. NB: the array is supposed to be immutable. *) (* The towers must be sorted so that the combinatorical functions can make consistent selections. \begin{dubious} Intuitively, this seems to be correct. However, one could have expected that no element appears twice and that this ordering is not necessary \ldots \end{dubious} *) let grow select_wf select_vtx tower = let rank = succ (Array.length tower) in List.sort pcompare (PT.graded_sym_power_fold rank (fun wfs acc -> fuse select_wf select_vtx wfs @ acc) tower []) let add_offspring dag (wf, _, rhs) = A.D.add_offspring wf rhs dag let filter_offspring fusions = List.map (fun (wf, s, _) -> (wf, s)) fusions let rec fusion_tower' n_max select_wf select_vtx tower dag : (A.wf * stat) list array * A.D.t = if Array.length tower >= n_max then (tower, dag) else let tower' = grow select_wf select_vtx tower in fusion_tower' n_max select_wf select_vtx (Array.append tower [|filter_offspring tower'|]) (List.fold_left add_offspring dag tower') (* Discard the tower and return a map from wave functions to Fermistatistics together with the DAG. *) let make_external_dag wfs = List.fold_left (fun m (wf, _) -> A.D.add_node wf m) A.D.empty wfs let mixed_fold_left f acc lists = Array.fold_left (List.fold_left f) acc lists module Stat_Map = Map.Make (struct type t = A.wf let compare = A.order_wf end) let fusion_tower height select_wf select_vtx wfs : (A.wf -> stat) * A.D.t = let tower, dag = fusion_tower' height select_wf select_vtx [|wfs|] (make_external_dag wfs) in let stats = mixed_fold_left (fun m (wf, s) -> Stat_Map.add wf s m) Stat_Map.empty tower in ((fun wf -> Stat_Map.find wf stats), dag) (* Calculate the minimal tower of fusions that suffices for calculating the amplitude. *) let minimal_fusion_tower n select_wf select_vtx wfs : (A.wf -> stat) * A.D.t = fusion_tower (T.max_subtree n) select_wf select_vtx wfs (* Calculate the complete tower of fusions. It is much larger than required, but it allows a complete set of gauge checks. *) let complete_fusion_tower select_wf select_vtx wfs : (A.wf -> stat) * A.D.t = fusion_tower (List.length wfs - 1) select_wf select_vtx wfs (* \begin{dubious} There is a natural product of two DAGs using [fuse]. Can this be used in a replacement for [fusion_tower]? The hard part is to avoid double counting, of course. A straight forward solution could do a diagonal sum (in order to reject flipped offspring representing the same fusion) and rely on the uniqueness in [DAG] otherwise. However, this will (probably) slow down the procedure significanty, because most fusions (including Fermi signs!) will be calculated before being rejected by [DAG().add_offspring]. \end{dubious} *) (* Add to [dag] all Goldstone bosons defined in [tower] that correspond to gauge bosons in [dag]. This is only required for checking Slavnov-Taylor identities in unitarity gauge. Currently, it is not used, because we use the complete tower for gauge checking. *) let harvest_goldstones tower dag = A.D.fold_nodes (fun wf dag' -> match M.goldstone wf.A.flavor with | Some (g, _) -> let wf' = { wf with A.flavor = g } in if A.D.is_node wf' tower then begin A.D.harvest tower wf' dag' end else begin dag' end | None -> dag') dag dag (* Calculate the sign from Fermi statistics that is not already included in the children. *) let strip_fermion_lines = function | (Coupling.V3 _ | Coupling.V4 _ as v) -> v | Coupling.Vn (Coupling.UFO (c, l, s, fl, col), f, x) -> Coupling.Vn (Coupling.UFO (c, l, s, [], col), f, x) + let num_fermion_lines_v3 = function + | FBF _ | PBP _ | BBB _ | GBG _ -> 1 + | _ -> 0 + let num_fermion_lines = function - | Coupling.V3 _ | Coupling.V4 _ -> 0 | Coupling.Vn (Coupling.UFO (c, l, s, fl, col), f, x) -> List.length fl + | Coupling.V3 (v3, _, _) -> num_fermion_lines_v3 v3 + | Coupling.V4 _ -> 0 let stat_keystone v stats wf1 wfs = let wf1' = stats wf1 and wfs' = PT.map stats wfs in let f = A.flavor wf1 in - let slist = PT.to_list wfs' @ [wf1'] in + let slist = wf1' :: PT.to_list wfs' in let stat = S.stat_keystone (fermion_lines v) slist f in + (* We can compare with the legacy implementation only if there + are no fermion line ambiguities possible, i.\,e.~for + at most one line. *) if num_fermion_lines v < 2 then begin let legacy = S.stat_keystone None slist f in if not (S.equal stat legacy) then failwith (Printf.sprintf "Fusion.stat_keystone: %s <> %s!" (S.stat_to_string legacy) (S.stat_to_string stat)); if not (S.complete legacy) then failwith (Printf.sprintf "Fusion.stat_keystone: legacy incomplete: %s!" (S.stat_to_string legacy)) end; if not (S.complete stat) then failwith (Printf.sprintf "Fusion.stat_keystone: incomplete: %s!" (S.stat_to_string stat)); stat_sign stat * PT.fold_left (fun acc wf -> acc * stat_sign wf) (stat_sign wf1') wfs' let stat_keystone_logging v stats wf1 wfs = let sign = stat_keystone v stats wf1 wfs in Printf.eprintf "Fusion.stat_keystone: %s * %s -> %d\n" (M.flavor_to_string (A.flavor wf1)) (ThoList.to_string (fun wf -> M.flavor_to_string (A.flavor wf)) (PT.to_list wfs)) sign; sign (* Test all members of a list of wave functions are defined by the DAG simultaneously: *) let test_rhs dag (_, wfs) = PT.for_all (fun wf -> is_source wf && A.D.is_node wf dag) wfs (* Add the keystone [(wf1,pairs)] to [acc] only if it is present in [dag] and calculate the statistical factor depending on [stats] \emph{en passant}: *) let filter_keystone stats dag (wf1, pairs) acc = if is_source wf1 && A.D.is_node wf1 dag then match List.filter (test_rhs dag) pairs with | [] -> acc | pairs' -> (wf1, List.map (fun (c, wfs) -> ({ Tagged_Coupling.sign = stat_keystone c stats wf1 wfs; Tagged_Coupling.coupling = c; Tagged_Coupling.coupling_tag = A.Tags.null_coupling }, wfs)) pairs') :: acc else acc (* \begin{figure} \begin{center} \thocwincludegraphics{width=\textwidth}{bhabha0}\\ \hfil\\ \thocwincludegraphics{width=\textwidth}{bhabha} \end{center} \caption{\label{fig:bhabha} The DAGs for Bhabha scattering before and after weeding out unused nodes. The blatant asymmetry of these DAGs is caused by our prescription for removing doubling counting for an even number of external lines.} \end{figure} \begin{figure} \begin{center} \thocwincludegraphics{width=\textwidth}{epemudbarmunumubar0}\\ \hfil\\ \thocwincludegraphics{width=\textwidth}{epemudbarmunumubar} \end{center} \caption{\label{fig:epemudbarmunumubar} The DAGs for $e^+e^-\to u\bar d \mu^-\bar\nu_\mu$ before and after weeding out unused nodes.} \end{figure} \begin{figure} \begin{center} \thocwincludegraphics{width=\textwidth}{epemudbardubar0}\\ \hfil\\ \thocwincludegraphics{width=\textwidth}{epemudbardubar} \end{center} \caption{\label{fig:epemudbardubar} The DAGs for $e^+e^-\to u\bar d d\bar u$ before and after weeding out unused nodes.} \end{figure} *) (* \thocwmodulesubsection{Amplitudes} *) module C = Cascade.Make(M)(P) type selectors = C.selectors let external_wfs n particles = List.map (fun (f, p) -> ({ A.flavor = f; A.momentum = P.singleton n p; A.wf_tag = A.Tags.null_wf }, stat f p)) particles (* \thocwmodulesubsection{Main Function} *) module WFMap = Map.Make (struct type t = A.wf let compare = compare end) (* [map_amplitude_wfs f a] applies the function [f : wf -> wf] to all wavefunctions appearing in the amplitude [a]. *) let map_amplitude_wfs f a = let map_rhs (c, wfs) = (c, PT.map f wfs) in let map_braket (wf, rhs) = (f wf, List.map map_rhs rhs) and map_fusion (lhs, rhs) = (f lhs, List.map map_rhs rhs) in let map_dag = A.D.map f (fun node rhs -> map_rhs rhs) in let tower = map_dag a.A.fusion_tower and dag = map_dag a.A.fusion_dag in let dependencies_map = A.D.fold (fun wf _ -> WFMap.add wf (A.D.dependencies dag wf)) dag WFMap.empty in { A.fusions = List.map map_fusion a.A.fusions; A.brakets = List.map map_braket a.A.brakets; A.on_shell = a.A.on_shell; A.is_gauss = a.A.is_gauss; A.constraints = a.A.constraints; A.incoming = a.A.incoming; A.outgoing = a.A.outgoing; A.externals = List.map f a.A.externals; A.symmetry = a.A.symmetry; A.dependencies = (fun wf -> WFMap.find wf dependencies_map); A.fusion_tower = tower; A.fusion_dag = dag } (*i (* \begin{dubious} Just a silly little test: \end{dubious} *) let hack_amplitude = map_amplitude_wfs (fun wf -> { wf with momentum = P.split 2 16 wf.momentum }) i*) (* This is the main function that constructs the amplitude for sets of incoming and outgoing particles and returns the results in conveniently packaged pieces. *) let amplitude goldstones selectors fin fout = (* Set up external lines and match flavors with numbered momenta. *) let f = fin @ List.map M.conjugate fout in let nin, nout = List.length fin, List.length fout in let n = nin + nout in let externals = List.combine f (ThoList.range 1 n) in let wfs = external_wfs n externals in let select_p = C.select_p selectors in let select_wf = match fin with | [_] -> C.select_wf selectors P.Decay.timelike | _ -> C.select_wf selectors P.Scattering.timelike in let select_vtx = C.select_vtx selectors in (* Build the full fusion tower (including nodes that are never needed in the amplitude). *) let stats, tower = if goldstones then complete_fusion_tower select_wf select_vtx wfs else minimal_fusion_tower n select_wf select_vtx wfs in (* Find all vertices for which \emph{all} off shell wavefunctions are defined by the tower. *) let brakets = flavor_keystones (filter_keystone stats tower) select_p n (filter_vertices select_vtx (vertices (M.max_degree ()) (M.flavors ()))) (T.keystones (ThoList.range 1 n)) in (* Remove the part of the DAG that is never needed in the amplitude. *) let dag = if goldstones then tower else A.D.harvest_list tower (A.wavefunctions brakets) in (* Remove the leaf nodes of the DAG, corresponding to external lines. *) let fusions = List.filter (function (_, []) -> false | _ -> true) (A.D.lists dag) in (* Calculate the symmetry factor for identical particles in the final state. *) let symmetry = Combinatorics.symmetry fout in let dependencies_map = A.D.fold (fun wf _ -> WFMap.add wf (A.D.dependencies dag wf)) dag WFMap.empty in (* Finally: package the results: *) { A.fusions = fusions; A.brakets = brakets; A.on_shell = (fun wf -> C.on_shell selectors (A.flavor wf) wf.A.momentum); A.is_gauss = (fun wf -> C.is_gauss selectors (A.flavor wf) wf.A.momentum); A.constraints = C.description selectors; A.incoming = fin; A.outgoing = fout; A.externals = List.map fst wfs; A.symmetry = symmetry; A.dependencies = (fun wf -> WFMap.find wf dependencies_map); A.fusion_tower = tower; A.fusion_dag = dag } (* \thocwmodulesubsection{Color} *) module CM = Colorize.It(M) module CA = Amplitude(PT)(P)(CM) let colorize_wf flavor wf = { CA.flavor = flavor; CA.momentum = wf.A.momentum; CA.wf_tag = wf.A.wf_tag } let uncolorize_wf wf = { A.flavor = CM.flavor_sans_color wf.CA.flavor; A.momentum = wf.CA.momentum; A.wf_tag = wf.CA.wf_tag } (* \begin{dubious} At the end of the day, I shall want to have some sort of \textit{fibered DAG} as abstract data type, with a projection of colored nodes to their uncolored counterparts. \end{dubious} *) module CWFBundle = Bundle.Make (struct type elt = CA.wf let compare_elt = compare type base = A.wf let compare_base = compare let pi wf = { A.flavor = CM.flavor_sans_color wf.CA.flavor; A.momentum = wf.CA.momentum; A.wf_tag = wf.CA.wf_tag } end) (* \begin{dubious} For now, we can live with simple aggregation: \end{dubious} *) type fibered_dag = { dag : CA.D.t; bundle : CWFBundle.t } (* Not yet(?) needed: [module CS = Stat (CM)] *) let colorize_sterile_nodes dag f wf fibered_dag = if A.D.is_sterile wf dag then let wf', wf_bundle' = f wf fibered_dag in { dag = CA.D.add_node wf' fibered_dag.dag; bundle = wf_bundle' } else fibered_dag let colorize_nodes f wf rhs fibered_dag = let wf_rhs_list', wf_bundle' = f wf rhs fibered_dag in let dag' = List.fold_right (fun (wf', rhs') -> CA.D.add_offspring wf' rhs') wf_rhs_list' fibered_dag.dag in { dag = dag'; bundle = wf_bundle' } (* O'Caml (correctly) infers the type [val colorize_dag : (D.node -> D.edge * D.children -> fibered_dag -> (CA.D.node * (CA.D.edge * CA.D.children)) list * CWFBundle.t) -> (D.node -> fibered_dag -> CA.D.node * CWFBundle.t) -> D.t -> CWFBundle.t -> fibered_dag]. *) let colorize_dag f_node f_ext dag wf_bundle = A.D.fold (colorize_nodes f_node) dag (A.D.fold_nodes (colorize_sterile_nodes dag f_ext) dag { dag = CA.D.empty; bundle = wf_bundle }) let colorize_external wf fibered_dag = match CWFBundle.inv_pi wf fibered_dag.bundle with | [c_wf] -> (c_wf, fibered_dag.bundle) | [] -> failwith "colorize_external: not found" | _ -> failwith "colorize_external: not unique" let fuse_c_wf rhs = let momenta = PT.map (fun wf -> wf.CA.momentum) rhs in List.filter (fun (_, c) -> kmatrix_cuts c momenta) (CM.fuse (List.map (fun wf -> wf.CA.flavor) (PT.to_list rhs))) let colorize_coupling c coupling = { coupling with Tagged_Coupling.coupling = c } let colorize_fusion wf (coupling, children) fibered_dag = let match_flavor (f, _) = (CM.flavor_sans_color f = A.flavor wf) and find_colored wf' = CWFBundle.inv_pi wf' fibered_dag.bundle in let fusions = ThoList.flatmap (fun c_children -> List.map (fun (f, c) -> (colorize_wf f wf, (colorize_coupling c coupling, c_children))) (List.filter match_flavor (fuse_c_wf c_children))) (PT.product (PT.map find_colored children)) in let bundle = List.fold_right (fun (c_wf, _) -> CWFBundle.add c_wf) fusions fibered_dag.bundle in (fusions, bundle) let colorize_braket1 (wf, (coupling, children)) fibered_dag = let find_colored wf' = CWFBundle.inv_pi wf' fibered_dag.bundle in Product.fold2 (fun bra ket acc -> List.fold_left (fun brakets (f, c) -> if CM.conjugate bra.CA.flavor = f then (bra, (colorize_coupling c coupling, ket)) :: brakets else brakets) acc (fuse_c_wf ket)) (find_colored wf) (PT.product (PT.map find_colored children)) [] module CWFMap = Map.Make (struct type t = CA.wf let compare = CA.order_wf end) module CKetSet = Set.Make (struct type t = CA.rhs let compare = compare end) (* Find a set of kets in [map] that belong to [bra]. Return the empty set, if nothing is found. *) let lookup_ketset bra map = try CWFMap.find bra map with Not_found -> CKetSet.empty (* Return the set of kets belonging to [bra] in [map], augmented by [ket]. *) let addto_ketset bra ket map = CKetSet.add ket (lookup_ketset bra map) (* Augment or update [map] with a new [(bra, ket)] relation. *) let addto_ketset_map map (bra, ket) = CWFMap.add bra (addto_ketset bra ket map) map (* Take a list of [(bra, ket)] pairs and group the [ket]s according to [bra]. This is very similar to [ThoList.factorize] on page~\pageref{ThoList.factorize}, but the latter keeps duplicate copies, while we keep only one, with equality determined by [CA.order_wf]. *) (* \begin{dubious} Isn't [Bundle]~\ref{Bundle} the correct framework for this? \end{dubious} *) let factorize_brakets brakets = CWFMap.fold (fun bra ket acc -> (bra, CKetSet.elements ket) :: acc) (List.fold_left addto_ketset_map CWFMap.empty brakets) [] let colorize_braket (wf, rhs_list) fibered_dag = factorize_brakets (ThoList.flatmap (fun rhs -> (colorize_braket1 (wf, rhs) fibered_dag)) rhs_list) let colorize_amplitude a fin fout = let f = fin @ List.map CM.conjugate fout in let nin, nout = List.length fin, List.length fout in let n = nin + nout in let externals = List.combine f (ThoList.range 1 n) in let external_wfs = CA.external_wfs n externals in let wf_bundle = CWFBundle.of_list external_wfs in let fibered_dag = colorize_dag colorize_fusion colorize_external a.A.fusion_dag wf_bundle in let brakets = ThoList.flatmap (fun braket -> colorize_braket braket fibered_dag) a.A.brakets in let dag = CA.D.harvest_list fibered_dag.dag (CA.wavefunctions brakets) in let fusions = List.filter (function (_, []) -> false | _ -> true) (CA.D.lists dag) in let dependencies_map = CA.D.fold (fun wf _ -> CWFMap.add wf (CA.D.dependencies dag wf)) dag CWFMap.empty in { CA.fusions = fusions; CA.brakets = brakets; CA.constraints = a.A.constraints; CA.incoming = fin; CA.outgoing = fout; CA.externals = external_wfs; CA.fusion_dag = dag; CA.fusion_tower = dag; CA.symmetry = a.A.symmetry; CA.on_shell = (fun wf -> a.A.on_shell (uncolorize_wf wf)); CA.is_gauss = (fun wf -> a.A.is_gauss (uncolorize_wf wf)); CA.dependencies = (fun wf -> CWFMap.find wf dependencies_map) } let allowed amplitude = match amplitude.CA.brakets with | [] -> false | _ -> true let colorize_amplitudes a = List.fold_left (fun amps (fin, fout) -> let amp = colorize_amplitude a fin fout in if allowed amp then amp :: amps else amps) [] (CM.amplitude a.A.incoming a.A.outgoing) let amplitudes goldstones exclusions selectors fin fout = colorize_amplitudes (amplitude goldstones selectors fin fout) let amplitude_sans_color goldstones exclusions selectors fin fout = amplitude goldstones selectors fin fout type flavor = CA.flavor type flavor_sans_color = A.flavor type p = A.p type wf = CA.wf let conjugate = CA.conjugate let flavor = CA.flavor let flavor_sans_color wf = CM.flavor_sans_color (CA.flavor wf) let momentum = CA.momentum let momentum_list = CA.momentum_list let wf_tag = CA.wf_tag type coupling = CA.coupling let sign = CA.sign let coupling = CA.coupling let coupling_tag = CA.coupling_tag type exclusions = CA.exclusions let no_exclusions = CA.no_exclusions type 'a children = 'a CA.children type rhs = CA.rhs let children = CA.children type fusion = CA.fusion let lhs = CA.lhs let rhs = CA.rhs type braket = CA.braket let bra = CA.bra let ket = CA.ket type amplitude = CA.amplitude type amplitude_sans_color = A.amplitude let incoming = CA.incoming let outgoing = CA.outgoing let externals = CA.externals let fusions = CA.fusions let brakets = CA.brakets let symmetry = CA.symmetry let on_shell = CA.on_shell let is_gauss = CA.is_gauss let constraints = CA.constraints let variables a = List.map lhs (fusions a) let dependencies = CA.dependencies (* \thocwmodulesubsection{Checking Conservation Laws} *) let check_charges () = let vlist3, vlist4, vlistn = M.vertices () in List.filter (fun flist -> not (M.Ch.is_null (M.Ch.sum (List.map M.charges flist)))) (List.map (fun ((f1, f2, f3), _, _) -> [f1; f2; f3]) vlist3 @ List.map (fun ((f1, f2, f3, f4), _, _) -> [f1; f2; f3; f4]) vlist4 @ List.map (fun (flist, _, _) -> flist) vlistn) (* \thocwmodulesubsection{Diagnostics} *) let count_propagators a = List.length a.CA.fusions let count_fusions a = List.fold_left (fun n (_, a) -> n + List.length a) 0 a.CA.fusions + List.fold_left (fun n (_, t) -> n + List.length t) 0 a.CA.brakets + List.length a.CA.brakets (* \begin{dubious} This brute force approach blows up for more than ten particles. Find a smarter algorithm. \end{dubious} *) let count_diagrams a = List.fold_left (fun n (wf1, wf23) -> n + CA.D.count_trees wf1 a.CA.fusion_dag * (List.fold_left (fun n' (_, wfs) -> n' + PT.fold_left (fun n'' wf -> n'' * CA.D.count_trees wf a.CA.fusion_dag) 1 wfs) 0 wf23)) 0 a.CA.brakets exception Impossible let forest' a = let below wf = CA.D.forest_memoized wf a.CA.fusion_dag in ThoList.flatmap (fun (bra, ket) -> (Product.list2 (fun bra' ket' -> bra' :: ket') (below bra) (ThoList.flatmap (fun (_, wfs) -> Product.list (fun w -> w) (PT.to_list (PT.map below wfs))) ket))) a.CA.brakets let cross wf = { CA.flavor = CM.conjugate wf.CA.flavor; CA.momentum = P.neg wf.CA.momentum; CA.wf_tag = wf.CA.wf_tag } let fuse_trees wf ts = Tree.fuse (fun (wf', e) -> (cross wf', e)) wf (fun t -> List.mem wf (Tree.leafs t)) ts let forest wf a = List.map (fuse_trees wf) (forest' a) (*i (* \begin{dubious} The following duplication should be replaced by polymorphism or a functor. \end{dubious} *) let forest_uncolored' a = let below wf = A.D.forest_memoized wf a.A.fusion_dag in ThoList.flatmap (fun (bra, ket) -> (Product.list2 (fun bra' ket' -> bra' :: ket') (below bra) (ThoList.flatmap (fun (_, wfs) -> Product.list (fun w -> w) (PT.to_list (PT.map below wfs))) ket))) a.A.brakets let cross_uncolored wf = { A.flavor = M.conjugate wf.A.flavor; A.momentum = P.neg wf.A.momentum; A.wf_tag = wf.A.wf_tag } let fuse_trees_uncolored wf ts = Tree.fuse (fun (wf', e) -> (cross_uncolored wf', e)) wf (fun t -> List.mem wf (Tree.leafs t)) ts let forest_sans_color wf a = List.map (fuse_trees_uncolored wf) (forest_uncolored' a) i*) let poles_beneath wf dag = CA.D.eval_memoized (fun wf' -> [[]]) (fun wf' _ p -> List.map (fun p' -> wf' :: p') p) (fun wf1 wf2 -> Product.fold2 (fun wf' wfs' wfs'' -> (wf' @ wfs') :: wfs'') wf1 wf2 []) (@) [[]] [[]] wf dag let poles a = ThoList.flatmap (fun (wf1, wf23) -> let poles_wf1 = poles_beneath wf1 a.CA.fusion_dag in (ThoList.flatmap (fun (_, wfs) -> Product.list List.flatten (PT.to_list (PT.map (fun wf -> poles_wf1 @ poles_beneath wf a.CA.fusion_dag) wfs))) wf23)) a.CA.brakets module WFSet = Set.Make (struct type t = CA.wf let compare = CA.order_wf end) let s_channel a = WFSet.elements (ThoList.fold_right2 (fun wf wfs -> if P.Scattering.timelike wf.CA.momentum then WFSet.add wf wfs else wfs) (poles a) WFSet.empty) (* \begin{dubious} This should be much faster! Is it correct? Is it faster indeed? \end{dubious} *) let poles' a = List.map CA.lhs a.CA.fusions let s_channel a = WFSet.elements (List.fold_right (fun wf wfs -> if P.Scattering.timelike wf.CA.momentum then WFSet.add wf wfs else wfs) (poles' a) WFSet.empty) (* \thocwmodulesubsection{Pictures} *) (* Export the DAG in the \texttt{dot(1)} file format so that we can draw pretty pictures to impress audiences \ldots *) let p2s p = if p >= 0 && p <= 9 then string_of_int p else if p <= 36 then String.make 1 (Char.chr (Char.code 'A' + p - 10)) else "_" let variable wf = CM.flavor_symbol wf.CA.flavor ^ String.concat "" (List.map p2s (P.to_ints wf.CA.momentum)) module Int = Map.Make (struct type t = int let compare = compare end) let add_to_list i n m = Int.add i (n :: try Int.find i m with Not_found -> []) m let classify_nodes dag = Int.fold (fun i n acc -> (i, n) :: acc) (CA.D.fold_nodes (fun wf -> add_to_list (P.rank wf.CA.momentum) wf) dag Int.empty) [] let dag_to_dot ch brakets dag = Printf.fprintf ch "digraph OMEGA {\n"; CA.D.iter_nodes (fun wf -> Printf.fprintf ch " \"%s\" [ label = \"%s\" ];\n" (variable wf) (variable wf)) dag; List.iter (fun (_, wfs) -> Printf.fprintf ch " { rank = same;"; List.iter (fun n -> Printf.fprintf ch " \"%s\";" (variable n)) wfs; Printf.fprintf ch " };\n") (classify_nodes dag); List.iter (fun n -> Printf.fprintf ch " \"*\" -> \"%s\";\n" (variable n)) (flatten_keystones brakets); CA.D.iter (fun n (_, ns) -> let p = variable n in PT.iter (fun n' -> Printf.fprintf ch " \"%s\" -> \"%s\";\n" p (variable n')) ns) dag; Printf.fprintf ch "}\n" let tower_to_dot ch a = dag_to_dot ch a.CA.brakets a.CA.fusion_tower let amplitude_to_dot ch a = dag_to_dot ch a.CA.brakets a.CA.fusion_dag (* \thocwmodulesubsection{Phasespace} *) let variable wf = M.flavor_to_string wf.A.flavor ^ "[" ^ String.concat "/" (List.map p2s (P.to_ints wf.A.momentum)) ^ "]" let below_to_channel transform ch dag wf = let n2s wf = variable (transform wf) and e2s c = "" in Tree2.to_channel ch n2s e2s (A.D.dependencies dag wf) let bra_to_channel transform ch dag wf = let tree = A.D.dependencies dag wf in if Tree2.is_singleton tree then let n2s wf = variable (transform wf) and e2s c = "" in Tree2.to_channel ch n2s e2s tree else failwith "Fusion.phase_space_channels: wrong topology!" let ket_to_channel transform ch dag ket = Printf.fprintf ch "("; begin match A.children ket with | [] -> () | [child] -> below_to_channel transform ch dag child | child :: children -> below_to_channel transform ch dag child; List.iter (fun child -> Printf.fprintf ch ","; below_to_channel transform ch dag child) children end; Printf.fprintf ch ")" let phase_space_braket transform ch (bra, ket) dag = bra_to_channel transform ch dag bra; Printf.fprintf ch ": {"; begin match ket with | [] -> () | [ket1] -> Printf.fprintf ch " "; ket_to_channel transform ch dag ket1 | ket1 :: kets -> Printf.fprintf ch " "; ket_to_channel transform ch dag ket1; List.iter (fun k -> Printf.fprintf ch " \\\n | "; ket_to_channel transform ch dag k) kets end; Printf.fprintf ch " }\n" (*i Food for thought: let braket_to_tree2 dag (bra, ket) = let bra' = A.D.dependencies dag bra in if Tree2.is_singleton bra' then Tree2.cons [(fst ket, bra, List.map (A.D.dependencies dag) (A.children ket))] else failwith "Fusion.phase_space_channels: wrong topology!" let phase_space_braket transform ch (bra, ket) dag = let n2s wf = variable (transform wf) and e2s c = "" in Printf.fprintf ch "%s\n" (Tree2.to_string n2s e2s (braket_to_tree2 dag (bra, ket))) i*) let phase_space_channels_transformed transform ch a = List.iter (fun braket -> phase_space_braket transform ch braket a.A.fusion_dag) a.A.brakets let phase_space_channels ch a = phase_space_channels_transformed (fun wf -> wf) ch a let exchange_momenta_list p1 p2 p = List.map (fun pi -> if pi = p1 then p2 else if pi = p2 then p1 else pi) p let exchange_momenta p1 p2 p = P.of_ints (P.dim p) (exchange_momenta_list p1 p2 (P.to_ints p)) let flip_momenta wf = { wf with A.momentum = exchange_momenta 1 2 wf.A.momentum } let phase_space_channels_flipped ch a = phase_space_channels_transformed flip_momenta ch a end module Make = Tagged(No_Tags) module Binary = Make(Tuple.Binary)(Stat_Dirac)(Topology.Binary) module Tagged_Binary (T : Tagger) = Tagged(T)(Tuple.Binary)(Stat_Dirac)(Topology.Binary) (* \thocwmodulesection{Fusions with Majorana Fermions} *) +let majorana_log silent logging = logging +let majorana_log silent logging = silent +let force_legacy = true +let force_legacy = false + module Stat_Majorana (M : Model.T) : (Stat with type flavor = M.flavor) = struct type flavor = M.flavor + (* JRR's algorithm doesn't use lists of pairs representing + directed arrows as in [Stat._Dirac().stat] above, but a list + of integers denoting the external leg a fermion line connects + to: *) type stat = | Fermion of int * int list | AntiFermion of int * int list | Boson of int list | Majorana of int * int list - let lines_to_string lines = - ThoList.to_string string_of_int lines + let sign_of_permutation lines = fst (Combinatorics.sort_signed lines) - let stat_to_string = function - | Boson lines -> Printf.sprintf "Boson %s" (lines_to_string lines) - | Fermion (p, lines) -> - Printf.sprintf "Fermion (%d, %s)" p (lines_to_string lines) - | AntiFermion (p, lines) -> - Printf.sprintf "AntiFermion (%d, %s)" p (lines_to_string lines) - | Majorana (p, lines) -> - Printf.sprintf "Fermion (%d, %s)" p (lines_to_string lines) + let lines_equivalent l1 l2 = + sign_of_permutation l1 = sign_of_permutation l2 + + let stat_to_string s = + let open Printf in + let l2s = ThoList.to_string string_of_int in + match s with + | Boson lines -> sprintf "B %s" (l2s lines) + | Fermion (p, lines) -> sprintf "F (%d, %s)" p (l2s lines) + | AntiFermion (p, lines) -> sprintf "A (%d, %s)" p (l2s lines) + | Majorana (p, lines) -> sprintf "M (%d, %s)" p (l2s lines) + (* Writing a cases explicitely to allow exhaustiveness checking + is too tedious here. *) let equal s1 s2 = match s1, s2 with - | Boson l1, Boson l2 -> l1 = l2 + | Boson l1, Boson l2 -> + lines_equivalent l1 l2 | Majorana (p1, l1), Majorana (p2, l2) | Fermion (p1, l1), Fermion (p2, l2) - | AntiFermion (p1, l1), AntiFermion (p2, l2) -> p1 = p2 && l1 = l2 + | AntiFermion (p1, l1), AntiFermion (p2, l2) -> + p1 = p2 && lines_equivalent l1 l2 | _ -> false + (* The final amplitude must not be fermionic! *) let complete = function | Boson _ -> true | _ -> false + (* [stat f p] interprets the numeric fermion numbers of flavor [f] + at external leg [p] at creates a leaf: *) let stat f p = match M.fermion f with | 0 -> Boson [] | 1 -> Fermion (p, []) | -1 -> AntiFermion (p, []) | 2 -> Majorana (p, []) | _ -> invalid_arg "Fusion.Stat_Majorana: invalid fermion number" -(* \begin{JR} - In the formalism of~\cite{Denner:Majorana}, it does not matter to distinguish +(* In the formalism of~\cite{Denner:Majorana}, it does not matter to distinguish spinors and conjugate spinors, it is only important to know in which direction a fermion line is calculated. So the sign is made by the calculation together with an aditional one due to the permuation of the pairs of endpoints of fermion lines in the direction they are calculated. We propose a ``canonical'' direction from the right to the left child at a fusion point so we only have to keep in mind which external particle hangs at each side. Therefore we need not to have a list of pairs of conjugate spinors and spinors but just a list in which the pairs are right-left-right-left and so on. Unfortunately it is unavoidable to have couplings with clashing arrows in supersymmetric theories so we need transmutations from fermions - in antifermions and vice versa as well. - \end{JR} *) + in antifermions and vice versa as well. *) exception Impossible -(*i - let stat_fuse s1 s2 f = - match s1, s2, M.lorentz f with - | Boson l1, Boson l2, _ -> Boson (l1 @ l2) - | Boson l1, Fermion (p, l2), Coupling.Majorana -> - Majorana (p, l1 @ l2) - | Boson l1, Fermion (p, l2), _ -> Fermion (p, l1 @ l2) - | Boson l1, AntiFermion (p, l2), Coupling.Majorana -> - Majorana (p, l1 @ l2) - | Boson l1, AntiFermion (p, l2), _ -> AntiFermion (p, l1 @ l2) - | Fermion (p, l1), Boson l2, Coupling.Majorana -> - Majorana (p, l1 @ l2) - | Fermion (p, l1), Boson l2, _ -> Fermion (p, l1 @ l2) - | AntiFermion (p, l1), Boson l2, Coupling.Majorana -> - Majorana (p, l1 @ l2) - | AntiFermion (p, l1), Boson l2, _ -> - AntiFermion (p, l1 @ l2) - | Majorana (p, l1), Boson l2, Coupling.Spinor -> - Fermion (p, l1 @ l2) - | Majorana (p, l1), Boson l2, Coupling.ConjSpinor -> - AntiFermion (p, l1 @ l2) - | Majorana (p, l1), Boson l2, _ -> - Majorana (p, l1 @ l2) - | Boson l1, Majorana (p, l2), Coupling.Spinor -> - Fermion (p, l1 @ l2) - | Boson l1, Majorana (p, l2), Coupling.ConjSpinor -> - AntiFermion (p, l1 @ l2) - | Boson l1, Majorana (p, l2), _ -> - Majorana (p, l1 @ l2) - | AntiFermion (pbar, l1), Fermion (p, l2), _ -> - Boson ([p; pbar] @ l1 @ l2) - | Fermion (p, l1), AntiFermion (pbar, l2), _ -> - Boson ([pbar; p] @ l1 @ l2) - | Fermion (pf, l1), Majorana (pm, l2), _ -> - Boson ([pm; pf] @ l1 @ l2) - | Majorana (pm, l1), Fermion (pf, l2), _ -> - Boson ([pf; pm] @ l1 @ l2) - | AntiFermion (pa, l1), Majorana (pm, l2), _ -> - Boson ([pm; pa] @ l1 @ l2) - | Majorana (pm, l1), AntiFermion (pa, l2), _ -> - Boson ([pa; pm] @ l1 @ l2) - | Majorana (p1, l1), Majorana (p2, l2), _ -> + (* In old case with at most one fermion line, it was straight + forward to determine the kind of outgoing line from the + corresponding flavor. In the general case, it is not + possible to maintain this constraint, when constructing + the $n$-ary fusion from binary ones. *) + + (* We can break up the process into two steps however: + first perform unconstrained fusions pairwise \ldots *) + + let stat_fuse_pair_unconstrained s1 s2 = + match s1, s2 with + | Boson l1, Boson l2 -> Boson (l1 @ l2) + | (Majorana (p1, l1) | Fermion (p1, l1) | AntiFermion (p1, l1)), + (Majorana (p2, l2) | Fermion (p2, l2) | AntiFermion (p2, l2)) -> Boson ([p2; p1] @ l1 @ l2) - | Fermion _, Fermion _, _ | AntiFermion _, - AntiFermion _, _ -> raise Impossible -i*) + | Boson l1, Majorana (p, l2) -> Majorana (p, l1 @ l2) + | Boson l1, Fermion (p, l2) -> Fermion (p, l1 @ l2) + | Boson l1, AntiFermion (p, l2) -> AntiFermion (p, l1 @ l2) + | Majorana (p, l1), Boson l2 -> Majorana (p, l1 @ l2) + | Fermion (p, l1), Boson l2 -> Fermion (p, l1 @ l2) + | AntiFermion (p, l1), Boson l2 -> AntiFermion (p, l1 @ l2) + + (* \ldots{} and only apply the constraint to the outgoing leg. *) + + let constrain_stat_fusion s f = + match s, M.lorentz f with + | (Majorana (p, l) | Fermion (p, l) | AntiFermion (p, l)), + (Coupling.Majorana | Coupling.Vectorspinor) -> Majorana (p, l) + | (Majorana (p, l) | Fermion (p, l) | AntiFermion (p, l)), + Coupling.Spinor -> Fermion (p, l) + | (Majorana (p, l) | Fermion (p, l) | AntiFermion (p, l)), + Coupling.ConjSpinor -> AntiFermion (p, l) + | (Majorana _ | Fermion _ | AntiFermion _ as s), _ -> + invalid_arg + (Printf.sprintf + "Fusion.stat_fuse_pair_constrained: expected boson, got %s" + (stat_to_string s)) + | Boson l as s, + (Coupling.Majorana | Coupling.Spinor | Coupling.ConjSpinor) -> + invalid_arg + (Printf.sprintf + "Fusion.stat_fuse_pair_constrained: expected fermion, got %s" + (stat_to_string s)) + | Boson l, _ -> Boson l let stat_fuse_pair_legacy f s1 s2 = - match s1, s2, M.lorentz f with - | Boson l1, Fermion (p, l2), Coupling.Majorana - | Boson l1, AntiFermion (p, l2), Coupling.Majorana - | Fermion (p, l1), Boson l2, Coupling.Majorana - | AntiFermion (p, l1), Boson l2, Coupling.Majorana - | Majorana (p, l1), Boson l2, Coupling.Majorana - | Boson l1, Majorana (p, l2), Coupling.Majorana -> - Majorana (p, l1 @ l2) - | Boson l1, Fermion (p, l2), Coupling.Spinor - | Boson l1, AntiFermion (p, l2), Coupling.Spinor - | Fermion (p, l1), Boson l2, Coupling.Spinor - | AntiFermion (p, l1), Boson l2, Coupling.Spinor - | Majorana (p, l1), Boson l2, Coupling.Spinor - | Boson l1, Majorana (p, l2), Coupling.Spinor -> - Fermion (p, l1 @ l2) - | Boson l1, Fermion (p, l2), Coupling.ConjSpinor - | Boson l1, AntiFermion (p, l2), Coupling.ConjSpinor - | Fermion (p, l1), Boson l2, Coupling.ConjSpinor - | AntiFermion (p, l1), Boson l2, Coupling.ConjSpinor - | Majorana (p, l1), Boson l2, Coupling.ConjSpinor - | Boson l1, Majorana (p, l2), Coupling.ConjSpinor -> - AntiFermion (p, l1 @ l2) - | Boson l1, Fermion (p, l2), Coupling.Vectorspinor - | Boson l1, AntiFermion (p, l2), Coupling.Vectorspinor - | Fermion (p, l1), Boson l2, Coupling.Vectorspinor - | AntiFermion (p, l1), Boson l2, Coupling.Vectorspinor - | Majorana (p, l1), Boson l2, Coupling.Vectorspinor - | Boson l1, Majorana (p, l2), Coupling.Vectorspinor -> - Majorana (p, l1 @ l2) - | Boson l1, Boson l2, _ -> Boson (l1 @ l2) - | AntiFermion (p1, l1), Fermion (p2, l2), _ - | Fermion (p1, l1), AntiFermion (p2, l2), _ - | Fermion (p1, l1), Fermion (p2, l2), _ - | AntiFermion (p1, l1), AntiFermion (p2, l2), _ - | Fermion (p1, l1), Majorana (p2, l2), _ - | Majorana (p1, l1), Fermion (p2, l2), _ - | AntiFermion (p1, l1), Majorana (p2, l2), _ - | Majorana (p1, l1), AntiFermion (p2, l2), _ - | Majorana (p1, l1), Majorana (p2, l2), _ -> - Boson ([p2; p1] @ l1 @ l2) - | Boson l1, Majorana (p, l2), _ -> Majorana (p, l1 @ l2) - | Boson l1, Fermion (p, l2), _ -> Fermion (p, l1 @ l2) - | Boson l1, AntiFermion (p, l2), _ -> AntiFermion (p, l1 @ l2) - | Fermion (p, l1), Boson l2, _ -> Fermion (p, l1 @ l2) - | AntiFermion (p, l1), Boson l2, _ -> AntiFermion (p, l1 @ l2) - | Majorana (p, l1), Boson l2, _ -> Majorana (p, l1 @ l2) + stat_fuse_pair_unconstrained s1 s2 let stat_fuse_pair_legacy_logging f s1 s2 = let stat = stat_fuse_pair_legacy f s1 s2 in Printf.eprintf - "Fusion.Stat_Majorana.stat_fuse_pair_legacy: %s <- %s -> %s\n" - (M.flavor_to_string f) - (ThoList.to_string stat_to_string [s1; s2]) - (stat_to_string stat); + "stat_fuse_pair_legacy: (%s, %s) -> %s = %s\n" + (stat_to_string s1) (stat_to_string s2) (stat_to_string stat) + (M.flavor_to_string f); stat + let stat_fuse_pair_legacy = + majorana_log stat_fuse_pair_legacy stat_fuse_pair_legacy_logging + + (* Note that we are using [List.fold_left], therefore + we perform the fusions as + $f(f(\ldots(f(s_1,s_2),s_3),\ldots),s_n)$. Had we used + [List.fold_right] instead, we would compute + $f(s_1,f(s_2,\ldots f(s_{n-1},s_n))).$ For our Dirac + algorithm, this makes no difference, but JRR's Majorana + algorithm depends on the order! *) + + (* Also not that we \emph{must not} apply [constrain_stat_fusion] + here, because [stat_fuse_legacy] will be used in + [stat_keystone_legacy] again, where we always expect + [Boson _]. *) let stat_fuse_legacy s1 s23__n f = List.fold_left (stat_fuse_pair_legacy f) s1 s23__n + let stat_fuse_legacy' s1 s23__n f = + match List.rev (s1 :: s23__n) with + | s1 :: s23__n -> List.fold_left (stat_fuse_pair_legacy f) s1 s23__n + | [] -> failwith "stat_fuse_legacy: impossible" + + let stat_fuse_legacy' s1 s23__n f = + List.fold_right (stat_fuse_pair_legacy f) s23__n s1 + let stat_fuse_legacy_logging s1 s23__n f = let stat = stat_fuse_legacy s1 s23__n f in Printf.eprintf - "Fusion.Stat_Majorana.stat_fuse_legacy: %s <- %s -> %s\n" - (M.flavor_to_string f) + "stat_fuse_legacy: %s -> %s = %s\n" (ThoList.to_string stat_to_string (s1 :: s23__n)) - (stat_to_string stat); + (stat_to_string stat) + (M.flavor_to_string f); stat + let stat_fuse_legacy = + majorana_log stat_fuse_legacy stat_fuse_legacy_logging + + (* We need to match the fermion lines in the incoming propagators + using the connection information in the vertex. This used to + be trivial in the old omega, because there was at most one + fermion line in a vertex. *) module IMap = Map.Make (struct type t = int let compare = compare end) + (* From version 4.05 on, this is just [IMap.find_opt]. *) + let imap_find_opt p map = + try Some (IMap.find p map) with Not_found -> None + + (* Partially combined [stat]s of the incoming propagators and keeping + track of the fermion lines, while we're scanning them. We will + perform two passes: + \begin{enumerate} + \item collect the saturated fermion lines in a [Boson], while + building a map from the indices in the vertex to the open + fermion lines + \item connect the open fermion lines using this map. + \end{enumerate} *) type partial = - { stat : stat; - majoranas : int IMap.t; - n : int } + { stat : stat (* the [stat] accumulated so far *); + fermions : int IMap.t (* a map from the indices in the vertex to open fermion lines *); + n : int (* the number of incoming propagators *) } + + let empty_partial = + { stat = Boson []; + fermions = IMap.empty; + n = 0 } + (* Only for debugging: *) let partial_to_string p = Printf.sprintf - "n = %d, majoranas = %s, stat = %s" - p.n + "{ %s, %s, %d }" (ThoList.to_string - (fun (i, f) -> Printf.sprintf "%d@%d" f i) - (IMap.bindings p.majoranas)) + (fun (i, particle) -> Printf.sprintf "%d@%d" i particle) + (IMap.bindings p.fermions)) (stat_to_string p.stat) + p.n + (* Add a list of saturated fermion lines at the top of the list + of lines in a [stat]. *) let add_lines l = function | Boson l' -> Boson (l @ l') | Fermion (n, l') -> Fermion (n, l @ l') | AntiFermion (n, l') -> AntiFermion (n, l @ l') | Majorana (n, l') -> Majorana (n, l @ l') - let partial_of_slist slist = - List.fold_left - (fun acc s -> - let n = succ acc.n in - match s with - | Boson l -> - { acc with - stat = add_lines l acc.stat; - n } - | Fermion (p, l) -> - invalid_arg - "Fusion.Stat_Majorana.partial_of_slist: unexpected Fermion" - | AntiFermion (p, l) -> - invalid_arg - "Fusion.Stat_Majorana.partial_of_slist: unexpected AntiFermion" - | Majorana (p, l) -> - { majoranas = IMap.add n p acc.majoranas; - stat = add_lines l acc.stat; - n } ) - { stat = Boson []; - majoranas = IMap.empty; - n = 0 } - slist + (* Single step of pass 1: collect the saturated fermion lines + and add a pointer to an open fermion line in case of a fermion. *) + let add_lines_to_partial p stat = + let n = succ p.n in + match stat with + | Boson l -> + { fermions = p.fermions; + stat = add_lines l p.stat; + n } + | Majorana (f, l) -> + { fermions = IMap.add n f p.fermions; + stat = add_lines l p.stat; + n } + | Fermion (p, l) -> + invalid_arg + "Fusion.Stat_Majorana.add_lines_to_partial: unexpected Fermion" + | AntiFermion (p, l) -> + invalid_arg + "Fusion.Stat_Majorana.add_lines_to_partial: unexpected AntiFermion" + + let partial_of_slist stat_list = + List.fold_left add_lines_to_partial empty_partial stat_list + + let partial_of_rev_slist stat_list = + List.fold_left add_lines_to_partial empty_partial (List.rev stat_list) + + (* The indices [i] and [j] refer to incoming lines: add a saturated + line to [p.stat] and remove the corresponding open lines from + the map. *) + let saturate_fermion_line p i j = + match imap_find_opt i p.fermions, imap_find_opt j p.fermions with + | Some f, Some f' -> + { stat = add_lines [f'; f] p.stat; + fermions = IMap.remove i (IMap.remove j p.fermions); + n = p.n } + | _ -> invalid_arg "saturate_fermion_line: mismatch" + + (* The index [i] refers to an incoming line: add the open line + to [p.stat] and remove it from the map. *) + let pass_through_fermion_line p i = + match imap_find_opt i p.fermions, p.stat with + | Some f, Boson l -> + { stat = Majorana (f, l); + fermions = IMap.remove i p.fermions; + n = p.n } + | None, Boson l -> + invalid_arg "pass_through_fermion_line: mismatch" + | _, (Majorana _ | Fermion _ | AntiFermion _) -> + invalid_arg "pass_through_fermion_line: more than one open lines" - let find_opt p map = - try Some (IMap.find p map) with Not_found -> None + (* Single step of pass 2: saturate a fermion line or pass it through: *) + + (* \begin{dubious} + Experimental: ignore the direction of the fermion line + in order to reproduce JRR's algorithm. + \end{dubious} *) + let sort_pair (i, j) = + if i < j then + (i, j) + else + (j, i) let match_fermion_line p (i, j) = + let i, j = sort_pair (i, j) in if i <= p.n && j <= p.n then - match find_opt i p.majoranas, find_opt j p.majoranas with - | Some f1, Some f2 -> - { p with - stat = add_lines [f2; f1] p.stat; - majoranas = IMap.remove i (IMap.remove j p.majoranas) } - | _ -> - invalid_arg "match_fermion_line: mismatch" + saturate_fermion_line p i j else if i <= p.n then - match find_opt i p.majoranas, p.stat with - | Some f, Boson l -> - { p with - stat = Majorana (f, l); - majoranas = IMap.remove i p.majoranas } - | _ -> - invalid_arg "match_fermion_line: mismatch" + pass_through_fermion_line p i else if j <= p.n then - match find_opt j p.majoranas, p.stat with - | Some f, Boson l -> - { p with - stat = Majorana (f, l); - majoranas = IMap.remove j p.majoranas } - | _ -> - invalid_arg "match_fermion_line: mismatch" + pass_through_fermion_line p j else failwith "match_fermion_line: impossible" let match_fermion_line_logging p (i, j) = Printf.eprintf - "Fusion.match_fermion_line <<< %s (%d, %d)\n" + "match_fermion_line %s (%d, %d)" (partial_to_string p) i j; let p' = match_fermion_line p (i, j) in - Printf.eprintf - "Fusion.match_fermion_line >>> %s\n" - (partial_to_string p'); + Printf.eprintf " >> %s\n" (partial_to_string p'); p' + let match_fermion_line = + majorana_log match_fermion_line match_fermion_line_logging + + (* Combine the passes \ldots *) let match_fermion_lines flines s1 s23__n = - let p = partial_of_slist (s1 :: s23__n) in - List.fold_left match_fermion_line p flines + List.fold_left match_fermion_line (partial_of_slist (s1 :: s23__n)) flines + (* \ldots{} and keep only the [stat]. *) let stat_fuse_new flines s1 s23__n f = (match_fermion_lines flines s1 s23__n).stat - let stat_fuse_new_checking flines s1 s23__n f = - let stat = stat_fuse_new flines s1 s23__n f in + let stat_fuse_new_check stat flines s1 s23__n f = if List.length flines < 2 then begin let legacy = stat_fuse_legacy s1 s23__n f in if not (equal stat legacy) then failwith (Printf.sprintf "Fusion.Stat_Majorana.stat_fuse_new: %s <> %s!" (stat_to_string stat) (stat_to_string legacy)) - end; - stat + end let stat_fuse_new_logging flines s1 s23__n f = + let stat = stat_fuse_new flines s1 s23__n f in Printf.eprintf - "Fusion.Stat_Majorana.stat_fuse_new: \ - connecting fermion lines %s in %s <- %s\n" + "stat_fuse_new: %s: %s -> %s = %s\n" (UFO_Lorentz.fermion_lines_to_string flines) - (M.flavor_to_string f) - (ThoList.to_string stat_to_string (s1 :: s23__n)); - stat_fuse_new_checking flines s1 s23__n f + (ThoList.to_string stat_to_string (s1 :: s23__n)) + (stat_to_string stat) + (M.flavor_to_string f); + stat_fuse_new_check stat flines s1 s23__n f; + stat + + let stat_fuse_new = + majorana_log stat_fuse_new stat_fuse_new_logging let stat_fuse flines_opt slist f = match slist with | [] -> invalid_arg "Fusion.Stat_Majorana.stat_fuse: empty" | s1 :: s23__n -> - begin match flines_opt with - | Some flines -> stat_fuse_new flines s1 s23__n f - | None -> stat_fuse_legacy s1 s23__n f - end + constrain_stat_fusion + (match flines_opt with + | Some flines -> stat_fuse_new flines s1 s23__n f + | None -> stat_fuse_legacy s1 s23__n f) f let stat_fuse_logging flines_opt slist f = + let stat = stat_fuse flines_opt slist f in Printf.eprintf - "Fusion.Stat_Majorana.stat_fuse: %s <- %s\n" - (M.flavor_to_string f) - (ThoList.to_string stat_to_string slist); - stat_fuse flines_opt slist f + "stat_fuse: %s -> %s = %s\n" + (ThoList.to_string stat_to_string slist) + (stat_to_string stat) + (M.flavor_to_string f); + stat + + let stat_fuse = + majorana_log stat_fuse stat_fuse_logging - (* JRR's alogrithm depends on the ordering! *) let stat_keystone_legacy s1 s23__n f = - let s2 = List.hd s23__n - and s34__n = List.tl s23__n in - stat_fuse_legacy (stat_fuse_legacy s2 s34__n (M.conjugate f)) [s1] f + stat_fuse_legacy s1 s23__n f let stat_keystone_legacy_logging s1 s23__n f = let s = stat_keystone_legacy s1 s23__n f in Printf.eprintf - "Fusion.Stat_Majorana.stat_keystone_legacy: %s (%s) %s -> %s\n" + "stat_keystone_legacy: %s (%s) %s -> %s\n" (stat_to_string s1) (M.flavor_to_string f) (ThoList.to_string stat_to_string s23__n) (stat_to_string s); s + let stat_keystone_legacy = + majorana_log stat_keystone_legacy stat_keystone_legacy_logging + let stat_keystone flines_opt slist f = match slist with | [] -> invalid_arg "Fusion.Stat_Majorana.stat_keystone: empty" - | s1 :: s23__n -> + | [s] -> invalid_arg "Fusion.Stat_Majorana.stat_keystone: singleton" + | s1 :: (s2 :: s34__n as s23__n) -> begin match flines_opt with | None -> stat_keystone_legacy s1 s23__n f | Some flines -> - let stat = stat_fuse_new flines s1 s23__n f in + let stat = + stat_fuse_legacy s1 [stat_fuse_new flines s2 s34__n f] f + and legacy = stat_keystone_legacy s1 s23__n f in + if not (equal stat legacy) then + failwith + (Printf.sprintf + "Fusion.Stat_Majorana.stat_keystone: %s <> %s!" + (stat_to_string stat) + (stat_to_string legacy)); if complete stat then stat else failwith (Printf.sprintf "Fusion.Stat_Majorana.stat_keystone: incomplete %s!" (stat_to_string stat)) end -(*i These are the old Impossible raising rules. We keep them to ask Ohl - what the generalized topologies do and if our stat_fuse does the right - for 4-vertices with - - | Boson l1, AntiFermion (p, l2), _ - | Fermion (p, l1), Boson l2, _ - | AntiFermion (p, l1), Boson l2, _ - | Majorana (p, l1), Boson l2, _ - | Boson l1, Majorana (p, l2), _ -> - raise Impossible -i*) + (* Force the legacy version w/o checking against the + new implementation for comparing generated code + against the hard coded models: *) - let permutation lines = fst (Combinatorics.sort_signed lines) + let stat_fuse flines_opt slist f = + if force_legacy then + stat_fuse_legacy (List.hd slist) (List.tl slist) f + else + stat_fuse flines_opt slist f + + let stat_keystone flines_opt slist f = + if force_legacy then + stat_keystone_legacy (List.hd slist) (List.tl slist) f + else + stat_keystone flines_opt slist f let stat_sign = function - | Boson lines -> permutation lines - | Fermion (p, lines) -> permutation (p :: lines) - | AntiFermion (pbar, lines) -> permutation (pbar :: lines) - | Majorana (pm, lines) -> permutation (pm :: lines) + | Boson lines -> sign_of_permutation lines + | Fermion (p, lines) -> sign_of_permutation (p :: lines) + | AntiFermion (pbar, lines) -> sign_of_permutation (pbar :: lines) + | Majorana (pm, lines) -> sign_of_permutation (pm :: lines) let stat_sign_logging stat = let sign = stat_sign stat in Printf.eprintf - "Fusion.Stat_Majorana.stat_sign: %s -> %d\n" + "stat_sign: %s -> %d\n" (stat_to_string stat) sign; sign + let stat_sign = + majorana_log stat_sign stat_sign_logging + end module Binary_Majorana = Make(Tuple.Binary)(Stat_Majorana)(Topology.Binary) module Nary (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Dirac)(Topology.Nary(B)) module Nary_Majorana (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Majorana)(Topology.Nary(B)) module Mixed23 = Make(Tuple.Mixed23)(Stat_Dirac)(Topology.Mixed23) module Mixed23_Majorana = Make(Tuple.Mixed23)(Stat_Majorana)(Topology.Mixed23) module Helac (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Dirac)(Topology.Helac(B)) module Helac_Majorana (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Majorana)(Topology.Helac(B)) (* \thocwmodulesection{Multiple Amplitudes} *) module type Multi = sig exception Mismatch val options : Options.t type flavor type process = flavor list * flavor list type amplitude type fusion type wf type exclusions val no_exclusions : exclusions type selectors type amplitudes val amplitudes : bool -> int option -> exclusions -> selectors -> process list -> amplitudes val empty : amplitudes val initialize_cache : string -> unit val set_cache_name : string -> unit val flavors : amplitudes -> process list val vanishing_flavors : amplitudes -> process list val color_flows : amplitudes -> Color.Flow.t list val helicities : amplitudes -> (int list * int list) list val processes : amplitudes -> amplitude list val process_table : amplitudes -> amplitude option array array val fusions : amplitudes -> (fusion * amplitude) list val multiplicity : amplitudes -> wf -> int val dictionary : amplitudes -> amplitude -> wf -> int val color_factors : amplitudes -> Color.Flow.factor array array val constraints : amplitudes -> string option end module type Multi_Maker = functor (Fusion_Maker : Maker) -> functor (P : Momentum.T) -> functor (M : Model.T) -> Multi with type flavor = M.flavor and type amplitude = Fusion_Maker(P)(M).amplitude and type fusion = Fusion_Maker(P)(M).fusion and type wf = Fusion_Maker(P)(M).wf and type selectors = Fusion_Maker(P)(M).selectors module Multi (Fusion_Maker : Maker) (P : Momentum.T) (M : Model.T) = struct exception Mismatch type progress_mode = | Quiet | Channel of out_channel | File of string let progress_option = ref Quiet module CM = Colorize.It(M) module F = Fusion_Maker(P)(M) module C = Cascade.Make(M)(P) (* \begin{dubious} A kludge, at best \ldots \end{dubious} *) let options = Options.extend F.options [ "progress", Arg.Unit (fun () -> progress_option := Channel stderr), "report progress to the standard error stream"; "progress_file", Arg.String (fun s -> progress_option := File s), "report progress to a file" ] type flavor = M.flavor type p = F.p type process = flavor list * flavor list type amplitude = F.amplitude type fusion = F.fusion type wf = F.wf type exclusions = F.exclusions let no_exclusions = F.no_exclusions type selectors = F.selectors type flavors = flavor list array type helicities = int list array type colors = Color.Flow.t array type amplitudes' = amplitude array array array type amplitudes = { flavors : process list; vanishing_flavors : process list; color_flows : Color.Flow.t list; helicities : (int list * int list) list; processes : amplitude list; process_table : amplitude option array array; fusions : (fusion * amplitude) list; multiplicity : (wf -> int); dictionary : (amplitude -> wf -> int); color_factors : Color.Flow.factor array array; constraints : string option } let flavors a = a.flavors let vanishing_flavors a = a.vanishing_flavors let color_flows a = a.color_flows let helicities a = a.helicities let processes a = a.processes let process_table a = a.process_table let fusions a = a.fusions let multiplicity a = a.multiplicity let dictionary a = a.dictionary let color_factors a = a.color_factors let constraints a = a.constraints let sans_colors f = List.map CM.flavor_sans_color f let colors (fin, fout) = List.map M.color (fin @ fout) let process_sans_color a = (sans_colors (F.incoming a), sans_colors (F.outgoing a)) let color_flow a = CM.flow (F.incoming a) (F.outgoing a) let process_to_string fin fout = String.concat " " (List.map M.flavor_to_string fin) ^ " -> " ^ String.concat " " (List.map M.flavor_to_string fout) let count_processes colored_processes = List.length colored_processes module FMap = Map.Make (struct type t = process let compare = compare end) module CMap = Map.Make (struct type t = Color.Flow.t let compare = compare end) (* Recently [Product.list] began to guarantee lexicographic order for sorted arguments. Anyway, we still force a lexicographic order. *) let rec order_spin_table1 s1 s2 = match s1, s2 with | h1 :: t1, h2 :: t2 -> let c = compare h1 h2 in if c <> 0 then c else order_spin_table1 t1 t2 | [], [] -> 0 | _ -> invalid_arg "order_spin_table: inconsistent lengths" let order_spin_table (s1_in, s1_out) (s2_in, s2_out) = let c = compare s1_in s2_in in if c <> 0 then c else order_spin_table1 s1_out s2_out let sort_spin_table table = List.sort order_spin_table table let id x = x let pair x y = (x, y) (* \begin{dubious} Improve support for on shell Ward identities: [Coupling.Vector -> [4]] for one and only one external vector. \end{dubious} *) let rec hs_of_lorentz = function | Coupling.Scalar -> [0] | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana | Coupling.Maj_Ghost -> [-1; 1] | Coupling.Vector -> [-1; 1] | Coupling.Massive_Vector -> [-1; 0; 1] | Coupling.Tensor_1 -> [-1; 0; 1] | Coupling.Vectorspinor -> [-2; -1; 1; 2] | Coupling.Tensor_2 -> [-2; -1; 0; 1; 2] | Coupling.BRS f -> hs_of_lorentz f let hs_of_flavor f = hs_of_lorentz (M.lorentz f) let hs_of_flavors (fin, fout) = (List.map hs_of_flavor fin, List.map hs_of_flavor fout) let rec unphysical_of_lorentz = function | Coupling.Vector -> [4] | Coupling.Massive_Vector -> [4] | _ -> invalid_arg "unphysical_of_lorentz: not a vector particle" let unphysical_of_flavor f = unphysical_of_lorentz (M.lorentz f) let unphysical_of_flavors1 n f_list = ThoList.mapi (fun i f -> if i = n then unphysical_of_flavor f else hs_of_flavor f) 1 f_list let unphysical_of_flavors n (fin, fout) = (unphysical_of_flavors1 n fin, unphysical_of_flavors1 (n - List.length fin) fout) let helicity_table unphysical flavors = let hs = begin match unphysical with | None -> List.map hs_of_flavors flavors | Some n -> List.map (unphysical_of_flavors n) flavors end in if not (ThoList.homogeneous hs) then invalid_arg "Fusion.helicity_table: not all flavors have the same helicity states!" else match hs with | [] -> [] | (hs_in, hs_out) :: _ -> sort_spin_table (Product.list2 pair (Product.list id hs_in) (Product.list id hs_out)) module Proc = Process.Make(M) module WFMap = Map.Make (struct type t = F.wf let compare = compare end) module WFSet2 = Set.Make (struct type t = F.wf * (F.wf, F.coupling) Tree2.t let compare = compare end) module WFMap2 = Map.Make (struct type t = F.wf * (F.wf, F.coupling) Tree2.t let compare = compare end) module WFTSet = Set.Make (struct type t = (F.wf, F.coupling) Tree2.t let compare = compare end) (* All wavefunctions are unique per amplitude. So we can use per-amplitude dependency trees without additional \emph{internal} tags to identify identical wave functions. *) (* \textbf{NB:} we miss potential optimizations, because we assume all coupling to be different, while in fact we have horizontal/family symmetries and non abelian gauge couplings are universal anyway. *) let disambiguate_fusions amplitudes = let fusions = ThoList.flatmap (fun amplitude -> List.map (fun fusion -> (fusion, F.dependencies amplitude (F.lhs fusion))) (F.fusions amplitude)) amplitudes in let duplicates = List.fold_left (fun map (fusion, dependencies) -> let wf = F.lhs fusion in let set = try WFMap.find wf map with Not_found -> WFTSet.empty in WFMap.add wf (WFTSet.add dependencies set) map) WFMap.empty fusions in let multiplicity_map = WFMap.fold (fun wf dependencies acc -> let cardinal = WFTSet.cardinal dependencies in if cardinal <= 1 then acc else WFMap.add wf cardinal acc) duplicates WFMap.empty and dictionary_map = WFMap.fold (fun wf dependencies acc -> let cardinal = WFTSet.cardinal dependencies in if cardinal <= 1 then acc else snd (WFTSet.fold (fun dependency (i', acc') -> (succ i', WFMap2.add (wf, dependency) i' acc')) dependencies (1, acc))) duplicates WFMap2.empty in let multiplicity wf = WFMap.find wf multiplicity_map and dictionary amplitude wf = WFMap2.find (wf, F.dependencies amplitude wf) dictionary_map in (multiplicity, dictionary) let eliminate_common_fusions1 seen_wfs amplitude = List.fold_left (fun (seen, acc) f -> let wf = F.lhs f in let dependencies = F.dependencies amplitude wf in if WFSet2.mem (wf, dependencies) seen then (seen, acc) else (WFSet2.add (wf, dependencies) seen, (f, amplitude) :: acc)) seen_wfs (F.fusions amplitude) let eliminate_common_fusions processes = let _, rev_fusions = List.fold_left eliminate_common_fusions1 (WFSet2.empty, []) processes in List.rev rev_fusions (*i let eliminate_common_fusions processes = ThoList.flatmap (fun amplitude -> (List.map (fun f -> (f, amplitude)) (F.fusions amplitude))) processes i*) (* \thocwmodulesubsection{Calculate All The Amplitudes} *) let amplitudes goldstones unphysical exclusions select_wf processes = (* \begin{dubious} Eventually, we might want to support inhomogeneous helicities. However, this makes little physics sense for external particles on the mass shell, unless we have a model with degenerate massive fermions and bosons. \end{dubious} *) if not (ThoList.homogeneous (List.map hs_of_flavors processes)) then invalid_arg "Fusion.Multi.amplitudes: incompatible helicities"; let unique_uncolored_processes = Proc.remove_duplicate_final_states (C.partition select_wf) processes in let progress = match !progress_option with | Quiet -> Progress.dummy | Channel oc -> Progress.channel oc (count_processes unique_uncolored_processes) | File name -> Progress.file name (count_processes unique_uncolored_processes) in let allowed = ThoList.flatmap (fun (fi, fo) -> Progress.begin_step progress (process_to_string fi fo); let amps = F.amplitudes goldstones exclusions select_wf fi fo in begin match amps with | [] -> Progress.end_step progress "forbidden" | _ -> Progress.end_step progress "allowed" end; amps) unique_uncolored_processes in Progress.summary progress "all processes done"; let color_flows = ThoList.uniq (List.sort compare (List.map color_flow allowed)) and flavors = ThoList.uniq (List.sort compare (List.map process_sans_color allowed)) in let vanishing_flavors = Proc.diff processes flavors in let helicities = helicity_table unphysical flavors in let f_index = fst (List.fold_left (fun (m, i) f -> (FMap.add f i m, succ i)) (FMap.empty, 0) flavors) and c_index = fst (List.fold_left (fun (m, i) c -> (CMap.add c i m, succ i)) (CMap.empty, 0) color_flows) in let table = Array.make_matrix (List.length flavors) (List.length color_flows) None in List.iter (fun a -> let f = FMap.find (process_sans_color a) f_index and c = CMap.find (color_flow a) c_index in table.(f).(c) <- Some (a)) allowed; let cf_array = Array.of_list color_flows in let ncf = Array.length cf_array in let color_factor_table = Array.make_matrix ncf ncf Color.Flow.zero in for i = 0 to pred ncf do for j = 0 to i do color_factor_table.(i).(j) <- Color.Flow.factor cf_array.(i) cf_array.(j); color_factor_table.(j).(i) <- color_factor_table.(i).(j) done done; let fusions = eliminate_common_fusions allowed and multiplicity, dictionary = disambiguate_fusions allowed in { flavors = flavors; vanishing_flavors = vanishing_flavors; color_flows = color_flows; helicities = helicities; processes = allowed; process_table = table; fusions = fusions; multiplicity = multiplicity; dictionary = dictionary; color_factors = color_factor_table; constraints = C.description select_wf } let initialize_cache = F.initialize_cache let set_cache_name = F.set_cache_name let empty = { flavors = []; vanishing_flavors = []; color_flows = []; helicities = []; processes = []; process_table = Array.make_matrix 0 0 None; fusions = []; multiplicity = (fun _ -> 1); dictionary = (fun _ _ -> 1); color_factors = Array.make_matrix 0 0 Color.Flow.zero; constraints = None } end Index: trunk/omega/src/model.mli =================================================================== --- trunk/omega/src/model.mli (revision 8415) +++ trunk/omega/src/model.mli (revision 8416) @@ -1,283 +1,288 @@ (* model.mli -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{General Quantum Field Theories} *) module type T = sig (* [flavor] abstractly encodes all quantum numbers. *) type flavor (* [Color.t] encodes the ($\textrm{SU}(N)$) color representation. *) val color : flavor -> Color.t val nc : unit -> int (* The set of conserved charges. *) module Ch : Charges.T val charges : flavor -> Ch.t (* The PDG particle code for interfacing with Monte Carlos. *) val pdg : flavor -> int (* The Lorentz representation of the particle. *) val lorentz : flavor -> Coupling.lorentz (* The propagator for the particle, which \emph{can} depend on a gauge parameter. *) type gauge val propagator : flavor -> gauge Coupling.propagator (* \emph{Not} the symbol for the numerical value, but the scheme or strategy. *) val width : flavor -> Coupling.width (* Charge conjugation, with and without color. *) val conjugate : flavor -> flavor (* Returns $1$ for fermions, $-1$ for anti-fermions, $2$ for Majoranas and $0$ otherwise. *) val fermion : flavor -> int (* The Feynman rules. [vertices] and [(fuse2, fuse3, fusen)] are redundant, of course. However, [vertices] is required for building functors for models and [vertices] can be recovered from [(fuse2, fuse3, fusen)] only at great cost. *) (* \begin{dubious} Nevertheless: [vertices] is a candidate for removal, b/c we can build a smarter [Colorize] functor acting on [(fuse2, fuse3, fusen)]. It can support an arbitrary numer of color lines. But we have to test whether it is efficient enough. And we have to make sure that this wouldn't break the UFO interface. \end{dubious} *) type constant (* Later: [type orders] to count orders of couplings *) val max_degree : unit -> int val vertices : unit -> ((((flavor * flavor * flavor) * constant Coupling.vertex3 * constant) list) * (((flavor * flavor * flavor * flavor) * constant Coupling.vertex4 * constant) list) * (((flavor list) * constant Coupling.vertexn * constant) list)) val fuse2 : flavor -> flavor -> (flavor * constant Coupling.t) list val fuse3 : flavor -> flavor -> flavor -> (flavor * constant Coupling.t) list val fuse : flavor list -> (flavor * constant Coupling.t) list (* Later: [val orders : constant -> orders] counting orders of couplings *) (* The list of all known flavors. *) val flavors : unit -> flavor list (* The flavors that can appear in incoming or outgoing states, grouped in a way that is useful for user interfaces. *) val external_flavors : unit -> (string * flavor list) list (* The Goldstone bosons corresponding to a gauge field, if any. *) val goldstone : flavor -> (flavor * constant Coupling.expr) option (* The dependent parameters. *) val parameters : unit -> constant Coupling.parameters (* Translate from and to convenient textual representations of flavors. *) val flavor_of_string : string -> flavor val flavor_to_string : flavor -> string (* \TeX{} and \LaTeX{} *) val flavor_to_TeX : flavor -> string (* The following must return unique symbols that are acceptable as symbols in all programming languages under consideration as targets. Strings of alphanumeric characters (starting with a letter) should be safe. Underscores are also usable, but would violate strict Fortran77. *) val flavor_symbol : flavor -> string val gauge_symbol : gauge -> string val mass_symbol : flavor -> string val width_symbol : flavor -> string val constant_symbol : constant -> string (* Model specific options. *) val options : Options.t +(* \textit{Not ready for prime time} or other warnings to + be written to the source files for the amplitudes. *) + + val caveats : unit -> string list + end (* In addition to hardcoded models, we can have models that are initialized at run time. *) (* \thocwmodulesection{Mutable Quantum Field Theories} *) module type Mutable = sig include T val init : unit -> unit (* Export only one big initialization function to discourage partial initializations. Labels make this usable. *) val setup : color:(flavor -> Color.t) -> nc:(unit -> int) -> pdg:(flavor -> int) -> lorentz:(flavor -> Coupling.lorentz) -> propagator:(flavor -> gauge Coupling.propagator) -> width:(flavor -> Coupling.width) -> goldstone:(flavor -> (flavor * constant Coupling.expr) option) -> conjugate:(flavor -> flavor) -> fermion:(flavor -> int) -> vertices: (unit -> ((((flavor * flavor * flavor) * constant Coupling.vertex3 * constant) list) * (((flavor * flavor * flavor * flavor) * constant Coupling.vertex4 * constant) list) * (((flavor list) * constant Coupling.vertexn * constant) list))) -> flavors:((string * flavor list) list) -> parameters:(unit -> constant Coupling.parameters) -> flavor_of_string:(string -> flavor) -> flavor_to_string:(flavor -> string) -> flavor_to_TeX:(flavor -> string) -> flavor_symbol:(flavor -> string) -> gauge_symbol:(gauge -> string) -> mass_symbol:(flavor -> string) -> width_symbol:(flavor -> string) -> constant_symbol:(constant -> string) -> unit end (* \thocwmodulesection{Gauge Field Theories} *) (* The following signatures are used only for model building. The diagrammatics and numerics is supposed to be completely ignorant about the detail of the models and expected to rely on the interface [T] exclusively. \begin{dubious} In the end, we might have functors [(M : T) -> Gauge], but we will need to add the quantum numbers to [T]. \end{dubious} *) module type Gauge = sig include T (* Matter field carry conserved quantum numbers and can be replicated in generations without changing the gauge sector. *) type matter_field (* Gauge bosons proper. *) type gauge_boson (* Higgses, Goldstones and all the rest: *) type other (* We can query the kind of field *) type field = | Matter of matter_field | Gauge of gauge_boson | Other of other val field : flavor -> field (* and we can build new fields of a given kind: *) val matter_field : matter_field -> flavor val gauge_boson : gauge_boson -> flavor val other : other -> flavor end (* \thocwmodulesection{Gauge Field Theories with Broken Gauge Symmetries} *) (* Both are carefully crafted as subtypes of [Gauge] so that they can be used in place of [Gauge] and [T] everywhere: *) module type Broken_Gauge = sig include Gauge type massless type massive type goldstone type kind = | Massless of massless | Massive of massive | Goldstone of goldstone val kind : gauge_boson -> kind val massless : massive -> gauge_boson val massive : massive -> gauge_boson val goldstone : goldstone -> gauge_boson end module type Unitarity_Gauge = sig include Gauge type massless type massive type kind = | Massless of massless | Massive of massive val kind : gauge_boson -> kind val massless : massive -> gauge_boson val massive : massive -> gauge_boson end module type Colorized = sig include T type flavor_sans_color val flavor_sans_color : flavor -> flavor_sans_color val conjugate_sans_color : flavor_sans_color -> flavor_sans_color val amplitude : flavor_sans_color list -> flavor_sans_color list -> (flavor list * flavor list) list val flow : flavor list -> flavor list -> Color.Flow.t end module type Colorized_Gauge = sig include Gauge type flavor_sans_color val flavor_sans_color : flavor -> flavor_sans_color val conjugate_sans_color : flavor_sans_color -> flavor_sans_color val amplitude : flavor_sans_color list -> flavor_sans_color list -> (flavor list * flavor list) list val flow : flavor list -> flavor list -> Color.Flow.t end (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/fusion.mli =================================================================== --- trunk/omega/src/fusion.mli (revision 8415) +++ trunk/omega/src/fusion.mli (revision 8416) @@ -1,378 +1,381 @@ (* fusion.mli -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) module type T = sig val options : Options.t +(* JRR's implementation of Majoranas needs a special case. *) + val vintage : bool + (* Wavefunctions are an abstract data type, containing a momentum~[p] and additional quantum numbers, collected in~[flavor]. *) type wf val conjugate : wf -> wf (* Obviously, [flavor] is not restricted to the physical notion of flavor, but can carry spin, color, etc. *) type flavor val flavor : wf -> flavor type flavor_sans_color val flavor_sans_color : wf -> flavor_sans_color (* Momenta are represented by an abstract datatype (defined in~[Momentum]) that is optimized for performance. They can be accessed either abstractly or as lists of indices of the external momenta. These indices are assigned sequentially by [amplitude] below. *) type p val momentum : wf -> p val momentum_list : wf -> int list (* At tree level, the wave functions are uniquely specified by [flavor] and momentum. If loops are included, we need to distinguish among orders. Also, if we build a result from an incomplete sum of diagrams, we need to add a distinguishing mark. At the moment, we assume that a [string] that can be attached to the symbol suffices. *) val wf_tag : wf -> string option (* Coupling constants *) type constant (* and right hand sides of assignments. The latter are formed from a sign from Fermi statistics, a coupling (constand and Lorentz structure) and wave functions. *) type coupling type rhs type 'a children val sign : rhs -> int val coupling : rhs -> constant Coupling.t val coupling_tag : rhs -> string option type exclusions val no_exclusions : exclusions (* In renormalized perturbation theory, couplings come in different orders of the loop expansion. Be prepared: [val order : rhs -> int] *) (* \begin{dubious} This is here only for the benefit of [Target] and shall become [val children : rhs -> wf children] later \ldots \end{dubious} *) val children : rhs -> wf list (* Fusions come in two types: fusions of wave functions to off-shell wave functions: \begin{equation*} \phi(p+q) = \phi(p)\phi(q) \end{equation*} *) type fusion val lhs : fusion -> wf val rhs : fusion -> rhs list (* and products at the keystones: \begin{equation*} \phi(-p-q)\cdot\phi(p)\phi(q) \end{equation*} *) type braket val bra : braket -> wf val ket : braket -> rhs list (* [amplitude goldstones incoming outgoing] calculates the amplitude for scattering of [incoming] to [outgoing]. If [goldstones] is true, also non-propagating off-shell Goldstone amplitudes are included to allow the checking of Slavnov-Taylor identities. *) type amplitude type amplitude_sans_color type selectors val amplitudes : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude list val amplitude_sans_color : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude_sans_color val dependencies : amplitude -> wf -> (wf, coupling) Tree2.t (* We should be precise regarding the semantics of the following functions, since modules implementating [Target] must not make any mistakes interpreting the return values. Instead of calculating the amplitude \begin{subequations} \begin{equation} \label{eq:physical-amplitude} \Braket{f_3,p_3,f_4,p_4,\ldots|T|f_1,p_1,f_2,p_2} \end{equation} directly, O'Mega calculates the---equivalent, but more symmetrical---crossed amplitude \begin{equation} \Braket{\bar f_1,-p_1,\bar f_2,-p_2,f_3,p_3,f_4,p_4,\ldots|T|0} \end{equation} Internally, all flavors are represented by their charge conjugates \begin{equation} \label{eq:internal-amplitude} A(f_1,-p_1,f_2,-p_2,\bar f_3,p_3,\bar f_4,p_4,\ldots) \end{equation} \end{subequations} The correspondence of vertex and term in the lagrangian \begin{equation} \parbox{26\unitlength}{% \fmfframe(5,3)(5,3){% \begin{fmfgraph*}(15,20) \fmfleft{v} \fmfright{p,A,e} \fmflabel{$\mathrm{e}^-$}{e} \fmflabel{$\mathrm{e}^+$}{p} \fmflabel{$\mathrm{A}$}{A} \fmf{fermion}{p,v,e} \fmf{photon}{A,v} \fmfdot{v} \end{fmfgraph*}}}: \bar\psi\fmslash{A}\psi \end{equation} suggests to denote the \emph{outgoing} particle by the flavor of the \emph{anti}particle and the \emph{outgoing} \emph{anti}particle by the flavor of the particle, since this choice allows to represent the vertex by a triple \begin{equation} \bar\psi\fmslash{A}\psi: (\mathrm{e}^+,A,\mathrm{e}^-) \end{equation} which is more intuitive than the alternative $(\mathrm{e}^-,A,\mathrm{e}^+)$. Also, when thinking in terms of building wavefunctions from the outside in, the outgoing \emph{antiparticle} is represented by a \emph{particle} propagator and vice versa\footnote{Even if this choice will appear slightly counter-intuitive on the [Target] side, one must keep in mind that much more people are expected to prepare [Model]s.}. [incoming] and [outgoing] are the physical flavors as in~(\ref{eq:physical-amplitude}) *) val incoming : amplitude -> flavor list val outgoing : amplitude -> flavor list (* [externals] are flavors and momenta as in~(\ref{eq:internal-amplitude}) *) val externals : amplitude -> wf list val variables : amplitude -> wf list val fusions : amplitude -> fusion list val brakets : amplitude -> braket list val on_shell : amplitude -> (wf -> bool) val is_gauss : amplitude -> (wf -> bool) val constraints : amplitude -> string option val symmetry : amplitude -> int val allowed : amplitude -> bool (* \thocwmodulesubsection{Performance Hacks} *) val initialize_cache : string -> unit val set_cache_name : string -> unit (* \thocwmodulesubsection{Diagnostics} *) val check_charges : unit -> flavor_sans_color list list val count_fusions : amplitude -> int val count_propagators : amplitude -> int val count_diagrams : amplitude -> int val forest : wf -> amplitude -> ((wf * coupling option, wf) Tree.t) list val poles : amplitude -> wf list list val s_channel : amplitude -> wf list val tower_to_dot : out_channel -> amplitude -> unit val amplitude_to_dot : out_channel -> amplitude -> unit (* \thocwmodulesubsection{WHIZARD} *) val phase_space_channels : out_channel -> amplitude_sans_color -> unit val phase_space_channels_flipped : out_channel -> amplitude_sans_color -> unit end (* There is more than one way to make fusions. *) module type Maker = functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant and type selectors = Cascade.Make(M)(P).selectors (*i If we want or need to expose [Make], here's how to do it: module type Stat = sig type flavor type stat exception Impossible val stat : flavor -> int -> stat val stat_fuse : stat -> stat -> flavor -> stat val stat_sign : stat -> int end module type Stat_Maker = functor (M : Model.T) -> Stat with type flavor = M.flavor module Make : functor (PT : Tuple.Poly) (Stat : Stat_Maker) (T : Topology.T with type 'a children = 'a PT.t) -> Maker i*) (* Straightforward Dirac fermions vs. slightly more complicated Majorana fermions: *) exception Majorana module Binary : Maker -(* [module Binary_Majorana : Maker] *) +module Binary_Majorana : Maker module Mixed23 : Maker -(* [module Mixed23_Majorana : Maker] *) +module Mixed23_Majorana : Maker module Nary : functor (B : Tuple.Bound) -> Maker module Nary_Majorana : functor (B : Tuple.Bound) -> Maker (* We can also proceed \'a la~\cite{HELAC:2000}. Empirically, this will use slightly~($O(10\%)$) fewer fusions than the symmetric factorization. Our implementation uses significantly~($O(50\%)$) fewer fusions than reported by~\cite{HELAC:2000}. Our pruning of the DAG might be responsible for this. *) module Helac : functor (B : Tuple.Bound) -> Maker (* [module Helac_Majorana : functor (B : Tuple.Bound) -> Maker] *) (* \thocwmodulesection{Multiple Amplitudes} *) module type Multi = sig exception Mismatch val options : Options.t type flavor type process = flavor list * flavor list type amplitude type fusion type wf type exclusions val no_exclusions : exclusions type selectors type amplitudes (* Construct all possible color flow amplitudes for a given process. *) val amplitudes : bool -> int option -> exclusions -> selectors -> process list -> amplitudes val empty : amplitudes (* Precompute the vertex table cache. *) val initialize_cache : string -> unit val set_cache_name : string -> unit (* The list of all combinations of incoming and outgoing particles with a nonvanishing scattering amplitude. *) val flavors : amplitudes -> process list (* The list of all combinations of incoming and outgoing particles that don't lead to any color flow with non vanishing scattering amplitude. *) val vanishing_flavors : amplitudes -> process list (* The list of all color flows with a nonvanishing scattering amplitude. *) val color_flows : amplitudes -> Color.Flow.t list (* The list of all valid helicity combinations. *) val helicities : amplitudes -> (int list * int list) list (* The list of all amplitudes. *) val processes : amplitudes -> amplitude list (* [(process_table a).(f).(c)] returns the amplitude for the [f]th allowed flavor combination and the [c]th allowed color flow as an [amplitude option]. *) val process_table : amplitudes -> amplitude option array array (* The list of all non redundant fusions together with the amplitudes they came from. *) val fusions : amplitudes -> (fusion * amplitude) list (* If there's more than external flavor state, the wavefunctions are \emph{not} uniquely specified by [flavor] and [Momentum.t]. This function can be used to determine how many variables must be allocated. *) val multiplicity : amplitudes -> wf -> int (* This function can be used to disambiguate wavefunctions with the same combination of [flavor] and [Momentum.t]. *) val dictionary : amplitudes -> amplitude -> wf -> int (* [(color_factors a).(c1).(c2)] power of~$N_C$ for the given product of color flows. *) val color_factors : amplitudes -> Color.Flow.factor array array (* A description of optional diagram selectors. *) val constraints : amplitudes -> string option end module type Multi_Maker = functor (Fusion_Maker : Maker) -> functor (P : Momentum.T) -> functor (M : Model.T) -> Multi with type flavor = M.flavor and type amplitude = Fusion_Maker(P)(M).amplitude and type fusion = Fusion_Maker(P)(M).fusion and type wf = Fusion_Maker(P)(M).wf and type selectors = Fusion_Maker(P)(M).selectors module Multi : Multi_Maker (* \thocwmodulesection{Tags} *) (* It appears that there are useful applications for tagging couplings and wave functions, e.\,g.~skeleton expansion and diagram selections. We can abstract this in a [Tags] signature: *) module type Tags = sig type wf type coupling type 'a children val null_wf : wf val null_coupling : coupling val fuse : coupling -> wf children -> wf val wf_to_string : wf -> string option val coupling_to_string : coupling -> string option end module type Tagger = functor (PT : Tuple.Poly) -> Tags with type 'a children = 'a PT.t module type Tagged_Maker = functor (Tagger : Tagger) -> functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant module Tagged_Binary : Tagged_Maker (*i * Local Variables: * mode:caml * indent-tabs-mode:nil * page-delimiter:"^(\\* .*\n" * End: i*) Index: trunk/omega/src/fusion_vintage.ml =================================================================== --- trunk/omega/src/fusion_vintage.ml (revision 8415) +++ trunk/omega/src/fusion_vintage.ml (revision 8416) @@ -1,2885 +1,2888 @@ (* fusion_vintage.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Marco Sekulla WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* Avoid refering to [Pervasives.compare], because [Pervasives] will become [Stdlib.Pervasives] in O'Caml 4.07 and [Stdlib] in O'Caml 4.08. *) let pcompare = compare module type T = sig val options : Options.t + val vintage : bool type wf val conjugate : wf -> wf type flavor type flavor_sans_color val flavor : wf -> flavor val flavor_sans_color : wf -> flavor_sans_color type p val momentum : wf -> p val momentum_list : wf -> int list val wf_tag : wf -> string option type constant type coupling type rhs type 'a children val sign : rhs -> int val coupling : rhs -> constant Coupling.t val coupling_tag : rhs -> string option type exclusions val no_exclusions : exclusions val children : rhs -> wf list type fusion val lhs : fusion -> wf val rhs : fusion -> rhs list type braket val bra : braket -> wf val ket : braket -> rhs list type amplitude type amplitude_sans_color type selectors val amplitudes : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude list val amplitude_sans_color : bool -> exclusions -> selectors -> flavor_sans_color list -> flavor_sans_color list -> amplitude_sans_color val dependencies : amplitude -> wf -> (wf, coupling) Tree2.t val incoming : amplitude -> flavor list val outgoing : amplitude -> flavor list val externals : amplitude -> wf list val variables : amplitude -> wf list val fusions : amplitude -> fusion list val brakets : amplitude -> braket list val on_shell : amplitude -> (wf -> bool) val is_gauss : amplitude -> (wf -> bool) val constraints : amplitude -> string option val symmetry : amplitude -> int val allowed : amplitude -> bool val initialize_cache : string -> unit val set_cache_name : string -> unit val check_charges : unit -> flavor_sans_color list list val count_fusions : amplitude -> int val count_propagators : amplitude -> int val count_diagrams : amplitude -> int val forest : wf -> amplitude -> ((wf * coupling option, wf) Tree.t) list val poles : amplitude -> wf list list val s_channel : amplitude -> wf list val tower_to_dot : out_channel -> amplitude -> unit val amplitude_to_dot : out_channel -> amplitude -> unit val phase_space_channels : out_channel -> amplitude_sans_color -> unit val phase_space_channels_flipped : out_channel -> amplitude_sans_color -> unit end module type Maker = functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant and type selectors = Cascade.Make(M)(P).selectors (* \thocwmodulesection{Fermi Statistics} *) module type Stat = sig type flavor type stat exception Impossible val stat : flavor -> int -> stat val stat_fuse : stat -> stat -> flavor -> stat val stat_sign : stat -> int val stat_to_string : stat -> string end module type Stat_Maker = functor (M : Model.T) -> Stat with type flavor = M.flavor (* \thocwmodulesection{Dirac Fermions} *) module Stat_Dirac (M : Model.T) : (Stat with type flavor = M.flavor) = struct type flavor = M.flavor (* \begin{equation} \gamma_\mu\psi(1)\,G^{\mu\nu}\,\bar\psi(2)\gamma_\nu\psi(3) - \gamma_\mu\psi(3)\,G^{\mu\nu}\,\bar\psi(2)\gamma_\nu\psi(1) \end{equation} *) type stat = | Fermion of int * (int option * int option) list | AntiFermion of int * (int option * int option) list | Boson of (int option * int option) list let stat f p = let s = M.fermion f in if s = 0 then Boson [] else if s < 0 then AntiFermion (p, []) else (* [if s > 0 then] *) Fermion (p, []) let lines_to_string lines = ThoList.to_string (function | Some i, Some j -> Printf.sprintf "%d>%d" i j | Some i, None -> Printf.sprintf "%d>*" i | None, Some j -> Printf.sprintf "*>%d" j | None, None -> "*>*") lines let stat_to_string = function | Boson lines -> Printf.sprintf "Boson %s" (lines_to_string lines) | Fermion (p, lines) -> Printf.sprintf "Fermion (%d, %s)" p (lines_to_string lines) | AntiFermion (p, lines) -> Printf.sprintf "AntiFermion (%d, %s)" p (lines_to_string lines) exception Impossible let stat_fuse s1 s2 f = match s1, s2 with | Boson l1, Boson l2 -> Boson (l1 @ l2) | Boson l1, Fermion (p, l2) -> Fermion (p, l1 @ l2) | Boson l1, AntiFermion (p, l2) -> AntiFermion (p, l1 @ l2) | Fermion (p, l1), Boson l2 -> Fermion (p, l1 @ l2) | AntiFermion (p, l1), Boson l2 -> AntiFermion (p, l1 @ l2) | AntiFermion (pbar, l1), Fermion (p, l2) -> Boson ((Some pbar, Some p) :: l1 @ l2) | Fermion (p, l1), AntiFermion (pbar, l2) -> Boson ((Some pbar, Some p) :: l1 @ l2) | Fermion _, Fermion _ | AntiFermion _, AntiFermion _ -> raise Impossible (* \begin{figure} \begin{displaymath} \parbox{26\unitlength}{% \begin{fmfgraph*}(25,15) \fmfstraight \fmfleft{f} \fmfright{f1,f2,f3} \fmflabel{$\psi(1)$}{f1} \fmflabel{$\bar\psi(2)$}{f2} \fmflabel{$\psi(3)$}{f3} \fmflabel{$0$}{f} \fmf{fermion}{f1,v1,f} \fmffreeze \fmf{fermion,tension=0.5}{f3,v2,f2} \fmf{photon}{v1,v2} \fmfdot{v1,v2} \end{fmfgraph*}} \qquad\qquad-\qquad \parbox{26\unitlength}{% \begin{fmfgraph*}(25,15) \fmfstraight \fmfleft{f} \fmfright{f1,f2,f3} \fmflabel{$\psi(1)$}{f1} \fmflabel{$\bar\psi(2)$}{f2} \fmflabel{$\psi(3)$}{f3} \fmflabel{$0$}{f} \fmf{fermion}{f3,v1,f} \fmffreeze \fmf{fermion,tension=0.5}{f1,v2,f2} \fmf{photon}{v1,v2} \fmfdot{v1,v2} \end{fmfgraph*}} \end{displaymath} \caption{\label{fig:stat_fuse} Relative sign from Fermi statistics.} \end{figure} *) (* \begin{equation} \epsilon \left(\left\{ (0,1), (2,3) \right\}\right) = - \epsilon \left(\left\{ (0,3), (2,1) \right\}\right) \end{equation} *) let permutation lines = let fout, fin = List.split lines in let eps_in, _ = Combinatorics.sort_signed fin and eps_out, _ = Combinatorics.sort_signed fout in (eps_in * eps_out) (* \begin{dubious} This comparing of permutations of fermion lines is a bit tedious and takes a macroscopic fraction of time. However, it's less than 20\,\%, so we don't focus on improving on it yet. \end{dubious} *) let stat_sign = function | Boson lines -> permutation lines | Fermion (p, lines) -> permutation ((None, Some p) :: lines) | AntiFermion (pbar, lines) -> permutation ((Some pbar, None) :: lines) end (* \thocwmodulesection{Tags} *) module type Tags = sig type wf type coupling type 'a children val null_wf : wf val null_coupling : coupling val fuse : coupling -> wf children -> wf val wf_to_string : wf -> string option val coupling_to_string : coupling -> string option end module type Tagger = functor (PT : Tuple.Poly) -> Tags with type 'a children = 'a PT.t module type Tagged_Maker = functor (Tagger : Tagger) -> functor (P : Momentum.T) -> functor (M : Model.T) -> T with type p = P.t and type flavor = Colorize.It(M).flavor and type flavor_sans_color = M.flavor and type constant = M.constant (* No tags is one option for good tags \ldots *) module No_Tags (PT : Tuple.Poly) = struct type wf = unit type coupling = unit type 'a children = 'a PT.t let null_wf = () let null_coupling = () let fuse () _ = () let wf_to_string () = None let coupling_to_string () = None end (* \begin{dubious} Here's a simple additive tag that can grow into something useful for loop calculations. \end{dubious} *) module Loop_Tags (PT : Tuple.Poly) = struct type wf = int type coupling = int type 'a children = 'a PT.t let null_wf = 0 let null_coupling = 0 let fuse c wfs = PT.fold_left (+) c wfs let wf_to_string n = Some (string_of_int n) let coupling_to_string n = Some (string_of_int n) end module Order_Tags (PT : Tuple.Poly) = struct type wf = int type coupling = int type 'a children = 'a PT.t let null_wf = 0 let null_coupling = 0 let fuse c wfs = PT.fold_left (+) c wfs let wf_to_string n = Some (string_of_int n) let coupling_to_string n = Some (string_of_int n) end (* \thocwmodulesection{[Tagged], the [Fusion.Make] Functor} *) module Tagged (Tagger : Tagger) (PT : Tuple.Poly) (Stat : Stat_Maker) (T : Topology.T with type 'a children = 'a PT.t) (P : Momentum.T) (M : Model.T) = struct + let vintage = true + type cache_mode = Cache_Use | Cache_Ignore | Cache_Overwrite let cache_option = ref Cache_Ignore type qcd_order = | QCD_order of int type ew_order = | EW_order of int let qcd_order = ref (QCD_order 99) let ew_order = ref (EW_order 99) let options = Options.create [ "ignore-cache", Arg.Unit (fun () -> cache_option := Cache_Ignore), " ignore cached model tables (default)"; "use-cache", Arg.Unit (fun () -> cache_option := Cache_Use), " use cached model tables"; "overwrite-cache", Arg.Unit (fun () -> cache_option := Cache_Overwrite), " overwrite cached model tables"; "qcd", Arg.Int (fun n -> qcd_order := QCD_order n), " set QCD order n [>= 0, default = 99] (ignored)"; "ew", Arg.Int (fun n -> ew_order := EW_order n), " set QCD order n [>=0, default = 99] (ignored)"] exception Negative_QCD_order exception Negative_EW_order exception Vanishing_couplings exception Negative_QCD_EW_orders let int_orders = match !qcd_order, !ew_order with | QCD_order n, EW_order n' when n < 0 && n' >= 0 -> raise Negative_QCD_order | QCD_order n, EW_order n' when n >= 0 && n' < 0 -> raise Negative_EW_order | QCD_order n, EW_order n' when n < 0 && n' < 0 -> raise Negative_QCD_EW_orders | QCD_order n, EW_order n' -> (n, n') open Coupling module S = Stat(M) type stat = S.stat let stat = S.stat let stat_sign = S.stat_sign (* \begin{dubious} This will do \emph{something} for 4-, 6-, \ldots fermion vertices, but not necessarily the right thing \ldots \end{dubious} *) let stat_fuse s f = PT.fold_right_internal (fun s' acc -> S.stat_fuse s' acc f) s type constant = M.constant (* \thocwmodulesubsection{Wave Functions} *) (* \begin{dubious} The code below is not yet functional. Too often, we assign to [Tags.null_wf] instead of calling [Tags.fuse]. \end{dubious} *) (* We will need two types of amplitudes: with color and without color. Since we can build them using the same types with only [flavor] replaced, it pays to use a functor to set up the scaffolding. *) module Tags = Tagger(PT) (* In the future, we might want to have [Coupling] among the functor arguments. However, for the moment, [Coupling] is assumed to be comprehensive. *) module type Tagged_Coupling = sig type sign = int type t = { sign : sign; coupling : constant Coupling.t; coupling_tag : Tags.coupling } val sign : t -> sign val coupling : t -> constant Coupling.t val coupling_tag : t -> string option end module Tagged_Coupling : Tagged_Coupling = struct type sign = int type t = { sign : sign; coupling : constant Coupling.t; coupling_tag : Tags.coupling } let sign c = c.sign let coupling c = c.coupling let coupling_tag_raw c = c.coupling_tag let coupling_tag rhs = Tags.coupling_to_string (coupling_tag_raw rhs) end (* \thocwmodulesubsection{Amplitudes: Monochrome and Colored} *) module type Amplitude = sig module Tags : Tags type flavor type p type wf = { flavor : flavor; momentum : p; wf_tag : Tags.wf } val flavor : wf -> flavor val conjugate : wf -> wf val momentum : wf -> p val momentum_list : wf -> int list val wf_tag : wf -> string option val wf_tag_raw : wf -> Tags.wf val order_wf : wf -> wf -> int val external_wfs : int -> (flavor * int) list -> wf list type 'a children type coupling = Tagged_Coupling.t type rhs = coupling * wf children val sign : rhs -> int val coupling : rhs -> constant Coupling.t val coupling_tag : rhs -> string option type exclusions val no_exclusions : exclusions val children : rhs -> wf list type fusion = wf * rhs list val lhs : fusion -> wf val rhs : fusion -> rhs list type braket = wf * rhs list val bra : braket -> wf val ket : braket -> rhs list module D : DAG.T with type node = wf and type edge = coupling and type children = wf children val wavefunctions : braket list -> wf list type amplitude = { fusions : fusion list; brakets : braket list; on_shell : (wf -> bool); is_gauss : (wf -> bool); constraints : string option; incoming : flavor list; outgoing : flavor list; externals : wf list; symmetry : int; dependencies : (wf -> (wf, coupling) Tree2.t); fusion_tower : D.t; fusion_dag : D.t } val incoming : amplitude -> flavor list val outgoing : amplitude -> flavor list val externals : amplitude -> wf list val variables : amplitude -> wf list val fusions : amplitude -> fusion list val brakets : amplitude -> braket list val on_shell : amplitude -> (wf -> bool) val is_gauss : amplitude -> (wf -> bool) val constraints : amplitude -> string option val symmetry : amplitude -> int val dependencies : amplitude -> wf -> (wf, coupling) Tree2.t val fusion_dag : amplitude -> D.t end module Amplitude (PT : Tuple.Poly) (P : Momentum.T) (M : Model.T) : Amplitude with type p = P.t and type flavor = M.flavor and type 'a children = 'a PT.t and module Tags = Tags = struct type flavor = M.flavor type p = P.t module Tags = Tags type wf = { flavor : flavor; momentum : p; wf_tag : Tags.wf } let flavor wf = wf.flavor let conjugate wf = { wf with flavor = M.conjugate wf.flavor } let momentum wf = wf.momentum let momentum_list wf = P.to_ints wf.momentum let wf_tag wf = Tags.wf_to_string wf.wf_tag let wf_tag_raw wf = wf.wf_tag let external_wfs rank particles = List.map (fun (f, p) -> { flavor = f; momentum = P.singleton rank p; wf_tag = Tags.null_wf }) particles (* Order wavefunctions so that the external come first, then the pairs, etc. Also put possible Goldstone bosons \emph{before} their gauge bosons. *) let lorentz_ordering f = match M.lorentz f with | Coupling.Scalar -> 0 | Coupling.Spinor -> 1 | Coupling.ConjSpinor -> 2 | Coupling.Majorana -> 3 | Coupling.Vector -> 4 | Coupling.Massive_Vector -> 5 | Coupling.Tensor_2 -> 6 | Coupling.Tensor_1 -> 7 | Coupling.Vectorspinor -> 8 | Coupling.BRS Coupling.Scalar -> 9 | Coupling.BRS Coupling.Spinor -> 10 | Coupling.BRS Coupling.ConjSpinor -> 11 | Coupling.BRS Coupling.Majorana -> 12 | Coupling.BRS Coupling.Vector -> 13 | Coupling.BRS Coupling.Massive_Vector -> 14 | Coupling.BRS Coupling.Tensor_2 -> 15 | Coupling.BRS Coupling.Tensor_1 -> 16 | Coupling.BRS Coupling.Vectorspinor -> 17 | Coupling.BRS _ -> invalid_arg "Fusion.lorentz_ordering: not needed" | Coupling.Maj_Ghost -> 18 (*i | Coupling.Ward_Vector -> 19 i*) let order_flavor f1 f2 = let c = compare (lorentz_ordering f1) (lorentz_ordering f2) in if c <> 0 then c else compare f1 f2 (* Note that [Momentum().compare] guarantees that wavefunctions will be ordered according to \emph{increasing} [Momentum().rank] of their momenta. *) let order_wf wf1 wf2 = let c = P.compare wf1.momentum wf2.momentum in if c <> 0 then c else let c = order_flavor wf1.flavor wf2.flavor in if c <> 0 then c else compare wf1.wf_tag wf2.wf_tag (* This \emph{must} be a pair matching the [edge * node children] pairs of [DAG.Forest]! *) type coupling = Tagged_Coupling.t type 'a children = 'a PT.t type rhs = coupling * wf children let sign (c, _) = Tagged_Coupling.sign c let coupling (c, _) = Tagged_Coupling.coupling c let coupling_tag (c, _) = Tagged_Coupling.coupling_tag c type exclusions = { x_flavors : flavor list; x_couplings : coupling list } let no_exclusions = { x_flavors = []; x_couplings = [] } let children (_, wfs) = PT.to_list wfs type fusion = wf * rhs list let lhs (l, _) = l let rhs (_, r) = r type braket = wf * rhs list let bra (b, _) = b let ket (_, k) = k module D = DAG.Make (DAG.Forest(PT) (struct type t = wf let compare = order_wf end) (struct type t = coupling let compare = compare end)) module WFSet = Set.Make (struct type t = wf let compare = order_wf end) let wavefunctions brakets = WFSet.elements (List.fold_left (fun set (wf1, wf23) -> WFSet.add wf1 (List.fold_left (fun set' (_, wfs) -> PT.fold_right WFSet.add wfs set') set wf23)) WFSet.empty brakets) type amplitude = { fusions : fusion list; brakets : braket list; on_shell : (wf -> bool); is_gauss : (wf -> bool); constraints : string option; incoming : flavor list; outgoing : flavor list; externals : wf list; symmetry : int; dependencies : (wf -> (wf, coupling) Tree2.t); fusion_tower : D.t; fusion_dag : D.t } let incoming a = a.incoming let outgoing a = a.outgoing let externals a = a.externals let fusions a = a.fusions let brakets a = a.brakets let symmetry a = a.symmetry let on_shell a = a.on_shell let is_gauss a = a.is_gauss let constraints a = a.constraints let variables a = List.map lhs a.fusions let dependencies a = a.dependencies let fusion_dag a = a.fusion_dag end module A = Amplitude(PT)(P)(M) (* Operator insertions can be fused only if they are external. *) let is_source wf = match M.propagator wf.A.flavor with | Only_Insertion -> P.rank wf.A.momentum = 1 | _ -> true (* [is_goldstone_of g v] is [true] if and only if [g] is the Goldstone boson corresponding to the gauge particle [v]. *) let is_goldstone_of g v = match M.goldstone v with | None -> false | Some (g', _) -> g = g' (* \begin{dubious} In the end, [PT.to_list] should become redudant! \end{dubious} *) let fuse_rhs rhs = M.fuse (PT.to_list rhs) (* \thocwmodulesubsection{Vertices} *) (* Compute the set of all vertices in the model from the allowed fusions and the set of all flavors: \begin{dubious} One could think of using [M.vertices] instead of [M.fuse2], [M.fuse3] and [M.fuse] \ldots \end{dubious} *) module VSet = Map.Make(struct type t = A.flavor let compare = compare end) let add_vertices f rhs m = VSet.add f (try rhs :: VSet.find f m with Not_found -> [rhs]) m let collect_vertices rhs = List.fold_right (fun (f1, c) -> add_vertices (M.conjugate f1) (c, rhs)) (fuse_rhs rhs) (* The set of all vertices with common left fields factored. *) (* I used to think that constant initializers are a good idea to allow compile time optimizations. The down side turned out to be that the constant initializers will be evaluated \emph{every time} the functor is applied. \emph{Relying on the fact that the functor will be called only once is not a good idea!} *) type vertices = (A.flavor * (constant Coupling.t * A.flavor PT.t) list) list let vertices_nocache max_degree flavors : vertices = VSet.fold (fun f rhs v -> (f, rhs) :: v) (PT.power_fold collect_vertices flavors VSet.empty) [] (* Performance hack: *) type vertex_table = ((A.flavor * A.flavor * A.flavor) * constant Coupling.vertex3 * constant) list * ((A.flavor * A.flavor * A.flavor * A.flavor) * constant Coupling.vertex4 * constant) list * (A.flavor list * constant Coupling.vertexn * constant) list module VCache = Cache.Make (struct type t = vertex_table end) (struct type t = vertices end) let vertices_cache = ref None let hash () = VCache.hash (M.vertices ()) (* \begin{dubious} Can we do better than the executable name provided by [Config.cache_prefix]??? We need a better way to avoid collisions among the caches for different models in the same program. \end{dubious} *) let cache_name = ref (Config.cache_prefix ^ "." ^ Config.cache_suffix) let set_cache_name name = cache_name := name let initialize_cache dir = Printf.eprintf " >>> Initializing vertex table %s. This may take some time ... " !cache_name; flush stderr; VCache.write_dir (hash ()) dir !cache_name (vertices_nocache (M.max_degree ()) (M.flavors())); Printf.eprintf "done. <<< \n" let vertices max_degree flavors : vertices = match !vertices_cache with | None -> begin match !cache_option with | Cache_Use -> begin match VCache.maybe_read (hash ()) !cache_name with | VCache.Hit result -> result | VCache.Miss -> Printf.eprintf " >>> Initializing vertex table %s. This may take some time ... " !cache_name; flush stderr; let result = vertices_nocache max_degree flavors in VCache.write (hash ()) !cache_name (result); vertices_cache := Some result; Printf.eprintf "done. <<< \n"; flush stderr; result | VCache.Stale file -> Printf.eprintf " >>> Re-initializing stale vertex table %s in file %s. " !cache_name file; Printf.eprintf "This may take some time ... "; flush stderr; let result = vertices_nocache max_degree flavors in VCache.write (hash ()) !cache_name (result); vertices_cache := Some result; Printf.eprintf "done. <<< \n"; flush stderr; result end | Cache_Overwrite -> Printf.eprintf " >>> Overwriting vertex table %s. This may take some time ... " !cache_name; flush stderr; let result = vertices_nocache max_degree flavors in VCache.write (hash ()) !cache_name (result); vertices_cache := Some result; Printf.eprintf "done. <<< \n"; flush stderr; result | Cache_Ignore -> let result = vertices_nocache max_degree flavors in vertices_cache := Some result; result end | Some result -> result (* Note that we must perform any filtering of the vertices \emph{after} caching, because the restrictions \emph{must not} influence the cache (unless we tag the cache with model and restrictions). *) (*i let unpack_constant = function | Coupling.V3 (_, _, cs) -> cs | Coupling.V4 (_, _, cs) -> cs | Coupling.Vn (_, _, cs) -> cs let coupling_and_flavors_to_string (c, fs) = M.constant_symbol (unpack_constant c) ^ "[" ^ String.concat ", " (List.map M.flavor_to_string (PT.to_list fs)) ^ "]" let fusions_to_string (f, cfs) = M.flavor_to_string f ^ " <- { " ^ String.concat " | " (List.map coupling_and_flavors_to_string cfs) ^ " }" let vertices_to_string vertices = String.concat "; " (List.map fusions_to_string vertices) i*) let filter_vertices select_vtx vertices = List.fold_left (fun acc (f, cfs) -> let f' = M.conjugate f in let cfs = List.filter (fun (c, fs) -> select_vtx c f' (PT.to_list fs)) cfs in match cfs with | [] -> acc | cfs -> (f, cfs) :: acc) [] vertices (* \thocwmodulesubsection{Partitions} *) (* Vertices that are not crossing invariant need special treatment so that they're only generated for the correct combinations of momenta. NB: the [crossing] checks here are a bit redundant, because [CM.fuse] below will bring the killed vertices back to life and will have to filter once more. Nevertheless, we keep them here, for the unlikely case that anybody ever wants to use uncolored amplitudes directly. NB: the analogous problem does not occur for [select_wf], because this applies to momenta instead of vertices. *) (* \begin{dubious} This approach worked before the colorize, but has become \emph{futile}, because [CM.fuse] will bring the killed vertices back to life. We need to implement the same checks there again!!! \end{dubious} *) (* \begin{dubious} Using [PT.Mismatched_arity] is not really good style \ldots Tho's approach doesn't work since he does not catch charge conjugated processes or crossed processes. Another very strange thing is that O'Mega seems always to run in the q2 q3 timelike case, but not in the other two. (Property of how the DAG is built?). For the $ZZZZ$ vertex I add the same vertex again, but interchange 1 and 3 in the [crossing] vertex \end{dubious} *) let kmatrix_cuts c momenta = match c with | V4 (Vector4_K_Matrix_tho (disc, _), fusion, _) | V4 (Vector4_K_Matrix_jr (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t0 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t1 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t2 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_t_rsi (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_m0 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_m1 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (Vector4_K_Matrix_cf_m7 (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F431|F342|F432) | 1, false, true, false, (F134|F143|F234|F243) | 1, false, false, true, (F314|F413|F324|F423) -> true | 2, true, false, false, (F123|F213|F124|F214) | 2, false, true, false, (F312|F321|F412|F421) | 2, false, false, true, (F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | _ -> false end | V4 (DScalar2_Vector2_K_Matrix_ms (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar2_Vector2_m_0_K_Matrix_cf (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar2_Vector2_m_1_K_Matrix_cf (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar2_Vector2_m_7_K_Matrix_cf (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 1, true, false, false, (F341|F432|F123|F214) | 1, false, true, false, (F134|F243|F312|F421) | 1, false, false, true, (F314|F423|F132|F241) -> true | 2, true, false, false, (F431|F342|F213|F124) | 2, false, true, false, (F143|F234|F321|F412) | 2, false, false, true, (F413|F324|F231|F142) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | V4 (DScalar4_K_Matrix_ms (disc, _), fusion, _) -> let s12, s23, s13 = begin match PT.to_list momenta with | [q1; q2; q3] -> (P.Scattering.timelike (P.add q1 q2), P.Scattering.timelike (P.add q2 q3), P.Scattering.timelike (P.add q1 q3)) | _ -> raise PT.Mismatched_arity end in begin match disc, s12, s23, s13, fusion with | 0, true, false, false, (F341|F431|F342|F432|F123|F213|F124|F214) | 0, false, true, false, (F134|F143|F234|F243|F312|F321|F412|F421) | 0, false, false, true, (F314|F413|F324|F423|F132|F231|F142|F241) -> true | 3, true, false, false, (F143|F413|F142|F412|F321|F231|F324|F234) | 3, false, true, false, (F314|F341|F214|F241|F132|F123|F432|F423) | 3, false, false, true, (F134|F431|F124|F421|F312|F213|F342|F243) -> true | 4, true, false, false, (F142|F413|F231|F324) | 4, false, true, false, (F214|F341|F123|F432) | 4, false, false, true, (F124|F431|F213|F342) -> true | 5, true, false, false, (F143|F412|F321|F234) | 5, false, true, false, (F314|F241|F132|F423) | 5, false, false, true, (F134|F421|F312|F243) -> true | 6, true, false, false, (F134|F132|F314|F312|F241|F243|F421|F423) | 6, false, true, false, (F213|F413|F231|F431|F124|F324|F142|F342) | 6, false, false, true, (F143|F123|F341|F321|F412|F214|F432|F234) -> true | 7, true, false, false, (F134|F312|F421|F243) | 7, false, true, false, (F413|F231|F142|F324) | 7, false, false, true, (F143|F321|F412|F432) -> true | 8, true, false, false, (F132|F314|F241|F423) | 8, false, true, false, (F213|F431|F124|F342) | 8, false, false, true, (F123|F341|F214|F234) -> true | _ -> false end | _ -> true (* Counting QCD and EW orders. *) let qcd_ew_check orders = if fst (orders) <= fst (int_orders) && snd (orders) <= snd (int_orders) then true else false (* Match a set of flavors to a set of momenta. Form the direct product for the lists of momenta two and three with the list of couplings and flavors two and three. *) let flavor_keystone select_p dim (f1, f23) (p1, p23) = ({ A.flavor = f1; A.momentum = P.of_ints dim p1; A.wf_tag = A.Tags.null_wf }, Product.fold2 (fun (c, f) p acc -> try let p' = PT.map (P.of_ints dim) p in if select_p (P.of_ints dim p1) (PT.to_list p') && kmatrix_cuts c p' then (c, PT.map2 (fun f'' p'' -> { A.flavor = f''; A.momentum = p''; A.wf_tag = A.Tags.null_wf }) f p') :: acc else acc with | PT.Mismatched_arity -> acc) f23 p23 []) (*i let cnt = ref 0 let gc_stat () = let minor, promoted, major = Gc.counters () in Printf.sprintf "(%12.0f, %12.0f, %12.0f)" minor promoted major let flavor_keystone select_p n (f1, f23) (p1, p23) = incr cnt; Gc.set { (Gc.get()) with Gc.space_overhead = 20 }; Printf.eprintf "%6d@%8.1f: %s\n" !cnt (Sys.time ()) (gc_stat ()); flush stderr; flavor_keystone select_p n (f1, f23) (p1, p23) i*) (* Produce all possible combinations of vertices (flavor keystones) and momenta by forming the direct product. The semantically equivalent [Product.list2 (flavor_keystone select_wf n) vertices keystones] with \emph{subsequent} filtering would be a \emph{very bad} idea, because a potentially huge intermediate list is built for large models. E.\,g.~for the MSSM this would lead to non-termination by thrashing for $2\to4$ processes on most PCs. *) let flavor_keystones filter select_p dim vertices keystones = Product.fold2 (fun v k acc -> filter (flavor_keystone select_p dim v k) acc) vertices keystones [] (* Flatten the nested lists of vertices into a list of attached lines. *) let flatten_keystones t = ThoList.flatmap (fun (p1, p23) -> p1 :: (ThoList.flatmap (fun (_, rhs) -> PT.to_list rhs) p23)) t (* \thocwmodulesubsection{Subtrees} *) (* Fuse a tuple of wavefunctions, keeping track of Fermi statistics. Record only the the sign \emph{relative} to the children. (The type annotation is only for documentation.) *) let fuse select_wf select_vtx wfss : (A.wf * stat * A.rhs) list = if PT.for_all (fun (wf, _) -> is_source wf) wfss then try let wfs, ss = PT.split wfss in let flavors = PT.map A.flavor wfs and momenta = PT.map A.momentum wfs (*i and wf_tags = PT.map A.wf_tag_raw wfs i*) in let p = PT.fold_left_internal P.add momenta in (*i let wft = PT.fold_left Tags.fuse wf_tags in i*) List.fold_left (fun acc (f, c) -> if select_wf f p (PT.to_list momenta) && select_vtx c f (PT.to_list flavors) && kmatrix_cuts c momenta then let s = stat_fuse ss f in let flip = PT.fold_left (fun acc s' -> acc * stat_sign s') (stat_sign s) ss in ({ A.flavor = f; A.momentum = p; A.wf_tag = A.Tags.null_wf }, s, ({ Tagged_Coupling.sign = flip; Tagged_Coupling.coupling = c; Tagged_Coupling.coupling_tag = A.Tags.null_coupling }, wfs)) :: acc else acc) [] (fuse_rhs flavors) with | P.Duplicate _ | S.Impossible -> [] else [] (* \begin{dubious} Eventually, the pairs of [tower] and [dag] in [fusion_tower'] below could and should be replaced by a graded [DAG]. This will look like, but currently [tower] containts statistics information that is missing from [dag]: \begin{quote} \verb+Type node = flavor * p is not compatible with type wf * stat+ \end{quote} This should be easy to fix. However, replacing [type t = wf] with [type t = wf * stat] is \emph{not} a good idea because the variable [stat] makes it impossible to test for the existance of a particular [wf] in a [DAG]. \end{dubious} \begin{dubious} In summary, it seems that [(wf * stat) list array * A.D.t] should be replaced by [(wf -> stat) * A.D.t]. \end{dubious} *) module GF = struct module Nodes = struct type t = A.wf module G = struct type t = int let compare = compare end let compare = A.order_wf let rank wf = P.rank wf.A.momentum end module Edges = struct type t = A.coupling let compare = compare end module F = DAG.Forest(PT)(Nodes)(Edges) type node = Nodes.t type edge = F.edge type children = F.children type t = F.t let compare = F.compare let for_all = F.for_all let fold = F.fold end module D' = DAG.Graded(GF) let tower_of_dag dag = let _, max_rank = D'.min_max_rank dag in Array.init max_rank (fun n -> D'.ranked n dag) (* The function [fusion_tower'] recursively builds the tower of all fusions from bottom up to a chosen level. The argument [tower] is an array of lists, where the $i$-th sublist (counting from 0) represents all off shell wave functions depending on $i+1$~momenta and their Fermistatistics. \begin{equation} \begin{aligned} \Bigl\lbrack & \{ \phi_1(p_1), \phi_2(p_2), \phi_3(p_3), \ldots \}, \\ & \{ \phi_{12}(p_1+p_2), \phi'_{12}(p_1+p_2), \ldots, \phi_{13}(p_1+p_3), \ldots, \phi_{23}(p_2+p_3), \ldots \}, \\ & \ldots \\ & \{ \phi_{1\cdots n}(p_1+\cdots+p_n), \phi'_{1\cdots n}(p_1+\cdots+p_n), \ldots \} \Bigr\rbrack \end{aligned} \end{equation} The argument [dag] is a DAG representing all the fusions calculated so far. NB: The outer array in [tower] is always very short, so we could also have accessed a list with [List.nth]. Appending of new members at the end brings no loss of performance. NB: the array is supposed to be immutable. *) (* The towers must be sorted so that the combinatorical functions can make consistent selections. \begin{dubious} Intuitively, this seems to be correct. However, one could have expected that no element appears twice and that this ordering is not necessary \ldots \end{dubious} *) let grow select_wf select_vtx tower = let rank = succ (Array.length tower) in List.sort pcompare (PT.graded_sym_power_fold rank (fun wfs acc -> fuse select_wf select_vtx wfs @ acc) tower []) let add_offspring dag (wf, _, rhs) = A.D.add_offspring wf rhs dag let filter_offspring fusions = List.map (fun (wf, s, _) -> (wf, s)) fusions let rec fusion_tower' n_max select_wf select_vtx tower dag : (A.wf * stat) list array * A.D.t = if Array.length tower >= n_max then (tower, dag) else let tower' = grow select_wf select_vtx tower in fusion_tower' n_max select_wf select_vtx (Array.append tower [|filter_offspring tower'|]) (List.fold_left add_offspring dag tower') (* Discard the tower and return a map from wave functions to Fermistatistics together with the DAG. *) let make_external_dag wfs = List.fold_left (fun m (wf, _) -> A.D.add_node wf m) A.D.empty wfs let mixed_fold_left f acc lists = Array.fold_left (List.fold_left f) acc lists module Stat_Map = Map.Make (struct type t = A.wf let compare = A.order_wf end) let fusion_tower height select_wf select_vtx wfs : (A.wf -> stat) * A.D.t = let tower, dag = fusion_tower' height select_wf select_vtx [|wfs|] (make_external_dag wfs) in let stats = mixed_fold_left (fun m (wf, s) -> Stat_Map.add wf s m) Stat_Map.empty tower in ((fun wf -> Stat_Map.find wf stats), dag) (* Calculate the minimal tower of fusions that suffices for calculating the amplitude. *) let minimal_fusion_tower n select_wf select_vtx wfs : (A.wf -> stat) * A.D.t = fusion_tower (T.max_subtree n) select_wf select_vtx wfs (* Calculate the complete tower of fusions. It is much larger than required, but it allows a complete set of gauge checks. *) let complete_fusion_tower select_wf select_vtx wfs : (A.wf -> stat) * A.D.t = fusion_tower (List.length wfs - 1) select_wf select_vtx wfs (* \begin{dubious} There is a natural product of two DAGs using [fuse]. Can this be used in a replacement for [fusion_tower]? The hard part is to avoid double counting, of course. A straight forward solution could do a diagonal sum (in order to reject flipped offspring representing the same fusion) and rely on the uniqueness in [DAG] otherwise. However, this will (probably) slow down the procedure significanty, because most fusions (including Fermi signs!) will be calculated before being rejected by [DAG().add_offspring]. \end{dubious} *) (* Add to [dag] all Goldstone bosons defined in [tower] that correspond to gauge bosons in [dag]. This is only required for checking Slavnov-Taylor identities in unitarity gauge. Currently, it is not used, because we use the complete tower for gauge checking. *) let harvest_goldstones tower dag = A.D.fold_nodes (fun wf dag' -> match M.goldstone wf.A.flavor with | Some (g, _) -> let wf' = { wf with A.flavor = g } in if A.D.is_node wf' tower then begin A.D.harvest tower wf' dag' end else begin dag' end | None -> dag') dag dag (* Calculate the sign from Fermi statistics that is not already included in the children. \begin{dubious} The use of [PT.of2_kludge] is the largest skeleton on the cupboard of unified fusions. Currently, it is just another name for [PT.of2], but the existence of the latter requires binary fusions. Of course, this is just a symptom for not fully supporting four fermion vertices \ldots \end{dubious} *) let stat_keystone stats wf1 wfs = let wf1' = stats wf1 and wfs' = PT.map stats wfs in let stat = stat_fuse (PT.of2_kludge wf1' (stat_fuse wfs' (M.conjugate (A.flavor wf1)))) (A.flavor wf1) in (*i Printf.eprintf "Fusion.stat_keystone: %s\n" (S.stat_to_string stat); i*) stat_sign stat * PT.fold_left (fun acc wf -> acc * stat_sign wf) (stat_sign wf1') wfs' (* Test all members of a list of wave functions are defined by the DAG simultaneously: *) let test_rhs dag (_, wfs) = PT.for_all (fun wf -> is_source wf && A.D.is_node wf dag) wfs (* Add the keystone [(wf1,pairs)] to [acc] only if it is present in [dag] and calculate the statistical factor depending on [stats] \emph{en passant}: *) let filter_keystone stats dag (wf1, pairs) acc = if is_source wf1 && A.D.is_node wf1 dag then match List.filter (test_rhs dag) pairs with | [] -> acc | pairs' -> (wf1, List.map (fun (c, wfs) -> ({ Tagged_Coupling.sign = stat_keystone stats wf1 wfs; Tagged_Coupling.coupling = c; Tagged_Coupling.coupling_tag = A.Tags.null_coupling }, wfs)) pairs') :: acc else acc (* \begin{figure} \begin{center} \thocwincludegraphics{width=\textwidth}{bhabha0}\\ \hfil\\ \thocwincludegraphics{width=\textwidth}{bhabha} \end{center} \caption{\label{fig:bhabha} The DAGs for Bhabha scattering before and after weeding out unused nodes. The blatant asymmetry of these DAGs is caused by our prescription for removing doubling counting for an even number of external lines.} \end{figure} \begin{figure} \begin{center} \thocwincludegraphics{width=\textwidth}{epemudbarmunumubar0}\\ \hfil\\ \thocwincludegraphics{width=\textwidth}{epemudbarmunumubar} \end{center} \caption{\label{fig:epemudbarmunumubar} The DAGs for $e^+e^-\to u\bar d \mu^-\bar\nu_\mu$ before and after weeding out unused nodes.} \end{figure} \begin{figure} \begin{center} \thocwincludegraphics{width=\textwidth}{epemudbardubar0}\\ \hfil\\ \thocwincludegraphics{width=\textwidth}{epemudbardubar} \end{center} \caption{\label{fig:epemudbardubar} The DAGs for $e^+e^-\to u\bar d d\bar u$ before and after weeding out unused nodes.} \end{figure} *) (* \thocwmodulesubsection{Amplitudes} *) module C = Cascade.Make(M)(P) type selectors = C.selectors let external_wfs n particles = List.map (fun (f, p) -> ({ A.flavor = f; A.momentum = P.singleton n p; A.wf_tag = A.Tags.null_wf }, stat f p)) particles (* \thocwmodulesubsection{Main Function} *) module WFMap = Map.Make (struct type t = A.wf let compare = compare end) (* [map_amplitude_wfs f a] applies the function [f : wf -> wf] to all wavefunctions appearing in the amplitude [a]. *) let map_amplitude_wfs f a = let map_rhs (c, wfs) = (c, PT.map f wfs) in let map_braket (wf, rhs) = (f wf, List.map map_rhs rhs) and map_fusion (lhs, rhs) = (f lhs, List.map map_rhs rhs) in let map_dag = A.D.map f (fun node rhs -> map_rhs rhs) in let tower = map_dag a.A.fusion_tower and dag = map_dag a.A.fusion_dag in let dependencies_map = A.D.fold (fun wf _ -> WFMap.add wf (A.D.dependencies dag wf)) dag WFMap.empty in { A.fusions = List.map map_fusion a.A.fusions; A.brakets = List.map map_braket a.A.brakets; A.on_shell = a.A.on_shell; A.is_gauss = a.A.is_gauss; A.constraints = a.A.constraints; A.incoming = a.A.incoming; A.outgoing = a.A.outgoing; A.externals = List.map f a.A.externals; A.symmetry = a.A.symmetry; A.dependencies = (fun wf -> WFMap.find wf dependencies_map); A.fusion_tower = tower; A.fusion_dag = dag } (*i (* \begin{dubious} Just a silly little test: \end{dubious} *) let hack_amplitude = map_amplitude_wfs (fun wf -> { wf with momentum = P.split 2 16 wf.momentum }) i*) (* This is the main function that constructs the amplitude for sets of incoming and outgoing particles and returns the results in conveniently packaged pieces. *) let amplitude goldstones selectors fin fout = (* Set up external lines and match flavors with numbered momenta. *) let f = fin @ List.map M.conjugate fout in let nin, nout = List.length fin, List.length fout in let n = nin + nout in let externals = List.combine f (ThoList.range 1 n) in let wfs = external_wfs n externals in let select_p = C.select_p selectors in let select_wf = match fin with | [_] -> C.select_wf selectors P.Decay.timelike | _ -> C.select_wf selectors P.Scattering.timelike in let select_vtx = C.select_vtx selectors in (* Build the full fusion tower (including nodes that are never needed in the amplitude). *) let stats, tower = if goldstones then complete_fusion_tower select_wf select_vtx wfs else minimal_fusion_tower n select_wf select_vtx wfs in (* Find all vertices for which \emph{all} off shell wavefunctions are defined by the tower. *) let brakets = flavor_keystones (filter_keystone stats tower) select_p n (filter_vertices select_vtx (vertices (M.max_degree ()) (M.flavors ()))) (T.keystones (ThoList.range 1 n)) in (* Remove the part of the DAG that is never needed in the amplitude. *) let dag = if goldstones then tower else A.D.harvest_list tower (A.wavefunctions brakets) in (* Remove the leaf nodes of the DAG, corresponding to external lines. *) let fusions = List.filter (function (_, []) -> false | _ -> true) (A.D.lists dag) in (* Calculate the symmetry factor for identical particles in the final state. *) let symmetry = Combinatorics.symmetry fout in let dependencies_map = A.D.fold (fun wf _ -> WFMap.add wf (A.D.dependencies dag wf)) dag WFMap.empty in (* Finally: package the results: *) { A.fusions = fusions; A.brakets = brakets; A.on_shell = (fun wf -> C.on_shell selectors (A.flavor wf) wf.A.momentum); A.is_gauss = (fun wf -> C.is_gauss selectors (A.flavor wf) wf.A.momentum); A.constraints = C.description selectors; A.incoming = fin; A.outgoing = fout; A.externals = List.map fst wfs; A.symmetry = symmetry; A.dependencies = (fun wf -> WFMap.find wf dependencies_map); A.fusion_tower = tower; A.fusion_dag = dag } (* \thocwmodulesubsection{Color} *) module CM = Colorize.It(M) module CA = Amplitude(PT)(P)(CM) let colorize_wf flavor wf = { CA.flavor = flavor; CA.momentum = wf.A.momentum; CA.wf_tag = wf.A.wf_tag } let uncolorize_wf wf = { A.flavor = CM.flavor_sans_color wf.CA.flavor; A.momentum = wf.CA.momentum; A.wf_tag = wf.CA.wf_tag } (* \begin{dubious} At the end of the day, I shall want to have some sort of \textit{fibered DAG} as abstract data type, with a projection of colored nodes to their uncolored counterparts. \end{dubious} *) module CWFBundle = Bundle.Make (struct type elt = CA.wf let compare_elt = compare type base = A.wf let compare_base = compare let pi wf = { A.flavor = CM.flavor_sans_color wf.CA.flavor; A.momentum = wf.CA.momentum; A.wf_tag = wf.CA.wf_tag } end) (* \begin{dubious} For now, we can live with simple aggregation: \end{dubious} *) type fibered_dag = { dag : CA.D.t; bundle : CWFBundle.t } (* Not yet(?) needed: [module CS = Stat (CM)] *) let colorize_sterile_nodes dag f wf fibered_dag = if A.D.is_sterile wf dag then let wf', wf_bundle' = f wf fibered_dag in { dag = CA.D.add_node wf' fibered_dag.dag; bundle = wf_bundle' } else fibered_dag let colorize_nodes f wf rhs fibered_dag = let wf_rhs_list', wf_bundle' = f wf rhs fibered_dag in let dag' = List.fold_right (fun (wf', rhs') -> CA.D.add_offspring wf' rhs') wf_rhs_list' fibered_dag.dag in { dag = dag'; bundle = wf_bundle' } (* O'Caml (correctly) infers the type [val colorize_dag : (D.node -> D.edge * D.children -> fibered_dag -> (CA.D.node * (CA.D.edge * CA.D.children)) list * CWFBundle.t) -> (D.node -> fibered_dag -> CA.D.node * CWFBundle.t) -> D.t -> CWFBundle.t -> fibered_dag]. *) let colorize_dag f_node f_ext dag wf_bundle = A.D.fold (colorize_nodes f_node) dag (A.D.fold_nodes (colorize_sterile_nodes dag f_ext) dag { dag = CA.D.empty; bundle = wf_bundle }) let colorize_external wf fibered_dag = match CWFBundle.inv_pi wf fibered_dag.bundle with | [c_wf] -> (c_wf, fibered_dag.bundle) | [] -> failwith "colorize_external: not found" | _ -> failwith "colorize_external: not unique" let fuse_c_wf rhs = let momenta = PT.map (fun wf -> wf.CA.momentum) rhs in List.filter (fun (_, c) -> kmatrix_cuts c momenta) (CM.fuse (List.map (fun wf -> wf.CA.flavor) (PT.to_list rhs))) let colorize_coupling c coupling = { coupling with Tagged_Coupling.coupling = c } let colorize_fusion wf (coupling, children) fibered_dag = let match_flavor (f, _) = (CM.flavor_sans_color f = A.flavor wf) and find_colored wf' = CWFBundle.inv_pi wf' fibered_dag.bundle in let fusions = ThoList.flatmap (fun c_children -> List.map (fun (f, c) -> (colorize_wf f wf, (colorize_coupling c coupling, c_children))) (List.filter match_flavor (fuse_c_wf c_children))) (PT.product (PT.map find_colored children)) in let bundle = List.fold_right (fun (c_wf, _) -> CWFBundle.add c_wf) fusions fibered_dag.bundle in (fusions, bundle) let colorize_braket1 (wf, (coupling, children)) fibered_dag = let find_colored wf' = CWFBundle.inv_pi wf' fibered_dag.bundle in Product.fold2 (fun bra ket acc -> List.fold_left (fun brakets (f, c) -> if CM.conjugate bra.CA.flavor = f then (bra, (colorize_coupling c coupling, ket)) :: brakets else brakets) acc (fuse_c_wf ket)) (find_colored wf) (PT.product (PT.map find_colored children)) [] module CWFMap = Map.Make (struct type t = CA.wf let compare = CA.order_wf end) module CKetSet = Set.Make (struct type t = CA.rhs let compare = compare end) (* Find a set of kets in [map] that belong to [bra]. Return the empty set, if nothing is found. *) let lookup_ketset bra map = try CWFMap.find bra map with Not_found -> CKetSet.empty (* Return the set of kets belonging to [bra] in [map], augmented by [ket]. *) let addto_ketset bra ket map = CKetSet.add ket (lookup_ketset bra map) (* Augment or update [map] with a new [(bra, ket)] relation. *) let addto_ketset_map map (bra, ket) = CWFMap.add bra (addto_ketset bra ket map) map (* Take a list of [(bra, ket)] pairs and group the [ket]s according to [bra]. This is very similar to [ThoList.factorize] on page~\pageref{ThoList.factorize}, but the latter keeps duplicate copies, while we keep only one, with equality determined by [CA.order_wf]. *) (* \begin{dubious} Isn't [Bundle]~\ref{Bundle} the correct framework for this? \end{dubious} *) let factorize_brakets brakets = CWFMap.fold (fun bra ket acc -> (bra, CKetSet.elements ket) :: acc) (List.fold_left addto_ketset_map CWFMap.empty brakets) [] let colorize_braket (wf, rhs_list) fibered_dag = factorize_brakets (ThoList.flatmap (fun rhs -> (colorize_braket1 (wf, rhs) fibered_dag)) rhs_list) let colorize_amplitude a fin fout = let f = fin @ List.map CM.conjugate fout in let nin, nout = List.length fin, List.length fout in let n = nin + nout in let externals = List.combine f (ThoList.range 1 n) in let external_wfs = CA.external_wfs n externals in let wf_bundle = CWFBundle.of_list external_wfs in let fibered_dag = colorize_dag colorize_fusion colorize_external a.A.fusion_dag wf_bundle in let brakets = ThoList.flatmap (fun braket -> colorize_braket braket fibered_dag) a.A.brakets in let dag = CA.D.harvest_list fibered_dag.dag (CA.wavefunctions brakets) in let fusions = List.filter (function (_, []) -> false | _ -> true) (CA.D.lists dag) in let dependencies_map = CA.D.fold (fun wf _ -> CWFMap.add wf (CA.D.dependencies dag wf)) dag CWFMap.empty in { CA.fusions = fusions; CA.brakets = brakets; CA.constraints = a.A.constraints; CA.incoming = fin; CA.outgoing = fout; CA.externals = external_wfs; CA.fusion_dag = dag; CA.fusion_tower = dag; CA.symmetry = a.A.symmetry; CA.on_shell = (fun wf -> a.A.on_shell (uncolorize_wf wf)); CA.is_gauss = (fun wf -> a.A.is_gauss (uncolorize_wf wf)); CA.dependencies = (fun wf -> CWFMap.find wf dependencies_map) } let allowed amplitude = match amplitude.CA.brakets with | [] -> false | _ -> true let colorize_amplitudes a = List.fold_left (fun amps (fin, fout) -> let amp = colorize_amplitude a fin fout in if allowed amp then amp :: amps else amps) [] (CM.amplitude a.A.incoming a.A.outgoing) let amplitudes goldstones exclusions selectors fin fout = colorize_amplitudes (amplitude goldstones selectors fin fout) let amplitude_sans_color goldstones exclusions selectors fin fout = amplitude goldstones selectors fin fout type flavor = CA.flavor type flavor_sans_color = A.flavor type p = A.p type wf = CA.wf let conjugate = CA.conjugate let flavor = CA.flavor let flavor_sans_color wf = CM.flavor_sans_color (CA.flavor wf) let momentum = CA.momentum let momentum_list = CA.momentum_list let wf_tag = CA.wf_tag type coupling = CA.coupling let sign = CA.sign let coupling = CA.coupling let coupling_tag = CA.coupling_tag type exclusions = CA.exclusions let no_exclusions = CA.no_exclusions type 'a children = 'a CA.children type rhs = CA.rhs let children = CA.children type fusion = CA.fusion let lhs = CA.lhs let rhs = CA.rhs type braket = CA.braket let bra = CA.bra let ket = CA.ket type amplitude = CA.amplitude type amplitude_sans_color = A.amplitude let incoming = CA.incoming let outgoing = CA.outgoing let externals = CA.externals let fusions = CA.fusions let brakets = CA.brakets let symmetry = CA.symmetry let on_shell = CA.on_shell let is_gauss = CA.is_gauss let constraints = CA.constraints let variables a = List.map lhs (fusions a) let dependencies = CA.dependencies (* \thocwmodulesubsection{Checking Conservation Laws} *) let check_charges () = let vlist3, vlist4, vlistn = M.vertices () in List.filter (fun flist -> not (M.Ch.is_null (M.Ch.sum (List.map M.charges flist)))) (List.map (fun ((f1, f2, f3), _, _) -> [f1; f2; f3]) vlist3 @ List.map (fun ((f1, f2, f3, f4), _, _) -> [f1; f2; f3; f4]) vlist4 @ List.map (fun (flist, _, _) -> flist) vlistn) (* \thocwmodulesubsection{Diagnostics} *) let count_propagators a = List.length a.CA.fusions let count_fusions a = List.fold_left (fun n (_, a) -> n + List.length a) 0 a.CA.fusions + List.fold_left (fun n (_, t) -> n + List.length t) 0 a.CA.brakets + List.length a.CA.brakets (* \begin{dubious} This brute force approach blows up for more than ten particles. Find a smarter algorithm. \end{dubious} *) let count_diagrams a = List.fold_left (fun n (wf1, wf23) -> n + CA.D.count_trees wf1 a.CA.fusion_dag * (List.fold_left (fun n' (_, wfs) -> n' + PT.fold_left (fun n'' wf -> n'' * CA.D.count_trees wf a.CA.fusion_dag) 1 wfs) 0 wf23)) 0 a.CA.brakets exception Impossible let forest' a = let below wf = CA.D.forest_memoized wf a.CA.fusion_dag in ThoList.flatmap (fun (bra, ket) -> (Product.list2 (fun bra' ket' -> bra' :: ket') (below bra) (ThoList.flatmap (fun (_, wfs) -> Product.list (fun w -> w) (PT.to_list (PT.map below wfs))) ket))) a.CA.brakets let cross wf = { CA.flavor = CM.conjugate wf.CA.flavor; CA.momentum = P.neg wf.CA.momentum; CA.wf_tag = wf.CA.wf_tag } let fuse_trees wf ts = Tree.fuse (fun (wf', e) -> (cross wf', e)) wf (fun t -> List.mem wf (Tree.leafs t)) ts let forest wf a = List.map (fuse_trees wf) (forest' a) (*i (* \begin{dubious} The following duplication should be replaced by polymorphism or a functor. \end{dubious} *) let forest_uncolored' a = let below wf = A.D.forest_memoized wf a.A.fusion_dag in ThoList.flatmap (fun (bra, ket) -> (Product.list2 (fun bra' ket' -> bra' :: ket') (below bra) (ThoList.flatmap (fun (_, wfs) -> Product.list (fun w -> w) (PT.to_list (PT.map below wfs))) ket))) a.A.brakets let cross_uncolored wf = { A.flavor = M.conjugate wf.A.flavor; A.momentum = P.neg wf.A.momentum; A.wf_tag = wf.A.wf_tag } let fuse_trees_uncolored wf ts = Tree.fuse (fun (wf', e) -> (cross_uncolored wf', e)) wf (fun t -> List.mem wf (Tree.leafs t)) ts let forest_sans_color wf a = List.map (fuse_trees_uncolored wf) (forest_uncolored' a) i*) let poles_beneath wf dag = CA.D.eval_memoized (fun wf' -> [[]]) (fun wf' _ p -> List.map (fun p' -> wf' :: p') p) (fun wf1 wf2 -> Product.fold2 (fun wf' wfs' wfs'' -> (wf' @ wfs') :: wfs'') wf1 wf2 []) (@) [[]] [[]] wf dag let poles a = ThoList.flatmap (fun (wf1, wf23) -> let poles_wf1 = poles_beneath wf1 a.CA.fusion_dag in (ThoList.flatmap (fun (_, wfs) -> Product.list List.flatten (PT.to_list (PT.map (fun wf -> poles_wf1 @ poles_beneath wf a.CA.fusion_dag) wfs))) wf23)) a.CA.brakets module WFSet = Set.Make (struct type t = CA.wf let compare = CA.order_wf end) let s_channel a = WFSet.elements (ThoList.fold_right2 (fun wf wfs -> if P.Scattering.timelike wf.CA.momentum then WFSet.add wf wfs else wfs) (poles a) WFSet.empty) (* \begin{dubious} This should be much faster! Is it correct? Is it faster indeed? \end{dubious} *) let poles' a = List.map CA.lhs a.CA.fusions let s_channel a = WFSet.elements (List.fold_right (fun wf wfs -> if P.Scattering.timelike wf.CA.momentum then WFSet.add wf wfs else wfs) (poles' a) WFSet.empty) (* \thocwmodulesubsection{Pictures} *) (* Export the DAG in the \texttt{dot(1)} file format so that we can draw pretty pictures to impress audiences \ldots *) let p2s p = if p >= 0 && p <= 9 then string_of_int p else if p <= 36 then String.make 1 (Char.chr (Char.code 'A' + p - 10)) else "_" let variable wf = CM.flavor_symbol wf.CA.flavor ^ String.concat "" (List.map p2s (P.to_ints wf.CA.momentum)) module Int = Map.Make (struct type t = int let compare = compare end) let add_to_list i n m = Int.add i (n :: try Int.find i m with Not_found -> []) m let classify_nodes dag = Int.fold (fun i n acc -> (i, n) :: acc) (CA.D.fold_nodes (fun wf -> add_to_list (P.rank wf.CA.momentum) wf) dag Int.empty) [] let dag_to_dot ch brakets dag = Printf.fprintf ch "digraph OMEGA {\n"; CA.D.iter_nodes (fun wf -> Printf.fprintf ch " \"%s\" [ label = \"%s\" ];\n" (variable wf) (variable wf)) dag; List.iter (fun (_, wfs) -> Printf.fprintf ch " { rank = same;"; List.iter (fun n -> Printf.fprintf ch " \"%s\";" (variable n)) wfs; Printf.fprintf ch " };\n") (classify_nodes dag); List.iter (fun n -> Printf.fprintf ch " \"*\" -> \"%s\";\n" (variable n)) (flatten_keystones brakets); CA.D.iter (fun n (_, ns) -> let p = variable n in PT.iter (fun n' -> Printf.fprintf ch " \"%s\" -> \"%s\";\n" p (variable n')) ns) dag; Printf.fprintf ch "}\n" let tower_to_dot ch a = dag_to_dot ch a.CA.brakets a.CA.fusion_tower let amplitude_to_dot ch a = dag_to_dot ch a.CA.brakets a.CA.fusion_dag (* \thocwmodulesubsection{Phasespace} *) let variable wf = M.flavor_to_string wf.A.flavor ^ "[" ^ String.concat "/" (List.map p2s (P.to_ints wf.A.momentum)) ^ "]" let below_to_channel transform ch dag wf = let n2s wf = variable (transform wf) and e2s c = "" in Tree2.to_channel ch n2s e2s (A.D.dependencies dag wf) let bra_to_channel transform ch dag wf = let tree = A.D.dependencies dag wf in if Tree2.is_singleton tree then let n2s wf = variable (transform wf) and e2s c = "" in Tree2.to_channel ch n2s e2s tree else failwith "Fusion.phase_space_channels: wrong topology!" let ket_to_channel transform ch dag ket = Printf.fprintf ch "("; begin match A.children ket with | [] -> () | [child] -> below_to_channel transform ch dag child | child :: children -> below_to_channel transform ch dag child; List.iter (fun child -> Printf.fprintf ch ","; below_to_channel transform ch dag child) children end; Printf.fprintf ch ")" let phase_space_braket transform ch (bra, ket) dag = bra_to_channel transform ch dag bra; Printf.fprintf ch ": {"; begin match ket with | [] -> () | [ket1] -> Printf.fprintf ch " "; ket_to_channel transform ch dag ket1 | ket1 :: kets -> Printf.fprintf ch " "; ket_to_channel transform ch dag ket1; List.iter (fun k -> Printf.fprintf ch " \\\n | "; ket_to_channel transform ch dag k) kets end; Printf.fprintf ch " }\n" (*i Food for thought: let braket_to_tree2 dag (bra, ket) = let bra' = A.D.dependencies dag bra in if Tree2.is_singleton bra' then Tree2.cons [(fst ket, bra, List.map (A.D.dependencies dag) (A.children ket))] else failwith "Fusion.phase_space_channels: wrong topology!" let phase_space_braket transform ch (bra, ket) dag = let n2s wf = variable (transform wf) and e2s c = "" in Printf.fprintf ch "%s\n" (Tree2.to_string n2s e2s (braket_to_tree2 dag (bra, ket))) i*) let phase_space_channels_transformed transform ch a = List.iter (fun braket -> phase_space_braket transform ch braket a.A.fusion_dag) a.A.brakets let phase_space_channels ch a = phase_space_channels_transformed (fun wf -> wf) ch a let exchange_momenta_list p1 p2 p = List.map (fun pi -> if pi = p1 then p2 else if pi = p2 then p1 else pi) p let exchange_momenta p1 p2 p = P.of_ints (P.dim p) (exchange_momenta_list p1 p2 (P.to_ints p)) let flip_momenta wf = { wf with A.momentum = exchange_momenta 1 2 wf.A.momentum } let phase_space_channels_flipped ch a = phase_space_channels_transformed flip_momenta ch a end module Make = Tagged(No_Tags) module Binary = Make(Tuple.Binary)(Stat_Dirac)(Topology.Binary) module Tagged_Binary (T : Tagger) = Tagged(T)(Tuple.Binary)(Stat_Dirac)(Topology.Binary) (* \thocwmodulesection{Fusions with Majorana Fermions} *) module Stat_Majorana (M : Model.T) : (Stat with type flavor = M.flavor) = struct type flavor = M.flavor type stat = | Fermion of int * int list | AntiFermion of int * int list | Boson of int list | Majorana of int * int list let stat f p = let s = M.fermion f in if s = 0 then Boson [] else if s < 0 then AntiFermion (p, []) else if s = 1 then (* [if s = 1 then] *) Fermion (p, []) else (* [if s > 1 then] *) Majorana (p, []) let lines_to_string lines = ThoList.to_string string_of_int lines let stat_to_string = function | Boson lines -> Printf.sprintf "Boson %s" (lines_to_string lines) | Fermion (p, lines) -> Printf.sprintf "Fermion (%d, %s)" p (lines_to_string lines) | AntiFermion (p, lines) -> Printf.sprintf "AntiFermion (%d, %s)" p (lines_to_string lines) | Majorana (p, lines) -> Printf.sprintf "Majorana (%d, %s)" p (lines_to_string lines) (* \begin{JR} In the formalism of~\cite{Denner:Majorana}, it does not matter to distinguish spinors and conjugate spinors, it is only important to know in which direction a fermion line is calculated. So the sign is made by the calculation together with an aditional one due to the permuation of the pairs of endpoints of fermion lines in the direction they are calculated. We propose a ``canonical'' direction from the right to the left child at a fusion point so we only have to keep in mind which external particle hangs at each side. Therefore we need not to have a list of pairs of conjugate spinors and spinors but just a list in which the pairs are right-left-right-left and so on. Unfortunately it is unavoidable to have couplings with clashing arrows in supersymmetric theories so we need transmutations from fermions in antifermions and vice versa as well. \end{JR} *) exception Impossible (*i let stat_fuse s1 s2 f = match s1, s2, M.lorentz f with | Boson l1, Boson l2, _ -> Boson (l1 @ l2) | Boson l1, Fermion (p, l2), Coupling.Majorana -> Majorana (p, l1 @ l2) | Boson l1, Fermion (p, l2), _ -> Fermion (p, l1 @ l2) | Boson l1, AntiFermion (p, l2), Coupling.Majorana -> Majorana (p, l1 @ l2) | Boson l1, AntiFermion (p, l2), _ -> AntiFermion (p, l1 @ l2) | Fermion (p, l1), Boson l2, Coupling.Majorana -> Majorana (p, l1 @ l2) | Fermion (p, l1), Boson l2, _ -> Fermion (p, l1 @ l2) | AntiFermion (p, l1), Boson l2, Coupling.Majorana -> Majorana (p, l1 @ l2) | AntiFermion (p, l1), Boson l2, _ -> AntiFermion (p, l1 @ l2) | Majorana (p, l1), Boson l2, Coupling.Spinor -> Fermion (p, l1 @ l2) | Majorana (p, l1), Boson l2, Coupling.ConjSpinor -> AntiFermion (p, l1 @ l2) | Majorana (p, l1), Boson l2, _ -> Majorana (p, l1 @ l2) | Boson l1, Majorana (p, l2), Coupling.Spinor -> Fermion (p, l1 @ l2) | Boson l1, Majorana (p, l2), Coupling.ConjSpinor -> AntiFermion (p, l1 @ l2) | Boson l1, Majorana (p, l2), _ -> Majorana (p, l1 @ l2) | AntiFermion (pbar, l1), Fermion (p, l2), _ -> Boson ([p; pbar] @ l1 @ l2) | Fermion (p, l1), AntiFermion (pbar, l2), _ -> Boson ([pbar; p] @ l1 @ l2) | Fermion (pf, l1), Majorana (pm, l2), _ -> Boson ([pm; pf] @ l1 @ l2) | Majorana (pm, l1), Fermion (pf, l2), _ -> Boson ([pf; pm] @ l1 @ l2) | AntiFermion (pa, l1), Majorana (pm, l2), _ -> Boson ([pm; pa] @ l1 @ l2) | Majorana (pm, l1), AntiFermion (pa, l2), _ -> Boson ([pa; pm] @ l1 @ l2) | Majorana (p1, l1), Majorana (p2, l2), _ -> Boson ([p2; p1] @ l1 @ l2) | Fermion _, Fermion _, _ | AntiFermion _, AntiFermion _, _ -> raise Impossible i*) let stat_fuse s1 s2 f = match s1, s2, M.lorentz f with | Boson l1, Fermion (p, l2), Coupling.Majorana | Boson l1, AntiFermion (p, l2), Coupling.Majorana | Fermion (p, l1), Boson l2, Coupling.Majorana | AntiFermion (p, l1), Boson l2, Coupling.Majorana | Majorana (p, l1), Boson l2, Coupling.Majorana | Boson l1, Majorana (p, l2), Coupling.Majorana -> Majorana (p, l1 @ l2) | Boson l1, Fermion (p, l2), Coupling.Spinor | Boson l1, AntiFermion (p, l2), Coupling.Spinor | Fermion (p, l1), Boson l2, Coupling.Spinor | AntiFermion (p, l1), Boson l2, Coupling.Spinor | Majorana (p, l1), Boson l2, Coupling.Spinor | Boson l1, Majorana (p, l2), Coupling.Spinor -> Fermion (p, l1 @ l2) | Boson l1, Fermion (p, l2), Coupling.ConjSpinor | Boson l1, AntiFermion (p, l2), Coupling.ConjSpinor | Fermion (p, l1), Boson l2, Coupling.ConjSpinor | AntiFermion (p, l1), Boson l2, Coupling.ConjSpinor | Majorana (p, l1), Boson l2, Coupling.ConjSpinor | Boson l1, Majorana (p, l2), Coupling.ConjSpinor -> AntiFermion (p, l1 @ l2) | Boson l1, Fermion (p, l2), Coupling.Vectorspinor | Boson l1, AntiFermion (p, l2), Coupling.Vectorspinor | Fermion (p, l1), Boson l2, Coupling.Vectorspinor | AntiFermion (p, l1), Boson l2, Coupling.Vectorspinor | Majorana (p, l1), Boson l2, Coupling.Vectorspinor | Boson l1, Majorana (p, l2), Coupling.Vectorspinor -> Majorana (p, l1 @ l2) | Boson l1, Boson l2, _ -> Boson (l1 @ l2) | AntiFermion (p1, l1), Fermion (p2, l2), _ | Fermion (p1, l1), AntiFermion (p2, l2), _ | Fermion (p1, l1), Fermion (p2, l2), _ | AntiFermion (p1, l1), AntiFermion (p2, l2), _ | Fermion (p1, l1), Majorana (p2, l2), _ | Majorana (p1, l1), Fermion (p2, l2), _ | AntiFermion (p1, l1), Majorana (p2, l2), _ | Majorana (p1, l1), AntiFermion (p2, l2), _ | Majorana (p1, l1), Majorana (p2, l2), _ -> Boson ([p2; p1] @ l1 @ l2) | Boson l1, Majorana (p, l2), _ -> Majorana (p, l1 @ l2) | Boson l1, Fermion (p, l2), _ -> Fermion (p, l1 @ l2) | Boson l1, AntiFermion (p, l2), _ -> AntiFermion (p, l1 @ l2) | Fermion (p, l1), Boson l2, _ -> Fermion (p, l1 @ l2) | AntiFermion (p, l1), Boson l2, _ -> AntiFermion (p, l1 @ l2) | Majorana (p, l1), Boson l2, _ -> Majorana (p, l1 @ l2) let stat_fuse s1 s2 f = let stat = stat_fuse s1 s2 f in (*i Printf.eprintf "Fusion.Stat_Majorana.stat_fuse_legacy: %s <- %s -> %s\n" (M.flavor_to_string f) (ThoList.to_string stat_to_string [s1; s2]) (stat_to_string stat); i*) stat (*i These are the old Impossible raising rules. We keep them to ask Ohl what the generalized topologies do and if our stat_fuse does the right for 4-vertices with | Boson l1, AntiFermion (p, l2), _ | Fermion (p, l1), Boson l2, _ | AntiFermion (p, l1), Boson l2, _ | Majorana (p, l1), Boson l2, _ | Boson l1, Majorana (p, l2), _ -> raise Impossible i*) let permutation lines = fst (Combinatorics.sort_signed lines) let stat_sign = function | Boson lines -> permutation lines | Fermion (p, lines) -> permutation (p :: lines) | AntiFermion (pbar, lines) -> permutation (pbar :: lines) | Majorana (pm, lines) -> permutation (pm :: lines) end module Binary_Majorana = Make(Tuple.Binary)(Stat_Majorana)(Topology.Binary) module Nary (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Dirac)(Topology.Nary(B)) module Nary_Majorana (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Majorana)(Topology.Nary(B)) module Mixed23 = Make(Tuple.Mixed23)(Stat_Dirac)(Topology.Mixed23) module Mixed23_Majorana = Make(Tuple.Mixed23)(Stat_Majorana)(Topology.Mixed23) module Helac (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Dirac)(Topology.Helac(B)) module Helac_Majorana (B: Tuple.Bound) = Make(Tuple.Nary(B))(Stat_Majorana)(Topology.Helac(B)) (* \thocwmodulesection{Multiple Amplitudes} *) module type Multi = sig exception Mismatch val options : Options.t type flavor type process = flavor list * flavor list type amplitude type fusion type wf type exclusions val no_exclusions : exclusions type selectors type amplitudes val amplitudes : bool -> int option -> exclusions -> selectors -> process list -> amplitudes val empty : amplitudes val initialize_cache : string -> unit val set_cache_name : string -> unit val flavors : amplitudes -> process list val vanishing_flavors : amplitudes -> process list val color_flows : amplitudes -> Color.Flow.t list val helicities : amplitudes -> (int list * int list) list val processes : amplitudes -> amplitude list val process_table : amplitudes -> amplitude option array array val fusions : amplitudes -> (fusion * amplitude) list val multiplicity : amplitudes -> wf -> int val dictionary : amplitudes -> amplitude -> wf -> int val color_factors : amplitudes -> Color.Flow.factor array array val constraints : amplitudes -> string option end module type Multi_Maker = functor (Fusion_Maker : Maker) -> functor (P : Momentum.T) -> functor (M : Model.T) -> Multi with type flavor = M.flavor and type amplitude = Fusion_Maker(P)(M).amplitude and type fusion = Fusion_Maker(P)(M).fusion and type wf = Fusion_Maker(P)(M).wf and type selectors = Fusion_Maker(P)(M).selectors module Multi (Fusion_Maker : Maker) (P : Momentum.T) (M : Model.T) = struct exception Mismatch type progress_mode = | Quiet | Channel of out_channel | File of string let progress_option = ref Quiet module CM = Colorize.It(M) module F = Fusion_Maker(P)(M) module C = Cascade.Make(M)(P) (* \begin{dubious} A kludge, at best \ldots \end{dubious} *) let options = Options.extend F.options [ "progress", Arg.Unit (fun () -> progress_option := Channel stderr), "report progress to the standard error stream"; "progress_file", Arg.String (fun s -> progress_option := File s), "report progress to a file" ] type flavor = M.flavor type p = F.p type process = flavor list * flavor list type amplitude = F.amplitude type fusion = F.fusion type wf = F.wf type exclusions = F.exclusions let no_exclusions = F.no_exclusions type selectors = F.selectors type flavors = flavor list array type helicities = int list array type colors = Color.Flow.t array type amplitudes' = amplitude array array array type amplitudes = { flavors : process list; vanishing_flavors : process list; color_flows : Color.Flow.t list; helicities : (int list * int list) list; processes : amplitude list; process_table : amplitude option array array; fusions : (fusion * amplitude) list; multiplicity : (wf -> int); dictionary : (amplitude -> wf -> int); color_factors : Color.Flow.factor array array; constraints : string option } let flavors a = a.flavors let vanishing_flavors a = a.vanishing_flavors let color_flows a = a.color_flows let helicities a = a.helicities let processes a = a.processes let process_table a = a.process_table let fusions a = a.fusions let multiplicity a = a.multiplicity let dictionary a = a.dictionary let color_factors a = a.color_factors let constraints a = a.constraints let sans_colors f = List.map CM.flavor_sans_color f let colors (fin, fout) = List.map M.color (fin @ fout) let process_sans_color a = (sans_colors (F.incoming a), sans_colors (F.outgoing a)) let color_flow a = CM.flow (F.incoming a) (F.outgoing a) let process_to_string fin fout = String.concat " " (List.map M.flavor_to_string fin) ^ " -> " ^ String.concat " " (List.map M.flavor_to_string fout) let count_processes colored_processes = List.length colored_processes module FMap = Map.Make (struct type t = process let compare = compare end) module CMap = Map.Make (struct type t = Color.Flow.t let compare = compare end) (* Recently [Product.list] began to guarantee lexicographic order for sorted arguments. Anyway, we still force a lexicographic order. *) let rec order_spin_table1 s1 s2 = match s1, s2 with | h1 :: t1, h2 :: t2 -> let c = compare h1 h2 in if c <> 0 then c else order_spin_table1 t1 t2 | [], [] -> 0 | _ -> invalid_arg "order_spin_table: inconsistent lengths" let order_spin_table (s1_in, s1_out) (s2_in, s2_out) = let c = compare s1_in s2_in in if c <> 0 then c else order_spin_table1 s1_out s2_out let sort_spin_table table = List.sort order_spin_table table let id x = x let pair x y = (x, y) (* \begin{dubious} Improve support for on shell Ward identities: [Coupling.Vector -> [4]] for one and only one external vector. \end{dubious} *) let rec hs_of_lorentz = function | Coupling.Scalar -> [0] | Coupling.Spinor | Coupling.ConjSpinor | Coupling.Majorana | Coupling.Maj_Ghost -> [-1; 1] | Coupling.Vector -> [-1; 1] | Coupling.Massive_Vector -> [-1; 0; 1] | Coupling.Tensor_1 -> [-1; 0; 1] | Coupling.Vectorspinor -> [-2; -1; 1; 2] | Coupling.Tensor_2 -> [-2; -1; 0; 1; 2] | Coupling.BRS f -> hs_of_lorentz f let hs_of_flavor f = hs_of_lorentz (M.lorentz f) let hs_of_flavors (fin, fout) = (List.map hs_of_flavor fin, List.map hs_of_flavor fout) let rec unphysical_of_lorentz = function | Coupling.Vector -> [4] | Coupling.Massive_Vector -> [4] | _ -> invalid_arg "unphysical_of_lorentz: not a vector particle" let unphysical_of_flavor f = unphysical_of_lorentz (M.lorentz f) let unphysical_of_flavors1 n f_list = ThoList.mapi (fun i f -> if i = n then unphysical_of_flavor f else hs_of_flavor f) 1 f_list let unphysical_of_flavors n (fin, fout) = (unphysical_of_flavors1 n fin, unphysical_of_flavors1 (n - List.length fin) fout) let helicity_table unphysical flavors = let hs = begin match unphysical with | None -> List.map hs_of_flavors flavors | Some n -> List.map (unphysical_of_flavors n) flavors end in if not (ThoList.homogeneous hs) then invalid_arg "Fusion.helicity_table: not all flavors have the same helicity states!" else match hs with | [] -> [] | (hs_in, hs_out) :: _ -> sort_spin_table (Product.list2 pair (Product.list id hs_in) (Product.list id hs_out)) module Proc = Process.Make(M) module WFMap = Map.Make (struct type t = F.wf let compare = compare end) module WFSet2 = Set.Make (struct type t = F.wf * (F.wf, F.coupling) Tree2.t let compare = compare end) module WFMap2 = Map.Make (struct type t = F.wf * (F.wf, F.coupling) Tree2.t let compare = compare end) module WFTSet = Set.Make (struct type t = (F.wf, F.coupling) Tree2.t let compare = compare end) (* All wavefunctions are unique per amplitude. So we can use per-amplitude dependency trees without additional \emph{internal} tags to identify identical wave functions. *) (* \textbf{NB:} we miss potential optimizations, because we assume all coupling to be different, while in fact we have horizontal/family symmetries and non abelian gauge couplings are universal anyway. *) let disambiguate_fusions amplitudes = let fusions = ThoList.flatmap (fun amplitude -> List.map (fun fusion -> (fusion, F.dependencies amplitude (F.lhs fusion))) (F.fusions amplitude)) amplitudes in let duplicates = List.fold_left (fun map (fusion, dependencies) -> let wf = F.lhs fusion in let set = try WFMap.find wf map with Not_found -> WFTSet.empty in WFMap.add wf (WFTSet.add dependencies set) map) WFMap.empty fusions in let multiplicity_map = WFMap.fold (fun wf dependencies acc -> let cardinal = WFTSet.cardinal dependencies in if cardinal <= 1 then acc else WFMap.add wf cardinal acc) duplicates WFMap.empty and dictionary_map = WFMap.fold (fun wf dependencies acc -> let cardinal = WFTSet.cardinal dependencies in if cardinal <= 1 then acc else snd (WFTSet.fold (fun dependency (i', acc') -> (succ i', WFMap2.add (wf, dependency) i' acc')) dependencies (1, acc))) duplicates WFMap2.empty in let multiplicity wf = WFMap.find wf multiplicity_map and dictionary amplitude wf = WFMap2.find (wf, F.dependencies amplitude wf) dictionary_map in (multiplicity, dictionary) let eliminate_common_fusions1 seen_wfs amplitude = List.fold_left (fun (seen, acc) f -> let wf = F.lhs f in let dependencies = F.dependencies amplitude wf in if WFSet2.mem (wf, dependencies) seen then (seen, acc) else (WFSet2.add (wf, dependencies) seen, (f, amplitude) :: acc)) seen_wfs (F.fusions amplitude) let eliminate_common_fusions processes = let _, rev_fusions = List.fold_left eliminate_common_fusions1 (WFSet2.empty, []) processes in List.rev rev_fusions (*i let eliminate_common_fusions processes = ThoList.flatmap (fun amplitude -> (List.map (fun f -> (f, amplitude)) (F.fusions amplitude))) processes i*) (* \thocwmodulesubsection{Calculate All The Amplitudes} *) let amplitudes goldstones unphysical exclusions select_wf processes = (* \begin{dubious} Eventually, we might want to support inhomogeneous helicities. However, this makes little physics sense for external particles on the mass shell, unless we have a model with degenerate massive fermions and bosons. \end{dubious} *) if not (ThoList.homogeneous (List.map hs_of_flavors processes)) then invalid_arg "Fusion.Multi.amplitudes: incompatible helicities"; let unique_uncolored_processes = Proc.remove_duplicate_final_states (C.partition select_wf) processes in let progress = match !progress_option with | Quiet -> Progress.dummy | Channel oc -> Progress.channel oc (count_processes unique_uncolored_processes) | File name -> Progress.file name (count_processes unique_uncolored_processes) in let allowed = ThoList.flatmap (fun (fi, fo) -> Progress.begin_step progress (process_to_string fi fo); let amps = F.amplitudes goldstones exclusions select_wf fi fo in begin match amps with | [] -> Progress.end_step progress "forbidden" | _ -> Progress.end_step progress "allowed" end; amps) unique_uncolored_processes in Progress.summary progress "all processes done"; let color_flows = ThoList.uniq (List.sort compare (List.map color_flow allowed)) and flavors = ThoList.uniq (List.sort compare (List.map process_sans_color allowed)) in let vanishing_flavors = Proc.diff processes flavors in let helicities = helicity_table unphysical flavors in let f_index = fst (List.fold_left (fun (m, i) f -> (FMap.add f i m, succ i)) (FMap.empty, 0) flavors) and c_index = fst (List.fold_left (fun (m, i) c -> (CMap.add c i m, succ i)) (CMap.empty, 0) color_flows) in let table = Array.make_matrix (List.length flavors) (List.length color_flows) None in List.iter (fun a -> let f = FMap.find (process_sans_color a) f_index and c = CMap.find (color_flow a) c_index in table.(f).(c) <- Some (a)) allowed; let cf_array = Array.of_list color_flows in let ncf = Array.length cf_array in let color_factor_table = Array.make_matrix ncf ncf Color.Flow.zero in for i = 0 to pred ncf do for j = 0 to i do color_factor_table.(i).(j) <- Color.Flow.factor cf_array.(i) cf_array.(j); color_factor_table.(j).(i) <- color_factor_table.(i).(j) done done; let fusions = eliminate_common_fusions allowed and multiplicity, dictionary = disambiguate_fusions allowed in { flavors = flavors; vanishing_flavors = vanishing_flavors; color_flows = color_flows; helicities = helicities; processes = allowed; process_table = table; fusions = fusions; multiplicity = multiplicity; dictionary = dictionary; color_factors = color_factor_table; constraints = C.description select_wf } let initialize_cache = F.initialize_cache let set_cache_name = F.set_cache_name let empty = { flavors = []; vanishing_flavors = []; color_flows = []; helicities = []; processes = []; process_table = Array.make_matrix 0 0 None; fusions = []; multiplicity = (fun _ -> 1); dictionary = (fun _ _ -> 1); color_factors = Array.make_matrix 0 0 Color.Flow.zero; constraints = None } end Index: trunk/omega/src/colorize.ml =================================================================== --- trunk/omega/src/colorize.ml (revision 8415) +++ trunk/omega/src/colorize.ml (revision 8416) @@ -1,1839 +1,1841 @@ (* colorize.ml -- Copyright (C) 1999-2020 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner Marco Sekulla So Young Shim WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Auxiliary functions} *) (* \thocwmodulesubsection{Exceptions} *) let incomplete s = failwith ("Colorize." ^ s ^ " not done yet!") let invalid s = invalid_arg ("Colorize." ^ s ^ " must not be evaluated!") let impossible s = invalid_arg ("Colorize." ^ s ^ " can't happen! (but just did ...)") let mismatch s = invalid_arg ("Colorize." ^ s ^ " mismatch of representations!") let su0 s = invalid_arg ("Colorize." ^ s ^ ": found SU(0)!") let colored_vertex s = invalid_arg ("Colorize." ^ s ^ ": colored vertex!") let baryonic_vertex s = invalid_arg ("Colorize." ^ s ^ ": baryonic (i.e. eps_ijk) vertices not supported yet!") let color_flow_ambiguous s = invalid_arg ("Colorize." ^ s ^ ": ambiguous color flow!") let color_flow_of_string s = let c = int_of_string s in if c < 1 then invalid_arg ("Colorize." ^ s ^ ": color flow # < 1!") else c (* \thocwmodulesubsection{Multiplying Vertices by a Constant Factor} *) module Q = Algebra.Q module QC = Algebra.QC let of_int n = QC.make (Q.make n 1) Q.null let integer z = if Q.is_null (QC.imag z) then let x = QC.real z in try Some (Q.to_integer x) with | _ -> None else None let mult_vertex3 x v = let open Coupling in match v with | FBF (c, fb, coup, f) -> FBF ((x * c), fb, coup, f) | PBP (c, fb, coup, f) -> PBP ((x * c), fb, coup, f) | BBB (c, fb, coup, f) -> BBB ((x * c), fb, coup, f) | GBG (c, fb, coup, f) -> GBG ((x * c), fb, coup, f) | Gauge_Gauge_Gauge c -> Gauge_Gauge_Gauge (x * c) | I_Gauge_Gauge_Gauge c -> I_Gauge_Gauge_Gauge (x * c) | Aux_Gauge_Gauge c -> Aux_Gauge_Gauge (x * c) | Scalar_Vector_Vector c -> Scalar_Vector_Vector (x * c) | Aux_Vector_Vector c -> Aux_Vector_Vector (x * c) | Aux_Scalar_Vector c -> Aux_Scalar_Vector (x * c) | Scalar_Scalar_Scalar c -> Scalar_Scalar_Scalar (x * c) | Aux_Scalar_Scalar c -> Aux_Scalar_Scalar (x * c) | Vector_Scalar_Scalar c -> Vector_Scalar_Scalar (x * c) | Graviton_Scalar_Scalar c -> Graviton_Scalar_Scalar (x * c) | Graviton_Vector_Vector c -> Graviton_Vector_Vector (x * c) | Graviton_Spinor_Spinor c -> Graviton_Spinor_Spinor (x * c) | Dim4_Vector_Vector_Vector_T c -> Dim4_Vector_Vector_Vector_T (x * c) | Dim4_Vector_Vector_Vector_L c -> Dim4_Vector_Vector_Vector_L (x * c) | Dim4_Vector_Vector_Vector_T5 c -> Dim4_Vector_Vector_Vector_T5 (x * c) | Dim4_Vector_Vector_Vector_L5 c -> Dim4_Vector_Vector_Vector_L5 (x * c) | Dim6_Gauge_Gauge_Gauge c -> Dim6_Gauge_Gauge_Gauge (x * c) | Dim6_Gauge_Gauge_Gauge_5 c -> Dim6_Gauge_Gauge_Gauge_5 (x * c) | Aux_DScalar_DScalar c -> Aux_DScalar_DScalar (x * c) | Aux_Vector_DScalar c -> Aux_Vector_DScalar (x * c) | Dim5_Scalar_Gauge2 c -> Dim5_Scalar_Gauge2 (x * c) | Dim5_Scalar_Gauge2_Skew c -> Dim5_Scalar_Gauge2_Skew (x * c) | Dim5_Scalar_Vector_Vector_T c -> Dim5_Scalar_Vector_Vector_T (x * c) | Dim5_Scalar_Vector_Vector_U c -> Dim5_Scalar_Vector_Vector_U (x * c) | Dim5_Scalar_Vector_Vector_TU c -> Dim5_Scalar_Vector_Vector_TU (x * c) | Dim5_Scalar_Scalar2 c -> Dim5_Scalar_Scalar2 (x * c) | Scalar_Vector_Vector_t c -> Scalar_Vector_Vector_t (x * c) | Dim6_Vector_Vector_Vector_T c -> Dim6_Vector_Vector_Vector_T (x * c) | Tensor_2_Vector_Vector c -> Tensor_2_Vector_Vector (x * c) | Tensor_2_Vector_Vector_cf c -> Tensor_2_Vector_Vector_cf (x * c) | Tensor_2_Scalar_Scalar c -> Tensor_2_Scalar_Scalar (x * c) | Tensor_2_Scalar_Scalar_cf c -> Tensor_2_Scalar_Scalar_cf (x * c) | Tensor_2_Vector_Vector_1 c -> Tensor_2_Vector_Vector_1 (x * c) | Tensor_2_Vector_Vector_t c -> Tensor_2_Vector_Vector_t (x * c) | Dim5_Tensor_2_Vector_Vector_1 c -> Dim5_Tensor_2_Vector_Vector_1 (x * c) | Dim5_Tensor_2_Vector_Vector_2 c -> Dim5_Tensor_2_Vector_Vector_2 (x * c) | TensorVector_Vector_Vector c -> TensorVector_Vector_Vector (x * c) | TensorVector_Vector_Vector_cf c -> TensorVector_Vector_Vector_cf (x * c) | TensorVector_Scalar_Scalar c -> TensorVector_Scalar_Scalar (x * c) | TensorVector_Scalar_Scalar_cf c -> TensorVector_Scalar_Scalar_cf (x * c) | TensorScalar_Vector_Vector c -> TensorScalar_Vector_Vector (x * c) | TensorScalar_Vector_Vector_cf c -> TensorScalar_Vector_Vector_cf (x * c) | TensorScalar_Scalar_Scalar c -> TensorScalar_Scalar_Scalar (x * c) | TensorScalar_Scalar_Scalar_cf c -> TensorScalar_Scalar_Scalar_cf (x * c) | Dim7_Tensor_2_Vector_Vector_T c -> Dim7_Tensor_2_Vector_Vector_T (x * c) | Dim6_Scalar_Vector_Vector_D c -> Dim6_Scalar_Vector_Vector_D (x * c) | Dim6_Scalar_Vector_Vector_DP c -> Dim6_Scalar_Vector_Vector_DP (x * c) | Dim6_HAZ_D c -> Dim6_HAZ_D (x * c) | Dim6_HAZ_DP c -> Dim6_HAZ_DP (x * c) | Gauge_Gauge_Gauge_i c -> Gauge_Gauge_Gauge_i (x * c) | Dim6_GGG c -> Dim6_GGG (x * c) | Dim6_AWW_DP c -> Dim6_AWW_DP (x *c) | Dim6_AWW_DW c -> Dim6_AWW_DW (x * c) | Dim6_Gauge_Gauge_Gauge_i c -> Dim6_Gauge_Gauge_Gauge_i (x * c) | Dim6_HHH c -> Dim6_HHH (x * c) | Dim6_WWZ_DPWDW c -> Dim6_WWZ_DPWDW (x * c) | Dim6_WWZ_DW c -> Dim6_WWZ_DW (x * c) | Dim6_WWZ_D c -> Dim6_WWZ_D (x * c) let cmult_vertex3 z v = match integer z with | None -> invalid_arg "cmult_vertex3" | Some x -> mult_vertex3 x v let mult_vertex4 x v = let open Coupling in match v with | Scalar4 c -> Scalar4 (x * c) | Scalar2_Vector2 c -> Scalar2_Vector2 (x * c) | Vector4 ic4_list -> Vector4 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | DScalar4 ic4_list -> DScalar4 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | DScalar2_Vector2 ic4_list -> DScalar2_Vector2 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | GBBG (c, fb, b2, f) -> GBBG ((x * c), fb, b2, f) | Vector4_K_Matrix_tho (c, ic4_list) -> Vector4_K_Matrix_tho ((x * c), ic4_list) | Vector4_K_Matrix_jr (c, ch2_list) -> Vector4_K_Matrix_jr ((x * c), ch2_list) | Vector4_K_Matrix_cf_t0 (c, ch2_list) -> Vector4_K_Matrix_cf_t0 ((x * c), ch2_list) | Vector4_K_Matrix_cf_t1 (c, ch2_list) -> Vector4_K_Matrix_cf_t1 ((x * c), ch2_list) | Vector4_K_Matrix_cf_t2 (c, ch2_list) -> Vector4_K_Matrix_cf_t2 ((x * c), ch2_list) | Vector4_K_Matrix_cf_t_rsi (c, ch2_list) -> Vector4_K_Matrix_cf_t_rsi ((x * c), ch2_list) | Vector4_K_Matrix_cf_m0 (c, ch2_list) -> Vector4_K_Matrix_cf_m0 ((x * c), ch2_list) | Vector4_K_Matrix_cf_m1 (c, ch2_list) -> Vector4_K_Matrix_cf_m1 ((x * c), ch2_list) | Vector4_K_Matrix_cf_m7 (c, ch2_list) -> Vector4_K_Matrix_cf_m7 ((x * c), ch2_list) | DScalar2_Vector2_K_Matrix_ms (c, ch2_list) -> DScalar2_Vector2_K_Matrix_ms ((x * c), ch2_list) | DScalar2_Vector2_m_0_K_Matrix_cf (c, ch2_list) -> DScalar2_Vector2_m_0_K_Matrix_cf ((x * c), ch2_list) | DScalar2_Vector2_m_1_K_Matrix_cf (c, ch2_list) -> DScalar2_Vector2_m_1_K_Matrix_cf ((x * c), ch2_list) | DScalar2_Vector2_m_7_K_Matrix_cf (c, ch2_list) -> DScalar2_Vector2_m_7_K_Matrix_cf ((x * c), ch2_list) | DScalar4_K_Matrix_ms (c, ch2_list) -> DScalar4_K_Matrix_ms ((x * c), ch2_list) | Dim8_Scalar2_Vector2_1 c -> Dim8_Scalar2_Vector2_1 (x * c) | Dim8_Scalar2_Vector2_2 c -> Dim8_Scalar2_Vector2_1 (x * c) | Dim8_Scalar2_Vector2_m_0 c -> Dim8_Scalar2_Vector2_m_0 (x * c) | Dim8_Scalar2_Vector2_m_1 c -> Dim8_Scalar2_Vector2_m_1 (x * c) | Dim8_Scalar2_Vector2_m_7 c -> Dim8_Scalar2_Vector2_m_7 (x * c) | Dim8_Scalar4 c -> Dim8_Scalar4 (x * c) | Dim8_Vector4_t_0 ic4_list -> Dim8_Vector4_t_0 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | Dim8_Vector4_t_1 ic4_list -> Dim8_Vector4_t_1 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | Dim8_Vector4_t_2 ic4_list -> Dim8_Vector4_t_2 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | Dim8_Vector4_m_0 ic4_list -> Dim8_Vector4_m_0 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | Dim8_Vector4_m_1 ic4_list -> Dim8_Vector4_m_1 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | Dim8_Vector4_m_7 ic4_list -> Dim8_Vector4_m_7 (List.map (fun (c, icl) -> (x * c, icl)) ic4_list) | Dim6_H4_P2 c -> Dim6_H4_P2 (x * c) | Dim6_AHWW_DPB c -> Dim6_AHWW_DPB (x * c) | Dim6_AHWW_DPW c -> Dim6_AHWW_DPW (x * c) | Dim6_AHWW_DW c -> Dim6_AHWW_DW (x * c) | Dim6_Vector4_DW c -> Dim6_Vector4_DW (x * c) | Dim6_Vector4_W c -> Dim6_Vector4_W (x * c) | Dim6_Scalar2_Vector2_PB c -> Dim6_Scalar2_Vector2_PB (x * c) | Dim6_Scalar2_Vector2_D c -> Dim6_Scalar2_Vector2_D (x * c) | Dim6_Scalar2_Vector2_DP c -> Dim6_Scalar2_Vector2_DP (x * c) | Dim6_HHZZ_T c -> Dim6_HHZZ_T (x * c) | Dim6_HWWZ_DW c -> Dim6_HWWZ_DW (x * c) | Dim6_HWWZ_DPB c -> Dim6_HWWZ_DPB (x * c) | Dim6_HWWZ_DDPW c -> Dim6_HWWZ_DDPW (x * c) | Dim6_HWWZ_DPW c -> Dim6_HWWZ_DPW (x * c) | Dim6_AHHZ_D c -> Dim6_AHHZ_D (x * c) | Dim6_AHHZ_DP c -> Dim6_AHHZ_DP (x * c) | Dim6_AHHZ_PB c -> Dim6_AHHZ_PB (x * c) let cmult_vertex4 z v = match integer z with | None -> invalid_arg "cmult_vertex4" | Some x -> mult_vertex4 x v let mult_vertexn x = function | _ -> incomplete "mult_vertexn" let cmult_vertexn z v = let open Coupling in match v with | UFO (c, v, s, fl, col) -> UFO (QC.mul z c, v, s, fl, col) let mult_vertex x v = let open Coupling in match v with | V3 (v, fuse, c) -> V3 (mult_vertex3 x v, fuse, c) | V4 (v, fuse, c) -> V4 (mult_vertex4 x v, fuse, c) | Vn (v, fuse, c) -> Vn (mult_vertexn x v, fuse, c) let cmult_vertex z v = let open Coupling in match v with | V3 (v, fuse, c) -> V3 (cmult_vertex3 z v, fuse, c) | V4 (v, fuse, c) -> V4 (cmult_vertex4 z v, fuse, c) | Vn (v, fuse, c) -> Vn (cmult_vertexn z v, fuse, c) (* \thocwmodulesection{Flavors Adorned with Colorflows} *) module Flavor (M : Model.T) = struct type cf_in = int type cf_out = int type t = | White of M.flavor | CF_in of M.flavor * cf_in | CF_out of M.flavor * cf_out | CF_io of M.flavor * cf_in * cf_out | CF_aux of M.flavor let flavor_sans_color = function | White f -> f | CF_in (f, _) -> f | CF_out (f, _) -> f | CF_io (f, _, _) -> f | CF_aux f -> f let pullback f arg1 = f (flavor_sans_color arg1) end (* \thocwmodulesection{The Legacy Implementation} *) module Legacy_Implementation (M : Model.T) = struct module C = Color module Colored_Flavor = Flavor(M) open Colored_Flavor open Coupling let nc = M.nc (* \thocwmodulesubsection{Auxiliary functions} *) (* Below, we will need to permute Lorentz structures. The following permutes the three possible contractions of four vectors. We permute the first three indices, as they correspond to the particles entering the fusion. *) type permutation4 = | P123 | P231 | P312 | P213 | P321 | P132 let permute_contract4 = function | P123 -> begin function | C_12_34 -> C_12_34 | C_13_42 -> C_13_42 | C_14_23 -> C_14_23 end | P231 -> begin function | C_12_34 -> C_14_23 | C_13_42 -> C_12_34 | C_14_23 -> C_13_42 end | P312 -> begin function | C_12_34 -> C_13_42 | C_13_42 -> C_14_23 | C_14_23 -> C_12_34 end | P213 -> begin function | C_12_34 -> C_12_34 | C_13_42 -> C_14_23 | C_14_23 -> C_13_42 end | P321 -> begin function | C_12_34 -> C_14_23 | C_13_42 -> C_13_42 | C_14_23 -> C_12_34 end | P132 -> begin function | C_12_34 -> C_13_42 | C_13_42 -> C_12_34 | C_14_23 -> C_14_23 end let permute_contract4_list perm ic4_list = List.map (fun (i, c4) -> (i, permute_contract4 perm c4)) ic4_list let permute_vertex4' perm = function | Scalar4 c -> Scalar4 c | Vector4 ic4_list -> Vector4 (permute_contract4_list perm ic4_list) | Vector4_K_Matrix_jr (c, ic4_list) -> Vector4_K_Matrix_jr (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_t0 (c, ic4_list) -> Vector4_K_Matrix_cf_t0 (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_t1 (c, ic4_list) -> Vector4_K_Matrix_cf_t1 (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_t2 (c, ic4_list) -> Vector4_K_Matrix_cf_t2 (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_t_rsi (c, ic4_list) -> Vector4_K_Matrix_cf_t_rsi (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_m0 (c, ic4_list) -> Vector4_K_Matrix_cf_m0 (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_m1 (c, ic4_list) -> Vector4_K_Matrix_cf_m1 (c, permute_contract4_list perm ic4_list) | Vector4_K_Matrix_cf_m7 (c, ic4_list) -> Vector4_K_Matrix_cf_m7 (c, permute_contract4_list perm ic4_list) | DScalar2_Vector2_K_Matrix_ms (c, ic4_list) -> DScalar2_Vector2_K_Matrix_ms (c, permute_contract4_list perm ic4_list) | DScalar2_Vector2_m_0_K_Matrix_cf (c, ic4_list) -> DScalar2_Vector2_m_0_K_Matrix_cf (c, permute_contract4_list perm ic4_list) | DScalar2_Vector2_m_1_K_Matrix_cf (c, ic4_list) -> DScalar2_Vector2_m_1_K_Matrix_cf (c, permute_contract4_list perm ic4_list) | DScalar2_Vector2_m_7_K_Matrix_cf (c, ic4_list) -> DScalar2_Vector2_m_7_K_Matrix_cf (c, permute_contract4_list perm ic4_list) | DScalar4_K_Matrix_ms (c, ic4_list) -> DScalar4_K_Matrix_ms (c, permute_contract4_list perm ic4_list) | Scalar2_Vector2 c -> incomplete "permute_vertex4' Scalar2_Vector2" | DScalar4 ic4_list -> incomplete "permute_vertex4' DScalar4" | DScalar2_Vector2 ic4_list -> incomplete "permute_vertex4' DScalar2_Vector2" | GBBG (c, fb, b2, f) -> incomplete "permute_vertex4' GBBG" | Vector4_K_Matrix_tho (c, ch2_list) -> incomplete "permute_vertex4' Vector4_K_Matrix_tho" | Dim8_Scalar2_Vector2_1 ic4_list -> incomplete "permute_vertex4' Dim8_Scalar2_Vector2_1" | Dim8_Scalar2_Vector2_2 ic4_list -> incomplete "permute_vertex4' Dim8_Scalar2_Vector2_2" | Dim8_Scalar2_Vector2_m_0 ic4_list -> incomplete "permute_vertex4' Dim8_Scalar2_Vector2_m_0" | Dim8_Scalar2_Vector2_m_1 ic4_list -> incomplete "permute_vertex4' Dim8_Scalar2_Vector2_m_1" | Dim8_Scalar2_Vector2_m_7 ic4_list -> incomplete "permute_vertex4' Dim8_Scalar2_Vector2_m_7" | Dim8_Scalar4 ic4_list -> incomplete "permute_vertex4' Dim8_Scalar4" | Dim8_Vector4_t_0 ic4_list -> incomplete "permute_vertex4' Dim8_Vector4_t_0" | Dim8_Vector4_t_1 ic4_list -> incomplete "permute_vertex4' Dim8_Vector4_t_1" | Dim8_Vector4_t_2 ic4_list -> incomplete "permute_vertex4' Dim8_Vector4_t_2" | Dim8_Vector4_m_0 ic4_list -> incomplete "permute_vertex4' Dim8_Vector4_m_0" | Dim8_Vector4_m_1 ic4_list -> incomplete "permute_vertex4' Dim8_Vector4_m_1" | Dim8_Vector4_m_7 ic4_list -> incomplete "permute_vertex4' Dim8_Vector4_m_7" | Dim6_H4_P2 ic4_list -> incomplete "permute_vertex4' Dim6_H4_P2" | Dim6_AHWW_DPB ic4_list -> incomplete "permute_vertex4' Dim6_AHWW_DPB" | Dim6_AHWW_DPW ic4_list -> incomplete "permute_vertex4' Dim6_AHWW_DPW" | Dim6_AHWW_DW ic4_list -> incomplete "permute_vertex4' Dim6_AHWW_DW" | Dim6_Vector4_DW ic4_list -> incomplete "permute_vertex4' Dim6_Vector4_DW" | Dim6_Vector4_W ic4_list -> incomplete "permute_vertex4' Dim6_Vector4_W" | Dim6_Scalar2_Vector2_D ic4_list -> incomplete "permute_vertex4' Dim6_Scalar2_Vector2_D" | Dim6_Scalar2_Vector2_DP ic4_list -> incomplete "permute_vertex4' Dim6_Scalar2_Vector2_DP" | Dim6_Scalar2_Vector2_PB ic4_list -> incomplete "permute_vertex4' Dim6_Scalar2_Vector2_PB" | Dim6_HHZZ_T ic4_list -> incomplete "permute_vertex4' Dim6_HHZZ_T" | Dim6_HWWZ_DW ic4_list -> incomplete "permute_vertex4' Dim6_HWWZ_DW" | Dim6_HWWZ_DPB ic4_list -> incomplete "permute_vertex4' Dim6_HWWZ_DPB" | Dim6_HWWZ_DDPW ic4_list -> incomplete "permute_vertex4' Dim6_HWWZ_DDPW" | Dim6_HWWZ_DPW ic4_list -> incomplete "permute_vertex4' Dim6_HWWZ_DPW" | Dim6_AHHZ_D ic4_list -> incomplete "permute_vertex4' Dim6_AHHZ_D" | Dim6_AHHZ_DP ic4_list -> incomplete "permute_vertex4' Dim6_AHHZ_DP" | Dim6_AHHZ_PB ic4_list -> incomplete "permute_vertex4' Dim6_AHHZ_PB" let permute_vertex4 perm = function | V3 (v, fuse, c) -> V3 (v, fuse, c) | V4 (v, fuse, c) -> V4 (permute_vertex4' perm v, fuse, c) | Vn (v, fuse, c) -> Vn (v, fuse, c) (* \thocwmodulesubsection{Cubic Vertices} *) (* \begin{dubious} The following pattern matches could eventually become quite long. The O'Caml compiler will (hopefully) optimize them aggressively (\url{http://pauillac.inria.fr/~maranget/papers/opat/}). \end{dubious} *) let colorize_fusion2 f1 f2 (f, v) = match M.color f with | C.Singlet -> begin match f1, f2 with | White _, White _ -> [White f, v] | CF_in (_, c1), CF_out (_, c2') | CF_out (_, c1), CF_in (_, c2') -> if c1 = c2' then [White f, v] else [] | CF_io (f1, c1, c1'), CF_io (f2, c2, c2') -> if c1 = c2' && c2 = c1' then [White f, v] else [] | CF_aux f1, CF_aux f2 -> [White f, mult_vertex (- (nc ())) v] | CF_aux _, CF_io _ | CF_io _, CF_aux _ -> [] | (CF_in _ | CF_out _ | CF_io _ | CF_aux _), White _ | White _, (CF_in _ | CF_out _ | CF_io _ | CF_aux _) | (CF_io _ | CF_aux _), (CF_in _ | CF_out _) | (CF_in _ | CF_out _), (CF_io _ | CF_aux _) | CF_in _, CF_in _ | CF_out _, CF_out _ -> colored_vertex "colorize_fusion2" end | C.SUN nc1 -> begin match f1, f2 with | CF_in (_, c1), (White _ | CF_aux _) | (White _ | CF_aux _), CF_in (_, c1) -> if nc1 > 0 then [CF_in (f, c1), v] else colored_vertex "colorize_fusion2" | CF_out (_, c1'), (White _ | CF_aux _) | (White _ | CF_aux _), CF_out (_, c1') -> if nc1 < 0 then [CF_out (f, c1'), v] else colored_vertex "colorize_fusion2" | CF_in (_, c1), CF_io (_, c2, c2') | CF_io (_, c2, c2'), CF_in (_, c1) -> if nc1 > 0 then begin if c1 = c2' then [CF_in (f, c2), v] else [] end else colored_vertex "colorize_fusion2" | CF_out (_, c1'), CF_io (_, c2, c2') | CF_io (_, c2, c2'), CF_out (_, c1') -> if nc1 < 0 then begin if c1' = c2 then [CF_out (f, c2'), v] else [] end else colored_vertex "colorize_fusion2" | CF_in _, CF_in _ -> if nc1 > 0 then baryonic_vertex "colorize_fusion2" else colored_vertex "colorize_fusion2" | CF_out _, CF_out _ -> if nc1 < 0 then baryonic_vertex "colorize_fusion2" else colored_vertex "colorize_fusion2" | CF_in _, CF_out _ | CF_out _, CF_in _ | (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _) -> colored_vertex "colorize_fusion2" end | C.AdjSUN _ -> begin match f1, f2 with | White _, CF_io (_, c1, c2') | CF_io (_, c1, c2'), White _ -> [CF_io (f, c1, c2'), v] | White _, CF_aux _ | CF_aux _, White _ -> [CF_aux f, mult_vertex (- (nc ())) v] | CF_in (_, c1), CF_out (_, c2') | CF_out (_, c2'), CF_in (_, c1) -> if c1 <> c2' then [CF_io (f, c1, c2'), v] else [CF_aux f, v] (* In the adjoint representation \begin{subequations} \begin{equation} \parbox{28mm}{\fmfframe(2,2)(2,1){\begin{fmfgraph*}(24,24) \fmfsurround{d1,e1,d2,e2,d3,e3} \fmf{gluon}{v,e1} \fmf{gluon}{v,e2} \fmf{gluon}{v,e3} \fmflabel{1}{e1} \fmflabel{2}{e2} \fmflabel{3}{e3} \fmfdot{v} \fmffreeze \fmf{warrow_right}{v,e1} \fmf{warrow_right}{v,e2} \fmf{warrow_right}{v,e3} \end{fmfgraph*}}} \,= %begin{split} g f_{a_1a_2a_3} C^{\mu_1\mu_2\mu_3} (k_1,k_2,k_3) %end{split} \end{equation} with \begin{multline} \label{eq:C123} C^{\mu_1\mu_2\mu_3}(k_1,k_2,k_3) = \\ ( g^{\mu_1\mu_2} (k_1^{\mu_3}-k_2^{\mu_3}) + g^{\mu_2\mu_3} (k_2^{\mu_1}-k_3^{\mu_1}) + g^{\mu_3\mu_1} (k_3^{\mu_2}-k_1^{\mu_2}) ) \end{multline} \end{subequations} while in the color flow basis find from \begin{equation} \label{eq:f=tr(TTT)} \ii f_{a_1a_2a_3} = \tr\left(T_{a_1}\left\lbrack T_{a_2},T_{a_3}\right\rbrack\right) = \tr\left(T_{a_1}T_{a_2}T_{a_3}\right) - \tr\left(T_{a_1}T_{a_3}T_{a_2}\right) \end{equation} the decomposition \begin{equation} \label{eq:fTTT} \ii f_{a_1a_2a_3} T_{a_1}^{i_1j_1}T_{a_2}^{i_2j_2}T_{a_3}^{i_3j_3} = \delta^{i_1j_2}\delta^{i_2j_3}\delta^{i_3j_1} - \delta^{i_1j_3}\delta^{i_3j_2}\delta^{i_2j_1}\,. \end{equation} The resulting Feynman rule is \begin{equation} \parbox{28mm}{\fmfframe(2,2)(2,1){\begin{fmfgraph*}(24,24) \fmfsurround{d1,e1,d2,e2,d3,e3} \fmf{phantom}{v,e1} \fmf{phantom}{v,e2} \fmf{phantom}{v,e3} \fmflabel{1}{e1} \fmflabel{2}{e2} \fmflabel{3}{e3} \fmffreeze \fmfi{phantom_arrow}{(reverse vpath (__e1, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e2, __v) sideways -thick)} \fmfi{phantom_arrow}{(reverse vpath (__e2, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e3, __v) sideways -thick)} \fmfi{phantom_arrow}{(reverse vpath (__e3, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e1, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e1, __v) sideways -thick) join ( vpath (__e2, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e2, __v) sideways -thick) join ( vpath (__e3, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e3, __v) sideways -thick) join ( vpath (__e1, __v) sideways -thick)} \end{fmfgraph*}}} \,= \ii g \left( \delta^{i_1j_3}\delta^{i_2j_1}\delta^{i_3j_2} - \delta^{i_1j_2}\delta^{i_2j_3}\delta^{i_3j_1} \right) C^{\mu_1\mu_2\mu_3} (k_1,k_2,k_3) \end{equation} *) (* \begin{dubious} We have to generalize this for cases of three particles in the adjoint that are not all gluons (gluinos, scalar octets): \begin{itemize} \item scalar-scalar-scalar \item scalar-scalar-vector \item scalar-vector-vector \item scalar-fermion-fermion \item vector-fermion-fermion \end{itemize} \end{dubious} *) (* \begin{dubious} We could use a better understanding of the signs for the gaugino-gaugino-gaugeboson couplings!!! \end{dubious} *) | CF_io (f1, c1, c1'), CF_io (f2, c2, c2') -> let phase = begin match v with | V3 (Gauge_Gauge_Gauge _, _, _) | V3 (I_Gauge_Gauge_Gauge _, _, _) | V3 (Aux_Gauge_Gauge _, _, _) -> of_int 1 | V3 (FBF (_, _, _, _), fuse2, _) -> begin match fuse2 with | F12 -> of_int 1 (* works, needs underpinning *) | F21 -> of_int (-1) (* dto. *) | F31 -> of_int 1 (* dto. *) | F32 -> of_int (-1) (* transposition of [F12] *) | F23 -> of_int 1 (* transposition of [F21] *) | F13 -> of_int (-1) (* transposition of [F12] *) end | V3 _ -> incomplete "colorize_fusion2 (V3 _)" | V4 _ -> impossible "colorize_fusion2 (V4 _)" | Vn _ -> impossible "colorize_fusion2 (Vn _)" end in if c1' = c2 then [CF_io (f, c1, c2'), cmult_vertex (QC.neg phase) v] else if c2' = c1 then [CF_io (f, c2, c1'), cmult_vertex ( phase) v] else [] | CF_aux _ , CF_io _ | CF_io _ , CF_aux _ | CF_aux _ , CF_aux _ -> [] | White _, White _ | (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _) | (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _) | CF_in _, CF_in _ | CF_out _, CF_out _ -> colored_vertex "colorize_fusion2" end (* \thocwmodulesubsection{Quartic Vertices} *) let colorize_fusion3 f1 f2 f3 (f, v) = match M.color f with | C.Singlet -> begin match f1, f2, f3 with | White _, White _, White _ -> [White f, v] | (White _ | CF_aux _), CF_in (_, c1), CF_out (_, c2') | (White _ | CF_aux _), CF_out (_, c1), CF_in (_, c2') | CF_in (_, c1), (White _ | CF_aux _), CF_out (_, c2') | CF_out (_, c1), (White _ | CF_aux _), CF_in (_, c2') | CF_in (_, c1), CF_out (_, c2'), (White _ | CF_aux _) | CF_out (_, c1), CF_in (_, c2'), (White _ | CF_aux _) -> if c1 = c2' then [White f, v] else [] | White _, CF_io (_, c1, c1'), CF_io (_, c2, c2') | CF_io (_, c1, c1'), White _, CF_io (_, c2, c2') | CF_io (_, c1, c1'), CF_io (_, c2, c2'), White _ -> if c1 = c2' && c2 = c1' then [White f, v] else [] | White _, CF_aux _, CF_aux _ | CF_aux _, White _, CF_aux _ | CF_aux _, CF_aux _, White _ -> [White f, mult_vertex (- (nc ())) v] | White _, CF_io _, CF_aux _ | White _, CF_aux _, CF_io _ | CF_io _, White _, CF_aux _ | CF_aux _, White _, CF_io _ | CF_io _, CF_aux _, White _ | CF_aux _, CF_io _, White _ -> [] | CF_io (_, c1, c1'), CF_in (_, c2), CF_out (_, c3') | CF_io (_, c1, c1'), CF_out (_, c3'), CF_in (_, c2) | CF_in (_, c2), CF_io (_, c1, c1'), CF_out (_, c3') | CF_out (_, c3'), CF_io (_, c1, c1'), CF_in (_, c2) | CF_in (_, c2), CF_out (_, c3'), CF_io (_, c1, c1') | CF_out (_, c3'), CF_in (_, c2), CF_io (_, c1, c1') -> if c1 = c3' && c1' = c2 then [White f, v] else [] | CF_io (_, c1, c1'), CF_io (_, c2, c2'), CF_io (_, c3, c3') -> if c1' = c2 && c2' = c3 && c3' = c1 then [White f, mult_vertex (-1) v] else if c1' = c3 && c2' = c1 && c3' = c2 then [White f, mult_vertex ( 1) v] else [] | CF_io _, CF_io _, CF_aux _ | CF_io _, CF_aux _, CF_io _ | CF_aux _, CF_io _, CF_io _ | CF_io _, CF_aux _, CF_aux _ | CF_aux _, CF_io _, CF_aux _ | CF_aux _, CF_aux _, CF_io _ | CF_aux _, CF_aux _, CF_aux _ -> [] | CF_in _, CF_in _, CF_in _ | CF_out _, CF_out _, CF_out _ -> baryonic_vertex "colorize_fusion3" | CF_in _, CF_in _, CF_out _ | CF_in _, CF_out _, CF_in _ | CF_out _, CF_in _, CF_in _ | CF_in _, CF_out _, CF_out _ | CF_out _, CF_in _, CF_out _ | CF_out _, CF_out _, CF_in _ | White _, White _, (CF_io _ | CF_aux _) | White _, (CF_io _ | CF_aux _), White _ | (CF_io _ | CF_aux _), White _, White _ | (White _ | CF_io _ | CF_aux _), CF_in _, CF_in _ | CF_in _, (White _ | CF_io _ | CF_aux _), CF_in _ | CF_in _, CF_in _, (White _ | CF_io _ | CF_aux _) | (White _ | CF_io _ | CF_aux _), CF_out _, CF_out _ | CF_out _, (White _ | CF_io _ | CF_aux _), CF_out _ | CF_out _, CF_out _, (White _ | CF_io _ | CF_aux _) | (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _) | (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _) | (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _) -> colored_vertex "colorize_fusion3" end | C.SUN nc1 -> begin match f1, f2, f3 with | CF_in (_, c1), CF_io (_, c2, c2'), CF_io (_, c3, c3') | CF_io (_, c2, c2'), CF_in (_, c1), CF_io (_, c3, c3') | CF_io (_, c2, c2'), CF_io (_, c3, c3'), CF_in (_, c1) -> if nc1 > 0 then if c1 = c2' && c2 = c3' then [CF_in (f, c3), v] else if c1 = c3' && c3 = c2' then [CF_in (f, c2), v] else [] else colored_vertex "colorize_fusion3" | CF_out (_, c1'), CF_io (_, c2, c2'), CF_io (_, c3, c3') | CF_io (_, c2, c2'), CF_out (_, c1'), CF_io (_, c3, c3') | CF_io (_, c2, c2'), CF_io (_, c3, c3'), CF_out (_, c1') -> if nc1 < 0 then if c1' = c2 && c2' = c3 then [CF_out (f, c3'), v] else if c1' = c3 && c3' = c2 then [CF_out (f, c2'), v] else [] else colored_vertex "colorize_fusion3" | CF_aux _, CF_in (_, c1), CF_io (_, c2, c2') | CF_aux _, CF_io (_, c2, c2'), CF_in (_, c1) | CF_in (_, c1), CF_aux _, CF_io (_, c2, c2') | CF_io (_, c2, c2'), CF_aux _, CF_in (_, c1) | CF_in (_, c1), CF_io (_, c2, c2'), CF_aux _ | CF_io (_, c2, c2'), CF_in (_, c1), CF_aux _ -> if nc1 > 0 then if c1 = c2' then [CF_in (f, c2), mult_vertex ( 2) v] else [] else colored_vertex "colorize_fusion3" | CF_aux _, CF_out (_, c1'), CF_io (_, c2, c2') | CF_aux _, CF_io (_, c2, c2'), CF_out (_, c1') | CF_out (_, c1'), CF_aux _, CF_io (_, c2, c2') | CF_io (_, c2, c2'), CF_aux _, CF_out (_, c1') | CF_out (_, c1'), CF_io (_, c2, c2'), CF_aux _ | CF_io (_, c2, c2'), CF_out (_, c1'), CF_aux _ -> if nc1 < 0 then if c1' = c2 then [CF_out (f, c2'), mult_vertex ( 2) v] else [] else colored_vertex "colorize_fusion3" | White _, CF_in (_, c1), CF_io (_, c2, c2') | White _, CF_io (_, c2, c2'), CF_in (_, c1) | CF_in (_, c1), White _, CF_io (_, c2, c2') | CF_io (_, c2, c2'), White _, CF_in (_, c1) | CF_in (_, c1), CF_io (_, c2, c2'), White _ | CF_io (_, c2, c2'), CF_in (_, c1), White _ -> if nc1 > 0 then if c1 = c2' then [CF_in (f, c2), v] else [] else colored_vertex "colorize_fusion3" | White _, CF_out (_, c1'), CF_io (_, c2, c2') | White _, CF_io (_, c2, c2'), CF_out (_, c1') | CF_out (_, c1'), White _, CF_io (_, c2, c2') | CF_io (_, c2, c2'), White _, CF_out (_, c1') | CF_out (_, c1'), CF_io (_, c2, c2'), White _ | CF_io (_, c2, c2'), CF_out (_, c1'), White _ -> if nc1 < 0 then if c2 = c1' then [CF_out (f, c2'), v] else [] else colored_vertex "colorize_fusion3" | CF_in (_, c1), CF_aux _, CF_aux _ | CF_aux _, CF_in (_, c1), CF_aux _ | CF_aux _, CF_aux _, CF_in (_, c1) -> if nc1 > 0 then [CF_in (f, c1), mult_vertex ( 2) v] else colored_vertex "colorize_fusion3" | CF_in (_, c1), CF_aux _, White _ | CF_in (_, c1), White _, CF_aux _ | CF_in (_, c1), White _, White _ | CF_aux _, CF_in (_, c1), White _ | White _, CF_in (_, c1), CF_aux _ | White _, CF_in (_, c1), White _ | CF_aux _, White _, CF_in (_, c1) | White _, CF_aux _, CF_in (_, c1) | White _, White _, CF_in (_, c1) -> if nc1 > 0 then [CF_in (f, c1), v] else colored_vertex "colorize_fusion3" | CF_out (_, c1'), CF_aux _, CF_aux _ | CF_aux _, CF_out (_, c1'), CF_aux _ | CF_aux _, CF_aux _, CF_out (_, c1') -> if nc1 < 0 then [CF_out (f, c1'), mult_vertex ( 2) v] else colored_vertex "colorize_fusion3" | CF_out (_, c1'), CF_aux _, White _ | CF_out (_, c1'), White _, CF_aux _ | CF_out (_, c1'), White _, White _ | CF_aux _, CF_out (_, c1'), White _ | White _, CF_out (_, c1'), CF_aux _ | White _, CF_out (_, c1'), White _ | CF_aux _, White _, CF_out (_, c1') | White _, CF_aux _, CF_out (_, c1') | White _, White _, CF_out (_, c1') -> if nc1 < 0 then [CF_out (f, c1'), v] else colored_vertex "colorize_fusion3" | CF_in _, CF_in _, CF_out _ | CF_in _, CF_out _, CF_in _ | CF_out _, CF_in _, CF_in _ -> if nc1 > 0 then color_flow_ambiguous "colorize_fusion3" else colored_vertex "colorize_fusion3" | CF_in _, CF_out _, CF_out _ | CF_out _, CF_in _, CF_out _ | CF_out _, CF_out _, CF_in _ -> if nc1 < 0 then color_flow_ambiguous "colorize_fusion3" else colored_vertex "colorize_fusion3" | CF_in _, CF_in _, CF_in _ | CF_out _, CF_out _, CF_out _ | (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _) | (CF_in _ | CF_out _), (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _) | (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _) | (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _), (CF_in _ | CF_out _) -> colored_vertex "colorize_fusion3" end | C.AdjSUN nc -> begin match f1, f2, f3 with | CF_in (_, c1), CF_out (_, c1'), White _ | CF_out (_, c1'), CF_in (_, c1), White _ | CF_in (_, c1), White _, CF_out (_, c1') | CF_out (_, c1'), White _, CF_in (_, c1) | White _, CF_in (_, c1), CF_out (_, c1') | White _, CF_out (_, c1'), CF_in (_, c1) -> if c1 <> c1' then [CF_io (f, c1, c1'), v] else [CF_aux f, v] | CF_in (_, c1), CF_out (_, c1'), CF_aux _ | CF_out (_, c1'), CF_in (_, c1), CF_aux _ | CF_in (_, c1), CF_aux _, CF_out (_, c1') | CF_out (_, c1'), CF_aux _, CF_in (_, c1) | CF_aux _, CF_in (_, c1), CF_out (_, c1') | CF_aux _, CF_out (_, c1'), CF_in (_, c1) -> if c1 <> c1' then [CF_io (f, c1, c1'), mult_vertex ( 2) v] else [CF_aux f, mult_vertex ( 2) v] | CF_in (_, c1), CF_out (_, c1'), CF_io (_, c2, c2') | CF_out (_, c1'), CF_in (_, c1), CF_io (_, c2, c2') | CF_in (_, c1), CF_io (_, c2, c2'), CF_out (_, c1') | CF_out (_, c1'), CF_io (_, c2, c2'), CF_in (_, c1) | CF_io (_, c2, c2'), CF_in (_, c1), CF_out (_, c1') | CF_io (_, c2, c2'), CF_out (_, c1'), CF_in (_, c1) -> if c1 = c2' && c2 = c1' then [CF_aux f, mult_vertex ( 2) v] else if c1 = c2' then [CF_io (f, c2, c1'), v] else if c2 = c1' then [CF_io (f, c1, c2'), v] else [] (* \begin{equation} \parbox{28mm}{\fmfframe(2,2)(2,1){\begin{fmfgraph*}(24,24) \fmfsurround{d1,e1,d2,e2,d3,e3,d4,e4} \fmf{gluon}{v,e1} \fmf{gluon}{v,e2} \fmf{gluon}{v,e3} \fmf{gluon}{v,e4} \fmflabel{1}{e1} \fmflabel{2}{e2} \fmflabel{3}{e3} \fmflabel{4}{e4} \fmfdot{v} \fmffreeze \fmf{warrow_right}{v,e1} \fmf{warrow_right}{v,e2} \fmf{warrow_right}{v,e3} \fmf{warrow_right}{v,e4} \end{fmfgraph*}}} \,= \begin{split} \mbox{} - & \ii g^2 f_{a_1a_2b}f_{a_3a_4b} (g_{\mu_1\mu_3} g_{\mu_4\mu_2} - g_{\mu_1\mu_4} g_{\mu_2\mu_3}) \\ \mbox{} - & \ii g^2 f_{a_1a_3b}f_{a_4a_2b} (g_{\mu_1\mu_4} g_{\mu_2\mu_3} - g_{\mu_1\mu_2} g_{\mu_3\mu_4}) \\ \mbox{} - & \ii g^2 f_{a_1a_4b}f_{a_2a_3b} (g_{\mu_1\mu_2} g_{\mu_3\mu_4} - g_{\mu_1\mu_3} g_{\mu_4\mu_2}) \end{split} \end{equation} *) (* Using \begin{equation} \label{eq:P4} \mathcal{P}_4 = \left\{\{1,2,3,4\},\{1,3,4,2\},\{1,4,2,3\}, \{1,2,4,3\},\{1,4,3,2\},\{1,3,2,4\}\right\} \end{equation} as the set of permutations of~$\{1,2,3,4\}$ with the cyclic permutations factored out, we have: \begin{equation} \label{eq:4GV} \parbox{28mm}{\fmfframe(2,2)(2,1){\begin{fmfgraph*}(24,24) \fmfsurround{d1,e1,d2,e2,d3,e3,d4,e4} \fmf{phantom}{v,e1} \fmf{phantom}{v,e2} \fmf{phantom}{v,e3} \fmf{phantom}{v,e4} \fmflabel{1}{e1} \fmflabel{2}{e2} \fmflabel{3}{e3} \fmflabel{4}{e4} \fmffreeze \fmfi{phantom_arrow}{(reverse vpath (__e1, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e2, __v) sideways -thick)} \fmfi{phantom_arrow}{(reverse vpath (__e2, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e3, __v) sideways -thick)} \fmfi{phantom_arrow}{(reverse vpath (__e3, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e4, __v) sideways -thick)} \fmfi{phantom_arrow}{(reverse vpath (__e4, __v) sideways -thick)} \fmfi{phantom_arrow}{( vpath (__e1, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e1, __v) sideways -thick) join ( vpath (__e2, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e2, __v) sideways -thick) join ( vpath (__e3, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e3, __v) sideways -thick) join ( vpath (__e4, __v) sideways -thick)} \fmfi{plain}{% (reverse vpath (__e4, __v) sideways -thick) join ( vpath (__e1, __v) sideways -thick)} \end{fmfgraph*}}} \,= \begin{aligned} \ii g^2 \sum_{\{\alpha_k\}_{k=1,2,3,4}\in\mathcal{P}_4} \delta^{i_{\alpha_1}j_{\alpha_2}}\delta^{i_{\alpha_2}j_{\alpha_3}} \delta^{i_{\alpha_3}j_{\alpha_4}}\delta^{i_{\alpha_4}j_{\alpha_1}}\qquad\qquad\\ \left( 2g_{\mu_{\alpha_1}\mu_{\alpha_3}} g_{\mu_{\alpha_4}\mu_{\alpha_2}} - g_{\mu_{\alpha_1}\mu_{\alpha_4}} g_{\mu_{\alpha_2}\mu_{\alpha_3}} - g_{\mu_{\alpha_1}\mu_{\alpha_2}} g_{\mu_{\alpha_3}\mu_{\alpha_4}}\right) \end{aligned} \end{equation} *) (* The different color connections correspond to permutations of the particles entering the fusion and have to be matched by a corresponding permutation of the Lorentz structure: *) (* \begin{dubious} We have to generalize this for cases of four particles in the adjoint that are not all gluons: \begin{itemize} \item scalar-scalar-scalar-scalar \item scalar-scalar-vector-vector \end{itemize} and even ones including fermions (gluinos) if higher dimensional operators are involved. \end{dubious} *) | CF_io (_, c1, c1'), CF_io (_, c2, c2'), CF_io (_, c3, c3') -> if c1' = c2 && c2' = c3 then [CF_io (f, c1, c3'), permute_vertex4 P123 v] else if c1' = c3 && c3' = c2 then [CF_io (f, c1, c2'), permute_vertex4 P132 v] else if c2' = c3 && c3' = c1 then [CF_io (f, c2, c1'), permute_vertex4 P231 v] else if c2' = c1 && c1' = c3 then [CF_io (f, c2, c3'), permute_vertex4 P213 v] else if c3' = c1 && c1' = c2 then [CF_io (f, c3, c2'), permute_vertex4 P312 v] else if c3' = c2 && c2' = c1 then [CF_io (f, c3, c1'), permute_vertex4 P321 v] else [] | CF_io _, CF_io _, CF_aux _ | CF_io _, CF_aux _, CF_io _ | CF_aux _, CF_io _, CF_io _ | CF_io _, CF_aux _, CF_aux _ | CF_aux _, CF_aux _, CF_io _ | CF_aux _, CF_io _, CF_aux _ | CF_aux _, CF_aux _, CF_aux _ -> [] | CF_io (_, c1, c1'), CF_io (_, c2, c2'), White _ | CF_io (_, c1, c1'), White _, CF_io (_, c2, c2') | White _, CF_io (_, c1, c1'), CF_io (_, c2, c2') -> if c1' = c2 then [CF_io (f, c1, c2'), mult_vertex (-1) v] else if c2' = c1 then [CF_io (f, c2, c1'), mult_vertex ( 1) v] else [] | CF_io (_, c1, c1'), CF_aux _, White _ | CF_aux _, CF_io (_, c1, c1'), White _ | CF_io (_, c1, c1'), White _, CF_aux _ | CF_aux _, White _, CF_io (_, c1, c1') | White _, CF_io (_, c1, c1'), CF_aux _ | White _, CF_aux _, CF_io (_, c1, c1') -> [] | CF_aux _, CF_aux _, White _ | CF_aux _, White _, CF_aux _ | White _, CF_aux _, CF_aux _ -> [] | White _, White _, CF_io (_, c1, c1') | White _, CF_io (_, c1, c1'), White _ | CF_io (_, c1, c1'), White _, White _ -> [CF_io (f, c1, c1'), v] | White _, White _, CF_aux _ | White _, CF_aux _, White _ | CF_aux _, White _, White _ -> [] | White _, White _, White _ | (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _) | (White _ | CF_io _ | CF_aux _), (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _) | (CF_in _ | CF_out _), (White _ | CF_io _ | CF_aux _), (White _ | CF_io _ | CF_aux _) | CF_in _, CF_in _, (White _ | CF_io _ | CF_aux _) | CF_in _, (White _ | CF_io _ | CF_aux _), CF_in _ | (White _ | CF_io _ | CF_aux _), CF_in _, CF_in _ | CF_out _, CF_out _, (White _ | CF_io _ | CF_aux _) | CF_out _, (White _ | CF_io _ | CF_aux _), CF_out _ | (White _ | CF_io _ | CF_aux _), CF_out _, CF_out _ | (CF_in _ | CF_out _), (CF_in _ | CF_out _), (CF_in _ | CF_out _) -> colored_vertex "colorize_fusion3" end (* \thocwmodulesubsection{Quintic and Higher Vertices} *) let is_white = function | White _ -> true | _ -> false let colorize_fusionn flist (f, v) = let incomplete_match () = incomplete ("colorize_fusionn { " ^ String.concat ", " (List.map (pullback M.flavor_to_string) flist) ^ " } -> " ^ M.flavor_to_string f) in match M.color f with | C.Singlet -> if List.for_all is_white flist then [White f, v] else incomplete_match () | C.SUN _ -> if List.for_all is_white flist then colored_vertex "colorize_fusionn" else incomplete_match () | C.AdjSUN _ -> if List.for_all is_white flist then colored_vertex "colorize_fusionn" else incomplete_match () end (* \thocwmodulesection{Colorizing a Monochrome Model} *) module It (M : Model.T) = struct open Coupling module C = Color module Colored_Flavor = Flavor(M) type flavor = Colored_Flavor.t type flavor_sans_color = M.flavor let flavor_sans_color = Colored_Flavor.flavor_sans_color type gauge = M.gauge type constant = M.constant let options = M.options + let caveats = M.caveats open Colored_Flavor let color = pullback M.color let nc = M.nc let pdg = pullback M.pdg let lorentz = pullback M.lorentz module Ch = M.Ch let charges = pullback M.charges (* For the propagator we cannot use pullback because we have to add the case of the color singlet propagator by hand. *) let cf_aux_propagator = function | Prop_Scalar -> Prop_Col_Scalar (* Spin 0 octets. *) | Prop_Majorana -> Prop_Col_Majorana (* Spin 1/2 octets. *) | Prop_Feynman -> Prop_Col_Feynman (* Spin 1 states, massless. *) | Prop_Unitarity -> Prop_Col_Unitarity (* Spin 1 states, massive. *) | Aux_Scalar -> Aux_Col_Scalar (* constant colored scalar propagator *) | Aux_Vector -> Aux_Col_Vector (* constant colored vector propagator *) | Aux_Tensor_1 -> Aux_Col_Tensor_1 (* constant colored tensor propagator *) | Prop_Col_Scalar | Prop_Col_Feynman | Prop_Col_Majorana | Prop_Col_Unitarity | Aux_Col_Scalar | Aux_Col_Vector | Aux_Col_Tensor_1 -> failwith ("Colorize.It().colorize_propagator: already colored particle!") | _ -> failwith ("Colorize.It().colorize_propagator: impossible!") let propagator = function | CF_aux f -> cf_aux_propagator (M.propagator f) | White f -> M.propagator f | CF_in (f, _) -> M.propagator f | CF_out (f, _) -> M.propagator f | CF_io (f, _, _) -> M.propagator f let width = pullback M.width let goldstone = function | White f -> begin match M.goldstone f with | None -> None | Some (f', g) -> Some (White f', g) end | CF_in (f, c) -> begin match M.goldstone f with | None -> None | Some (f', g) -> Some (CF_in (f', c), g) end | CF_out (f, c) -> begin match M.goldstone f with | None -> None | Some (f', g) -> Some (CF_out (f', c), g) end | CF_io (f, c1, c2) -> begin match M.goldstone f with | None -> None | Some (f', g) -> Some (CF_io (f', c1, c2), g) end | CF_aux f -> begin match M.goldstone f with | None -> None | Some (f', g) -> Some (CF_aux f', g) end let conjugate = function | White f -> White (M.conjugate f) | CF_in (f, c) -> CF_out (M.conjugate f, c) | CF_out (f, c) -> CF_in (M.conjugate f, c) | CF_io (f, c1, c2) -> CF_io (M.conjugate f, c2, c1) | CF_aux f -> CF_aux (M.conjugate f) let conjugate_sans_color = M.conjugate let fermion = pullback M.fermion let max_degree = M.max_degree let flavors () = invalid "flavors" let external_flavors () = invalid "external_flavors" let parameters = M.parameters let split_color_string s = try let i1 = String.index s '/' in let i2 = String.index_from s (succ i1) '/' in let sf = String.sub s 0 i1 and sc1 = String.sub s (succ i1) (i2 - i1 - 1) and sc2 = String.sub s (succ i2) (String.length s - i2 - 1) in (sf, sc1, sc2) with | Not_found -> (s, "", "") let flavor_of_string s = try let sf, sc1, sc2 = split_color_string s in let f = M.flavor_of_string sf in match M.color f with | C.Singlet -> White f | C.SUN nc -> if nc > 0 then CF_in (f, color_flow_of_string sc1) else CF_out (f, color_flow_of_string sc2) | C.AdjSUN _ -> begin match sc1, sc2 with | "", "" -> CF_aux f | _, _ -> CF_io (f, color_flow_of_string sc1, color_flow_of_string sc2) end with | Failure s -> if s = "int_of_string" then invalid_arg "Colorize().flavor_of_string: expecting integer" else failwith ("Colorize().flavor_of_string: unexpected Failure(" ^ s ^ ")") let flavor_to_string = function | White f -> M.flavor_to_string f | CF_in (f, c) -> M.flavor_to_string f ^ "/" ^ string_of_int c ^ "/" | CF_out (f, c) -> M.flavor_to_string f ^ "//" ^ string_of_int c | CF_io (f, c1, c2) -> M.flavor_to_string f ^ "/" ^ string_of_int c1 ^ "/" ^ string_of_int c2 | CF_aux f -> M.flavor_to_string f ^ "//" let flavor_to_TeX = function | White f -> M.flavor_to_TeX f | CF_in (f, c) -> "{" ^ M.flavor_to_TeX f ^ "}_{\\mathstrut " ^ string_of_int c ^ "}" | CF_out (f, c) -> "{" ^ M.flavor_to_TeX f ^ "}_{\\mathstrut\\overline{" ^ string_of_int c ^ "}}" | CF_io (f, c1, c2) -> "{" ^ M.flavor_to_TeX f ^ "}_{\\mathstrut " ^ string_of_int c1 ^ "\\overline{" ^ string_of_int c2 ^ "}}" | CF_aux f -> "{" ^ M.flavor_to_TeX f ^ "}_{\\mathstrut 0}" let flavor_symbol = function | White f -> M.flavor_symbol f | CF_in (f, c) -> M.flavor_symbol f ^ "_" ^ string_of_int c ^ "_" | CF_out (f, c) -> M.flavor_symbol f ^ "__" ^ string_of_int c | CF_io (f, c1, c2) -> M.flavor_symbol f ^ "_" ^ string_of_int c1 ^ "_" ^ string_of_int c2 | CF_aux f -> M.flavor_symbol f ^ "__" let gauge_symbol = M.gauge_symbol (* Masses and widths must not depend on the colors anyway! *) let mass_symbol = pullback M.mass_symbol let width_symbol = pullback M.width_symbol let constant_symbol = M.constant_symbol (* \thocwmodulesubsection{Vertices} *) (* [vertices] are \emph{only} used by functor applications and for indexing a cache of precomputed fusion rules, which is not used for colorized models. *) let vertices () = invalid "vertices" module Legacy = Legacy_Implementation (M) let colorize_fusion2 f1 f2 (f, v) = match v with | V3 _ -> Legacy.colorize_fusion2 f1 f2 (f, v) | _ -> [] let colorize_fusion3 f1 f2 f3 (f, v) = match v with | V4 _ -> Legacy.colorize_fusion3 f1 f2 f3 (f, v) | _ -> [] (* In order to match the \emph{correct} positions of the fields in the vertices, we have to undo the permutation effected by the fusion according to [Coupling.fusen]. *) module PosMap = Partial.Make (struct type t = int let compare = compare end) (* Note that due to the [inverse], the list [l'] can be interpreted here as a map reshuffling the indices. E.\,g., [inverse (Permutation.Default.list [2;0;1])] applied to [[1;2;3]] gives [[3;1;2]]. *) let partial_map_redoing_permutation l l' = let module P = Permutation.Default in let p = P.inverse (P.of_list (List.map pred l')) in PosMap.of_lists l (P.list p l) (* Note that, the list [l'] can not be interpreted as a map reshuffling the indices, but gives the new order of the argument. E.\,g., [Permutation.Default.list [2;0;1]] applied to [[1;2;3]] gives [[2;3;1]]. *) let partial_map_undoing_permutation l l' = let module P = Permutation.Default in let p = P.of_list (List.map pred l') in PosMap.of_lists l (P.list p l) module CA = Color.Arrow module CV = Color.Vertex module CP = Color.Propagator let color_sans_flavor = function | White _ -> CP.W | CF_in (_, cfi) -> CP.I cfi | CF_out (_, cfo) -> CP.O cfo | CF_io (_, cfi, cfo) -> CP.IO (cfi, cfo) | CF_aux _ -> CP.G let color_with_flavor f = function | CP.W -> White f | CP.I cfi -> CF_in (f, cfi) | CP.O cfo -> CF_out (f, cfo) | CP.IO (cfi, cfo) -> CF_io (f, cfi, cfo) | CP.G -> CF_aux f let colorize vertex_list flavors f v = List.map (fun (coef, cf) -> (color_with_flavor f cf, cmult_vertex coef v)) (CV.fuse (nc ()) vertex_list (List.map color_sans_flavor flavors)) let partial_map_undoing_fusen fusen = partial_map_undoing_permutation (ThoList.range 1 (List.length fusen)) fusen let undo_permutation_of_fusen fusen = PosMap.apply_with_fallback (fun _ -> invalid_arg "permutation_of_fusen") (partial_map_undoing_fusen fusen) let colorize_fusionn_ufo flist f c v spins flines color fuse xtra = let v = Vn (UFO (c, v, spins, flines, Color.Vertex.unit), fuse, xtra) in let p = undo_permutation_of_fusen fuse in colorize (CV.map p color) flist f v let colorize_fusionn flist (f, v) = match v with | Vn (UFO (c, v, spins, flines, color), fuse, xtra) -> colorize_fusionn_ufo flist f c v spins flines color fuse xtra | _ -> [] let fuse_list flist = ThoList.flatmap (colorize_fusionn flist) (M.fuse (List.map flavor_sans_color flist)) let fuse2 f1 f2 = List.rev_append (fuse_list [f1; f2]) (ThoList.flatmap (colorize_fusion2 f1 f2) (M.fuse2 (flavor_sans_color f1) (flavor_sans_color f2))) let fuse3 f1 f2 f3 = List.rev_append (fuse_list [f1; f2; f3]) (ThoList.flatmap (colorize_fusion3 f1 f2 f3) (M.fuse3 (flavor_sans_color f1) (flavor_sans_color f2) (flavor_sans_color f3))) let fuse = function | [] | [_] -> invalid_arg "Colorize.It().fuse" | [f1; f2] -> fuse2 f1 f2 | [f1; f2; f3] -> fuse3 f1 f2 f3 | flist -> fuse_list flist let max_degree = M.max_degree (* \thocwmodulesubsection{Adding Color to External Particles} *) let count_color_strings f_list = let rec count_color_strings' n_in n_out n_glue = function | f :: rest -> begin match M.color f with | C.Singlet -> count_color_strings' n_in n_out n_glue rest | C.SUN nc -> if nc > 0 then count_color_strings' (succ n_in) n_out n_glue rest else if nc < 0 then count_color_strings' n_in (succ n_out) n_glue rest else su0 "count_color_strings" | C.AdjSUN _ -> count_color_strings' (succ n_in) (succ n_out) (succ n_glue) rest end | [] -> (n_in, n_out, n_glue) in count_color_strings' 0 0 0 f_list let external_color_flows f_list = let n_in, n_out, n_glue = count_color_strings f_list in if n_in <> n_out then [] else let color_strings = ThoList.range 1 n_in in List.rev_map (fun permutation -> (color_strings, permutation)) (Combinatorics.permute color_strings) (* If there are only adjoints \emph{and} there are no couplings of adjoints to singlets, we can ignore the $\mathrm{U}(1)$-ghosts. *) let pure_adjoints f_list = List.for_all (fun f -> match M.color f with C.AdjSUN _ -> true | _ -> false) f_list let two_adjoints_couple_to_singlets () = let vertices3, vertices4, verticesn = M.vertices () in List.exists (fun ((f1, f2, f3), _, _) -> match M.color f1, M.color f2, M.color f3 with | C.AdjSUN _, C.AdjSUN _, C.Singlet | C.AdjSUN _, C.Singlet, C.AdjSUN _ | C.Singlet, C.AdjSUN _, C.AdjSUN _ -> true | _ -> false) vertices3 || List.exists (fun ((f1, f2, f3, f4), _, _) -> match M.color f1, M.color f2, M.color f3, M.color f4 with | C.AdjSUN _, C.AdjSUN _, C.Singlet, C.Singlet | C.AdjSUN _, C.Singlet, C.AdjSUN _, C.Singlet | C.Singlet, C.AdjSUN _, C.AdjSUN _, C.Singlet | C.AdjSUN _, C.Singlet, C.Singlet, C.AdjSUN _ | C.Singlet, C.AdjSUN _, C.Singlet, C.AdjSUN _ | C.Singlet, C.Singlet, C.AdjSUN _, C.AdjSUN _ -> true | _ -> false) vertices4 || List.exists (fun (flist, _, g) -> true) verticesn let external_ghosts f_list = if pure_adjoints f_list then two_adjoints_couple_to_singlets () else true (* We use [List.hd] and [List.tl] instead of pattern matching, because we consume [ecf_in] and [ecf_out] at a different pace. *) let tail_opt = function | [] -> [] | _ :: tail -> tail let head_req = function | [] -> invalid_arg "Colorize.It().colorize_crossed_amplitude1: insufficient flows" | x :: _ -> x let rec colorize_crossed_amplitude1 ghosts acc f_list (ecf_in, ecf_out) = match f_list, ecf_in, ecf_out with | [], [], [] -> [List.rev acc] | [], _, _ -> invalid_arg "Colorize.It().colorize_crossed_amplitude1: leftover flows" | f :: rest, _, _ -> begin match M.color f with | C.Singlet -> colorize_crossed_amplitude1 ghosts (White f :: acc) rest (ecf_in, ecf_out) | C.SUN nc -> if nc > 0 then colorize_crossed_amplitude1 ghosts (CF_in (f, head_req ecf_in) :: acc) rest (tail_opt ecf_in, ecf_out) else if nc < 0 then colorize_crossed_amplitude1 ghosts (CF_out (f, head_req ecf_out) :: acc) rest (ecf_in, tail_opt ecf_out) else su0 "colorize_flavor" | C.AdjSUN _ -> let ecf_in' = head_req ecf_in and ecf_out' = head_req ecf_out in if ecf_in' = ecf_out' then begin if ghosts then colorize_crossed_amplitude1 ghosts (CF_aux f :: acc) rest (tail_opt ecf_in, tail_opt ecf_out) else [] end else colorize_crossed_amplitude1 ghosts (CF_io (f, ecf_in', ecf_out') :: acc) rest (tail_opt ecf_in, tail_opt ecf_out) end let colorize_crossed_amplitude1 ghosts f_list (ecf_in, ecf_out) = colorize_crossed_amplitude1 ghosts [] f_list (ecf_in, ecf_out) let colorize_crossed_amplitude f_list = ThoList.rev_flatmap (colorize_crossed_amplitude1 (external_ghosts f_list) f_list) (external_color_flows f_list) let cross_uncolored p_in p_out = (List.map M.conjugate p_in) @ p_out let uncross_colored n_in p_lists_colorized = let p_in_out_colorized = List.map (ThoList.splitn n_in) p_lists_colorized in List.map (fun (p_in_colored, p_out_colored) -> (List.map conjugate p_in_colored, p_out_colored)) p_in_out_colorized let amplitude p_in p_out = uncross_colored (List.length p_in) (colorize_crossed_amplitude (cross_uncolored p_in p_out)) (* The $-$-sign in the second component is redundant, but a Whizard convention. *) let indices = function | White _ -> Color.Flow.of_list [0; 0] | CF_in (_, c) -> Color.Flow.of_list [c; 0] | CF_out (_, c) -> Color.Flow.of_list [0; -c] | CF_io (_, c1, c2) -> Color.Flow.of_list [c1; -c2] | CF_aux f -> Color.Flow.ghost () let flow p_in p_out = (List.map indices p_in, List.map indices p_out) end (* \thocwmodulesection{Colorizing a Monochrome Gauge Model} *) module Gauge (M : Model.Gauge) = struct module CM = It(M) type flavor = CM.flavor type flavor_sans_color = CM.flavor_sans_color type gauge = CM.gauge type constant = CM.constant module Ch = CM.Ch let charges = CM.charges let flavor_sans_color = CM.flavor_sans_color let color = CM.color let pdg = CM.pdg let lorentz = CM.lorentz let propagator = CM.propagator let width = CM.width let conjugate = CM.conjugate let conjugate_sans_color = CM.conjugate_sans_color let fermion = CM.fermion let max_degree = CM.max_degree let vertices = CM.vertices let fuse2 = CM.fuse2 let fuse3 = CM.fuse3 let fuse = CM.fuse let flavors = CM.flavors let nc = CM.nc let external_flavors = CM.external_flavors let goldstone = CM.goldstone let parameters = CM.parameters let flavor_of_string = CM.flavor_of_string let flavor_to_string = CM.flavor_to_string let flavor_to_TeX = CM.flavor_to_TeX let flavor_symbol = CM.flavor_symbol let gauge_symbol = CM.gauge_symbol let mass_symbol = CM.mass_symbol let width_symbol = CM.width_symbol let constant_symbol = CM.constant_symbol let options = CM.options + let caveats = CM.caveats let incomplete s = failwith ("Colorize.Gauge()." ^ s ^ " not done yet!") type matter_field = M.matter_field type gauge_boson = M.gauge_boson type other = M.other type field = | Matter of matter_field | Gauge of gauge_boson | Other of other let field f = incomplete "field" let matter_field f = incomplete "matter_field" let gauge_boson f = incomplete "gauge_boson" let other f = incomplete "other" let amplitude = CM.amplitude let flow = CM.flow end Index: trunk/omega/src/UFO_targets.mli =================================================================== --- trunk/omega/src/UFO_targets.mli (revision 8415) +++ trunk/omega/src/UFO_targets.mli (revision 8416) @@ -1,52 +1,75 @@ (* UFO_targets.mli -- Copyright (C) 1999-2017 by Wolfgang Kilian Thorsten Ohl Juergen Reuter with contributions from Christian Speckner WHIZARD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. WHIZARD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *) (* \thocwmodulesection{Generating Code for UFO Lorentz Structures} *) module type T = sig (* NB: The [spins : int list] argument is \emph{not} sufficient to determine the domain and codomain of the function. We will need to inspect the flavors, where the Lorentz structure is referenced. *) val lorentz : Format_Fortran.formatter -> string -> Coupling.lorentz array -> UFO_Lorentz.t -> unit val propagator : Format_Fortran.formatter -> string -> Coupling.lorentz * Coupling.lorentz -> UFO_Lorentz.t -> UFO_Lorentz.t -> unit + (* [fusion_name name perm cc_list] forms a name for the fusion + [name] with the permutations [perm] and charge conjugations + applied to the fermion lines [cc_list]. *) + val fusion_name : + string -> Permutation.Default.t -> Coupling.fermion_lines -> string + + (* [fuse c v s fl g wfs ps fusion] + fuses the wavefunctions named [wfs] with momenta named [ps] + using the vertex named [v] with legs reordered according to [fusion]. + The overall coupling constant named [g] is multiplied by the rational + coefficient [c]. The list of spins [s] and the fermion + lines [fl] are used for selecting the appropriately + transformed version of the vertex [v]. *) val fuse : - Algebra.QC.t -> string -> Coupling.lorentzn -> + Algebra.QC.t -> string -> + Coupling.lorentzn -> Coupling.fermion_lines -> string -> string list -> string list -> Coupling.fusen -> unit val eps4_g4_g44_decl : Format_Fortran.formatter -> unit -> unit val eps4_g4_g44_init : Format_Fortran.formatter -> unit -> unit + module type Test = + sig + val suite : OUnit.test + end + + module Test : Test + end module Fortran : T + + Index: trunk/.gitignore =================================================================== --- trunk/.gitignore (revision 8415) +++ trunk/.gitignore (revision 8416) @@ -1,11 +1,21 @@ /Makefile.am Makefile.in aclocal.m4 autom4te.cache configure.ac configure *~ _build* _inst* .DS_Store .svn +reconfigure_*dist +lightbylight_UFO* +GldGrv_UFO +HC_UFO +ToyModel_UFO +SM_NLO +Kreher +SMEFT_mW_UFO.zip +SMEFTsim_A_U35_alphaScheme_UFO_v2.1.tar.gz +gldgrv.tgz Index: trunk/configure.ac.in =================================================================== --- trunk/configure.ac.in (revision 8415) +++ trunk/configure.ac.in (revision 8416) @@ -1,1198 +1,1199 @@ dnl configure.ac -- Main configuration script for WHIZARD dnl dnl Process this file with autoconf to produce a configure script. dnl ************************************************************************ dnl configure.ac -- Main configuration script for WHIZARD dnl configure.ac -- WHIZARD configuration dnl dnl Copyright (C) 1999-2020 by dnl Wolfgang Kilian dnl Thorsten Ohl dnl Juergen Reuter dnl with contributions from dnl cf. main AUTHORS file dnl dnl WHIZARD is free software; you can redistribute it and/or modify it dnl under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2, or (at your option) dnl any later version. dnl dnl WHIZARD is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. dnl dnl *********************************************************************** dnl Environment variables that can be set by the user: dnl FC Fortran compiler dnl FCFLAGS Fortran compiler flags dnl *********************************************************************** dnl dnl Start configuration AC_INIT([XXXWHIZARDXXX],[2.8.3]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([1.12.2 color-tests parallel-tests]) AC_PREREQ([2.65]) AM_MAKE_INCLUDE dnl Make make less verbose to improve signal/noise AM_SILENT_RULES([yes]) ######################################################################## ### Package-specific initialization AC_MSG_NOTICE([**************************************************************]) WO_CONFIGURE_SECTION([Start of package configuration]) ### Further version information PACKAGE_DATE="Mar 03 2020" PACKAGE_STATUS="alpha" AC_SUBST(PACKAGE_DATE) AC_SUBST(PACKAGE_STATUS) AC_MSG_NOTICE([**************************************************************]) AC_MSG_NOTICE([Package name: AC_PACKAGE_NAME()]) AC_MSG_NOTICE([Version: AC_PACKAGE_VERSION()]) AC_MSG_NOTICE([Date: $PACKAGE_DATE]) AC_MSG_NOTICE([Status: $PACKAGE_STATUS]) AC_MSG_NOTICE([**************************************************************]) ### Dump Package version and date to file 'VERSION' echo "$PACKAGE_STRING ($PACKAGE_STATUS) $PACKAGE_DATE" \ > VERSION ######################################################################## ###--------------------------------------------------------------------- ### shared library versioning (not the same as the package version!) LIBRARY_VERSION="-version-info 1:2:0" AC_SUBST([LIBRARY_VERSION]) ######################################################################## ###--------------------------------------------------------------------- ### Define the main package variables ### Source directory, for testing purposes SRCDIR=`cd $srcdir && pwd` AC_SUBST([SRCDIR]) ### Build directory, for testing purposes BUILDDIR=`pwd` AC_SUBST([BUILDDIR]) ### Location of installed libraries and such eval BINDIR=$bindir case $BINDIR in NONE*) eval BINDIR=$prefix/bin ;; esac case $BINDIR in NONE*) BINDIR="\${prefix}/bin" ;; esac AC_SUBST([BINDIR]) eval INCLUDEDIR=$includedir case $INCLUDEDIR in NONE*) eval INCLUDEDIR=$prefix/include ;; esac case $INCLUDEDIR in NONE*) INCLUDEDIR="\${prefix}/include" ;; esac AC_SUBST([INCLUDEDIR]) eval LIBDIR=$libdir case $LIBDIR in NONE*) eval LIBDIR=$prefix/lib ;; esac case $LIBDIR in NONE*) eval LIBDIR=$ac_default_prefix/lib ;; esac AC_SUBST([LIBDIR]) ### Location of installed libraries and such eval PKGLIBDIR=$libdir/$PACKAGE case $PKGLIBDIR in NONE*) eval PKGLIBDIR=$prefix/lib/$PACKAGE ;; esac case $PKGLIBDIR in NONE*) PKGLIBDIR="\${prefix}/lib/$PACKAGE" ;; esac AC_SUBST([PKGLIBDIR]) ### Location of installed system-independent data eval PKGDATADIR=$datarootdir/$PACKAGE case $PKGDATADIR in NONE*) eval PKGDATADIR=$prefix/share/$PACKAGE ;; esac case $PKGDATADIR in NONE*) PKGDATADIR="\${prefix}/share/$PACKAGE" ;; esac AC_SUBST([PKGDATADIR]) ### Location of installed TeX files and such eval PKGTEXDIR=$datarootdir/texmf/$PACKAGE case $PKGTEXDIR in NONE*) eval PKGTEXDIR=$prefix/share/texmf/$PACKAGE ;; esac case $PKGTEXDIR in NONE*) PKGTEXDIR="\${prefix}/share/texmf/$PACKAGE" ;; esac AC_SUBST([PKGTEXDIR]) ######################################################################## ###--------------------------------------------------------------------- ### Required programs and checks ### GNU Tools WO_CONFIGURE_SECTION([Generic tools]) ### Initialize LIBTOOL LT_INIT(dlopen) LT_PREREQ([2.4.1b]) AX_CHECK_GNU_MAKE() AC_PROG_GREP() AC_MSG_CHECKING([for the suffix of shared libraries]) case $host in *-darwin* | rhapsody*) SHRLIB_EXT="dylib" ;; cygwin* | mingw* | pw32* | cegcc* | os2*) SHRLIB_EXT="dll" ;; hpux9* | hpux10* | hpux11*) SHRLIB_EXT="sl" ;; *) SHRLIB_EXT="so" ;; esac if test "x$SHRLIB_EXT" != "x"; then SHRLIB_EXT=$SHRLIB_EXT else SHRLIB_EXT="so" fi AC_MSG_RESULT([.$SHRLIB_EXT]) AC_SUBST(SHRLIB_EXT) ### Export whether the C compiler is GNU AC_MSG_CHECKING([whether the C compiler is the GNU compiler]) if test "x$ac_cv_c_compiler_gnu" = "xyes"; then CC_IS_GNU=".true." else CC_IS_GNU=".false." fi AC_MSG_RESULT([$ac_cv_c_compiler_gnu]) AC_SUBST([CC_IS_GNU]) AC_CHECK_HEADERS([quadmath.h]) if test "x$ac_cv_header_quadmath_h" = "xyes"; then CC_HAS_QUADMATH=".true." else CC_HAS_QUADMATH=".false." fi AC_SUBST([CC_HAS_QUADMATH]) ######################################################################## ###--------------------------------------------------------------------- ### Host system MAC OS X check for XCode case $host in *-darwin*) WO_HLINE() AC_MSG_NOTICE([Host is $host, checking for XCode]) AC_PATH_PROG(XCODE_SELECT, xcode-select) # locate currently selected Xcode path if test "x$XCODE_SELECT" != "x"; then AC_MSG_CHECKING(Xcode location) DEVELOPER_DIR=`$XCODE_SELECT -print-path` AC_MSG_RESULT([$DEVELOPER_DIR]) else DEVELOPER_DIR=/Developer fi AC_SUBST(DEVELOPER_DIR) XCODEPLIST=$DEVELOPER_DIR/Applications/Xcode.app/Contents/version.plist if test -r "$XCODEPLIST"; then AC_MSG_CHECKING(Xcode version) if test "x$DEFAULTS" != "x"; then XCODE_VERSION=`$DEFAULTS read $DEVELOPER_DIR/Applications/Xcode.app/Contents/version CFBundleShortVersionString` else XCODE_VERSION=`tr -d '\r\n' < $XCODEPLIST | sed -e 's/.*CFBundleShortVersionString<\/key>.\([[0-9.]]*\)<\/string>.*/\1/'` fi AC_MSG_RESULT([$XCODE_VERSION]) AC_SUBST(XCODE_VERSION) fi AC_MSG_NOTICE([checking for Security Integrity Protocol (SIP)]) AC_PATH_PROG(CSRUTIL, csrutil) if test "x$CSRUTIL" != "x"; then SIP_CHECK=`$CSRUTIL status | $SED "s/System Integrity Protection status: //"` if test "$SIP_CHECK" = "enabled."; then SIP_ACTIVE="yes" else SIP_ACTIVE="no" fi else SIP_ACTIVE="no" fi AC_MSG_CHECKING([Checking whether MAC OS X SIP is activated]) AC_MSG_RESULT([$SIP_ACTIVE]) AC_SUBST([SIP_ACTIVE]) WO_HLINE() ;; *) ;; esac ######################################################################## ###--------------------------------------------------------------------- ### Enable the distribution tools ### (default: disabled, to speed up compilation) AC_ARG_ENABLE([distribution], [AS_HELP_STRING([--enable-distribution], [build the distribution incl. all docu (developers only) [[no]]])]) AC_CACHE_CHECK([whether we want to build the distribution], [wo_cv_distribution], [dnl if test "$enable_distribution" = "yes"; then wo_cv_distribution=yes else wo_cv_distribution=no fi]) AM_CONDITIONAL([DISTRIBUTION], [test "$enable_distribution" = "yes"]) ### ONLY_FULL {{{ ######################################################################## ###--------------------------------------------------------------------- if test "$enable_shared" = no; then AC_MSG_ERROR([you've used --disable-shared which will not produce a working Whizard.]) fi ### ONLY_FULL }}} ######################################################################## ###--------------------------------------------------------------------- ### We include the m4 macro tool here AC_PATH_PROG(M4,m4,false) if test "$M4" = false; then AM_CONDITIONAL([M4_AVAILABLE],[false]) else AM_CONDITIONAL([M4_AVAILABLE],[true]) fi ######################################################################## ###--------------------------------------------------------------------- ### Dynamic runtime linking WO_CONFIGURE_SECTION([Dynamic runtime linking]) ### Look for libdl (should provide 'dlopen' and friends) AC_PROG_CC() WO_PROG_DL() ### Define the conditional for static builds if test "$enable_static" = yes; then AM_CONDITIONAL([STATIC_AVAILABLE],[true]) else AM_CONDITIONAL([STATIC_AVAILABLE],[false]) fi ######################################################################## ###--------------------------------------------------------------------- ### Noweb WO_CONFIGURE_SECTION([Checks for 'noweb' system]) ### Enable/disable noweb and determine locations of notangle, cpif, noweave WO_PROG_NOWEB() ######################################################################## ###--------------------------------------------------------------------- ### LaTeX WO_CONFIGURE_SECTION([Checks for 'LaTeX' system]) ### Determine whether LaTeX is present AC_PROG_LATEX() AC_PROG_DVIPS() AC_PROG_PDFLATEX() AC_PROG_MAKEINDEX() AC_PROG_PS2PDF() AC_PROG_EPSPDF() AC_PROG_EPSTOPDF() if test "$EPSPDF" = "no" -a "$EPSTOPDF" = "no"; then AC_MSG_NOTICE([*********************************************************]) AC_MSG_NOTICE([WARNING: eps(to)pdf n/a; O'Mega documentation will crash!]) AC_MSG_NOTICE([WARNING: this applies only to the svn developer version!]) AC_MSG_NOTICE([*********************************************************]) fi AC_PROG_SUPP_PDF() AC_PROG_GZIP() AC_PATH_PROG(ACROREAD,acroread,false) AC_PATH_PROG(GHOSTVIEW,gv ghostview,false) AC_PROG_DOT() ### Determine whether Metapost is present and whether event display is possible AC_PROG_MPOST() WO_CHECK_EVENT_ANALYSIS_METHODS() ### We put here the check for HEVEA components as well WO_PROG_HEVEA() ######################################################################## ###--------------------------------------------------------------------- ### Fortran compiler WO_CONFIGURE_SECTION([Fortran compiler checks]) ### Determine default compiler to use user_FCFLAGS="${FCFLAGS}" AC_PROG_FC() ### Choose FC standard for PYTHIA6 F77 files AC_PROG_F77([$FC]) ### Determine compiler vendor and version WO_FC_GET_VENDOR_AND_VERSION() ### Veto against old gfortran 4 versions WO_FC_VETO_GFORTRAN_4() ### Veto against buggy gfortran 6.5.0 version WO_FC_VETO_GFORTRAN_65() ### Veto against ifort 15/16/17 WO_FC_VETO_IFORT_15_18() ### Veto against ifort 19.0.0/1/2 WO_FC_VETO_IFORT_190012() ### Require extension '.f90' for all compiler checks AC_FC_SRCEXT([f90]) ### Determine flags and extensions WO_FC_PARAMETERS() ### Determine flags for linking the Fortran runtime library WO_FC_LIBRARY_LDFLAGS() ### Check for Fortran 95 features WO_FC_CHECK_F95() ### Check for allocatable subobjects (TR15581) WO_FC_CHECK_TR15581() ### Check for allocatable scalars WO_FC_CHECK_ALLOCATABLE_SCALARS() ### Check for ISO C binding support WO_FC_CHECK_C_BINDING() ### Check for procedures pointers and abstract interfaces WO_FC_CHECK_PROCEDURE_POINTERS() ### Check for type extension and further OO features WO_FC_CHECK_OO_FEATURES() ### Check for submodules (not yet used) WO_FC_CHECK_TR19767() ### Check for F2003 command-line interface WO_FC_CHECK_CMDLINE() ### Check for F2003-style access to environment variables WO_FC_CHECK_ENVVAR() ### Check for the flush statement WO_FC_CHECK_FLUSH() ### Check for iso_fortran_env WO_FC_CHECK_ISO_FORTRAN_ENV() WO_FC_CHECK_ISO_FORTRAN_ENV_2008() ### Turn on/off master switch for debugging features WO_FC_SET_DEBUG() ### OpenMP threading activated upon request AC_OPENMP() WO_FC_SET_OPENMP() ### Profiling compilation enforced upon request WO_FC_SET_PROFILING() ### Impure subroutines enforced upon request WO_FC_SET_OMEGA_IMPURE() ### Find the extension of Fortran module files WO_FC_MODULE_FILE([FC_MODULE_NAME], [FC_MODULE_EXT], [$FC], [f90]) ###--------------------------------------------------------------------- ### Check for the requested precision WO_FC_CONFIGURE_KINDS([src/basics/kinds.f90]) ### ONLY_FULL {{{ AC_PROG_INSTALL() ${INSTALL} -d circe1/src cp -a src/basics/kinds.f90 circe1/src ${INSTALL} -d circe2/src cp -a src/basics/kinds.f90 circe2/src ${INSTALL} -d omega/src cp -a src/basics/kinds.f90 omega/src ${INSTALL} -d vamp/src cp -a src/basics/kinds.f90 vamp/src ### ONLY_FULL }}} ### ONLY_VAMP_AND_FULL {{{ ######################################################################## # VAMP Fortran options for the configure script ######################################################################## WO_FC_SET_MPI() ### ONLY_VAMP_AND_FULL }}} ######################################################################## ###--------------------------------------------------------------------- ### O'Caml WO_CONFIGURE_SECTION([Objective Caml checks]) ### Check for ocamlc and its relatives AC_PROG_OCAML() if test "$enable_ocaml" != "no"; then AC_OCAML_VERSION_CHECK(402003) AC_PROG_OCAMLLEX() AC_PROG_OCAMLYACC() AC_PROG_OCAMLCP() AC_OCAML_BIGARRAY_MODULE() ### Ocamlweb is required to be newer than v0.9 AC_PROG_OCAMLWEB(009000) AC_PROG_OCAML_LABLGTK() AC_PATH_PROGS([OCAMLDOT],[ocamldot],[no]) AM_CONDITIONAL([OCAMLDOT_AVAILABLE],[test "$OCAMLDOT" != "no"]) AC_PATH_PROGS([OCAMLDEP],[ocamldep],[no]) AM_CONDITIONAL([OCAMLDEP_AVAILABLE],[test "$OCAMLDEP" != "no"]) AC_PATH_PROGS([OCAMLDEFUN],[ocamldefun],[no]) else AC_MSG_NOTICE([WARNING: O'Caml and O'Mega matrix elements disabled by request!]) AM_CONDITIONAL([OCAMLWEB_AVAILABLE],[false]) AM_CONDITIONAL([OCAMLDOT_AVAILABLE],[false]) AM_CONDITIONAL([OCAMLDEP_AVAILABLE],[false]) fi ######################################################################## ###--------------------------------------------------------------------- ### C++ WO_CONFIGURE_SECTION([C++ compiler checks]) AC_PROG_CXX() AC_CXX_LIBRARY_LDFLAGS() ### ONLY_OMEGA_AND_FULL {{{ ######################################################################## # O'Mega options for the configure script ######################################################################## ######################################################################## ###--------------------------------------------------------------------- ### O'Mega UFO file paths WO_CONFIGURE_SECTION([O'Mega UFO file paths]) AC_ARG_ENABLE([default-UFO-dir], [ --enable-default-UFO-dir=directory Read precomputed model tables from this directory, which will be populated by an administrator at install time [[default=$datadir/UFO, enabled]].], [case "$enableval" in no) OMEGA_DEFAULT_UFO_DIR="." ;; *) OMEGA_DEFAULT_UFO_DIR="$enableval" ;; esac], [### use eval b/c $datadir defaults to unexpanded ${datarootdir} case "$OMEGA_DEFAULT_UFO_DIR" in "") OMEGA_DEFAULT_UFO_DIR="${prefix}/omega/share/UFO" ;; *) eval OMEGA_DEFAULT_UFO_DIR="$datadir/UFO" ;; esac]) AC_SUBST([OMEGA_DEFAULT_UFO_DIR]) case "$OMEGA_DEFAULT_UFO_DIR" in .|""|NONE*) OMEGA_DEFAULT_UFO_DIR="." ;; *) AC_MSG_NOTICE([Creating default UFO directory $OMEGA_DEFAULT_UFO_DIR]) $MKDIR_P "$OMEGA_DEFAULT_UFO_DIR" 2>/dev/null chmod u+w "$OMEGA_DEFAULT_UFO_DIR" 2>/dev/null ;; esac ###--------------------------------------------------------------------- ### Recola WO_CONFIGURE_SECTION([RECOLA]) WO_PROG_RECOLA() ### ONLY_OMEGA_AND_FULL }}} ### ONLY_FULL {{{ ######################################################################## ###--------------------------------------------------------------------- ### Libraries ###--------------------------------------------------------------------- ### LHAPDF WO_CONFIGURE_SECTION([LHAPDF]) WO_PROG_LHAPDF() ###--------------------------------------------------------------------- ### ROOT WO_CONFIGURE_SECTION([ROOT]) WO_ROOT_PATH(,[ AC_DEFINE([HAVE_ROOT],,[Root library]) AC_CHECK_LIB([dl],[dlopen],[],AC_MSG_WARN([Root libraries not linking properly])) ],AC_MSG_RESULT([The ROOT support of HepMC might not be working properly])) ###--------------------------------------------------------------------- ### HepMC WO_CONFIGURE_SECTION([HepMC]) WO_PROG_HEPMC() ###--------------------------------------------------------------------- ### STDHEP WO_CONFIGURE_SECTION([STDHEP]) WO_PROG_TIRPC() AC_MSG_NOTICE([StdHEP v5.06.01 is included internally]) ###--------------------------------------------------------------------- ### LCIO WO_CONFIGURE_SECTION([LCIO]) WO_PROG_LCIO() ###--------------------------------------------------------------------- ### PYTHIA6, PYTHIA8 etc WO_CONFIGURE_SECTION([SHOWERS PYTHIA6 PYTHIA8 MPI]) WO_PROG_QCD() WO_PROG_PYTHIA8() ###--------------------------------------------------------------------- ### HOPPET WO_CONFIGURE_SECTION([HOPPET]) WO_PROG_HOPPET() ###--------------------------------------------------------------------- ### FASTJET WO_CONFIGURE_SECTION([FASTJET]) WO_PROG_FASTJET() ###--------------------------------------------------------------------- ### GoSam WO_CONFIGURE_SECTION([GOSAM]) WO_PROG_GOSAM() ###--------------------------------------------------------------------- ### OpenLoops WO_CONFIGURE_SECTION([OPENLOOPS]) WO_PROG_OPENLOOPS() ###--------------------------------------------------------------------- ### LoopTools WO_CONFIGURE_SECTION([LOOPTOOLS]) WO_PROG_LOOPTOOLS() ### ONLY_FULL }}} ######################################################################## ###--------------------------------------------------------------------- ### Extra flags for helping the linker finding libraries WO_CONFIGURE_SECTION([Handle linking with C++ libraries]) WO_PROG_STDCPP() ### ONLY_FULL {{{ ######################################################################## ###--------------------------------------------------------------------- ### Miscellaneous WO_CONFIGURE_SECTION([Numerical checks]) ### Disable irrelevant optimization for parameter files ### (default: disabled, to speed up compilation) AC_ARG_ENABLE([optimization-for-parameter-files], [AS_HELP_STRING([--enable-optimization-for-parameter-files], [enable (useless) optimization for parameter files [[no]]])]) AC_CACHE_CHECK([whether we want optimization for parameter files], [wo_cv_optimization_for_parfiles], [dnl if test "$enable_optimization_for_parameter_files" = "yes"; then wo_cv_optimization_for_parfiles=yes else wo_cv_optimization_for_parfiles=no fi]) AM_CONDITIONAL([OPTIMIZATION_FOR_PARFILES], [test "$enable_optimization_for_parameter_files" = "yes"]) ######################################################################## ###--------------------------------------------------------------------- ### Checks for external interfaces WO_CONFIGURE_SECTION([Auxiliary stuff for external interfaces]) AX_PYTHON() ### ONLY_FULL }}} ######################################################################## ###--------------------------------------------------------------------- ### Wrapup WO_CONFIGURE_SECTION([Finalize configuration]) ### Main directory AC_CONFIG_FILES([Makefile]) ### ONLY_FULL {{{ ###--------------------------------------------------------------------- ### Subdirectory src AC_CONFIG_FILES([src/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/hepmc AC_CONFIG_FILES([src/hepmc/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/lcio AC_CONFIG_FILES([src/lcio/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory pythia6: WHIZARD's internal PYTHIA6 version AC_CONFIG_FILES([pythia6/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory tauola: WHIZARD's internal TAUOLA version AC_CONFIG_FILES([tauola/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory stdhep: WHIZARD's internal StdHep version AC_CONFIG_FILES([mcfio/Makefile]) AC_CONFIG_FILES([stdhep/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/muli: multiple interactions AC_CONFIG_FILES([src/muli/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/lhapdf5: dummy library as LHAPDF5 replacement AC_CONFIG_FILES([src/lhapdf5/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/lhapdf: LHAPDF v6 AC_CONFIG_FILES([src/lhapdf/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/pdf_builtin: Builtin PDFs AC_CONFIG_FILES([src/pdf_builtin/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/pdf_builtin: Electron PDFs AC_CONFIG_FILES([src/qed_pdf/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/tauola AC_CONFIG_FILES([src/tauola/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/xdr: XDR reader AC_CONFIG_FILES([src/xdr/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/hoppet AC_CONFIG_FILES([src/hoppet/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/fastjet AC_CONFIG_FILES([src/fastjet/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/looptools AC_CONFIG_FILES([src/looptools/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/shower: shower and all that AC_CONFIG_FILES([src/pythia8/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/shower: shower and all that AC_CONFIG_FILES([src/shower/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/noweb-frame: frame for whizard Noweb sources AC_CONFIG_FILES([src/noweb-frame/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/basics: numeric kinds, strings AC_CONFIG_FILES([src/basics/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/utilities: simple utilities AC_CONFIG_FILES([src/utilities/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/testing: unit-test support AC_CONFIG_FILES([src/testing/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/system: modules related to local setup and OS issues AC_CONFIG_FILES([src/system/Makefile]) AC_CONFIG_FILES([src/system/system_dependencies.f90], [ maxlen=70 i=1 pat="" while test ${i} -lt ${maxlen}; do pat="${pat}."; i=`expr ${i} + 1`; done pat=${pat}[[^\"]] pat="/^ \"${pat}/ s/${pat}/&\&\\ \&/g" $SED "${pat}" < src/system/system_dependencies.f90 > \ src/system/system_dependencies.tmp mv -f src/system/system_dependencies.tmp src/system/system_dependencies.f90 ]) AC_CONFIG_FILES([src/system/debug_master.f90]) ###--------------------------------------------------------------------- ### Subdirectory src/combinatorics: standard algorithms AC_CONFIG_FILES([src/combinatorics/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/parsing: text-handling and parsing AC_CONFIG_FILES([src/parsing/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/rng: random-number generation AC_CONFIG_FILES([src/rng/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/expr_base: abstract expressions AC_CONFIG_FILES([src/expr_base/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/physics: particle-physics related functions AC_CONFIG_FILES([src/physics/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/qft: quantum (field) theory concepts as data types AC_CONFIG_FILES([src/qft/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/types: HEP and other types for common use AC_CONFIG_FILES([src/types/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/matrix_elements: process code and libraries AC_CONFIG_FILES([src/matrix_elements/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/me_methods: specific process code and interface AC_CONFIG_FILES([src/me_methods/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/particles: particle objects AC_CONFIG_FILES([src/particles/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/beams: beams and beam structure AC_CONFIG_FILES([src/beams/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/events: generic events and event I/O AC_CONFIG_FILES([src/events/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/vegas: VEGAS Monte Carlo adaptive integration AC_CONFIG_FILES([src/vegas/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/mci: multi-channel integration and event generation AC_CONFIG_FILES([src/mci/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/phase_space: parameterization and evaluation AC_CONFIG_FILES([src/phase_space/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/blha: BLHA support (NLO data record) AC_CONFIG_FILES([src/blha/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/gosam: GoSAM support (NLO amplitudes) AC_CONFIG_FILES([src/gosam/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/openloops: OpenLoops support (NLO amplitudes) AC_CONFIG_FILES([src/openloops/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/recola: Recola support (NLO amplitudes) AC_CONFIG_FILES([src/recola/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/fks: FKS subtraction algorithm AC_CONFIG_FILES([src/fks/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/matching: matching algorithms AC_CONFIG_FILES([src/matching/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/variables: Implementation of variable lists AC_CONFIG_FILES([src/variables/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/model_features: Model access and methods AC_CONFIG_FILES([src/model_features/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/models: Model-specific code AC_CONFIG_FILES([src/models/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/threshold AC_CONFIG_FILES([src/threshold/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/models/threeshl_bundle AC_CONFIG_FILES([src/models/threeshl_bundle/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/process_integration AC_CONFIG_FILES([src/process_integration/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/transforms: event transforms and event API AC_CONFIG_FILES([src/transforms/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/whizard-core AC_CONFIG_FILES([src/whizard-core/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/prebuilt AC_CONFIG_FILES([src/prebuilt/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/feynmf AC_CONFIG_FILES([src/feynmf/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory src/gamelan: WHIZARD graphics package AC_CONFIG_FILES([src/gamelan/Makefile]) AC_CONFIG_FILES([src/gamelan/whizard-gml], [chmod u+x src/gamelan/whizard-gml]) ###--------------------------------------------------------------------- ### Subdirectory share AC_CONFIG_FILES([share/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/doc AC_CONFIG_FILES([share/doc/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/models AC_CONFIG_FILES([share/models/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/cuts AC_CONFIG_FILES([share/cuts/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/beam-sim AC_CONFIG_FILES([share/beam-sim/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/susy AC_CONFIG_FILES([share/susy/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/examples AC_CONFIG_FILES([share/examples/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/tests AC_CONFIG_FILES([share/tests/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/muli AC_CONFIG_FILES([share/muli/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/interfaces AC_CONFIG_FILES([share/interfaces/Makefile]) AC_CONFIG_FILES([share/interfaces/py_whiz_setup.py]) ###--------------------------------------------------------------------- ### Subdirectory share/SM_tt_threshold_data AC_CONFIG_FILES([share/SM_tt_threshold_data/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory share/gui AC_CONFIG_FILES([share/gui/Makefile]) ###--------------------------------------------------------------------- ### Subdirectory tests AC_CONFIG_FILES([tests/Makefile]) AC_CONFIG_FILES([tests/models/Makefile]) AC_CONFIG_FILES([tests/models/UFO/Makefile]) AC_CONFIG_FILES([tests/models/UFO/SM/Makefile]) AC_CONFIG_FILES([tests/unit_tests/Makefile]) AC_CONFIG_FILES([tests/functional_tests/Makefile]) AC_CONFIG_FILES([tests/ext_tests_mssm/Makefile]) AC_CONFIG_FILES([tests/ext_tests_nmssm/Makefile]) AC_CONFIG_FILES([tests/ext_tests_ilc/Makefile]) AC_CONFIG_FILES([tests/ext_tests_shower/Makefile]) AC_CONFIG_FILES([tests/ext_tests_nlo/Makefile]) AC_CONFIG_FILES([tests/ext_tests_nlo_add/Makefile]) AC_CONFIG_FILES([tests/unit_tests/run_whizard_ut.sh], [chmod u+x tests/unit_tests/run_whizard_ut.sh]) AC_CONFIG_FILES([tests/functional_tests/run_whizard.sh], [chmod u+x tests/functional_tests/run_whizard.sh]) AC_CONFIG_FILES([tests/ext_tests_mssm/run_whizard.sh], [chmod u+x tests/ext_tests_mssm/run_whizard.sh]) AC_CONFIG_FILES([tests/ext_tests_nmssm/run_whizard.sh], [chmod u+x tests/ext_tests_nmssm/run_whizard.sh]) AC_CONFIG_FILES([tests/ext_tests_ilc/run_whizard.sh], [chmod u+x tests/ext_tests_ilc/run_whizard.sh]) AC_CONFIG_FILES([tests/ext_tests_shower/run_whizard.sh], [chmod u+x tests/ext_tests_shower/run_whizard.sh]) AC_CONFIG_FILES([tests/ext_tests_nlo/run_whizard.sh], [chmod u+x tests/ext_tests_nlo/run_whizard.sh]) AC_CONFIG_FILES([tests/ext_tests_nlo_add/run_whizard.sh], [chmod u+x tests/ext_tests_nlo_add/run_whizard.sh]) ###-------------------------------------------------------------------- ### Subdirectory scripts AC_CONFIG_FILES([scripts/Makefile]) AC_CONFIG_FILES([scripts/whizard-config], [chmod u+x scripts/whizard-config]) AC_CONFIG_FILES([scripts/whizard-setup.sh], [chmod u+x scripts/whizard-setup.sh]) AC_CONFIG_FILES([scripts/whizard-setup.csh], [chmod u+x scripts/whizard-setup.csh]) ### ONLY_FULL }}} ### ONLY_CIRCE1_AND_FULL {{{ ###-------------------------------------------------------------------- ### CIRCE1 subdirectory files AC_CONFIG_FILES([circe1/Makefile]) AC_CONFIG_FILES([circe1/src/Makefile]) AC_CONFIG_FILES([circe1/minuit/Makefile]) AC_CONFIG_FILES([circe1/tools/Makefile]) AC_CONFIG_FILES([circe1/share/Makefile]) AC_CONFIG_FILES([circe1/share/data/Makefile]) AC_CONFIG_FILES([circe1/share/doc/Makefile]) ### ONLY_CIRCE1_AND_FULL }}} ### ONLY_CIRCE2_AND_FULL {{{ ###-------------------------------------------------------------------- ### CIRCE2 subdirectory files AC_CONFIG_FILES([circe2/Makefile]) AC_CONFIG_FILES([circe2/src/Makefile]) AC_CONFIG_FILES([circe2/share/Makefile]) AC_CONFIG_FILES([circe2/share/doc/Makefile]) AC_CONFIG_FILES([circe2/share/examples/Makefile]) AC_CONFIG_FILES([circe2/share/data/Makefile]) AC_CONFIG_FILES([circe2/share/tests/Makefile]) AC_CONFIG_FILES([circe2/tests/Makefile]) AC_CONFIG_FILES([circe2/tests/test_wrapper.sh], [chmod u+x circe2/tests/test_wrapper.sh]) AC_CONFIG_FILES([circe2/tests/circe2_tool.sh], [chmod u+x circe2/tests/circe2_tool.sh]) AC_CONFIG_FILES([circe2/tests/generate.sh], [chmod u+x circe2/tests/generate.sh]) ### ONLY_CIRCE2_AND_FULL }}} ### ONLY_OMEGA_AND_FULL {{{ ###-------------------------------------------------------------------- ### OMEGA subdirectory files AC_CONFIG_FILES([omega/Makefile]) AC_CONFIG_FILES([omega/bin/Makefile]) AC_CONFIG_FILES([omega/lib/Makefile]) AC_CONFIG_FILES([omega/models/Makefile]) AC_CONFIG_FILES([omega/src/Makefile]) AC_CONFIG_FILES([omega/share/Makefile]) AC_CONFIG_FILES([omega/share/doc/Makefile]) AC_CONFIG_FILES([omega/extensions/Makefile]) AC_CONFIG_FILES([omega/extensions/people/Makefile]) AC_CONFIG_FILES([omega/extensions/people/jr/Makefile]) AC_CONFIG_FILES([omega/extensions/people/tho/Makefile]) AC_CONFIG_FILES([omega/tests/Makefile]) AC_CONFIG_FILES([omega/tests/UFO/Makefile]) AC_CONFIG_FILES([omega/tests/UFO/SM/Makefile]) +AC_CONFIG_FILES([omega/tests/UFO/MSSM/Makefile]) AC_CONFIG_FILES([omega/tools/Makefile]) AC_CONFIG_FILES([omega/scripts/Makefile]) AC_CONFIG_FILES([omega/scripts/omega-config], [chmod u+x omega/scripts/omega-config]) # Copy config.mli to the build directory (otherwise ocamlc and/or # ocamlopt would create one on their own). ###-------------------------------------------------------------------- AC_CONFIG_FILES([omega/src/config.ml]) case "$srcdir" in .) ;; *) $MKDIR_P ./omega/src rm -f ./omega/src/config.mli cp $srcdir/omega/src/config.mli ./omega/src/config.mli 1>/dev/null 2>&1;; esac ###-------------------------------------------------------------------- ### ONLY_OMEGA_AND_FULL }}} ### ONLY_VAMP_AND_FULL {{{ ###-------------------------------------------------------------------- ### VAMP subdirectory files AC_CONFIG_FILES([vamp/Makefile]) AC_CONFIG_FILES([vamp/src/Makefile]) AC_CONFIG_FILES([vamp/share/Makefile]) AC_CONFIG_FILES([vamp/share/doc/Makefile]) AC_CONFIG_FILES([vamp/tests/Makefile]) ### ONLY_VAMP_AND_FULL }}} ######################################################################## ###--------------------------------------------------------------------- ### Final output AC_OUTPUT() ### ONLY_FULL {{{ ######################################################################## ###--------------------------------------------------------------------- ### Final output WO_SUMMARY() ### ONLY_FULL }}} ########################################################################