Skip to content

Commit 796304b

Browse files
[PWGDQ] Add EMCal cluster information to the DQ skimmed data model (#17006)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent dd03005 commit 796304b

6 files changed

Lines changed: 355 additions & 5 deletions

File tree

PWGDQ/Core/HistogramsLibrary.cxx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,21 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h
10451045
}
10461046
}
10471047
}
1048+
if (subGroupStr.Contains("emcal")) {
1049+
hm->AddHistogram(histClass, "EMCalEnergy", "EMCal cluster energy", false, 500, 0.0, 50.0, VarManager::kEMCalEnergy);
1050+
hm->AddHistogram(histClass, "EMCalCoreEnergy", "EMCal cluster core energy", false, 500, 0.0, 50.0, VarManager::kEMCalCoreEnergy);
1051+
hm->AddHistogram(histClass, "EMCalEta_Phi", "EMCal cluster #eta vs #varphi", false, 100, -1.0, 1.0, VarManager::kEMCalEta, 180, 0.0, TMath::TwoPi(), VarManager::kEMCalPhi);
1052+
hm->AddHistogram(histClass, "EMCalM02", "EMCal cluster M02", false, 200, 0.0, 2.0, VarManager::kEMCalM02);
1053+
hm->AddHistogram(histClass, "EMCalM20", "EMCal cluster M20", false, 200, 0.0, 2.0, VarManager::kEMCalM20);
1054+
hm->AddHistogram(histClass, "EMCalNCells", "EMCal cluster no. cells", false, 50, -0.5, 49.5, VarManager::kEMCalNCells);
1055+
hm->AddHistogram(histClass, "EMCalTime", "EMCal cluster time", false, 400, -100.0, 100.0, VarManager::kEMCalTime);
1056+
hm->AddHistogram(histClass, "EMCalEnergy_Time", "EMCal cluster energy vs time", false, 100, 0.0, 50.0, VarManager::kEMCalEnergy, 200, -100.0, 100.0, VarManager::kEMCalTime);
1057+
if (subGroupStr.Contains("emcalmatch")) {
1058+
hm->AddHistogram(histClass, "EMCalEoverP", "EMCal E/p", false, 300, 0.0, 3.0, VarManager::kEMCalEoverP);
1059+
hm->AddHistogram(histClass, "Pt_EMCalEoverP", "p_{T} vs EMCal E/p", false, 200, 0.0, 20.0, VarManager::kPt, 300, 0.0, 3.0, VarManager::kEMCalEoverP);
1060+
hm->AddHistogram(histClass, "EMCalMatchDeltaEta_DeltaPhi", "EMCal matching #Delta#eta vs #Delta#varphi", false, 100, -0.1, 0.1, VarManager::kEMCalMatchDeltaEta, 100, -0.1, 0.1, VarManager::kEMCalMatchDeltaPhi);
1061+
}
1062+
}
10481063
if (subGroupStr.Contains("muon")) {
10491064
if (!subGroupStr.Contains("ambiguity")) {
10501065
hm->AddHistogram(histClass, "MuonNClusters", "", false, 100, 0.0, 10.0, VarManager::kMuonNClusters);

PWGDQ/Core/VarManager.cxx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,38 @@ void VarManager::SetDefaultVarNames()
10761076
fgVariableUnits[kTRDsignal] = "";
10771077
fgVariableNames[kTOFbeta] = "TOF #beta";
10781078
fgVariableUnits[kTOFbeta] = "";
1079+
fgVariableNames[kEMCalEnergy] = "EMCal cluster energy";
1080+
fgVariableUnits[kEMCalEnergy] = "GeV";
1081+
fgVariableNames[kEMCalCoreEnergy] = "EMCal cluster core energy";
1082+
fgVariableUnits[kEMCalCoreEnergy] = "GeV";
1083+
fgVariableNames[kEMCalRawEnergy] = "EMCal cluster raw energy";
1084+
fgVariableUnits[kEMCalRawEnergy] = "GeV";
1085+
fgVariableNames[kEMCalEta] = "EMCal cluster #eta";
1086+
fgVariableUnits[kEMCalEta] = "";
1087+
fgVariableNames[kEMCalPhi] = "EMCal cluster #varphi";
1088+
fgVariableUnits[kEMCalPhi] = "rad.";
1089+
fgVariableNames[kEMCalM02] = "EMCal cluster M02";
1090+
fgVariableUnits[kEMCalM02] = "";
1091+
fgVariableNames[kEMCalM20] = "EMCal cluster M20";
1092+
fgVariableUnits[kEMCalM20] = "";
1093+
fgVariableNames[kEMCalNCells] = "EMCal cluster no. cells";
1094+
fgVariableUnits[kEMCalNCells] = "";
1095+
fgVariableNames[kEMCalTime] = "EMCal cluster time";
1096+
fgVariableUnits[kEMCalTime] = "ns";
1097+
fgVariableNames[kEMCalIsExotic] = "EMCal cluster is exotic";
1098+
fgVariableUnits[kEMCalIsExotic] = "";
1099+
fgVariableNames[kEMCalDistanceToBadChannel] = "EMCal cluster distance to bad channel";
1100+
fgVariableUnits[kEMCalDistanceToBadChannel] = "";
1101+
fgVariableNames[kEMCalNLM] = "EMCal cluster no. local maxima";
1102+
fgVariableUnits[kEMCalNLM] = "";
1103+
fgVariableNames[kEMCalDefinition] = "EMCal cluster definition";
1104+
fgVariableUnits[kEMCalDefinition] = "";
1105+
fgVariableNames[kEMCalEoverP] = "E_{EMCal}/p_{track}";
1106+
fgVariableUnits[kEMCalEoverP] = "";
1107+
fgVariableNames[kEMCalMatchDeltaEta] = "#Delta#eta (track-cluster)";
1108+
fgVariableUnits[kEMCalMatchDeltaEta] = "";
1109+
fgVariableNames[kEMCalMatchDeltaPhi] = "#Delta#varphi (track-cluster)";
1110+
fgVariableUnits[kEMCalMatchDeltaPhi] = "";
10791111
fgVariableNames[kTrackLength] = "track length";
10801112
fgVariableUnits[kTrackLength] = "cm";
10811113
fgVariableNames[kTrackDCAxy] = "DCA_{xy}";
@@ -2349,6 +2381,22 @@ void VarManager::SetDefaultVarNames()
23492381
fgVarNamesMap["kTRDsignal"] = kTRDsignal;
23502382
fgVarNamesMap["kTRDPattern"] = kTRDPattern;
23512383
fgVarNamesMap["kTOFbeta"] = kTOFbeta;
2384+
fgVarNamesMap["kEMCalEnergy"] = kEMCalEnergy;
2385+
fgVarNamesMap["kEMCalCoreEnergy"] = kEMCalCoreEnergy;
2386+
fgVarNamesMap["kEMCalRawEnergy"] = kEMCalRawEnergy;
2387+
fgVarNamesMap["kEMCalEta"] = kEMCalEta;
2388+
fgVarNamesMap["kEMCalPhi"] = kEMCalPhi;
2389+
fgVarNamesMap["kEMCalM02"] = kEMCalM02;
2390+
fgVarNamesMap["kEMCalM20"] = kEMCalM20;
2391+
fgVarNamesMap["kEMCalNCells"] = kEMCalNCells;
2392+
fgVarNamesMap["kEMCalTime"] = kEMCalTime;
2393+
fgVarNamesMap["kEMCalIsExotic"] = kEMCalIsExotic;
2394+
fgVarNamesMap["kEMCalDistanceToBadChannel"] = kEMCalDistanceToBadChannel;
2395+
fgVarNamesMap["kEMCalNLM"] = kEMCalNLM;
2396+
fgVarNamesMap["kEMCalDefinition"] = kEMCalDefinition;
2397+
fgVarNamesMap["kEMCalEoverP"] = kEMCalEoverP;
2398+
fgVarNamesMap["kEMCalMatchDeltaEta"] = kEMCalMatchDeltaEta;
2399+
fgVarNamesMap["kEMCalMatchDeltaPhi"] = kEMCalMatchDeltaPhi;
23522400
fgVarNamesMap["kTrackLength"] = kTrackLength;
23532401
fgVarNamesMap["kTrackDCAxy"] = kTrackDCAxy;
23542402
fgVarNamesMap["kTrackDCAxyProng1"] = kTrackDCAxyProng1;

PWGDQ/Core/VarManager.h

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ class VarManager : public TObject
150150
MFTCov = BIT(27),
151151
TrackTOFService = BIT(28),
152152
ParticleMC = BIT(29),
153-
MuonDca = BIT(30)
153+
MuonDca = BIT(30),
154+
TrackEMCal = BIT(31) // NOTE: last free bit of the uint32 track fill maps; used both for aod::EMCALClusters and ReducedEMCals
154155
};
155156

156157
enum PairCandidateType {
@@ -191,6 +192,11 @@ class VarManager : public TObject
191192
kMuonIsPropagated = 7 // whether the muon was propagated already
192193
};
193194

195+
enum EMCalClusterFilteringBits {
196+
kEMCalClusterIsMatched = 0, // cluster has at least one matched track (from EMCALMatchedTracks)
197+
kEMCalClusterUserCutsBits = 1 // first bit for the user EMCal cluster selections
198+
};
199+
194200
// NOLINTNEXTLINE(readability-enum-initial-value)
195201
enum Variables {
196202
kNothing = -1,
@@ -648,6 +654,22 @@ class VarManager : public TObject
648654
kIsDalitzLeg, // Up to 8 dalitz selections
649655
kBarrelNAssocsInBunch = kIsDalitzLeg + 8, // number of in bunch collision associations
650656
kBarrelNAssocsOutOfBunch, // number of out of bunch collision associations
657+
kEMCalEnergy, // EMCal cluster energy
658+
kEMCalCoreEnergy, // EMCal cluster core energy
659+
kEMCalRawEnergy, // EMCal cluster raw energy
660+
kEMCalEta, // EMCal cluster pseudorapidity
661+
kEMCalPhi, // EMCal cluster azimuthal angle
662+
kEMCalM02, // EMCal shower shape long axis
663+
kEMCalM20, // EMCal shower shape short axis
664+
kEMCalNCells, // number of cells in the EMCal cluster
665+
kEMCalTime, // EMCal cluster time
666+
kEMCalIsExotic, // exotic EMCal cluster flag
667+
kEMCalDistanceToBadChannel, // distance of the EMCal cluster to the closest bad channel
668+
kEMCalNLM, // number of local maxima of the EMCal cluster
669+
kEMCalDefinition, // EMCal cluster definition
670+
kEMCalEoverP, // EMCal cluster energy over matched track momentum
671+
kEMCalMatchDeltaEta, // eta residual of the matched EMCal cluster w.r.t. the track
672+
kEMCalMatchDeltaPhi, // phi residual of the matched EMCal cluster w.r.t. the track
651673
kNBarrelTrackVariables,
652674

653675
// Muon track variables
@@ -1415,6 +1437,8 @@ class VarManager : public TObject
14151437
static void FillTrack(T const& track, float* values = nullptr);
14161438
template <uint32_t fillMap, typename T>
14171439
static void FillPhoton(T const& track, float* values = nullptr);
1440+
template <typename T>
1441+
static void FillTrackEMCal(T const& cluster, float trackP = -1.0f, float deltaEta = -999.0f, float deltaPhi = -999.0f, float* values = nullptr);
14181442
template <uint32_t fillMap, typename T, typename C>
14191443
static void FillTrackCollision(T const& track, C const& collision, float* values = nullptr);
14201444
template <int candidateType, uint32_t fillMap, typename T1, typename T2, typename C>
@@ -3466,6 +3490,35 @@ void VarManager::FillPhoton(T const& track, float* values)
34663490
}
34673491
}
34683492

3493+
template <typename T>
3494+
void VarManager::FillTrackEMCal(T const& cluster, float trackP, float deltaEta, float deltaPhi, float* values)
3495+
{
3496+
// Fill the EMCal cluster quantities; the cluster can be either an aod::EMCALCluster (skimming)
3497+
// or an aod::ReducedEMCal (analysis on skimmed data), the column schemas are identical.
3498+
// trackP: momentum of the matched track, used to compute E/p when called in a track-cluster matching context;
3499+
// the default (negative) value leaves E/p at the -999 sentinel, as for tracks without a matched cluster.
3500+
if (!values) {
3501+
values = fgValues;
3502+
}
3503+
3504+
values[kEMCalEnergy] = cluster.energy();
3505+
values[kEMCalCoreEnergy] = cluster.coreEnergy();
3506+
values[kEMCalRawEnergy] = cluster.rawEnergy();
3507+
values[kEMCalEta] = cluster.eta();
3508+
values[kEMCalPhi] = cluster.phi();
3509+
values[kEMCalM02] = cluster.m02();
3510+
values[kEMCalM20] = cluster.m20();
3511+
values[kEMCalNCells] = cluster.nCells();
3512+
values[kEMCalTime] = cluster.time();
3513+
values[kEMCalIsExotic] = cluster.isExotic();
3514+
values[kEMCalDistanceToBadChannel] = cluster.distanceToBadChannel();
3515+
values[kEMCalNLM] = cluster.nlm();
3516+
values[kEMCalDefinition] = cluster.definition();
3517+
values[kEMCalEoverP] = (trackP > 0.0f ? cluster.energy() / trackP : -999.0f);
3518+
values[kEMCalMatchDeltaEta] = deltaEta;
3519+
values[kEMCalMatchDeltaPhi] = deltaPhi;
3520+
}
3521+
34693522
template <typename U, typename T>
34703523
void VarManager::FillTrackMC(const U& mcStack, T const& track, float* values)
34713524
{

PWGDQ/DataModel/ReducedInfoTables.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,39 @@ DECLARE_SOA_TABLE(ReducedFITs, "AOD", "REDUCEDFIT", //! FIT detector information
366366

367367
using ReducedFIT = ReducedFITs::iterator;
368368

369+
namespace reducedemcal
370+
{
371+
// EMCal cluster information (from aod::EMCALClusters, see PWGJE/DataModel/EMCALClusters.h)
372+
DECLARE_SOA_INDEX_COLUMN(ReducedEvent, reducedevent); //!
373+
DECLARE_SOA_BITMAP_COLUMN(FilteringFlags, filteringFlags, 64); //! Bitmap of the cluster selections
374+
DECLARE_SOA_COLUMN(Energy, energy, float); //! cluster energy (GeV)
375+
DECLARE_SOA_COLUMN(CoreEnergy, coreEnergy, float); //! cluster core energy (GeV)
376+
DECLARE_SOA_COLUMN(RawEnergy, rawEnergy, float); //! raw cluster energy (GeV)
377+
DECLARE_SOA_COLUMN(Eta, eta, float); //! cluster pseudorapidity (calculated using vertex)
378+
DECLARE_SOA_COLUMN(Phi, phi, float); //! cluster azimuthal angle (calculated using vertex)
379+
DECLARE_SOA_COLUMN(M02, m02, float); //! shower shape long axis
380+
DECLARE_SOA_COLUMN(M20, m20, float); //! shower shape short axis
381+
DECLARE_SOA_COLUMN(NCells, nCells, int); //! number of cells in cluster
382+
DECLARE_SOA_COLUMN(Time, time, float); //! cluster time (ns)
383+
DECLARE_SOA_COLUMN(IsExotic, isExotic, bool); //! flag to mark cluster as exotic
384+
DECLARE_SOA_COLUMN(DistanceToBadChannel, distanceToBadChannel, float); //! distance to bad channel
385+
DECLARE_SOA_COLUMN(NLM, nlm, int); //! number of local maxima
386+
DECLARE_SOA_COLUMN(Definition, definition, int); //! cluster definition, see EMCALClusterDefinition.h
387+
DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! true for clusters from BCs with no or multiple collisions
388+
} // namespace reducedemcal
389+
390+
// Skimmed EMCal cluster information; standalone table (not joinable to the barrel track tables),
391+
// the matching to barrel tracks is stored as an index column in the ReducedTracksBarrelEMCal table
392+
DECLARE_SOA_TABLE(ReducedEMCals, "AOD", "REDUCEDEMCAL", //!
393+
o2::soa::Index<>, reducedemcal::ReducedEventId, reducedemcal::FilteringFlags,
394+
reducedemcal::Energy, reducedemcal::CoreEnergy, reducedemcal::RawEnergy,
395+
reducedemcal::Eta, reducedemcal::Phi, reducedemcal::M02, reducedemcal::M20,
396+
reducedemcal::NCells, reducedemcal::Time, reducedemcal::IsExotic,
397+
reducedemcal::DistanceToBadChannel, reducedemcal::NLM, reducedemcal::Definition,
398+
reducedemcal::IsAmbiguous);
399+
400+
using ReducedEMCal = ReducedEMCals::iterator;
401+
369402
namespace reducedtrack
370403
{
371404
// basic track information
@@ -399,6 +432,9 @@ DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //!
399432
[](float pt, float eta) -> float { return pt * std::sinh(eta); });
400433
DECLARE_SOA_DYNAMIC_COLUMN(P, p, //!
401434
[](float pt, float eta) -> float { return pt * std::cosh(eta); });
435+
DECLARE_SOA_INDEX_COLUMN(ReducedEMCal, matchedEMCalCluster); //! matching index pointing to the ReducedEMCals table, -1 if no matched cluster
436+
DECLARE_SOA_COLUMN(EMCalMatchDeltaEta, emcalMatchDeltaEta, float); //! eta residual of the matched EMCal cluster w.r.t. the track
437+
DECLARE_SOA_COLUMN(EMCalMatchDeltaPhi, emcalMatchDeltaPhi, float); //! phi residual of the matched EMCal cluster w.r.t. the track
402438
} // namespace reducedtrack
403439

404440
// basic track information
@@ -447,11 +483,18 @@ DECLARE_SOA_TABLE(ReducedTracksBarrelPID, "AOD", "RTBARRELPID", //!
447483
DECLARE_SOA_TABLE(ReducedTracksBarrelInfo, "AOD", "RTBARRELINFO",
448484
reducedtrack::CollisionId, collision::PosX, collision::PosY, collision::PosZ, reducedtrack::TrackId);
449485

486+
// barrel track EMCal matching information (joined with ReducedTracks);
487+
// one entry per skimmed barrel track, the index is -1 for tracks without a matched cluster
488+
DECLARE_SOA_TABLE(ReducedTracksBarrelEMCal, "AOD", "RTBARRELEMCAL", //!
489+
reducedtrack::ReducedEMCalId,
490+
reducedtrack::EMCalMatchDeltaEta, reducedtrack::EMCalMatchDeltaPhi);
491+
450492
using ReducedTrack = ReducedTracks::iterator;
451493
using ReducedTrackBarrel = ReducedTracksBarrel::iterator;
452494
using ReducedTrackBarrelCov = ReducedTracksBarrelCov::iterator;
453495
using ReducedTrackBarrelPID = ReducedTracksBarrelPID::iterator;
454496
using ReducedTrackBarrelInfo = ReducedTracksBarrelInfo::iterator;
497+
using ReducedTrackBarrelEMCal = ReducedTracksBarrelEMCal::iterator;
455498

456499
namespace reducedtrackMC
457500
{

0 commit comments

Comments
 (0)