Index: trunk/src/WaveOverlap.cpp
===================================================================
--- trunk/src/WaveOverlap.cpp (revision 467)
+++ trunk/src/WaveOverlap.cpp (revision 468)
@@ -1,272 +1,271 @@
//==============================================================================
// WaveOverlap.cpp
//
// Copyright (C) 2010-2019 Tobias Toll and Thomas Ullrich
//
// This file is part of Sartre.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation.
// This program is distributed in the hope that it will be useful,
// but without any warranty; without even the implied warranty of
// merchantability or fitness for a particular purpose. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// Author: Tobias Toll
// Last update:
// $Date$
// $Author$
//==============================================================================
#include "WaveOverlap.h"
#include "Constants.h"
#include "TableGeneratorSettings.h"
#include "DipoleModelParameters.h"
#include "TMath.h"
#include
#include
#include "TF1.h"
#include "Math/Functor.h"
#include "Math/IntegratorMultiDim.h"
#include "Math/WrappedTF1.h"
#include "Math/GaussIntegrator.h"
using namespace std;
#define PR(x) cout << #x << " = " << (x) << endl;
WaveOverlap::WaveOverlap()
{
mParameters = new DipoleModelParameters(TableGeneratorSettings::instance());
}
WaveOverlap::~WaveOverlap() {/* no op*/}
//
// VECTOR MESONS
//
WaveOverlapVM::WaveOverlapVM()
{
mNT = mRT2 = 0;
mMf = 0;
mMf2 = 0;
mEf = 0;
mMV = 0;
mNL = mRL2 = 0;
mBoostedGaussianMf = 0;
}
double WaveOverlapVM::uiNormT(const double* var) const{
double z=var[0];
double r=var[1];
double phi=transverseWaveFunction(r, z); //GeV0
double dphidr=dDrTransverseWaveFunction(r, z); //GeV1
return 3.*r/hbarc/(z*z*(1-z)*(1-z))
*(mMf2*phi*phi + (z*z + (1-z)*(1-z))*dphidr*dphidr); //GeV1
}
double WaveOverlapVM::uiNormL(const double* var) const{
double z = var[0];
double r = var[1];
double phi = longitudinalWaveFunction(r, z); //GeV0
double d2phidr2 = laplaceRLongitudinalWaveFunction(r, z); //GeV2
double term = mMV*phi + (mMf2*phi - d2phidr2)/(mMV*z*(1-z)); //GeV1
return 3.*r/hbarc*term*term; //GeV1
}
double WaveOverlapVM::uiDecayWidth(double* var, double*) const
{
double z = *var;
double phi = longitudinalWaveFunction(0., z); //GeV0
double d2phidr2 = laplaceRLongitudinalWaveFunction(0., z); //GeV0
double result = mEf*3./M_PI*(mMV*phi+(mMf2*phi-d2phidr2)/(mMV*z*(1-z))); //GeV1
return result;
}
void WaveOverlapVM::testBoostedGaussianParameters(int id) const
{
//
// This function calculates the resulting normalisation
// and decay width resulting from the boosted gaussian parameters
// and compare with the actual values. This can be used to
// test or modify the boosted gaussian parameters.
//
// KMW paper hep-ph/0606272 Eqs. (24)-(28)
//
// Start with decay width:
TF1 fDW("fDW", this, &WaveOverlapVM::uiDecayWidth, 0., 1., 0.);
ROOT::Math::WrappedTF1 wfDW(fDW);
ROOT::Math::GaussIntegrator giDW;
giDW.SetFunction(wfDW);
giDW.SetAbsTolerance(0.);
giDW.SetRelTolerance(1e-5);
double f_VL=giDW.Integral(0., 1.); //GeV
- PR(f_VL);
cout<<"The e+e- decay width is: "<ee)="<<4*M_PI*alpha_em*alpha_em*f_VL*f_VL/3/mMV*1e6
<<" keV"<ee)=1.340 +- 0.018 keV"<ee)=5.55 +- 0.14 +- 0.02 keV"<ee)=1.27 +- 0.04 keV"<ee)=7.04 +- 0.06 keV"<boostedGaussianR2(val);
mRT2 = mRL2;
mNT = mParameters->boostedGaussianNT(val);
mNL = mParameters->boostedGaussianNL(val);
mBoostedGaussianMf = mParameters->boostedGaussianQuarkMass(val);
mBoostedGaussianMf2 = mBoostedGaussianMf*mBoostedGaussianMf;
}
void WaveOverlapVM::setProcess(int val)
{
switch (val) {
case 113:
mMf = mParameters->quarkMass(1);
mMV = 0.776;
mEf = 1./sqrt(2.);
break;
case 333:
mMf = mParameters->quarkMass(2);
mMV = 1.019;
mEf = 1./3.;
break;
case 443:
mMf = mParameters->quarkMass(3);
mMV = 3.096916;
mEf = 2./3.;
break;
case 553:
mMf = mParameters->quarkMass(4);
mMV = 9.46;
mEf = 1./3.;
break;
default:
cerr << "WaveOverlap::setProcess(): error no such type: " << val << endl;
break;
}
mMf2 = mMf*mMf;
}
//
// DVCS
//
double WaveOverlapDVCS::T(double z, double Q2, double r) const
{
// KMW paper hep-ph/0606272 Eq. 17
double term0, term1, term2;
double result=0;
for (int iFlav=0; iFlav<4; iFlav++) {
double mf=mParameters->quarkMass(iFlav);
double ef=quarkCharge[iFlav];
double eps2 = z*(1-z)*Q2 + mf*mf;
double eps = sqrt(eps2);
term0 = 2.*Nc/M_PI*alpha_em*ef*ef;
term1 = (z*z+(1-z)*(1-z))*eps*TMath::BesselK1(eps*r/hbarc)*mf*TMath::BesselK1(mf*r/hbarc);
term2 = mf*mf*TMath::BesselK0(eps*r/hbarc)*TMath::BesselK0(mf*r/hbarc);
result += term0*(term1+term2);
}
return result;
}
double WaveOverlapDVCS::L(double, double, double) const {return 0;}