Determining m^2 and lambda from Wilson Coefficients allowed in global fits in the literature fails
Closed this issue · 7 comments
Turning on only some WC's from the Higgs sector (e.g. 'phi', 'phiD', and 'phiBox') and choosing values within allowed ranges in e.g. https://arxiv.org/abs/2007.01296 leads to a crash.
The function 'vMh2_to_m2Lambda(v, Mh2, C)' throws the exception:
"No solution for m^2 and Lambda found. This problem can be caused by very large values for one or several Wilson coefficients."
I think the numerical minimization is not converging for some reason. I tried implementing scipy.optimize.basinhopping instead (slow but a bit better) when the first attempt fails and got more reasonable results (though it still crashes sometimes).
Happy to discuss this and share my temporary fix.
@JoseEliel can you maybe provide a small example code that produces the error? And (if it's not too big) can you also show how you fixed it using scipy.optimize.basinhopping
?
scipy.optimize.basinhopping
turns out it was taking a long time and often did not converge or gave a pretty bad solution.
I have now instead implemented a similar workaround using scipy.optimize.minimize instead.
It avoids issues by not necessarily finding a spot-on solution with the exact Higgs mass or VEV, but to my current need, it is good enough. In my tests, it outputs good points, but it does not feel like a general solution without implementing some checks that the points are not really far away from the input Higgs mass or VEV.
Nevertheless, this is what I have now (the method can be changed, I'm using Powell as I want to set bounds on the values for Lambda and m2, I've noticed that several solutions are possible for the same parameter point with Mh2 and v close enough to the wanted values):
def vMh2_to_m2Lambda(v, Mh2, C):
"""Function to numerically determine the parameters of the Higgs potential
given the physical Higgs VEV and mass."""
if C['phi'] == 0 and C['phiBox'] == 0 and C['phiD'] == 0:
return _vMh2_to_m2Lambda_SM(v, Mh2)
else:
def f0_scalar(x): # function to minimize
m2, Lambda = x
d = m2Lambda_to_vMh2(m2=m2.real, Lambda=Lambda.real,
C=C)
value = abs((d['v'] - v))**2 + abs(d['Mh2'] - Mh2)
return value
dSM = _vMh2_to_m2Lambda_SM(v, Mh2)
x0 = np.array([dSM['m2'], dSM['Lambda']])
res = scipy.optimize.minimize(f0_scalar, x0, method='Powell')
xres = res.x
#print(res)
return {'m2': xres[0], 'Lambda': xres[1]}
I have nothing in terms of handling an exception, but maybe different methods can be tried in succession. So far I have not had any problems though.
Originally I was getting the error when using Smelli when doing (I've taken away some not-relevant code, let me know if the example is clear enough)
# This sets up the likelihoods
gl = smelli.GlobalLikelihood(include_likelihoods=
{
'likelihood_higgs.yaml'
},fix_ckm=True, basis = 'Warsaw')
glp = gl.parameter_point({'phi':1e-5,'phiD':3e-6, 'phiBox':1e-8}, scale=1000)
print(glp.log_likelihood_global())
I think one big problem here is how vMh2_to_m2Lambda
determines the parameters m2
and Lambda
. It compare the values of v
and Mh2
as computed by m2Lambda_to_vMh2
to the values in the SM, where Mh2
is an input parameter and v
is related to the input parameter GF
. However, in the presence of a non-zero C['phi']
, the relation between v
and GF
is modified and this modification is currently not implemented. So I think that with the current implementation, a non-zero C['phi']
leads to an inconsistency and this is probably the reason why the determination of m2
and Lambda
fails. I'm working on fixing this but it's still work in progress.
@DavidMStraub what was actually the reason for implementing the determination of m2
and Lambda
numerically? I think one could use the analytical relations at linear order in the Wilson coefficients between m2
and Lambda
on one side and Mh2
and vb
on the other side.
I find the analytical expressions
m2 = Mh2 / 2 + vb**4 ( 3/4 * Cphi - Mh2/vb**2 * Ckin )
Lambda = Mh2/vb**2 + vb**2 ( 15/4 * Cphi + 2 * Mh2/vb**2 ( Cv - Ckin ) )
where
Ckin = CphiBox - 1/4 * CphiD
Cv = 1/4 * ( Cll_2112 + Cll_1221 - 2 * Cphil3_11 - 2 * Cphil3_22 )
vb = sqrt(1 / sqrt(2) / GF)
I think it would be good if someone (e.g. @jasonaebischerGIT 🙂) could check this, especially the Cv since what I have might be the relation in a redundant basis...
I remember that linearization was not possible, so don't invest much time now ... will answer in more detail later when I have time (and if I remember ...)
I remember that linearization was not possible, so don't invest much time now ... will answer in more detail later when I have time (and if I remember ...)
OK, i've implemented it now without linearization in PR #59. I think this should solve the issue.
Closing this issue as it is addressed in PR #59.