From e3586e35822683137a3b6cf14d7d0eb84f8a6cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 7 Nov 2023 07:43:29 +0100 Subject: [PATCH 1/5] Next multiplicity --- Common/TableProducer/multiplicityTable.cxx | 314 +++++++++++++-------- 1 file changed, 195 insertions(+), 119 deletions(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index 3a217b046b8..d95798dfce1 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -24,6 +24,18 @@ using namespace o2::framework; #define bitcheck(var, nbit) ((var) & (1 << (nbit))) +static constexpr int nTables = 7; +static constexpr int nParameters = 1; +static const std::vector tableNames{"FV0Mults", + "FT0Mults", + "FDDMults", + "ZDCMults", + "BarrelMults", + "MultsExtra", + "MultZeqs"}; +static const std::vector parameterNames{"Enable"}; +static const int defaultParameters[nTables][nParameters]{{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}}; + struct MultiplicityTableTaskIndexed { SliceCache cache; Produces multFV0; @@ -49,9 +61,10 @@ struct MultiplicityTableTaskIndexed { // Configurable Configurable doVertexZeq{"doVertexZeq", 1, "if 1: do vertex Z eq mult table"}; - Configurable populateMultExtra{"populateMultExtra", true, "if 1: populate table with some extra QA information"}; Configurable fractionOfEvents{"fractionOfEvents", 2.0, "Fractions of events to keep in case the QA is used"}; - + Configurable> enabledTables{"enabledTables", + {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, + "Produce tables depending on needs. Values different than -1 override the automatic setup: the corresponding table can be set off (0) or on (1)"}; int mRunNumber; bool lCalibLoaded; TList* lCalibObjects; @@ -61,6 +74,7 @@ struct MultiplicityTableTaskIndexed { TProfile* hVtxZFDDA; TProfile* hVtxZFDDC; TProfile* hVtxZNTracks; + std::vector mEnabledTables; // Vector of enabled tables unsigned int randomSeed = 0; void init(InitContext& context) @@ -72,20 +86,15 @@ struct MultiplicityTableTaskIndexed { if (doprocessRun2 == true && doprocessRun3 == true) { LOGF(fatal, "Cannot enable processRun2 and processRun3 at the same time. Please choose one."); } - if (fractionOfEvents <= 1.f && isTableRequiredInWorkflow(context, "FV0Mults")) { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; - } - if (fractionOfEvents <= 1.f && isTableRequiredInWorkflow(context, "FT0Mults")) { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; - } - if (fractionOfEvents <= 1.f && isTableRequiredInWorkflow(context, "FDDMults")) { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; - } - if (fractionOfEvents <= 1.f && isTableRequiredInWorkflow(context, "ZDCMults")) { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; - } - if (fractionOfEvents <= 1.f && isTableRequiredInWorkflow(context, "BarrelMults")) { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; + for (int i = 0; i < nTables; i++) { + int f = enabledTables->get(tableNames[i].c_str(), "Enable"); + enableFlagIfTableRequired(context, tableNames[i], f); + if (f == 1) { + mEnabledTables.push_back(i); + if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra") && (tableNames[i] != "MultsExtraMC")) { + LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; + } + } } mRunNumber = 0; @@ -178,44 +187,58 @@ struct MultiplicityTableTaskIndexed { aod::FDDs const&) { // reserve memory - multFV0.reserve(collisions.size()); - multFT0.reserve(collisions.size()); - multFDD.reserve(collisions.size()); - multZDC.reserve(collisions.size()); - multBarrel.reserve(collisions.size()); - multzeq.reserve(collisions.size()); + for (auto i : mEnabledTables) { + switch (i) { + case 0: // FV0 + multFV0.reserve(collisions.size()); + break; + case 1: // FT0 + multFT0.reserve(collisions.size()); + break; + case 2: // FDD + multFDD.reserve(collisions.size()); + break; + case 3: // ZDC + multZDC.reserve(collisions.size()); + break; + case 4: // Barrel + multBarrel.reserve(collisions.size()); + break; + case 5: // Extra + multExtra.reserve(collisions.size()); + break; + case 6: // Z equalized + multzeq.reserve(collisions.size()); + break; + default: + LOG(fatal) << "Unknown table requested: " << i; + break; + } + } + + // Initializing multiplicity values + float multFV0A = 0.f; + float multFV0C = 0.f; + float multFT0A = 0.f; + float multFT0C = 0.f; + float multFDDA = 0.f; + float multFDDC = 0.f; + float multZNA = -1.f; + float multZNC = -1.f; + const int multTracklets = 0; // Undefined in Run 3 + int multNContribs = 0; + + float multZeqFV0A = 0.f; + float multZeqFT0A = 0.f; + float multZeqFT0C = 0.f; + float multZeqFDDA = 0.f; + float multZeqFDDC = 0.f; + float multZeqNContribs = 0.f; for (auto const& collision : collisions) { if ((fractionOfEvents < 1.f) && (static_cast(rand_r(&randomSeed)) / static_cast(RAND_MAX)) > fractionOfEvents) { // Skip events that are not sampled (only for the QA) return; } - float multFV0A = 0.f; - float multFV0C = 0.f; - float multFT0A = 0.f; - float multFT0C = 0.f; - float multFDDA = 0.f; - float multFDDC = 0.f; - float multZNA = -1.f; - float multZNC = -1.f; - int multTracklets = 0; - - float multZeqFV0A = 0.f; - float multZeqFT0A = 0.f; - float multZeqFT0C = 0.f; - float multZeqFDDA = 0.f; - float multZeqFDDC = 0.f; - float multZeqNContribs = 0.f; - - auto tracksGrouped = tracksIUWithTPC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto pvAllContribsGrouped = pvAllContribTracksIU->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto pvContribsGrouped = pvContribTracksIU->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto pvContribsEta1Grouped = pvContribTracksIUEta1->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto pvContribsEtaHalfGrouped = pvContribTracksIUEtaHalf->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - int multTPC = tracksGrouped.size(); - int multNContribs = pvContribsGrouped.size(); - int multNContribsEta1 = pvContribsEta1Grouped.size(); - int multNContribsEtaHalf = pvContribsEtaHalfGrouped.size(); - /* check the previous run number */ const auto& bc = collision.bc_as(); if (doVertexZeq > 0) { @@ -241,80 +264,133 @@ struct MultiplicityTableTaskIndexed { } } } - if (bc.has_zdc()) { - multZNA = bc.zdc().amplitudeZNA(); - multZNC = bc.zdc().amplitudeZNC(); - } - - // using FT0 row index from event selection task - if (collision.has_foundFT0()) { - auto ft0 = collision.foundFT0(); - for (auto amplitude : ft0.amplitudeA()) { - multFT0A += amplitude; - } - for (auto amplitude : ft0.amplitudeC()) { - multFT0C += amplitude; - } - } - // using FDD row index from event selection task - if (collision.has_foundFDD()) { - auto fdd = collision.foundFDD(); - for (auto amplitude : fdd.chargeA()) { - multFDDA += amplitude; - } - for (auto amplitude : fdd.chargeC()) { - multFDDC += amplitude; - } - } - // using FV0 row index from event selection task - if (collision.has_foundFV0()) { - auto fv0 = collision.foundFV0(); - for (auto amplitude : fv0.amplitude()) { - multFV0A += amplitude; - } - } - if (fabs(collision.posZ()) < 15.0f && lCalibLoaded) { - multZeqFV0A = hVtxZFV0A->Interpolate(0.0) * multFV0A / hVtxZFV0A->Interpolate(collision.posZ()); - multZeqFT0A = hVtxZFT0A->Interpolate(0.0) * multFT0A / hVtxZFT0A->Interpolate(collision.posZ()); - multZeqFT0C = hVtxZFT0C->Interpolate(0.0) * multFT0C / hVtxZFT0C->Interpolate(collision.posZ()); - multZeqFDDA = hVtxZFDDA->Interpolate(0.0) * multFDDA / hVtxZFDDA->Interpolate(collision.posZ()); - multZeqFDDC = hVtxZFDDC->Interpolate(0.0) * multFDDC / hVtxZFDDC->Interpolate(collision.posZ()); - multZeqNContribs = hVtxZNTracks->Interpolate(0.0) * multNContribs / hVtxZNTracks->Interpolate(collision.posZ()); - } - LOGF(debug, "multFV0A=%5.0f multFV0C=%5.0f multFT0A=%5.0f multFT0C=%5.0f multFDDA=%5.0f multFDDC=%5.0f multZNA=%6.0f multZNC=%6.0f multTracklets=%i multTPC=%i", multFV0A, multFV0C, multFT0A, multFT0C, multFDDA, multFDDC, multZNA, multZNC, multTracklets, multTPC); - multFV0(multFV0A, multFV0C); - multFT0(multFT0A, multFT0C); - multFDD(multFDDA, multFDDC); - multZDC(multZNA, multZNC); - multBarrel(multTracklets, multTPC, multNContribs, multNContribsEta1, multNContribsEtaHalf); - multzeq(multZeqFV0A, multZeqFT0A, multZeqFT0C, multZeqFDDA, multZeqFDDC, multZeqNContribs); + for (auto i : mEnabledTables) { + switch (i) { + case 0: // FV0 + multFV0A = 0.f; + multFV0C = 0.f; + // using FV0 row index from event selection task + if (collision.has_foundFV0()) { + auto fv0 = collision.foundFV0(); + for (auto amplitude : fv0.amplitude()) { + multFV0A += amplitude; + } + } else { + multFV0A = -999.f; + multFV0C = -999.f; + } + multFV0(multFV0A, multFV0C); + LOGF(debug, "multFV0A=%5.0f multFV0C=%5.0f", multFV0A, multFV0C); + break; + case 1: // FT0 + multFT0A = 0.f; + multFT0C = 0.f; + // using FT0 row index from event selection task + if (collision.has_foundFT0()) { + const auto& ft0 = collision.foundFT0(); + for (auto amplitude : ft0.amplitudeA()) { + multFT0A += amplitude; + } + for (auto amplitude : ft0.amplitudeC()) { + multFT0C += amplitude; + } + } else { + multFT0A = -999.f; + multFT0C = -999.f; + } + multFT0(multFT0A, multFT0C); + LOGF(debug, "multFT0A=%5.0f multFT0C=%5.0f", multFV0A, multFV0C); + break; + case 2: // FDD + multFDDA = 0.f; + multFDDC = 0.f; + // using FDD row index from event selection task + if (collision.has_foundFDD()) { + const auto& fdd = collision.foundFDD(); + for (auto amplitude : fdd.chargeA()) { + multFDDA += amplitude; + } + for (auto amplitude : fdd.chargeC()) { + multFDDC += amplitude; + } + } else { + multFDDA = -999.f; + multFDDC = -999.f; + } + multFDD(multFDDA, multFDDC); + LOGF(debug, "multFDDA=%5.0f multFDDC=%5.0f", multFDDA, multFDDC); + break; + case 3: // ZDC + multZNA = -1.f; + multZNC = -1.f; + if (bc.has_zdc()) { + multZNA = bc.zdc().amplitudeZNA(); + multZNC = bc.zdc().amplitudeZNC(); + } else { + multZNA = -999.f; + multZNC = -999.f; + } + multZDC(bc.zdc().amplitudeZNA(), bc.zdc().amplitudeZNC()); + LOGF(debug, "multZNA=%6.0f multZNC=%6.0f", multZNA, multZNC); + break; + case 4: // Barrel + { + const auto& tracksGrouped = tracksIUWithTPC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + const auto& pvContribsGrouped = pvContribTracksIU->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + const auto& pvContribsEta1Grouped = pvContribTracksIUEta1->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + const auto& pvContribsEtaHalfGrouped = pvContribTracksIUEtaHalf->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + const int multTPC = tracksGrouped.size(); + multNContribs = pvContribsGrouped.size(); + const int multNContribsEta1 = pvContribsEta1Grouped.size(); + const int multNContribsEtaHalf = pvContribsEtaHalfGrouped.size(); + multBarrel(multTracklets, multTPC, multNContribs, multNContribsEta1, multNContribsEtaHalf); + LOGF(debug, "multTracklets=%i multTPC=%i", multTracklets, multTPC); + } break; + case 5: // Extra + { + int nHasITS = 0, nHasTPC = 0, nHasTOF = 0, nHasTRD = 0; + int nITSonly = 0, nTPConly = 0, nITSTPC = 0; + const auto& pvAllContribsGrouped = pvAllContribTracksIU->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - if (populateMultExtra) { - int nHasITS = 0, nHasTPC = 0, nHasTOF = 0, nHasTRD = 0; - int nITSonly = 0, nTPConly = 0, nITSTPC = 0; - for (auto track : pvAllContribsGrouped) { - if (track.hasITS()) { - nHasITS++; - if (track.hasTPC()) - nITSTPC++; - if (!track.hasTPC() && !track.hasTOF() && !track.hasTRD()) - nITSonly++; - } - if (track.hasTPC()) { - nHasTPC++; - if (!track.hasITS() && !track.hasTOF() && !track.hasTRD()) - nTPConly++; - } - if (track.hasTOF()) - nHasTOF++; - if (track.hasTRD()) - nHasTRD++; - }; + for (auto track : pvAllContribsGrouped) { + if (track.hasITS()) { + nHasITS++; + if (track.hasTPC()) + nITSTPC++; + if (!track.hasTPC() && !track.hasTOF() && !track.hasTRD()) + nITSonly++; + } + if (track.hasTPC()) { + nHasTPC++; + if (!track.hasITS() && !track.hasTOF() && !track.hasTRD()) + nTPConly++; + } + if (track.hasTOF()) + nHasTOF++; + if (track.hasTRD()) + nHasTRD++; + }; - int bcNumber = bc.globalBC() % 3564; + int bcNumber = bc.globalBC() % 3564; - multExtra(static_cast(collision.numContrib()), collision.chi2(), collision.collisionTimeRes(), mRunNumber, collision.posZ(), collision.sel8(), nHasITS, nHasTPC, nHasTOF, nHasTRD, nITSonly, nTPConly, nITSTPC, bcNumber); + multExtra(static_cast(collision.numContrib()), collision.chi2(), collision.collisionTimeRes(), mRunNumber, collision.posZ(), collision.sel8(), nHasITS, nHasTPC, nHasTOF, nHasTRD, nITSonly, nTPConly, nITSTPC, bcNumber); + } break; + case 6: // Z equalized + if (fabs(collision.posZ()) < 15.0f && lCalibLoaded) { + multZeqFV0A = hVtxZFV0A->Interpolate(0.0) * multFV0A / hVtxZFV0A->Interpolate(collision.posZ()); + multZeqFT0A = hVtxZFT0A->Interpolate(0.0) * multFT0A / hVtxZFT0A->Interpolate(collision.posZ()); + multZeqFT0C = hVtxZFT0C->Interpolate(0.0) * multFT0C / hVtxZFT0C->Interpolate(collision.posZ()); + multZeqFDDA = hVtxZFDDA->Interpolate(0.0) * multFDDA / hVtxZFDDA->Interpolate(collision.posZ()); + multZeqFDDC = hVtxZFDDC->Interpolate(0.0) * multFDDC / hVtxZFDDC->Interpolate(collision.posZ()); + multZeqNContribs = hVtxZNTracks->Interpolate(0.0) * multNContribs / hVtxZNTracks->Interpolate(collision.posZ()); + } + multzeq(multZeqFV0A, multZeqFT0A, multZeqFT0C, multZeqFDDA, multZeqFDDC, multZeqNContribs); + break; + default: + LOG(fatal) << "Unknown table requested: " << i; + break; + } } } } From e6a1f34eda5781187a975f7f107c4a9617af19b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 7 Nov 2023 07:46:17 +0100 Subject: [PATCH 2/5] Update multiplicityTable.cxx --- Common/TableProducer/multiplicityTable.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index d95798dfce1..a51f70097ea 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -91,7 +91,7 @@ struct MultiplicityTableTaskIndexed { enableFlagIfTableRequired(context, tableNames[i], f); if (f == 1) { mEnabledTables.push_back(i); - if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra") && (tableNames[i] != "MultsExtraMC")) { + if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra"))) { LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; } } From 9a3d2d7ac13058e6f26e3cd53f64944faa18899a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 7 Nov 2023 18:26:52 +0100 Subject: [PATCH 3/5] Update multiplicityTable.cxx --- Common/TableProducer/multiplicityTable.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index a51f70097ea..bc9d4c25d9c 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -331,7 +331,7 @@ struct MultiplicityTableTaskIndexed { multZNA = -999.f; multZNC = -999.f; } - multZDC(bc.zdc().amplitudeZNA(), bc.zdc().amplitudeZNC()); + multZDC(multZNA, multZNC); LOGF(debug, "multZNA=%6.0f multZNC=%6.0f", multZNA, multZNC); break; case 4: // Barrel From 18445caa56f6a044e8201199a95fcd081f727b63 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 7 Nov 2023 17:27:18 +0000 Subject: [PATCH 4/5] Please consider the following formatting changes --- Common/TableProducer/multiplicityTable.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index bc9d4c25d9c..e82b92d1643 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -91,9 +91,10 @@ struct MultiplicityTableTaskIndexed { enableFlagIfTableRequired(context, tableNames[i], f); if (f == 1) { mEnabledTables.push_back(i); - if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra"))) { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; - } + if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra"))) + { + LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; + } } } From 10d5b08ef46bf71a08a4ae71341599165eb3143d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 7 Nov 2023 19:13:21 +0100 Subject: [PATCH 5/5] Update multiplicityTable.cxx --- Common/TableProducer/multiplicityTable.cxx | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index e82b92d1643..5beb4721307 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -91,10 +91,9 @@ struct MultiplicityTableTaskIndexed { enableFlagIfTableRequired(context, tableNames[i], f); if (f == 1) { mEnabledTables.push_back(i); - if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra"))) - { - LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; - } + if (fractionOfEvents <= 1.f && (tableNames[i] != "MultsExtra")) { + LOG(fatal) << "Cannot have a fraction of events <= 1 and multiplicity table consumed."; + } } } @@ -247,12 +246,12 @@ struct MultiplicityTableTaskIndexed { mRunNumber = bc.runNumber(); // mark this run as at least tried lCalibObjects = ccdb->getForTimeStamp("Centrality/Calibration", bc.timestamp()); if (lCalibObjects) { - hVtxZFV0A = (TProfile*)lCalibObjects->FindObject("hVtxZFV0A"); - hVtxZFT0A = (TProfile*)lCalibObjects->FindObject("hVtxZFT0A"); - hVtxZFT0C = (TProfile*)lCalibObjects->FindObject("hVtxZFT0C"); - hVtxZFDDA = (TProfile*)lCalibObjects->FindObject("hVtxZFDDA"); - hVtxZFDDC = (TProfile*)lCalibObjects->FindObject("hVtxZFDDC"); - hVtxZNTracks = (TProfile*)lCalibObjects->FindObject("hVtxZNTracksPV"); + hVtxZFV0A = static_cast(lCalibObjects->FindObject("hVtxZFV0A")); + hVtxZFT0A = static_cast(lCalibObjects->FindObject("hVtxZFT0A")); + hVtxZFT0C = static_cast(lCalibObjects->FindObject("hVtxZFT0C")); + hVtxZFDDA = static_cast(lCalibObjects->FindObject("hVtxZFDDA")); + hVtxZFDDC = static_cast(lCalibObjects->FindObject("hVtxZFDDC")); + hVtxZNTracks = static_cast(lCalibObjects->FindObject("hVtxZNTracksPV")); lCalibLoaded = true; // Capture error if (!hVtxZFV0A || !hVtxZFT0A || !hVtxZFT0C || !hVtxZFDDA || !hVtxZFDDC || !hVtxZNTracks) {