Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F10664317
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Subscribers
None
View Options
diff --git a/PDF/PomeronFlux.cc b/PDF/PomeronFlux.cc
--- a/PDF/PomeronFlux.cc
+++ b/PDF/PomeronFlux.cc
@@ -1,239 +1,244 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the PomeronFlux class.
//
#include "PomeronFlux.h"
#include "ThePEG/Utilities/Maths.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/PDT/ParticleData.h"
#include "ThePEG/PDT/EnumParticles.h"
#include "ThePEG/StandardModel/StandardModelBase.h"
#include "ThePEG/Repository/EventGenerator.h"
using namespace ThePEG;
using namespace Herwig;
PomeronFlux::PomeronFlux()
: q2min_(ZERO) , q2max_(10.*GeV2),
alfa0P_(1.104) , alfapP_(0.06/GeV2),
betaP_(5.5/GeV2), normP_(1./GeV2),
alfa0R_(0.5) , alfapR_(0.3/GeV2),
betaR_(1.6/GeV2), normR_(1./GeV2),
nR_(0.0013) , PDFFit_(0)
{}
bool PomeronFlux::canHandleParticle(tcPDPtr particle) const {
return ( abs(particle->id()) == ParticleID::pplus );
}
cPDVector PomeronFlux::partons(tcPDPtr) const {
cPDVector ret;
ret.push_back(getParticleData( ParticleID::pomeron));
ret.push_back(getParticleData( ParticleID::reggeon));
return ret;
}
double PomeronFlux::xfl(tcPDPtr, tcPDPtr parton, Energy2 qq,
double l, Energy2 ) const {
// extra factor of Q^2 to cancel jacobian and sort out dimensions
if(parton->id()==ParticleID::pomeron)
return normP_*qq*exp(-(betaP_ + 2.*alfapP_*l)*qq + 2.*(alfa0P_ - 1)*l);
else if(parton->id()==ParticleID::reggeon)
return nR_*normR_*qq*exp(-(betaR_ + 2.*alfapR_*l)*qq + 2.*(alfa0R_ - 1)*l);
- else
+ else {
assert(false);
+ return 0.;
+ }
}
double PomeronFlux::xfvl(tcPDPtr, tcPDPtr, Energy2, double,
Energy2) const {
// valence density is zero
return 0.0;
}
ClassDescription<PomeronFlux>
PomeronFlux::initPomeronFlux;
// Definition of the static class description member.
void PomeronFlux::Init() {
static ClassDocumentation<PomeronFlux> documentation
("The PomeronFlux provides the PDF for a pomeron inside"
" an incoming proton");
static Parameter<PomeronFlux,Energy2> interfaceQ2Min
("Q2Min",
"Minimum value of the magnitude of Q^2 for the photon",
&PomeronFlux::q2min_, GeV2, ZERO, ZERO, 100.0*GeV2,
false, false, Interface::limited);
static Parameter<PomeronFlux,Energy2> interfaceQ2Max
("Q2Max",
"Maximum value of the magnitude of Q^2 for the photon",
&PomeronFlux::q2max_, GeV2, 4.0*GeV2, ZERO, 100.0*GeV2,
false, false, Interface::limited);
static Parameter<PomeronFlux,double> interfaceAlpha0Pomeron
("Alpha0Pomeron",
"The coefficient of the intercept of alpha pomeron",
&PomeronFlux::alfa0P_, 1.104, 0.0, 0,
true, false, Interface::lowerlim);
static Parameter<PomeronFlux,InvEnergy2> interfaceAlphaPrimePomeron
("AlphaPrimePomeron",
"The coefficient of the t dependence of alpha of pomeron",
&PomeronFlux::alfapP_, 1./GeV2, 0.06/GeV2, 0./GeV2, 1./GeV2,
false, false, Interface::limited);
static Parameter<PomeronFlux,InvEnergy2> interfaceBPomeron
("BPomeron",
"The coefficient of the t dependence of the exponential term of pomeron",
&PomeronFlux::betaP_, 1./GeV2, 5.5/GeV2, 0./GeV2, 10./GeV2,
false, false, Interface::limited);
static Parameter<PomeronFlux,double> interfaceAlpha0Reggeon
("Alpha0Reggeon",
"The coefficient of the intercept of alpha reggeon",
&PomeronFlux::alfa0R_, 0.5, 0.0, 0,
true, false, Interface::lowerlim);
static Parameter<PomeronFlux,InvEnergy2> interfaceAlphaPrimeReggeon
("AlphaPrimeReggeon",
"The coefficient of the t dependence of alpha of reggeon",
&PomeronFlux::alfapR_, 1./GeV2, 0.3/GeV2, 0./GeV2, 1./GeV2,
false, false, Interface::limited);
static Parameter<PomeronFlux,InvEnergy2> interfaceBReggeon
("BReggeon",
"The coefficient of the t dependence of the exponential term reggeon",
&PomeronFlux::betaR_, 1/GeV2, 1.6/GeV2, 0./GeV2, 10./GeV2,
false, false, Interface::limited);
static Parameter<PomeronFlux,double> interfacenR
("nR",
"Reggeon flux factor",
&PomeronFlux::nR_, 0.0017, 0.0, 0,
true, false, Interface::lowerlim);
static Switch<PomeronFlux,int> interfacePDFFit
("PDFFit",
"The pomeron/regeon flux parameters are set according"
" to choice of pomeron/regeon structure function fit. ",
&PomeronFlux::PDFFit_, 0, false, false);
static SwitchOption interfacePDFFitUser
(interfacePDFFit,
"User",
"Default (set for fit Hera 2007) or user setting.",
0);
static SwitchOption interfacePDFFitPomeron2007
(interfacePDFFit,
"Pomeron2007",
"Pomeron structure function fit is Hera 2007.",
1);
static SwitchOption interfacePDFFitPomeron2006A
(interfacePDFFit,
"Pomeron2006A",
"Pomeron structure function fit is Hera 2006 A.",
2);
static SwitchOption interfacePDFFitPomeron2006B
(interfacePDFFit,
"Pomeron2006B",
"Pomeron structure function fit is Hera 2006 B.",
3);
}
double PomeronFlux::flattenScale(tcPDPtr proton, tcPDPtr parton, const PDFCuts & c,
double l, double z, double & jacobian) const {
double x = exp(-l);
Energy2 qqmax = min(q2max_,0.25*sqr(x)*c.sMax());
Energy2 qqmin = max(q2min_, sqr(proton->mass()*x)/(1-x));
if(qqmin>=qqmax) {
jacobian = 0.;
return 0.;
}
InvEnergy2 k =ZERO;
if(parton->id()==ParticleID::pomeron)
k = betaP_ + 2.*l*alfapP_;
else if(parton->id()==ParticleID::reggeon)
k = betaR_ + 2.*l*alfapR_;
else assert(false);
double rho = exp(-k*qqmax) + z * ( exp(-k*qqmin) - exp(-k*qqmax) );
Energy2 scale = -log(rho)/k;
// jacobian factor (1/Q^2max_)(dQ^2/dz) / Q^2 (to make dimensionless)
jacobian *= (exp(-k*qqmin) - exp(-k*qqmax))/(rho*k*scale);
// return Q^2/Q^2_max
return scale/c.scaleMaxL(l);
}
double PomeronFlux::flattenL(tcPDPtr, tcPDPtr parton, const PDFCuts & c,
double z, double & jacobian) const {
if(parton->id()==ParticleID::pomeron) {
- jacobian *= c.lMax() - c.lMin();
- return c.lMin() + z*(c.lMax() - c.lMin());
- }
- else if(parton->id()==ParticleID::reggeon) {
- double k = 2.*(alfa0R_ - 1.);
- double rho =exp(k*c.lMin()) + z*(exp(k*c.lMax()) - exp(k*c.lMin()));
- jacobian *= (exp(k*c.lMax()) - exp(k*c.lMin()))/(rho*k);
- return log(rho)/k;
- }
- else assert(false);
+ jacobian *= c.lMax() - c.lMin();
+ return c.lMin() + z*(c.lMax() - c.lMin());
+ }
+ else if(parton->id()==ParticleID::reggeon) {
+ double k = 2.*(alfa0R_ - 1.);
+ double rho =exp(k*c.lMin()) + z*(exp(k*c.lMax()) - exp(k*c.lMin()));
+ jacobian *= (exp(k*c.lMax()) - exp(k*c.lMin()))/(rho*k);
+ return log(rho)/k;
+ }
+ else {
+ assert(false);
+ return 0.;
+ }
}
-Energy2 PomeronFlux::intxFx(double x, Energy2 qqmin, Energy2 qqmax
- ,double alfa0, InvEnergy2 alfap, InvEnergy2 beta) const {
- InvEnergy2 k = beta - 2.*log(x)*alfap;
+Energy2 PomeronFlux::intxFx(double x, Energy2 qqmin, Energy2 qqmax,
+ double alfa0, InvEnergy2 alfap, InvEnergy2 beta) const {
+ InvEnergy2 k = beta - 2.*log(x)*alfap;
return exp(-2.*(alfa0 - 1.)*log(x))*(exp(-qqmin*k) - exp(-qqmax*k))/k;
}
void PomeronFlux::persistentOutput(PersistentOStream & os) const {
os << ounit(q2min_,GeV2) << ounit(q2max_,GeV2) << alfa0P_
<< ounit(alfapP_,1./GeV2) << ounit(betaP_,1./GeV2) << ounit(normP_,1./GeV2)
<< alfa0R_ << ounit(alfapR_,1./GeV2) << ounit(betaR_,1./GeV2)
<< ounit(normR_,1./GeV2) << nR_ << PDFFit_;
}
void PomeronFlux::persistentInput(PersistentIStream & is, int) {
is >> iunit(q2min_,GeV2) >> iunit(q2max_,GeV2) >> alfa0P_
>> iunit(alfapP_,1./GeV2) >> iunit(betaP_,1./GeV2) >> iunit(normP_,1./GeV2)
>> alfa0R_ >> iunit(alfapR_,1./GeV2) >> iunit(betaR_,1./GeV2)
>> iunit(normR_,1./GeV2) >> nR_ >> PDFFit_;
}
void PomeronFlux::doinit() {
PDFBase::doinit();
setFluxPar();
// compute the normalisation factor
double xp = 0.003;
Energy2 tkinmin = sqr(getParticleData(ParticleID::pplus)->mass()*xp)/(1-xp);
normP_ = 1./(intxFx(xp,tkinmin , 1.*GeV2, alfa0P_, alfapP_, betaP_ ));
normR_ = 1./(intxFx(xp,tkinmin , 1.*GeV2, alfa0R_, alfapR_, betaR_ ));
}
void PomeronFlux::setFluxPar() {
switch(PDFFit_){
case 0:
break;
case 1:
alfa0P_ = 1.104;
nR_ = 0.0013;
break;
case 2:
alfa0P_ = 1.118;
nR_ = 0.0017;
break;
case 3:
alfa0P_ = 1.111;
nR_ = 0.0014;
break;
default:
throw Exception() << "Invalid fit in PomeronFlux::setFluxPar()"
<< Exception::runerror;
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Apr 24, 6:36 AM (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4887768
Default Alt Text
(8 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment