ATLAS Offline Software
Loading...
Searching...
No Matches
TileOFC2DBAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5//=== Event Info
8
9//=== AttributeList
10//#include "CoralBase/Attribute.h"
11#include "CoralBase/Blob.h"
12#include "CoralBase/AttributeListSpecification.h"
14
15//=== Tile includes
16#include "TileOFC2DBAlg.h"
20
21#include <vector>
22
23TileOFC2DBAlg::TileOFC2DBAlg(const std::string& name, ISvcLocator* pSvcLocator)
24 : AthAlgorithm(name, pSvcLocator)
25 , m_regSvc("IOVRegistrationSvc", name)
26
27{
28 declareProperty("OF2", m_of2 = true,"true => OF2, false => OF1");
33 declareProperty("FixedPhases", m_fixedPhases = true, "calculate OFCs for fixed phases" );
34 declareProperty("RunType", m_runType = "PHY", "PHY or LAS");
35
36 declareProperty("FixedPhasesNumber", m_nFixedPhases = 100);
37 declareProperty("PhaseStep", m_phaseStep = 0.5);
38 declareProperty("MaxChan", m_maxChan = 1, "Number of channels for which OFCs will be created with fixed phases");
39 declareProperty("Modules", m_modules = {"AUX01"}, "Modules for which OFC should be stored in DB");
40 declareProperty("CreateAllModules", m_creatAllModules = true, "All missing modules is written to DB with zero size (empty)");
41}
42
45
46
47//____________________________________________________________________________
49
50 ATH_MSG_INFO( "Initializing for " << m_runType );
51
52 //=== EventInfo key
53 ATH_CHECK( m_eventInfoKey.initialize() );
54
55 //=== get TileToolTiming
56 CHECK( m_tileToolTiming.retrieve() );
57
58 //=== get TileCondToolOfc
59 CHECK( m_tileCondToolOfc.retrieve() );
60
61 //=== IOVRegistrationSvc
62 CHECK( m_regSvc.retrieve() );
63
64 std::map<std::string, unsigned int> roses = { {"AUX", 0}, {"LBA", 1}, {"LBC", 2}, {"EBA", 3}, {"EBC", 4} };
65
66 msg(MSG::INFO) << "OFC will be stored in DB for the following modules:";
67 for (const std::string& module : m_modules) {
68 msg(MSG::INFO) << " " << module;
69 m_drawerIdxs.push_back( TileCalibUtils::getDrawerIdx(roses[module.substr(0, 3)], std::stoi(module.substr(3, 2)) - 1) );
70 }
71 msg(MSG::INFO) << endmsg;
72
73 if (m_creatAllModules) ATH_MSG_INFO("All other missing modules will be stored in DB with zero size");
74
75 return StatusCode::SUCCESS;
76}
77
78//
79//_________________________________________________________________________
81 const EventContext &ctx = Gaudi::Hive::currentContext();
82
83 //=== print run/evt/lbn/time info for each event
85 ATH_CHECK( eventInfo.isValid() );
86
87 ATH_MSG_DEBUG( "Event: ["
88 << eventInfo->runNumber() << ","
89 << eventInfo->eventNumber() << ":"
90 << eventInfo->timeStamp() << "]" );
91
92
93 //=== Create conditions objects only at run == ?, event == ?
94 if (1 != eventInfo->eventNumber()) {
95 ATH_MSG_DEBUG( "Event NOT selected for creating conditions objects " );
96 return StatusCode::SUCCESS;
97 } else {
98 ATH_MSG_DEBUG( "Creating conditions objects " );
99 }
100
101 //unsigned int objVersion = (m_of2) ? 3 : 1;
102 unsigned int objVersion = 3; // non efficient, but allows to keep dG also for OF1
103
104 //=== build the IOV range
106
107 //=== build COOL folder name based on ???????
108 std::string folder("/TILE/ONL01/FILTER/");
109 if (m_of2) folder += "OF2/" + m_runType;
110 else folder += "OF1/" + m_runType;
111 m_folders.insert(folder);
112
113 //=== create the folder layout
114 coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
115 spec->extend("TileCalibBlobOfc", "blob");
116
117 //=== create the collection of attribute lists
118 CondAttrListCollection* attrListColl = new CondAttrListCollection(true);
119
120 float zeroPhase(0.0);
122 ATH_CHECK( m_tileCondToolOfc->getOfcWeights(0, 0, 0, zeroPhase, true, weights, ctx) );
123 int ndig = weights.n_samples;
124
125 // ---------- create fixed phases
126 if (m_fixedPhases) {
127 ATH_MSG_DEBUG( "Fixed phases: " << m_fixedPhases
128 << ", number of fixed phases: " << m_nFixedPhases
129 << ", phase step: " << m_phaseStep);
130
131 std::vector<float> phases;
132 phases.reserve(m_nFixedPhases * 2 + 1);
133
134 //=== create attribute list
135 coral::AttributeList ofcList(*spec);
136 coral::Blob& blob = ofcList["TileCalibBlobOfc"].data<coral::Blob>();
137
138 std::vector<bool> coolChannelCreated(TileCalibUtils::MAX_DRAWERIDX, false);
139
140 for (int iPhase = - m_nFixedPhases; iPhase <= m_nFixedPhases; ++iPhase) {
141 phases.push_back(iPhase * m_phaseStep);
142 }
143
144 int nPhases = phases.size();
145 TileCalibDrawerOfc* drawerOfc;
146
147 for (unsigned int drawerIdx : m_drawerIdxs) {
148 coolChannelCreated[drawerIdx] = true;
149 drawerOfc = TileCalibDrawerOfc::getInstance(blob, objVersion, ndig, -nPhases, m_maxChan, TileCalibUtils::MAX_GAIN); // nPhases, nChann, nGains
150
151 drawerOfc->setPhases(0, 0, phases);
152
153 for (unsigned int channel = 0; channel < m_maxChan; ++channel) {
154 for (unsigned int gain = 0; gain < TileCalibUtils::MAX_GAIN; ++gain) {
155
156 for (float phase : phases) {
157 ATH_CHECK( m_tileCondToolOfc->getOfcWeights(drawerIdx, channel, gain, phase, m_of2, weights, ctx) );
158 for (int isam = 0; isam < ndig; isam++) {
159 drawerOfc->setOfc(TileCalibDrawerOfc::FieldA, channel, gain, phase, isam, weights.w_a[isam]);
160 drawerOfc->setOfc(TileCalibDrawerOfc::FieldB, channel, gain, phase, isam, weights.w_b[isam]);
161 drawerOfc->setOfc(TileCalibDrawerOfc::FieldG, channel, gain, phase, isam, weights.g[isam]);
162 if (objVersion == 3) {
163 drawerOfc->setOfc(TileCalibDrawerOfc::FieldC, channel, gain, phase, isam, weights.w_c[isam]);
164 drawerOfc->setOfc(TileCalibDrawerOfc::FieldDG, channel, gain, phase, isam, weights.dg[isam]);
165 }
166 }
167
168
169 if (msgLvl(MSG::DEBUG)) {
170
171 msg(MSG::DEBUG) << " N Samples " << ndig
172 << " channel " << channel
173 << " drawerIdx " << drawerIdx
174 << " gain " << gain
175 << " phase = " << phase << endmsg;
176
177 msg(MSG::DEBUG) << "gain " << gain << " w_a, phase " << phase << " ";
178 for (int isam = 0; isam < ndig; ++isam)
179 msg(MSG::DEBUG) << " " << weights.w_a[isam];
180 msg(MSG::DEBUG) << endmsg;
181
182 msg(MSG::DEBUG) << "gain " << gain << " w_b, phase " << phase << " ";
183 for (int isam = 0; isam < ndig; isam++)
184 msg(MSG::DEBUG) << " " << weights.w_b[isam];
185 msg(MSG::DEBUG) << endmsg;
186
187 if (m_of2) {
188 msg(MSG::DEBUG) << "gain " << gain << " w_c, phase " << phase << " ";
189 for (int isam = 0; isam < ndig; isam++)
190 msg(MSG::DEBUG) << " " << weights.w_c[isam];
191 msg(MSG::DEBUG) << endmsg;
192 }
193
194 msg(MSG::DEBUG) << "gain " << gain << " g, phase " << phase << " ";
195 for (int isam = 0; isam < ndig; isam++)
196 msg(MSG::DEBUG) << " " << weights.g[isam];
197 msg(MSG::DEBUG) << endmsg;
198
199 }
200
201 }
202 }
203
204
205 }
206
207 //=== use DrawerHash as channel number
208 attrListColl->add(drawerIdx, ofcList);
209
210 //=== add the IOV range for this collection
211 attrListColl->add(drawerIdx, range);
212 // drawerOfc->dump();
213 delete drawerOfc;
214
215 }
216
217 //=== Create empty blobs for all COOL channels (for missing drawers)
218 if (m_creatAllModules) {
219 for (unsigned int coolChannel = 0; coolChannel < TileCalibUtils::MAX_DRAWERIDX; ++coolChannel) {
220 if (coolChannelCreated[coolChannel]) continue;
221 //=== create attribute list for this drawer
222 coral::AttributeList ofcList(*spec);
223 //coral::Blob& blob=ofcList["TileCalibBlobOfc"].data<coral::Blob>();
224 attrListColl->add(coolChannel, ofcList);
225 attrListColl->add(coolChannel, range);
226 }
227 }
228
229 } else { // take best phase from DB and calculate OFCs for each channel
230
231 std::vector<float> phases(TileCalibUtils::MAX_CHAN);
232
233 //=== create attribute list
234 coral::AttributeList ofcList(*spec);
235 coral::Blob& blob = ofcList["TileCalibBlobOfc"].data<coral::Blob>();
236
237 //=== create an OFC blob interpreter
238 TileCalibDrawerOfc* drawerOfc = TileCalibDrawerOfc::getInstance(blob, objVersion, ndig, -48, 256, 2); // nPhases, nChann, nGains
239
240 for (unsigned int channel = 0; channel < TileCalibUtils::MAX_CHAN; ++channel)
241 phases[channel] = (float) channel;
242
243 for (unsigned int ros = 1; ros < TileCalibUtils::MAX_ROS; ++ros) {
244 for (unsigned int drawer = 0; drawer < TileCalibUtils::getMaxDrawer(ros); ++drawer) {
245 unsigned int drawerIdx = TileCalibUtils::getDrawerIdx(ros, drawer);
246 drawerOfc->setPhases(drawerIdx, 0, phases);
247
248 for (unsigned int channel = 0; channel < TileCalibUtils::MAX_CHAN; ++channel) {
249
250 for (unsigned int gain = 0; gain < TileCalibUtils::MAX_GAIN; ++gain) {
251
252 float phase = m_tileToolTiming->getSignalPhase(drawerIdx, channel, gain);
253 ATH_MSG_DEBUG( "m_tileToolTiming:"
254 << " drawerIdx " << drawerIdx
255 << " channel " << channel
256 << " gain " << gain
257 << " phase " << phase );
258
259 ATH_CHECK( m_tileCondToolOfc->getOfcWeights(drawerIdx, channel, gain, phase, m_of2, weights, ctx) );
260 ATH_MSG_DEBUG( " N Samples " << ndig
261 << " ros " << ros
262 << " drawer " << drawer
263 << " channel " << channel
264 << " drawerIdx " << drawerIdx
265 << " gain " << gain
266 << " phase = " << phase );
267
268 double w_a_sum = 0, w_b_sum = 0, w_c_sum = 0;
269 for (int isam = 0; isam < ndig; isam++) {
270 if (m_of2) {
271 ATH_MSG_DEBUG( " sampling " << isam
272 << " w_a " << weights.w_a[isam]
273 << " w_b " << weights.w_b[isam]
274 << " w_c " << weights.w_c[isam]
275 << " g " << weights.g[isam] );
276
277 } else {
278 ATH_MSG_DEBUG( " sampling " << isam
279 << " w_a " << weights.w_a[isam]
280 << " w_b " << weights.w_b[isam]
281 << " g " << weights.g[isam] );
282
283 }
284
285 w_a_sum += weights.w_a[isam];
286 w_b_sum += weights.w_b[isam];
287 w_c_sum += weights.w_c[isam];
288
289 drawerOfc->setOfc(0, drawerIdx, gain, channel, isam, weights.w_a[isam]);
290 drawerOfc->setOfc(1, drawerIdx, gain, channel, isam, weights.w_b[isam]);
291 if (m_of2) {
292 drawerOfc->setOfc(2, drawerIdx, gain, channel, isam, weights.w_c[isam]);
293 drawerOfc->setOfc(3, drawerIdx, gain, channel, isam, weights.g[isam]);
294 } else {
295 drawerOfc->setOfc(2, drawerIdx, gain, channel, isam, weights.g[isam]);
296 }
297 }
298
299 if (m_of2) ATH_MSG_DEBUG( " *** SUM: a,b,c " << w_a_sum << " " << w_b_sum << " " << w_c_sum );
300
301 } // for ... gain
302 } // for ... channel
303
304 //=== use DrawerHash as channel number
305 attrListColl->add(drawerIdx, ofcList);
306
307 //=== add the IOV range for this collection
308 attrListColl->add(drawerIdx, range);
309 // drawerOfc->dump();
310 } // for ... drawer
311 } // for ... ros
312 delete drawerOfc;
313 }
314
315 //=== add the comment in the comment channel
316 coral::AttributeList attrList(*spec);
317 coral::Blob& blob = attrList["TileCalibBlobOfc"].data<coral::Blob>();
318 const char* user = getenv("USER");
319 TileCalibDrawerCmt* comment = TileCalibDrawerCmt::getInstance(blob, (user ? user : "tilecomm"), "OFC weights calculated by TileCondToolOfc");
320 delete comment;
321 attrListColl->add(TileCalibUtils::getCommentChannel(), attrList);
322 attrListColl->add(TileCalibUtils::getCommentChannel(), range);
323
324 spec->release();
325 // cppcheck-suppress memleak
326 spec = nullptr;
327
328 //=== recored collection in store gate
329 CHECK( detStore()->record(attrListColl, folder) );
330
331 //=======================================
332 //=== Print conditions data in detector store
333 //=======================================
334 ATH_MSG_DEBUG( "Calling printCondObjects" );
335
337
338 return StatusCode::SUCCESS;
339}
340
341//
342//________________________________________________________________________
344
345 ATH_MSG_INFO( "in finalize()" );
346
347 //=== Register objects in DB
349
350 ATH_MSG_DEBUG( "Register OK " );
351
352 return StatusCode::SUCCESS;
353}
354
355
356//
357//___________________________________________________________________
359
360 ATH_MSG_DEBUG( "entering registerCondObject " );
361
362 for (std::set<std::string>::const_iterator iFolder = m_folders.begin();
363 iFolder != m_folders.end(); ++iFolder) {
364
365 const CondAttrListCollection* attrListColl = nullptr;
366 CHECK( detStore()->retrieve(attrListColl, *iFolder) );
367
368 if (nullptr == attrListColl) {
369 ATH_MSG_ERROR( "Has not retrieved AttributeListCollection (ptr is 0) from " << *iFolder );
370 return (StatusCode::FAILURE);
371 } else {
372 ATH_MSG_DEBUG( "Retrieved AttributeListCollection from " << *iFolder );
373 }
374
375 //=== register in COOL
376 std::string tag = "";
377 CHECK( m_regSvc->registerIOV("CondAttrListCollection", *iFolder, tag) );
378
379 ATH_MSG_DEBUG( "Registered folder " << *iFolder << " with tag " << tag );
380
381 } //end iFolder
382
383 return StatusCode::SUCCESS;
384}
385
386//
387//__________________________________________________________________
389
390 ATH_MSG_INFO( "in printCondObjects()" );
391
392 //=== loop over all folders
393 for (std::set<std::string>::const_iterator iFolder = m_folders.begin();
394 iFolder != m_folders.end(); ++iFolder) {
395
396 ATH_MSG_DEBUG( "Printing content of folder: " << *iFolder );
397
398 //=== determine blob name
399 std::string blobName("TileCalibBlob");
400 if (iFolder->find("/TILE/ONL01/FILTER") != std::string::npos) {
401 blobName += "Ofc";
402 }
403
404 ATH_MSG_DEBUG( "The blob name is: " << blobName );
405
406 const CondAttrListCollection* attrListColl(nullptr);
407 CHECK( detStore()->retrieve(attrListColl, *iFolder) );
408
409 if (!attrListColl) {
410 ATH_MSG_ERROR("Has not retrieved AttributeListCollection (ptr is 0) from " << *iFolder );
411 return StatusCode::FAILURE;
412 }
413
414 //=== find the general comment
415 std::string generalComment("");
417 if (iComment != attrListColl->end()) {
418 const coral::Blob& blob = (iComment->second)[blobName].data<coral::Blob>();
420 generalComment = cmt->getFullComment();
421 delete cmt;
422 }
423
424 //=== loop over collection
425 CondAttrListCollection::const_iterator iColl = attrListColl->begin();
426 CondAttrListCollection::const_iterator last = attrListColl->end();
427 for (; iColl != last; ++iColl) {
428
429 //=== do not print comment channel
430 if (iColl == iComment) continue;
431
432 //=== try to find comment for this drawer
433 const coral::Blob& blob = (iColl->second)[blobName].data<coral::Blob>();
434 //=== do not print empty blobs
435 if (!blob.size()) {
436 continue;
437 }
438
440 std::ostringstream attrStr1;
441 (*iColl).second.toOutputStream(attrStr1);
442 ATH_MSG_DEBUG( "ChanNum " << (*iColl).first << " Attribute list " << attrStr1.str() );
443
444 // Print out range if it exits
445 CondAttrListCollection::ChanNum chanNum = (*iColl).first;
446 CondAttrListCollection::iov_const_iterator iovIt = attrListColl->chanIOVPair(chanNum);
447 if (iovIt != attrListColl->iov_end()) {
448 const IOVRange& range = (*iovIt).second;
449 if (range.start().isTimestamp()) {
450 ATH_MSG_DEBUG( "Range timestamp :"
451 << " since " << range.start().timestamp()
452 << " till " << range.stop().timestamp() );
453
454 } else {
455 ATH_MSG_DEBUG( "Range R/LB :"
456 << " since " << range.start().run() << " " << range.start().event()
457 << " till " << range.stop().run() << " " << range.stop().event() );
458 }
459 } else {
460 ATH_MSG_DEBUG( "No range found " );
461 }
462
463 //=== print the comment
464 std::string comment = cmt->getFullComment();
465 if (comment.empty()) {
466 comment = generalComment;
467 }
468 ATH_MSG_DEBUG( "Comment: " << comment );
469 delete cmt;
470
471 }
472 } //end iFolder
473
474 return StatusCode::SUCCESS;
475}
476
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
MsgStream & msg() const
This class is a collection of AttributeLists where each one is associated with a channel number.
const_iterator end() const
bool add(ChanNum chanNum, const AttributeList &attributeList)
Adding in chan/attrList pairs.
const_iterator begin() const
Access to Chan/AttributeList pairs via iterators.
iov_const_iterator iov_end() const
iov_const_iterator chanIOVPair(ChanNum chanNum) const
Access to Chan/IOV pairs via channel number: returns map iterator.
ChanAttrListMap::const_iterator const_iterator
ChanIOVMap::const_iterator iov_const_iterator
const_iterator chanAttrListPair(ChanNum chanNum) const
Access to Chan/AttributeList pairs via channel number: returns map iterator.
Validity Range object.
Definition IOVRange.h:30
Basic time unit for IOVSvc.
Definition IOVTime.h:33
static constexpr uint32_t MAXRUN
Definition IOVTime.h:48
static constexpr uint32_t MINEVENT
Definition IOVTime.h:50
static constexpr uint32_t MAXEVENT
Definition IOVTime.h:51
static constexpr uint32_t MINRUN
Definition IOVTime.h:44
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Class to store comments in BLOB without any data.
static const TileCalibDrawerCmt * getInstance(const coral::Blob &blob)
Returns a pointer to a const TileCalibDrawerCmt.
static TileCalibDrawerOfc * getInstance(coral::Blob &blob, uint16_t objVersion, uint32_t nSamples, int32_t nPhases, uint16_t nChans, uint16_t nGains, const std::string &author="", const std::string &comment="", uint64_t timeStamp=0)
Returns a pointer to a non-const TileCalibDrawerOfc.
static const unsigned int MAX_DRAWERIDX
Maximal drawer index.
static const unsigned int MAX_ROS
Number of ROSs.
static const unsigned int MAX_GAIN
Number of gains per channel.
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
static unsigned int getMaxDrawer(unsigned int ros)
Returns the maximal channel number for a given drawer.
static unsigned int getCommentChannel()
Returns the COOL channel number for the comment channel.
static const unsigned int MAX_CHAN
Number of channels in drawer.
std::string m_runType
std::set< std::string > m_folders
ToolHandle< ITileCondToolOfc > m_tileCondToolOfc
UnsignedIntegerProperty m_runIOVUntil
UnsignedIntegerProperty m_lbnIOVUntil
StatusCode finalize()
TileOFC2DBAlg(const std::string &name, ISvcLocator *pSvcLocator)
UnsignedIntegerProperty m_maxChan
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
StatusCode execute()
ToolHandle< TileCondToolTiming > m_tileToolTiming
StatusCode initialize()
ServiceHandle< IIOVRegistrationSvc > m_regSvc
UnsignedIntegerProperty m_runIOVSince
StatusCode registerCondObjects()
UnsignedIntegerProperty m_lbnIOVSince
std::vector< unsigned int > m_drawerIdxs
std::vector< std::string > m_modules
StatusCode printCondObjects()