3 #include <cdc/calibration/SpaceResolutionCalibration.h>
4 #include <cdc/geometry/CDCGeometryPar.h>
5 #include <cdc/calibration/CDCDatabaseImporter.h>
7 #include <framework/database/DBObjPtr.h>
8 #include <framework/logging/Logger.h>
9 #include <framework/utilities/FileSystem.h>
25 SpaceResolutionCalibration::SpaceResolutionCalibration():
26 m_firstExperiment(0), m_firstRun(0),
27 m_lastExperiment(-1), m_lastRun(-1)
34 B2INFO(
"createHisto");
39 TChain* tree =
new TChain(
"tree");
42 if (!tree->GetBranch(
"ndf")) {
43 B2FATAL(
"input data do not exits, please check!");
44 gSystem->Exec(
"echo rootfile do not exits or something wrong >> error");
59 tree->SetBranchAddress(
"lay", &lay);
60 tree->SetBranchAddress(
"ndf", &ndf);
61 tree->SetBranchAddress(
"Pval", &Pval);
62 tree->SetBranchAddress(
"x_u", &x_u);
63 tree->SetBranchAddress(
"x_b", &x_b);
64 tree->SetBranchAddress(
"x_mea", &x_mea);
65 tree->SetBranchAddress(
"weight", &w);
66 tree->SetBranchAddress(
"alpha", &alpha);
67 tree->SetBranchAddress(
"theta", &theta);
70 std::vector<TString> list_vars = {
"lay",
"ndf",
"Pval",
"x_u",
"x_b",
"x_mea",
"weight",
"alpha",
"theta"};
71 tree->SetBranchStatus(
"*", 0);
73 for (TString brname : list_vars) {
74 tree->SetBranchStatus(brname, 1);
80 for (
int i = 0; i < 50; ++i) {
81 yb.push_back(-0.07 + i * (0.14 / 50));
83 for (
int i = 0; i < 50; ++i) {
84 yu.push_back(-0.08 + i * (0.16 / 50));
90 for (
int i = 1; i < m_np; ++i) {
94 for (
int il = 0; il < 56; ++il) {
95 for (
int lr = 0; lr < 2; ++lr) {
96 for (
int al = 0; al <
m_nalpha; ++al) {
97 for (
int th = 0; th <
m_ntheta; ++th) {
98 hist_b[il][lr][al][th] =
new TH2F(Form(
"hb_%d_%d_%d_%d", il, lr, al, th),
99 Form(
"lay_%d_lr%d_al_%3.0f_th_%3.0f;Drift Length [cm];#DeltaX", il, lr,
ialpha[al],
itheta[th]),
100 xbin.size() - 1, &xbin.at(0), yb.size() - 1, &yb.at(0));
101 hist_u[il][lr][al][th] =
new TH2F(Form(
"hu_%d_%d_%d_%d", il, lr, al, th),
102 Form(
"lay_%d_lr%d_al_%3.0f_th_%3.0f;Drift Length [cm];#DeltaX", il, lr,
ialpha[al],
itheta[th]),
103 xbin.size() - 1, &xbin.at(0), yu.size() - 1, &yu.at(0));
110 const int nEntries = tree->GetEntries();
111 B2INFO(
"Number of entries: " << nEntries);
115 for (
int i = 0; i < nEntries; ++i) {
118 if (std::fabs(x_b) < 0.02 || std::fabs(x_u) < 0.02)
continue;
121 for (
int k = 0; k <
m_nalpha; ++k) {
128 for (
int j = 0; j <
m_ntheta; ++j) {
135 ilr = x_u > 0 ? 1 : 0;
137 if (ial == -99 || ith == -99 || ilr == -99) {
138 TString command = Form(
"Error in alpha=%3.2f and theta = %3.2f>> error", alpha, theta);
140 B2FATAL(
"ERROR" << command);
142 absRes_u = fabs(x_mea) - fabs(x_u);
143 absRes_b = fabs(x_mea) - fabs(x_b);
145 hist_u[lay][ilr][ial][ith]->Fill(fabs(x_u), absRes_u, w);
146 hist_b[lay][ilr][ial][ith]->Fill(fabs(x_b), absRes_b, w);
150 B2INFO(
"Finish reading data");
152 TF1* gb =
new TF1(
"gb",
"gaus", -0.05, 0.05);
153 TF1* gu =
new TF1(
"gu",
"gaus", -0.06, 0.06);
154 TF1* g0b =
new TF1(
"g0b",
"gaus", -0.015, 0.07);
155 TF1* g0u =
new TF1(
"g0u",
"gaus", -0.015, 0.08);
156 g0b->SetParLimits(1, -0.01, 0.004);
157 g0u->SetParLimits(1, -0.01, 0.004);
159 std::vector<double> sigma;
160 std::vector<double> dsigma;
161 std::vector<double> s2;
162 std::vector<double> ds2;
163 std::vector<double> xl;
164 std::vector<double> dxl;
165 std::vector<double> dxl0;
170 for (
int il = 0; il < 56; ++il) {
171 for (
int lr = 0; lr < 2; ++lr) {
172 for (
int al = 0; al <
m_nalpha; ++al) {
173 for (
int th = 0; th <
m_ntheta; ++th) {
175 B2DEBUG(199,
"layer-lr-al-th " << il <<
" - " << lr <<
" - " << al <<
" - " << th);
176 if (
hist_b[il][lr][al][th]->GetEntries() < 20000) {
180 B2DEBUG(199,
"Nentries: " <<
hist_b[il][lr][al][th]->GetEntries());
181 hist_b[il][lr][al][th]->SetDirectory(0);
182 hist_u[il][lr][al][th]->SetDirectory(0);
184 hist_b[il][lr][al][th]->FitSlicesY(g0b, firstbin, ib1, minEntry);
186 TH1F* hm1 = (TH1F*)gDirectory->Get(Form(
"hb_%d_%d_%d_%d_1", il, lr, al, th));
187 TH1F* hs1 = (TH1F*)gDirectory->Get(Form(
"hb_%d_%d_%d_%d_2", il, lr, al, th));
193 hb_m[il][lr][al][th] = (TH1F*)hm1->Clone(Form(
"hb_%d_%d_%d_%d_m", il, lr, al, th));
194 hb_s[il][lr][al][th] = (TH1F*)hs1->Clone(Form(
"hb_%d_%d_%d_%d_s", il, lr, al, th));
196 hb_m[il][lr][al][th]->SetDirectory(0);
197 hb_s[il][lr][al][th]->SetDirectory(0);
201 hist_b[il][lr][al][th]->FitSlicesY(gb, ib1 + 1, m_np, minEntry);
202 hb_m[il][lr][al][th]->Add((TH1F*)gDirectory->Get(Form(
"hb_%d_%d_%d_%d_1", il, lr, al, th)));
203 hb_s[il][lr][al][th]->Add((TH1F*)gDirectory->Get(Form(
"hb_%d_%d_%d_%d_2", il, lr, al, th)));
204 B2DEBUG(199,
"entries (2nd): " <<
hb_s[il][lr][al][th]->GetEntries());
207 hist_u[il][lr][al][th]->FitSlicesY(g0u, firstbin, ib1, minEntry);
208 hu_m[il][lr][al][th] = (TH1F*)gDirectory->Get(Form(
"hu_%d_%d_%d_%d_1", il, lr, al, th))->Clone(Form(
"hu_%d_%d_%d_%d_m", il, lr, al,
210 hu_s[il][lr][al][th] = (TH1F*)gDirectory->Get(Form(
"hu_%d_%d_%d_%d_2", il, lr, al, th))->Clone(Form(
"hu_%d_%d_%d_%d_s", il, lr, al,
212 hu_m[il][lr][al][th]->SetDirectory(0);
213 hu_s[il][lr][al][th]->SetDirectory(0);
216 hist_u[il][lr][al][th]->FitSlicesY(gu, ib1 + 1, m_np, minEntry);
217 hu_m[il][lr][al][th]->Add((TH1F*)gDirectory->Get(Form(
"hu_%d_%d_%d_%d_1", il, lr, al, th)));
218 hu_s[il][lr][al][th]->Add((TH1F*)gDirectory->Get(Form(
"hu_%d_%d_%d_%d_2", il, lr, al, th)));
219 if (!
hu_s[il][lr][al][th] || !
hb_s[il][lr][al][th]) {
220 B2WARNING(
"slice histo do not found");
224 for (Int_t j = 1; j <
hu_s[il][lr][al][th]->GetNbinsX(); j++) {
225 if (
hu_s[il][lr][al][th]->GetBinContent(j) == 0)
continue;
226 if (
hb_s[il][lr][al][th]->GetBinContent(j) == 0)
continue;
227 double sb =
hb_s[il][lr][al][th]->GetBinContent(j);
228 double su =
hu_s[il][lr][al][th]->GetBinContent(j);
230 double dsb =
hb_s[il][lr][al][th]->GetBinError(j);
231 double dsu =
hu_s[il][lr][al][th]->GetBinError(j);
232 double XL =
hb_s[il][lr][al][th]->GetXaxis()->GetBinCenter(j);
233 double dXL = (
hb_s[il][lr][al][th]->GetXaxis()->GetBinWidth(j)) / 2;
234 double s_int = std::sqrt(sb * su);
235 double ds_int = 0.5 * s_int * (dsb / sb + dsu / su);
236 if (ds_int > 0.02)
continue;
240 sigma.push_back(s_int);
241 dsigma.push_back(ds_int);
242 s2.push_back(s_int * s_int);
243 ds2.push_back(2 * s_int * ds_int);
246 if (xl.size() < 8 || xl.size() >
Max_np) {
248 B2WARNING(
"number of element might out of range");
continue;
252 B2DEBUG(199,
"Create Histo for layer-lr: " << il <<
" " << lr);
253 gr[il][lr][al][th] =
new TGraphErrors(xl.size(), &xl.at(0), &sigma.at(0), &dxl.at(0), &dsigma.at(0));
254 gr[il][lr][al][th]->SetMarkerSize(0.5);
255 gr[il][lr][al][th]->SetMarkerStyle(8);
258 gr[il][lr][al][th]->SetTitle(Form(
"Layer_%d_lr%d | #alpha = %3.0f | #theta = %3.0f", il, lr,
ialpha[al],
itheta[th]));
259 gr[il][lr][al][th]->SetName(Form(
"lay%d_lr%d_al%d_th%d", il, lr, al, th));
262 gfit[il][lr][al][th] =
new TGraphErrors(xl.size(), &xl.at(0), &s2.at(0), &dxl0.at(0), &ds2.at(0));
263 gfit[il][lr][al][th]->SetMarkerSize(0.5);
264 gfit[il][lr][al][th]->SetMarkerStyle(8);
267 gfit[il][lr][al][th]->SetTitle(Form(
"L%d-lr%d | #alpha = %3.0f | #theta = %3.0f ", il, lr,
ialpha[al],
itheta[th]));
268 gfit[il][lr][al][th]->SetName(Form(
"sigma2_lay%d_lr%d_al%d_th%d", il, lr, al, th));
270 xl.clear(); dxl.clear(); dxl0.clear(); sigma.clear(); dsigma.clear(); s2.clear(); ds2.clear();
271 gDirectory->Delete(
"hu_%d_%d_%d_%d_0");
281 gErrorIgnoreLevel = 3001;
283 B2INFO(
"Start to calibrate");
284 gSystem->Exec(
"mkdir -p Sigma_Fit_Err");
286 TF1* func =
new TF1(
"func",
"[0]/(x*x + [1])+[2]* x+[3]+[4]*exp([5]*(x-[6])*(x-[6]))", 0, 1.);
287 TH1F* hprob =
new TH1F(
"h1",
"", 20, 0, 1);
291 for (
int i = 0; i < 56; ++i) {
292 for (
int lr = 0; lr < 2; ++lr) {
293 for (
int al = 0; al <
m_nalpha; ++al) {
294 for (
int th = 0; th <
m_ntheta; ++th) {
300 B2DEBUG(199,
"xmax for fitting: " << upFit);
302 func->SetParameters(5E-6, 0.007, 1E-4, 1E-5, 0.00008, -30, intp6);
303 func->SetParLimits(0, 1E-7, 1E-4);
304 func->SetParLimits(1, 0.00001, 0.02);
305 func->SetParLimits(2, 1E-6, 0.0005);
306 func->SetParLimits(3, 1E-8, 0.0005);
307 func->SetParLimits(4, 0., 0.001);
308 func->SetParLimits(5, -40, 0.);
309 func->SetParLimits(6, intp6 - 0.5, intp6 + 0.3);
310 B2DEBUG(199,
"FITTING for layer: " << i <<
"lr: " << lr <<
" ial" << al <<
" ith:" << th);
311 B2DEBUG(199,
"Fit flag before fit:" <<
m_fitflag[i][lr][al][th]);
314 for (
int j = 0; j < 10; j++) {
316 B2DEBUG(199,
"loop: " << j);
317 B2DEBUG(199,
"Int p6: " << intp6);
318 B2DEBUG(199,
"Number of Point: " <<
gfit[i][lr][al][th]->GetN());
319 Int_t stat =
gfit[i][lr][al][th]->Fit(
"func",
"MQE",
"", 0.05, upFit);
320 B2DEBUG(199,
"stat of fit" << stat);
321 std::string Fit_status = gMinuit->fCstatu.Data();
322 B2DEBUG(199,
"FIT STATUS: " << Fit_status);
324 if (Fit_status ==
"OK" ||
325 Fit_status ==
"SUCCESSFUL" ||
326 Fit_status ==
"CALL LIMIT" ||
327 Fit_status ==
"PROBLEMS") {
328 if (fabs(func->Eval(0.3)) > 0.00035 || func->Eval(0.3) < 0) {
329 func->SetParameters(5E-6, 0.007, 1E-4, 1E-7, 0.0007, -30, intp6 + 0.05 * j);
333 B2DEBUG(199,
"Prob of fit: " << func->GetProb());
339 func->SetParameters(5E-6, 0.007, 1E-4, 1E-7, 0.0007, -30, intp6 + 0.05 * j);
342 TCanvas* c1 =
new TCanvas(
"c1",
"", 600, 600);
343 gfit[i][lr][al][th]->Draw();
344 c1->SaveAs(Form(
"Sigma_Fit_Err/%d_%d_al%d_th%d_%s.png", i, lr, al, th, Fit_status.c_str()));
345 B2WARNING(
"Fit error: " << i <<
" " << lr <<
" " << al <<
" " << th);
350 B2DEBUG(199,
"ProbFit: Lay_lr_al_th: " << i <<
" " << lr <<
" " << al <<
" " << th << func->GetProb());
351 hprob->Fill(func->GetProb());
352 func->GetParameters(
sigma_new[i][lr][al][th]);
366 B2INFO(
"storeHisto");
367 TFile* ff =
new TFile(
"sigma_histo.root",
"RECREATE");
368 TDirectory* top = gDirectory;
369 TDirectory* Direct[56];
371 for (
int il = 0; il < 56; ++il) {
373 Direct[il] = gDirectory->mkdir(Form(
"lay_%d", il));
375 for (
int lr = 0; lr < 2; ++lr) {
376 for (
int al = 0; al <
m_nalpha; ++al) {
377 for (
int th = 0; th <
m_ntheta; ++th) {
378 if (!
gr[il][lr][al][th])
continue;
379 if (!
gfit[il][lr][al][th])
continue;
381 hist_b[il][lr][al][th]->Write();
382 hist_u[il][lr][al][th]->Write();
383 hb_m[il][lr][al][th]->Write();
384 hb_s[il][lr][al][th]->Write();
385 hu_m[il][lr][al][th]->Write();
386 hu_s[il][lr][al][th]->Write();
387 gr[il][lr][al][th]->Write();
388 gfit[il][lr][al][th]->Write();
395 B2INFO(
"Finish store histogram");
400 B2INFO(
"Exporting parameters...");
407 for (
int i = 0; i <
m_nalpha; ++i) {
408 ofs << std::setprecision(4) <<
l_alpha[i] <<
" " << std::setprecision(4) <<
u_alpha[i] <<
" " << std::setprecision(
413 for (
int i = 0; i <
m_ntheta; ++i) {
414 ofs << std::setprecision(4) <<
l_theta[i] <<
" " << std::setprecision(4) <<
u_theta[i] <<
" " << std::setprecision(
418 ofs << 0 <<
" " << 7 << endl;
419 for (
int al = 0; al <
m_nalpha; ++al) {
420 for (
int th = 0; th <
m_ntheta; ++th) {
421 for (
int i = 0; i < 56; ++i) {
422 for (
int lr = 1; lr >= 0; --lr) {
424 ofs << i << std::setw(4) <<
itheta[th] << std::setw(4) <<
ialpha[al] << std::setw(4) << lr << std::setw(15);
427 for (
int p = 0; p < 7; ++p) {
428 if (p != 6) { ofs << std::setprecision(7) <<
sigma_new[i][lr][al][th][p] << std::setw(15);}
429 if (p == 6) { ofs << std::setprecision(7) <<
sigma_new[i][lr][al][th][p] << std::endl;}
432 B2WARNING(
"Fitting error and old sigma will be used. (Layer " << i <<
") (lr = " << lr <<
") (al = " << al <<
") (th = " << th <<
443 for (
int p = 0; p < 7; ++p) {
444 if (p != 6) { ofs << std::setprecision(7) <<
sigma_old[i][lr][ial_old][ith_old][p] << std::setw(15);}
445 if (p == 6) { ofs << std::setprecision(7) <<
sigma_old[i][lr][ial_old][ith_old][p] << std::endl;}
454 B2RESULT(
"Histos succesfully fitted: " << nfitted);
455 B2RESULT(
"Histos fit failure: " << nfailure);
467 B2INFO(
"reading sigma from DB");
470 B2INFO(
"Number of theta bins from input sigma: " <<
ntheta_old);
472 B2INFO(
"Read sigma from text");
474 B2INFO(
"number of alpha bins from input sigma: " <<
nalpha_old);
483 if (fileName ==
"") {
486 if (fileName ==
"") {
487 cout <<
"CDCGeometryPar: " << fileName <<
" not exist!" << endl;
489 cout <<
"CDCGeometryPar: " << fileName <<
" exists." << endl;
491 if (!ifs) cout <<
"CDCGeometryPar: cannot open " << fileName <<
" !" << endl;
498 cout <<
"Fail to read alpha bins !" << endl;
return;
500 double alpha0, alpha1, alpha2;
501 for (
unsigned short i = 0; i <
nalpha_old; ++i) {
502 ifs >> alpha0 >> alpha1 >> alpha2;
510 if (
ntheta_old == 0 ||
ntheta_old > 7) cout <<
"CDCGeometryPar: fail to read theta bins !" << endl;
512 cout <<
"CDCGeometryPar: fail to read theta bins !" << endl;
514 double theta0, theta1, theta2;
515 for (
unsigned short i = 0; i <
ntheta_old; ++i) {
516 ifs >> theta0 >> theta1 >> theta2;
522 unsigned short np = 0;
523 unsigned short iCL, iLR;
532 const double epsi = 0.1;
534 ifs >> theta >> alpha >> iLR;
535 for (
int i = 0; i < np; ++i) {
541 for (
unsigned short i = 0; i <
ntheta_old; ++i) {
547 if (ith < 0) cout <<
"CDCGeometryPar: thetas in sigma.dat are inconsistent !" << endl;
550 for (
unsigned short i = 0; i <
nalpha_old; ++i) {
556 if (ial < 0) cout <<
"CDCGeometryPar: alphas in sigma.dat are inconsistent !" << endl;
558 for (
int i = 0; i < np; ++i) {
559 sigma_old[iCL][iLR][ial][ith][i] = sigma[i];
566 typedef std::array<float, 3> array3;
568 nalpha_old = (*m_sResolFromDB)->getNoOfAlphaBins();
569 double rad2deg = 180 / M_PI;
570 for (
unsigned short i = 0; i <
nalpha_old; ++i) {
572 array3 alpha = (*m_sResolFromDB)->getAlphaBin(i);
579 ntheta_old = (*m_sResolFromDB)->getNoOfThetaBins();
581 for (
unsigned short i = 0; i <
ntheta_old; ++i) {
583 array3 theta = (*m_sResolFromDB)->getThetaBin(i);
590 for (
unsigned short iCL = 0; iCL < MAX_N_SLAYERS; ++iCL) {
591 for (
unsigned short iLR = 0; iLR < 2; ++iLR) {
592 for (
unsigned short iA = 0; iA <
nalpha_old; ++iA) {
593 for (
unsigned short iT = 0; iT <
ntheta_old; ++iT) {
594 const std::vector<float> params = (*m_sResolFromDB)->getSigmaParams(iCL, iLR, iA, iT);
595 unsigned short np = params.size();
597 for (
unsigned short i = 0; i < np; ++i) {
598 sigma_old[iCL][iLR][iA][iT][i] = params[i];
608 B2INFO(
"readProfile");
611 B2INFO(
"use Sigma bining from input Sigma");
614 B2INFO(
"Number of alpha bins: " <<
m_nalpha);
615 for (
int i = 0; i <
m_nalpha; ++i) {
619 B2INFO(
"Number of theta bins: " <<
m_ntheta);
620 for (
int i = 0; i <
m_ntheta; ++i) {
625 B2INFO(
"use Sigma bining from profile file");
630 double dumy1, dumy2, dumy3;
632 B2INFO(
"Number of alpha bins: " <<
m_nalpha);
634 for (
int i = 0; i <
m_nalpha; ++i) {
635 proxt >> dumy1 >> dumy2 >> dumy3;
640 B2INFO(
"Number of theta bins: " <<
m_ntheta);
642 for (
int i = 0; i <
m_ntheta; ++i) {
643 proxt >> dumy1 >> dumy2 >> dumy3;
648 B2INFO(
"Finish asssign sigma bining");