ATLAS Offline Software
Loading...
Searching...
No Matches
CaloCellDetailsFillerTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
11
12
14
15#include "GaudiKernel/StatusCode.h"
16#include "CLHEP/Units/SystemOfUnits.h"
17
22
23#include "CaloEvent/CaloCell.h"
26#include <sstream>
27#include <cmath>
28
29namespace D3PD {
30
38 (const std::string& type,
39 const std::string& name,
40 const IInterface* parent)
41 : BlockFillerTool<CaloCell> (type, name, parent),
42 m_saveCellGain(false), m_saveCellQuality(false),
44 m_saveId(false),m_savePosition(false), m_saveSigma(false),
45 m_useNoise(false)
46{
47
48 declareProperty("SaveCellGain",m_saveCellGain);
49 declareProperty("SaveCellQuality",m_saveCellQuality);
50 declareProperty("SaveDetInfo",m_saveDetInfo);
51 declareProperty("SaveTimeInfo",m_saveTimeInfo);
52 declareProperty("SaveBadCellStatus",m_saveCellStatus);
53 declareProperty("SaveId",m_saveId);
54 declareProperty("SavePositionInfo",m_savePosition);
55 declareProperty("SaveSigma",m_saveSigma);
56
57 m_fitQCells = 0;
58 m_gainCells = 0;
59 m_xCells = 0;
60 m_yCells = 0;
61 m_zCells = 0;
62 m_detCells = 0;
63 m_timeCells = 0;
64 m_badCell = 0;
65 m_offId = 0;
66 m_sigma = 0;
67}
68
69
71{
72 if (m_saveCellStatus) {
73 CHECK( m_pb_tool.retrieve());
74 }
75
76
77 // retrieve the noise tool
78 if(m_saveSigma) m_useNoise = true;
79 if (m_useNoise) {
80 CHECK( m_caloNoiseKey.initialize (SG::AllowEmpty) );
81 }
82 else {
83 CHECK( m_caloNoiseKey.initialize (false) );
84 }
85
86 return StatusCode::SUCCESS;
87}
88
89
94{
96 if (m_saveCellGain) CHECK( addVariable ("GainCells",m_gainCells) );
97
98
99 if (m_savePosition) {
100 CHECK( addVariable ("xCells", m_xCells) );
101 CHECK( addVariable ("yCells", m_yCells) );
102 CHECK( addVariable ("zCells", m_zCells) );
103 }
104
105 if (m_saveDetInfo) CHECK( addVariable ("DetCells",m_detCells));
106 if (m_saveTimeInfo) CHECK( addVariable ("TimeCells",m_timeCells));
107 if (m_saveCellStatus) CHECK( addVariable ("BadCells",m_badCell));
108 if (m_saveId) CHECK( addVariable ("IdCells",m_offId) );
109
110 if (m_saveSigma) CHECK( addVariable ("Sigma", m_sigma) );
111
112
113 return StatusCode::SUCCESS;
114
115}
116
117
118
120{
121 const EventContext& ctx = Gaudi::Hive::currentContext();
122 const CaloCell* cell = &c;
123 const Identifier id = cell->ID();
124
125 if (m_savePosition) {
126 *m_xCells = cell->x() ;
127 *m_yCells = cell->y() ;
128 *m_zCells = cell->z() ;
129 if (std::abs (*m_zCells) < 1e-8) *m_zCells = 0;
130 }
131
132// pack into one work the quality and provenance information
133
134 if (m_saveCellQuality) {
135 int quality = ( (cell->quality()&0xFFFF) | ((cell->provenance()&0xFFFF) <<16));
136 *m_fitQCells = quality;
137 }
138 if (m_saveCellGain) *m_gainCells = cell->gain();
139 if (m_saveTimeInfo) *m_timeCells =cell->time() ;
140
141 if (m_saveDetInfo)
143
144
145 if (m_saveId) *m_offId = id.get_identifier32().get_compact() ;
146 if (m_saveCellStatus) *m_badCell = m_pb_tool->caloStatus(ctx, id).packedData() ;
147
148 if (!m_caloNoiseKey.empty()) {
150 *m_sigma = caloNoise-> getNoise(cell->ID(), cell->gain());
151 }
152
153 return StatusCode::SUCCESS ;
154}
155
156
157
158
159unsigned
161{
162 const CaloDetDescriptor& desc = *cell.caloDDE()->descriptor();
163 const CaloCell_Base_ID& calo_id = *desc.get_calo_helper();
164 Identifier cellID = cell.ID();
165
166 // AtlasID bit (4)
167 // 1 : lar_em
168 // 2 : lar_hec
169 // 3 : lar_fcal
170 // 4 : tile
171 unsigned ATbit1 = desc.is_lar_em() ? (1<<0) : 0;
172 unsigned ATbit2 = desc.is_lar_hec() ? (1<<1) : 0;
173 unsigned ATbit3 = desc.is_lar_fcal() ? (1<<2) : 0;
174 unsigned ATbit4 = desc.is_tile() ? (1<<3) : 0;
175 unsigned ATbit = (ATbit1 | ATbit2 | ATbit3 | ATbit4);
176
177 //std::cout << "ATLAS Calo(EM,HEC,FCal,Tile) : " << ATbit1 << " " << ATbit2 << " " << ATbit3 << " " << ATbit4 << std::endl;
178
179 // EM bit (5)
180 // 1-2 : sampling
181 // 0,1,2,3
182 // 0 presampler
183 // 1,2,3 each layer
184 // 3 : barrel
185 // 4 : endcap_inner
186 // 5 : endcap_outer
187 unsigned EMbit1 = 0;
188 unsigned EMbit3 = 0;
189 unsigned EMbit4 = 0;
190 unsigned EMbit5 = 0;
191 if (ATbit1) {
192 const LArEM_Base_ID& emid = *calo_id.em_idHelper();
193 EMbit1 = unsigned(emid.sampling(cellID));
194 EMbit3 = emid.is_em_barrel(cellID) ? (1<<2) : 0;
195 EMbit4 = emid.is_em_endcap_inner(cellID) ? (1<<3) : 0;
196 EMbit5 = emid.is_em_endcap_outer(cellID) ? (1<<4) : 0;
197 }
198 unsigned EMbit = (EMbit1 | EMbit3 | EMbit4 | EMbit5);
199
200 //std::cout << "EM : " << EMbit1 << " " << EMbit3 << " " << EMbit4 << " " << EMbit5 << std::endl;
201
202 // HEC (2)
203 // 1-2: sampling
204 // 0,1 = first wheel
205 // 2,3 = second wheel
206 unsigned HCbit1 = 0;
207 if (ATbit2) {
208 const LArHEC_Base_ID& hecid = *calo_id.hec_idHelper();
209 HCbit1 = unsigned(hecid.sampling(cellID));
210 }
211 unsigned HCbit = HCbit1;
212
213 //std::cout << "HEC : " << HCbit1 << std::endl;
214
215 // FCal (2)
216 // 1-2 : module
217 // 1,2,3
218 // 1 EM
219 // 2,3 Hadronic
220 //
221 unsigned FCbit1 = 0;
222 if (ATbit3) {
223 const LArFCAL_Base_ID& fcalid = *calo_id.fcal_idHelper();
224 FCbit1 = unsigned(fcalid.module(cellID));
225 }
226 unsigned FCbit = FCbit1;
227
228 //std::cout << "FCal : " << FCbit1 << std::endl;
229
230 // Tile bit (8)
231 // 1-3 : sample
232 // 0 = SAMP_A
233 // 1 = SAMP_B, SAMP_BC, SAMP_C
234 // 2 = SAMP_D
235 // 3 = SAMP_E
236 // 4 = SAMP_X
237 // 4 : barrel
238 // 5 : extbarrel
239 // 6 : gap
240 // 7 : gapscin
241 unsigned TLbit1 = 0;
242 unsigned TLbit4 = 0;
243 unsigned TLbit5 = 0;
244 unsigned TLbit6 = 0;
245 unsigned TLbit7 = 0;
246 if (ATbit4) {
247 const Tile_Base_ID& tileid = *calo_id.tile_idHelper();
248 TLbit1 = unsigned(tileid.sample(cellID));
249 TLbit4 = tileid.is_tile_barrel(cellID) ? (1<<3) : 0;
250 TLbit5 = tileid.is_tile_extbarrel(cellID) ? (1<<4) : 0;
251 TLbit6 = tileid.is_tile_gap(cellID) ? (1<<5) : 0;
252 TLbit7 = tileid.is_tile_gapscin(cellID) ? (1<<6) : 0;
253 }
254 unsigned TLbit = (TLbit1 | TLbit4 | TLbit5 | TLbit6 | TLbit7);
255
256 //std::cout << "Tile : " << TLbit1 << " " << TLbit4 << " " << TLbit5 << " " << TLbit6 << " " << TLbit7 << std::endl;
257
258 unsigned CombBit = (ATbit | (EMbit<<4) | (HCbit<<9) |
259 (FCbit<<11) | (TLbit<<13));
260
261 return CombBit;
262}
263
264
265} // end of D3PD namespace
Block filler tool for CaloCell, implementing similar features of CBNTAA_CaloCell.
Helper base class for offline cell identifiers.
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
Helper base class for offline cell identifiers.
const LArFCAL_Base_ID * fcal_idHelper() const
access to FCAL idHelper
const LArHEC_Base_ID * hec_idHelper() const
access to HEC idHelper
const Tile_Base_ID * tile_idHelper() const
access to Tile idHelper
const LArEM_Base_ID * em_idHelper() const
access to EM idHelper
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
This is a base class for LAr and Tile Descriptors The primary goal is to speed up loops over all the ...
virtual StatusCode addVariable(const std::string &name, const std::type_info &ti, void *&ptr, const std::string &docstring="", const void *defval=0)
Type-safe wrapper for block filler tools.
virtual StatusCode fill(const CaloCell &p) override
Fill one block — type-safe version.
unsigned int CaloCell_GetDetectorInfo(const CaloCell &cell) const
ToolHandle< ICaloBadChanTool > m_pb_tool
CaloCellDetailsFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
SG::ReadCondHandleKey< CaloNoise > m_caloNoiseKey
Key of the CaloNoise Conditions data object.
virtual StatusCode book() override
Book variables for this block.
virtual StatusCode initialize() override
This class factors out code common between LArEM_ID and LArEM_SuperCell_ID.
bool is_em_endcap_outer(const Identifier id) const
test if the id belongs to the EM Endcap outer wheel
bool is_em_barrel(const Identifier id) const
test if the id belongs to the EM barrel
bool is_em_endcap_inner(const Identifier id) const
test if the id belongs to the EM Endcap inner wheel
int sampling(const Identifier id) const
return sampling according to :
This class factors out code common between LArEM_ID and LArEM_SuperCell_ID.
int sampling(const Identifier id) const
return sampling [0,3] (only 0 for supercells)
This class factors out code common between TileID and Tile_SuperCell_ID.
int sample(const Identifier &id) const
bool is_tile_barrel(const Identifier &id) const
Test of an Identifier to see if it belongs to a particular part of the calorimeter.
bool is_tile_extbarrel(const Identifier &id) const
bool is_tile_gap(const Identifier &id) const
bool is_tile_gapscin(const Identifier &id) const
Block filler tool for noisy FEB information.