13#include <algorithms/algorithm.h>
14#include <edm4eic/ClusterCollection.h>
15#include <edm4eic/EDM4eicVersion.h>
16#include <edm4hep/CaloHitContribution.h>
17#include <edm4hep/MCParticle.h>
18#include <edm4eic/MCRecoCalorimeterHitAssociationCollection.h>
19#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
20#include <edm4eic/MCRecoCalorimeterHitLinkCollection.h>
21#include <podio/LinkNavigator.h>
23#include <edm4eic/MCRecoClusterParticleAssociationCollection.h>
24#include <edm4eic/ProtoClusterCollection.h>
38#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
39#include <edm4eic/MCRecoClusterParticleLinkCollection.h>
42static double constWeight(
double ,
double ,
double ,
int ) {
return 1.0; }
43static double linearWeight(
double E,
double ,
double ,
int ) {
return E; }
44static double logWeight(
double E,
double tE,
double base,
int ) {
45 return std::max(0., base + std::log(E / tE));
48static const std::map<std::string, std::function<double(
double,
double,
double,
int)>>
50 {
"none", constWeight},
51 {
"linear", linearWeight},
58 std::pair<std::unique_ptr<edm4eic::ClusterCollection>,
59 std::unique_ptr<edm4eic::MCRecoClusterParticleAssociationCollection>>;
62 algorithms::Input<edm4eic::ProtoClusterCollection,
63#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
64 std::optional<edm4eic::MCRecoCalorimeterHitLinkCollection>,
66 std::optional<edm4eic::MCRecoCalorimeterHitAssociationCollection>>,
67 algorithms::Output<edm4eic::ClusterCollection,
68#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
69 std::optional<edm4eic::MCRecoClusterParticleLinkCollection>,
71 std::optional<edm4eic::MCRecoClusterParticleAssociationCollection>>>;
80 {
"inputProtoClusterCollection",
81#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
84 "mcRawHitAssocations"},
85 {
"outputClusterCollection",
86#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
89 "outputAssociations"},
90 "Reconstruct a cluster with the Center of Gravity method. For "
91 "simulation results it optionally creates a Cluster <-> MCParticle "
92 "association provided both optional arguments are provided."} {
98 void process(const Input&, const Output&) const final;
101 std::function<
double(
double,
double,
double,
int)> weightFunc;
104 std::optional<edm4eic::MutableCluster> reconstruct(const edm4eic::ProtoCluster& pcl) const;
105 void associate(const edm4eic::Cluster& cl,
106 const edm4eic::MCRecoCalorimeterHitAssociationCollection* mchitassociations,
107#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
108 const podio::LinkNavigator<edm4eic::MCRecoCalorimeterHitLinkCollection>& link_nav,
109 edm4eic::MCRecoClusterParticleLinkCollection* links,
111 edm4eic::MCRecoClusterParticleAssociationCollection* assocs)
const;
112 static edm4hep::MCParticle get_primary(
const edm4hep::CaloHitContribution& contrib);
Definition CalorimeterClusterRecoCoG.h:74
CalorimeterClusterRecoCoG(std::string_view name)
Definition CalorimeterClusterRecoCoG.h:77
Definition WithPodConfig.h:22
E
Definition TwoElectronsTopCAL.py:10
-client
Definition CalorimeterClusterRecoCoG.cc:37
std::pair< std::unique_ptr< edm4eic::ClusterCollection >, std::unique_ptr< edm4eic::MCRecoClusterParticleAssociationCollection > > ClustersWithAssociations
Definition CalorimeterClusterRecoCoG.h:59
algorithms::Algorithm< algorithms::Input< edm4eic::ProtoClusterCollection, std::optional< edm4eic::MCRecoCalorimeterHitLinkCollection >, std::optional< edm4eic::MCRecoCalorimeterHitAssociationCollection > >, algorithms::Output< edm4eic::ClusterCollection, std::optional< edm4eic::MCRecoClusterParticleLinkCollection >, std::optional< edm4eic::MCRecoClusterParticleAssociationCollection > > > CalorimeterClusterRecoCoGAlgorithm
Definition CalorimeterClusterRecoCoG.h:71
Definition SimCalorimeterHitProcessor.cc:35