ATLAS Offline Software
CaloTowerMonitor.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 
6 #include "GaudiKernel/Algorithm.h"
7 #include "GaudiKernel/MsgStream.h"
8 
9 #include "StoreGate/ReadHandle.h"
10 
11 #include "CLHEP/Units/SystemOfUnits.h"
12 
14 
15 #include "CaloGeoHelpers/CaloSampling.h"
16 #include "CaloEvent/CaloCell.h"
17 #include "CaloEvent/CaloTower.h"
18 #include "CaloEvent/CaloTowerContainer.h"
19 
20 #include "CaloTowerMonitor.h"
21 
22 #include <string>
23 #include <cmath>
24 
25 using CLHEP::GeV;
26 using CLHEP::deg;
27 
28 
30 {
31  ATH_CHECK( m_histSvc.retrieve() );
33  // Book Distributions //
35 
36  auto book1 = [&] (const std::string& name,
37  const std::string& title,
38  int nx,
39  float xlo,
40  float xhi,
41  TH1*& hptr) -> StatusCode
42  {
43  return m_histSvc->regHist ("/" + m_streamName + "/CaloTowerMonitor/" + name,
44  std::make_unique<TH1F> (name.c_str(), title.c_str(),
45  nx, xlo, xhi),
46  hptr);
47  };
48  auto book2 = [&] (const std::string& name,
49  const std::string& title,
50  int nx,
51  float xlo,
52  float xhi,
53  int ny,
54  float ylo,
55  float yhi,
56  TH2*& hptr) -> StatusCode
57  {
58  return m_histSvc->regHist ("/" + m_streamName + "/CaloTowerMonitor/" + name,
59  std::make_unique<TH2F> (name.c_str(), title.c_str(),
60  nx, xlo, xhi,
61  ny, ylo, yhi),
62  hptr);
63  };
64 
65  // number of towers
66  ATH_CHECK( book1 ("nTowersVsEta", "Number of CaloTowers vs Eta",
67  100, -5., 5.,
68  m_nTowersVsEta) );
69  ATH_CHECK( book1 ("nTowersVsPhi", "Number of CaloTowers vs Phi [deg]",
70  100, -200., 200.,
71  m_nTowersVsPhi) );
72 
73  // tower energies
74  ATH_CHECK( book1 ("eTowers", "CaloTower E [GeV]",
75  100, 0., 100.,
76  m_eTowers) );
77  ATH_CHECK( book2 ("eTowersVsEta", "CaloTower E [GeV] vs Eta",
78  100, -5., 5.,
79  100, 0., 100.,
80  m_eTowersVsEta) );
81  ATH_CHECK( book2 ("eTowersVsPhi", "CaloTower E [Gev] vs Phi [deg]",
82  100, -200., 200.,
83  100, 0., 100.,
84  m_eTowersVsPhi) );
85  ATH_CHECK( book1 ("eLogTowers", "CaloTower log(E/GeV)",
86  100, -7., 3.,
87  m_eLogTowers) );
88 
89  // tower et's
90  ATH_CHECK( book1 ("etTowers", "CaloTower Et [GeV]",
91  100, 0., 100.,
92  m_etTowers) );
93  ATH_CHECK( book2 ("etTowersVsEta", "CaloTower Et [GeV] vs Eta",
94  100, -5., 5.,
95  100, 0., 100.,
96  m_etTowersVsEta) );
97  ATH_CHECK( book2 ("etTowersVsPhi", "CaloTower Et [Gev] vs Phi [deg]",
98  100, -200., 200.,
99  100, 0., 100.,
100  m_etTowersVsPhi) );
101  ATH_CHECK( book1 ("etLogTowers", "CaloTower log(Et/GeV)",
102  100, -7., 3.,
103  m_etLogTowers) );
104 
105  // tower shapes
106  ATH_CHECK( book2 ("cellsInEtaVsPhi", "CaloTower Shape",
107  100, -0.5, 0.5,
108  100, -0.5, 0.5,
110  ATH_CHECK( book1 ("nCellsInTower", "Number of Cells in CaloTower",
111  100, 0., 100.,
112  m_nCellsInTower) );
113  ATH_CHECK( book2 ("nCellsInTowerVsEta", "Number of Cells vs Eta",
114  100, -5., 5.,
115  100, 0., 100.,
117  ATH_CHECK( book2 ("nCellsInTowerVsPhi", "Number of Cells vs Phi [deg]",
118  100, -200., 200.,
119  100, 0., 100.,
121 
122  // eta direction matches
123  ATH_CHECK( book2 ("etaTowerVsCell", "Cell Eta vs TowerEta",
124  100, -5., 5.,
125  100, -5., 5.,
126  m_etaTowerVsCell) );
127  ATH_CHECK( book2 ("etaTowerVsCellCalosPreSamplerB",
128  "Cell Eta vs Tower Eta PreSampB",
129  100, -5., 5.,
130  100, -5., 5.,
132  ATH_CHECK( book2 ("etaTowerVsCellCalosEMB1",
133  "Cell Eta vs Tower Eta EMB1",
134  100, -5., 5.,
135  100, -5., 5.,
137  ATH_CHECK( book2 ("etaTowerVsCellCalosPreSamplerE",
138  "Cell Eta vs Tower Eta PreSampE",
139  100, -5., 5.,
140  100, -5., 5.,
142  ATH_CHECK( book2 ("etaTowerVsCellCalosEME1",
143  "Cell Eta vs Tower Eta EME1",
144  100, -5., 5.,
145  100, -5., 5.,
147  ATH_CHECK( book2 ("etaTowerVsCellCalosHEC0",
148  "Cell Eta vs Tower Eta HEC0",
149  100, -5., 5.,
150  100, -5., 5.,
152  ATH_CHECK( book2 ("etaTowerVsCellCalosTileBar0",
153  "Cell Eta vs Tower Eta TileBar0",
154  100, -5., 5.,
155  100, -5., 5.,
157  ATH_CHECK( book2 ("etaTowerVsCellCalosTileExt0",
158  "Cell Eta vs Tower Eta TileExt0",
159  100, -5., 5.,
160  100, -5., 5.,
162  ATH_CHECK( book2 ("etaTowerVsCellCalosFCAL0",
163  "Cell Eta vs Tower Eta FCAL0",
164  100, -5., 5.,
165  100, -5., 5.,
167  ATH_CHECK( book2 ("etaTowerVsCellCalosFCAL1",
168  "Cell Eta vs Tower Eta FCAL1",
169  100, -5., 5.,
170  100, -5., 5.,
172  ATH_CHECK( book2 ("etaTowerVsCellCalosFCAL2",
173  "Cell Eta vs Tower Eta FCAL2",
174  100, -5., 5.,
175  100, -5., 5.,
177 
178  // phi direction matches
179  ATH_CHECK( book2 ("phiTowerVsCell", "Cell Phi vs TowerPhi",
180  100, -200., 200.,
181  100, -200., 200.,
182  m_phiTowerVsCell) );
183  ATH_CHECK( book2 ("phiTowerVsCellCalosPreSamplerB",
184  "Cell Phi vs Tower Phi PreSampB",
185  100, -200., 200.,
186  100, -200., 200.,
188  ATH_CHECK( book2 ("phiTowerVsCellCalosEMB1",
189  "Cell Phi vs Tower Phi EMB1",
190  100, -200., 200.,
191  100, -200., 200.,
193  ATH_CHECK( book2 ("phiTowerVsCellCalosPreSamplerE",
194  "Cell Phi vs Tower Phi PreSampE",
195  100, -200., 200.,
196  100, -200., 200.,
198  ATH_CHECK( book2 ("phiTowerVsCellCalosEME1",
199  "Cell Phi vs Tower Phi EME1",
200  100, -200., 200.,
201  100, -200., 200.,
203  ATH_CHECK( book2 ("phiTowerVsCellCalosHEC0",
204  "Cell Phi vs Tower Phi HEC0",
205  100, -200., 200.,
206  100, -200., 200.,
208  ATH_CHECK( book2 ("phiTowerVsCellCalosTileBar0",
209  "Cell Phi vs Tower Phi TileBar0",
210  100, -200., 200.,
211  100, -200., 200.,
213  ATH_CHECK( book2 ("phiTowerVsCellCalosTileExt0",
214  "Cell Phi vs Tower Phi TileExt0",
215  100, -200., 200.,
216  100, -200., 200.,
218  ATH_CHECK( book2 ("phiTowerVsCellCalosFCAL0",
219  "Cell Phi vs Tower Phi FCAL0",
220  100, -200., 200.,
221  100, -200., 200.,
223  ATH_CHECK( book2 ("phiTowerVsCellCalosFCAL1",
224  "Cell Phi vs Tower Phi FCAL1",
225  100, -200., 200.,
226  100, -200., 200.,
228  ATH_CHECK( book2 ("phiTowerVsCellCalosFCAL2",
229  "Cell Phi vs Tower Phi FCAL2",
230  100, -200., 200.,
231  100, -200., 200.,
233 
234  ATH_CHECK( m_collectionNames.initialize() );
235 
236  return StatusCode::SUCCESS;
237 }
238 
239 
241 {
242  const EventContext& ctx = getContext();
243  // retrieve data container
245  // pointer to tower container
246  SG::ReadHandle<CaloTowerContainer> theTowers (k, ctx);
247  for (const CaloTower* aTower : *theTowers) {
248  // check tower properties
249  // if ( aTower->eta() == 0 || aTower->getNumberOfCells() == 0 )
250  // {
251  // log << MSG::WARNING
252  // << "CaloTower @ "
253  // << aTower
254  // << " with (eta/phi) = ("
255  // << aTower->eta()
256  // << "/"
257  // << aTower->phi()
258  // << ") has e = "
259  // << aTower->e() / GeV
260  // << " GeV and #cells = "
261  // << aTower->getNumberOfCells()
262  // << endmsg;
263  // }
264  // else
265  if ( aTower->getNumberOfCells() != 0 )
266  {
267  // variables
268  double e = aTower->e() * (1./GeV);
269  double et = aTower->et() * (1./GeV);
270  double eta = aTower->eta();
271  double phi = aTower->phi();
272  // if ( phi > mathPi ) phi -= 2. * mathPi;
273  double cells = (double) aTower->getNumberOfCells();
274  ATH_MSG_DEBUG( "Tower @"
275  << aTower
276  << " E = "
277  << e << " GeV (eta,phi) = ("
278  << eta << "," << phi << ")" );
279  // fill distributions
280  m_nTowersVsEta->Fill(eta,1.);
281  m_nTowersVsPhi->Fill(phi*(1/deg),1.);
282  // ATH_MSG_INFO( "fill tower e " << e );
283  m_eTowers->Fill(e,1.);
284  m_eTowersVsEta->Fill(eta,e,1.);
285  m_eTowersVsPhi->Fill(phi*(1./deg),e,1.);
286  if ( e > 0. )
287  {
288  m_eLogTowers->Fill(log10(e),1.);
289  }
290  // ATH_MSG_INFO( "fill tower et " << et );
291  m_etTowers->Fill(et,1.);
292  m_etTowersVsEta->Fill(eta,et,1.);
293  m_etTowersVsPhi->Fill(phi*(1./deg),et,1.);
294  if ( et > 0. )
295  {
296  m_etLogTowers->Fill(log10(et),1.);
297  }
298  // tower shape
299  // ATH_MSG_INFO( "fill tower cls " << cells );
303  for (const CaloCell* aCell : *aTower)
304  {
305  // calculate distance
306  double cellEta = aCell->eta();
307  double cellPhi = aCell->phi();
308  // if ( cellPhi > mathPi ) cellPhi -= 2. * mathPi;
309  double deltaEta = eta - aCell->eta();
310  double deltaPhi = CaloPhiRange::diff(phi, aCell->phi());
311  // log << MSG::INFO << "fill cell deta,dphi "
312  // << deltaEta << "," << deltaPhi << endmsg;
314  // direction matches
315  //log << MSG::INFO << "fill cell eta "
316  // << cellEta << endmsg;
317  m_etaTowerVsCell->Fill(cellEta,eta,1.);
318  //log << MSG::INFO << "fill tower phi "
319  // << cellPhi/deg << endmsg;
320  m_phiTowerVsCell->Fill(cellPhi*(1./deg),phi*(1./deg),1.);
321  CaloSampling::CaloSample theSample = aCell->caloDDE()->getSampling();
322  CaloSampling::CaloSample takeSample = theSample;
323  switch ( theSample )
324  {
325  case CaloSampling::EMB2:
326  case CaloSampling::EMB3:
327  takeSample = CaloSampling::EMB1;
328  break;
329  case CaloSampling::EME2:
330  case CaloSampling::EME3:
331  takeSample = CaloSampling::EME1;
332  break;
333  case CaloSampling::HEC1:
334  case CaloSampling::HEC2:
335  case CaloSampling::HEC3:
336  takeSample = CaloSampling::HEC0;
337  break;
343  takeSample = CaloSampling::TileBar0;
344  break;
347  takeSample = CaloSampling::TileExt0;
348  break;
349  default:
350  break;
351  }
352  m_etaTowerVsCellCalos[takeSample]->Fill(cellEta,eta,1.);
353  m_phiTowerVsCellCalos[takeSample]->Fill(cellPhi*(1./deg),
354  phi*(1./deg),1.);
355  } // cell loop
356  } // tower kinematics ok
357  } // tower loop
358  } // collection loop
359  return StatusCode::SUCCESS;
360 }
361 
TH2::Fill
int Fill(double, double)
Definition: rootspy.cxx:382
WritePulseShapeToCool.yhi
yhi
Definition: WritePulseShapeToCool.py:153
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:271
et
Extra patterns decribing particle interation process.
CaloCell_ID_FCS::TileExt2
@ TileExt2
Definition: FastCaloSim_CaloCell_ID.h:39
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
xAOD::deltaPhi
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap setEtaBin setIsTgcFailure setDeltaPt deltaPhi
Definition: L2StandAloneMuon_v1.cxx:160
CaloCell_ID_FCS::TileBar1
@ TileBar1
Definition: FastCaloSim_CaloCell_ID.h:32
CaloCell_ID_FCS::FCAL1
@ FCAL1
Definition: FastCaloSim_CaloCell_ID.h:41
deg
#define deg
Definition: SbPolyhedron.cxx:17
CaloCell.h
CaloTowerMonitor::m_streamName
StringProperty m_streamName
Definition: CaloTowerMonitor.h:81
CaloTowerMonitor::m_cellsInEtaVsPhi
TH2 * m_cellsInEtaVsPhi
Definition: CaloTowerMonitor.h:54
CaloCell_ID_FCS::HEC2
@ HEC2
Definition: FastCaloSim_CaloCell_ID.h:29
SG::ReadHandleKey< CaloTowerContainer >
CaloTowerMonitor::m_nCellsInTower
TH1 * m_nCellsInTower
Definition: CaloTowerMonitor.h:55
CaloCell_ID_FCS::TileGap3
@ TileGap3
Definition: FastCaloSim_CaloCell_ID.h:36
CaloTowerMonitor::m_eLogTowers
TH1 * m_eLogTowers
Definition: CaloTowerMonitor.h:63
CaloTowerMonitor::m_etTowersVsEta
TH2 * m_etTowersVsEta
Definition: CaloTowerMonitor.h:67
CaloTowerMonitor::m_nCellsInTowerVsEta
TH2 * m_nCellsInTowerVsEta
Definition: CaloTowerMonitor.h:56
CaloTowerMonitor::m_eTowersVsPhi
TH2 * m_eTowersVsPhi
Definition: CaloTowerMonitor.h:62
CaloTowerMonitor::m_phiTowerVsCellCalos
std::map< CaloSampling::CaloSample, TH2 * > m_phiTowerVsCellCalos
Definition: CaloTowerMonitor.h:75
CaloTowerMonitor::m_etaTowerVsCell
TH2 * m_etaTowerVsCell
Definition: CaloTowerMonitor.h:72
CaloTowerMonitor::execute
virtual StatusCode execute() override
Definition: CaloTowerMonitor.cxx:240
CaloCell_ID_FCS::HEC1
@ HEC1
Definition: FastCaloSim_CaloCell_ID.h:28
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
WritePulseShapeToCool.xhi
xhi
Definition: WritePulseShapeToCool.py:152
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:53
CaloTowerMonitor::m_nTowersVsPhi
TH1 * m_nTowersVsPhi
Definition: CaloTowerMonitor.h:51
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
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_ID_FCS::TileGap2
@ TileGap2
Definition: FastCaloSim_CaloCell_ID.h:35
covarianceTool.title
title
Definition: covarianceTool.py:542
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
CaloTowerMonitor::m_nCellsInTowerVsPhi
TH2 * m_nCellsInTowerVsPhi
Definition: CaloTowerMonitor.h:57
CaloPhiRange.h
CaloPhiRange class declaration.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
WritePulseShapeToCool.xlo
xlo
Definition: WritePulseShapeToCool.py:133
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
CaloTowerMonitor::m_etLogTowers
TH1 * m_etLogTowers
Definition: CaloTowerMonitor.h:69
TH1::Fill
int Fill(double)
Definition: rootspy.cxx:285
CaloCell_ID_FCS::TileGap1
@ TileGap1
Definition: FastCaloSim_CaloCell_ID.h:34
TH2
Definition: rootspy.cxx:373
WritePulseShapeToCool.ylo
ylo
Definition: WritePulseShapeToCool.py:134
CaloTower
Data class for calorimeter cell towers.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloTower.h:55
CaloTowerMonitor::m_etaTowerVsCellCalos
std::map< CaloSampling::CaloSample, TH2 * > m_etaTowerVsCellCalos
Definition: CaloTowerMonitor.h:74
CaloTowerMonitor.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
CaloCell_ID_FCS::TileExt1
@ TileExt1
Definition: FastCaloSim_CaloCell_ID.h:38
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
CaloTowerMonitor::m_etTowersVsPhi
TH2 * m_etTowersVsPhi
Definition: CaloTowerMonitor.h:68
CaloTowerMonitor::m_eTowersVsEta
TH2 * m_eTowersVsEta
Definition: CaloTowerMonitor.h:61
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
CaloTowerMonitor::m_phiTowerVsCell
TH2 * m_phiTowerVsCell
Definition: CaloTowerMonitor.h:73
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
CaloTowerMonitor::initialize
virtual StatusCode initialize() override
Definition: CaloTowerMonitor.cxx:29
TH1
Definition: rootspy.cxx:268
CaloTowerMonitor::m_eTowers
TH1 * m_eTowers
Definition: CaloTowerMonitor.h:60
CaloTowerMonitor::m_collectionNames
SG::ReadHandleKeyArray< CaloTowerContainer > m_collectionNames
Definition: CaloTowerMonitor.h:43
CaloTowerMonitor::m_histSvc
ServiceHandle< ITHistSvc > m_histSvc
Definition: CaloTowerMonitor.h:78
CaloCell_ID_FCS::FCAL2
@ FCAL2
Definition: FastCaloSim_CaloCell_ID.h:42
CaloTowerMonitor::m_etTowers
TH1 * m_etTowers
Definition: CaloTowerMonitor.h:66
ReadHandle.h
Handle class for reading from StoreGate.
CaloTowerMonitor::m_nTowersVsEta
TH1 * m_nTowersVsEta
Definition: CaloTowerMonitor.h:50
CaloCell_ID_FCS::HEC3
@ HEC3
Definition: FastCaloSim_CaloCell_ID.h:30
CaloCell_ID_FCS::FCAL0
@ FCAL0
Definition: FastCaloSim_CaloCell_ID.h:40
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
CaloCell_ID_FCS::TileBar2
@ TileBar2
Definition: FastCaloSim_CaloCell_ID.h:33
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
fitman.k
k
Definition: fitman.py:528
CaloPhiRange::diff
static double diff(double phi1, double phi2)
simple phi1 - phi2 calculation, but result is fixed to respect range.
Definition: CaloPhiRange.cxx:22