ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_CablingCondAlgFromCoraCool Class Reference

Condition algorithm which fills the SCT Cabling from the database, using CoraCool. More...

#include <SCT_CablingCondAlgFromCoraCool.h>

Inheritance diagram for SCT_CablingCondAlgFromCoraCool:
Collaboration diagram for SCT_CablingCondAlgFromCoraCool:

Public Member Functions

 SCT_CablingCondAlgFromCoraCool (const std::string &name, ISvcLocator *svc)
virtual ~SCT_CablingCondAlgFromCoraCool ()=default
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &ctx) const override
virtual StatusCode finalize () override
virtual bool isClonable () const override
 Make this algorithm clonable.
virtual bool isReEntrant () const override
 Avoid scheduling algorithm multiple times.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

bool insert (const IdentifierHash &hash, const SCT_OnlineId &onlineId, const SCT_SerialNumber &sn, SCT_CablingData *data) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadCondHandleKey< CondAttrListVecm_readKeyRod {this, "ReadKeyRod", "/SCT/DAQ/Config/ROD", "Key of input (raw) conditions folder of Rods"}
 Input conditions folders.
SG::ReadCondHandleKey< CondAttrListVecm_readKeyRodMur {this, "ReadKeyRodMur", "/SCT/DAQ/Config/RODMUR", "Key of input (raw) conditions folder of RodMurs"}
SG::ReadCondHandleKey< CondAttrListVecm_readKeyMur {this, "ReadKeyMur", "/SCT/DAQ/Config/MUR", "Key of input (raw) conditions folder of Murs"}
SG::ReadCondHandleKey< CondAttrListVecm_readKeyGeo {this, "ReadKeyGeo", "/SCT/DAQ/Config/Geog", "Key of input (raw) conditions folder of Geography"}
SG::WriteCondHandleKey< SCT_CablingDatam_writeKey {this, "WriteKey", "SCT_CablingData", "Key of output (derived) conditions data"}
 Output condition data.
const SCT_IDm_idHelper {nullptr}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Condition algorithm which fills the SCT Cabling from the database, using CoraCool.

Definition at line 40 of file SCT_CablingCondAlgFromCoraCool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ SCT_CablingCondAlgFromCoraCool()

SCT_CablingCondAlgFromCoraCool::SCT_CablingCondAlgFromCoraCool ( const std::string & name,
ISvcLocator * svc )

Definition at line 169 of file SCT_CablingCondAlgFromCoraCool.cxx.

169 :
170 AthCondAlgorithm(name, pSvcLocator)
171{
172}

◆ ~SCT_CablingCondAlgFromCoraCool()

virtual SCT_CablingCondAlgFromCoraCool::~SCT_CablingCondAlgFromCoraCool ( )
virtualdefault

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode SCT_CablingCondAlgFromCoraCool::execute ( const EventContext & ctx) const
overridevirtual

Get the geography table which gives where the MURs (harnesses, for endcap) really are. In fact for the barrel its obvious, so only extract the endcap ones

get the RODMUR which gives where the individual MURs are; this is an intermediate step, so make a temporary data structure.

Definition at line 218 of file SCT_CablingCondAlgFromCoraCool.cxx.

218 {
219 // Write Cond Handle
220 SG::WriteCondHandle<SCT_CablingData> writeHandle{m_writeKey, ctx};
221 if (writeHandle.isValid()) {
222 ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
223 << ". In theory this should not be called, but may happen"
224 << " if multiple concurrent events are being processed out of order.");
225 return StatusCode::SUCCESS;
226 }
227
228 // Determine the folders are Run2 or Run1
230
231 // let's get the ROD AttrLists
232 SG::ReadCondHandle<CondAttrListVec> readHandleRod{m_readKeyRod, ctx};
233 const CondAttrListVec* pRod{*readHandleRod};
234 if (pRod==nullptr) {
235 ATH_MSG_FATAL("Could not find ROD configuration data: " << m_readKeyRod.key());
236 return StatusCode::FAILURE;
237 }
238 // build rod-rob map, and store the crate/slot to RobId mapping
240 CondAttrListVec::const_iterator last_rod{pRod->end()};
241 using IntMap = std::map<int, int>;
242 IntMap slotMap;
243 //there are now 16 crate slots, but they may be numbered (in the DB) as some non-monotonic sequence
244 //so here we take whatever is in the database and map it onto numbers 0-15
245 {//scope this calculation, only slotMap should emerge
246 //map slots onto 0-15
247 using S = std::set<int>;
248 S slots;
249 for (; rodIt != last_rod; ++rodIt) {
250 //type of 'slot' changed between COMP200 and CONDBR2:
251 if (isRun2) {
252 slots.insert(int(rodIt->second["slot"].data<unsigned char>())); //all but 15 inserts will fail, and these 15 should be sorted
253 } else {
254 slots.insert(int(rodIt->second["slot"].data<short>())); //all but 15 inserts will fail, and these 15 should be sorted
255 }
256 }
257 int counter{0};
258 for (S::const_iterator i{slots.begin()};i != slots.end();++i) {
259 slotMap[*i]=counter++;
260 }
261 ATH_MSG_INFO("Number of SCT rod slots inserted: " << counter);
262 }
263 IntMap crateSlot2RobMap; //local data structure
264 bool allInsertsSucceeded{true};
265 rodIt=pRod->begin();
266 int nrods{0};
267 std::set<int> tempRobSet;
268 for (; rodIt != last_rod; ++rodIt) {
269 const coral::AttributeList& rodAttributes{rodIt->second};
270 int rob{rodAttributes["ROB"].data<int>()};
271 if (not tempRobSet.insert(rob).second) ATH_MSG_WARNING("Duplicate rob? :" << std::hex << rob << std::dec);
272 int crate{isRun2 ? static_cast<int>(rodAttributes["crate"].data<unsigned char>()) : (rodAttributes["crate"].data<int>())};
273 int crateSlot{isRun2 ? static_cast<int>(rodAttributes["slot"].data<unsigned char>()) : static_cast<int>(rodAttributes["slot"].data<short>())};
274 //see note in header; these may be 0-15, but not necessarily, so we need to map these onto 0-15
275 IntMap::const_iterator pSlot{slotMap.find(crateSlot)};
276 int slot{(pSlot==slotMap.end()) ? -1 : pSlot->second};
277 if (slot==-1) ATH_MSG_ERROR("Failed to find a crate slot in the crate map");
278 int rodPosition{(crate * slotsPerCrate) +slot};//generate identifier using crate and slot for use later
279 //use the return type of insert which is a pair with the second component(bool) indicating whether the insert was successful
280 bool thisInsertSucceeded{crateSlot2RobMap.insert(IntMap::value_type(rodPosition, rob)).second};
281 if (not thisInsertSucceeded) {
282 ATH_MSG_WARNING("Insert (rodPosition, rob) " << rodPosition << ", " << rob << " failed.");
283 ATH_MSG_INFO("map(rod position) is already " << crateSlot2RobMap[rodPosition]);
284 ATH_MSG_INFO("crate, slot, slots per crate: " << crate << ", " << slot << ", " << slotsPerCrate);
285 }
286 allInsertsSucceeded = thisInsertSucceeded and allInsertsSucceeded;
287 ++nrods;
288 }
289 ATH_MSG_INFO(nrods << " rods entered, of which " << tempRobSet.size() << " are unique.");
290
291 if (not allInsertsSucceeded) ATH_MSG_WARNING("Some Rod-Rob map inserts failed.");
292
297 IntMap geoMurMap;
298 SG::ReadCondHandle<CondAttrListVec> readHandleGeo{m_readKeyGeo, ctx};
299 const CondAttrListVec* pGeo{*readHandleGeo};
300 if (pGeo==nullptr) {
301 ATH_MSG_FATAL("Could not find Geog configuration data: " << m_readKeyGeo.key());
302 return StatusCode::FAILURE;
303 }
305 CondAttrListVec::const_iterator last_geo{pGeo->end()};
306 for (;geoIt != last_geo;++geoIt) {
307 const coral::AttributeList& geoAttributes{geoIt->second};
308 int mur{isRun2 ? static_cast<int>(geoAttributes["MUR"].data<unsigned int>()) : (geoAttributes["MUR"].data<int>())};
309 int position{isRun2 ? static_cast<int>(geoAttributes["position"].data<short>()) : (geoAttributes["position"].data<int>())};
310 if (mur > 10000) geoMurMap[mur]=position; //only for endcap case
311 }
312
317 IntMap murPositionMap;
318 SG::ReadCondHandle<CondAttrListVec> readHandleRodMur{m_readKeyRodMur, ctx};
319 const CondAttrListVec* pRodMur{*readHandleRodMur};
320 if (pRodMur==nullptr) {
321 ATH_MSG_FATAL("Could not find RodMur configuration data: " << m_readKeyRodMur.key());
322 return StatusCode::FAILURE;
323 }
324 CondAttrListVec::const_iterator rodMurIt{pRodMur->begin()};
325 CondAttrListVec::const_iterator last_rodMur{pRodMur->end()};
326 allInsertsSucceeded = true;
327 std::set<int> tempRobSet2;
328 for (; rodMurIt!=last_rodMur; ++rodMurIt) {
329 const coral::AttributeList& rodMurAttributes{rodMurIt->second};
330 int mur{isRun2 ? static_cast<int>(rodMurAttributes["MUR"].data<unsigned int>()) : (rodMurAttributes["MUR"].data<int>())};
331 int crate{isRun2 ? static_cast<int>(rodMurAttributes["crate"].data<unsigned char>()) : (rodMurAttributes["crate"].data<int>())};
332 int crateSlot{isRun2 ? static_cast<int>(rodMurAttributes["rod"].data<unsigned char>()) : (rodMurAttributes["rod"].data<int>())};//slot is int16, others are int32
333 //map slot onto 0-15 range
334 IntMap::const_iterator pSlot{slotMap.find(crateSlot)};
335 int slot{(pSlot==slotMap.end()) ? -1 : pSlot->second};
336 if (slot==-1) ATH_MSG_ERROR("Failed to find a crate slot in the crate map");
337 //
338 int order{isRun2 ? static_cast<int>(rodMurAttributes["position"].data<unsigned char>()) : (rodMurAttributes["position"].data<int>())};
339 int fibreOrder{((((crate * slotsPerCrate) + slot ) * mursPerRod) + order) * fibresPerMur};
340 bool thisInsertSucceeded{murPositionMap.insert(IntMap::value_type(mur, fibreOrder)).second};
341 if (not thisInsertSucceeded) ATH_MSG_WARNING("Insert (mur, fibre) " << mur << ", " << fibreOrder << " failed.");
342 allInsertsSucceeded = thisInsertSucceeded and allInsertsSucceeded;
343 }
344 if (not allInsertsSucceeded) ATH_MSG_WARNING("Some MUR-position map inserts failed.");
345
346 // let's get the MUR AttrLists
347 SG::ReadCondHandle<CondAttrListVec> readHandleMur{m_readKeyMur, ctx};
348 const CondAttrListVec* pMur{*readHandleMur};
349 if (pMur==nullptr) {
350 ATH_MSG_FATAL("Could not find ROD configuration data: " << m_readKeyMur.key());
351 return StatusCode::FAILURE;
352 }
353
354 // Add dependency
355 writeHandle.addDependency(readHandleRod);
356 writeHandle.addDependency(readHandleRodMur);
357 writeHandle.addDependency(readHandleMur);
358 writeHandle.addDependency(readHandleGeo);
359
360 // Construct the output Cond Object and fill it in
361 std::unique_ptr<SCT_CablingData> writeCdo{std::make_unique<SCT_CablingData>()};
362
363 //build identifier map
365 CondAttrListVec::const_iterator last_mur{pMur->end()};
366 int numEntries{0};
367 std::set<int> onlineIdSet, robSet;
368 std::set<Identifier> offlineIdSet;
369 long long lastSerialNumber{0};
370 for (; murIt != last_mur; ++murIt) {
371 const coral::AttributeList& murAttributes{murIt->second};
372 int mur{isRun2 ? static_cast<int>(murAttributes["MUR"].data<unsigned int>()) : (murAttributes["MUR"].data<int>())};
373 bool nullMur{murAttributes["moduleID"].isNull() or murAttributes["module"].isNull()};
374 if (9999 == mur or nullMur) continue;
375 int fibreInMur{ (isRun2 ? static_cast<int>(murAttributes["module"].data<unsigned char>()) : (murAttributes["module"].data<int>()) ) - 1};
376 long long sn{murAttributes["moduleID"].data<long long>()};
377 if (lastSerialNumber==sn) { //old version (<2.6) of Coral/Cool doesn't detect a 'null' value, instead it simply repeats the last known value.
378 continue;
379 }
380 lastSerialNumber=sn;
381 std::string snString{std::to_string(sn)};
382 IntMap::const_iterator pFibre{murPositionMap.find(mur)};
383 int fibreOffset{-1};
384 if (pFibre==murPositionMap.end()) {
385 ATH_MSG_WARNING("Failed to find an MUR position in the cabling");
386 } else {
387 fibreOffset = pFibre->second;
388 }
389 int encodedCrateSlot{fibreOffset / (fibresPerMur * mursPerRod)};
390 int rob{-1};
391 IntMap::const_iterator pCrate{crateSlot2RobMap.find(encodedCrateSlot)};
392 if (pCrate == crateSlot2RobMap.end()) {
393 ATH_MSG_WARNING("Failed to find a crate slot in the cabling, slot " << encodedCrateSlot);
394 } else {
395 rob=pCrate->second;
396 tempRobSet2.insert(rob);
397 }
398
399 //cheat to get the geography: use the MUR notation
400 int bec{0},eta{0}, layer{0}, phi{0};
401 std::pair<int, int> etaPhiPair;
402 int harnessPosition{-1};
403 if (mur > 10000) { //its an endcap, so has 5 digits in the mur
404 layer = (mur/10000) - 1; //first digit is the disk number, 1-9, so subtract 1
405 bec = (((mur /1000) % 2)==0) ? ENDCAP_A : ENDCAP_C; //bec is +2 for A if second digit is 0
406 int quadrant{(mur/100) % 10}; //3rd digit is quadrant
407 //eta = ((mur /10) % 10); //eta of the harness is the 4th digit
408 //int harness = (mur % 10) -1; //last digit is harness, 1 or 2
409 harnessPosition=geoMurMap[mur];
410 etaPhiPair= convertToAthenaCoords(bec,layer, quadrant, harnessPosition, fibreInMur);
411 eta=etaPhiPair.first;
412 phi=etaPhiPair.second;
413 } else {
414 bec = 0;
415 layer= (mur /1000) - 3;//first digit is layer, 3-6
416 phi= (mur % 100) - 1; //lower 2 digits are phi check whether this wraps around!
417 eta = (((mur / 100) % 10) *2 -1) * (fibreInMur+1);//second digit gives eta sign, 0-> -, 1-> +
418 }
419 int rxLink[2];
420 if (isRun2) {
421 rxLink[0]=murAttributes["rx0Fibre"].data<unsigned char>();rxLink[1]= murAttributes["rx1Fibre"].data<unsigned char>();
422 } else {
423 rxLink[0]=murAttributes["rx0Fibre"].data<int>();rxLink[1]=murAttributes["rx1Fibre"].data<int>();
424 }
425 if (not (validLinkNumber(rxLink[0]) and validLinkNumber(rxLink[1]))) {
426 ATH_MSG_WARNING("Invalid link number in database in one of these db entries: rx0Fibre=" << rxLink[0] << ", rx1Fibre=" << rxLink[1]);
427 continue;
428 }
429 //normal ordering is like rx0=0, rx1=1; i.e. odd links in rx1.
430 bool normalOrdering{true};
431 if (rxLink[0] != disabledFibre) { //if the first link is not disabled, use that and check its even
432 normalOrdering=(rxLink[0] % 2)==0;
433 } else { //...otherwise use link1 and check its odd
434 normalOrdering=(rxLink[1] % 2)==1;
435 }
436
437 int possibleLinks[2]{0,0};
438 if (normalOrdering) {
439 possibleLinks[0]=(rxLink[0]!=disabledFibre) ? rxLink[0] : (rxLink[1]-1);
440 possibleLinks[1]=(rxLink[1]!=disabledFibre) ? rxLink[1] : (rxLink[0]+1);
441 } else {
442 possibleLinks[0]=(rxLink[0]!=disabledFibre) ? rxLink[0] : (rxLink[1]+1);
443 possibleLinks[1]=(rxLink[1]!=disabledFibre) ? rxLink[1] : (rxLink[0]-1);
444 }
445 for (int side{0}; side!=2; ++side) {
446 if ((-1==phi) and (-1==eta)) {
447 ATH_MSG_WARNING("Invalid eta, phi..skipping insertion to map for module " << snString << " (may be already present in map)");
448 continue;
449 }
450 Identifier offlineId{m_idHelper->wafer_id(bec,layer,phi,eta,side)};
451 int link{rxLink[side]};
452 if (defaultLink==link) {
453 link = (fibreOffset % fibresPerRod) + fibreInMur*2 + side;
454 }
455 if (disabledFibre==link) {
456 int otherLink{rxLink[1-side]};
457 if (otherLink==possibleLinks[0]) link=possibleLinks[1];
458 if (otherLink==possibleLinks[1]) link=possibleLinks[0];
459 }
460 bool flippedModule{isOdd(side)!=isOdd(link)};
461 if (flippedModule) {
462 link = (link==possibleLinks[0]) ? possibleLinks[1] : possibleLinks[0];
463 }
464 int onlineId{(rob & 0xFFFFFF)|(link << 24)};
465 //check uniqueness
466 if (not onlineIdSet.insert(onlineId).second) ATH_MSG_WARNING("Insert of online Id : " << onlineId << " failed.");
467 if (not offlineIdSet.insert(offlineId).second) {
468 ATH_MSG_WARNING("Insert of offline Id : " << offlineId << " failed.");
469 ATH_MSG_WARNING(bec << " " << layer << " " << phi << " " << eta << " " << side);
470 ATH_MSG_INFO("MUR, position " << mur << ", " << harnessPosition);
471 }
472 IdentifierHash offlineIdHash{m_idHelper->wafer_hash(offlineId)};
473 insert(offlineIdHash, onlineId, SCT_SerialNumber(sn), writeCdo.get());
474 numEntries++;
475 }
476 }
477
478 if (writeHandle.record(std::move(writeCdo)).isFailure()) {
479 ATH_MSG_FATAL("Could not record SCT_CablingData " << writeHandle.key()
480 << " with EventRange " << writeHandle.getRange()
481 << " into Conditions Store");
482 return StatusCode::FAILURE;
483 }
484 ATH_MSG_INFO("recorded new CDO " << writeHandle.key() << " with range " << writeHandle.getRange() << " into Conditions Store");
485
486 const int robLo{*(tempRobSet2.cbegin())};
487 const int robHi{*(tempRobSet2.crbegin())};
488 ATH_MSG_INFO(numEntries << " entries were made to the identifier map.");
489 ATH_MSG_INFO(tempRobSet2.size() << " unique rob ids were used, spanning 0x" << std::hex << robLo << " to 0x" << robHi << std::dec);
490 if (tempRobSet.size() != tempRobSet2.size()) {
491 ATH_MSG_WARNING("The following existing rods were not inserted : ");
492 std::cout << std::hex;
493 std::set_difference(tempRobSet.cbegin(), tempRobSet.cend(),
494 tempRobSet2.cbegin(), tempRobSet2.cend(),
495 std::ostream_iterator<int>(std::cout,", "));
496 std::cout << std::dec << std::endl;
497 }
498 tempRobSet.clear();
499 return (numEntries==0) ? (StatusCode::FAILURE) : (StatusCode::SUCCESS);
500}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
if(febId1==febId2)
static const int fibresPerRod
static const int mursPerRod
static const std::string rodFolderName2
static const int disabledFibre
static const int defaultLink
static const int fibresPerMur
static const int slotsPerCrate
AttrListVec::const_iterator const_iterator
const_iterator end() const
const_iterator begin() const
SG::ReadCondHandleKey< CondAttrListVec > m_readKeyMur
SG::ReadCondHandleKey< CondAttrListVec > m_readKeyRod
Input conditions folders.
SG::ReadCondHandleKey< CondAttrListVec > m_readKeyRodMur
SG::ReadCondHandleKey< CondAttrListVec > m_readKeyGeo
SG::WriteCondHandleKey< SCT_CablingData > m_writeKey
Output condition data.
bool insert(const IdentifierHash &hash, const SCT_OnlineId &onlineId, const SCT_SerialNumber &sn, SCT_CablingData *data) const
const std::string & key() const
void addDependency(const EventIDRange &range)
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const
::StatusCode StatusCode
StatusCode definition for legacy code.
@ layer
Definition HitInfo.h:79
order
Configure Herwig7.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ finalize()

StatusCode SCT_CablingCondAlgFromCoraCool::finalize ( )
overridevirtual

Definition at line 212 of file SCT_CablingCondAlgFromCoraCool.cxx.

212 {
213 return StatusCode::SUCCESS;
214}

◆ initialize()

StatusCode SCT_CablingCondAlgFromCoraCool::initialize ( )
overridevirtual

Definition at line 176 of file SCT_CablingCondAlgFromCoraCool.cxx.

176 {
177 // Check conditions folder names
178 if((m_readKeyRod.key()!=rodFolderName) and (m_readKeyRod.key()!=rodFolderName2)) {
179 ATH_MSG_FATAL(m_readKeyRod.key() << " is incorrect.");
180 return StatusCode::FAILURE;
181 }
183 ATH_MSG_FATAL(m_readKeyRodMur.key() << " is incorrect.");
184 return StatusCode::FAILURE;
185 }
186 if((m_readKeyMur.key()!=murFolderName) and (m_readKeyMur.key()!=murFolderName2)) {
187 ATH_MSG_FATAL(m_readKeyMur.key() << " is incorrect.");
188 return StatusCode::FAILURE;
189 }
190 if((m_readKeyGeo.key()!=geoFolderName) and (m_readKeyGeo.key()!=geoFolderName2)) {
191 ATH_MSG_FATAL(m_readKeyGeo.key() << " is incorrect.");
192 return StatusCode::FAILURE;
193 }
194
195 // SCT_ID
196 ATH_CHECK(detStore()->retrieve(m_idHelper, "SCT_ID"));
197
198 // Read Cond Handle
199 ATH_CHECK(m_readKeyRod.initialize());
200 ATH_CHECK(m_readKeyRodMur.initialize());
201 ATH_CHECK(m_readKeyMur.initialize());
202 ATH_CHECK(m_readKeyGeo.initialize());
203
204 // Write Cond Handle
205 ATH_CHECK(m_writeKey.initialize());
206
207 return StatusCode::SUCCESS;
208}
#define ATH_CHECK
Evaluate an expression and check for errors.
static const std::string rodMurFolderName2
static const std::string rodMurFolderName
static const std::string murFolderName2
static const std::string murFolderName
static const std::string rodFolderName
static const std::string geoFolderName
static const std::string geoFolderName2
const ServiceHandle< StoreGateSvc > & detStore() const
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ insert()

bool SCT_CablingCondAlgFromCoraCool::insert ( const IdentifierHash & hash,
const SCT_OnlineId & onlineId,
const SCT_SerialNumber & sn,
SCT_CablingData * data ) const
private

Definition at line 504 of file SCT_CablingCondAlgFromCoraCool.cxx.

504 {
505 if (not sn.isWellFormed()) {
506 ATH_MSG_FATAL("Serial number is not in correct format");
507 return false;
508 }
509 if (not hash.is_valid()) {
510 ATH_MSG_FATAL("Invalid hash: " << hash);
511 return false;
512 }
513 // Check if the pointer of derived conditions object is valid.
514 if (data==nullptr) {
515 ATH_MSG_FATAL("Pointer of derived conditions object is null");
516 return false;
517 }
518
519 if (not data->setHashForOnlineId(hash, onlineId)) return false;
520 if (not data->setOnlineIdForHash(onlineId, hash)) return false;
521
522 bool successfulInsert{data->setHashForSerialNumber(hash, sn)};
523 successfulInsert &= data->setSerialNumberForHash(sn, hash);
524 // in this form, the data->getHashEntries() will be half the number of hashes
525 if (successfulInsert) {
526 data->setRod(onlineId.rod()); //move this here so insertion only happens for valid onlineId, hash
527 }
528 return true;
529}
std::uint32_t rod() const
Return the rod/rob Id.
bool isWellFormed() const
Cursory check on whether the serial number is well formed N.B.

◆ isClonable()

virtual bool SCT_CablingCondAlgFromCoraCool::isClonable ( ) const
inlineoverridevirtual

Make this algorithm clonable.

Reimplemented from AthCommonReentrantAlgorithm< Gaudi::Algorithm >.

Definition at line 49 of file SCT_CablingCondAlgFromCoraCool.h.

49{ return true; };

◆ isReEntrant()

virtual bool AthCondAlgorithm::isReEntrant ( ) const
inlineoverridevirtualinherited

Avoid scheduling algorithm multiple times.

With multiple concurrent events, conditions objects often expire simultaneously for all slots. To avoid that the scheduler runs the CondAlg in each slot, we declare it as "non-reentrant". This ensures that the conditions objects are only created once.

In case a particular CondAlg should behave differently, it can override this method again and return true.

See also
ATEAM-836

Definition at line 39 of file AthCondAlgorithm.h.

39{ return false; }

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_idHelper

const SCT_ID* SCT_CablingCondAlgFromCoraCool::m_idHelper {nullptr}
private

Definition at line 63 of file SCT_CablingCondAlgFromCoraCool.h.

63{nullptr};

◆ m_readKeyGeo

SG::ReadCondHandleKey<CondAttrListVec> SCT_CablingCondAlgFromCoraCool::m_readKeyGeo {this, "ReadKeyGeo", "/SCT/DAQ/Config/Geog", "Key of input (raw) conditions folder of Geography"}
private

Definition at line 59 of file SCT_CablingCondAlgFromCoraCool.h.

59{this, "ReadKeyGeo", "/SCT/DAQ/Config/Geog", "Key of input (raw) conditions folder of Geography"};

◆ m_readKeyMur

SG::ReadCondHandleKey<CondAttrListVec> SCT_CablingCondAlgFromCoraCool::m_readKeyMur {this, "ReadKeyMur", "/SCT/DAQ/Config/MUR", "Key of input (raw) conditions folder of Murs"}
private

Definition at line 58 of file SCT_CablingCondAlgFromCoraCool.h.

58{this, "ReadKeyMur", "/SCT/DAQ/Config/MUR", "Key of input (raw) conditions folder of Murs"};

◆ m_readKeyRod

SG::ReadCondHandleKey<CondAttrListVec> SCT_CablingCondAlgFromCoraCool::m_readKeyRod {this, "ReadKeyRod", "/SCT/DAQ/Config/ROD", "Key of input (raw) conditions folder of Rods"}
private

Input conditions folders.

Definition at line 56 of file SCT_CablingCondAlgFromCoraCool.h.

56{this, "ReadKeyRod", "/SCT/DAQ/Config/ROD", "Key of input (raw) conditions folder of Rods"};

◆ m_readKeyRodMur

SG::ReadCondHandleKey<CondAttrListVec> SCT_CablingCondAlgFromCoraCool::m_readKeyRodMur {this, "ReadKeyRodMur", "/SCT/DAQ/Config/RODMUR", "Key of input (raw) conditions folder of RodMurs"}
private

Definition at line 57 of file SCT_CablingCondAlgFromCoraCool.h.

57{this, "ReadKeyRodMur", "/SCT/DAQ/Config/RODMUR", "Key of input (raw) conditions folder of RodMurs"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_writeKey

SG::WriteCondHandleKey<SCT_CablingData> SCT_CablingCondAlgFromCoraCool::m_writeKey {this, "WriteKey", "SCT_CablingData", "Key of output (derived) conditions data"}
private

Output condition data.

Definition at line 61 of file SCT_CablingCondAlgFromCoraCool.h.

61{this, "WriteKey", "SCT_CablingData", "Key of output (derived) conditions data"};

The documentation for this class was generated from the following files: