flavour
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Formulas.h
Go to the documentation of this file.
1 #ifndef Formulas_H
2 #define Formulas_H
3 
4 /*
5 #include "widthcalc.h"
6 
7 #include "TH2F.h"
8 #include "TProfile2D.h"
9 #include "TCanvas.h"
10 #include <iostream>
11 
12 #include "Math/Polynomial.h"
13 #include "Math/Interpolator.h"
14 #include <complex>
15 #include <cmath>
16 */
17 using namespace std;
18 
19 namespace BGLmodels{
20 
21 
28 
32 class Fermion{
33 public:
34 
35  Fermion(FType t, FIsospin i, FFlavour f=fAny, FCharge p=cParticle, FHelicity h=hAny): type(t), isospin(i), flavour(f), particle(p), helicity(h){}
36 
42 };
43 
47 class Meson{
48 public:
49 
50  Meson(const Fermion& qq1, const Fermion& qq2, ex m, ex d): q1(qq1), q2(qq2), mass(m), decay_factor(d){}
51 
52  Fermion q1, q2;
53  ex mass;
55 };
56 
57 constexpr double M_GF=1.166371e-5;
58 constexpr double M_MZ=91.1876;
59 constexpr double M_MW=80.398;
60 constexpr double M_cos2=std::pow(M_MW/M_MZ,2);
61 constexpr double M_Mu[3]={2.4e-3,1.29,172.9};
62 constexpr double M_Md[3]={5.3e-3,95e-3,4.2};
63 constexpr double M_Ml[3]={0.510998910e-3,105.6583715e-3,1776.82e-3};
64 
65 typedef std::complex<double> CD;
66 typedef std::array<CD,3> Vector3c;
67 typedef std::array<std::array<CD,3>,3> Matrix3c;
68 
72 class Matrixx: public Matrix3c{
73 public:
74 Matrixx(): Matrix3c(){}
75 Matrixx(const Matrix3c& a): Matrix3c(a){}
77 //Matrixx(std::initializer_list<Vector3c> l):
78 
79 Matrixx(double c12, double c13, double c23,double s12, double s13, double s23, CD e13,CD e13t):
80  Matrix3c({
81  Vector3c({c12*c13,s12*c13,s13*e13t}),
82  Vector3c({-s12*c23-c12*s23*s13*e13,c12*c23-s12*s23*s13*e13,s23*c13}),
83  Vector3c({s12*s23-c12*c23*s13*e13,-c12*s23-s12*c23*s13*e13,c13*c23})
84  }){}
85 
86 Matrixx(double t12, double t13, double t23, double d13):
87  Matrixx(std::cos(t12),std::cos(t13),std::cos(t23),std::sin(t12),std::sin(t13),std::sin(t23),std::exp(CD(0,d13)),std::exp(CD(0,-d13))){}
89 const Matrixx conjugate() const{
90  Matrixx res;
91  for(uint i=0;i<3;i++)
92  for(uint j=0;j<3;j++)
93  res[i][j]=std::conj((*this)[j][i]);
94  return res;
95  }
96 };
97 
98 const Matrixx Vnl=Matrixx(33.6*M_PI/180,9.11*M_PI/180,40.4*M_PI/180,M_PI/4).conjugate();
99 const Matrixx Vud(13.04*M_PI/180,0.201*M_PI/180,2.38*M_PI/180,1.2);
100 
101 
105 class Mixes{
106 public:
107 
108  Mixes(ex tanb0,ex cp0,int genL=2,int genQ=2,int lup=0,int qup=0,int mssm=0):M(Matrix(),2,2),N(Matrix(),2,2),VN(Matrix(),2,2),N_(Matrix(),2,2),VN_(Matrix(),2,2),cp(cp0)
109  {
110  tanb=tanb0;
111  M[tLepton][iDown]=Matrix(possymbol("m_e"),possymbol("m_\\mu"),possymbol("m_\\tau"));
112  M[tQuark][iUp]=Matrix(possymbol("m_u"),possymbol("m_c"),possymbol("m_t"));
113  M[tQuark][iDown]=Matrix(possymbol("m_d"),possymbol("m_s"),possymbol("m_b"));
114  const char * ln[3]={"1","2","3"};
115  const char * ll[3]={"e","\\mu","\\tau"};
116  const char * lu[3]={"u","c","t"};
117  const char * ld[3]={"d","s","b"};
118 
119  V.push_back(Matrix("U",ln,ll));
120  V.push_back(Matrix("V",lu,ld));
121 
122 
123  int up[2];
124  up[0]=lup;
125  up[1]=qup;
126 
127  vector< Matrix > delta;
128 
129  vector<int> gL(3,0);
130  gL[genL]=1;
131  //Leptons
132  delta.push_back(Matrix(gL[0],gL[1],gL[2]));
133  //Quarks
134  vector<int> gQ(3,0);
135  gQ[genQ]=1;
136  delta.push_back(Matrix(gQ[0],gQ[1],gQ[2]));
137 
138  for(uint i=0;i<2;i++){
139  if(mssm){
140  //Nu
141  N_[i][0]=0;
142  //Nd
143  N_[i][1]=0;
144  //VNd
145  VN_[i][1]=Matrix(tanb)*V[i];
146  //Nu*V
147  VN_[i][0]=Matrix(1/tanb)*V[i];
148  }
149  else if(up[i]){
150  //Nu
151  N_[i][0]=Matrix(tanb)+Matrix(-tanb-1/tanb)*V[i]*delta[i]*V[i].conjugate();
152  //Nd
153  N_[i][1]=Matrix(tanb)+Matrix(-tanb-1/tanb)*delta[i];
154  //VNd
155  VN_[i][1]=Matrix(tanb)*V[i]+Matrix(-tanb-1/tanb)*V[i]*delta[i];
156  //Nu*V
157  VN_[i][0]=Matrix(-1)*(Matrix(tanb)*V[i]+Matrix(-tanb-1/tanb)*V[i]*delta[i]);
158  }else{
159  //Nu
160  N_[i][0]=Matrix(tanb)+Matrix(-tanb-1/tanb)*delta[i];
161  //Nd
162  N_[i][1]=Matrix(tanb)+Matrix(-tanb-1/tanb)*V[i].conjugate()*delta[i]*V[i];
163  //VNd
164  VN_[i][1]=Matrix(tanb)*V[i]+Matrix(-tanb-1/tanb)*delta[i]*V[i];
165  //Nu*V
166  VN_[i][0]=Matrix(-1)*(Matrix(tanb)*V[i]+Matrix(-tanb-1/tanb)*delta[i]*V[i]);
167  }
168 
169  N[i][0]=N_[i][0]*M[i][0];
170  N[i][1]=N_[i][1]*M[i][1];
171  VN[i][1]=VN_[i][1]*M[i][1];
172  VN[i][0]=M[i][0]*VN_[i][0];
173  }
174  appendtolst(replacements);
175 
176 
177  }
178  ex mass(const Fermion& f) const{return M[f.type][f.isospin][f.flavour][f.flavour];}
179  double massnum(const Fermion& f) const{return ex_to<numeric>(M[f.type][f.isospin][f.flavour][f.flavour].subs(replacements)).to_double();}
180 
181  void appendtolst(lst & reps) const{//,vector<ex>& var_errors
182  reps.append(M[0][1][0][0]==0.510998910e-3);
183  reps.append(M[0][1][1][1]==105.6583715e-3);
184  reps.append(M[0][1][2][2]==1776.82e-3);
185 
186  reps.append(M[1][0][0][0]==2.4e-3);
187  reps.append(M[1][0][1][1]==1.29);
188  reps.append(M[1][0][2][2]==172.9);
189 
190  reps.append(M[1][1][0][0]==5.3e-3);
191  reps.append(M[1][1][1][1]==95e-3);
192  reps.append(M[1][1][2][2]==4.2);
193 
194  vector< Matrix > Vn;
195  Vn.push_back(Matrix(33.6*M_PI/180,9.11*M_PI/180,40.4*M_PI/180,M_PI/4).conjugate());
196  Vn.push_back(Matrix(13.04*M_PI/180,0.201*M_PI/180,2.38*M_PI/180,1.2));
197  for(uint i=0; i<2;i++)
198  for(uint j=0; j<3;j++)
199  for(uint k=0; k<3;k++)
200  reps.append(V[i][j][k]==Vn[i][j][k]);
201  }
202 
203  lst reps;
204  vector< Matrix > V;
208 
211 
213  ex cp;
214  ex tanb;
215 };
216 
217 
221 class calcuOblique:public calcu{
222  public:
223 
224  calcuOblique(): c1(0.741),c2(0.671), g1(c1*0.02,0.0397), g2(c2*0.02,0.1579) {}
225  double operator()(const parameters & p) const{
226  double y=p[1].value;
227  double z=p[2].value;
228  double w=p[3].value;
229 
230  double TT=(F(y*y,z*z)-F(w*w,z*z)+F(y*y,w*w))/(16*M_PI*M_MW*M_MW*(1-M_cos2));
231  double Sparam=(std::pow(1-2*M_cos2,2)*G(y*y,y*y,M_MZ*M_MZ)+G(z*z,w*w,M_MZ*M_MZ)+2*log(z*w/y/y))/24/M_PI;
232 
233  double T1=c1*TT-c2*Sparam;
234  double T2=c2*TT+c1*Sparam;
235 
236  return g1.loglikelihood(T1)+g2.loglikelihood(T2);
237  }
238  double F(double x,double y) const{
239  if(x==y) return 0;
240  return (x+y)/2-x*y*log(x/y)/(x-y);
241  }
242  double f(double t,double r) const{
243  if(r==0) return 0;
244  if(r<0) return 2*sqrt(-r)*atan(sqrt(-r)/t);
245  return sqrt(r)*log(fabs((t-sqrt(r))/(t+sqrt(r))));
246  }
247 
248  double lnxy_xy(double x, double y) const{
249  if(x==y) return 1/y;
250  return log(x/y)/(x-y);
251  }
252  double G(double x,double y,double z) const{
253  double t=x+y-z;
254  double r=std::pow(z,2)-2*z*(x+y)+std::pow(x-y,2);
255  return -16.0/3+5*(x+y)/z-2*std::pow((x-y)/z,2)+r/std::pow(z,3)*f(t,r)+\
256  3/z*lnxy_xy(x,y)*(std::pow(x,2)+std::pow(y,2)+(x-y)/std::pow(z,2)*(-std::pow(x,2)+std::pow(y,2)+std::pow(x-y,3)/3));
257  }
258  const double c1,c2;
259  const gauss2obs g1,g2;
260 };
261 
262 constexpr double mt_mt=163.3,mt_mW=174.2,mt_mb=261.8;
263 
264 constexpr double C7SM(double x){
265  return ((1/(x-1)+3)*x*std::log(x)+(-8*x*x-5*x+7)/6)*x/4/std::pow(x-1,3);
266  }
267 
268 constexpr double C8SM(double x){
269  return (-3/(x-1)*x*std::log(x)+(-x*x+5*x+2)/2)*x/4/std::pow(x-1,3);
270  }
271 
272 constexpr double C7SM_MW=C7SM(std::pow(mt_mW/M_MW,2)),C7SM_Mt=C7SM(std::pow(mt_mt/M_MW,2)),C7SM_Mb=-0.353;
273 constexpr double C8SM_MW=C8SM(std::pow(mt_mW/M_MW,2)),C8SM_Mt=C8SM(std::pow(mt_mt/M_MW,2)),C8SM_Mb=C8SM(std::pow(mt_mb/M_MW,2));
274 
275 
279 class calcubtosgamma2:public calcu{
280  public:
281 
282 constexpr static double calN=2.567e-3;
283 constexpr static double a=7.8221,aee=0.4384,aer=-1.6981,a77=0.8161,a7r=4.8802,a7er=-0.7827,a88=0.0197,a8r=0.5680;
284 constexpr static double a8er=-0.0601,a87r=0.1923,a7i=0.3546,a8i=-0.0987,aei=2.4997,a87i=-0.0487,a7ei=-0.9067,a8ei=-0.0661;
285 
286  calcubtosgamma2(const Mixes& mixes):
287  ii(2),
288  g1(3.43e-4,sqrt(2)*0.23e-4),
289  g2(9.2e-6,4e-6),
290  ratio(0){
291  //cout<<"C7 "<<C7SM_Mt<<" "<<C7SM_MW<<" "<<C7SM(std::pow(261.8/M_MW,2))<<endl;
292  double res[2];
293  constexpr double C7SM_[2]={C7SM_Mt,C7SM_Mt};
294  constexpr double C8SM_[2]={C8SM_Mt,C8SM_Mt};
295  for(uint j=0; j<2; j++){
296  const uint i=2;
297  const CD epsilon=conj(Vud[0][j])*Vud[0][i]/conj(Vud[2][j])/Vud[2][i];
298  const double upsilon=norm(conj(Vud[2][j])*Vud[2][i]/Vud[1][i]);
299  const CD R7=(C7SM_Mt)/C7SM_MW;
300  const CD R8=(C8SM_Mt)/C8SM_MW;
301  const CD R7_=0;
302  const CD R8_=0;
303 
304  res[j]=a+aee*norm(epsilon)+aer*epsilon.real()+aei*epsilon.imag();
305  res[j]+=a77*(norm(R7)+norm(R7_))+a7r*R7.real()+a7i*R7.imag();
306  res[j]+=a88*(norm(R8)+norm(R8_))+a8r*R8.real()+a8i*R8.imag();
307  res[j]+=a87r*(R8*conj(R7)+R8_*conj(R7_)).real()+a7er*(R7*conj(epsilon)).real()+a8er*(R8*conj(epsilon)).real();
308  res[j]+=a87i*(R8*conj(R7)+R8_*conj(R7_)).imag()+a7ei*(R7*conj(epsilon)).imag()+a8er*(R8*conj(epsilon)).imag();
309  res[j]*=calN/100*upsilon;
310  }
311  //cout<<"Btosgamma "<<res[0]/9.2e-6<<" "<<res[1]/3.15e-4<<endl;
312  ifstream finter("interpolation.dat");
313 
314  if(!finter.is_open()){
315  cout<<"ERROR: interpolation.dat not found"<<endl;
316  exit(1);
317  }
318  vector<double> vinter0, vinter1, vinter2;
319  while(!finter.eof()){
320  double a=0,b=0,c=0;
321  finter>>a>>b>>c;
322  if(a!=0){
323  // cout<<a<<" "<<b<<" "<<c<<endl;
324  vinter0.push_back(a);
325  vinter1.push_back(b);
326  vinter2.push_back(c);
327  }
328  }
329 
330  inter1.SetData(vinter0,vinter1);
331  inter2.SetData(vinter0,vinter2);
332 
333  finter.close();
334 
335  ifstream finter2("masses.dat");
336 
337  if(!finter2.is_open()){
338  cout<<"ERROR: masses.dat not found"<<endl;
339  exit(1);
340  }
341  vector<vector<double> > m_(7);
342  while(!finter2.eof()){
343  for(uint i=0; i<7;i++) {
344  double a=0;
345  finter2>>a;
346 
347  if(a!=0) {
348  if(i==0) a=log(a);
349  else if(i<4) a*=1e-3;
350  m_[i].push_back(a);
351  // cout<<a<<" ";
352  }
353  } //cout<<endl;
354  }
355  for(uint i=0; i<3;i++) {
356  Md_[i].SetData(m_[0],m_[2*i+1]);
357  Mu_[i].SetData(m_[0],m_[2*i+2]);
358  }
359 // cout<<"Eval "<<Mu_[2].Eval(log(100.0))<<endl;
360 // cout<<"Eval "<<Md_[2].Eval(log(100.0))<<endl;
361 
362  finter2.close();
363 
364  ifstream finter3("interpolation2.dat");
365 
366  if(!finter3.is_open()){
367  cout<<"ERROR: interpolation2.dat not found"<<endl;
368  exit(1);
369  }
370  vector<double> vinter20, vinter21, vinter22;
371  while(!finter3.eof()){
372  double a=0,b=0,c=0;
373  finter3>>a>>b>>c;
374  if(a!=0){
375  // cout<<a<<" "<<b<<" "<<c<<endl;
376  vinter20.push_back(a);
377  vinter21.push_back(b);
378  vinter22.push_back(c);
379  }
380  }
381 
382  inter3.SetData(vinter20,vinter21);
383  inter4.SetData(vinter20,vinter22);
384 
385  finter3.close();
386 
387  vector<ex> vex(24);
388 
389  const uint i=ii;
390  for(uint j=0;j<2;j++)
391  for(uint k=0;k<3;k++){
392  vex[j*6+k*2+0]=mixes.VN_[tQuark][iUp][k][j].conjugate()*mixes.VN_[tQuark][iUp][k][i];
393  vex[j*6+k*2+1]=mixes.N_[tQuark][iDown][j][k]*mixes.N_[tQuark][iDown][i][k].conjugate();
394  vex[j+k*2+12]=-mixes.VN_[tQuark][iUp][k][j].conjugate()*mixes.VN_[tQuark][iDown][k][i];
395  vex[j+k*2+18]=mixes.VN_[tQuark][iDown][k][j].conjugate()*mixes.VN_[tQuark][iDown][k][i];
396  }
397  lst l;
398  for(uint k=0;k<vex.size();k++){
399  vex[k]=vex[k].subs(mixes.replacements).evalf();
400  l.append(vex[k].real_part());
401  l.append(vex[k].imag_part());
402  }
403  compile_ex(l, lst(mixes.tanb), fp);
404  }
405 
406  double operator()(const parameters & p) const{
407  double tanb=p[0].value;
408  double y=p[1].value;
409  double z=p[2].value;
410  double w=p[3].value;
411  double McH=y, MR=z, MI=w;
412 
413  double y0=y;
414  if(y<mt_mt) y0=mt_mt;
415  double QCD1[2]={inter3.Eval(y0),inter1.Eval(y)};
416  double QCD2[2]={inter4.Eval(y0),inter2.Eval(y)};
417 
418  double Mu[3],Md[3];
419 
420  for(uint i=0;i<3;i++){
421  Mu[i]=Mu_[i].Eval(log(y));
422  Md[i]=Md_[i].Eval(log(z));
423  }
424  const uint i=ii;
425  CD CC7[2],DD7[2],CC8[2],DD8[2];
426  double res[2];
427  // constexpr double C7SM_[2]={C7SM_Mt,C7SM_Mb};
428  // constexpr double C8SM_[2]={C8SM_Mt,C8SM_Mb};
429 
430  std::array<double,48> ret;
431  const int n=1,m=48;
432  fp(&n,&(tanb),&m,&(ret[0]));
433  for(uint j=0;j<2;j++){
434  const double mbottom=Md[i];
435  const double mstrange=Md[j];
436  //ex mbottom=mixes.M[tQuark][iDown][i][i];
437  //ex mstrange=mixes.M[tQuark][iDown][j][j];
438 
439  CD C7,D7,C8,D8;
440  for(uint k=0;k<3;k++){
441  double mup=Mu[k];
442  double mdown=Md[k];
443  //ex mup=mixes.M[tQuark][iUp][k][k];
444  //ex mdown=mixes.M[tQuark][iDown][k][k];
445  //f1+=
446  double mmu=std::pow(mup/McH,2);
447  double mmdR=std::pow(mdown/MR,2);
448  double mmdI=std::pow(mdown/MI,2);
449 
450  double A0u=A0(mmu);
451  double A1u=A1(mmu);
452  double A2u=A2(mmu);
453  double A3u=A3(mmu);
454  double A0d=(A0(mmdR)+A0(mmdI));
455  double A1d=(A1(mmdR)-A1(mmdI));
456 
457  CD f1(ret[j*12+4*k+0],ret[j*12+4*k+1]);
458  C7+=f1*A2u;
459  C8+=-2.0*f1*A0u;
460 
461  CD f2=CD(ret[36+j*2+4*k+0],ret[36+j*2+4*k+1])*mstrange*mbottom/mup/mup;
462  //CD f2=f1*mstrange*mbottom/mup/mup;
463  D7+=f2*A2u;
464  D8+=-2.0*f2*A0u;
465 
466  CD f12(ret[24+j*2+4*k+0],ret[24+j*2+4*k+1]);
467  C7+=f12*A3u;
468  C8+=2.0*f12*A1u;
469 
470  CD f4(ret[j*12+4*k+2],ret[j*12+4*k+3]);
471  C7+=f4*A0d/3.0;
472  C8+=-f4*A0d;
473 
474  C7+=f4*A1d/3.0;
475  C8+=-f4*A1d;
476 
477  CD f6=f4*mstrange*mbottom/mdown/mdown;
478  D7+=f6*A0d/3.0;
479  D8+=-f6*A0d;
480  }
481  uint j0=j;
482  CC7[j]=(QCD1[j]*C7+QCD2[j]*C8)/2.0/conj(Vud[2][j])/Vud[2][i];
483  DD7[j]=(QCD1[j]*D7+QCD2[j]*D8)/2.0/conj(Vud[2][j])/Vud[2][i];
484  const double QCD3=(3*QCD2[j]/8+QCD1[j]);
485  CC8[j]=QCD3*C8/2.0/conj(Vud[2][j])/Vud[2][i];
486  DD8[j]=QCD3*D8/2.0/conj(Vud[2][j])/Vud[2][i];
487  const CD epsilon=conj(Vud[0][j])*Vud[0][i]/conj(Vud[2][j])/Vud[2][i];
488  const double upsilon=norm(conj(Vud[2][j])*Vud[2][i]/Vud[1][i]);
489  const CD R7=(C7SM_Mt+CC7[j])/C7SM_MW;
490  const CD R8=(C8SM_Mt+CD(0)*CC8[j])/C8SM_MW;
491  const CD R7_=(DD7[j])/C7SM_MW;
492  const CD R8_=CD(0)*(DD8[j])/C8SM_MW;
493 
494 
495  res[j]=a+aee*norm(epsilon)+aer*epsilon.real()+aei*epsilon.imag();
496  res[j]+=a77*(norm(R7)+norm(R7_))+a7r*R7.real()+a7i*R7.imag();
497  res[j]+=a88*(norm(R8)+norm(R8_))+a8r*R8.real()+a8i*R8.imag();
498  res[j]+=a87r*(R8*conj(R7)+R8_*conj(R7_)).real()+a7er*(R7*conj(epsilon)).real()+a8er*(R8*conj(epsilon)).real();
499  res[j]+=a87i*(R8*conj(R7)+R8_*conj(R7_)).imag()+a7ei*(R7*conj(epsilon)).imag()+a8er*(R8*conj(epsilon)).imag();
500  res[j]*=calN/100*upsilon;
501 
502  /*res[j]=a+aee*norm(epsilon)+aer*epsilon.real()+aei*epsilon.imag();
503  res[j]+=a77*(norm(R7)+norm(R7_))+a7r*1+a7i*0;
504  res[j]+=a88*(norm(R8)+norm(R8_))+a8r*R8.real()+a8i*R8.imag();
505  res[j]+=a87r*1+a7er*(conj(epsilon)).real()+a8er*(R8*conj(epsilon)).real();
506  res[j]+=a87i*0+a7ei*(conj(epsilon)).imag()+a8er*(R8*conj(epsilon)).imag();
507  res[j]*=calN/100*upsilon;
508  */
509  }
510  double r1=3.15e-4+0.00247*(norm(CC7[1])+norm(DD7[1])-0.706*CC7[1].real());
511 
512  //ratio=res[0]/9.2e-6;
513  //cout<<"RATIO "<<ratio<<endl;
514  return g1.loglikelihood(r1)+0*g2.loglikelihood(res[0]);
515  }
516 
517  double width(const parameters & p, int option=0) const{
518  double tanb=p[0].value;
519  double y=p[1].value;
520  double z=p[2].value;
521  double w=p[3].value;
522  double McH=y, MR=z, MI=w;
523 
524  double y0=y;
525  if(y<mt_mt) y0=mt_mt;
526  double QCD1[2]={inter3.Eval(y0),inter1.Eval(y)};
527  double QCD2[2]={inter4.Eval(y0),inter2.Eval(y)};
528 
529  double Mu[3],Md[3];
530 
531  for(uint i=0;i<3;i++){
532  Mu[i]=Mu_[i].Eval(log(y));
533  Md[i]=Md_[i].Eval(log(z));
534  }
535  const uint i=ii;
536  CD CC7[2],DD7[2],CC8[2],DD8[2];
537  double res[2];
538  // constexpr double C7SM_[2]={C7SM_Mt,C7SM_Mb};
539  // constexpr double C8SM_[2]={C8SM_Mt,C8SM_Mb};
540 
541  std::array<double,24> ret;
542  const int n=1,m=24;
543  fp(&n,&(tanb),&m,&(ret[0]));
544  for(uint j=0;j<2;j++){
545  const double mbottom=Md[i];
546  const double mstrange=Md[j];
547  //ex mbottom=mixes.M[tQuark][iDown][i][i];
548  //ex mstrange=mixes.M[tQuark][iDown][j][j];
549 
550  CD C7,D7,C8,D8;
551  for(uint k=0;k<3;k++){
552  double mup=Mu[k];
553  double mdown=Md[k];
554  //ex mup=mixes.M[tQuark][iUp][k][k];
555  //ex mdown=mixes.M[tQuark][iDown][k][k];
556  //f1+=
557  double mmu=std::pow(mup/McH,2);
558  double mmdR=std::pow(mdown/MR,2);
559  double mmdI=std::pow(mdown/MI,2);
560  double A0u=0,A1u=0, A2u=0, A3u=0, A0d=0, A1d=0;
561 
562  if(option==0 || option==1){
563  A0u=A0(mmu);
564  A1u=A1(mmu);
565  A2u=A2(mmu);
566  A3u=A3(mmu);
567  }
568  if(option==0 || option==2){
569  A0d=(A0(mmdR)+A0(mmdI));
570  A1d=(A1(mmdR)-A1(mmdI));
571  }
572  if(option==3){
573  A0d=(A0(mmdR));
574  A1d=(A1(mmdR));
575  }
576  if(option==4){
577  A0d=(A0(mmdI));
578  A1d=(-A1(mmdI));
579  }
580 
581  CD f1(ret[j*12+4*k+0],ret[j*12+4*k+1]);
582  C7+=f1*A2u;
583  C8+=-2.0*f1*A0u;
584 
585  CD f2=f1*mstrange*mbottom/mup/mup;
586  D7+=f2*A2u;
587  D8+=-2.0*f2*A0u;
588 
589  C7+=-f1*A3u;
590  C8+=-2.0*f1*A1u;
591 
592  CD f4(ret[j*12+4*k+2],ret[j*12+4*k+3]);
593  C7+=f4*A0d/3.0;
594  C8+=-f4*A0d;
595 
596  C7+=f4*A1d/3.0;
597  C8+=-f4*A1d;
598 
599  CD f6=f4*mstrange*mbottom/mdown/mdown;
600  D7+=f6*A0d/3.0;
601  D8+=-f6*A0d;
602 
603  }
604  uint j0=j;
605  CC7[j]=(QCD1[j]*C7+QCD2[j]*C8)/2.0/conj(Vud[2][j])/Vud[2][i];
606  DD7[j]=(QCD1[j]*D7+QCD2[j]*D8)/2.0/conj(Vud[2][j])/Vud[2][i];
607  const double QCD3=(3*QCD2[j]/8+QCD1[j]);
608  CC8[j]=QCD3*C8/2.0/conj(Vud[2][j])/Vud[2][i];
609  DD8[j]=QCD3*D8/2.0/conj(Vud[2][j])/Vud[2][i];
610  const CD epsilon=conj(Vud[0][j])*Vud[0][i]/conj(Vud[2][j])/Vud[2][i];
611  const double upsilon=norm(conj(Vud[2][j])*Vud[2][i]/Vud[1][i]);
612  const CD R7=(C7SM_Mt+CC7[j])/C7SM_MW;
613  const CD R8=(C8SM_Mt+CD(0)*CC8[j])/C8SM_MW;
614  const CD R7_=(DD7[j])/C7SM_MW;
615  const CD R8_=CD(0)*(DD8[j])/C8SM_MW;
616 
617 
618  res[j]=a+aee*norm(epsilon)+aer*epsilon.real()+aei*epsilon.imag();
619  res[j]+=a77*(norm(R7)+norm(R7_))+a7r*R7.real()+a7i*R7.imag();
620  res[j]+=a88*(norm(R8)+norm(R8_))+a8r*R8.real()+a8i*R8.imag();
621  res[j]+=a87r*(R8*conj(R7)+R8_*conj(R7_)).real()+a7er*(R7*conj(epsilon)).real()+a8er*(R8*conj(epsilon)).real();
622  res[j]+=a87i*(R8*conj(R7)+R8_*conj(R7_)).imag()+a7ei*(R7*conj(epsilon)).imag()+a8er*(R8*conj(epsilon)).imag();
623  res[j]*=calN/100*upsilon;
624 
625  /*res[j]=a+aee*norm(epsilon)+aer*epsilon.real()+aei*epsilon.imag();
626  res[j]+=a77*(norm(R7)+norm(R7_))+a7r*1+a7i*0;
627  res[j]+=a88*(norm(R8)+norm(R8_))+a8r*R8.real()+a8i*R8.imag();
628  res[j]+=a87r*1+a7er*(conj(epsilon)).real()+a8er*(R8*conj(epsilon)).real();
629  res[j]+=a87i*0+a7ei*(conj(epsilon)).imag()+a8er*(R8*conj(epsilon)).imag();
630  res[j]*=calN/100*upsilon;
631  */
632  }
633  double r1=3.15e-4+0.00247*(norm(CC7[1])+norm(DD7[1])-0.706*CC7[1].real());
634 
635  //ratio=res[0]/9.2e-6;
636  //cout<<"RATIO "<<ratio<<endl;
637  return g1.error(r1);
638  }
639 
640 double A0(double x) const{
641  return x*(2+3*x-6*x*x+ x*x*x+6*x*std::log(x))/(24*std::pow(1-x,4));
642  }
643 
644 double A1(double x) const{
645  return x*(-3+4*x-x*x-2*std::log(x))/(4*std::pow(1-x,3));
646  }
647 
648 double A2(double x) const{
649  return x/(6*std::pow(1-x,3))*((-7+5*x+8*x*x)/6.0+x*std::log(x)/(1-x)*(-2+3*x));
650  }
651 
652 double A3(double x) const{
653  return (-3+8*x-5*x*x+(6*x-4)*std::log(x))*x/(6*std::pow(1-x,3));
654  }
655 
656 ROOT::Math::Interpolator inter1, inter2, inter3, inter4;
657 ROOT::Math::Interpolator Mu_[3],Md_[3];
658 
659 const uint ii;
660 FUNCP_CUBA fp;
661  const gauss2obs g1,g2;
662 mutable double ratio;
663 
664 };
665 
666 
667 
668 
672 class calcuBmumu:public calcu{
673  public:
674  calcuBmumu(const Mixes& mix, const Meson & m,const Fermion& f3, const Fermion& f4, observable *ob, const char * name):
675  meson(m),ff3(f3),ff4(f4),
676  o(ob),
677  gSr("gSr"),gSi("gSi"),gPr("gPr"),gPi("gPi"),gAr("gAr"),gAi("gAi"), mixes(mix) {
678  const ex Nq=mixes.N[tQuark][m.q2.isospin][m.q1.flavour][m.q2.flavour];
679  const ex Nq_=mixes.N[tQuark][m.q2.isospin][m.q1.flavour][m.q2.flavour].conjugate();
680  const ex Nl=mixes.N[tLepton][f3.isospin][f3.flavour][f4.flavour];
681  const ex Nl_=mixes.N[tLepton][f3.isospin][f4.flavour][f3.flavour].conjugate();
682  possymbol MR("MR"),MI("MI"),McH("McH");
683  ex MR2=MR*MR,MI2=MI*MI,McH2=McH*McH;
684 
685  ex cLL=Nq_*Nl_*(1/MR2-1/MI2);
686  ex cLR=Nq_*Nl*(1/MR2+1/MI2);
687  ex cRL=Nq*Nl_*(1/MR2+1/MI2);
688  ex cRR=Nq_*Nl*(1/MR2-1/MI2);
689 
690  ex ggS=-(2*M_GF/sqrt(2)*(-cRL-cRR+cLL+cLR)/4).subs(mixes.replacements).evalf();
691  ex ggP=-(2*M_GF/sqrt(2)*(+cRL-cRR-cLL+cLR)/4).subs(mixes.replacements).evalf();
692  CD ggA=0;
693  if(m.q2.isospin==iDown && m.q2.flavour==2 && f3.flavour==1 && f4.flavour==1){
694  ggA=-conj(Vud[2][m.q2.flavour])*Vud[2][m.q1.flavour]*Y(std::pow(M_Mu[2]/M_MW,2));
695  ggA+=-conj(Vud[1][m.q2.flavour])*Vud[1][m.q1.flavour]*Y(std::pow(M_Mu[1]/M_MW,2));
696  ggA*=M_GF*M_GF*M_MW*M_MW/M_PI/M_PI/2;
697 
698  }
699  //ex gggA=0;
700  //ex gggA=ggA.real()+I*ggA.imag();
701 
702  ex width=collect_common_factors(mesondwtest().subs(lst(gAr==ggA.real(),gAi==ggA.imag(),gSr==ggS.real_part(),gSi==ggS.imag_part(),gPr==ggP.real_part(),gPi==ggP.imag_part())).subs(mixes.replacements).evalf().real_part());
703 
704  compile_ex(lst(width), lst(mixes.tanb,McH,MR,MI), fp);
705 
706  }
707  double operator()(const parameters & p) const{
708  //double factor=std::pow(M_GF*M_MW,4)/8/std::pow(M_PI,5)*std::sqrt(MM*MM-4*M_Ml[1]*M_Ml[1])*M_Ml[1]*M_Ml[1];
709  int n=4,m=1;
710  double ret=0;
711  fp(&n,&(p.values[0]),&m,&ret);
712 
713  return o->loglikelihood(ret);
714  }
715 
716 double obsvalue(const parameters & p) const{
717  //double factor=std::pow(M_GF*M_MW,4)/8/std::pow(M_PI,5)*std::sqrt(MM*MM-4*M_Ml[1]*M_Ml[1])*M_Ml[1]*M_Ml[1];
718  int n=4,m=1;
719  double ret=0;
720  fp(&n,&(p.values[0]),&m,&ret);
721 
722  return ret;
723  }
724 
725  double Y(double x) const{
726  return 1.0113*x/8/(1-x)*(4-x+3*x*log(x)/(1-x));
727  }
728 
729 ex mesondwtest() const{
730  const Fermion& f1(meson.q2), f2(meson.q1);
731  ex mesonmass=meson.mass;
732 
733  Fermion f3=ff3, f4=ff4;
734  realsymbol q3("q3"), q4("q4");
735  ex s2=pow(mesonmass,2);
736 
737  ex v1=0, v2=0;
738  ex mq1=mixes.mass(f1),mq2=mixes.mass(f2);
739  ex mq3=mixes.mass(f3),mq4=mixes.mass(f4);
740 
741  ex m2q1=mq1*mq1, m2q2=mq2*mq2, m2q3=mq3*mq3, m2q4=mq4*mq4;
742  scalar_products sp;
743  sp.add(q4, q3, (s2-m2q4-m2q3)/2);
744  sp.add(q3, q3, m2q3);
745  sp.add(q4, q4, m2q4);
746  ex q10=(s2+mq1*mq1-mq2*mq2)/(2*sqrt(s2)), lq1l=sqrt(q10*q10-mq1*mq1);
747  ex q30=(s2+mq3*mq3-mq4*mq4)/(2*sqrt(s2)), lq3l=sqrt(q30*q30-mq3*mq3);
748 
749  ex a;
750  a=-(gSr+I*gSi)*s2/(mq1+mq2);
751  v1=v1+a*dirac_ONE();
752  v2=v2+a.conjugate()*dirac_ONE();
753  a=-(gPr+I*gPi)*s2/(mq1+mq2);
754  v1=v1+a*dirac_gamma5();
755  v2=v2-a.conjugate()*dirac_gamma5();
756  ex sl=(dirac_slash(q3,4)+dirac_slash(q4,4));
757  a=(gAr+I*gAi);
758  v1=v1+a*sl*dirac_gamma5();
759  v2=v2+a.conjugate()*sl*dirac_gamma5();
760 
761  ex vq3=dirac_slash(q3,4)+mq3*dirac_ONE(), vq4=dirac_slash(q4,4)-mq4*dirac_ONE();
762  ex dt=dirac_trace(vq3*v1*vq4*v2).simplify_indexed(sp);
763  ex result=expand(dt*4*lq3l/s2/Pi/32);
764 
765  lst ltest;
766  //ltest.append(conjugate(gL)==pow(abs(gL),2)/gL);
767  //ltest.append(conjugate(gR)==pow(abs(gR),2)/gR);
768 // ltest.append(conjugate(gS)==pow(abs(gS),2)/gS);
769 // ltest.append(conjugate(gP)==pow(abs(gP),2)/gP);
770 // ltest.append(conjugate(gA)==pow(abs(gA),2)/gA);
771 
772  return pow(meson.decay_factor,2)*collect_common_factors(result.subs(ltest));
773  //return expand(ret.subs(lst(exp(-I*wild())==1/exp(I*wild()),sin(wild())==sqrt(1-pow(cos(wild()),2)))));
774 }
775  const Meson meson;
776  const Fermion& ff3, ff4;
777  shared_ptr<observable> o;
778  const realsymbol gSr,gSi, gPr,gPi,gAr,gAi;
779  const Mixes mixes;
780  FUNCP_CUBA fp;
781 
782 };
783 
784 
785 
786 /*
787 
788 #include "defs.h"
789 
790 
791 //constexpr double Nll(int i, int j){return UL?(i==j)*(tanb*M_Ml[i]+(-tanb-1/tanb)*M_Ml[i]*(i==GL):((i==j)*tanb*M_Ml[i]+(-tanb-1/tanb)*conj(Vnl(GL,i))*Vnl(GL,j)*M_Ml[j]);}
792 
793 #if UL==1
794  #define Nl(i,j) ((i==j)*(tanb*M_Ml[i]+(-tanb-1/tanb)*M_Ml[i]*(i==GL)))
795  #define VnlNl(i,j) (Vnl[i][j])*M_Ml[j]*(tanb+(-tanb-1/tanb)*(j==GL)))
796 #else
797  #define Nl(i,j) ((i==j)*tanb*M_Ml[i]+(-tanb-1/tanb)*conj(Vnl[GL][i])*Vnl[GL][j]*M_Ml[j])
798  #define VnlNl(i,j) (Vnl[i][j]*M_Ml[j]*(tanb+(-tanb-1/tanb)*(i==GL)))
799 #endif
800 
801 #if UQ==1
802  #define Nd(i,j) (M_Md[j]*(i==j)*(tanb+(-tanb-1/tanb)*(j==GQ)))
803  #define Nu(i,j) (M_Mu[j]*((i==j)*tanb+(-tanb-1/tanb)*Vud[i][GQ]*conj(Vud[j][GQ])))
804  #define VudNd(i,j) (Vud[i][j]*M_Md[j]*(tanb+(-tanb-1/tanb)*(j==GQ)))
805  #define NuVud(i,j) (-M_Mu[i]*Vud[i][j]*(tanb+(-tanb-1/tanb)*(j==GQ)))
806 #else
807  #define Nd(i,j) (M_Md[j]*((i==j)*tanb+(-tanb-1/tanb)*conj(Vud[GQ][i])*Vud[GQ][j]))
808  #define Nu(i,j) (M_Mu[j]*(i==j)*(tanb+(-tanb-1/tanb)*M_Mu[j]*(j==GQ)))
809  #define VudNd(i,j) (Vud[i][j]*M_Md[j]*(tanb+(-tanb-1/tanb)*(i==GQ)))
810  #define NuVud(i,j) (-M_Mu[i]*Vud[i][j]*(tanb+(-tanb-1/tanb)*(i==GQ)))
811 #endif
812 
813 
814 */
815 }
816 #endif
const gauss2obs g2
Definition: Formulas.h:661
constexpr double C8SM_Mt
Definition: Formulas.h:273
vector< Matrix > V
Definition: Formulas.h:204
double Y(double x) const
Definition: Formulas.h:725
Matrix conjugate() const
computes the hermitian conjugate of the matrix
Definition: multivector.h:125
calculus of the constraints coming from the b->s gamma decay
Definition: Formulas.h:279
Matrixx(const Matrix3c &a)
Definition: Formulas.h:75
A base class representing an experimental measure.
Definition: model.h:35
const Mixes mixes
Definition: Formulas.h:779
a meson properties
Definition: Formulas.h:47
double A1(double x) const
Definition: Formulas.h:644
FIsospin isospin
Definition: Formulas.h:38
FHelicity helicity
Definition: Formulas.h:41
double obsvalue(const parameters &p) const
Definition: Formulas.h:716
double G(double x, double y, double z) const
Definition: Formulas.h:252
constexpr double mt_mt
Definition: Formulas.h:262
double A0(double x) const
Definition: Formulas.h:640
calcuBmumu(const Mixes &mix, const Meson &m, const Fermion &f3, const Fermion &f4, observable *ob, const char *name)
Definition: Formulas.h:674
FCharge particle
Definition: Formulas.h:40
const gauss2obs g2
Definition: Formulas.h:259
multivector< Matrix, 2 > N_
Definition: Formulas.h:209
constexpr double mt_mW
Definition: Formulas.h:262
Definition: multivector.h:4
Fermion(FType t, FIsospin i, FFlavour f=fAny, FCharge p=cParticle, FHelicity h=hAny)
Definition: Formulas.h:35
constexpr double M_MZ
Definition: Formulas.h:58
multivector< Matrix, 2 > N
Definition: Formulas.h:206
double operator()(const parameters &p) const
Definition: Formulas.h:406
calculus of the constraints coming from the B->mu mu decay
Definition: Formulas.h:672
const realsymbol gSr
Definition: Formulas.h:778
shared_ptr< observable > o
Definition: Formulas.h:777
const Matrixx conjugate() const
computes the hermitian conjugate of the Matrixx
Definition: Formulas.h:89
double operator()(const parameters &p) const
Definition: Formulas.h:707
multivector< Matrix, 2 > VN_
Definition: Formulas.h:210
constexpr double M_cos2
Definition: Formulas.h:60
constexpr double C8SM_Mb
Definition: Formulas.h:273
constexpr double M_Ml[3]
Definition: Formulas.h:63
unsigned int uint
Definition: script.cpp:4
const Matrixx Vnl
Definition: Formulas.h:98
double lnxy_xy(double x, double y) const
Definition: Formulas.h:248
double massnum(const Fermion &f) const
Definition: Formulas.h:179
multivector< Matrix, 2 > VN
Definition: Formulas.h:207
ROOT::Math::Interpolator inter4
Definition: Formulas.h:656
vector of parameters
Definition: model.h:177
double width(const parameters &p, int option=0) const
Definition: Formulas.h:517
Meson(const Fermion &qq1, const Fermion &qq2, ex m, ex d)
Definition: Formulas.h:50
std::array< CD, 3 > Vector3c
Definition: Formulas.h:66
constexpr double M_GF
Definition: Formulas.h:57
a class to represent the mixing matrices VCKM and VPMNS
Definition: Formulas.h:72
ex mesondwtest() const
Definition: Formulas.h:729
FFlavour flavour
Definition: Formulas.h:39
Matrixx(double t12, double t13, double t23, double d13)
Definition: Formulas.h:86
constexpr double C8SM(double x)
Definition: Formulas.h:268
constexpr double mt_mb
Definition: Formulas.h:262
calcubtosgamma2(const Mixes &mixes)
Definition: Formulas.h:286
Base class to do the calculus of a constraint to the model.
Definition: model.h:237
constexpr double M_Mu[3]
Definition: Formulas.h:61
void appendtolst(lst &reps) const
Definition: Formulas.h:181
double F(double x, double y) const
Definition: Formulas.h:238
ex mass(const Fermion &f) const
Definition: Formulas.h:178
const Meson meson
Definition: Formulas.h:775
Fermion q2
Definition: Formulas.h:52
std::array< std::array< CD, 3 >, 3 > Matrix3c
Definition: Formulas.h:67
Mixes(ex tanb0, ex cp0, int genL=2, int genQ=2, int lup=0, int qup=0, int mssm=0)
Definition: Formulas.h:108
constexpr double C7SM_Mt
Definition: Formulas.h:272
calculus of the constraints coming from the oblique parameters
Definition: Formulas.h:221
Fermion q1
Definition: Formulas.h:52
Definition: BGL.h:16
definition of the couplings for the different BGL models
Definition: Formulas.h:105
double f(double t, double r) const
Definition: Formulas.h:242
Matrixx(double c12, double c13, double c23, double s12, double s13, double s23, CD e13, CD e13t)
constructs a unitary Matrixx in the standard form
Definition: Formulas.h:79
constexpr double C8SM_MW
Definition: Formulas.h:273
constexpr double M_Md[3]
Definition: Formulas.h:62
double A3(double x) const
Definition: Formulas.h:652
the same as gaussobs but with a different initializer, such that the uncertainty sigma is absolute ...
Definition: model.h:100
multivector< Matrix, 2 > M
Definition: Formulas.h:205
constexpr double C7SM_Mb
Definition: Formulas.h:272
double operator()(const parameters &p) const
Definition: Formulas.h:225
std::complex< double > CD
Definition: Formulas.h:65
constexpr double M_MW
Definition: Formulas.h:59
const Fermion ff4
Definition: Formulas.h:776
a fermion properties
Definition: Formulas.h:32
const Matrixx Vud(13.04 *M_PI/180, 0.201 *M_PI/180, 2.38 *M_PI/180, 1.2)
constexpr double C7SM(double x)
Definition: Formulas.h:264
constexpr double C7SM_MW
Definition: Formulas.h:272
vector< double > values
Definition: model.h:232
double A2(double x) const
Definition: Formulas.h:648