Skip to content

Commit bc2376a

Browse files
New centrality task (#122)
1 parent b6756ad commit bc2376a

22 files changed

+144
-48
lines changed

ALICE3/TableProducer/alice3-centrality.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ using namespace o2::framework;
2424
using namespace o2::framework::expressions;
2525

2626
struct ALICE3Centrality {
27-
Produces<aod::Cents> cent;
27+
Produces<aod::CentV0Ms> cent;
2828
Service<o2::ccdb::BasicCCDBManager> ccdb;
2929

3030
HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::QAObject};

Common/DataModel/Centrality.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,19 @@ namespace o2::aod
1717
{
1818
namespace cent
1919
{
20-
DECLARE_SOA_COLUMN(CentV0M, centV0M, float); //!
20+
DECLARE_SOA_COLUMN(CentEstV0M, centV0M, float); //! Centrality percentile estimated from V0C+V0A multiplicities
21+
DECLARE_SOA_COLUMN(CentEstRun2SPDTracklets, centRun2SPDTracklets, float); //! Run2 centrality percentile estimated from SPD tracklets multiplicity
22+
DECLARE_SOA_COLUMN(CentEstRun2CL0, centRun2CL0, float); //! Run2 centrality percentile estimated from CL0 multiplicity
23+
DECLARE_SOA_COLUMN(CentEstRun2CL1, centRun2CL1, float); //! Run2 centrality percentile estimated from CL1 multiplicity
2124
} // namespace cent
22-
DECLARE_SOA_TABLE(Cents, "AOD", "CENT", cent::CentV0M); //!
23-
using Cent = Cents::iterator;
25+
DECLARE_SOA_TABLE(CentV0Ms, "AOD", "CENTV0M", cent::CentEstV0M); //! V0M estimated centrality table
26+
DECLARE_SOA_TABLE(CentRun2SPDs, "AOD", "CENTRUN2SPD", cent::CentEstRun2SPDTracklets); //! Run2 SPD tracklets estimated centrality table
27+
DECLARE_SOA_TABLE(CentRun2CL0s, "AOD", "CENTRUN2CL0", cent::CentEstRun2CL0); //! Run2 CL0 estimated centrality table
28+
DECLARE_SOA_TABLE(CentRun2CL1s, "AOD", "CENTRUN2CL1", cent::CentEstRun2CL1); //! Run2 CL1 estimated centrality table
29+
using CentV0M = CentV0Ms::iterator;
30+
using CentRun2SPD = CentRun2SPDs::iterator;
31+
using CentRun2CL0 = CentRun2CL0s::iterator;
32+
using CentRun2CL1 = CentRun2CL1s::iterator;
2433
} // namespace o2::aod
2534

2635
#endif // O2_ANALYSIS_CENTRALITY_H_

Common/TableProducer/centralityTable.cxx

Lines changed: 100 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,128 @@
88
// In applying this license CERN does not waive the privileges and immunities
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
11+
12+
/// \file centrality.cxx
13+
/// \brief Task to produce the centrality tables associated to each of the required centrality estimators
14+
1115
#include "Framework/runDataProcessing.h"
1216
#include "Framework/AnalysisTask.h"
1317
#include "Framework/AnalysisDataModel.h"
18+
#include "Framework/RunningWorkflowInfo.h"
1419
#include "Common/DataModel/Multiplicity.h"
1520
#include "Common/DataModel/Centrality.h"
1621
#include <CCDB/BasicCCDBManager.h>
17-
#include "TH1F.h"
22+
#include <TH1F.h>
1823

1924
using namespace o2;
2025
using namespace o2::framework;
2126

2227
struct CentralityTableTask {
23-
Produces<aod::Cents> cent;
28+
Produces<aod::CentV0Ms> centVOM;
29+
Produces<aod::CentRun2SPDs> centRun2SPD;
30+
Produces<aod::CentRun2CL0s> centRun2CL1;
31+
Produces<aod::CentRun2CL1s> centRun2CL2;
2432
Service<o2::ccdb::BasicCCDBManager> ccdb;
2533

26-
void init(InitContext&)
34+
Configurable<int> estV0M{"estV0M", -1, {"Produces centrality percentiles using V0 multiplicity. -1: auto, 0: don't, 1: yes. Default: auto (-1)"}};
35+
Configurable<int> estRun2SPD{"estRun2SPD", -1, {"Produces Run2 centrality percentiles using SPD tracklets multiplicity. -1: auto, 0: don't, 1: yes. Default: auto (-1)"}};
36+
Configurable<int> estRun2CL0{"estRun2CL0", -1, {"Produces Run2 centrality percentiles using CL0 multiplicity. -1: auto, 0: don't, 1: yes. Default: auto (-1)"}};
37+
Configurable<int> estRun2CL1{"estRun2CL1", -1, {"Produces Run2 centrality percentiles using CL1 multiplicity. -1: auto, 0: don't, 1: yes. Default: auto (-1)"}};
38+
39+
int mRunNumber;
40+
bool mV0MCalibrationStored;
41+
TH1* mhVtxAmpCorrV0A;
42+
TH1* mhVtxAmpCorrV0C;
43+
TH1* mhMultSelCalibV0M;
44+
45+
void init(InitContext& context)
2746
{
47+
/* Checking the tables which are requested in the workflow and enabling them */
48+
auto& workflows = context.services().get<RunningWorkflowInfo const>();
49+
for (DeviceSpec device : workflows.devices) {
50+
for (auto input : device.inputs) {
51+
auto enable = [&input](const std::string detector, Configurable<int>& flag) {
52+
const std::string table = "Cent" + detector + "s";
53+
if (input.matcher.binding == table) {
54+
if (flag < 0) {
55+
flag.value = 1;
56+
LOGF(info, "Auto-enabling table: %s", table.c_str());
57+
} else if (flag > 0) {
58+
flag.value = 1;
59+
LOGF(info, "Table %s already enabled", table.c_str());
60+
} else {
61+
LOGF(info, "Table %s disabled", table.c_str());
62+
}
63+
}
64+
};
65+
enable("V0M", estV0M);
66+
enable("Run2SPD", estRun2SPD);
67+
enable("Run2CL0", estRun2CL0);
68+
enable("Run2CL1", estRun2CL1);
69+
}
70+
}
2871
ccdb->setURL("http://alice-ccdb.cern.ch");
2972
ccdb->setCaching(true);
3073
ccdb->setLocalObjectValidityChecking();
74+
mRunNumber = 0;
75+
mV0MCalibrationStored = false;
76+
mhVtxAmpCorrV0A = nullptr;
77+
mhVtxAmpCorrV0C = nullptr;
78+
mhMultSelCalibV0M = nullptr;
3179
}
3280

33-
void process(soa::Join<aod::Collisions, aod::Mults>::iterator const& collision, aod::BCsWithTimestamps const&)
81+
void process(soa::Join<aod::Collisions, aod::Mults>::iterator const& collision, aod::BCsWithTimestamps const&, aod::Tracks const& tracks)
3482
{
83+
/* check the previous run number */
3584
auto bc = collision.bc_as<aod::BCsWithTimestamps>();
36-
LOGF(debug, "timestamp=%llu", bc.timestamp());
37-
TH1F* hCumMultV0M = ccdb->getForTimeStamp<TH1F>("Centrality/CumMultV0M", bc.timestamp());
38-
if (!hCumMultV0M) {
39-
LOGF(fatal, "V0M centrality calibration is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp());
40-
}
41-
float centV0M = hCumMultV0M->GetBinContent(hCumMultV0M->FindFixBin(collision.multV0M()));
85+
if (bc.runNumber() != mRunNumber) {
86+
LOGF(debug, "timestamp=%llu", bc.timestamp());
87+
TList* callst = ccdb->getForTimeStamp<TList>("Centrality/Estimators", bc.timestamp());
4288

43-
LOGF(debug, "centV0M=%.0f", centV0M);
44-
// fill centrality columns
45-
cent(centV0M);
89+
if (callst != nullptr) {
90+
auto getccdb = [callst](const char* ccdbhname, const char* hname) {
91+
TH1* h = (TH1*)callst->FindObject(ccdbhname)->Clone(hname);
92+
return h;
93+
};
94+
if (estV0M == 1) {
95+
mhVtxAmpCorrV0A = getccdb("hVtx_fAmplitude_V0A_Normalized", "zvtxCalibV0A");
96+
mhVtxAmpCorrV0C = getccdb("hVtx_fAmplitude_V0C_Normalized", "zvtxCalibV0C");
97+
mhMultSelCalibV0M = getccdb("hMultSelCalib_V0M", "MultSelCalibV0M");
98+
if ((mhVtxAmpCorrV0A != nullptr) and (mhVtxAmpCorrV0C != nullptr) and (mhMultSelCalibV0M != nullptr)) {
99+
mV0MCalibrationStored = true;
100+
} else {
101+
LOGF(fatal, "Calibration information from V0M for run %d corrupted");
102+
}
103+
}
104+
if (estRun2SPD == 1) {
105+
LOGF(fatal, "Run2 calibration information estimated from SPD tracklets still not available");
106+
}
107+
if (estRun2CL0 == 1) {
108+
LOGF(fatal, "Run2 calibration information estimated from CL0 still not available");
109+
}
110+
if (estRun2CL1 == 1) {
111+
LOGF(fatal, "Run2 calibration information estimated from CL1 still not available");
112+
}
113+
if (mV0MCalibrationStored) {
114+
mRunNumber = bc.runNumber();
115+
}
116+
} else {
117+
/* we dont change the run number to keep trying */
118+
mV0MCalibrationStored = false;
119+
LOGF(fatal, "Centrality calibration is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp());
120+
}
121+
}
122+
if (estV0M == 1) {
123+
float centV0M = 105.0f;
124+
if (mV0MCalibrationStored) {
125+
float v0m = collision.multV0A() * mhVtxAmpCorrV0A->GetBinContent(mhVtxAmpCorrV0A->FindFixBin(collision.posZ())) +
126+
collision.multV0C() * mhVtxAmpCorrV0C->GetBinContent(mhVtxAmpCorrV0C->FindFixBin(collision.posZ()));
127+
centV0M = mhMultSelCalibV0M->GetBinContent(mhMultSelCalibV0M->FindFixBin(v0m));
128+
}
129+
LOGF(debug, "centV0M=%.0f", centV0M);
130+
// fill centrality columns
131+
centVOM(centV0M);
132+
}
46133
}
47134
};
48135

Common/Tasks/centralityQa.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ using namespace o2::framework;
2020

2121
struct CentralityQaTask {
2222
OutputObj<TH1F> hCentV0M{TH1F("hCentV0M", "", 21, 0, 105.)};
23-
void process(soa::Join<aod::Collisions, aod::EvSels, aod::Cents>::iterator const& col)
23+
void process(soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>::iterator const& col)
2424
{
2525
if (!col.alias()[kINT7]) {
2626
return;

Common/Tools/aodDataModelGraph.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ static std::vector<std::pair<std::string, StyleType>> tableStyles = {
7272
{"HfCandProng", StyleType::BLUE},
7373
{"pidResp", StyleType::GREEN},
7474
{"Mults", StyleType::GREEN},
75-
{"Cents", StyleType::GREEN},
75+
{"CentV0Ms", StyleType::GREEN},
7676
{"Timestamps", StyleType::GREEN},
7777
{"Jet", StyleType::BLUE},
7878
{"Mc", StyleType::RED},
@@ -247,7 +247,7 @@ int main(int, char**)
247247
displayEntity<FDDs>();
248248
displayEntity<HMPIDs>();
249249

250-
displayEntities<Collisions, Cents, Mults, Timestamps>();
250+
displayEntities<Collisions, CentV0Ms, Mults, Timestamps>();
251251
displayEntity<McCollisions>();
252252
displayEntity<McCollisionLabels>();
253253

PWGCF/DataModel/CorrelationsDerived.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace o2::aod
2020
DECLARE_SOA_TABLE(CFCollisions, "AOD", "CFCOLLISION", //!
2121
o2::soa::Index<>,
2222
bc::RunNumber, collision::PosZ,
23-
cent::CentV0M, timestamp::Timestamp);
23+
cent::CentEstV0M, timestamp::Timestamp);
2424
using CFCollision = CFCollisions::iterator;
2525

2626
namespace cftrack

PWGCF/TableProducer/filterCorrelations.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct FilterCF {
4646
Produces<aod::CFCollisions> outputCollisions;
4747
Produces<aod::CFTracks> outputTracks;
4848

49-
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Cents>>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection>> const& tracks)
49+
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection>> const& tracks)
5050
{
5151
LOGF(info, "Tracks for collision: %d | Vertex: %.1f (%d) | INT7: %d | V0M: %.1f", tracks.size(), collision.posZ(), collision.flags(), collision.sel7(), collision.centV0M());
5252

PWGCF/Tasks/correlations.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ struct CorrelationTask {
255255
}
256256

257257
// Version with explicit nested loop
258-
void processSameAOD(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Cents>>::iterator const& collision, aod::BCsWithTimestamps const&, aodTracks const& tracks)
258+
void processSameAOD(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>>::iterator const& collision, aod::BCsWithTimestamps const&, aodTracks const& tracks)
259259
{
260260
// TODO will go to CCDBConfigurable
261261
auto bc = collision.bc_as<aod::BCsWithTimestamps>();
@@ -303,7 +303,7 @@ struct CorrelationTask {
303303
}
304304
PROCESS_SWITCH(CorrelationTask, processSameDerived, "Process same event on derived data", false);
305305

306-
void processMixedAOD(soa::Filtered<soa::Join<aod::Collisions, aod::Hashes, aod::EvSels, aod::Cents>>& collisions, aodTracks const& tracks)
306+
void processMixedAOD(soa::Filtered<soa::Join<aod::Collisions, aod::Hashes, aod::EvSels, aod::CentV0Ms>>& collisions, aodTracks const& tracks)
307307
{
308308
// TODO loading of efficiency histogram missing here, because it will happen somehow in the CCDBConfigurable
309309

@@ -399,7 +399,7 @@ struct CorrelationTask {
399399
PROCESS_SWITCH(CorrelationTask, processMixedDerived, "Process mixed events on derived data", false);
400400

401401
// Version with combinations
402-
void processWithCombinations(soa::Join<aod::Collisions, aod::Cents>::iterator const& collision, soa::Filtered<aod::Tracks> const& tracks)
402+
void processWithCombinations(soa::Join<aod::Collisions, aod::CentV0Ms>::iterator const& collision, soa::Filtered<aod::Tracks> const& tracks)
403403
{
404404
LOGF(info, "Tracks for collision (Combination run): %d", tracks.size());
405405

@@ -545,7 +545,7 @@ struct CorrelationHashTask {
545545
return -1;
546546
}
547547

548-
void processAOD(soa::Join<aod::Collisions, aod::Cents> const& collisions)
548+
void processAOD(soa::Join<aod::Collisions, aod::CentV0Ms> const& collisions)
549549
{
550550
for (auto& collision : collisions) {
551551
int hash = getHash(collision.posZ(), collision.centV0M());

PWGCF/Tasks/dptdptcorrelations-simchl.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ DECLARE_SOA_TABLE(ScannedTrueTracks, "AOD", "SCANTRUETRACKS", //! The generated
9090
dptdptcorrelations::Eta,
9191
dptdptcorrelations::Phi);
9292

93-
using CollisionsEvSelCent = soa::Join<aod::Collisions, aod::EvSels, aod::Cents>;
94-
using CollisionEvSelCent = soa::Join<aod::Collisions, aod::EvSels, aod::Cents>::iterator;
93+
using CollisionsEvSelCent = soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>;
94+
using CollisionEvSelCent = soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>::iterator;
9595
using CollisionsEvSel = soa::Join<aod::Collisions, aod::EvSels>;
9696
using CollisionEvSel = soa::Join<aod::Collisions, aod::EvSels>::iterator;
9797
using TrackData = soa::Join<aod::Tracks, aod::TracksCov, aod::TracksExtra, aod::TracksExtended, aod::TrackSelection>::iterator;
@@ -936,7 +936,7 @@ struct DptDptCorrelationsFilterAnalysisTask {
936936
PROCESS_SWITCH(DptDptCorrelationsFilterAnalysisTask, processWithoutCentDetectorLevel, "Process MC detector level without centrality", false);
937937

938938
void processWithCentGeneratorLevel(aod::McCollision const& mccollision,
939-
soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::Cents> const& collisions,
939+
soa::Join<aod::McCollisionLabels, aod::Collisions, aod::EvSels, aod::CentV0Ms> const& collisions,
940940
aod::McParticles const& mcparticles)
941941
{
942942
using namespace filteranalysistask;

PWGCF/Tasks/dptdptcorrelations.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ DECLARE_SOA_COLUMN(TrackacceptedAsTwo, trackacceptedastwo, uint8_t);
6060
DECLARE_SOA_TABLE(AcceptedEvents, "AOD", "ACCEPTEDEVENTS", dptdptcorrelations::EventAccepted, dptdptcorrelations::EventCentMult);
6161
DECLARE_SOA_TABLE(ScannedTracks, "AOD", "SCANNEDTRACKS", dptdptcorrelations::TrackacceptedAsOne, dptdptcorrelations::TrackacceptedAsTwo);
6262

63-
using CollisionEvSelCent = soa::Join<aod::Collisions, aod::EvSels, aod::Cents>::iterator;
63+
using CollisionEvSelCent = soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms>::iterator;
6464
using TrackData = soa::Join<aod::Tracks, aod::TracksCov, aod::TracksExtra, aod::TracksExtended, aod::TrackSelection>::iterator;
6565
using FilteredTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksExtended, aod::ScannedTracks>>;
6666
using FilteredTrackData = Partition<aod::FilteredTracks>::filtered_iterator;
@@ -651,7 +651,7 @@ struct DptDptCorrelationsTask {
651651
TH1::AddDirectory(oldstatus);
652652
}
653653

654-
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Cents, aod::AcceptedEvents>>::iterator const& collision,
654+
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms, aod::AcceptedEvents>>::iterator const& collision,
655655
aod::FilteredTracks const& tracks)
656656
{
657657
using namespace correlationstask;
@@ -793,7 +793,7 @@ struct TracksAndEventClassificationQA {
793793
Filter onlyacceptedevents = (aod::dptdptcorrelations::eventaccepted == (uint8_t) true);
794794
Filter onlyacceptedtracks = ((aod::dptdptcorrelations::trackacceptedasone == (uint8_t) true) or (aod::dptdptcorrelations::trackacceptedastwo == (uint8_t) true));
795795

796-
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::Cents, aod::AcceptedEvents>>::iterator const& collision,
796+
void process(soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentV0Ms, aod::AcceptedEvents>>::iterator const& collision,
797797
soa::Filtered<soa::Join<aod::Tracks, aod::ScannedTracks>> const& tracks)
798798
{
799799
if (collision.eventaccepted() != (uint8_t) true) {

0 commit comments

Comments
 (0)