File indexing completed on 2025-09-18 09:25:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef Pythia8_Event_H
0012 #define Pythia8_Event_H
0013
0014 #include "Pythia8/Basics.h"
0015 #include "Pythia8/ParticleData.h"
0016 #include "Pythia8/PythiaStdlib.h"
0017
0018 namespace Pythia8 {
0019
0020
0021
0022
0023 class ParticleDataEntry;
0024 class ResonanceWidths;
0025 class Event;
0026
0027
0028
0029
0030
0031
0032 class Particle {
0033
0034 public:
0035
0036
0037 Particle() : idSave(0), statusSave(0), mother1Save(0), mother2Save(0),
0038 daughter1Save(0), daughter2Save(0), colSave(0), acolSave(0),
0039 pSave(Vec4(0.,0.,0.,0.)), mSave(0.), scaleSave(0.), polSave(9.),
0040 hasVertexSave(false), vProdSave(Vec4(0.,0.,0.,0.)), tauSave(0.),
0041 pdePtr(0), evtPtr(0) { }
0042 Particle(int idIn, int statusIn = 0, int mother1In = 0,
0043 int mother2In = 0, int daughter1In = 0, int daughter2In = 0,
0044 int colIn = 0, int acolIn = 0, double pxIn = 0., double pyIn = 0.,
0045 double pzIn = 0., double eIn = 0., double mIn = 0.,
0046 double scaleIn = 0., double polIn = 9.)
0047 : idSave(idIn), statusSave(statusIn), mother1Save(mother1In),
0048 mother2Save(mother2In), daughter1Save(daughter1In),
0049 daughter2Save(daughter2In), colSave(colIn), acolSave(acolIn),
0050 pSave(Vec4(pxIn, pyIn, pzIn, eIn)), mSave(mIn), scaleSave(scaleIn),
0051 polSave(polIn), hasVertexSave(false), vProdSave(Vec4(0.,0.,0.,0.)),
0052 tauSave(0.), pdePtr(0), evtPtr(0) { }
0053 Particle(int idIn, int statusIn, int mother1In, int mother2In,
0054 int daughter1In, int daughter2In, int colIn, int acolIn,
0055 Vec4 pIn, double mIn = 0., double scaleIn = 0., double polIn = 9.)
0056 : idSave(idIn), statusSave(statusIn), mother1Save(mother1In),
0057 mother2Save(mother2In), daughter1Save(daughter1In),
0058 daughter2Save(daughter2In), colSave(colIn), acolSave(acolIn),
0059 pSave(pIn), mSave(mIn), scaleSave(scaleIn), polSave(polIn),
0060 hasVertexSave(false), vProdSave(Vec4(0.,0.,0.,0.)), tauSave(0.),
0061 pdePtr(0), evtPtr(0) { }
0062 Particle(const Particle& pt) : idSave(pt.idSave),
0063 statusSave(pt.statusSave), mother1Save(pt.mother1Save),
0064 mother2Save(pt.mother2Save), daughter1Save(pt.daughter1Save),
0065 daughter2Save(pt.daughter2Save), colSave(pt.colSave),
0066 acolSave(pt.acolSave), pSave(pt.pSave), mSave(pt.mSave),
0067 scaleSave(pt.scaleSave), polSave(pt.polSave),
0068 hasVertexSave(pt.hasVertexSave), vProdSave(pt.vProdSave),
0069 tauSave(pt.tauSave), pdePtr(pt.pdePtr), evtPtr(pt.evtPtr) { }
0070 Particle& operator=(const Particle& pt) {if (this != &pt) {
0071 idSave = pt.idSave; statusSave = pt.statusSave;
0072 mother1Save = pt.mother1Save; mother2Save = pt.mother2Save;
0073 daughter1Save = pt.daughter1Save; daughter2Save = pt.daughter2Save;
0074 colSave = pt.colSave; acolSave = pt.acolSave; pSave = pt.pSave;
0075 mSave = pt.mSave; scaleSave = pt.scaleSave; polSave = pt.polSave;
0076 hasVertexSave = pt.hasVertexSave; vProdSave = pt.vProdSave;
0077 tauSave = pt.tauSave; pdePtr = pt.pdePtr; evtPtr = pt.evtPtr; }
0078 return *this; }
0079
0080
0081 virtual ~Particle() {}
0082
0083
0084 void setEvtPtr(Event* evtPtrIn) { evtPtr = evtPtrIn; setPDEPtr();}
0085 void setPDEPtr(ParticleDataEntryPtr pdePtrIn = nullptr);
0086
0087
0088 void id(int idIn) {idSave = idIn; setPDEPtr();}
0089 void status(int statusIn) {statusSave = statusIn;}
0090 void statusPos() {statusSave = abs(statusSave);}
0091 void statusNeg() {statusSave = -abs(statusSave);}
0092 void statusCode(int statusIn) {statusSave =
0093 (statusSave > 0) ? abs(statusIn) : -abs(statusIn);}
0094 void mother1(int mother1In) {mother1Save = mother1In;}
0095 void mother2(int mother2In) {mother2Save = mother2In;}
0096 void mothers(int mother1In = 0, int mother2In = 0)
0097 {mother1Save = mother1In; mother2Save = mother2In;}
0098 void daughter1(int daughter1In) {daughter1Save = daughter1In;}
0099 void daughter2(int daughter2In) {daughter2Save = daughter2In;}
0100 void daughters(int daughter1In = 0, int daughter2In = 0)
0101 {daughter1Save = daughter1In; daughter2Save = daughter2In;}
0102 void col(int colIn) {colSave = colIn;}
0103 void acol(int acolIn) {acolSave = acolIn;}
0104 void cols(int colIn = 0,int acolIn = 0) {colSave = colIn;
0105 acolSave = acolIn;}
0106 void p(Vec4 pIn) {pSave = pIn;}
0107 void p(double pxIn, double pyIn, double pzIn, double eIn)
0108 {pSave.p(pxIn, pyIn, pzIn, eIn);}
0109 void px(double pxIn) {pSave.px(pxIn);}
0110 void py(double pyIn) {pSave.py(pyIn);}
0111 void pz(double pzIn) {pSave.pz(pzIn);}
0112 void e(double eIn) {pSave.e(eIn);}
0113 void m(double mIn) {mSave = mIn;}
0114 void scale(double scaleIn) {scaleSave = scaleIn;}
0115 void pol(double polIn) {polSave = polIn;}
0116 void vProd(Vec4 vProdIn) {vProdSave = vProdIn; hasVertexSave = true;}
0117 void vProd(double xProdIn, double yProdIn, double zProdIn, double tProdIn)
0118 {vProdSave.p(xProdIn, yProdIn, zProdIn, tProdIn); hasVertexSave = true;}
0119 void xProd(double xProdIn) {vProdSave.px(xProdIn); hasVertexSave = true;}
0120 void yProd(double yProdIn) {vProdSave.py(yProdIn); hasVertexSave = true;}
0121 void zProd(double zProdIn) {vProdSave.pz(zProdIn); hasVertexSave = true;}
0122 void tProd(double tProdIn) {vProdSave.e(tProdIn); hasVertexSave = true;}
0123 void vProdAdd(Vec4 vProdIn) {vProdSave += vProdIn; hasVertexSave = true;}
0124 void tau(double tauIn) {tauSave = tauIn;}
0125
0126
0127 int id() const {return idSave;}
0128 int status() const {return statusSave;}
0129 int mother1() const {return mother1Save;}
0130 int mother2() const {return mother2Save;}
0131 int daughter1() const {return daughter1Save;}
0132 int daughter2() const {return daughter2Save;}
0133 int col() const {return colSave;}
0134 int acol() const {return acolSave;}
0135 Vec4 p() const {return pSave;}
0136 double px() const {return pSave.px();}
0137 double py() const {return pSave.py();}
0138 double pz() const {return pSave.pz();}
0139 double e() const {return pSave.e();}
0140 double m() const {return mSave;}
0141 double scale() const {return scaleSave;}
0142 double pol() const {return polSave;}
0143 bool hasVertex() const {return hasVertexSave;}
0144 Vec4 vProd() const {return vProdSave;}
0145 double xProd() const {return vProdSave.px();}
0146 double yProd() const {return vProdSave.py();}
0147 double zProd() const {return vProdSave.pz();}
0148 double tProd() const {return vProdSave.e();}
0149 double tau() const {return tauSave;}
0150
0151
0152 int idAbs() const {return abs(idSave);}
0153 int statusAbs() const {return abs(statusSave);}
0154 bool isFinal() const {return (statusSave > 0);}
0155 int intPol() const;
0156 bool isRescatteredIncoming() const {return
0157 (statusSave == -34 || statusSave == -45 ||
0158 statusSave == -46 || statusSave == -54);}
0159
0160
0161 double m2() const {return (mSave >= 0.) ? mSave*mSave
0162 : -mSave*mSave;}
0163 double mCalc() const {return pSave.mCalc();}
0164 double m2Calc() const {return pSave.m2Calc();}
0165 double eCalc() const {return sqrt(abs(m2() + pSave.pAbs2()));}
0166 double pT() const {return pSave.pT();}
0167 double pT2() const {return pSave.pT2();}
0168 double mT() const {double temp = m2() + pSave.pT2();
0169 return (temp >= 0.) ? sqrt(temp) : -sqrt(-temp);}
0170 double mT2() const {return m2() + pSave.pT2();}
0171 double pAbs() const {return pSave.pAbs();}
0172 double pAbs2() const {return pSave.pAbs2();}
0173 double eT() const {return pSave.eT();}
0174 double eT2() const {return pSave.eT2();}
0175 double theta() const {return pSave.theta();}
0176 double phi() const {return pSave.phi();}
0177 double thetaXZ() const {return pSave.thetaXZ();}
0178 double pPos() const {return pSave.pPos();}
0179 double pNeg() const {return pSave.pNeg();}
0180 double y() const;
0181 double eta() const;
0182 double y(double mCut) const;
0183 double y(double mCut, RotBstMatrix& M) const;
0184 Vec4 vDec() const {return (tauSave > 0. && mSave > 0.)
0185 ? vProdSave + tauSave * pSave / mSave : vProdSave;}
0186 double xDec() const {return (tauSave > 0. && mSave > 0.)
0187 ? vProdSave.px() + tauSave * pSave.px() / mSave : vProdSave.px();}
0188 double yDec() const {return (tauSave > 0. && mSave > 0.)
0189 ? vProdSave.py() + tauSave * pSave.py() / mSave : vProdSave.py();}
0190 double zDec() const {return (tauSave > 0. && mSave > 0.)
0191 ? vProdSave.pz() + tauSave * pSave.pz() / mSave : vProdSave.pz();}
0192 double tDec() const {return (tauSave > 0. && mSave > 0.)
0193 ? vProdSave.e() + tauSave * pSave.e() / mSave : vProdSave.e();}
0194
0195
0196 virtual int index() const;
0197 int iTopCopy() const;
0198 int iBotCopy() const;
0199 int iTopCopyId(bool simplify = false) const;
0200 int iBotCopyId(bool simplify = false) const;
0201 vector<int> motherList() const;
0202 vector<int> daughterList() const;
0203 vector<int> daughterListRecursive() const;
0204 vector<int> sisterList(bool traceTopBot = false) const;
0205 bool isAncestor(int iAncestor) const;
0206 int statusHepMC() const;
0207 bool isFinalPartonLevel() const;
0208 bool undoDecay();
0209
0210
0211 int colHV() const;
0212 int acolHV() const;
0213 void colHV(int colHVin);
0214 void acolHV(int acolHVin);
0215 void colsHV(int colHVin, int acolHVin);
0216
0217
0218 string name() const {
0219 return (pdePtr != 0) ? pdePtr->name(idSave) : " ";}
0220 string nameWithStatus(int maxLen = 20) const;
0221 int spinType() const {
0222 return (pdePtr != 0) ? pdePtr->spinType() : 0;}
0223 int chargeType() const {
0224 return (pdePtr != 0) ? pdePtr->chargeType(idSave) : 0;}
0225 double charge() const {
0226 return (pdePtr != 0) ? pdePtr->charge(idSave) : 0;}
0227 bool isCharged() const {
0228 return (pdePtr != 0) ? (pdePtr->chargeType(idSave) != 0) : false;}
0229 bool isNeutral() const {
0230 return (pdePtr != 0) ? (pdePtr->chargeType(idSave) == 0) : false;}
0231 int colType() const {
0232 return (pdePtr != 0) ? pdePtr->colType(idSave) : 0;}
0233 double m0() const {
0234 return (pdePtr != 0) ? pdePtr->m0() : 0.;}
0235 double mWidth() const {
0236 return (pdePtr != 0) ? pdePtr->mWidth() : 0.;}
0237 double mMin() const {
0238 return (pdePtr != 0) ? pdePtr->mMin() : 0.;}
0239 double mMax() const {
0240 return (pdePtr != 0) ? pdePtr->mMax() : 0.;}
0241 double mSel() const {
0242 return (pdePtr != 0) ? pdePtr->mSel() : 0.;}
0243 double constituentMass() const {
0244 return (pdePtr != 0) ? pdePtr->constituentMass() : 0.;}
0245 double tau0() const {
0246 return (pdePtr != 0) ? pdePtr->tau0() : 0.;}
0247 bool mayDecay() const {
0248 return (pdePtr != 0) ? pdePtr->mayDecay() : false;}
0249 bool canDecay() const {
0250 return (pdePtr != 0) ? pdePtr->canDecay() : false;}
0251 bool doExternalDecay() const {
0252 return (pdePtr != 0) ? pdePtr->doExternalDecay() : false;}
0253 bool isResonance() const {
0254 return (pdePtr != 0) ? pdePtr->isResonance() : false;}
0255 bool isVisible() const {
0256 return (pdePtr != 0) ? pdePtr->isVisible() : false;}
0257 bool isLepton() const {
0258 return (pdePtr != 0) ? pdePtr->isLepton() : false;}
0259 bool isQuark() const {
0260 return (pdePtr != 0) ? pdePtr->isQuark() : false;}
0261 bool isGluon() const {
0262 return (pdePtr != 0) ? pdePtr->isGluon() : false;}
0263 bool isDiquark() const {
0264 return (pdePtr != 0) ? pdePtr->isDiquark() : false;}
0265 bool isParton() const {
0266 return (pdePtr != 0) ? pdePtr->isParton() : false;}
0267 bool isHadron() const {
0268 return (pdePtr != 0) ? pdePtr->isHadron() : false;}
0269 bool isExotic() const {
0270 return (pdePtr != 0) ? pdePtr->isExotic() : false;}
0271 ParticleDataEntry& particleDataEntry() const {return *pdePtr;}
0272
0273
0274 void rescale3(double fac) {pSave.rescale3(fac);}
0275 void rescale4(double fac) {pSave.rescale4(fac);}
0276 void rescale5(double fac) {pSave.rescale4(fac); mSave *= fac;}
0277 void rot(double thetaIn, double phiIn) {pSave.rot(thetaIn, phiIn);
0278 if (hasVertexSave) vProdSave.rot(thetaIn, phiIn);}
0279 void bst(double betaX, double betaY, double betaZ) {
0280 pSave.bst(betaX, betaY, betaZ);
0281 if (hasVertexSave) vProdSave.bst(betaX, betaY, betaZ);}
0282 void bst(double betaX, double betaY, double betaZ, double gamma) {
0283 pSave.bst(betaX, betaY, betaZ, gamma);
0284 if (hasVertexSave) vProdSave.bst(betaX, betaY, betaZ, gamma);}
0285 void bst(const Vec4& pBst) {pSave.bst(pBst);
0286 if (hasVertexSave) vProdSave.bst(pBst);}
0287 void bst(const Vec4& pBst, double mBst) {pSave.bst(pBst, mBst);
0288 if (hasVertexSave) vProdSave.bst(pBst, mBst);}
0289 void bstback(const Vec4& pBst) {pSave.bstback(pBst);
0290 if (hasVertexSave) vProdSave.bstback(pBst);}
0291 void bstback(const Vec4& pBst, double mBst) {pSave.bstback(pBst, mBst);
0292 if (hasVertexSave) vProdSave.bstback(pBst, mBst);}
0293 void rotbst(const RotBstMatrix& M, bool boostVertex = true) {pSave.rotbst(M);
0294 if (hasVertexSave && boostVertex) vProdSave.rotbst(M);}
0295 void offsetHistory( int minMother, int addMother, int minDaughter,
0296 int addDaughter);
0297 void offsetCol( int addCol);
0298
0299 protected:
0300
0301
0302 static const double TINY;
0303
0304
0305 int idSave, statusSave, mother1Save, mother2Save, daughter1Save,
0306 daughter2Save, colSave, acolSave;
0307 Vec4 pSave;
0308 double mSave, scaleSave, polSave;
0309 bool hasVertexSave;
0310 Vec4 vProdSave;
0311 double tauSave;
0312
0313
0314
0315
0316
0317 ParticleDataEntryPtr pdePtr;
0318
0319
0320
0321 Event* evtPtr;
0322
0323 };
0324
0325
0326
0327 double m(const Particle& pp1, const Particle& pp2);
0328 double m2(const Particle& pp1, const Particle& pp2);
0329 double m2(const Particle& pp1, const Particle& pp2, const Particle& pp3);
0330 double dot4(const Particle& pp1, const Particle& pp2);
0331
0332
0333
0334
0335
0336
0337
0338 class Junction {
0339
0340 public:
0341
0342
0343 Junction() : remainsSave(true), kindSave(0), colSave(), endColSave(),
0344 statusSave() { }
0345
0346 Junction( int kindIn, int col0In, int col1In, int col2In)
0347 : remainsSave(true), kindSave(kindIn), colSave(), endColSave(),
0348 statusSave() {
0349 colSave[0] = col0In; colSave[1] = col1In; colSave[2] = col2In;
0350 for (int j = 0; j < 3; ++j) {
0351 endColSave[j] = colSave[j]; } }
0352 Junction(const Junction& ju) : remainsSave(ju.remainsSave),
0353 kindSave(ju.kindSave), colSave(), endColSave(), statusSave() {
0354 for (int j = 0; j < 3; ++j) {
0355 colSave[j] = ju.colSave[j]; endColSave[j] = ju.endColSave[j];
0356 statusSave[j] = ju.statusSave[j]; } }
0357 Junction& operator=(const Junction& ju) {if (this != &ju) {
0358 remainsSave = ju.remainsSave; kindSave = ju.kindSave;
0359 for (int j = 0; j < 3; ++j) { colSave[j] = ju.colSave[j];
0360 endColSave[j] = ju.endColSave[j]; statusSave[j] = ju.statusSave[j]; } }
0361 return *this; }
0362
0363
0364 void remains(bool remainsIn) {remainsSave = remainsIn;}
0365 void col(int j, int colIn) {colSave[j] = colIn; endColSave[j] = colIn;}
0366 void cols(int j, int colIn, int endColIn) {colSave[j] = colIn;
0367 endColSave[j] = endColIn;}
0368 void endCol(int j, int endColIn) {endColSave[j] = endColIn;}
0369 void status(int j, int statusIn) {statusSave[j] = statusIn;}
0370
0371
0372 bool remains() const {return remainsSave;}
0373 int kind() const {return kindSave;}
0374 int col(int j) const {return colSave[j];}
0375 int endCol(int j) const {return endColSave[j];}
0376 int status(int j) const {return statusSave[j];}
0377
0378 private:
0379
0380
0381 bool remainsSave;
0382 int kindSave, colSave[3], endColSave[3], statusSave[3];
0383
0384 };
0385
0386
0387
0388
0389
0390 class HVcols {
0391
0392 public:
0393
0394
0395 HVcols() : iHV(0), colHV(0), acolHV(0) { }
0396 HVcols( int iHVin, int colHVin, int acolHVin) : iHV(iHVin),
0397 colHV(colHVin), acolHV(acolHVin) {}
0398
0399
0400 int iHV, colHV, acolHV;
0401
0402 };
0403
0404
0405
0406
0407
0408 class Event {
0409
0410 public:
0411
0412
0413 Event(int capacity = 100) : startColTag(100), maxColTag(100),
0414 savedSize(0), savedJunctionSize(0), savedHVcolsSize(0),
0415 savedPartonLevelSize(0), scaleSave(0.), scaleSecondSave(0.),
0416 headerList("----------------------------------------"),
0417 particleDataPtr(0) { entry.reserve(capacity); }
0418 Event& operator=(const Event& oldEvent);
0419 Event(const Event& oldEvent) {*this = oldEvent;}
0420
0421
0422 void init( string headerIn = "", ParticleData* particleDataPtrIn = 0,
0423 int startColTagIn = 100) {
0424 headerList.replace(0, headerIn.length() + 2, headerIn + " ");
0425 particleDataPtr = particleDataPtrIn; startColTag = startColTagIn;}
0426
0427
0428 void clear() {entry.resize(0); maxColTag = startColTag;
0429 savedPartonLevelSize = 0; scaleSave = 0.; scaleSecondSave = 0.;
0430 clearJunctions(); clearHV();}
0431 void free() {vector<Particle>().swap(entry); maxColTag = startColTag;
0432 savedPartonLevelSize = 0; scaleSave = 0.; scaleSecondSave = 0.;
0433 clearJunctions(); clearHV();}
0434
0435
0436 void reset() {clear(); append(90, -11, 0, 0, 0., 0., 0., 0., 0.);}
0437
0438
0439 Particle& operator[](int i) {return entry.at(i);}
0440 const Particle& operator[](int i) const {return entry.at(i);}
0441
0442
0443 Particle& front() {return entry.front();}
0444 Particle& at(int i) {return entry.at(i);}
0445 Particle& back() {return entry.back();}
0446 const Particle& front() const {return entry.front();}
0447 const Particle& at(int i) const {return entry.at(i);}
0448 const Particle& back() const {return entry.back();}
0449
0450
0451 vector<Pythia8::Particle>::iterator begin() { return entry.begin(); }
0452 vector<Pythia8::Particle>::iterator end() { return entry.end(); }
0453 vector<Pythia8::Particle>::const_iterator begin() const
0454 { return entry.begin(); }
0455 vector<Pythia8::Particle>::const_iterator end() const
0456 { return entry.end(); }
0457
0458
0459 int size() const {return entry.size();}
0460
0461
0462 int append(Particle entryIn) {
0463 entry.push_back(entryIn); setEvtPtr();
0464 if (entryIn.col() > maxColTag) maxColTag = entryIn.col();
0465 if (entryIn.acol() > maxColTag) maxColTag = entryIn.acol();
0466 return entry.size() - 1;
0467 }
0468 int append(int id, int status, int mother1, int mother2, int daughter1,
0469 int daughter2, int col, int acol, double px, double py, double pz,
0470 double e, double m = 0., double scaleIn = 0., double polIn = 9.) {
0471 entry.push_back( Particle(id, status, mother1, mother2, daughter1,
0472 daughter2, col, acol, px, py, pz, e, m, scaleIn, polIn) ); setEvtPtr();
0473 if (col > maxColTag) maxColTag = col;
0474 if (acol > maxColTag) maxColTag = acol;
0475 return entry.size() - 1;
0476 }
0477 int append(int id, int status, int mother1, int mother2, int daughter1,
0478 int daughter2, int col, int acol, Vec4 p, double m = 0.,
0479 double scaleIn = 0., double polIn = 9.) {
0480 entry.push_back( Particle(id, status, mother1, mother2, daughter1,
0481 daughter2, col, acol, p, m, scaleIn, polIn) ); setEvtPtr();
0482 if (col > maxColTag) maxColTag = col;
0483 if (acol > maxColTag) maxColTag = acol;
0484 return entry.size() - 1;
0485 }
0486
0487
0488 int append(int id, int status, int col, int acol, double px, double py,
0489 double pz, double e, double m = 0., double scaleIn = 0.,
0490 double polIn = 9.) { entry.push_back( Particle(id, status, 0, 0, 0, 0,
0491 col, acol, px, py, pz, e, m, scaleIn, polIn) ); setEvtPtr();
0492 if (col > maxColTag) maxColTag = col;
0493 if (acol > maxColTag) maxColTag = acol;
0494 return entry.size() - 1;
0495 }
0496 int append(int id, int status, int col, int acol, Vec4 p, double m = 0.,
0497 double scaleIn = 0., double polIn = 9.) {entry.push_back( Particle(id,
0498 status, 0, 0, 0, 0, col, acol, p, m, scaleIn, polIn) ); setEvtPtr();
0499 if (col > maxColTag) maxColTag = col;
0500 if (acol > maxColTag) maxColTag = acol;
0501 return entry.size() - 1;
0502 }
0503
0504
0505 void setEvtPtr(int iSet = -1) {if (iSet < 0) iSet = entry.size() - 1;
0506 entry[iSet].setEvtPtr( this);}
0507
0508
0509 int copy(int iCopy, int newStatus = 0);
0510
0511
0512 void list(bool showScaleAndVertex = false,
0513 bool showMothersAndDaughters = false, int precision = 3) const;
0514
0515
0516 void popBack(int nRemove = 1) { if (nRemove ==1) entry.pop_back();
0517 else {int newSize = max( 0, size() - nRemove);
0518 entry.resize(newSize);} }
0519
0520
0521
0522 void remove(int iFirst, int iLast, bool shiftHistory = true);
0523
0524
0525
0526 void restorePtrs() { for (int i = 0; i < size(); ++i) setEvtPtr(i); }
0527
0528
0529 void saveSize() {savedSize = entry.size();}
0530 void restoreSize() {entry.resize(savedSize);}
0531 int savedSizeValue() {return savedSize;}
0532
0533
0534 void initColTag(int colTag = 0) {maxColTag = max( colTag,startColTag);}
0535 int lastColTag() const {return maxColTag;}
0536 int nextColTag() {return ++maxColTag;}
0537
0538
0539 void scale( double scaleIn) {scaleSave = scaleIn;}
0540 double scale() const {return scaleSave;}
0541
0542
0543 void scaleSecond( double scaleSecondIn) {scaleSecondSave = scaleSecondIn;}
0544 double scaleSecond() const {return scaleSecondSave;}
0545
0546
0547
0548 vector<int> daughterList(int i) const {return entry[i].daughterList();}
0549
0550
0551 int nFinal(bool chargedOnly = false) const {
0552 int nFin = 0;
0553 for (int i = 0; i < size(); ++i)
0554 if (entry[i].isFinal() && (!chargedOnly || entry[i].isCharged()))
0555 ++nFin;
0556 return nFin; }
0557
0558
0559 double dyAbs(int i1, int i2) const {
0560 return abs( entry[i1].y() - entry[i2].y() ); }
0561 double detaAbs(int i1, int i2) const {
0562 return abs( entry[i1].eta() - entry[i2].eta() ); }
0563 double dphiAbs(int i1, int i2) const {
0564 double dPhiTmp = abs( entry[i1].phi() - entry[i2].phi() );
0565 if (dPhiTmp > M_PI) dPhiTmp = 2. * M_PI - dPhiTmp;
0566 return dPhiTmp; }
0567 double RRapPhi(int i1, int i2) const {
0568 return sqrt( pow2(dyAbs(i1, i2)) + pow2(dphiAbs(i1, i2)) ); }
0569 double REtaPhi(int i1, int i2) const {
0570 return sqrt( pow2(detaAbs(i1, i2)) + pow2(dphiAbs(i1, i2)) ); }
0571
0572
0573 void rot(double theta, double phi)
0574 {for (int i = 0; i < size(); ++i) entry[i].rot(theta, phi);}
0575 void bst(double betaX, double betaY, double betaZ)
0576 {for (int i = 0; i < size(); ++i) entry[i].bst(betaX, betaY, betaZ);}
0577 void bst(double betaX, double betaY, double betaZ, double gamma)
0578 {for (int i = 0; i < size(); ++i) entry[i].bst(betaX, betaY, betaZ,
0579 gamma);}
0580 void bst(const Vec4& vec)
0581 {for (int i = 0; i < size(); ++i) entry[i].bst(vec);}
0582 void rotbst(const RotBstMatrix& M, bool boostVertices = true)
0583 {for (int i = 0; i < size(); ++i) entry[i].rotbst(M, boostVertices);}
0584
0585
0586 void clearJunctions() {junction.resize(0);}
0587
0588
0589 int appendJunction( int kind, int col0, int col1, int col2)
0590 { junction.push_back( Junction( kind, col0, col1, col2) );
0591 return junction.size() - 1;}
0592 int appendJunction(Junction junctionIn) {junction.push_back(junctionIn);
0593 return junction.size() - 1;}
0594 int sizeJunction() const {return junction.size();}
0595 bool remainsJunction(int i) const {return junction[i].remains();}
0596 void remainsJunction(int i, bool remainsIn) {junction[i].remains(remainsIn);}
0597 int kindJunction(int i) const {return junction[i].kind();}
0598 int colJunction( int i, int j) const {return junction[i].col(j);}
0599 void colJunction( int i, int j, int colIn) {junction[i].col(j, colIn);}
0600 int endColJunction( int i, int j) const {return junction[i].endCol(j);}
0601 void endColJunction( int i, int j, int endColIn)
0602 {junction[i].endCol(j, endColIn);}
0603 int statusJunction( int i, int j) const {return junction[i].status(j);}
0604 void statusJunction( int i, int j, int statusIn)
0605 {junction[i].status(j, statusIn);}
0606 Junction& getJunction(int i) {return junction[i];}
0607 const Junction& getJunction(int i) const {return junction[i];}
0608 void eraseJunction(int i);
0609
0610
0611 void saveJunctionSize() {savedJunctionSize = junction.size();}
0612 void restoreJunctionSize() {junction.resize(savedJunctionSize);}
0613
0614
0615 void listJunctions() const;
0616
0617
0618 bool hasHVcols() const {
0619 for (const HVcols& col: hvCols) {if (at(col.iHV).isFinal()) return true;}
0620 return false;}
0621
0622
0623 void listHVcols() const;
0624 int maxHVcols() const;
0625
0626
0627 void saveHVcolsSize() {savedHVcolsSize = hvCols.size();}
0628 void restoreHVcolsSize() {hvCols.resize(savedHVcolsSize);}
0629
0630
0631 void savePartonLevelSize() {savedPartonLevelSize = entry.size();}
0632
0633
0634
0635 Event& operator+=(const Event& addEvent);
0636
0637
0638 const vector<Particle>* particles() const {return &entry;}
0639
0640 private:
0641
0642
0643 friend class Particle;
0644
0645
0646 static const int IPERLINE;
0647
0648
0649 int startColTag;
0650
0651
0652
0653 vector<Pythia8::Particle> entry;
0654
0655
0656
0657 vector<Pythia8::Junction> junction;
0658
0659
0660
0661 vector<Pythia8::HVcols> hvCols;
0662
0663
0664 bool findIndexHV(int iIn) { if (iIn > 0 && iIn == iEventHV) return true;
0665 for (int i = 0; i < int(hvCols.size()); ++i) if (hvCols[i].iHV == iIn)
0666 {iEventHV = iIn; iIndexHV = i; return true; }
0667 return false; }
0668 int iEventHV, iIndexHV;
0669
0670
0671 void clearHV() {hvCols.resize(0); iEventHV = -1; iIndexHV = -1;}
0672
0673
0674 int maxColTag;
0675
0676
0677 int savedSize, savedJunctionSize, savedHVcolsSize, savedPartonLevelSize;
0678
0679
0680 double scaleSave, scaleSecondSave;
0681
0682
0683 string headerList;
0684
0685
0686
0687 ParticleData* particleDataPtr;
0688
0689 };
0690
0691
0692
0693 }
0694
0695 #endif