BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
calib_barrel_sigma.cxx
Go to the documentation of this file.
2#include "TF1.h"
3
4// the fit function to the single-end time resolution versus z
5/*
6static double singleEndFunc(double *x, double *par) {
7 double xx = x[0];
8 double f =
9par[0]*barrelRadius/sqrt(pow(barrelRadius,2)+pow(xx,2))+par[1]*xx+par[2]*pow(xx,2)+par[3]*pow(xx,3);
10 return f;
11}
12
13
14//the fit function to the double-end time resolution versus z
15static double doubleEndFunc(double *x, double *par)
16{
17 double xx = x[0];
18 double f = par[0]*pow(xx,2)/sqrt(pow(barrelRadius,2)+pow(xx,2))+par[1]+par[2]*pow(xx,2);
19 return f;
20}
21*/
22
23calib_barrel_sigma::calib_barrel_sigma( const unsigned int nzbin )
24 : TofCalibFit( true, nBarrelSigma ) {
25
26 nKind = 5; // 0:tleft, 1:tright, 2:t0, 3:tplus, 4:tminus
27 nBinPerCounter = nzbin;
28
31 CanvasPerCounterName.push_back( static_cast<string>( "Barrel-offset" ) );
32 CanvasPerCounterName.push_back( static_cast<string>( "Offset-TimeCorrelation" ) );
33 CanvasPerCounterName.push_back( static_cast<string>( "Barrel-sigma" ) );
34 CanvasPerCounterName.push_back( static_cast<string>( "Sigma-TimeCorrelation" ) );
35 nGraphPerCanvasPerCounter.push_back( 3 );
36 nGraphPerCanvasPerCounter.push_back( 2 );
37 nGraphPerCanvasPerCounter.push_back( 3 );
38 nGraphPerCanvasPerCounter.push_back( 3 );
39
40 nHistogram = 0;
41 nCanvas = 0;
42
43 int numGraphs = 0;
44 std::vector<unsigned int>::iterator iter = nGraphPerCanvasPerCounter.begin();
45 for ( ; iter != nGraphPerCanvasPerCounter.end(); iter++ )
46 { numGraphs = numGraphs + ( *iter ); }
47 if ( numGraphs != nGraphTotalSigma )
48 {
49 cout << "tofcalgsec::calib_barrel_sigma: the number of Graphs is NOT reasonable!!!"
50 << endl;
51 exit( 0 );
52 }
53
54 m_name = string( "calib_barrel_sigma" );
55
56 const int tbin = 150;
57 const double tbegin = -1.5;
58 const double tend = 1.5;
59
60 // histograms per counter
61 char hname[256];
62 for ( unsigned int i = 0; i < NBarrel; i++ )
63 {
64 m_result.push_back( HepVector( nBarrelSigma, 0 ) );
65 for ( unsigned int j = 0; j < nKind; j++ )
66 {
67 for ( unsigned int k = 0; k < nBinPerCounter; k++ )
68 {
69 if ( j == 0 ) { sprintf( hname, "tleft-id%i-z%i", i, k ); }
70 else if ( j == 1 ) { sprintf( hname, "tright-id%i-z%i", i, k ); }
71 else if ( j == 2 ) { sprintf( hname, "t0-id%i-z%i", i, k ); }
72 else if ( j == 3 ) { sprintf( hname, "tplus-id%i-z%i", i, k ); }
73 else if ( j == 4 ) { sprintf( hname, "tminus-id%i-z%i", i, k ); }
74 m_histograms.push_back( new TH1F( hname, hname, tbin, tbegin, tend ) );
75
76 m_fitresult.push_back( HepVector( nParSigma, 0 ) );
77 }
78 }
79 }
80
81 zpos.resize( nBinPerCounter );
82 zposerr.resize( nBinPerCounter );
83 zstep = ( zend - zbegin ) / nBinPerCounter;
84 for ( unsigned int i = 0; i < nBinPerCounter; i++ )
85 {
86 zpos[i] = zbegin + ( i + 0.5 ) * zstep;
87 zposerr[i] = 0.5 * zstep;
88 }
89}
90
92 m_fitresult.clear();
93 zpos.clear();
94 zposerr.clear();
95}
96
97void calib_barrel_sigma::calculate( RecordSet*& data, unsigned int icounter ) {
98
99 std::cout << setiosflags( ios::left ) << setw( 10 ) << icounter << setw( 8 ) << data->size()
100 << setw( 30 ) << name() << std::endl;
101
102 if ( data->size() > 0 )
103 {
104 std::vector<Record*>::iterator iter = data->begin();
105 for ( ; iter != data->end(); iter++ ) { fillRecord( ( *iter ), icounter ); }
106 }
107 fitHistogram( icounter );
108 fillGraph( icounter );
109 fitGraph( icounter );
110
111 if ( data->size() > 0 )
112 {
113 std::vector<Record*>::iterator iter = data->begin();
114 for ( ; iter != data->end(); iter++ )
115 {
116 updateData( ( *iter ), icounter );
117 fillRecordT0( ( *iter ), icounter );
118 }
119 }
120 fitHistogramT0( icounter );
121 fillGraphT0( icounter );
122 fitGraphT0( icounter );
123
124 return;
125}
126
127void calib_barrel_sigma::fillRecord( const Record* r, unsigned int icounter ) {
128
129 double zhit = r->zrhit();
130 if ( zhit < zbegin || zhit > zend ) return;
131 int zbin = static_cast<int>( ( zhit - zbegin ) / zstep );
132 if ( zbin < 0 ) { zbin = 0; }
133 else if ( zbin > static_cast<int>( nBinPerCounter - 1 ) )
134 {
135 cout << "tofcalgsec::calib_barrel_sigma:fillRecord: zhit is out of range, zhit=" << zhit
136 << " zbin=" << zbin << endl;
137 return;
138 }
139
140 std::vector<TH1F*>::iterator iter = m_histograms.begin();
141 unsigned int number = icounter * nKind * nBinPerCounter + zbin;
142 ( *( iter + number ) )->Fill( r->tleft() );
143 ( *( iter + nBinPerCounter + number ) )->Fill( r->tright() );
144 ( *( iter + 3 * nBinPerCounter + number ) )->Fill( ( r->tleft() + r->tright() ) / 2.0 );
145 ( *( iter + 4 * nBinPerCounter + number ) )->Fill( ( r->tleft() - r->tright() ) / 2.0 );
146
147 return;
148}
149
150void calib_barrel_sigma::fitHistogram( unsigned int icounter ) {
151 TF1* g = new TF1( "g", "gaus" );
152 g->SetLineColor( 2 );
153 g->SetLineWidth( 1 );
154
155 std::vector<TH1F*>::iterator iter1 =
156 m_histograms.begin() + icounter * nKind * nBinPerCounter;
157 std::vector<HepVector>::iterator iter2 =
158 m_fitresult.begin() + icounter * nKind * nBinPerCounter;
159 for ( unsigned int i = 0; i < nKind; i++ )
160 {
161 for ( unsigned int j = 0; j < nBinPerCounter; j++ )
162 {
163 if ( i != 2 )
164 {
165 ( *iter1 )->Fit( g, "Q" );
166 ( *iter2 )[0] = g->GetParameter( 1 );
167 ( *iter2 )[1] = g->GetParError( 1 );
168 ( *iter2 )[2] = g->GetParameter( 2 );
169 ( *iter2 )[3] = g->GetParError( 2 );
170 }
171 iter1++;
172 iter2++;
173 }
174 }
175
176 return;
177}
178
179void calib_barrel_sigma::fillGraph( unsigned int icounter ) {
180
181 char gname1[256], gname2[256];
182
183 // fill graphs
184 // 4 canvas per counter,
185 // 1. offset of tleft, tright and t0 vs z
186 // 2. sigma of tleft, tright and t0 vs z
187 // 3. offset of tplus and tminus vs z
188 // 4. sigma of tplus, tminus and T_Correlation vs z
189 std::vector<double> toffset, toffseterr;
190 std::vector<double> tsigma, tsigmaerr;
191 toffset.resize( nBinPerCounter );
192 toffseterr.resize( nBinPerCounter );
193 tsigma.resize( nBinPerCounter );
194 tsigmaerr.resize( nBinPerCounter );
195
196 unsigned int number = 0;
197 std::vector<HepVector>::iterator iter =
198 m_fitresult.begin() + icounter * nKind * nBinPerCounter;
199 for ( unsigned int j = 0; j < nKind; j++ )
200 {
201 if ( j == 0 ) { sprintf( gname1, "tleft-offset-tofid-%i", icounter ); }
202 else if ( j == 1 ) { sprintf( gname1, "tright-offset-tofid-%i", icounter ); }
203 else if ( j == 2 ) { sprintf( gname1, "t0-offset-tofid-%i", icounter ); }
204 else if ( j == 3 ) { sprintf( gname1, "tplus-offset-tofid-%i", icounter ); }
205 else if ( j == 4 ) { sprintf( gname1, "tminus-offset-tofid-%i", icounter ); }
206
207 m_graphs.push_back( new TH1F( gname1, gname1, nBinPerCounter, zbegin, zend ) );
208 std::vector<TH1F*>::iterator itgraph = m_graphs.end() - 1;
209
210 for ( unsigned int k = 0; k < nBinPerCounter; k++ )
211 {
212 number = j * nBinPerCounter + k;
213 toffset[k] = ( *( iter + number ) )[0];
214 toffseterr[k] = ( *( iter + number ) )[1];
215 ( *itgraph )->SetBinContent( k + 1, toffset[k] );
216 ( *itgraph )->SetBinError( k + 1, toffseterr[k] );
217 }
218 ( *itgraph )->SetMarkerSize( 1.5 );
219 if ( j == 0 || j == 3 )
220 {
221 ( *itgraph )->SetMarkerStyle( 20 );
222 ( *itgraph )->SetMarkerColor( 2 );
223 ( *itgraph )->SetMaximum( 0.15 );
224 ( *itgraph )->SetMinimum( -0.15 );
225 }
226 else if ( j == 1 || j == 4 )
227 {
228 ( *itgraph )->SetMarkerStyle( 21 );
229 ( *itgraph )->SetMarkerColor( 4 );
230 }
231 else if ( j == 2 )
232 {
233 ( *itgraph )->SetMarkerStyle( 4 );
234 ( *itgraph )->SetMarkerColor( 2 );
235 }
236 }
237
238 for ( unsigned int j = 0; j < nKind; j++ )
239 {
240 if ( j == 0 ) { sprintf( gname2, "tleft-sigma-tofid-%i", icounter ); }
241 else if ( j == 1 ) { sprintf( gname2, "tright-sigma-tofid-%i", icounter ); }
242 else if ( j == 2 ) { sprintf( gname2, "t0-sigma-tofid-%i", icounter ); }
243 else if ( j == 3 ) { sprintf( gname2, "tplus-sigma-tofid-%i", icounter ); }
244 else if ( j == 4 ) { sprintf( gname2, "tminus-sigma-tofid-%i", icounter ); }
245 m_graphs.push_back( new TH1F( gname2, gname2, nBinPerCounter, zbegin, zend ) );
246 std::vector<TH1F*>::iterator itgraph = m_graphs.end() - 1;
247
248 for ( unsigned int k = 0; k < nBinPerCounter; k++ )
249 {
250 number = j * nBinPerCounter + k;
251 tsigma[k] = ( *( iter + number ) )[2];
252 tsigmaerr[k] = ( *( iter + number ) )[3];
253 ( *itgraph )->SetBinContent( k + 1, tsigma[k] );
254 ( *itgraph )->SetBinError( k + 1, tsigmaerr[k] );
255 }
256 ( *itgraph )->SetMarkerSize( 1.5 );
257 if ( j == 0 || j == 3 )
258 {
259 ( *itgraph )->SetMarkerStyle( 20 );
260 ( *itgraph )->SetMarkerColor( 2 );
261 ( *itgraph )->SetMaximum( 0.3 );
262 ( *itgraph )->SetMinimum( 0.0 );
263 }
264 else if ( j == 1 || j == 4 )
265 {
266 ( *itgraph )->SetMarkerStyle( 21 );
267 ( *itgraph )->SetMarkerColor( 4 );
268 }
269 else if ( j == 2 )
270 {
271 ( *itgraph )->SetMarkerStyle( 4 );
272 ( *itgraph )->SetMarkerColor( 2 );
273 }
274 }
275
276 sprintf( gname2, "sigma-tofid-%i", icounter );
277 m_graphs.push_back( new TH1F( gname2, gname2, nBinPerCounter, zbegin, zend ) );
278 std::vector<TH1F*>::iterator itgraph = m_graphs.end() - 1;
279 for ( unsigned int k = 0; k < nBinPerCounter; k++ )
280 {
281 number = ( nKind - 1 ) * nBinPerCounter + k;
282 double sigPlus = ( *( iter + number - nBinPerCounter ) )[2];
283 double sigMinus = ( *( iter + number ) )[2];
284 double sigErrPlus = ( *( iter + number - nBinPerCounter ) )[3];
285 double sigErrMinus = ( *( iter + number ) )[3];
286 tsigma[k] = sqrt( sigPlus * sigPlus - sigMinus * sigMinus );
287 tsigmaerr[k] = sqrt( sigErrPlus * sigErrPlus + sigErrMinus * sigErrMinus );
288 ( *itgraph )->SetBinContent( k + 1, tsigma[k] );
289 ( *itgraph )->SetBinError( k + 1, tsigmaerr[k] );
290 }
291 ( *itgraph )->SetMarkerSize( 1.5 );
292 ( *itgraph )->SetMarkerStyle( 4 );
293 ( *itgraph )->SetMarkerColor( 2 );
294
295 return;
296}
297
298void calib_barrel_sigma::fitGraph( unsigned int icounter ) {
299
300 TF1* fsingle = new TF1( "fsingle", "pol4" );
301 fsingle->SetLineColor( 1 );
302 fsingle->SetLineWidth( 1 );
303
304 std::vector<unsigned int>::iterator itnumber = nGraphPerCanvasPerCounter.begin();
305 std::vector<TH1F*>::iterator itgraph =
306 m_graphs.begin() + icounter * nGraphTotalSigma + ( *itnumber ) + ( *( itnumber + 1 ) );
307
308 fsingle->SetParameter( 0, 0.14 );
309 fsingle->SetParameter( 1, -4.0e-4 );
310 ( *itgraph )->Fit( "fsingle", "QR", "", zbegin, zend );
311 X = HepVector( m_npar, 0 );
312 for ( unsigned int i = 0; i < 5; i++ ) { X[i] = fsingle->GetParameter( i ); }
313
314 fsingle->SetParameter( 0, 0.14 );
315 fsingle->SetParameter( 1, 4.0e-4 );
316 ( *( itgraph + 1 ) )->Fit( "fsingle", "QR", "", zbegin, zend );
317 for ( unsigned int i = 0; i < 5; i++ ) { X[i + 5] = fsingle->GetParameter( i ); }
318
319 std::vector<HepVector>::iterator iter = m_result.begin() + icounter;
320 ( *iter ) = X;
321
322 return;
323}
324
325void calib_barrel_sigma::updateData( Record* r, unsigned int icounter ) {
326 double zhit = r->zrhit();
327 double t1 = r->tleft();
328 double t2 = r->tright();
329
330 double par1[5], par2[5];
331 std::vector<HepVector>::iterator iter = m_result.begin() + icounter;
332 for ( unsigned int i = 0; i < 5; i++ )
333 {
334 par1[i] = ( *iter )[i];
335 par2[i] = ( *iter )[i + 5];
336 }
337
338 double tsigma1 = par1[0] + par1[1] * zhit + par1[2] * pow( zhit, 2 ) +
339 par1[3] * pow( zhit, 3 ) + par1[4] * pow( zhit, 4 );
340 double tsigma2 = par2[0] + par2[1] * zhit + par2[2] * pow( zhit, 2 ) +
341 par2[3] * pow( zhit, 3 ) + par2[4] * pow( zhit, 4 );
342 double tc = m_tcorrelation[0];
343
344 double weight1 = ( tsigma2 * tsigma2 - tc * tc ) /
345 ( tsigma1 * tsigma1 + tsigma2 * tsigma2 - 2.0 * tc * tc );
346 double weight2 = ( tsigma1 * tsigma1 - tc * tc ) /
347 ( tsigma1 * tsigma1 + tsigma2 * tsigma2 - 2.0 * tc * tc );
348 double t0 = weight1 * t1 + weight2 * t2;
349
350 r->setT0( t0 );
351
352 return;
353}
354
355void calib_barrel_sigma::fillRecordT0( const Record* r, unsigned int icounter ) {
356 double zhit = r->zrhit();
357 if ( zhit < zbegin || zhit > zend ) return;
358 int zbin = static_cast<int>( ( zhit - zbegin ) / zstep );
359 if ( zbin < 0 ) { zbin = 0; }
360 else if ( zbin > static_cast<int>( nBinPerCounter - 1 ) )
361 {
362 cout << "tofcalgsec::calib_barrel_sigma:fillRecordT0: zhit is out of range, zhit=" << zhit
363 << " zbin=" << zbin << endl;
364 return;
365 }
366
367 std::vector<TH1F*>::iterator iter = m_histograms.begin();
368 unsigned int number = icounter * nKind * nBinPerCounter + 2 * nBinPerCounter + zbin;
369 ( *( iter + number ) )->Fill( r->t0() );
370
371 return;
372}
373
374void calib_barrel_sigma::fitHistogramT0( unsigned int icounter ) {
375 TF1* g = new TF1( "g", "gaus" );
376 g->SetLineColor( 2 );
377 g->SetLineWidth( 1 );
378
379 std::vector<TH1F*>::iterator iter1 =
380 m_histograms.begin() + icounter * nKind * nBinPerCounter + 2 * nBinPerCounter;
381 std::vector<HepVector>::iterator iter2 =
382 m_fitresult.begin() + icounter * nKind * nBinPerCounter + 2 * nBinPerCounter;
383 for ( unsigned int j = 0; j < nBinPerCounter; j++, iter1++, iter2++ )
384 {
385 ( *iter1 )->Fit( g, "Q" );
386 ( *iter2 )[0] = g->GetParameter( 1 );
387 ( *iter2 )[1] = g->GetParError( 1 );
388 ( *iter2 )[2] = g->GetParameter( 2 );
389 ( *iter2 )[3] = g->GetParError( 2 );
390 }
391
392 return;
393}
394
395void calib_barrel_sigma::fillGraphT0( unsigned int icounter ) {
396 char gname1[256], gname2[256];
397
398 // fill graphs
399 // 4 canvas per counter,
400 // 1. offset of tleft, tright and t0 vs z
401 // 2. sigma of tleft, tright and t0 vs z
402 // 3. offset of tplus and tminus vs z
403 // 4. sigma of tplus, tminus and T_Correlation vs z
404 std::vector<double> toffset, toffseterr;
405 std::vector<double> tsigma, tsigmaerr;
406 toffset.resize( nBinPerCounter );
407 toffseterr.resize( nBinPerCounter );
408 tsigma.resize( nBinPerCounter );
409 tsigmaerr.resize( nBinPerCounter );
410
411 std::vector<HepVector>::iterator iter =
412 m_fitresult.begin() + icounter * nKind * nBinPerCounter + 2 * nBinPerCounter;
413 for ( unsigned int k = 0; k < nBinPerCounter; k++ )
414 {
415 toffset[k] = ( *( iter + k ) )[0];
416 toffseterr[k] = ( *( iter + k ) )[1];
417 tsigma[k] = ( *( iter + k ) )[2];
418 tsigmaerr[k] = ( *( iter + k ) )[3];
419 }
420
421 sprintf( gname1, "offset-tofid-%i", icounter );
422 std::vector<TH1F*>::iterator itgraph = m_graphs.begin() + icounter * nGraphTotalSigma + 2;
423 for ( unsigned int i = 0; i < nBinPerCounter; i++ )
424 {
425 // (*itgraph)->SetPoint( i, zpos[i], toffset[i] );
426 // (*itgraph)->SetPointError( i, zposerr[i], toffseterr[i] );
427 ( *itgraph )->SetBinContent( i + 1, toffset[i] );
428 ( *itgraph )->SetBinError( i + 1, toffseterr[i] );
429 }
430
431 sprintf( gname2, "sigma-tofid-%i", icounter );
432 itgraph = m_graphs.begin() + icounter * nGraphTotalSigma + 7;
433 for ( unsigned int i = 0; i < nBinPerCounter; i++ )
434 {
435 // (*itgraph)->SetPoint( i, zpos[i], tsigma[i] );
436 // (*itgraph)->SetPointError( i, zposerr[i], tsigmaerr[i] );
437 ( *itgraph )->SetBinContent( i + 1, tsigma[i] );
438 ( *itgraph )->SetBinError( i + 1, tsigmaerr[i] );
439 }
440
441 return;
442}
443
444void calib_barrel_sigma::fitGraphT0( unsigned int icounter ) {
445
446 // TF1 *fdouble = new TF1( "fdouble", doubleEndFunc, zbegin, zend, 3 );
447 TF1* fdouble = new TF1( "fdouble", "pol4", zbegin, zend );
448 fdouble->SetLineColor( 1 );
449 fdouble->SetLineWidth( 1 );
450
451 std::vector<unsigned int>::iterator itnumber = nGraphPerCanvasPerCounter.begin();
452 std::vector<TH1F*>::iterator itgraph = m_graphs.begin() + icounter * nGraphTotalSigma +
453 ( *itnumber ) + ( *( itnumber + 1 ) ) + 2;
454 ( *itgraph )->Fit( "fdouble", "Q", "", zbegin, zend );
455
456 std::vector<HepVector>::iterator iter = m_result.begin() + icounter;
457 ( *iter )[10] = fdouble->GetParameter( 0 );
458 ( *iter )[11] = fdouble->GetParameter( 1 );
459 ( *iter )[12] = fdouble->GetParameter( 2 );
460 ( *iter )[13] = fdouble->GetParameter( 3 );
461 ( *iter )[14] = fdouble->GetParameter( 4 );
462
463 return;
464}
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)
TTree * data
gr Fit("g1", "R")
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
const double zend
Definition TofCalibFit.h:13
const double zbegin
Definition TofCalibFit.h:12
std::vector< Record * > RecordSet
Definition TofDataSet.h:97
const unsigned int NBarrel
Definition TofDataSet.h:12
const int nParSigma
const int nBarrelSigma
const int nGraphTotalSigma
double tleft() const
Definition TofDataSet.h:59
double tright() const
Definition TofDataSet.h:60
void setT0(double t0)
Definition TofDataSet.h:74
double t0() const
Definition TofDataSet.h:68
double zrhit() const
Definition TofDataSet.h:61
string m_name
Definition TofCalibFit.h:50
std::vector< HepVector > m_result
Definition TofCalibFit.h:55
unsigned int nCanvas
Definition TofCalibFit.h:47
const std::string & name() const
Definition TofCalibFit.h:27
std::vector< TH1F * > m_histograms
Definition TofCalibFit.h:53
unsigned int nBinPerCounter
Definition TofCalibFit.h:41
HepVector m_tcorrelation
Definition TofCalibFit.h:60
unsigned int nKind
Definition TofCalibFit.h:40
std::vector< unsigned int > nGraphPerCanvasPerCounter
Definition TofCalibFit.h:45
unsigned int nCanvasPerCounter
Definition TofCalibFit.h:44
unsigned int nHistPerCounter
Definition TofCalibFit.h:43
HepVector X
Definition TofCalibFit.h:51
unsigned int nHistogram
Definition TofCalibFit.h:46
std::vector< TH1F * > m_graphs
Definition TofCalibFit.h:54
TofCalibFit(bool isbarrel, const int npar)
std::vector< string > CanvasPerCounterName
Definition TofCalibFit.h:57
calib_barrel_sigma(const unsigned int nzbin)
void calculate(RecordSet *&data, unsigned int icounter)