1414// / \since 01/12/2024
1515// / \brief task to evaluate flow with respect to spectator plane.
1616
17- #include < CCDB/BasicCCDBManager.h>
18- #include < DataFormatsParameters/GRPObject.h>
19- #include < DataFormatsParameters/GRPMagField.h>
2017#include < algorithm>
2118#include < numeric>
2219#include < vector>
2926#include " Framework/RunningWorkflowInfo.h"
3027#include " Framework/HistogramRegistry.h"
3128#include " Framework/O2DatabasePDGPlugin.h"
29+ #include " CCDB/BasicCCDBManager.h"
30+ #include " DataFormatsParameters/GRPObject.h"
31+ #include " DataFormatsParameters/GRPMagField.h"
32+ #include " DataFormatsParameters/GRPLHCIFData.h"
3233
3334#include " Common/DataModel/EventSelection.h"
3435#include " Common/Core/TrackSelection.h"
@@ -93,6 +94,7 @@ struct FlowSP {
9394 O2_DEFINE_CONFIGURABLE (cfgTrackSelsDCApt1, float , 0.1 , " DcaZ < a * b / pt^1.1 -> this sets a" );
9495 O2_DEFINE_CONFIGURABLE (cfgTrackSelsDCApt2, float , 0.035 , " DcaZ < a * b / pt^1.1 -> this sets b" );
9596 O2_DEFINE_CONFIGURABLE (cfgTrackSelsPIDNsigma, float , 2.0 , " nSigma cut for PID" );
97+ O2_DEFINE_CONFIGURABLE (cfgTrackSelDoTrackQAvsCent, bool , true , " Do track selection QA plots as function of centrality" );
9698 // Additional event selections
9799 O2_DEFINE_CONFIGURABLE (cfgEvSelsUseAdditionalEventCut, bool , true , " Bool to enable Additional Event Cut" );
98100 O2_DEFINE_CONFIGURABLE (cfgEvSelsMaxOccupancy, int , 10000 , " Maximum occupancy of selected events" );
@@ -366,15 +368,6 @@ struct FlowSP {
366368
367369 if (cfgFillTrackQA) {
368370 registry.add (" QA/after/pt_phi" , " " , {HistType::kTH2D , {axisPt, axisPhiMod}});
369- registry.add <TH1>(" incl/QA/after/hPt" , " " , kTH1D , {axisPt});
370- registry.add <TH1>(" incl/QA/after/hPt_forward" , " " , kTH1D , {axisPt});
371- registry.add <TH1>(" incl/QA/after/hPt_forward_uncorrected" , " " , kTH1D , {axisPt});
372- registry.add <TH1>(" incl/QA/after/hPt_backward" , " " , kTH1D , {axisPt});
373- registry.add <TH1>(" incl/QA/after/hPt_backward_uncorrected" , " " , kTH1D , {axisPt});
374- registry.add <TH1>(" incl/QA/after/hPhi" , " " , kTH1D , {axisPhi});
375- registry.add <TH1>(" incl/QA/after/hPhi_uncorrected" , " " , kTH1D , {axisPhi});
376- registry.add <TH1>(" incl/QA/after/hEta" , " " , kTH1D , {axisEta});
377- registry.add <TH1>(" incl/QA/after/hEta_uncorrected" , " " , kTH1D , {axisEta});
378371 registry.add <TH3>(" incl/QA/after/hPhi_Eta_vz" , " " , kTH3D , {axisPhi, axisEta, axisVz});
379372 registry.add <TH3>(" incl/QA/after/hPhi_Eta_vz_corrected" , " " , kTH3D , {axisPhi, axisEta, axisVz});
380373 registry.add <TH2>(" incl/QA/after/hDCAxy_pt" , " " , kTH2D , {axisPt, axisDCAxy});
@@ -383,6 +376,28 @@ struct FlowSP {
383376 registry.add (" incl/QA/after/hCrossedRows_pt" , " " , {HistType::kTH2D , {axisPt, axisCl}});
384377 registry.add (" incl/QA/after/hCrossedRows_vs_SharedClusters" , " " , {HistType::kTH2D , {axisCl, axisShCl}});
385378
379+ if (cfgTrackSelDoTrackQAvsCent){
380+ registry.add <TH2>(" incl/QA/after/hPt" , " " , kTH2D , {axisPt, axisCent});
381+ registry.add <TH2>(" incl/QA/after/hPt_forward" , " " , kTH2D , {axisPt, axisCent});
382+ registry.add <TH2>(" incl/QA/after/hPt_forward_uncorrected" , " " , kTH2D , {axisPt, axisCent});
383+ registry.add <TH2>(" incl/QA/after/hPt_backward" , " " , kTH2D , {axisPt, axisCent});
384+ registry.add <TH2>(" incl/QA/after/hPt_backward_uncorrected" , " " , kTH2D , {axisPt, axisCent});
385+ registry.add <TH2>(" incl/QA/after/hPhi" , " " , kTH2D , {axisPhi, axisCent});
386+ registry.add <TH2>(" incl/QA/after/hPhi_uncorrected" , " " , kTH2D , {axisPhi, axisCent});
387+ registry.add <TH2>(" incl/QA/after/hEta" , " " , kTH2D , {axisEta, axisCent});
388+ registry.add <TH2>(" incl/QA/after/hEta_uncorrected" , " " , kTH2D , {axisEta, axisCent});
389+ } else {
390+ registry.add <TH1>(" incl/QA/after/hPt" , " " , kTH1D , {axisPt});
391+ registry.add <TH1>(" incl/QA/after/hPt_forward" , " " , kTH1D , {axisPt});
392+ registry.add <TH1>(" incl/QA/after/hPt_forward_uncorrected" , " " , kTH1D , {axisPt});
393+ registry.add <TH1>(" incl/QA/after/hPt_backward" , " " , kTH1D , {axisPt});
394+ registry.add <TH1>(" incl/QA/after/hPt_backward_uncorrected" , " " , kTH1D , {axisPt});
395+ registry.add <TH1>(" incl/QA/after/hPhi" , " " , kTH1D , {axisPhi});
396+ registry.add <TH1>(" incl/QA/after/hPhi_uncorrected" , " " , kTH1D , {axisPhi});
397+ registry.add <TH1>(" incl/QA/after/hEta" , " " , kTH1D , {axisEta});
398+ registry.add <TH1>(" incl/QA/after/hEta_uncorrected" , " " , kTH1D , {axisEta});
399+ }
400+
386401 if (cfgFillQABefore)
387402 registry.addClone (" incl/QA/after/" , " incl/QA/before/" );
388403 }
@@ -641,7 +656,7 @@ struct FlowSP {
641656 return -1 ;
642657 }
643658
644- int getMagneticField (uint64_t timestamp)
659+ int getMagneticField (uint64_t timestamp)
645660 {
646661 // TODO done only once (and not per run). Will be replaced by CCDBConfigurable
647662 static o2::parameters::GRPMagField* grpo = nullptr ;
@@ -656,6 +671,19 @@ struct FlowSP {
656671 return grpo->getNominalL3Field ();
657672 }
658673
674+ std::pair<float , long > getCrossingAngleCCDB (uint64_t timestamp)
675+ {
676+ // TODO done only once (and not per run). Will be replaced by CCDBConfigurable
677+ auto grpo = ccdb->getForTimeStamp <o2::parameters::GRPLHCIFData>(" GLO/Config/GRPLHCIF" , timestamp);
678+ if (grpo == nullptr ) {
679+ LOGF (fatal, " GRP object for Crossing Angle not found for timestamp %llu" , timestamp);
680+ return {0 , 0 };
681+ }
682+ float crossingAngle = grpo->getCrossingAngle ();
683+ long crossingAngleTime = grpo->getCrossingAngleTime ();
684+ return {crossingAngle, crossingAngleTime};
685+ }
686+
659687 // From Generic Framework
660688 void loadCorrections (uint64_t timestamp)
661689 {
@@ -916,7 +944,7 @@ struct FlowSP {
916944 registry.fill (HIST (" QA/" ) + HIST (Time[ft]) + HIST (" /CentFT0C_vs_CentNGlobal" ), collision.centFT0C (), collision.centNGlobal (), centWeight);
917945
918946 if (cfgFillEventPlaneQA) {
919- if constexpr (framework::has_type_v<aod::sptablezdc::Vx, typename CollisionObject::all_columns>) {
947+ if constexpr (o2:: framework::has_type_v<aod::sptablezdc::Vx, typename CollisionObject::all_columns>) {
920948 double psiA = 1.0 * std::atan2 (collision.qyA (), collision.qxA ());
921949 double psiC = 1.0 * std::atan2 (collision.qyC (), collision.qxC ());
922950 double psiFull = 1.0 * std::atan2 (collision.qyA () + collision.qyC (), collision.qxA () + collision.qxC ());
@@ -1074,6 +1102,36 @@ struct FlowSP {
10741102 registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hCrossedRows_vs_SharedClusters" ), track.tpcNClsFound (), track.tpcFractionSharedCls (), wacc * weff);
10751103 }
10761104
1105+ template <FillType ft, ChargeType ct, ParticleType pt, typename TrackObject>
1106+ inline void fillTrackQA (TrackObject track, double vz, double centrality, float wacc = 1 , float weff = 1 )
1107+ {
1108+ if (!cfgFillTrackQA)
1109+ return ;
1110+
1111+ static constexpr std::string_view Time[] = {" before/" , " after/" };
1112+ // NOTE: species[kUnidentified] = "" (when no PID)
1113+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPt" ), track.pt (), centrality, wacc * weff);
1114+ if (track.eta () > 0 ) {
1115+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPt_forward" ), track.pt (), centrality, wacc * weff);
1116+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPt_forward_uncorrected" ), track.pt (), centrality);
1117+ } else {
1118+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPt_backward" ), track.pt (), centrality, wacc * weff);
1119+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPt_backward_uncorrected" ), track.pt (), centrality);
1120+ }
1121+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPhi" ), track.phi (), centrality, wacc);
1122+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPhi_uncorrected" ), track.phi (), centrality);
1123+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hEta" ), track.eta (), centrality, wacc);
1124+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hEta_uncorrected" ), track.eta (), centrality);
1125+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPhi_Eta_vz" ), track.phi (), track.eta (), vz);
1126+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hPhi_Eta_vz_corrected" ), track.phi (), track.eta (), vz, wacc);
1127+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hDCAxy_pt" ), track.pt (), track.dcaXY (), wacc * weff);
1128+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hDCAz_pt" ), track.pt (), track.dcaZ (), wacc * weff);
1129+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hSharedClusters_pt" ), track.pt (), track.tpcFractionSharedCls (), wacc * weff);
1130+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hCrossedRows_pt" ), track.pt (), track.tpcNClsFound (), wacc * weff);
1131+ registry.fill (HIST (Charge[ct]) + HIST (Species[pt]) + HIST (" QA/" ) + HIST (Time[ft]) + HIST (" hCrossedRows_vs_SharedClusters" ), track.tpcNClsFound (), track.tpcFractionSharedCls (), wacc * weff);
1132+ }
1133+
1134+
10771135 template <FillType ft, ChargeType ct, typename TrackObject>
10781136 inline void fillPIDQA (TrackObject track)
10791137 {
@@ -1141,15 +1199,27 @@ struct FlowSP {
11411199 }
11421200
11431201 template <FillType ft, ParticleType ct, typename TrackObject>
1144- void fillAllQA (TrackObject track, double vtxz, bool pos, float wacc = 1 , float weff = 1 , float waccP = 1 , float weffP = 1 , float waccN = 1 , float weffN = 1 )
1202+ void fillAllQA (TrackObject track, double vtxz, double centrality, bool pos, float wacc = 1 , float weff = 1 , float waccP = 1 , float weffP = 1 , float waccN = 1 , float weffN = 1 )
11451203 {
1146- fillTrackQA<ft, kInclusive , ct>(track, vtxz, wacc, weff);
1204+ if (!cfgTrackSelDoTrackQAvsCent) {
1205+ fillTrackQA<ft, kInclusive , ct>(track, vtxz, wacc, weff);
1206+ } else {
1207+ fillTrackQA<ft, kInclusive , ct>(track, vtxz, centrality, wacc, weff);
1208+ }
11471209 fillPIDQA<ft, kInclusive >(track);
11481210 if (pos) {
1211+ if (!cfgTrackSelDoTrackQAvsCent) {
11491212 fillTrackQA<ft, kPositive , ct>(track, vtxz, waccP, weffP);
1213+ } else {
1214+ fillTrackQA<ft, kPositive , ct>(track, vtxz, centrality, waccP, weffP);
1215+ }
11501216 fillPIDQA<ft, kPositive >(track);
11511217 } else {
1152- fillTrackQA<ft, kNegative , ct>(track, vtxz, waccN, weffN);
1218+ if (!cfgTrackSelDoTrackQAvsCent) {
1219+ fillTrackQA<ft, kNegative , ct>(track, vtxz, waccN, weffN);
1220+ } else {
1221+ fillTrackQA<ft, kNegative , ct>(track, vtxz, centrality, waccN, weffN);
1222+ }
11531223 fillPIDQA<ft, kNegative >(track);
11541224 }
11551225 }
@@ -1291,16 +1361,16 @@ struct FlowSP {
12911361 if (cfgFillQABefore) {
12921362 switch (trackPID) {
12931363 case kUnidentified :
1294- fillAllQA<kBefore , kUnidentified >(track, vtxz, pos);
1364+ fillAllQA<kBefore , kUnidentified >(track, vtxz, centrality, pos);
12951365 break ;
12961366 case kPion :
1297- fillAllQA<kBefore , kPion >(track, vtxz, pos);
1367+ fillAllQA<kBefore , kPion >(track, vtxz, centrality, pos);
12981368 break ;
12991369 case kKaon :
1300- fillAllQA<kBefore , kKaon >(track, vtxz, pos);
1370+ fillAllQA<kBefore , kKaon >(track, vtxz, centrality, pos);
13011371 break ;
13021372 case kProton :
1303- fillAllQA<kBefore , kProton >(track, vtxz, pos);
1373+ fillAllQA<kBefore , kProton >(track, vtxz, centrality, pos);
13041374 break ;
13051375 }
13061376 }
@@ -1345,16 +1415,16 @@ struct FlowSP {
13451415
13461416 switch (trackPID) {
13471417 case kUnidentified :
1348- fillAllQA<kAfter , kUnidentified >(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1418+ fillAllQA<kAfter , kUnidentified >(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13491419 break ;
13501420 case kPion :
1351- fillAllQA<kAfter , kPion >(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1421+ fillAllQA<kAfter , kPion >(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13521422 break ;
13531423 case kKaon :
1354- fillAllQA<kAfter , kKaon >(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1424+ fillAllQA<kAfter , kKaon >(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13551425 break ;
13561426 case kProton :
1357- fillAllQA<kAfter , kProton >(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1427+ fillAllQA<kAfter , kProton >(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13581428 break ;
13591429 }
13601430
0 commit comments