1212// / \file eventSelectionQa.cxx
1313// / \brief Event selection QA task
1414// /
15- // / \author Evgeny Kryshen <evgeny.kryshen@cern.ch>
15+ // / \author Evgeny Kryshen <evgeny.kryshen@cern.ch> and Igor Altsybeev <Igor.Altsybeev@cern.ch>
1616
17- #include < map>
18- #include < vector>
19- #include < string>
20- #include < unordered_map>
21-
22- #include " Framework/runDataProcessing.h"
23- #include " Framework/AnalysisTask.h"
24- #include " Framework/AnalysisDataModel.h"
25- #include " Common/DataModel/EventSelection.h"
2617#include " Common/CCDB/EventSelectionParams.h"
18+ #include " Common/DataModel/EventSelection.h"
19+
2720#include " CCDB/BasicCCDBManager.h"
28- #include " Framework/HistogramRegistry.h"
2921#include " CommonDataFormat/BunchFilling.h"
30- #include " DataFormatsParameters/GRPLHCIFData.h"
31- #include " DataFormatsParameters/GRPECSObject.h"
32- #include " DataFormatsParameters/AggregatedRunInfo.h"
3322#include " DataFormatsITSMFT/NoiseMap.h" // missing include in TimeDeadMap.h
34- #include " DataFormatsITSMFT/TimeDeadMap.h"
3523#include " DataFormatsITSMFT/ROFRecord.h"
36- #include " ReconstructionDataFormats/Vertex.h"
24+ #include " DataFormatsITSMFT/TimeDeadMap.h"
25+ #include " DataFormatsParameters/AggregatedRunInfo.h"
26+ #include " DataFormatsParameters/GRPECSObject.h"
27+ #include " DataFormatsParameters/GRPLHCIFData.h"
28+ #include " Framework/AnalysisDataModel.h"
29+ #include " Framework/AnalysisTask.h"
30+ #include " Framework/HistogramRegistry.h"
31+ #include " Framework/runDataProcessing.h"
3732#include " ITSMFTBase/DPLAlpideParam.h"
3833#include " ITSMFTReconstruction/ChipMappingITS.h"
34+ #include " ReconstructionDataFormats/Vertex.h"
35+
3936#include " TH1F.h"
4037#include " TH2F.h"
4138
39+ #include < map>
40+ #include < string>
41+ #include < unordered_map>
42+ #include < vector>
43+
4244using namespace o2 ::framework;
4345using namespace o2 ;
4446using namespace o2 ::aod::evsel;
@@ -361,7 +363,17 @@ struct EventSelectionQaTask {
361363 // requested by TPC experts: nTPConly tracks vs occupancy
362364 histos.add (" occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks});
363365 histos.add (" occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks});
364-
366+ // request from experts to add track properties vs occupancy, to compare data vs MC
367+ const AxisSpec axisOccupancyForTrackQA{60 , 0 ., 15000 , " occupancy (n ITS tracks weighted)" };
368+ const AxisSpec axisNTPCcls{150 , 0 , 150 , " n TPC clusters" };
369+ histos.add (" occupancyQA/tpcNClsFound_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNTPCcls, axisOccupancyForTrackQA});
370+ histos.add (" occupancyQA/tpcNClsFindable_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNTPCcls, axisOccupancyForTrackQA});
371+ histos.add (" occupancyQA/tpcNClsShared_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNTPCcls, axisOccupancyForTrackQA});
372+ histos.add (" occupancyQA/tpcNCrossedRows_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisNTPCcls, axisOccupancyForTrackQA});
373+ const AxisSpec axisChi2TPC{150 , 0 , 15 , " chi2Ncl TPC" };
374+ histos.add (" occupancyQA/tpcChi2_vs_V0A_vs_occupancy" , " " , kTH3F , {axisMultV0AForOccup, axisChi2TPC, axisOccupancyForTrackQA});
375+
376+ // ITS in-ROF occupancy
365377 histos.add (" occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF" , " ;nITStracks event #1;nITStracks event #2" , kTH2D , {{200 , 0 ., 6000 }, {200 , 0 ., 6000 }});
366378 histos.add (" occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_UPC" , " ;nITStracks event #1;nITStracks event #2" , kTH2D , {{41 , -0.5 , 40.5 }, {41 , -0.5 , 40.5 }});
367379 histos.add (" occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_nonUPC" , " ;nITStracks event #1;nITStracks event #2" , kTH2D , {{200 , 0 ., 6000 }, {200 , 0 ., 6000 }});
@@ -1128,6 +1140,10 @@ struct EventSelectionQaTask {
11281140 int nTracksITSTPC = 0 ;
11291141
11301142 bool isTVX = col.selection_bit (kIsTriggerTVX );
1143+
1144+ int occupancyByTracks = col.trackOccupancyInTimeRange ();
1145+ float occupancyByFT0C = col.ft0cOccupancyInTimeRange ();
1146+
11311147 for (const auto & track : tracksGrouped) {
11321148 int trackBcDiff = bcDiff + track.trackTime () / o2::constants::lhc::LHCBunchSpacingNS;
11331149
@@ -1158,7 +1174,19 @@ struct EventSelectionQaTask {
11581174 nPV++;
11591175 if (track.hasTPC ()) {
11601176 nContributorsAfterEtaTPCLooseCuts++;
1161- }
1177+
1178+ if (!isLowFlux && col.sel8 () && col.selection_bit (kNoSameBunchPileup ) && fabs (col.posZ ()) < 10 && occupancyByTracks >= 0 ) {
1179+ histos.fill (HIST (" occupancyQA/tpcNClsFound_vs_V0A_vs_occupancy" ), multV0A, track.tpcNClsFound (), occupancyByTracks);
1180+ histos.fill (HIST (" occupancyQA/tpcNClsFindable_vs_V0A_vs_occupancy" ), multV0A, track.tpcNClsFindable (), occupancyByTracks);
1181+ histos.fill (HIST (" occupancyQA/tpcNClsShared_vs_V0A_vs_occupancy" ), multV0A, track.tpcNClsShared (), occupancyByTracks);
1182+ histos.fill (HIST (" occupancyQA/tpcChi2_vs_V0A_vs_occupancy" ), multV0A, track.tpcChi2NCl (), occupancyByTracks);
1183+ int tpcNClsFindableMinusCrossedRowsCorrected = track.tpcNClsFindableMinusCrossedRows ();
1184+ // correct for a buggy behaviour due to int8 and uint8 difference:
1185+ if (tpcNClsFindableMinusCrossedRowsCorrected < -70 )
1186+ tpcNClsFindableMinusCrossedRowsCorrected += 256 ;
1187+ histos.fill (HIST (" occupancyQA/tpcNCrossedRows_vs_V0A_vs_occupancy" ), multV0A, track.tpcNClsFindable () - tpcNClsFindableMinusCrossedRowsCorrected, occupancyByTracks);
1188+ }
1189+ } // end of hasTPC
11621190 if (track.tpcNClsFound () > 70 && track.tpcNClsCrossedRows () > 80 && track.itsChi2NCl () < 36 && track.tpcChi2NCl () < 4 ) {
11631191 nContributorsAfterEtaTPCCuts++;
11641192 // ROF border QA
@@ -1183,10 +1211,8 @@ struct EventSelectionQaTask {
11831211
11841212 histos.fill (HIST (" hNcontribAfterCutsVsBcInTF" ), bcInTF, nContributorsAfterEtaTPCCuts);
11851213
1186- if (!isLowFlux && col.sel8 () && fabs (col.posZ ()) < 10 ) {
1187- int occupancyByTracks = col.trackOccupancyInTimeRange ();
1214+ if (!isLowFlux && col.sel8 () && col.selection_bit (kNoSameBunchPileup ) && fabs (col.posZ ()) < 10 ) {
11881215 histos.fill (HIST (" occupancyQA/hOccupancyByTracks" ), occupancyByTracks);
1189- float occupancyByFT0C = col.ft0cOccupancyInTimeRange ();
11901216 histos.fill (HIST (" occupancyQA/hOccupancyByFT0C" ), occupancyByFT0C);
11911217 if (occupancyByTracks >= 0 ) {
11921218 histos.fill (HIST (" occupancyQA/hOccupancyByFT0CvsByTracks" ), occupancyByTracks, occupancyByFT0C);
0 commit comments