10std::pair<ParticleType, ParticleOrigin>
17 if (info) info->genPart = genPart;
18 if (!genPart)
return std::make_pair(parttype, partorig);
23std::pair<ParticleType, ParticleOrigin>
35 return std::make_pair(parttype, partorig);
43 ATH_MSG_WARNING(
"Forward Electron classification using extrapolation to Calo is available only in Athena , check your enviroment. ");
47 if (info) info->genPart = genPart;
48 if (!genPart)
return std::make_pair(parttype, partorig);
53std::pair<ParticleType, ParticleOrigin>
60 if (!clus)
return std::make_pair(parttype, partorig);
61 if (std::fabs(clus->
eta()) > 10.0 || std::fabs(clus->
phi()) > 6.28 || (clus->
et()) <= 0.)
return std::make_pair(parttype, partorig);
64 if (VxCvPtr !=
nullptr) {
66 if (itrk > 1)
continue;
68 if (!trkPtr)
continue;
72 info->cnvPhotTrkPtr.push_back(trkPtr);
73 info->cnvPhotTrkToTruthPart.push_back(thePart);
74 info->cnvPhotPartType.push_back(classif.first);
75 info->cnvPhotPartOrig.push_back(classif.second);
84 ATH_MSG_WARNING(
"Photon Classification using extrapolation to Calo is available only in Athena , check your enviroment. ");
86 if (!genPart)
return std::make_pair(parttype, partorig);
87 if (info) info->genPart = genPart;
92std::pair<ParticleType, ParticleOrigin>
100 if (!trkPtr)
return std::make_pair(parttype, partorig);
103 if (!genPart)
return std::make_pair(parttype, partorig);
104 if (info) info->genPart = genPart;
109std::pair<ParticleType, ParticleOrigin>
112 ATH_MSG_DEBUG(
"Executing egamma photon Classifier with cluster Input");
115 if (!clus)
return std::make_pair(parttype, partorig);
116 if (std::fabs(clus->
eta()) > 10.0 || std::fabs(clus->
phi()) >
M_PI || (clus->
et()) <= 0.)
return std::make_pair(parttype, partorig);
121 ATH_MSG_WARNING(
"Cluster Classification using extrapolation to Calo is available only in Athena , check your enviroment. ");
123 if (!genPart)
return std::make_pair(parttype, partorig);
125 if (info)
info->genPart = genPart;
129std::pair<ParticleType, ParticleOrigin>
136 std::set<const xAOD::TruthParticle*> allJetMothers;
137 std::set<const xAOD::TruthParticle*> constituents;
138 if (!
jet)
return std::make_pair(parttype, partorig);
139 allJetMothers.clear();
140 constituents.clear();
145 for (
const auto& thePart: constituents) {
151 if (tempparttype !=
Hadron)
continue;
159 if (parttype !=
BJet) parttype =
CJet;
163 if (parttype !=
BJet && parttype !=
CJet) parttype =
LJet;
170 allJetMothers.clear();
171 constituents.clear();
173 return std::make_pair(parttype, partorig);
181 if (!trk)
return nullptr;
183 info->deltaRMatch = -999.;
184 info->deltaPhi = -999.;
185 info->probTrkToTruth = 0;
186 info->numOfSiHits = 0;
189 uint8_t NumOfPixHits = 0;
190 uint8_t NumOfSCTHits = 0;
193 static const SG::AuxElement::Accessor<TruthLink_t> tPL(
"truthParticleLink");
194 if (!tPL.isAvailable(*trk)) {
195 ATH_MSG_DEBUG(
"Track particle is not associated to truth particle");
199 const auto& truthLink = tPL(*trk);
200 if (!truthLink.isValid()) {
206 if (!theGenParticle) {
212 static const SG::AuxElement::Accessor<float> tMP(
"truthMatchProbability");
213 if (tMP.isAvailable(*trk)) {
214 info->probTrkToTruth = tMP(*trk);
220 if (theGenParticle->
status() == 3) {
233 if (EndVrtx !=
nullptr) {
236 theGenPartTmp =
nullptr;
238 if (!theDaugt)
continue;
239 if (theDaugt->pdgId() == theGenParticle->
pdgId()) theGenPartTmp = theDaugt;
240 if (theDaugt->pdgId() != theGenParticle->
pdgId() && !
MC::isPhoton(theDaugt)) theGenPartTmp =
nullptr;
247 EndVrtx = theGenPartTmp ? theGenPartTmp->
decayVtx() :
nullptr;
248 }
while (theGenPartTmp && theGenPartTmp->
pdgId() == theGenParticle->
pdgId() &&
MC::isDecayed(theGenPartTmp) && EndVrtx !=
nullptr);
250 if (theGenPartTmp && theGenPartTmp->
pdgId() == theGenParticle->
pdgId()) theGenParticle = theGenPartTmp;
257 uint8_t NumOfSiHits = NumOfSCTHits + NumOfPixHits;
260 float deteta =
detEta(theGenParticle->
eta(), trk->
eta());
261 float deltaRMatch = std::hypot(
deltaPhi, deteta);
263 (NumOfSiHits <= m_NumOfSiHitsCut && deltaPhi >
m_deltaPhiMatchCut)) theGenParticle =
nullptr;
266 info->deltaRMatch = deltaRMatch;
268 info->numOfSiHits = NumOfSiHits;
271 return (theGenParticle);
275 std::set<const xAOD::TruthParticle*>& constituents,
283 if (!truthParticleContainerReadHandle.
isValid()) {
284 ATH_MSG_WARNING(
" Invalid ReadHandle for xAOD::TruthParticleContainer with key: " << truthParticleContainerReadHandle.
key());
287 ATH_MSG_DEBUG(
"xAODTruthParticleContainer with key " << truthParticleContainerReadHandle.
key() <<
" has valid ReadHandle ");
289 for (
const auto *
const thePart : *truthParticleContainerReadHandle) {
292 constituents.insert(thePart);
298 for (
const auto *particle0 :
vec) {
301 constituents.insert(thePart);
308 std::set<const xAOD::TruthParticle*> constituents;
309 std::set<const xAOD::TruthParticle*> daughters;
310 std::set<const xAOD::TruthParticle*> intersect;
314 if (daughters.empty()) daughters.insert(thePart);
316 std::set_intersection(constituents.begin(),
320 std::inserter(intersect, intersect.begin()));
322 if (nparts)
return 1.0*intersect.size() / daughters.size();
325 for (
const auto *daughter : daughters) { tot += daughter->pt();}
326 for (
const auto *particle : intersect) { frac += particle->pt();}
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_MSG_WARNING(x)
std::vector< size_t > vec
ElementLink< xAOD::TruthParticleContainer > TruthLink_t
ElementLink implementation for ROOT usage.
double fracParticleInJet(const xAOD::TruthParticle *, const xAOD::Jet *, bool DR, bool nparts) const
virtual const xAOD::TruthParticle * egammaClusMatch(const xAOD::CaloCluster *, bool, MCTruthPartClassifier::Info *info) const override final
double detEta(double x, double y) const
virtual std::pair< MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin > particleTruthClassifier(const xAOD::TruthParticle *, MCTruthPartClassifier::Info *info=nullptr) const override final
void findJetConstituents(const xAOD::Jet *, std::set< const xAOD::TruthParticle * > &constituents, bool DR) const
double detPhi(double x, double y) const
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_truthParticleContainerKey
virtual const xAOD::TruthParticle * getGenPart(const xAOD::TrackParticle *, MCTruthPartClassifier::Info *info=nullptr) const override final
virtual bool isValid() override final
Can the handle be successfully dereferenced?
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
uint16_t author(uint16_t bitmask=EgammaParameters::AuthorALL) const
Get author.
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
const xAOD::TrackParticle * trackParticle(size_t index=0) const
Pointer to the xAOD::TrackParticle/s that match the electron candidate.
A vector of jet constituents at the scale used during jet finding.
const xAOD::Vertex * vertex(size_t index=0) const
Pointer to the xAOD::Vertex/es that match the photon candidate.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
int status() const
Status code.
int pdgId() const
PDG ID code.
const TruthVertex_v1 * decayVtx() const
The decay vertex of this particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
std::vector< const TruthParticle * > particles_out() const
Get the outgoing particles.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
ParticleOrigin defJetOrig(const T &allJetMothers)
ParticleType defTypeOfHadron(int pdg)
bool isPhoton(const T &p)
bool isElectron(const T &p)
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
void findParticleAncestors(T thePart, std::set< T > &allancestors)
Function to find all ancestors of the particle.
bool isDecayed(const T &p)
Identify if the particle decayed.
void findParticleStableDescendants(T thePart, std::set< T > &allstabledescendants)
Function to get the particle stable MC daughters.
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
const uint16_t AuthorFwdElectron
Electron reconstructed by the Forward cluster-based algorithm.
Jet_v1 Jet
Definition of the current "jet version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TruthVertex_v1 TruthVertex
Typedef to implementation.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TruthParticle_v1 TruthParticle
Typedef to implementation.
Muon_v1 Muon
Reference the current persistent version:
Photon_v1 Photon
Definition of the current "egamma version".
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Electron_v1 Electron
Definition of the current "egamma version".