wilson-eft/wilson

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.