ATLAS Offline Software
Loading...
Searching...
No Matches
PixelHitDiscCnfgAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "GaudiKernel/EventIDRange.h"
7
8#include "CoralBase/Blob.h"
9
10#include <cstdint>
11
12PixelHitDiscCnfgAlg::PixelHitDiscCnfgAlg(const std::string& name, ISvcLocator* pSvcLocator):
13 ::AthReentrantAlgorithm(name, pSvcLocator)
14{
15}
16
18 ATH_MSG_DEBUG("PixelHitDiscCnfgAlg::initialize()");
19
20 ATH_CHECK(m_readKey.initialize());
21 ATH_CHECK(m_writeKey.initialize());
22
23 return StatusCode::SUCCESS;
24}
25
26StatusCode PixelHitDiscCnfgAlg::execute(const EventContext& ctx) const {
27 ATH_MSG_DEBUG("PixelHitDiscCnfgAlg::execute()");
28
30 if (writeHandle.isValid()) {
31 ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid.. In theory this should not be called, but may happen if multiple concurrent events are being processed out of order.");
32 return StatusCode::SUCCESS;
33 }
34
35 // Construct the output Cond Object and fill it in
36 std::unique_ptr<PixelHitDiscCnfgData> writeCdo(std::make_unique<PixelHitDiscCnfgData>());
37
39 const AthenaAttributeList* readCdo = *readHandle;
40 if (readCdo==nullptr) {
41 ATH_MSG_FATAL("Null pointer to the read conditions object");
42 return StatusCode::FAILURE;
43 }
44 // Get the validitiy range
45 EventIDRange rangeW;
46 if (not readHandle.range(rangeW)) {
47 ATH_MSG_FATAL("Failed to retrieve validity range for " << readHandle.key());
48 return StatusCode::FAILURE;
49 }
50 ATH_MSG_DEBUG("Size of AthenaAttributeList " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size());
51 ATH_MSG_DEBUG("Range of input is " << rangeW);
52
53 const coral::Blob& blob=(*readCdo)["HitDiscCnfgData"].data<coral::Blob>();
54 const uint32_t* p = static_cast<const uint32_t*>(blob.startingAddress());
55
56 uint32_t cooldata;
57 unsigned int len = blob.size()/sizeof(uint32_t);
58 ATH_MSG_DEBUG("blob.size() = " << blob.size() << ", len = " << len);
59
60 int nhitPL = 0;
61 int hitPL = 0;
62 int nhit3D = 0;
63 int hit3D = 0;
64 for (unsigned int i = 0; i < len; ++i) {
65
66 cooldata = *p++;
67
68 ATH_MSG_DEBUG("Got hitdisccnfgData[" << i << "] = 0x" << std::hex << cooldata << std::dec);
69
70 // The implementation below uses one common value, one common 3D value,
71 // and an exception list of individual FEs, in order to save DB space.
72 // Here we convert this into only one common value and an exception list, i.e.
73 // if the 3D FEs have a different common value they are all added to the exception list
74 if ((cooldata & 0x8FFFFFFF)==0x0) { // undefined.
75 ATH_MSG_DEBUG("Setting common HitDiscCnfg value to " << ((cooldata&0x30000000) >> 28));
76 nhitPL++;
77 hitPL+=((cooldata&0x30000000) >> 28);
78 }
79 // Update all 3D sensors with a common value, identified by 0xZ0000000, where Z = 10hh
80 else if ((cooldata & 0x8FFFFFFF)==0x80000000) {
81 ATH_MSG_DEBUG("Setting common 3D HitDiscCnfg value to " << ((cooldata&0x30000000) >> 28));
82 nhit3D++;
83 hit3D+=((cooldata&0x30000000) >> 28);
84 }
85 // Update a single link, 0xHLDDRRRR
86 else {
87 ATH_MSG_DEBUG("Setting HitDiscCnfg value to " << ((cooldata&0x30000000) >> 28)
88 << " for ROB 0x" << std::hex << (cooldata & 0xFFFFFF)
89 << ", link " << std::dec << ((cooldata & 0xF000000) >> 24));
90 nhitPL++;
91 hitPL+=((cooldata&0x30000000) >> 28);
92 }
93 }
94 // Take average.
95 //FEI4EndcapHitDiscConfig = 2, FEI4BarrelHitDiscConfig = 2
96 double aveHitPL = 2.;
97 double aveHit3D = 2.;
98
99 if (nhitPL) { aveHitPL = hitPL/(1.0*nhitPL); }
100
101 if (nhit3D) { aveHit3D = hit3D/(1.0*nhit3D); }
102 else { aveHit3D = aveHitPL; }
103
104 if (aveHitPL-(double)(int)aveHitPL<0.5) { aveHitPL=(double)(int)aveHitPL; }
105 else { aveHitPL=(double)(int)(aveHitPL+0.9); }
106
107 if (aveHit3D-(double)(int)aveHit3D<0.5) { aveHit3D=(double)(int)aveHit3D; }
108 else { aveHit3D=(double)(int)(aveHit3D+0.9); }
109
110 writeCdo -> setHitDiscCnfgPL((int)aveHitPL);
111 writeCdo -> setHitDiscCnfg3D((int)aveHit3D);
112
113 if (writeHandle.record(rangeW, std::move(writeCdo)).isFailure()) {
114 ATH_MSG_FATAL("Could not record PixelHitDiscCnfgData " << writeHandle.key() << " with EventRange " << rangeW << " into Conditions Store");
115 return StatusCode::FAILURE;
116 }
117 ATH_MSG_INFO("recorded new CDO " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
118
119 return StatusCode::SUCCESS;
120}
121
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
An algorithm that can be simultaneously executed in multiple threads.
An AttributeList represents a logical row of attributes in a metadata table.
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &ctx) const override
SG::ReadCondHandleKey< AthenaAttributeList > m_readKey
PixelHitDiscCnfgAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteCondHandleKey< PixelHitDiscCnfgData > m_writeKey
bool range(EventIDRange &r)
const std::string & key() const
const DataObjID & fullKey() const
const std::string & key() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const