diff --git a/vjet/delta.C b/vjet/delta.C index 6929c90..bc3ce4a 100644 --- a/vjet/delta.C +++ b/vjet/delta.C @@ -1,81 +1,81 @@ #include "vjint.h" #include "codata.h" #include "phasespace.h" #include "settings.h" #include "coupling.h" #include "luminosity.h" #include "mesq.h" #include "resconst.h" #include <iostream> double vjint::logx2min; double vjint::delta(double x) { double fac = gevfb/1000.*coupling::aemmz*asp_.asp_*resconst::Cf; double q2 = phasespace::m2; //change of variable to allow integration over 0-1 //"esp" introduced for better behavior at small qt int esp = 8; double x2 = exp((1.-pow(x,esp))*logx2min); double xjac = x2*logx2min*esp*pow(x,(esp-1)); //x2=x2min*exp(1d0/x2min*t) //xjac=xjac*x2(1d0-x2min) //compute x1 as a function of x2 double x1 = (opts.sroot*phasespace::mt*phasespace::exppy*x2-q2)/(x2*pow(opts.sroot,2)-opts.sroot*phasespace::mt*phasespace::expmy); //check x1,x2<1 double tiny = 0.;// !1d-8 if (x1 > 1.-tiny || x2 > 1.-tiny) return 0.; //Partonic mandelstam invariants (bug fix in DYqT: th <-> uh) double sh = x1*x2*pow(opts.sroot,2); double th = q2-opts.sroot*x1*phasespace::mt*phasespace::expmy; double uh = q2-opts.sroot*x2*phasespace::mt*phasespace::exppy; //1/xjj is the jacobian of the integration in dx1 of delta(q2-sh-uh-th) dx1 //following from the change of variable t = q2-sh-uh-th //dx1 = dt * dx1(t)/dt -> 1/xjj = dx1(t)/dt double xjj = abs(x2*pow(opts.sroot,2)-opts.sroot*phasespace::mt*phasespace::expmy); //common factor for all the contributions double factor = fac/sh; //compute parton luminosity luminosity::pdf1(x1); luminosity::pdf2(x2); luminosity::calc(); //leading order delta(s2) contributions double xloqg=(factor/(pow(coupling::NC,2)-1.))*(aqg0_(sh,th,uh,q2)+agq0_(sh,th,uh,q2)); double xloqqb=(factor/coupling::NC)*aqqb0_(sh,th,uh,q2); double xlo=xloqg+xloqqb; //next to leading order delta(s2) contributions double xnlo = 0.; - if (opts.order == 2) + if (opts.order >= 2) { double s2 = 0.; utils_fu_(uh,q2); utils_(sh,th,uh,q2,s2); utils_dilog_(sh,th,uh,q2); double xnloqg = factor/(pow(coupling::NC,2)-1.) *(bqg1_(sh,th,uh,q2)+bgq1_(sh,th,uh,q2)+ bqg2_(sh,th,uh,q2)+bgq2_(sh,th,uh,q2)+ cqg1_(sh,th,uh,q2)+cgq1_(sh,th,uh,q2)+ cqg2_(sh,th,uh,q2)+cgq2_(sh,th,uh,q2)+ bqg3_(sh,th,uh,q2)+bgq3_(sh,th,uh,q2)); double xnloqqb = factor/coupling::NC *(bqqb1_(sh,th,uh,q2)+bqqb2_(sh,th,uh,q2)+ cqqb1_(sh,th,uh,q2)+d0aa_(sh,th,uh,q2)+ bqqb3_(sh,th,uh,q2)); xnlo = xnloqg+xnloqqb; } return -M_PI*xjac/xjj * (xlo+(asp_.asp_/2./M_PI)*xnlo); } diff --git a/vjet/vjint.C b/vjet/vjint.C index fef125f..6f64fc9 100644 --- a/vjet/vjint.C +++ b/vjet/vjint.C @@ -1,449 +1,449 @@ #include "vjint.h" #include "settings.h" #include "interface.h" #include "resconst.h" #include "cubature.h" #include "gaussrules.h" #include "mesq.h" #include "coupling.h" #include "scales.h" #include "phasespace.h" #include "luminosity.h" #include "LHAPDF/LHAPDF.h" #include <iomanip> #include <math.h> const double vjint::zmin = 1e-13;//1e-8; const double vjint::zmax = 1.;//1.-1e-10;//1.-1e-8; const double vjint::lz = log(zmax/zmin); int vjint::z1rule; int vjint::z2rule; double *vjint::t1; double *vjint::t2; double vjint::brz; double vjint::brw; void vjint::release() { delete[] t1; delete[] t2; } void vjint::init() { z1rule = opts.zrule; z2rule = opts.zrule; t1 = new double [z1rule]; t2 = new double [z2rule]; double az = 0.; double bz = 1.; double cz = 0.5*(az+bz); double mz = 0.5*(bz-az); for (int j = 0; j < z1rule; j++) t1[j] = zmin*pow(zmax/zmin, cz+mz*gr::xxx[z1rule-1][j]); for (int j = 0; j < z2rule; j++) t2[j] = zmin*pow(zmax/zmin, cz+mz*gr::xxx[z2rule-1][j]); //gevpb_.gevpb_ = 3.8937966e8; //MCFM 6.8 value //gevpb_.gevpb_ = 0.389379e9; //dyres value //gevpb_.gevpb_ = gevfb/1000.; // flagch_.flagch_ = 0; // vegint_.iter_ = 20; // vegint_.locall_ = 10000; // vegint_.nlocall_ = 20000; // dypara_.ss_ = opts.sroot; // dypara_.s_ = pow(dypara_.ss_,2); // dypdf_.ih1_ = opts.ih1; // dypdf_.ih2_ = opts.ih2; //vjorder_.iord_ = opts.order - 1; // if (opts.nproc == 3) // { // if (opts.useGamma && !opts.zerowidth) // prodflag_.prodflag_ = 5; // else // prodflag_.prodflag_ = 3; // } // else if (opts.nproc == 1) // prodflag_.prodflag_ = 21; // else if (opts.nproc == 2) // prodflag_.prodflag_ = 22; ckm_.vud_ = cabib_.Vud_; ckm_.vus_ = cabib_.Vus_; ckm_.vub_ = cabib_.Vub_; ckm_.vcd_ = cabib_.Vcd_; ckm_.vcs_ = cabib_.Vcs_; ckm_.vcb_ = cabib_.Vcb_; ckm_.vtd_ = 0.; ckm_.vts_ = 0.; ckm_.vtb_ = 0.; double cw2 = 1.- coupling::xw; // em_.aemmz_ = coupling::aemmz; //sqrt(2.)* ewcouple_.Gf_ *pow(coupling::wmass,2)* ewcouple_.xw_ /M_PI; brz = 1./dymasses_.zwidth_*coupling::aemmz/24.*coupling::zmass *(pow(-1.+2.*coupling::xw,2)+pow(2.*coupling::xw,2))/(coupling::xw*cw2); //=0.033638 brw = 1./dymasses_.wwidth_*coupling::aemmz*coupling::wmass/(12.*coupling::xw); //=0.10906 //quarks are ordered according to mass: //1,2,3,4,5,6 //u,d,s,c,b,t //double equ = 2./3.; //up-quarks electric charge //double eqd = -1./3.; //down-quarks electric charge //quarks_.eq_[0]=equ; //quarks_.eq_[1]=eqd; //quarks_.eq_[2]=eqd; //quarks_.eq_[3]=equ; //quarks_.eq_[4]=eqd; quarks_.eq_[0] = ewcharge_.Q_[MAXNF+2]; quarks_.eq_[1] = ewcharge_.Q_[MAXNF+1]; quarks_.eq_[2] = ewcharge_.Q_[MAXNF+3]; quarks_.eq_[3] = ewcharge_.Q_[MAXNF+4]; quarks_.eq_[4] = ewcharge_.Q_[MAXNF+5]; //definition of 'generalized' ckm matrix: // (uu ud us uc ub ut) // (du dd ds dc db dt) //ckm=(su sd ss sc sb st) // (cu cd cs cc cb ct) // (bu bd bs bc bb bt) // (tu td ts tc tb tt) for (int i = 0; i < 6; i++) for (int j = 0; j < 6; j++) quarks_.ckm_[j][i] = 0.; quarks_.ckm_[1][0]=ckm_.vud_; quarks_.ckm_[2][0]=ckm_.vus_; quarks_.ckm_[4][0]=ckm_.vub_; quarks_.ckm_[0][1]=ckm_.vud_; quarks_.ckm_[3][1]=ckm_.vcd_; quarks_.ckm_[5][1]=ckm_.vtd_; quarks_.ckm_[0][2]=ckm_.vus_; quarks_.ckm_[3][2]=ckm_.vcs_; quarks_.ckm_[5][2]=ckm_.vts_; quarks_.ckm_[1][3]=ckm_.vcd_; quarks_.ckm_[2][3]=ckm_.vcs_; quarks_.ckm_[4][3]=ckm_.vcb_; quarks_.ckm_[0][4]=ckm_.vub_; quarks_.ckm_[3][4]=ckm_.vcb_; quarks_.ckm_[5][4]=ckm_.vtb_; quarks_.ckm_[1][5]=ckm_.vtd_; quarks_.ckm_[2][5]=ckm_.vts_; quarks_.ckm_[4][5]=ckm_.vtb_; //definition of 'delta' matrix for (int i = 0; i < MAXNF; i++) for (int j = 0; j < MAXNF; j++) quarks_.delta_[j][i] = 0.; for (int i = 0; i < MAXNF; i++) quarks_.delta_[i][i] = 1.; //definition of tau3's Pauli matrix for (int i = 0; i < MAXNF; i++) for (int j = 0; j < MAXNF; j++) quarks_.tau3_[j][i] = 0.; //quarks_.tau3_[0][0]=1.; //quarks_.tau3_[1][1]=-1.; //quarks_.tau3_[2][2]=-1.; //quarks_.tau3_[3][3]=1.; //quarks_.tau3_[4][4]=-1.; quarks_.tau3_[0][0] = ewcharge_.tau_[MAXNF+2]; quarks_.tau3_[1][1] = ewcharge_.tau_[MAXNF+1]; quarks_.tau3_[2][2] = ewcharge_.tau_[MAXNF+3]; quarks_.tau3_[3][3] = ewcharge_.tau_[MAXNF+4]; quarks_.tau3_[4][4] = ewcharge_.tau_[MAXNF+5]; //definition of constants and couplings // const2_.ca_ = resconst::CA; // const2_.xnc_ = coupling::NC; // const2_.cf_ = resconst::Cf; // const2_.tr_ = resconst::NF/2.; // const2_.pi_ = M_PI; dyqcd_.pi_ = M_PI; dyqcd_.cf_ = resconst::Cf; dyqcd_.ca_ = resconst::CA; dyqcd_.tr_ = resconst::NF/2.; dyqcd_.xnc_ = coupling::NC; dyqcd_.nf_ = resconst::NF; // dycouplings_.alpha0_ = coupling::aemmz; // dycouplings_.xw_ = coupling::xw; // dycouplings_.sw_ = sqrt(coupling::xw); // sin_w // dycouplings_.cw_ = sqrt(1.-coupling::xw); // cos_w luminosity::init(); } double vjint::vint(double m, double pt, double y) { double q2 = m*m; //set scales and alpha strong scales::set(m, pt); scales::vjet(); /* if (opts.dynamicscale) { scales2_.xmur_ = sqrt(pow(opts.kmuren*m,2) + pow(opts.kpt_muren*pt,2)); scales2_.xmuf_ = sqrt(pow(opts.kmufac*m,2) + pow(opts.kpt_mufac*pt,2)); } else { scales2_.xmur_ = sqrt(pow(opts.kmuren*opts.rmass,2) + pow(opts.kpt_muren*pt,2)); scales2_.xmuf_ = sqrt(pow(opts.kmufac*opts.rmass,2) + pow(opts.kpt_mufac*pt,2)); } scales2_.xmur2_ = pow(scales2_.xmur_,2); scales2_.xmuf2_ = pow(scales2_.xmuf_,2); asnew_.as_ = LHAPDF::alphasPDF(scales2_.xmur_)/M_PI; */ //calculate logs of scales utils_scales_(q2); //calculate propagators double cw2 = 1.- coupling::xw; //if (opts.zerowidth) // { // sigs_.sigz_ = brz; // /(16.*cw2) // sigs_.sigw_ = brw; // /4. // sigs_.siggamma_ = 0.; // sigs_.sigint_ = 0.; // } //else // { //sigs_.sigz_ = brz*dymasses_.zwidth_*q2/(M_PI*coupling::zmass) / (pow(q2-pow(coupling::zmass,2),2)+pow(coupling::zmass,2)*pow(dymasses_.zwidth_,2)); // /(16.*cw2) //sigs_.sigw_ = brw*dymasses_.wwidth_*q2/(M_PI*coupling::wmass) / (pow(q2-pow(coupling::wmass,2),2)+pow(coupling::wmass,2)*pow(dymasses_.wwidth_,2)); // !/4. //sigs_.siggamma_ = em_.aemmz_/(3.*M_PI*q2); //sigs_.sigint_ = -em_.aemmz_/(6.*M_PI)*(q2-pow(coupling::zmass,2)) /(pow(q2-pow(coupling::zmass,2),2)+pow(coupling::zmass,2)*pow(dymasses_.zwidth_,2)) * (-1.+4.*coupling::xw)/(2.*sqrt(coupling::xw*cw2)); // !sqrt(sw2/cw2)/2. mesq::setpropagators(m); if (opts.nproc == 3) sigs_.sigz_ = brz*dymasses_.zwidth_/(M_PI*coupling::zmass)*mesq::propZ; else sigs_.sigw_ = brw*dymasses_.wwidth_/(M_PI*coupling::wmass)*mesq::propW; if (opts.useGamma) { sigs_.siggamma_ = coupling::aemmz/(3.*M_PI) * mesq::propG; sigs_.sigint_ = -coupling::aemmz/(6.*M_PI)* mesq::propZG * (-1.+4.*coupling::xw)/(2.*sqrt(coupling::xw*cw2)); } //} //set phase space variables // internal_.q_ = m; // internal_.q2_ = pow(m,2); // internal_.qt_ = pt; // yv_.yv_ = y; // yv_.expyp_ = phasespace::exppy;//exp(y); // yv_.expym_ = phasespace::expmy;//exp(-y);//1./yv_.expyp_; // if (opts.zerowidth) // internal_.q_ = opts.rmass; //call cross section calculation // int ord = opts.order - 1; // double res, err, chi2a; // qtdy_(res,err,chi2a,y,y,ord); // cout << setprecision(16) << "fortran " << m << " " << pt << " " << " " << y << " " << res << endl; double res = calc(m, pt, y); //cout << setprecision(16) << "C++ " << m << " " << pt << " " << " " << y << " " << res << endl; //Apply conversion factors: //ds/dqt = ds/dqt2 * dqt2/dqt //fb = 1000 * pb return 2*pt*res*1000.; } int xdelta_cubature(unsigned ndim, const double x[], void *data, unsigned ncomp, double f[]) { //f[0] = xdelta_(x); f[0] = vjint::delta(x[0]); return 0; } //int sing_cubature(unsigned ndim, const double x[], void *data, unsigned ncomp, double f[]) //{ // double zz[2]; // zz[0] = vjint::zmin*pow(vjint::zmax/vjint::zmin,x[0]); // double jacz1 = zz[0]*vjint::lz; // // zz[1] = vjint::zmin*pow(vjint::zmax/vjint::zmin,x[1]); // double jacz2 = zz[1]*vjint::lz; // // f[0] = sing_(zz)*jacz1*jacz2; // return 0; //} double vjint::calc(double m, double pt, double y) { clock_t begin_time, end_time; double q2 = phasespace::m2; // tm_.tm_ = sqrt(q2+pt*pt); //kinematical limits on qt (at y = 0) --> possibly not needed, since the phace space is generated within kinematical limits double z = q2/pow(opts.sroot,2); double xr = pow(1-z,2)-4*z*pow(pt/m,2); if (xr < 0) return 0.; //kinematical limits on y including qt double tmpx = (q2+pow(opts.sroot,2))/opts.sroot/phasespace::mt; double ymax = log((tmpx+sqrt(max(0.,pow(tmpx,2)-4.)))/2.); double ay = fabs(y); if (fabs(y) > ymax) return 0.; if (fabs(*(long*)& ay - *(long*)& ymax) < 2 ) //check also equality return 0.; //...compute as at order=nloop asp_.asp_ = asnew_.as_*M_PI; luminosity::cache(); //integration of the delta term //lower limit of integration for x2 double x2min=(q2-opts.sroot*phasespace::mt*phasespace::expmy)/(opts.sroot*phasespace::mt*phasespace::exppy-pow(opts.sroot,2)); logx2min = log(x2min); if (x2min >= 1. || x2min < 0.) { //cout << "error in x2min " << x2min << " m " << phasespace::m << " pt " << phasespace::qt << " y " << phasespace::y << endl; return 0.; } /* //pcubature integration const int ndimx = 1; //dimensions of the integral const int ncomp = 1; //components of the integrand void *userdata = NULL; double integral[1]; double error[1]; const int eval = 0; const double epsrel = min(1e-4,opts.pcubaccuracy); const double epsabs = 0.; //boundaries of integration double xmin[1] = {0.}; double xmax[1] = {1.}; begin_time = clock(); pcubature(ncomp, xdelta_cubature, userdata, ndimx, xmin, xmax, eval, epsabs, epsrel, ERROR_INDIVIDUAL, integral, error); end_time = clock(); double rdelta = integral[0]; double err = error[0]; if (opts.timeprofile) cout << setw(10) << "xdelta time" << setw(10) << float( end_time - begin_time ) / CLOCKS_PER_SEC << setw(10) << "result" << setw(10) << rdelta << endl; */ begin_time = clock(); double rdelta = 0.; int xrule = opts.xrule; //start integration double ax = 0.; double bx = 1.; double cx = 0.5*(ax+bx); double mx = 0.5*(bx-ax); double jac = mx; for (int i = 0; i < xrule; i++) { double x = cx+mx*gr::xxx[xrule-1][i]; rdelta += delta(x) * jac * gr::www[xrule-1][i]; } end_time = clock(); if (opts.timeprofile) cout << setw(10) << "xdelta time" << setw(10) << float( end_time - begin_time ) / CLOCKS_PER_SEC << setw(10) << "result" << setw(10) << rdelta << endl; //integration of non-delta(s2) terms (only at NLO) //initialise double rsing = 0.; begin_time = clock(); - if (opts.order == 2) + if (opts.order >= 2) { rsing = sing(); /* ////pcubature integration //const int ndims = 2; //dimensions of the integral //// boundaries of integration //double zmn[2] = {zmin,zmin}; //double zmx[2] = {zmax,zmax}; //pcubature(ncomp, sing_cubature, userdata, // ndims, zmn, zmx, // eval, epsabs, 1e-4, ERROR_INDIVIDUAL, integral, error); //rsing = integral[0]; //err = sqrt(err*err + error[0]*error[0]); //// cout << m << " " << pt << " " << y << " " << integral[0] << " " << error[0] << endl; //gaussian quadrature double zz[2]; double az1 = zmin; double bz1 = zmax; double cz1=0.5*(az1+bz1); double mz1=0.5*(bz1-az1); for (int j = 0; j < z1rule; j++) { double z1 = cz1 + mz1*gr::xxx[z1rule-1][j]; double t = t1[j];//zmin*pow(zmax/zmin,z1); double jacz1=t*lz; zz[0]=t; double az2 = zmin; double bz2 = zmax; double cz2 = 0.5*(az2+bz2); double mz2 = 0.5*(bz2-az2); for (int jj = 0; jj < z2rule; jj++) { double z2 = cz2 + mz2*gr::xxx[z2rule-1][jj]; double t = t2[jj];//zmin*pow(zmax/zmin,z2); double jacz2 = t*lz; zz[1] = t; rsing=rsing+sing_(zz)*gr::www[z1rule-1][j]*gr::www[z2rule-1][jj] //rsing=rsing+sing(zz[0],zz[1])*gr::www[z1rule-1][j]*gr::www[z2rule-1][jj] *jacz1*jacz2*mz1*mz2; } } //cout << m << " " << pt << " " << y << " " << rsing << endl; */ rsing = rsing/2./M_PI;//*(asp_.asp_/2./M_PI); } else if (opts.order == 1) rsing = 0.; end_time = clock(); if (opts.timeprofile) cout << setw(10) << "rsing time" << setw(10) << float( end_time - begin_time ) / CLOCKS_PER_SEC << setw(10) << "result" << setw(10) << rsing << endl; //final result double res = rdelta+rsing; //cout << m << " " << pt << " " << y << " " << res << endl; return res; }