1 #include <cdc/calibration/T0CalibrationAlgorithm.h>
2 #include <calibration/CalibrationAlgorithm.h>
3 #include <cdc/dbobjects/CDCTimeZeros.h>
4 #include <cdc/dataobjects/WireID.h>
5 #include <cdc/geometry/CDCGeometryPar.h>
9 #include <TGraphErrors.h>
14 #include <framework/database/DBObjPtr.h>
15 #include <framework/database/IntervalOfValidity.h>
16 #include <framework/logging/Logger.h>
26 " -------------------------- T0 Calibration Algorithm -------------------------\n"
33 B2INFO(
"Creating histograms");
42 auto tree = getObjectPtr<TTree>(
"tree");
43 tree->SetBranchAddress(
"lay", &lay);
44 tree->SetBranchAddress(
"IWire", &IWire);
45 tree->SetBranchAddress(
"x_u", &x);
46 tree->SetBranchAddress(
"t", &t_mea);
47 tree->SetBranchAddress(
"t_fit", &t_fit);
48 tree->SetBranchAddress(
"ndf", &ndf);
49 tree->SetBranchAddress(
"Pval", &Pval);
53 std::vector<TString> list_vars = {
"lay",
"IWire",
"x_u",
"t",
"t_fit",
"Pval",
"ndf"};
54 tree->SetBranchStatus(
"*", 0);
56 for (TString brname : list_vars) {
57 tree->SetBranchStatus(brname, 1);
65 for (
int i = 0; i < 56; ++i) {
68 halfCSize[i] = M_PI * R / nW;
71 m_hTotal =
new TH1F(
"hTotal",
"hTotal", 30, -15, 15);
73 for (
int il = 0; il < 56; il++) {
75 for (
int ic = 0; ic < nW; ++ic) {
76 m_h1[il][ic] =
new TH1F(Form(
"h1%d@%d", il, ic), Form(
"L%d_cell%d", il, ic), 30, -15, 15);
80 for (
int ib = 0; ib < 300; ++ib) {
81 m_hT0b[ib] =
new TH1F(Form(
"hT0b%d", ib), Form(
"boardID_%d", ib), 100, -20, 20);
84 const Long64_t nEntries = tree->GetEntries();
85 B2INFO(
"Number of entries: " << nEntries);
86 for (Long64_t i = 0; i < nEntries; ++i) {
88 double xmax = halfCSize[lay] - 0.1;
89 if ((fabs(x) <
m_xmin) || (fabs(x) > xmax)
94 m_h1[lay][IWire]->Fill(t_mea - t_fit);
97 m_hT0b[boardID]->Fill(t_mea - t_fit);
99 B2INFO(
"Finish making histogram for all channels");
104 B2INFO(
"Start calibration");
107 gErrorIgnoreLevel = 3001;
115 B2INFO(
"ExpRun used for DB Geometry : " << exprun.first <<
" " << exprun.second);
126 B2INFO(
"Creating CDCGeometryPar object");
129 auto hEvtT0 = getObjectPtr<TH1F>(
"hEventT0");
130 double dEventT0 = hEvtT0->GetMean();
132 TH1F* hm_All =
new TH1F(
"hm_All",
"mean of #DeltaT distribution for all chanels", 500, -10, 10);
133 TH1F* hs_All =
new TH1F(
"hs_All",
"#sigma of #DeltaT distribution for all chanels", 100, 0, 10);
136 TF1* g1 =
new TF1(
"g1",
"gaus", -100, 100);
137 vector<double> b, db, Sb, dSb;
138 vector<double> c[56];
139 vector<double> dc[56];
140 vector<double> s[56];
141 vector<double> ds[56];
143 B2INFO(
"Gaus fitting for whole channel");
147 m_hTotal->Fit(
"g1",
"Q",
"", mean - 15, mean + 15);
148 g1->GetParameters(par);
150 B2INFO(
"Gaus fitting for each board");
151 for (
int ib = 1; ib < 300; ++ib) {
152 if (
m_hT0b[ib]->GetEntries() < 10)
continue;
153 mean =
m_hT0b[ib]->GetMean();
154 m_hT0b[ib]->SetDirectory(0);
155 m_hT0b[ib]->Fit(
"g1",
"Q",
"", mean - 15, mean + 15);
156 g1->GetParameters(par);
159 Sb.push_back(par[1]);
160 dSb.push_back(g1->GetParError(1));
162 err_dtb[ib] = g1->GetParError(1);
164 B2INFO(
"Gaus fitting for each cell");
165 for (
int ilay = 0; ilay < 56; ++ilay) {
166 for (
unsigned int iwire = 0; iwire < cdcgeo.
nWiresInLayer(ilay); ++iwire) {
167 const int n =
m_h1[ilay][iwire]->GetEntries();
168 B2DEBUG(21,
"layer " << ilay <<
" wire " << iwire <<
" entries " << n);
169 if (n < 10)
continue;
170 mean =
m_h1[ilay][iwire]->GetMean();
171 m_h1[ilay][iwire]->SetDirectory(0);
172 m_h1[ilay][iwire]->Fit(
"g1",
"Q",
"", mean - 15, mean + 15);
173 g1->GetParameters(par);
174 c[ilay].push_back(iwire);
175 dc[ilay].push_back(0.0);
176 s[ilay].push_back(par[1]);
177 ds[ilay].push_back(g1->GetParError(1));
179 dt[ilay][iwire] = par[1];
180 err_dt[ilay][iwire] = g1->GetParError(1);
181 hm_All->Fill(par[1]);
182 hs_All->Fill(par[2]);
188 for (
int ilay = 0; ilay < 56; ++ilay) {
189 for (
unsigned int iwire = 0; iwire < cdcgeo.
nWiresInLayer(ilay); ++iwire) {
190 dt[ilay][iwire] += dEventT0;
197 B2INFO(
"Storing histograms");
198 auto hNDF = getObjectPtr<TH1F>(
"hNDF");
199 auto hPval = getObjectPtr<TH1F>(
"hPval");
200 TFile* fout =
new TFile(
m_histName.c_str(),
"RECREATE");
202 TGraphErrors* gr[56];
203 TDirectory* top = gDirectory;
206 if (hNDF && hPval && hEvtT0) {
214 TDirectory* subDir[56];
215 for (
int ilay = 0; ilay < 56; ++ilay) {
216 subDir[ilay] = top ->mkdir(Form(
"lay_%d", ilay));
218 for (
unsigned int iwire = 0; iwire < cdcgeo.
nWiresInLayer(ilay); ++iwire) {
219 m_h1[ilay][iwire]->Write();
223 TDirectory* corrT0 = top->mkdir(
"DeltaT0");
227 TGraphErrors* grb =
new TGraphErrors(b.size(), &b.at(0), &Sb.at(0), &db.at(0), &dSb.at(0));
228 grb->SetMarkerColor(2);
229 grb->SetMarkerSize(1.0);
230 grb->SetTitle(
"#DeltaT0;BoardID;#DeltaT0[ns]");
232 grb->SetMinimum(-10);
233 grb->SetName(
"Board");
236 for (
int sl = 0; sl < 56; ++sl) {
237 if (c[sl].size() < 2)
continue;
238 gr[sl] =
new TGraphErrors(c[sl].size(), &c[sl].at(0), &s[sl].at(0), &dc[sl].at(0), &ds[sl].at(0));
239 gr[sl]->SetMarkerColor(2);
240 gr[sl]->SetMarkerSize(1.0);
241 gr[sl]->SetTitle(Form(
"Layer_%d;IWire;#LT t_{mea}-t_{fit} #GT [ns]", sl));
242 gr[sl]->SetMaximum(10);
243 gr[sl]->SetMinimum(-10);
244 gr[sl]->SetName(Form(
"lay%d", sl));
249 B2INFO(
"Writing constants");
254 B2INFO(
"mean " << fabs(hm_All->GetMean()) <<
" " <<
m_maxMeanDt);
255 B2INFO(
"sigma " << fabs(hm_All->GetRMS()) <<
" " <<
m_maxRMSDt);
258 B2INFO(
"mean " << fabs(hm_All->GetMean()) <<
" " <<
m_maxMeanDt);
259 B2INFO(
"sigma " << fabs(hm_All->GetRMS()) <<
" " <<
m_maxRMSDt);
270 for (
int ib = 0; ib < 300; ++ib) {
271 T0B[ib] =
new TH1F(Form(
"T0B%d", ib), Form(
"boardID_%d", ib), 9000, 0, 9000);
274 for (
int ilay = 0; ilay < 56; ++ilay) {
275 for (
unsigned int iwire = 0; iwire < cdcgeo.
nWiresInLayer(ilay); ++iwire) {
276 WireID wireid(ilay, iwire);
277 T0 = cdcgeo.
getT0(wireid);
283 for (
int ilay = 0; ilay < 56; ++ilay) {
284 for (
unsigned int iwire = 0; iwire < cdcgeo.
nWiresInLayer(ilay); ++iwire) {
285 WireID wireid(ilay, iwire);
287 if (abs(
err_dt[ilay][iwire]) > 2 || abs(
dt[ilay][iwire]) > 1.e3) {
288 T0 = T0B[bID]->GetMean();
289 dt[ilay][iwire] =
dtb[bID];
291 T0 = cdcgeo.
getT0(wireid);
293 tz->
setT0(wireid, T0 -
dt[ilay][iwire]);