File indexing completed on 2025-12-17 09:21:20
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include "TrksInJetQAInJetFiller.h"
0014
0015
0016
0017
0018
0019
0020 void TrksInJetQAInJetFiller::Fill(PHCompositeNode* topNode)
0021 {
0022 GetNodes(topNode);
0023
0024 FillJetAndTrackQAHists(topNode);
0025 }
0026
0027
0028
0029
0030
0031
0032 void TrksInJetQAInJetFiller::GetNode(const int node, PHCompositeNode* topNode)
0033 {
0034
0035
0036 switch (node)
0037 {
0038 case Node::Flow:
0039 m_flowStore = findNode::getClass<ParticleFlowElementContainer>(topNode, "ParticleFlowElements");
0040 if (!m_flowStore)
0041 {
0042 std::cerr << PHWHERE << ": PANIC: Couldn't grab particle flow container from node tree!" << std::endl;
0043 assert(m_flowStore);
0044 }
0045 break;
0046 default:
0047 std::cerr << PHWHERE << ": WARNING: trying to grab unkown additional node..." << std::endl;
0048 break;
0049 }
0050 }
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 void TrksInJetQAInJetFiller::FillJetAndTrackQAHists(PHCompositeNode* topNode)
0067 {
0068
0069 for (
0070 uint64_t iJet = 0;
0071 iJet < m_jetMap->size();
0072 ++iJet)
0073 {
0074
0075 Jet* jet = m_jetMap->get_jet(iJet);
0076 m_trksInJet.clear();
0077
0078
0079 GetCstTracks(jet, topNode);
0080 GetNonCstTracks(jet);
0081
0082
0083 if (m_config.doJetQA)
0084 {
0085 m_jetManager->GetInfo(jet, m_trksInJet);
0086 }
0087
0088
0089 for (SvtxTrack* track : m_trksInJet)
0090 {
0091
0092 if (m_config.doTrackQA)
0093 {
0094 m_trackManager->GetInfo(track, jet);
0095 }
0096
0097
0098 if (m_config.doClustQA || m_config.doHitQA)
0099 {
0100 FillClustAndHitQAHists(track);
0101 }
0102 }
0103 }
0104 }
0105
0106
0107
0108
0109 void TrksInJetQAInJetFiller::FillClustAndHitQAHists(SvtxTrack* track)
0110 {
0111
0112 for (auto clustKey : ClusKeyIter(track))
0113 {
0114
0115 if (m_config.doClustQA)
0116 {
0117 m_clustManager->GetInfo(
0118 m_clustMap->findCluster(clustKey),
0119 clustKey,
0120 m_actsGeom);
0121 }
0122
0123
0124 if (m_config.doHitQA)
0125 {
0126
0127 TrkrDefs::hitsetkey setKey = TrkrDefs::getHitSetKeyFromClusKey(clustKey);
0128 TrkrHitSet* set = m_hitMap->findHitSet(setKey);
0129 if (!set || !(set->size() > 0))
0130 {
0131 return;
0132 }
0133
0134
0135 TrkrHitSet::ConstRange hits = set->getHits();
0136 for (
0137 TrkrHitSet::ConstIterator itHit = hits.first;
0138 itHit != hits.second;
0139 ++itHit)
0140 {
0141
0142 TrkrDefs::hitkey hitKey = itHit->first;
0143 TrkrHit* hit = itHit->second;
0144
0145
0146 m_hitManager->GetInfo(hit, setKey, hitKey);
0147
0148 }
0149 }
0150 }
0151 }
0152
0153
0154
0155
0156 void TrksInJetQAInJetFiller::GetCstTracks(Jet* jet, PHCompositeNode* topNode)
0157 {
0158
0159 auto csts = jet->get_comp_vec();
0160 for (auto& cst : csts)
0161 {
0162
0163 const uint32_t src = cst.first;
0164 if (IsCstNotRelevant(src))
0165 {
0166 continue;
0167 }
0168
0169
0170 if (src == Jet::SRC::TRACK)
0171 {
0172 m_trksInJet.push_back(m_trkMap->get(cst.second));
0173 }
0174
0175
0176 if (src == Jet::SRC::PARTICLE)
0177 {
0178 TrksInJetQADefs::PFObject* pfo = GetPFObject(cst.second, topNode);
0179 SvtxTrack* track = GetTrkFromPFO(pfo);
0180 if (track)
0181 {
0182 m_trksInJet.push_back(track);
0183 }
0184 }
0185 }
0186 }
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197 void TrksInJetQAInJetFiller::GetNonCstTracks(Jet* jet)
0198 {
0199
0200 for (auto& itTrk : *m_trkMap)
0201 {
0202
0203 SvtxTrack* track = itTrk.second;
0204
0205
0206 if (IsTrkInList(track->get_id()))
0207 {
0208 continue;
0209 }
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 const double dr = GetTrackJetDist(track, jet);
0221 if (dr < m_config.rJet)
0222 {
0223 m_trksInJet.push_back(track);
0224 }
0225 }
0226 }
0227
0228
0229
0230
0231 bool TrksInJetQAInJetFiller::IsCstNotRelevant(const uint32_t type)
0232 {
0233 const bool isVoid = (type == Jet::SRC::VOID);
0234 const bool isImport = (type == Jet::SRC::HEPMC_IMPORT);
0235 const bool isProbe = (type == Jet::SRC::JET_PROBE);
0236 return (isVoid || isImport || isProbe);
0237 }
0238
0239
0240
0241
0242 bool TrksInJetQAInJetFiller::IsTrkInList(const uint32_t id)
0243 {
0244 bool isAdded = false;
0245 for (SvtxTrack* trkInJet : m_trksInJet)
0246 {
0247 if (id == trkInJet->get_id())
0248 {
0249 isAdded = true;
0250 break;
0251 }
0252 }
0253 return isAdded;
0254 }
0255
0256
0257
0258
0259 double TrksInJetQAInJetFiller::GetTrackJetDist(SvtxTrack* track, Jet* jet)
0260 {
0261
0262 const double dEta = (track->get_eta()) - (jet->get_eta());
0263
0264
0265 double dPhi = (track->get_phi()) - (jet->get_phi());
0266 if (dPhi < (-1. * M_PI))
0267 {
0268 dPhi += 2. * M_PI;
0269 }
0270 if (dPhi > (1. * M_PI))
0271 {
0272 dPhi -= 2. * M_PI;
0273 }
0274
0275
0276 return std::hypot(dEta, dPhi);
0277
0278 }
0279
0280
0281
0282
0283 TrksInJetQADefs::PFObject* TrksInJetQAInJetFiller::GetPFObject(const uint32_t id,
0284 PHCompositeNode* topNode)
0285 {
0286
0287 TrksInJetQADefs::PFObject* pfoToFind = nullptr;
0288
0289
0290 if (!m_flowStore)
0291 {
0292 GetNode(Node::Flow, topNode);
0293 }
0294
0295
0296 for (
0297 ParticleFlowElementContainer::ConstIterator itFlow = m_flowStore->getParticleFlowElements().first;
0298 itFlow != m_flowStore->getParticleFlowElements().second;
0299 ++itFlow)
0300 {
0301
0302 TrksInJetQADefs::PFObject* pfo = itFlow->second;
0303
0304
0305 if (id == pfo->get_id())
0306 {
0307 pfoToFind = pfo;
0308 break;
0309 }
0310 }
0311 return pfoToFind;
0312 }
0313
0314
0315
0316
0317 SvtxTrack* TrksInJetQAInJetFiller::GetTrkFromPFO(TrksInJetQADefs::PFObject* pfo)
0318 {
0319
0320 SvtxTrack* track = nullptr;
0321
0322
0323 const auto type = pfo->get_type();
0324 if (
0325 (type == ParticleFlowElement::PFLOWTYPE::MATCHED_CHARGED_HADRON) ||
0326 (type == ParticleFlowElement::PFLOWTYPE::UNMATCHED_CHARGED_HADRON))
0327 {
0328 track = pfo->get_track();
0329 }
0330 return track;
0331 }
0332
0333