ATLAS Offline Software
Loading...
Searching...
No Matches
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$
12
13
16#include "CaloEvent/CaloCluster.h"
18#include <sstream>
19#include <algorithm>
20
21
22namespace {
23
24
25double 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
36namespace 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{
79 ATH_CHECK(m_caloDetDescrMgrKey.initialize());
80 return StatusCode::SUCCESS;
81}
82
87{
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
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
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
219template <class T>
221{
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
238StatusCode
239ClusterSamplingFillerTool::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++) {
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
#define ATH_CHECK
Evaluate an expression and check for errors.
Block filler tool for samplings from a CaloCluster.
Helpers for checking error return status codes and reporting errors.
#define REPORT_MESSAGE(LVL)
Report a message.
#define CHECK(...)
Evaluate an expression and check for errors.
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
CaloSampling::CaloSample CaloSample
Definition CaloCell_ID.h:53
Principal data class for CaloCell clusters.
virtual StatusCode addVariable(const std::string &name, const std::type_info &ti, void *&ptr, const std::string &docstring="", const void *defval=0)
float * m_Es[NSAMP]
Variable: Sampling energies.
float * m_Eem
Variable: total EM and HAD energies.
ClusterSamplingFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
float * m_etamax[NSAMP]
Variable: Eta of maximum energy.
float * m_raw_phis[NSAMP]
Variable: Sampling raw phi centroids.
float * m_raw_etas[NSAMP]
Variable: Sampling raw eta centroids.
float * m_phis[NSAMP]
Variable: Sampling phi centroids.
BlockFillerTool< Types< CaloCluster, xAOD::CaloCluster > > Base
virtual StatusCode initialize() override
std::vector< unsigned int > m_samplings
Parameter: Samplings to write. Empty means to write all.
virtual StatusCode fill(const CaloCluster &p) override
Fill one block — type-safe version.
float * m_etas[NSAMP]
Variable: Sampling eta centroids.
virtual StatusCode book() override
Book variables for this block.
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloDetDescrMgrKey
StatusCode fillSamplings(const std::vector< double > &eSamp, const std::vector< double > &etaSamp, const std::vector< double > &phiSamp)
Fill sampling variables.
StatusCode fillEtamax(const T &p)
Fill etamax/reco status.
Block filler tool for noisy FEB information.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.