ATLAS Offline Software
LArShapeToSCShape.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 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
31  ISvcLocator* pSvcLocator ) :
32  ::AthAlgorithm( name, pSvcLocator )
33 {
34 }
35 
36 // Destructor
39 {}
40 
41 // Athena Algorithm's Hooks
44 {
45 
46  ATH_CHECK(m_scidTool.retrieve());
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  //Retrive 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 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LArOnlineID_Base::channel_Hash
IdentifierHash channel_Hash(HWIdentifier channelId) const
Create channel_hash from channel_Id.
Definition: LArOnlineID_Base.cxx:1636
LArShapeToSCShape::LArShapeToSCShape
LArShapeToSCShape()
Default constructor:
CondAttrListCollection.h
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloCondBlobAlgs_fillNoiseFromASCII.spec
spec
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:47
LArShapeToSCShape::m_cablingKeySC
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKeySC
Definition: LArShapeToSCShape.h:42
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
ILArShape::ShapeDer
virtual ShapeRef_t ShapeDer(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0
CaloCell_Base_ID::cell_end
id_iterator cell_end(void) const
end iterator over full set of Identifiers (LAr + Tiles)
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
CaloCell_Base_ID::is_tile
bool is_tile(const Identifier id) const
test if the id belongs to the Tiles
LArShapeToSCShape::~LArShapeToSCShape
virtual ~LArShapeToSCShape()
Destructor:
Definition: LArShapeToSCShape.cxx:38
HWIdentifier
Definition: HWIdentifier.h:13
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
LArCalibErrorCode.h
Defines a common ERRORCODE enum for LAr-Calibration objects.
ICaloSuperCellIDTool.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
LArShapeToSCShape::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: LArShapeToSCShape.h:43
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CaloCell_SuperCell_ID
Helper class for offline supercell identifiers.
Definition: CaloCell_SuperCell_ID.h:48
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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
CaloCell_SuperCell_ID.h
Helper class for offline supercell identifiers.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
CaloCell_Base_ID::cell_begin
id_iterator cell_begin(void) const
begin iterator over full set of Identifiers (LAr + Tiles)
AthAlgorithm
Definition: AthAlgorithm.h:47
ILArShape.h
LArShapeSC.h
LArShapeToSCShape::execute
virtual StatusCode execute() override
Definition: LArShapeToSCShape.cxx:57
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
LArOnlineID_Base::channelHashMax
size_type channelHashMax(void) const
Define channel hash tables max size.
Definition: LArOnlineID_Base.cxx:1901
errorcheck.h
Helpers for checking error return status codes and reporting errors.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArOnline_SuperCellID
Definition: LArOnline_SuperCellID.h:20
LArShapeToSCShape::initialize
virtual StatusCode initialize() override
Definition: LArShapeToSCShape.cxx:43
LArShapeToSCShape.h
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
LArOnline_SuperCellID.h
LArShapeSC
Definition: LArShapeSC.h:19
LArElecCalib::ERRORCODE
@ ERRORCODE
Definition: LArCalibErrorCode.h:17
LArDigits2NtupleDumper.nSamples
nSamples
Definition: LArDigits2NtupleDumper.py:70
LArShapeToSCShape::m_scidTool
ToolHandle< ICaloSuperCellIDTool > m_scidTool
Definition: LArShapeToSCShape.h:47
IdentifierHash
Definition: IdentifierHash.h:38
ILArShape
Definition: ILArShape.h:13
CondAttrListCollection::add
bool add(ChanNum chanNum, const AttributeList &attributeList)
Adding in chan/attrList pairs.
Definition: CondAttrListCollection.h:452
LArOnOffIdMapping
Definition: LArOnOffIdMapping.h:20
ILArShape::Shape
virtual ShapeRef_t Shape(const HWIdentifier &id, int gain, int tbin=0, int mode=0) const =0