ATLAS Offline Software
Loading...
Searching...
No Matches
CaloCellDetailsFillerTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 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 CaloCell* cell = &c;
122
123
124 Identifier id = cell->ID();
125
126 if (m_savePosition) {
127 *m_xCells = cell->x() ;
128 *m_yCells = cell->y() ;
129 *m_zCells = cell->z() ;
130 if (std::abs (*m_zCells) < 1e-8) *m_zCells = 0;
131 }
132
133// pack into one work the quality and provenance information
134
135 if (m_saveCellQuality) {
136 int quality = ( (cell->quality()&0xFFFF) | ((cell->provenance()&0xFFFF) <<16));
137 *m_fitQCells = quality;
138 }
139 if (m_saveCellGain) *m_gainCells = cell->gain();
140 if (m_saveTimeInfo) *m_timeCells =cell->time() ;
141
142 if (m_saveDetInfo)
144
145
146 if (m_saveId) *m_offId = id.get_identifier32().get_compact() ;
147 if (m_saveCellStatus) *m_badCell = m_pb_tool->caloStatus(id).packedData() ;
148
149 if (!m_caloNoiseKey.empty()) {
151 *m_sigma = caloNoise-> getNoise(cell->ID(), cell->gain());
152 }
153
154 return StatusCode::SUCCESS ;
155}
156
157
158
159
160unsigned
162{
163 const CaloDetDescriptor& desc = *cell.caloDDE()->descriptor();
164 const CaloCell_Base_ID& calo_id = *desc.get_calo_helper();
165 Identifier cellID = cell.ID();
166
167 // AtlasID bit (4)
168 // 1 : lar_em
169 // 2 : lar_hec
170 // 3 : lar_fcal
171 // 4 : tile
172 unsigned ATbit1 = desc.is_lar_em() ? (1<<0) : 0;
173 unsigned ATbit2 = desc.is_lar_hec() ? (1<<1) : 0;
174 unsigned ATbit3 = desc.is_lar_fcal() ? (1<<2) : 0;
175 unsigned ATbit4 = desc.is_tile() ? (1<<3) : 0;
176 unsigned ATbit = (ATbit1 | ATbit2 | ATbit3 | ATbit4);
177
178 //std::cout << "ATLAS Calo(EM,HEC,FCal,Tile) : " << ATbit1 << " " << ATbit2 << " " << ATbit3 << " " << ATbit4 << std::endl;
179
180 // EM bit (5)
181 // 1-2 : sampling
182 // 0,1,2,3
183 // 0 presampler
184 // 1,2,3 each layer
185 // 3 : barrel
186 // 4 : endcap_inner
187 // 5 : endcap_outer
188 unsigned EMbit1 = 0;
189 unsigned EMbit3 = 0;
190 unsigned EMbit4 = 0;
191 unsigned EMbit5 = 0;
192 if (ATbit1) {
193 const LArEM_Base_ID& emid = *calo_id.em_idHelper();
194 EMbit1 = unsigned(emid.sampling(cellID));
195 EMbit3 = emid.is_em_barrel(cellID) ? (1<<2) : 0;
196 EMbit4 = emid.is_em_endcap_inner(cellID) ? (1<<3) : 0;
197 EMbit5 = emid.is_em_endcap_outer(cellID) ? (1<<4) : 0;
198 }
199 unsigned EMbit = (EMbit1 | EMbit3 | EMbit4 | EMbit5);
200
201 //std::cout << "EM : " << EMbit1 << " " << EMbit3 << " " << EMbit4 << " " << EMbit5 << std::endl;
202
203 // HEC (2)
204 // 1-2: sampling
205 // 0,1 = first wheel
206 // 2,3 = second wheel
207 unsigned HCbit1 = 0;
208 if (ATbit2) {
209 const LArHEC_Base_ID& hecid = *calo_id.hec_idHelper();
210 HCbit1 = unsigned(hecid.sampling(cellID));
211 }
212 unsigned HCbit = HCbit1;
213
214 //std::cout << "HEC : " << HCbit1 << std::endl;
215
216 // FCal (2)
217 // 1-2 : module
218 // 1,2,3
219 // 1 EM
220 // 2,3 Hadronic
221 //
222 unsigned FCbit1 = 0;
223 if (ATbit3) {
224 const LArFCAL_Base_ID& fcalid = *calo_id.fcal_idHelper();
225 FCbit1 = unsigned(fcalid.module(cellID));
226 }
227 unsigned FCbit = FCbit1;
228
229 //std::cout << "FCal : " << FCbit1 << std::endl;
230
231 // Tile bit (8)
232 // 1-3 : sample
233 // 0 = SAMP_A
234 // 1 = SAMP_B, SAMP_BC, SAMP_C
235 // 2 = SAMP_D
236 // 3 = SAMP_E
237 // 4 = SAMP_X
238 // 4 : barrel
239 // 5 : extbarrel
240 // 6 : gap
241 // 7 : gapscin
242 unsigned TLbit1 = 0;
243 unsigned TLbit4 = 0;
244 unsigned TLbit5 = 0;
245 unsigned TLbit6 = 0;
246 unsigned TLbit7 = 0;
247 if (ATbit4) {
248 const Tile_Base_ID& tileid = *calo_id.tile_idHelper();
249 TLbit1 = unsigned(tileid.sample(cellID));
250 TLbit4 = tileid.is_tile_barrel(cellID) ? (1<<3) : 0;
251 TLbit5 = tileid.is_tile_extbarrel(cellID) ? (1<<4) : 0;
252 TLbit6 = tileid.is_tile_gap(cellID) ? (1<<5) : 0;
253 TLbit7 = tileid.is_tile_gapscin(cellID) ? (1<<6) : 0;
254 }
255 unsigned TLbit = (TLbit1 | TLbit4 | TLbit5 | TLbit6 | TLbit7);
256
257 //std::cout << "Tile : " << TLbit1 << " " << TLbit4 << " " << TLbit5 << " " << TLbit6 << " " << TLbit7 << std::endl;
258
259 unsigned CombBit = (ATbit | (EMbit<<4) | (HCbit<<9) |
260 (FCbit<<11) | (TLbit<<13));
261
262 return CombBit;
263}
264
265
266} // 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.