ATLAS Offline Software
Loading...
Searching...
No Matches
TileDigiNoiseCalibAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 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
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
196
197 const EventContext& ctx = Gaudi::Hive::currentContext();
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 //replace m_evtNr with sqrt(m_evt[ch_i]*m_evt[ch_j])
574
575 for (unsigned int chan_i = 0; chan_i < TileCalibUtils::MAX_CHAN; ++chan_i) {
576 m_meanAmp[ros][drawer][chan_i][gain] /= m_evtNr * m_nSamples;
577 for (unsigned int chan_j = 0; chan_j < TileCalibUtils::MAX_CHAN; ++chan_j)
578 m_meanAmp_ij[ros][drawer][chan_i][chan_j][gain] /= m_evtNr * m_nSamples;
579 }
580
581 //coverity[STACK_USE]
582 double covar[48][48];
583 double mean_cov_ii = 0.; // mean values of covar in diag terms
584 double mean_cov_ij = 0.; // mean values of covar in off diag terms
585
586 for (unsigned int chan_i = 0; chan_i < TileCalibUtils::MAX_CHAN; ++chan_i) {
587 for (unsigned int chan_j = 0; chan_j < TileCalibUtils::MAX_CHAN; ++chan_j) {
588 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];
589
590 if (chan_j < chan_i) {
591 mean_cov_ij += covar[chan_i][chan_j]; //LF: we take C_ij with its sign
592 }
593 }
594 mean_cov_ii += covar[chan_i][chan_i];
595 }
596
597 if (mean_cov_ii != 0.) {
598 m_noise_cov[ros][drawer][gain] = (2. * mean_cov_ij) / (mean_cov_ii * 47.); //(2*cov_ij/(48*47))/(cov_ii/48)
599
600 } else {
601 m_noise_cov[ros][drawer][gain] = 0.;
602 }
603
604 }
605 }
606 }
607 }
608}
#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
MsgStream & msg() 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)
virtual StatusCode execute() override
Main method.
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]
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())