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) );
198 CaloClusterBadChannelData data(eta,phi,layer,flag);
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
356 MsgStream& log) const
357{
358 trans->setDefaultSignalState (P4SignalState::CALIBRATED);
359 trans->setBasicEnergy (pers->m_basicSignal);
360 trans->setTime (pers->m_time);
361 trans->m_samplingPattern=pers->m_samplingPattern;
362 trans->m_eta0=pers->m_eta0;
363 trans->m_phi0=pers->m_phi0;
364 trans->m_status = CaloRecoStatus(pers->m_caloRecoStatus);
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();
384 pers->m_samplingPattern=trans->m_samplingPattern;
385 pers->m_eta0=trans->eta0();
386 pers->m_phi0=trans->phi0();
387 pers->m_caloRecoStatus=trans->m_status.getStatusWord();
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.
#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 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
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