File indexing completed on 2025-12-15 10:23:35
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef Pythia8_VinciaQED_H
0010 #define Pythia8_VinciaQED_H
0011
0012
0013 #include "Pythia8/BeamParticle.h"
0014 #include "Pythia8/Event.h"
0015 #include "Pythia8/StandardModel.h"
0016 #include "Pythia8/PartonSystems.h"
0017
0018
0019 #include "Pythia8/VinciaCommon.h"
0020 #include "Pythia8/VinciaWeights.h"
0021
0022 namespace Pythia8 {
0023
0024
0025
0026
0027
0028 class QEDemitElemental {
0029
0030 public:
0031
0032
0033 friend class QEDemitSystem;
0034
0035
0036 QEDemitElemental() : rndmPtr(nullptr), partonSystemsPtr(nullptr), q2Sav(0.),
0037 zetaSav(0.), phiSav(0.), sxjSav(0.), syjSav(0.), alpha(0.), c(0.),
0038 hasTrial(false), x(0), y(0), idx(0), idy(0), mx2(0.), my2(0.),
0039 ex(0.), ey(0.), m2Ant(0.), sAnt(0.), QQ(0.), isII(false), isIF(false),
0040 isFF(false), isRF(false), isIA(true), isDip(false), shh(0.),
0041 isInitPtr(false), isInit(false), verbose(1) {;}
0042
0043
0044 void initPtr(Rndm* rndmPtrIn, PartonSystems* partonSystemsPtrIn);
0045
0046 void init(Event &event, int xIn, int yIn, double shhIn,
0047 double verboseIn);
0048
0049 void init(Event &event, int xIn, vector<int> iRecoilIn, double shhIn,
0050 double verboseIn);
0051
0052 double generateTrial(Event &event, double q2Start, double q2Low,
0053 double alphaIn, double cIn);
0054
0055 private:
0056
0057
0058 Rndm* rndmPtr{};
0059
0060
0061 PartonSystems* partonSystemsPtr{};
0062
0063
0064 double q2Sav, zetaSav, phiSav, sxjSav, syjSav, alpha, c;
0065 bool hasTrial;
0066
0067
0068 int x, y;
0069
0070 vector<int> iRecoil;
0071
0072 int idx, idy;
0073
0074 int spinTypex, spinTypey;
0075
0076 double mx2, my2;
0077
0078 double ex, ey;
0079
0080 double m2Ant;
0081
0082 double sAnt;
0083
0084 double QQ;
0085
0086
0087 bool isII, isIF, isFF, isRF, isIA, isDip;
0088
0089
0090 double shh;
0091
0092
0093 bool isInitPtr, isInit;
0094 int verbose;
0095
0096 };
0097
0098
0099
0100
0101
0102 class QEDsystem {
0103
0104 public:
0105
0106
0107 QEDsystem() : infoPtr(nullptr), partonSystemsPtr(nullptr),
0108 particleDataPtr(nullptr), rndmPtr(nullptr), settingsPtr(nullptr),
0109 loggerPtr(nullptr), vinComPtr(nullptr), isInitPtr(false), iSys(-1),
0110 verbose(0), jNew(0), shat(0.) {;}
0111
0112
0113 virtual ~QEDsystem() = default;
0114
0115
0116 void initPtr(Info* infoPtrIn, ParticleData* particleDataPtrIn,
0117 PartonSystems* partonSystemsPtrIn, Rndm* rndmPtrIn,
0118 Settings* settingsPtrIn, VinciaCommon* vinComPtrIn);
0119
0120
0121 virtual void init(BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn,
0122 int verboseIn) = 0;
0123 virtual void setVerbose(int verboseIn) { verbose = verboseIn; }
0124
0125 virtual void prepare(const int iSysIn, Event &event, const double q2CutIn,
0126 const int scaleRegionIn, const vector<double> evolutionWindowsIn,
0127 AlphaEM alIn) = 0;
0128
0129 virtual void buildSystem(Event &event) = 0;
0130
0131 virtual double q2Next(Event &event, double q2Start) = 0 ;
0132
0133 virtual bool acceptTrial(Event &event) = 0;
0134
0135 virtual void updateEvent(Event &event) = 0;
0136
0137 virtual void updatePartonSystems();
0138
0139 virtual void print() = 0;
0140
0141
0142 virtual bool isSplitting() {return false;};
0143 virtual bool isInitial() {return false;};
0144
0145 protected:
0146
0147
0148 Info* infoPtr{};
0149 PartonSystems* partonSystemsPtr{};
0150 ParticleData* particleDataPtr{};
0151 Rndm* rndmPtr{};
0152 Settings* settingsPtr{};
0153 Logger* loggerPtr{};
0154 VinciaCommon* vinComPtr{};
0155 bool isInitPtr;
0156
0157
0158 int iSys;
0159 vector<Vec4> pNew;
0160
0161
0162 int verbose;
0163
0164
0165 int jNew;
0166 map<int,int> iReplace;
0167 double shat;
0168
0169 };
0170
0171
0172
0173
0174
0175 class QEDemitSystem : public QEDsystem {
0176
0177 public:
0178
0179 QEDemitSystem() : shh(-1.), cMat(0.), trialIsVec(false), beamAPtr(nullptr),
0180 beamBPtr(nullptr), qedMode(-1), qedModeMPI(-1),
0181 scaleRegion(0), emitBelowHad(false), q2Cut(-1.), isInit(false),
0182 TINYPDF(-1.), kMapTypeFinal(0) {;}
0183
0184
0185 void init(BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn,
0186 int verboseIn) override;
0187
0188 void prepare(const int iSysIn, Event &event, const double q2CutIn,
0189 const int scaleRegionIn, const vector<double> evolutionWindowsIn,
0190 AlphaEM alIn) override;
0191
0192 void buildSystem(Event &event) override;
0193
0194 double q2Next(Event &event, double q2Start) override;
0195
0196 bool acceptTrial(Event &event) override;
0197
0198 void updateEvent(Event &event) override;
0199
0200 bool isInitial() override {return eleTrial->isII || eleTrial->isIF;}
0201
0202 void print() override;
0203
0204
0205 double aTrial(QEDemitElemental* ele, double sxj, double syj, double sxy);
0206
0207 double aPhys (QEDemitElemental* ele, double sxj, double syj, double sxy);
0208
0209 double pdfRatio(bool isA, double eOld, double eNew, int id, double Qt2);
0210
0211 private:
0212
0213
0214 double shh;
0215
0216
0217 vector<vector<QEDemitElemental> > eleMat;
0218 vector<int> iCoh;
0219 double cMat;
0220 vector<QEDemitElemental> eleVec;
0221
0222
0223 AlphaEM al;
0224
0225
0226 vector<double> evolutionWindows;
0227
0228
0229 QEDemitElemental* eleTrial{};
0230 bool trialIsVec;
0231
0232
0233 BeamParticle* beamAPtr{};
0234 BeamParticle* beamBPtr{};
0235
0236
0237 int qedMode, qedModeMPI;
0238 vector<bool> useSpinsQEDNow, useSpinsQED, useSpinsQEDHadDec;
0239 int scaleRegion, emitBelowHad, isHadronDecay;
0240 double q2Cut;
0241
0242
0243 bool isInit;
0244
0245
0246 double TINYPDF;
0247
0248
0249 int kMapTypeFinal;
0250
0251
0252 Vec4 pRecSum;
0253 vector<Vec4> pRec;
0254 vector<int> iRec;
0255
0256 };
0257
0258
0259
0260
0261
0262 class QEDsplitElemental {
0263
0264 public:
0265
0266
0267 friend class QEDsplitSystem;
0268
0269
0270 QEDsplitElemental(Event &event, int iPhotIn, int iSpecIn):
0271 iPhot(iPhotIn), iSpec(iSpecIn), ariWeight(0) {
0272 m2Ant = max(VinciaConstants::PICO,
0273 m2(event[iPhotIn], event[iSpecIn]));
0274 sAnt = max(VinciaConstants::PICO,
0275 2.*event[iPhotIn].p()*event[iSpecIn].p());
0276 m2Spec = max(0., event[iSpecIn].m2());
0277 }
0278
0279
0280 double getKallen() {return m2Ant/(m2Ant - m2Spec);}
0281
0282 private:
0283
0284
0285 int iPhot, iSpec;
0286 double m2Spec, m2Ant, sAnt;
0287 double ariWeight;
0288 };
0289
0290
0291
0292
0293
0294 class QEDsplitSystem : public QEDsystem {
0295
0296 public:
0297
0298
0299 QEDsplitSystem() :
0300 totIdWeight(-1.), hasTrial(false),
0301 q2Trial(-1.), zTrial(-1.), phiTrial(-1.), idTrial(0), nQuark(-1),
0302 nLepton(-1), q2Max(-1.), q2Cut(-1.), scaleRegion(0),
0303 beamAPtr(nullptr), beamBPtr(nullptr), isInit(false), kMapTypeFinal(0) {;}
0304
0305
0306 void init(BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn,
0307 int verboseIn) override;
0308
0309 void prepare(const int iSysIn, Event &event, const double q2CutIn,
0310 const int scaleRegionIn, const vector<double> evolutionWindowsIn,
0311 AlphaEM alIn) override;
0312
0313 void buildSystem(Event &event) override;
0314
0315 double q2Next(Event &event, double q2Start) override;
0316
0317 bool acceptTrial(Event &event) override;
0318
0319 void updateEvent(Event &event) override;
0320
0321 bool isSplitting() override { return true;}
0322
0323 void print() override;
0324
0325 private:
0326
0327
0328 AlphaEM al;
0329
0330
0331 vector<double> evolutionWindows;
0332
0333
0334 vector<int> ids;
0335 vector<double> idWeights;
0336 double totIdWeight;
0337
0338
0339 vector<QEDsplitElemental> eleVec;
0340
0341
0342 bool hasTrial;
0343 double q2Trial, zTrial, phiTrial, idTrial;
0344 QEDsplitElemental* eleTrial{};
0345
0346
0347 int nQuark, nLepton;
0348 double q2Max, q2Cut;
0349 int scaleRegion;
0350
0351
0352 BeamParticle* beamAPtr;
0353 BeamParticle* beamBPtr;
0354
0355
0356 bool isInit;
0357
0358
0359 int kMapTypeFinal;
0360
0361 };
0362
0363
0364
0365
0366
0367 class QEDconvSystem : public QEDsystem {
0368
0369 public:
0370
0371
0372 QEDconvSystem() : totIdWeight(-1.), maxIdWeight(-1.), shh(-1.), s(-1.),
0373 iA(-1), iB(-1), isAPhot(false), isBPhot(false), hasTrial(false),
0374 iPhotTrial(-1), iSpecTrial(-1), q2Trial(-1.), zTrial(-1.), phiTrial(-1.),
0375 idTrial(-1), nQuark(-1), q2Cut(-1.),
0376 scaleRegion(0), beamAPtr(nullptr), beamBPtr(nullptr),isInit(false),
0377 TINYPDF(-1.) {;}
0378
0379
0380 void init(BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn,
0381 int verboseIn) override;
0382
0383 void prepare(const int iSysIn, Event &event, const double q2CutIn,
0384 const int scaleRegionIn, const vector<double> evolutionWindowsIn,
0385 AlphaEM alIn) override;
0386
0387 void buildSystem(Event &event) override;
0388
0389 double q2Next(Event &event, double q2Start) override;
0390
0391 bool acceptTrial(Event &event) override;
0392
0393 void updateEvent(Event &event) override;
0394
0395 bool isInitial() override {return true;};
0396
0397 void print() override;
0398
0399 private:
0400
0401
0402 map<int,double> Rhat;
0403
0404
0405 AlphaEM al;
0406
0407
0408 vector<double> evolutionWindows;
0409
0410
0411 vector<int> ids;
0412 vector<double> idWeights;
0413 double totIdWeight, maxIdWeight;
0414 double shh;
0415
0416
0417 double s;
0418 int iA, iB;
0419 bool isAPhot, isBPhot;
0420
0421
0422 bool hasTrial;
0423 int iPhotTrial, iSpecTrial;
0424 double q2Trial, zTrial, phiTrial, idTrial;
0425
0426
0427 int nQuark;
0428 double q2Cut;
0429
0430
0431
0432
0433
0434 int scaleRegion;
0435
0436
0437 BeamParticle* beamAPtr;
0438 BeamParticle* beamBPtr;
0439
0440
0441 bool isInit;
0442
0443
0444 double TINYPDF;
0445
0446
0447 vector<Vec4> pRec;
0448 vector<int> iRec;
0449
0450 };
0451
0452
0453
0454
0455
0456 class VinciaModule {
0457
0458 public:
0459
0460
0461 VinciaModule(): verbose(-1), isInitPtr(false), isInitSav(false) {;};
0462
0463
0464 virtual ~VinciaModule() = default;
0465
0466
0467 virtual void initPtr(Info* infoPtrIn, VinciaCommon* vinComPtrIn) = 0;
0468
0469
0470 virtual void load() {;}
0471
0472
0473 virtual void init(BeamParticle* beamAPtrIn = nullptr,
0474 BeamParticle* beamBPtrIn = nullptr) = 0;
0475 bool isInit() {return isInitSav;}
0476
0477
0478 virtual bool polarise(vector<Particle>&) {return false;}
0479
0480
0481 virtual bool prepare(int iSysIn, Event &event, int scaleRegionIn) = 0;
0482
0483
0484 virtual void update(Event &event, int iSys) = 0;
0485
0486
0487 virtual void setVerbose(int verboseIn) {verbose = verboseIn;}
0488
0489
0490 virtual void clear(int iSys = -1) = 0;
0491
0492
0493 virtual double q2Next(Event &event, double q2Start, double q2End) = 0;
0494
0495
0496 virtual int sysWin() = 0;
0497
0498
0499 virtual bool lastIsSplitting() = 0;
0500 virtual bool lastIsInitial() = 0;
0501 virtual bool lastIsResonanceDecay() {return false;}
0502
0503
0504 virtual bool acceptTrial(Event &event) = 0;
0505
0506
0507 virtual void updateEvent(Event &event) = 0;
0508
0509
0510 virtual void updatePartonSystems(Event &event) = 0;
0511
0512
0513 virtual double q2minColoured() = 0;
0514 virtual double q2min() = 0;
0515
0516
0517 virtual unsigned int nBranchers() = 0;
0518 virtual unsigned int nResDec() = 0;
0519
0520
0521 BeamParticle* beamAPtr{};
0522 BeamParticle* beamBPtr{};
0523 Info* infoPtr{};
0524 ParticleData* particleDataPtr{};
0525 Logger* loggerPtr{};
0526 PartonSystems* partonSystemsPtr{};
0527 Rndm* rndmPtr{};
0528 Settings* settingsPtr{};
0529 VinciaCommon* vinComPtr{};
0530
0531 protected:
0532
0533 int verbose;
0534 bool isInitPtr, isInitSav;
0535
0536 };
0537
0538
0539
0540
0541
0542 class VinciaQED : public VinciaModule {
0543
0544 public:
0545
0546
0547 friend class VinciaFSR;
0548
0549
0550 VinciaQED() {;}
0551
0552
0553 void initPtr(Info* infoPtrIn, VinciaCommon* vinComPtrIn) override;
0554
0555 void init(BeamParticle* beamAPtrIn = 0, BeamParticle* beamBPtrIn = 0)
0556 override;
0557
0558 bool prepare(int iSysIn, Event& event, int scaleRegionIn) override;
0559
0560 void update(Event& event, int iSys) override;
0561
0562 virtual void setVerbose(int verboseIn) override {
0563 verbose = verboseIn;
0564 emptyQEDemitSystem.setVerbose(verboseIn);
0565 emptyQEDsplitSystem.setVerbose(verboseIn);
0566 emptyQEDconvSystem.setVerbose(verboseIn);
0567 }
0568
0569 void clear(int iSys = -1) override {
0570 if (iSys < 0) {emitSystems.clear(); splitSystems.clear();
0571 convSystems.clear();}
0572 else {emitSystems.erase(iSys); splitSystems.erase(iSys);
0573 convSystems.erase(iSys);}
0574 qedTrialSysPtr = nullptr;}
0575
0576
0577 double q2Next(Event& event, double q2Start, double) override;
0578
0579 int sysWin() override {return iSysTrial;}
0580
0581 bool lastIsSplitting() override {
0582 if (qedTrialSysPtr != nullptr) return qedTrialSysPtr->isSplitting();
0583 else return false;}
0584 bool lastIsInitial() override {
0585 if (qedTrialSysPtr != nullptr) return qedTrialSysPtr->isInitial();
0586 else return false;}
0587
0588 bool acceptTrial(Event &event) override;
0589
0590 void updateEvent(Event &event) override;
0591
0592 void updatePartonSystems(Event &event) override;
0593
0594 double q2minColoured() override {return q2minColouredSav;}
0595 double q2min() override {return q2minSav;}
0596
0597
0598 unsigned int nBranchers() override {
0599 int sizeNow = emitSystems.size();
0600 sizeNow = max(sizeNow, (int)splitSystems.size());
0601 sizeNow = max(sizeNow, (int)convSystems.size());
0602 return sizeNow;}
0603
0604
0605 unsigned int nResDec() override { return 0; }
0606
0607 private:
0608
0609
0610 template <class T>
0611 void q2NextSystem(map<int, T>& QEDsystemList, Event& event, double q2Start);
0612
0613
0614 QEDemitSystem emptyQEDemitSystem;
0615 QEDsplitSystem emptyQEDsplitSystem;
0616 QEDconvSystem emptyQEDconvSystem;
0617 map< int, QEDemitSystem> emitSystems;
0618 map< int, QEDsplitSystem> splitSystems;
0619 map< int, QEDconvSystem> convSystems;
0620
0621
0622 bool doQED, doEmission;
0623 int nGammaToLepton, nGammaToQuark;
0624 bool doConvertGamma, doConvertQuark;
0625
0626
0627 double q2minSav, q2minColouredSav;
0628
0629
0630 int iSysTrial;
0631 double q2Trial;
0632 QEDsystem* qedTrialSysPtr{};
0633
0634
0635 AlphaEM al;
0636
0637
0638 vector<double> evolutionWindows;
0639
0640 };
0641
0642
0643
0644 }
0645
0646 #endif