9 #ifndef RIVET_PARTICLEIDUTILS_HH 10 #define RIVET_PARTICLEIDUTILS_HH 15 #include "Rivet/Tools/ParticleName.hh" 16 #include "Rivet/Math/MathUtils.hh" 27 inline int abspid(
int pid) {
return abs(pid); }
31 enum Location { nj=1, nq3, nq2, nq1, nl, nr, n, n8, n9, n10 };
34 inline unsigned short _digit(Location loc,
int pid) {
36 int numerator = (int) std::pow(10.0, (loc-1));
37 return (abs(pid)/numerator) % 10;
41 inline int _extraBits(
int pid) {
42 return abs(pid)/10000000;
47 inline int _fundamentalID(
int pid) {
48 if (_extraBits(pid) > 0)
return 0;
49 if (_digit(nq2,pid) == 0 && _digit(nq1,pid) == 0) {
50 return abs(pid) % 10000;
51 }
else if (abs(pid) <= 100) {
72 inline bool isNucleus(
int pid) {
74 if (abs(pid) == 2212)
return true;
76 if ((_digit(n10,pid) == 1) && (_digit(n9,pid) == 0)) {
79 if ((abs(pid)/10)%1000 >= (abs(pid)/10000)%1000)
return true;
86 inline int nuclZ(
int pid) {
88 if (abs(pid) == 2212) {
return 1; }
89 if (isNucleus(pid))
return (abs(pid)/10000) % 1000;
94 inline int Z(
int pid) {
return nuclZ(pid); }
98 inline int nuclA(
int pid) {
100 if (abs(pid) == 2212 || abs(pid) == 2112) {
return 1; }
101 if (isNucleus(pid))
return (abs(pid)/10) % 1000;
106 inline int A(
int pid) {
return nuclA(pid); }
110 inline int nuclNlambda(
int pid) {
112 if (abs(pid) == 2212) {
return 0; }
113 if (isNucleus(pid))
return _digit(n8,pid);
118 inline int lambda(
int pid) {
return nuclNlambda(pid); }
127 inline bool isReggeon(
int pid) {
128 return pid == 110 || pid == 990 || pid == 9990;
132 inline bool isMeson(
int pid) {
133 if (_extraBits(pid) > 0)
return false;
135 if (_digit(n,pid) > 0 && _digit(n,pid) < 9)
return false;
136 const int aid = abs(pid);
137 if (aid == 130 || aid == 310 || aid == 210)
return true;
138 if (aid <= 100)
return false;
139 if (_digit(nq1,pid) != 0)
return false;
140 if (_digit(nq2,pid) == 0)
return false;
141 if (_digit(nq3,pid) == 0)
return false;
142 if (_digit(nq2,pid) < _digit(nq3,pid))
return false;
145 if (aid == 150 || aid == 350 || aid == 510 || aid == 530)
return true;
147 if (isReggeon(pid))
return false;
149 if (_digit(nj,pid) > 0 && _digit(nq3,pid) > 0 && _digit(nq2,pid) > 0 && _digit(nq1,pid) == 0) {
150 return !(_digit(nq3,pid) == _digit(nq2,pid) && pid < 0);
156 inline bool isBaryon(
int pid) {
157 if (_extraBits(pid) > 0)
return false;
159 if (_digit(n,pid) > 0 && _digit(n,pid) < 9)
return false;
160 if (abs(pid) <= 100)
return false;
161 if (_fundamentalID(pid) <= 100 && _fundamentalID(pid) > 0)
return false;
162 if (abs(pid) == 2110 || abs(pid) == 2210)
return true;
163 if (_digit(nj,pid) == 0)
return false;
164 if (_digit(nq1,pid) == 0 || _digit(nq2,pid) == 0 || _digit(nq3,pid) == 0)
return false;
175 inline bool isDiquark(
int pid) {
176 if (_extraBits(pid) > 0)
return false;
177 if (abs(pid) <= 100)
return false;
178 if (_fundamentalID(pid) <= 100 && _fundamentalID(pid) > 0)
return false;
179 if (_digit(nq1,pid) == 0)
return false;
180 if (_digit(nq2,pid) == 0)
return false;
181 if (_digit(nq3,pid) != 0)
return false;
182 if (_digit(nq1,pid) < _digit(nq2,pid))
return false;
183 if (_digit(nj,pid) > 0 && _digit(nq3,pid) == 0 && _digit(nq2,pid) > 0 && _digit(nq1,pid) > 0)
return true;
193 inline bool isDiQuark(
int pid) {
return isDiquark(pid); }
196 inline bool isPentaquark(
int pid) {
199 if (_extraBits(pid) > 0)
return false;
200 if (_digit(n,pid) != 9)
return false;
201 if (_digit(nr,pid) == 9 || _digit(nr,pid) == 0)
return false;
202 if (_digit(nj,pid) == 9 || _digit(nl,pid) == 0)
return false;
203 if (_digit(nq1,pid) == 0)
return false;
204 if (_digit(nq2,pid) == 0)
return false;
205 if (_digit(nq3,pid) == 0)
return false;
206 if (_digit(nj,pid) == 0)
return false;
208 if (_digit(nq2,pid) > _digit(nq1,pid))
return false;
209 if (_digit(nq1,pid) > _digit(nl,pid))
return false;
210 if (_digit(nl,pid) > _digit(nr,pid))
return false;
215 inline bool isHadron(
int pid) {
216 if (_extraBits(pid) > 0)
return false;
217 if (isMeson(pid))
return true;
218 if (isBaryon(pid))
return true;
219 if (isPentaquark(pid))
return true;
230 inline bool isLepton(
int pid) {
231 if (_extraBits(pid) > 0)
return false;
232 if (_fundamentalID(pid) >= 11 && _fundamentalID(pid) <= 18)
return true;
237 inline bool isSUSY(
int pid) {
239 if (_extraBits(pid) > 0)
return false;
240 if (_digit(n,pid) != 1 && _digit(n,pid) != 2)
return false;
241 if (_digit(nr,pid) != 0)
return false;
243 if (_fundamentalID(pid) == 0)
return false;
248 inline bool isRhadron(
int pid) {
251 if (_extraBits(pid) > 0)
return false;
252 if (_digit(n,pid) != 1)
return false;
253 if (_digit(nr,pid) != 0)
return false;
255 if (isSUSY(pid))
return false;
257 if (_digit(nq2,pid) == 0)
return false;
258 if (_digit(nq3,pid) == 0)
return false;
259 if (_digit(nj,pid) == 0)
return false;
262 inline bool isRHadron(
int pid) {
return isRhadron(pid); }
265 inline bool isTechnicolor(
int pid) {
266 if (_extraBits(pid) > 0)
return false;
267 return _digit(n,pid) == 3;
271 inline bool isExcited(
int pid) {
272 if (_extraBits(pid) > 0)
return false;
273 return _digit(n,pid) == 4;
277 inline bool isKK(
int pid) {
278 if (_extraBits(pid) > 0)
return false;
279 const int ndigit = _digit(n,pid);
280 return ndigit == 5 || ndigit == 6;
284 inline bool isGraviton(
int pid) {
289 inline bool isBSM(
int pid) {
290 return isSUSY(pid) || isRhadron(pid) || isTechnicolor(pid) ||
291 isExcited(pid) || isKK(pid) || isGraviton(pid);
295 inline bool _isValid(
int pid) {
297 if (_digit(n,pid) == 9 && _digit(nr,pid) == 9)
return true;
299 if (_extraBits(pid) > 0)
return isNucleus(pid);
301 if (isBSM(pid))
return true;
302 if (isHadron(pid))
return true;
303 if (_digit(n,pid) == 9 && _digit(nr,pid) == 0)
return false;
304 if (isDiquark(pid))
return true;
305 if (isReggeon(pid))
return true;
310 return (_fundamentalID(pid) > 0);
312 inline bool isValid(
int pid) {
return _isValid(pid); }
320 inline bool _hasQ(
int pid,
int q) {
321 if (abs(pid) == q)
return true;
322 if (!_isValid(pid))
return false;
323 if (_extraBits(pid) > 0)
return false;
324 if (_fundamentalID(pid) > 0)
return false;
325 return _digit(nq3,pid) == q || _digit(nq2,pid) == q || _digit(nq1,pid) == q;
329 inline bool hasDown(
int pid) {
return _hasQ(pid, 1); }
331 inline bool hasUp(
int pid) {
return _hasQ(pid, 2); }
333 inline bool hasStrange(
int pid) {
return _hasQ(pid, 3); }
335 inline bool hasCharm(
int pid) {
return _hasQ(pid, 4); }
337 inline bool hasBottom(
int pid) {
return _hasQ(pid, 5); }
339 inline bool hasTop(
int pid) {
return _hasQ(pid, 6); }
348 inline int jSpin(
int pid) {
349 const int fund = _fundamentalID(pid);
352 if (fund > 0 && fund < 7)
return 2;
353 if (fund == 9)
return 3;
354 if (fund > 10 && fund < 17)
return 2;
355 if (fund > 20 && fund < 25)
return 3;
357 }
else if (_extraBits(pid) > 0) {
360 return abs(pid) % 10;
364 inline int sSpin(
int pid) {
366 if (!isMeson(pid))
return 0;
367 if (_digit(n,pid) == 9 && _digit(nr,pid) == 0)
return 0;
369 const int fund = _fundamentalID(pid);
370 if (fund == 51 || fund == 54)
return 1;
371 if (fund == 52)
return 2;
372 if (fund == 53 || fund == 55)
return 3;
374 const int inl = _digit(nl,pid);
375 const int js = _digit(nj,pid);
376 if (inl == 0 && js >= 3)
return 1;
377 else if (inl == 0 && js == 1)
return 0;
378 else if (inl == 1 && js >= 3)
return 0;
379 else if (inl == 2 && js >= 3)
return 1;
380 else if (inl == 1 && js == 1)
return 1;
381 else if (inl == 3 && js >= 3)
return 1;
387 inline int lSpin(
int pid) {
389 if (!isMeson(pid))
return 0;
390 if (_digit(n,pid) == 9 && _digit(nr,pid) == 0)
return 0;
392 const int inl = _digit(nl,pid);
393 const int js = _digit(nj,pid);
394 if (inl == 0 && js == 3)
return 0;
395 else if (inl == 0 && js == 5)
return 1;
396 else if (inl == 0 && js == 7)
return 2;
397 else if (inl == 0 && js == 9)
return 3;
398 else if (inl == 0 && js == 1)
return 0;
399 else if (inl == 1 && js == 3)
return 1;
400 else if (inl == 1 && js == 5)
return 2;
401 else if (inl == 1 && js == 7)
return 3;
402 else if (inl == 1 && js == 9)
return 4;
403 else if (inl == 2 && js == 3)
return 1;
404 else if (inl == 2 && js == 5)
return 2;
405 else if (inl == 2 && js == 7)
return 3;
406 else if (inl == 2 && js == 9)
return 4;
407 else if (inl == 1 && js == 1)
return 1;
408 else if (inl == 3 && js == 3)
return 2;
409 else if (inl == 3 && js == 5)
return 3;
410 else if (inl == 3 && js == 7)
return 4;
411 else if (inl == 3 && js == 9)
return 5;
423 inline int charge3(
int pid) {
424 static int ch100[100] = { -1, 2,-1, 2,-1, 2,-1, 2, 0, 0,
425 -3, 0,-3, 0,-3, 0,-3, 0, 0, 0,
426 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
427 0, 0, 0, 3, 0, 0, 3, 0, 0, 0,
428 0, -1, 0, 0, 0, 0, 0, 0, 0, 0,
429 0, 6, 3, 6, 0, 0, 0, 0, 0, 0,
430 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
431 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
432 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
433 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
434 const unsigned short q1 = _digit(nq1,pid);
435 const unsigned short q2 = _digit(nq2,pid);
436 const unsigned short q3 = _digit(nq3,pid);
437 const int ida = abs(pid);
438 const int sid = _fundamentalID(pid);
440 if (ida == 0 || _extraBits(pid) > 0) {
442 }
else if (sid > 0 && sid <= 100) {
443 if (ida == 1000017 || ida == 1000018 || ida == 1000034) charge = 0;
444 else if (ida > 1000050 && ida <= 1000060) charge = 0;
445 else if (ida > 50 && ida <= 60) charge = 0;
446 else if (ida == 5100061 || ida == 5100062) charge = 6;
447 else charge = ch100[sid-1];
448 }
else if (_digit(nj,pid) == 0) {
450 }
else if (isMeson(pid)) {
451 if (q2 == 3 || q2 == 5) {
452 charge = ch100[q3-1] - ch100[q2-1];
454 charge = ch100[q2-1] - ch100[q3-1];
456 }
else if (isDiQuark(pid)) {
457 charge = ch100[q2-1] + ch100[q1-1];
458 }
else if (isBaryon(pid)) {
459 charge = ch100[q3-1] + ch100[q2-1] + ch100[q1-1];
463 if (pid < 0) charge *= -1;
469 inline int threeCharge(
int pid) {
return charge3(pid); }
472 inline int abscharge3(
int pid) {
return std::abs(charge3(pid)); }
475 inline double charge(
int pid) {
return charge3(pid)/3.0; }
478 inline double abscharge(
int pid) {
return abscharge3(pid)/3.0; }
487 inline bool isCharged(
int pid) {
488 return charge3(pid) != 0;
492 inline bool isNeutral(
int pid) {
493 return charge3(pid) == 0;
503 inline bool isQuark(
int pid) {
508 inline bool isGluon(
int pid) {
513 inline bool isParton(
int pid) {
514 return isGluon(pid) || isQuark(pid);
518 inline bool isPhoton(
int pid) {
519 return pid == PHOTON;
523 inline bool isElectron(
int pid) {
524 return abs(pid) == ELECTRON;
528 inline bool isMuon(
int pid) {
529 return abs(pid) == MUON;
533 inline bool isTau(
int pid) {
534 return abs(pid) == TAU;
538 inline bool isChargedLepton(
int pid) {
539 const long apid = abs(pid);
540 return apid == 11 || apid == 13 || apid == 15;
543 inline bool isChLepton(
int pid) {
return isChargedLepton(pid); }
546 inline bool isNeutrino(
int pid) {
547 const long apid = abs(pid);
548 return apid == 12 || apid == 14 || apid == 16;
553 inline bool isWplus(
int pid) {
554 return pid == WPLUSBOSON;
558 inline bool isWminus(
int pid) {
559 return pid == WMINUSBOSON;
563 inline bool isW(
int pid) {
564 return abs(pid) == WPLUSBOSON;
568 inline bool isZ(
int pid) {
569 return pid == Z0BOSON;
573 inline bool isHiggs(
int pid) {
574 return pid == HIGGSBOSON || pid == 26;
587 inline bool isStrange(
int pid) {
return abs(pid) == SQUARK; }
590 inline bool isCharm(
int pid) {
return abs(pid) == CQUARK; }
593 inline bool isBottom(
int pid) {
return abs(pid) == BQUARK; }
596 inline bool isTop(
int pid) {
return abs(pid) == TQUARK; }
605 inline bool isHeavyFlavour(
int pid) {
606 return hasCharm(pid) || hasBottom(pid) || hasTop(pid);
615 inline bool isHeavyParton(
int pid) {
616 return isParton(pid) && isHeavyFlavour(pid);
620 inline bool isLightParton(
int pid) {
621 return isParton(pid) && !isHeavyFlavour(pid);
626 inline bool isHeavyMeson(
int pid) {
627 return isMeson(pid) && isHeavyFlavour(pid);
631 inline bool isHeavyBaryon(
int pid) {
632 return isBaryon(pid) && isHeavyFlavour(pid);
636 inline bool isHeavyHadron(
int pid) {
637 return isHadron(pid) && isHeavyFlavour(pid);
641 inline bool isLightMeson(
int pid) {
642 return isMeson(pid) && !isHeavyFlavour(pid);
646 inline bool isLightBaryon(
int pid) {
647 return isBaryon(pid) && !isHeavyFlavour(pid);
651 inline bool isLightHadron(
int pid) {
652 return isHadron(pid) && !isHeavyFlavour(pid);
657 inline bool isBottomMeson(
int pid) {
658 return hasBottom(pid) && isMeson(pid);
662 inline bool isBottomBaryon(
int pid) {
663 return hasBottom(pid) && isBaryon(pid);
667 inline bool isBottomHadron(
int pid) {
668 return hasBottom(pid) && isHadron(pid);
676 inline bool isCharmMeson(
int pid) {
677 return isMeson(pid) && hasCharm(pid) &&
686 inline bool isCharmBaryon(
int pid) {
687 return isBaryon(pid) && hasCharm(pid) &&
696 inline bool isCharmHadron(
int pid) {
697 return isHadron(pid) && hasCharm(pid) &&
706 inline bool isStrangeMeson(
int pid) {
707 return isMeson(pid) && hasStrange(pid) &&
708 !(hasBottom(pid) || hasCharm(pid));
715 inline bool isStrangeBaryon(
int pid) {
716 return isBaryon(pid) && hasStrange(pid) &&
717 !(hasBottom(pid) || hasCharm(pid));
724 inline bool isStrangeHadron(
int pid) {
725 return isHadron(pid) && hasStrange(pid) &&
726 !(hasBottom(pid) || hasCharm(pid));
736 inline bool isStrongInteracting(
int pid) {
737 return isParton(pid) || isHadron(pid);
741 inline bool isEMInteracting(
int pid) {
742 return isCharged(pid) || isPhoton(pid);
749 inline bool isWeakInteracting(
int pid) {
750 return !isGluon(pid) && !isGraviton(pid);
760 inline bool isGenSpecific(
int pid) {
767 inline bool isResonance(
int pid) {
768 return isW(pid) || isZ(pid) || isHiggs(pid) || isTop(pid);
774 inline bool isTransportable(
int pid) {
776 return isPhoton(pid) || isHadron(pid) || isLepton(pid);
786 inline bool isSameSign(PdgId a, PdgId b) {
return a*b >= 0; }
787 inline bool isOppSign(PdgId a, PdgId b) {
return !isSameSign(a, b); }
788 inline bool isSameFlav(PdgId a, PdgId b) {
return abs(a) == abs(b); }
789 inline bool isOppFlav(PdgId a, PdgId b) {
return !isSameFlav(a, b); }
791 inline bool isOSSF(PdgId a, PdgId b) {
return isOppSign(a, b) && isSameFlav(a, b); }
792 inline bool isSSSF(PdgId a, PdgId b) {
return isSameSign(a, b) && isSameFlav(a, b); }
793 inline bool isOSOF(PdgId a, PdgId b) {
return isOppSign(a, b) && isOppFlav(a, b); }
794 inline bool isSSOF(PdgId a, PdgId b) {
return isSameSign(a, b) && isOppFlav(a, b); }
Definition: ALICE_2010_I880049.cc:13
int abspid(const Particle &p)
Unbound function access to abs PID code.
Definition: ParticleUtils.hh:23
std::enable_if< std::is_arithmetic< N1 >::value &&std::is_arithmetic< N2 >::value &&std::is_arithmetic< N3 >::value, bool >::type in_range(N1 val, N2 low, N3 high)
Boolean function to determine if value is within the given range.
Definition: MathUtils.hh:154
int pid(const Particle &p)
Unbound function access to PID code.
Definition: ParticleUtils.hh:20
std::enable_if< std::is_arithmetic< N1 >::value &&std::is_arithmetic< N2 >::value &&std::is_arithmetic< N3 >::value, bool >::type in_closed_range(N1 val, N2 low, N3 high)
Boolean function to determine if value is within the given range.
Definition: MathUtils.hh:164