ATLAS Offline Software
CaloCellDetailsFillerTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
14 
15 #include "GaudiKernel/StatusCode.h"
16 #include "CLHEP/Units/SystemOfUnits.h"
17 
19 #include "CaloIdentifier/CaloID.h"
22 
23 #include "CaloEvent/CaloCell.h"
26 #include <sstream>
27 #include <cmath>
28 
29 namespace D3PD {
30 
38  (const std::string& type,
39  const std::string& name,
40  const IInterface* parent)
42  m_saveCellGain(false), m_saveCellQuality(false),
43  m_saveDetInfo(false),m_saveTimeInfo(false),m_saveCellStatus(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) {
81  }
82  else {
83  CHECK( m_caloNoiseKey.initialize (false) );
84  }
85 
86  return StatusCode::SUCCESS;
87 }
88 
89 
94 {
95  if (m_saveCellQuality) CHECK( addVariable ("QCells",m_fitQCells) ) ;
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 
160 unsigned
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
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
D3PD::CaloCellDetailsFillerTool::m_fitQCells
int * m_fitQCells
Definition: CaloCellDetailsFillerTool.h:94
D3PD::CaloCellDetailsFillerTool::m_saveId
bool m_saveId
Definition: CaloCellDetailsFillerTool.h:72
LArFCAL_Base_ID
Definition: LArFCAL_Base_ID.h:19
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
D3PD::CaloCellDetailsFillerTool::m_saveDetInfo
bool m_saveDetInfo
Definition: CaloCellDetailsFillerTool.h:69
D3PD::CaloCellDetailsFillerTool::m_savePosition
bool m_savePosition
Definition: CaloCellDetailsFillerTool.h:73
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
LArHEC_Base_ID
This class factors out code common between LArEM_ID and LArEM_SuperCell_ID.
Definition: LArHEC_Base_ID.h:44
LArEM_Base_ID
This class factors out code common between LArEM_ID and LArEM_SuperCell_ID.
Definition: LArEM_Base_ID.h:38
Tile_Base_ID::is_tile_gap
bool is_tile_gap(const Identifier &id) const
Definition: Tile_Base_ID.cxx:223
LArEM_Base_ID::is_em_endcap_outer
bool is_em_endcap_outer(const Identifier id) const
test if the id belongs to the EM Endcap outer wheel
CaloID.h
Tile_Base_ID::sample
int sample(const Identifier &id) const
Definition: Tile_Base_ID.cxx:171
LArFCAL_Base_ID::module
int module(const Identifier id) const
module [1,3]
CaloCell.h
Tile_Base_ID::is_tile_extbarrel
bool is_tile_extbarrel(const Identifier &id) const
Definition: Tile_Base_ID.cxx:214
LArEM_Base_ID::sampling
int sampling(const Identifier id) const
return sampling according to :
D3PD::AddVariable::addVariable
virtual StatusCode addVariable(const std::string &name, const std::type_info &ti, void *&ptr, const std::string &docstring="", const void *defval=0)
Add a variable to the tuple.
Definition: AddVariable.cxx:85
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:662
ReadCondHandle.h
CaloCell_Base_ID::fcal_idHelper
const LArFCAL_Base_ID * fcal_idHelper() const
access to FCAL idHelper
Definition: CaloCell_Base_ID.h:343
D3PD::CaloCellDetailsFillerTool::m_sigma
float * m_sigma
Definition: CaloCellDetailsFillerTool.h:97
D3PD::CaloCellDetailsFillerTool::m_detCells
int * m_detCells
Definition: CaloCellDetailsFillerTool.h:91
CaloCell_Base_ID::em_idHelper
const LArEM_Base_ID * em_idHelper() const
access to EM idHelper
Definition: CaloCell_Base_ID.h:332
D3PD::CaloCellDetailsFillerTool::m_saveSigma
bool m_saveSigma
Definition: CaloCellDetailsFillerTool.h:74
D3PD
Block filler tool for noisy FEB information.
Definition: CaloCellDetailsFillerTool.cxx:29
CaloCondBlobAlgs_fillNoiseFromASCII.desc
desc
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:54
Tile_Base_ID::is_tile_gapscin
bool is_tile_gapscin(const Identifier &id) const
Definition: Tile_Base_ID.cxx:268
D3PD::CaloCellDetailsFillerTool::m_xCells
float * m_xCells
Definition: CaloCellDetailsFillerTool.h:88
D3PD::CaloCellDetailsFillerTool::m_offId
unsigned int * m_offId
Definition: CaloCellDetailsFillerTool.h:96
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
D3PD::CaloCellDetailsFillerTool::book
virtual StatusCode book() override
Book variables for this block.
Definition: CaloCellDetailsFillerTool.cxx:93
Tile_Base_ID
This class factors out code common between TileID and Tile_SuperCell_ID.
Definition: Tile_Base_ID.h:39
ICaloBadChanTool.h
CaloCell_Base_ID.h
Helper base class for offline cell identifiers.
test_pyathena.parent
parent
Definition: test_pyathena.py:15
D3PD::CaloCellDetailsFillerTool::m_saveCellGain
bool m_saveCellGain
Definition: CaloCellDetailsFillerTool.h:67
D3PD::BlockFillerTool
Type-safe wrapper for block filler tools.
Definition: BlockFillerTool.h:68
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
D3PD::CaloCellDetailsFillerTool::m_saveTimeInfo
bool m_saveTimeInfo
Definition: CaloCellDetailsFillerTool.h:70
D3PD::CaloCellDetailsFillerTool::m_gainCells
int * m_gainCells
Definition: CaloCellDetailsFillerTool.h:95
D3PD::CaloCellDetailsFillerTool::m_zCells
float * m_zCells
Definition: CaloCellDetailsFillerTool.h:90
D3PD::CaloCellDetailsFillerTool::CaloCellDetailsFillerTool
CaloCellDetailsFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
Definition: CaloCellDetailsFillerTool.cxx:38
D3PD::CaloCellDetailsFillerTool::m_caloNoiseKey
SG::ReadCondHandleKey< CaloNoise > m_caloNoiseKey
Key of the CaloNoise Conditions data object.
Definition: CaloCellDetailsFillerTool.h:83
D3PD::CaloCellDetailsFillerTool::m_useNoise
bool m_useNoise
Definition: CaloCellDetailsFillerTool.h:99
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
D3PD::CaloCellDetailsFillerTool::m_badCell
int * m_badCell
Definition: CaloCellDetailsFillerTool.h:93
D3PD::CaloCellDetailsFillerTool::fill
virtual StatusCode fill(const CaloCell &p) override
Fill one block — type-safe version.
Definition: CaloCellDetailsFillerTool.cxx:119
errorcheck.h
Helpers for checking error return status codes and reporting errors.
D3PD::CaloCellDetailsFillerTool::m_saveCellQuality
bool m_saveCellQuality
Definition: CaloCellDetailsFillerTool.h:68
CaloCellDetailsFillerTool.h
Block filler tool for CaloCell, implementing similar features of CBNTAA_CaloCell.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
CaloCellContainer.h
D3PD::CaloCellDetailsFillerTool::m_saveCellStatus
bool m_saveCellStatus
Definition: CaloCellDetailsFillerTool.h:71
LArEM_Base_ID::is_em_endcap_inner
bool is_em_endcap_inner(const Identifier id) const
test if the id belongs to the EM Endcap inner wheel
D3PD::CaloCellDetailsFillerTool::m_timeCells
float * m_timeCells
Definition: CaloCellDetailsFillerTool.h:92
D3PD::CaloCellDetailsFillerTool::CaloCell_GetDetectorInfo
unsigned int CaloCell_GetDetectorInfo(const CaloCell &cell) const
Definition: CaloCellDetailsFillerTool.cxx:161
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloDetDescriptor
This is a base class for LAr and Tile Descriptors The primary goal is to speed up loops over all the ...
Definition: CaloDetDescriptor.h:58
LArEM_Base_ID::is_em_barrel
bool is_em_barrel(const Identifier id) const
test if the id belongs to the EM barrel
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
LArHEC_Base_ID::sampling
int sampling(const Identifier id) const
return sampling [0,3] (only 0 for supercells)
D3PD::CaloCellDetailsFillerTool::m_yCells
float * m_yCells
Definition: CaloCellDetailsFillerTool.h:89
D3PD::CaloCellDetailsFillerTool::initialize
virtual StatusCode initialize() override
Definition: CaloCellDetailsFillerTool.cxx:70
Tile_Base_ID::is_tile_barrel
bool is_tile_barrel(const Identifier &id) const
Test of an Identifier to see if it belongs to a particular part of the calorimeter.
Definition: Tile_Base_ID.cxx:205
CaloCell_Base_ID
Helper base class for offline cell identifiers.
Definition: CaloCell_Base_ID.h:41
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
python.compressB64.c
def c
Definition: compressB64.py:93
CaloCell_Base_ID::tile_idHelper
const Tile_Base_ID * tile_idHelper() const
access to Tile idHelper
Definition: CaloCell_Base_ID.h:355
CaloCell_Base_ID::hec_idHelper
const LArHEC_Base_ID * hec_idHelper() const
access to HEC idHelper
Definition: CaloCell_Base_ID.h:337
D3PD::CaloCellDetailsFillerTool::m_pb_tool
ToolHandle< ICaloBadChanTool > m_pb_tool
Definition: CaloCellDetailsFillerTool.h:77
Identifier
Definition: IdentifierFieldParser.cxx:14