BubbleProfiler  0.3.0
by Peter Athron, Csaba Balazs, Michael Bardsley, Andrew Fowlie, Dylan Harries & Graham White
sm_plus_singlet.py
Go to the documentation of this file.
1 from __future__ import print_function
2 
3 import argparse
4 from math import sqrt
5 import subprocess
6 
7 # Various physical constants (GeV)
8 vEW = 246.22 #0T Higgs VEV
9 Mh = 125.1 #0T Higgs mass
10 Mw = 80.385 #0T W mass
11 Mz = 91.1876 #0T Z mass
12 Mt = 173.34 #0T top quark mass
13 
14 # Dimensionless couplings derived from above constants
15 g = (2.0*Mw)/vEW # SU2L gauge coupling
16 gPrime = sqrt((4.0*(Mz**2 - Mw**2))/(vEW**2)) # U1Y gauge coupling
17 h_t = (sqrt(2)*Mt)/vEW # Top quark coupling
18 lambda_h = (Mh**2)/(2.0*vEW**2) # Higgs quartic coupling
19 
20 # Relative path to CLI tool
21 cli_tool = "../../build/bin/run_cmd_line_potential"
22 
23 # Returns a dict containing the potential string and the vacua locations
24 def generate_potential(T, Tc, lambda_m, lambda_s):
25  # Coefficients for leading order / 1 loop temperature correction
26  c_h = (1.0/48.0)*(9*(g**2) + 3*(gPrime**2) + 2*(6*h_t + 12*lambda_h + lambda_m));
27  c_s = (1.0/12.0)*(2*lambda_m + 3*lambda_s)
28 
29  # Temperature dependence of Higgs VEV
30  v = lambda T: sqrt(vEW**2 - (c_h/lambda_h)*T**2)
31 
32  # Temperature dependence of Higgs mass
33  m_h = lambda T: sqrt(2.0*lambda_h*(v(T)**2))
34 
35  # Singlet mass at critical temperature
36  m_s_Tc = sqrt(((v(Tc)**2)/2)*(lambda_m - 2*sqrt(lambda_h*lambda_s)));
37 
38  # Temperature dependence of singlet mass
39  m_s = lambda T: sqrt(m_s_Tc**2 + (((lambda_m*c_h)/(2*lambda_h)) - c_s)*(Tc**2 - T**2))
40 
41  # Effective coupling
42  lambda_e_sq = (m_s_Tc**4 - lambda_m*(v(Tc)**2)*m_s_Tc**2)/(v(Tc)**4)
43 
44  # Temperature dependence of singlet VEV
45  w = lambda T: sqrt((m_h(T)**2 * (lambda_m*v(T)**2 - 2*m_s(T)**2)) /
46  (v(T)**2 * (4*lambda_e_sq + lambda_m**2)))
47 
48  # Shape parameters
49  Rh = (m_h(Tc)**2)/(w(Tc)**2)
50  Rs = (m_s_Tc**2)/(v(Tc)**2)
51 
52  # We can now check that lambda_s satisfies the conditions to have a
53  # barrier between the vacua at Tc
54  lambda_smin = (4.0/lambda_h)*(2*c_h**2 - lambda_h*(lambda_m/6.0)
55  - 2*c_h*sqrt(c_h**2 - lambda_h*(lambda_m/6.0)))
56  lambda_smax = (lambda_m**2)/(4*lambda_h)
57 
58  if (lambda_s < lambda_smin) or (lambda_s > lambda_smax):
59  raise Exception("Error: for these parameters, lambda_s must be "
60  "in the interval ({}, {}) to obtain a barrier "
61  "between vacua at the critical temperature".format(
62  lambda_smin, lambda_smax))
63 
64 
65  potential_str = "(1.0/8.0)*{m_h_Tc}^2*{v_Tc}^2*(" \
66  "(4*{Rs}*h^2*s^2)/({Rh}*{v_Tc}^2*{w0}^2) + " \
67  "((h^2)/({v_Tc}^2) + (s^2)/({w0}^2) - 1)^2) " \
68  "- (1.0/2.0)*({Tc}^2 - {T}^2)*({c_h}*h^2 + {c_s}*s^2)"
69 
70  return {
71  "true_vac" : (v(T), 0),
72  "false_vac" : (0, w(T)),
73  "order_param" : v(Tc) / Tc,
74  "potential_str" : potential_str.format(
75  m_h_Tc=m_h(Tc), v_Tc=v(Tc), Rs=Rs, Rh=Rh, w0=w(Tc), Tc=Tc, T=T, c_h=c_h, c_s=c_s
76  )
77  }
78 
79 def run_profiler(data):
80  """
81  :param data: output of generate_potential...
82  :return: dict containing "cli_output","action"
83  """
84  command = [
85  cli_tool,
86  "--field", "h",
87  "--field", "s",
88  "--global-minimum", str(data["true_vac"][0]), str(data["true_vac"][1]),
89  "--local-minimum", str(data["false_vac"][0]), str(data["false_vac"][1]),
90  "--output-path", "output",
91  "--force-output",
92  #"--verbose",
93  "--potential", data["potential_str"]
94  ]
95 
96  #print "COMMAND: " + " ".join(command)
97 
98  cli_output = subprocess.check_output(command).splitlines()
99 
100  action = None
101 
102  for entry in cli_output:
103  if entry.startswith("# Action"):
104  action = float(entry.split(" ")[2])
105 
106  return {"cli_output" : cli_output, "action": action}
107 
108 if __name__ == "__main__":
109 
110  parser = argparse.ArgumentParser(description='SM + singlet: Z2-symmetric example from arxiv:1107.5441')
111 
112  parser.add_argument('-T', '--temp', type=float, required=True,
113  help='create potential at this temperature')
114  parser.add_argument('-Tc', '--crit-temp', type=float, required=True,
115  help='critical temperature for this potential')
116  parser.add_argument('--lambda-m', type=float, required=True,
117  help='mixed quartic coupling parameter')
118  parser.add_argument('--lambda-s', type=float, required=True,
119  help='singlet quartic coupling parameter')
120 
121  args = parser.parse_args()
122 
123  potential_data = generate_potential(args.temp, args.crit_temp, args.lambda_m, args.lambda_s)
124 
125  output = run_profiler(potential_data)
126 
127  print(output["action"])
128 
129 
130 
131 
132 
133 
def generate_potential(T, Tc, lambda_m, lambda_s)
def run_profiler(data)