ATLAS Offline Software
Loading...
Searching...
No Matches
CaloClusterContainerCnv_p6.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
8
15
16
17namespace {
18
19inline
20bool testbit (unsigned int x, unsigned int i)
21{
22 return (x & (1U << i)) != 0;
23}
24
25} // anonymous namespace
26
27
30 MsgStream &log) const
31{
32 if (log.level() <= MSG::DEBUG) log<< MSG::DEBUG << "Reading CaloClusterContainerCnv_p6" << endmsg;
33
34 // reset element link converters, and provide container name lookup table
35 ShowerLinkState showerLinkState (pers->m_linkNames);
36 CellLinkState cellLinkState (pers->m_linkNames);
37
38 // Use data pool for clusters to avoid calling constructor for each event
39 DataPool<CaloCluster> clusters;
40
41 trans->clear (SG::VIEW_ELEMENTS);
42 trans->reserve(pers->m_vec.size());
43
46
47 std::vector<float> temp_Moments;
49 A.expandToFloat( pers->m_momentContainer.m_Mvalue, temp_Moments); // unpacks moments
50
51 std::vector<float>::const_iterator i_mom = temp_Moments.begin();
52 std::vector<float>::const_iterator i_mom_e = temp_Moments.end();
53
54 const std::vector<unsigned short>& keys = pers->m_momentContainer.m_Mkey;
55 unsigned int nkeys = keys.size();
56
57 unsigned int c1=0;
58
59 std::vector<float> tmp_badChannelEta;
60 std::vector<float> tmp_badChannelPhi;
61 Compressor B;
62 B.expandToFloat(pers->m_badEtaList,tmp_badChannelEta);
63 B.expandToFloat(pers->m_badPhiList,tmp_badChannelPhi);
64
65// raw 4-momentum state
66 std::vector<float> tmp_rawE;
67 std::vector<float> tmp_rawEtaPhiM;
69 C.expandToFloat(pers->m_rawE,tmp_rawE);
70 std::vector<float>::const_iterator iraw1 = tmp_rawE.begin();
71 std::vector<float>::const_iterator iraw2 = tmp_rawE.end();
72
73 Compressor D;
74 D.expandToFloat(pers->m_rawEtaPhiM,tmp_rawEtaPhiM);
75 std::vector<float>::const_iterator iraw3 = tmp_rawEtaPhiM.begin();
76 std::vector<float>::const_iterator iraw4 = tmp_rawEtaPhiM.end();
77
78// alternative calibration 4-momentum state
79 std::vector<float> tmp_altE;
80 std::vector<float> tmp_altEtaPhiM;
81 Compressor E;
82 E.expandToFloat(pers->m_altE,tmp_altE);
83 std::vector<float>::const_iterator ialt1 = tmp_altE.begin();
84 std::vector<float>::const_iterator ialt2 = tmp_altE.end();
86 F.expandToFloat(pers->m_altEtaPhiM,tmp_altEtaPhiM);
87 std::vector<float>::const_iterator ialt3 = tmp_altEtaPhiM.begin();
88 std::vector<float>::const_iterator ialt4 = tmp_altEtaPhiM.end();
89
90
91 std::vector<short>::const_iterator ibad1 = pers->m_badClusIndexList.begin();
92 std::vector<short>::const_iterator ibad2 = pers->m_badClusIndexList.end();
93 int nbad=0;
94
95 bool mom_overrun_err = false;
96 bool store_overrun_err = false;
97 bool raw_overrun_err = false;
98 size_t dataStore_size = pers->m_dataStore.size();
99
100 bool fillBad=true;
101 if (tmp_badChannelEta.size() != pers->m_badClusIndexList.size() ||
102 tmp_badChannelPhi.size() != pers->m_badClusIndexList.size() ||
103 pers->m_badLayerStatusList.size() != pers->m_badClusIndexList.size()) {
104 log << MSG::WARNING << " problem to decode bad channel information, not filled..." << endmsg;
105 fillBad=false;
106 }
107
108 short index=0;
109 for(;itp!=itp_e;++itp) {
110 index++;
111
112 CaloCluster* transCluster = clusters.nextElementPtr();// Get next ptr for next cluster
113 persToTrans(&(*itp),transCluster,
114 showerLinkState,
115 cellLinkState,
116 log); //Convert Cluster-quantities
117
118 CaloSamplingData *trDS =&(transCluster->m_dataStore);
119
121 int nVar=trDS->getNumberOfVariableTypes();
122 int nSamplings=trDS->getNumberOfSamplings();
123
126
127 for (int i=0;i<nVar;++i) {// here loops to read them in ...
128 if (testbit (trDS->m_varTypePattern, i)) {
129
130 // can be optimized: no decoding for each variable.
131 for (int j=0;j<nSamplings; ++j){
132
133 if ( testbit(transCluster->m_samplingPattern, j) ){
134 float val;
135 if (c1 < dataStore_size)
136 val = pers->m_dataStore[c1++];
137 else {
138 val = 0;
139 if (!store_overrun_err) {
140 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
141 "CaloClusterContainerCnv_p6")
142 << "Corrupted data: data store array overrun "
143 << pers->m_vec.size() << " clusters "
144 << nkeys << " moment keys "
145 << temp_Moments.size() << " total moments.";
146 store_overrun_err = true;
147 }
148 }
149 trDS->storeData(static_cast<vartype>(i),
150 static_cast<samptype>(j),
151 val);
152 }
153 else{
154
155 trDS->removeVariable(static_cast<vartype>(i),
156 static_cast<samptype>(j));
157 //std::cout<<"a:0"<<"\t";
158 }
159 }
160 // std::cout<<std::endl;
161 }
162 else
163 trDS->removeVariable(static_cast<vartype>(i));
164 }
165
166 transCluster->m_barrel= (bool)(0x001ff00f & transCluster->m_samplingPattern);
167 transCluster->m_endcap= (bool)(0x00e00ff0 & transCluster->m_samplingPattern);
168 // std::cout<<" <<< Read"<<std::endl;
169
170
171 //Convert moment store
173 for (unsigned short i=0;i<nkeys;++i) {
174 float val;
175 if (i_mom == i_mom_e) {
176 val = 0;
177 if (!mom_overrun_err) {
178 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
179 "CaloClusterContainerCnv_p6")
180 << "Corrupted data: moment array overrun "
181 << pers->m_vec.size() << " clusters "
182 << nkeys << " moment keys "
183 << temp_Moments.size() << " total moments.";
184 mom_overrun_err = true;
185 }
186 }
187 else {
188 val = *i_mom;
189 ++i_mom;
190 }
191 transStore.insert (transStore.end(), CaloClusterMomentStore::moment_store::value_type( keys[i], val ) );
192 }
193 transCluster->m_momentStore.setMomentStore (std::move (transStore));
194
195 // fill bad channel information
196 transCluster->resetBadChannel();
197 if (fillBad){
198 while (ibad1 != ibad2 && (*ibad1) ==index) {
199 float eta = tmp_badChannelEta[nbad] + transCluster->eta();
200 float phi = CaloPhiRange::fix(tmp_badChannelPhi[nbad] + transCluster->phi());
201 short status=pers->m_badLayerStatusList[nbad];
202 CaloSampling::CaloSample layer = (CaloSampling::CaloSample) (status & 0xff);
203 CaloBadChannel flag = CaloBadChannel( ((status>>8) & 0xff) );
205 // std::cout << " add bad channel data " << transCluster << " " << eta << " " << phi << " " << layer << " " << status << " " << flag.packedData() << std::endl;
206 transCluster->addBadChannel(data);
207 ++ibad1;
208 ++nbad;
209 }
210 }
211
212// fill raw E,eta,phi,M
213 if (iraw1 != iraw2) {
214 if (std::fabs(transCluster->e())>0.1) {
215 transCluster->m_rawE = (*iraw1) * transCluster->e();
216 }
217 else
218 transCluster->m_rawE = (*iraw1);
219 ++iraw1;
220 }
221 if (iraw3 != iraw4) {
222 transCluster->m_rawEta = (*iraw3) + transCluster->eta();
223 ++iraw3;
224 }
225 if (iraw3 != iraw4) {
226 transCluster->m_rawPhi = CaloPhiRange::fix((*iraw3)+transCluster->phi());
227 ++iraw3;
228 }
229 if (iraw3 == iraw4 && !raw_overrun_err) {
230 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
231 "CaloClusterContainerCnv_p6")
232 << "Corrupted data: raw array overrun "
233 << pers->m_vec.size() << " clusters "
234 << tmp_rawE.size() << " raw values.";
235 raw_overrun_err = true;
236 }
237 if (iraw3 != iraw4) {
238 transCluster->m_rawM = (*iraw3);
239 ++iraw3;
240 }
241 //std::cout << " perstotrans rawE/eta/phi/M " << transCluster->m_rawE << " " << transCluster->m_rawEta << " " <<
242 // transCluster->m_rawPhi << " " << transCluster->m_rawM << std::endl;
243
244// fill alt calibrated E,eta,phi,M
245 if (ialt1 != ialt2) {
246 if (std::fabs(transCluster->e())>0.1) {
247 transCluster->m_altE = (*ialt1) * transCluster->e();
248 }
249 else
250 transCluster->m_altE = (*ialt1);
251 ++ialt1;
252 }
253 if (ialt3 != ialt4) {
254 transCluster->m_altEta = (*ialt3) + transCluster->eta();
255 ++ialt3;
256 }
257 if (ialt3 != ialt4) {
258 transCluster->m_altPhi = CaloPhiRange::fix((*ialt3)+transCluster->phi());
259 ++ialt3;
260 }
261 if (ialt3 == ialt4 && !raw_overrun_err) {
262 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
263 "CaloClusterContainerCnv_p6")
264 << "Corrupted data: raw array overrun "
265 << pers->m_vec.size() << " clusters "
266 << tmp_altE.size() << " alt values.";
267 raw_overrun_err = true;
268 }
269 if (ialt3 != ialt4) {
270 transCluster->m_altM = (*ialt3);
271 ++ialt3;
272 }
273 //std::cout << " perstotrans altE/eta/phi/M " << transCluster->m_altE << " " << transCluster->m_altEta << " " <<
274 // transCluster->m_altPhi << " " << transCluster->m_altM << std::endl;
275
276
277 trans->push_back(transCluster);
278 }
279
280 if (i_mom != i_mom_e && !mom_overrun_err) {
281 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
282 "CaloClusterContainerCnv_p6")
283 << "Corrupted data: not all moments read "
284 << pers->m_vec.size() << " clusters "
285 << nkeys << " moment keys "
286 << temp_Moments.size() << " total moments "
287 << i_mom-temp_Moments.begin() << " read.";
288 }
289
290 if (c1 != dataStore_size && !store_overrun_err) {
291 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
292 "CaloClusterContainerCnv_p6")
293 << "Corrupted data: not all data store members read "
294 << dataStore_size << " elements "
295 << c1 << " read.";
296 }
297
298 if (iraw1 != iraw2 && !raw_overrun_err) {
299 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
300 "CaloClusterContainerCnv_p6")
301 << "Corrupted data: not all raw values read "
302 << pers->m_vec.size() << " clusters "
303 << tmp_rawE.size() << " raw values "
304 << iraw1-tmp_rawE.begin() << " read.";
305 }
306
307 if (iraw3 != iraw4 && !raw_overrun_err) {
308 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
309 "CaloClusterContainerCnv_p6")
310 << "Corrupted data: not all raw values read "
311 << pers->m_vec.size() << " clusters "
312 << tmp_rawEtaPhiM.size() << " raw values "
313 << iraw3-tmp_rawEtaPhiM.begin() << " read.";
314 }
315
316 if (ialt1 != ialt2 && !raw_overrun_err) {
317 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
318 "CaloClusterContainerCnv_p6")
319 << "Corrupted data: not all alt values read "
320 << pers->m_vec.size() << " clusters "
321 << tmp_altE.size() << " alt values "
322 << ialt1-tmp_altE.begin() << " read.";
323 }
324
325 if (ialt3 != ialt4 && !raw_overrun_err) {
326 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
327 "CaloClusterContainerCnv_p6")
328 << "Corrupted data: not all alt values read "
329 << pers->m_vec.size() << " clusters "
330 << tmp_altEtaPhiM.size() << " raw values "
331 << ialt3-tmp_altEtaPhiM.begin() << " read.";
332 }
333
334
335
336 if (ibad1 != ibad2) {
337 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
338 "CaloClusterContainerCnv_p6")
339 << "Corrupted data: not all bad data read "
340 << pers->m_badClusIndexList.size() << " bad values "
341 << nbad << " read.";
342 }
343
344 //Convert TowerSegment
345 CaloTowerSeg seg;
346 m_caloTowerSegCnv.persToTrans(&(pers->m_towerSeg),&seg);
347 trans->setTowerSeg (seg);
348}
349
350
352 CaloClusterContainer_p6* /*pers*/,
353 MsgStream &log) const
354{
355 log << MSG::ERROR << "Writing of CaloClusterContainer_p6 not implemented any more!" << endmsg;
356
357}
358
359
361 CaloCluster* trans,
362 ShowerLinkState& showerLinkState,
363 CellLinkState& cellLinkState,
364 MsgStream& log) const
365{
367 trans->setBasicEnergy (pers->m_basicSignal);
368 trans->setTime (pers->m_time);
370 trans->m_eta0=pers->m_eta0;
371 trans->m_phi0=pers->m_phi0;
373 trans->setClusterSize (pers->m_clusterSize);
374
375 //Convert base class and element links
376 m_P4EEtaPhiMCnv.persToTrans(&pers->m_P4EEtaPhiM,static_cast<P4EEtaPhiM*>(trans),log);
377 m_showerElementLinkCnv.persToTrans(showerLinkState, pers->m_dataLink, trans->m_dataLink,log);
378 m_cellElementLinkCnv.persToTrans(cellLinkState, pers->m_cellLink, trans->m_cellLink,log);
380}
381
382
385 ShowerLinkState& showerLinkState,
386 CellLinkState& cellLinkState,
387 MsgStream& log) const
388{
389 pers->m_basicSignal=trans->getBasicEnergy();
390 pers->m_time=trans->getTime();
392 pers->m_eta0=trans->eta0();
393 pers->m_phi0=trans->phi0();
395 pers->m_clusterSize=trans->getClusterSize();
396
397 //Convert base class and element links
398 P4EEtaPhiM tmp = *trans;
399 m_P4EEtaPhiMCnv.transToPers(&tmp,&pers->m_P4EEtaPhiM,log);
400 m_showerElementLinkCnv.transToPers(showerLinkState, trans->m_dataLink, pers->m_dataLink,log);
401 m_cellElementLinkCnv.transToPers(cellLinkState, trans->m_cellLink, pers->m_cellLink,log);
402}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
CaloPhiRange class declaration.
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE_WITH_CONTEXT(LVL, CONTEXT_NAME)
Report a message, with an explicitly specified context name.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
#define F(x, y, z)
Definition MD5.cxx:112
#define x
virtual void setAthenaBarCode(AthenaBarCode_t id)
virtual void persToTrans(const CaloClusterContainer_p6 *pers, CaloClusterContainer *trans, MsgStream &log) const override
ElementLinkCnv_p2< ElementLink< CaloShowerContainer > > m_showerElementLinkCnv
ElementLinkCnv_p2< ElementLink< CaloCellLinkContainer > >::State CellLinkState
ElementLinkCnv_p2< ElementLink< CaloShowerContainer > >::State ShowerLinkState
ElementLinkCnv_p2< ElementLink< CaloCellLinkContainer > > m_cellElementLinkCnv
virtual void transToPers(const CaloClusterContainer *trans, CaloClusterContainer_p6 *pers, MsgStream &log) const override
std::vector< unsigned int > m_badPhiList
std::vector< short > m_badLayerStatusList
std::vector< float > m_dataStore
contType::const_iterator const_iterator
ElementLinkContNames_p2 m_linkNames
std::vector< unsigned int > m_altE
std::vector< unsigned int > m_rawE
std::vector< short > m_badClusIndexList
std::vector< unsigned int > m_badEtaList
CaloClusterMomentContainer_p2 m_momentContainer
std::vector< unsigned int > m_altEtaPhiM
std::vector< unsigned int > m_rawEtaPhiM
virtual void setTowerSeg(const CaloTowerSeg &towerSeg)
Set tower segmentation into CaloClusterContainer.
virtual void setMomentStore(const moment_store &rMomStore)
Set internal store.
std::map< moment_key, moment_value > moment_store
Internal moment store type.
cell_link_type m_cellLink
Local pointer to cell store.
Principal data class for CaloCell clusters.
double eta0() const
Returns raw of cluster seed.
CaloClusterMomentStore m_momentStore
cluster moments
virtual double getBasicEnergy() const
Access basic energy scale signal.
void resetBadChannel()
Reset Bad channel list.
unsigned int m_samplingPattern
Sampling pattern.
double m_altE
Stores calibrated (cell weight) signal.
void addBadChannel(const CaloClusterBadChannelData &badChannel)
Add Bad channel information.
virtual double e() const
Retrieve energy independent of signal state.
double m_altPhi
Stores calibrated (cell weight) signal.
virtual double eta() const
Retrieve eta independent of signal state.
double getTime() const
Access cluster time.
bool m_endcap
Flag is true if at least one cell in EMB.
double m_altM
Stores calibrated (cell weight) signal.
bool setDefaultSignalState(signalstate_t s)
Sets default signal state.
void setClusterSize(unsigned int theClusterSize)
Set cluster size.
void setTime(double theTime)
Set cluster time.
unsigned int getClusterSize() const
Get cluster size.
virtual double phi() const
Retrieve phi independent of signal state.
CaloSamplingData m_dataStore
{\ brief Cached Stores
virtual void setBasicEnergy(double theEnergy)
Set basic energy scale signal.
double phi0() const
Returns raw of cluster seed.
bool m_barrel
Flag is true if at least one cell in EMB.
double m_altEta
Stores calibrated (cell weight) signal.
CaloRecoStatus m_status
Calorimeter reconstruction status.
static double fix(double phi)
reconstruction status indicator
virtual const store_type & getStatusWord() const
retrieve the entire status word
Simple data object to store all variables in calorimeter samplings.
size_t getNumberOfSamplings() const
Set variable type pattern for this store.
CaloVariableType::VariableType variable_key_type
Variable look-up type.
unsigned int m_varTypePattern
CaloSampling::CaloSample sampling_key_type
Sampling look-up key type.
size_t getNumberOfVariableTypes() const
Return number of variable types.
bool storeData(variable_key_type theVariable, sampling_key_type theSampling, value_type theData)
}
bool removeVariable(variable_key_type theVariable, sampling_key_type theSampling)
Remove a certain variable.
Data object stores CaloTower segmentation.
void expandToFloat(const std::vector< unsigned int > &vc, std::vector< float > &vf)
a typed memory pool that saves time spent allocation small object.
Definition DataPool.h:63
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
void clear()
Erase all the elements in the collection.
static const AthenaBarCode_t UNDEFINEDBARCODE
struct color C
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition index.py:1
hold the test vectors and ease the comparison