Skip to content
Snippets Groups Projects

Add some RHadrons functions to the TruthUtils

Merged Andrii Verbytskyi requested to merge averbyts/athena:rhadrons into main
Files
6
@@ -266,7 +266,7 @@ template<> inline bool isHiddenValley(const int& p){ auto value_digits = Decoded
/// PDG rule 4
/// Diquarks have 4-digit numbers with nq1 >= nq2 and nq3 = 0
/// APID: the diquarks with top or fourth generation are not diquarks
/// APID: the diquarks with fourth generation are not diquarks
template<> inline bool isDiquark(const DecodedPID& p){
if ( p.ndigits() == 4 && p(0) >= p(1) && p(2) == 0 && p.last() % 2 == 1
&& p.max_digit(1,3) <= 6
@@ -500,7 +500,10 @@ template<> inline int charge3(const DecodedPID& p) {
if (!classified && isTetraquark(p)){ return triple_charge.at(p(3)) + triple_charge.at(p(4)) - triple_charge.at(p(6)) - triple_charge.at(p(7)); }
if (!classified && isPentaquark(p)){ return triple_charge.at(p(3)) + triple_charge.at(p(4)) + triple_charge.at(p(5)) + triple_charge.at(p(6)) - triple_charge.at(p(7)); }
if (!classified && isNucleus(p)) { classified = true; nq=0; result = 3*(p(3)*100 + p(4)*10 + p(5)) + (-1)*p(2);}
if (!classified && isSUSY(p)) { nq=0; auto apsusy = ap%1000000; if (apsusy < TABLESIZE ) return p.pid() > 0 ? triple_charge.at(apsusy) : -triple_charge.at(apsusy); }
if (!classified && isSUSY(p)) { nq = 0;
auto pp = p.shift(1); if (pp.ndigits() > 2) pp = pp.shift(1);
return charge3(pp);
}
for (auto r = p.second.rbegin() + 1; r != p.second.rbegin() + 1 + nq; ++r) {
result += triple_charge.at(*r)*sign;
sign*=signmult;
@@ -521,4 +524,94 @@ template<class T> inline bool isStrongInteracting(const T& p){return isStrongInt
template<> inline bool isStrongInteracting(const int& p) { return (isGluon(p) || isQuark(p) || isDiquark(p) || isLeptoQuark(p) || isHadron(p));}
template<class T> inline bool isParton(const T& p) { return isQuark(p)||isGluon(p);}
namespace SUSY {
static const int SUSYGLUONCODE = 9;
template<class T> inline bool isRGlueball(const T& p) { return isRGlueball(p->pdg_id()); }
template<> inline bool isRGlueball(const DecodedPID& p) {
auto pp = p.shift(1).shift(1);
size_t ng = 0;
for (size_t i = 1; i + 1 < pp.ndigits(); ++i) {
if (pp(i) == SUSYGLUONCODE) ng++;
}
return p(1) == 9 && p(2) == 9 && p.ndigits() == 7 && ng > 0;
}
template<> inline bool isRGlueball(const int& p) { auto value_digits = DecodedPID(p); return isRGlueball(p); }
template<class T> inline bool isRHadron(const T& p) { return isRHadron(p->pdg_id()); }
template<> inline bool isRHadron(const DecodedPID& p){ auto pp = p.shift(1); if ( pp(1) == 7 || pp(1) == 8 ) return false; if (pp.ndigits() > 2) pp = pp.shift(1); return isSUSY(p) && (isHadron(pp) || isRGlueball(p));}
template<> inline bool isRHadron(const int& p){ auto value_digits = DecodedPID(p); return isRHadron(value_digits);}
template<class T> inline bool isRMeson(const T& p) { return isRMeson(p->pdg_id()); }
template<> inline bool isRMeson(const DecodedPID& p){ auto pp = p.shift(1); if ( pp(1) == 7 || pp(1) == 8 ) return false; if (pp.ndigits() > 2) pp = pp.shift(1); return isSUSY(p) && isMeson(pp);}
template<> inline bool isRMeson(const int& p){ auto value_digits = DecodedPID(p); return isRMeson(value_digits);}
template<class T> inline bool isRBaryon(const T& p) { return isRBaryon(p->pdg_id()); }
template<> inline bool isRBaryon(const DecodedPID& p){ auto pp = p.shift(1); if ( pp(1) == 7 || pp(1) == 8 ) return false; if (pp.ndigits() > 2) pp = pp.shift(1); return isSUSY(p) && isBaryon(pp);}
template<> inline bool isRBaryon(const int& p){ auto value_digits = DecodedPID(p); return isRBaryon(value_digits);}
template<class T> inline bool isRBottomHadron(const T& p) { return isRBottomHadron(p->pdg_id()); }
template<> inline bool isRBottomHadron(const DecodedPID& p){ auto pp = p.shift(1); if ( pp(1) == 7 || pp(1) == 8 ) return false; if (pp.ndigits() > 2) pp = pp.shift(1); return isSUSY(p) && isBottomHadron(pp);}
template<> inline bool isRBottomHadron(const int& p){ auto value_digits = DecodedPID(p); return isRBottomHadron(value_digits);}
template<class T> inline bool isRTopHadron(const T& p) { return isRTopHadron(p->pdg_id()); }
template<> inline bool isRTopHadron(const DecodedPID& p){ auto pp = p.shift(1); if ( pp(1) == 7 || pp(1) == 8 ) return false; if (pp.ndigits() > 2) pp = pp.shift(1); return isSUSY(p) && isTopHadron(pp);}
template<> inline bool isRTopHadron(const int& p){ auto value_digits = DecodedPID(p); return isRTopHadron(value_digits);}
template<class T> inline bool isSLepton(const T& p) { return isSLepton(p->pdg_id()); }
template<> inline bool isSLepton(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isLepton(pp);}
template<> inline bool isSLepton(const int& p){ auto value_digits = DecodedPID(p); return isSLepton(value_digits);}
template<class T> inline bool isSTopHadron(const T& p) { return isSTopHadron(p->pdg_id()); }
template<> inline bool isSTopHadron(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isTopHadron(pp);}
template<> inline bool isSTopHadron(const int& p){ auto value_digits = DecodedPID(p); return isSTopHadron(value_digits);}
template<class T> inline bool isSBaryon(const T& p) { return isSBaryon(p->pdg_id()); }
template<> inline bool isSBaryon(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isBaryon(pp);}
template<> inline bool isSBaryon(const int& p){ auto value_digits = DecodedPID(p); return isSBaryon(value_digits);}
template<class T> inline bool isSMeson(const T& p) { return isSMeson(p->pdg_id()); }
template<> inline bool isSMeson(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isMeson(pp);}
template<> inline bool isSMeson(const int& p){ auto value_digits = DecodedPID(p); return isSMeson(value_digits);}
template<class T> inline bool isSBottomHadron(const T& p) { return isSBottomHadron(p->pdg_id()); }
template<> inline bool isSBottomHadron(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isBottomHadron(pp);}
template<> inline bool isSBottomHadron(const int& p){ auto value_digits = DecodedPID(p); return isSBottomHadron(value_digits);}
template<class T> inline bool isSTopMeson(const T& p) { return isSTopMeson(p->pdg_id()); }
template<> inline bool isSTopMeson(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isTopMeson(pp);}
template<> inline bool isSTopMeson(const int& p){ auto value_digits = DecodedPID(p); return isSTopMeson(value_digits);}
template<class T> inline bool isSBottomMeson(const T& p) { return isSBottomMeson(p->pdg_id()); }
template<> inline bool isSBottomMeson(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isBottomMeson(pp);}
template<> inline bool isSBottomMeson(const int& p){ auto value_digits = DecodedPID(p); return isSBottomMeson(value_digits);}
template<class T> inline bool isSTopBaryon(const T& p) { return isSTopBaryon(p->pdg_id()); }
template<> inline bool isSTopBaryon(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isTopBaryon(pp);}
template<> inline bool isSTopBaryon(const int& p){ auto value_digits = DecodedPID(p); return isSTopBaryon(value_digits);}
template<class T> inline bool isSBottomBaryon(const T& p) { return isSBottomBaryon(p->pdg_id()); }
template<> inline bool isSBottomBaryon(const DecodedPID& p){ auto pp = p.shift(1); return isSUSY(p) && isBottomBaryon(pp);}
template<> inline bool isSBottomBaryon(const int& p){ auto value_digits = DecodedPID(p); return isSBottomBaryon(value_digits);}
template<class T> inline bool spin(const T& p) { return spin(p->pdg_id()); }
template<> inline bool spin(const int& p) { return p%10; }
inline std::vector<int> containedQuarks(int p) {
auto pp = DecodedPID(p);
if (isSUSY(pp)) {
pp = pp.shift(1);
if (pp.ndigits() > 2) pp = pp.shift(1);
}
std::vector<int> quarks;
for (int i = 1; i<=6; ++i)
if (hasQuark(pp, i)) quarks.push_back(i);
return quarks;
}
}
#endif
Loading