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;
319 const EventContext& ctx = Gaudi::Hive::currentContext();
328 bool calibMode = (dqStatus->
calibMode() == 1);
356 return StatusCode::SUCCESS;
388 std::ostringstream sStr;
389 std::string trig_str;
400 sStr <<
m_file <<
"_" <<
m_run <<
"_" << trig_str <<
".root";
406 TFile*
fout =
new TFile(
m_file.c_str(),
"recreate");
409 TTree* t =
new TTree(
m_ntupleID.c_str(),
"Tile_RC_NoiseCalib-Ntuple");
411 t->Branch(
"RunNumber", &
m_run,
"RunNumber/I");
412 t->Branch(
"TrigType", &
m_trigType,
"TrigType/I");
413 t->Branch(
"Time", &
m_time,
"Time/I");
414 t->Branch(
"Year", &
m_year,
"Year/I");
415 t->Branch(
"Month", &
m_month,
"Month/I");
416 t->Branch(
"Day", &
m_day,
"Day/I");
417 t->Branch(
"YDay", &
m_yday,
"YDay/I");
418 t->Branch(
"Hour", &
m_hour,
"Hour/I");
419 t->Branch(
"Min", &
m_min,
"Min/I");
420 t->Branch(
"nEvt", &
m_evtNr,
"nEvt/I");
421 t->Branch(
"EvtNr", &
m_evtNr,
"EvtNr/I");
422 t->Branch(
"EvtGood", *
m_evt,
"Evt[5][64][48][2]/I");
425 t->Branch(
"ros", *
m_ros,
"ros[5][64][48][2]/b");
426 t->Branch(
"drawer", *
m_drawer,
"drawer[5][64][48][2]/b");
427 t->Branch(
"channel", *
m_channel,
"channel[5][64][48][2]/b");
428 t->Branch(
"gain", *
m_gain,
"gain[5][64][48][2]/O");
430 t->Branch(
"efit_mean",*(
m_rc_mean[
Fit]),
"efit_mean[5][64][48][2]/F");
431 t->Branch(
"efit_av",*(
m_rc_av[
Fit]),
"efit_av[5][64][48][2]/F");
432 t->Branch(
"efit_rms",*(
m_rc_rms[
Fit]),
"efit_rms[5][64][48][2]/F");
433 t->Branch(
"efit_sigma",*(
m_rc_sigma[
Fit]),
"efit_sigma[5][64][48][2]/F");
434 t->Branch(
"efit_mean_err",*(
m_rc_mean_err[
Fit]),
"efit_mean_err[5][64][48][2]/F");
435 t->Branch(
"efit_sigma_err",*(
m_rc_sigma_err[
Fit]),
"efit_sigma_err[5][64][48][2]/F");
436 t->Branch(
"efit_kurtosis",*(
m_rc_kurtosis[
Fit]),
"efit_kurtosis[5][64][48][2]/F");
437 t->Branch(
"efit_skewness",*(
m_rc_skewness[
Fit]),
"efit_skewness[5][64][48][2]/F");
438 t->Branch(
"efit_chi2",*(
m_rc_chi2[
Fit]),
"efit_chi2[5][64][48][2]/F");
439 t->Branch(
"efit_ndf",*(
m_rc_ndf[
Fit]),
"efit_ndf[5][64][48][2]/F");
440 t->Branch(
"efit_probC2",*(
m_rc_probC2[
Fit]),
"efit_probC2[5][64][48][2]/F");
442 t->Branch(
"efit_gsigma1",*(
m_rc_gsigma1[
Fit]),
"efit_gsigma1[5][64][48][2]/F");
443 t->Branch(
"efit_gsigma2",*(
m_rc_gsigma2[
Fit]),
"efit_gsigma2[5][64][48][2]/F");
444 t->Branch(
"efit_gnorm",*(
m_rc_gnorm[
Fit]),
"efit_gnorm[5][64][48][2]/F");
445 t->Branch(
"efit_gchi2",*(
m_rc_gchi2[
Fit]),
"efit_gchi2[5][64][48][2]/F");
446 t->Branch(
"efit_gerrsigma1",*(
m_rc_gerrsigma1[
Fit]),
"efit_gerrsigma1[5][64][48][2]/F");
447 t->Branch(
"efit_gerrnorm",*(
m_rc_gerrnorm[
Fit]),
"efit_gerrnorm[5][64][48][2]/F");
448 t->Branch(
"efit_gerrsigma2",*(
m_rc_gerrsigma2[
Fit]),
"efit_gerrsigma2[5][64][48][2]/F");
452 t->Branch(
"efixed_mean",*(
m_rc_mean[
Fixed]),
"efixed_mean[5][64][48][2]/F");
453 t->Branch(
"efixed_av",*(
m_rc_av[
Fixed]),
"efixed_av[5][64][48][2]/F");
454 t->Branch(
"efixed_rms",*(
m_rc_rms[
Fixed]),
"efixed_rms[5][64][48][2]/F");
455 t->Branch(
"efixed_sigma",*(
m_rc_sigma[
Fixed]),
"efixed_sigma[5][64][48][2]/F");
456 t->Branch(
"efixed_mean_err",*(
m_rc_mean_err[
Fixed]),
"efixed_mean_err[5][64][48][2]/F");
458 t->Branch(
"efixed_kurtosis",*(
m_rc_kurtosis[
Fixed]),
"efixed_kurtosis[5][64][48][2]/F");
459 t->Branch(
"efixed_skewness",*(
m_rc_skewness[
Fixed]),
"efixed_skewness[5][64][48][2]/F");
460 t->Branch(
"efixed_chi2",*(
m_rc_chi2[
Fixed]),
"efixed_chi2[5][64][48][2]/F");
461 t->Branch(
"efixed_ndf",*(
m_rc_ndf[
Fixed]),
"efixed_ndf[5][64][48][2]/F");
462 t->Branch(
"efixed_probC2",*(
m_rc_probC2[
Fixed]),
"efixed_probC2[5][64][48][2]/F");
464 t->Branch(
"efixed_gsigma1",*(
m_rc_gsigma1[
Fixed]),
"efixed_gsigma1[5][64][48][2]/F");
465 t->Branch(
"efixed_gsigma2",*(
m_rc_gsigma2[
Fixed]),
"efixed_gsigma2[5][64][48][2]/F");
466 t->Branch(
"efixed_gnorm",*(
m_rc_gnorm[
Fixed]),
"efixed_gnorm[5][64][48][2]/F");
467 t->Branch(
"efixed_gchi2",*(
m_rc_gchi2[
Fixed]),
"efixed_gchi2[5][64][48][2]/F");
469 t->Branch(
"efixed_gerrnorm",*(
m_rc_gerrnorm[
Fixed]),
"efixed_gerrnorm[5][64][48][2]/F");
474 t->Branch(
"eopt_mean",*(
m_rc_mean[
Opt]),
"eopt_mean[5][64][48][2]/F");
475 t->Branch(
"eopt_av",*(
m_rc_av[
Opt]),
"eopt_av[5][64][48][2]/F");
476 t->Branch(
"eopt_rms",*(
m_rc_rms[
Opt]),
"eopt_rms[5][64][48][2]/F");
477 t->Branch(
"eopt_sigma",*(
m_rc_sigma[
Opt]),
"eopt_sigma[5][64][48][2]/F");
478 t->Branch(
"eopt_mean_err",*(
m_rc_mean_err[
Opt]),
"eopt_mean_err[5][64][48][2]/F");
479 t->Branch(
"eopt_sigma_err",*(
m_rc_sigma_err[
Opt]),
"eopt_sigma_err[5][64][48][2]/F");
480 t->Branch(
"eopt_kurtosis",*(
m_rc_kurtosis[
Opt]),
"eopt_kurtosis[5][64][48][2]/F");
481 t->Branch(
"eopt_skewness",*(
m_rc_skewness[
Opt]),
"eopt_skewness[5][64][48][2]/F");
482 t->Branch(
"eopt_chi2",*(
m_rc_chi2[
Opt]),
"eopt_chi2[5][64][48][2]/F");
483 t->Branch(
"eopt_ndf",*(
m_rc_ndf[
Opt]),
"eopt_ndf[5][64][48][2]/F");
484 t->Branch(
"eopt_probC2",*(
m_rc_probC2[
Opt]),
"eopt_probC2[5][64][48][2]/F");
486 t->Branch(
"eopt_gsigma1",*(
m_rc_gsigma1[
Opt]),
"eopt_gsigma1[5][64][48][2]/F");
487 t->Branch(
"eopt_gsigma2",*(
m_rc_gsigma2[
Opt]),
"eopt_gsigma2[5][64][48][2]/F");
488 t->Branch(
"eopt_gnorm",*(
m_rc_gnorm[
Opt]),
"eopt_gnorm[5][64][48][2]/F");
489 t->Branch(
"eopt_gchi2",*(
m_rc_gchi2[
Opt]),
"eopt_gchi2[5][64][48][2]/F");
490 t->Branch(
"eopt_gerrsigma1",*(
m_rc_gerrsigma1[
Opt]),
"eopt_gerrsigma1[5][64][48][2]/F");
491 t->Branch(
"eopt_gerrnorm",*(
m_rc_gerrnorm[
Opt]),
"eopt_gerrnorm[5][64][48][2]/F");
492 t->Branch(
"eopt_gerrsigma2",*(
m_rc_gerrsigma2[
Opt]),
"eopt_gerrsigma2[5][64][48][2]/F");
496 t->Branch(
"edsp_mean",*(
m_rc_mean[
Dsp]),
"edsp_mean[5][64][48][2]/F");
497 t->Branch(
"edsp_av",*(
m_rc_av[
Dsp]),
"edsp_av[5][64][48][2]/F");
498 t->Branch(
"edsp_rms",*(
m_rc_rms[
Dsp]),
"edsp_rms[5][64][48][2]/F");
499 t->Branch(
"edsp_sigma",*(
m_rc_sigma[
Dsp]),
"edsp_sigma[5][64][48][2]/F");
500 t->Branch(
"edsp_mean_err",*(
m_rc_mean_err[
Dsp]),
"edsp_mean_err[5][64][48][2]/F");
501 t->Branch(
"edsp_sigma_err",*(
m_rc_sigma_err[
Dsp]),
"edsp_sigma_err[5][64][48][2]/F");
502 t->Branch(
"edsp_kurtosis",*(
m_rc_kurtosis[
Dsp]),
"edsp_kurtosis[5][64][48][2]/F");
503 t->Branch(
"edsp_skewness",*(
m_rc_skewness[
Dsp]),
"edsp_skewness[5][64][48][2]/F");
504 t->Branch(
"edsp_chi2",*(
m_rc_chi2[
Dsp]),
"edsp_chi2[5][64][48][2]/F");
505 t->Branch(
"edsp_ndf",*(
m_rc_ndf[
Dsp]),
"edsp_ndf[5][64][48][2]/F");
506 t->Branch(
"edsp_probC2",*(
m_rc_probC2[
Dsp]),
"edsp_probC2[5][64][48][2]/F");
508 t->Branch(
"edsp_gsigma1",*(
m_rc_gsigma1[
Dsp]),
"edsp_gsigma1[5][64][48][2]/F");
509 t->Branch(
"edsp_gsigma2",*(
m_rc_gsigma2[
Dsp]),
"edsp_gsigma2[5][64][48][2]/F");
510 t->Branch(
"edsp_gnorm",*(
m_rc_gnorm[
Dsp]),
"edsp_gnorm[5][64][48][2]/F");
511 t->Branch(
"edsp_gchi2",*(
m_rc_gchi2[
Dsp]),
"edsp_gchi2[5][64][48][2]/F");
512 t->Branch(
"edsp_gerrsigma1",*(
m_rc_gerrsigma1[
Dsp]),
"edsp_gerrsigma1[5][64][48][2]/F");
513 t->Branch(
"edsp_gerrnorm",*(
m_rc_gerrnorm[
Dsp]),
"edsp_gerrnorm[5][64][48][2]/F");
514 t->Branch(
"edsp_gerrsigma2",*(
m_rc_gerrsigma2[
Dsp]),
"edsp_gerrsigma2[5][64][48][2]/F");
518 t->Branch(
"eOF1_mean",*(
m_rc_mean[
OF1]),
"eOF1_mean[5][64][48][2]/F");
519 t->Branch(
"eOF1_av",*(
m_rc_av[
OF1]),
"eOF1_av[5][64][48][2]/F");
520 t->Branch(
"eOF1_rms",*(
m_rc_rms[
OF1]),
"eOF1_rms[5][64][48][2]/F");
521 t->Branch(
"eOF1_sigma",*(
m_rc_sigma[
OF1]),
"eOF1_sigma[5][64][48][2]/F");
522 t->Branch(
"eOF1_mean_err",*(
m_rc_mean_err[
OF1]),
"eOF1_mean_err[5][64][48][2]/F");
523 t->Branch(
"eOF1_sigma_err",*(
m_rc_sigma_err[
OF1]),
"eOF1_sigma_err[5][64][48][2]/F");
524 t->Branch(
"eOF1_kurtosis",*(
m_rc_kurtosis[
OF1]),
"eOF1_kurtosis[5][64][48][2]/F");
525 t->Branch(
"eOF1_skewness",*(
m_rc_skewness[
OF1]),
"eOF1_skewness[5][64][48][2]/F");
526 t->Branch(
"eOF1_chi2",*(
m_rc_chi2[
OF1]),
"eOF1_chi2[5][64][48][2]/F");
527 t->Branch(
"eOF1_ndf",*(
m_rc_ndf[
OF1]),
"eOF1_ndf[5][64][48][2]/F");
528 t->Branch(
"eOF1_probC2",*(
m_rc_probC2[
OF1]),
"eOF1_probC2[5][64][48][2]/F");
530 t->Branch(
"eOF1_gsigma1",*(
m_rc_gsigma1[
OF1]),
"eOF1_gsigma1[5][64][48][2]/F");
531 t->Branch(
"eOF1_gsigma2",*(
m_rc_gsigma2[
OF1]),
"eOF1_gsigma2[5][64][48][2]/F");
532 t->Branch(
"eOF1_gnorm",*(
m_rc_gnorm[
OF1]),
"eOF1_gnorm[5][64][48][2]/F");
533 t->Branch(
"eOF1_gchi2",*(
m_rc_gchi2[
OF1]),
"eOF1_gchi2[5][64][48][2]/F");
534 t->Branch(
"eOF1_gerrsigma1",*(
m_rc_gerrsigma1[
OF1]),
"eOF1_gerrsigma1[5][64][48][2]/F");
535 t->Branch(
"eOF1_gerrnorm",*(
m_rc_gerrnorm[
OF1]),
"eOF1_gerrnorm[5][64][48][2]/F");
536 t->Branch(
"eOF1_gerrsigma2",*(
m_rc_gerrsigma2[
OF1]),
"eOF1_gerrsigma2[5][64][48][2]/F");
540 t->Branch(
"eMF_mean",*(
m_rc_mean[
MF]),
"eMF_mean[5][64][48][2]/F");
541 t->Branch(
"eMF_av",*(
m_rc_av[
MF]),
"eMF_av[5][64][48][2]/F");
542 t->Branch(
"eMF_rms",*(
m_rc_rms[
MF]),
"eMF_rms[5][64][48][2]/F");
543 t->Branch(
"eMF_sigma",*(
m_rc_sigma[
MF]),
"eMF_sigma[5][64][48][2]/F");
544 t->Branch(
"eMF_mean_err",*(
m_rc_mean_err[
MF]),
"eMF_mean_err[5][64][48][2]/F");
545 t->Branch(
"eMF_sigma_err",*(
m_rc_sigma_err[
MF]),
"eMF_sigma_err[5][64][48][2]/F");
546 t->Branch(
"eMF_kurtosis",*(
m_rc_kurtosis[
MF]),
"eMF_kurtosis[5][64][48][2]/F");
547 t->Branch(
"eMF_skewness",*(
m_rc_skewness[
MF]),
"eMF_skewness[5][64][48][2]/F");
548 t->Branch(
"eMF_chi2",*(
m_rc_chi2[
MF]),
"eMF_chi2[5][64][48][2]/F");
549 t->Branch(
"eMF_ndf",*(
m_rc_ndf[
MF]),
"eMF_ndf[5][64][48][2]/F");
550 t->Branch(
"eMF_probC2",*(
m_rc_probC2[
MF]),
"eMF_probC2[5][64][48][2]/F");
552 t->Branch(
"eMF_gsigma1",*(
m_rc_gsigma1[
MF]),
"eMF_gsigma1[5][64][48][2]/F");
553 t->Branch(
"eMF_gsigma2",*(
m_rc_gsigma2[
MF]),
"eMF_gsigma2[5][64][48][2]/F");
554 t->Branch(
"eMF_gnorm",*(
m_rc_gnorm[
MF]),
"eMF_gnorm[5][64][48][2]/F");
555 t->Branch(
"eMF_gchi2",*(
m_rc_gchi2[
MF]),
"eMF_gchi2[5][64][48][2]/F");
556 t->Branch(
"eMF_gerrsigma1",*(
m_rc_gerrsigma1[
MF]),
"eMF_gerrsigma1[5][64][48][2]/F");
557 t->Branch(
"eMF_gerrnorm",*(
m_rc_gerrnorm[
MF]),
"eMF_gerrnorm[5][64][48][2]/F");
558 t->Branch(
"eMF_gerrsigma2",*(
m_rc_gerrsigma2[
MF]),
"eMF_gerrsigma2[5][64][48][2]/F");
562 t->Branch(
"ecell_av",*(
m_ecell_av),
"ecell_av[2][64][4][17][6]/F");
563 t->Branch(
"ecell_rms",*(
m_ecell_rms),
"ecell_rms[2][64][4][17][6]/F");
564 t->Branch(
"ecell_hash",*(
m_ecell_hash),
"ecell_hash[2][64][4][17]/i");
565 t->Branch(
"ecell_gsigma1",*(
m_gsigma1),
"ecell_gsigma1[2][64][4][17][6]/F");
566 t->Branch(
"ecell_gsigma2",*(
m_gsigma2),
"ecell_gsigma2[2][64][4][17][6]/F");
567 t->Branch(
"ecell_gnorm",*(
m_gnorm),
"ecell_gnorm[2][64][4][17][6]/F");
568 t->Branch(
"ecell_gchi2",*(
m_gchi2),
"ecell_gchi2[2][64][4][17][6]/F");
569 t->Branch(
"ecell_gerrsigma1",*(
m_gerrsigma1),
"ecell_gerrsigma1[2][64][4][17][6]/F");
570 t->Branch(
"ecell_gerrnorm",*(
m_gerrnorm),
"ecell_gerrnorm[2][64][4][17][6]/F");
571 t->Branch(
"ecell_gerrsigma2",*(
m_gerrsigma2),
"ecell_gerrsigma2[2][64][4][17][6]/F");
572 t->Branch(
"ecell_gcorrsigma1sigma2",*(
m_gcorrsigma1sigma2),
"ecell_gcorrsigma1sigma2[2][64][4][17][6]/F");
575 t->Branch(
"side", *
m_side,
"side[2][64][4][17][6]/O");
576 t->Branch(
"phi", *
m_phi,
"phi[2][64][4][17][6]/b");
577 t->Branch(
"sample", *
m_sample,
"sample[2][64][4][17][6]/b");
578 t->Branch(
"tower", *
m_tower,
"tower[2][64][4][17][6]/b");
579 t->Branch(
"gaingain", *
m_gg,
"gaingain[2][64][4][17][6]/b");
609 for (
int side = 0; side <
NSIDES; side++) {
611 for (
int sample = 0; sample <
NSAMPLES; ++sample) {
612 for (
int tower = 0; tower <
NTOWERS; ++tower) {
627 return StatusCode::SUCCESS;
641 ATH_MSG_WARNING(
"TileRawChNoiseCalibAlg::StoreRunInfo : dqStatus pointer is null");
644 MsgStream log(msgSvc(), name());
675 ATH_MSG_ERROR(
"No EventInfo object found! Can't read run number!" );
680 m_run = eventInfo->runNumber();
681 m_time = eventInfo->timeStamp();
692 localtime_r(&t_time, &t);
693 m_year = t.tm_year + 1900;
718 ATH_CHECK( rawChannelContainer.isValid() );
722 return StatusCode::FAILURE;
730 for (; collItr != lastColl; ++collItr) {
735 for (; chItr != lastCh; ++chItr) {
740 unsigned int ros(0), drawer(0), channel(0), gain(0);
741 m_tileIdTrans->getIndices(adc_id, ros, drawer, channel, gain);
744 if (dqStatus->
isChEmpty(ros, drawer, channel))
continue;
749 if (!(dqStatus->
isAdcDQgood(ros, drawer, channel, gain))) {
751 <<
" channel: " << channel
752 <<
" ADC: " << gain <<
" due to DQ error found." );
760 <<
" channel: " << channel <<
" due to DQ error found." );
784 m_evt[ros][drawer][chan][gain]++;
785 m_histAmp[rctype][ros][drawer][chan][gain]->Fill(amp);
792 return StatusCode::SUCCESS;
803 CxxUtils::FPControl ctl;
804 ctl.disable (CxxUtils::FPControl::Exc::divbyzero |
805 CxxUtils::FPControl::Exc::invalid);
807 TF1 * fit_gaus =
new TF1(
"g",
"gaus");
810 ATH_MSG_INFO(
"Fitting RCh container " << rctype <<
" ROS " << ros );
818 m_ros[ros][drawer][chan][gain] = ros;
819 m_drawer[ros][drawer][chan][gain] = drawer;
820 m_channel[ros][drawer][chan][gain] = chan;
821 m_gain[ros][drawer][chan][gain] = gain;
824 if (
m_evt[ros][drawer][chan][gain] > 0) {
826 TH1F& histAmp = *
m_histAmp[rctype][ros][drawer][chan][gain];
827 histAmp.Fit(
"g",
"NQ");
829 m_rc_av[rctype][ros][drawer][chan][gain] = histAmp.GetMean();
830 m_rc_rms[rctype][ros][drawer][chan][gain] = histAmp.GetRMS();
832 if (TMath::Abs(histAmp.GetSkewness()) < 1000.)
833 m_rc_skewness[rctype][ros][drawer][chan][gain] = histAmp.GetSkewness();
834 if (TMath::Abs(histAmp.GetKurtosis()) < 1000.)
835 m_rc_kurtosis[rctype][ros][drawer][chan][gain] = histAmp.GetKurtosis();
837 m_rc_mean[rctype][ros][drawer][chan][gain] = fit_gaus->GetParameter(1);
838 m_rc_mean_err[rctype][ros][drawer][chan][gain] = fit_gaus->GetParError(1);
839 m_rc_sigma[rctype][ros][drawer][chan][gain] = fit_gaus->GetParameter(2);
840 m_rc_sigma_err[rctype][ros][drawer][chan][gain] = fit_gaus->GetParError(2);
841 m_rc_chi2[rctype][ros][drawer][chan][gain] = fit_gaus->GetChisquare();
842 m_rc_ndf[rctype][ros][drawer][chan][gain] = fit_gaus->GetNDF();
843 m_rc_probC2[rctype][ros][drawer][chan][gain] = fit_gaus->GetProb();
877 unsigned int ros(0), drawer(0), channel(0), gain(0);
883 <<
" channel: " << channel
885 <<
" in fillCell() because channel is bad in DB." );
889 int sample =
m_tileID->sample(cell_id);
890 int tower =
m_tileID->tower(cell_id);
893 if (side == 1) side = 0;
894 else if (side == -1) side = 1;
918 if (
m_cabling->isRun2PlusCabling() && (ros > 2)) {
921 int drawer2 =
m_cabling->E1_merged_with_run2plus(ros, drawer);
924 m_ecell_ene[side][drawer2][sample][tower][gg / 3] += amp;
925 ++
m_cell_nch[side][drawer2][sample][tower][gg / 3];
927 if (TMath::Abs(amp) > 1.e-5) {
942 m_ecell_ene[side][drawer][sample][tower][gg / 3] += amp;
943 m_cell_nch[side][drawer][sample][tower][gg / 3] += nch;
945 if (TMath::Abs(amp) > 1.e-5) {
959 for (
int side = 0; side < 2; ++side) {
962 for (
int sample = 0; sample < 4; ++sample) {
963 for (
int tower = 0; tower < 17; ++tower) {
964 for (
int gg = 0; gg < 6; ++gg) {
966 m_side[side][drawer][sample][tower][gg] = side;
967 m_phi[side][drawer][sample][tower][gg] = drawer;
968 m_sample[side][drawer][sample][tower][gg] = sample;
969 m_tower[side][drawer][sample][tower][gg] = tower;
970 m_gg[side][drawer][sample][tower][gg] = gg;
977 m_gsigma1[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][0];
978 m_gsigma2[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][2];
979 m_gnorm[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][1];
980 m_gchi2[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][3];
981 m_gerrsigma1[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][4];
982 m_gerrnorm[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][5];
983 m_gerrsigma2[side][drawer][sample][tower][gg] =
m_ggpar[side][drawer][sample][tower][gg][6];
1004 float xmin =
h->GetBinCenter(1);
1005 float xmax =
h->GetBinCenter(
h->GetNbinsX());
1006 TF1 total(
"total",
"gaus(0)+gaus(3)",
xmin,
xmax);
1007 total.SetLineColor(2);
1009 float nentries =
h->GetEntries();
1011 if (nentries == 0) {
1013 std::fill (gp, gp+8, 0);
1017 float rms =
h->GetRMS();
1018 float bin =
h->GetBinWidth(0);
1020 par[0] = 0.1 * nentries;
1022 par[2] = 0.7 * std::max(rms,
bin);
1024 par[3] = 0.15 * par[0];
1026 par[5] = 5. * par[2];
1028 total.SetParameters(par);
1030 float lim1 =
bin / 2.;
1031 float lim2 = std::max(rms * 1.05,
bin * 2.0);
1032 float lim3 = std::max(rms * 10.0,
bin * 20.);
1034 float limN1 = nentries;
1035 if (lim1 < 0.5) limN1 /= (2. * lim1);
1036 float limN2 = nentries;
1037 if (lim2 < 0.5) limN2 /= (2. * lim2);
1039 total.SetParLimits(0, 0., limN1);
1040 total.FixParameter(1, 0.);
1041 total.SetParLimits(2, lim1, lim2);
1042 total.SetParLimits(3, 0., limN2);
1043 total.FixParameter(4, 0.);
1044 total.SetParLimits(5, lim2, lim3);
1046 TFitResultPtr resfit =
h->Fit(&total,
"BLQRS");
1048 float par0 = total.GetParameter(0);
1049 float par3 = total.GetParameter(3);
1051 float sigma1 = total.GetParameter(2);
1052 float sigma2 = total.GetParameter(5);
1055 float errpar0 = total.GetParError(0);
1056 float errpar3 = total.GetParError(3);
1058 float errsigma1 = total.GetParError(2);
1059 float errsigma2 = total.GetParError(5);
1061 float norm = par0 != 0 ? par3 / par0 : 0;
1063 if (invert && norm > 1.) {
1070 gp[5] = sqrt((errpar0 * errpar0) + (errpar3 * errpar3) * (par0 * par0) / (par3 * par3)) / par3;
1080 gp[5] = par0 != 0 ? sqrt((errpar3 * errpar3) + (errpar0 * errpar0) * (par3 * par3) / (par0 * par0)) / par0 : 0;
1085 if (total.GetNDF() > 0) {
1086 gp[3] = total.GetChisquare() / total.GetNDF();
1092 if (resfit->CovMatrixStatus()) {
1093 TMatrixDSym corr = resfit->GetCorrelationMatrix();
1109 for (
int side = 0; side < 2; ++side) {
1111 for (
int sample = 0; sample < 4; ++sample) {
1112 for (
int tower = 0; tower < 17; ++tower) {
1115 float ene =
m_ecell_ene[side][drawer][sample][tower][gg];
1116 if (
m_cell_nch[side][drawer][sample][tower][gg] == 1 && sample != 3) ene *= 2;
1118 if (TMath::Abs(ene) > 1.e-5) {
1119 m_histCellAmp[side][drawer][sample][tower][gg * 3]->Fill(ene);
1152 for (
int side = 0; side < 2; side++) {
1154 for (
int sample = 0; sample < 4; ++sample) {
1155 for (
int tower = 0; tower < 17; ++tower) {
1156 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 with parameters:
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]
virtual StatusCode execute() override
Main method.
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]
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()