Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8309051
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Subscribers
None
View Options
diff --git a/Shower/QTilde/SplittingFunctions/OneHalfHalfSplitFn.cc b/Shower/QTilde/SplittingFunctions/OneHalfHalfSplitFn.cc
--- a/Shower/QTilde/SplittingFunctions/OneHalfHalfSplitFn.cc
+++ b/Shower/QTilde/SplittingFunctions/OneHalfHalfSplitFn.cc
@@ -1,219 +1,221 @@
// -*- C++ -*-
//
// OneHalfHalfSplitFn.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2019 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the OneHalfHalfSplitFn class.
//
#include "OneHalfHalfSplitFn.h"
#include "ThePEG/PDT/ParticleData.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
#include "Herwig/Shower/QTilde/QTildeShowerHandler.h"
using namespace Herwig;
DescribeNoPIOClass<OneHalfHalfSplitFn,Herwig::Sudakov1to2FormFactor>
describeOneHalfHalfSplitFn ("Herwig::OneHalfHalfSplitFn","HwShower.so");
void OneHalfHalfSplitFn::Init() {
static ClassDocumentation<OneHalfHalfSplitFn> documentation
("The OneHalfHalfSplitFn class implements the splitting function for g->q qbar");
}
double OneHalfHalfSplitFn::integOverP(const double z, const IdList &,
unsigned int PDFfactor) const {
switch(PDFfactor) {
case 0:
return z;
case 1:
return log(z);
case 2:
return -log(1.-z);
case 3:
return log(z/(1.-z));
case 4:
return 2.*sqrt(z);
case 5:
return (2./3.)*z*sqrt(z);
default:
throw Exception() << "OneHalfHalfSplitFn::integOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
double OneHalfHalfSplitFn::invIntegOverP(const double r,
const IdList &,
unsigned int PDFfactor) const {
switch(PDFfactor) {
case 0:
return r;
case 1:
return exp(r);
case 2:
return 1.-exp(-r);
case 3:
return 1./(1.+exp(-r));
case 4:
return 0.25*sqr(r);
case 5:
return pow(1.5*r,2./3.);
default:
throw Exception() << "OneHalfHalfSplitFn::integOverP() invalid PDFfactor = "
<< PDFfactor << Exception::runerror;
}
}
vector<pair<int, Complex> >
OneHalfHalfSplitFn::generatePhiForward(const double z, const Energy2 t, const IdList & ids,
const RhoDMatrix & rho) {
assert(rho.iSpin()==PDT::Spin1);
double modRho = abs(rho(0,2));
Energy mq = ids[1]->mass();
Energy2 mq2 = sqr(mq);
double fact = z*(1.-z)-mq2/t;
double max = 1.+2.*fact*(-1.+2.*modRho);
vector<pair<int, Complex> > output;
output.push_back(make_pair( 0,(rho(0,0)+rho(2,2))*(1.-2.*fact)/max));
output.push_back(make_pair(-2,2.*fact*rho(0,2)/max));
output.push_back(make_pair( 2,2.*fact*rho(2,0)/max));
return output;
}
DecayMEPtr OneHalfHalfSplitFn::matrixElement(const double z, const Energy2 t,
const IdList & ids, const double phi,
bool timeLike) {
static const Complex ii(0.,1.);
// calculate the kernal
DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1Half,PDT::Spin1Half)));
double mt = !timeLike ? ZERO : ids[1]->mass()/sqrt(t);
double root =sqrt(1.-sqr(mt)/z/(1.-z));
(*kernal)(0,0,0) = mt/sqrt(z*(1.-z));
(*kernal)(2,1,1) = (*kernal)(0,0,0);
(*kernal)(0,0,1) = -z*root*exp(-ii*phi);
(*kernal)(2,1,0) = -conj((*kernal)(0,0,1));
(*kernal)(0,1,0) = (1.-z)*exp(-ii*phi)*root;
(*kernal)(2,0,1) = -conj((*kernal)(0,1,0));
(*kernal)(0,1,1) = 0.;
(*kernal)(2,0,0) = 0.;
return kernal;
}
void OneHalfHalfSplitFn::findZero() {
const double xTest = 0.2;
vector<Energy2> m2;
for(int id=4;id<=6;++id) {
tPDPtr parton = getParticleData(id);
Energy2 sMin(0.5*GeV2),sMax(4.*sqr(parton->mass()));
// ensure min and max in correct regions
while (PDF()->xfx(beam(),parton,sMin,xTest)!=0. && sMin>0.01*GeV2) {
sMin *=0.5;
}
while (PDF()->xfx(beam(),parton,sMax,xTest)==0. && sMax<1e10*GeV2) {
sMax *=2.;
}
if(sMin<0.01*GeV2 || sMax>1e10*GeV2) {
m2.push_back(ZERO);
continue;
}
// bisect to find zero
while(sMax-sMin>1e-10*GeV2) {
Energy2 sMid = 0.5*(sMax+sMin);
double test = PDF()->xfx(beam(),parton,sMid,xTest);
if(test!=0.) sMax = sMid;
else sMin = sMid;
}
m2.push_back(sMin);
}
mq_[PDF()] = m2;
}
void OneHalfHalfSplitFn::guesstz(Energy2 t1,unsigned int iopt,
const IdList &ids,
double enhance,bool ident,
double detune,
Energy2 &t_main, double &z_main) {
mq2_ = ZERO;
// get the mass to fix
if(iopt==1 && abs(ids[1]->id())>3) {
map<cPDFPtr,vector<Energy2>>::const_iterator cit = mq_.find(PDF());
if(cit== mq_.end()) findZero();
cit = mq_.find(PDF());
mq2_ = cit->second[abs(ids[1]->id())-4];
+ if(t1-mq2_<1e-10*GeV2) {
+ t_main = ZERO;
+ return;
+ }
}
unsigned int pdfopt = iopt!=1 ? 0 : pdfFactor();
double lower = integOverP(zLimits().first ,ids,pdfopt);
double upper = integOverP(zLimits().second,ids,pdfopt);
double c = 1./((upper - lower) * colourFactor()
* alpha()->showerOverestimateValue()/Constants::twopi*enhance*detune);
double r = UseRandom::rnd();
assert(iopt<=2);
if(iopt==1) {
c/=pdfMax();
//symmetry of FS gluon splitting
if(ident) c*=0.5;
}
else if(iopt==2) c*=-1.;
// guessing t
if(mq2_!=ZERO) {
t_main = (t1-mq2_)*pow(r,c) + mq2_;
}
else {
if(iopt!=2 || c*log(r)<log(Constants::MaxEnergy2/t1)) {
t_main = t1*pow(r,c);
}
else
t_main = Constants::MaxEnergy2;
}
// guessing z
z_main = invIntegOverP(lower + UseRandom::rnd()
*(upper - lower),ids,pdfopt);
}
double OneHalfHalfSplitFn::PDFVetoRatio(const Energy2 t, const double x, const double z,
const tcPDPtr parton0, const tcPDPtr parton1,double factor) const {
assert(PDF());
Energy2 theScale = t * sqr(ShowerHandler::currentHandler()->factorizationScaleFactor()*factor);
if (theScale < sqr(freeze())) theScale = sqr(freeze());
const double newpdf=PDF()->xfx(beam(),parton0,theScale,x/z);
if(newpdf<=0.) return 0.;
const double oldpdf=PDF()->xfx(beam(),parton1,theScale,x);
if(oldpdf<=0.) return 1.;
double ratio = newpdf/oldpdf;
double maxpdf = pdfMax();
- if(mq2_!=ZERO) ratio *= (t-mq2_)/t;
-
+ if(mq2_!=ZERO) {
+ ratio *= (t-mq2_)/t;
+ }
switch (pdfFactor()) {
case 0: break;
case 1: maxpdf /= z; break;
case 2: maxpdf /= 1.-z; break;
case 3: maxpdf /= (z*(1.-z)); break;
case 4: maxpdf /= sqrt(z); break;
case 5: maxpdf *= sqrt(z); break;
default :
throw Exception() << "OneHalfHalfSplitFn::PDFVetoRatio invalid PDFfactor = "
<< pdfFactor() << Exception::runerror;
}
- if (ratio > maxpdf) {
+ if (ratio > maxpdf && (mq2_==ZERO || (mq2_!=ZERO && (t-mq2_)/t >1e-6 ) ) )
generator()->log() << "OneHalfHalfSplitFn::PDFVetoRatio PDFVeto warning: Ratio > " << name()
- << ":PDFmax (by a factor of "
- << ratio/maxpdf <<") for "
- << parton0->PDGName() << " to "
- << parton1->PDGName() << "\n";
- }
+ << ":PDFmax (by a factor of " << ratio/maxpdf <<") for "
+ << parton0->PDGName() << " to " << parton1->PDGName() << " " << (t-mq2_)/t << "\n";
return ratio/maxpdf ;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Dec 21, 2:06 PM (12 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4023062
Default Alt Text
(7 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment