EICrecon
JANA based reconstruction for the EPIC detector
Loading...
Searching...
No Matches
CalorimeterClusterRecoCoG.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-3.0-or-later
2// Copyright (C) 2022 Sylvester Joosten, Chao, Chao Peng, Whitney Armstrong
3
4/*
5 * Reconstruct the cluster with Center of Gravity method
6 * Logarithmic weighting is used for mimicking energy deposit in transverse direction
7 *
8 * Author: Chao Peng (ANL), 09/27/2020
9 */
10
11#pragma once
12
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>
22#endif
23#include <edm4eic/MCRecoClusterParticleAssociationCollection.h>
24#include <edm4eic/ProtoClusterCollection.h>
25#include <algorithm>
26#include <cmath>
27#include <functional>
28#include <map>
29#include <memory>
30#include <optional>
31#include <string>
32#include <string_view>
33#include <utility>
34
37
38#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
39#include <edm4eic/MCRecoClusterParticleLinkCollection.h>
40#endif
41
42static double constWeight(double /*E*/, double /*tE*/, double /*p*/, int /*type*/) { return 1.0; }
43static double linearWeight(double E, double /*tE*/, double /*p*/, int /*type*/) { return E; }
44static double logWeight(double E, double tE, double base, int /*type*/) {
45 return std::max(0., base + std::log(E / tE));
46}
47
48static const std::map<std::string, std::function<double(double, double, double, int)>>
49 weightMethods = {
50 {"none", constWeight},
51 {"linear", linearWeight},
52 {"log", logWeight},
53};
54
55namespace eicrecon {
56
58 std::pair<std::unique_ptr<edm4eic::ClusterCollection>,
59 std::unique_ptr<edm4eic::MCRecoClusterParticleAssociationCollection>>;
60
61using CalorimeterClusterRecoCoGAlgorithm = algorithms::Algorithm<
62 algorithms::Input<edm4eic::ProtoClusterCollection,
63#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
64 std::optional<edm4eic::MCRecoCalorimeterHitLinkCollection>,
65#endif
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>,
70#endif
71 std::optional<edm4eic::MCRecoClusterParticleAssociationCollection>>>;
72
74 public WithPodConfig<CalorimeterClusterRecoCoGConfig> {
75
76public:
77 CalorimeterClusterRecoCoG(std::string_view name)
79 name,
80 {"inputProtoClusterCollection",
81#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
82 "mcRawHitLinks",
83#endif
84 "mcRawHitAssocations"},
85 {"outputClusterCollection",
86#if EDM4EIC_BUILD_VERSION >= EDM4EIC_VERSION(8, 7, 0)
87 "outputLinks",
88#endif
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."} {
93 }
94
95public:
96 void init() final;
97
98 void process(const Input&, const Output&) const final;
99
100private:
101 std::function<double(double, double, double, int)> weightFunc;
102
103private:
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,
110#endif
111 edm4eic::MCRecoClusterParticleAssociationCollection* assocs) const;
112 static edm4hep::MCParticle get_primary(const edm4hep::CaloHitContribution& contrib);
113};
114
115} // namespace eicrecon
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