Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-18 09:25:26

0001 // DireSplittingsU1new.h is a part of the PYTHIA event generator.
0002 // Copyright (C) 2025 Stefan Prestel, Torbjorn Sjostrand.
0003 // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
0004 // Please respect the MCnet Guidelines, see GUIDELINES for details.
0005 
0006 // Header file for parton showers with a new U(1) force, e.g. dark photons.
0007 
0008 #ifndef Pythia8_DireSplittingsU1new_H
0009 #define Pythia8_DireSplittingsU1new_H
0010 
0011 #define DIRE_SPLITTINGSU1NEW_VERSION "2.002"
0012 
0013 #include "Pythia8/Basics.h"
0014 #include "Pythia8/BeamParticle.h"
0015 #include "Pythia8/ParticleData.h"
0016 #include "Pythia8/PythiaStdlib.h"
0017 #include "Pythia8/Settings.h"
0018 #include "Pythia8/StandardModel.h"
0019 
0020 #include "Pythia8/DireSplittingsQCD.h"
0021 
0022 namespace Pythia8 {
0023 
0024 //==========================================================================
0025 
0026 class DireSplittingU1new : public DireSplittingQCD {
0027 
0028 public:
0029 
0030   // Constructor and destructor.
0031   DireSplittingU1new(string idIn, int softRS, Settings* settings,
0032     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0033     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo)
0034     : DireSplittingQCD(idIn, softRS, settings, particleData, rndm, beamA,
0035       beamB, coupSM, info, direInfo) { init(); }
0036   virtual ~DireSplittingU1new() {}
0037 
0038   void init();
0039 
0040   // VARIABLES
0041   double sumCharge2Tot, sumCharge2L, sumCharge2Q, ax0, enhance;
0042   bool doU1NEWshowerByQ, doU1NEWshowerByL;
0043 
0044   AlphaEM     alphaEM;
0045 
0046   // Function to calculate the correct running coupling/2*Pi value, including
0047   // renormalisation scale variations + threshold matching.
0048   double aem2Pi ( double pT2, int = 0);
0049 
0050   bool useFastFunctions() { return true; }
0051 
0052   virtual vector <int> radAndEmt(int idDaughter, int)
0053    { return createvector<int>(motherID(idDaughter))(sisterID(idDaughter)); }
0054   virtual int nEmissions()  { return 1; }
0055   virtual bool isPartial()  { return true; }
0056 
0057   virtual bool canUseForBranching() { return true; }
0058 
0059   virtual int couplingType (int, int) { return 2; }
0060   virtual double coupling (double = 0., double = 0., double = 0., double = -1.,
0061     pair<int,bool> = pair<int,bool>(), pair<int,bool> = pair<int,bool>()) {
0062     return (ax0 / (2.*M_PI));
0063   }
0064   virtual double couplingScale2 (double = 0., double = 0., double = 0.,
0065     pair<int,bool> = pair<int,bool>(), pair<int,bool> = pair<int,bool>()) {
0066     return -1.;
0067   }
0068 
0069 
0070 };
0071 
0072 //==========================================================================
0073 
0074 class Dire_fsr_u1new_Q2QA : public DireSplittingU1new {
0075 
0076 public:
0077 
0078   Dire_fsr_u1new_Q2QA(string idIn, int softRS, Settings* settings,
0079     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0080     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0081     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0082       beamB, coupSM, info, direInfo){}
0083 
0084   bool canRadiate ( const Event&, pair<int,int>,
0085     unordered_map<string,bool> = unordered_map<string,bool>(),
0086     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0087   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0088     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0089 
0090   int kinMap ();
0091 
0092   // Return id of mother after splitting.
0093   int motherID(int idDaughter);
0094 
0095   // Return id of emission.
0096   int sisterID(int idDaughter);
0097 
0098   // Return id of recombined radiator (before splitting!)
0099   int radBefID(int idRadAfter, int idEmtAfter);
0100 
0101   // Return colours of recombined radiator (before splitting!)
0102   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0103     int colEmtAfter, int acolEmtAfter);
0104 
0105   double gaugeFactor ( int=0, int=0 );
0106   double symmetryFactor ( int=0, int=0 );
0107 
0108   vector <int> recPositions( const Event& state, int iRad, int iEmt);
0109 
0110   // Pick z for new splitting.
0111   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0112 
0113   // New overestimates, z-integrated versions.
0114   double overestimateInt(double zMinAbs,double zMaxAbs,
0115     double pT2Old, double m2dip, int order = -1);
0116 
0117   // Return kernel for new splitting.
0118   double overestimateDiff(double z, double m2dip, int order = -1);
0119 
0120   // Functions to calculate the kernel from SplitInfo information.
0121   bool calc(const Event& state = Event(), int order = -1);
0122 
0123 };
0124 
0125 //==========================================================================
0126 
0127 class Dire_fsr_u1new_Q2AQ : public DireSplittingU1new {
0128 
0129 public:
0130 
0131   Dire_fsr_u1new_Q2AQ(string idIn, int softRS, Settings* settings,
0132     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0133     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0134     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0135       beamB, coupSM, info, direInfo){}
0136 
0137   bool canRadiate ( const Event&, pair<int,int>,
0138     unordered_map<string,bool> = unordered_map<string,bool>(),
0139     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0140   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0141     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0142 
0143   int kinMap ();
0144 
0145   // Return id of mother after splitting.
0146   int motherID(int idDaughter);
0147 
0148   // Return id of emission.
0149   int sisterID(int idDaughter);
0150 
0151   // Return id of recombined radiator (before splitting!)
0152   int radBefID(int idRadAfter, int idEmtAfter);
0153 
0154   // Return colours of recombined radiator (before splitting!)
0155   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0156     int colEmtAfter, int acolEmtAfter);
0157 
0158   double gaugeFactor ( int=0, int=0 );
0159   double symmetryFactor ( int=0, int=0 );
0160 
0161   vector <int> recPositions( const Event& state, int iRad, int iEmt);
0162 
0163   // Pick z for new splitting.
0164   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0165 
0166   // New overestimates, z-integrated versions.
0167   double overestimateInt(double zMinAbs,double zMaxAbs,
0168     double pT2Old, double m2dip, int order = -1);
0169 
0170   // Return kernel for new splitting.
0171   double overestimateDiff(double z, double m2dip, int order = -1);
0172 
0173   // Functions to calculate the kernel from SplitInfo information.
0174   bool calc(const Event& state = Event(), int order = -1);
0175 
0176 };
0177 
0178 //==========================================================================
0179 
0180 class Dire_fsr_u1new_L2LA : public DireSplittingU1new {
0181 
0182 public:
0183 
0184   Dire_fsr_u1new_L2LA(string idIn, int softRS, Settings* settings,
0185     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0186     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0187     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0188       beamB, coupSM, info, direInfo){}
0189 
0190   bool canRadiate ( const Event&, pair<int,int>,
0191     unordered_map<string,bool> = unordered_map<string,bool>(),
0192     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0193   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0194     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0195 
0196   int kinMap ();
0197 
0198   vector<pair<int,int> > radAndEmtCols(int iRad, int, Event state) {
0199     vector< pair<int,int> > ret
0200      = createvector<pair<int,int> >(make_pair(0, 0))(make_pair(0, 0));
0201     if (particleDataPtr->colType(state[iRad].id()) != 0) {
0202       ret[0].first  = state[iRad].col();
0203       ret[0].second = state[iRad].acol();
0204       ret[1].first  = 0;
0205       ret[1].second = 0;
0206     }
0207     return ret;
0208   }
0209 
0210   // Return id of mother after splitting.
0211   int motherID(int idDaughter);
0212 
0213   // Return id of emission.
0214   int sisterID(int idDaughter);
0215 
0216   // Return id of recombined radiator (before splitting!)
0217   int radBefID(int idRadAfter, int idEmtAfter);
0218 
0219   // Return colours of recombined radiator (before splitting!)
0220   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0221     int colEmtAfter, int acolEmtAfter);
0222 
0223   double gaugeFactor ( int=0, int=0 );
0224   double symmetryFactor ( int=0, int=0 );
0225 
0226   vector <int> recPositions( const Event& state, int iRad, int iEmt);
0227 
0228   // Pick z for new splitting.
0229   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0230 
0231   // New overestimates, z-integrated versions.
0232   double overestimateInt(double zMinAbs,double zMaxAbs,
0233     double pT2Old, double m2dip, int order = -1);
0234 
0235   // Return kernel for new splitting.
0236   double overestimateDiff(double z, double m2dip, int order = -1);
0237 
0238   // Functions to calculate the kernel from SplitInfo information.
0239   bool calc(const Event& state = Event(), int order = -1);
0240 
0241 };
0242 
0243 //==========================================================================
0244 
0245 class Dire_fsr_u1new_L2AL : public DireSplittingU1new {
0246 
0247 public:
0248 
0249   Dire_fsr_u1new_L2AL(string idIn, int softRS, Settings* settings,
0250     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0251     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0252     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0253       beamB, coupSM, info, direInfo){}
0254 
0255   bool canRadiate ( const Event&, pair<int,int>,
0256     unordered_map<string,bool> = unordered_map<string,bool>(),
0257     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0258   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0259     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0260 
0261   int kinMap ();
0262 
0263   vector<pair<int,int> > radAndEmtCols(int iRad, int, Event state) {
0264     vector< pair<int,int> > ret
0265      = createvector<pair<int,int> >(make_pair(0, 0))(make_pair(0, 0));
0266     if (particleDataPtr->colType(state[iRad].id()) != 0) {
0267       ret[0].first  = state[iRad].col();
0268       ret[0].second = state[iRad].acol();
0269       ret[1].first  = 0;
0270       ret[1].second = 0;
0271     }
0272     return ret;
0273   }
0274 
0275   // Return id of mother after splitting.
0276   int motherID(int idDaughter);
0277 
0278   // Return id of emission.
0279   int sisterID(int idDaughter);
0280 
0281   // Return id of recombined radiator (before splitting!)
0282   int radBefID(int idRadAfter, int idEmtAfter);
0283 
0284   // Return colours of recombined radiator (before splitting!)
0285   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0286     int colEmtAfter, int acolEmtAfter);
0287 
0288   double gaugeFactor ( int=0, int=0 );
0289   double symmetryFactor ( int=0, int=0 );
0290 
0291   vector <int> recPositions( const Event& state, int iRad, int iEmt);
0292 
0293   // Pick z for new splitting.
0294   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0295 
0296   // New overestimates, z-integrated versions.
0297   double overestimateInt(double zMinAbs,double zMaxAbs,
0298     double pT2Old, double m2dip, int order = -1);
0299 
0300   // Return kernel for new splitting.
0301   double overestimateDiff(double z, double m2dip, int order = -1);
0302 
0303   // Functions to calculate the kernel from SplitInfo information.
0304   bool calc(const Event& state = Event(), int order = -1);
0305 
0306 };
0307 
0308 //==========================================================================
0309 
0310 class Dire_fsr_u1new_A2FF : public DireSplittingU1new {
0311 
0312 public:
0313 
0314   int idRadAfterSave;
0315   double nchSaved;
0316 
0317   Dire_fsr_u1new_A2FF(int idRadAfterIn, string idIn, int softRS,
0318                       Settings* settings,
0319     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0320     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0321     DireSplittingU1new(idIn,
0322     softRS, settings, particleData, rndm, beamA, beamB, coupSM, info,
0323                        direInfo),
0324     idRadAfterSave(idRadAfterIn), nchSaved(1) {}
0325   bool canRadiate ( const Event& state, pair<int,int> ints,
0326     unordered_map<string,bool> = unordered_map<string,bool>(),
0327     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr) {
0328     return ( state[ints.first].isFinal()
0329           && state[ints.first].id() == 900032
0330           && (state[ints.second].isLepton()
0331            || state[ints.second].idAbs() == 900012));
0332   }
0333   bool canRadiate ( const Event& state, int iRadBef, int iRecBef,
0334     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr) {
0335     return ( state[iRadBef].isFinal()
0336           && state[iRadBef].id() == 900032
0337           && (state[iRecBef].isLepton()
0338            || state[iRecBef].idAbs() == 900012));
0339   }
0340 
0341   int kinMap () { return 1;};
0342   bool isPartial()  { return false; }
0343 
0344   vector<pair<int,int> > radAndEmtCols(int iRad, int, Event state) {
0345     vector< pair<int,int> > ret;
0346     if (state[iRad].id() != 900032) return ret;
0347     ret = createvector<pair<int,int> >(make_pair(0, 0))(make_pair(0, 0));
0348     if (particleDataPtr->colType(idRadAfterSave) != 0) {
0349       int sign      = (idRadAfterSave > 0) ? 1 : -1;
0350       int newCol    = state.nextColTag();
0351       if (sign> 0) {
0352         ret[0].first  = newCol;
0353         ret[0].second = 0;
0354         ret[1].first  = 0;
0355         ret[1].second = newCol;
0356       } else {
0357         ret[0].first  = 0;
0358         ret[0].second = newCol;
0359         ret[1].first  = newCol;
0360         ret[1].second = 0;
0361       }
0362 
0363     }
0364     return ret;
0365   }
0366 
0367   // Return id of mother after splitting.
0368   int motherID(int)
0369     { return idRadAfterSave; }
0370   int sisterID(int)
0371     { return -idRadAfterSave; }
0372   vector <int> radAndEmt(int, int)
0373     { return createvector<int>(idRadAfterSave)(-idRadAfterSave); }
0374     //{ return createvector<int>(1)(-1); }
0375   double gaugeFactor    ( int=0, int=0 )
0376     { return 1.; }
0377   double symmetryFactor ( int=0, int=0 )
0378     { return 1./double(nchSaved); }
0379   // Return id of recombined radiator (before splitting!)
0380   int radBefID(int idRadAfter, int idEmtAfter) {
0381     if ( idRadAfter == idRadAfterSave
0382       && particleDataPtr->isQuark(idRadAfter)
0383       && particleDataPtr->isQuark(idEmtAfter)) return 900032;
0384     return 0;
0385   }
0386   // Return colours of recombined radiator (before splitting!)
0387   pair<int,int> radBefCols(int, int, int, int) { return make_pair(0,0); }
0388 
0389   // All charged particles are potential recoilers.
0390   vector <int> recPositions( const Event& state, int iRad, int iEmt) {
0391     if ( state[iRad].isFinal() || state[iRad].id() != idRadAfterSave
0392       || state[iEmt].id() != -idRadAfterSave) return vector<int>();
0393     // Particles to exclude as recoilers.
0394     vector<int> iExc(createvector<int>(iRad)(iEmt));
0395     // Find charged particles.
0396     vector<int> recs;
0397     for (int i=0; i < state.size(); ++i) {
0398       if ( find(iExc.begin(), iExc.end(), i) != iExc.end() ) continue;
0399       if ( state[i].isLepton() || state[i].idAbs() == 900012) {
0400         if (state[i].isFinal())
0401           recs.push_back(i);
0402         if (state[i].mother1() == 1 && state[i].mother2() == 0)
0403           recs.push_back(i);
0404         if (state[i].mother1() == 2 && state[i].mother2() == 0)
0405           recs.push_back(i);
0406       }
0407     }
0408     // Done.
0409     return recs;
0410   }
0411 
0412   // All charged particles are potential recoilers.
0413   int set_nCharged( const Event& state) {
0414     // Find charged particles.
0415     int nch=0;
0416     for (int i=0; i < state.size(); ++i) {
0417       if ( state[i].isLepton() || state[i].idAbs() == 900012 ) {
0418         if (state[i].isFinal()) nch++;
0419         if (state[i].mother1() == 1 && state[i].mother2() == 0) nch++;
0420         if (state[i].mother1() == 2 && state[i].mother2() == 0) nch++;
0421       }
0422     }
0423     // Done.
0424     nchSaved = nch;
0425     return nch;
0426   }
0427 
0428   // Pick z for new splitting.
0429   double zSplit(double zMinAbs, double zMaxAbs, double /*m2dip*/) {
0430       return (zMinAbs + rndmPtr->flat() * (zMaxAbs - zMinAbs));
0431   }
0432 
0433   // New overestimates, z-integrated versions.
0434   double overestimateInt(double zMinAbs,double zMaxAbs,
0435     double /*pT2Old*/, double /*m2dip*/, int /*order*/ = -1) {
0436     double preFac = symmetryFactor() * gaugeFactor();
0437     double wt     = 2. *enhance * preFac * 0.5 * ( zMaxAbs - zMinAbs);
0438     return wt;
0439   }
0440 
0441   // Return kernel for new splitting.
0442   double overestimateDiff(double /*z*/, double /*m2dip*/, int /*order*/ = -1) {
0443     double preFac = symmetryFactor() * gaugeFactor();
0444     double wt     = 2. *enhance * preFac * 0.5;
0445     return wt;
0446   }
0447 
0448   // Functions to calculate the kernel from SplitInfo information.
0449   bool calc(const Event& state, int orderNow) {
0450 
0451     // Dummy statement to avoid compiler warnings.
0452     if (false) cout << state[0].e() << orderNow << endl;
0453 
0454     // Read all splitting variables.
0455     double z(splitInfo.kinematics()->z), pT2(splitInfo.kinematics()->pT2),
0456       m2dip(splitInfo.kinematics()->m2Dip),
0457       m2Rad(splitInfo.kinematics()->m2RadAft),
0458       m2Rec(splitInfo.kinematics()->m2Rec),
0459       m2Emt(splitInfo.kinematics()->m2EmtAft);
0460     int splitType(splitInfo.type);
0461 
0462     // Set number of recoilers.
0463     set_nCharged(state);
0464 
0465     double wt = 0.;
0466     double preFac = symmetryFactor() * gaugeFactor();
0467     double kappa2 = pT2/m2dip;
0468     wt  = preFac
0469         * (pow(1.-z,2.) + pow(z,2.));
0470 
0471     // Correction for massive splittings.
0472     bool doMassive = (abs(splitType) == 2);
0473 
0474     if (doMassive) {
0475 
0476       double vijk = 1., pipj = 0.;
0477 
0478       // splitType == 2 -> Massive FF
0479       if (splitType == 2) {
0480         // Calculate CS variables.
0481         double yCS = kappa2 / (1.-z);
0482         double nu2Rad = m2Rad/m2dip;
0483         double nu2Emt = m2Emt/m2dip;
0484         double nu2Rec = m2Rec/m2dip;
0485         vijk          = pow2(1.-yCS) - 4.*(yCS+nu2Rad+nu2Emt)*nu2Rec;
0486         vijk          = sqrt(vijk) / (1-yCS);
0487         pipj          = m2dip * yCS /2.;
0488 
0489       // splitType ==-2 -> Massive FI
0490       } else if (splitType ==-2) {
0491         // Calculate CS variables.
0492         double xCS = 1 - kappa2/(1.-z);
0493         vijk   = 1.;
0494         pipj   = m2dip/2. * (1-xCS)/xCS;
0495       }
0496 
0497       // Reset kernel for massive splittings.
0498       wt = preFac * 1. / vijk * ( pow2(1.-z) + pow2(z)
0499                                       + m2Emt / ( pipj + m2Emt) );
0500     }
0501 
0502     // Multiply with z factor
0503     if (idRadAfterSave > 0) wt *= z;
0504     else                    wt *= 1.-z;
0505 
0506     // Trivial map of values, since kernel does not depend on coupling.
0507     unordered_map<string,double> wts;
0508     wts.insert( make_pair("base", wt ));
0509     if (doVariations) {
0510       // Create muR-variations.
0511       if (settingsPtr->parm("Variations:muRfsrDown") != 1.)
0512         wts.insert( make_pair("Variations:muRfsrDown", wt ));
0513       if (settingsPtr->parm("Variations:muRfsrUp")   != 1.)
0514         wts.insert( make_pair("Variations:muRfsrUp", wt ));
0515     }
0516 
0517     // Store kernel values.
0518     clearKernels();
0519     for ( unordered_map<string,double>::iterator it = wts.begin();
0520       it != wts.end(); ++it )
0521       kernelVals.insert(make_pair( it->first, it->second ));
0522 
0523     return true;
0524   }
0525 
0526 };
0527 
0528 //==========================================================================
0529 
0530 class Dire_fsr_u1new_A2SS : public Dire_fsr_u1new_A2FF {
0531 
0532 public:
0533 
0534   Dire_fsr_u1new_A2SS(int idRadAfterIn, string idIn, int softRS,
0535     Settings* settings,
0536     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0537     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo)
0538       : Dire_fsr_u1new_A2FF(idRadAfterIn, idIn, softRS, settings, particleData,
0539         rndm, beamA, beamB, coupSM, info, direInfo) {}
0540 
0541 };
0542 
0543 //==========================================================================
0544 
0545 class Dire_isr_u1new_Q2QA : public DireSplittingU1new {
0546 
0547 public:
0548 
0549   Dire_isr_u1new_Q2QA(string idIn, int softRS, Settings* settings,
0550     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0551     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0552     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0553       beamB, coupSM, info, direInfo){}
0554 
0555   bool canRadiate ( const Event&, pair<int,int>,
0556     unordered_map<string,bool> = unordered_map<string,bool>(),
0557     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0558   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0559     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0560 
0561   int kinMap ();
0562 
0563   // Return id of mother after splitting.
0564   int motherID(int idDaughter);
0565 
0566   // Return id of emission.
0567   int sisterID(int idDaughter);
0568 
0569   // Return id of recombined radiator (before splitting!)
0570   int radBefID(int idRadAfter, int idEmtAfter);
0571 
0572   // Return colours of recombined radiator (before splitting!)
0573   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0574     int colEmtAfter, int acolEmtAfter);
0575 
0576   double gaugeFactor ( int=0, int=0 );
0577   double symmetryFactor ( int=0, int=0 );
0578 
0579   vector <int> recPositions( const Event& state, int iRad, int iEmt);
0580 
0581   // Pick z for new splitting.
0582   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0583 
0584   // New overestimates, z-integrated versions.
0585   double overestimateInt(double zMinAbs,double zMaxAbs,
0586     double pT2Old, double m2dip, int order = -1);
0587 
0588   // Return kernel for new splitting.
0589   double overestimateDiff(double z, double m2dip, int order = -1);
0590 
0591   // Functions to calculate the kernel from SplitInfo information.
0592   bool calc(const Event& state = Event(), int order = -1);
0593 
0594 };
0595 
0596 class Dire_isr_u1new_A2QQ : public DireSplittingU1new {
0597 
0598 public:
0599 
0600   Dire_isr_u1new_A2QQ(string idIn, int softRS, Settings* settings,
0601     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0602     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0603     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0604       beamB, coupSM, info, direInfo){}
0605 
0606   bool canRadiate ( const Event&, pair<int,int>,
0607     unordered_map<string,bool> = unordered_map<string,bool>(),
0608     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0609   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0610     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0611 
0612   int kinMap ();
0613 
0614   // Return id of mother after splitting.
0615   int motherID(int idDaughter);
0616 
0617   // Return id of emission.
0618   int sisterID(int idDaughter);
0619 
0620   // Return id of recombined radiator (before splitting!)
0621   int radBefID(int idRadAfter, int idEmtAfter);
0622 
0623   // Return colours of recombined radiator (before splitting!)
0624   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0625     int colEmtAfter, int acolEmtAfter);
0626 
0627   double gaugeFactor ( int=0, int=0 );
0628   double symmetryFactor ( int=0, int=0 );
0629 
0630   // Pick z for new splitting.
0631   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0632 
0633   // New overestimates, z-integrated versions.
0634   double overestimateInt(double zMinAbs,double zMaxAbs,
0635     double pT2Old, double m2dip, int order = -1);
0636 
0637   // Return kernel for new splitting.
0638   double overestimateDiff(double z, double m2dip, int order = -1);
0639 
0640   // Functions to calculate the kernel from SplitInfo information.
0641   bool calc(const Event& state = Event(), int order = -1);
0642 
0643 };
0644 
0645 class Dire_isr_u1new_Q2AQ : public DireSplittingU1new {
0646 
0647 public:
0648 
0649   Dire_isr_u1new_Q2AQ(string idIn, int softRS, Settings* settings,
0650     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0651     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0652     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0653       beamB, coupSM, info, direInfo){}
0654 
0655   bool canRadiate ( const Event&, pair<int,int>,
0656     unordered_map<string,bool> = unordered_map<string,bool>(),
0657     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0658   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0659     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0660 
0661   int kinMap ();
0662 
0663   // Return id of mother after splitting.
0664   int motherID(int idDaughter);
0665 
0666   // Return id of emission.
0667   int sisterID(int idDaughter);
0668 
0669   // Return id of recombined radiator (before splitting!)
0670   int radBefID(int idRadAfter, int idEmtAfter);
0671 
0672   // Return colours of recombined radiator (before splitting!)
0673   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0674     int colEmtAfter, int acolEmtAfter);
0675 
0676   double gaugeFactor ( int=0, int=0 );
0677   double symmetryFactor ( int=0, int=0 );
0678 
0679   // Pick z for new splitting.
0680   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0681 
0682   // New overestimates, z-integrated versions.
0683   double overestimateInt(double zMinAbs,double zMaxAbs,
0684     double pT2Old, double m2dip, int order = -1);
0685 
0686   // Return kernel for new splitting.
0687   double overestimateDiff(double z, double m2dip, int order = -1);
0688 
0689   // Functions to calculate the kernel from SplitInfo information.
0690   bool calc(const Event& state = Event(), int order = -1);
0691 
0692 };
0693 
0694 class Dire_isr_u1new_L2LA : public DireSplittingU1new {
0695 
0696 public:
0697 
0698   Dire_isr_u1new_L2LA(string idIn, int softRS, Settings* settings,
0699     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0700     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0701     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0702       beamB, coupSM, info, direInfo){}
0703 
0704   bool canRadiate ( const Event&, pair<int,int>,
0705     unordered_map<string,bool> = unordered_map<string,bool>(),
0706     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0707   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0708     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0709 
0710   int kinMap ();
0711 
0712   // Return id of mother after splitting.
0713   int motherID(int idDaughter);
0714 
0715   // Return id of emission.
0716   int sisterID(int idDaughter);
0717 
0718   // Return id of recombined radiator (before splitting!)
0719   int radBefID(int idRadAfter, int idEmtAfter);
0720 
0721   // Return colours of recombined radiator (before splitting!)
0722   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0723     int colEmtAfter, int acolEmtAfter);
0724 
0725   double gaugeFactor ( int=0, int=0 );
0726   double symmetryFactor ( int=0, int=0 );
0727 
0728   vector <int> recPositions( const Event& state, int iRad, int iEmt);
0729 
0730   // Pick z for new splitting.
0731   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0732 
0733   // New overestimates, z-integrated versions.
0734   double overestimateInt(double zMinAbs,double zMaxAbs,
0735     double pT2Old, double m2dip, int order = -1);
0736 
0737   // Return kernel for new splitting.
0738   double overestimateDiff(double z, double m2dip, int order = -1);
0739 
0740   // Functions to calculate the kernel from SplitInfo information.
0741   bool calc(const Event& state = Event(), int order = -1);
0742 
0743 };
0744 
0745 class Dire_isr_u1new_A2LL : public DireSplittingU1new {
0746 
0747 public:
0748 
0749   Dire_isr_u1new_A2LL(string idIn, int softRS, Settings* settings,
0750     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0751     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0752     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0753       beamB, coupSM, info, direInfo){}
0754 
0755   bool canRadiate ( const Event&, pair<int,int>,
0756     unordered_map<string,bool> = unordered_map<string,bool>(),
0757     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0758   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0759     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0760 
0761   int kinMap ();
0762 
0763   // Return id of mother after splitting.
0764   int motherID(int idDaughter);
0765 
0766   // Return id of emission.
0767   int sisterID(int idDaughter);
0768 
0769   // Return id of recombined radiator (before splitting!)
0770   int radBefID(int idRadAfter, int idEmtAfter);
0771 
0772   // Return colours of recombined radiator (before splitting!)
0773   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0774     int colEmtAfter, int acolEmtAfter);
0775 
0776   double gaugeFactor ( int=0, int=0 );
0777   double symmetryFactor ( int=0, int=0 );
0778 
0779   // Pick z for new splitting.
0780   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0781 
0782   // New overestimates, z-integrated versions.
0783   double overestimateInt(double zMinAbs,double zMaxAbs,
0784     double pT2Old, double m2dip, int order = -1);
0785 
0786   // Return kernel for new splitting.
0787   double overestimateDiff(double z, double m2dip, int order = -1);
0788 
0789   // Functions to calculate the kernel from SplitInfo information.
0790   bool calc(const Event& state = Event(), int order = -1);
0791 
0792 };
0793 
0794 class Dire_isr_u1new_L2AL : public DireSplittingU1new {
0795 
0796 public:
0797 
0798   Dire_isr_u1new_L2AL(string idIn, int softRS, Settings* settings,
0799     ParticleData* particleData, Rndm* rndm, BeamParticle* beamA,
0800     BeamParticle* beamB, CoupSM* coupSM, Info* info, DireInfo* direInfo) :
0801     DireSplittingU1new(idIn, softRS, settings, particleData, rndm, beamA,
0802       beamB, coupSM, info, direInfo){}
0803 
0804   bool canRadiate ( const Event&, pair<int,int>,
0805     unordered_map<string,bool> = unordered_map<string,bool>(),
0806     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0807   bool canRadiate ( const Event&, int iRadBef, int iRecBef,
0808     Settings* = nullptr, PartonSystems* = nullptr, BeamParticle* = nullptr);
0809 
0810   int kinMap ();
0811 
0812   // Return id of mother after splitting.
0813   int motherID(int idDaughter);
0814 
0815   // Return id of emission.
0816   int sisterID(int idDaughter);
0817 
0818   // Return id of recombined radiator (before splitting!)
0819   int radBefID(int idRadAfter, int idEmtAfter);
0820 
0821   // Return colours of recombined radiator (before splitting!)
0822   pair<int,int> radBefCols(int colRadAfter, int acolRadAfter,
0823     int colEmtAfter, int acolEmtAfter);
0824 
0825   double gaugeFactor ( int=0, int=0 );
0826   double symmetryFactor ( int=0, int=0 );
0827 
0828   // Pick z for new splitting.
0829   double zSplit(double zMinAbs, double zMaxAbs, double m2dip);
0830 
0831   // New overestimates, z-integrated versions.
0832   double overestimateInt(double zMinAbs,double zMaxAbs,
0833     double pT2Old, double m2dip, int order = -1);
0834 
0835   // Return kernel for new splitting.
0836   double overestimateDiff(double z, double m2dip, int order = -1);
0837 
0838   // Functions to calculate the kernel from SplitInfo information.
0839   bool calc(const Event& state = Event(), int order = -1);
0840 
0841 };
0842 
0843 //==========================================================================
0844 
0845 } // end namespace Pythia8
0846 
0847 #endif // end Pythia8_DireSplittingsU1new_H