ATLAS Offline Software
LArAutoCorrSubsetCnv_p1.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 
8 void
10  LArAutoCorrTransType* transObj,
11  MsgStream & log) const
12 {
13  // Copy basic metadata
14  transObj->setChannel (persObj->m_subset.m_channel);
15  transObj->setGroupingType (persObj->m_subset.m_groupingType);
16  transObj->initialize (persObj->m_subset.m_febIds, persObj->m_subset.m_gain);
17 
18  unsigned int nfebids = persObj->m_subset.m_febIds.size();
19  const unsigned int nChannelsPerFeb = persObj->m_subset.subsetSize();
20  unsigned int nAutoCorrs = persObj->m_vAutoCorrSize;
21  unsigned int autocorrIndex = 0;
22 
23  unsigned int ifebWithData = 0; // counter for febs with data
24  auto subsetIt = transObj->subsetBegin();
25  for (unsigned int i = 0; i < nfebids; ++i, ++subsetIt){
26  unsigned int febid = subsetIt->first;
27  bool hasSparseData = false;
28  unsigned int chansSet = 0;
29  unsigned int chansOffset = 0;
30  if (ifebWithData+1 < persObj->m_subset.m_febsWithSparseData.size() &&
31  febid == persObj->m_subset.m_febsWithSparseData[ifebWithData] ) {
32  // Found feb with sparse data
33  hasSparseData = true;
34  ifebWithData++;
35  chansSet = persObj->m_subset.m_febsWithSparseData[ifebWithData];
36  chansOffset = 0;
37  ifebWithData++;
38  }
39 
40  // Loop over channels in feb - only some channels are filled
41  for (unsigned int j = 0; j < nChannelsPerFeb; ++j){
42 
43  bool copyChannel = true;
44  if (hasSparseData) {
45  // coverity[bad_shift]
46  // coverity[integer_overflow]
47  if (!(chansSet & (1 << (j - chansOffset)))) {
48  // Channel is missing data - skip
49  copyChannel = false;
50  }
51  if (j%32 == 31 && j < nChannelsPerFeb-2) {
52  chansSet = persObj->m_subset.m_febsWithSparseData[ifebWithData];
53  chansOffset += 32;
54  ifebWithData++;
55  }
56  }
57  if (copyChannel) {
58 
59  // Channel has autocorrs - loop over autocorrs per channel
60  // and copy to the persistent object
61 
62  // check indexes
63  if (autocorrIndex + nAutoCorrs > persObj->m_vAutoCorr.size()) {
64  log << MSG::ERROR
65  << "LArAutoCorrSubsetCnv_p1::persToTrans - autocorr index too large: autocorr/size "
66  << autocorrIndex << " " << persObj->m_vAutoCorr.size() << " "
67  << endmsg;
68  return;
69  }
70 
71  subsetIt->second[j].m_vAutoCorr.assign
72  (persObj->m_vAutoCorr.begin() + autocorrIndex,
73  persObj->m_vAutoCorr.begin() + autocorrIndex + nAutoCorrs);
74  autocorrIndex += nAutoCorrs;
75  }
76 
77  // static unsigned int nch1 = 0;
78  // ++nch1;
79  // std::cout << "persToTrans - i, j, copy " << i << " " << j << " "
80  // << copyChannel << " " << nch1
81  // << " hasSparseData " << hasSparseData
82  // << " chansSet, chansOffset, ifebWithData " << std::hex
83  // << chansSet << std::dec << " " << chansOffset << " " << ifebWithData
84  // << " febids " << febid << " "
85  // << sparseFebid
86  // << std::endl;
87 
88  }
89  }
90 
91  unsigned int ncorrs = persObj->m_subset.m_corrChannels.size();
93  corrs.resize(ncorrs);
94 
95  // Loop over corrections
96  for (unsigned int i = 0; i < ncorrs; ++i){
97  // check indexes
98  if (autocorrIndex + nAutoCorrs > persObj->m_vAutoCorr.size()) {
99  log << MSG::ERROR
100  << "LArAutoCorrSubsetCnv_p1::persToTrans - autocorr index too large: autocorr/size "
101  << autocorrIndex << " " << persObj->m_vAutoCorr.size() << " "
102  << endmsg;
103  return;
104  }
105 
106  corrs[i].first = persObj->m_subset.m_corrChannels[i];
107 
108  corrs[i].second.m_vAutoCorr.assign
109  (persObj->m_vAutoCorr.begin() + autocorrIndex,
110  persObj->m_vAutoCorr.begin() + autocorrIndex + nAutoCorrs);
111  autocorrIndex += nAutoCorrs;
112  }
113  transObj->insertCorrections (std::move (corrs));
114 
115 }
116 
117 
118 
119 
120 void
122  LArAutoCorrPersType* persObj,
123  MsgStream &log) const
124 {
125  // Copy conditions
126 
127  // We copy all autocorrs into a single vector.
128  // For the conditions, there are two situations to treat:
129  // 1) dense data: normal conditions where each feb has 128
130  // channels and all channels have data,
131  // 2) sparse data: conditions data where some channels are
132  // missing data. This is true for MC conditions (only some
133  // channels have data, and symmetry is used to obtain
134  // conditions for the rest of the channels), as well for
135  // 'normal' conditions it may happen that some channels may
136  // be missing data.
137  //
138  // Treating 1) is straight-forward. For 2) we need to keep track
139  // of which channels are present. We do so with
140  // m_subset.m_febsWithSparseData where we store the febid followed by
141  // four unsigned ints which contain the full bit pattern of the
142  // channels set (i.e. bits 0-127).
143  //
144  // Note that one may also have a subset with all channels missing
145  // data. In this case, we do not write out the empty subset.
146  //
147  // Finally, for corrections, we save the channel ids in
148  // m_subset.m_corrChannels and the autocorrs in the same vectors as
149  // the rest of the conditions data.
150  //
151  // For each channel with data, the number of autocorrs is assumed
152  // constant. This is calculated at the beginning, along with
153  // whether a feb is sparse or not.
154  //
155 
156  // Get the number of channels, corrections and the size of autocorr
157  unsigned int nsubsetsNotEmpty = 0;
158  unsigned int ncorrs = transObj->correctionVecSize();
159  unsigned int nchans = 0;
160  unsigned int nAutoCorrs = 0;
161  const unsigned int nChannelsPerFeb = transObj->channelVectorSize();
162  bool foundNAutoCorrs = false;
163  std::vector<unsigned int> febsWithSparseData;
164 
165  // Find the number of autocorrs and check for sparse conditions,
166  // e.g. MC conditions
167  const auto subsetEnd = transObj->subsetEnd();
168  for (auto subsetIt = transObj->subsetBegin();
169  subsetIt != subsetEnd;
170  ++subsetIt)
171  {
172  unsigned int nfebChans = subsetIt->second.size();
173 
174  if (nfebChans != 0 && nfebChans != nChannelsPerFeb) {
175  log << MSG::ERROR
176  << "LArAutoCorrSubsetCnv_p1::transToPers - found incorrect number of channels per feb: " << nfebChans
177  << endmsg;
178  return;
179  }
180  if (nfebChans) ++nsubsetsNotEmpty; // count number of non-empty subsets
181 
182  // Loop over channels and check if this subset has sparse data
183  bool subsetIsSparse = false;
184  for (unsigned int j = 0; j < nfebChans; ++j) {
185  const LArAutoCorrP1& autocorr = subsetIt->second[j];
186  if (autocorr.m_vAutoCorr.size() == 0) {
187  if (!subsetIsSparse) {
188  // save febids for sparse subsets
189  subsetIsSparse = true;
190  febsWithSparseData.push_back(subsetIt->first);
191  }
192  }
193  else {
194  nchans++; // count number of channels
195  if (!foundNAutoCorrs) {
196  // Save the number of autocorrs and derivatives from first channels present
197  nAutoCorrs = autocorr.m_vAutoCorr.size();
198  foundNAutoCorrs = true;
199  }
200  }
201  }
202  }
203  if (!foundNAutoCorrs && ncorrs>0) {
204  // Save the number of autocorrs and derivatives from first
205  // correct - couldn't find it from channels
206  const LArAutoCorrP1& autocorr = transObj->correctionVecBegin()->second;
207  nAutoCorrs = autocorr.m_vAutoCorr.size();
208  }
209  // Save sizes
210  persObj->m_vAutoCorrSize = nAutoCorrs;
211 
212  // Reserve space in vectors
213  persObj->m_subset.m_febIds.reserve(nsubsetsNotEmpty);
214  persObj->m_subset.m_corrChannels.reserve(ncorrs);
215  unsigned int nAutoCorrsTot = (nchans + ncorrs)*nAutoCorrs;
216  persObj->m_vAutoCorr.reserve(nAutoCorrsTot);
217 
218  // For subsets with sparse data, reserve space for identifying
219  // channels written out:
220  // 1 - febid
221  // 4 - for 128 bits (4*32)
222  if (febsWithSparseData.size())
223  persObj->m_subset.m_febsWithSparseData.reserve(febsWithSparseData.size()*5);
224 
225  // Copy conditions in subset
226  unsigned int isparse = 0;
227  for (auto subsetIt = transObj->subsetBegin();
228  subsetIt != subsetEnd;
229  ++subsetIt)
230  {
231  unsigned int nfebChans = subsetIt->second.size();
232 
233  // skip subsets without any channels
234  if (nfebChans == 0) continue;
235 
236  unsigned int febid = subsetIt->first;
237  persObj->m_subset.m_febIds.push_back(febid);
238 
239 
240  bool isSparse = false;
241  if (isparse < febsWithSparseData.size() &&
242  febsWithSparseData[isparse] == febid) {
243  // sparse subset, save channels with data
244  isparse++;
245  isSparse = true;
246  // save febid
247  persObj->m_subset.m_febsWithSparseData.push_back(febid);
248  }
249 
250  // Now loop over channels and save autocorrs and channel number
251  unsigned int chansSet = 0;
252  unsigned int chansOffset = 0;
253  for (unsigned int j = 0; j < nfebChans; ++j){
254 
255  bool saveAutoCorrs = true;
256  if (isSparse) {
257  // subset with sparse data
258 
259  if (subsetIt->second[j].m_vAutoCorr.size() > 0) {
260  // store the channel number in bit map
261  // coverity[integer_overflow]
262  assert (j >= chansOffset && (j - chansOffset) <= 31);
263  chansSet |= (1 << (j - chansOffset));
264  }
265  else {
266  saveAutoCorrs = false;
267  }
268  // Save chansSet
269  if (j == (chansOffset + 31) || j == nfebChans - 1) {
270  persObj->m_subset.m_febsWithSparseData.push_back(chansSet);
271  chansSet = 0;
272  chansOffset += 32;
273  }
274  }
275  if (saveAutoCorrs) {
276  // save autocorrs
277  bool tooSmall=false;
278  for (unsigned int k = 0; k < nAutoCorrs; ++k){
279  if (k>=subsetIt->second[j].m_vAutoCorr.size()) {
280  persObj->m_vAutoCorr.push_back(0.);
281  tooSmall=true;
282  }
283  else
284  persObj->m_vAutoCorr.push_back(subsetIt->second[j].m_vAutoCorr[k]);
285  }
286  if (tooSmall)
287  log << MSG::ERROR << "Feb 0x" << std::hex << febid << std::dec << " channel " << j <<": AutoCorr object too small. Expected "
288  << nAutoCorrs << " entries. Padded with 0.0" << endmsg;
289  }
290 // static unsigned int nch = 0;
291 // ++nch;
292 // std::cout << "transToPers - i, j, save " << i << " " << j << " "
293 // << saveAutoCorrs << " " << nch << " febid " << febid
294 // << " chansSet " << std::hex << chansSet << std::dec
295 // << " chansOffset " << chansOffset
296 // << std::endl;
297 
298  }
299  }
300 
301  const auto corrEnd = transObj->correctionVecEnd();
302  for (auto corrIt = transObj->correctionVecBegin();
303  corrIt != corrEnd;
304  ++corrIt)
305  {
306  // Save channel id in febid vector
307  persObj->m_subset.m_corrChannels.push_back(corrIt->first);
308  // AutoCorrs
309  bool tooSmall=false;
310  for (unsigned int k = 0; k < nAutoCorrs; ++k){
311  if (k>=corrIt->second.m_vAutoCorr.size()) {
312  persObj->m_vAutoCorr.push_back(0.);
313  tooSmall=true;
314  }
315  else
316  persObj->m_vAutoCorr.push_back(corrIt->second.m_vAutoCorr[k]);
317  }
318  if (tooSmall)
319  log << MSG::ERROR << "Correction (channel 0x" << std::hex << corrIt->first << std::dec <<
320  "): AutoCorr object too small. Expected " << nAutoCorrs << " entries. Padded with 0.0" << endmsg;
321  }
322 
323  // Copy the rest
324  persObj->m_subset.m_gain = transObj->gain();
325  persObj->m_subset.m_channel = transObj->channel();
326  persObj->m_subset.m_groupingType = transObj->groupingType();
327 
328 }
LArConditionsSubset::setGroupingType
void setGroupingType(unsigned int type)
set the type of grouping - defined in LArConditionsContainerBase.h
Definition: LArConditionsSubset.h:575
LArConditionsSubset_p1::m_channel
unsigned int m_channel
Definition: LArConditionsSubset_p1.h:79
LArConditionsSubset_p1::m_corrChannels
std::vector< unsigned int > m_corrChannels
Definition: LArConditionsSubset_p1.h:76
LArConditionsSubset_p1::m_febsWithSparseData
std::vector< unsigned int > m_febsWithSparseData
Definition: LArConditionsSubset_p1.h:77
LArConditionsSubset::channelVectorSize
unsigned channelVectorSize() const
Definition: LArConditionsSubset.h:608
LArAutoCorrP1
c-struct reproducing the structure of the persistent data
Definition: LArAutoCorrP1.h:25
LArConditionsSubset_p1::subsetSize
unsigned int subsetSize() const
Definition: LArConditionsSubset_p1.h:82
LArConditionsSubset_p1::m_gain
unsigned int m_gain
Definition: LArConditionsSubset_p1.h:78
LArConditionsSubset::correctionVecEnd
ConstCorrectionVecIt correctionVecEnd() const
Definition: LArConditionsSubset.h:472
LArAutoCorrSubsetCnv_p1::persToTrans
virtual void persToTrans(const LArAutoCorrPersType *persObj, LArAutoCorrTransType *transObj, MsgStream &log) const override
Definition: LArAutoCorrSubsetCnv_p1.cxx:9
LArConditionsSubset_p1::m_febIds
std::vector< unsigned int > m_febIds
Definition: LArConditionsSubset_p1.h:75
LArConditionsSubset::initialize
void initialize(const std::vector< FebId > &ids, unsigned int gain)
Initialize with set of FEB ids.
Definition: LArConditionsSubset.h:529
LArConditionsSubset::CorrectionVec
std::vector< CorrectionPair > CorrectionVec
Definition: LArConditionsSubset.h:144
lumiFormat.i
int i
Definition: lumiFormat.py:85
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
LArConditionsSubset_p1::m_groupingType
unsigned int m_groupingType
Definition: LArConditionsSubset_p1.h:80
LArConditionsSubset::channel
unsigned int channel() const
Access to the COOL channel number.
Definition: LArConditionsSubset.h:498
LArConditionsSubset::setChannel
void setChannel(unsigned int channel)
set the COOL channel number
Definition: LArConditionsSubset.h:567
LArAutoCorrSubsetCnv_p1::transToPers
virtual void transToPers(const LArAutoCorrTransType *transObj, LArAutoCorrPersType *persObj, MsgStream &log) const override
Definition: LArAutoCorrSubsetCnv_p1.cxx:121
LArAutoCorrSubset_p1::m_vAutoCorrSize
unsigned int m_vAutoCorrSize
Definition: LArAutoCorrSubset_p1.h:37
LArConditionsSubset
template class for use for I/O of conditions data
Definition: LArConditionsSubset.h:122
LArConditionsSubset.h
This file defines the template class used for I/O of conditions data.
LArAutoCorrSubset_p1::m_subset
LArConditionsSubset_p1 m_subset
Definition: LArAutoCorrSubset_p1.h:35
LArConditionsSubset::gain
unsigned int gain() const
Access to gain.
Definition: LArConditionsSubset.h:490
LArConditionsSubset::correctionVecSize
size_type correctionVecSize() const
Size of channel set.
Definition: LArConditionsSubset.h:481
LArAutoCorrSubsetCnv_p1.h
LArAutoCorrSubset_p1
persistent class container of LArConditionsSubset for LArAutoCorr data.
Definition: LArAutoCorrSubset_p1.h:30
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
LArConditionsSubset::subsetBegin
ConstSubsetIt subsetBegin() const
Iterators over subset.
Definition: LArConditionsSubset.h:412
LArAutoCorrP1::m_vAutoCorr
std::vector< float > m_vAutoCorr
Definition: LArAutoCorrP1.h:31
LArAutoCorrSubset_p1::m_vAutoCorr
std::vector< float > m_vAutoCorr
Definition: LArAutoCorrSubset_p1.h:36
LArConditionsSubset::subsetEnd
ConstSubsetIt subsetEnd() const
Definition: LArConditionsSubset.h:420
LArConditionsSubset::correctionVecBegin
ConstCorrectionVecIt correctionVecBegin() const
Iterators over channel set.
Definition: LArConditionsSubset.h:465
LArConditionsSubset::insertCorrections
void insertCorrections(CorrectionVec &&corrs)
Insert a group of corrections.
Definition: LArConditionsSubset.h:593
fitman.k
k
Definition: fitman.py:528
LArConditionsSubset::groupingType
unsigned int groupingType() const
Type of grouping - defined in LArConditionsContainerBase.h.
Definition: LArConditionsSubset.h:507