ATLAS Offline Software
Loading...
Searching...
No Matches
LArShapeToSCShape.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "LArShapeToSCShape.h"
10
13
15#include "CoralBase/Blob.h"
16
18
19// FrameWork includes
20#include "Gaudi/Property.h"
21
22
23
25// Public methods:
27
28// Constructors
30LArShapeToSCShape::LArShapeToSCShape( const std::string& name,
31 ISvcLocator* pSvcLocator ) :
32 ::AthAlgorithm( name, pSvcLocator )
33{
34}
35
36// Destructor
40
41// Athena Algorithm's Hooks
44{
45
46 ATH_CHECK(m_scidTool.retrieve());
47 ATH_CHECK(m_cablingKeySC.initialize());
48 ATH_CHECK(m_cablingKey.initialize());
49 ATH_MSG_DEBUG ("Initializing " << name() << "...");
50
51
52
53 return StatusCode::SUCCESS;
54}
55
56
57StatusCode LArShapeToSCShape::execute(const EventContext& ctx)
58{
59 ATH_MSG_DEBUG ("Executing " << name() << "...");
60
61
62 //Retrieve shape for regular cells
63 const ILArShape* cellShape = nullptr;
64 CHECK(detStore()->retrieve(cellShape,"LArShape"));
65
66 //Retrieve SuperCell id
67 const CaloCell_SuperCell_ID* caloSCID = nullptr;
68 CHECK(detStore()->retrieve(caloSCID));
69
70 //Retrieve SuperCell online id
71 const LArOnline_SuperCellID* onlSCID = nullptr;
72 CHECK(detStore()->retrieve(onlSCID));
73
74
76 const LArOnOffIdMapping* cabling{*cablingHdl};
77 if(!cabling) {
78 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKey.key() );
79 return StatusCode::FAILURE;
80 }
81
83 const LArOnOffIdMapping* cablingSC{*cablingHdlSC};
84 if(!cablingSC) {
85 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKeySC.key() );
86 return StatusCode::FAILURE;
87 }
88
89 const unsigned hashMax=onlSCID->channelHashMax();
90 ATH_MSG_DEBUG("SuperCell online hash max: " << hashMax);
91
92 //Set up AttributeListCollection
93 coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
94 spec->extend("Shape", "blob");
95 spec->extend("ShapeDer", "blob");
96 spec->extend("TimeOffset","blob");
97 spec->extend<unsigned>("nSamples");
98 spec->extend<unsigned>("version");
99
100 unsigned nSamples=32; //Assumption....
101
102 const unsigned blobSize=hashMax*nSamples;
103 ATH_MSG_DEBUG("Shape blob has size " << blobSize);
104
105 coral::AttributeList attrList(*spec);
106 attrList["version"].setValue(0U);
107 coral::Blob& shapeBlob=attrList["Shape"].data<coral::Blob>();
108 coral::Blob& shapeDerBlob=attrList["ShapeDer"].data<coral::Blob>();
109 coral::Blob& toBlob=attrList["TimeOffset"].data<coral::Blob>();
110
111 spec->release();
112 // cppcheck-suppress memleak
113 spec = nullptr;
114
115 attrList["nSamples"].setValue(nSamples);
116 shapeBlob.resize(blobSize*sizeof(float));
117 shapeDerBlob.resize(blobSize*sizeof(float));
118 toBlob.resize(hashMax*sizeof(float));
119
120 float *pShape=static_cast<float*>(shapeBlob.startingAddress());
121 float *pShapeDer=static_cast<float*>(shapeDerBlob.startingAddress());
122 float *pTimeOffset=static_cast<float*>(toBlob.startingAddress());
123
124
125 //Initialize blobs to ERRORCODE
126 for (unsigned i=0;i<blobSize;++i) {
127 pShape[i]=LArElecCalib::ERRORCODE;
128 pShapeDer[i]=LArElecCalib::ERRORCODE;
129 }
130
131 //Initialize time-offset blob to 0.0
132 for (unsigned i=0;i<hashMax;++i) {
133 pTimeOffset[i]=0.0;
134 }
135
136 unsigned nTileIds=0;
137 unsigned nTotalIds=0;
138 auto scIt=caloSCID->cell_begin();
139 auto scIt_e=caloSCID->cell_end();
140 for (;scIt!=scIt_e;++scIt) {
141 ++nTotalIds;
142 const Identifier scId=*scIt;
143 if (caloSCID->is_tile(scId)) {
144 ++nTileIds;
145 continue;
146 }
147 //const IdentifierHash scHash=caloSCID->calo_cell_hash(scId);
148 const std::vector<Identifier> &cellIds=m_scidTool->superCellToOfflineID(scId);
149 if (cellIds.empty()) {
150 ATH_MSG_ERROR("Got empty vector of cell ids for super cell id 0x"
151 << std::hex << scId.get_compact());
152 return StatusCode::FAILURE;
153 }
154 const Identifier cellId=cellIds[0];
155
156 //Get online hash (via online identifier):
157 const HWIdentifier scOnlId=cablingSC->createSignalChannelID(scId);
158 const IdentifierHash scOnlHash=onlSCID->channel_Hash(scOnlId);
159
160 auto shape=cellShape->Shape(cabling->createSignalChannelID(cellId),0);
161 auto shapeDer=cellShape->ShapeDer(cabling->createSignalChannelID(cellId),0);
162 //consistency check
163 if (nSamples!=shape.size() || nSamples!=shapeDer.size()) {
164 ATH_MSG_ERROR("Inconsistent number of samples!");
165 ATH_MSG_ERROR("Expected" << nSamples << ", Shape:" << shape.size() << ", ShapeDer:" << shapeDer.size());
166 return StatusCode::FAILURE;
167 }
168 for (unsigned i=0;i<nSamples;++i) {
169 pShape[scOnlHash*nSamples+i]=shape[i];
170 pShapeDer[scOnlHash*nSamples+i]=shapeDer[i];
171
172 }
173
174 }//end loop over super-cells
175
176 //Add to collection
178 CHECK(detStore()->record(coll,"/LAR/ElecCalibSC/Shape"));
179 coll->add(0,attrList);
180
181 ATH_MSG_INFO("Total number of SuperCells:" << nTotalIds << ", Tile:" << nTileIds
182 << ", LAr: " << nTotalIds-nTileIds);
183 LArShapeSC* scShape=new LArShapeSC(coll);
184 CHECK(detStore()->record(scShape,"ShapeSC"));
185
186 return StatusCode::SUCCESS;
187}
188
#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)
Helper class for offline supercell identifiers.
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.
Defines a common ERRORCODE enum for LAr-Calibration objects.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
const ServiceHandle< StoreGateSvc > & detStore() const
id_iterator cell_begin() const
begin iterator over full set of Identifiers (LAr + Tiles)
id_iterator cell_end() const
end iterator over full set of Identifiers (LAr + Tiles)
bool is_tile(const Identifier id) const
test if the id belongs to the Tiles
Helper class for offline supercell identifiers.
This class is a collection of AttributeLists where each one is associated with a channel number.
bool add(ChanNum chanNum, const AttributeList &attributeList)
Adding in chan/attrList pairs.
virtual ShapeRef_t Shape(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0
virtual ShapeRef_t ShapeDer(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0
This is a "hash" representation of an Identifier.
value_type get_compact() const
Get the compact id.
HWIdentifier createSignalChannelID(const Identifier &id) const
create a HWIdentifier from an Identifier (not inline)
IdentifierHash channel_Hash(HWIdentifier channelId) const
Create channel_hash from channel_Id.
size_type channelHashMax() const
Define channel hash tables max size.
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKeySC
virtual StatusCode initialize() override
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
virtual ~LArShapeToSCShape()
Destructor:
LArShapeToSCShape()
Default constructor:
ToolHandle< ICaloSuperCellIDTool > m_scidTool