9 #include "Pythia8/MultipartonInteractions.h"
12 #include "Pythia8/SigmaQCD.h"
13 #include "Pythia8/SigmaEW.h"
14 #include "Pythia8/SigmaOnia.h"
28 const double SigmaMultiparton::MASSMARGIN = 0.1;
31 const double SigmaMultiparton::OTHERFRAC = 0.2;
37 bool SigmaMultiparton::init(
int inState,
int processLevel, Info* infoPtr,
38 Settings* settingsPtr, ParticleData* particleDataPtr, Rndm* rndmPtrIn,
39 BeamParticle* beamAPtr, BeamParticle* beamBPtr, Couplings* couplingsPtr) {
45 if (sigmaT.size() > 0) {
46 for (
int i = 0; i < int(sigmaT.size()); ++i)
delete sigmaT[i];
49 if (sigmaU.size() > 0) {
50 for (
int i = 0; i < int(sigmaU.size()); ++i)
delete sigmaU[i];
58 sigmaT.push_back(
new Sigma2gg2gg() );
59 sigmaU.push_back(
new Sigma2gg2gg() );
62 }
else if (inState == 1) {
63 sigmaT.push_back(
new Sigma2qg2qg() );
64 sigmaU.push_back(
new Sigma2qg2qg() );
68 sigmaT.push_back(
new Sigma2qq2qq() );
69 sigmaU.push_back(
new Sigma2qq2qq() );
73 if (processLevel > 0) {
75 sigmaT.push_back(
new Sigma2gg2qqbar() );
76 sigmaU.push_back(
new Sigma2gg2qqbar() );
77 sigmaT.push_back(
new Sigma2gg2QQbar(4, 121) );
78 sigmaU.push_back(
new Sigma2gg2QQbar(4, 121) );
79 sigmaT.push_back(
new Sigma2gg2QQbar(5, 123) );
80 sigmaU.push_back(
new Sigma2gg2QQbar(5, 123) );
81 }
else if (inState == 2) {
82 sigmaT.push_back(
new Sigma2qqbar2gg() );
83 sigmaU.push_back(
new Sigma2qqbar2gg() );
84 sigmaT.push_back(
new Sigma2qqbar2qqbarNew() );
85 sigmaU.push_back(
new Sigma2qqbar2qqbarNew() );
86 sigmaT.push_back(
new Sigma2qqbar2QQbar(4, 122) );
87 sigmaU.push_back(
new Sigma2qqbar2QQbar(4, 122) );
88 sigmaT.push_back(
new Sigma2qqbar2QQbar(5, 124) );
89 sigmaU.push_back(
new Sigma2qqbar2QQbar(5, 124) );
94 if (processLevel > 1) {
96 sigmaT.push_back(
new Sigma2gg2ggamma() );
97 sigmaU.push_back(
new Sigma2gg2ggamma() );
98 sigmaT.push_back(
new Sigma2gg2gammagamma() );
99 sigmaU.push_back(
new Sigma2gg2gammagamma() );
100 }
else if (inState == 1) {
101 sigmaT.push_back(
new Sigma2qg2qgamma() );
102 sigmaU.push_back(
new Sigma2qg2qgamma() );
103 }
else if (inState == 2) {
104 sigmaT.push_back(
new Sigma2qqbar2ggamma() );
105 sigmaU.push_back(
new Sigma2qqbar2ggamma() );
106 sigmaT.push_back(
new Sigma2ffbar2gammagamma() );
107 sigmaU.push_back(
new Sigma2ffbar2gammagamma() );
108 sigmaT.push_back(
new Sigma2ffbar2ffbarsgm() );
109 sigmaU.push_back(
new Sigma2ffbar2ffbarsgm() );
112 sigmaT.push_back(
new Sigma2ff2fftgmZ() );
113 sigmaU.push_back(
new Sigma2ff2fftgmZ() );
114 sigmaT.push_back(
new Sigma2ff2fftW() );
115 sigmaU.push_back(
new Sigma2ff2fftW() );
120 if (processLevel > 2) {
121 SigmaOniaSetup charmonium(infoPtr, settingsPtr, particleDataPtr, 4);
122 SigmaOniaSetup bottomonium(infoPtr, settingsPtr, particleDataPtr, 5);
124 charmonium.setupSigma2gg(sigmaT,
true);
125 charmonium.setupSigma2gg(sigmaU,
true);
126 bottomonium.setupSigma2gg(sigmaT,
true);
127 bottomonium.setupSigma2gg(sigmaU,
true);
128 }
else if (inState == 1) {
129 charmonium.setupSigma2qg(sigmaT,
true);
130 charmonium.setupSigma2qg(sigmaU,
true);
131 bottomonium.setupSigma2qg(sigmaT,
true);
132 bottomonium.setupSigma2qg(sigmaU,
true);
133 }
else if (inState == 2) {
134 charmonium.setupSigma2qq(sigmaT,
true);
135 charmonium.setupSigma2qq(sigmaU,
true);
136 bottomonium.setupSigma2qq(sigmaT,
true);
137 bottomonium.setupSigma2qq(sigmaU,
true);
142 nChan = sigmaT.size();
143 needMasses.resize(nChan);
146 sHatMin.resize(nChan);
147 sigmaTval.resize(nChan);
148 sigmaUval.resize(nChan);
151 for (
int i = 0; i < nChan; ++i) {
152 sigmaT[i]->init( infoPtr, settingsPtr, particleDataPtr, rndmPtr,
153 beamAPtr, beamBPtr, couplingsPtr);
154 sigmaT[i]->initProc();
155 sigmaU[i]->init( infoPtr, settingsPtr, particleDataPtr, rndmPtr,
156 beamAPtr, beamBPtr, couplingsPtr);
157 sigmaU[i]->initProc();
160 needMasses[i] =
false;
161 int id3Mass = sigmaT[i]->id3Mass();
162 int id4Mass = sigmaT[i]->id4Mass();
165 if (id3Mass > 0 || id4Mass > 0) {
166 needMasses[i] =
true;
167 m3Fix[i] = particleDataPtr->m0(id3Mass);
168 m4Fix[i] = particleDataPtr->m0(id4Mass);
170 sHatMin[i] = pow2( m3Fix[i] + m4Fix[i] + MASSMARGIN);
182 double SigmaMultiparton::sigma(
int id1,
int id2,
double x1,
double x2,
183 double sHat,
double tHat,
double uHat,
double alpS,
double alpEM,
184 bool restore,
bool pickOtherIn) {
187 if (restore) pickOther = pickOtherIn;
188 else pickOther = (rndmPtr->flat() < OTHERFRAC);
193 for (
int i = 0; i < nChan; ++i) {
198 if (i == 0 && pickOther)
continue;
199 if (i > 0 && !pickOther)
continue;
202 if (sHat > sHatMin[i]) {
203 sigmaT[i]->set2KinMPI( x1, x2, sHat, tHat, uHat,
204 alpS, alpEM, needMasses[i], m3Fix[i], m4Fix[i]);
205 sigmaTval[i] = sigmaT[i]->sigmaHatWrap(id1, id2);
206 sigmaT[i]->pickInState(id1, id2);
208 if (needMasses[i]) sigmaTval[i] *= sigmaT[i]->sHBetaMPI() / sHat;
209 sigmaTsum += sigmaTval[i];
213 if (sHat > sHatMin[i]) {
214 sigmaU[i]->set2KinMPI( x1, x2, sHat, uHat, tHat,
215 alpS, alpEM, needMasses[i], m3Fix[i], m4Fix[i]);
216 sigmaUval[i] = sigmaU[i]->sigmaHatWrap( id1, id2);
217 sigmaU[i]->pickInState(id1, id2);
219 if (needMasses[i]) sigmaUval[i] *= sigmaU[i]->sHBetaMPI() / sHat;
220 sigmaUsum += sigmaUval[i];
225 double sigmaAvg = 0.5 * (sigmaTsum + sigmaUsum);
226 if (pickOther) sigmaAvg /= OTHERFRAC;
227 if (!pickOther) sigmaAvg /= (1. - OTHERFRAC);
236 SigmaProcess* SigmaMultiparton::sigmaSel() {
239 pickedU = (rndmPtr->flat() * (sigmaTsum + sigmaUsum) < sigmaUsum);
243 double sigmaRndm = sigmaTsum * rndmPtr->flat();
245 do sigmaRndm -= sigmaTval[++iPick];
246 while (sigmaRndm > 0.);
247 return sigmaT[iPick];
251 double sigmaRndm = sigmaUsum * rndmPtr->flat();
253 do sigmaRndm -= sigmaUval[++iPick];
254 while (sigmaRndm > 0.);
255 return sigmaU[iPick];
271 const bool MultipartonInteractions::SHIFTFACSCALE =
false;
274 const bool MultipartonInteractions::PREPICKRESCATTER =
true;
277 const double MultipartonInteractions::SIGMAFUDGE = 0.8;
280 const double MultipartonInteractions::RPT20 = 0.25;
283 const double MultipartonInteractions::PT0STEP = 0.9;
284 const double MultipartonInteractions::SIGMASTEP = 1.1;
287 const double MultipartonInteractions::PT0MIN = 0.2;
290 const double MultipartonInteractions::EXPPOWMIN = 0.4;
293 const double MultipartonInteractions::PROBATLOWB = 0.6;
296 const double MultipartonInteractions::BSTEP = 0.01;
299 const double MultipartonInteractions::BMAX = 1e-8;
302 const double MultipartonInteractions::EXPMAX = 50.;
305 const double MultipartonInteractions::KCONVERGE = 1e-7;
308 const double MultipartonInteractions::CONVERT2MB = 0.389380;
311 const double MultipartonInteractions::ROOTMIN = 0.01;
314 const double MultipartonInteractions::ECMDEV = 0.01;
319 const int MultipartonInteractions::XDEP_BBIN = 500;
321 const double MultipartonInteractions::XDEP_A0 = 1.0;
323 const double MultipartonInteractions::XDEP_A1 = 1.0;
325 const double MultipartonInteractions::XDEP_BSTEP = 0.02;
326 const double MultipartonInteractions::XDEP_BSTEPINC = 0.01;
329 const double MultipartonInteractions::XDEP_CUTOFF = 1e-4;
331 const double MultipartonInteractions::XDEP_SMB2FM = sqrt(0.1);
334 const double MultipartonInteractions::WTACCWARN = 1.1;
340 bool MultipartonInteractions::init(
bool doMPIinit,
int iDiffSysIn,
341 Info* infoPtrIn, Settings& settings, ParticleData* particleDataPtr,
342 Rndm* rndmPtrIn, BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn,
343 Couplings* couplingsPtrIn, PartonSystems* partonSystemsPtrIn,
344 SigmaTotal* sigmaTotPtrIn, UserHooks* userHooksPtrIn, ostream& os) {
347 iDiffSys = iDiffSysIn;
350 beamAPtr = beamAPtrIn;
351 beamBPtr = beamBPtrIn;
352 couplingsPtr = couplingsPtrIn;
353 partonSystemsPtr = partonSystemsPtrIn;
354 sigmaTotPtr = sigmaTotPtrIn;
355 userHooksPtr = userHooksPtrIn;
356 if (!doMPIinit)
return false;
359 hasBaryonBeams = ( beamAPtr->isBaryon() && beamBPtr->isBaryon() );
362 pTmaxMatch = settings.mode(
"MultipartonInteractions:pTmaxMatch");
365 alphaSvalue = settings.parm(
"MultipartonInteractions:alphaSvalue");
366 alphaSorder = settings.mode(
"MultipartonInteractions:alphaSorder");
367 alphaSnfmax = settings.mode(
"StandardModel:alphaSnfmax");
370 alphaEMorder = settings.mode(
"MultipartonInteractions:alphaEMorder");
373 Kfactor = settings.parm(
"MultipartonInteractions:Kfactor");
376 pT0Ref = settings.parm(
"MultipartonInteractions:pT0Ref");
377 ecmRef = settings.parm(
"MultipartonInteractions:ecmRef");
378 ecmPow = settings.parm(
"MultipartonInteractions:ecmPow");
379 pTmin = settings.parm(
"MultipartonInteractions:pTmin");
383 bProfile = settings.mode(
"MultipartonInteractions:bProfile");
384 coreRadius = settings.parm(
"MultipartonInteractions:coreRadius");
385 coreFraction = settings.parm(
"MultipartonInteractions:coreFraction");
386 expPow = settings.parm(
"MultipartonInteractions:expPow");
387 expPow = max(EXPPOWMIN, expPow);
389 a1 = settings.parm(
"MultipartonInteractions:a1");
393 bProfile = settings.mode(
"Diffraction:bProfile");
394 coreRadius = settings.parm(
"Diffraction:coreRadius");
395 coreFraction = settings.parm(
"Diffraction:coreFraction");
396 expPow = settings.parm(
"Diffraction:expPow");
397 expPow = max(EXPPOWMIN, expPow);
401 bSelScale = settings.mode(
"MultipartonInteractions:bSelScale");
404 processLevel = settings.mode(
"MultipartonInteractions:processLevel");
407 allowRescatter = settings.flag(
"MultipartonInteractions:allowRescatter");
409 = settings.flag(
"MultipartonInteractions:allowDoubleRescatter");
410 rescatterMode = settings.mode(
"MultipartonInteractions:rescatterMode");
411 ySepResc = settings.parm(
"MultipartonInteractions:ySepRescatter");
412 deltaYResc = settings.parm(
"MultipartonInteractions:deltaYRescatter");
415 if (bProfile == 4) allowRescatter =
false;
418 globalRecoilFSR = settings.flag(
"TimeShower:globalRecoil");
419 nMaxGlobalRecoilFSR = settings.mode(
"TimeShower:nMaxGlobalRecoil");
422 nQuarkIn = settings.mode(
"MultipartonInteractions:nQuarkIn");
423 nSample = settings.mode(
"MultipartonInteractions:nSample");
426 enhanceScreening = settings.mode(
"MultipartonInteractions:enhanceScreening");
429 sigmaPomP = settings.parm(
"Diffraction:sigmaRefPomP");
430 mPomP = settings.parm(
"Diffraction:mRefPomP");
431 pPomP = settings.parm(
"Diffraction:mPowPomP");
432 mMinPertDiff = settings.parm(
"Diffraction:mMinPert");
435 canVetoMPI = (userHooksPtr != 0) ? userHooksPtr->canVetoMPIEmission()
440 fracA = pow2(1. - coreFraction);
441 fracB = 2. * coreFraction * (1. - coreFraction);
442 fracC = pow2(coreFraction);
443 radius2B = 0.5 * (1. + pow2(coreRadius));
444 radius2C = pow2(coreRadius);
447 }
else if (bProfile == 3) {
448 hasLowPow = (expPow < 2.);
449 expRev = 2. / expPow - 1.;
453 alphaS.init( alphaSvalue, alphaSorder, alphaSnfmax,
false);
454 double Lambda3 = alphaS.Lambda3();
457 alphaEM.init( alphaEMorder, &settings);
460 sigma2gg.init( 0, processLevel, infoPtr, &settings, particleDataPtr,
461 rndmPtr, beamAPtr, beamBPtr, couplingsPtr);
462 sigma2qg.init( 1, processLevel, infoPtr, &settings, particleDataPtr,
463 rndmPtr, beamAPtr, beamBPtr, couplingsPtr);
464 sigma2qqbarSame.init( 2, processLevel, infoPtr, &settings, particleDataPtr,
465 rndmPtr, beamAPtr, beamBPtr, couplingsPtr);
466 sigma2qq.init( 3, processLevel, infoPtr, &settings, particleDataPtr,
467 rndmPtr, beamAPtr, beamBPtr, couplingsPtr);
470 eCM = infoPtr->eCM();
476 if (!sigmaTotPtr->hasSigmaTot())
return false;
477 bool isNonDiff = (iDiffSys == 0);
478 sigmaND = sigmaTotPtr->sigmaND();
479 double sigmaMaxViol = 0.;
482 bool showMPI = settings.flag(
"Init:showMultipartonInteractions");
484 os <<
"\n *------- PYTHIA Multiparton Interactions Initialization "
489 os <<
" | sigmaNonDiffractive = " << fixed
490 << setprecision(2) << setw(7) << sigmaND <<
" mb | \n";
491 else if (iDiffSys == 1)
492 os <<
" | diffraction XB "
494 else if (iDiffSys == 2)
495 os <<
" | diffraction AX "
497 else if (iDiffSys == 3)
498 os <<
" | diffraction AXB "
505 nStep = (iDiffSys == 0) ? 1 : 5;
506 eStepSize = (nStep < 2) ? 1.
507 : log(mMaxPertDiff / mMinPertDiff) / (nStep - 1.);
508 for (
int iStep = 0; iStep < nStep; ++iStep) {
513 eCM = mMinPertDiff * pow( mMaxPertDiff / mMinPertDiff,
514 iStep / (nStep - 1.) );
516 sigmaND = sigmaPomP * pow( eCM / mPomP, pPomP);
517 if (showMPI) os <<
" | diffractive mass = " << scientific
518 << setprecision(3) << setw(9) << eCM <<
" GeV and sigmaNorm = "
519 << fixed << setw(6) << sigmaND <<
" mb | \n";
523 pT0 = pT0Ref * pow(eCM / ecmRef, ecmPow);
526 double pT4dSigmaMaxBeg = 0.;
531 pT2min = pTmin*pTmin;
533 pT2max = pTmax*pTmax;
534 pT20R = RPT20 * pT20;
535 pT20minR = pT2min + pT20R;
536 pT20maxR = pT2max + pT20R;
537 pT20min0maxR = pT20minR * pT20maxR;
538 pT2maxmin = pT2max - pT2min;
545 sigmaIntWgt.resize(XDEP_BBIN);
546 sigmaSumWgt.resize(XDEP_BBIN);
547 bstepNow = XDEP_BSTEP;
551 pT4dSigmaMaxBeg = pT4dSigmaMax;
557 && sigmaIntWgt[XDEP_BBIN - 1] > XDEP_CUTOFF * sigmaInt) {
558 bstepNow += XDEP_BSTEPINC;
563 if (sigmaInt > SIGMASTEP * sigmaND)
break;
564 if (showMPI) os << fixed << setprecision(2) <<
" | pT0 = "
565 << setw(5) << pT0 <<
" gives sigmaInteraction = " << setw(7)
566 << sigmaInt <<
" mb: rejected | \n";
567 if (pTmin > pT0) pTmin *= PT0STEP;
571 if ( max(pT0, pTmin) < max(PT0MIN, Lambda3) ) {
572 infoPtr->errorMsg(
"Error in MultipartonInteractions::init:"
573 " failed to find acceptable pT0 and pTmin");
574 infoPtr->setTooLowPTmin(
true);
580 if (showMPI) os << fixed << setprecision(2) <<
" | pT0 = "
581 << setw(5) << pT0 <<
" gives sigmaInteraction = "<< setw(7)
582 << sigmaInt <<
" mb: accepted | \n";
588 sigmaMaxViol = max( sigmaMaxViol, pT4dSigmaMax / pT4dSigmaMaxBeg);
592 pT0Save[iStep] = pT0;
593 pT4dSigmaMaxSave[iStep] = pT4dSigmaMax;
594 pT4dProbMaxSave[iStep] = pT4dProbMax;
595 sigmaIntSave[iStep] = sigmaInt;
596 for (
int j = 0; j <= 100; ++j) sudExpPTSave[iStep][j] = sudExpPT[j];
597 zeroIntCorrSave[iStep] = zeroIntCorr;
598 normOverlapSave[iStep] = normOverlap;
599 kNowSave[iStep] = kNow;
600 bAvgSave[iStep] = bAvg;
601 bDivSave[iStep] = bDiv;
602 probLowBSave[iStep] = probLowB;
603 fracAhighSave[iStep] = fracAhigh;
604 fracBhighSave[iStep] = fracBhigh;
605 fracChighSave[iStep] = fracBhigh;
606 fracABChighSave[iStep] = fracABChigh;
607 cDivSave[iStep] = cDiv;
608 cMaxSave[iStep] = cMax;
615 if (bProfile == 4 && showMPI)
618 << fixed << setprecision(2)
619 <<
" | x-dependent matter profile: a1 = " << a1 <<
", "
620 <<
"a0 = " << a0now * XDEP_SMB2FM <<
", bStep = "
621 << bstepNow <<
" | \n";
624 if (showMPI) os <<
" | "
626 <<
" *------- End PYTHIA Multiparton Interactions Initialization"
627 <<
" -----* " << endl;
630 if (sigmaMaxViol > 1.) {
631 ostringstream osWarn;
632 osWarn <<
"by factor " << fixed << setprecision(3) << sigmaMaxViol;
633 infoPtr->errorMsg(
"Warning in MultipartonInteractions::init:"
634 " maximum increased", osWarn.str());
638 SigmaMultiparton* dSigma;
639 for (
int i = 0; i < 4; ++i) {
640 if (i == 0) dSigma = &sigma2gg;
641 else if (i == 1) dSigma = &sigma2qg;
642 else if (i == 2) dSigma = &sigma2qqbarSame;
643 else dSigma = &sigma2qq;
644 int nProc = dSigma->nProc();
645 for (
int iProc = 0; iProc < nProc; ++iProc)
646 nGen[ dSigma->codeProc(iProc) ] = 0;
667 void MultipartonInteractions::reset( ) {
674 eCM = infoPtr->eCM();
676 if (nStep == 1 || abs( eCM / eCMsave - 1.) < ECMDEV)
return;
679 sigmaND = sigmaPomP * pow( eCM / mPomP, pPomP);
683 eStepSave = log(eCM / mMinPertDiff) / eStepSize;
684 iStepFrom = max( 0, min( nStep - 2,
int( eStepSave) ) );
685 iStepTo = iStepFrom + 1;
686 eStepTo = max( 0., min( 1., eStepSave - iStepFrom) );
687 eStepFrom = 1. - eStepTo;
690 pT0 = eStepFrom * pT0Save[iStepFrom]
691 + eStepTo * pT0Save[iStepTo];
693 pT2min = pTmin*pTmin;
695 pT2max = pTmax*pTmax;
696 pT20R = RPT20 * pT20;
697 pT20minR = pT2min + pT20R;
698 pT20maxR = pT2max + pT20R;
699 pT20min0maxR = pT20minR * pT20maxR;
700 pT2maxmin = pT2max - pT2min;
703 pT4dSigmaMax = eStepFrom * pT4dSigmaMaxSave[iStepFrom]
704 + eStepTo * pT4dSigmaMaxSave[iStepTo];
705 pT4dProbMax = eStepFrom * pT4dProbMaxSave[iStepFrom]
706 + eStepTo * pT4dProbMaxSave[iStepTo];
707 sigmaInt = eStepFrom * sigmaIntSave[iStepFrom]
708 + eStepTo * sigmaIntSave[iStepTo];
709 for (
int j = 0; j <= 100; ++j)
710 sudExpPT[j] = eStepFrom * sudExpPTSave[iStepFrom][j]
711 + eStepTo * sudExpPTSave[iStepTo][j];
714 zeroIntCorr = eStepFrom * zeroIntCorrSave[iStepFrom]
715 + eStepTo * zeroIntCorrSave[iStepTo];
716 normOverlap = eStepFrom * normOverlapSave[iStepFrom]
717 + eStepTo * normOverlapSave[iStepTo];
718 kNow = eStepFrom * kNowSave[iStepFrom]
719 + eStepTo * kNowSave[iStepTo];
720 bAvg = eStepFrom * bAvgSave[iStepFrom]
721 + eStepTo * bAvgSave[iStepTo];
722 bDiv = eStepFrom * bDivSave[iStepFrom]
723 + eStepTo * bDivSave[iStepTo];
724 probLowB = eStepFrom * probLowBSave[iStepFrom]
725 + eStepTo * probLowBSave[iStepTo];
726 fracAhigh = eStepFrom * fracAhighSave[iStepFrom]
727 + eStepTo * fracAhighSave[iStepTo];
728 fracBhigh = eStepFrom * fracBhighSave[iStepFrom]
729 + eStepTo * fracBhighSave[iStepTo];
730 fracChigh = eStepFrom * fracChighSave[iStepFrom]
731 + eStepTo * fracChighSave[iStepTo];
732 fracABChigh = eStepFrom * fracABChighSave[iStepFrom]
733 + eStepTo * fracABChighSave[iStepTo];
734 cDiv = eStepFrom * cDivSave[iStepFrom]
735 + eStepTo * cDivSave[iStepTo];
736 cMax = eStepFrom * cMaxSave[iStepFrom]
737 + eStepTo * cMaxSave[iStepTo];
746 void MultipartonInteractions::pTfirst() {
751 if (bProfile == 4) isAtLowB =
false;
771 WTacc = sigmaPT2scatter(
true) / dSigmaApprox;
772 if (WTacc > WTACCWARN) infoPtr->errorMsg(
"Warning in "
773 "MultipartonInteractions::pTfirst: weight above unity");
777 }
while (WTacc < rndmPtr->flat() || !dSigmaDtSel->final2KinMPI());
784 pT2 = pT20min0maxR / (pT20minR + rndmPtr->flat() * pT2maxmin) - pT20R;
787 dSigmaApprox = pT4dSigmaMax / pow2(pT2 + pT20R);
790 WTacc = sigmaPT2scatter(
true) / dSigmaApprox;
793 if (bProfile != 4) WTacc *= sudakov( pT2, enhanceB);
796 if (WTacc > WTACCWARN) infoPtr->errorMsg(
"Warning in "
797 "MultipartonInteractions::pTfirst: weight above unity");
800 }
while (WTacc < rndmPtr->flat() || !dSigmaDtSel->final2KinMPI());
804 if (bProfile != 4)
break;
819 xPDF1nowSave = xPDF1now;
820 xPDF2nowSave = xPDF2now;
822 dSigmaDtSel->saveKin();
823 dSigmaDtSelSave = dSigmaDtSel;
828 beamAPtr->append( 0, id1, x1);
829 beamAPtr->xfISR( 0, id1, x1, pT2Fac * pT2Fac);
830 vsc1 = beamAPtr->pickValSeaComp();
831 beamBPtr->append( 0, id2, x2);
832 beamBPtr->xfISR( 0, id2, x2, pT2Fac * pT2Fac);
833 vsc2 = beamBPtr->pickValSeaComp();
836 double w1 = XDEP_A1 + a1 * log(1. / x1);
837 double w2 = XDEP_A1 + a1 * log(1. / x2);
838 double fac = a02now * (w1 * w1 + w2 * w2);
839 double expb2 = rndmPtr->flat();
840 b2now = - fac * log(expb2);
846 enhanceB = sigmaND / M_PI / fac * expb2;
847 enhanceBmax = sigmaND / 2. / M_PI / a02now *
848 exp( -b2now / 2. / a2max );
852 double pTtrial = pTnext(pTmax, pTmin, evDummy);
859 if (pTtrial < sqrt(pT2FacSave)) {
862 swap(pT2Fac, pT2FacSave);
863 swap(pT2Ren, pT2RenSave);
868 swap(sHat, sHatSave);
869 swap(tHat, tHatSave);
870 swap(uHat, uHatSave);
871 swap(alpS, alpSsave);
872 swap(alpEM, alpEMsave);
873 swap(xPDF1now, xPDF1nowSave);
874 swap(xPDF2now, xPDF2nowSave);
875 if (dSigmaDtSel == dSigmaDtSelSave) dSigmaDtSel->swapKin();
876 else swap(dSigmaDtSel, dSigmaDtSelSave);
894 void MultipartonInteractions::setupFirstSys(
Event& process) {
897 int sizeProc = process.size();
899 for (
int i = 3; i < sizeProc; ++i)
900 if (process[i].statusAbs() < 20) nBeams = i + 1;
901 int nOffset = nBeams - 3;
904 if (sizeProc > nBeams) {
905 process.popBack( sizeProc - nBeams);
906 process.initColTag();
910 process[1 + nOffset].daughter1(3 + nOffset);
911 process[2 + nOffset].daughter1(4 + nOffset);
914 process[1 + nOffset].statusNeg();
915 process[2 + nOffset].statusNeg();
918 int colOffset = process.lastColTag();
919 for (
int i = 1; i <= 4; ++i) {
920 Particle parton = dSigmaDtSel->getParton(i);
921 if (i <= 2) parton.status(-21);
922 else parton.status(23);
923 if (i <= 2) parton.mothers( i + nOffset, 0);
924 else parton.mothers( 3 + nOffset, 4 + nOffset);
925 if (i <= 2) parton.daughters( 5 + nOffset, 6 + nOffset);
926 else parton.daughters( 0, 0);
927 int col = parton.col();
928 if (col > 0) parton.col( col + colOffset);
929 int acol = parton.acol();
930 if (acol > 0) parton.acol( acol + colOffset);
933 process.append(parton);
937 process.scale( sqrt(pT2Fac) );
940 string nameSub = dSigmaDtSel->name();
941 int codeSub = dSigmaDtSel->code();
942 int nFinalSub = dSigmaDtSel->nFinal();
943 double pTMPI = dSigmaDtSel->pTMPIFin();
944 infoPtr->setSubType( iDiffSys, nameSub, codeSub, nFinalSub);
945 if (iDiffSys == 0) infoPtr->setTypeMPI( codeSub, pTMPI, 0, 0,
946 enhanceB / zeroIntCorr);
949 infoPtr->setPDFalpha( iDiffSys, id1, id2, x1, x2, xPDF1now, xPDF2now,
950 pT2Fac, alpEM, alpS, pT2Ren, 0.);
951 double m3 = dSigmaDtSel->m(3);
952 double m4 = dSigmaDtSel->m(4);
953 double theta = dSigmaDtSel->thetaMPI();
954 double phi = dSigmaDtSel->phiMPI();
955 infoPtr->setKin( iDiffSys, id1, id2, x1, x2, sHat, tHat, uHat, sqrt(pT2),
964 bool MultipartonInteractions::limitPTmax(
Event& event) {
967 if (pTmaxMatch == 1)
return true;
968 if (pTmaxMatch == 2)
return false;
971 if (infoPtr->isNonDiffractive() || infoPtr->isDiffractiveA()
972 || infoPtr->isDiffractiveB() || infoPtr->isDiffractiveC() )
return true;
975 bool onlyQGP1 =
true;
976 bool onlyQGP2 =
true;
978 for (
int i = 5; i <
event.size(); ++i) {
979 if (event[i].status() == -21) ++n21;
981 int idAbs =
event[i].idAbs();
982 if (idAbs > 5 && idAbs != 21 && idAbs != 22) onlyQGP1 =
false;
983 }
else if (n21 == 2) {
984 int idAbs =
event[i].idAbs();
985 if (idAbs > 5 && idAbs != 21 && idAbs != 22) onlyQGP2 =
false;
990 bool onlyQGP = (n21 == 2) ? (onlyQGP1 || onlyQGP2) : onlyQGP1;
999 double MultipartonInteractions::pTnext(
double pTbegAll,
double pTendAll,
1003 bool pickRescatter, acceptKin;
1004 double dSigmaScatter, dSigmaRescatter, WTacc;
1005 double pT2end = pow2( max(pTmin, pTendAll) );
1012 if (bProfile == 4 && bIsSet && bSetInFirst && infoPtr->getCounter(21) == 1
1013 && infoPtr->getCounter(22) == 1) {
1014 if (pT2Save < pT2end)
return 0.;
1016 pT2Fac = pT2FacSave;
1017 pT2Ren = pT2RenSave;
1027 xPDF1now = xPDF1nowSave;
1028 xPDF2now = xPDF2nowSave;
1029 if (dSigmaDtSel == dSigmaDtSelSave) dSigmaDtSel->swapKin();
1030 else dSigmaDtSel = dSigmaDtSelSave;
1035 bool allowRescatterNow = allowRescatter;
1036 if (globalRecoilFSR && partonSystemsPtr->sizeOut(0) <= nMaxGlobalRecoilFSR)
1037 allowRescatterNow =
false;
1040 pT2 = pow2(pTbegAll);
1043 if (allowRescatterNow) findScatteredPartons( event);
1049 if (pT2 < pT2end)
return 0.;
1055 pickRescatter =
false;
1058 dSigmaScatter = sigmaPT2scatter(
false);
1061 dSigmaRescatter = (allowRescatterNow) ? sigmaPT2rescatter( event) : 0.;
1064 WTacc = (dSigmaScatter + dSigmaRescatter) / dSigmaApprox;
1065 if (WTacc > WTACCWARN) infoPtr->errorMsg(
"Warning in "
1066 "MultipartonInteractions::pTnext: weight above unity");
1070 if (enhanceScreening > 0) {
1071 int nSysNow = infoPtr->nMPI() + 1;
1072 if (enhanceScreening == 2) nSysNow += infoPtr->nISR();
1073 double WTscreen = pow2( (pT2 + pT20) / (pT2 + nSysNow * pT20) );
1078 if (bProfile == 4) {
1079 double w1 = XDEP_A1 + a1 * log(1. / x1);
1080 double w2 = XDEP_A1 + a1 * log(1. / x2);
1081 double fac = a02now * (w1 * w1 + w2 * w2);
1083 enhanceBnow = sigmaND / M_PI / fac * exp( - b2now / fac);
1084 double oWgt = enhanceBnow / enhanceBmax;
1085 if (oWgt > 1.0000000001) infoPtr->errorMsg(
"Warning in Multiparton"
1086 "Interactions::pTnext: overlap weight above unity");
1091 }
while (WTacc < rndmPtr->flat());
1094 if (allowRescatterNow) {
1095 pickRescatter = (i1Sel > 0 || i2Sel > 0);
1105 sigma2Sel->sigma( id1, id2, x1, x2, sHat, tHat, uHat, alpS, alpEM,
1106 true, pickOtherSel);
1110 dSigmaDtSel = sigma2Sel->sigmaSel();
1111 if (sigma2Sel->swapTU()) swap( tHat, uHat);
1115 if (pickRescatter) {
1116 Vec4 p1Res = (i1Sel == 0) ? 0.5 * eCM * x1Sel * Vec4( 0., 0., 1., 1.)
1118 Vec4 p2Res = (i2Sel == 0) ? 0.5 * eCM * x2Sel * Vec4( 0., 0., -1., 1.)
1120 double m1Res = (i1Sel == 0) ? 0. : event[i1Sel].m();
1121 double m2Res = (i2Sel == 0) ? 0. : event[i2Sel].m();
1122 acceptKin = dSigmaDtSel->final2KinMPI( i1Sel, i2Sel, p1Res, p2Res,
1125 }
else acceptKin = dSigmaDtSel->final2KinMPI();
1126 }
while (!acceptKin);
1138 bool MultipartonInteractions::scatter(
Event& event) {
1141 int sizeProc =
event.size();
1143 for (
int i = 3; i < sizeProc; ++i)
1144 if (event[i].statusAbs() < 20) nBeams = i + 1;
1145 int nOffset = nBeams - 3;
1148 int motherOffset =
event.size();
1149 int colOffset =
event.lastColTag();
1150 for (
int i = 1; i <= 4; ++i) {
1151 Particle parton = dSigmaDtSel->getParton(i);
1152 if (i <= 2 ) parton.mothers( i + nOffset, 0);
1153 else parton.mothers( motherOffset, motherOffset + 1);
1154 if (i <= 2 ) parton.daughters( motherOffset + 2, motherOffset + 3);
1155 else parton.daughters( 0, 0);
1156 int col = parton.col();
1157 if (col > 0) parton.col( col + colOffset);
1158 int acol = parton.acol();
1159 if (acol > 0) parton.acol( acol + colOffset);
1162 event.append(parton);
1166 if (canVetoMPI && userHooksPtr->doVetoMPIEmission(sizeProc, event)) {
1167 event.popBack(event.size() - sizeProc);
1172 int iSys = partonSystemsPtr->addSys();
1173 partonSystemsPtr->setInA(iSys, motherOffset);
1174 partonSystemsPtr->setInB(iSys, motherOffset + 1);
1175 partonSystemsPtr->addOut(iSys, motherOffset + 2);
1176 partonSystemsPtr->addOut(iSys, motherOffset + 3);
1177 partonSystemsPtr->setSHat(iSys, sHat);
1180 bool annihil1 =
false;
1181 bool annihil2 =
false;
1182 if (i1Sel > 0 && i2Sel > 0) {
1183 if (event[motherOffset].col() == event[motherOffset + 1].acol()
1184 && event[motherOffset].col() > 0) annihil1 =
true;
1185 if (event[motherOffset].acol() == event[motherOffset + 1].col()
1186 && event[motherOffset].acol() > 0) annihil2 =
true;
1190 BeamParticle& beamA = *beamAPtr;
1191 int iA = beamA.append( motherOffset, id1, x1);
1195 beamA.xfISR( iA, id1, x1, pT2);
1196 beamA.pickValSeaComp();
1201 beamA[iA].companion(-10);
1202 event[i1Sel].statusNeg();
1203 event[i1Sel].daughters( motherOffset, motherOffset);
1204 event[motherOffset].mothers( i1Sel, i1Sel);
1205 int colOld =
event[i1Sel].col();
1207 int colNew =
event[motherOffset].col();
1208 for (
int i = motherOffset; i < motherOffset + 4; ++i) {
1209 if (event[i].col() == colNew)
event[i].col( colOld);
1210 if (event[i].acol() == colNew)
event[i].acol( colOld);
1213 int acolOld =
event[i1Sel].acol();
1215 int acolNew =
event[motherOffset].acol();
1216 for (
int i = motherOffset; i < motherOffset + 4; ++i) {
1217 if (event[i].col() == acolNew)
event[i].col( acolOld);
1218 if (event[i].acol() == acolNew)
event[i].acol( acolOld);
1224 BeamParticle& beamB = *beamBPtr;
1225 int iB = beamB.append( motherOffset + 1, id2, x2);
1229 beamB.xfISR( iB, id2, x2, pT2);
1230 beamB.pickValSeaComp();
1235 beamB[iB].companion(-10);
1236 event[i2Sel].statusNeg();
1237 event[i2Sel].daughters( motherOffset + 1, motherOffset + 1);
1238 event[motherOffset + 1].mothers( i2Sel, i2Sel);
1239 int colOld =
event[i2Sel].col();
1241 int colNew =
event[motherOffset + 1].col();
1242 for (
int i = motherOffset; i < motherOffset + 4; ++i) {
1243 if (event[i].col() == colNew)
event[i].col( colOld);
1244 if (event[i].acol() == colNew)
event[i].acol( colOld);
1247 int acolOld =
event[i2Sel].acol();
1249 int acolNew =
event[motherOffset + 1].acol();
1250 for (
int i = motherOffset; i < motherOffset + 4; ++i) {
1251 if (event[i].col() == acolNew)
event[i].col( acolOld);
1252 if (event[i].acol() == acolNew)
event[i].acol( acolOld);
1259 if (annihil1 || annihil2) {
1260 int colLeft = (annihil1) ? event[motherOffset].col()
1261 :
event[motherOffset].acol();
1262 int mother1 =
event[motherOffset].mother1();
1263 int mother2 =
event[motherOffset + 1].mother1();
1264 int colLost = (annihil1)
1265 ? event[mother1].col() +
event[mother2].acol() - colLeft
1266 :
event[mother1].acol() +
event[mother2].col() - colLeft;
1267 for (
int i = 0; i < motherOffset; ++i) {
1268 if (event[i].col() == colLost)
event[i].col( colLeft );
1269 if (event[i].acol() == colLost)
event[i].acol( colLeft );
1274 int codeMPI = dSigmaDtSel->code();
1275 double pTMPI = dSigmaDtSel->pTMPIFin();
1276 if (iDiffSys == 0) infoPtr->setTypeMPI( codeMPI, pTMPI, i1Sel, i2Sel,
1277 enhanceBnow / zeroIntCorr);
1278 partonSystemsPtr->setPTHat(iSys, pTMPI);
1288 void MultipartonInteractions::upperEnvelope() {
1295 for (
int iPT = 0; iPT < 100; ++iPT) {
1296 double pT = pTmin * pow( pTmax/pTmin, 0.01 * (iPT + 0.5) );
1298 pT2shift = pT2 + pT20;
1300 pT2Fac = (SHIFTFACSCALE) ? pT2shift : pT2;
1304 double xPDF1sumMax = (9./4.) * beamAPtr->xf(21, xT, pT2Fac);
1305 for (
int id = 1;
id <= nQuarkIn; ++id)
1306 xPDF1sumMax += beamAPtr->xf(
id, xT, pT2Fac)
1307 + beamAPtr->xf(-
id, xT, pT2Fac);
1308 double xPDF2sumMax = (9./4.) * beamBPtr->xf(21, xT, pT2Fac);
1309 for (
int id = 1;
id <= nQuarkIn; ++id)
1310 xPDF2sumMax += beamBPtr->xf(
id, xT, pT2Fac)
1311 + beamBPtr->xf(-
id, xT, pT2Fac);
1314 alpS = alphaS.alphaS(pT2Ren);
1315 alpEM = alphaEM.alphaEM(pT2Ren);
1316 double dSigmaPartonApprox = CONVERT2MB * Kfactor * 0.5 * M_PI
1317 * pow2(alpS / pT2shift);
1318 double yMax = log(1./xT + sqrt(1./(xT*xT) - 1.));
1319 double volumePhSp = pow2(2. * yMax);
1322 double dSigmaApproxNow = SIGMAFUDGE * xPDF1sumMax * xPDF2sumMax
1323 * dSigmaPartonApprox * volumePhSp;
1324 double pT4dSigmaNow = pow2(pT2 + pT20R) * dSigmaApproxNow;
1325 if ( pT4dSigmaNow > pT4dSigmaMax) pT4dSigmaMax = pT4dSigmaNow;
1329 pT4dProbMax = pT4dSigmaMax / sigmaND;
1339 void MultipartonInteractions::jetCrossSection() {
1342 double sigmaFactor = (1. / pT20minR - 1. / pT20maxR) / (100. * nSample);
1345 if (bProfile == 4)
for (
int bBin = 0; bBin < XDEP_BBIN; bBin++)
1346 sigmaIntWgt[bBin] = 0.;
1350 double dSigmaMax = 0.;
1353 for (
int iPT = 99; iPT >= 0; --iPT) {
1354 double sigmaSum = 0.;
1357 if (bProfile == 4)
for (
int bBin = 0; bBin < XDEP_BBIN; bBin++)
1358 sigmaSumWgt[bBin] = 0.;
1361 for (
int iSample = 0; iSample < nSample; ++iSample) {
1362 double mappedPT2 = 1. - 0.01 * (iPT + rndmPtr->flat());
1363 pT2 = pT20min0maxR / (pT20minR + mappedPT2 * pT2maxmin) - pT20R;
1366 double dSigma = sigmaPT2scatter(
true);
1369 dSigma *= pow2(pT2 + pT20R);
1371 if (dSigma > dSigmaMax) dSigmaMax = dSigma;
1375 if (bProfile == 4 && dSigma > 0.) {
1376 double w1 = XDEP_A1 + a1 * log(1. / x1);
1377 double w2 = XDEP_A1 + a1 * log(1. / x2);
1378 double fac = XDEP_A0 * XDEP_A0 * (w1 * w1 + w2 * w2);
1379 double b = 0.5 * bstepNow;
1380 for (
int bBin = 0; bBin < XDEP_BBIN; bBin++) {
1381 double wgt = exp( - b * b / fac ) / fac / M_PI;
1382 sigmaSumWgt[bBin] += dSigma * wgt;
1389 sigmaSum *= sigmaFactor;
1390 sigmaInt += sigmaSum;
1391 sudExpPT[iPT] = sudExpPT[iPT + 1] + sigmaSum / sigmaND;
1394 if (bProfile == 4)
for (
int bBin = 0; bBin < XDEP_BBIN; bBin++) {
1395 sigmaSumWgt[bBin] *= sigmaFactor;
1396 sigmaIntWgt[bBin] += sigmaSumWgt[bBin];
1403 if (dSigmaMax > pT4dSigmaMax) {
1404 pT4dSigmaMax = dSigmaMax;
1405 pT4dProbMax = dSigmaMax / sigmaND;
1415 double MultipartonInteractions::sudakov(
double pT2sud,
double enhance) {
1418 double xBin = (pT2sud - pT2min) * pT20maxR
1419 / (pT2maxmin * (pT2sud + pT20R));
1420 xBin = max(1e-6, min(100. - 1e-6, 100. * xBin) );
1421 int iBin = int(xBin);
1424 double sudExp = sudExpPT[iBin] + (xBin - iBin)
1425 * (sudExpPT[iBin + 1] - sudExpPT[iBin]);
1426 return exp( -enhance * sudExp);
1435 double MultipartonInteractions::fastPT2(
double pT2beg) {
1438 double pT20begR = pT2beg + pT20R;
1439 double pT4dProbMaxNow = pT4dProbMax * enhanceBmax;
1440 double pT2try = pT4dProbMaxNow * pT20begR
1441 / (pT4dProbMaxNow - pT20begR * log(rndmPtr->flat())) - pT20R;
1444 dSigmaApprox = pT4dSigmaMax / pow2(pT2try + pT20R);
1455 double MultipartonInteractions::sigmaPT2scatter(
bool isFirst) {
1458 pT2shift = pT2 + pT20;
1460 pT2Fac = (SHIFTFACSCALE) ? pT2shift : pT2;
1461 alpS = alphaS.alphaS(pT2Ren);
1462 alpEM = alphaEM.alphaEM(pT2Ren);
1465 xT = 2. * sqrt(pT2) / eCM;
1466 if (xT >= 1.)
return 0.;
1468 double yMax = log(1./xT + sqrt(1./xT2 - 1.));
1471 double y3 = yMax * (2. * rndmPtr->flat() - 1.);
1472 double y4 = yMax * (2. * rndmPtr->flat() - 1.);
1473 y = 0.5 * (y3 + y4);
1477 double WTy = (hasBaryonBeams)
1478 ? (1. - pow2(y3/yMax)) * (1. - pow2(y4/yMax)) : 1.;
1479 if (WTy < rndmPtr->flat())
return 0.;
1482 x1 = 0.5 * xT * (exp(y3) + exp(y4));
1483 x2 = 0.5 * xT * (exp(-y3) + exp(-y4));
1485 if (x1 > 1. || x2 > 1.)
return 0.;
1487 if (x1 > beamAPtr->xMax() || x2 > beamBPtr->xMax())
return 0.;
1493 double xPDF1sum = 0.;
1495 double xPDF2sum = 0.;
1499 for (
int id = -nQuarkIn;
id <= nQuarkIn; ++id) {
1500 if (
id == 0) xPDF1[10] = (9./4.) * beamAPtr->xf(21, x1, pT2Fac);
1501 else xPDF1[
id+10] = beamAPtr->xf(
id, x1, pT2Fac);
1502 xPDF1sum += xPDF1[
id+10];
1504 for (
int id = -nQuarkIn;
id <= nQuarkIn; ++id) {
1505 if (
id == 0) xPDF2[10] = (9./4.) * beamBPtr->xf(21, x2, pT2Fac);
1506 else xPDF2[
id+10] = beamBPtr->xf(
id, x2, pT2Fac);
1507 xPDF2sum += xPDF2[
id+10];
1512 for (
int id = -nQuarkIn;
id <= nQuarkIn; ++id) {
1513 if (
id == 0) xPDF1[10] = (9./4.) * beamAPtr->xfMPI(21, x1, pT2Fac);
1514 else xPDF1[
id+10] = beamAPtr->xfMPI(
id, x1, pT2Fac);
1515 xPDF1sum += xPDF1[
id+10];
1517 for (
int id = -nQuarkIn;
id <= nQuarkIn; ++id) {
1518 if (
id == 0) xPDF2[10] = (9./4.) * beamBPtr->xfMPI(21, x2, pT2Fac);
1519 else xPDF2[
id+10] = beamBPtr->xfMPI(
id, x2, pT2Fac);
1520 xPDF2sum += xPDF2[
id+10];
1525 id1 = -nQuarkIn - 1;
1526 double temp = xPDF1sum * rndmPtr->flat();
1527 do { xPDF1now = xPDF1[(++id1) + 10]; temp -= xPDF1now; }
1528 while (temp > 0. && id1 < nQuarkIn);
1529 if (id1 == 0) id1 = 21;
1531 temp = xPDF2sum * rndmPtr->flat();
1532 do { xPDF2now = xPDF2[(++id2) + 10]; temp -= xPDF2now;}
1533 while (temp > 0. && id2 < nQuarkIn);
1534 if (id2 == 0) id2 = 21;
1539 SigmaMultiparton* sigma2Tmp;
1541 if (id1 == 21 && id2 == 21) {
1542 sigma2Tmp = &sigma2gg;
1544 }
else if (id1 == 21 || id2 == 21) {
1545 sigma2Tmp = &sigma2qg;
1547 }
else if (id1 == -id2) sigma2Tmp = &sigma2qqbarSame;
1548 else sigma2Tmp = &sigma2qq;
1552 double root = sqrtpos(1. - xT2 / tau);
1553 tHat = -0.5 * sHat * (1. - root);
1554 uHat = -0.5 * sHat * (1. + root);
1559 double dSigmaPartonCorr = Kfactor * gluFac
1560 * sigma2Tmp->sigma( id1, id2, x1, x2, sHat, tHat, uHat, alpS, alpEM);
1563 double volumePhSp = pow2(2. * yMax) / WTy;
1564 double dSigmaScat = dSigmaPartonCorr * xPDF1sum * xPDF2sum * volumePhSp;
1569 double pT2massive = pT2;
1570 dSigmaScat *= pow2( pT2massive / (pT2massive + pT20) );
1573 dSigmaSum += dSigmaScat;
1585 sigma2Sel = sigma2Tmp;
1586 pickOtherSel = sigma2Tmp->pickedOther();
1590 dSigmaDtSel = sigma2Tmp->sigmaSel();
1591 if (sigma2Tmp->swapTU()) swap( tHat, uHat);
1602 void MultipartonInteractions::findScatteredPartons(
Event& event) {
1605 scatteredA.resize(0);
1606 scatteredB.resize(0);
1607 double yTmp, probA, probB;
1610 for (
int i = 0; i <
event.size(); ++i)
1611 if (event[i].isFinal() && (
event[i].idAbs() <= nQuarkIn
1612 ||
event[i].id() == 21)) {
1613 yTmp =
event[i].y();
1616 switch(rescatterMode) {
1620 if ( yTmp > 0.) scatteredA.push_back( i);
1621 if (-yTmp > 0.) scatteredB.push_back( i);
1626 if ( yTmp > ySepResc) scatteredA.push_back( i);
1627 if (-yTmp > ySepResc) scatteredB.push_back( i);
1632 probA = 0.5 * (1. + ( yTmp - ySepResc) / deltaYResc);
1633 if (probA > rndmPtr->flat()) scatteredA.push_back( i);
1634 probB = 0.5 * (1. + (-yTmp - ySepResc) / deltaYResc);
1635 if (probB > rndmPtr->flat()) scatteredB.push_back( i);
1641 probA = 1. / (1. + exp(-2. * ( yTmp - ySepResc) / deltaYResc));
1642 if (probA > rndmPtr->flat()) scatteredA.push_back( i);
1643 probB = 1. / (1. + exp(-2. * (-yTmp - ySepResc) / deltaYResc));
1644 if (probB > rndmPtr->flat()) scatteredB.push_back( i);
1649 scatteredA.push_back( i);
1650 scatteredB.push_back( i);
1665 double MultipartonInteractions::sigmaPT2rescatter(
Event& event) {
1668 xT = 2. * sqrt(pT2) / eCM;
1669 if (xT >= 1.)
return 0.;
1673 SigmaMultiparton* sigma2Tmp;
1674 double dSigmaResc = 0.;
1677 int nScatA = scatteredA.size();
1679 if (PREPICKRESCATTER && nScatA > 0) iScatA = min( nScatA - 1,
1680 int( rndmPtr->flat() * double(nScatA) ) );
1683 for (
int iScat = 0; iScat < nScatA; ++iScat) {
1684 if (PREPICKRESCATTER && iScat != iScatA)
continue;
1685 int iA = scatteredA[iScat];
1686 int id1Tmp =
event[iA].id();
1689 double x1Tmp =
event[iA].pPos() / eCM;
1690 double sHatMax = x1Tmp * beamBPtr->xMax() * sCM;
1691 if (sHatMax < 4. * pT2)
continue;
1694 double dyMax = log( sqrt(0.25 * sHatMax / pT2)
1695 * (1. + sqrtpos(1. - 4. * pT2 / sHatMax)) );
1696 double dy = dyMax * (2. * rndmPtr->flat() - 1.);
1700 double m2Tmp =
event[iA].m2();
1701 double sHatTmp = m2Tmp + 4. * pT2 * pow2(cosh(dy));
1702 double x2Tmp = (sHatTmp - m2Tmp) /(x1Tmp * sCM);
1703 double tauTmp = sHatTmp / sCM;
1704 double root = sqrtpos(1. - xT2 / tauTmp);
1705 double tHatTmp = -0.5 * sHatTmp * (1. - root);
1706 double uHatTmp = -0.5 * sHatTmp * (1. + root);
1710 double xPDF2sum = 0.;
1713 for (
int id = -nQuarkIn;
id <= nQuarkIn; ++id) {
1714 if (
id == 0) xPDF2[10] = (9./4.) * beamBPtr->xfMPI(21, x2Tmp, pT2Fac);
1715 else xPDF2[
id+10] = beamBPtr->xfMPI(
id, x2Tmp, pT2Fac);
1716 xPDF2sum += xPDF2[
id+10];
1720 int id2Tmp = -nQuarkIn - 1;
1721 double temp = xPDF2sum * rndmPtr->flat();
1722 do { xPDF2now = xPDF2[(++id2Tmp) + 10]; temp -= xPDF2now;}
1723 while (temp > 0. && id2Tmp < nQuarkIn);
1724 if (id2Tmp == 0) id2Tmp = 21;
1729 if (id1Tmp == 21 && id2Tmp == 21) sigma2Tmp = &sigma2gg;
1730 else if (id1Tmp == 21 || id2Tmp == 21) sigma2Tmp = &sigma2qg;
1731 else if (id1Tmp == -id2Tmp) sigma2Tmp = &sigma2qqbarSame;
1732 else sigma2Tmp = &sigma2qq;
1733 double gluFac = (id2Tmp == 21) ? 4. / 9. : 1.;
1738 double dSigmaPartonCorr = Kfactor * gluFac
1739 * sigma2Tmp->sigma( id1Tmp, id2Tmp, x1Tmp, x2Tmp, sHatTmp, tHatTmp,
1740 uHatTmp, alpS, alpEM);
1743 double volumePhSp = 4. *dyMax;
1744 double dSigmaCorr = dSigmaPartonCorr * xPDF2sum * volumePhSp;
1749 double pT2massive = pT2;
1750 dSigmaCorr *= pow2( pT2massive / (pT2massive + pT20) );
1753 if (PREPICKRESCATTER) dSigmaCorr *= nScatA;
1756 dSigmaSum += dSigmaCorr;
1757 dSigmaResc += dSigmaCorr;
1760 if (dSigmaCorr > rndmPtr->flat() * dSigmaSum) {
1770 sigma2Sel = sigma2Tmp;
1771 pickOtherSel = sigma2Tmp->pickedOther();
1776 int nScatB = scatteredB.size();
1778 if (PREPICKRESCATTER && nScatB > 0) iScatB = min( nScatB - 1,
1779 int( rndmPtr->flat() * double(nScatB) ) );
1782 for (
int iScat = 0; iScat < nScatB; ++iScat) {
1783 if (PREPICKRESCATTER && iScat != iScatB)
continue;
1784 int iB = scatteredB[iScat];
1785 int id2Tmp =
event[iB].id();
1788 double x2Tmp =
event[iB].pNeg() / eCM;
1789 double sHatMax = beamAPtr->xMax() * x2Tmp * sCM;
1790 if (sHatMax < 4. * pT2)
continue;
1793 double dyMax = log( sqrt(0.25 * sHatMax / pT2)
1794 * (1. + sqrtpos(1. - 4. * pT2 / sHatMax)) );
1795 double dy = dyMax * (2. * rndmPtr->flat() - 1.);
1799 double m2Tmp =
event[iB].m2();
1800 double sHatTmp = m2Tmp + 4. * pT2 * pow2(cosh(dy));
1801 double x1Tmp = (sHatTmp - m2Tmp) /(x2Tmp * sCM);
1802 double tauTmp = sHatTmp / sCM;
1803 double root = sqrtpos(1. - xT2 / tauTmp);
1804 double tHatTmp = -0.5 * sHatTmp * (1. - root);
1805 double uHatTmp = -0.5 * sHatTmp * (1. + root);
1809 double xPDF1sum = 0.;
1812 for (
int id = -nQuarkIn;
id <= nQuarkIn; ++id) {
1813 if (
id == 0) xPDF1[10] = (9./4.) * beamAPtr->xfMPI(21, x1Tmp, pT2Fac);
1814 else xPDF1[
id+10] = beamAPtr->xfMPI(
id, x1Tmp, pT2Fac);
1815 xPDF1sum += xPDF1[
id+10];
1819 int id1Tmp = -nQuarkIn - 1;
1820 double temp = xPDF1sum * rndmPtr->flat();
1821 do { xPDF1now = xPDF1[(++id1Tmp) + 10]; temp -= xPDF1now;}
1822 while (temp > 0. && id1Tmp < nQuarkIn);
1823 if (id1Tmp == 0) id1Tmp = 21;
1828 if (id1Tmp == 21 && id2Tmp == 21) sigma2Tmp = &sigma2gg;
1829 else if (id1Tmp == 21 || id2Tmp == 21) sigma2Tmp = &sigma2qg;
1830 else if (id1Tmp == -id2Tmp) sigma2Tmp = &sigma2qqbarSame;
1831 else sigma2Tmp = &sigma2qq;
1832 double gluFac = (id1Tmp == 21) ? 4. / 9. : 1.;
1837 double dSigmaPartonCorr = Kfactor * gluFac
1838 * sigma2Tmp->sigma( id1Tmp, id2Tmp, x1Tmp, x2Tmp, sHatTmp, tHatTmp,
1839 uHatTmp, alpS, alpEM);
1842 double volumePhSp = 4. *dyMax;
1843 double dSigmaCorr = dSigmaPartonCorr * xPDF1sum * volumePhSp;
1848 double pT2massive = pT2;
1849 dSigmaCorr *= pow2( pT2massive / (pT2massive + pT20) );
1852 if (PREPICKRESCATTER) dSigmaCorr *= nScatB;
1855 dSigmaSum += dSigmaCorr;
1856 dSigmaResc += dSigmaCorr;
1859 if (dSigmaCorr > rndmPtr->flat() * dSigmaSum) {
1869 sigma2Sel = sigma2Tmp;
1870 pickOtherSel = sigma2Tmp->pickedOther();
1876 if (allowDoubleRes) {
1877 for (
int iScat1 = 0; iScat1 < nScatA; ++iScat1) {
1878 if (PREPICKRESCATTER && iScat1 != iScatA)
continue;
1879 int iA = scatteredA[iScat1];
1880 int id1Tmp =
event[iA].id();
1881 for (
int iScat2 = 0; iScat2 < nScatB; ++iScat2) {
1882 if (PREPICKRESCATTER && iScat2 != iScatB)
continue;
1883 int iB = scatteredB[iScat2];
1884 int id2Tmp =
event[iB].id();
1887 double sHatTmp = (
event[iA].p() +
event[iB].p()).m2Calc();
1888 if (sHatTmp < 4. * pT2)
continue;
1891 double x1Tmp =
event[iA].pPos() / eCM;
1892 double x2Tmp =
event[iB].pNeg() / eCM;
1893 double tauTmp = sHatTmp / sCM;
1894 double root = sqrtpos(1. - xT2 / tauTmp);
1895 double tHatTmp = -0.5 * sHatTmp * (1. - root);
1896 double uHatTmp = -0.5 * sHatTmp * (1. + root);
1900 if (id1Tmp == 21 && id2Tmp == 21) sigma2Tmp = &sigma2gg;
1901 else if (id1Tmp == 21 || id2Tmp == 21) sigma2Tmp = &sigma2qg;
1902 else if (id1Tmp == -id2Tmp) sigma2Tmp = &sigma2qqbarSame;
1903 else sigma2Tmp = &sigma2qq;
1908 double dSigmaPartonCorr = Kfactor
1909 * sigma2Tmp->sigma( id1Tmp, id2Tmp, x1Tmp, x2Tmp, sHatTmp, tHatTmp,
1910 uHatTmp, alpS, alpEM);
1914 double dSigmaCorr = dSigmaPartonCorr / max(ROOTMIN, root);
1919 double pT2massive = pT2;
1920 dSigmaCorr *= pow2( pT2massive / (pT2massive + pT20) );
1923 if (PREPICKRESCATTER) dSigmaCorr *= nScatA * nScatB;
1926 dSigmaSum += dSigmaCorr;
1927 dSigmaResc += dSigmaCorr;
1930 if (dSigmaCorr > rndmPtr->flat() * dSigmaSum) {
1940 sigma2Sel = sigma2Tmp;
1941 pickOtherSel = sigma2Tmp->pickedOther();
1958 void MultipartonInteractions::overlapInit() {
1961 nAvg = sigmaInt / sigmaND;
1964 double deltaB = BSTEP;
1965 if (bProfile == 2) deltaB *= min( 0.5, 2.5 * coreRadius);
1966 if (bProfile == 3) deltaB *= max(1., pow(2. / expPow, 1. / expPow));
1974 double overlapNow = 0.;
1975 double probNow = 0.;
1976 double overlapInt = 0.5;
1977 double probInt = 0.;
1978 double probOverlapInt = 0.;
1979 double bProbInt = 0.;
1980 normPi = 1. / (2. * M_PI);
1983 bool pastBDiv =
false;
1984 double overlapHighB = 0.;
1991 double rescale2 = 1.;
1992 if (bProfile == 4) {
1994 kNow = XDEP_A0 / 2.0;
2000 if (stepDir == 1) kNow *= 2.;
2001 else if (stepDir == -1) kNow *= 0.5;
2002 else kNow = kLow + (nAvg - nLow) * (kHigh - kLow) / (nHigh - nLow);
2005 if (bProfile <= 0 || bProfile > 4) {
2006 probInt = 0.5 * M_PI * (1. - exp(-kNow));
2007 probOverlapInt = probInt / M_PI;
2011 nNow = M_PI * kNow * overlapInt / probInt;
2014 }
else if (bProfile < 4) {
2017 overlapInt = (bProfile == 3) ? 0. : 0.5;
2019 probOverlapInt = 0.;
2025 double b = -0.5 * deltaB;
2029 bArea = 2. * M_PI * b * deltaB;
2032 if (bProfile == 1) {
2033 overlapNow = normPi * exp( -b*b);
2034 }
else if (bProfile == 2) {
2035 overlapNow = normPi * ( fracA * exp( -min(EXPMAX, b*b))
2036 + fracB * exp( -min(EXPMAX, b*b / radius2B)) / radius2B
2037 + fracC * exp( -min(EXPMAX, b*b / radius2C)) / radius2C );
2039 overlapNow = normPi * exp( -pow( b, expPow));
2040 overlapInt += bArea * overlapNow;
2042 if (pastBDiv) overlapHighB += bArea * overlapNow;
2045 probNow = 1. - exp( -min(EXPMAX, M_PI * kNow * overlapNow));
2046 probInt += bArea * probNow;
2047 probOverlapInt += bArea * overlapNow * probNow;
2048 bProbInt += b * bArea * probNow;
2051 if (!pastBDiv && probNow < PROBATLOWB) {
2052 bDiv = b + 0.5 * deltaB;
2057 }
while (b < 1. || b * probNow > BMAX);
2060 nNow = M_PI * kNow * overlapInt / probInt;
2063 }
else if (bProfile == 4) {
2064 rescale2 = pow2(kNow / XDEP_A0);
2066 double b = 0.5 * bstepNow;
2067 for (
int bBin = 0; bBin < XDEP_BBIN; bBin++) {
2068 double bArea = 2. * M_PI * b * bstepNow;
2069 double pIntNow = 1 - exp( -min(EXPMAX, sigmaIntWgt[bBin] / rescale2) );
2070 probInt += bArea * rescale2 * pIntNow;
2080 if (stepDir == -1) stepDir = 0;
2084 if (stepDir == 1) stepDir = -1;
2088 }
while (abs(nNow - nAvg) > KCONVERGE * nAvg);
2091 if (bProfile >= 0 && bProfile < 4) {
2092 double avgOverlap = probOverlapInt / probInt;
2093 zeroIntCorr = probOverlapInt / overlapInt;
2094 normOverlap = normPi * zeroIntCorr / avgOverlap;
2095 bAvg = bProbInt / probInt;
2098 }
else if (bProfile == 4) {
2103 double b = 0.5 * bstepNow;
2104 for (
int bBin = 0; bBin < XDEP_BBIN; bBin++) {
2105 double bArea = 2. * M_PI * b * bstepNow;
2106 double pIntNow = 1. - exp( -min(EXPMAX, sigmaIntWgt[bBin] / rescale2) );
2107 bAvg += sqrt(rescale2) * b * bArea * rescale2 * pIntNow;
2108 zeroIntCorr += bArea * sigmaIntWgt[bBin] * pIntNow;
2112 zeroIntCorr /= sigmaInt;
2116 infoPtr->seta0MPI(a0now * XDEP_SMB2FM);
2117 a02now = a0now * a0now;
2118 double xMin = 2. * pTmin / infoPtr->eCM();
2119 a2max = a0now * (XDEP_A1 + a1 * log(1. / xMin));
2125 if (bProfile > 0 && bProfile <= 3) {
2126 probLowB = M_PI * bDiv*bDiv;
2127 double probHighB = M_PI * kNow * overlapHighB;
2128 if (bProfile == 1) probHighB = M_PI * kNow * 0.5 * exp( -bDiv*bDiv);
2129 else if (bProfile == 2) {
2130 fracAhigh = fracA * exp( -bDiv*bDiv);
2131 fracBhigh = fracB * exp( -bDiv*bDiv / radius2B);
2132 fracChigh = fracC * exp( -bDiv*bDiv / radius2C);
2133 fracABChigh = fracAhigh + fracBhigh + fracChigh;
2134 probHighB = M_PI * kNow * 0.5 * fracABChigh;
2136 cDiv = pow( bDiv, expPow);
2137 cMax = max(2. * expRev, cDiv);
2139 probLowB /= (probLowB + probHighB);
2149 void MultipartonInteractions::overlapFirst() {
2152 if (bProfile <= 0 || bProfile > 4) {
2154 enhanceB = zeroIntCorr;
2161 double overlapNow = 0.;
2162 double probAccept = 0.;
2166 if (rndmPtr->flat() < probLowB) {
2168 bNow = bDiv * sqrt(rndmPtr->flat());
2171 if (bProfile == 1) overlapNow = normPi * exp( -bNow*bNow);
2172 else if (bProfile == 2) overlapNow = normPi *
2173 ( fracA * exp( -bNow*bNow)
2174 + fracB * exp( -bNow*bNow / radius2B) / radius2B
2175 + fracC * exp( -bNow*bNow / radius2C) / radius2C );
2176 else overlapNow = normPi * exp( -pow( bNow, expPow));
2177 probAccept = 1. - exp( -min(EXPMAX, M_PI * kNow * overlapNow));
2184 if (bProfile == 1) {
2185 bNow = sqrt(bDiv*bDiv - log(rndmPtr->flat()));
2186 overlapNow = normPi * exp( -min(EXPMAX, bNow*bNow));
2187 }
else if (bProfile == 2) {
2188 double pickFrac = rndmPtr->flat() * fracABChigh;
2189 if (pickFrac < fracAhigh)
2190 bNow = sqrt(bDiv*bDiv - log(rndmPtr->flat()));
2191 else if (pickFrac < fracAhigh + fracBhigh)
2192 bNow = sqrt(bDiv*bDiv - radius2B * log(rndmPtr->flat()));
2193 else bNow = sqrt(bDiv*bDiv - radius2C * log(rndmPtr->flat()));
2194 overlapNow = normPi * ( fracA * exp( -min(EXPMAX, bNow*bNow))
2195 + fracB * exp( -min(EXPMAX, bNow*bNow / radius2B)) / radius2B
2196 + fracC * exp( -min(EXPMAX, bNow*bNow / radius2C)) / radius2C );
2202 }
else if (hasLowPow) {
2203 double cNow, acceptC;
2205 cNow = cDiv - 2. * log(rndmPtr->flat());
2206 acceptC = pow(cNow / cMax, expRev) * exp( -0.5 * (cNow - cMax));
2207 }
while (acceptC < rndmPtr->flat());
2208 bNow = pow( cNow, 1. / expPow);
2209 overlapNow = normPi * exp( -cNow);
2214 double cNow, acceptC;
2216 cNow = cDiv - log(rndmPtr->flat());
2217 acceptC = pow(cNow / cDiv, expRev);
2218 }
while (acceptC < rndmPtr->flat());
2219 bNow = pow( cNow, 1. / expPow);
2220 overlapNow = normPi * exp( -cNow);
2222 double temp = M_PI * kNow *overlapNow;
2223 probAccept = (1. - exp( -min(EXPMAX, temp))) / temp;
2227 }
while (probAccept < rndmPtr->flat());
2230 enhanceB = enhanceBmax = enhanceBnow = (normOverlap / normPi) * overlapNow;
2242 void MultipartonInteractions::overlapNext(
Event& event,
double pTscale) {
2245 enhanceB = zeroIntCorr;
2246 if (bProfile <= 0 || bProfile > 4)
return;
2249 if (bSelScale == 1) {
2251 for (
int i = 5; i <
event.size(); ++i)
if (event[i].isFinal()) {
2252 mmT.push_back( event[i].m() + event[i].mT() );
2253 for (
int j =
int(mmT.size()) - 1; j > 0; --j)
2254 if (mmT[j] > mmT[j - 1]) swap( mmT[j], mmT[j - 1] );
2256 pTscale = 0.5 * mmT[0];
2257 for (
int j = 1; j < int(mmT.size()); ++j) pTscale += mmT[j] / (j + 1.);
2258 }
else if (bSelScale == 2) pTscale =
event.scale();
2259 double pT2scale = pTscale*pTscale;
2262 if (bProfile == 4) {
2263 double pTtrial = 0.;
2266 double expb2 = rndmPtr->flat();
2267 double w1 = XDEP_A1 + a1 * log(1. / infoPtr->x1());
2268 double w2 = XDEP_A1 + a1 * log(1. / infoPtr->x2());
2269 double fac = a02now * (w1 * w1 + w2 * w2);
2270 b2now = - fac * log(expb2);
2276 enhanceB = sigmaND / M_PI / fac * expb2;
2277 enhanceBmax = sigmaND / 2. / M_PI / a02now
2278 * exp( -b2now / 2. / a2max );
2281 pTtrial = pTnext(pTmax, pTmin, event);
2282 }
while (pTtrial > pTscale);
2291 if (bProfile == 1) {
2292 double expb2 = rndmPtr->flat();
2294 enhanceB = enhanceBmax = enhanceBnow = normOverlap * expb2;
2295 bNow = sqrt( -log(expb2));
2298 }
else if (bProfile == 2) {
2299 double bType = rndmPtr->flat();
2300 double b2 = -log( rndmPtr->flat() );
2301 if (bType < fracA) ;
2302 else if (bType < fracA + fracB) b2 *= radius2B;
2303 else b2 *= radius2C;
2305 enhanceB = enhanceBmax = enhanceBnow = normOverlap *
2306 ( fracA * exp( -min(EXPMAX, b2))
2307 + fracB * exp( -min(EXPMAX, b2 / radius2B)) / radius2B
2308 + fracC * exp( -min(EXPMAX, b2 / radius2C)) / radius2C );
2315 }
else if (bProfile == 3 && hasLowPow) {
2316 double cNow, acceptC;
2317 double probLowC = expRev / (expRev + pow(2., expRev) * exp( - expRev));
2319 if (rndmPtr->flat() < probLowC) {
2320 cNow = 2. * expRev * rndmPtr->flat();
2321 acceptC = pow( cNow / expRev, expRev) * exp(expRev - cNow);
2323 cNow = 2. * (expRev - log( rndmPtr->flat() ));
2324 acceptC = pow(0.5 * cNow / expRev, expRev)
2325 * exp(expRev - 0.5 * cNow);
2327 }
while (acceptC < rndmPtr->flat());
2329 enhanceB = enhanceBmax = enhanceBnow = normOverlap *exp(-cNow);
2330 bNow = pow( cNow, 1. / expPow);
2334 }
else if (bProfile == 3 && !hasLowPow) {
2335 double cNow, acceptC;
2336 double probLowC = expPow / (2. * exp(-1.) + expPow);
2338 if (rndmPtr->flat() < probLowC) {
2339 cNow = pow( rndmPtr->flat(), 0.5 * expPow);
2340 acceptC = exp(-cNow);
2342 cNow = 1. - log( rndmPtr->flat() );
2343 acceptC = pow( cNow, expRev);
2345 }
while (acceptC < rndmPtr->flat());
2347 enhanceB = enhanceBmax = enhanceBnow = normOverlap * exp(-cNow);
2348 bNow = pow( cNow, 1. / expPow);
2352 }
while (sudakov(pT2scale, enhanceB) < rndmPtr->flat());
2362 void MultipartonInteractions::statistics(
bool resetStat, ostream& os) {
2365 os <<
"\n *------- PYTHIA Multiparton Interactions Statistics -----"
2369 <<
" | Note: excludes hardest subprocess if already listed above "
2373 <<
" | Subprocess Code | Times"
2377 <<
" |------------------------------------------------------------"
2384 for ( map<int, int>::iterator iter = nGen.begin(); iter != nGen.end();
2386 int code = iter -> first;
2387 int number = iter->second;
2388 numberSum += number;
2392 bool foundName =
false;
2393 SigmaMultiparton* dSigma;
2394 for (
int i = 0; i < 4; ++i) {
2395 if (i == 0) dSigma = &sigma2gg;
2396 else if (i == 1) dSigma = &sigma2qg;
2397 else if (i == 2) dSigma = &sigma2qqbarSame;
2398 else dSigma = &sigma2qq;
2399 int nProc = dSigma->nProc();
2400 for (
int iProc = 0; iProc < nProc; ++iProc)
2401 if (dSigma->codeProc(iProc) == code) {
2402 name = dSigma->nameProc(iProc);
2405 if (foundName)
break;
2409 os <<
" | " << left << setw(40) << name << right << setw(5) << code
2410 <<
" | " << setw(11) << number <<
" |\n";
2416 <<
" | " << left << setw(45) <<
"sum" << right <<
" | " << setw(11)
2417 << numberSum <<
" |\n";
2422 <<
" *------- End PYTHIA Multiparton Interactions Statistics ----"
2426 if (resetStat) resetStatistics();