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