Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
Metadata.cc
Go to the documentation of this file.
1
9#include "Managers/Metadata.h"
10
12
13#include <algorithm>
14
15namespace pandora
16{
17
18CaloHitMetadata::CaloHitMetadata(CaloHitList *const pCaloHitList, const std::string &caloHitListName, const bool initialHitAvailability) :
19 m_pCaloHitList(pCaloHitList),
20 m_caloHitListName(caloHitListName)
21{
22 for (const CaloHit *const pCaloHit : *pCaloHitList)
23 {
24 if (!m_caloHitUsageMap.insert(CaloHitUsageMap::value_type(pCaloHit, initialHitAvailability)).second)
25 throw StatusCodeException(STATUS_CODE_ALREADY_PRESENT);
26 }
27}
28
29//------------------------------------------------------------------------------------------------------------------------------------------
30
32{
33 for (const CaloHitReplacement *const pCaloHitReplacement : m_caloHitReplacementList)
34 {
35 for (const CaloHit *const pCaloHit : pCaloHitReplacement->m_newCaloHits)
36 delete pCaloHit;
37
38 delete pCaloHitReplacement;
39 }
40}
41
42//------------------------------------------------------------------------------------------------------------------------------------------
43
44template <>
45bool CaloHitMetadata::IsAvailable(const CaloHit *const pCaloHit) const
46{
47 CaloHitUsageMap::const_iterator usageMapIter = m_caloHitUsageMap.find(pCaloHit);
48
49 if ((m_caloHitUsageMap.end()) == usageMapIter || !usageMapIter->second)
50 return false;
51
52 return true;
53}
54
55template <>
56bool CaloHitMetadata::IsAvailable(const CaloHitList *const pCaloHitList) const
57{
58 for (const CaloHit *const pCaloHit : *pCaloHitList)
59 {
60 CaloHitUsageMap::const_iterator usageMapIter = m_caloHitUsageMap.find(pCaloHit);
61
62 if ((m_caloHitUsageMap.end()) == usageMapIter || !usageMapIter->second)
63 return false;
64 }
65
66 return true;
67}
68
69//------------------------------------------------------------------------------------------------------------------------------------------
70
71template <>
72StatusCode CaloHitMetadata::SetAvailability(const CaloHit *const pCaloHit, bool isAvailable)
73{
74 CaloHitUsageMap::iterator usageMapIter = m_caloHitUsageMap.find(pCaloHit);
75
76 if (m_caloHitUsageMap.end() == usageMapIter)
77 return STATUS_CODE_NOT_FOUND;
78
79 usageMapIter->second = isAvailable;
80
81 return STATUS_CODE_SUCCESS;
82}
83
84template <>
85StatusCode CaloHitMetadata::SetAvailability(const CaloHitList *const pCaloHitList, bool isAvailable)
86{
87 for (const CaloHit *const pCaloHit : *pCaloHitList)
88 {
89 CaloHitUsageMap::iterator usageMapIter = m_caloHitUsageMap.find(pCaloHit);
90
91 if (m_caloHitUsageMap.end() == usageMapIter)
92 return STATUS_CODE_NOT_FOUND;
93
94 usageMapIter->second = isAvailable;
95 }
96
97 return STATUS_CODE_SUCCESS;
98}
99
100//------------------------------------------------------------------------------------------------------------------------------------------
101
103{
104 const CaloHitReplacementList &caloHitReplacementList(caloHitMetadata.GetCaloHitReplacementList());
105
106 for (const CaloHitReplacement *const pCaloHitReplacement : caloHitReplacementList)
107 {
108 PANDORA_RETURN_RESULT_IF(STATUS_CODE_SUCCESS, !=, this->Update(*pCaloHitReplacement));
109 }
110
111 const CaloHitUsageMap &caloHitUsageMap(caloHitMetadata.GetCaloHitUsageMap());
112
113 CaloHitVector caloHitVector;
114 for (const CaloHitUsageMap::value_type &mapEntry : caloHitUsageMap) caloHitVector.push_back(mapEntry.first);
115 std::sort(caloHitVector.begin(), caloHitVector.end(), PointerLessThan<CaloHit>());
116
117 for (const CaloHit *const pCaloHit : caloHitVector)
118 {
119 CaloHitUsageMap::iterator usageMapIter = m_caloHitUsageMap.find(pCaloHit);
120
121 if (m_caloHitUsageMap.end() == usageMapIter)
122 return STATUS_CODE_FAILURE;
123
124 usageMapIter->second = caloHitUsageMap.at(pCaloHit);
125 }
126
127 return STATUS_CODE_SUCCESS;
128}
129
130//------------------------------------------------------------------------------------------------------------------------------------------
131
133{
134 for (const CaloHit *const pCaloHit : caloHitReplacement.m_newCaloHits)
135 {
136 if (m_pCaloHitList->end() != std::find(m_pCaloHitList->begin(), m_pCaloHitList->end(), pCaloHit))
137 return STATUS_CODE_ALREADY_PRESENT;
138
139 m_pCaloHitList->push_back(pCaloHit);
140
141 if (!m_caloHitUsageMap.insert(CaloHitUsageMap::value_type(pCaloHit, true)).second)
142 return STATUS_CODE_ALREADY_PRESENT;
143 }
144
145 if (m_pCaloHitList == &caloHitReplacement.m_oldCaloHits)
146 return STATUS_CODE_FAILURE;
147
148 for (const CaloHit *const pCaloHit : caloHitReplacement.m_oldCaloHits)
149 {
150 CaloHitList::iterator listIter = std::find(m_pCaloHitList->begin(), m_pCaloHitList->end(), pCaloHit);
151
152 if (m_pCaloHitList->end() == listIter)
153 return STATUS_CODE_FAILURE;
154
155 listIter = m_pCaloHitList->erase(listIter);
156
157 CaloHitUsageMap::iterator mapIter = m_caloHitUsageMap.find(pCaloHit);
158
159 if (m_caloHitUsageMap.end() == mapIter)
160 return STATUS_CODE_FAILURE;
161
162 mapIter = m_caloHitUsageMap.erase(mapIter);
163 }
164
165 m_caloHitReplacementList.push_back(new CaloHitReplacement(caloHitReplacement));
166
167 return STATUS_CODE_SUCCESS;
168}
169
170//------------------------------------------------------------------------------------------------------------------------------------------
171
173{
174 for (const CaloHitReplacement *const pCaloHitReplacement : m_caloHitReplacementList)
175 delete pCaloHitReplacement;
176
177 m_pCaloHitList = nullptr;
178 m_caloHitListName.clear();
179 m_caloHitUsageMap.clear();
181}
182
183//------------------------------------------------------------------------------------------------------------------------------------------
184//------------------------------------------------------------------------------------------------------------------------------------------
185
187 m_pCurrentCaloHitMetadata(nullptr),
188 m_caloHitList(*pCaloHitList)
189{
190 if (m_caloHitList.empty())
191 throw StatusCodeException(STATUS_CODE_NOT_INITIALIZED);
192}
193
194//------------------------------------------------------------------------------------------------------------------------------------------
195
197{
198 for (const NameToMetadataMap::value_type &mapEntry : m_nameToMetadataMap)
199 delete mapEntry.second;
200}
201
202//------------------------------------------------------------------------------------------------------------------------------------------
203
204StatusCode ReclusterMetadata::CreateCaloHitMetadata(CaloHitList *const pCaloHitList, const std::string &caloHitListName,
205 const std::string &reclusterListName, const bool initialHitAvailability)
206{
207 m_pCurrentCaloHitMetadata = new CaloHitMetadata(pCaloHitList, caloHitListName, initialHitAvailability);
208
209 if (!m_nameToMetadataMap.insert(NameToMetadataMap::value_type(reclusterListName, m_pCurrentCaloHitMetadata)).second)
210 {
212 return STATUS_CODE_ALREADY_PRESENT;
213 }
214
215 return STATUS_CODE_SUCCESS;
216}
217
218//------------------------------------------------------------------------------------------------------------------------------------------
219
220StatusCode ReclusterMetadata::ExtractCaloHitMetadata(const std::string &reclusterListName, CaloHitMetadata *&pCaloHitMetaData)
221{
222 NameToMetadataMap::iterator iter = m_nameToMetadataMap.find(reclusterListName);
223
224 if (m_nameToMetadataMap.end() == iter)
225 return STATUS_CODE_FAILURE;
226
227 pCaloHitMetaData = iter->second;
228 iter = m_nameToMetadataMap.erase(iter);
229
230 return STATUS_CODE_SUCCESS;
231}
232
233} // namespace pandora
Header file for metadata classes.
Header file defining relevant internal typedefs, sort and string conversion functions.
#define PANDORA_RETURN_RESULT_IF(StatusCode1, Operator, Command)
Definition StatusCodes.h:19
CaloHit class.
Definition CaloHit.h:26
CaloHitMetadata class.
Definition Metadata.h:39
bool IsAvailable(const T *const pT) const
Is a calo hit, or a list of calo hits, available to add to a cluster.
CaloHitMetadata(CaloHitList *const pCaloHitList, const std::string &caloHitListName, const bool initialHitAvailability)
Constructor.
Definition Metadata.cc:18
~CaloHitMetadata()
Destructor.
Definition Metadata.cc:31
CaloHitUsageMap m_caloHitUsageMap
The calo hit usage map.
Definition Metadata.h:110
const CaloHitUsageMap & GetCaloHitUsageMap() const
Get the calo hit usage map.
Definition Metadata.h:181
StatusCode Update(const CaloHitMetadata &caloHitMetadata)
Update metadata to account for changes by daughter recluster processes.
Definition Metadata.cc:102
void Clear()
Clear all metadata content.
Definition Metadata.cc:172
CaloHitReplacementList m_caloHitReplacementList
The calo hit replacement list.
Definition Metadata.h:111
std::string m_caloHitListName
The name of the associated calo hit list.
Definition Metadata.h:109
CaloHitList * m_pCaloHitList
Address of the associated calo hit list.
Definition Metadata.h:108
const CaloHitReplacementList & GetCaloHitReplacementList() const
Get the calo hit replacement list.
Definition Metadata.h:188
StatusCode SetAvailability(const T *const pT, bool isAvailable)
Set availability of a calo hit, or a list of calo hits, to be added to a cluster.
Enable ordering of pointers based on properties of target objects.
StatusCode CreateCaloHitMetadata(CaloHitList *const pCaloHitList, const std::string &caloHitListName, const std::string &reclusterListName, const bool initialHitAvailability)
Create new calo hit metadata, associated with a new reclustering option for the calo hits.
Definition Metadata.cc:204
~ReclusterMetadata()
Destructor.
Definition Metadata.cc:196
StatusCode ExtractCaloHitMetadata(const std::string &reclusterListName, CaloHitMetadata *&pCaloHitMetaData)
Extract specific calo hit metadata, removing entry from map and receiving a pointer to the metadata.
Definition Metadata.cc:220
ReclusterMetadata(CaloHitList *const pCaloHitList)
Constructor.
Definition Metadata.cc:186
CaloHitMetadata * m_pCurrentCaloHitMetadata
Address of the current calo hit metadata.
Definition Metadata.h:171
CaloHitList m_caloHitList
Copy of the reclustering input calo hit list.
Definition Metadata.h:172
NameToMetadataMap m_nameToMetadataMap
The recluster list name to metadata map.
Definition Metadata.h:173
StatusCodeException class.
std::vector< const CaloHit * > CaloHitVector
std::unordered_map< const CaloHit *, bool > CaloHitUsageMap
Definition Metadata.h:30
std::vector< CaloHitReplacement * > CaloHitReplacementList
Definition Metadata.h:29
CaloHitList m_oldCaloHits
The list of old calo hits, to be replaced.
Definition Metadata.h:25
CaloHitList m_newCaloHits
The list new calo hits, to act as replacements.
Definition Metadata.h:26
MANAGED_CONTAINER< const CaloHit * > CaloHitList
StatusCode
The StatusCode enum.
CaloHitReplacement class.
Definition Metadata.h:23