ATLAS Offline Software
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 
5 #include "PixelHitDiscCnfgAlg.h"
6 #include "GaudiKernel/EventIDRange.h"
7 
8 #include "CoralBase/Blob.h"
9 
10 #include <cstdint>
11 
12 PixelHitDiscCnfgAlg::PixelHitDiscCnfgAlg(const std::string& name, ISvcLocator* pSvcLocator):
13  ::AthReentrantAlgorithm(name, pSvcLocator)
14 {
15 }
16 
18  ATH_MSG_DEBUG("PixelHitDiscCnfgAlg::initialize()");
19 
22 
23  return StatusCode::SUCCESS;
24 }
25 
26 StatusCode 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 
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
SG::ReadCondHandle::fullKey
const DataObjID & fullKey() const
Definition: ReadCondHandle.h:60
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
SG::ReadCondHandle::range
bool range(EventIDRange &r)
Definition: ReadCondHandle.h:223
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition: WriteCondHandle.h:157
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
SG::WriteCondHandle::fullKey
const DataObjID & fullKey() const
Definition: WriteCondHandle.h:41
lumiFormat.i
int i
Definition: lumiFormat.py:92
PixelHitDiscCnfgAlg::PixelHitDiscCnfgAlg
PixelHitDiscCnfgAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: PixelHitDiscCnfgAlg.cxx:12
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthenaAttributeList
An AttributeList represents a logical row of attributes in a metadata table. The name and type of eac...
Definition: PersistentDataModel/PersistentDataModel/AthenaAttributeList.h:45
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SG::WriteCondHandle::key
const std::string & key() const
Definition: WriteCondHandle.h:40
PixelHitDiscCnfgAlg.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
PixelHitDiscCnfgAlg::initialize
virtual StatusCode initialize() override
Definition: PixelHitDiscCnfgAlg.cxx:17
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:248
PixelHitDiscCnfgAlg::m_readKey
SG::ReadCondHandleKey< AthenaAttributeList > m_readKey
Definition: PixelHitDiscCnfgAlg.h:34
PixelHitDiscCnfgAlg::m_writeKey
SG::WriteCondHandleKey< PixelHitDiscCnfgData > m_writeKey
Definition: PixelHitDiscCnfgAlg.h:37
SG::ReadCondHandle::key
const std::string & key() const
Definition: ReadCondHandle.h:59
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
PixelHitDiscCnfgAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: PixelHitDiscCnfgAlg.cxx:26
CaloCondBlobAlgs_fillNoiseFromASCII.blob
blob
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:96