ATLAS Offline Software
Loading...
Searching...
No Matches
TileDigiNoiseCalibAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// ********************************************************************
6//
7// NAME: TileDigiNoiseCalib.cxx
8// PACKAGE: TileCalib
9//
10// AUTHOR: Luca Fiorini (Luca.Fiorini@cern.ch)
11//
12// February 2008
13// ********************************************************************
14
15// Gaudi includes
16#include "GaudiKernel/ServiceHandle.h"
17
18//Event info
23
24// Tile includes
32#include "TileOFCorrelation.h"
34
35#include "TFile.h"
36#include "TTree.h"
37#include "TF1.h"
38#include "TGraphErrors.h"
39#include "TClonesArray.h"
40#include <cmath>
41#include <ctime>
42
43TileDigiNoiseCalibAlg::TileDigiNoiseCalibAlg(const std::string& name, ISvcLocator* pSvcLocator)
44 : AthAlgorithm(name, pSvcLocator)
45 , m_beamCnv(nullptr)
46 , m_cabling(nullptr)
47 , m_tileOFCorrelation(nullptr)
48 , m_tileID(nullptr)
49 , m_tileHWID(nullptr)
50 , m_cispar(nullptr)
51// , m_nDrawers(0)
52 , m_time(0)
53 , m_year(0)
54 , m_month(0)
55 , m_day(0)
56 , m_yday(0)
57 , m_hour(0)
58 , m_min(0)
59 , m_trigType(0)
60{
61 declareProperty("TileBeamElemContainer", m_beamElemContainer = "TileBeamElemCnt");
62 /* declareProperty("TileRawChannelContainerFlat", m_flatRawChannelContainer = "TileRawChannelFlat");
63 declareProperty("TileRawChannelContainerFit", m_fitRawChannelContainer = ""); // don't create
64 declareProperty("TileRawChannelContainerOpt", m_optRawChannelContainer = ""); // by default */
65 declareProperty("TileRawChannelContainerDsp", m_dspRawChannelContainer = "TileRawChannelCnt");
66 declareProperty("CalibMode", m_calibMode = true);
67 declareProperty("usePMT", m_usePMT = false);
68 declareProperty("RunNumber", m_run = 0);
69 declareProperty("FileNamePrefix", m_file = "Digi_NoiseCalib");
70 declareProperty("NtupleID", m_ntupleID = "Digi_NoiseCalib");
71 declareProperty("TreeSize", m_treeSize = 16000000000LL);
72 declareProperty("NSamples", m_nSamples = 7);
73 declareProperty("DoAvgCorr", m_doAvgCorr = false);
74 declareProperty("DoRobustCov", m_doRobustCov = false);
75 declareProperty("TileDQstatus", m_dqStatusKey = "TileDQstatus");
76
77 m_run = 0;
78 m_evtNr = -1;
79
94}
95
97
98 delete[] m_sumPed2;
99 delete[] m_sumRms2;
100 delete[] m_meanAmp;
101 delete[] m_meanAmp_ij;
102 delete[] m_evt;
103 delete[] m_ros;
104 delete[] m_drawer;
105 delete[] m_channel;
106 delete[] m_gain;
107 delete[] m_ped;
108 delete[] m_lfn;
109 delete[] m_hfn;
110 delete[] m_noise_cov;
111 delete[] m_auto_corr;
112}
113
117
118 CHECK( m_dqStatusKey.initialize() );
119
120 if (!m_eventInfoKey.key().empty()) {
121 ATH_CHECK( m_eventInfoKey.initialize() );
122 }
123 // TileDigitsContainer initialization
124 ATH_CHECK( m_digitsContainerKey.initialize() );
125
126 return StatusCode::SUCCESS;
127}
128
132
133 // find TileCablingService
135
136 // retrieve TileID helper from det store
137 CHECK( detStore()->retrieve(m_tileID) );
138
139 CHECK( detStore()->retrieve(m_tileHWID) );
140
141 CHECK( m_adderFilterAlgTool.retrieve() );
142
143 StatusCode sc;
144 sc &= m_adderFilterAlgTool->setProperty("TileRawChannelContainer", "TileAdderFlat");
145 sc &= m_adderFilterAlgTool->setProperty("calibrateEnergy", "true");
146 sc &= m_adderFilterAlgTool->setProperty("PedStart", "0");
147 sc &= m_adderFilterAlgTool->setProperty("PedLength", "1");
148 sc &= m_adderFilterAlgTool->setProperty("PedOffset", "0");
149 sc &= m_adderFilterAlgTool->setProperty("SignalStart", "1");
150 sc &= m_adderFilterAlgTool->setProperty("SignalLength", "15");
151 sc &= m_adderFilterAlgTool->setProperty("FilterLength", "5");
152 sc &= m_adderFilterAlgTool->setProperty("FrameLength", "16");
153 sc &= m_adderFilterAlgTool->setProperty("DeltaCutLo", "9.5");
154 sc &= m_adderFilterAlgTool->setProperty("DeltaCutHi", "9.5");
155 sc &= m_adderFilterAlgTool->setProperty("RMSCutLo", "1.0");
156 sc &= m_adderFilterAlgTool->setProperty("RMSCutHi", "1.0");
157
158 if (sc.isFailure()) {
159 ATH_MSG_ERROR("Failure setting properties of " << m_adderFilterAlgTool);
160 return StatusCode::FAILURE;
161 }
162
164 m_tileOFCorrelation->SetCorrelationZero(msg(), m_nSamples);
165
166 ATH_MSG_INFO( "calibMode " << m_calibMode );
167 ATH_MSG_INFO( "number of samples " << m_nSamples );
168
169 // set event number to 0 before first event
170 m_evtNr = 0;
171
172 if (m_evtNr == 0) {
173 if (m_beamElemContainer.length() > 0) {
174 ServiceHandle<IConversionSvc> cnvSvc("ByteStreamCnvSvc", "");
175 if (cnvSvc.retrieve().isFailure()) {
176 ATH_MSG_ERROR( " Can't get ByteStreamCnvSvc " );
177 m_beamCnv = nullptr;
178 } else {
180 if (m_beamCnv == nullptr) {
181 ATH_MSG_ERROR( " Can't get TileBeamElemContByteStreamCnv " );
182 }
183 }
184
185 } else {
186 m_beamCnv = nullptr;
187 }
188 }
189
190 ATH_MSG_INFO( "initialization completed" );
191 return StatusCode::SUCCESS;
192}
193
195StatusCode TileDigiNoiseCalibAlg::execute(const EventContext& ctx) {
196
197 const TileDQstatus * dqStatus = SG::makeHandle (m_dqStatusKey, ctx).get();
198
199 StatusCode sc;
200 bool empty(false);
201
202 if (m_evtNr < 0) {
203
204 if (FirstEvt_initialize().isFailure()) {
205 ATH_MSG_ERROR( "FirstEvt_initialize failed" );
206 }
207
208 bool calibMode = (dqStatus->calibMode() == 1);
209 if (calibMode != m_calibMode) {
210 ATH_MSG_INFO( "Calib mode from data is " );
211 ATH_MSG_INFO( " Overwriting calib mode " );
212 m_calibMode = calibMode;
213 }
214
215 m_cispar = dqStatus->cispar();
216 StoreRunInfo(dqStatus); // done only once
217 }
218
219 m_cispar = dqStatus->cispar();
220 if (m_evtNr % 1000 == 0)
221 ATH_MSG_WARNING( m_evtNr << " events processed so far" );
222
223 // store TileDigits
224 if (m_nSamples > 0) sc = fillDigits (dqStatus);
225 empty &= (sc.isFailure());
226
227 if (empty) {
228 ATH_MSG_WARNING( "Error in execute " );
229 }
230 ++m_evtNr;
231 return StatusCode::SUCCESS;
232}
233
236
237 ATH_MSG_INFO( "Finalizing TileDigiNoiseCalibAlg" );
238
239 finalDigits();
240
241 std::ostringstream sStr;
242 std::string trig_str;
243
244 if (m_trigType == Phys) trig_str = "Phys";
245 else if (m_trigType == Las) trig_str = "Las";
246 else if (m_trigType == Ped) trig_str = "Ped";
247 else if (m_trigType == Cis) trig_str = "Cis";
248 else {
249 ATH_MSG_WARNING( "Unknown trigger type " << m_trigType );
250 trig_str = "Unk";
251 }
252 sStr << m_file << "_" << m_run << "_" << trig_str << ".root";
253 m_file = sStr.str();
254 ATH_MSG_INFO( "Writing calibrations to file " << m_file );
255
256 // Create output file: for now creating file for just this
257 // algorithm; want to add to ntuple file eventually??
258 TFile* fout = new TFile(m_file.c_str(), "recreate");
259
260 // Create tree with branches
261 TTree* t = new TTree(m_ntupleID.c_str(), "TileCalib-Ntuple");
262
263 t->Branch("RunNumber", &m_run, "RunNumber/I");
264 t->Branch("TrigType", &m_trigType, "TrigType/I");
265 t->Branch("Time", &m_time, "Time/I");
266 t->Branch("Year", &m_year, "Year/I");
267 t->Branch("Month", &m_month, "Month/I");
268 t->Branch("Day", &m_day, "Day/I");
269 t->Branch("YDay", &m_yday, "YDay/I");
270 t->Branch("Hour", &m_hour, "Hour/I");
271 t->Branch("Min", &m_min, "Min/I");
272 t->Branch("nSamples", &m_nSamples, "nSamples/I");
273 t->Branch("nEvt", &m_evtNr, "nEvt/I"); // events processed
274 t->Branch("ros", *m_ros, "ros[5][64][48][2]/b");
275 t->Branch("drawer", *m_drawer, "drawer[5][64][48][2]/b");
276 t->Branch("channel", *m_channel, "channel[5][64][48][2]/b");
277 t->Branch("gain", *m_gain, "gain[5][64][48][2]/O");
278 t->Branch("EvtGood", *m_evt, "Evt[5][64][48][2]/I"); // events used in the noise calculation for every channel
279 t->Branch("ped", *m_ped, "ped[5][64][48][2]/F");
280 t->Branch("lfn", *m_lfn, "lfn[5][64][48][2]/F");
281 t->Branch("hfn", *m_hfn, "hfn[5][64][48][2]/F");
282 t->Branch("noise_cov", *m_noise_cov, "noise_cov[5][64][2]/F");
283 // AutoCorrelation Matrix: Store only non-diagonal half of symmetric matrix
284 t->Branch("auto_corr", *m_auto_corr, "auto_corr[5][64][48][2][36]/F");
285
286 // Fill with current values (i.e. tree will have only one entry for this whole run)
287
288 t->Fill();
289 t->Write();
290
291 fout->Close();
292
293 return StatusCode::SUCCESS;
294}
295
298 if (not dqStatus){
299 m_time = 0;
300 m_year = 0;
301 m_month = 0;
302 m_day = 0;
303 m_yday = 0;
304 m_hour = 0;
305 m_min = 0;
306 m_trigType = 0;
307 ATH_MSG_WARNING( "TileDigiNoiseCalibAlg::StoreRunInfo : dqStatus pointer is null" );
308 return;
309 }
310 if (dqStatus->calibMode() == 1 && m_beamElemContainer.length() > 0) {// Bigain can use cispar
311 if (m_beamCnv) {
312 // std::cout << "LUCA m_time= "<< m_time << " bc_time_seconds= "<< m_beamCnv->eventFragment()->bc_time_seconds() <<
313 // " bc_time_nanoseconds= " << m_beamCnv->eventFragment()->bc_time_nanoseconds() << std::endl;
314 if (m_beamCnv->validBeamFrag()) {
315 m_run = m_beamCnv->robFragment()->rod_run_no(); // take it from beam ROD header
316 } else {
317 m_run = 0;
318 }
319 } else
320 m_run = 0;
321
322 if (m_cispar) {
323 m_time = m_cispar[10]; //time in sc from 1970
324 m_trigType = m_cispar[12];
325 } else {
326 m_time = 0;
327 m_year = 0;
328 m_month = 0;
329 m_day = 0;
330 m_yday = 0;
331 m_hour = 0;
332 m_min = 0;
333 m_trigType = 0;
334 }
335 } else {// monogain can use eventinfo
336
338 if ( !eventInfo.isValid() ) {
339 ATH_MSG_ERROR( "No EventInfo object found! Can't read run number!" );
340 m_run = 0;
341 m_time = 0;
342 m_trigType = 0;
343 } else {
344 m_run = eventInfo->runNumber();
345 m_time = eventInfo->timeStamp();
346 if (!(eventInfo->eventType(xAOD::EventInfo::IS_CALIBRATION))) // if not calibration, physics
347 m_trigType = 1;
348 else
349 m_trigType = 0;
350 }
351
352 }
353
354 if (m_time != 0) {
355 struct tm t;
356 time_t t_time = m_time;
357 localtime_r(&t_time, &t);
358 m_year = t.tm_year + 1900;
359 m_month = t.tm_mon + 1;
360 m_day = t.tm_mday;
361 m_yday = t.tm_yday + 1;
362 m_hour = t.tm_hour;
363 m_min = t.tm_min;
364 } else {
365 m_year = 0;
366 m_month = 0;
367 m_day = 0;
368 m_yday = 0;
369 m_hour = 0;
370 m_min = 0;
371 }
372}
373
376/*---------------------------------------------------------*/
377StatusCode TileDigiNoiseCalibAlg::fillDigits (const TileDQstatus* theDQstatus) {
378/*---------------------------------------------------------*/
379
381 ATH_CHECK( digitsCnt.isValid() );
382
383 TileDigitsContainer::const_iterator collItr = digitsCnt->begin();
384 TileDigitsContainer::const_iterator lastColl = digitsCnt->end();
385
386 for (; collItr != lastColl; ++collItr) {
387
388 TileDigitsCollection::const_iterator digitsItr = (*collItr)->begin();
389 TileDigitsCollection::const_iterator lastDigits = (*collItr)->end();
390
391 if (digitsItr != lastDigits) { //loop over all the drawers in the data
392
393 HWIdentifier adc_id = (*digitsItr)->adc_HWID();
394 int ros = m_tileHWID->ros(adc_id);
395 // IMPORTANT! ros for TileCal partitions goes like LBA=1 LBC=2 EBA=3 EBC=4
396
397 int drawer = m_tileHWID->drawer(adc_id);
398 // IMPORTANT! Drawers are from 0 to 63!
399
400 //coverity[STACK_USE]
401 double mean_tmp[48][16][2] = {};
402
403
404 for (; digitsItr != lastDigits; ++digitsItr) { // loop over all channels in the drawer
405
406 adc_id = (*digitsItr)->adc_HWID();
407 int chan = m_tileHWID->channel(adc_id);
408 if (m_usePMT) {
409 chan = digiChannel2PMT(ros, chan); // IMPORTANT: 0-47 PMT format!
410 // by default we use CHANNELS.
411 // PMTs usage is possible by switching on m_usePMT
412 }
413 int gain = m_tileHWID->adc(adc_id);
414
415 std::vector<float> vdigits = (*digitsItr)->samples();
416
417 // Needed to calculate the AutoCorrealtion matrix at end of run
418 //m_tileOFCorrelation->RunningCorrelation(vdigits,ros-1,drawer,chan,gain,msg(),false,m_nSamples,100);
419
420 // if (theDQstatus->isChEmpty(ros, drawer, chan)) {
421 // ATH_MSG_DEBUG( "Skipping Module: " << TileCalibUtils::getDrawerString(ros, drawer)
422 // << " channel: " << chan
423 // << " ADC: " << gain
424 // << " because empty" );
425 // continue;
426 // }
427
428 // If DQ problem, do not fill calib ntuple
429 if (m_calibMode == 1) {// Bigain: check indivual adc's
430 if (!(theDQstatus->isAdcDQgood(ros, drawer, chan, gain))) {
431 ATH_MSG_DEBUG( "Skipping Module: " << TileCalibUtils::getDrawerString(ros, drawer)
432 << " channel: " << chan
433 << " ADC: " << gain
434 << " due to DQ error found." );
435 continue;
436 }
437 } else {// monogain, just check channel
438
439 if (!(theDQstatus->isChanDQgood(ros, drawer, chan))) {
440 ATH_MSG_DEBUG( "Skipping Module: " << TileCalibUtils::getDrawerString(ros, drawer)
441 << " channel: " << chan
442 << " due to DQ error found." );
443 continue;
444 }
445 }
446
447 double meansamp = 0.0;
448 double rmssamp = 0.0;
449 unsigned int dsize = vdigits.size();
450
451 if (dsize > 16) {
452 ATH_MSG_ERROR( "length of digits vector " << dsize << " - greater than 16 !" );
453 dsize = 16;
454 }
455
456 for (unsigned int i = 0; i < dsize; ++i) {
457 double dig = vdigits[i];
458 meansamp += dig;
459 rmssamp += dig * dig;
460 mean_tmp[chan][i][gain] = dig;
461 }
462 if (dsize > 0) {
463 m_ped[ros][drawer][chan][gain] += vdigits[0];
464 m_sumPed2[ros][drawer][chan][gain] += vdigits[0] * vdigits[0];
465
466 if (dsize > 1) {
467 m_evt[ros][drawer][chan][gain]++;
468 meansamp /= dsize;
469 rmssamp = rmssamp / dsize - meansamp * meansamp;
470 rmssamp = (rmssamp > 0.0) ? sqrt(rmssamp * dsize / (dsize - 1)) : 0.0;
471 m_hfn[ros][drawer][chan][gain] += rmssamp;
472 m_sumRms2[ros][drawer][chan][gain] += rmssamp * rmssamp;
473 }
474 }
475
476 // Fill event-by-event correlation values
477 if (m_doAvgCorr)
478 m_tileOFCorrelation->RunningCorrelation(vdigits, ros - 1, drawer, chan, gain, msg(), false, m_nSamples, 100);
479 else
480 m_tileOFCorrelation->Sum(vdigits, ros - 1, drawer, chan, gain, msg(), false, m_nSamples, m_doRobustCov);
481
482 } // loop over channels
483
484 //For cor&cov
485 for (int sample = 0; sample < m_nSamples; ++sample) {
486 for (unsigned int gain = 0; gain < TileCalibUtils::MAX_GAIN; ++gain) {
487 for (unsigned int chan_i = 0; chan_i < TileCalibUtils::MAX_CHAN; ++chan_i) {
488 m_meanAmp[ros][drawer][chan_i][gain] += mean_tmp[chan_i][sample][gain];
489 for (unsigned int chan_j = 0; chan_j < TileCalibUtils::MAX_CHAN; ++chan_j)
490 m_meanAmp_ij[ros][drawer][chan_i][chan_j][gain] += mean_tmp[chan_i][sample][gain] * mean_tmp[chan_j][sample][gain];
491 }
492 }
493 }
494 } //check if Digits in module
495 } //loop over drawers
496
497 return StatusCode::SUCCESS;
498}
499
502/*---------------------------------------------------------*/
504/*---------------------------------------------------------*/
505
506
507 // Calculate AutoCorrealtion matrix
508 // --Average calculation (Assumes matrix is Toeplitz)
509 if (m_doAvgCorr)
510 m_tileOFCorrelation->CalcRunningCorrelation(msg(), m_nSamples, 100, false);
511 // --Rigorous calculation
512 else
513 m_tileOFCorrelation->CalcCorrelation(msg(), m_nSamples, false, m_doRobustCov);
514
515 // Needed to store autoCorrelation matrix
516 float tmpCorr[9][9] = {};
517
518
519 for (unsigned int ros = 1; ros < TileCalibUtils::MAX_ROS; ++ros) {
520 for (unsigned int drawer = 0; drawer < TileCalibUtils::MAX_DRAWER; ++drawer) {
521 for (unsigned int gain = 0; gain < TileCalibUtils::MAX_GAIN; ++gain) {
522 for (unsigned int chan = 0; chan < TileCalibUtils::MAX_CHAN; ++chan) {
523
524 m_ros[ros][drawer][chan][gain] = ros;
525 m_drawer[ros][drawer][chan][gain] = drawer;
526 m_channel[ros][drawer][chan][gain] = chan;
527 m_gain[ros][drawer][chan][gain] = gain;
528
529 if (m_evt[ros][drawer][chan][gain] > 0) {
530 int nev = m_evt[ros][drawer][chan][gain];
531 m_ped[ros][drawer][chan][gain] /= nev;
532 double Ped = m_ped[ros][drawer][chan][gain];
533 m_hfn[ros][drawer][chan][gain] /= nev;
534
535 if (nev > 1) {
536 double PedRMS = m_sumPed2[ros][drawer][chan][gain] / nev - Ped * Ped;
537 PedRMS = m_sumPed2[ros][drawer][chan][gain] / nev - Ped * Ped;
538 PedRMS = (PedRMS > 0.0) ? sqrt(PedRMS * nev / (nev - 1)) : 0.0;
539 m_lfn[ros][drawer][chan][gain] = PedRMS;
540 }
541 }
542
543 // Get values from AutoCorrelation matrix
544 // matrix is symmetric, so only half-retrieved and stored
545 m_tileOFCorrelation->GetCorrelation(m_nSamples, tmpCorr, ros - 1, drawer, chan, gain);
546 //std::cout << "Printing AutoCorr values: " << std::endl;
547 int nVals = 0;
548 if (m_doRobustCov){ //save 28 elements for robust method
549 for (int i = 0; i < m_nSamples; i++) {
550 for (int j = i; j < m_nSamples; j++) {
551 //std::cout << "Auto Corr [" << i << "][" << j << "]:" << tmpCorr[i][j] << std::endl;
552 //std::cout << "Auto CorrSym [" << j << "][" << i << "]:" << tmpCorr[j][i] << std::endl;
553 m_auto_corr[ros][drawer][chan][gain][nVals] = tmpCorr[i][j];
554 nVals++;
555 }
556 }
557 } else {
558 for (int i = 0; i < m_nSamples; i++) {
559 for (int j = i+1; j < m_nSamples; j++) {
560 //std::cout << "Auto Corr [" << i << "][" << j << "]:" << tmpCorr[i][j] << std::endl;
561 //std::cout << "Auto CorrSym [" << j << "][" << i << "]:" << tmpCorr[j][i] << std::endl;
562 m_auto_corr[ros][drawer][chan][gain][nVals] = tmpCorr[i][j];
563 nVals++;
564 }
565 }
566 }
567
568 } // end chan loop
569
570 //Calculate covariance loop over chan_i, chan_j
571 if (m_evtNr * m_nSamples > 0) {
572 // Avoid a spurious FPE from clang.
574 //replace m_evtNr with sqrt(m_evt[ch_i]*m_evt[ch_j])
575
576 for (unsigned int chan_i = 0; chan_i < TileCalibUtils::MAX_CHAN; ++chan_i) {
577 m_meanAmp[ros][drawer][chan_i][gain] /= m_evtNr * m_nSamples;
578 for (unsigned int chan_j = 0; chan_j < TileCalibUtils::MAX_CHAN; ++chan_j)
579 m_meanAmp_ij[ros][drawer][chan_i][chan_j][gain] /= m_evtNr * m_nSamples;
580 }
581
582 //coverity[STACK_USE]
583 double covar[48][48];
584 double mean_cov_ii = 0.; // mean values of covar in diag terms
585 double mean_cov_ij = 0.; // mean values of covar in off diag terms
586
587 for (unsigned int chan_i = 0; chan_i < TileCalibUtils::MAX_CHAN; ++chan_i) {
588 for (unsigned int chan_j = 0; chan_j < TileCalibUtils::MAX_CHAN; ++chan_j) {
589 covar[chan_i][chan_j] = m_meanAmp_ij[ros][drawer][chan_i][chan_j][gain] - m_meanAmp[ros][drawer][chan_i][gain] * m_meanAmp[ros][drawer][chan_j][gain];
590
591 if (chan_j < chan_i) {
592 mean_cov_ij += covar[chan_i][chan_j]; //LF: we take C_ij with its sign
593 }
594 }
595 mean_cov_ii += covar[chan_i][chan_i];
596 }
597
598 if (mean_cov_ii != 0.) {
599 m_noise_cov[ros][drawer][gain] = (2. * mean_cov_ij) / (mean_cov_ii * 47.); //(2*cov_ij/(48*47))/(cov_ii/48)
600
601 } else {
602 m_noise_cov[ros][drawer][gain] = 0.;
603 }
604
605 }
606 }
607 }
608 }
609}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t sc
Handle class for reading from StoreGate.
#define NVALS
static const Attributes_t empty
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
virtual bool isValid() override final
Can the handle be successfully dereferenced?
This AthConstConverter class provides conversion from ByteStream to TileBeamElemContainer.
static const TileCablingService * getInstance()
get pointer to service instance
static const unsigned int MAX_ROS
Number of ROSs.
static std::string getDrawerString(unsigned int ros, unsigned int drawer)
Return the drawer name, e.g.
static const unsigned int MAX_GAIN
Number of gains per channel.
static const unsigned int MAX_DRAWER
Number of drawers in ROS 1-4.
static const unsigned int MAX_CHAN
Number of channels in drawer.
Class that holds Data Quality fragment information and provides functions to extract the data quality...
bool isAdcDQgood(int partition, int drawer, int ch, int gain) const
returns status of single ADC returns False if there are any errors
bool isChanDQgood(int partition, int drawer, int ch) const
returns status of single channel (if bigain, returns AND of ADCs' status
uint32_t calibMode() const
Calibration mode.
const uint32_t * cispar() const
CIS parameters.
TileOFCorrelation * m_tileOFCorrelation
double(* m_meanAmp_ij)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_CHAN][Tile::MAX_GAIN]
ToolHandle< TileRawChannelBuilderFlatFilter > m_adderFilterAlgTool
double(* m_sumRms2)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_auto_corr)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN][NVALS]
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
virtual StatusCode initialize() override
Only array initialization is done here All the helpers initialization is done at the first event.
uint8_t(* m_channel)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
bool(* m_gain)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
TileDigiNoiseCalibAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< TileDQstatus > m_dqStatusKey
float(* m_hfn)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
StatusCode fillDigits(const TileDQstatus *theDQstatus)
fillDigits is called at every events.
float(* m_noise_cov)[Tile::MAX_DRAWER][Tile::MAX_GAIN]
uint8_t(* m_ros)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
void finalDigits()
finalDigits is called during finalize Here the average Ped, m_lfn, m_hfn and covariance are calculate...
TileBeamElemContByteStreamCnv * m_beamCnv
virtual StatusCode finalize() override
The output ntuple is created in finalize method.
double(* m_meanAmp)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
StatusCode FirstEvt_initialize()
Initialization done at the first event.
SG::ReadHandleKey< TileDigitsContainer > m_digitsContainerKey
void StoreRunInfo(const TileDQstatus *dqStatus)
StoreRunInfo is called only during the first event.
const TileCablingService * m_cabling
float(* m_lfn)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
int digiChannel2PMT(int ros, int chan)
double(* m_sumPed2)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
virtual StatusCode execute(const EventContext &ctx) override
Main method.
int(* m_evt)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
uint8_t(* m_drawer)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_ped)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
@ IS_CALIBRATION
true: calibration, false: physics
static TFile * fout
Definition listroot.cxx:40
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Tell the compiler to optimize assuming that FP may trap.
#define CXXUTILS_TRAPPING_FP
Definition trapping_fp.h:24