ATLAS Offline Software
Loading...
Searching...
No Matches
CaloCalibHitFillerTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
11
12
15#include "GaudiKernel/ServiceHandle.h"
25#include "CaloDetDescr/CaloDetDescrElement.h"
27#include <sstream>
28
29
30namespace D3PD {
31
32
34 (const std::string& type,
35 const std::string& name,
36 const IInterface* parent)
37 : BlockFillerTool<CaloCalibrationHit> (type, name, parent),
38 m_dm_ddm(0),
39 m_emid(0),
40 m_fcalid(0),
41 m_hecid(0),
42 m_tileid(0),
43 m_onlineid(0),
44 m_cellid(0),
45 m_dmid(0),
46 m_isDM(false),
47 m_isbasic(true),
48 m_savepartID(false), m_savefullID(false),
49 m_savetoten(true), m_savevisen(true),m_saveallen(false)
50{
51 declareProperty("isDeadMaterial",m_isDM);
52 declareProperty("isBasic",m_isbasic);
53 declareProperty("SaveParticleID",m_savepartID);
54 declareProperty("SaveFullCellID",m_savefullID);
55 declareProperty("SaveTotalEnergy",m_savetoten);
56 declareProperty("SaveVisibleEnergy",m_savevisen);
57 declareProperty("SaveAllEnergies",m_saveallen);
59}
60
61
63{
64 ServiceHandle<StoreGateSvc> detStore("DetectorStore", name());
65 ATH_CHECK ( detStore.retrieve() );
66
67 ATH_CHECK ( m_caloMgrKey.initialize() );
68 ATH_CHECK ( detStore->retrieve(m_emid) );
69 ATH_CHECK ( detStore->retrieve(m_fcalid) );
70 ATH_CHECK ( detStore->retrieve(m_hecid) );
71 ATH_CHECK ( detStore->retrieve(m_tileid) );
72 ATH_CHECK ( detStore->retrieve(m_onlineid));
73 if(m_isDM) {
74 ATH_CHECK ( detStore->retrieve(m_dmid) );
76 if(!m_dm_ddm) {
77 std::cout<<"Could not get CaloDmDescrManager"<<std::endl;
78 return StatusCode::FAILURE;
79 }
80 } else {
81 ATH_CHECK ( detStore->retrieve(m_cellid) );
82 }
83
84 if(m_saveallen) { m_savetoten = false; m_savevisen = false; }
85
86 return StatusCode::SUCCESS;
87}
88
89
94{
95
96
97 if(m_isbasic) {
98 CHECK( addVariable ("eta", m_eta) );
99 CHECK( addVariable ("phi", m_phi) );
100 }
101 if(m_savepartID) {
102 CHECK( addVariable ("particleID", m_particleID) );
103 }
104 if(m_savefullID){
105 if(m_isDM) {
106 CHECK( addVariable ("detzside", m_det) );
107 CHECK( addVariable ("type", m_side) );
108 CHECK( addVariable ("sampling", m_sam) );
109 CHECK( addVariable ("region", m_reg) );
110 CHECK( addVariable ("ieta", m_etatow) );
111 CHECK( addVariable ("iphi", m_phimod) );
112 } else {
113 CHECK( addVariable ("detector", m_det) );
114 CHECK( addVariable ("sample", m_sam) );
115 CHECK( addVariable ("side", m_side) );
116 CHECK( addVariable ("reg_sec", m_reg) );
117 CHECK( addVariable ("eta_tower", m_etatow) );
118 CHECK( addVariable ("phi_module", m_phimod) );
119 }
120 }
121 if(m_isbasic){
122 CHECK( addVariable ("ID", m_id) );
123 }
124 if(m_savetoten && m_isbasic) {
125 CHECK( addVariable ("EnergyTot", m_etot) );
126 }
127 if(m_savevisen && m_isbasic) {
128 CHECK( addVariable ("EnergyVis", m_evis) );
129 }
130 if(m_saveallen) {
131 CHECK( addVariable ("EnergyEm", m_e_em) );
132 CHECK( addVariable ("EnergyNonEm",m_e_nonem) );
133 CHECK( addVariable ("EnergyInv", m_e_inv) );
134 CHECK( addVariable ("EnergyEsc", m_e_esc) );
135
136 }
137 return StatusCode::SUCCESS;
138}
139
140
150{
151 MsgStream log(msgSvc(), name());
152
153 Identifier id = p.cellID();
154
155 // Check if we have good ID
156 if(m_isDM && (! (m_dmid->is_lar(id) || m_dmid->is_tile(id)))) {
157 ATH_MSG_ERROR( "Should be DM calibration hit, but do not have DM identifier: "<<id.getString() );
158 return StatusCode::FAILURE;
159 }
160 //bool fcal = m_tileid->is_lar_fcal(id);
161
162 if(m_saveallen) {
163 *m_e_em = p.energyEM();
164 *m_e_nonem = p.energyNonEM();
165 *m_e_inv = p.energyInvisible();
166 *m_e_esc = p.energyEscaped();
167 }
168 if(m_savetoten && m_isbasic) *m_etot=p.energyTotal();
169 if(m_savevisen && m_isbasic) *m_evis=p.energyEM() + p.energyNonEM();
170
171 if(m_isbasic) {
172 if(!m_isDM) {
174 ATH_CHECK(caloMgrHandle.isValid());
175 const CaloDetDescrElement* dde = (*caloMgrHandle)->get_element(id);
176 if(dde) {
177 *m_eta = dde->eta();
178 *m_phi = dde->phi();
179 }
180 } else {
181 const CaloDmDescrElement *el = m_dm_ddm->get_element(id);
182 if(el) {
183 *m_eta = el->eta();
184 *m_phi = el->phi();
185 }
186 }
187 }
188 if(m_savefullID){
189 if(m_isDM) {
190 *m_det = m_dmid->pos_neg_z(id);
191 *m_side = m_dmid->dmat(id);
192 *m_sam = m_dmid->sampling(id);
193 *m_reg = m_dmid->region(id);
194 *m_etatow = m_dmid->eta(id);
195 *m_phimod = m_dmid->phi(id);
196 } else {
197 *m_det = m_cellid->sub_calo(id);
198 *m_sam = m_cellid->calo_sample(id);
199 if(m_cellid->is_tile(id)) {
200 *m_side = m_cellid->side(id);
201 *m_reg = m_cellid->section(id);
202 *m_etatow = m_cellid->tower(id);
203 *m_phimod = m_cellid->module(id);
204 } else {
205 *m_side = m_cellid->pos_neg(id);
206 *m_reg = m_cellid->region(id);
207 *m_etatow = m_cellid->eta(id);
208 *m_phimod = m_cellid->phi(id);
209 }
210 }
211 }
212 if(m_isbasic){
214 }
215
216 return StatusCode::SUCCESS;
217}
218
219
220
222{
223 if(!m_isDM) {
224 // AtlasID bit (4)
225 // 1 : lar_em
226 // 2 : lar_hec
227 // 3 : lar_fcal
228 // 4 : tile
229 unsigned ATbit1 = m_emid->is_lar_em(cellID) ? (1<<0) : 0;
230 unsigned ATbit2 = m_hecid->is_lar_hec(cellID) ? (1<<1) : 0;
231 unsigned ATbit3 = m_fcalid->is_lar_fcal(cellID) ? (1<<2) : 0;
232 unsigned ATbit4 = m_tileid->is_tile(cellID) ? (1<<3) : 0;
233 unsigned ATbit = (ATbit1 | ATbit2 | ATbit3 | ATbit4);
234
235 //std::cout << "ATLAS Calo(EM,HEC,FCal,Tile) : " << ATbit1 << " " << ATbit2 << " " << ATbit3 << " " << ATbit4 << std::endl;
236
237 // EM bit (5)
238 // 1-2 : sampling
239 // 0,1,2,3
240 // 0 presampler
241 // 1,2,3 each layer
242 // 3 : barrel
243 // 4 : endcap_inner
244 // 5 : endcap_outer
245 unsigned EMbit1 = 0;
246 unsigned EMbit3 = 0;
247 unsigned EMbit4 = 0;
248 unsigned EMbit5 = 0;
249 if (ATbit1) {
250 EMbit1 = unsigned(m_emid->sampling(cellID));
251 EMbit3 = m_emid->is_em_barrel(cellID) ? (1<<2) : 0;
252 EMbit4 = m_emid->is_em_endcap_inner(cellID) ? (1<<3) : 0;
253 EMbit5 = m_emid->is_em_endcap_outer(cellID) ? (1<<4) : 0;
254 }
255 unsigned EMbit = (EMbit1 | EMbit3 | EMbit4 | EMbit5);
256
257 //std::cout << "EM : " << EMbit1 << " " << EMbit3 << " " << EMbit4 << " " << EMbit5 << std::endl;
258
259 // HEC (2)
260 // 1-2: sampling
261 // 0,1 = first wheel
262 // 2,3 = second wheel
263 unsigned HCbit1 = 0;
264 if (ATbit2) {
265 HCbit1 = unsigned(m_hecid->sampling(cellID));
266 }
267 unsigned HCbit = HCbit1;
268
269 //std::cout << "HEC : " << HCbit1 << std::endl;
270
271 // FCal (2)
272 // 1-2 : module
273 // 1,2,3
274 // 1 EM
275 // 2,3 Hadronic
276 //
277 unsigned FCbit1 = 0;
278 if (ATbit3) {
279 FCbit1 = unsigned(m_fcalid->module(cellID));
280 }
281 unsigned FCbit = FCbit1;
282
283 //std::cout << "FCal : " << FCbit1 << std::endl;
284
285 // Tile bit (8)
286 // 1-3 : sample
287 // 0 = SAMP_A
288 // 1 = SAMP_B, SAMP_BC, SAMP_C
289 // 2 = SAMP_D
290 // 3 = SAMP_E
291 // 4 = SAMP_X
292 // 4 : barrel
293 // 5 : extbarrel
294 // 6 : gap
295 // 7 : gapscin
296 unsigned TLbit1 = 0;
297 unsigned TLbit4 = 0;
298 unsigned TLbit5 = 0;
299 unsigned TLbit6 = 0;
300 unsigned TLbit7 = 0;
301 if (ATbit4) {
302 TLbit1 = unsigned(m_tileid->sample(cellID));
303 TLbit4 = m_tileid->is_tile_barrel(cellID) ? (1<<3) : 0;
304 TLbit5 = m_tileid->is_tile_extbarrel(cellID) ? (1<<4) : 0;
305 TLbit6 = m_tileid->is_tile_gap(cellID) ? (1<<5) : 0;
306 TLbit7 = m_tileid->is_tile_gapscin(cellID) ? (1<<6) : 0;
307 }
308 unsigned TLbit = (TLbit1 | TLbit4 | TLbit5 | TLbit6 | TLbit7);
309
310 //std::cout << "Tile : " << TLbit1 << " " << TLbit4 << " " << TLbit5 << " " << TLbit6 << " " << TLbit7 << std::endl;
311
312 unsigned int CombBit = (ATbit | (EMbit<<4) | (HCbit<<9) |
313 (FCbit<<11) | (TLbit<<13));
314
315 return CombBit;
316 } else { // How to code the DM identifier ?
317 unsigned int SideBit = 0; // bit 0
318 if(m_dmid->pos_neg_z(cellID) < 0) SideBit = 1;
319 unsigned int DetBit = 0; // bit 1
320 if(m_dmid->is_tile(cellID)) DetBit = (1<<1);
321 unsigned int TypeBit = m_dmid->dmat(cellID)<<2; // bit 2-3
322 unsigned int SamplBit = m_dmid->sampling(cellID)<<4; // bit 4-5
323 unsigned int RegionBit = m_dmid->region(cellID)<<6; // bit 6-8
324 unsigned int EtaBit = m_dmid->eta(cellID)<<9; // bit 9-14
325 unsigned int PhiBit = m_dmid->phi(cellID)<<15; // bit 15-21
326 unsigned int CombBit = (SideBit | DetBit | TypeBit | SamplBit | RegionBit | EtaBit | PhiBit);
327 return CombBit;
328 }
329}
330
331
332
333} // namespace D3PD
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
Class to store calorimeter calibration hit.
This class groups all DetDescr information related to a CaloCell.
static const CaloDmDescrManager * instance()
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 initialize() override
Standard Gaudi initialize method.
virtual StatusCode fill(const CaloCalibrationHit &p) override
Fill one block — type-safe version.
unsigned int CaloHit_GetDetectorInfo(Identifier &HitID)
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
const CaloDmDescrManager * m_dm_ddm
float * m_eta
Variable: time, quality and id.
CaloCalibHitFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
virtual StatusCode book() override
Book variables for this block.
Block filler tool for noisy FEB information.