5#ifndef CALOCALIBHITREC_CALOCALIBCLUSTERDECORATORTOOLDM_H
6#define CALOCALIBHITREC_CALOCALIBCLUSTERDECORATORTOOLDM_H
11#include "GaudiKernel/ToolHandle.h"
18#include "CLHEP/Units/SystemOfUnits.h"
48 const std::string& name,
49 const IInterface* parent);
52 virtual StatusCode
execute(
const EventContext& ctx,
62 "CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesDM",
63 "CaloTopoClustersNew.calclus_NLeadingTruthParticleBarcodeEnergyPairs_DM",
64 "Dead-material truth-particle barcode/energy decoration"};
70 "Number of truth particles per CaloCluster/PFO for which to store dead-material calibration-hit energy"};
74 "CalibrationHitContainerNames",
76 "Calibration-hit containers inside the calorimeter volume"};
80 "DMCalibrationHitContainerNames",
82 "Dead-material calibration-hit containers"};
92 std::array<std::vector<std::vector<CalibHitIPhiIEtaRange> >, 3>
m_i_phi_eta;
98 "Dead-material matching type: 0=off, 1=loose, 2=medium, 3=tight"};
104 "Use calibration-hit particle uniqueID for dead-material truth attribution"};
110 "Minimum cluster energy used in dead-material sharing"};
116 "Minimum in-cluster calibration energy used in dead-material sharing"};
122 "Power-law exponent for dead-material sharing effective energy"};
128 "Distance scale for dead-material sharing effective energy"};
130 template <
class AddDeadMaterialEnergy>
132 const std::vector<const CaloCalibrationHitContainer*>& v_dmcchc,
137 AddDeadMaterialEnergy&& addDeadMaterialEnergy)
const
175 std::vector<int> hitClusIndex;
176 std::vector<double> hitClusEffEnergy;
177 hitClusIndex.reserve(theClusColl.
size());
178 hitClusEffEnergy.reserve(theClusColl.
size());
179 double hitClusNorm = 0.0;
181 const std::vector<int>& matchingClusters =
184 for (
int iClus : matchingClusters) {
186 const auto& clusInfo = clusInfoVec[iClus];
187 auto pos = clusInfo.engCalibParticle.find(uniqueID);
188 if (pos == clusInfo.engCalibParticle.end()) {
192 const double engClusTruthUniqueIDCalib = pos->second.engTot;
193 if (engClusTruthUniqueIDCalib <= m_energyMinCalib || theCluster->e() <=
m_energyMin) {
197 double sum_smp_energy = 0.0;
203 sum_smp_energy += pos->second.engSmp[nsmp];
206 if (sum_smp_energy <= 0.0) {
210 double phi_diff = myCDDE->
phi() - theCluster->
phi();
211 if (phi_diff <= -
M_PI) {
212 phi_diff += 2. *
M_PI;
214 else if (phi_diff >
M_PI) {
215 phi_diff -= 2. *
M_PI;
217 const double eta_diff = myCDDE->
eta() - theCluster->
eta();
218 const float distance = std::sqrt(eta_diff * eta_diff + phi_diff * phi_diff);
219 const double effEner = std::pow(sum_smp_energy,
m_apars_alpha.value()) * std::exp(-distance /
m_apars_r0.value());
221 hitClusIndex.push_back(iClus);
222 hitClusEffEnergy.push_back(effEner);
223 hitClusNorm += effEner;
226 if (hitClusNorm <= 0.0) {
230 const double inv_hitClusNorm = 1.0 / hitClusNorm;
231 for (std::size_t i = 0; i < hitClusIndex.size(); ++i) {
232 const int iClus = hitClusIndex[i];
233 const double dm_weight = hitClusEffEnergy[i] * inv_hitClusNorm;
234 addDeadMaterialEnergy(iClus, uniqueID, nDmArea, hit->energyTotal() * dm_weight);
Base class for cluster processing tools called from CaloClusterMaker.
Property holding a SG store/key/clid/attr name from which a WriteDecorHandle is made.
std::vector< MyClusInfo > ClusInfo_t
std::map< Identifier, MyCellInfo > CellInfoSet_t
std::vector< std::vector< int > > ClusList
Class to store calorimeter calibration hit.
Helper class for offline cell identifiers.
virtual StatusCode execute(const EventContext &ctx, xAOD::CaloClusterContainer *collection) const =0
Execute on an entire collection of clusters.
std::vector< short > m_CaloSampleNeighbours
std::vector< float > m_CaloSampleEtaMin
std::vector< float > m_CaloSampleEtaMax
const T * at(size_type n) const
Access an element, as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
Property holding a SG store/key/clid/attr name from which a WriteDecorHandle is made.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
constexpr int UNDEFINED_ID
HandleKeyArray< ReadHandle< T >, ReadHandleKey< T >, Gaudi::DataHandle::Reader > ReadHandleKeyArray
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.