16#include <unordered_map>
20std::vector<std::pair<int, double> > makeSortedTruthPairs(
21 const std::unordered_map<int, double>& truthMap,
22 unsigned int maxTruthParticles)
24 std::vector<std::pair<int, double> > truthPairs;
25 truthPairs.reserve(truthMap.size());
26 for (
const auto& [pid, energy] : truthMap) {
27 truthPairs.emplace_back(pid, energy);
32 [](
const auto&
a,
const auto& b) { return a.second > b.second; });
33 if (truthPairs.size() > maxTruthParticles) {
34 truthPairs.resize(maxTruthParticles);
42 const std::string&
type,
43 const std::string& name,
44 const IInterface* parent)
47 declareInterface<CaloClusterCollectionProcessor>(
this);
49 for (
int im = 0; im < 3; ++im) {
71 return StatusCode::SUCCESS;
75 const EventContext& ctx,
79 std::vector<std::pair<int, double> > >
80 caloClusterWriteDecorHandleNLeadingTruthParticlesDM(
83 bool foundAllContainers(
true);
84 std::vector<const CaloCalibrationHitContainer*> v_cchc;
85 std::vector<const CaloCalibrationHitContainer*> v_dmcchc;
92 ATH_MSG_ERROR(
"SG does not contain calibration hit container " << key.key());
94 foundAllContainers =
false;
97 v_cchc.push_back(cchc.
cptr());
106 ATH_MSG_ERROR(
"SG does not contain DM calibration hit container " << key.key());
108 foundAllContainers =
false;
111 v_dmcchc.push_back(dmcchc.
cptr());
119 if (!foundAllContainers) {
120 return StatusCode::SUCCESS;
128 unsigned int nHitsTotal = 0;
129 unsigned int nHitsWithoutParticleUID = 0;
136 nHitsWithoutParticleUID,
139 ATH_MSG_ERROR(
"Invalid uniqueID detected - this sample cannot be properly analysed.");
144 ATH_MSG_INFO(
"Calibration hits do not have ParticleUID, ids of particle-caused hits are always 0. Continuing without ParticleID machinery.");
145 useParticleID =
false;
148 std::array<ClusList, 3> clusLists;
149 const std::array<bool, 3> doClusterLists{{
154 for (
unsigned int ii = 0; ii < 3; ++ii) {
155 if (doClusterLists[ii]) {
160 std::array<ClusList*, 3> clusListPtrs{{&clusLists[0], &clusLists[1], &clusLists[2]}};
172 const ClusList* pClusList =
nullptr;
174 pClusList = &clusLists[0];
177 pClusList = &clusLists[1];
180 pClusList = &clusLists[2];
183 std::vector<std::unordered_map<int, double> > engCalibDeadByTruth(theClusColl->
size());
185 if (pClusList !=
nullptr) {
192 [&engCalibDeadByTruth](
int iClus,
int uniqueID,
int ,
double energy) {
193 engCalibDeadByTruth[iClus][uniqueID] += energy;
199 for (std::size_t iClus = 0; iClus < clusInfoVec.size(); ++iClus) {
200 const auto& particleMap = clusInfoVec[iClus].engCalibParticle;
201 for (
const auto& [uniqueID, calibEnergy] : particleMap) {
202 const double inClusterDeadEnergy =
203 calibEnergy.engSmp[CaloSampling::PreSamplerB]
204 + calibEnergy.engSmp[CaloSampling::PreSamplerE]
205 + calibEnergy.engSmp[CaloSampling::TileGap3];
206 if (inClusterDeadEnergy != 0.0) {
207 engCalibDeadByTruth[iClus][uniqueID] += inClusterDeadEnergy;
215 const std::unordered_map<int, double>& truthMap = engCalibDeadByTruth[clusIdx];
216 if (!truthMap.empty()) {
217 caloClusterWriteDecorHandleNLeadingTruthParticlesDM(*thisCaloCluster) =
222 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
Handle class for reading from StoreGate.
Handle class for adding a decoration to an object.
const ServiceHandle< StoreGateSvc > & detStore() const
static void initializeOutOfClusterDistanceTables(int n_phi_out, int n_eta_out, double out_phi_max, double out_eta_max, const double(&rmaxOut)[3], std::array< std::vector< std::vector< CalibHitIPhiIEtaRange > >, 3 > &i_phi_eta)
Precompute eta/phi lookup tables for quick out-of-cluster hit association to clusters.
static void accumulateClusterCalibHits(const std::vector< const CaloCalibrationHitContainer * > &v_cchc, const CellInfoSet_t &cellInfo, const CaloCell_ID &calo_id, ClusInfo_t &clusInfoVec, unsigned int &nHitsTotal, unsigned int &nHitsWithoutParticleUID, bool useParticleID, InvalidUniqueIdHandler &&invalidUniqueIdHandler)
Accumulate calibration-hit energy inside clusters.
static void buildOutOfClusterClusterLists(const xAOD::CaloClusterContainer &theClusColl, const ClusInfo_t &clusInfoVec, int n_phi_out, int n_eta_out, double out_phi_max, double out_eta_max, const std::array< std::vector< std::vector< CalibHitIPhiIEtaRange > >, 3 > &i_phi_eta, const std::array< bool, 3 > &doOutOfCluster, const std::array< ClusList *, 3 > &clusLists)
Build lookup lists of clusters for out-of-cluster energy sharing.
static void buildCellInfoMap(const xAOD::CaloClusterContainer &theClusColl, CellInfoSet_t &cellInfo)
Build a map of calorimeter cells contributing to clusters.
static const CaloDmDescrManager * instance()
size_type size() const noexcept
Returns the number of elements in the collection.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.