ATLAS Offline Software
Loading...
Searching...
No Matches
CaloClusterContainerCnv_p7.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
13
14
16
17
18namespace {
19
20inline
21bool testbit (unsigned int x, unsigned int i)
22{
23 return (x & (1U << i)) != 0;
24}
25
26} // anonymous namespace
27
28
31 MsgStream &log) const
32{
33 if (log.level() <= MSG::DEBUG) log<< MSG::DEBUG << "Reading CaloClusterContainerCnv_p7" << endmsg;
34
35 // Use data pool for clusters to avoid calling constructor for each event
36 DataPool<CaloCluster> clusters;
37
38 trans->clear (SG::VIEW_ELEMENTS);
39 trans->reserve(pers->m_vec.size());
40
43
44 std::vector<float> temp_Moments;
46 A.expandToFloat( pers->m_momentContainer.m_Mvalue, temp_Moments); // unpacks moments
47
48 std::vector<float>::const_iterator i_mom = temp_Moments.begin();
49 std::vector<float>::const_iterator i_mom_e = temp_Moments.end();
50
51 const std::vector<unsigned short>& keys = pers->m_momentContainer.m_Mkey;
52 unsigned int nkeys = keys.size();
53
54 unsigned int c1=0;
55
56 std::vector<float> tmp_badChannelEta;
57 std::vector<float> tmp_badChannelPhi;
58 Compressor B;
59 B.expandToFloat(pers->m_badEtaList,tmp_badChannelEta);
60 B.expandToFloat(pers->m_badPhiList,tmp_badChannelPhi);
61
62// raw 4-momentum state
63 std::vector<float> tmp_rawE;
64 std::vector<float> tmp_rawEtaPhiM;
66 C.expandToFloat(pers->m_rawE,tmp_rawE);
67 std::vector<float>::const_iterator iraw1 = tmp_rawE.begin();
68 std::vector<float>::const_iterator iraw2 = tmp_rawE.end();
69
70 Compressor D;
71 D.expandToFloat(pers->m_rawEtaPhiM,tmp_rawEtaPhiM);
72 std::vector<float>::const_iterator iraw3 = tmp_rawEtaPhiM.begin();
73 std::vector<float>::const_iterator iraw4 = tmp_rawEtaPhiM.end();
74
75// alternative calibration 4-momentum state
76 std::vector<float> tmp_altE;
77 std::vector<float> tmp_altEtaPhiM;
78 Compressor E;
79 E.expandToFloat(pers->m_altE,tmp_altE);
80 std::vector<float>::const_iterator ialt1 = tmp_altE.begin();
81 std::vector<float>::const_iterator ialt2 = tmp_altE.end();
83 F.expandToFloat(pers->m_altEtaPhiM,tmp_altEtaPhiM);
84 std::vector<float>::const_iterator ialt3 = tmp_altEtaPhiM.begin();
85 std::vector<float>::const_iterator ialt4 = tmp_altEtaPhiM.end();
86
87
88 std::vector<short>::const_iterator ibad1 = pers->m_badClusIndexList.begin();
89 std::vector<short>::const_iterator ibad2 = pers->m_badClusIndexList.end();
90 int nbad=0;
91
92 bool mom_overrun_err = false;
93 bool store_overrun_err = false;
94 bool raw_overrun_err = false;
95 size_t dataStore_size = pers->m_dataStore.size();
96
97 bool fillBad=true;
98 if (tmp_badChannelEta.size() != pers->m_badClusIndexList.size() ||
99 tmp_badChannelPhi.size() != pers->m_badClusIndexList.size() ||
100 pers->m_badLayerStatusList.size() != pers->m_badClusIndexList.size()) {
101 log << MSG::WARNING << " problem to decode bad channel information, not filled..." << endmsg;
102 fillBad=false;
103 }
104
105 short index=0;
106 for(;itp!=itp_e;++itp) {
107 index++;
108
109 CaloCluster* transCluster = clusters.nextElementPtr();// Get next ptr for next cluster
110 persToTrans(&(*itp),transCluster,log); //Convert Cluster-quantities
111
112 CaloSamplingData *trDS =&(transCluster->m_dataStore);
113
115 int nVar=trDS->getNumberOfVariableTypes();
116 int nSamplings=trDS->getNumberOfSamplings();
117
120
121 for (int i=0;i<nVar;++i) {// here loops to read them in ...
122 if (testbit (trDS->m_varTypePattern, i)) {
123
124 // can be optimized: no decoding for each variable.
125 for (int j=0;j<nSamplings; ++j){
126
127 if ( testbit(transCluster->m_samplingPattern, j) ){
128 float val;
129 if (c1 < dataStore_size)
130 val = pers->m_dataStore[c1++];
131 else {
132 val = 0;
133 if (!store_overrun_err) {
134 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
135 "CaloClusterContainerCnv_p7")
136 << "Corrupted data: data store array overrun "
137 << pers->m_vec.size() << " clusters "
138 << nkeys << " moment keys "
139 << temp_Moments.size() << " total moments.";
140 store_overrun_err = true;
141 }
142 }
143 trDS->storeData(static_cast<vartype>(i),
144 static_cast<samptype>(j),
145 val);
146 }
147 else{
148
149 trDS->removeVariable(static_cast<vartype>(i),
150 static_cast<samptype>(j));
151 //std::cout<<"a:0"<<"\t";
152 }
153 }
154 // std::cout<<std::endl;
155 }
156 else
157 trDS->removeVariable(static_cast<vartype>(i));
158 }
159
160 transCluster->m_barrel= (bool)(0x001ff00f & transCluster->m_samplingPattern);
161 transCluster->m_endcap= (bool)(0x00e00ff0 & transCluster->m_samplingPattern);
162 // std::cout<<" <<< Read"<<std::endl;
163
164
165 //Convert moment store
167 for (unsigned short i=0;i<nkeys;++i) {
168 float val;
169 if (i_mom == i_mom_e) {
170 val = 0;
171 if (!mom_overrun_err) {
172 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
173 "CaloClusterContainerCnv_p7")
174 << "Corrupted data: moment array overrun "
175 << pers->m_vec.size() << " clusters "
176 << nkeys << " moment keys "
177 << temp_Moments.size() << " total moments.";
178 mom_overrun_err = true;
179 }
180 }
181 else {
182 val = *i_mom;
183 ++i_mom;
184 }
185 transStore.insert (transStore.end(), CaloClusterMomentStore::moment_store::value_type( keys[i], val ) );
186 }
187 transCluster->m_momentStore.setMomentStore (std::move (transStore));
188
189 // fill bad channel information
190 transCluster->resetBadChannel();
191 if (fillBad){
192 while (ibad1 != ibad2 && (*ibad1) ==index) {
193 float eta = tmp_badChannelEta[nbad] + transCluster->eta();
194 float phi = CaloPhiRange::fix(tmp_badChannelPhi[nbad] + transCluster->phi());
195 short status=pers->m_badLayerStatusList[nbad];
196 CaloSampling::CaloSample layer = (CaloSampling::CaloSample) (status & 0xff);
197 CaloBadChannel flag = CaloBadChannel( ((status>>8) & 0xff) );
199 // std::cout << " add bad channel data " << transCluster << " " << eta << " " << phi << " " << layer << " " << status << " " << flag.packedData() << std::endl;
200 transCluster->addBadChannel(data);
201 ++ibad1;
202 ++nbad;
203 }
204 }
205
206// fill raw E,eta,phi,M
207 if (iraw1 != iraw2) {
208 if (std::fabs(transCluster->e())>0.1) {
209 transCluster->m_rawE = (*iraw1) * transCluster->e();
210 }
211 else
212 transCluster->m_rawE = (*iraw1);
213 ++iraw1;
214 }
215 if (iraw3 != iraw4) {
216 transCluster->m_rawEta = (*iraw3) + transCluster->eta();
217 ++iraw3;
218 }
219 if (iraw3 != iraw4) {
220 transCluster->m_rawPhi = CaloPhiRange::fix((*iraw3)+transCluster->phi());
221 ++iraw3;
222 }
223 if (iraw3 == iraw4 && !raw_overrun_err) {
224 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
225 "CaloClusterContainerCnv_p7")
226 << "Corrupted data: raw array overrun "
227 << pers->m_vec.size() << " clusters "
228 << tmp_rawE.size() << " raw values.";
229 raw_overrun_err = true;
230 }
231 if (iraw3 != iraw4) {
232 transCluster->m_rawM = (*iraw3);
233 ++iraw3;
234 }
235 //std::cout << " perstotrans rawE/eta/phi/M " << transCluster->m_rawE << " " << transCluster->m_rawEta << " " <<
236 // transCluster->m_rawPhi << " " << transCluster->m_rawM << std::endl;
237
238// fill alt calibrated E,eta,phi,M
239 if (ialt1 != ialt2) {
240 if (std::fabs(transCluster->e())>0.1) {
241 transCluster->m_altE = (*ialt1) * transCluster->e();
242 }
243 else
244 transCluster->m_altE = (*ialt1);
245 ++ialt1;
246 }
247 if (ialt3 != ialt4) {
248 transCluster->m_altEta = (*ialt3) + transCluster->eta();
249 ++ialt3;
250 }
251 if (ialt3 != ialt4) {
252 transCluster->m_altPhi = CaloPhiRange::fix((*ialt3)+transCluster->phi());
253 ++ialt3;
254 }
255 if (ialt3 == ialt4 && !raw_overrun_err) {
256 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
257 "CaloClusterContainerCnv_p7")
258 << "Corrupted data: raw array overrun "
259 << pers->m_vec.size() << " clusters "
260 << tmp_altE.size() << " alt values.";
261 raw_overrun_err = true;
262 }
263 if (ialt3 != ialt4) {
264 transCluster->m_altM = (*ialt3);
265 ++ialt3;
266 }
267 //std::cout << " perstotrans altE/eta/phi/M " << transCluster->m_altE << " " << transCluster->m_altEta << " " <<
268 // transCluster->m_altPhi << " " << transCluster->m_altM << std::endl;
269
270
271 trans->push_back(transCluster);
272 }
273
274 if (i_mom != i_mom_e && !mom_overrun_err) {
275 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
276 "CaloClusterContainerCnv_p7")
277 << "Corrupted data: not all moments read "
278 << pers->m_vec.size() << " clusters "
279 << nkeys << " moment keys "
280 << temp_Moments.size() << " total moments "
281 << i_mom-temp_Moments.begin() << " read.";
282 }
283
284 if (c1 != dataStore_size && !store_overrun_err) {
285 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
286 "CaloClusterContainerCnv_p7")
287 << "Corrupted data: not all data store members read "
288 << dataStore_size << " elements "
289 << c1 << " read.";
290 }
291
292 if (iraw1 != iraw2 && !raw_overrun_err) {
293 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
294 "CaloClusterContainerCnv_p7")
295 << "Corrupted data: not all raw values read "
296 << pers->m_vec.size() << " clusters "
297 << tmp_rawE.size() << " raw values "
298 << iraw1-tmp_rawE.begin() << " read.";
299 }
300
301 if (iraw3 != iraw4 && !raw_overrun_err) {
302 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
303 "CaloClusterContainerCnv_p7")
304 << "Corrupted data: not all raw values read "
305 << pers->m_vec.size() << " clusters "
306 << tmp_rawEtaPhiM.size() << " raw values "
307 << iraw3-tmp_rawEtaPhiM.begin() << " read.";
308 }
309
310 if (ialt1 != ialt2 && !raw_overrun_err) {
311 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
312 "CaloClusterContainerCnv_p7")
313 << "Corrupted data: not all alt values read "
314 << pers->m_vec.size() << " clusters "
315 << tmp_altE.size() << " alt values "
316 << ialt1-tmp_altE.begin() << " read.";
317 }
318
319 if (ialt3 != ialt4 && !raw_overrun_err) {
320 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
321 "CaloClusterContainerCnv_p7")
322 << "Corrupted data: not all alt values read "
323 << pers->m_vec.size() << " clusters "
324 << tmp_altEtaPhiM.size() << " raw values "
325 << ialt3-tmp_altEtaPhiM.begin() << " read.";
326 }
327
328
329
330 if (ibad1 != ibad2) {
331 REPORT_MESSAGE_WITH_CONTEXT(MSG::WARNING,
332 "CaloClusterContainerCnv_p7")
333 << "Corrupted data: not all bad data read "
334 << pers->m_badClusIndexList.size() << " bad values "
335 << nbad << " read.";
336 }
337
338 //Convert TowerSegment
339 CaloTowerSeg seg;
340 m_caloTowerSegCnv.persToTrans(&(pers->m_towerSeg),&seg);
341 trans->setTowerSeg (seg);
342}
343
344
346 CaloClusterContainer_p7* /*pers*/,
347 MsgStream &log) const
348{
349 log << MSG::ERROR << "Writing of CaloClusterContainerCnv_p7 not implemented any more" << endmsg;
350}
351
352
353
355 CaloCluster* trans,
356 MsgStream& log) const
357{
359 trans->setBasicEnergy (pers->m_basicSignal);
360 trans->setTime (pers->m_time);
362 trans->m_eta0=pers->m_eta0;
363 trans->m_phi0=pers->m_phi0;
365 trans->setClusterSize (pers->m_clusterSize);
366
367 //Convert base class and element links
368 m_P4EEtaPhiMCnv.persToTrans(&pers->m_P4EEtaPhiM,static_cast<P4EEtaPhiM*>(trans),log);
369 m_showerElementLinkCnv.persToTrans(&pers->m_dataLink,&trans->m_dataLink,log);
370 m_cellElementLinkCnv.persToTrans(&pers->m_cellLink,&trans->m_cellLink,log);
371 m_barcodeCnv.persToTrans(&pers->m_barcode, trans, log);
372
373}
374
375
376
377
380 MsgStream& log) const
381{
382 pers->m_basicSignal=trans->getBasicEnergy();
383 pers->m_time=trans->getTime();
385 pers->m_eta0=trans->eta0();
386 pers->m_phi0=trans->phi0();
388 pers->m_clusterSize=trans->getClusterSize();
389
390 //Convert base class and element links
391 P4EEtaPhiM tmp = *trans;
392 m_P4EEtaPhiMCnv.transToPers(&tmp,&pers->m_P4EEtaPhiM,log);
393 m_showerElementLinkCnv.transToPers(&trans->m_dataLink,&pers->m_dataLink,log);
394 m_cellElementLinkCnv.transToPers(&trans->m_cellLink,&pers->m_cellLink,log);
395 m_barcodeCnv.transToPers(trans, &pers->m_barcode, log);
396}
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 persToTrans(const CaloClusterContainer_p7 *pers, CaloClusterContainer *trans, MsgStream &log) const override
virtual void transToPers(const CaloClusterContainer *trans, CaloClusterContainer_p7 *pers, MsgStream &log) const override
ElementLinkCnv_p3< ElementLink< CaloCellLinkContainer > > m_cellElementLinkCnv
ElementLinkCnv_p3< ElementLink< CaloShowerContainer > > m_showerElementLinkCnv
std::vector< unsigned int > m_badEtaList
std::vector< unsigned int > m_altE
std::vector< unsigned int > m_altEtaPhiM
std::vector< unsigned int > m_badPhiList
contType::const_iterator const_iterator
std::vector< short > m_badClusIndexList
CaloClusterMomentContainer_p2 m_momentContainer
std::vector< unsigned int > m_rawE
std::vector< unsigned int > m_rawEtaPhiM
std::vector< float > m_dataStore
std::vector< short > m_badLayerStatusList
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.
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