ATLAS Offline Software
Loading...
Searching...
No Matches
TileHitInfoFillerTool.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// $Id$
12
19
20#include <sstream>
21
22
23namespace D3PD {
24
25
33 (const std::string& type,
34 const std::string& name,
35 const IInterface* parent)
36 : BlockFillerTool<TileHitVector> (type, name, parent)
37{
38
39 declareProperty("TimeMin",m_timeMin = -12.5);
40 declareProperty("TimeMax",m_timeMax = 12.5);
41 declareProperty("TimeOut",m_timeOut = 99990.);
42
43 TileHitInfoFillerTool::book().ignore(); // Avoid coverity warnings
44}
45
46
51{
52
53 CHECK(addVariable("energy", m_energy ));
54 CHECK(addVariable("eBefore", m_eBefore ));
55 CHECK(addVariable("eInTime", m_eInTime ));
56 CHECK(addVariable("eAfter", m_eAfter ));
57 CHECK(addVariable("eOutTime", m_eOutTime ));
58 CHECK(addVariable("time", m_time ));
59 CHECK(addVariable("tBefore", m_tBefore ));
60 CHECK(addVariable("tInTime", m_tInTime ));
61 CHECK(addVariable("tAfter", m_tAfter ));
62 CHECK(addVariable("tOutTime", m_tOutTime ));
63 CHECK(addVariable("nHit", m_nHit ));
64 CHECK(addVariable("nHitBefore", m_nHitBefore ));
65 CHECK(addVariable("nHitInTime", m_nHitInTime ));
66 CHECK(addVariable("nHitAfter", m_nHitAfter ));
67 CHECK(addVariable("nHitOutTime", m_nHitOutTime ));
68 CHECK(addVariable("nChan", m_nChan ));
69 CHECK(addVariable("nChanBefore", m_nChanBefore ));
70 CHECK(addVariable("nChanInTime", m_nChanInTime ));
71 CHECK(addVariable("nChanAfter", m_nChanAfter ));
72 CHECK(addVariable("nChanOutTime",m_nChanOutTime));
73
74 return StatusCode::SUCCESS;
75}
76
77
86StatusCode TileHitInfoFillerTool::fill (const TileHitVector& hitCont)
87{
88 *m_energy = 0.0;
89 *m_eInTime = 0.0;
90 *m_eBefore = 0.0;
91 *m_eAfter = 0.0;
92 *m_eOutTime = 0.0;
93 *m_time = 0.0;
94 *m_tInTime = 0.0;
95 *m_tBefore = 0.0;
96 *m_tAfter = 0.0;
97 *m_tOutTime = 0.0;
98 *m_nHit = 0;
99 *m_nHitInTime = 0;
100 *m_nHitBefore = 0;
101 *m_nHitAfter = 0;
102 *m_nHitOutTime = 0;
103 *m_nChan = 0;
104 *m_nChanInTime = 0;
105 *m_nChanBefore = 0;
106 *m_nChanAfter = 0;
107 *m_nChanOutTime = 0;
108
109 TileHitVector::const_iterator itr = hitCont.begin();
110 TileHitVector::const_iterator itrLast = hitCont.end();
111
112 double eInTime=0.0;
113 double eBefore=0.0;
114 double eAfter=0.0;
115 double eOutTime=0.0;
116 double tInTime=0.0;
117 double tBefore=0.0;
118 double tAfter=0.0;
119 double tOutTime=0.0;
120
121 for ( ; itr!=itrLast; ++itr) {
122
123 int inTime=0;
124 int before=0;
125 int after=0;
126 int outTime=0;
127
128 const TileHit & hit = (*itr) ;
129
130 int size=hit.size();
131 for(int i=0;i<size;++i) {
132 double energy = hit.energy(i);
133 float time = hit.time(i);
134
135 if (time>m_timeOut) {
136 ++outTime;
137 eOutTime += energy;
138 tOutTime += energy*time;
139 } else if (time>m_timeMax) {
140 ++after;
141 eAfter += energy;
142 tAfter += energy*time;
143 } else if (time<m_timeMin) {
144 ++before;
145 eBefore += energy;
146 tBefore += energy*time;
147 } else {
148 ++inTime;
149 eInTime += energy;
150 tInTime += energy*time;
151 }
152 }
153
154 (*m_nHit) += size;
155 (*m_nChan) += 1;
156
157 if (outTime) {
158 (*m_nHitOutTime) += outTime;
159 (*m_nChanOutTime) += 1;
160 }
161 if (after) {
162 (*m_nHitAfter) += after;
163 (*m_nChanAfter) += 1;
164 }
165 if (before) {
166 (*m_nHitBefore) += before;
167 (*m_nChanBefore) += 1;
168 }
169 if (inTime) {
170 (*m_nHitInTime) += inTime;
171 (*m_nChanInTime) += 1;
172 }
173
174 }
175
176 if (*m_nChan) {
177
178 double energy = 0.0;
179 double time = 0.0;
180
181 if (eBefore!=0.0) {
182 *m_eBefore = eBefore;
183 *m_tBefore = tBefore / eBefore;
184 energy += eBefore;
185 time += tBefore;
186 }
187
188 if (eAfter!=0.0) {
189 *m_eAfter = eAfter;
190 *m_tAfter = tAfter / eAfter;
191 energy += eAfter;
192 time += tAfter;
193 }
194
195 if (eInTime!=0.0) {
196 *m_eInTime = eInTime;
197 *m_tInTime = tInTime / eInTime;
198 energy += eInTime;
199 time += tInTime;
200 }
201
202 if (energy!=0.0) {
203 *m_energy = energy;
204 *m_time = time / energy;
205 }
206
207 if (eOutTime!=0.0) {
208 *m_eOutTime = eOutTime;
209 *m_tOutTime = tOutTime / eOutTime;
210 if (energy != 0.0) {
211 *m_energy += eOutTime;
212 // do not use out-of-time in time calculations
213 } else {
215 *m_time = *m_tOutTime; // only out-of-time energy
216 }
217 }
218
219
220 }
221
222 ATH_MSG_DEBUG(" Tile hits: "<< *m_nChan << " / " << *m_nHit
223 <<" energy " << *m_energy << " time " << *m_time );
224
225 return StatusCode::SUCCESS;
226}
227
228
229} // namespace D3PD
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
AtlasHitsVector< TileHit > TileHitVector
CONT::const_iterator const_iterator
const_iterator begin() const
const_iterator end() const
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 fill(const TileHitVector &p)
Fill one block — type-safe version.
TileHitInfoFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
virtual StatusCode book()
Book variables for this block.
float time(int ind=0) const
Return time of ind-th sub-hit.
float energy(int ind=0) const
Return energy of ind-th sub-hit.
int size(void) const
Return length of energy/time vectors.
Block filler tool for noisy FEB information.