-
Notifications
You must be signed in to change notification settings - Fork 34
Implement Calo Remnant Combiner (PFA2) #2195
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -20,10 +20,11 @@ | |||||||||||||||||||
|
|
||||||||||||||||||||
| namespace eicrecon { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| void CaloRemnantCombiner::process(const CaloRemnantCombiner::Input& input, const CaloRemnantCombiner::Output& output) const { | ||||||||||||||||||||
| void CaloRemnantCombiner::process(const CaloRemnantCombiner::Input& input, | ||||||||||||||||||||
| const CaloRemnantCombiner::Output& output) const { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| const auto [calo_clusters] = input; | ||||||||||||||||||||
| auto [out_neutral_candidates] = output; | ||||||||||||||||||||
| const auto [calo_clusters] = input; | ||||||||||||||||||||
| auto [out_neutral_candidates] = output; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| std::vector<bool> visits_ecal(calo_clusters[0]->size(), false); | ||||||||||||||||||||
| std::vector<bool> visits_hcal(calo_clusters[1]->size(), false); | ||||||||||||||||||||
|
|
@@ -33,66 +34,70 @@ void CaloRemnantCombiner::process(const CaloRemnantCombiner::Input& input, const | |||||||||||||||||||
|
|
||||||||||||||||||||
| while (visits_ecal != visits_ecal_true) { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| edm4eic::MutableReconstructedParticle neutral_candidate_eh; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Step 1: Find the seed Ecal cluster with highest energy | ||||||||||||||||||||
| std::size_t seed_ecal_index = findSeedCluster_index(*calo_clusters[0], visits_ecal); | ||||||||||||||||||||
| edm4eic::MutableReconstructedParticle neutral_candidate_eh; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (seed_ecal_index == -1) { | ||||||||||||||||||||
| info("No Seed Ecal cluster found for remnant combination."); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| // Step 1: Find the seed Ecal cluster with highest energy | ||||||||||||||||||||
| std::size_t seed_ecal_index = findSeedCluster_index(*calo_clusters[0], visits_ecal); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (seed_ecal_index != -1) { | ||||||||||||||||||||
| // Get the cluster indices for merging | ||||||||||||||||||||
| std::set<std::size_t> ecalcluster_indices = getcluster_indices_for_merging(*calo_clusters[0], visits_ecal, seed_ecal_index, m_cfg.delta_r_add_em, *calo_clusters[0]); | ||||||||||||||||||||
| if (seed_ecal_index == -1) { | ||||||||||||||||||||
| info("No Seed Ecal cluster found for remnant combination."); | ||||||||||||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| for (const auto& idx : ecalcluster_indices) { | ||||||||||||||||||||
| neutral_candidate_eh.addToClusters((*calo_clusters[0])[idx]); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| if (seed_ecal_index != -1) { | ||||||||||||||||||||
| // Get the cluster indices for merging | ||||||||||||||||||||
| std::set<std::size_t> ecalcluster_indices = getcluster_indices_for_merging( | ||||||||||||||||||||
| *calo_clusters[0], visits_ecal, seed_ecal_index, m_cfg.delta_r_add_em, *calo_clusters[0]); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| std::set<std::size_t> e_hcalcluster_indices = getcluster_indices_for_merging(*calo_clusters[1], visits_hcal, seed_ecal_index, m_cfg.delta_r_add_h, *calo_clusters[0]); | ||||||||||||||||||||
| for (const auto& idx : ecalcluster_indices) { | ||||||||||||||||||||
| neutral_candidate_eh.addToClusters((*calo_clusters[0])[idx]); | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| for (const auto& idx : e_hcalcluster_indices) { | ||||||||||||||||||||
| neutral_candidate_eh.addToClusters((*calo_clusters[1])[idx]); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| std::set<std::size_t> e_hcalcluster_indices = getcluster_indices_for_merging( | ||||||||||||||||||||
| *calo_clusters[1], visits_hcal, seed_ecal_index, m_cfg.delta_r_add_h, *calo_clusters[0]); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| out_neutral_candidates->push_back(neutral_candidate_eh); | ||||||||||||||||||||
| for (const auto& idx : e_hcalcluster_indices) { | ||||||||||||||||||||
| neutral_candidate_eh.addToClusters((*calo_clusters[1])[idx]); | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of if (seed_ecal_index != -1) | ||||||||||||||||||||
| out_neutral_candidates->push_back(neutral_candidate_eh); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of while (visits_ecal != visits_ecal_true) | ||||||||||||||||||||
| } // end of if (seed_ecal_index != -1) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of while (visits_ecal != visits_ecal_true) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| while (visits_hcal != visits_hcal_true) { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| edm4eic::MutableReconstructedParticle neutral_candidate_h; | ||||||||||||||||||||
| std::size_t seed_rem_hcal_index = findSeedCluster_index(*calo_clusters[1], visits_hcal); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (seed_rem_hcal_index == -1) { | ||||||||||||||||||||
| info("No Seed Hcal cluster found for remnant combination."); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| edm4eic::MutableReconstructedParticle neutral_candidate_h; | ||||||||||||||||||||
| std::size_t seed_rem_hcal_index = findSeedCluster_index(*calo_clusters[1], visits_hcal); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (seed_rem_hcal_index != -1) { | ||||||||||||||||||||
| if (seed_rem_hcal_index == -1) { | ||||||||||||||||||||
| info("No Seed Hcal cluster found for remnant combination."); | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| std::set<std::size_t> rem_hcalcluster_indices; | ||||||||||||||||||||
| if (seed_rem_hcal_index != -1) { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| rem_hcalcluster_indices = getcluster_indices_for_merging(*calo_clusters[1], visits_hcal, seed_rem_hcal_index, m_cfg.delta_r_add_h, *calo_clusters[1]); | ||||||||||||||||||||
| std::set<std::size_t> rem_hcalcluster_indices; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| for (const auto& idx : rem_hcalcluster_indices) { | ||||||||||||||||||||
| neutral_candidate_h.addToClusters((*calo_clusters[1])[idx]); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| out_neutral_candidates->push_back(neutral_candidate_h); | ||||||||||||||||||||
| rem_hcalcluster_indices = | ||||||||||||||||||||
| getcluster_indices_for_merging(*calo_clusters[1], visits_hcal, seed_rem_hcal_index, | ||||||||||||||||||||
| m_cfg.delta_r_add_h, *calo_clusters[1]); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| for (const auto& idx : rem_hcalcluster_indices) { | ||||||||||||||||||||
| neutral_candidate_h.addToClusters((*calo_clusters[1])[idx]); | ||||||||||||||||||||
| } | ||||||||||||||||||||
| out_neutral_candidates->push_back(neutral_candidate_h); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of if (seed_rem_hcal_index != -1) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of if (seed_rem_hcal_index != -1) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of while (visits_hcal != visits_hcal_true) | ||||||||||||||||||||
|
|
||||||||||||||||||||
| } // end of process | ||||||||||||||||||||
| } // end of process | ||||||||||||||||||||
|
|
||||||||||||||||||||
| std::size_t CaloRemnantCombiner::findSeedCluster_index(const edm4eic::ClusterCollection& clusters, std::vector<bool>& visits) { | ||||||||||||||||||||
| double max_cluster_energy = -1.0; | ||||||||||||||||||||
| std::size_t seed_cluster_index = -1; | ||||||||||||||||||||
| for (std::size_t i = 0; i < clusters.size(); ++i) { | ||||||||||||||||||||
| std::size_t CaloRemnantCombiner::findSeedCluster_index(const edm4eic::ClusterCollection& clusters, | ||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Another good place for a docstring! Here you'll definitely want to note the criteria for a seed cluster and what it's for.
Suggested change
|
||||||||||||||||||||
| std::vector<bool>& visits) { | ||||||||||||||||||||
| double max_cluster_energy = -1.0; | ||||||||||||||||||||
| std::size_t seed_cluster_index = -1; | ||||||||||||||||||||
| for (std::size_t i = 0; i < clusters.size(); ++i) { | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (visits[i]) { | ||||||||||||||||||||
| continue; | ||||||||||||||||||||
|
|
@@ -102,12 +107,14 @@ std::size_t CaloRemnantCombiner::findSeedCluster_index(const edm4eic::ClusterCol | |||||||||||||||||||
| max_cluster_energy = clusters[i].getEnergy(); | ||||||||||||||||||||
| seed_cluster_index = i; | ||||||||||||||||||||
| } | ||||||||||||||||||||
| } | ||||||||||||||||||||
| return seed_cluster_index; | ||||||||||||||||||||
| } | ||||||||||||||||||||
| return seed_cluster_index; | ||||||||||||||||||||
| } | ||||||||||||||||||||
|
|
||||||||||||||||||||
| std::set<std::size_t> CaloRemnantCombiner::getcluster_indices_for_merging(const edm4eic::ClusterCollection& clusters, std::vector<bool>& visits, std::size_t seed_cluster_index, double delta_r, const edm4eic::ClusterCollection& seed) { | ||||||||||||||||||||
| std::set<std::size_t> cluster_indices; | ||||||||||||||||||||
| std::set<std::size_t> CaloRemnantCombiner::getcluster_indices_for_merging( | ||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is another good place for a docstring: you'll want to briefly explain what the method is doing!
Suggested change
|
||||||||||||||||||||
| const edm4eic::ClusterCollection& clusters, std::vector<bool>& visits, | ||||||||||||||||||||
| std::size_t seed_cluster_index, double delta_r, const edm4eic::ClusterCollection& seed) { | ||||||||||||||||||||
|
Comment on lines
+115
to
+116
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd suggest making the
Suggested change
|
||||||||||||||||||||
| std::set<std::size_t> cluster_indices; | ||||||||||||||||||||
|
|
||||||||||||||||||||
| for (std::size_t i = 0; i < clusters.size(); ++i) { | ||||||||||||||||||||
| if (visits[i]) { | ||||||||||||||||||||
|
|
@@ -117,23 +124,23 @@ std::set<std::size_t> CaloRemnantCombiner::getcluster_indices_for_merging(const | |||||||||||||||||||
|
|
||||||||||||||||||||
| // Using simple Euclidean distance in 3D space | ||||||||||||||||||||
| ///double distance = edm4hep::utils::magnitude(clusters[i].getPosition() - seed[seed_cluster_index].getPosition()); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Using delta R in the transverse plane (x-y plane) | ||||||||||||||||||||
| /*double dx = clusters[i].getPosition().x - seed[seed_cluster_index].getPosition().x; | ||||||||||||||||||||
| double dy = clusters[i].getPosition().y - seed[seed_cluster_index].getPosition().y; | ||||||||||||||||||||
| double distance = std::sqrt(dx * dx + dy * dy);*/ | ||||||||||||||||||||
|
|
||||||||||||||||||||
| // Using angular distance (delta R) in eta-phi space | ||||||||||||||||||||
| edm4hep::Vector3f seed_pos = seed[seed_cluster_index].getPosition(); | ||||||||||||||||||||
| edm4hep::Vector3f seed_pos = seed[seed_cluster_index].getPosition(); | ||||||||||||||||||||
| edm4hep::Vector3f cluster_pos = clusters[i].getPosition(); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| float eta_seed = edm4hep::utils::eta(seed_pos); | ||||||||||||||||||||
| float phi_seed = edm4hep::utils::angleAzimuthal(seed_pos); | ||||||||||||||||||||
| float eta_seed = edm4hep::utils::eta(seed_pos); | ||||||||||||||||||||
| float phi_seed = edm4hep::utils::angleAzimuthal(seed_pos); | ||||||||||||||||||||
| float eta_cluster = edm4hep::utils::eta(cluster_pos); | ||||||||||||||||||||
| float phi_cluster = edm4hep::utils::angleAzimuthal(cluster_pos); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| float dphi = phi_cluster - phi_seed; | ||||||||||||||||||||
| float deta = eta_cluster - eta_seed; | ||||||||||||||||||||
| float dphi = phi_cluster - phi_seed; | ||||||||||||||||||||
| float deta = eta_cluster - eta_seed; | ||||||||||||||||||||
| float distance = std::sqrt(deta * deta + dphi * dphi); | ||||||||||||||||||||
|
|
||||||||||||||||||||
| if (distance < delta_r) { // distance threshold for merging | ||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Following up on the above comment: this way I think you can drop the comment after the braces!
Suggested change
|
||||||||||||||||||||
|
|
||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -14,24 +14,28 @@ | |||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| namespace eicrecon { | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| using CaloRemnantCombinerAlgorithm = algorithms::Algorithm< | ||||||||||||||||||||||||||
| algorithms::Input<std::vector<edm4eic::ClusterCollection>>, | ||||||||||||||||||||||||||
| algorithms::Output<edm4eic::ReconstructedParticleCollection>>; | ||||||||||||||||||||||||||
| using CaloRemnantCombinerAlgorithm = | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This would be another good place for a docstring, especially since the ordering of collections in the input vector matters!
Suggested change
|
||||||||||||||||||||||||||
| algorithms::Algorithm<algorithms::Input<std::vector<edm4eic::ClusterCollection>>, | ||||||||||||||||||||||||||
| algorithms::Output<edm4eic::ReconstructedParticleCollection>>; | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| class CaloRemnantCombiner : public CaloRemnantCombinerAlgorithm, | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd suggest adding docstrings in several places. These should get propagated to our doxygen page, and help explain what's happening in the code for anyone who's looking at the source code!
Suggested change
|
||||||||||||||||||||||||||
| public WithPodConfig<CaloRemnantCombinerConfig> { | ||||||||||||||||||||||||||
| public WithPodConfig<CaloRemnantCombinerConfig> { | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| public: | ||||||||||||||||||||||||||
| CaloRemnantCombiner(std::string_view name) | ||||||||||||||||||||||||||
| : CaloRemnantCombinerAlgorithm{name, | ||||||||||||||||||||||||||
| {"CaloClusters"}, | ||||||||||||||||||||||||||
| {"NeutralParticleCandidate"}, | ||||||||||||||||||||||||||
| "make neutral candidates from remnant clusters"} {} | ||||||||||||||||||||||||||
| {"CaloClusters"}, | ||||||||||||||||||||||||||
| {"NeutralParticleCandidate"}, | ||||||||||||||||||||||||||
| "make neutral candidates from remnant clusters"} {} | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| void init() final {}; | ||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since you're not overwriting this method, I'd suggest dropping it from here!
Suggested change
|
||||||||||||||||||||||||||
| void process(const Input&, const Output&) const final; | ||||||||||||||||||||||||||
| static std::size_t findSeedCluster_index(const edm4eic::ClusterCollection& clusters, std::vector<bool>& visits); | ||||||||||||||||||||||||||
| static std::set<std::size_t> getcluster_indices_for_merging(const edm4eic::ClusterCollection& clusters, std::vector<bool>& visits, std::size_t seed_cluster_index, double delta_r, const edm4eic::ClusterCollection& seed); | ||||||||||||||||||||||||||
| static std::size_t findSeedCluster_index(const edm4eic::ClusterCollection& clusters, | ||||||||||||||||||||||||||
| std::vector<bool>& visits); | ||||||||||||||||||||||||||
| static std::set<std::size_t> | ||||||||||||||||||||||||||
| getcluster_indices_for_merging(const edm4eic::ClusterCollection& clusters, | ||||||||||||||||||||||||||
| std::vector<bool>& visits, std::size_t seed_cluster_index, | ||||||||||||||||||||||||||
| double delta_r, const edm4eic::ClusterCollection& seed); | ||||||||||||||||||||||||||
|
Comment on lines
+33
to
+38
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd suggest flagging these as
Suggested change
|
||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||
| } // namespace eicrecon | ||||||||||||||||||||||||||
| } // namespace eicrecon | ||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Definitely want a docstring here! This is a good place for a high-level summary of what the algorithm is doing!