Belle II Software  release-08-01-10
XTCalibration.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <cdc/calibration/XT.h>
9 #include <cdc/calibration/XTCalibration.h>
10 
11 #include <cdc/dbobjects/CDCXtRelations.h>
12 
13 #include <TError.h>
14 #include <TROOT.h>
15 #include <TH1D.h>
16 #include <TProfile.h>
17 #include <TF1.h>
18 #include <TFile.h>
19 #include <TChain.h>
20 #include <TSystem.h>
21 #include <iostream>
22 #include <iomanip>
23 
24 #include <framework/database/DBObjPtr.h>
25 #include <framework/logging/Logger.h>
26 #include <framework/utilities/FileSystem.h>
27 #include <cdc/calibration/CDCDatabaseImporter.h>
28 
29 #include <boost/iostreams/filtering_stream.hpp>
30 #include <boost/iostreams/device/file.hpp>
31 #include <boost/iostreams/filter/gzip.hpp>
32 
33 using namespace std;
34 using namespace Belle2;
35 using namespace CDC;
36 typedef std::array<float, 3> array3;
37 XTCalibration::XTCalibration()
38 // : m_firstExperiment(0), m_firstRun(0), m_lastExperiment(-1), m_lastRun(-1)
39 {
40  /*
41  setDescription(
42  " -------------------------- Test Calibration Algoritm -------------------------\n"
43  " \n"
44  " Testing algorithm which just gets mean of a test histogram collected by \n"
45  0 " CaTest module and provides a DB object with another histogram with one \n"
46  " entry at calibrated value. \n"
47  " ------------------------------------------------------------------------------\n"
48  );
49  */
50 }
51 
52 void XTCalibration::CreateHisto()
53 {
54  readXT();
55  readProfile();
56  /* read data from tree, make histo for fit*/
57  TChain* tree = new TChain("tree");
58  tree->Add(m_inputRootFileNames.c_str());
59  B2INFO("Open Files: " << m_inputRootFileNames);
60  if (!tree->GetBranch("ndf")) {
61  cout << "input data do not exits, please check!" << endl;
62  B2FATAL("echo rootfile do not exits or something wrong");
63  gSystem->Exec("echo rootfile do not exits or something wrong >> error");
64  return;
65  }
66  int lay;
67  double dt;
68  double dx;
69  double Pval, alpha, theta;
70  double ndf;
71 
72  tree->SetBranchAddress("lay", &lay);
73  tree->SetBranchAddress("t", &dt);
74  tree->SetBranchAddress("x_u", &dx);
75  tree->SetBranchAddress("alpha", &alpha);
76  tree->SetBranchAddress("theta", &theta);
77  tree->SetBranchAddress("Pval", &Pval);
78  tree->SetBranchAddress("ndf", &ndf);
79 
80  /* Disable unused branch */
81  std::vector<TString> list_vars = {"lay", "t", "x_u", "alpha", "theta", "Pval", "ndf"};
82  tree->SetBranchStatus("*", 0);
83 
84  for (TString brname : list_vars) {
85  tree->SetBranchStatus(brname, 1);
86  }
87 
88 
89  /*Create histogram*/
90  for (int i = 0; i < 56; ++i) {
91  for (int lr = 0; lr < 2; ++lr) {
92  for (int al = 0; al < m_nalpha; ++al) {
93  for (int th = 0; th < m_ntheta; ++th) {
94  hprof[i][lr][al][th] = new TProfile(Form("hprof%d_%d_%d_%d", i, lr, al, th),
95  Form("(L=%d)-(lr=%d)-(#alpha=%3.0f)-(#theta=%3.0f); Drift time (ns);Drift Length (cm)",
96  i, lr, ialpha[al], itheta[th]), 210, -20, 600, 0, 1.2, "i");
97  hist2d[i][lr][al][th] = new TH2D(Form("h%d_%d_%d_%d", i, lr, al, th),
98  Form("(L=%d)-(lr=%d)-(#alpha=%3.0f)-(#theta=%3.0f); Drift time (ns);Drift Length (cm)",
99  i, lr, ialpha[al], itheta[th]), 210, -20, 600, 110, 0, 1.2);
100  if (lr == 1)
101  hist2d_draw[i][al][th] = new TH2D(Form("h_draw%d_%d_%d", i, al, th),
102  Form("(L=%d)-(#alpha=%3.0f)-(#theta=%3.0f); Drift time (ns);Drift Length (cm)",
103  i, ialpha[al], itheta[th]), 210, -20, 600, 2200, -1.2, 1.2);
104  }
105  }
106  }
107  }
108 
109  /*Now read data and make histo*/
110  int al = 0;
111  int th = 0;
112  int lr = 0;
113  int nEntries = tree->GetEntries();
114  cout << "Number of Hit: " << nEntries << endl;
115 
116  for (int i = 0; i < nEntries; ++i) {
117  tree->GetEntry(i);
118  /* protect in case |alpha|>90*/
119  if (fabs(alpha) > 90) {
120  if (alpha < 0) alpha += 180;
121  if (alpha > 0) alpha -= 180;
122  }
123 
124  if (Pval < m_Pvalmin) continue;
125  if (ndf < m_ndfmin) continue;
126 
127  for (int k = 0; k < m_nalpha; ++k) {
128  if (alpha < u_alpha[k]) {al = k; break;}
129  }
130  for (int j = 0; j < m_ntheta; ++j) {
131  if (theta < u_theta[j]) {th = j; break;}
132  }
133  if (dx > 0)
134  lr = 1;
135  else
136  lr = 0;
137  if (m_LRseparate) {
138  hprof[lay][lr][al][th]->Fill(dt, abs(dx));
139  hist2d[lay][lr][al][th]->Fill(dt, abs(dx));
140  } else {
141  hprof[lay][0][al][th]->Fill(dt, abs(dx));
142  hist2d[lay][0][al][th]->Fill(dt, abs(dx));
143  hprof[lay][1][al][th]->Fill(dt, abs(dx));
144  hist2d[lay][1][al][th]->Fill(dt, abs(dx));
145  }
146  hist2d_draw[lay][al][th]->Fill(dt, dx);
147  }
148 }
149 void XTCalibration::readProfile()
150 {
151  /*Read profile for xt*/
152  if (m_useProfileXTFromInputXT) {
153  B2INFO("use XT bining from input XT");
154  m_nalpha = nalpha_old;
155  m_ntheta = ntheta_old;
156  B2INFO("Nalpha: " << m_nalpha << "\n Ntheta: " << m_ntheta);
157  for (int i = 0; i < m_nalpha; ++i) {
158  l_alpha[i] = l_alpha_old[i];
159  u_alpha[i] = u_alpha_old[i];
160  ialpha[i] = ialpha_old[i];
161  B2INFO("-" << l_alpha[i] << " " << u_alpha[i] << " " << ialpha[i]);
162  }
163  for (int i = 0; i < m_ntheta; ++i) {
164  l_theta[i] = l_theta_old[i];
165  u_theta[i] = u_theta_old[i];
166  itheta[i] = itheta_old[i];
167  B2INFO("-" << l_theta[i] << " " << u_theta[i] << " " << itheta[i]);
168  }
169  } else {
170  B2INFO("use XT bining from profile file");
171  ifstream proxt(m_profileFileName.c_str());
172  if (!proxt) {
173  B2FATAL("file not found: " << m_profileFileName);
174  }
175  double dumy1, dumy2, dumy3;
176  proxt >> m_nalpha;
177  B2DEBUG(99, "Number of alpha bin" << m_nalpha);
178  if (m_nalpha > m_MAXalpha) {
179  B2FATAL("number of alpha bin excess limit; please increse uplimit: " << m_nalpha << " > " << m_MAXalpha);
180  }
181  for (int i = 0; i < m_nalpha; ++i) {
182  proxt >> dumy1 >> dumy2 >> dumy3;
183  l_alpha[i] = dumy1;
184  u_alpha[i] = dumy2;
185  ialpha[i] = dumy3;
186  }
187  proxt >> m_ntheta;
188  B2DEBUG(99, "Number of theta bin" << m_nalpha);
189  if (m_ntheta > m_MAXtheta) {B2FATAL("number of theta bin excess limit; please increse uplimit: " << m_ntheta << " > " << m_MAXtheta);}
190  for (int i = 0; i < m_ntheta; ++i) {
191  proxt >> dumy1 >> dumy2 >> dumy3;
192  l_theta[i] = dumy1;
193  u_theta[i] = dumy2;
194  itheta[i] = dumy3;
195  }
196  }
197  B2INFO("Finish asssign XT bining");
198 }
199 
200 bool XTCalibration::calibrate()
201 {
202  gROOT->SetBatch(1);
203  gErrorIgnoreLevel = 3001;
204 
205  CreateHisto();
206  B2INFO("Start Fitting");
207  for (int l = 0; l < 56; ++l) {
208  for (int lr = 0; lr < 2; ++lr) {
209  for (int al = 0; al < m_nalpha; ++al) {
210  for (int th = 0; th < m_ntheta; ++th) {
211 
212  if (hist2d[l][lr][al][th]->GetEntries() < m_smallestEntryRequire) {
213  fitflag[l][lr][al][th] = -1;
214  continue;
215  }
216  double p0, p1, tmin;
217  TF1* fpol1;
218  if (m_useSliceFit) {
219  hist2d[l][lr][al][th]->FitSlicesY(0, 0, -1, 5);
220  hist2d_1[l][lr][al][th] = (TH1D*)gDirectory->Get(Form("h%d_%d_%d_%d_1", l, lr, al, th));
221  if (!hist2d_1[l][lr][al][th]) {
222  fitflag[l][lr][al][th] = -1;
223  B2WARNING("error, not found results of slices fit");
224  continue;
225  }
226  hist2d_1[l][lr][al][th]->Fit("pol1", "Q", "", 30, 60);
227  fpol1 = (TF1*)hprof[l][lr][al][th]->GetFunction("pol1");
228  } else {
229  /*Set Error for low statistic bin*/
230  for (int n = 0; n < hprof[l][lr][al][th]->GetNbinsX(); ++n) {
231  if (hprof[l][lr][al][th]->GetBinEntries(n) < 5 && hprof[l][lr][al][th]->GetBinEntries(n) > 1) {
232  hprof[l][lr][al][th]->SetBinError(n, 0.3 / hprof[l][lr][al][th]->GetBinEntries(n));
233  }
234  }
235  hprof[l][lr][al][th]->Fit("pol1", "Q", "", 30, 60);
236  fpol1 = (TF1*)hprof[l][lr][al][th]->GetFunction("pol1");
237  }
238  if (fpol1) {
239  //determine tmin in fitting
240  p0 = fpol1->GetParameter(0);
241  p1 = fpol1->GetParameter(1);
242  tmin = -1 * p0 / p1 + 15;
243  } else {
244  p0 = 0; p1 = 0.005;
245  tmin = 12;
246  }
247  XT* xt(nullptr);
248  if (m_useSliceFit) {
249  xt = new XT(hist2d_1[l][lr][al][th], m_xtmode);
250  } else {
251  xt = new XT(hprof[l][lr][al][th], m_xtmode);
252  }
253  // xt->setSmallestEntryRequired(m_smallestEntryRequire);
254  if (m_BField) {
255  int ial_old = 0;
256  int ith_old = 0;
257  for (int k = 0; k < nalpha_old; ++k) {
258  if (ialpha[al] < u_alpha_old[k]) {ial_old = k; break;}
259  }
260  for (int j = 0; j < ntheta_old; ++j) {
261  if (itheta[th] < u_theta_old[j]) {ith_old = j; break;}
262  }
263  double p6 = xtold[l][lr][ial_old][ith_old][6];
264  if (p6 > 400)
265  p6 = 400;
266  if (m_xtmode == xtmode_old) {
267  xt->setXTParams(xtold[l][lr][ial_old][ith_old]);
268  xt->setP6(p6);
269  } else {
270  xt->setXTParams(p0, p1, 0., 0., 0., 0., p6, xtold[l][lr][ial_old][ith_old][7]);
271  }
272  xt->setFitRange(tmin, p6 + 100);
273  } else {
274  xt->setXTParams(p0, p1, 0., 0., 0., 0., m_par6[l], 0.0001);
275  xt->setFitRange(tmin, m_par6[l] + 100);
276  }
277  xt->setDebug(m_debug);
278  xt->BField(m_BField);
279  xt->FitXT(m_xtmode);
280  /*get result*/
281  fitflag[l][lr][al][th] = xt->getFitStatus();
282  xtf5r[l][lr][al][th] = (TF1*)xt->getXTFunction();
283  if (m_useSliceFit) {
284  hist2d_1[l][lr][al][th] = (TH1D*)xt->getFittedHisto();
285  } else {
286  hprof[l][lr][al][th] = (TProfile*)xt->getFittedHisto();
287  }
288  delete xt;
289  }
290  }
291  }
292  }
293  Write();
294  storeHisto();
295  return true;
296 }
297 void XTCalibration::Write()
298 {
299  /*Set parameter for layer that fit do not success*/
300  /* and then write output file*/
301  double par[8];
302  ofstream xtout(m_OutputXTFileName.c_str());
303  xtout << m_nalpha << endl;
304  for (int i = 0; i < m_nalpha; ++i) {
305  xtout << std::setprecision(3) << l_alpha[i] << " "
306  << std::setprecision(3) << u_alpha[i] << " "
307  << std::setprecision(3) << ialpha[i] << endl;
308  }
309  xtout << m_ntheta << endl;
310  for (int i = 0; i < m_ntheta; ++i) {
311  xtout << std::setprecision(3) << l_theta[i] << " "
312  << std::setprecision(3) << u_theta[i] << " "
313  << std::setprecision(3) << itheta[i] << endl;
314  }
315  xtout << m_xtmode << " " << 8 << endl;
316 
317  int nfitted = 0;
318  int nfailure = 0;
319 
320  for (int th = 0; th < m_ntheta; ++th) {
321  for (int al = 0; al < m_nalpha; ++al) {
322  for (int l = 0; l < 56; ++l) {
323  for (int lr = 0; lr < 2; ++lr) {
324  /*Set Parameter for bad fit*/
325  if (fitflag[l][lr][al][th] != 1) {
326  nfailure += 1;
327  printf("fit failure status = %d \n", fitflag[l][lr][al][th]);
328  printf("layer %d, r %d, alpha %3.1f, theta %3.1f \n", l, lr, ialpha[al], itheta[th]);
329  printf("number of event: %3.2f", hprof[l][lr][al][th]->GetEntries());
330  if (fitflag[l][lr][al][th] != -1) {
331  printf("Probability of fit: %3.4f", xtf5r[l][lr][al][th]->GetProb());
332  }
333  if (m_xtmode == xtmode_old) {
334  int ial_old = 0;
335  int ith_old = 0;
336  for (int k = 0; k < nalpha_old; ++k) {
337  if (ialpha[al] < u_alpha_old[k]) {ial_old = k; break;}
338  }
339  for (int j = 0; j < ntheta_old; ++j) {
340  if (itheta[th] < u_theta_old[j]) {ith_old = j; break;}
341  }
342  for (int p = 0; p < 8; ++p) {
343  par[p] = xtold[l][lr][ial_old][ith_old][p];
344  }
345  } else {
346  //if mode of input xt is different from output, simple xt is used.
347  par[0] = 0; par[1] = 0.004; par[2] = 0; par[3] = 0; par[4] = 0; par[5] = 0; par[6] = m_par6[l]; par[7] = 0.00001;
348  }
349  } else {
350  xtf5r[l][lr][al][th]->GetParameters(par);
351  nfitted += 1;
352  }
353  /*Write params*/
354  xtout << l << std::setw(5) << itheta[th] << std::setw(5) << ialpha[al] << std::setw(5) << "0.0" << std::setw(4) << lr << std::setw(
355  15);
356  for (int p = 0; p < 8; ++p) {
357  if (p != 7) { xtout << std::setprecision(7) << par[p] << std::setw(15);}
358  if (p == 7) { xtout << std::setprecision(7) << par[p] << std::endl;}
359  }
360  }//lr
361  }//th
362  }//al
363  }//lay
364  xtout.close();
365  B2RESULT(" Total number of xt fit: " << m_nalpha * m_ntheta * 2 * 56);
366  B2RESULT(" Successfully Fitted: " << nfitted);
367  B2RESULT(" Failure Fit: " << nfailure);
368  B2RESULT("Finish export xt to text file");
369  if (m_useDB) {
370  CDCDatabaseImporter import(0, 0, -1, -1);
371  import.importXT(m_OutputXTFileName.c_str());
372  }
373 }
374 
375 void XTCalibration::storeHisto()
376 {
377  B2INFO("start store histogram");
378  TFile* fout = new TFile("XTFIT.root", "RECREATE");
379  TDirectory* top = gDirectory;
380  TDirectory* Direct[56];
381  int nhisto = 0;
382  for (int l = 0; l < 56; ++l) {
383  top->cd();
384  Direct[l] = gDirectory->mkdir(Form("lay_%d", l));
385  Direct[l]->cd();
386  for (int th = 0; th < m_ntheta; ++th) {
387  for (int al = 0; al < m_nalpha; ++al) {
388  hist2d_draw[l][al][th]->Write();
389  for (int lr = 0; lr < 2; ++lr) {
390  hist2d[l][lr][al][th]->Write();
391  if (fitflag[l][lr][al][th] != 1) continue;
392  if (m_useSliceFit) {
393  if (hist2d_1[l][lr][al][th]) {
394  hist2d_1[l][lr][al][th]->Write();
395  nhisto += 1;
396  }
397  } else {
398  hprof[l][lr][al][th]->Write();
399  nhisto += 1;
400  }
401  }
402  }
403  }
404  }
405  fout->Close();
406  B2RESULT(" " << nhisto << " histograms was stored.");
407 }
408 
409 void XTCalibration::readXT()
410 {
411  if (m_useDB) {
412  B2INFO("reading xt from DB");
413 
414  /*
415  ReadXT:readXTFromDB(&xtold,dbXT_old,
416  &nalpha_old,l_alpha_old,u_alpha_old,ialpha_old,
417  &ntheta_old,l_theta_old,u_theta_old, itheta_old);
418  */
419  readXTFromDB();
420  B2INFO("Number of theta bin from xt: " << ntheta_old);
421  B2INFO("Theta 0: " << itheta_old[0]);
422  // if(!a){
424  } else {
425  B2INFO("Read Xt from text");
426  /*
427  ReadXT::readXTFromText(xtold,m_xtfile,
428  nalpha_old,l_alpha_old,u_alpha_old,ialpha_old,
429  ntheta_old,l_theta_old,u_theta_old, itheta_old);
430  */
431  readXTFromText();
432  B2INFO("nalpha: " << nalpha_old);
433  // if(!a)
434  // {B2FATAL("Error reading xt from text");return;}
435  }
436 }
437 
438 void XTCalibration::readXTFromText()
439 {
440  std::string fileName1 = "/data/cdc" + m_xtfile;
441  std::string fileName = FileSystem::findFile(fileName1);
442  boost::iostreams::filtering_istream ifs;
443  if (fileName == "") {
444  fileName = FileSystem::findFile(m_xtfile);
445  }
446  if (fileName == "") {
447  B2FATAL("CDCGeometryPar: " << fileName1 << " not exist!");
448  } else {
449  B2INFO("CDCGeometryPar: open " << fileName1);
450  if ((fileName.rfind(".gz") != string::npos) && (fileName.length() - fileName.rfind(".gz") == 3)) {
451  ifs.push(boost::iostreams::gzip_decompressor());
452  }
453  ifs.push(boost::iostreams::file_source(fileName));
454  if (!ifs) B2FATAL("CDCGeometryPar: cannot open " << fileName1 << " !");
455 
456 
457  }
458  const int npar = 8;
459  //read alpha bin info.
460  // unsigned short nAlphaBins = 0;
461  ifs >> nalpha_old;
462 
463  for (unsigned short i = 0; i < nalpha_old; ++i) {
464  ifs >> l_alpha_old[i] >> u_alpha_old[i] >> ialpha_old[i];
465  // ifs >> alpha0 >> alpha1 >> alpha2;
466  //m_alphaPoints[i] = alpha2;
467  }
468 
469  //read theta bin info.
470  // unsigned short nThetaBins = 0;
471  ifs >> ntheta_old;
472 
473  for (unsigned short i = 0; i < ntheta_old; ++i) {
474  ifs >> l_theta_old[i] >> u_theta_old[i] >> itheta_old[i];
475  //ifs >> theta0 >> theta1 >> theta2;
476  //m_thetaPoints[i] = theta2;
477  }
478 
479  B2INFO("number of alpha - theta bin" << nalpha_old << " - " << ntheta_old);
480  short np = 0;
481  unsigned short iCL, iLR;
482  // const unsigned short npx = nXTParams - 1;
483  double xtc[npar]; // cppcheck-suppress constVariable
484  double theta, alpha, dummy1;
485  // unsigned m_xtParamMode_old;
486  ifs >> xtmode_old >> np;
487 
488  const double epsi = 0.1;
489 
490  while (ifs >> iCL) {
491  ifs >> theta >> alpha >> dummy1 >> iLR;
492  for (int i = 0; i < np; ++i) {
493  ifs >> xtc[i];
494  }
495 
496  int ith = -99;
497  for (unsigned short i = 0; i < ntheta_old; ++i) {
498  if (fabs(theta - itheta_old[i]) < epsi) {
499  ith = i;
500  break;
501  }
502  }
503  if (ith < 0) {
504  gSystem->Exec("echo xt_theta error binning>> error");
505  return;
506  }
507 
508  int ial = -99;
509  for (unsigned short i = 0; i < nalpha_old; ++i) {
510  if (fabs(alpha - ialpha_old[i]) < epsi) {
511  ial = i;
512  break;
513  }
514  }
515  if (ial < 0) {
516  gSystem->Exec("echo xt_alpha error binning>> error");
517  return;
518  }
519 
520  for (int i = 0; i < np; ++i) {
521  xtold[iCL][iLR][ial][ith][i] = xtc[i];
522  }
523 
524  } //end of while loop
525 
526  //convert unit
527  /*
528  const double degrad = M_PI / 180.;
529  for (unsigned i = 0; i < nAlphaBins; ++i) {
530  m_alphaPoints[i] *= degrad;
531  }
532  for (unsigned i = 0; i < nThetaBins; ++i) {
533  m_thetaPoints[i] *= degrad;
534  }
535  */
536  // return true;
537 }
538 void XTCalibration::readXTFromDB()
539 {
540  DBObjPtr<CDCXtRelations> dbXT_old;
541  nalpha_old = dbXT_old->getNoOfAlphaBins();
542  B2INFO("Number of alpha" << nalpha_old);
543  double rad2deg = 180 / M_PI;
544  for (unsigned short i = 0; i < nalpha_old; ++i) {
545  array3 alpha = dbXT_old->getAlphaBin(i);
546  l_alpha_old[i] = alpha[0] * rad2deg;
547  u_alpha_old[i] = alpha[1] * rad2deg;
548  ialpha_old[i] = alpha[2] * rad2deg;
549  // std::cout << m_alphaPoints[i]*180./M_PI << std::endl;
550  }
551 
552  ntheta_old = dbXT_old->getNoOfThetaBins();
553  B2INFO("Ntheta: " << ntheta_old);
554  for (unsigned short i = 0; i < ntheta_old; ++i) {
555  // m_thetaPoints[i] = (*dbXT_old).getThetaPoint(i);
556  array3 theta = dbXT_old->getThetaBin(i);
557  l_theta_old[i] = theta[0] * rad2deg;
558  u_theta_old[i] = theta[1] * rad2deg;
559  itheta_old[i] = theta[2] * rad2deg;
560 
561 
562  // std::cout << m_thetaPoints[i]*180./M_PI << std::endl;
563  }
564 
565  xtmode_old = dbXT_old->getXtParamMode();
566 
567  for (unsigned short iCL = 0; iCL < 56; ++iCL) {
568  for (unsigned short iLR = 0; iLR < 2; ++iLR) {
569  for (unsigned short iA = 0; iA < nalpha_old; ++iA) {
570  for (unsigned short iT = 0; iT < ntheta_old; ++iT) {
571  const std::vector<float> params = dbXT_old->getXtParams(iCL, iLR, iA, iT);
572  unsigned short np = params.size();
573  // std::cout <<"np4xt= " << np << std::endl;
574  for (unsigned short i = 0; i < np; ++i) {
575  xtold[iCL][iLR][iA][iT][i] = params[i];
576  }
577  }
578  }
579  }
580  }
581  // return true;
582 }
CDC database importer.
void importXT(std::string fileName)
Import xt table to the database.
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
Class to perform fitting for each xt function.
Definition: XT.h:60
void setXTParams(const double p[8])
Set Parameters for fit.
Definition: XT.h:115
void setP6(double p6)
Set Parameter 6 for polynomial fit.
Definition: XT.h:93
void setFitRange(double tmin, double tmax)
Set Fit range.
Definition: XT.h:135
TF1 * getXTFunction(int mode)
Get XT function.
Definition: XT.h:179
void FitXT()
Do fitting.
Definition: XT.h:200
void setDebug(bool debug)
Set Debug.
Definition: XT.h:150
TProfile * getFittedHisto()
Get histogram.
Definition: XT.h:195
int getFitStatus()
get fitted flag.
Definition: XT.h:157
void BField(bool bfield)
set to use BField
Definition: XT.h:110
Abstract base class for different kinds of events.