File indexing completed on 2025-09-13 08:17:05
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #pragma once
0012
0013 #include <algorithms/algorithm.h>
0014 #include <edm4eic/ClusterCollection.h>
0015 #include <edm4hep/CaloHitContribution.h>
0016 #include <edm4hep/MCParticle.h>
0017 #include <edm4eic/MCRecoCalorimeterHitAssociationCollection.h>
0018 #include <edm4eic/MCRecoClusterParticleAssociationCollection.h>
0019 #include <edm4eic/ProtoClusterCollection.h>
0020 #include <algorithm>
0021 #include <cmath>
0022 #include <functional>
0023 #include <map>
0024 #include <memory>
0025 #include <optional>
0026 #include <string>
0027 #include <string_view>
0028 #include <utility>
0029
0030 #include "CalorimeterClusterRecoCoGConfig.h"
0031 #include "algorithms/interfaces/WithPodConfig.h"
0032
0033 static double constWeight(double , double , double , int ) { return 1.0; }
0034 static double linearWeight(double E, double , double , int ) { return E; }
0035 static double logWeight(double E, double tE, double base, int ) {
0036 return std::max(0., base + std::log(E / tE));
0037 }
0038
0039 static const std::map<std::string, std::function<double(double, double, double, int)>>
0040 weightMethods = {
0041 {"none", constWeight},
0042 {"linear", linearWeight},
0043 {"log", logWeight},
0044 };
0045
0046 namespace eicrecon {
0047
0048 using ClustersWithAssociations =
0049 std::pair<std::unique_ptr<edm4eic::ClusterCollection>,
0050 std::unique_ptr<edm4eic::MCRecoClusterParticleAssociationCollection>>;
0051
0052 using CalorimeterClusterRecoCoGAlgorithm = algorithms::Algorithm<
0053 algorithms::Input<edm4eic::ProtoClusterCollection,
0054 std::optional<edm4eic::MCRecoCalorimeterHitAssociationCollection>>,
0055 algorithms::Output<edm4eic::ClusterCollection,
0056 std::optional<edm4eic::MCRecoClusterParticleAssociationCollection>>>;
0057
0058 class CalorimeterClusterRecoCoG : public CalorimeterClusterRecoCoGAlgorithm,
0059 public WithPodConfig<CalorimeterClusterRecoCoGConfig> {
0060
0061 public:
0062 CalorimeterClusterRecoCoG(std::string_view name)
0063 : CalorimeterClusterRecoCoGAlgorithm{
0064 name,
0065 {"inputProtoClusterCollection", "mcRawHitAssocations"},
0066 {"outputClusterCollection", "outputAssociations"},
0067 "Reconstruct a cluster with the Center of Gravity method. For "
0068 "simulation results it optionally creates a Cluster <-> MCParticle "
0069 "association provided both optional arguments are provided."} {}
0070
0071 public:
0072 void init() final;
0073
0074 void process(const Input&, const Output&) const final;
0075
0076 private:
0077 std::function<double(double, double, double, int)> weightFunc;
0078
0079 private:
0080 std::optional<edm4eic::MutableCluster> reconstruct(const edm4eic::ProtoCluster& pcl) const;
0081 void associate(const edm4eic::Cluster& cl,
0082 const edm4eic::MCRecoCalorimeterHitAssociationCollection* mchitassociations,
0083 edm4eic::MCRecoClusterParticleAssociationCollection* assocs) const;
0084 static edm4hep::MCParticle get_primary(const edm4hep::CaloHitContribution& contrib);
0085 };
0086
0087 }