39 mTrackNumberOfClusters->Reset();
40 mCATrackNumberOfClusters->Reset();
41 mLTFTrackNumberOfClusters->Reset();
42 mTrackInvQPt->Reset();
44 mTrackCharge->Reset();
46 mPositiveTrackPhi->Reset();
47 mNegativeTrackPhi->Reset();
49 mTrackChi2pT->Reset();
52 mMFTClsOfTracksZ->Reset();
54 mUnusedChips.fill(
true);
57 for (
auto nMFTLayer = 0; nMFTLayer < 10; nMFTLayer++) {
58 mMFTClsXYinLayer[nMFTLayer]->Reset();
59 mMFTClsRinLayer[nMFTLayer]->Reset();
60 mMFTClsOfTracksXYinLayer[nMFTLayer]->Reset();
63 for (
auto nMFTDisk = 0; nMFTDisk < 5; nMFTDisk++) {
64 mMFTClsXYRedundantInDisk[nMFTDisk]->Reset();
67 for (
auto minNClusters : sMinNClustersList) {
68 auto nHisto = minNClusters - sMinNClustersList[0];
69 mTrackEtaNCls[nHisto]->Reset();
70 mTrackPhiNCls[nHisto]->Reset();
71 mTrackXYNCls[nHisto]->Reset();
72 mTrackEtaPhiNCls[nHisto]->Reset();
75 mLTFTrackEta->Reset();
78 mTrackROFNEntries->Reset();
79 mClusterROFNEntries->Reset();
81 mClusterSensorIndex->Reset();
82 mClusterPatternIndex->Reset();
84 for (
int trackType = 0; trackType < mLastTrackType; trackType++) {
85 mHistPhiVsEta[trackType]->Reset();
86 mHistPtVsEta[trackType]->Reset();
87 mHistPhiVsPt[trackType]->Reset();
89 mHistTrackChi2[trackType]->Reset();
92 mHistZvtxVsEta[trackType]->Reset();
95 mHistRVsZ[trackType]->Reset();
96 mHistIsPrimary[trackType]->Reset();
101 mMFTTrackables.clear();
102 mTrueTracksMap.clear();
103 mFakeTracksVec.clear();
104 mTrackableTracksMap.clear();
106 mHistPhiRecVsPhiGen->Reset();
107 mHistEtaRecVsEtaGen->Reset();
109 auto h = mChargeMatchEff->GetCopyTotalHisto();
111 mChargeMatchEff->SetTotalHistogram(*
h,
"");
112 mChargeMatchEff->SetPassedHistogram(*
h,
"");
114 for (
auto&
h : mTH3Histos) {
123 auto MaxClusterROFSize = 25000;
124 auto MaxTrackROFSize = 5000;
125 auto ROFLengthInBC = 198;
127 auto MaxDuration = 60000.f;
128 auto TimeBinSize = 0.1f;
129 auto NofTimeBins =
static_cast<int>(MaxDuration / TimeBinSize);
132 mTrackNumberOfClusters = std::make_unique<TH1F>(
"mMFTTrackNumberOfClusters",
133 "Number Of Clusters Per Track; # clusters; # entries", 10, 0.5, 10.5);
135 mCATrackNumberOfClusters = std::make_unique<TH1F>(
"mMFTCATrackNumberOfClusters",
136 "Number Of Clusters Per CA Track; # clusters; # tracks", 10, 0.5, 10.5);
138 mLTFTrackNumberOfClusters = std::make_unique<TH1F>(
"mMFTLTFTrackNumberOfClusters",
139 "Number Of Clusters Per LTF Track; # clusters; # entries", 10, 0.5, 10.5);
141 mTrackInvQPt = std::make_unique<TH1F>(
"mMFTTrackInvQPt",
"Track q/p_{T}; q/p_{T} [1/GeV]; # entries", 200, -10, 10);
143 mTrackChi2 = std::make_unique<TH1F>(
"mMFTTrackChi2",
"Track #chi^{2}/NDF; #chi^{2}/NDF; # entries", 210, -0.5, 20.5);
145 mTrackCharge = std::make_unique<TH1F>(
"mMFTTrackCharge",
"Track Charge; q; # entries", 3, -1.5, 1.5);
147 mTrackPhi = std::make_unique<TH1F>(
"mMFTTrackPhi",
"Track #phi; #phi; # entries", 100, -3.2, 3.2);
149 mPositiveTrackPhi = std::make_unique<TH1F>(
"mMFTPositiveTrackPhi",
"Positive Track #phi; #phi; # entries", 100, -3.2, 3.2);
151 mNegativeTrackPhi = std::make_unique<TH1F>(
"mMFTNegativeTrackPhi",
"Negative Track #phi; #phi; # entries", 100, -3.2, 3.2);
153 mTrackEta = std::make_unique<TH1F>(
"mMFTTrackEta",
"Track #eta; #eta; # entries", 50, -4, -2);
155 mTrackChi2pT = std::make_unique<TH2F>(
"mMFTTrackChi2pT",
"Track #chi^{2}/NDF vs p_{T}; #it{p}_{T} (GeV/c); #chi^{2}/NDF", 210, -0.5, 20.5, 210, -0.5, 20.5);
159 mMFTClsZ = std::make_unique<TH1F>(
"mMFTClsZ",
"Z of all clusters; Z (cm); # entries", 400, -80, -40);
161 mMFTClsOfTracksZ = std::make_unique<TH1F>(
"mMFTClsOfTracksZ",
"Z of clusters belonging to MFT tracks; Z (cm); # entries", 400, -80, -40);
163 for (
auto nMFTLayer = 0; nMFTLayer < 10; nMFTLayer++) {
164 mMFTClsXYinLayer[nMFTLayer] = std::make_unique<TH2F>(Form(
"mMFTClsXYinLayer%d", nMFTLayer), Form(
"Cluster Position in Layer %d; x (cm); y (cm)", nMFTLayer), 400, -20, 20, 400, -20, 20);
165 mMFTClsRinLayer[nMFTLayer] = std::make_unique<TH1F>(Form(
"mMFTClsRinLayer%d", nMFTLayer), Form(
"Cluster Radial Position in Layer %d; r (cm); # entries", nMFTLayer), 400, 0, 20);
166 mMFTClsOfTracksXYinLayer[nMFTLayer] = std::make_unique<TH2F>(Form(
"mMFTClsOfTracksXYinLayer%d", nMFTLayer), Form(
"Cluster (of MFT tracks) Position in Layer %d; x (cm); y (cm)", nMFTLayer), 400, -20, 20, 400, -20, 20);
169 for (
auto nMFTDisk = 0; nMFTDisk < 5; nMFTDisk++) {
170 mMFTClsXYRedundantInDisk[nMFTDisk] = std::make_unique<TH2F>(Form(
"mMFTClsXYRedundantInDisk%d", nMFTDisk), Form(
"Redondant Cluster Position in disk %d; x (cm); y (cm)", nMFTDisk), 400, -20, 20, 400, -20, 20);
173 for (
auto minNClusters : sMinNClustersList) {
174 auto nHisto = minNClusters - sMinNClustersList[0];
175 mTrackEtaNCls[nHisto] = std::make_unique<TH1F>(Form(
"mMFTTrackEta_%d_MinClusters", minNClusters), Form(
"Track #eta (NCls >= %d); #eta; # entries", minNClusters), 50, -4, -2);
177 mTrackPhiNCls[nHisto] = std::make_unique<TH1F>(Form(
"mMFTTrackPhi_%d_MinClusters", minNClusters), Form(
"Track #phi (NCls >= %d); #phi; # entries", minNClusters), 100, -3.2, 3.2);
179 mTrackXYNCls[nHisto] = std::make_unique<TH2F>(Form(
"mMFTTrackXY_%d_MinClusters", minNClusters), Form(
"Track Position (NCls >= %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16);
180 mTrackXYNCls[nHisto]->SetOption(
"COLZ");
182 mTrackEtaPhiNCls[nHisto] = std::make_unique<TH2F>(Form(
"mMFTTrackEtaPhi_%d_MinClusters", minNClusters), Form(
"Track #eta , #phi (NCls >= %d); #eta; #phi", minNClusters), 50, -4, -2, 100, -3.2, 3.2);
183 mTrackEtaPhiNCls[nHisto]->SetOption(
"COLZ");
186 mCATrackEta = std::make_unique<TH1F>(
"mMFTCATrackEta",
"CA Track #eta; #eta; # entries", 50, -4, -2);
188 mLTFTrackEta = std::make_unique<TH1F>(
"mMFTLTFTrackEta",
"LTF Track #eta; #eta; # entries", 50, -4, -2);
190 mTrackCotl = std::make_unique<TH1F>(
"mMFTTrackCotl",
"Track cot #lambda; cot #lambda; # entries", 100, -0.25, 0);
192 mClusterROFNEntries = std::make_unique<TH1F>(
"mMFTClustersROFSize",
"MFT Cluster ROFs size; ROF Size; # entries", MaxClusterROFSize, 0, MaxClusterROFSize);
194 mTrackROFNEntries = std::make_unique<TH1F>(
"mMFTTrackROFSize",
"MFT Track ROFs size; ROF Size; # entries", MaxTrackROFSize, 0, MaxTrackROFSize);
197 mTracksBC->SetMinimum(0.1);
199 mNOfTracksTime = std::make_unique<TH1F>(
"mNOfTracksTime",
"Number of tracks per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration);
200 mNOfTracksTime->SetMinimum(0.1);
202 mNOfClustersTime = std::make_unique<TH1F>(
"mNOfClustersTime",
"Number of clusters per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration);
203 mNOfClustersTime->SetMinimum(0.1);
205 mClusterSensorIndex = std::make_unique<TH1F>(
"mMFTClusterSensorIndex",
"Chip Cluster Occupancy;Chip ID;#Entries", 936, -0.5, 935.5);
207 mClusterPatternIndex = std::make_unique<TH1F>(
"mMFTClusterPatternIndex",
"Cluster Pattern ID;Pattern ID;#Entries", 300, -0.5, 299.5);
209 for (
int trackType = 0; trackType < mLastTrackType; trackType++) {
211 mHistPhiVsEta[trackType] = std::make_unique<TH2F>((std::string(
"mHistPhiVsEta") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"Phi Vs Eta of ") + mNameOfTrackTypes[trackType]).c_str(), 35, -4.5, -1, 24, 0, 2 * TMath::Pi());
212 mHistPhiVsEta[trackType]->SetXTitle((std::string(
"#eta of ") + mNameOfTrackTypes[trackType]).c_str());
213 mHistPhiVsEta[trackType]->SetYTitle((std::string(
"#phi of ") + mNameOfTrackTypes[trackType]).c_str());
214 mHistPhiVsEta[trackType]->Sumw2();
215 mHistPhiVsEta[trackType]->SetOption(
"COLZ");
218 mHistPtVsEta[trackType] = std::make_unique<TH2F>((std::string(
"mHistPtVsEta") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"Pt Vs Eta of ") + mNameOfTrackTypes[trackType]).c_str(), 35, -4.5, -1, 40, 0., 10.);
219 mHistPtVsEta[trackType]->SetXTitle((std::string(
"#eta of ") + mNameOfTrackTypes[trackType]).c_str());
220 mHistPtVsEta[trackType]->SetYTitle((std::string(
"p_{T} (GeV/c) of ") + mNameOfTrackTypes[trackType]).c_str());
221 mHistPtVsEta[trackType]->Sumw2();
222 mHistPtVsEta[trackType]->SetOption(
"COLZ");
225 mHistPhiVsPt[trackType] = std::make_unique<TH2F>((std::string(
"mHistPhiVsPt") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"Phi Vs Pt of ") + mNameOfTrackTypes[trackType]).c_str(), 40, 0., 10., 24, 0, 2 * TMath::Pi());
226 mHistPhiVsPt[trackType]->SetXTitle((std::string(
"p_{T} (GeV/c) of ") + mNameOfTrackTypes[trackType]).c_str());
227 mHistPhiVsPt[trackType]->SetYTitle((std::string(
"#phi of ") + mNameOfTrackTypes[trackType]).c_str());
228 mHistPhiVsPt[trackType]->Sumw2();
229 mHistPhiVsPt[trackType]->SetOption(
"COLZ");
233 mHistTrackChi2[trackType] = std::make_unique<TH1F>((std::string(
"mHistTrackChi2") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"Track #chi^{2}/NDF of ") + mNameOfTrackTypes[trackType]).c_str(), 210, -0.5, 20.5);
234 mHistTrackChi2[trackType]->SetXTitle(
"#chi^{2}/NDF");
235 mHistTrackChi2[trackType]->SetYTitle(
"Entries");
240 mHistZvtxVsEta[trackType] = std::make_unique<TH2F>((std::string(
"mHistZvtxVsEta") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"Z_{vtx} Vs Eta of ") + mNameOfTrackTypes[trackType]).c_str(), 60, -15, 15, 70, -4.5, -1);
241 mHistZvtxVsEta[trackType]->SetXTitle((std::string(
"z_{vtx} (cm) of ") + mNameOfTrackTypes[trackType]).c_str());
242 mHistZvtxVsEta[trackType]->SetYTitle((std::string(
"#eta of ") + mNameOfTrackTypes[trackType]).c_str());
243 mHistZvtxVsEta[trackType]->Sumw2();
244 mHistZvtxVsEta[trackType]->SetOption(
"COLZ");
248 mHistRVsZ[trackType] = std::make_unique<TH2F>((std::string(
"mHistRVsZ") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"R Vs Z of ") + mNameOfTrackTypes[trackType]).c_str(), 400, -80., 20., 400, 0., 80.);
249 mHistRVsZ[trackType]->SetXTitle((std::string(
"z (cm) origin of ") + mNameOfTrackTypes[trackType]).c_str());
250 mHistRVsZ[trackType]->SetYTitle((std::string(
"R (cm) radius of origin of ") + mNameOfTrackTypes[trackType]).c_str());
251 mHistRVsZ[trackType]->Sumw2();
252 mHistRVsZ[trackType]->SetOption(
"COLZ");
254 mHistIsPrimary[trackType] = std::make_unique<TH1F>((std::string(
"mHistIsPrimary") + mNameOfTrackTypes[trackType]).c_str(), (std::string(
"Is Primary - ") + mNameOfTrackTypes[trackType]).c_str(), 2, -.5, 1.5);
255 mHistIsPrimary[trackType]->SetXTitle((mNameOfTrackTypes[trackType] + std::string(
" primaries")).c_str());
256 mHistIsPrimary[trackType]->SetYTitle(
"Entries");
257 mHistIsPrimary[trackType]->Sumw2();
258 mHistIsPrimary[trackType]->SetOption(
"COLZ");
265 LOG(info) <<
"Initializing MC Reader";
268 throw std::invalid_argument(
"initialization of MCKinematicsReader failed");
272 mHistPhiRecVsPhiGen = std::make_unique<TH2F>(
"mHistPhiRecVsPhiGen",
"Phi Rec Vs Phi Gen of true reco tracks ", 24, 0, 2 * TMath::Pi(), 24, 0, 2 * TMath::Pi());
273 mHistPhiRecVsPhiGen->SetXTitle((std::string(
"#phi of ") + mNameOfTrackTypes[
kGen]).c_str());
274 mHistPhiRecVsPhiGen->SetYTitle((std::string(
"#phi of ") + mNameOfTrackTypes[
kRecoTrue]).c_str());
275 mHistPhiRecVsPhiGen->Sumw2();
276 mHistPhiRecVsPhiGen->SetOption(
"COLZ");
278 mHistEtaRecVsEtaGen = std::make_unique<TH2F>(
"mHistEtaRecVsEtaGen",
"Eta Rec Vs Eta Gen of true reco tracks ", 35, -4.5, -1.0, 35, -4.5, -1.0);
279 mHistEtaRecVsEtaGen->SetXTitle((std::string(
"#eta of ") + mNameOfTrackTypes[
kGen]).c_str());
280 mHistEtaRecVsEtaGen->SetYTitle((std::string(
"#eta of ") + mNameOfTrackTypes[
kRecoTrue]).c_str());
281 mHistEtaRecVsEtaGen->Sumw2();
282 mHistEtaRecVsEtaGen->SetOption(
"COLZ");
286 mChargeMatchEff = std::make_unique<TEfficiency>(
"QMatchEff",
"Charge Match;p_t [GeV];#epsilon", 50, 0, 20);
288 const int nTH3Histos = TH3Names.size();
290 for (
auto&
h : mTH3Histos) {
291 h = std::make_unique<TH3F>(TH3Names[n3Histo], TH3Titles[n3Histo],
292 (
int)TH3Binning[n3Histo][0],
293 TH3Binning[n3Histo][1],
294 TH3Binning[n3Histo][2],
295 (
int)TH3Binning[n3Histo][3],
296 TH3Binning[n3Histo][4],
297 TH3Binning[n3Histo][5],
298 (
int)TH3Binning[n3Histo][6],
299 TH3Binning[n3Histo][7],
300 TH3Binning[n3Histo][8]);
301 h->GetXaxis()->SetTitle(TH3XaxisTitles[n3Histo]);
302 h->GetYaxis()->SetTitle(TH3YaxisTitles[n3Histo]);
303 h->GetZaxis()->SetTitle(TH3ZaxisTitles[n3Histo]);
315 mMFTTracks = ctx.
inputs().
get<gsl::span<o2::mft::TrackMFT>>(
"tracks");
316 mMFTTracksROF = ctx.
inputs().
get<gsl::span<o2::itsmft::ROFRecord>>(
"tracksrofs");
317 mMFTTrackClusIdx = ctx.
inputs().
get<gsl::span<int>>(
"trackClIdx");
320 mMFTClusters = ctx.
inputs().
get<gsl::span<o2::itsmft::CompClusterExt>>(
"compClusters");
321 mMFTClustersROF = ctx.
inputs().
get<gsl::span<o2::itsmft::ROFRecord>>(
"clustersrofs");
322 mMFTClusterPatterns = ctx.
inputs().
get<gsl::span<unsigned char>>(
"patterns");
323 pattIt = mMFTClusterPatterns.begin();
324 mMFTClustersGlobal.clear();
325 mMFTClustersGlobal.reserve(mMFTClusters.size());
331 mMFTTrackLabels = ctx.
inputs().
get<gsl::span<MCCompLabel>>(
"trklabels");
335 for (
const auto& rof : mMFTClustersROF) {
336 mClusterROFNEntries->Fill(rof.getNEntries());
338 mNOfClustersTime->Fill(seconds, rof.getNEntries());
341 for (
int icls = 0; icls < mMFTClusters.size(); ++icls) {
342 auto const oneCluster = mMFTClusters[icls];
343 auto const globalCluster = mMFTClustersGlobal[icls];
345 mClusterSensorIndex->Fill(oneCluster.getSensorID());
346 mClusterPatternIndex->Fill(oneCluster.getPatternID());
348 mMFTClsZ->Fill(globalCluster.getZ());
350 auto clsLayer = mMFTChipMapper.
chip2Layer(oneCluster.getChipID());
351 mMFTClsXYinLayer[clsLayer]->Fill(globalCluster.getX(), globalCluster.getY());
352 mMFTClsRinLayer[clsLayer]->Fill(std::sqrt(std::pow(globalCluster.getX(), 2) + std::pow(globalCluster.getY(), 2)));
353 mUnusedChips[oneCluster.getChipID()] =
false;
358 for (
const auto& rof : mMFTTracksROF) {
359 mTrackROFNEntries->Fill(rof.getNEntries());
360 mTracksBC->Fill(rof.getBCData().bc, rof.getNEntries());
362 mNOfTracksTime->Fill(seconds, rof.getNEntries());
365 std::array<std::array<int, 2>, 5> clsEntriesForRedundancy;
367 for (
auto& oneTrack : mMFTTracks) {
368 mTrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints());
369 mTrackChi2->Fill(oneTrack.getChi2OverNDF());
370 mTrackCharge->Fill(oneTrack.getCharge());
371 mTrackPhi->Fill(oneTrack.getPhi());
372 mTrackEta->Fill(oneTrack.getEta());
373 mTrackCotl->Fill(1. / oneTrack.getTanl());
374 mTrackChi2pT->Fill(oneTrack.getPt(), oneTrack.getChi2OverNDF());
376 for (
auto idisk = 0; idisk < 5; idisk++) {
377 clsEntriesForRedundancy[idisk] = {-1, -1};
380 auto ncls = oneTrack.getNumberOfPoints();
381 auto offset = oneTrack.getExternalClusterIndexOffset();
383 for (
int icls = 0; icls < ncls; ++icls)
386 auto clsEntry = mMFTTrackClusIdx[
offset + icls];
387 auto globalCluster = mMFTClustersGlobal[clsEntry];
389 mMFTClsOfTracksZ->Fill(globalCluster.getZ());
393 mMFTClsOfTracksXYinLayer[
layer]->Fill(globalCluster.getX(), globalCluster.getY());
395 int clsMFTdiskID =
layer / 2;
397 if (clsEntriesForRedundancy[clsMFTdiskID][0] != -1) {
398 clsEntriesForRedundancy[clsMFTdiskID][1] = clsEntry;
400 clsEntriesForRedundancy[clsMFTdiskID][0] = clsEntry;
404 for (
auto idisk = 0; idisk < 5; idisk++) {
405 if ((clsEntriesForRedundancy[idisk][0] != -1) && (clsEntriesForRedundancy[idisk][1] != -1)) {
406 auto globalCluster1 = mMFTClustersGlobal[clsEntriesForRedundancy[idisk][0]];
408 mMFTClsXYRedundantInDisk[idisk]->Fill(globalCluster1.getX(), globalCluster1.getY());
412 for (
auto minNClusters : sMinNClustersList) {
413 if (oneTrack.getNumberOfPoints() >= minNClusters) {
414 mTrackEtaNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta());
415 mTrackPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getPhi());
416 mTrackXYNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getX(), oneTrack.getY());
417 mTrackEtaPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta(), oneTrack.getPhi());
421 if (oneTrack.getCharge() == +1) {
422 mPositiveTrackPhi->Fill(oneTrack.getPhi());
423 mTrackInvQPt->Fill(1 / oneTrack.getPt());
426 if (oneTrack.getCharge() == -1) {
427 mNegativeTrackPhi->Fill(oneTrack.getPhi());
428 mTrackInvQPt->Fill(-1 / oneTrack.getPt());
431 if (oneTrack.isCA()) {
432 mCATrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints());
433 mCATrackEta->Fill(oneTrack.getEta());
435 if (oneTrack.isLTF()) {
436 mLTFTrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints());
437 mLTFTrackEta->Fill(oneTrack.getEta());
556 for (
const auto& fakeMFTTrackID : mFakeTracksVec) {
557 auto mftTrack = mMFTTracks[fakeMFTTrackID];
558 const auto& pt_Rec = mftTrack.getPt();
559 const auto& eta_Rec = mftTrack.getEta();
560 float phi_Rec = mftTrack.getPhi();
561 o2::math_utils::bringTo02Pi(phi_Rec);
562 const auto& Chi2_Rec = mftTrack.getChi2OverNDF();
564 mHistPtVsEta[
kRecoFake]->Fill(eta_Rec, pt_Rec);
565 mHistPhiVsEta[
kRecoFake]->Fill(eta_Rec, phi_Rec);
566 mHistPhiVsPt[
kRecoFake]->Fill(pt_Rec, phi_Rec);
567 mHistTrackChi2[
kRecoFake]->Fill(Chi2_Rec);
573 auto zVtx = evH.GetZ();
575 for (
const auto& trueMFTTrackID : mTrueTracksMap[
src][
event]) {
576 auto mftTrack = mMFTTracks[trueMFTTrackID];
577 const auto& trackLabel = mMFTTrackLabels[trueMFTTrackID];
578 if (trackLabel.isCorrect()) {
579 auto const* mcParticle = mMCReader.
getTrack(trackLabel);
582 if (TDatabasePDG::Instance()->GetParticle(pdgcode_MC)) {
583 Q_Gen = TDatabasePDG::Instance()->GetParticle(pdgcode_MC)->Charge() / 3;
588 auto etaGen = mcParticle->GetEta();
589 float phiGen = TMath::ATan2(mcParticle->Py(), mcParticle->Px());
590 o2::math_utils::bringTo02Pi(phiGen);
591 auto ptGen = mcParticle->GetPt();
592 auto vxGen = mcParticle->GetStartVertexCoordinatesX();
593 auto vyGen = mcParticle->GetStartVertexCoordinatesY();
594 auto vzGen = mcParticle->GetStartVertexCoordinatesZ();
595 auto R = sqrt(pow(vxGen, 2) + pow(vyGen, 2));
596 auto tanlGen = mcParticle->Pz() / mcParticle->GetPt();
597 auto invQPtGen = 1.0 * Q_Gen / ptGen;
600 mftTrack.propagateToZ(vzGen, mBz);
602 mftTrack.propagateToZlinear(vzGen);
605 const auto& pt_Rec = mftTrack.getPt();
606 const auto& invQPt_Rec = mftTrack.getInvQPt();
607 const auto& invQPt_Seed = mftTrack.getInvQPtSeed();
608 const auto& eta_Rec = mftTrack.getEta();
609 float phi_Rec = mftTrack.getPhi();
610 o2::math_utils::bringTo02Pi(phi_Rec);
611 const auto&
nClusters = mftTrack.getNumberOfPoints();
612 const auto& Chi2_Rec = mftTrack.getChi2OverNDF();
613 int Q_Rec = mftTrack.getCharge();
615 auto x_res = mftTrack.getX() - vxGen;
616 auto y_res = mftTrack.getY() - vyGen;
617 auto eta_res = mftTrack.getEta() - etaGen;
618 auto phi_res = mftTrack.getPhi() - phiGen;
619 auto cotl_res = (1. / mftTrack.getTanl()) - (1. / tanlGen);
620 auto invQPt_res = invQPt_Rec - invQPtGen;
621 mHistPtVsEta[
kRecoTrue]->Fill(eta_Rec, pt_Rec);
622 mHistPhiVsEta[
kRecoTrue]->Fill(eta_Rec, phi_Rec);
623 mHistPhiVsPt[
kRecoTrue]->Fill(pt_Rec, phi_Rec);
624 mHistTrackChi2[
kRecoTrue]->Fill(Chi2_Rec);
625 mHistZvtxVsEta[
kRecoTrue]->Fill(vzGen, eta_Rec);
627 mHistIsPrimary[
kRecoTrueMC]->Fill(mcParticle->isPrimary());
633 mHistPhiRecVsPhiGen->Fill(phiGen, phi_Rec);
634 mHistEtaRecVsEtaGen->Fill(etaGen, eta_Rec);
636 auto d_Charge = Q_Rec - Q_Gen;
637 mChargeMatchEff->Fill(!d_Charge, ptGen);
639 mTH3Histos[kTH3TrackDeltaXVertexPtEta]->Fill(ptGen, etaGen, 1e4 * x_res);
640 mTH3Histos[kTH3TrackDeltaYVertexPtEta]->Fill(ptGen, etaGen, 1e4 * y_res);
641 mTH3Histos[kTH3TrackDeltaXDeltaYEta]->Fill(etaGen, 1e4 * x_res, 1e4 * y_res);
642 mTH3Histos[kTH3TrackDeltaXDeltaYPt]->Fill(ptGen, 1e4 * x_res, 1e4 * y_res);
643 mTH3Histos[kTH3TrackXPullPtEta]->Fill(ptGen, etaGen, x_res / sqrt(mftTrack.getCovariances()(0, 0)));
644 mTH3Histos[kTH3TrackYPullPtEta]->Fill(ptGen, etaGen, y_res / sqrt(mftTrack.getCovariances()(1, 1)));
645 mTH3Histos[kTH3TrackPhiPullPtEta]->Fill(ptGen, etaGen, phi_res / sqrt(mftTrack.getCovariances()(2, 2)));
646 mTH3Histos[kTH3TrackCotlPullPtEta]->Fill(ptGen, etaGen, cotl_res / sqrt(1. / mftTrack.getCovariances()(3, 3)));
647 mTH3Histos[kTH3TrackInvQPtPullPtEta]->Fill(ptGen, etaGen, invQPt_res / sqrt(mftTrack.getCovariances()(4, 4)));
648 mTH3Histos[kTH3TrackInvQPtResolutionPtEta]->Fill(ptGen, etaGen, (invQPt_Rec - invQPtGen) / invQPtGen);
649 mTH3Histos[kTH3TrackInvQPtResSeedPtEta]->Fill(ptGen, etaGen, (invQPt_Seed - invQPtGen) / invQPtGen);
650 mTH3Histos[kTH3TrackReducedChi2PtEta]->Fill(ptGen, etaGen, Chi2_Rec / (2 *
nClusters - 5));
661 TH1F* mMFTDeadChipID =
new TH1F(
"mMFTDeadChipID",
"chipID of the dead chips; chipID; # entries", 936, -0.5, 935.5);
662 TH1F* mTFsCounter =
new TH1F(
"mTFsCounter",
"counter of TFs; count bin; # entries", 3, 0, 2);
665 for (
auto chipState : mUnusedChips) {
666 mMFTDeadChipID->Fill(chipID,
float(chipState));
669 mTFsCounter->Fill(1, mNumberTFs);
671 mMFTDeadChipID->Scale(mNumberTFs);
673 objar.Add(mTrackNumberOfClusters.get());
674 objar.Add(mCATrackNumberOfClusters.get());
675 objar.Add(mLTFTrackNumberOfClusters.get());
676 objar.Add(mTrackInvQPt.get());
677 objar.Add(mTrackChi2.get());
678 objar.Add(mTrackCharge.get());
679 objar.Add(mTrackPhi.get());
680 objar.Add(mPositiveTrackPhi.get());
681 objar.Add(mNegativeTrackPhi.get());
682 objar.Add(mTrackEta.get());
683 objar.Add(mTrackChi2pT.get());
686 objar.Add(mMFTClsZ.get());
687 objar.Add(mMFTClsOfTracksZ.get());
688 objar.Add(mMFTDeadChipID);
689 objar.Add(mTFsCounter);
690 for (
auto nMFTLayer = 0; nMFTLayer < 10; nMFTLayer++) {
691 objar.Add(mMFTClsXYinLayer[nMFTLayer].
get());
692 objar.Add(mMFTClsRinLayer[nMFTLayer].
get());
693 objar.Add(mMFTClsOfTracksXYinLayer[nMFTLayer].
get());
696 for (
auto nMFTDisk = 0; nMFTDisk < 5; nMFTDisk++) {
697 objar.Add(mMFTClsXYRedundantInDisk[nMFTDisk].
get());
700 for (
auto minNClusters : sMinNClustersList) {
701 auto nHisto = minNClusters - sMinNClustersList[0];
702 objar.Add(mTrackEtaNCls[nHisto].
get());
703 objar.Add(mTrackPhiNCls[nHisto].
get());
704 objar.Add(mTrackXYNCls[nHisto].
get());
705 objar.Add(mTrackEtaPhiNCls[nHisto].
get());
707 objar.Add(mCATrackEta.get());
708 objar.Add(mLTFTrackEta.get());
709 objar.Add(mTrackCotl.get());
711 objar.Add(mTrackROFNEntries.get());
712 objar.Add(mClusterROFNEntries.get());
714 objar.Add(mTracksBC.get());
715 objar.Add(mNOfTracksTime.get());
716 objar.Add(mNOfClustersTime.get());
718 objar.Add(mClusterSensorIndex.get());
719 objar.Add(mClusterPatternIndex.get());
721 for (
int trackType = 0; trackType < mLastTrackType; trackType++) {
722 objar.Add(mHistPhiVsEta[trackType].
get());
723 objar.Add(mHistPtVsEta[trackType].
get());
724 objar.Add(mHistPhiVsPt[trackType].
get());
726 objar.Add(mHistTrackChi2[trackType].
get());
729 objar.Add(mHistZvtxVsEta[trackType].
get());
732 objar.Add(mHistRVsZ[trackType].
get());
733 objar.Add(mHistIsPrimary[trackType].
get());
738 objar.Add(mHistPhiRecVsPhiGen.get());
739 objar.Add(mHistEtaRecVsEtaGen.get());
743 for (
auto&
h : mTH3Histos) {
747 if (mFinalizeAnalysis) {
748 objar.Add(mHistVxtOffsetProjection.get());
751 objar.Add(mChargeMatchEff.get());
753 if (mFinalizeAnalysis) {
754 for (
int slicedCanvas = 0; slicedCanvas < kNSlicedTH3; slicedCanvas++) {
755 objar.Add(mSlicedCanvas[slicedCanvas]);
849 if (mFinalizeAnalysis) {
850 throw std::runtime_error(
"MFTAssessment error: data already loaded");
852 mFinalizeAnalysis =
true;
856 TFile*
f =
new TFile(Form(
"MFTAssessment.root"));
858 mTrackNumberOfClusters = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackNumberOfClusters"));
860 mCATrackNumberOfClusters = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTCATrackNumberOfClusters"));
862 mLTFTrackNumberOfClusters = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTLTFTrackNumberOfClusters"));
864 mTrackInvQPt = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackInvQPt"));
866 mTrackChi2 = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackChi2"));
868 mTrackCharge = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackCharge"));
870 mTrackPhi = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackPhi"));
872 mPositiveTrackPhi = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTPositiveTrackPhi"));
874 mNegativeTrackPhi = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTNegativeTrackPhi"));
876 mTrackEta = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackEta"));
878 mTrackChi2pT = std::unique_ptr<TH2F>((TH2F*)
f->Get(
"mMFTTrackChi2pT"));
882 mMFTClsZ = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTClsZ"));
884 mMFTClsOfTracksZ = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTClsOfTracksZ"));
886 for (
auto nMFTLayer = 0; nMFTLayer < 10; nMFTLayer++) {
887 mMFTClsXYinLayer[nMFTLayer] = std::unique_ptr<TH2F>((TH2F*)
f->Get(Form(
"mMFTClsXYinLayer%d", nMFTLayer)));
888 mMFTClsRinLayer[nMFTLayer] = std::unique_ptr<TH1F>((TH1F*)
f->Get(Form(
"mMFTClsRinLayer%d", nMFTLayer)));
889 mMFTClsOfTracksXYinLayer[nMFTLayer] = std::unique_ptr<TH2F>((TH2F*)
f->Get(Form(
"mMFTClsOfTracksXYinLayer%d", nMFTLayer)));
892 for (
auto nMFTDisk = 0; nMFTDisk < 5; nMFTDisk++) {
893 mMFTClsXYRedundantInDisk[nMFTDisk] = std::unique_ptr<TH2F>((TH2F*)
f->Get(Form(
"mMFTClsXYRedundantInDisk%d", nMFTDisk)));
896 for (
auto minNClusters : sMinNClustersList) {
897 auto nHisto = minNClusters - sMinNClustersList[0];
898 mTrackEtaNCls[nHisto] = std::unique_ptr<TH1F>((TH1F*)
f->Get(Form(
"mMFTTrackEta_%d_MinClusters", minNClusters)));
900 mTrackPhiNCls[nHisto] = std::unique_ptr<TH1F>((TH1F*)
f->Get(Form(
"mMFTTrackPhi_%d_MinClusters", minNClusters)));
902 mTrackXYNCls[nHisto] = std::unique_ptr<TH2F>((TH2F*)
f->Get(Form(
"mMFTTrackXY_%d_MinClusters", minNClusters)));
904 mTrackEtaPhiNCls[nHisto] = std::unique_ptr<TH2F>((TH2F*)
f->Get(Form(
"mMFTTrackEtaPhi_%d_MinClusters", minNClusters)));
907 mCATrackEta = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTCATrackEta"));
909 mLTFTrackEta = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTLTFTrackEta"));
911 mTrackCotl = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackCotl"));
913 mClusterROFNEntries = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTClustersROFSize"));
915 mTrackROFNEntries = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTrackROFSize"));
917 mTracksBC = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTTracksBC"));
919 mNOfTracksTime = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mNOfTracksTime"));
921 mNOfClustersTime = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mNOfClustersTime"));
923 mClusterSensorIndex = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTClusterSensorIndex"));
925 mClusterPatternIndex = std::unique_ptr<TH1F>((TH1F*)
f->Get(
"mMFTClusterPatternIndex"));
927 for (
int trackType = 0; trackType < mLastTrackType; trackType++) {
928 mHistPhiVsEta[trackType] = std::unique_ptr<TH2F>((TH2F*)
f->Get((std::string(
"mHistPhiVsEta") + mNameOfTrackTypes[trackType]).c_str()));
930 mHistPtVsEta[trackType] = std::unique_ptr<TH2F>((TH2F*)
f->Get((std::string(
"mHistPtVsEta") + mNameOfTrackTypes[trackType]).c_str()));
932 mHistPhiVsPt[trackType] = std::unique_ptr<TH2F>((TH2F*)
f->Get((std::string(
"mHistPhiVsPt") + mNameOfTrackTypes[trackType]).c_str()));
935 mHistTrackChi2[trackType] = std::unique_ptr<TH1F>((TH1F*)
f->Get((std::string(
"mHistTrackChi2") + mNameOfTrackTypes[trackType]).c_str()));
939 mHistZvtxVsEta[trackType] = std::unique_ptr<TH2F>((TH2F*)
f->Get((std::string(
"mHistZvtxVsEta") + mNameOfTrackTypes[trackType]).c_str()));
942 mHistRVsZ[trackType] = std::unique_ptr<TH2F>((TH2F*)
f->Get((std::string(
"mHistRVsZ") + mNameOfTrackTypes[trackType]).c_str()));
943 mHistIsPrimary[trackType] = std::unique_ptr<TH1F>((TH1F*)
f->Get((std::string(
"mHistIsPrimary") + mNameOfTrackTypes[trackType]).c_str()));
950 mHistPhiRecVsPhiGen = std::unique_ptr<TH2F>((TH2F*)
f->Get(
"mHistPhiRecVsPhiGen"));
952 mHistEtaRecVsEtaGen = std::unique_ptr<TH2F>((TH2F*)
f->Get(
"mHistEtaRecVsEtaGen"));
955 mChargeMatchEff = std::unique_ptr<TEfficiency>((TEfficiency*)
f->Get(
"QMatchEff"));
957 const int nTH3Histos = TH3Names.size();
959 for (
auto&
h : mTH3Histos) {
960 h = std::unique_ptr<TH3F>((TH3F*)
f->Get(TH3Names[n3Histo]));