35 gROOT->SetBatch(
true);
40 std::unique_ptr<TF1> pol1pole(
new TF1(
"pol1pole",
"[0] + [1]*x + [2]/(x - [3])", -60,
42 pol1pole->SetParameter(1, 0.6);
43 pol1pole->SetParameter(2, -150);
44 pol1pole->SetParLimits(1, 0, 1);
45 pol1pole->SetParLimits(2, -300, 0);
49 while (gSystem->GetPathInfo(Form(
"algorithm_3SampleELS_output_rev_%d.root", cal_rev), info) == 0)
51 std::unique_ptr<TFile> f(
new TFile(Form(
"algorithm_3SampleELS_output_rev_%d.root", cal_rev),
"RECREATE"));
53 auto m_tree =
new TTree(Form(
"rev_%d", cal_rev),
"RECREATE");
54 int layer_num, ladder_num, sensor_num, view, ndf;
55 float a, b, c, d, a_err, b_err, c_err, d_err, chi2, p;
56 m_tree->Branch(
"layer", &layer_num,
"layer/I");
57 m_tree->Branch(
"ladder", &ladder_num,
"ladder/I");
58 m_tree->Branch(
"sensor", &sensor_num,
"sensor/I");
59 m_tree->Branch(
"isU", &view,
"isU/I");
60 m_tree->Branch(
"a", &a,
"a/F");
61 m_tree->Branch(
"b", &b,
"b/F");
62 m_tree->Branch(
"c", &c,
"c/F");
63 m_tree->Branch(
"d", &d,
"d/F");
64 m_tree->Branch(
"a_err", &a_err,
"a_err/F");
65 m_tree->Branch(
"b_err", &b_err,
"b_err/F");
66 m_tree->Branch(
"c_err", &c_err,
"c_err/F");
67 m_tree->Branch(
"d_err", &d_err,
"d_err/F");
68 m_tree->Branch(
"chi2", &chi2,
"chi2/F");
69 m_tree->Branch(
"ndf", &ndf,
"ndf/I");
70 m_tree->Branch(
"p", &p,
"p/F");
77 for (
int ij = 0; ij < (__hBinToSensorMap__->GetNbinsX()); ij++) {
82 auto binLabel = __hBinToSensorMap__->GetXaxis()->GetBinLabel(ij + 1);
84 std::sscanf(binLabel,
"L%dL%dS%d%c", &layer_num, &ladder_num, &sensor_num, &side);
89 B2INFO(
"Projecting for Sensor: " << binLabel <<
" with Bin Number: " << ij + 1);
91 __hEventT0vsCoG__->GetZaxis()->SetRange(ij + 1, ij + 1);
92 auto hEventT0vsELS = (TH2D*)__hEventT0vsCoG__->Project3D(
"yxe");
93 auto hEventT0 = (TH1D*)__hEventT0__->ProjectionX(
"hEventT0_tmp", ij + 1, ij + 1);
94 auto hEventT0nosync = (TH1D*)__hEventT0NoSync__->ProjectionX(
"hEventT0NoSync_tmp", ij + 1, ij + 1);
96 hEventT0vsELS->SetName(Form(
"eventT0vsCoG__L%dL%dS%d%c", layer_num, ladder_num, sensor_num, side));
97 hEventT0->SetName(Form(
"eventT0__L%dL%dS%d%c", layer_num, ladder_num, sensor_num, side));
98 hEventT0nosync->SetName(Form(
"eventT0nosync__L%dL%dS%d%c", layer_num, ladder_num, sensor_num, side));
100 char sidePN = (side ==
'U' ?
'P' :
'N');
101 hEventT0vsELS->SetTitle(Form(
"EventT0Sync vs rawTime in %d.%d.%d %c/%c", layer_num, ladder_num, sensor_num, side, sidePN));
102 hEventT0->SetTitle(Form(
"EventT0Sync in %d.%d.%d %c/%c", layer_num, ladder_num, sensor_num, side, sidePN));
103 hEventT0nosync->SetTitle(Form(
"EventT0NoSync in %d.%d.%d %c/%c", layer_num, ladder_num, sensor_num, side, sidePN));
105 hEventT0vsELS->SetDirectory(0);
106 hEventT0->SetDirectory(0);
107 hEventT0nosync->SetDirectory(0);
109 B2INFO(
"Histogram: " << hEventT0vsELS->GetName() <<
110 " Entries (n. clusters): " << hEventT0vsELS->GetEntries());
111 if (layer_num == 3 && hEventT0vsELS->GetEntries() <
m_minEntries) {
112 B2INFO(
"Histogram: " << hEventT0vsELS->GetName() <<
113 " Entries (n. clusters): " << hEventT0vsELS->GetEntries() <<
115 B2WARNING(
"Not enough data, adding one run to the collector");
117 gSystem->Unlink(Form(
"algorithm_3SampleELS_output_rev_%d.root", cal_rev));
120 if (layer_num != 3 && hEventT0vsELS->GetEntries() <
m_minEntries / 10) {
121 B2INFO(
"Histogram: " << hEventT0vsELS->GetName() <<
122 " Entries (n. clusters): " << hEventT0vsELS->GetEntries() <<
124 B2WARNING(
"Not enough data, adding one run to the collector");
126 gSystem->Unlink(Form(
"algorithm_3SampleELS_output_rev_%d.root", cal_rev));
129 for (
int i = 1; i <= hEventT0vsELS->GetNbinsX(); i++) {
130 for (
int j = 1; j <= hEventT0vsELS->GetNbinsY(); j++) {
131 if (hEventT0vsELS->GetBinContent(i, j) < std::max(2,
int(hEventT0vsELS->GetEntries() * 0.001))) {
132 hEventT0vsELS->SetBinContent(i, j, 0);
136 TProfile* pfx = hEventT0vsELS->ProfileX();
137 std::string name =
"pfx_" + std::string(hEventT0vsELS->GetName());
138 pfx->SetName(name.c_str());
140 pol1pole->FixParameter(3, 7);
141 pfx->Fit(
"pol1pole",
"QMRS");
142 pol1pole->SetParLimits(3, 0, 15);
143 TFitResultPtr tfr = pfx->Fit(
"pol1pole",
"QMRS");
156 pol1pole->GetParameters(par);
159 timeCal->set_current(3);
160 timeCal->set_elsparameters(par[0], par[1], par[2], par[3]);
161 payload->set(layer_num, ladder_num, sensor_num,
bool(view), 1, *timeCal);
164 hEventT0vsELS->Write();
165 hEventT0nosync->Write();
169 delete hEventT0vsELS;
171 delete hEventT0nosync;
173 if (tfr.Get() ==
nullptr || (tfr->Status() != 0 && tfr->Status() != 4 && tfr->Status() != 4000)) {
175 B2FATAL(
"Fit to the histogram failed in SVD3SampleELSTimeCalibrationAlgorithm. "
176 <<
"Check the 2-D histogram to clarify the reason.");
178 a = par[0]; b = par[1]; c = par[2]; d = par[3];
179 a_err = tfr->ParError(0); b_err = tfr->ParError(1); c_err = tfr->ParError(2); d_err = tfr->ParError(3);