diff --git a/PWGLF/Utils/inelGt.h b/PWGLF/Utils/inelGt.h index c2bc77d5756..3c11d92f944 100644 --- a/PWGLF/Utils/inelGt.h +++ b/PWGLF/Utils/inelGt.h @@ -87,6 +87,84 @@ bool isINELgt1mc(TMcParticles particles, pdgDatabase pdgDB) return isINELgtNmc(particles, 1, pdgDB); } +template +struct ParticleCounter { + bool mSelectPrimaries = true; + pdgDatabase* mPdgDatabase; + + template + float countMultInAcceptance(const aod::McParticles& mcParticles) + { + static_assert(etamin < etamax, "etamin must be smaller than etamax"); + float counter = 0; + for (const auto& particle : mcParticles) { + + // primary + if (mSelectPrimaries && !particle.isPhysicalPrimary()) { + continue; + } + + // has pdg + TParticlePDG* p = mPdgDatabase->get()->GetParticle(particle.pdgCode()); + if (!p) { + continue; + } + // is charged + if (abs(p->Charge()) == 0) { + continue; + } + // in acceptance + if (particle.eta() > etamin && particle.eta() < etamax) { + counter++; + } + } + return counter; + } + + template + float countEnergyInAcceptance(const aod::McParticles& mcParticles) + { + static_assert(etamin < etamax, "etamin must be smaller than etamax"); + float counter = 0.f; + for (const auto& particle : mcParticles) { + + // primary + if (mSelectPrimaries && !particle.isPhysicalPrimary()) { + continue; + } + // has pdg + TParticlePDG* p = mPdgDatabase->get()->GetParticle(particle.pdgCode()); + if (!p) { + continue; + } + // is neutral + if constexpr (requireNeutral) { + if (abs(p->Charge()) > 1e-3) + continue; + } else { + if (abs(p->Charge()) <= 1e-3) + continue; + } + // in acceptance + if (particle.eta() > etamin && particle.eta() < etamax) { + counter += particle.e(); + } + } + return counter; + } + + float countFT0A(const aod::McParticles& mcParticles) { return countMultInAcceptance<3.5f, 4.9f>(mcParticles); } + float countFT0C(const aod::McParticles& mcParticles) { return countMultInAcceptance<-3.3f, -2.1f>(mcParticles); } + float countFV0A(const aod::McParticles& mcParticles) { return countMultInAcceptance<2.2f, 5.1f>(mcParticles); } + float countFDDA(const aod::McParticles& mcParticles) { return countMultInAcceptance<4.9f, 6.3f>(mcParticles); } + float countFDDC(const aod::McParticles& mcParticles) { return countMultInAcceptance<-7.f, -4.9f>(mcParticles); } + + float countZNA(const aod::McParticles& mcParticles) { return countEnergyInAcceptance<8.8f, 100.f>(mcParticles); } + float countZNC(const aod::McParticles& mcParticles) { return countEnergyInAcceptance<-100.f, -8.8f>(mcParticles); } + + float countITSIB(const aod::McParticles& mcParticles) { return countMultInAcceptance<-2.f, 2.f>(mcParticles); } +}; + } // namespace pwglf } // namespace o2