10 #ifndef Pythia8_BeamParticle_H
11 #define Pythia8_BeamParticle_H
13 #include "Pythia8/Basics.h"
14 #include "Pythia8/Event.h"
15 #include "Pythia8/FragmentationFlavZpT.h"
16 #include "Pythia8/Info.h"
17 #include "Pythia8/ParticleData.h"
18 #include "Pythia8/PartonDistributions.h"
19 #include "Pythia8/PhysicsBase.h"
20 #include "Pythia8/PythiaStdlib.h"
21 #include "Pythia8/Settings.h"
38 class ResolvedParton {
43 ResolvedParton(
int iPosIn = 0,
int idIn = 0,
double xIn = 0.,
44 int companionIn = -1) : iPosRes(iPosIn), idRes(idIn), xRes(xIn),
45 companionRes(companionIn), xqCompRes(0.), mRes(0.), factorRes(1.),
46 colRes(0), acolRes(0) { }
49 void iPos(
int iPosIn) {iPosRes = iPosIn;}
50 void id(
int idIn) {idRes = idIn;}
51 void x(
double xIn) {xRes = xIn;}
52 void update(
int iPosIn,
int idIn,
double xIn) {iPosRes = iPosIn;
53 idRes = idIn; xRes = xIn;}
54 void companion(
int companionIn) {companionRes = companionIn;}
55 void xqCompanion(
double xqCompIn) {xqCompRes = xqCompIn;}
56 void p(Vec4 pIn) {pRes = pIn;}
57 void px(
double pxIn) {pRes.px(pxIn);}
58 void py(
double pyIn) {pRes.py(pyIn);}
59 void pz(
double pzIn) {pRes.pz(pzIn);}
60 void e(
double eIn) {pRes.e(eIn);}
61 void m(
double mIn) {mRes = mIn;}
62 void col(
int colIn) {colRes = colIn;}
63 void acol(
int acolIn) {acolRes = acolIn;}
64 void cols(
int colIn = 0,
int acolIn = 0)
65 {colRes = colIn; acolRes = acolIn;}
66 void scalePT(
double factorIn) {pRes.px(factorIn * pRes.px());
67 pRes.py(factorIn * pRes.py()); factorRes *= factorIn;}
68 void scaleX(
double factorIn) {xRes *= factorIn;}
71 int iPos()
const {
return iPosRes;}
72 int id()
const {
return idRes;}
73 double x()
const {
return xRes;}
74 int companion()
const {
return companionRes;}
75 bool isValence()
const {
return (companionRes == -3);}
76 bool isUnmatched()
const {
return (companionRes == -2);}
77 bool isCompanion()
const {
return (companionRes >= 0);}
78 bool isFromBeam()
const {
return (companionRes > -10);}
79 double xqCompanion()
const {
return xqCompRes;}
80 Vec4 p()
const {
return pRes;}
81 double px()
const {
return pRes.px();}
82 double py()
const {
return pRes.py();}
83 double pz()
const {
return pRes.pz();}
84 double e()
const {
return pRes.e();}
85 double m()
const {
return mRes;}
86 double pT()
const {
return pRes.pT();}
87 double mT2()
const {
return (mRes >= 0.)
88 ? mRes*mRes + pRes.pT2() : - mRes*mRes + pRes.pT2();}
89 double pPos()
const {
return pRes.e() + pRes.pz();}
90 double pNeg()
const {
return pRes.e() - pRes.pz();}
91 int col()
const {
return colRes;}
92 int acol()
const {
return acolRes;}
93 double pTfactor()
const {
return factorRes;}
94 bool hasCol()
const {
return (idRes == 21 || (idRes > 0 && idRes < 9)
95 || (-idRes > 1000 && -idRes < 10000 && (-idRes/10)%10 == 0));}
96 bool hasAcol()
const {
return (idRes == 21 || (-idRes > 0 && -idRes < 9)
97 || (idRes > 1000 && idRes < 10000 && (idRes/10)%10 == 0));}
109 double mRes, factorRes;
139 pdfHardBeamPtr(), pdfUnresBeamPtr(), pdfBeamPtrSave(),
140 pdfHardBeamPtrSave(), flavSelPtr(), allowJunction(), beamJunction(),
141 maxValQuark(), companionPower(), valencePowerMeson(), valencePowerUinP(),
142 valencePowerDinP(), valenceDiqEnhance(), pickQuarkNorm(), pickQuarkPower(),
143 diffPrimKTwidth(), diffLargeMassSuppress(), beamSat(), gluonPower(),
144 xGluonCutoff(), idBeam(), idBeamAbs(), idVMDBeam(), mBeam(), mVMDBeam(),
145 scaleVMDBeam(), isUnresolvedBeam(), isLeptonBeam(), isHadronBeam(),
146 isMesonBeam(), isBaryonBeam(), isGammaBeam(), nValKinds(), idVal(), nVal(),
147 idSave(), iSkipSave(), nValLeft(), xqgTot(), xqVal(), xqgSea(),
148 xqCompSum(), doISR(), doMPI(), doND(), isResolvedGamma(),
149 hasResGammaInBeam(), isResUnres(), hasVMDstateInBeam(), initGammaBeam(),
150 pTminISR(), pTminMPI(), pT2gm2qqbar(), iGamVal(), iPosVal(), gammaMode(),
151 xGm(), Q2gm(), kTgamma(), phiGamma(), cPowerCache(-100), xsCache(-1),
152 resCache(), resolved(), nInit(0), hasJunctionBeam(), junCol(), nJuncs(),
153 nAjuncs(), nDiffJuncs(), allowBeamJunctions(), Q2ValFracSav(-1.),
154 uValInt(), dValInt(), idVal1(), idVal2(), idVal3(), zRel(), pxRel(),
158 void init(
int idIn,
double pzIn,
double eIn,
double mIn,
159 PDFPtr pdfInPtr, PDFPtr pdfHardInPtr,
bool isUnresolvedIn,
160 StringFlav* flavSelPtrIn);
163 void initPDFPtr(PDFPtr pdfInPtr, PDFPtr pdfHardInPtr) {
164 pdfBeamPtr = pdfInPtr; pdfHardBeamPtr = pdfHardInPtr; }
167 void initUnres(PDFPtr pdfUnresInPtr);
170 void newValenceContent();
173 void newPzE(
double pzIn,
double eIn) {pBeam = Vec4( 0., 0., pzIn, eIn);}
176 void newM(
double mIn) { mBeam = mIn; }
179 int id()
const {
return idBeam;}
180 int idVMD()
const {
return idVMDBeam;}
181 Vec4 p()
const {
return pBeam;}
182 double px()
const {
return pBeam.px();}
183 double py()
const {
return pBeam.py();}
184 double pz()
const {
return pBeam.pz();}
185 double e()
const {
return pBeam.e();}
186 double m()
const {
return mBeam;}
187 double mVMD()
const {
return mVMDBeam;}
188 double scaleVMD()
const {
return scaleVMDBeam;}
189 bool isLepton()
const {
return isLeptonBeam;}
190 bool isUnresolved()
const {
return isUnresolvedBeam;}
192 bool isHadron()
const {
return isHadronBeam;}
193 bool isMeson()
const {
return isMesonBeam;}
194 bool isBaryon()
const {
return isBaryonBeam;}
195 bool isGamma()
const {
return isGammaBeam;}
196 bool hasResGamma()
const {
return hasResGammaInBeam;}
197 bool hasVMDstate()
const {
return hasVMDstateInBeam;}
200 double xMax(
int iSkip = -1);
203 double xfHard(
int idIn,
double x,
double Q2)
204 {
return pdfHardBeamPtr->xf(idIn, x, Q2);}
207 double xfMax(
int idIn,
double x,
double Q2)
208 {
return pdfHardBeamPtr->xfMax(idIn, x, Q2);}
211 double xfFlux(
int idIn,
double x,
double Q2)
212 {
return pdfHardBeamPtr->xfFlux(idIn, x, Q2);}
213 double xfApprox(
int idIn,
double x,
double Q2)
214 {
return pdfHardBeamPtr->xfApprox(idIn, x, Q2);}
215 double xfGamma(
int idIn,
double x,
double Q2)
216 {
return pdfHardBeamPtr->xfGamma(idIn, x, Q2);}
220 double xfSame(
int idIn,
double x,
double Q2)
221 {
return pdfHardBeamPtr->xfSame(idIn, x, Q2);}
224 double xf(
int idIn,
double x,
double Q2)
225 {
return pdfBeamPtr->xf(idIn, x, Q2);}
228 double xfVal(
int idIn,
double x,
double Q2)
229 {
return pdfBeamPtr->xfVal(idIn, x, Q2);}
230 double xfSea(
int idIn,
double x,
double Q2)
231 {
return pdfBeamPtr->xfSea(idIn, x, Q2);}
235 double xfMPI(
int idIn,
double x,
double Q2, xfModPrepData& xfData)
236 {
return xfISR(-1, idIn, x, Q2, xfData);}
237 double xfMPI(
int idIn,
double x,
double Q2)
238 {xfModPrepData xfData = xfModPrep(-1, Q2);
239 return xfISR(-1, idIn, x, Q2, xfData);}
240 double xfISR(
int indexMPI,
int idIn,
double x,
double Q2,
241 xfModPrepData& xfData) {
return xfModified( indexMPI, idIn, x, Q2, xfData);}
242 double xfISR(
int indexMPI,
int idIn,
double x,
double Q2)
243 {xfModPrepData xfData= xfModPrep(indexMPI, Q2);
244 return xfModified( indexMPI, idIn, x, Q2, xfData);}
247 bool insideBounds(
double x,
double Q2)
248 {
return pdfBeamPtr->insideBounds(x,Q2);}
251 double alphaS(
double Q2) {
return pdfBeamPtr->alphaS(Q2);}
254 double mQuarkPDF(
int idIn) {
return pdfBeamPtr->mQuarkPDF(idIn);}
257 int nMembers() {
return pdfBeamPtr->nMembers();}
260 void calcPDFEnvelope(
int idNow,
double xNow,
double Q2Now,
int valSea) {
261 pdfBeamPtr->calcPDFEnvelope(idNow,xNow,Q2Now,valSea);}
262 void calcPDFEnvelope(pair<int,int> idNows, pair<double,double> xNows,
263 double Q2Now,
int valSea) {
264 pdfBeamPtr->calcPDFEnvelope(idNows,xNows,Q2Now,valSea);}
265 PDF::PDFEnvelope getPDFEnvelope() {
return pdfBeamPtr->getPDFEnvelope(); }
268 int pickValSeaComp();
274 ResolvedParton& operator[](
int i) {
return resolved[i];}
275 const ResolvedParton& operator[](
int i)
const {
return resolved[i];}
278 int size()
const {
return resolved.size();}
279 int sizeInit()
const {
return nInit;}
282 void clear() {resolved.resize(0); nInit = 0;}
285 void resetGamma() {iGamVal = -1; iPosVal = -1; pT2gm2qqbar = 0.;
286 isResolvedGamma = (gammaMode == 1) ?
true :
false;}
289 void resetGammaInLepton() {xGm = 1.; kTgamma = 0.; phiGamma = 0.;}
292 int append(
int iPos,
int idIn,
double x,
int companion = -1)
293 {resolved.push_back( ResolvedParton( iPos, idIn, x, companion) );
294 return resolved.size() - 1;}
297 void popBack() {
int iComp = resolved.back().companion();
298 resolved.pop_back();
if ( iComp >= 0 ) { iSkipSave = iComp;
299 idSave = resolved[iComp].id(); pickValSeaComp(); } }
305 int nValenceKinds()
const {
return nValKinds;}
306 int nValence(
int idIn)
const {
for (
int i = 0; i < nValKinds; ++i)
307 if (idIn == idVal[i])
return nVal[i];
311 bool isUnresolvedLepton();
314 bool remnantFlavours(
Event& event,
bool isDIS =
false);
317 bool remnantColours(
Event& event, vector<int>& colFrom,
321 double xRemnant(
int i);
324 bool hasJunction()
const {
return hasJunctionBeam;}
325 int junctionCol(
int i)
const {
return junCol[i];}
326 void junctionCol(
int i,
int col) {junCol[i] = col;}
329 bool pickGluon(
double mDiff);
333 int pickRemnant()
const {
return idVal2;}
337 double zShare(
double mDiff,
double m1,
double m2);
338 double pxShare()
const {
return pxRel;}
339 double pyShare()
const {
return pyRel;}
342 bool remnantFlavoursNew(
Event& event);
345 void findColSetup(
Event& event);
348 void setInitialCol(
Event & event);
351 void updateCol(vector<pair<int,int> > colourChanges);
353 vector<pair <int,int> > getColUpdates() {
return colUpdates;}
356 bool gammaInitiatorIsVal(
int iResolved,
int id,
double x,
double Q2);
357 bool gammaInitiatorIsVal(
int iResolved,
double Q2);
358 int getGammaValFlavour() {
return abs(idVal[0]); }
359 int gammaValSeaComp(
int iResolved);
360 void posVal(
int iPosValIn) { iPosVal = iPosValIn; }
361 void gamVal(
int iGamValIn) { iGamVal = iGamValIn; }
362 int gamVal() {
return iGamVal; }
365 void resolvedGamma(
bool isResolved) { isResolvedGamma = isResolved; }
366 bool resolvedGamma() {
return isResolvedGamma; }
367 void setGammaMode(
int gammaModeIn);
368 int getGammaMode() {
return gammaMode; }
369 bool isResolvedUnresolved() {
return isResUnres; }
370 void initGammaInBeam() { initGammaBeam =
true; }
371 bool gammaInBeam() {
return initGammaBeam; }
374 void setVMDstate(
bool isVMDIn,
int idIn,
double mIn,
double scaleIn,
375 bool reassignState =
false) {
376 hasVMDstateInBeam = isVMDIn;
379 scaleVMDBeam = scaleIn;
383 pdfBeamPtr->setVMDscale(scaleVMDBeam);
388 void pT2gamma2qqbar(
double pT2in) { pT2gm2qqbar = pT2in; }
389 double pT2gamma2qqbar() {
return pT2gm2qqbar; }
392 void pTMPI(
double pTminMPIin) { pTminMPI = pTminMPIin; }
395 bool roomFor1Remnant(
double eCM);
396 bool roomFor1Remnant(
int id1,
double x1,
double eCM);
397 bool roomFor2Remnants(
int id1,
double x1,
double eCM);
398 bool roomForRemnants(BeamParticle beamOther);
401 double remnantMass(
int idIn);
404 double gammaPDFxDependence(
int flavour,
double x)
405 {
return pdfBeamPtr->gammaPDFxDependence(flavour, x); }
406 double gammaPDFRefScale(
int flavour)
407 {
return pdfBeamPtr->gammaPDFRefScale(flavour); }
408 double xIntegratedPDFs(
double Q2)
409 {
return pdfBeamPtr->xfIntegratedTotal(Q2); }
412 void xGammaPDF() { xGm = pdfHardBeamPtr->xGamma(); }
413 void xGamma(
double xGmIn) { xGm = xGmIn; }
414 void Q2Gamma(
double Q2GmIn) { Q2gm = Q2GmIn; }
415 void newGammaKTPhi(
double kTIn,
double phiIn)
416 { kTgamma = kTIn; phiGamma = phiIn; }
419 double xGammaMin() {
return pdfHardBeamPtr->getXmin(); }
420 double xGammaHadr() {
return pdfHardBeamPtr->getXhadr(); }
421 double gammaFluxIntApprox() {
return pdfHardBeamPtr->intFluxApprox(); }
424 bool hasApproxGammaFlux() {
return pdfHardBeamPtr->hasApproxGammaFlux(); }
427 double xGamma()
const {
return xGm; }
428 double Q2Gamma()
const {
return Q2gm; }
429 double gammaKTx()
const {
return kTgamma*cos(phiGamma); }
430 double gammaKTy()
const {
return kTgamma*sin(phiGamma); }
431 double gammaKT()
const {
return kTgamma; }
432 double gammaPhi()
const {
return phiGamma; }
435 void xPom(
double xpom = -1.0)
436 {
if ( pdfBeamPtr ) pdfBeamPtr->xPom(xpom); }
439 double sampleXgamma(
double xMinIn)
440 { xGm = pdfHardBeamPtr->sampleXgamma(xMinIn);
return xGm; }
441 double sampleQ2gamma(
double Q2min)
442 { Q2gm = pdfHardBeamPtr->sampleQ2gamma(Q2min);
return Q2gm;}
445 xfModPrepData xfModPrep(
int iSkip,
double Q2);
450 static const double XMINUNRESOLVED, POMERONMASS, XMAXCOMPANION, TINYZREL;
451 static const int NMAX, NRANDOMTRIES;
455 PDFPtr pdfHardBeamPtr;
458 PDFPtr pdfUnresBeamPtr;
459 PDFPtr pdfBeamPtrSave;
460 PDFPtr pdfHardBeamPtrSave;
463 StringFlav* flavSelPtr;
466 bool allowJunction, beamJunction;
467 int maxValQuark, companionPower;
468 double valencePowerMeson, valencePowerUinP, valencePowerDinP,
469 valenceDiqEnhance, pickQuarkNorm, pickQuarkPower,
470 diffPrimKTwidth, diffLargeMassSuppress, beamSat, gluonPower,
474 int idBeam, idBeamAbs, idVMDBeam;
476 double mBeam, mVMDBeam, scaleVMDBeam;
479 bool isUnresolvedBeam, isLeptonBeam, isHadronBeam, isMesonBeam,
480 isBaryonBeam, isGammaBeam;
481 int nValKinds, idVal[3], nVal[3];
484 int idSave, iSkipSave, nValLeft[3];
485 double xqgTot, xqVal, xqgSea, xqCompSum;
488 bool doISR, doMPI, doND, isResolvedGamma, hasResGammaInBeam,
489 isResUnres, hasVMDstateInBeam, initGammaBeam;
490 double pTminISR, pTminMPI, pT2gm2qqbar;
491 int iGamVal, iPosVal, gammaMode;
494 double xGm, Q2gm, kTgamma, phiGamma;
498 double xsCache, resCache;
501 vector<ResolvedParton> resolved;
505 bool hasJunctionBeam;
509 pair <int,int> colSetup;
510 vector<int> acols, cols;
511 vector<bool> usedCol,usedAcol;
512 vector< pair<int,int> > colUpdates;
513 int nJuncs, nAjuncs, nDiffJuncs;
514 bool allowBeamJunctions;
517 double xfModified(
int iSkip,
int idIn,
double x,
double Q2) {
518 xfModPrepData xfData = xfModPrep(iSkip, Q2);
519 return xfModified(iSkip, idIn, x, Q2, xfData);}
520 double xfModified(
int iSkip,
int idIn,
double x,
double Q2,
521 xfModPrepData&
data);
523 double xfModified0(
int iSkip,
int idIn,
double x,
double Q2);
526 double xValFrac(
int j,
double Q2);
527 double Q2ValFracSav, uValInt, dValInt;
530 double xCompFrac(
double xs);
533 double xCompDist(
double xc,
double xs);
536 int idVal1, idVal2, idVal3;
537 double zRel, pxRel, pyRel;
540 void updateSingleCol(
int oldCol,
int newCol);
544 int findSingleCol(
Event& event,
bool isAcol,
bool useHardScatters);
552 #endif // Pythia8_BeamParticle_H