From 51f9b0da2cc0a54b1f9f97c399d58d1198f21e2e Mon Sep 17 00:00:00 2001 From: Prottay Das Date: Sat, 2 May 2026 21:03:39 +0200 Subject: [PATCH] updated code with bc timestamp and zdc energy information --- PWGLF/DataModel/ZDCCalTables.h | 37 +++++++ PWGLF/TableProducer/Common/spvector.cxx | 26 +++++ PWGLF/TableProducer/Common/zdcvector.cxx | 124 ++++++++++++++++------- 3 files changed, 152 insertions(+), 35 deletions(-) diff --git a/PWGLF/DataModel/ZDCCalTables.h b/PWGLF/DataModel/ZDCCalTables.h index 0e80cdbab25..40b5fbdd575 100644 --- a/PWGLF/DataModel/ZDCCalTables.h +++ b/PWGLF/DataModel/ZDCCalTables.h @@ -48,5 +48,42 @@ DECLARE_SOA_TABLE(ZDCCalTables, "AOD", "ZDCCALTABLE", zdccaltable::QyA, zdccaltable::QyC); using ZDCCalTable = ZDCCalTables::iterator; + +// Extra optional linked table. +// This table does NOT duplicate cent, vx, vy, vz, run number, trigger, etc. +// It only stores the ZDC energies and links back to ZDCCalTables. +namespace zdcenergytable +{ +DECLARE_SOA_INDEX_COLUMN(ZDCCalTable, zdcCalTable); + +DECLARE_SOA_COLUMN(ZNACommon, znaCommon, float); +DECLARE_SOA_COLUMN(ZNCCommon, zncCommon, float); + +DECLARE_SOA_COLUMN(ZNA0, zna0, float); +DECLARE_SOA_COLUMN(ZNA1, zna1, float); +DECLARE_SOA_COLUMN(ZNA2, zna2, float); +DECLARE_SOA_COLUMN(ZNA3, zna3, float); + +DECLARE_SOA_COLUMN(ZNC0, znc0, float); +DECLARE_SOA_COLUMN(ZNC1, znc1, float); +DECLARE_SOA_COLUMN(ZNC2, znc2, float); +DECLARE_SOA_COLUMN(ZNC3, znc3, float); +} // namespace zdcenergytable + +DECLARE_SOA_TABLE(ZDCEnergyTables, "AOD", "ZDCENERGY", + zdcenergytable::ZDCCalTableId, + zdcenergytable::ZNACommon, + zdcenergytable::ZNCCommon, + zdcenergytable::ZNA0, + zdcenergytable::ZNA1, + zdcenergytable::ZNA2, + zdcenergytable::ZNA3, + zdcenergytable::ZNC0, + zdcenergytable::ZNC1, + zdcenergytable::ZNC2, + zdcenergytable::ZNC3); + +using ZDCEnergyTable = ZDCEnergyTables::iterator; + } // namespace o2::aod #endif // PWGLF_DATAMODEL_ZDCCALTABLES_H_ diff --git a/PWGLF/TableProducer/Common/spvector.cxx b/PWGLF/TableProducer/Common/spvector.cxx index 02748f5d7be..d3bd49d3cf4 100644 --- a/PWGLF/TableProducer/Common/spvector.cxx +++ b/PWGLF/TableProducer/Common/spvector.cxx @@ -53,6 +53,7 @@ #include #include #include +#include #include using namespace o2; @@ -114,6 +115,9 @@ struct spvector { Configurable CentfineNbins{"CentfineNbins", 16, "Number of bins in cent fine histograms"}; Configurable lfinebinCent{"lfinebinCent", 0.0, "lower bin value in cent fine histograms"}; Configurable hfinebinCent{"hfinebinCent", 80.0, "higher bin value in cent fine histograms"}; + Configurable TimefineNbins{"TimefineNbins", 120, "Number of bins in Time fine histograms"}; + Configurable lfinebinTime{"lfinebinTime", 0, "lower bin value in Time fine histograms"}; + Configurable hfinebinTime{"hfinebinTime", 120, "higher bin value in Time fine histograms"}; } configbins; Configurable useShift{"useShift", false, "shift histograms"}; @@ -217,6 +221,7 @@ struct spvector { AxisSpec vxfineAxis = {configbins.VxfineNbins, configbins.lfinebinVx, configbins.hfinebinVx, "vxfine"}; AxisSpec vyfineAxis = {configbins.VyfineNbins, configbins.lfinebinVy, configbins.hfinebinVy, "vyfine"}; AxisSpec centfineAxis = {configbins.CentfineNbins, configbins.lfinebinCent, configbins.hfinebinCent, "V0M (%) fine"}; + AxisSpec timefineAxis = {configbins.TimefineNbins, configbins.lfinebinTime, configbins.hfinebinTime, "timefine"}; AxisSpec shiftAxis = {10, 0, 10, "shift"}; AxisSpec basisAxis = {2, 0, 2, "basis"}; AxisSpec VxyAxis = {2, 0, 2, "Vxy"}; @@ -255,6 +260,11 @@ struct spvector { histos.add("hvzQyZDCA", "hvzQyZDCA", kTH2F, {{vzfineAxis}, {qxZDCAxis}}); histos.add("hvzQxZDCC", "hvzQxZDCC", kTH2F, {{vzfineAxis}, {qxZDCAxis}}); histos.add("hvzQyZDCC", "hvzQyZDCC", kTH2F, {{vzfineAxis}, {qxZDCAxis}}); + + histos.add("htimeQxZDCA", "htimeQxZDCA", kTH2F, {{timefineAxis}, {qxZDCAxis}}); + histos.add("htimeQyZDCA", "htimeQyZDCA", kTH2F, {{timefineAxis}, {qxZDCAxis}}); + histos.add("htimeQxZDCC", "htimeQxZDCC", kTH2F, {{timefineAxis}, {qxZDCAxis}}); + histos.add("htimeQyZDCC", "htimeQyZDCC", kTH2F, {{timefineAxis}, {qxZDCAxis}}); } histos.add("PsiZDCC", "PsiZDCC", kTH2F, {centfineAxis, phiAxis}); @@ -424,6 +434,17 @@ struct spvector { histos.fill(HIST("hEvtSelInfo"), 1.5); + const uint64_t timestampzdc = bc.timestamp(); // in milliseconds + + // Convert timestamp to hours from run start (approximate) + // Store first timestamp of run to calculate relative time + static std::unordered_map runStartTime; + if (runStartTime.find(currentRunNumber) == runStartTime.end()) { + runStartTime[currentRunNumber] = timestampzdc; + } + + double timeInMinutes = (timestampzdc - runStartTime[currentRunNumber]) / 60000.0; // ms -> minutes + auto zdc = bc.zdc(); auto zncEnergy = zdc.energySectorZNC(); auto znaEnergy = zdc.energySectorZNA(); @@ -750,6 +771,11 @@ struct spvector { histos.fill(HIST("hvzQyZDCA"), vz, qyZDCA); histos.fill(HIST("hvzQxZDCC"), vz, qxZDCC); histos.fill(HIST("hvzQyZDCC"), vz, qyZDCC); + + histos.fill(HIST("htimeQxZDCA"), timeInMinutes, qxZDCA); + histos.fill(HIST("htimeQyZDCA"), timeInMinutes, qyZDCA); + histos.fill(HIST("htimeQxZDCC"), timeInMinutes, qxZDCC); + histos.fill(HIST("htimeQyZDCC"), timeInMinutes, qyZDCC); } histos.fill(HIST("hpCosPsiAPsiC"), centrality, (TMath::Cos(psiZDCA - psiZDCC))); diff --git a/PWGLF/TableProducer/Common/zdcvector.cxx b/PWGLF/TableProducer/Common/zdcvector.cxx index 2d4627a36d9..811f173c5b2 100644 --- a/PWGLF/TableProducer/Common/zdcvector.cxx +++ b/PWGLF/TableProducer/Common/zdcvector.cxx @@ -58,6 +58,7 @@ using BCsRun3 = soa::Join; struct zdcvector { Produces zdccaltable; + Produces zdcenergytable; // Configurables. struct : ConfigurableGroup { @@ -98,6 +99,9 @@ struct zdcvector { Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } rctCut; + Configurable storeZdcEnergy{"storeZdcEnergy", true, "Store ZDC tower/common energies in a linked extra table"}; + int32_t zdcCalTableRow = 0; + RCTFlagsChecker rctChecker; void init(o2::framework::InitContext&) @@ -176,35 +180,87 @@ struct zdcvector { auto sumA = 0.0; auto sumC = 0.0; + // default values for events without ZDC + float znaEnergycommon = 0.f; + float zncEnergycommon = 0.f; + + float zna0 = 0.f; + float zna1 = 0.f; + float zna2 = 0.f; + float zna3 = 0.f; + + float znc0 = 0.f; + float znc1 = 0.f; + float znc2 = 0.f; + float znc3 = 0.f; + auto bc = collision.foundBC_as(); + // Helper to keep your early-return structure unchanged. + // Every time ZDCCalTables is filled, the optional linked energy table is also filled. + auto fillTables = [&](bool trigger, + float qxA, + float qxC, + float qyA, + float qyC) { + zdccaltable(trigger, + currentRunNumber, + centrality, + vx, + vy, + vz, + qxA, + qxC, + qyA, + qyC); + + LOG(info) << "values are:" << trigger << " " << znaEnergycommon << " " << zna0; + if (storeZdcEnergy) { + zdcenergytable(zdcCalTableRow, + znaEnergycommon, + zncEnergycommon, + zna0, + zna1, + zna2, + zna3, + znc0, + znc1, + znc2, + znc3); + } + + ++zdcCalTableRow; + }; + if (!bc.has_zdc()) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); return; } - // -------- define time since run start -------- - /*uint64_t ts = bc.timestamp(); - if (currentRunNumber != runForStartTime) { - runStartTime = ts; - runForStartTime = currentRunNumber; - } - double tsec = 1.e-3 * static_cast(ts - runStartTime); - */ histos.fill(HIST("hEvtSelInfo"), 1.5); auto zdc = bc.zdc(); auto zncEnergy = zdc.energySectorZNC(); auto znaEnergy = zdc.energySectorZNA(); - auto zncEnergycommon = zdc.energyCommonZNC(); - auto znaEnergycommon = zdc.energyCommonZNA(); + zncEnergycommon = zdc.energyCommonZNC(); + znaEnergycommon = zdc.energyCommonZNA(); auto beamEne = 5.36 * 0.5; + zna0 = znaEnergy[0]; + zna1 = znaEnergy[1]; + zna2 = znaEnergy[2]; + zna3 = znaEnergy[3]; + + znc0 = zncEnergy[0]; + znc1 = zncEnergy[1]; + znc2 = zncEnergy[2]; + znc3 = zncEnergy[3]; if (znaEnergycommon <= 0.0 || zncEnergycommon <= 0.0) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); return; } @@ -212,16 +268,16 @@ struct zdcvector { if (znaEnergy[0] <= 0.0 || znaEnergy[1] <= 0.0 || znaEnergy[2] <= 0.0 || znaEnergy[3] <= 0.0) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); return; } histos.fill(HIST("hEvtSelInfo"), 3.5); if (zncEnergy[0] <= 0.0 || zncEnergy[1] <= 0.0 || zncEnergy[2] <= 0.0 || zncEnergy[3] <= 0.0) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); return; } @@ -229,25 +285,17 @@ struct zdcvector { if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); return; } histos.fill(HIST("hEvtSelInfo"), 5.5); - /*histos.fill(HIST("hZNA0"), centrality, znaEnergy[0]); - histos.fill(HIST("hZNA1"), centrality, znaEnergy[1]); - histos.fill(HIST("hZNA2"), centrality, znaEnergy[2]); - histos.fill(HIST("hZNA3"), centrality, znaEnergy[3]); - histos.fill(HIST("hZNC0"), centrality, zncEnergy[0]); - histos.fill(HIST("hZNC1"), centrality, zncEnergy[1]); - histos.fill(HIST("hZNC2"), centrality, zncEnergy[2]); - histos.fill(HIST("hZNC3"), centrality, zncEnergy[3]);*/ if (additionalEvSel && (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); return; } @@ -284,7 +332,8 @@ struct zdcvector { if (znaEnergy[iChA] <= 0.0) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); return; } else { double ampl = gainequal * znaEnergy[iChA]; @@ -300,8 +349,8 @@ struct zdcvector { } else { if (zncEnergy[iChA - 4] <= 0.0) { triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); return; } else { double ampl = gainequal * zncEnergy[iChA - 4]; @@ -345,8 +394,8 @@ struct zdcvector { qyZDCA = 0.0; qyZDCC = 0.0; triggerevent = false; - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); - // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3]); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0); + fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f); return; } @@ -370,7 +419,12 @@ struct zdcvector { lastRunNumber = currentRunNumber; } - zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, qxZDCA, qxZDCC, qyZDCA, qyZDCC); + // zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, qxZDCA, qxZDCC, qyZDCA, qyZDCC); + fillTables(triggerevent, + qxZDCA, + qxZDCC, + qyZDCA, + qyZDCC); } };