Project
Loading...
Searching...
No Matches
MatchGlobalFwdAssessment.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13#include "Framework/InputSpec.h"
16#include <TPaveText.h>
17#include <TLegend.h>
18#include <TStyle.h>
19#include <TFile.h>
20#include <TGraph.h>
21
22using namespace o2::globaltracking;
23
24//__________________________________________________________
25void GloFwdAssessment::init(bool finalizeAnalysis)
26{
27 mFinalizeAnalysis = finalizeAnalysis;
29}
30
31//__________________________________________________________
33{
34
35 mTrackNumberOfClusters->Reset();
36 mTrackInvQPt->Reset();
37 mTrackChi2->Reset();
38 mTrackCharge->Reset();
39 mTrackPhi->Reset();
40 mTrackEta->Reset();
41 for (auto minNClusters : sMinNClustersList) {
42 auto nHisto = minNClusters - sMinNClustersList[0];
43 mTrackEtaNCls[nHisto]->Reset();
44 mTrackPhiNCls[nHisto]->Reset();
45 mTrackXYNCls[nHisto]->Reset();
46 mTrackEtaPhiNCls[nHisto]->Reset();
47 }
48
49 mTrackCotl->Reset();
50
51 if (mUseMC) {
52 mPairables.clear();
53 mTrueTracksMap.clear();
54 mPairableTracksMap.clear();
55
56 mHistPhiRecVsPhiGen->Reset();
57 mHistEtaRecVsEtaGen->Reset();
58 for (int trackType = 0; trackType < kNumberOfTrackTypes; trackType++) {
59 mHistPhiVsEta[trackType]->Reset();
60 mHistPtVsEta[trackType]->Reset();
61 mHistPhiVsPt[trackType]->Reset();
62 mHistZvtxVsEta[trackType]->Reset();
63 if (trackType == kGen || trackType == kPairable) {
64 mHistRVsZ[trackType]->Reset();
65 }
66 }
67
68 auto hC = mChargeMatchEff->GetCopyTotalHisto();
69 hC->Reset();
70 mChargeMatchEff->SetTotalHistogram(*hC, "");
71 mChargeMatchEff->SetPassedHistogram(*hC, "");
72
73 mPairingEtaPt->Reset();
74 mTruePairingEtaPt->Reset();
75 for (auto& h : mTH3Histos) {
76 h->Reset();
77 }
78 }
79}
80
81//__________________________________________________________
83{
84
85 // Creating data-only histos
86 mTrackNumberOfClusters = std::make_unique<TH1F>("mGlobalFwdNumberOfMFTClusters",
87 "Number Of Clusters Per Track; # clusters; # entries", 10, 0.5, 10.5);
88
89 mTrackInvQPt = std::make_unique<TH1F>("mGlobalFwdInvQPt", "Track q/p_{T}; q/p_{T} [1/GeV]; # entries", 100, -5, 5);
90
91 mTrackChi2 = std::make_unique<TH1F>("mGlobalFwdChi2", "Track #chi^{2}; #chi^{2}; # entries", 202, -0.5, 100.5);
92
93 mTrackCharge = std::make_unique<TH1F>("mGlobalFwdCharge", "Track Charge; q; # entries", 3, -1.5, 1.5);
94
95 mTrackPhi = std::make_unique<TH1F>("mGlobalFwdPhi", "Track #phi; #phi; # entries", 100, -3.2, 3.2);
96
97 mTrackEta = std::make_unique<TH1F>("mGlobalFwdEta", "Track #eta; #eta; # entries", 50, -4, -2);
98
99 for (auto minNClusters : sMinNClustersList) {
100 auto nHisto = minNClusters - sMinNClustersList[0];
101 mTrackEtaNCls[nHisto] = std::make_unique<TH1F>(Form("mGlobalFwdEta_%d_MinClusters", minNClusters), Form("Track #eta (NCls >= %d); #eta; # entries", minNClusters), 50, -4, -2);
102
103 mTrackPhiNCls[nHisto] = std::make_unique<TH1F>(Form("mGlobalFwdPhi_%d_MinClusters", minNClusters), Form("Track #phi (NCls >= %d); #phi; # entries", minNClusters), 100, -3.2, 3.2);
104
105 mTrackXYNCls[nHisto] = std::make_unique<TH2F>(Form("mGlobalFwdXY_%d_MinClusters", minNClusters), Form("Track Position (NCls >= %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16);
106 mTrackXYNCls[nHisto]->SetOption("COLZ");
107
108 mTrackEtaPhiNCls[nHisto] = std::make_unique<TH2F>(Form("mGlobalFwdEtaPhi_%d_MinClusters", minNClusters), Form("Track #eta , #phi (NCls >= %d); #eta; #phi", minNClusters), 50, -4, -2, 100, -3.2, 3.2);
109 mTrackEtaPhiNCls[nHisto]->SetOption("COLZ");
110 }
111
112 mTrackCotl = std::make_unique<TH1F>("mGlobalFwdCotl", "Track cot #lambda; cot #lambda; # entries", 100, -0.25, 0);
113
114 // Creating MC-based histos
115 if (mUseMC) {
116
117 LOG(info) << "Initializing MC Reader";
118 if (!mcReader.initFromDigitContext("collisioncontext.root")) {
119 throw std::invalid_argument("initialization of MCKinematicsReader failed");
120 }
121
122 mHistPhiRecVsPhiGen = std::make_unique<TH2F>("mGMTrackPhiRecVsPhiGen", "Phi Rec Vs Phi Gen of true reco tracks ", 24, -TMath::Pi(), TMath::Pi(), 24, -TMath::Pi(), TMath::Pi());
123 mHistPhiRecVsPhiGen->SetXTitle((std::string("#phi of ") + mNameOfTrackTypes[kGen]).c_str());
124 mHistPhiRecVsPhiGen->SetYTitle((std::string("#phi of ") + mNameOfTrackTypes[kRecoTrue]).c_str());
125 mHistPhiRecVsPhiGen->Sumw2();
126 mHistPhiRecVsPhiGen->SetOption("COLZ");
127
128 mHistEtaRecVsEtaGen = std::make_unique<TH2F>("mGMTrackEtaRecVsEtaGen", "Eta Rec Vs Eta Gen of true reco tracks ", 35, 1.0, 4.5, 35, 1.0, 4.5);
129 mHistEtaRecVsEtaGen->SetXTitle((std::string("#eta of ") + mNameOfTrackTypes[kGen]).c_str());
130 mHistEtaRecVsEtaGen->SetYTitle((std::string("#eta of ") + mNameOfTrackTypes[kRecoTrue]).c_str());
131 mHistEtaRecVsEtaGen->Sumw2();
132 mHistEtaRecVsEtaGen->SetOption("COLZ");
133
134 for (int trackType = 0; trackType < kNumberOfTrackTypes; trackType++) {
135 // mHistPhiVsEta
136 mHistPhiVsEta[trackType] = std::make_unique<TH2F>((std::string("mGMTrackPhiVsEta") + mNameOfTrackTypes[trackType]).c_str(), (std::string("Phi Vs Eta of ") + mNameOfTrackTypes[trackType]).c_str(), 35, 1.0, 4.5, 24, -TMath::Pi(), TMath::Pi());
137 mHistPhiVsEta[trackType]->SetXTitle((std::string("#eta of ") + mNameOfTrackTypes[trackType]).c_str());
138 mHistPhiVsEta[trackType]->SetYTitle((std::string("#phi of ") + mNameOfTrackTypes[trackType]).c_str());
139 mHistPhiVsEta[trackType]->Sumw2();
140 mHistPhiVsEta[trackType]->SetOption("COLZ");
141
142 // mHistPtVsEta
143 mHistPtVsEta[trackType] = std::make_unique<TH2F>((std::string("mGMTrackPtVsEta") + mNameOfTrackTypes[trackType]).c_str(), (std::string("Pt Vs Eta of ") + mNameOfTrackTypes[trackType]).c_str(), 35, 1.0, 4.5, 40, 0., 10.);
144 mHistPtVsEta[trackType]->SetXTitle((std::string("#eta of ") + mNameOfTrackTypes[trackType]).c_str());
145 mHistPtVsEta[trackType]->SetYTitle((std::string("p_{T} (GeV/c) of ") + mNameOfTrackTypes[trackType]).c_str());
146 mHistPtVsEta[trackType]->Sumw2();
147 mHistPtVsEta[trackType]->SetOption("COLZ");
148
149 // mHistPhiVsPt
150 mHistPhiVsPt[trackType] = std::make_unique<TH2F>((std::string("mGMTrackPhiVsPt") + mNameOfTrackTypes[trackType]).c_str(), (std::string("Phi Vs Pt of ") + mNameOfTrackTypes[trackType]).c_str(), 40, 0., 10., 24, -TMath::Pi(), TMath::Pi());
151 mHistPhiVsPt[trackType]->SetXTitle((std::string("p_{T} (GeV/c) of ") + mNameOfTrackTypes[trackType]).c_str());
152 mHistPhiVsPt[trackType]->SetYTitle((std::string("#phi of ") + mNameOfTrackTypes[trackType]).c_str());
153 mHistPhiVsPt[trackType]->Sumw2();
154 mHistPhiVsPt[trackType]->SetOption("COLZ");
155
156 if (trackType != kReco) {
157 // mHistZvtxVsEta
158 mHistZvtxVsEta[trackType] = std::make_unique<TH2F>((std::string("mGMTrackZvtxVsEta") + mNameOfTrackTypes[trackType]).c_str(), (std::string("Z_{vtx} Vs Eta of ") + mNameOfTrackTypes[trackType]).c_str(), 35, 1.0, 4.5, 15, -15, 15);
159 mHistZvtxVsEta[trackType]->SetXTitle((std::string("#eta of ") + mNameOfTrackTypes[trackType]).c_str());
160 mHistZvtxVsEta[trackType]->SetYTitle((std::string("z_{vtx} (cm) of ") + mNameOfTrackTypes[trackType]).c_str());
161 mHistZvtxVsEta[trackType]->Sumw2();
162 mHistZvtxVsEta[trackType]->SetOption("COLZ");
163 }
164 // mHistRVsZ]
165 if (trackType == kGen || trackType == kPairable) {
166 mHistRVsZ[trackType] = std::make_unique<TH2F>((std::string("mGMTrackRVsZ") + mNameOfTrackTypes[trackType]).c_str(), (std::string("R Vs Z of ") + mNameOfTrackTypes[trackType]).c_str(), 400, -80., 20., 400, 0., 80.);
167 mHistRVsZ[trackType]->SetXTitle((std::string("z (cm) origin of ") + mNameOfTrackTypes[trackType]).c_str());
168 mHistRVsZ[trackType]->SetYTitle((std::string("R (cm) radius of origin of ") + mNameOfTrackTypes[trackType]).c_str());
169 mHistRVsZ[trackType]->Sumw2();
170 mHistRVsZ[trackType]->SetOption("COLZ");
171 }
172 }
173
174 // Histos for Reconstruction assessment
175
176 mChargeMatchEff = std::make_unique<TEfficiency>("mGMTrackQMatchEff", "Charge Match;p_t [GeV];#epsilon", 50, 0, 20);
177
178 const int nTH3Histos = TH3Names.size();
179 auto n3Histo = 0;
180 for (auto& h : mTH3Histos) {
181 h = std::make_unique<TH3F>(TH3Names[n3Histo], TH3Titles[n3Histo],
182 (int)TH3Binning[n3Histo][0],
183 TH3Binning[n3Histo][1],
184 TH3Binning[n3Histo][2],
185 (int)TH3Binning[n3Histo][3],
186 TH3Binning[n3Histo][4],
187 TH3Binning[n3Histo][5],
188 (int)TH3Binning[n3Histo][6],
189 TH3Binning[n3Histo][7],
190 TH3Binning[n3Histo][8]);
191 h->GetXaxis()->SetTitle(TH3XaxisTitles[n3Histo]);
192 h->GetYaxis()->SetTitle(TH3YaxisTitles[n3Histo]);
193 h->GetZaxis()->SetTitle(TH3ZaxisTitles[n3Histo]);
194 ++n3Histo;
195 }
196 }
197}
198
199//__________________________________________________________
201{
202
203 // get tracks
204 mMFTTracks = ctx.inputs().get<gsl::span<o2::mft::TrackMFT>>("mfttracks");
205 mMCHTracks = ctx.inputs().get<gsl::span<o2::mch::TrackMCH>>("mchtracks");
206 mGlobalFwdTracks = ctx.inputs().get<gsl::span<o2::dataformats::GlobalFwdTrack>>("fwdtracks");
207
208 if (mUseMC) {
209 // get labels
210 mMFTTrackLabels = ctx.inputs().get<gsl::span<MCCompLabel>>("mfttrklabels");
211 mMCHTrackLabels = ctx.inputs().get<gsl::span<MCCompLabel>>("mchtrklabels");
212 mFwdTrackLabels = ctx.inputs().get<gsl::span<MCCompLabel>>("fwdtrklabels");
213 }
214
215 for (auto& oneTrack : mGlobalFwdTracks) {
216 if (mMIDFilterEnabled and (oneTrack.getMIDMatchingChi2() < 0)) { // MID filter
217 continue;
218 }
219 const auto nClusters = mMFTTracks[oneTrack.getMFTTrackID()].getNumberOfPoints();
220 mTrackNumberOfClusters->Fill(nClusters);
221 mTrackInvQPt->Fill(oneTrack.getInvQPt());
222 mTrackChi2->Fill(oneTrack.getTrackChi2());
223 mTrackCharge->Fill(oneTrack.getCharge());
224 mTrackPhi->Fill(oneTrack.getPhi());
225 mTrackEta->Fill(oneTrack.getEta());
226 mTrackCotl->Fill(1. / oneTrack.getTanl());
227
228 for (auto minNClusters : sMinNClustersList) {
229 if (nClusters >= minNClusters) {
230 mTrackEtaNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta());
231 mTrackPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getPhi());
232 mTrackXYNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getX(), oneTrack.getY());
233 mTrackEtaPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta(), oneTrack.getPhi());
234 }
235 }
236 }
237}
238
239//__________________________________________________________
241{
242 for (auto src = 0; src < mcReader.getNSources(); src++) {
243 for (Int_t event = 0; event < mcReader.getNEvents(src); event++) {
244 const auto& mcTracks = mcReader.getTracks(src, event);
245 auto evh = mcReader.getMCEventHeader(src, event);
246 for (const auto& mcParticle : mcTracks) {
247 addMCParticletoHistos(&mcParticle, kGen, evh);
248 } // mcTracks
250 } // events
251 } // sources
252}
253
254//__________________________________________________________
256{
257 int trackID = 0, evnID = 0, srcID = 0;
258 bool fake = false;
259 std::unordered_map<o2::MCCompLabel, std::array<bool, 2>> mcPairables;
260
261 // Loop MCH Tracks
262 auto nMCHTracks = mMCHTracks.size();
263 for (int iTrk = 0; iTrk < nMCHTracks; ++iTrk) {
264 auto mchLabel = mMCHTrackLabels[iTrk];
265
266 mchLabel.get(trackID, evnID, srcID, fake);
267 if (fake) {
268 continue;
269 }
270 mcPairables[mchLabel][0] = true;
271 }
272
273 // Loop MFT Tracks
274 auto nMFTTracks = mMFTTracks.size();
275 for (int iTrk = 0; iTrk < nMFTTracks; ++iTrk) {
276 auto mftLabel = mMFTTrackLabels[iTrk];
277
278 mftLabel.get(trackID, evnID, srcID, fake);
279 if (fake) {
280 continue;
281 }
282 auto t = mcPairables.find(mftLabel);
283 if (t != mcPairables.end()) {
284 t->second[1] = true;
285 }
286 }
287
288 // Identify pairables
289 mPairableTracksMap.resize(mcReader.getNSources());
290 auto src = 0;
291 for (auto& map : mPairableTracksMap) {
292 map.resize(mcReader.getNEvents(src++));
293 }
294 for (auto& testPair : mcPairables) {
295 auto& boolPair = testPair.second;
296 if (boolPair[0] and boolPair[1]) {
297 mPairables[testPair.first] = true;
298 mPairableTracksMap[testPair.first.getSourceID()][testPair.first.getEventID()].push_back(testPair.first);
299 }
300 }
301
302 // Process pairables per source and event
303 for (auto src = 0; src < mcReader.getNSources(); src++) {
304 for (Int_t event = 0; event < mcReader.getNEvents(src); event++) {
305 auto evH = mcReader.getMCEventHeader(src, event);
306 for (auto& pairable : mPairableTracksMap[src][event]) {
307 auto const* mcParticle = mcReader.getTrack(pairable);
308 addMCParticletoHistos(mcParticle, kPairable, evH);
309 }
311 } // events
312 } // sources
313}
314//__________________________________________________________
316{
317 // For this moment this is used for MC-based assessment, but could be merged into runBasicQC(...)
318 for (auto fwdTrack : mGlobalFwdTracks) {
319 if (mMIDFilterEnabled and (fwdTrack.getMIDMatchingChi2() < 0)) { // MID filter
320 continue;
321 }
322 auto pt_Rec = fwdTrack.getPt();
323 auto invQPt_Rec = fwdTrack.getInvQPt();
324 auto px_mch = mMCHTracks[fwdTrack.getMCHTrackID()].getPx();
325 auto py_mch = mMCHTracks[fwdTrack.getMCHTrackID()].getPy();
326 auto invQPt_MCH = mMCHTracks[fwdTrack.getMCHTrackID()].getSign() / sqrt(px_mch * px_mch + py_mch * py_mch);
327 auto eta_Rec = std::abs(fwdTrack.getEta());
328 auto phi_Rec = fwdTrack.getPhi();
329 auto nMFTClusters = mMFTTracks[fwdTrack.getMFTTrackID()].getNumberOfPoints();
330 auto Chi2_Rec = fwdTrack.getTrackChi2();
331 int Q_Rec = fwdTrack.getCharge();
332 auto matchChi2 = fwdTrack.getMFTMCHMatchingChi2();
333 auto matchMatchScore = fwdTrack.getMFTMCHMatchingScore();
334
335 mHistPtVsEta[kReco]->Fill(eta_Rec, pt_Rec);
336 mHistPhiVsEta[kReco]->Fill(eta_Rec, phi_Rec);
337 mHistPhiVsPt[kReco]->Fill(pt_Rec, phi_Rec);
338
339 mTH3Histos[kTH3GMTrackPtEtaChi2]->Fill(pt_Rec, eta_Rec, matchChi2);
340 mTH3Histos[kTH3GMTrackPtEtaMatchScore]->Fill(pt_Rec, eta_Rec, matchMatchScore);
341 if (fwdTrack.isCloseMatch()) {
342 mTH3Histos[kTH3GMCloseMatchPtEtaChi2]->Fill(pt_Rec, eta_Rec, matchChi2);
343 mTH3Histos[kTH3GMCloseMatchPtEtaMatchScore]->Fill(pt_Rec, eta_Rec, matchMatchScore);
344 }
345 }
346}
347
348//__________________________________________________________
350{
352 for (auto src = 0; src < mcReader.getNSources(); src++) {
353 for (Int_t event = 0; event < mcReader.getNEvents(src); event++) {
354 const auto& evH = mcReader.getMCEventHeader(src, event);
355 const auto& zVtx = evH.GetZ();
356
357 for (const auto& trueFwdTrackID : mTrueTracksMap[src][event]) {
358 auto fwdTrack = mGlobalFwdTracks[trueFwdTrackID];
359 if (mMIDFilterEnabled and (fwdTrack.getMIDMatchingChi2() < 0)) { // MID filter
360 continue;
361 }
362
363 const auto& trackLabel = mFwdTrackLabels[trueFwdTrackID];
364 if (trackLabel.isCorrect()) {
365
366 auto const* mcParticle = mcReader.getTrack(trackLabel);
367 const auto etaGen = std::abs(mcParticle->GetEta());
368 const auto phiGen = TMath::ATan2(mcParticle->Py(), mcParticle->Px());
369 const auto& ptGen = mcParticle->GetPt();
370 const auto& vxGen = mcParticle->GetStartVertexCoordinatesX();
371 const auto& vyGen = mcParticle->GetStartVertexCoordinatesY();
372 const auto& vzGen = mcParticle->GetStartVertexCoordinatesZ();
373 auto tanlGen = mcParticle->Pz() / mcParticle->GetPt();
374
375 const auto& pdgcode_MC = mcParticle->GetPdgCode();
376 int Q_Gen;
377 if (TDatabasePDG::Instance()->GetParticle(pdgcode_MC)) {
378 Q_Gen = TDatabasePDG::Instance()->GetParticle(pdgcode_MC)->Charge() / 3;
379 } else {
380 continue;
381 }
382 const auto invQPtGen = 1.0 * Q_Gen / ptGen;
383 fwdTrack.propagateToZ(vzGen, mBz);
384
385 const auto& pt_Rec = fwdTrack.getPt();
386 const auto& invQPt_Rec = fwdTrack.getInvQPt();
387 const auto& px_mch = mMCHTracks[fwdTrack.getMCHTrackID()].getPx();
388 const auto& py_mch = mMCHTracks[fwdTrack.getMCHTrackID()].getPy();
389 const auto& invQPt_MCH = mMCHTracks[fwdTrack.getMCHTrackID()].getSign() / sqrt(px_mch * px_mch + py_mch * py_mch);
390 const auto& eta_Rec = std::abs(fwdTrack.getEta());
391 const auto& phi_Rec = fwdTrack.getPhi();
392 const auto& nMFTClusters = mMFTTracks[fwdTrack.getMFTTrackID()].getNumberOfPoints();
393 const auto& Chi2_Rec = fwdTrack.getTrackChi2();
394 const int Q_Rec = fwdTrack.getCharge();
395 const auto& matchChi2 = fwdTrack.getMFTMCHMatchingChi2();
396 const auto& matchMatchScore = fwdTrack.getMFTMCHMatchingScore();
397
398 // Residuals at vertex
399 const auto x_res = fwdTrack.getX() - vxGen;
400 const auto y_res = fwdTrack.getY() - vyGen;
401 const auto eta_res = fwdTrack.getEta() - etaGen;
402 const auto phi_res = fwdTrack.getPhi() - phiGen;
403 const auto cotl_res = (1. / fwdTrack.getTanl()) - (1. / tanlGen);
404 const auto invQPt_res = invQPt_Rec - invQPtGen;
405 mHistPtVsEta[kRecoTrue]->Fill(eta_Rec, pt_Rec);
406 mHistPhiVsEta[kRecoTrue]->Fill(eta_Rec, phi_Rec);
407 mHistPhiVsPt[kRecoTrue]->Fill(pt_Rec, phi_Rec);
408 mHistZvtxVsEta[kRecoTrue]->Fill(eta_Rec, zVtx);
409
410 mHistPhiRecVsPhiGen->Fill(phiGen, phi_Rec);
411 mHistEtaRecVsEtaGen->Fill(etaGen, eta_Rec);
412
414 auto d_Charge = Q_Rec - Q_Gen;
415 mChargeMatchEff->Fill(!d_Charge, ptGen);
416
417 mTH3Histos[kTH3GMTrackDeltaXVertexPtEta]->Fill(ptGen, etaGen, 1e4 * x_res);
418 mTH3Histos[kTH3GMTrackDeltaYVertexPtEta]->Fill(ptGen, etaGen, 1e4 * y_res);
419 mTH3Histos[kTH3GMTrackDeltaXDeltaYEta]->Fill(etaGen, 1e4 * x_res, 1e4 * y_res);
420 mTH3Histos[kTH3GMTrackDeltaXDeltaYPt]->Fill(ptGen, 1e4 * x_res, 1e4 * y_res);
421 mTH3Histos[kTH3GMTrackXPullPtEta]->Fill(ptGen, etaGen, x_res / sqrt(fwdTrack.getCovariances()(0, 0)));
422 mTH3Histos[kTH3GMTrackYPullPtEta]->Fill(ptGen, etaGen, y_res / sqrt(fwdTrack.getCovariances()(1, 1)));
423 mTH3Histos[kTH3GMTrackPhiPullPtEta]->Fill(ptGen, etaGen, phi_res / sqrt(fwdTrack.getCovariances()(2, 2)));
424 mTH3Histos[kTH3GMTrackCotlPullPtEta]->Fill(ptGen, etaGen, cotl_res / sqrt(1. / fwdTrack.getCovariances()(3, 3)));
425 mTH3Histos[kTH3GMTrackInvQPtPullPtEta]->Fill(ptGen, etaGen, invQPt_res / sqrt(fwdTrack.getCovariances()(4, 4)));
426 mTH3Histos[kTH3GMTrackInvQPtResolutionPtEta]->Fill(ptGen, etaGen, (invQPt_Rec - invQPtGen) / invQPtGen);
427 mTH3Histos[kTH3GMTrackInvQPtResMCHPtEta]->Fill(ptGen, etaGen, (invQPt_MCH - invQPtGen) / invQPtGen);
428 mTH3Histos[kTH3GMTrackReducedChi2PtEta]->Fill(ptGen, etaGen, Chi2_Rec / (2 * nMFTClusters - 5));
429 mTH3Histos[kTH3GMTruePtEtaChi2]->Fill(pt_Rec, eta_Rec, matchChi2);
430 mTH3Histos[kTH3GMTruePtEtaMatchScore]->Fill(pt_Rec, eta_Rec, matchMatchScore);
431 mTH3Histos[kTH3GMTruePtEtaMatchScore_MC]->Fill(ptGen, etaGen, matchMatchScore);
432 }
433 }
435 } // events
436 } // sources
437}
438
439//__________________________________________________________
441{
442 auto zVtx = evH.GetZ();
443
444 auto pt = mcTr->GetPt();
445 auto eta = -1 * mcTr->GetEta();
446 auto phi = mcTr->GetPhi();
448 auto z = mcTr->GetStartVertexCoordinatesZ();
449 auto R = sqrt(pow(mcTr->GetStartVertexCoordinatesX(), 2) + pow(mcTr->GetStartVertexCoordinatesY(), 2));
450
451 mHistPtVsEta[TrackType]->Fill(eta, pt);
452 mHistPhiVsEta[TrackType]->Fill(eta, phi);
453 mHistPhiVsPt[TrackType]->Fill(pt, phi);
454 mHistZvtxVsEta[TrackType]->Fill(eta, zVtx);
455 if (TrackType == kGen || TrackType == kPairable) {
456 mHistRVsZ[TrackType]->Fill(z, R);
457 }
458 if (TrackType == kPairable) {
459 mTH3Histos[kTH3GMPairablePtEtaZ]->Fill(pt, eta, zVtx);
460 }
461}
462
463//__________________________________________________________
464void GloFwdAssessment::getHistos(TObjArray& objar)
465{
466
467 objar.Add(mTrackNumberOfClusters.get());
468 objar.Add(mTrackInvQPt.get());
469 objar.Add(mTrackChi2.get());
470 objar.Add(mTrackCharge.get());
471 objar.Add(mTrackPhi.get());
472 objar.Add(mTrackEta.get());
473 for (auto minNClusters : sMinNClustersList) {
474 auto nHisto = minNClusters - sMinNClustersList[0];
475 objar.Add(mTrackEtaNCls[nHisto].get());
476 objar.Add(mTrackPhiNCls[nHisto].get());
477 objar.Add(mTrackXYNCls[nHisto].get());
478 objar.Add(mTrackEtaPhiNCls[nHisto].get());
479 }
480 objar.Add(mTrackCotl.get());
481
482 if (mUseMC) {
483 objar.Add(mHistPhiRecVsPhiGen.get());
484 objar.Add(mHistEtaRecVsEtaGen.get());
485 for (int TrackType = 0; TrackType < kNumberOfTrackTypes; TrackType++) {
486 objar.Add(mHistPhiVsEta[TrackType].get());
487 objar.Add(mHistPtVsEta[TrackType].get());
488 objar.Add(mHistPhiVsPt[TrackType].get());
489 objar.Add(mHistZvtxVsEta[TrackType].get());
490 if (TrackType == kGen || TrackType == kPairable) {
491 objar.Add(mHistRVsZ[TrackType].get());
492 }
493 }
494
495 // Histos for Reconstruction assessment
496
497 for (auto& h : mTH3Histos) {
498 objar.Add(h.get());
499 }
500
501 objar.Add(mChargeMatchEff.get());
502 objar.Add(mPairingEtaPt.get());
503 objar.Add(mTruePairingEtaPt.get());
504
505 if (mFinalizeAnalysis) {
506 objar.Add(mHistVxtOffsetProjection.get());
507 }
508
509 if (mFinalizeAnalysis) {
510 for (int slicedCanvas = 0; slicedCanvas < kNSlicedTH3; slicedCanvas++) {
511 objar.Add(mSlicedCanvas[slicedCanvas]);
512 }
513 for (int matchingCanvas = 0; matchingCanvas < kNGMAssesmentCanvases; matchingCanvas++) {
514 objar.Add(mAssessmentCanvas[matchingCanvas]);
515 }
516 }
517 }
518}
519
520//__________________________________________________________
522{
523 if (mFinalizeAnalysis) {
524 throw std::runtime_error("MFTAssessment error: data already loaded");
525 }
526 mFinalizeAnalysis = true;
527
528 TObjArray* objar;
529
530 TFile* f = new TFile(Form("GlobalForwardAssessment.root"));
531
532 mTrackNumberOfClusters = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdNumberOfMFTClusters"));
533
534 mTrackInvQPt = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdInvQPt"));
535
536 mTrackChi2 = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdChi2"));
537
538 mTrackCharge = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdCharge"));
539
540 mTrackPhi = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdPhi"));
541
542 mTrackEta = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdEta"));
543
544 for (auto minNClusters : sMinNClustersList) {
545 auto nHisto = minNClusters - sMinNClustersList[0];
546 mTrackEtaNCls[nHisto] = std::unique_ptr<TH1F>((TH1F*)f->Get(Form("mGlobalFwdEta_%d_MinClusters", minNClusters)));
547
548 mTrackPhiNCls[nHisto] = std::unique_ptr<TH1F>((TH1F*)f->Get(Form("mGlobalFwdPhi_%d_MinClusters", minNClusters)));
549
550 mTrackXYNCls[nHisto] = std::unique_ptr<TH2F>((TH2F*)f->Get(Form("mGlobalFwdXY_%d_MinClusters", minNClusters)));
551
552 mTrackEtaPhiNCls[nHisto] = std::unique_ptr<TH2F>((TH2F*)f->Get(Form("mGlobalFwdEtaPhi_%d_MinClusters", minNClusters)));
553 }
554
555 mTrackCotl = std::unique_ptr<TH1F>((TH1F*)f->Get("mGlobalFwdCotl"));
556
557 // Creating MC-based histos
558 if (mUseMC) {
559
560 mHistPhiRecVsPhiGen = std::unique_ptr<TH2F>((TH2F*)f->Get("mGMTrackPhiRecVsPhiGen"));
561
562 mHistEtaRecVsEtaGen = std::unique_ptr<TH2F>((TH2F*)f->Get("mGMTrackEtaRecVsEtaGen"));
563
564 for (int trackType = 0; trackType < kNumberOfTrackTypes; trackType++) {
565 mHistPhiVsEta[trackType] = std::unique_ptr<TH2F>((TH2F*)f->Get((std::string("mGMTrackPhiVsEta") + mNameOfTrackTypes[trackType]).c_str()));
566
567 mHistPtVsEta[trackType] = std::unique_ptr<TH2F>((TH2F*)f->Get((std::string("mGMTrackPtVsEta") + mNameOfTrackTypes[trackType]).c_str()));
568
569 mHistPhiVsPt[trackType] = std::unique_ptr<TH2F>((TH2F*)f->Get((std::string("mGMTrackPhiVsPt") + mNameOfTrackTypes[trackType]).c_str()));
570
571 if (trackType != kReco) {
572 mHistZvtxVsEta[trackType] = std::unique_ptr<TH2F>((TH2F*)f->Get((std::string("mGMTrackZvtxVsEta") + mNameOfTrackTypes[trackType]).c_str()));
573 }
574 if (trackType == kGen || trackType == kPairable) {
575 mHistRVsZ[trackType] = std::unique_ptr<TH2F>((TH2F*)f->Get((std::string("mGMTrackRVsZ") + mNameOfTrackTypes[trackType]).c_str()));
576 }
577 }
578
579 // Histos for Reconstruction assessment
580 mChargeMatchEff = std::unique_ptr<TEfficiency>((TEfficiency*)f->Get("mGMTrackQMatchEff"));
581
582 const int nTH3Histos = TH3Names.size();
583 auto n3Histo = 0;
584 for (auto& h : mTH3Histos) {
585 h = std::unique_ptr<TH3F>((TH3F*)f->Get(TH3Names[n3Histo]));
586 ++n3Histo;
587 }
588 }
589}
590
591//__________________________________________________________
593{
594
595 mHistVxtOffsetProjection = std::unique_ptr<TH2F>((TH2F*)mTH3Histos[kTH3GMTrackDeltaXDeltaYEta]->Project3D("colz yz"));
596 mHistVxtOffsetProjection->SetNameTitle("Vertex_XY_OffSet", "Vertex Offset");
597 mHistVxtOffsetProjection->SetOption("COLZ");
598
601}
602
603//__________________________________________________________
605{
606 if (mFinalizeAnalysis) {
607 std::vector<float> ptList({.5, 5., 10., 18.0});
608 float ptWindow = 1.0;
609 std::vector<float> etaList({2.5, 3.0});
610 float etaWindow = 0.5;
611
612 std::vector<float> sliceList;
613 float sliceWindow;
614
615 for (int nCanvas = 0; nCanvas < kNSlicedTH3; nCanvas++) {
616 if (nCanvas % 2) {
617 sliceList = etaList;
618 sliceWindow = etaWindow;
619 } else {
620 sliceList = ptList;
621 sliceWindow = ptWindow;
622 }
623 mSlicedCanvas[nCanvas] = new TCanvas(TH3SlicedNames[nCanvas], TH3SlicedNames[nCanvas], 1080, 1080);
624 mSlicedCanvas[nCanvas]->UseCurrentStyle();
625 mSlicedCanvas[nCanvas]->cd();
626 TH3Slicer(mSlicedCanvas[nCanvas], mTH3Histos[TH3SlicedMap[nCanvas]], sliceList, sliceWindow, 2);
627 }
628
629 auto& Reco = mTH3Histos[kTH3GMTrackPtEtaMatchScore];
630 auto& hTrue = mTH3Histos[kTH3GMTruePtEtaMatchScore];
631 auto& hTrue_MC = mTH3Histos[kTH3GMTruePtEtaMatchScore_MC];
632 auto& hPairable = mTH3Histos[kTH3GMPairablePtEtaZ];
633
634 auto RecoEtaPt = (TH2D*)Reco->Project3D("xy COLZ");
635 auto TrueEtaPt_MC = (TH2D*)hTrue_MC->Project3D("xy COLZ");
636 auto PairableEtaPt = (TH2D*)hPairable->Project3D("xy COLZ");
637
638 mPairingEtaPt = (std::unique_ptr<TH2D>)static_cast<TH2D*>(RecoEtaPt->Clone());
639 mPairingEtaPt->Divide(PairableEtaPt);
640 mPairingEtaPt->SetNameTitle("GMTrackPairingEffEtaPt", "PairingEffEtaPt");
641 mPairingEtaPt->SetOption("COLZ");
642
643 mTruePairingEtaPt = (std::unique_ptr<TH2D>)static_cast<TH2D*>(TrueEtaPt_MC->Clone());
644 mTruePairingEtaPt->Divide(PairableEtaPt);
645 mTruePairingEtaPt->SetNameTitle("GMTrackTruePairingEffEtaPt", "TruePairingEffEtaPt");
646 mTruePairingEtaPt->SetOption("COLZ");
647 }
648}
649
650//__________________________________________________________
652{
653
654 gStyle->SetOptTitle(kFALSE);
655 gStyle->SetOptStat(0); // Remove title of first histogram from canvas
656 gStyle->SetMarkerStyle(kFullCircle);
657 gStyle->SetMarkerSize(1.0);
658
659 auto& Reco = mTH3Histos[kTH3GMTrackPtEtaMatchScore];
660 auto& hTrue = mTH3Histos[kTH3GMTruePtEtaMatchScore];
661 auto& hTrue_MC = mTH3Histos[kTH3GMTruePtEtaMatchScore_MC];
662 auto& hPairable = mTH3Histos[kTH3GMPairablePtEtaZ];
663
664 // Inner pseudorapidity
665 auto minBin = Reco->GetYaxis()->FindBin(2.4);
666 auto midBin = Reco->GetYaxis()->FindBin(3.0);
667 auto maxBin = Reco->GetYaxis()->FindBin(3.6);
668 auto PairablePtProjInner = (TH1*)hPairable->ProjectionX("PairableInner", midBin, maxBin);
669 auto PairablePtProjOuter = (TH1*)hPairable->ProjectionX("PairableOuter", minBin, midBin);
670
671 auto RecoEtaPt = (TH2D*)Reco->Project3D("xy COLZ");
672 auto TrueEtaPt = (TH2D*)hTrue->Project3D("xy COLZ");
673 auto TrueEtaPt_MC = (TH2D*)hTrue_MC->Project3D("xy COLZ");
674 auto PairableEtaPt = (TH2D*)hPairable->Project3D("xy COLZ");
675 auto PairablePt = (TH1D*)hPairable->Project3D("x");
676
678 float scoreStep = (mFinalizeMaxCut - mFinalizeMinCut) / mNFinalizeSteps;
679 for (float scoreCut = mFinalizeMinCut; scoreCut <= mFinalizeMaxCut; scoreCut += scoreStep) {
680
681 auto RecoPtProj = (TH1*)Reco->ProjectionX(Form("_RecoPtProj%.2f", scoreCut));
682 auto TruePtProj = (TH1*)hTrue->ProjectionX(Form("_TruePtProj%.2f", scoreCut));
683 auto TruePtProj_MC = (TH1*)hTrue_MC->ProjectionX(Form("_TruePtProj_MC%.2f", scoreCut));
684
685 // Inner pseudorapidity
686 auto maxScoreBin = Reco->GetZaxis()->FindBin(scoreCut);
687 auto RecoPtProjInner = (TH1*)Reco->ProjectionX(Form("_InnerRecoCut_%.2f", scoreCut), midBin, maxBin, 0, maxScoreBin);
688 auto TruePtProjInner = (TH1*)hTrue->ProjectionX(Form("_InnerTrueCut_%.2f", scoreCut), midBin, maxBin, 0, maxScoreBin);
689 auto TruePtProjInner_MC = (TH1*)hTrue_MC->ProjectionX(Form("_InnerTrueCut_MC_%.2f", scoreCut), midBin, maxBin, 0, maxScoreBin);
690
691 auto& hPurityInner = mPurityPtInnerVecTH2.emplace_back((std::unique_ptr<TH2D>)static_cast<TH2D*>(TruePtProjInner->Clone()));
692 hPurityInner->Divide(RecoPtProjInner); // Global Pairing Purity = N_true / N_reco
693 hPurityInner->SetNameTitle(Form("TH2GMTrackPurityInnerEtaCut_%.2f", scoreCut), Form("%.2f cut", scoreCut));
694 hPurityInner->GetYaxis()->SetTitle("Pairing Purity [ N_{True} / N_{Rec}]");
695 hPurityInner->SetOption("COLZ");
696 hPurityInner->SetMarkerStyle(kFullCircle);
697 hPurityInner->SetMinimum(0.0);
698 hPurityInner->SetMaximum(1.2);
699
700 auto& hPairingEffInner = mPairingPtInnerVecTH1.emplace_back((std::unique_ptr<TH1D>)static_cast<TH1D*>(RecoPtProjInner->Clone()));
701 hPairingEffInner->Divide(PairablePtProjInner); // Pairing Efficiency = N_reco / N_Pairable
702 hPairingEffInner->SetNameTitle(Form("GMTrackPairingEffInnerPtCut_%.2f", scoreCut), Form("%.2f cut", scoreCut));
703 hPairingEffInner->GetYaxis()->SetTitle("Pairing Efficiency [ N_{Rec} / N_{pairable}]");
704 hPairingEffInner->SetOption("COLZ");
705 hPairingEffInner->SetMarkerStyle(kFullCircle);
706 hPairingEffInner->SetMinimum(0.0);
707 hPairingEffInner->SetMaximum(1.8);
708
709 auto& hTruePairingEffInner = mTruePairingPtInnerVecTH1.emplace_back((std::unique_ptr<TH1D>)static_cast<TH1D*>(TruePtProjInner_MC->Clone()));
710 hTruePairingEffInner->Divide(PairablePtProjInner);
711 hTruePairingEffInner->SetNameTitle(Form("GMTrackTruePairingEffInnerPtCut_%.2f", scoreCut), Form("%.2f cut", scoreCut));
712 hTruePairingEffInner->GetYaxis()->SetTitle("True Pairing Efficiency [ N_{True} / N_{pairable}]");
713 hTruePairingEffInner->SetOption("COLZ");
714 hTruePairingEffInner->SetMarkerStyle(kFullCircle);
715 hTruePairingEffInner->SetMinimum(0.0);
716 hTruePairingEffInner->SetMaximum(1.2);
717
718 // Outer pseudorapidity
719 auto RecoPtProjOuter = (TH1*)Reco->ProjectionX(Form("_OuterRecoCut_%.2f", scoreCut), minBin, midBin, 0, maxScoreBin);
720 auto TruePtProjOuter = (TH1*)hTrue->ProjectionX(Form("_OuterTrueCut_%.2f", scoreCut), minBin, midBin, 0, maxScoreBin);
721 auto TruePtProjOuter_MC = (TH1*)hTrue_MC->ProjectionX(Form("_OuterTrueCut_MC_%.2f", scoreCut), minBin, midBin, 0, maxScoreBin);
722
723 auto& hPurityOuter = mPurityPtOuterVecTH2.emplace_back((std::unique_ptr<TH2D>)static_cast<TH2D*>(TruePtProjOuter->Clone()));
724 hPurityOuter->Divide(RecoPtProjOuter); // Global Pairing Purity = N_true / N_reco
725 hPurityOuter->SetNameTitle(Form("TH2GMTrackPurityOuterEtaCut_%.2f", scoreCut), Form("%.2f cut", scoreCut));
726 hPurityOuter->GetYaxis()->SetTitle("Pairing Purity [ N_{True} / N_{Rec}]");
727 hPurityOuter->SetOption("COLZ");
728 hPurityOuter->SetMarkerStyle(kFullTriangleUp);
729 hPurityOuter->SetMinimum(0.0);
730 hPurityOuter->SetMaximum(1.2);
731
732 auto& hPairingEffOuter = mPairingPtOuterVecTH1.emplace_back((std::unique_ptr<TH1D>)static_cast<TH1D*>(RecoPtProjOuter->Clone()));
733 hPairingEffOuter->Divide(PairablePtProjInner); // Pairing Efficiency = N_reco / N_Pairable
734 hPairingEffOuter->SetNameTitle(Form("GMTrackPairingEffOuterPtCut_%.2f", scoreCut), Form("%.2f cut", scoreCut));
735 hPairingEffOuter->GetYaxis()->SetTitle("Pairing Efficiency [ N_{Rec} / N_{pairable}]");
736 hPairingEffOuter->SetOption("COLZ");
737 hPairingEffOuter->SetMarkerStyle(kFullTriangleUp);
738 hPairingEffOuter->SetMinimum(0.0);
739 hPairingEffOuter->SetMaximum(1.8);
740
741 auto& hTruePairingEffOuter = mTruePairingPtOuterVecTH1.emplace_back((std::unique_ptr<TH1D>)static_cast<TH1D*>(TruePtProjOuter_MC->Clone()));
742 hTruePairingEffOuter->Divide(PairablePtProjOuter);
743 hTruePairingEffOuter->SetNameTitle(Form("GMTrackTruePairingEffOuterPtCut_%.2f", scoreCut), Form("%.2f cut", scoreCut));
744 hTruePairingEffOuter->GetYaxis()->SetTitle("True Pairing Efficiency [ N_{True} / N_{pairable}]");
745 hTruePairingEffOuter->SetOption("COLZ");
746 hTruePairingEffOuter->SetMarkerStyle(kFullTriangleUp);
747 hTruePairingEffOuter->SetMinimum(0.0);
748 hTruePairingEffOuter->SetMaximum(1.2);
749
750 mPairingEtaPtVec.emplace_back((std::unique_ptr<TH2D>)static_cast<TH2D*>(RecoEtaPt->Clone()));
751 mPairingEtaPtVec.back()->Divide(PairableEtaPt); // Pairing Efficiency = N_reco / N_Pairable
752 mPairingEtaPtVec.back()->SetNameTitle(Form("GMTrackPairingEffEtaPtCut_%.2f", scoreCut), Form("%.2f", scoreCut));
753 mPairingEtaPtVec.back()->SetOption("COLZ");
754
755 mTruePairingEtaPtVec.emplace_back((std::unique_ptr<TH2D>)static_cast<TH2D*>(TrueEtaPt_MC->Clone()));
756 mTruePairingEtaPtVec.back()->Divide(PairableEtaPt);
757 mTruePairingEtaPtVec.back()->SetNameTitle(Form("GMTrackTruePairingEffEtaPtCut_%.2f", scoreCut), Form("%.2f", scoreCut));
758 mTruePairingEtaPtVec.back()->SetOption("COLZ");
759 }
760
761 auto nCanvas = kPurityPtOuter;
762 auto canvasName = GMAssesmentNames[nCanvas];
763 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
764 mAssessmentCanvas[nCanvas]->UseCurrentStyle();
765 mAssessmentCanvas[nCanvas]->cd();
766 auto first = true;
767 std::string option;
768
769 std::vector<float> verylowPtOuterPurity;
770 std::vector<float> verylowPtInnerPurity;
771 std::vector<float> verylowPtOuterEff;
772 std::vector<float> verylowPtInnerEff;
773 std::vector<float> veryLowPtOuterTrueEff;
774 std::vector<float> veryLowPtInnerTrueEff;
775 std::vector<float> lowPtOuterPurity;
776 std::vector<float> lowPtInnerPurity;
777 std::vector<float> lowPtOuterEff;
778 std::vector<float> lowPtInnerEff;
779 std::vector<float> lowPtOuterTrueEff;
780 std::vector<float> lowPtInnerTrueEff;
781 std::vector<float> highPtOuterPurity;
782 std::vector<float> highPtInnerPurity;
783 std::vector<float> highPtOuterEff;
784 std::vector<float> highPtInnerEff;
785 std::vector<float> highPtOuterTrueEff;
786 std::vector<float> highPtInnerTrueEff;
787
788 auto veryLowptBin = mPurityPtOuterVecTH2.front()->GetXaxis()->FindBin(0.25);
789 auto lowptBin = mPurityPtOuterVecTH2.front()->GetXaxis()->FindBin(0.75);
790 auto highptBin = mPurityPtOuterVecTH2.front()->GetXaxis()->FindBin(2.25);
791
792 for (auto& th2 : mPurityPtOuterVecTH2) {
793 if (first) {
794 option = "hist P PMC";
795 } else {
796 option = "hist SAME P PMC";
797 }
798 first = false;
799 th2->Draw(option.c_str());
800
801 verylowPtOuterPurity.push_back(th2->GetBinContent(veryLowptBin));
802 lowPtOuterPurity.push_back(th2->GetBinContent(lowptBin));
803 highPtOuterPurity.push_back(th2->GetBinContent(highptBin));
804 }
805 TPaveText* t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC");
806 t->SetBorderSize(0);
807 t->SetFillColor(gStyle->GetTitleFillColor());
808 t->AddText("Global Muon Track Purity (2.4 < #eta < 3.0)");
809 t->Draw();
810
811 mAssessmentCanvas[nCanvas]->BuildLegend(.8, .15, .96, .87);
812 mAssessmentCanvas[nCanvas]->SetTicky();
813 mAssessmentCanvas[nCanvas]->SetGridy();
814
815 nCanvas = kPurityPtInner;
816 canvasName = GMAssesmentNames[nCanvas];
817 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
818 mAssessmentCanvas[nCanvas]->UseCurrentStyle();
819 mAssessmentCanvas[nCanvas]->cd();
820 first = true;
821
822 for (auto& th2 : mPurityPtInnerVecTH2) {
823 if (first) {
824 option = "hist P PMC";
825 } else {
826 option = "hist SAME P PMC";
827 }
828 first = false;
829 th2->Draw(option.c_str());
830
831 verylowPtInnerPurity.push_back(th2->GetBinContent(veryLowptBin));
832 lowPtInnerPurity.push_back(th2->GetBinContent(lowptBin));
833 highPtInnerPurity.push_back(th2->GetBinContent(highptBin));
834 }
835 t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC");
836 t->SetBorderSize(0);
837 t->SetFillColor(gStyle->GetTitleFillColor());
838 t->AddText("Global Muon Track Purity (3.0 < #eta < 3.6)");
839 t->Draw();
840
841 mAssessmentCanvas[nCanvas]->BuildLegend(.8, .15, .96, .87);
842 mAssessmentCanvas[nCanvas]->SetTicky();
843 mAssessmentCanvas[nCanvas]->SetGridy();
844
845 nCanvas = kPairingEffPtOuter;
846 canvasName = GMAssesmentNames[nCanvas];
847 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
848 mAssessmentCanvas[nCanvas]->UseCurrentStyle();
849 mAssessmentCanvas[nCanvas]->cd();
850 first = true;
851
852 for (auto& th2 : mPairingPtOuterVecTH1) {
853 if (first) {
854 option = "hist P PMC";
855 } else {
856 option = "hist SAME P PMC";
857 }
858 first = false;
859 verylowPtOuterEff.push_back(th2->GetBinContent(veryLowptBin));
860 lowPtOuterEff.push_back(th2->GetBinContent(lowptBin));
861 highPtOuterEff.push_back(th2->GetBinContent(highptBin));
862 th2->Draw(option.c_str());
863 }
864 t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC");
865 t->SetBorderSize(0);
866 t->SetFillColor(gStyle->GetTitleFillColor());
867 t->AddText("Global Muon Track Pairing Efficiency (2.4 < #eta < 3.0)");
868 t->Draw();
869
870 mAssessmentCanvas[nCanvas]->BuildLegend(.8, .15, .96, .87);
871 mAssessmentCanvas[nCanvas]->SetTicky();
872 mAssessmentCanvas[nCanvas]->SetGridy();
873
874 nCanvas = kPairingEffPtInner;
875 canvasName = GMAssesmentNames[nCanvas];
876 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
877 mAssessmentCanvas[nCanvas]->UseCurrentStyle();
878 mAssessmentCanvas[nCanvas]->cd();
879 first = true;
880
881 for (auto& th2 : mPairingPtInnerVecTH1) {
882 if (first) {
883 option = "hist P PMC";
884 } else {
885 option = "hist SAME P PMC";
886 }
887 first = false;
888 verylowPtInnerEff.push_back(th2->GetBinContent(veryLowptBin));
889 lowPtInnerEff.push_back(th2->GetBinContent(lowptBin));
890 highPtInnerEff.push_back(th2->GetBinContent(highptBin));
891 th2->Draw(option.c_str());
892 }
893 t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC");
894 t->SetBorderSize(0);
895 t->SetFillColor(gStyle->GetTitleFillColor());
896 t->AddText("Global Muon Track Pairing Efficiency (3.0 < #eta < 3.6 )");
897 t->Draw();
898
899 mAssessmentCanvas[nCanvas]->BuildLegend(.8, .15, .96, .87);
900 mAssessmentCanvas[nCanvas]->SetTicky();
901 mAssessmentCanvas[nCanvas]->SetGridy();
902
903 nCanvas = kTruePairingEffPtOuter;
904 canvasName = GMAssesmentNames[nCanvas];
905 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
906 mAssessmentCanvas[nCanvas]->UseCurrentStyle();
907 mAssessmentCanvas[nCanvas]->cd();
908 first = true;
909
910 for (auto& th2 : mTruePairingPtOuterVecTH1) {
911 if (first) {
912 option = "hist P PMC";
913 } else {
914 option = "hist SAME P PMC";
915 }
916 first = false;
917 veryLowPtOuterTrueEff.push_back(th2->GetBinContent(veryLowptBin));
918 lowPtOuterTrueEff.push_back(th2->GetBinContent(lowptBin));
919 highPtOuterTrueEff.push_back(th2->GetBinContent(highptBin));
920 th2->Draw(option.c_str());
921 }
922 t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC");
923 t->SetBorderSize(0);
924 t->SetFillColor(gStyle->GetTitleFillColor());
925 t->AddText("Global Muon Track True Pairing Efficiency (2.4 < #eta < 3.0)");
926 t->Draw();
927
928 mAssessmentCanvas[nCanvas]->BuildLegend(.8, .15, .96, .87);
929 mAssessmentCanvas[nCanvas]->SetTicky();
930 mAssessmentCanvas[nCanvas]->SetGridy();
931
932 nCanvas = kTruePairingEffPtInner;
933 canvasName = GMAssesmentNames[nCanvas];
934 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
935 mAssessmentCanvas[nCanvas]->UseCurrentStyle();
936 mAssessmentCanvas[nCanvas]->cd();
937 first = true;
938
939 for (auto& th2 : mTruePairingPtInnerVecTH1) {
940 if (first) {
941 option = "hist P PMC";
942 } else {
943 option = "hist SAME P PMC";
944 }
945 first = false;
946 veryLowPtInnerTrueEff.push_back(th2->GetBinContent(veryLowptBin));
947 lowPtInnerTrueEff.push_back(th2->GetBinContent(lowptBin));
948 highPtInnerTrueEff.push_back(th2->GetBinContent(highptBin));
949 th2->Draw(option.c_str());
950 }
951 t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC");
952 t->SetBorderSize(0);
953 t->SetFillColor(gStyle->GetTitleFillColor());
954 t->AddText("Global Muon Track True Pairing Efficiency (3.0 < #eta < 3.6 )");
955 t->Draw();
956
957 mAssessmentCanvas[nCanvas]->BuildLegend(.8, .15, .96, .87);
958 mAssessmentCanvas[nCanvas]->SetTicky();
959 mAssessmentCanvas[nCanvas]->SetGridy();
960
961 nCanvas = kPurityVsEfficiency;
962 canvasName = GMAssesmentNames[nCanvas];
963 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
964
965 TGraph* gr = new TGraph(highPtInnerEff.size(), &highPtInnerEff[0], &highPtInnerPurity[0]);
966 gr->SetMinimum(0);
967 gr->SetMaximum(1.01);
968
969 gr->SetMarkerStyle(kFullCircle);
970 gr->Draw("A P PMC");
971 gr->GetXaxis()->SetTitle("Global Muon Pairing Efficiency [ N_{Rec} / N_{pairable}]");
972 gr->GetXaxis()->SetLimits(0.f, 1.6);
973 gr->GetYaxis()->SetTitle("Pairing Purity [ N_{True} / N_{Rec}]");
974 gr->SetTitle("p_{t} = 2.25 || (3.0 < #eta < 3.6 )");
975
976 gr = new TGraph(highPtOuterEff.size(), &highPtOuterEff[0], &highPtOuterPurity[0]);
977 gr->Draw("P PMC SAME");
978 gr->SetMarkerStyle(kFullTriangleUp);
979
980 gr->SetTitle("p_{t} = 2.25 || (2.4 < #eta < 3.0)");
981
982 gr = new TGraph(lowPtInnerEff.size(), &lowPtInnerEff[0], &lowPtInnerPurity[0]);
983 gr->Draw("P PMC SAME");
984 gr->SetTitle("p_{t} = 0.75 || (3.0 < #eta < 3.6 )");
985
986 gr = new TGraph(lowPtOuterEff.size(), &lowPtOuterEff[0], &lowPtOuterPurity[0]);
987 gr->Draw("P PMC SAME");
988 gr->SetMarkerStyle(kFullTriangleUp);
989 gr->SetTitle("p_{t} = 0.75 || (2.4 < #eta < 3.0)");
990
991 gr = new TGraph(verylowPtInnerEff.size(), &verylowPtInnerEff[0], &verylowPtInnerPurity[0]);
992 gr->Draw("P PMC SAME");
993 gr->SetTitle("p_{t} = 0.25 || (3.0 < #eta < 3.6)");
994
995 gr = new TGraph(verylowPtOuterEff.size(), &verylowPtOuterEff[0], &verylowPtOuterPurity[0]);
996 gr->Draw("P PMC SAME");
997 gr->SetMarkerStyle(kFullTriangleUp);
998
999 gr->SetTitle("p_{t} = 0.25 || (2.4 < #eta < 3.0)");
1000
1001 mAssessmentCanvas[nCanvas]->BuildLegend();
1002 mAssessmentCanvas[nCanvas]->SetTicky();
1003 mAssessmentCanvas[nCanvas]->SetGridy();
1004
1005 nCanvas = kPurityVsTrueEfficiency;
1006 canvasName = GMAssesmentNames[nCanvas];
1007 mAssessmentCanvas[nCanvas] = new TCanvas(canvasName, canvasName, 1080, 800);
1008
1009 TGraph* gr2 = new TGraph(highPtInnerTrueEff.size(), &highPtInnerTrueEff[0], &highPtInnerPurity[0]);
1010 gr2->SetMinimum(0);
1011 gr2->SetMaximum(1.01);
1012
1013 gr2->SetMarkerStyle(kFullCircle);
1014 gr2->Draw("A P PMC");
1015 gr2->GetXaxis()->SetTitle("Global Muon True Pairing Efficiency [ N_{True} / N_{pairable}]");
1016 gr2->GetXaxis()->SetLimits(0.f, 1.01);
1017 gr2->GetYaxis()->SetTitle("Pairing Purity [ N_{True} / N_{Rec}]");
1018 gr2->SetTitle("p_{t} = 2.25 || (3.0 < #eta < 3.6 )");
1019
1020 gr2 = new TGraph(highPtOuterTrueEff.size(), &highPtOuterTrueEff[0], &highPtOuterPurity[0]);
1021 gr2->Draw("P PMC SAME");
1022 gr2->SetMarkerStyle(kFullTriangleUp);
1023
1024 gr2->SetTitle("p_{t} = 2.25 || (2.4 < #eta < 3.0)");
1025
1026 gr2 = new TGraph(lowPtInnerTrueEff.size(), &lowPtInnerTrueEff[0], &lowPtInnerPurity[0]);
1027 gr2->Draw("P PMC SAME");
1028 gr2->SetTitle("p_{t} = 0.75 || (3.0 < #eta < 3.6 )");
1029
1030 gr2 = new TGraph(lowPtOuterTrueEff.size(), &lowPtOuterTrueEff[0], &lowPtOuterPurity[0]);
1031 gr2->Draw("P PMC SAME");
1032 gr2->SetMarkerStyle(kFullTriangleUp);
1033 gr2->SetTitle("p_{t} = 0.75 || (2.4 < #eta < 3.0)");
1034
1035 gr2 = new TGraph(veryLowPtInnerTrueEff.size(), &veryLowPtInnerTrueEff[0], &verylowPtInnerPurity[0]);
1036 gr2->Draw("P PMC SAME");
1037 gr2->SetTitle("p_{t} = 0.25 || (3.0 < #eta < 3.6)");
1038
1039 gr2 = new TGraph(veryLowPtOuterTrueEff.size(), &veryLowPtOuterTrueEff[0], &verylowPtOuterPurity[0]);
1040 gr2->Draw("P PMC SAME");
1041 gr2->SetMarkerStyle(kFullTriangleUp);
1042
1043 gr2->SetTitle("p_{t} = 0.25 || (2.4 < #eta < 3.0)");
1044
1045 mAssessmentCanvas[nCanvas]->BuildLegend();
1046 mAssessmentCanvas[nCanvas]->SetTicky();
1047 mAssessmentCanvas[nCanvas]->SetGridy();
1048}
1049
1050//__________________________________________________________
1051void GloFwdAssessment::TH3Slicer(TCanvas* canvas, std::unique_ptr<TH3F>& histo3D, std::vector<float> list, double window, int iPar, float marker_size)
1052{
1053 gStyle->SetOptTitle(kFALSE);
1054 gStyle->SetOptStat(0); // Remove title of first histogram from canvas
1055 gStyle->SetMarkerStyle(kFullCircle);
1056 gStyle->SetMarkerSize(marker_size);
1057 canvas->UseCurrentStyle();
1058 canvas->cd();
1059 std::string cname = canvas->GetName();
1060 std::string ctitle = cname;
1061 std::string option;
1062 std::string option2 = "PLC PMC same";
1063
1064 TObjArray aSlices;
1065 histo3D->GetYaxis()->SetRange(0, 0);
1066 histo3D->GetXaxis()->SetRange(0, 0);
1067 bool first = true;
1068 if (cname.find("VsEta") < cname.length()) {
1069 for (auto ptmin : list) {
1070 auto ptmax = ptmin + window;
1071 histo3D->GetXaxis()->SetRangeUser(ptmin, ptmax);
1072
1073 std::string ytitle = "\\sigma (";
1074 ytitle += histo3D->GetZaxis()->GetTitle();
1075 ytitle += ")";
1076 auto title = Form("_%1.2f_%1.2f_yz", ptmin, ptmax);
1077 auto aDBG = (TH2F*)histo3D->Project3D(title);
1078 aDBG->GetXaxis()->SetRangeUser(0, 0);
1079
1080 aDBG->FitSlicesX(nullptr, 0, -1, 4, "QNR", &aSlices);
1081 auto th1DBG = (TH1F*)aSlices[iPar];
1082 th1DBG->SetTitle(Form("%1.2f < p_t < %1.2f", ptmin, ptmax));
1083 th1DBG->SetStats(0);
1084 th1DBG->SetYTitle(ytitle.c_str());
1085 if (first) {
1086 option = "PLC PMC";
1087 } else {
1088 option = "SAME PLC PMC";
1089 }
1090 first = false;
1091 th1DBG->DrawClone(option.c_str());
1092 }
1093 } else if (cname.find("VsPt") < cname.length()) {
1094 for (auto etamin : list) {
1095 auto etamax = etamin + window;
1096 histo3D->GetYaxis()->SetRangeUser(etamin, etamax);
1097 std::string ytitle = "\\sigma (" + std::string(histo3D->GetZaxis()->GetTitle()) + ")";
1098 auto title = Form("_%1.2f_%1.2f_xz", etamin, etamax);
1099 auto aDBG = (TH2F*)histo3D->Project3D(title);
1100 aDBG->FitSlicesX(nullptr, 0, -1, 4, "QNR", &aSlices);
1101 auto th1DBG = (TH1F*)aSlices[iPar];
1102 th1DBG->SetTitle(Form("%1.2f < \\eta < %1.2f", etamin, etamax));
1103 th1DBG->SetStats(0);
1104 th1DBG->SetYTitle(ytitle.c_str());
1105 if (first) {
1106 option = "PLC PMC";
1107 } else {
1108 option = "SAME PLC PMC";
1109 }
1110 first = false;
1111 th1DBG->DrawClone(option.c_str());
1112 }
1113 } else {
1114 exit(1);
1115 }
1116
1117 histo3D->GetYaxis()->SetRange(0, 0);
1118 histo3D->GetXaxis()->SetRange(0, 0);
1119
1120 TPaveText* t = new TPaveText(0.2223748, 0.9069355, 0.7776252, 0.965, "brNDC"); // left-up
1121 t->SetBorderSize(0);
1122 t->SetFillColor(gStyle->GetTitleFillColor());
1123 t->AddText(ctitle.c_str());
1124 t->Draw();
1125
1126 canvas->BuildLegend();
1127 canvas->SetTicky();
1128 canvas->SetGridy();
1129 if (0) {
1130 cname += ".png";
1131 canvas->Print(cname.c_str());
1132 }
1133}
Definition of the GeometryManager class.
Class to perform assessment of GlobalForward Tracking.
int nClusters
Class for time synchronization of RawReader instances.
Double_t GetStartVertexCoordinatesY() const
Definition MCTrack.h:83
Double_t GetPt() const
Definition MCTrack.h:109
Double_t GetStartVertexCoordinatesZ() const
Definition MCTrack.h:84
Double_t GetEta() const
Definition MCTrack.h:131
Double_t GetStartVertexCoordinatesX() const
Definition MCTrack.h:82
Double_t GetPhi() const
Definition MCTrack.h:124
decltype(auto) get(R binding, int part=0) const
InputRecord & inputs()
The inputs associated with this processing context.
void runBasicQC(o2::framework::ProcessingContext &ctx)
void addMCParticletoHistos(const MCTrack *mcTr, const int TrackType, const o2::dataformats::MCEventHeader &evH)
bool initFromDigitContext(std::string_view filename)
MCTrack const * getTrack(o2::MCCompLabel const &) const
size_t getNEvents(int source) const
Get number of events.
o2::dataformats::MCEventHeader const & getMCEventHeader(int source, int event) const
retrieves the MCEventHeader for a given eventID and sourceID
void releaseTracksForSourceAndEvent(int source, int event)
API to ask releasing tracks (freeing memory) for source + event.
size_t getNSources() const
Get number of sources.
std::vector< MCTrack > const & getTracks(int source, int event) const
variant returning all tracks for source and event at once
struct _cl_event * event
Definition glcorearb.h:2982
GLenum src
Definition glcorearb.h:1767
GLdouble f
Definition glcorearb.h:310
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
void bringToPMPiGend(double &phi)
Definition Utils.h:65
Definition list.h:40
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"