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