a Code for the Combination of Indirect and Direct Constraints on High Energy Physics Models Logo
SUSY.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 HEPfit Collaboration
3  *
4  *
5  * For the licensing terms see doc/COPYING.
6  */
7 
8 #include <math.h>
9 #include <sstream>
10 #include <stdexcept>
11 #include "StandardModelMatching.h"
12 #include "SUSY.h"
13 #include "SUSYSpectrum.h"
14 #include "EWSUSY.h"
15 
16 
17 const std::string SUSY::SUSYvars[NSUSYvars] = {
18  "m1r", "m1i", "m2r", "m2i", "m3" , "muHr", "muHi", "mHptree", "tanb", "Q_SUSY"
19 };
20 
21 SUSY::SUSY()
22 : StandardModel(),
23  msQhat2(3,3,0.), msUhat2(3,3,0.), msDhat2(3,3,0.),msLhat2(3,3,0.), msNhat2(3,3,0.), msEhat2(3,3,0.),
24  TUhat(3,3,0.), TDhat(3,3,0.), TNhat(3,3,0.), TEhat(3,3,0.),
25  mch(2,0.), mneu(4,0.), m_su2(6,0.), m_sd2(6,0.), m_sdresum2(6,0.), m_sn2(6,0.), m_se2(6,0.),
26  U(2,2,0.), V(2,2,0.), N(4,4,0.),
27  Ru(6,6,0.), Rd(6,6,0.), Rdresum(6,6,0.), Rn(6,6,0.), Rl(6,6,0.),SUSYM(*this)
28 {
29  SMM.setObj((StandardModelMatching&) SUSYM.getObj());
30  ModelParamMap.insert(std::make_pair("m1r", std::cref(m1.real())));
31  ModelParamMap.insert(std::make_pair("m1i", std::cref(m1.imag())));
32  ModelParamMap.insert(std::make_pair("m2r", std::cref(m2.real())));
33  ModelParamMap.insert(std::make_pair("m2i", std::cref(m2.imag())));
34  ModelParamMap.insert(std::make_pair("m3", std::cref(m3)));
35  ModelParamMap.insert(std::make_pair("muHr", std::cref(muH.real())));
36  ModelParamMap.insert(std::make_pair("muHi", std::cref(muH.imag())));
37  ModelParamMap.insert(std::make_pair("mHptree", std::cref(mHptree)));
38  ModelParamMap.insert(std::make_pair("tanb", std::cref(tanb)));
39  ModelParamMap.insert(std::make_pair("Q_SUSY", std::cref(Q_SUSY)));
40 
41  flag_h = true;
42 }
43 
44 SUSY::~SUSY()
45 {
46  if (IsModelInitialized()) {
47  if (mySUSYSpectrum != NULL) delete(mySUSYSpectrum);
48  if (myEWSUSY != NULL) delete(myEWSUSY);
49  }
50 }
52 // Initialization
53 
54 bool SUSY::InitializeModel()
55 {
56  if (!flag_h) mySUSYSpectrum = new SUSYSpectrum(*this);
57  else mySUSYSpectrum = NULL;
58  myEWSUSY = new EWSUSY(*this);
59  setFlagStr("Mw", "NORESUM");
60  setModelInitialized(StandardModel::InitializeModel());
61  setModelSUSY();
62  return(true);
63 }
64 
66 // Parameters
67 
68 bool SUSY::Init(const std::map<std::string, double>& DPars)
69 {
70  return(StandardModel::Init(DPars));
71 }
72 
73 bool SUSY::PreUpdate()
74 {
75  if(!StandardModel::PreUpdate()) return (false);
76 
77  return (true);
78 }
79 
80 bool SUSY::Update(const std::map<std::string, double>& DPars)
81 {
82  if(!PreUpdate()) return (false);
83 
84  UpdateError = false;
85 
86  for (std::map<std::string, double>::const_iterator it = DPars.begin(); it != DPars.end(); it++)
87  setParameter(it->first, it->second);
88 
89  if (UpdateError) return (false);
90 
91  if(!PostUpdate()) return (false);
92 
93  return (true);
94 }
95 
96 bool SUSY::PostUpdate()
97 {
98  if(!StandardModel::PostUpdate()) return (false);
99  /* Set the squark and slepton mass matrices and the trilinear-coupling matrices */
100  SetSoftTerms();
101  computeYukawas();
102 
103  /* use approximate GUT relation if M1 & M2 are zero */
104  if(m1.abs() == 0. && m2.abs() == 0.) {
105  m1.real() = m3/6.;
106  m2.real() = m3/3.;
107  }
108 
109  /* Compute Higgs and sparticle spectra without FeynHiggs */
110  /* sfermions */
111  for (int i = 0; i < 6; i++) {
112  m_sn2(i) = 0.; // heavy decoupled masses for i=3-5
113  m_se2(i) = 0.;
114  m_su2(i) = 0.;
115  m_sd2(i) = 0.;
116  m_sdresum2(i) = 0.;
117  for (int j = 0; j < 6; j++) {
118  /* R: first (second) index for mass (gauge) eigenstates */
119  /* UASf: second (third) index for gauge (mass) eigenstates */
120  Rn.assign(i, j, 0.);
121  Rl.assign(i, j, 0.);
122  Ru.assign(i, j, 0.);
123  Rd.assign(i, j, 0.);
124  Rdresum.assign(i, j, 0.);
125  }
126  }
127 
128  /* charginos */
129  for (int i = 0; i < 2; i++) {
130  mch(i) = 0.;
131  for (int j = 0; j < 2; j++) {
132  /* U and V: first (second) index for mass (gauge) eigenstates */
133  /* Ucha and VCha: first (second) index for gauge (mass) eigenstates */
134  U.assign(i, j, 0.);
135  V.assign(i, j, 0.);
136  }
137  }
138 
139  /* neutralinos */
140  for (int i = 0; i < 4; i++) {
141  mneu(i) = 0.;
142  for (int j = 0; j < 4; j++)
143  /* N: first (second) index for mass (gauge) eigenstates */
144  /* Zneu: first (second) index for gauge (mass) eigenstates */
145  N.assign(i, j, 0.);
146  }
147 
148  if (!mySUSYSpectrum->CalcHiggs(mh, saeff)) return (false);
149  if (!mySUSYSpectrum->CalcChargino(U, V, mch)) return (false);
150  if (!mySUSYSpectrum->CalcNeutralino(N, mneu)) return (false);
151  if (!mySUSYSpectrum->CalcSup(Ru, m_su2)) return (false);
152  mySUSYSpectrum->SortSfermionMasses(m_su2, Ru);
153  if (!mySUSYSpectrum->CalcSdown(Rd, m_sd2)) return (false);
154  mySUSYSpectrum->SortSfermionMasses(m_sd2, Rd);
155  if (!mySUSYSpectrum->CalcSneutrino(Rn, m_sn2)) return (false);
156  mySUSYSpectrum->SortSfermionMasses(m_sn2, Rn);
157  if (!mySUSYSpectrum->CalcSelectron(Rl, m_se2)) return (false);
158  mySUSYSpectrum->SortSfermionMasses(m_se2, Rl);
159 
160  /* Set the mass of the SM-like Higgs */
161  /* allowed range for the use of EWSMApproximateFormulae class */
162  if (mh[0] < 10. || mh[0] > 1000.) {
163  std::stringstream out;
164  out << mh[0];
165  throw std::runtime_error("SUSY::PostUpdate(): mh=" + out.str() + " is out of range for EWSMApproximateFormulae");
166  return (false);
167  }
168  mHl = mh[0];
169 
170  if( Q_SUSY == -1 || Q_SUSY == 0) Q_SUSY = sqrt( sqrt(m_su2(2) * m_su2(5)) );
171 
172  /* For EWSUSY class */
173  myEWSUSY->SetRosiekParameters();
174 
175  /* Necessary for updating SUSY and SUSY-derived parameters in SUSYMatching */
176  /* For SUSY Models only: The SM Matching needs to be updated here since StandardModel::PostUpdate() will not do it since the Higgs masses need to be computed. */
177  SUSYM.getObj().updateSMParameters();
178  SUSYM.getObj().updateSUSYParameters();
179 
180  return (true);
181 }
182 
183 void SUSY::setParameter(const std::string name, const double& value)
184 {
185  if (name.compare("m1r") == 0)
186  m1.real() = value;
187  else if (name.compare("m1i") == 0)
188  m1.imag() = value;
189  else if (name.compare("m2r") == 0)
190  m2.real() = value;
191  else if (name.compare("m2i") == 0)
192  m2.imag() = value;
193  else if (name.compare("m3") == 0)
194  m3 = value;
195  else if (name.compare("muHr") == 0)
196  muH.real() = value;
197  else if (name.compare("muHi") == 0)
198  muH.imag() = value;
199  else if (name.compare("mHptree") == 0)
200  mHptree = value;
201  else if (name.compare("tanb") == 0)
202  SetTanb(value);
203  else if (name.compare("Q_SUSY") == 0)
204  Q_SUSY = value;
205  else
206  StandardModel::setParameter(name, value);
207 }
208 
209 bool SUSY::CheckParameters(const std::map<std::string, double>& DPars)
210 {
211  for(int i=0; i<NSUSYvars; i++)
212  if(DPars.find(SUSYvars[i])==DPars.end()) {
213  std::cout << "ERROR: missing mandatory SUSY parameter " << SUSYvars[i] << std::endl;
214  raiseMissingModelParameterCount();
215  addMissingModelParameter(SUSYvars[i]);
216  }
217  return(StandardModel::CheckParameters(DPars));
218 }
219 
220 void SUSY::SetTanb(const double tanb)
221 {
222  this->tanb = tanb;
223  if (tanb < 0.)
224  throw std::runtime_error("SUSY::setTanb(): Negative tanb is not allowed");
225 
226  /* cosb and sinb are defined to be positive, corresponding to 0<=beta<=pi/2 */
227  cosb = sqrt(1. / (1. + tanb * tanb));
228  sinb = tanb * cosb;
229 }
230 
231 void SUSY::computeYukawas()
232 {
233  /* initializations */
238 
239  /* Convert the top-quark pole mass to the MSbar mass */
240  double mtbar = Mp2Mbar(mtpole, FULLNLO);
241 
242  double Q_SUSY_temp = Q_SUSY;
243  if( Q_SUSY == -1 || Q_SUSY == 0) Q_SUSY = sqrt( sqrt(msQhat2(2,2).abs() * msUhat2(2,2).abs() ) );
244 
245  for (int i = 0; i < 3; i++) {
246  /* Run the quark masses to scale Q */
247  if (i != 2)
248  mu_Q[i] = Mrun(Q_SUSY, getQuarks((quark)(UP + 2 * i)).getMass_scale(),
249  getQuarks((quark)(UP + 2 * i)).getMass(), FULLNLO);
250  else
251  mu_Q[i] = Mrun(Q_SUSY, mtbar, FULLNLO);
252  md_Q[i] = Mrun(Q_SUSY, getQuarks((quark)(DOWN + 2 * i)).getMass_scale(),
253  getQuarks((quark)(DOWN + 2 * i)).getMass(), FULLNLO);
254  me_Q[i] = getLeptons((lepton)(ELECTRON + 2 * i)).getMass();
255  mn_Q[i] = getLeptons((lepton)(NEUTRINO_1 + 2 * i)).getMass();
256 
257  /* Convert MSbar to DRbar */
258  mu_Q[i] = MS2DRqmass(Q_SUSY, mu_Q[i]);
259  md_Q[i] = MS2DRqmass(Q_SUSY, md_Q[i]);
260 
261  Yu.assign(i, i, mu_Q[i] / v2() * sqrt(2.));
262  Yd.assign(i, i, md_Q[i] / v1() * sqrt(2.));
263  Ye.assign(i, i, me_Q[i] / v1() * sqrt(2.));
264  Yn.assign(i, i, mn_Q[i] / v2() * sqrt(2.));
265  }
266 
267  Yu = myCKM.getCKM().transpose()*Yu;
268  Yn = Yn * myPMNS.getPMNS().hconjugate();
269 
270  Q_SUSY = Q_SUSY_temp;
271 
272 }
273 
274 void SUSY::SetSoftTerms()
275 {
276  // MsQ2, MsU2, MsD2, MsL2, MsN2, MsE2, TU, TD, TN and TE are set to 0 in the constructor.
277  // See also GeneralSUSY::SetSoftTerms().
278 }
279 
280 
282 // Flags
283 
284 bool SUSY::setFlag(const std::string name, const bool value)
285 {
286  bool res = false;
287  if(name.compare("Flag_H") == 0) {
288  flag_h = value;
289  res = true;
290  }
291  else
292  res = StandardModel::setFlag(name,value);
293 
294  return(res);
295 }
296 
297 
299 
300 double SUSY::v1() const
301 {
302  return (v() * cosb);
303 }
304 
305 double SUSY::v2() const
306 {
307  return (v() * sinb);
308 }
309 
310 double SUSY::getMGl() const
311 {
312  return m3;
313 }
314 
315 
317 
318 double SUSY::Mw() const
319 {
320  return StandardModel::Mw();
321  //return myEWSUSY->Mw_MSSM();
322 }
323 
324 double SUSY::Mw_dRho() const
325 {
326  return 0.;
327 }
StandardModel::setParameter
virtual void setParameter(const std::string name, const double &value)
A method to set the value of a parameter of StandardModel.
Definition: StandardModel.cpp:231
StandardModel::CheckParameters
virtual bool CheckParameters(const std::map< std::string, double > &DPars)
A method to check if all the mandatory parameters for StandardModel have been provided in model initi...
Definition: StandardModel.cpp:313
SUSYSpectrum
A class for calculating the Higgs and sparticle spectra at tree level.
Definition: SUSYSpectrum.h:23
gslpp::matrix
A base class for defining operations on matrices, both real and complex.
Definition: gslpp_matrix_base.h:21
StandardModel
A model class for the Standard Model.
Definition: StandardModel.h:474
StandardModel::setFlag
virtual bool setFlag(const std::string name, const bool value)
A method to set a flag of StandardModel.
Definition: StandardModel.cpp:378
StandardModel::Init
virtual bool Init(const std::map< std::string, double > &DPars)
A method to initialize the model parameters.
Definition: StandardModel.cpp:159
StandardModelMatching
A class for the matching in the Standard Model.
Definition: StandardModelMatching.h:26
StandardModel::PreUpdate
virtual bool PreUpdate()
The pre-update method for StandardModel.
Definition: StandardModel.cpp:172
gslpp::sqrt
complex sqrt(const complex &z)
Definition: gslpp_complex.cpp:385
SUSYSpectrum.h
StandardModel::PostUpdate
virtual bool PostUpdate()
The post-update method for StandardModel.
Definition: StandardModel.cpp:199
EWSUSY.h
StandardModel::InitializeModel
virtual bool InitializeModel()
A method to initialize the model.
Definition: StandardModel.cpp:140
StandardModelMatching.h
StandardModel::Mw
virtual double Mw() const
The SM prediction for the -boson mass in the on-shell scheme, .
Definition: StandardModel.cpp:944
SUSY.h
FULLNLO
Definition: OrderScheme.h:37
EWSUSY
A class for SUSY contributions to the EW precision observables.
Definition: EWSUSY.h:36