Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 10:06:22

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