ATLAS Offline Software
ClusterSamplingFillerTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // $Id$
16 #include "CaloEvent/CaloCluster.h"
18 #include <sstream>
19 #include <algorithm>
20 
21 
22 namespace {
23 
24 
25 double vget (const std::vector<double>& v, size_t i)
26 {
27  if (i < v.size())
28  return v[i];
29  return 0;
30 }
31 
32 
33 } // anonymous namespace
34 
35 
36 namespace D3PD {
37 
38 
46  (const std::string& type,
47  const std::string& name,
48  const IInterface* parent)
49  : Base (type, name, parent)
50 {
51  declareProperty ("Samplings", m_samplings,
52  "Samplings to write. Empty means to write all.");
53  declareProperty ("EmHadEnergies", m_writeEmHadEnergies = true,
54  "Should total E/Had energies be written?");
55  declareProperty ("SamplingEnergies", m_writeSamplingEnergies = false,
56  "Should per-sampling energies be written?");
57  declareProperty ("SamplingEtaPhi", m_writeSamplingEtaPhi = false,
58  "Should per-sampling eta/phi be written?");
59  declareProperty ("SamplingEtaPhiRaw", m_writeSamplingEtaPhiRaw = false,
60  "Should per-sampling raw eta/phi be written?");
61  declareProperty ("SamplingEtamax", m_writeSamplingEtamax = false,
62  "Should per-sampling maximum eta be written?");
63  declareProperty ("WriteRecoStatus",m_writeRecoStatus=false,
64  "Should reconstruction status word be written?");
65 
66  m_Eem = 0;
67  m_Ehad = 0;
68  m_RecoStatus = 0;
69  std::fill (m_Es, m_Es + NSAMP, (float*)0);
70  std::fill (m_etas, m_etas + NSAMP, (float*)0);
71  std::fill (m_phis, m_phis + NSAMP, (float*)0);
72  std::fill (m_raw_etas, m_raw_etas + NSAMP, (float*)0);
73  std::fill (m_raw_phis, m_raw_phis + NSAMP, (float*)0);
74  std::fill (m_etamax, m_etamax + NSAMP, (float*)0);
75 }
76 
78 {
80  return StatusCode::SUCCESS;
81 }
82 
87 {
88  if( m_writeEmHadEnergies ) {
89  CHECK( addVariable ("E_em", m_Eem) );
90  CHECK( addVariable ("E_had", m_Ehad) );
91  }
92 
93  std::string samplingnames[NSAMP] =
94  {"PreSamplerB", "EMB1", "EMB2", "EMB3",
95  "PreSamplerE", "EME1", "EME2", "EME3",
96  "HEC0", "HEC1", "HEC2", "HEC3",
97  "TileBar0", "TileBar1", "TileBar2",
98  "TileGap1", "TileGap2", "TileGap3",
99  "TileExt0", "TileExt1", "TileExt2",
100  "FCAL0", "FCAL1", "FCAL2"};
101 
102  if (m_samplings.empty()) {
103  for (unsigned int i = 0; i < NSAMP; i++)
104  m_samplings.push_back (i);
105  }
106 
107  if (m_samplings.size() > NSAMP) {
108  REPORT_MESSAGE(MSG::ERROR) << "Too many samplings requested: "
109  << m_samplings.size()
110  << "; max is " << /*NSAMP*/24;
111  return StatusCode::FAILURE;
112  }
113 
114  for (unsigned int i = 0; i < m_samplings.size(); i++) {
115  unsigned int s = m_samplings[i];
116  if (s >= NSAMP) {
117  REPORT_MESSAGE(MSG::ERROR) << "Requested sampling index "
118  << s << " which is out of range.";
119  return StatusCode::FAILURE;
120  }
121 
122  const std::string& sname = samplingnames[s];
123 
125  CHECK( addVariable ("E_" + sname, m_Es[i],
126  "Energy in sampling " + sname) );
127 
128  if( m_writeSamplingEtaPhi ) {
129  CHECK( addVariable ("eta_" + sname, m_etas[i],
130  "Aligned eta barycenter in sampling " + sname) );
131  CHECK( addVariable ("phi_" + sname, m_phis[i],
132  "Aligned phi barycenter in sampling " + sname) );
133  }
134 
136  CHECK( addVariable ("raw_eta_" + sname, m_raw_etas[i],
137  "Raw eta barycenter in sampling " + sname,
138  -999) );
139  CHECK( addVariable ("raw_phi_" + sname, m_raw_phis[i],
140  "Raw phi barycenter in sampling " + sname,
141  -999) );
142  }
143 
144  if( m_writeSamplingEtamax ) {
145  CHECK( addVariable ("etamax_" + sname, m_etamax[i],
146  "Eta of maximum cell in sampling " + sname) );
147  }
148  }
149 
151  CHECK(addVariable("RecoStatus",m_RecoStatus));
152 
153  return StatusCode::SUCCESS;
154 }
155 
156 
166 {
167  std::vector<double> eSamp;
168  p.getEInSamples(eSamp);
169 
170  std::vector<double> etaSamp;
171  p.getEtaInSamples(etaSamp);
172 
173  std::vector<double> phiSamp;
174  p.getPhiInSamples(phiSamp);
175 
176  CHECK( fillEtamax(p) );
177  CHECK( fillSamplings (eSamp, etaSamp, phiSamp) );
178 
180  *m_RecoStatus= p.getRecoStatus().getStatusWord();
181 
182  return StatusCode::SUCCESS;
183 }
184 
185 
195 {
196 
197  const size_t nsamp=m_samplings.size();
198  std::vector<double> eSamp (nsamp);
199  std::vector<double> etaSamp (nsamp);
200  std::vector<double> phiSamp (nsamp);
201 
202  for (unsigned int i=0; i < nsamp; i++) {
203  eSamp[i] = p.eSample (static_cast<CaloCell_ID::CaloSample>(m_samplings[i]));
204  etaSamp[i] = p.etaSample (static_cast<CaloCell_ID::CaloSample>(m_samplings[i]));
205  phiSamp[i] = p.phiSample (static_cast<CaloCell_ID::CaloSample>(m_samplings[i]));
206  }
207 
208  CHECK( fillEtamax(p) );
209  CHECK( fillSamplings (eSamp, etaSamp, phiSamp) );
210 
211  return StatusCode::SUCCESS;
212 }
213 
214 
219 template <class T>
221 {
222  if( m_writeSamplingEtamax ) {
223  for(unsigned int i=0; i<m_samplings.size(); i++)
224  *m_etamax[i] =
225  p.etamax (static_cast<CaloSampling::CaloSample>(m_samplings[i]));
226  }
227 
228  return StatusCode::SUCCESS;
229 }
230 
231 
239 ClusterSamplingFillerTool::fillSamplings (const std::vector<double>& eSamp,
240  const std::vector<double>& etaSamp,
241  const std::vector<double>& phiSamp)
242 {
244  if( m_writeEmHadEnergies && eSamp.size() >= NSAMP) {
245  *m_Eem =
246  vget (eSamp, CaloSampling::PreSamplerB) +
247  vget (eSamp, CaloSampling::EMB1) +
248  vget (eSamp, CaloSampling::EMB2) +
249  vget (eSamp, CaloSampling::EMB3) +
250  vget (eSamp, CaloSampling::PreSamplerE) +
251  vget (eSamp, CaloSampling::EME1) +
252  vget (eSamp, CaloSampling::EME2) +
253  vget (eSamp, CaloSampling::EME3) +
254  vget (eSamp, CaloSampling::FCAL0);
255  *m_Ehad =
256  vget (eSamp, CaloSampling::HEC0) +
257  vget (eSamp, CaloSampling::HEC1) +
258  vget (eSamp, CaloSampling::HEC2) +
259  vget (eSamp, CaloSampling::HEC3) +
260  vget (eSamp, CaloSampling::TileBar0) +
261  vget (eSamp, CaloSampling::TileBar1) +
262  vget (eSamp, CaloSampling::TileBar2) +
263  vget (eSamp, CaloSampling::TileGap1) +
264  vget (eSamp, CaloSampling::TileGap2) +
265  vget (eSamp, CaloSampling::TileGap3) +
266  vget (eSamp, CaloSampling::TileExt0) +
267  vget (eSamp, CaloSampling::TileExt1) +
268  vget (eSamp, CaloSampling::TileExt2) +
269  vget (eSamp, CaloSampling::FCAL1) +
270  vget (eSamp, CaloSampling::FCAL2);
271  }
272 
274  for(unsigned int i=0; i<m_samplings.size(); i++)
275  *m_Es[i] = vget (eSamp, m_samplings[i]);
276  }
277 
278 
279  for(unsigned int i=0; i<m_samplings.size(); i++) {
280  if (m_writeSamplingEtaPhi) {
281  *m_etas[i] = vget (etaSamp, m_samplings[i]);
282  *m_phis[i] = vget (phiSamp, m_samplings[i]);
283  }
285  double eta_raw=0, phi_raw=0;
287  **caloDetDescrMgrHandle,
288  static_cast<CaloCell_ID::CaloSample>(m_samplings[i]),
289  vget(etaSamp, m_samplings[i]),
290  vget(phiSamp, m_samplings[i]),
291  eta_raw,
292  phi_raw)) {
293  *m_raw_etas[i] = eta_raw;
294  *m_raw_phis[i] = phi_raw;
295  }
296  }
297  }
298 
299  return StatusCode::SUCCESS;
300 }
301 
302 
303 } // namespace D3PD
D3PD::ClusterSamplingFillerTool::m_writeRecoStatus
bool m_writeRecoStatus
Definition: ClusterSamplingFillerTool.h:108
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
CaloCell_ID_FCS::TileExt2
@ TileExt2
Definition: FastCaloSim_CaloCell_ID.h:39
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
D3PD::ClusterSamplingFillerTool::m_writeSamplingEtaPhi
bool m_writeSamplingEtaPhi
Definition: ClusterSamplingFillerTool.h:105
D3PD::ClusterSamplingFillerTool::m_Es
float * m_Es[NSAMP]
Variable: Sampling energies.
Definition: ClusterSamplingFillerTool.h:115
D3PD::ClusterSamplingFillerTool::fillSamplings
StatusCode fillSamplings(const std::vector< double > &eSamp, const std::vector< double > &etaSamp, const std::vector< double > &phiSamp)
Fill sampling variables.
Definition: ClusterSamplingFillerTool.cxx:239
D3PD::ClusterSamplingFillerTool::m_Eem
float * m_Eem
Variable: total EM and HAD energies.
Definition: ClusterSamplingFillerTool.h:111
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
D3PD::ClusterSamplingFillerTool::m_RecoStatus
unsigned int * m_RecoStatus
Definition: ClusterSamplingFillerTool.h:132
D3PD::ClusterSamplingFillerTool::m_phis
float * m_phis[NSAMP]
Variable: Sampling phi centroids.
Definition: ClusterSamplingFillerTool.h:121
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
CaloCell_ID_FCS::TileBar1
@ TileBar1
Definition: FastCaloSim_CaloCell_ID.h:32
D3PD::ClusterSamplingFillerTool::m_writeSamplingEtamax
bool m_writeSamplingEtamax
Definition: ClusterSamplingFillerTool.h:107
D3PD::ClusterSamplingFillerTool::m_samplings
std::vector< unsigned int > m_samplings
Parameter: Samplings to write. Empty means to write all.
Definition: ClusterSamplingFillerTool.h:100
CaloCell_ID_FCS::FCAL1
@ FCAL1
Definition: FastCaloSim_CaloCell_ID.h:41
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
CaloCell_ID_FCS::HEC2
@ HEC2
Definition: FastCaloSim_CaloCell_ID.h:29
D3PD::ClusterSamplingFillerTool::ClusterSamplingFillerTool
ClusterSamplingFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
Definition: ClusterSamplingFillerTool.cxx:46
CaloCell_ID_FCS::TileGap3
@ TileGap3
Definition: FastCaloSim_CaloCell_ID.h:36
D3PD::ClusterSamplingFillerTool::m_raw_etas
float * m_raw_etas[NSAMP]
Variable: Sampling raw eta centroids.
Definition: ClusterSamplingFillerTool.h:124
D3PD::ClusterSamplingFillerTool::m_etas
float * m_etas[NSAMP]
Variable: Sampling eta centroids.
Definition: ClusterSamplingFillerTool.h:118
D3PD::ClusterSamplingFillerTool::m_writeEmHadEnergies
bool m_writeEmHadEnergies
parameters
Definition: ClusterSamplingFillerTool.h:103
D3PD::ClusterSamplingFillerTool::m_etamax
float * m_etamax[NSAMP]
Variable: Eta of maximum energy.
Definition: ClusterSamplingFillerTool.h:130
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
D3PD
Block filler tool for noisy FEB information.
Definition: CaloCellDetailsFillerTool.cxx:29
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
D3PD::ClusterSamplingFillerTool::initialize
virtual StatusCode initialize() override
Definition: ClusterSamplingFillerTool.cxx:77
D3PD::ClusterSamplingFillerTool::fillEtamax
StatusCode fillEtamax(const T &p)
Fill etamax/reco status.
Definition: ClusterSamplingFillerTool.cxx:220
CaloCell_ID_FCS::HEC1
@ HEC1
Definition: FastCaloSim_CaloCell_ID.h:28
D3PD::ClusterSamplingFillerTool::m_writeSamplingEnergies
bool m_writeSamplingEnergies
Definition: ClusterSamplingFillerTool.h:104
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
lumiFormat.i
int i
Definition: lumiFormat.py:85
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
CaloCell_ID_FCS::TileGap2
@ TileGap2
Definition: FastCaloSim_CaloCell_ID.h:35
test_pyathena.parent
parent
Definition: test_pyathena.py:15
D3PD::ClusterSamplingFillerTool::m_writeSamplingEtaPhiRaw
bool m_writeSamplingEtaPhiRaw
Definition: ClusterSamplingFillerTool.h:106
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
CaloCluster
Principal data class for CaloCell clusters.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:79
D3PD::BlockFillerTool< Types< CaloCluster, xAOD::CaloCluster > >
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
CaloCellDetPos.h
D3PD::ClusterSamplingFillerTool::fill
virtual StatusCode fill(const CaloCluster &p) override
Fill one block — type-safe version.
Definition: ClusterSamplingFillerTool.cxx:165
CaloCell_ID_FCS::TileGap1
@ TileGap1
Definition: FastCaloSim_CaloCell_ID.h:34
fill
void fill(H5::Group &out_file, size_t iterations)
Definition: test-hdf5-writer.cxx:95
CaloCellDetPos::getDetPosition
static bool getDetPosition(const CaloDetDescrManager &mgr, CaloCell_ID::CaloSample sam, double etaAtlas, double phiAtlas, double &etaDet, double &phiDet)
get Detector level eta-phi position from Atlas level (aligned) position
Definition: CaloCellDetPos.cxx:13
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
CaloCell_ID_FCS::TileExt1
@ TileExt1
Definition: FastCaloSim_CaloCell_ID.h:38
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
errorcheck.h
Helpers for checking error return status codes and reporting errors.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
D3PD::ClusterSamplingFillerTool::book
virtual StatusCode book() override
Book variables for this block.
Definition: ClusterSamplingFillerTool.cxx:86
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
D3PD::ClusterSamplingFillerTool::m_Ehad
float * m_Ehad
Definition: ClusterSamplingFillerTool.h:112
python.PyAthena.v
v
Definition: PyAthena.py:154
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
D3PD::ClusterSamplingFillerTool::NSAMP
static const unsigned int NSAMP
Definition: ClusterSamplingFillerTool.h:97
CaloCell_ID_FCS::FCAL2
@ FCAL2
Definition: FastCaloSim_CaloCell_ID.h:42
ClusterSamplingFillerTool.h
Block filler tool for samplings from a CaloCluster.
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
CaloCell_ID_FCS::TileBar2
@ TileBar2
Definition: FastCaloSim_CaloCell_ID.h:33
D3PD::ClusterSamplingFillerTool::m_raw_phis
float * m_raw_phis[NSAMP]
Variable: Sampling raw phi centroids.
Definition: ClusterSamplingFillerTool.h:127
D3PD::ClusterSamplingFillerTool::m_caloDetDescrMgrKey
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloDetDescrMgrKey
Definition: ClusterSamplingFillerTool.h:133
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56