123 auto MaxClusterROFSize = 25000;
124 auto MaxTrackROFSize = 5000;
125 auto ROFLengthInBC = 198;
126 auto ROFsPerOrbit = o2::constants::lhc::LHCMaxBunches / ROFLengthInBC;
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);
196 mTracksBC = std::make_unique<TH1F>(
"mMFTTracksBC",
"Tracks per BC (sum over orbits); BCid; # entries", ROFsPerOrbit, 0, o2::constants::lhc::LHCMaxBunches);
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());
337 float seconds =
orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1
e-9;
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());
361 float seconds =
orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1
e-9;
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;
599 if (std::abs(mftTrack.getInvQPt()) > o2::constants::math::Almost0) {
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]));
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in maximum chi2 per attached tracklet for TRD tracks take into account the full likelihood of the slope including exponential tails Tracks with less attached tracklets are discarded after the tracking Post trigger Pile up integration time in BCs fits all iterations but the last one in projections Use material lookup table for TPC refit Apply workarounds to avoid cyclic merge should not be needed tpc dyn configStandalone Processing proc_rtc Replace constant variables static by constexpr expressions Compile RTC in deterministic with NO_FAST_MATH flags and GPUCA_DETERMINISTIC_MODE define Use RTC to optimize GPU code h configStandalone Processing proc_rtctech Use a file lock to serialize access to the cache folder Print launch bounds used for RTC code as debugging option