8 #ifndef Pythia8_DireSplittingsQED_H 9 #define Pythia8_DireSplittingsQED_H 11 #define DIRE_SPLITTINGSQED_VERSION "2.002" 13 #include "Pythia8/Basics.h" 14 #include "Pythia8/BeamParticle.h" 15 #include "Pythia8/ParticleData.h" 16 #include "Pythia8/PythiaStdlib.h" 17 #include "Pythia8/Settings.h" 18 #include "Pythia8/StandardModel.h" 20 #include "Pythia8/DireSplittingsQCD.h" 35 coupSM,info, direInfo) {
init();}
42 pT2minL, pT2minQ, pT2minA, pT2minForcePos;
43 bool doQEDshowerByQ, doQEDshowerByL, doForcePos;
49 double aem2Pi (
double pT2,
int = 0);
51 bool useFastFunctions() {
return true; }
55 virtual int nEmissions() {
return 1; }
56 virtual bool isPartial() {
return true; }
59 virtual double coupling (
double = 0.,
double = 0.,
double = 0.,
double = -1,
60 pair<int,bool> = pair<int,bool>(), pair<int,bool> = pair<int,bool>()) {
61 return (aem0 / (2.*M_PI));
63 virtual double couplingScale2 (
double = 0.,
double = 0.,
double = 0.,
64 pair<int,bool> = pair<int,bool>(), pair<int,bool> = pair<int,bool>()) {
83 coupSM, info, direInfo){}
85 bool canRadiate (
const Event&, pair<int,int>,
86 unordered_map<string,bool> = unordered_map<string,bool>(),
88 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
100 int radBefID(
int idRadAfter,
int idEmtAfter);
103 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
104 int colEmtAfter,
int acolEmtAfter);
106 vector<pair<int,int> > radAndEmtCols(
int iRad,
int,
Event state) {
108 (make_pair(state[iRad].col(),state[iRad].acol()))(make_pair(0, 0));
117 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
121 double pT2Old,
double m2dip,
int order = -1);
141 coupSM, info, direInfo){}
143 bool canRadiate (
const Event&, pair<int,int>,
144 unordered_map<string,bool> = unordered_map<string,bool>(),
146 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
154 vector<pair<int,int> > radAndEmtCols(
int iRad,
int,
Event state) {
156 (make_pair(state[iRad].col(),state[iRad].acol()))(make_pair(0, 0));
163 int radBefID(
int idRadAfter,
int idEmtAfter);
166 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
167 int colEmtAfter,
int acolEmtAfter);
175 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
179 double pT2Old,
double m2dip,
int order = -1);
199 coupSM, info, direInfo){}
201 bool canRadiate (
const Event&, pair<int,int>,
202 unordered_map<string,bool> = unordered_map<string,bool>(),
204 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
216 int radBefID(
int idRadAfter,
int idEmtAfter);
219 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
220 int colEmtAfter,
int acolEmtAfter);
222 vector<pair<int,int> > radAndEmtCols(
int,
int,
Event) {
232 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
236 double pT2Old,
double m2dip,
int order = -1);
256 coupSM, info, direInfo){}
258 bool canRadiate (
const Event&, pair<int,int>,
259 unordered_map<string,bool> = unordered_map<string,bool>(),
261 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
273 int radBefID(
int idRadAfter,
int idEmtAfter);
276 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
277 int colEmtAfter,
int acolEmtAfter);
279 vector<pair<int,int> > radAndEmtCols(
int,
int,
Event) {
289 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
293 double pT2Old,
double m2dip,
int order = -1);
317 softRS, settings, particleData, rndm, beamA, beamB, coupSM, info,
319 idRadAfterSave(idRadAfterIn), nchSaved(1) {}
320 bool canRadiate (
const Event& state, pair<int,int> ints,
321 unordered_map<string,bool> = unordered_map<string,bool>(),
323 return ( state[ints.first].isFinal()
324 && state[ints.first].id() == 22
325 && state[ints.second].isCharged());
327 bool canRadiate (
const Event& state,
int iRadBef,
int iRecBef,
329 return ( state[iRadBef].isFinal()
330 && state[iRadBef].
id() == 22
331 && state[iRecBef].isCharged());
335 bool canUseForBranching() {
return true; }
336 bool isPartial() {
return false; }
338 vector<pair<int,int> > radAndEmtCols(
int iRad,
int,
Event state) {
339 vector< pair<int,int> > ret;
340 if (state[iRad].
id() != 22)
return ret;
342 if (particleDataPtr->colType(idRadAfterSave) != 0) {
343 int sign = (idRadAfterSave > 0) ? 1 : -1;
344 int newCol = state.nextColTag();
346 ret[0].first = newCol;
349 ret[1].second = newCol;
352 ret[0].second = newCol;
353 ret[1].first = newCol;
362 {
return idRadAfterSave; }
364 {
return -idRadAfterSave; }
369 {
return pow2(particleDataPtr->charge(idRadAfterSave)); }
371 {
return 1./double(nchSaved); }
374 if ( idRadAfter == idRadAfterSave
375 && particleDataPtr->isQuark(idRadAfter)
376 && particleDataPtr->isQuark(idEmtAfter))
return 22;
380 pair<int,int>
radBefCols(
int,
int,
int,
int) {
return make_pair(0,0); }
384 if ( state[iRad].isFinal() || state[iRad].
id() != idRadAfterSave
385 || state[iEmt].
id() != -idRadAfterSave)
return vector<int>();
390 for (
int i=0; i < state.
size(); ++i) {
391 if ( find(iExc.begin(), iExc.end(), i) != iExc.end() )
continue;
392 if ( state[i].isCharged() ) {
393 if (state[i].isFinal())
395 if (state[i].mother1() == 1 && state[i].mother2() == 0)
397 if (state[i].mother1() == 2 && state[i].mother2() == 0)
409 for (
int i=0; i < state.
size(); ++i) {
410 if ( state[i].isCharged() ) {
411 if (state[i].isFinal()) nch++;
412 if (state[i].mother1() == 1 && state[i].mother2() == 0) nch++;
413 if (state[i].mother1() == 2 && state[i].mother2() == 0) nch++;
422 double zSplit(
double zMinAbs,
double zMaxAbs,
double ) {
423 return (zMinAbs + rndmPtr->flat() * (zMaxAbs - zMinAbs));
428 double ,
double ,
int = -1) {
430 double wt = 2. *enhance * preFac * 0.5 * ( zMaxAbs - zMinAbs);
437 double wt = 2. *enhance * preFac * 0.5;
445 if (
false) cout << state[0].e() << orderNow << endl;
448 double z(splitInfo.kinematics()->z), pT2(splitInfo.kinematics()->pT2),
449 m2dip(splitInfo.kinematics()->m2Dip),
451 m2Rad(splitInfo.kinematics()->m2RadAft),
452 m2Rec(splitInfo.kinematics()->m2Rec),
453 m2Emt(splitInfo.kinematics()->m2EmtAft);
454 int splitType(splitInfo.type);
461 double kappa2 = pT2/m2dip;
463 * (pow(1.-z,2.) + pow(z,2.));
466 bool doMassive = (abs(splitType) == 2);
470 double vijk = 1., pipj = 0.;
473 if (splitType == 2) {
475 double yCS = kappa2 / (1.-z);
476 double nu2Rad = m2Rad/m2dip;
477 double nu2Emt = m2Emt/m2dip;
478 double nu2Rec = m2Rec/m2dip;
479 vijk =
pow2(1.-yCS) - 4.*(yCS+nu2Rad+nu2Emt)*nu2Rec;
480 vijk = sqrt(vijk) / (1-yCS);
481 pipj = m2dip * yCS /2.;
484 }
else if (splitType ==-2) {
486 double xCS = 1 - kappa2/(1.-z);
488 pipj = m2dip/2. * (1-xCS)/xCS;
492 wt = preFac * 1. / vijk * (
pow2(1.-z) +
pow2(z)
493 + m2Emt / ( pipj + m2Emt) );
497 if (idRadAfterSave > 0) wt *= z;
501 unordered_map<string,double> wts;
502 wts.insert( make_pair(
"base", wt ));
505 if (settingsPtr->parm(
"Variations:muRfsrDown") != 1.)
506 wts.insert( make_pair(
"Variations:muRfsrDown", wt ));
507 if (settingsPtr->parm(
"Variations:muRfsrUp") != 1.)
508 wts.insert( make_pair(
"Variations:muRfsrUp", wt ));
513 for ( unordered_map<string,double>::iterator it = wts.begin();
514 it != wts.end(); ++it )
515 kernelVals.insert(make_pair( it->first, it->second ));
533 coupSM, info, direInfo){}
535 bool canRadiate (
const Event&, pair<int,int>,
536 unordered_map<string,bool> = unordered_map<string,bool>(),
538 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
550 int radBefID(
int idRadAfter,
int idEmtAfter);
553 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
554 int colEmtAfter,
int acolEmtAfter);
556 vector<pair<int,int> > radAndEmtCols(
int iRad,
int,
Event state) {
558 (make_pair(state[iRad].col(),state[iRad].acol()))(make_pair(0, 0));
567 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
571 double pT2Old,
double m2dip,
int order = -1);
589 coupSM, info, direInfo){}
591 bool canRadiate (
const Event&, pair<int,int>,
592 unordered_map<string,bool> = unordered_map<string,bool>(),
594 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
606 int radBefID(
int idRadAfter,
int idEmtAfter);
609 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
610 int colEmtAfter,
int acolEmtAfter);
612 vector<pair<int,int> > radAndEmtCols(
int iRad,
int,
Event state) {
614 (make_pair(0, 0))(make_pair(state[iRad].acol(),state[iRad].col()));
621 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
625 double pT2Old,
double m2dip,
int order = -1);
643 coupSM, info, direInfo){}
645 bool canRadiate (
const Event&, pair<int,int>,
646 unordered_map<string,bool> = unordered_map<string,bool>(),
648 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
660 int radBefID(
int idRadAfter,
int idEmtAfter);
663 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
664 int colEmtAfter,
int acolEmtAfter);
666 vector<pair<int,int> > radAndEmtCols(
int,
int colType,
Event state) {
667 int newCol = state.nextColTag();
669 (make_pair(newCol,0))(make_pair(newCol,0));
671 (make_pair(0,newCol))(make_pair(0,newCol));
678 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
682 double pT2Old,
double m2dip,
int order = -1);
700 coupSM, info, direInfo){}
702 bool canRadiate (
const Event&, pair<int,int>,
703 unordered_map<string,bool> = unordered_map<string,bool>(),
705 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
717 int radBefID(
int idRadAfter,
int idEmtAfter);
720 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
721 int colEmtAfter,
int acolEmtAfter);
723 vector<pair<int,int> > radAndEmtCols(
int,
int,
Event) {
733 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
737 double pT2Old,
double m2dip,
int order = -1);
755 coupSM, info, direInfo){}
757 bool canRadiate (
const Event&, pair<int,int>,
758 unordered_map<string,bool> = unordered_map<string,bool>(),
760 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
772 int radBefID(
int idRadAfter,
int idEmtAfter);
775 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
776 int colEmtAfter,
int acolEmtAfter);
778 vector<pair<int,int> > radAndEmtCols(
int,
int,
Event) {
786 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
790 double pT2Old,
double m2dip,
int order = -1);
808 coupSM, info, direInfo){}
810 bool canRadiate (
const Event&, pair<int,int>,
811 unordered_map<string,bool> = unordered_map<string,bool>(),
813 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
825 int radBefID(
int idRadAfter,
int idEmtAfter);
828 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
829 int colEmtAfter,
int acolEmtAfter);
831 vector<pair<int,int> > radAndEmtCols(
int,
int,
Event) {
839 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
843 double pT2Old,
double m2dip,
int order = -1);
863 coupSM, info, direInfo){}
865 bool canRadiate (
const Event&, pair<int,int>,
866 unordered_map<string,bool> = unordered_map<string,bool>(),
868 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
872 bool canUseForBranching() {
return true; }
873 bool isPartial() {
return false; }
882 int radBefID(
int idRadAfter,
int idEmtAfter);
885 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
886 int colEmtAfter,
int acolEmtAfter);
888 vector<pair<int,int> > radAndEmtCols(
int iRad,
int,
Event state) {
890 (make_pair(state[iRad].col(),state[iRad].acol()))(make_pair(0, 0));
899 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
903 double pT2Old,
double m2dip,
int order = -1);
923 coupSM, info, direInfo){}
925 bool canRadiate (
const Event&, pair<int,int>,
926 unordered_map<string,bool> = unordered_map<string,bool>(),
928 bool canRadiate (
const Event&,
int iRadBef,
int iRecBef,
932 bool canUseForBranching() {
return true; }
933 bool isPartial() {
return false; }
942 int radBefID(
int idRadAfter,
int idEmtAfter);
945 pair<int,int>
radBefCols(
int colRadAfter,
int acolRadAfter,
946 int colEmtAfter,
int acolEmtAfter);
948 vector<pair<int,int> > radAndEmtCols(
int,
int,
Event) {
958 double zSplit(
double zMinAbs,
double zMaxAbs,
double m2dip);
962 double pT2Old,
double m2dip,
int order = -1);
double aem2Pi(double pT2, int=0)
Definition: DireSplittingsQED.cc:65
constexpr double pow2(const double &x)
Powers of small integers - for balance speed/code clarity.
Definition: PythiaStdlib.h:173
Definition: DireSplittingsQED.h:635
virtual vector< int > recPositions(const Event &, int, int)
Definition: DireSplittings.h:146
virtual double symmetryFactor(int, int)
Return symmetry factor for splitting.
Definition: DireSplittings.h:160
The Event class holds all info on the generated event.
Definition: Event.h:408
double zSplit(double zMinAbs, double zMaxAbs, double)
Pick z for new splitting.
Definition: DireSplittingsQED.h:422
Definition: DireSplittingsQED.h:800
Definition: DireSplittingsQCD.h:27
double overestimateDiff(double, double, int=-1)
Return kernel for new splitting.
Definition: DireSplittingsQED.h:435
virtual double coupling(double=0., double=0., double=0., double=-1, pair< int, bool >=pair< int, bool >(), pair< int, bool >=pair< int, bool >())
Definition: DireSplittingsQED.h:59
virtual double gaugeFactor(int, int)
Return color factor for splitting.
Definition: DireSplittings.h:157
int motherID(int)
Return id of mother after splitting.
Definition: DireSplittingsQED.h:361
virtual double overestimateInt(double, double, double, double, int=-1)
New overestimates, z-integrated versions.
Definition: DireSplittings.h:189
Definition: DireBasics.h:374
Definition: DireSplittingsQED.h:75
Definition: StandardModel.h:106
double gaugeFactor(int=0, int=0)
{ return createvector<int>(1)(-1); }
Definition: DireSplittingsQED.h:368
vector< int > recPositions(const Event &state, int iRad, int iEmt)
All charged particles are potential recoilers.
Definition: DireSplittingsQED.h:383
Definition: DireSplittingsQED.h:855
int sisterID(int)
Return id of emission.
Definition: DireSplittingsQED.h:363
virtual bool calc(const Event &=Event(), int=-1)
Functions to calculate the kernel from SplitInfo information.
Definition: DireSplittings.h:203
pair< int, int > radBefCols(int, int, int, int)
Return colours of recombined radiator (before splitting!)
Definition: DireSplittingsQED.h:380
int radBefID(int idRadAfter, int idEmtAfter)
Return id of recombined radiator (before splitting!)
Definition: DireSplittingsQED.h:373
Definition: DireSplittingsQED.h:305
virtual int kinMap()
Definition: DireSplittings.h:123
bool calc(const Event &state, int orderNow)
Functions to calculate the kernel from SplitInfo information.
Definition: DireSplittingsQED.h:442
Definition: DireSplittingsQED.h:525
void init()
The SplittingQED class.
Definition: DireSplittingsQED.cc:23
double overestimateInt(double zMinAbs, double zMaxAbs, double, double, int=-1)
New overestimates, z-integrated versions.
Definition: DireSplittingsQED.h:427
Definition: DireSplittingsQED.h:692
Definition: StandardModel.h:135
int size() const
Event record size.
Definition: Event.h:459
Definition: DireSplittingsQED.h:191
Definition: DireSplittingsQED.h:133
virtual double overestimateDiff(double, double, int=-1)
Return kernel for new splitting.
Definition: DireSplittings.h:193
DireSplittingQED(string idIn, int softRS, Settings *settings, ParticleData *particleData, Rndm *rndm, BeamParticlePtr beamA, BeamParticlePtr beamB, CoupSM *coupSM, Info *info, DireInfo *direInfo)
Constructor and destructor.
Definition: DireSplittingsQED.h:31
Definition: DireSplittingsQED.h:915
Definition: DireSplittingsQED.h:747
Definition: DireSplittingsQED.h:26
The PartonSystems class describes the whole set of subcollisions.
Definition: PartonSystems.h:42
Header for classes to set beam momentum and interaction vertex spread.
Definition: Analysis.h:20
vector< int > radAndEmt(int, int)
Definition: DireSplittingsQED.h:365
virtual bool aboveCutoff(double t, const Particle &radBef, const Particle &recBef, int iSys, PartonSystems *partonSystemsPtr)
Discard below the cut-off for the splitting.
Definition: DireSplittingsQED.cc:79
Definition: DireSplittingsQED.h:581
double symmetryFactor(int=0, int=0)
Return symmetry factor for splitting.
Definition: DireSplittingsQED.h:370
Definition: DireSplittingsQED.h:248
virtual int couplingType(int, int)
Definition: DireSplittingsQED.h:58
virtual int radBefID(int, int)
Return id of recombined radiator (before splitting!)
Definition: DireSplittings.h:150
double sumCharge2Tot
Class members.
Definition: DireSplittingsQED.h:41
This class holds a map of all ParticleDataEntries.
Definition: ParticleData.h:422
int set_nCharged(const Event &state)
All charged particles are potential recoilers.
Definition: DireSplittingsQED.h:406
int kinMap()
Definition: DireSplittingsQED.h:334
virtual pair< int, int > radBefCols(int, int, int, int)
Return colours of recombined radiator (before splitting!)
Definition: DireSplittings.h:153
Definition: DireBasics.h:82
virtual vector< int > radAndEmt(int idDaughter, int)
Definition: DireSplittingsQED.h:53
virtual int sisterID(int)
Return id of emission.
Definition: DireSplittings.h:129
Definition: Settings.h:196
virtual double zSplit(double, double, double)
Pick z for new splitting.
Definition: DireSplittings.h:186
virtual int motherID(int)
Return id of mother after splitting.
Definition: DireSplittings.h:126