Back to home page

EIC code displayed by LXR

 
 

    


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

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