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
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 const EventContext& ctx = Gaudi::Hive::currentContext();
75
77 const LArOnOffIdMapping* cabling{*cablingHdl};
78 if(!cabling) {
79 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKey.key() );
80 return StatusCode::FAILURE;
81 }
82
84 const LArOnOffIdMapping* cablingSC{*cablingHdlSC};
85 if(!cablingSC) {
86 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKeySC.key() );
87 return StatusCode::FAILURE;
88 }
89
90 const unsigned hashMax=onlSCID->channelHashMax();
91 ATH_MSG_DEBUG("SuperCell online hash max: " << hashMax);
92
93 //Set up AttributeListCollection
94 coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
95 spec->extend("Shape", "blob");
96 spec->extend("ShapeDer", "blob");
97 spec->extend("TimeOffset","blob");
98 spec->extend<unsigned>("nSamples");
99 spec->extend<unsigned>("version");
100
101 unsigned nSamples=32; //Assumption....
102
103 const unsigned blobSize=hashMax*nSamples;
104 ATH_MSG_DEBUG("Shape blob has size " << blobSize);
105
106 coral::AttributeList attrList(*spec);
107 attrList["version"].setValue(0U);
108 coral::Blob& shapeBlob=attrList["Shape"].data<coral::Blob>();
109 coral::Blob& shapeDerBlob=attrList["ShapeDer"].data<coral::Blob>();
110 coral::Blob& toBlob=attrList["TimeOffset"].data<coral::Blob>();
111
112 spec->release();
113 // cppcheck-suppress memleak
114 spec = nullptr;
115
116 attrList["nSamples"].setValue(nSamples);
117 shapeBlob.resize(blobSize*sizeof(float));
118 shapeDerBlob.resize(blobSize*sizeof(float));
119 toBlob.resize(hashMax*sizeof(float));
120
121 float *pShape=static_cast<float*>(shapeBlob.startingAddress());
122 float *pShapeDer=static_cast<float*>(shapeDerBlob.startingAddress());
123 float *pTimeOffset=static_cast<float*>(toBlob.startingAddress());
124
125
126 //Initialize blobs to ERRORCODE
127 for (unsigned i=0;i<blobSize;++i) {
128 pShape[i]=LArElecCalib::ERRORCODE;
129 pShapeDer[i]=LArElecCalib::ERRORCODE;
130 }
131
132 //Initialize time-offset blob to 0.0
133 for (unsigned i=0;i<hashMax;++i) {
134 pTimeOffset[i]=0.0;
135 }
136
137 unsigned nTileIds=0;
138 unsigned nTotalIds=0;
139 auto scIt=caloSCID->cell_begin();
140 auto scIt_e=caloSCID->cell_end();
141 for (;scIt!=scIt_e;++scIt) {
142 ++nTotalIds;
143 const Identifier scId=*scIt;
144 if (caloSCID->is_tile(scId)) {
145 ++nTileIds;
146 continue;
147 }
148 //const IdentifierHash scHash=caloSCID->calo_cell_hash(scId);
149 const std::vector<Identifier> &cellIds=m_scidTool->superCellToOfflineID(scId);
150 if (cellIds.empty()) {
151 ATH_MSG_ERROR("Got empty vector of cell ids for super cell id 0x"
152 << std::hex << scId.get_compact());
153 return StatusCode::FAILURE;
154 }
155 const Identifier cellId=cellIds[0];
156
157 //Get online hash (via online identifier):
158 const HWIdentifier scOnlId=cablingSC->createSignalChannelID(scId);
159 const IdentifierHash scOnlHash=onlSCID->channel_Hash(scOnlId);
160
161 auto shape=cellShape->Shape(cabling->createSignalChannelID(cellId),0);
162 auto shapeDer=cellShape->ShapeDer(cabling->createSignalChannelID(cellId),0);
163 //consistency check
164 if (nSamples!=shape.size() || nSamples!=shapeDer.size()) {
165 ATH_MSG_ERROR("Inconsistent number of samples!");
166 ATH_MSG_ERROR("Expected" << nSamples << ", Shape:" << shape.size() << ", ShapeDer:" << shapeDer.size());
167 return StatusCode::FAILURE;
168 }
169 for (unsigned i=0;i<nSamples;++i) {
170 pShape[scOnlHash*nSamples+i]=shape[i];
171 pShapeDer[scOnlHash*nSamples+i]=shapeDer[i];
172
173 }
174
175 }//end loop over super-cells
176
177 //Add to collection
179 CHECK(detStore()->record(coll,"/LAR/ElecCalibSC/Shape"));
180 coll->add(0,attrList);
181
182 ATH_MSG_INFO("Total number of SuperCells:" << nTotalIds << ", Tile:" << nTileIds
183 << ", LAr: " << nTotalIds-nTileIds);
184 LArShapeSC* scShape=new LArShapeSC(coll);
185 CHECK(detStore()->record(scShape,"ShapeSC"));
186
187 return StatusCode::SUCCESS;
188}
189
#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 with parameters:
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.
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKeySC
virtual StatusCode initialize() override
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
virtual StatusCode execute() override
virtual ~LArShapeToSCShape()
Destructor:
LArShapeToSCShape()
Default constructor:
ToolHandle< ICaloSuperCellIDTool > m_scidTool