Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
4e134e6
Update CalorimeterClusterRecoCoG.cc
AkshayaVijay Aug 7, 2026
be7da4c
Update CalorimeterClusterRecoCoGConfig.h
AkshayaVijay Aug 7, 2026
5b23aca
Update SimCalorimeterHitProcessor.cc
AkshayaVijay Aug 7, 2026
077c58b
Update SimCalorimeterHitProcessorConfig.h
AkshayaVijay Aug 7, 2026
4f03d9d
Merge branch 'main' into CalorimeterClusterReco_get_Primary
AkshayaVijay Aug 7, 2026
0ebf286
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 7, 2026
64339ef
Update CalorimeterClusterRecoCoG.h
AkshayaVijay Aug 7, 2026
db04256
Update SimCalorimeterHitProcessor.cc
AkshayaVijay Aug 7, 2026
0b29195
Update CalorimeterClusterRecoCoG.cc
AkshayaVijay Aug 7, 2026
8e5ba9b
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 7, 2026
b27efd1
Redefined get_primary function to return first stable particle (fix: …
epic-capybara Aug 8, 2026
fa58028
fix: clang-tidy: modernize-deprecated-headers
wdconinc Aug 8, 2026
78d2681
Update CalorimeterClusterRecoCoG.cc
AkshayaVijay Aug 9, 2026
0393394
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 9, 2026
328b479
Update SimCalorimeterHitProcessor.cc
AkshayaVijay Aug 9, 2026
51c83a5
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 9, 2026
951f5bf
Merge branch 'main' into CalorimeterClusterReco_get_Primary
AkshayaVijay Aug 9, 2026
94b3cc2
Redefined get_primary function to return first stable particle (fix: …
epic-capybara Aug 9, 2026
e86967d
Update ImagingClusterReco.cc
AkshayaVijay Aug 10, 2026
d1167fd
Update ImagingClusterRecoConfig.h
AkshayaVijay Aug 10, 2026
b0b57d5
Potential fix for pull request finding
AkshayaVijay Aug 10, 2026
18bedc5
Update ImagingClusterRecoConfig.h
AkshayaVijay Aug 10, 2026
fcd211e
Update ImagingClusterReco.cc
AkshayaVijay Aug 10, 2026
81c6c04
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 10, 2026
d80bb45
Redefined get_primary function to return first stable particle (fix: …
epic-capybara Aug 10, 2026
77d7bb6
Potential fix for pull request finding
AkshayaVijay Aug 10, 2026
40db4f3
Update src/algorithms/calorimetry/ImagingClusterReco.cc
AkshayaVijay Aug 10, 2026
c228abb
Redefined get_primary function to return first stable particle (fix: …
epic-capybara Aug 10, 2026
f2928cb
Merge branch 'main' into CalorimeterClusterReco_get_Primary
AkshayaVijay Aug 11, 2026
a18d953
Merge branch 'main' into CalorimeterClusterReco_get_Primary
AkshayaVijay Aug 11, 2026
62be699
Merge branch 'main' into CalorimeterClusterReco_get_Primary
AkshayaVijay Aug 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 44 additions & 12 deletions src/algorithms/calorimetry/CalorimeterClusterRecoCoG.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@
#include <podio/ObjectID.h>
#include <podio/RelationRange.h>
#include <podio/detail/Link.h>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cstddef>
#include <limits>
#include <map>
#include <optional>
#include <ranges>
#include <tuple>
#include <vector>

Expand Down Expand Up @@ -266,21 +268,51 @@ void CalorimeterClusterRecoCoG::associate(
}

edm4hep::MCParticle
CalorimeterClusterRecoCoG::get_primary(const edm4hep::CaloHitContribution& contrib) {
// get contributing particle
const auto contributor = contrib.getParticle();

// walk back through parents to find primary
// - TODO finalize primary selection. This
// can be improved!!
edm4hep::MCParticle primary = contributor;
while (primary.parents_size() > 0) {
if (primary.getGeneratorStatus() != 0) {
CalorimeterClusterRecoCoG::get_primary(const edm4hep::CaloHitContribution& contrib) const {
edm4hep::MCParticle current = contrib.getParticle();
if (!current.isAvailable()) {
return current;
}

const edm4hep::MCParticle original = current;
std::vector<edm4hep::MCParticle> chain;
chain.push_back(current);
while (current.getGeneratorStatus() == 0 && current.parents_size() > 0) {
const auto parent = current.getParents(0);

if (!parent.isAvailable()) {
break;
}
primary = primary.getParents(0);

current = parent;
chain.push_back(current);
}

const auto is_prompt_decay_particle = [this](const edm4hep::MCParticle& particle) {
return std::ranges::find(m_cfg.promptDecayPDGs, std::abs(particle.getPDG())) !=
m_cfg.promptDecayPDGs.end();
};
for (std::size_t index = 0; index < chain.size(); ++index) {
Comment thread
AkshayaVijay marked this conversation as resolved.
Outdated
const auto& particle = chain[index];

if (!particle.isAvailable()) {
continue;
}
}
return primary;
for (auto iterator = chain.rbegin(); iterator != chain.rend(); ++iterator) {
if (!iterator->isAvailable()) {
continue;
}
const bool isPrompt = is_prompt_decay_particle(*iterator);

if (isPrompt) {
continue;
}

return *iterator;
}

return original;
}

} // namespace eicrecon
2 changes: 1 addition & 1 deletion src/algorithms/calorimetry/CalorimeterClusterRecoCoG.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ class CalorimeterClusterRecoCoG : public CalorimeterClusterRecoCoGAlgorithm,
const podio::LinkNavigator<edm4eic::MCRecoCalorimeterHitLinkCollection>& link_nav,
edm4eic::MCRecoClusterParticleLinkCollection* links,
edm4eic::MCRecoClusterParticleAssociationCollection* assocs) const;
static edm4hep::MCParticle get_primary(const edm4hep::CaloHitContribution& contrib);
edm4hep::MCParticle get_primary(const edm4hep::CaloHitContribution& contrib) const;
};

} // namespace eicrecon
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ struct CalorimeterClusterRecoCoGConfig {
// the eta of the contributing hits. This is useful to avoid edge effects
// for endcaps.
bool enableEtaBounds = false;
std::vector<int> promptDecayPDGs{111, 221, 331, 310, 3122};
};

} // namespace eicrecon
39 changes: 31 additions & 8 deletions src/algorithms/calorimetry/SimCalorimeterHitProcessor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
#include <fmt/format.h>
#include <podio/ObjectID.h>
#include <podio/RelationRange.h>
#include <cstdlib>
#include <cmath>
#include <cstddef>
#include <functional>
#include <gsl/pointers>
#include <limits>
#include <ranges>
Comment thread
AkshayaVijay marked this conversation as resolved.
#include <stdexcept>
Comment thread
Copilot marked this conversation as resolved.
#include <tuple>
#include <unordered_map>
Expand Down Expand Up @@ -52,18 +54,39 @@ template <> struct hash<std::tuple<edm4hep::MCParticle, uint64_t, int>> {
namespace {
// Lookup primary MCParticle @TODO this should be a shared utility function in the edm4xxx
// libraries
edm4hep::MCParticle lookup_primary(const edm4hep::CaloHitContribution& contrib) {
const auto contributor = contrib.getParticle();
edm4hep::MCParticle lookup_primary(const edm4hep::CaloHitContribution& contrib,
const std::vector<int>& promptDecayPDGs) {
edm4hep::MCParticle current = contrib.getParticle();

edm4hep::MCParticle primary = contributor;
while (primary.parents_size() > 0) {
if (primary.getGeneratorStatus() != 0) {
if (!current.isAvailable()) {
return current;
}

const edm4hep::MCParticle original = current;
std::vector<edm4hep::MCParticle> chain{current};
while (current.getGeneratorStatus() == 0 && current.parents_size() > 0) {
const auto parent = current.getParents(0);
if (!parent.isAvailable()) {
break;
}
primary = primary.getParents(0);
current = parent;
chain.push_back(current);
}
const auto is_prompt = [&promptDecayPDGs](const edm4hep::MCParticle& particle) {
return std::ranges::find(promptDecayPDGs, std::abs(particle.getPDG())) != promptDecayPDGs.end();
};
for (auto iterator = chain.rbegin(); iterator != chain.rend(); ++iterator) {
if (!iterator->isAvailable()) {
continue;
}
if (is_prompt(*iterator)) {
continue;
}
return *iterator;
}
return primary;
return original;
}

class HitContributionAccumulator {
private:
float m_energy{0};
Expand Down Expand Up @@ -175,7 +198,7 @@ void SimCalorimeterHitProcessor::process(const SimCalorimeterHitProcessor::Input
m_attenuationReferencePosition ? get_attenuation(ih.getPosition().z) : 1.;
// Use primary particle (traced back through parents) to group contributions
for (const auto& contrib : ih.getContributions()) {
edm4hep::MCParticle primary = lookup_primary(contrib);
edm4hep::MCParticle primary = lookup_primary(contrib, m_cfg.promptDecayPDGs);
const double propagationTime =
m_attenuationReferencePosition
? std::abs(m_attenuationReferencePosition.value() - ih.getPosition().z) *
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct SimCalorimeterHitProcessorConfig {
double fixedTimeDelay{};
// time window for grouping contributions
double timeWindow{100 * edm4eic::unit::ns};
std::vector<int> promptDecayPDGs{111, 221, 331, 310, 3122};
};

} // namespace eicrecon
Loading