ATLAS Offline Software
Loading...
Searching...
No Matches
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
8void
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
120void
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}
#define endmsg
LArAutoCorrSubset_p1 LArAutoCorrPersType
LArConditionsSubset< LArAutoCorrP1 > LArAutoCorrTransType
This file defines the template class used for I/O of conditions data.
c-struct reproducing the structure of the persistent data
std::vector< float > m_vAutoCorr
virtual void persToTrans(const LArAutoCorrPersType *persObj, LArAutoCorrTransType *transObj, MsgStream &log) const override
virtual void transToPers(const LArAutoCorrTransType *transObj, LArAutoCorrPersType *persObj, MsgStream &log) const override
LArConditionsSubset_p1 m_subset
std::vector< float > m_vAutoCorr
std::vector< unsigned int > m_febIds
std::vector< unsigned int > m_corrChannels
unsigned int subsetSize() const
std::vector< unsigned int > m_febsWithSparseData
void initialize(const std::vector< FebId > &ids, unsigned int gain)
Initialize with set of FEB ids.
ConstSubsetIt subsetEnd() const
unsigned channelVectorSize() const
ConstCorrectionVecIt correctionVecBegin() const
Iterators over channel set.
unsigned int groupingType() const
Type of grouping - defined in LArConditionsContainerBase.h.
ConstCorrectionVecIt correctionVecEnd() const
void setGroupingType(unsigned int type)
set the type of grouping - defined in LArConditionsContainerBase.h
ConstSubsetIt subsetBegin() const
Iterators over subset.
unsigned int gain() const
Access to gain.
size_type correctionVecSize() const
Size of channel set.
std::vector< CorrectionPair > CorrectionVec
unsigned int channel() const
Access to the COOL channel number.
void insertCorrections(CorrectionVec &&corrs)
Insert a group of corrections.
void setChannel(unsigned int channel)
set the COOL channel number