diff --git a/DPGAnalysis/HGCalNanoAOD/plugins/BuildFile.xml b/DPGAnalysis/HGCalNanoAOD/plugins/BuildFile.xml
index 314b2fcab95ae..a947945653565 100644
--- a/DPGAnalysis/HGCalNanoAOD/plugins/BuildFile.xml
+++ b/DPGAnalysis/HGCalNanoAOD/plugins/BuildFile.xml
@@ -5,6 +5,9 @@
+
+
+
diff --git a/DPGAnalysis/HGCalNanoAOD/plugins/SimTracksterTableProducer.cc b/DPGAnalysis/HGCalNanoAOD/plugins/SimTracksterTableProducer.cc
index 03134e1c0d065..85941f9541516 100644
--- a/DPGAnalysis/HGCalNanoAOD/plugins/SimTracksterTableProducer.cc
+++ b/DPGAnalysis/HGCalNanoAOD/plugins/SimTracksterTableProducer.cc
@@ -48,6 +48,7 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
const size_t nSimTracksters = simTrackstersHandle.isValid() ? simTrackstersHandle->size() : 0;
static constexpr float default_value = std::numeric_limits::quiet_NaN();
+ static constexpr int default_int_value = -1;
std::vector boundaryX(nSimTracksters, default_value);
std::vector boundaryY(nSimTracksters, default_value);
@@ -61,6 +62,8 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
std::vector simTime(nSimTracksters, default_value);
std::vector genPt(nSimTracksters, default_value);
std::vector mass(nSimTracksters, default_value);
+ std::vector caloParticleIdx(nSimTracksters, default_int_value);
+ std::vector isPU(nSimTracksters, default_int_value);
if ((simTrackstersHandle.isValid() && caloParticlesHandle.isValid() && simClustersHandle.isValid() &&
cpToSCMapHandle.isValid()) ||
@@ -71,7 +74,7 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
const auto& cpToSCMap = *cpToSCMapHandle;
//utility lambda for filling vectors
- auto fillVectors = [&](const auto& obj, size_t iSim, float time) {
+ auto fillVectors = [&](const auto& obj, size_t iSim, float time, int cpIdx) {
const auto& simTrack = obj.g4Tracks()[0];
const auto caloPt = obj.pt();
const auto simHitSumEnergy = obj.simEnergy();
@@ -90,6 +93,12 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
simEnergy[iSim] = simHitSumEnergy;
genPt[iSim] = caloPt;
mass[iSim] = caloMass;
+
+ // PU flag: a non-zero event/bunch-crossing on the
+ // seed g4Track means the CaloParticle/SimCluster came from a pileup interaction.
+ isPU[iSim] = (simTrack.eventId().event() != 0 || simTrack.eventId().bunchCrossing() != 0) ? 1 : 0;
+
+ caloParticleIdx[iSim] = cpIdx;
};
for (size_t iSim = 0; iSim < simTracksters.size(); ++iSim) {
@@ -97,19 +106,22 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
float time = default_value;
if (simT.seedID() == caloParticlesHandle.id()) {
+ const int cpIdx = static_cast(simT.seedIndex());
const auto& cp = caloParticles[simT.seedIndex()];
time = cp.simTime();
- fillVectors(cp, iSim, time);
+ fillVectors(cp, iSim, time, cpIdx);
} else {
const auto& sc = simClusters[simT.seedIndex()];
+ int cpIdx = default_int_value;
//SCtoCP map not availalbe, use CPtoSC map instead
- for (const auto& [cpIdx, scVec] : cpToSCMap) {
+ for (const auto& [cpIdxCandidate, scVec] : cpToSCMap) {
if (std::ranges::find(scVec, simT.seedIndex()) != scVec.end()) {
- time = caloParticles[cpIdx].simTime();
+ cpIdx = static_cast(cpIdxCandidate);
+ time = caloParticles[cpIdxCandidate].simTime();
break; //dont need to check further
}
}
- fillVectors(sc, iSim, time);
+ fillVectors(sc, iSim, time, cpIdx);
}
}
}
@@ -125,7 +137,7 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
simTrackstersTable->addColumn(
"boundaryEta", boundaryEta, "CaloVolume boundary pseudorapidity of associated Simobject", precision_);
simTrackstersTable->addColumn(
- "boundaryPhi", boundaryEta, "CaloVolume boundary phi of associated Simobject", precision_);
+ "boundaryPhi", boundaryPhi, "CaloVolume boundary phi of associated Simobject", precision_);
simTrackstersTable->addColumn(
"boundaryPx", boundaryPx, "X component of momentum at CaloVolume boundary of associated Simobject", precision_);
simTrackstersTable->addColumn(
@@ -135,6 +147,10 @@ class SimTracksterTableProducer : public edm::global::EDProducer<> {
simTrackstersTable->addColumn("simTime", simTime, "Sim-Time of simulated object [ns]", precision_);
simTrackstersTable->addColumn("genPt", genPt, "Gen-pT associated with SimObject", precision_);
simTrackstersTable->addColumn("mass", mass, "mass associated with SimObject", precision_);
+ simTrackstersTable->addColumn(
+ "caloParticleIdx", caloParticleIdx, "Index of the parent CaloParticle in the CaloParticle collection");
+ simTrackstersTable->addColumn(
+ "isPU", isPU, "PU flag of the associated Simobject: 1 = pileup (non-zero event/bx), 0 = otherwise");
event.put(std::move(simTrackstersTable), tableName_);
}
diff --git a/DPGAnalysis/HGCalNanoAOD/plugins/TICLCandidateExtraTableProducer.cc b/DPGAnalysis/HGCalNanoAOD/plugins/TICLCandidateExtraTableProducer.cc
index e1bd73f5d0f23..acddb1891c018 100644
--- a/DPGAnalysis/HGCalNanoAOD/plugins/TICLCandidateExtraTableProducer.cc
+++ b/DPGAnalysis/HGCalNanoAOD/plugins/TICLCandidateExtraTableProducer.cc
@@ -1,3 +1,5 @@
+#include
+#include