Skip to content

Commit 8d0b2c1

Browse files
prottayCMTProttay Das
andauthored
[PWGLF] updated code to include timestamp and energy information (#16067)
Co-authored-by: Prottay Das <prottay@alipap1.cern.ch>
1 parent 25abb02 commit 8d0b2c1

3 files changed

Lines changed: 150 additions & 37 deletions

File tree

PWGLF/DataModel/ZDCCalTables.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,42 @@ DECLARE_SOA_TABLE(ZDCCalTables, "AOD", "ZDCCALTABLE",
4848
zdccaltable::QyA,
4949
zdccaltable::QyC);
5050
using ZDCCalTable = ZDCCalTables::iterator;
51+
52+
// Extra optional linked table.
53+
// This table does NOT duplicate cent, vx, vy, vz, run number, trigger, etc.
54+
// It only stores the ZDC energies and links back to ZDCCalTables.
55+
namespace zdcenergytable
56+
{
57+
DECLARE_SOA_INDEX_COLUMN(ZDCCalTable, zdcCalTable);
58+
59+
DECLARE_SOA_COLUMN(ZNACommon, znaCommon, float);
60+
DECLARE_SOA_COLUMN(ZNCCommon, zncCommon, float);
61+
62+
DECLARE_SOA_COLUMN(ZNA0, zna0, float);
63+
DECLARE_SOA_COLUMN(ZNA1, zna1, float);
64+
DECLARE_SOA_COLUMN(ZNA2, zna2, float);
65+
DECLARE_SOA_COLUMN(ZNA3, zna3, float);
66+
67+
DECLARE_SOA_COLUMN(ZNC0, znc0, float);
68+
DECLARE_SOA_COLUMN(ZNC1, znc1, float);
69+
DECLARE_SOA_COLUMN(ZNC2, znc2, float);
70+
DECLARE_SOA_COLUMN(ZNC3, znc3, float);
71+
} // namespace zdcenergytable
72+
73+
DECLARE_SOA_TABLE(ZDCEnergyTables, "AOD", "ZDCENERGY",
74+
zdcenergytable::ZDCCalTableId,
75+
zdcenergytable::ZNACommon,
76+
zdcenergytable::ZNCCommon,
77+
zdcenergytable::ZNA0,
78+
zdcenergytable::ZNA1,
79+
zdcenergytable::ZNA2,
80+
zdcenergytable::ZNA3,
81+
zdcenergytable::ZNC0,
82+
zdcenergytable::ZNC1,
83+
zdcenergytable::ZNC2,
84+
zdcenergytable::ZNC3);
85+
86+
using ZDCEnergyTable = ZDCEnergyTables::iterator;
87+
5188
} // namespace o2::aod
5289
#endif // PWGLF_DATAMODEL_ZDCCALTABLES_H_

PWGLF/TableProducer/Common/spvector.cxx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include <cstdint>
5454
#include <iostream>
5555
#include <string>
56+
#include <unordered_map>
5657
#include <vector>
5758

5859
using namespace o2;
@@ -114,6 +115,9 @@ struct spvector {
114115
Configurable<int> CentfineNbins{"CentfineNbins", 16, "Number of bins in cent fine histograms"};
115116
Configurable<float> lfinebinCent{"lfinebinCent", 0.0, "lower bin value in cent fine histograms"};
116117
Configurable<float> hfinebinCent{"hfinebinCent", 80.0, "higher bin value in cent fine histograms"};
118+
Configurable<int> TimefineNbins{"TimefineNbins", 120, "Number of bins in Time fine histograms"};
119+
Configurable<float> lfinebinTime{"lfinebinTime", 0, "lower bin value in Time fine histograms"};
120+
Configurable<float> hfinebinTime{"hfinebinTime", 120, "higher bin value in Time fine histograms"};
117121
} configbins;
118122

119123
Configurable<bool> useShift{"useShift", false, "shift histograms"};
@@ -217,6 +221,7 @@ struct spvector {
217221
AxisSpec vxfineAxis = {configbins.VxfineNbins, configbins.lfinebinVx, configbins.hfinebinVx, "vxfine"};
218222
AxisSpec vyfineAxis = {configbins.VyfineNbins, configbins.lfinebinVy, configbins.hfinebinVy, "vyfine"};
219223
AxisSpec centfineAxis = {configbins.CentfineNbins, configbins.lfinebinCent, configbins.hfinebinCent, "V0M (%) fine"};
224+
AxisSpec timefineAxis = {configbins.TimefineNbins, configbins.lfinebinTime, configbins.hfinebinTime, "timefine"};
220225
AxisSpec shiftAxis = {10, 0, 10, "shift"};
221226
AxisSpec basisAxis = {2, 0, 2, "basis"};
222227
AxisSpec VxyAxis = {2, 0, 2, "Vxy"};
@@ -255,6 +260,11 @@ struct spvector {
255260
histos.add("hvzQyZDCA", "hvzQyZDCA", kTH2F, {{vzfineAxis}, {qxZDCAxis}});
256261
histos.add("hvzQxZDCC", "hvzQxZDCC", kTH2F, {{vzfineAxis}, {qxZDCAxis}});
257262
histos.add("hvzQyZDCC", "hvzQyZDCC", kTH2F, {{vzfineAxis}, {qxZDCAxis}});
263+
264+
histos.add("htimeQxZDCA", "htimeQxZDCA", kTH2F, {{timefineAxis}, {qxZDCAxis}});
265+
histos.add("htimeQyZDCA", "htimeQyZDCA", kTH2F, {{timefineAxis}, {qxZDCAxis}});
266+
histos.add("htimeQxZDCC", "htimeQxZDCC", kTH2F, {{timefineAxis}, {qxZDCAxis}});
267+
histos.add("htimeQyZDCC", "htimeQyZDCC", kTH2F, {{timefineAxis}, {qxZDCAxis}});
258268
}
259269

260270
histos.add("PsiZDCC", "PsiZDCC", kTH2F, {centfineAxis, phiAxis});
@@ -424,6 +434,17 @@ struct spvector {
424434

425435
histos.fill(HIST("hEvtSelInfo"), 1.5);
426436

437+
const uint64_t timestampzdc = bc.timestamp(); // in milliseconds
438+
439+
// Convert timestamp to hours from run start (approximate)
440+
// Store first timestamp of run to calculate relative time
441+
static std::unordered_map<int, uint64_t> runStartTime;
442+
if (runStartTime.find(currentRunNumber) == runStartTime.end()) {
443+
runStartTime[currentRunNumber] = timestampzdc;
444+
}
445+
446+
double timeInMinutes = (timestampzdc - runStartTime[currentRunNumber]) / 60000.0; // ms -> minutes
447+
427448
auto zdc = bc.zdc();
428449
auto zncEnergy = zdc.energySectorZNC();
429450
auto znaEnergy = zdc.energySectorZNA();
@@ -750,6 +771,11 @@ struct spvector {
750771
histos.fill(HIST("hvzQyZDCA"), vz, qyZDCA);
751772
histos.fill(HIST("hvzQxZDCC"), vz, qxZDCC);
752773
histos.fill(HIST("hvzQyZDCC"), vz, qyZDCC);
774+
775+
histos.fill(HIST("htimeQxZDCA"), timeInMinutes, qxZDCA);
776+
histos.fill(HIST("htimeQyZDCA"), timeInMinutes, qyZDCA);
777+
histos.fill(HIST("htimeQxZDCC"), timeInMinutes, qxZDCC);
778+
histos.fill(HIST("htimeQyZDCC"), timeInMinutes, qyZDCC);
753779
}
754780

755781
histos.fill(HIST("hpCosPsiAPsiC"), centrality, (TMath::Cos(psiZDCA - psiZDCC)));

PWGLF/TableProducer/Common/zdcvector.cxx

Lines changed: 87 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ using BCsRun3 = soa::Join<aod::BCsWithTimestamps, aod::Run3MatchedToBCSparse>;
5858
struct zdcvector {
5959

6060
Produces<aod::ZDCCalTables> zdccaltable;
61+
Produces<aod::ZDCEnergyTables> zdcenergytable;
6162

6263
// Configurables.
6364
struct : ConfigurableGroup {
@@ -98,6 +99,8 @@ struct zdcvector {
9899
Configurable<bool> cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"};
99100
} rctCut;
100101

102+
Configurable<bool> storeZdcEnergy{"storeZdcEnergy", true, "Store ZDC tower/common energies in a linked extra table"};
103+
101104
RCTFlagsChecker rctChecker;
102105

103106
void init(o2::framework::InitContext&)
@@ -137,8 +140,8 @@ struct zdcvector {
137140

138141
int currentRunNumber = -999;
139142
int lastRunNumber = -999;
140-
TH2D* gainprofile;
141-
TProfile* gainprofilevxy;
143+
TH2D* gainprofile = nullptr;
144+
TProfile* gainprofilevxy = nullptr;
142145

143146
// int lastRunNumberTimeRec = -999;
144147
// for time since start of run
@@ -176,78 +179,119 @@ struct zdcvector {
176179
auto sumA = 0.0;
177180
auto sumC = 0.0;
178181

182+
// default values for events without ZDC
183+
float znaEnergycommon = 0.f;
184+
float zncEnergycommon = 0.f;
185+
186+
float zna0 = 0.f;
187+
float zna1 = 0.f;
188+
float zna2 = 0.f;
189+
float zna3 = 0.f;
190+
191+
float znc0 = 0.f;
192+
float znc1 = 0.f;
193+
float znc2 = 0.f;
194+
float znc3 = 0.f;
195+
179196
auto bc = collision.foundBC_as<BCsRun3>();
180197

198+
// Helper to keep your early-return structure unchanged.
199+
// Every time ZDCCalTables is filled, the optional linked energy table is also filled.
200+
auto fillTables = [&](bool trigger,
201+
float qxA,
202+
float qxC,
203+
float qyA,
204+
float qyC) {
205+
zdccaltable(trigger,
206+
currentRunNumber,
207+
centrality,
208+
vx,
209+
vy,
210+
vz,
211+
qxA,
212+
qxC,
213+
qyA,
214+
qyC);
215+
216+
if (storeZdcEnergy) {
217+
zdcenergytable(zdccaltable.lastIndex(),
218+
znaEnergycommon,
219+
zncEnergycommon,
220+
zna0,
221+
zna1,
222+
zna2,
223+
zna3,
224+
znc0,
225+
znc1,
226+
znc2,
227+
znc3);
228+
}
229+
};
230+
181231
if (!bc.has_zdc()) {
182232
triggerevent = false;
183-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
233+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
234+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
184235
return;
185236
}
186237

187-
// -------- define time since run start --------
188-
/*uint64_t ts = bc.timestamp();
189-
if (currentRunNumber != runForStartTime) {
190-
runStartTime = ts;
191-
runForStartTime = currentRunNumber;
192-
}
193-
double tsec = 1.e-3 * static_cast<double>(ts - runStartTime);
194-
*/
195238
histos.fill(HIST("hEvtSelInfo"), 1.5);
196239

197240
auto zdc = bc.zdc();
198241
auto zncEnergy = zdc.energySectorZNC();
199242
auto znaEnergy = zdc.energySectorZNA();
200-
auto zncEnergycommon = zdc.energyCommonZNC();
201-
auto znaEnergycommon = zdc.energyCommonZNA();
243+
zncEnergycommon = zdc.energyCommonZNC();
244+
znaEnergycommon = zdc.energyCommonZNA();
202245
auto beamEne = 5.36 * 0.5;
246+
zna0 = znaEnergy[0];
247+
zna1 = znaEnergy[1];
248+
zna2 = znaEnergy[2];
249+
zna3 = znaEnergy[3];
250+
251+
znc0 = zncEnergy[0];
252+
znc1 = zncEnergy[1];
253+
znc2 = zncEnergy[2];
254+
znc3 = zncEnergy[3];
203255

204256
if (znaEnergycommon <= 0.0 || zncEnergycommon <= 0.0) {
205257
triggerevent = false;
206-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
207-
// 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]);
258+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
259+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
208260
return;
209261
}
210262

211263
histos.fill(HIST("hEvtSelInfo"), 2.5);
212264

213265
if (znaEnergy[0] <= 0.0 || znaEnergy[1] <= 0.0 || znaEnergy[2] <= 0.0 || znaEnergy[3] <= 0.0) {
214266
triggerevent = false;
215-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
216-
// 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]);
267+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
268+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
217269
return;
218270
}
219271
histos.fill(HIST("hEvtSelInfo"), 3.5);
220272

221273
if (zncEnergy[0] <= 0.0 || zncEnergy[1] <= 0.0 || zncEnergy[2] <= 0.0 || zncEnergy[3] <= 0.0) {
222274
triggerevent = false;
223-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
224-
// 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]);
275+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
276+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
225277
return;
226278
}
227279

228280
histos.fill(HIST("hEvtSelInfo"), 4.5);
229281

230282
if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) {
231283
triggerevent = false;
232-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
233-
// 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]);
284+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
285+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
234286
return;
235287
}
236288

237289
histos.fill(HIST("hEvtSelInfo"), 5.5);
238-
/*histos.fill(HIST("hZNA0"), centrality, znaEnergy[0]);
239-
histos.fill(HIST("hZNA1"), centrality, znaEnergy[1]);
240-
histos.fill(HIST("hZNA2"), centrality, znaEnergy[2]);
241-
histos.fill(HIST("hZNA3"), centrality, znaEnergy[3]);
242-
histos.fill(HIST("hZNC0"), centrality, zncEnergy[0]);
243-
histos.fill(HIST("hZNC1"), centrality, zncEnergy[1]);
244-
histos.fill(HIST("hZNC2"), centrality, zncEnergy[2]);
245-
histos.fill(HIST("hZNC3"), centrality, zncEnergy[3]);*/
246290

247291
if (additionalEvSel && (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) {
248292
triggerevent = false;
249-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
250-
// 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]);
293+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
294+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
251295
return;
252296
}
253297

@@ -284,7 +328,8 @@ struct zdcvector {
284328

285329
if (znaEnergy[iChA] <= 0.0) {
286330
triggerevent = false;
287-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
331+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
332+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
288333
return;
289334
} else {
290335
double ampl = gainequal * znaEnergy[iChA];
@@ -300,8 +345,8 @@ struct zdcvector {
300345
} else {
301346
if (zncEnergy[iChA - 4] <= 0.0) {
302347
triggerevent = false;
303-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
304-
// 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]);
348+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
349+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
305350
return;
306351
} else {
307352
double ampl = gainequal * zncEnergy[iChA - 4];
@@ -345,8 +390,8 @@ struct zdcvector {
345390
qyZDCA = 0.0;
346391
qyZDCC = 0.0;
347392
triggerevent = false;
348-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
349-
// 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]);
393+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, 0.0, 0.0, 0.0, 0.0);
394+
fillTables(triggerevent, 0.f, 0.f, 0.f, 0.f);
350395
return;
351396
}
352397

@@ -370,7 +415,12 @@ struct zdcvector {
370415

371416
lastRunNumber = currentRunNumber;
372417
}
373-
zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, qxZDCA, qxZDCC, qyZDCA, qyZDCC);
418+
// zdccaltable(triggerevent, currentRunNumber, centrality, vx, vy, vz, qxZDCA, qxZDCC, qyZDCA, qyZDCC);
419+
fillTables(triggerevent,
420+
qxZDCA,
421+
qxZDCC,
422+
qyZDCA,
423+
qyZDCC);
374424
}
375425
};
376426

0 commit comments

Comments
 (0)