Skip to content

Commit 26dd4d0

Browse files
cnkosteralibuild
andauthored
[PWGCF] Add options for 2D QA track histos for centrality dependence (#12249)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 42bd47f commit 26dd4d0

File tree

1 file changed

+114
-42
lines changed

1 file changed

+114
-42
lines changed

PWGCF/Flow/Tasks/flowSP.cxx

Lines changed: 114 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,39 @@
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>
20-
#include <algorithm>
21-
#include <numeric>
22-
#include <vector>
23-
#include <string>
24-
#include <unordered_map>
17+
#include "GFWWeights.h"
2518

26-
#include "Framework/runDataProcessing.h"
27-
#include "Framework/AnalysisTask.h"
28-
#include "Framework/ASoAHelpers.h"
29-
#include "Framework/RunningWorkflowInfo.h"
30-
#include "Framework/HistogramRegistry.h"
31-
#include "Framework/O2DatabasePDGPlugin.h"
19+
#include "PWGCF/DataModel/SPTableZDC.h"
3220

33-
#include "Common/DataModel/EventSelection.h"
21+
#include "Common/Core/RecoDecay.h"
3422
#include "Common/Core/TrackSelection.h"
35-
#include "Common/DataModel/TrackSelectionTables.h"
36-
#include "Common/DataModel/Multiplicity.h"
3723
#include "Common/DataModel/Centrality.h"
38-
#include "Common/Core/RecoDecay.h"
24+
#include "Common/DataModel/EventSelection.h"
25+
#include "Common/DataModel/Multiplicity.h"
3926
#include "Common/DataModel/PIDResponse.h"
27+
#include "Common/DataModel/TrackSelectionTables.h"
28+
29+
#include "CCDB/BasicCCDBManager.h"
30+
#include "DataFormatsParameters/GRPLHCIFData.h"
31+
#include "DataFormatsParameters/GRPMagField.h"
32+
#include "DataFormatsParameters/GRPObject.h"
33+
#include "Framework/ASoAHelpers.h"
34+
#include "Framework/AnalysisTask.h"
35+
#include "Framework/HistogramRegistry.h"
36+
#include "Framework/O2DatabasePDGPlugin.h"
37+
#include "Framework/RunningWorkflowInfo.h"
38+
#include "Framework/runDataProcessing.h"
4039

41-
#include "PWGCF/DataModel/SPTableZDC.h"
42-
#include "GFWWeights.h"
4340
#include "TF1.h"
4441
#include "TPDGCode.h"
4542

43+
#include <algorithm>
44+
#include <numeric>
45+
#include <string>
46+
#include <unordered_map>
47+
#include <utility>
48+
#include <vector>
49+
4650
using namespace o2;
4751
using namespace o2::framework;
4852
using namespace o2::framework::expressions;
@@ -93,6 +97,7 @@ struct FlowSP {
9397
O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt1, float, 0.1, "DcaZ < a * b / pt^1.1 -> this sets a");
9498
O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt2, float, 0.035, "DcaZ < a * b / pt^1.1 -> this sets b");
9599
O2_DEFINE_CONFIGURABLE(cfgTrackSelsPIDNsigma, float, 2.0, "nSigma cut for PID");
100+
O2_DEFINE_CONFIGURABLE(cfgTrackSelDoTrackQAvsCent, bool, true, "Do track selection QA plots as function of centrality");
96101
// Additional event selections
97102
O2_DEFINE_CONFIGURABLE(cfgEvSelsUseAdditionalEventCut, bool, true, "Bool to enable Additional Event Cut");
98103
O2_DEFINE_CONFIGURABLE(cfgEvSelsMaxOccupancy, int, 10000, "Maximum occupancy of selected events");
@@ -366,15 +371,6 @@ struct FlowSP {
366371

367372
if (cfgFillTrackQA) {
368373
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});
378374
registry.add<TH3>("incl/QA/after/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz});
379375
registry.add<TH3>("incl/QA/after/hPhi_Eta_vz_corrected", "", kTH3D, {axisPhi, axisEta, axisVz});
380376
registry.add<TH2>("incl/QA/after/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy});
@@ -383,6 +379,28 @@ struct FlowSP {
383379
registry.add("incl/QA/after/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}});
384380
registry.add("incl/QA/after/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}});
385381

382+
if (cfgTrackSelDoTrackQAvsCent) {
383+
registry.add<TH2>("incl/QA/after/hPt", "", kTH2D, {axisPt, axisCent});
384+
registry.add<TH2>("incl/QA/after/hPt_forward", "", kTH2D, {axisPt, axisCent});
385+
registry.add<TH2>("incl/QA/after/hPt_forward_uncorrected", "", kTH2D, {axisPt, axisCent});
386+
registry.add<TH2>("incl/QA/after/hPt_backward", "", kTH2D, {axisPt, axisCent});
387+
registry.add<TH2>("incl/QA/after/hPt_backward_uncorrected", "", kTH2D, {axisPt, axisCent});
388+
registry.add<TH2>("incl/QA/after/hPhi", "", kTH2D, {axisPhi, axisCent});
389+
registry.add<TH2>("incl/QA/after/hPhi_uncorrected", "", kTH2D, {axisPhi, axisCent});
390+
registry.add<TH2>("incl/QA/after/hEta", "", kTH2D, {axisEta, axisCent});
391+
registry.add<TH2>("incl/QA/after/hEta_uncorrected", "", kTH2D, {axisEta, axisCent});
392+
} else {
393+
registry.add<TH1>("incl/QA/after/hPt", "", kTH1D, {axisPt});
394+
registry.add<TH1>("incl/QA/after/hPt_forward", "", kTH1D, {axisPt});
395+
registry.add<TH1>("incl/QA/after/hPt_forward_uncorrected", "", kTH1D, {axisPt});
396+
registry.add<TH1>("incl/QA/after/hPt_backward", "", kTH1D, {axisPt});
397+
registry.add<TH1>("incl/QA/after/hPt_backward_uncorrected", "", kTH1D, {axisPt});
398+
registry.add<TH1>("incl/QA/after/hPhi", "", kTH1D, {axisPhi});
399+
registry.add<TH1>("incl/QA/after/hPhi_uncorrected", "", kTH1D, {axisPhi});
400+
registry.add<TH1>("incl/QA/after/hEta", "", kTH1D, {axisEta});
401+
registry.add<TH1>("incl/QA/after/hEta_uncorrected", "", kTH1D, {axisEta});
402+
}
403+
386404
if (cfgFillQABefore)
387405
registry.addClone("incl/QA/after/", "incl/QA/before/");
388406
}
@@ -656,6 +674,19 @@ struct FlowSP {
656674
return grpo->getNominalL3Field();
657675
}
658676

677+
std::pair<float, uint16_t> getCrossingAngleCCDB(uint64_t timestamp)
678+
{
679+
// TODO done only once (and not per run). Will be replaced by CCDBConfigurable
680+
auto grpo = ccdb->getForTimeStamp<o2::parameters::GRPLHCIFData>("GLO/Config/GRPLHCIF", timestamp);
681+
if (grpo == nullptr) {
682+
LOGF(fatal, "GRP object for Crossing Angle not found for timestamp %llu", timestamp);
683+
return {0, 0};
684+
}
685+
float crossingAngle = grpo->getCrossingAngle();
686+
uint16_t crossingAngleTime = grpo->getCrossingAngleTime();
687+
return {crossingAngle, crossingAngleTime};
688+
}
689+
659690
// From Generic Framework
660691
void loadCorrections(uint64_t timestamp)
661692
{
@@ -916,7 +947,7 @@ struct FlowSP {
916947
registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal(), centWeight);
917948

918949
if (cfgFillEventPlaneQA) {
919-
if constexpr (framework::has_type_v<aod::sptablezdc::Vx, typename CollisionObject::all_columns>) {
950+
if constexpr (o2::framework::has_type_v<aod::sptablezdc::Vx, typename CollisionObject::all_columns>) {
920951
double psiA = 1.0 * std::atan2(collision.qyA(), collision.qxA());
921952
double psiC = 1.0 * std::atan2(collision.qyC(), collision.qxC());
922953
double psiFull = 1.0 * std::atan2(collision.qyA() + collision.qyC(), collision.qxA() + collision.qxC());
@@ -1074,6 +1105,35 @@ struct FlowSP {
10741105
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls(), wacc * weff);
10751106
}
10761107

1108+
template <FillType ft, ChargeType ct, ParticleType pt, typename TrackObject>
1109+
inline void fillTrackQA(TrackObject track, double vz, double centrality, float wacc = 1, float weff = 1)
1110+
{
1111+
if (!cfgFillTrackQA)
1112+
return;
1113+
1114+
static constexpr std::string_view Time[] = {"before/", "after/"};
1115+
// NOTE: species[kUnidentified] = "" (when no PID)
1116+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt"), track.pt(), centrality, wacc * weff);
1117+
if (track.eta() > 0) {
1118+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt_forward"), track.pt(), centrality, wacc * weff);
1119+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt_forward_uncorrected"), track.pt(), centrality);
1120+
} else {
1121+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt_backward"), track.pt(), centrality, wacc * weff);
1122+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt_backward_uncorrected"), track.pt(), centrality);
1123+
}
1124+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi"), track.phi(), centrality, wacc);
1125+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi_uncorrected"), track.phi(), centrality);
1126+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hEta"), track.eta(), centrality, wacc);
1127+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hEta_uncorrected"), track.eta(), centrality);
1128+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi_Eta_vz"), track.phi(), track.eta(), vz);
1129+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi_Eta_vz_corrected"), track.phi(), track.eta(), vz, wacc);
1130+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAxy_pt"), track.pt(), track.dcaXY(), wacc * weff);
1131+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAz_pt"), track.pt(), track.dcaZ(), wacc * weff);
1132+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls(), wacc * weff);
1133+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_pt"), track.pt(), track.tpcNClsFound(), wacc * weff);
1134+
registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls(), wacc * weff);
1135+
}
1136+
10771137
template <FillType ft, ChargeType ct, typename TrackObject>
10781138
inline void fillPIDQA(TrackObject track)
10791139
{
@@ -1141,15 +1201,27 @@ struct FlowSP {
11411201
}
11421202

11431203
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)
1204+
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)
11451205
{
1146-
fillTrackQA<ft, kInclusive, ct>(track, vtxz, wacc, weff);
1206+
if (!cfgTrackSelDoTrackQAvsCent) {
1207+
fillTrackQA<ft, kInclusive, ct>(track, vtxz, wacc, weff);
1208+
} else {
1209+
fillTrackQA<ft, kInclusive, ct>(track, vtxz, centrality, wacc, weff);
1210+
}
11471211
fillPIDQA<ft, kInclusive>(track);
11481212
if (pos) {
1149-
fillTrackQA<ft, kPositive, ct>(track, vtxz, waccP, weffP);
1213+
if (!cfgTrackSelDoTrackQAvsCent) {
1214+
fillTrackQA<ft, kPositive, ct>(track, vtxz, waccP, weffP);
1215+
} else {
1216+
fillTrackQA<ft, kPositive, ct>(track, vtxz, centrality, waccP, weffP);
1217+
}
11501218
fillPIDQA<ft, kPositive>(track);
11511219
} else {
1152-
fillTrackQA<ft, kNegative, ct>(track, vtxz, waccN, weffN);
1220+
if (!cfgTrackSelDoTrackQAvsCent) {
1221+
fillTrackQA<ft, kNegative, ct>(track, vtxz, waccN, weffN);
1222+
} else {
1223+
fillTrackQA<ft, kNegative, ct>(track, vtxz, centrality, waccN, weffN);
1224+
}
11531225
fillPIDQA<ft, kNegative>(track);
11541226
}
11551227
}
@@ -1291,16 +1363,16 @@ struct FlowSP {
12911363
if (cfgFillQABefore) {
12921364
switch (trackPID) {
12931365
case kUnidentified:
1294-
fillAllQA<kBefore, kUnidentified>(track, vtxz, pos);
1366+
fillAllQA<kBefore, kUnidentified>(track, vtxz, centrality, pos);
12951367
break;
12961368
case kPion:
1297-
fillAllQA<kBefore, kPion>(track, vtxz, pos);
1369+
fillAllQA<kBefore, kPion>(track, vtxz, centrality, pos);
12981370
break;
12991371
case kKaon:
1300-
fillAllQA<kBefore, kKaon>(track, vtxz, pos);
1372+
fillAllQA<kBefore, kKaon>(track, vtxz, centrality, pos);
13011373
break;
13021374
case kProton:
1303-
fillAllQA<kBefore, kProton>(track, vtxz, pos);
1375+
fillAllQA<kBefore, kProton>(track, vtxz, centrality, pos);
13041376
break;
13051377
}
13061378
}
@@ -1345,16 +1417,16 @@ struct FlowSP {
13451417

13461418
switch (trackPID) {
13471419
case kUnidentified:
1348-
fillAllQA<kAfter, kUnidentified>(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1420+
fillAllQA<kAfter, kUnidentified>(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13491421
break;
13501422
case kPion:
1351-
fillAllQA<kAfter, kPion>(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1423+
fillAllQA<kAfter, kPion>(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13521424
break;
13531425
case kKaon:
1354-
fillAllQA<kAfter, kKaon>(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1426+
fillAllQA<kAfter, kKaon>(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13551427
break;
13561428
case kProton:
1357-
fillAllQA<kAfter, kProton>(track, vtxz, pos, wacc, weff, waccP, weffP, waccN, weffN);
1429+
fillAllQA<kAfter, kProton>(track, vtxz, centrality, pos, wacc, weff, waccP, weffP, waccN, weffN);
13581430
break;
13591431
}
13601432

0 commit comments

Comments
 (0)