93 {
94
96
97
98
101
102
104
105
106 bool tileThresh =
m_tileInfo->TileZeroSuppress();
107
108 double Rndm[16];
109
111 << ", iTrig=" << iTrig
112 << ", tileNoise=" << ((tileNoise) ? "true" : "false")
113 << ", tileThresh=" << ((tileThresh) ? "true" : "false") );
114
115
116
117
118
121
123 ATH_CHECK( ttl1Container.record(std::make_unique<TileTTL1Container>()) );
125
126
127
128
129 Identifier ttId[16];
130 bool ttDigit[16];
131 int nTT;
132 int nDigit;
133 int nIgnore;
134 int nTTTot = 0;
135 int nDigitTot = 0;
136 int nIgnoreTot = 0;
137 float ttAmpTot = 0;
138 float ttAmpTotIg = 0.;
139 int minieta, maxieta, posneg;
140
141
142 std::vector<float> ttL1samples(nSamp);
143
144
145
146 for (const TileDigitsCollection* digitsCollection : *digitsContainer) {
147
148 HWIdentifier drawer_id =
m_tileHWID->drawer_id(digitsCollection->identify());
152
153 switch (ros) {
155 posneg = +1;
156 minieta = 0;
157 maxieta = 8;
158 break;
160 posneg = -1;
161 minieta = 0;
162 maxieta = 8;
163 break;
165 posneg = +1;
166 minieta = 9;
167 maxieta = 14;
168 break;
170 posneg = -1;
171 minieta = 9;
172 maxieta = 14;
173 break;
174 default:
175 posneg = minieta = maxieta = 0;
176 }
177
178
179 memset(ttDigit, 0, sizeof(ttDigit));
180 std::vector<std::vector<float> > myttAmp(16);
181 for (int ii = 0; ii < 16; ++ii)
182 myttAmp[ii].resize(nSamp);
183
184 nTT = nIgnore = nDigit = 0;
185
186
187
188 for (const TileDigits* tile_digits : *digitsCollection) {
189
190
191 std::vector<float> samples = tile_digits->samples();
192
193
194 int nSamp2 = samples.size();
195 if (nSamp2 != nSamp) {
197 << " nSamp from digits= " << nSamp2 );
198 }
199
200 HWIdentifier adcId = tile_digits->adc_HWID();
203
204 float pedestal = samples[0];
205 for (int jsamp = 0; jsamp < nSamp; ++jsamp) {
206
209
210 }
211 Identifier pmt_id = tile_digits->pmt_ID();
213
214
215 Identifier tt_id = tile_digits->tt_ID();
216
217 int ieta =
m_TT_ID->eta(tt_id);
218 int iphi =
m_TT_ID->phi(tt_id);
219 if (iphi != drawer)
221
222 if (ttDigit[ieta]) {
223 for (int jsamp = 0; jsamp < nSamp; ++jsamp) {
224 myttAmp[ieta][jsamp] += samples[jsamp];
225 }
226 } else {
227 ttId[ieta] = tt_id;
228 ttDigit[ieta] = true;
229 for (int jsamp = 0; jsamp < nSamp; ++jsamp) {
230 myttAmp[ieta][jsamp] = samples[jsamp];
231 }
232 if (ieta >= minieta && ieta <= maxieta)
233 ++nTT;
234 }
235 ++nDigit;
236 if (ieta < minieta || ieta > maxieta)
237 ++nIgnore;
238
239
240
243
244 if (ieta >= minieta && ieta <= maxieta) {
246 } else {
248 }
249
250 if (
msgLvl(MSG::VERBOSE)) {
251
253 int tower =
m_tileID->tower(pmt_id);
257
258 msg(MSG::VERBOSE) <<
"New Digit:"
263 << ", tower=" << tower
267 << ", ie=" << ieta
268 << ", ip=" << iphi;
269
270 if (ieta >= minieta && ieta <= maxieta)
272 else
273 msg(MSG::VERBOSE) <<
" Outside limits" <<
endmsg;
274 }
275
276 } else {
278 }
279 }
280
281 nTTTot += nTT;
282 nDigitTot += nDigit;
283 nIgnoreTot += nIgnore;
284
286 << " ROS=" << ros
287 << ", drawer=" << drawer
288 << "; posneg=" << posneg
289 << ", minieta=" << minieta
290 << ", maxieta=" << maxieta
291 << "; nTT=" << nTT
292 << ", nDigit=" << nDigit
293 << ", nIgnore=" << nIgnore );
294
295
296
297
298
299 for (int ieta = minieta; ieta <= maxieta; ++ieta) {
301 bool Good = ttDigit[ieta];
302 if (tileNoise)
303 Good = true;
304
305 if (Good) {
306 if (!ttDigit[ieta])
307 ttId[ieta] =
m_TT_ID->tower_id(posneg, 1, 0, ieta, drawer);
308
309 float ttL1Calib =
m_tileInfo->TTL1Calib(ttId[ieta]);
310 for (int jsamp = 0; jsamp < nSamp; ++jsamp) {
311 myttAmp[ieta][jsamp] *= ttL1Calib;
312 }
313
314
315 if (tileNoise)
316 CLHEP::RandGauss::shootArray(nSamp, Rndm);
317 float ttL1Ped =
m_tileInfo->TTL1Ped(ttId[ieta]);
318 float ttL1NoiseSigma =
m_tileInfo->TTL1NoiseSigma(ttId[ieta]);
319 for (int jsamp = 0; jsamp < nSamp; ++jsamp) {
320 ttL1samples[jsamp] = myttAmp[ieta][jsamp] + ttL1Ped;
321 if (tileNoise)
322 ttL1samples[jsamp] += ttL1NoiseSigma * Rndm[jsamp];
323 }
324 if (tileThresh) {
325 float ttL1Thresh =
m_tileInfo->TTL1Thresh(ttId[ieta]);
326 if (ttL1samples[iTrig] - ttL1Ped < ttL1Thresh)
327 Good = false;
328 }
329 }
330
331 if (Good) {
333 << " ros=" << ros
334 << ", ieta=" << ieta
335 << ", iphi=" << iphi
336 << ", digitTrue=" << ttDigit[ieta]
337 << ", Good=" << Good
338 << ", amp0=" << myttAmp[ieta][iTrig]
339 << ", digitIn=" << ttL1samples[iTrig] );
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360 ttl1Container->push_back(std::make_unique<TileTTL1>(ttId[ieta], ttL1samples));
361 }
362 }
363 }
364
365
366
369 << " nDigitTot=" << nDigitTot
370 << " nIgnoreTot=" << nIgnoreTot
371 << " ttAmpTot=" << ttAmpTot
372 << " ttAmpTotIg=" << ttAmpTotIg
373 << " =>eneTot=" << ttAmpTot + ttAmpTotIg );
374
375 return StatusCode::SUCCESS;
376}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
bool msgLvl(const MSG::Level lvl) const
bool is_valid() const
Check if id is in a valid state.
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
const TileHWID * m_tileHWID
ToolHandle< TileCondToolEmscale > m_tileToolEmscale
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKey
const CaloLVL1_ID * m_TT_ID
const TileInfo * m_tileInfo
SG::WriteHandleKey< TileTTL1Container > m_ttl1ContainerKey