Source code for bfbrain.Potential_Functions

"""This module contains a number of SymPy functions for the quartic parts 
of scalar potentials which the program can parse for analysis. Any other 
potential functions you may want to use can be implemented by writing them 
in the same format as these.
"""
import sympy as sym
import numpy as np
from sympy import I
from sympy.physics.quantum.dagger import Dagger
from sympy.matrices.expressions import Trace

def _sim_Trace(M):
    """A function which simplifies the trace of some matrix.
    """
    return sym.simplify(Trace(M))

def _sim_expand(x):
    """A function which expands and simplifies an expression. Useful for 
    eliminating complex numbers from the potential, so NumPy can work with 
    only real numbers.
    """
    return sym.simplify(sym.expand(x))

#The square root of 2-- it comes up a lot.
_sqrt2 = sym.sqrt(2)



[docs] def V_Precustodial(phi, lam): """The "precustodial" generalization of the Georgi-Machacheck model given in arXiv:hep-ph/2012.13947. The quartic coefficients are parameterized in the same manner as Eq.(3.4) of that work. """ H = sym.Matrix([0, phi[0]]) A = sym.Matrix([[(phi[1] + I*phi[4])/_sqrt2, -phi[2] - I*phi[5]],[phi[3] + I*phi[6], -(phi[1] + I*phi[4])/_sqrt2]]) B = sym.Matrix([[phi[7], -phi[8] - I*phi[9]], [-phi[8] + I*phi[9], -phi[7]]])/_sqrt2 is2 = sym.Matrix([[0,1],[-1,0]]) TrHsq = (Dagger(H).dot(H)).simplify() TrAsq = Trace(A*Dagger(A)) TrBsq = Trace(B*Dagger(B)) QVec = sym.Matrix([(TrHsq**2)/4, (TrAsq**2)/4, _sim_Trace(A*Dagger(A)*A*Dagger(A))/4, (TrBsq**2)/24, TrHsq*TrAsq, Dagger(H)*A*Dagger(A)*H, TrHsq*TrBsq/2, TrAsq*TrBsq/2, _sim_expand(_sim_Trace(A*B)*_sim_Trace(Dagger(A)*B))/2, ((H.T)*is2*Dagger(A)*B*H-Dagger(H)*B*A*is2*(sym.conjugate(H)))/2 ]).applyfunc(sym.simplify) return QVec.dot(lam)
[docs] def V_GM(phi, lam): """The Georgi-Machacheck potential, following the conventions of Eq.(5) of arXiv:hep-ph/1404.2640 """ Phi = sym.Matrix([[phi[0], 0],[0, phi[0]]])/_sqrt2 X = sym.Matrix([[phi[1] - I*phi[2], phi[3] + I*phi[4], phi[5] + I*phi[6]],[-phi[7] + I*phi[8], _sqrt2*phi[9], phi[7] + I*phi[8]],[phi[5] - I*phi[6], -phi[3] + I*phi[4], phi[1] + I*phi[2]]])/_sqrt2 TrPhisq = _sim_Trace(Dagger(Phi).multiply(Phi)) TrXsq = _sim_Trace(Dagger(X).multiply(X)) tau = [sym.Matrix([[0,1/2],[1/2,0]]), sym.Matrix([[0,-I/2],[I/2,0]]), sym.Matrix([[1/2,0],[0,-1/2]])] # tau = sym.Array([[[0,1],[1,0]], [[0,-I],[I,0]], [[1,0],[0,-1]]]) t = [sym.Matrix([[0,1,0], [1,0,1], [0,1,0]])/_sqrt2, sym.Matrix([[0,-I,0],[I,0,-I],[0,I,0]])/_sqrt2, sym.Matrix([[1,0,0],[0,0,0],[0,0,-1]])] lam5_term = 0 for i in range(3): for j in range(3): lam5_term += _sim_Trace(Dagger(Phi)*tau[i]*Phi*tau[j])*_sim_Trace(Dagger(X)*t[i]*X*t[j]) QVec = sym.Matrix([TrPhisq**2, TrPhisq*TrXsq, _sim_expand(_sim_Trace(Dagger(X)*X*Dagger(X)*X)), TrXsq**2, - _sim_expand(lam5_term)]).applyfunc(sym.simplify) return QVec.dot(lam)
[docs] def V_2HDM(phi, lam): """The most general 2-Higgs doublet model, following the conventions of Eq.(1) of hep-ph/0609018 """ Phi1 = sym.Matrix([0, phi[0]]) Phi2 = sym.Matrix([phi[1] + I*phi[3], phi[2] + I*phi[4]]) phi1sq = Dagger(Phi1).dot(Phi1) phi2sq = sym.simplify(Dagger(Phi2).dot(Phi2)) phi12 = sym.simplify(Dagger(Phi1).dot(Phi2)) phi21 = sym.simplify(Dagger(Phi2).dot(Phi1)) QVec = (sym.Matrix([(phi1sq**2)/2, (phi2sq**2)/2, phi1sq*phi2sq, phi12*phi21, (phi12**2 + phi21**2)/2, I*(phi12**2 - phi21**2)/2, phi1sq*(phi12 + phi21), I*phi1sq*(phi12 - phi21), phi2sq*(phi12 + phi21), I*phi2sq*(phi12-phi21)])).applyfunc(sym.simplify) return QVec.dot(lam)
[docs] def V_3HDM(phi, lam): """A 3HDM with Z2xZ2 symmetry, for which no BFB conditions are known. """ phi1 = sym.Matrix([0, phi[0]]) phi2 = sym.Matrix([phi[1] + I*phi[2], phi[3] + I*phi[4]]) phi3 = sym.Matrix([phi[5] + I*phi[6], phi[7] + I*phi[8]]) phi1sq = _sim_Trace(Dagger(phi1).multiply(phi1)) phi2sq = _sim_Trace(Dagger(phi2).multiply(phi2)) phi3sq = _sim_Trace(Dagger(phi3).multiply(phi3)) phi12 = _sim_Trace(Dagger(phi1).multiply(phi2)) phi21 = _sim_Trace(Dagger(phi2).multiply(phi1)) phi13 = _sim_Trace(Dagger(phi1).multiply(phi3)) phi31 = _sim_Trace(Dagger(phi3).multiply(phi1)) phi23 = _sim_Trace(Dagger(phi2).multiply(phi3)) phi32 = _sim_Trace(Dagger(phi3).multiply(phi2)) QVec = sym.Matrix([phi1sq**2, phi2sq**2, phi3sq**2, phi1sq*phi2sq, phi1sq*phi3sq, phi2sq*phi3sq, phi12*phi21, phi13*phi31, phi23*phi32, (phi12**2 + phi21**2)/2, I*(phi12**2 - phi21**2)/2, (phi13**2 + phi31**2)/2, I*(phi13**2 - phi31**2)/2, (phi23**2 + phi32**2)/2, I*(phi23**2-phi32**2)/2]).applyfunc(_sim_expand).applyfunc(sym.simplify) return QVec.dot(lam)
[docs] def V_3HDM_U1(phi, lam): """A 3HDM with U1xU1 symmetry. """ phi1 = sym.Matrix([0, phi[0]]) phi2 = sym.Matrix([phi[1] + I*phi[2], phi[3] + I*phi[4]]) phi3 = sym.Matrix([phi[5] + I*phi[6], phi[7] + I*phi[8]]) phi1sq = _sim_Trace(Dagger(phi1).multiply(phi1)) phi2sq = _sim_Trace(Dagger(phi2).multiply(phi2)) phi3sq = _sim_Trace(Dagger(phi3).multiply(phi3)) phi12 = _sim_Trace(Dagger(phi1).multiply(phi2)) phi21 = _sim_Trace(Dagger(phi2).multiply(phi1)) phi13 = _sim_Trace(Dagger(phi1).multiply(phi3)) phi31 = _sim_Trace(Dagger(phi3).multiply(phi1)) phi23 = _sim_Trace(Dagger(phi2).multiply(phi3)) phi32 = _sim_Trace(Dagger(phi3).multiply(phi2)) QVec = sym.Matrix([phi1sq**2, phi2sq**2, phi3sq**2, phi1sq*phi2sq, phi1sq*phi3sq, phi2sq*phi3sq, phi12*phi21, phi13*phi31, phi23*phi32]).applyfunc(_sim_expand).applyfunc(sym.simplify) return QVec.dot(lam)