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) );
204 CaloClusterBadChannelData data(eta,phi,layer,flag);
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
362 ShowerLinkState& showerLinkState,
363 CellLinkState& cellLinkState,
364 MsgStream& log) const
365{
366 trans->setDefaultSignalState (P4SignalState::CALIBRATED);
367 trans->setBasicEnergy (pers->m_basicSignal);
368 trans->setTime (pers->m_time);
369 trans->m_samplingPattern=pers->m_samplingPattern;
370 trans->m_eta0=pers->m_eta0;
371 trans->m_phi0=pers->m_phi0;
372 trans->m_status = CaloRecoStatus(pers->m_caloRecoStatus);
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);
379 trans->setAthenaBarCode (IAthenaBarCode::UNDEFINEDBARCODE);
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();
391 pers->m_samplingPattern=trans->m_samplingPattern;
392 pers->m_eta0=trans->eta0();
393 pers->m_phi0=trans->phi0();
394 pers->m_caloRecoStatus=trans->m_status.getStatusWord();
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.
#define F(x, y, z)
Definition MD5.cxx:112
#define x
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 setMomentStore(const moment_store &rMomStore)
Set internal store.
std::map< moment_key, moment_value > moment_store
Internal moment store type.
Principal data class for CaloCell clusters.
CaloClusterMomentStore m_momentStore
cluster moments
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.
bool m_endcap
Flag is true if at least one cell in EMB.
double m_altM
Stores calibrated (cell weight) signal.
virtual double phi() const
Retrieve phi independent of signal state.
CaloSamplingData m_dataStore
{\ brief Cached Stores
bool m_barrel
Flag is true if at least one cell in EMB.
double m_altEta
Stores calibrated (cell weight) signal.
static double fix(double phi)
reconstruction status indicator
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
static const AthenaBarCode_t UNDEFINEDBARCODE
TH1F * trans(TH1F *h, bool t=false)
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