17#include "GaudiKernel/ISvcLocator.h"
40#include "TFitResult.h"
41#include "TFitResultPtr.h"
42#include "TMatrixDSym.h"
43#include "TGraphErrors.h"
44#include "TClonesArray.h"
201 float binwidth[2] = { 0.125, 0.25 };
204 std::ostringstream sStr;
213 sStr <<
"Amplitudes_RC_" <<
rc <<
"_Part_" << ros <<
"_Drawer_" << drawer <<
"_Ch_" << ch <<
"_Gain_" << g;
215 m_histAmp[
rc][ros][drawer][ch][g] =
new TH1F(nam.c_str(), nam.c_str(), nbin, -
xmax[g],
xmax[g]);
216 m_histAmp[
rc][ros][drawer][ch][g]->SetCanExtend(TH1::kAllAxes);
217 m_histAmp[
rc][ros][drawer][ch][g]->SetDirectory(
nullptr);
225 float cellbin[2] = { 80., 2.5 };
226 float xcellmax[2] = { (float) nbin *
cellbin[0] / 2.F, (
float) nbin *
cellbin[1] / 2.F };
228 for (
int side = 0; side <
NSIDES; side++) {
230 for (
int sample = 0; sample <
NSAMPLES; sample++) {
231 for (
int tower = 0; tower <
NTOWERS; tower++) {
234 sStr <<
"CellAmplitude_Side_" << side <<
"_Drawer_" << drawer <<
"_Sample_" << sample <<
"_Tower_" << tower <<
"_Gains_" << gg;
236 m_histCellAmp[side][drawer][sample][tower][gg] =
new TH1F(nam.c_str(), nam.c_str(), nbin, -xcellmax[gg / 3], xcellmax[gg / 3]);
237 m_histCellAmp[side][drawer][sample][tower][gg]->SetCanExtend(TH1::kAllAxes);
238 m_histCellAmp[side][drawer][sample][tower][gg]->SetDirectory(
nullptr);
268 return StatusCode::SUCCESS;
293 if (cnvSvc.retrieve().isFailure()) {
302 ATH_MSG_ERROR(
" Can't get TileBeamElemContByteStreamCnv " );
312 return StatusCode::SUCCESS;
327 bool calibMode = (dqStatus->
calibMode() == 1);
355 return StatusCode::SUCCESS;
387 std::ostringstream sStr;
388 std::string trig_str;
399 sStr <<
m_file <<
"_" <<
m_run <<
"_" << trig_str <<
".root";
405 TFile*
fout =
new TFile(
m_file.c_str(),
"recreate");
408 TTree* t =
new TTree(
m_ntupleID.c_str(),
"Tile_RC_NoiseCalib-Ntuple");
410 t->Branch(
"RunNumber", &
m_run,
"RunNumber/I");
411 t->Branch(
"TrigType", &
m_trigType,
"TrigType/I");
412 t->Branch(
"Time", &
m_time,
"Time/I");
413 t->Branch(
"Year", &
m_year,
"Year/I");
414 t->Branch(
"Month", &
m_month,
"Month/I");
415 t->Branch(
"Day", &
m_day,
"Day/I");
416 t->Branch(
"YDay", &
m_yday,
"YDay/I");
417 t->Branch(
"Hour", &
m_hour,
"Hour/I");
418 t->Branch(
"Min", &
m_min,
"Min/I");
419 t->Branch(
"nEvt", &
m_evtNr,
"nEvt/I");
420 t->Branch(
"EvtNr", &
m_evtNr,
"EvtNr/I");
421 t->Branch(
"EvtGood", *
m_evt,
"Evt[5][64][48][2]/I");
424 t->Branch(
"ros", *
m_ros,
"ros[5][64][48][2]/b");
425 t->Branch(
"drawer", *
m_drawer,
"drawer[5][64][48][2]/b");
426 t->Branch(
"channel", *
m_channel,
"channel[5][64][48][2]/b");
427 t->Branch(
"gain", *
m_gain,
"gain[5][64][48][2]/O");
429 t->Branch(
"efit_mean",*(
m_rc_mean[
Fit]),
"efit_mean[5][64][48][2]/F");
430 t->Branch(
"efit_av",*(
m_rc_av[
Fit]),
"efit_av[5][64][48][2]/F");
431 t->Branch(
"efit_rms",*(
m_rc_rms[
Fit]),
"efit_rms[5][64][48][2]/F");
432 t->Branch(
"efit_sigma",*(
m_rc_sigma[
Fit]),
"efit_sigma[5][64][48][2]/F");
433 t->Branch(
"efit_mean_err",*(
m_rc_mean_err[
Fit]),
"efit_mean_err[5][64][48][2]/F");
434 t->Branch(
"efit_sigma_err",*(
m_rc_sigma_err[
Fit]),
"efit_sigma_err[5][64][48][2]/F");
435 t->Branch(
"efit_kurtosis",*(
m_rc_kurtosis[
Fit]),
"efit_kurtosis[5][64][48][2]/F");
436 t->Branch(
"efit_skewness",*(
m_rc_skewness[
Fit]),
"efit_skewness[5][64][48][2]/F");
437 t->Branch(
"efit_chi2",*(
m_rc_chi2[
Fit]),
"efit_chi2[5][64][48][2]/F");
438 t->Branch(
"efit_ndf",*(
m_rc_ndf[
Fit]),
"efit_ndf[5][64][48][2]/F");
439 t->Branch(
"efit_probC2",*(
m_rc_probC2[
Fit]),
"efit_probC2[5][64][48][2]/F");
441 t->Branch(
"efit_gsigma1",*(
m_rc_gsigma1[
Fit]),
"efit_gsigma1[5][64][48][2]/F");
442 t->Branch(
"efit_gsigma2",*(
m_rc_gsigma2[
Fit]),
"efit_gsigma2[5][64][48][2]/F");
443 t->Branch(
"efit_gnorm",*(
m_rc_gnorm[
Fit]),
"efit_gnorm[5][64][48][2]/F");
444 t->Branch(
"efit_gchi2",*(
m_rc_gchi2[
Fit]),
"efit_gchi2[5][64][48][2]/F");
445 t->Branch(
"efit_gerrsigma1",*(
m_rc_gerrsigma1[
Fit]),
"efit_gerrsigma1[5][64][48][2]/F");
446 t->Branch(
"efit_gerrnorm",*(
m_rc_gerrnorm[
Fit]),
"efit_gerrnorm[5][64][48][2]/F");
447 t->Branch(
"efit_gerrsigma2",*(
m_rc_gerrsigma2[
Fit]),
"efit_gerrsigma2[5][64][48][2]/F");
451 t->Branch(
"efixed_mean",*(
m_rc_mean[
Fixed]),
"efixed_mean[5][64][48][2]/F");
452 t->Branch(
"efixed_av",*(
m_rc_av[
Fixed]),
"efixed_av[5][64][48][2]/F");
453 t->Branch(
"efixed_rms",*(
m_rc_rms[
Fixed]),
"efixed_rms[5][64][48][2]/F");
454 t->Branch(
"efixed_sigma",*(
m_rc_sigma[
Fixed]),
"efixed_sigma[5][64][48][2]/F");
455 t->Branch(
"efixed_mean_err",*(
m_rc_mean_err[
Fixed]),
"efixed_mean_err[5][64][48][2]/F");
457 t->Branch(
"efixed_kurtosis",*(
m_rc_kurtosis[
Fixed]),
"efixed_kurtosis[5][64][48][2]/F");
458 t->Branch(
"efixed_skewness",*(
m_rc_skewness[
Fixed]),
"efixed_skewness[5][64][48][2]/F");
459 t->Branch(
"efixed_chi2",*(
m_rc_chi2[
Fixed]),
"efixed_chi2[5][64][48][2]/F");
460 t->Branch(
"efixed_ndf",*(
m_rc_ndf[
Fixed]),
"efixed_ndf[5][64][48][2]/F");
461 t->Branch(
"efixed_probC2",*(
m_rc_probC2[
Fixed]),
"efixed_probC2[5][64][48][2]/F");
463 t->Branch(
"efixed_gsigma1",*(
m_rc_gsigma1[
Fixed]),
"efixed_gsigma1[5][64][48][2]/F");
464 t->Branch(
"efixed_gsigma2",*(
m_rc_gsigma2[
Fixed]),
"efixed_gsigma2[5][64][48][2]/F");
465 t->Branch(
"efixed_gnorm",*(
m_rc_gnorm[
Fixed]),
"efixed_gnorm[5][64][48][2]/F");
466 t->Branch(
"efixed_gchi2",*(
m_rc_gchi2[
Fixed]),
"efixed_gchi2[5][64][48][2]/F");
468 t->Branch(
"efixed_gerrnorm",*(
m_rc_gerrnorm[
Fixed]),
"efixed_gerrnorm[5][64][48][2]/F");
473 t->Branch(
"eopt_mean",*(
m_rc_mean[
Opt]),
"eopt_mean[5][64][48][2]/F");
474 t->Branch(
"eopt_av",*(
m_rc_av[
Opt]),
"eopt_av[5][64][48][2]/F");
475 t->Branch(
"eopt_rms",*(
m_rc_rms[
Opt]),
"eopt_rms[5][64][48][2]/F");
476 t->Branch(
"eopt_sigma",*(
m_rc_sigma[
Opt]),
"eopt_sigma[5][64][48][2]/F");
477 t->Branch(
"eopt_mean_err",*(
m_rc_mean_err[
Opt]),
"eopt_mean_err[5][64][48][2]/F");
478 t->Branch(
"eopt_sigma_err",*(
m_rc_sigma_err[
Opt]),
"eopt_sigma_err[5][64][48][2]/F");
479 t->Branch(
"eopt_kurtosis",*(
m_rc_kurtosis[
Opt]),
"eopt_kurtosis[5][64][48][2]/F");
480 t->Branch(
"eopt_skewness",*(
m_rc_skewness[
Opt]),
"eopt_skewness[5][64][48][2]/F");
481 t->Branch(
"eopt_chi2",*(
m_rc_chi2[
Opt]),
"eopt_chi2[5][64][48][2]/F");
482 t->Branch(
"eopt_ndf",*(
m_rc_ndf[
Opt]),
"eopt_ndf[5][64][48][2]/F");
483 t->Branch(
"eopt_probC2",*(
m_rc_probC2[
Opt]),
"eopt_probC2[5][64][48][2]/F");
485 t->Branch(
"eopt_gsigma1",*(
m_rc_gsigma1[
Opt]),
"eopt_gsigma1[5][64][48][2]/F");
486 t->Branch(
"eopt_gsigma2",*(
m_rc_gsigma2[
Opt]),
"eopt_gsigma2[5][64][48][2]/F");
487 t->Branch(
"eopt_gnorm",*(
m_rc_gnorm[
Opt]),
"eopt_gnorm[5][64][48][2]/F");
488 t->Branch(
"eopt_gchi2",*(
m_rc_gchi2[
Opt]),
"eopt_gchi2[5][64][48][2]/F");
489 t->Branch(
"eopt_gerrsigma1",*(
m_rc_gerrsigma1[
Opt]),
"eopt_gerrsigma1[5][64][48][2]/F");
490 t->Branch(
"eopt_gerrnorm",*(
m_rc_gerrnorm[
Opt]),
"eopt_gerrnorm[5][64][48][2]/F");
491 t->Branch(
"eopt_gerrsigma2",*(
m_rc_gerrsigma2[
Opt]),
"eopt_gerrsigma2[5][64][48][2]/F");
495 t->Branch(
"edsp_mean",*(
m_rc_mean[
Dsp]),
"edsp_mean[5][64][48][2]/F");
496 t->Branch(
"edsp_av",*(
m_rc_av[
Dsp]),
"edsp_av[5][64][48][2]/F");
497 t->Branch(
"edsp_rms",*(
m_rc_rms[
Dsp]),
"edsp_rms[5][64][48][2]/F");
498 t->Branch(
"edsp_sigma",*(
m_rc_sigma[
Dsp]),
"edsp_sigma[5][64][48][2]/F");
499 t->Branch(
"edsp_mean_err",*(
m_rc_mean_err[
Dsp]),
"edsp_mean_err[5][64][48][2]/F");
500 t->Branch(
"edsp_sigma_err",*(
m_rc_sigma_err[
Dsp]),
"edsp_sigma_err[5][64][48][2]/F");
501 t->Branch(
"edsp_kurtosis",*(
m_rc_kurtosis[
Dsp]),
"edsp_kurtosis[5][64][48][2]/F");
502 t->Branch(
"edsp_skewness",*(
m_rc_skewness[
Dsp]),
"edsp_skewness[5][64][48][2]/F");
503 t->Branch(
"edsp_chi2",*(
m_rc_chi2[
Dsp]),
"edsp_chi2[5][64][48][2]/F");
504 t->Branch(
"edsp_ndf",*(
m_rc_ndf[
Dsp]),
"edsp_ndf[5][64][48][2]/F");
505 t->Branch(
"edsp_probC2",*(
m_rc_probC2[
Dsp]),
"edsp_probC2[5][64][48][2]/F");
507 t->Branch(
"edsp_gsigma1",*(
m_rc_gsigma1[
Dsp]),
"edsp_gsigma1[5][64][48][2]/F");
508 t->Branch(
"edsp_gsigma2",*(
m_rc_gsigma2[
Dsp]),
"edsp_gsigma2[5][64][48][2]/F");
509 t->Branch(
"edsp_gnorm",*(
m_rc_gnorm[
Dsp]),
"edsp_gnorm[5][64][48][2]/F");
510 t->Branch(
"edsp_gchi2",*(
m_rc_gchi2[
Dsp]),
"edsp_gchi2[5][64][48][2]/F");
511 t->Branch(
"edsp_gerrsigma1",*(
m_rc_gerrsigma1[
Dsp]),
"edsp_gerrsigma1[5][64][48][2]/F");
512 t->Branch(
"edsp_gerrnorm",*(
m_rc_gerrnorm[
Dsp]),
"edsp_gerrnorm[5][64][48][2]/F");
513 t->Branch(
"edsp_gerrsigma2",*(
m_rc_gerrsigma2[
Dsp]),
"edsp_gerrsigma2[5][64][48][2]/F");
517 t->Branch(
"eOF1_mean",*(
m_rc_mean[
OF1]),
"eOF1_mean[5][64][48][2]/F");
518 t->Branch(
"eOF1_av",*(
m_rc_av[
OF1]),
"eOF1_av[5][64][48][2]/F");
519 t->Branch(
"eOF1_rms",*(
m_rc_rms[
OF1]),
"eOF1_rms[5][64][48][2]/F");
520 t->Branch(
"eOF1_sigma",*(
m_rc_sigma[
OF1]),
"eOF1_sigma[5][64][48][2]/F");
521 t->Branch(
"eOF1_mean_err",*(
m_rc_mean_err[
OF1]),
"eOF1_mean_err[5][64][48][2]/F");
522 t->Branch(
"eOF1_sigma_err",*(
m_rc_sigma_err[
OF1]),
"eOF1_sigma_err[5][64][48][2]/F");
523 t->Branch(
"eOF1_kurtosis",*(
m_rc_kurtosis[
OF1]),
"eOF1_kurtosis[5][64][48][2]/F");
524 t->Branch(
"eOF1_skewness",*(
m_rc_skewness[
OF1]),
"eOF1_skewness[5][64][48][2]/F");
525 t->Branch(
"eOF1_chi2",*(
m_rc_chi2[
OF1]),
"eOF1_chi2[5][64][48][2]/F");
526 t->Branch(
"eOF1_ndf",*(
m_rc_ndf[
OF1]),
"eOF1_ndf[5][64][48][2]/F");
527 t->Branch(
"eOF1_probC2",*(
m_rc_probC2[
OF1]),
"eOF1_probC2[5][64][48][2]/F");
529 t->Branch(
"eOF1_gsigma1",*(
m_rc_gsigma1[
OF1]),
"eOF1_gsigma1[5][64][48][2]/F");
530 t->Branch(
"eOF1_gsigma2",*(
m_rc_gsigma2[
OF1]),
"eOF1_gsigma2[5][64][48][2]/F");
531 t->Branch(
"eOF1_gnorm",*(
m_rc_gnorm[
OF1]),
"eOF1_gnorm[5][64][48][2]/F");
532 t->Branch(
"eOF1_gchi2",*(
m_rc_gchi2[
OF1]),
"eOF1_gchi2[5][64][48][2]/F");
533 t->Branch(
"eOF1_gerrsigma1",*(
m_rc_gerrsigma1[
OF1]),
"eOF1_gerrsigma1[5][64][48][2]/F");
534 t->Branch(
"eOF1_gerrnorm",*(
m_rc_gerrnorm[
OF1]),
"eOF1_gerrnorm[5][64][48][2]/F");
535 t->Branch(
"eOF1_gerrsigma2",*(
m_rc_gerrsigma2[
OF1]),
"eOF1_gerrsigma2[5][64][48][2]/F");
539 t->Branch(
"eMF_mean",*(
m_rc_mean[
MF]),
"eMF_mean[5][64][48][2]/F");
540 t->Branch(
"eMF_av",*(
m_rc_av[
MF]),
"eMF_av[5][64][48][2]/F");
541 t->Branch(
"eMF_rms",*(
m_rc_rms[
MF]),
"eMF_rms[5][64][48][2]/F");
542 t->Branch(
"eMF_sigma",*(
m_rc_sigma[
MF]),
"eMF_sigma[5][64][48][2]/F");
543 t->Branch(
"eMF_mean_err",*(
m_rc_mean_err[
MF]),
"eMF_mean_err[5][64][48][2]/F");
544 t->Branch(
"eMF_sigma_err",*(
m_rc_sigma_err[
MF]),
"eMF_sigma_err[5][64][48][2]/F");
545 t->Branch(
"eMF_kurtosis",*(
m_rc_kurtosis[
MF]),
"eMF_kurtosis[5][64][48][2]/F");
546 t->Branch(
"eMF_skewness",*(
m_rc_skewness[
MF]),
"eMF_skewness[5][64][48][2]/F");
547 t->Branch(
"eMF_chi2",*(
m_rc_chi2[
MF]),
"eMF_chi2[5][64][48][2]/F");
548 t->Branch(
"eMF_ndf",*(
m_rc_ndf[
MF]),
"eMF_ndf[5][64][48][2]/F");
549 t->Branch(
"eMF_probC2",*(
m_rc_probC2[
MF]),
"eMF_probC2[5][64][48][2]/F");
551 t->Branch(
"eMF_gsigma1",*(
m_rc_gsigma1[
MF]),
"eMF_gsigma1[5][64][48][2]/F");
552 t->Branch(
"eMF_gsigma2",*(
m_rc_gsigma2[
MF]),
"eMF_gsigma2[5][64][48][2]/F");
553 t->Branch(
"eMF_gnorm",*(
m_rc_gnorm[
MF]),
"eMF_gnorm[5][64][48][2]/F");
554 t->Branch(
"eMF_gchi2",*(
m_rc_gchi2[
MF]),
"eMF_gchi2[5][64][48][2]/F");
555 t->Branch(
"eMF_gerrsigma1",*(
m_rc_gerrsigma1[
MF]),
"eMF_gerrsigma1[5][64][48][2]/F");
556 t->Branch(
"eMF_gerrnorm",*(
m_rc_gerrnorm[
MF]),
"eMF_gerrnorm[5][64][48][2]/F");
557 t->Branch(
"eMF_gerrsigma2",*(
m_rc_gerrsigma2[
MF]),
"eMF_gerrsigma2[5][64][48][2]/F");
561 t->Branch(
"ecell_av",*(
m_ecell_av),
"ecell_av[2][64][4][17][6]/F");
562 t->Branch(
"ecell_rms",*(
m_ecell_rms),
"ecell_rms[2][64][4][17][6]/F");
563 t->Branch(
"ecell_hash",*(
m_ecell_hash),
"ecell_hash[2][64][4][17]/i");
564 t->Branch(
"ecell_gsigma1",*(
m_gsigma1),
"ecell_gsigma1[2][64][4][17][6]/F");
565 t->Branch(
"ecell_gsigma2",*(
m_gsigma2),
"ecell_gsigma2[2][64][4][17][6]/F");
566 t->Branch(
"ecell_gnorm",*(
m_gnorm),
"ecell_gnorm[2][64][4][17][6]/F");
567 t->Branch(
"ecell_gchi2",*(
m_gchi2),
"ecell_gchi2[2][64][4][17][6]/F");
568 t->Branch(
"ecell_gerrsigma1",*(
m_gerrsigma1),
"ecell_gerrsigma1[2][64][4][17][6]/F");
569 t->Branch(
"ecell_gerrnorm",*(
m_gerrnorm),
"ecell_gerrnorm[2][64][4][17][6]/F");
570 t->Branch(
"ecell_gerrsigma2",*(
m_gerrsigma2),
"ecell_gerrsigma2[2][64][4][17][6]/F");
571 t->Branch(
"ecell_gcorrsigma1sigma2",*(
m_gcorrsigma1sigma2),
"ecell_gcorrsigma1sigma2[2][64][4][17][6]/F");
574 t->Branch(
"side", *
m_side,
"side[2][64][4][17][6]/O");
575 t->Branch(
"phi", *
m_phi,
"phi[2][64][4][17][6]/b");
576 t->Branch(
"sample", *
m_sample,
"sample[2][64][4][17][6]/b");
577 t->Branch(
"tower", *
m_tower,
"tower[2][64][4][17][6]/b");
578 t->Branch(
"gaingain", *
m_gg,
"gaingain[2][64][4][17][6]/b");
608 for (
int side = 0; side <
NSIDES; side++) {
610 for (
int sample = 0; sample <
NSAMPLES; ++sample) {
611 for (
int tower = 0; tower <
NTOWERS; ++tower) {
626 return StatusCode::SUCCESS;
640 ATH_MSG_WARNING(
"TileRawChNoiseCalibAlg::StoreRunInfo : dqStatus pointer is null");
643 MsgStream log(msgSvc(), name());
674 ATH_MSG_ERROR(
"No EventInfo object found! Can't read run number!" );
679 m_run = eventInfo->runNumber();
680 m_time = eventInfo->timeStamp();
691 localtime_r(&t_time, &t);
692 m_year = t.tm_year + 1900;
717 ATH_CHECK( rawChannelContainer.isValid() );
721 return StatusCode::FAILURE;
729 for (; collItr != lastColl; ++collItr) {
734 for (; chItr != lastCh; ++chItr) {
739 unsigned int ros(0), drawer(0), channel(0), gain(0);
740 m_tileIdTrans->getIndices(adc_id, ros, drawer, channel, gain);
743 if (dqStatus->
isChEmpty(ros, drawer, channel))
continue;
748 if (!(dqStatus->
isAdcDQgood(ros, drawer, channel, gain))) {
750 <<
" channel: " << channel
751 <<
" ADC: " << gain <<
" due to DQ error found." );
759 <<
" channel: " << channel <<
" due to DQ error found." );
783 m_evt[ros][drawer][chan][gain]++;
784 m_histAmp[rctype][ros][drawer][chan][gain]->Fill(amp);
791 return StatusCode::SUCCESS;
802 CxxUtils::FPControl ctl;
803 ctl.disable (CxxUtils::FPControl::Exc::divbyzero |
804 CxxUtils::FPControl::Exc::invalid);
806 TF1 * fit_gaus =
new TF1(
"g",
"gaus");
809 ATH_MSG_INFO(
"Fitting RCh container " << rctype <<
" ROS " << ros );
817 m_ros[ros][drawer][chan][gain] = ros;
818 m_drawer[ros][drawer][chan][gain] = drawer;
819 m_channel[ros][drawer][chan][gain] = chan;
820 m_gain[ros][drawer][chan][gain] = gain;
823 if (
m_evt[ros][drawer][chan][gain] > 0) {
825 TH1F& histAmp = *
m_histAmp[rctype][ros][drawer][chan][gain];
826 histAmp.Fit(
"g",
"NQ");
828 m_rc_av[rctype][ros][drawer][chan][gain] = histAmp.GetMean();
829 m_rc_rms[rctype][ros][drawer][chan][gain] = histAmp.GetRMS();
831 if (TMath::Abs(histAmp.GetSkewness()) < 1000.)
832 m_rc_skewness[rctype][ros][drawer][chan][gain] = histAmp.GetSkewness();
833 if (TMath::Abs(histAmp.GetKurtosis()) < 1000.)
834 m_rc_kurtosis[rctype][ros][drawer][chan][gain] = histAmp.GetKurtosis();
836 m_rc_mean[rctype][ros][drawer][chan][gain] = fit_gaus->GetParameter(1);
837 m_rc_mean_err[rctype][ros][drawer][chan][gain] = fit_gaus->GetParError(1);
838 m_rc_sigma[rctype][ros][drawer][chan][gain] = fit_gaus->GetParameter(2);
839 m_rc_sigma_err[rctype][ros][drawer][chan][gain] = fit_gaus->GetParError(2);
840 m_rc_chi2[rctype][ros][drawer][chan][gain] = fit_gaus->GetChisquare();
841 m_rc_ndf[rctype][ros][drawer][chan][gain] = fit_gaus->GetNDF();
842 m_rc_probC2[rctype][ros][drawer][chan][gain] = fit_gaus->GetProb();
876 unsigned int ros(0), drawer(0), channel(0), gain(0);
882 <<
" channel: " << channel
884 <<
" in fillCell() because channel is bad in DB." );
888 int sample =
m_tileID->sample(cell_id);
889 int tower =
m_tileID->tower(cell_id);
892 if (side == 1) side = 0;
893 else if (side == -1) side = 1;
917 if (
m_cabling->isRun2PlusCabling() && (ros > 2)) {
920 int drawer2 =
m_cabling->E1_merged_with_run2plus(ros, drawer);
923 m_ecell_ene[side][drawer2][sample][tower][gg / 3] += amp;
924 ++
m_cell_nch[side][drawer2][sample][tower][gg / 3];
926 if (TMath::Abs(amp) > 1.e-5) {
941 m_ecell_ene[side][drawer][sample][tower][gg / 3] += amp;
942 m_cell_nch[side][drawer][sample][tower][gg / 3] += nch;
944 if (TMath::Abs(amp) > 1.e-5) {
958 for (
int side = 0; side < 2; ++side) {
961 for (
int sample = 0; sample < 4; ++sample) {
962 for (
int tower = 0; tower < 17; ++tower) {
963 for (
int gg = 0; gg < 6; ++gg) {
965 m_side[side][drawer][sample][tower][gg] = side;
966 m_phi[side][drawer][sample][tower][gg] = drawer;
967 m_sample[side][drawer][sample][tower][gg] = sample;
968 m_tower[side][drawer][sample][tower][gg] = tower;
969 m_gg[side][drawer][sample][tower][gg] = gg;
976 m_gsigma1[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][0];
977 m_gsigma2[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][2];
978 m_gnorm[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][1];
979 m_gchi2[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][3];
980 m_gerrsigma1[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][4];
981 m_gerrnorm[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][5];
982 m_gerrsigma2[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][6];
1003 float xmin =
h->GetBinCenter(1);
1004 float xmax =
h->GetBinCenter(
h->GetNbinsX());
1005 TF1 total(
"total",
"gaus(0)+gaus(3)",
xmin,
xmax);
1006 total.SetLineColor(2);
1008 float nentries =
h->GetEntries();
1010 if (nentries == 0) {
1012 std::fill (gp, gp+8, 0);
1016 float rms =
h->GetRMS();
1017 float bin =
h->GetBinWidth(0);
1019 par[0] = 0.1 * nentries;
1021 par[2] = 0.7 * std::max(rms,
bin);
1023 par[3] = 0.15 * par[0];
1025 par[5] = 5. * par[2];
1027 total.SetParameters(par);
1029 float lim1 =
bin / 2.;
1030 float lim2 = std::max(rms * 1.05,
bin * 2.0);
1031 float lim3 = std::max(rms * 10.0,
bin * 20.);
1033 float limN1 = nentries;
1034 if (lim1 < 0.5) limN1 /= (2. * lim1);
1035 float limN2 = nentries;
1036 if (lim2 < 0.5) limN2 /= (2. * lim2);
1038 total.SetParLimits(0, 0., limN1);
1039 total.FixParameter(1, 0.);
1040 total.SetParLimits(2, lim1, lim2);
1041 total.SetParLimits(3, 0., limN2);
1042 total.FixParameter(4, 0.);
1043 total.SetParLimits(5, lim2, lim3);
1045 TFitResultPtr resfit =
h->Fit(&total,
"BLQRS");
1047 float par0 = total.GetParameter(0);
1048 float par3 = total.GetParameter(3);
1050 float sigma1 = total.GetParameter(2);
1051 float sigma2 = total.GetParameter(5);
1054 float errpar0 = total.GetParError(0);
1055 float errpar3 = total.GetParError(3);
1057 float errsigma1 = total.GetParError(2);
1058 float errsigma2 = total.GetParError(5);
1060 float norm = par0 != 0 ? par3 / par0 : 0;
1062 if (invert && norm > 1.) {
1069 gp[5] = sqrt((errpar0 * errpar0) + (errpar3 * errpar3) * (par0 * par0) / (par3 * par3)) / par3;
1079 gp[5] = par0 != 0 ? sqrt((errpar3 * errpar3) + (errpar0 * errpar0) * (par3 * par3) / (par0 * par0)) / par0 : 0;
1084 if (total.GetNDF() > 0) {
1085 gp[3] = total.GetChisquare() / total.GetNDF();
1091 if (resfit->CovMatrixStatus()) {
1092 TMatrixDSym corr = resfit->GetCorrelationMatrix();
1108 for (
int side = 0; side < 2; ++side) {
1110 for (
int sample = 0; sample < 4; ++sample) {
1111 for (
int tower = 0; tower < 17; ++tower) {
1114 float ene =
m_ecell_ene[side][drawer][sample][tower][gg];
1115 if (
m_cell_nch[side][drawer][sample][tower][gg] == 1 && sample != 3) ene *= 2;
1117 if (TMath::Abs(ene) > 1.e-5) {
1118 m_histCellAmp[side][drawer][sample][tower][gg * 3]->Fill(ene);
1151 for (
int side = 0; side < 2; side++) {
1153 for (
int sample = 0; sample < 4; ++sample) {
1154 for (
int tower = 0; tower < 17; ++tower) {
1155 for (
int gg = 0; gg < 6; gg++) {
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
Helper to control FP exceptions.
Handle class for reading from StoreGate.
TGraphErrors * GetEntries(TH2F *histo)
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
Header file for AthHistogramAlgorithm.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
This AthConstConverter class provides conversion from ByteStream to TileBeamElemContainer.
static bool C10_connected(int module)
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 unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
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.
static int isChEmpty(int partition, int drawer, int ch)
True if channel is not fully implemented.
const uint32_t * cispar() const
CIS parameters.
float(* m_rc_mean_err)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_av)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
uint8_t(* m_ros)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
uint32_t(* m_ecell_hash)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS]
float(* m_rc_probC2)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerMFKey
bool(* m_side)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
std::string m_digitsContainer
float(* m_rc_kurtosis)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_sigma_err)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_gsigma2)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_mean)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
uint8_t(* m_drawer)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_gerrsigma1)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
void finalRawCh(int rctype)
finalDigits is called during finalize Here the average Ped, lfn, hfn and covariance are calculated.
uint8_t(* m_gg)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
virtual ~TileRawChNoiseCalibAlg()
TileBeamElemContByteStreamCnv * m_beamCnv
float(* m_rc_gerrsigma1)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
static constexpr int NSIDES
uint8_t(* m_sample)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
static void doFit(TH1F *h, float *gp, bool invert=true)
doFit performs the double gaussian fit of the amplitude
SG::ReadHandleKey< TileDQstatus > m_dqStatusKey
uint8_t(* m_tower)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
void fillCellHist()
fillCellHist is called during execute It fill the HGHG and LGLG combination of the cell energies
uint8_t(* m_phi)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
float(* m_gerrnorm)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
bool(* m_gain)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
StatusCode fillRawChannels(const TileDQstatus *dqStatus, const SG::ReadHandleKey< TileRawChannelContainer > &rawChannelContainerKey, RCtype rctype)
float(* m_rc_chi2)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_ecell_ene)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][Tile::MAX_GAIN]
float(* m_rc_rms)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_gerrnorm)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_gchi2)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerFixedKey
float(* m_rc_sigma)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_rc_gsigma1)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
virtual StatusCode execute(const EventContext &ctx) override
Main method.
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerDspKey
TH1F *(* m_histAmp)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
ToolHandle< ITileBadChanTool > m_tileBadChanTool
const uint32_t * m_cispar
float(* m_rc_ndf)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
ToolHandle< TileCondToolEmscale > m_tileToolEmscale
float(* m_rc_skewness)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
float(* m_gcorrsigma1sigma2)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
std::string m_beamElemContainer
float(* m_ecell_av)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
float(* m_gsigma1)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
float(* m_gnorm)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
const TileCablingService * m_cabling
void fillCell(TileRawChannelUnit::UNIT RChUnit, const TileRawChannel *rch)
float(* m_ggpar)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS][NPARS]
float(* m_rc_gnorm)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerOptKey
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerOF1Key
StatusCode FirstEvt_initialize()
Initialization done at the first event.
void StoreRunInfo(const TileDQstatus *dqStatus)
StoreRunInfo is called only during the first event.
float(* m_gsigma2)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
static constexpr int NTOWERS
TH1F *(* m_histCellAmp)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
float(* m_rc_gcorrsigma1sigma2)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
void finalCell()
finalCell is called during finalize Here the cell variables of the ntuple are filled.
static constexpr int NSAMPLES
SG::ReadHandleKey< TileRawChannelContainer > m_rawChannelContainerFitKey
static constexpr int NCELLGAINS
float(* m_gchi2)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
uint8_t(* m_channel)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
int(* m_evt)[Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
static constexpr int NPARS
void deleteHist()
deleteHist is called at finalize to ensure that no histogram goes into any output root file delete []...
int digiChannel2PMT(int ros, int chan)
virtual StatusCode initialize() override
Only array initialization is done here All the helpers initialization is done at the first event.
int(* m_cell_nch)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][Tile::MAX_GAIN]
virtual StatusCode finalize() override
The output ntuple is created in finalize method.
float(* m_gerrsigma2)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
float(* m_rc_ggpar)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN][NPARS]
ToolHandle< TileCondIdTransforms > m_tileIdTrans
float(* m_rc_gerrsigma2)[Tile::MAX_ROS][Tile::MAX_DRAWER][Tile::MAX_CHAN][Tile::MAX_GAIN]
TileRawChNoiseCalibAlg(const std::string &name, ISvcLocator *pSvcLocator)
float(* m_ecell_rms)[Tile::MAX_DRAWER][NSAMPLES][NTOWERS][NCELLGAINS]
const TileHWID * m_tileHWID
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
float amplitude(int ind=0) const
Identifier cell_ID_index(int &index, int &pmt) const
HWIdentifier adc_HWID(void) const
@ IS_CALIBRATION
true: calibration, false: physics
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
static constexpr CLID ID()