BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
PreT0Calib.cpp
Go to the documentation of this file.
2#include "TF1.h"
3#include "TStyle.h"
4#include "include/fun.h"
5#include <cmath>
6
8 cout << "Calibration type: PreT0Calib" << endl;
9 m_nzbin = 11;
10}
11
13
14void PreT0Calib::init( TObjArray* hlist, MdcCosGeom* pGeom ) {
15 m_pGeom = pGeom;
16 char hname[200];
17
18 m_fdTrec = new TFolder( "mTrec", "Trec" );
19 hlist->Add( m_fdTrec );
20
21 m_fdTrecZ = new TFolder( "mTrecZ", "TrecZ" );
22 hlist->Add( m_fdTrecZ );
23
24 for ( int lay = 0; lay < NLAYER; lay++ )
25 {
26 for ( int lr = 0; lr < NLR; lr++ )
27 {
28 if ( 0 == lr ) sprintf( hname, "mTrec%02d_L", lay );
29 else if ( 1 == lr ) sprintf( hname, "mTrec%02d_R", lay );
30 else sprintf( hname, "mTrec%02d_C", lay );
31
32 if ( lay < 8 ) m_hTrec[lay][lr] = new TH1F( hname, "", 100, 0, 400 );
33 else m_hTrec[lay][lr] = new TH1F( hname, "", 125, 0, 500 );
34 m_fdTrec->Add( m_hTrec[lay][lr] );
35 }
36 }
37
38 for ( int lay = 0; lay < NLAYER; lay++ )
39 {
40 for ( int iud = 0; iud < 2; iud++ )
41 {
42 if ( 0 == iud ) sprintf( hname, "mTrecCosm%02d_Up", lay );
43 else sprintf( hname, "mTrecCosm%02d_Dw", lay );
44 if ( lay < 8 ) m_hTrecCosm[lay][iud] = new TH1F( hname, "", 100, 0, 400 );
45 else m_hTrecCosm[lay][iud] = new TH1F( hname, "", 125, 0, 500 );
46 m_fdTrec->Add( m_hTrecCosm[lay][iud] );
47 }
48 }
49
50 for ( int lay = 0; lay < NLAYER; lay++ )
51 {
52 for ( int lr = 0; lr < NLR; lr++ )
53 {
54 for ( int bin = 0; bin < m_nzbin; bin++ )
55 {
56 if ( 0 == lr ) sprintf( hname, "mTrec%02d_z%02d_L", lay, bin );
57 else if ( 1 == lr ) sprintf( hname, "mTrec%02d_z%02d_R", lay, bin );
58 else sprintf( hname, "mTrec%02d_z%02d_C", lay, bin );
59
60 if ( lay < 8 ) m_hTrecZ[lay][lr][bin] = new TH1F( hname, "", 100, 0, 400 );
61 else m_hTrecZ[lay][lr][bin] = new TH1F( hname, "", 125, 0, 500 );
62 m_fdTrecZ->Add( m_hTrecZ[lay][lr][bin] );
63 }
64 }
65 }
66}
67
68void PreT0Calib::mergeHist( TFile* fhist ) {
69 char hname[200];
70 TFolder* fdTrec = (TFolder*)fhist->Get( "Trec" );
71 TFolder* fdTrecZ = (TFolder*)fhist->Get( "TrecZ" );
72
73 TH1F* hist;
74 for ( int lay = 0; lay < NLAYER; lay++ )
75 {
76 for ( int lr = 0; lr < NLR; lr++ )
77 {
78 if ( 0 == lr ) sprintf( hname, "Trec%02d_L", lay );
79 else if ( 1 == lr ) sprintf( hname, "Trec%02d_R", lay );
80 else sprintf( hname, "Trec%02d_C", lay );
81 hist = (TH1F*)fdTrec->FindObjectAny( hname );
82 m_hTrec[lay][lr]->Add( hist );
83 }
84 }
85
86 for ( int lay = 0; lay < NLAYER; lay++ )
87 {
88 for ( int iud = 0; iud < 2; iud++ )
89 {
90 if ( 0 == iud ) sprintf( hname, "TrecCosm%02d_Up", lay );
91 else sprintf( hname, "TrecCosm%02d_Dw", lay );
92 hist = (TH1F*)fdTrec->FindObjectAny( hname );
93 m_hTrecCosm[lay][iud]->Add( hist );
94 }
95 }
96
97 for ( int lay = 0; lay < NLAYER; lay++ )
98 {
99 for ( int lr = 0; lr < NLR; lr++ )
100 {
101 for ( int bin = 0; bin < m_nzbin; bin++ )
102 {
103 if ( 0 == lr ) sprintf( hname, "Trec%02d_z%02d_L", lay, bin );
104 else if ( 1 == lr ) sprintf( hname, "Trec%02d_z%02d_R", lay, bin );
105 else sprintf( hname, "Trec%02d_z%02d_C", lay, bin );
106 hist = (TH1F*)fdTrecZ->FindObjectAny( hname );
107 m_hTrecZ[lay][lr][bin]->Add( hist );
108 }
109 }
110 }
111}
112
113void PreT0Calib::calib( MdcCalibConst* calconst, TObjArray* newXtList, TObjArray* r2tList ) {
114 // fit Tmin int lay;
115 double t0FitPar[NLAYER][NLR][6];
116 double t0Fit[NLAYER][NLR];
117 double t0Cal[NLAYER][NLR];
118 double tmax[NLAYER][NLR];
119 double initT0 = gInitT0;
120
121 int fitTminFg[NLAYER][NLR];
122 int fitTmaxFg[NLAYER][NLR];
123 double chisq;
124 double ndf;
125 double chindfTmin[NLAYER][NLR];
126 double chindfTmax[NLAYER][NLR];
127 char funname[200];
128
129 // add for cosmic-ray
130 TF1* ftminCosm[NLAYER][2];
131 double t0FitCosm[NLAYER][2];
132
133 bool fgT0Ini = false;
134 double t0ParIni[NLAYER][NLR][6];
135 ifstream fparIni( "fitT0_inival.txt" );
136 if ( fparIni.is_open() )
137 {
138 string strtmp;
139 for ( int lay = 0; lay < NLAYER; lay++ )
140 {
141 fparIni >> strtmp >> strtmp;
142 for ( int i = 0; i < 6; i++ ) fparIni >> t0ParIni[lay][2][i];
143 }
144 fparIni.close();
145 fgT0Ini = true;
146 cout << "read initial values of T0 fit from fitT0_inival.txt" << endl;
147 }
148 if ( !fgT0Ini ) cout << "set initial values of T0 fit to default values" << endl;
149
150 TF1* ftmin[NLAYER][NLR];
151 for ( int lay = 0; lay < NLAYER; lay++ )
152 {
153 for ( int lr = 0; lr < NLR; lr++ )
154 {
155 fitTminFg[lay][lr] = 0;
156 chindfTmin[lay][lr] = -1;
157 sprintf( funname, "ftmin%02d_%d", lay, lr );
158 ftmin[lay][lr] = new TF1( funname, funTmin, 0, 150, 6 );
159 if ( lr < 2 ) continue;
160
161 if ( 1 == gFgCalib[lay] )
162 {
163 // Stat_t nEntryTot = 0;
164 // for(int ibin=1; ibin<=25; ibin++){
165 // Stat_t entry = m_hTrec[lay][lr]->GetBinContent(ibin);
166 // nEntryTot += entry;
167 // }
168 // double c0Ini = (double)nEntryTot / 25.0;
169 double c1Ini = ( m_hTrec[lay][lr]->GetMaximum() );
170
171 if ( fgT0Ini )
172 {
173 for ( int i = 0; i < 6; i++ )
174 {
175 if ( fabs( t0ParIni[lay][2][i] + 9999 ) < 0.01 ) continue;
176 ftmin[lay][lr]->SetParameter( i, t0ParIni[lay][2][i] );
177 }
178 }
179 else
180 {
181 ftmin[lay][lr]->SetParameter( 0, 0 );
182 ftmin[lay][lr]->SetParameter( 1, c1Ini );
183 ftmin[lay][lr]->SetParameter( 2, 0 );
184 ftmin[lay][lr]->SetParameter( 4, initT0 );
185 if ( lay < 4 ) ftmin[lay][lr]->SetParameter( 5, 4 );
186 else ftmin[lay][lr]->SetParameter( 5, 1.5 );
187 }
188
189 if ( lay < 4 ) m_hTrec[lay][lr]->Fit( funname, "Q", "", 0, 140 );
190 else
191 m_hTrec[lay][lr]->Fit( funname, "Q", "", gTminFitRange[lay][0],
192 gTminFitRange[lay][1] );
193 gStyle->SetOptFit( 11 );
194 chisq = ftmin[lay][lr]->GetChisquare();
195 ndf = ftmin[lay][lr]->GetNDF();
196 chindfTmin[lay][lr] = chisq / ndf;
197
198 // if(chindfTmin[lay][lr] > 100){
199 // ftmin[lay][lr] -> SetParameter(1, c1Ini+2000);
200 // m_hTrec[lay][lr] -> Fit(funname, "Q", "",
201 // gTminFitRange[lay][0], gTminFitRange[lay][1]); chisq =
202 // ftmin[lay][lr]->GetChisquare(); ndf = ftmin[lay][lr]->GetNDF(); chindfTmin[lay][lr]
203 // = chisq / ndf;
204 // }
205
206 if ( chindfTmin[lay][lr] < gTminFitChindf )
207 {
208 fitTminFg[lay][lr] = 1;
209 t0Fit[lay][lr] = ftmin[lay][lr]->GetParameter( 4 );
210 t0Fit[lay][lr] += gT0Shift;
211 t0Cal[lay][lr] = t0Fit[lay][lr] - gTimeShift;
212 for ( int i = 0; i < 6; i++ )
213 t0FitPar[lay][lr][i] = ftmin[lay][lr]->GetParameter( i );
214 }
215 }
216
217 if ( 0 == fitTminFg[lay][lr] )
218 {
219 int wir = m_pGeom->getWire( lay, 0 )->getWireId();
220 t0Cal[lay][lr] = calconst->getT0( wir );
221 t0Fit[lay][lr] = t0Cal[lay][lr] + gTimeShift;
222 }
223 }
224
225 for ( int iud = 0; iud < 2; iud++ )
226 {
227 sprintf( funname, "ftminCosm_%02d_%d", lay, iud );
228 ftminCosm[lay][iud] = new TF1( funname, funTmin, 0, 150, 6 );
229 ftminCosm[lay][iud]->SetParameter( 0, 0 );
230 ftminCosm[lay][iud]->SetParameter( 4, initT0 );
231 ftminCosm[lay][iud]->SetParameter( 5, 1 );
232 m_hTrecCosm[lay][iud]->Fit( funname, "Q", "", gTminFitRange[lay][0],
233 gTminFitRange[lay][1] );
234 gStyle->SetOptFit( 11 );
235 t0FitCosm[lay][iud] += gT0Shift;
236 t0FitCosm[lay][iud] = ftminCosm[lay][iud]->GetParameter( 4 );
237 }
238 }
239
240 // fit Tmax
241 TF1* ftmax[NLAYER][NLR];
242 for ( int lay = 0; lay < NLAYER; lay++ )
243 {
244 for ( int lr = 0; lr < NLR; lr++ )
245 {
246 fitTmaxFg[lay][lr] = 0;
247 chindfTmax[lay][lr] = -1;
248 sprintf( funname, "ftmax%02d_%d", lay, lr );
249 ftmax[lay][lr] = new TF1( funname, funTmax, 250, 500, 4 );
250
251 if ( 1 == gFgCalib[lay] )
252 {
253 ftmax[lay][lr]->SetParameter( 2, gInitTm[lay] );
254 ftmax[lay][lr]->SetParameter( 3, 10 );
255 m_hTrec[lay][lr]->Fit( funname, "Q+", "", gTmaxFitRange[lay][0],
256 gTmaxFitRange[lay][1] );
257 gStyle->SetOptFit( 11 );
258 chisq = ftmax[lay][lr]->GetChisquare();
259 ndf = ftmax[lay][lr]->GetNDF();
260 chindfTmax[lay][lr] = chisq / ndf;
261 if ( chindfTmax[lay][lr] < gTmaxFitChindf )
262 {
263 fitTmaxFg[lay][lr] = 1;
264 tmax[lay][lr] = ftmax[lay][lr]->GetParameter( 2 );
265 }
266 }
267
268 if ( 0 == fitTmaxFg[lay][lr] )
269 { tmax[lay][lr] = ( calconst->getXtpar( lay, 0, lr, 6 ) ) + t0Fit[lay][2]; }
270 }
271 }
272
273 // output for check
274 ofstream ft0( "preT0.dat" );
275 for ( int lay = 0; lay < NLAYER; lay++ )
276 {
277 ft0 << setw( 5 ) << lay << setw( 3 ) << fitTminFg[lay][2] << setw( 15 ) << t0Cal[lay][2]
278 << setw( 15 ) << t0Fit[lay][2] << setw( 15 ) << chindfTmin[lay][2] << endl;
279 }
280 ft0 << endl;
281 for ( int lay = 0; lay < NLAYER; lay++ )
282 {
283 ft0 << setw( 5 ) << lay << setw( 3 ) << fitTmaxFg[lay][0] << setw( 10 ) << tmax[lay][0]
284 << setw( 10 ) << chindfTmax[lay][0] << setw( 3 ) << fitTmaxFg[lay][1] << setw( 10 )
285 << tmax[lay][1] << setw( 10 ) << chindfTmax[lay][1] << setw( 3 ) << fitTmaxFg[lay][2]
286 << setw( 10 ) << tmax[lay][2] << setw( 10 ) << chindfTmax[lay][2] << setw( 10 )
287 << tmax[lay][0] - t0Fit[lay][2] << setw( 10 ) << tmax[lay][1] - t0Fit[lay][2]
288 << setw( 10 ) << tmax[lay][2] - t0Fit[lay][2] << endl;
289 }
290 ft0 << endl;
291 for ( int lay = 0; lay < NLAYER; lay++ )
292 {
293 ft0 << setw( 5 ) << lay << setw( 15 ) << chindfTmin[lay][2];
294 for ( int i = 0; i < 6; i++ ) ft0 << setw( 15 ) << t0FitPar[lay][2][i];
295 ft0 << endl;
296 }
297 ft0.close();
298 cout << "preT0.dat was written." << endl;
299
300 // output for cosmic T0
301 ofstream ft0cosm( "cosmicT0.dat" );
302 for ( int lay = 0; lay < NLAYER; lay++ )
303 {
304 ft0cosm << setw( 5 ) << lay << setw( 15 ) << t0Fit[lay][2] << setw( 15 )
305 << t0FitCosm[lay][0] << setw( 15 ) << t0FitCosm[lay][1] << endl;
306 }
307 ft0cosm.close();
308
309 // set T0
310 for ( int i = 0; i < NWIRE; i++ )
311 {
312 int lay = m_pGeom->getWire( i )->getLayerId();
313 if ( 1 == gFgCalib[lay] )
314 {
315 calconst->resetT0( i, t0Cal[lay][2] );
316 calconst->resetDelT0( i, 0.0 );
317 }
318 }
319
320 // set tm of X-T
321 if ( gPreT0SetTm )
322 {
323 double tm;
324 for ( int lay = 0; lay < NLAYER; lay++ )
325 {
326 if ( 1 != gFgCalib[lay] ) continue;
327
328 for ( int iEntr = 0; iEntr < NENTRXT; iEntr++ )
329 {
330 for ( int lr = 0; lr < NLR; lr++ )
331 {
332 tm = tmax[lay][lr] - t0Fit[lay][2];
333 if ( ( tmax[lay][lr] > gTmaxFitRange[lay][0] ) &&
334 ( tmax[lay][lr] < gTmaxFitRange[lay][1] ) )
335 { calconst->resetXtpar( lay, iEntr, lr, 6, tm ); }
336 }
337 }
338 }
339 }
340
341 renameHist();
342 for ( int lay = 0; lay < NLAYER; lay++ )
343 {
344 for ( int lr = 0; lr < NLR; lr++ )
345 {
346 delete ftmin[lay][lr];
347 delete ftmax[lay][lr];
348 }
349 }
350}
351
352void PreT0Calib::renameHist() {
353 char hname[200];
354 for ( int lay = 0; lay < NLAYER; lay++ )
355 {
356 for ( int lr = 0; lr < NLR; lr++ )
357 {
358 if ( 0 == lr ) sprintf( hname, "Trec%02d_L", lay );
359 else if ( 1 == lr ) sprintf( hname, "Trec%02d_R", lay );
360 else sprintf( hname, "Trec%02d_C", lay );
361 m_hTrec[lay][lr]->SetName( hname );
362 }
363 }
364 for ( int lay = 0; lay < NLAYER; lay++ )
365 {
366 for ( int iud = 0; iud < 2; iud++ )
367 {
368 if ( 0 == iud ) sprintf( hname, "TrecCosm%02d_Up", lay );
369 else sprintf( hname, "TrecCosm%02d_Dw", lay );
370 m_hTrecCosm[lay][iud]->SetName( hname );
371 }
372 }
373 for ( int lay = 0; lay < NLAYER; lay++ )
374 {
375 for ( int lr = 0; lr < NLR; lr++ )
376 {
377 for ( int bin = 0; bin < m_nzbin; bin++ )
378 {
379 if ( 0 == lr ) sprintf( hname, "Trec%02d_z%02d_L", lay, bin );
380 else if ( 1 == lr ) sprintf( hname, "Trec%02d_z%02d_R", lay, bin );
381 else sprintf( hname, "Trec%02d_z%02d_C", lay, bin );
382 m_hTrecZ[lay][lr][bin]->SetName( hname );
383 }
384 }
385 }
386}
387
388Double_t PreT0Calib::funTmin( Double_t* x, Double_t* par ) {
389 Double_t fitval;
390 fitval = par[0] + par[1] * exp( -par[2] * ( x[0] - par[3] ) ) /
391 ( 1 + exp( -( x[0] - par[4] ) / par[5] ) );
392 return fitval;
393}
394
395Double_t PreT0Calib::funTmax( Double_t* x, Double_t* par ) {
396 Double_t fitval;
397 fitval = par[0] + par[1] / ( 1 + exp( ( x[0] - par[2] ) / par[3] ) );
398 return fitval;
399}
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
Double_t x[10]
EvtComplex exp(const EvtComplex &c)
*******INTEGER m_nBinMax INTEGER m_NdiMax !No of bins in histogram for cell exploration division $ !Last vertex $ !Last active cell $ !Last cell in buffer $ !No of sampling when dividing cell $ !No of function total $ !Flag for random ceel for $ !Flag for type of for WtMax $ !Flag which decides whether vertices are included in the sampling $ entire domain is hyp !Maximum effective eevents per bin
Definition FoamA.h:85
double gInitTm[NLAYER]
double gTminFitRange[NLAYER][2]
double gTmaxFitRange[NLAYER][2]
void resetXtpar(int lay, int entr, int lr, int order, double val)
double getT0(int wireid) const
void resetDelT0(int wireid, double val)
double getXtpar(int lay, int entr, int lr, int order)
void resetT0(int wireid, double val)
void calib(MdcCalibConst *calconst, TObjArray *newXtList, TObjArray *r2tList)
void mergeHist(TFile *fhist)
void init(TObjArray *hlist, MdcCosGeom *pGeom)