Index: trunk/src/WaveOverlap.cpp =================================================================== --- trunk/src/WaveOverlap.cpp (revision 364) +++ trunk/src/WaveOverlap.cpp (revision 365) @@ -1,270 +1,274 @@ //============================================================================== // WaveOverlap.cpp // // Copyright (C) 2010-2018 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){ - 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)) + 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){ - 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 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* par) { - 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; + 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) { - // - // 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"<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) { // 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) {return 0;} Index: trunk/src/WaveOverlap.h =================================================================== --- trunk/src/WaveOverlap.h (revision 364) +++ trunk/src/WaveOverlap.h (revision 365) @@ -1,80 +1,82 @@ //============================================================================== // WaveOverlap.h // // Copyright (C) 2010-2018 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$ //============================================================================== #ifndef WaveOverlap_h #define WaveOverlap_h class DipoleModelParameters; class WaveOverlap { public: WaveOverlap(); virtual ~WaveOverlap(); virtual void setWaveOverlapFunctionParameters(int); virtual double T(double, double, double)=0; virtual double L(double, double, double)=0; - virtual void setProcess(int){}; - virtual void testBoostedGaussianParameters(int){}; + virtual void setProcess(int); + virtual void testBoostedGaussianParameters(int); protected: DipoleModelParameters *mParameters; }; class WaveOverlapVM : public WaveOverlap { public: WaveOverlapVM(); void setWaveOverlapFunctionParameters(int); void setProcess(int); void testBoostedGaussianParameters(int); private: double T(double, double, double); double L(double, double, double); double transverseWaveFunction(double, double); double longitudinalWaveFunction(double, double); double dDrTransverseWaveFunction(double, double); double laplaceRLongitudinalWaveFunction(double, double); double uiDecayWidth(double*, double*); double uiNormL(const double*); double uiNormT(const double*); private: double mNT, mRT2; double mMf; // mass of quarks in vector meson double mBoostedGaussianMf; // // mass of quarks in vector meson's boosted Gaussian wave fct. double mMf2; double mBoostedGaussianMf2; double mEf; double mMV; double mNL, mRL2; }; class WaveOverlapDVCS : public WaveOverlap { private: double T(double, double, double); double L(double, double, double); }; inline void WaveOverlap::setWaveOverlapFunctionParameters(int) {/* no op*/} - +inline void setProcess(int) {/* no op*/}; +inline void testBoostedGaussianParameters(int) {/* no op*/}; + #endif