CGEM BOSS 6.6.5.h
BESIII Offline Software System
Loading...
Searching...
No Matches
TofCorrPID.cxx
Go to the documentation of this file.
1#include <cmath>
2
4
5#ifndef BEAN
12#else
13#include "TofHitStatus.h"
14#endif
15#include <fstream>
16
17
18TofCorrPID * TofCorrPID::m_pointer = 0;
20 if(!m_pointer) m_pointer = new TofCorrPID();
21 return m_pointer;
22}
23
24TofCorrPID::TofCorrPID():ParticleIDBase() {
25 m_runBegin = 0;
26 m_runEnd = 0;
27}
28
30
31 for(int i = 0; i < 5; i++) {
32 m_chi[i] = -100.0;
33 m_prob[i] = -1.0;
34 m_sigma[i] = 10.0;
35 m_offset[i] = -1000.0;
36 }
37 m_chimin = 99.;
38 m_pdfmin = 99.;
39 m_ndof = 0;
40
41 for( unsigned int i=0; i<5; i++ ) {
42 for( unsigned int j=0; j<7; j++ ) {
43 m_deltaT[j][i] = -1000.0;
44 }
45 }
46
47 int run = getRunNo();
48 if( !( abs(run)>=m_runBegin && abs(run)<=m_runEnd ) ) {
50 }
51
52 return;
53}
54
55
57 if(particleIDCalculation() == 0) m_ndof=1;
58}
59
60
62 int irc=-1;
63
64 EvtRecTrack* recTrk = PidTrk();
65 if(!(recTrk->isMdcTrackValid())) return irc;
66 if(!(recTrk->isMdcKalTrackValid())) return irc;
67 if(!(recTrk->isExtTrackValid())) return irc;
68 if(!(recTrk->isTofTrackValid())) return irc;
69
70#ifndef BEAN
71 SmartRefVector<RecTofTrack> tofTrk = recTrk->tofTrack();
72 SmartRefVector<RecTofTrack>::iterator it;
73#else
74 const std::vector<TTofTrack* >& tofTrk = recTrk->tofTrack();
75 std::vector<TTofTrack* >::const_iterator it;
76#endif
77
78 RecMdcTrack* mdcTrk = recTrk->mdcTrack();
79 int charge = mdcTrk->charge();
80
81 double p[5], betaGamma[5];
82 RecMdcKalTrack* kalTrk = recTrk->mdcKalTrack();
83 for( int i=0; i<5; i++ ) {
84 if( i==0 ) {
86 }
87 else if( i==1 ) {
89 }
90 else if( i==2 ) {
92 }
93 else if( i==3 ) {
95 }
96 else if( i==4 ) {
98 }
99#ifndef BEAN
100 HepLorentzVector ptrk = kalTrk->p4();
101#else
102 HepLorentzVector ptrk = kalTrk->p4( xmass(i) );
103#endif
104 p[i] = ptrk.rho();
105 betaGamma[i] = p[i]/xmass(i);
106 }
107
108 double zrhit[2];
109 RecExtTrack* extTrk = recTrk->extTrack();
110 zrhit[0] = extTrk->tof1Position().z();
111 zrhit[1] = extTrk->tof2Position().z();
112
113 int tofid[2] = { -9, -9 };
114
115 bool readFile = false;
116 bool signal[2] = { false, false };
117 TofHitStatus *hitst = new TofHitStatus;
118 for( it = tofTrk.begin(); it!=tofTrk.end(); it++ ) {
119 unsigned int st = (*it)->status();
120 hitst->setStatus(st);
121 if( hitst->is_raw() ) return irc; // TOF no hit
122 bool barrel = hitst->is_barrel();
123 if( !barrel ) { zrhit[0] = extTrk->tof1Position().rho(); }
124 bool readout = hitst->is_readout();
125 bool counter = hitst->is_counter();
126 bool cluster = hitst->is_cluster();
127 int layer = hitst->layer();
128 tofid[layer-1] = (*it)->tofID();
129 bool east = hitst->is_east();
130 double tof = (*it)->tof();
131 if( readout ) {
132 // default 0: end cap
133 unsigned int ipmt = 0;
134 // barrel: 0: inner east, 1:inner west, 2:outer east, 3: outer west
135 // endcap: 0
136 if( barrel ) { ipmt = ( ( st & 0xC0 ) >> 5 ) + ( ( ( st ^ 0x20 ) & 0x20 ) >> 5 ) - 2; }
137 for( unsigned int i=0; i<5; i++ ) {
138 double offset = (*it)->toffset(i);
139 double texp = (*it)->texp(i);
140 if( texp<0.0 ) continue;
141 double dt = tof - offset - texp;
142 m_deltaT[ipmt][i] = offsetTof( i, barrel, ipmt, betaGamma[i], charge, zrhit[layer-1], dt );
143 }
144 if( counter && cluster ) {
145 for( unsigned int i=0; i<5; i++ ) {
146 if( ((*it)->texp(i))>0.0 ) {
147 m_offset[i] = m_deltaT[ipmt][i];
148 m_sigma[i] = sigmaTof( i, charge, barrel, ipmt, &tofid[0], &zrhit[0], betaGamma[i] );
149 }
150 }
151 }
152 }
153 else {
154 if( counter ) {
155 for( unsigned int i=0; i<5; i++ ) {
156 double offset = (*it)->toffset(i);
157 double texp = (*it)->texp(i);
158 if( texp<0.0 ) continue;
159 double dt = tof - offset - texp;
160 m_deltaT[layer+3][i] = offsetTof( i, tofid[layer-1], zrhit[layer-1], dt );
161 m_offset[i] = m_deltaT[layer+3][i];
162 m_sigma[i] = sigmaTof( i, charge, barrel, layer+3, &tofid[0], &zrhit[0], betaGamma[i] );
163 }
164 signal[layer-1] = correlationCheck();
165 }
166 else {
167 if( cluster ) {
168 if( signal[0] && signal[1] ) {
169 for( unsigned int i=0; i<5; i++ ) {
170 double offset = (*it)->toffset(i);
171 double texp = (*it)->texp(i);
172 if( texp<0.0 ) continue;
173 double dt = tof - offset - texp;
174 m_deltaT[6][i] = offsetTof( i, tofid[0], tofid[1], zrhit[0], zrhit[1], dt );
175 m_offset[i] = m_deltaT[6][i];
176 m_sigma[i] = sigmaTof( i, charge, barrel, 6, &tofid[0], &zrhit[0], betaGamma[i] );
177 }
178 }
179 else if( signal[0] && !signal[1] ) {
180 for( unsigned int i=0; i<5; i++ ) {
181 m_offset[i] = m_deltaT[4][i];
182 m_sigma[i] = sigmaTof( i, charge, barrel, 4, &tofid[0], &zrhit[0], betaGamma[i] );
183 }
184 }
185 else if( !signal[0] && signal[1] ) {
186 for( unsigned int i=0; i<5; i++ ) {
187 m_offset[i] = m_deltaT[5][i];
188 m_sigma[i] = sigmaTof( i, charge, barrel, 5, &tofid[1], &zrhit[1], betaGamma[i] );
189 }
190 }
191 else return irc;
192 }
193 }
194 }
195 }
196
197 bool good = false;
198 double pdftemp = 0;
199 for( unsigned int i=0; i<5; i++ ) {
200 m_chi[i] = m_offset[i]/m_sigma[i];
201 if( ( m_chi[i]>-4.0 && m_chi[i]<6.0 ) && !good ) { good = true; }
202 double ppp = pdfCalculate(m_chi[i],1);
203 if( fabs(ppp) > pdftemp) { pdftemp = fabs(ppp); }
204 }
205 m_pdfmin = pdftemp;
206 if( pdftemp < pdfCalculate(pdfMinSigmaCut(),1) ) return irc;
207 if( !good ) return irc;
208 for(int i = 0; i < 5; i++) {
209 m_prob[i] = probCalculate(m_chi[i]*m_chi[i], 1);
210 }
211 irc = 0;
212 return irc;
213}
214
215
217
218 std::string filePath = path + "/share/TofCorrPID/";
219
220 if( abs(run)>=8093 && abs(run)<=9025 ) {
221 filePath = filePath + "psip2009";
222 m_runBegin = 8093;
223 m_runEnd = 9025;
224 }
225 else if( abs(run)>=9947 && abs(run)<=10878 ) {
226 filePath = filePath + "jpsi2009";
227 m_runBegin = 9947;
228 m_runEnd = 10878;
229 }
230
231 if( run>0 ) {
232 filePath = filePath + "/data/";
233 }
234 else {
235 filePath = filePath + "/mc/";
236 }
237
238
239 // weight from tof calibration
240 std::string fileWeight = filePath + "calib_barrel_sigma.txt";
241 ifstream inputWeight( fileWeight.c_str(), std::ios_base::in );
242 if( !inputWeight ) {
243 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileWeight << endl;
244 exit(1);
245 }
246
247 for( unsigned int tofid=0; tofid<176; tofid++ ) {
248 for( unsigned int readout=0; readout<3; readout++ ) {
249 for( unsigned int p_i=0; p_i<5; p_i++ ) {
250 inputWeight >> m_p_weight[tofid][readout][p_i];
251 }
252 }
253 }
254 // cout << "finish read " << fileWeight << endl;
255
256 // common item, from bunch size and bunch time
257 std::string fileCommon = filePath + "calib_barrel_common.txt";
258 ifstream inputCommon( fileCommon.c_str(), std::ios_base::in );
259 if( !inputCommon ) {
260 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileCommon << endl;
261 exit(1);
262 }
263 inputCommon >> m_p_common;
264 // cout << "finish read " << fileCommon << endl;
265
266 // endcap sigma
267 std::string fileEcSigma = filePath + "calib_endcap_sigma.txt";
268 ifstream inputEcSigma( fileEcSigma.c_str(), std::ios_base::in );
269 if( !inputEcSigma ) {
270 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileEcSigma << endl;
271 exit(1);
272 }
273
274 for( unsigned int tofid=0; tofid<96; tofid++ ) {
275 for( unsigned int p_i=0; p_i<3; p_i++ ) {
276 inputEcSigma >> m_ec_sigma[tofid][p_i];
277 }
278 }
279 // cout << "finish read " << fileEcSigma << endl;
280
281 // curve of betaGamma versus Q0
282 std::string fileQ0BetaGamma = filePath + "curve_Q0_BetaGamma.txt";
283 ifstream inputQ0BetaGamma( fileQ0BetaGamma.c_str(), std::ios_base::in );
284 if( !inputQ0BetaGamma ) {
285 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileQ0BetaGamma << endl;
286 exit(1);
287 }
288 // barrel layer1 layer2 and endcap
289 for( unsigned int layer=0; layer<3; layer++ ) {
290 for( unsigned int ipar=0; ipar<5; ipar++ ) {
291 inputQ0BetaGamma >> m_q0_bg[layer][ipar];
292 }
293 }
294 // cout << "finish read " << fileQ0BetaGamma << endl;
295
296 // paramter of A and B
297 std::string fileParAB = filePath + "parameter_A_B.txt";
298 ifstream inputParAB( fileParAB.c_str(), std::ios_base::in );
299 if( !inputParAB ) {
300 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileParAB << endl;
301 exit(1);
302 }
303 // 0: inner east, 1: inner west, 2: outer east, 3: outer west, 4: west endcap
304 // 0: parameter A, 1: parameter B
305 for( unsigned int ipmt=0; ipmt<5; ipmt++ ) {
306 for( unsigned int iab=0; iab<2; iab++ ) {
307 for( unsigned int ipar=0; ipar<5; ipar++ ) {
308 inputParAB >> m_par_ab[ipmt][iab][ipar];
309 }
310 }
311 }
312 for( unsigned int ipmt=0; ipmt<5; ipmt++ ) {
313 for( unsigned int iab=0; iab<2; iab++ ) {
314 for( unsigned int ipar=0; ipar<5; ipar++ ) {
315 inputParAB >> m_par_pbar_ab[ipmt][iab][ipar];
316 }
317 }
318 }
319 // cout << "finish read " << fileParAB << endl;
320
321 // sigma for pion, kaon and proton
322 std::string fileSigma = filePath + "parameter_sigma.txt";
323 ifstream inputSigma( fileSigma.c_str(), std::ios_base::in );
324 if( !inputSigma ) {
325 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileSigma << endl;
326 exit(1);
327 }
328 // 0: pion, 1: kaon, 2: proton, 3: anti-proton
329 // 0: inner east, 1: inner west, 2: outer east, 3: outer west
330 // 4: inner layer, 5: outer layer, 6: double layer
331 // 7: west endcap
332 for( unsigned int ispecies=0; ispecies<4; ispecies++ ) {
333 for( unsigned int ipmt=0; ipmt<8; ipmt++ ) {
334 for( unsigned int ipar=0; ipar<9; ipar++ ) {
335 inputSigma >> m_par_sigma[ispecies][ipmt][ipar];
336 }
337 }
338 }
339 // cout << "finish read " << fileSigma << endl;
340
341 // chi for pion, kaon and proton
342 /*
343 std::string fileChi = filePath + "parameter_sigma_momentum.txt";
344 ifstream inputChi( fileChi.c_str(), std::ios_base::in );
345 if( !inputChi ) {
346 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileChi << endl;
347 exit(1);
348 }
349 // 0: inner east, 1: inner west, 2: outer east, 3: outer west
350 // 4: inner layer, 5: outer layer, 6: double layer
351 for( unsigned int ispecies=0; ispecies<3; ispecies++ ) {
352 for( unsigned int ipmt=0; ipmt<7; ipmt++ ) {
353 for( unsigned int ipar=0; ipar<3; ipar++ ) {
354 inputChi >> m_par_sig_mom[ispecies][ipmt][ipar];
355 }
356 }
357 }
358 */
359 // cout << "finish read " << fileChi << endl;
360
361
362 // offset for low momentum proton and anti-proton
363 std::string fileProtonOffset = filePath + "parameter_offset_proton.txt";
364 ifstream inputProtonOffset( fileProtonOffset.c_str(), std::ios_base::in );
365 if( !inputProtonOffset ) {
366 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileProtonOffset << endl;
367 exit(1);
368 }
369 // 0: proton, 1: anti-proton
370 // 0: inner east, 1: inner west, 2: outer east, 3: outer west
371 for( unsigned int ispecies=0; ispecies<2; ispecies++ ) {
372 for( unsigned int ipmt=0; ipmt<4; ipmt++ ) {
373 for( unsigned int ipar=0; ipar<10; ipar++ ) {
374 for( unsigned int jpar=0; jpar<20; jpar++ ) {
375 inputProtonOffset >> m_p_offset[ispecies][ipmt][ipar][jpar];
376 }
377 }
378 }
379 }
380 // cout << "finish read " << fileProtonOffset << endl;
381
382 // sigma for low momentum proton and anti-proton
383 std::string fileProtonSigma = filePath + "parameter_sigma_proton.txt";
384 ifstream inputProtonSigma( fileProtonSigma.c_str(), std::ios_base::in );
385 if( !inputProtonSigma ) {
386 cout << "ParticleID::TofCorrPID: Can NOT open file: " << fileProtonSigma << endl;
387 exit(1);
388 }
389 // 0: proton, 1: anti-proton
390 // 0: inner east, 1: inner west, 2: outer east, 3: outer west
391 // 4: inner layer, 5: outer layer, 6: double layer
392 // 7: west endcap
393 for( unsigned int ispecies=0; ispecies<2; ispecies++ ) {
394 for( unsigned int ipmt=0; ipmt<7; ipmt++ ) {
395 for( unsigned int ipar=0; ipar<10; ipar++ ) {
396 for( unsigned int jpar=0; jpar<20; jpar++ ) {
397 inputProtonSigma >> m_p_sigma[ispecies][ipmt][ipar][jpar];
398 }
399 }
400 }
401 }
402 // cout << "finish read " << fileProtonSigma << endl;
403
404
405 return;
406}
407
408
409double TofCorrPID::offsetTof( unsigned int ispecies, bool barrel, unsigned int ipmt, double betaGamma, int charge, double zrhit, double dt ) {
410 if( ispecies==0 || ispecies==1 ) { return dt; }
411
412 double deltaT = -1000.0;
413 if( ( ipmt>= 4 && barrel ) || ( ipmt!=0 && !barrel ) || betaGamma<0.0 || abs(charge)!=1 || fabs(zrhit)>120.0 ) {
414 cout << "Particle::TofCorrPID: offsetTof for single end: the input parameter are NOT correct! Please check them!" << endl;
415 return deltaT;
416 }
417 unsigned int layer=0;
418 if( barrel ) {
419 if( ipmt==0 || ipmt==1 ) { layer=0; }
420 else if( ipmt==2 || ipmt==3 ) { layer=1; }
421 }
422 else { layer=2; }
423 double q0 = qCurveFunc( layer, betaGamma );
424
425 unsigned int inumber=ipmt;
426 if( !barrel ) { inumber=4; }
427
428 double func[5];
429 func[0] = 1.0;
430 func[1] = zrhit;
431 func[2] = zrhit*zrhit;
432 func[3] = zrhit*zrhit*zrhit;
433 func[4] = zrhit*zrhit*zrhit*zrhit;
434
435 double parA = 0.0;
436 double parB = 0.0;
437 // anti-proton
438 if( ispecies==4 && charge==-1 ) {
439 for( unsigned int i=0; i<5; i++ ) {
440 parA += m_par_pbar_ab[inumber][0][i]*func[i];
441 parB += m_par_pbar_ab[inumber][1][i]*func[i];
442 }
443 }
444 // proton
445 else {
446 for( unsigned int i=0; i<5; i++ ) {
447 parA += m_par_ab[inumber][0][i]*func[i];
448 parB += m_par_ab[inumber][1][i]*func[i];
449 }
450 }
451
452 double tcorr = parA + parB/sqrt(q0);
453
454 // barrel TOF low momentum proton and anti-proton
455 if( barrel && ispecies==4 && betaGamma<0.8 ) {
456 int nzbin = 10;
457 double zbegin = -115.0;
458 double zend = 115.0;
459 double zstep = (zend-zbegin)/nzbin;
460
461 double nbgbin = 20.0;
462 double bgbegin[2] = { 0.4, 0.55 };
463 double bgend[2] = { 0.8, 0.8 };
464 double bgstep[2];
465 bgstep[0] = (bgend[0]-bgbegin[0])/nbgbin;
466 bgstep[1] = (bgend[1]-bgbegin[1])/nbgbin;
467
468 int izbin = static_cast<int>((zrhit-zbegin)/zstep);
469 if( izbin<0 ) { izbin=0; }
470 else if( izbin>=nzbin ) { izbin=nzbin-1; }
471 unsigned int layer=0;
472 if( ipmt==2 || ipmt==3 ) { layer=1; }
473 int ibgbin = static_cast<int>((betaGamma-bgbegin[layer])/bgstep[layer]);
474 if( ibgbin<0 ) { ibgbin=0; }
475 else if( ibgbin>=nbgbin ) { ibgbin=nbgbin-1; }
476
477 if( charge==1 ) {
478 tcorr += m_p_offset[0][ipmt][izbin][ibgbin];
479 }
480 else {
481 tcorr += m_p_offset[1][ipmt][izbin][ibgbin];
482 }
483 }
484
485 deltaT = dt - tcorr;
486
487 return deltaT;
488}
489
490
491double TofCorrPID::offsetTof( unsigned int ispecies, int tofid, double zrhit, double dt ) {
492 if( ispecies==0 || ispecies==1 ) { return dt; }
493
494 double deltaT = -1000.0;
495 if( tofid<0 || tofid>=176 ) {
496 cout << "Particle::TofCorrPID: offsetTof for single layer: the input parameter are NOT correct! Please check them!" << endl;
497 exit(1);
498 }
499 int pmt[3] = { -9, -9, -9 };
500 if( tofid>=0 && tofid<=87 ) {
501 pmt[0] = 0;
502 pmt[1] = 1;
503 pmt[2] = 4;
504 }
505 else {
506 pmt[0] = 2;
507 pmt[1] = 3;
508 pmt[2] = 5;
509 }
510
511 double sigmaCorr2 = m_p_common*m_p_common;
512 double sigmaLeft = bSigma( 0, tofid, zrhit );
513 double sigmaLeft2 = sigmaLeft*sigmaLeft;
514 double sigmaRight = bSigma( 1, tofid, zrhit );
515 double sigmaRight2 = sigmaRight*sigmaRight;
516
517 double fraction = ( sigmaRight2 - sigmaCorr2 )/( sigmaLeft2 + sigmaRight2 - 2.0*sigmaCorr2);
518 deltaT = fraction*m_deltaT[pmt[0]][ispecies] + (1.0-fraction)*m_deltaT[pmt[1]][ispecies];
519
520 return deltaT;
521}
522
523
524double TofCorrPID::offsetTof( unsigned int ispecies, int tofid1, int tofid2, double zrhit1, double zrhit2, double dt ) {
525 if( ispecies==0 || ispecies==1 ) { return dt; }
526
527 double deltaT = -1000.0;
528 if( tofid1<0 || tofid1>=88 || tofid2<88 || tofid2>=176 ) {
529 cout << "Particle::TofCorrPID: offsetTof for double layer: the input parameter are NOT correct! Please check them!" << endl;
530 exit(1);
531 }
532
533 double sigmaCorr2 = m_p_common*m_p_common;
534 double sigmaInner = bSigma( 2, tofid1, zrhit1 );
535 double sigmaInner2 = sigmaInner*sigmaInner;
536 double sigmaOuter = bSigma( 2, tofid2, zrhit2 );
537 double sigmaOuter2 = sigmaOuter*sigmaOuter;
538 double sigma = sqrt( (sigmaInner2*sigmaOuter2-sigmaCorr2*sigmaCorr2)/(sigmaInner2+sigmaOuter2-2.0*sigmaCorr2) );
539
540 m_sigma[0] = sigma;
541 m_sigma[1] = sigma;
542
543 double fraction = ( sigmaOuter2 - sigmaCorr2 )/( sigmaInner2 + sigmaOuter2 - 2.0*sigmaCorr2);
544 deltaT = fraction*m_deltaT[4][ispecies] + (1.0-fraction)*m_deltaT[5][ispecies];
545
546 return deltaT;
547}
548
549
550double TofCorrPID::sigmaTof( unsigned int ispecies, int charge, bool barrel, unsigned int ipmt, int tofid[2], double zrhit[2], double betaGamma ) {
551
552 double sigma = 1.0e-6;
553
554 if( ispecies==0 || ispecies==1 ) {
555 if( barrel ) {
556 if( ipmt==0 ) {
557 sigma = bSigma( 0, tofid[0], zrhit[0] );
558 }
559 else if( ipmt==1 ) {
560 sigma = bSigma( 1, tofid[0], zrhit[0] );
561 }
562 else if( ipmt==2 ) {
563 sigma = bSigma( 0, tofid[1], zrhit[1] );
564 }
565 else if( ipmt==3 ) {
566 sigma = bSigma( 1, tofid[1], zrhit[1] );
567 }
568 else if( ipmt==4 ) {
569 sigma = bSigma( 2, tofid[0], zrhit[0] );
570 }
571 else if( ipmt==5 ) {
572 sigma = bSigma( 2, tofid[1], zrhit[1] );
573 }
574 else if( ipmt==6 ) {
575 sigma = bSigma( &tofid[0], &zrhit[0] );
576 }
577 }
578 else {
579 sigma = eSigma( tofid[0], zrhit[0] );
580 }
581 }
582 else {
583 int ibgbin = -1;
584 unsigned int iz = 0;
585 if( ipmt==2 || ipmt==3 || ipmt==5 ) { iz=1; }
586 // low momentum proton and anti-proton
587 if( barrel && ispecies==4 && betaGamma<0.8 ) {
588 double nbgbin = 20.0;
589 double bgbegin[2] = { 0.4, 0.55 };
590 double bgend[2] = { 0.8, 0.8 };
591 double bgstep[2];
592 bgstep[0] = (bgend[0]-bgbegin[0])/nbgbin;
593 bgstep[1] = (bgend[1]-bgbegin[1])/nbgbin;
594
595 ibgbin = static_cast<int>((betaGamma-bgbegin[iz])/bgstep[iz]);
596 if( ibgbin<0 ) { ibgbin=0; }
597 else if( ibgbin>=nbgbin ) { ibgbin=nbgbin-1; }
598 }
599
600 sigma = sigmaTof( ispecies, charge, barrel, ipmt, zrhit[iz], ibgbin );
601 }
602
603 return sigma;
604}
605
606
607double TofCorrPID::sigmaTof( unsigned int ispecies, int charge, bool barrel, unsigned int ipmt, double zrhit, int ibgbin ) {
608
609 int izbin=0;
610 if( barrel && ispecies==4 && ibgbin!=-1 ) {
611 int nzbin = 10;
612 double zbegin = -115.0;
613 double zend = 115.0;
614 double zstep = (zend-zbegin)/nzbin;
615
616 izbin = static_cast<int>((zrhit-zbegin)/zstep);
617 if( izbin<0 ) { izbin=0; }
618 else if( izbin>=nzbin ) { izbin=nzbin-1; }
619 }
620
621 double func[10];
622 for( unsigned int i=0; i<9; i++ ) {
623 if( i==0 ) { func[i] = 1.0; }
624 else {
625 func[i] = func[i-1]*zrhit;
626 }
627 }
628 func[9] = -1.0/(zrhit*zrhit-115.0*115.0);
629
630 unsigned int inumber = ipmt;
631 if( !barrel ) { inumber=7; }
632
633 double sigma = 0.0;
634 // barrel
635 if( barrel ) {
636 // barrel inner layer east/west
637 if( ipmt==0 || ipmt==1 ) {
638 if( ispecies==2 || ispecies==3 ) { // pion / kaon
639 for( unsigned int i=0; i<5; i++ ) {
640 if( i!=4 ) {
641 sigma += m_par_sigma[ispecies-2][inumber][i]*func[i];
642 }
643 else {
644 sigma += m_par_sigma[ispecies-2][inumber][i]*func[9];
645 }
646 }
647 }
648 else if( ispecies==4 ) {
649 if( ibgbin!=-1 ) {
650 if( charge==1 ) {
651 sigma = m_p_sigma[0][inumber][izbin][ibgbin];
652 }
653 else {
654 sigma = m_p_sigma[1][inumber][izbin][ibgbin];
655 }
656 }
657 else {
658 for( unsigned int i=0; i<7; i++ ) {
659 if( charge==1 ) {
660 sigma += m_par_sigma[2][inumber][i]*func[i];
661 }
662 else {
663 sigma += m_par_sigma[3][inumber][i]*func[i];
664 }
665 }
666 }
667 }
668 }
669 // barrel outer layer east/west
670 else if( ipmt==2 || ipmt==3 ) {
671 if( ispecies==2 || ispecies==3 ) { // pion / kaon
672 for( unsigned int i=0; i<4; i++ ) {
673 if( i!=3 ) {
674 sigma += m_par_sigma[ispecies-2][inumber][i]*func[i];
675 }
676 else {
677 sigma += m_par_sigma[ispecies-2][inumber][i]*func[9];
678 }
679 }
680 }
681 else if( ispecies==4 ) {
682 if( ibgbin!=-1 ) {
683 if( charge==1 ) {
684 sigma = m_p_sigma[0][inumber][izbin][ibgbin];
685 }
686 else {
687 sigma = m_p_sigma[1][inumber][izbin][ibgbin];
688 }
689 }
690 else {
691 for( unsigned int i=0; i<5; i++ ) {
692 if( charge==1 ) {
693 sigma += m_par_sigma[2][inumber][i]*func[i];
694 }
695 else {
696 sigma += m_par_sigma[3][inumber][i]*func[i];
697 }
698 }
699 }
700 }
701 }
702 // barrel inner layer and outer layer
703 else if( ipmt==4 || ipmt==5 ) {
704 if( ispecies==2 ) { // pion
705 for( unsigned int i=0; i<5; i++ ) {
706 if( i!=4 ) {
707 sigma += m_par_sigma[ispecies-2][inumber][i]*func[i];
708 }
709 else {
710 sigma += m_par_sigma[ispecies-2][inumber][i]*func[9];
711 }
712 }
713 }
714 else if( ispecies==3 ) { // kaon
715 for( unsigned int i=0; i<4; i++ ) {
716 sigma += m_par_sigma[ispecies-2][inumber][i]*func[i];
717 }
718 }
719 else if( ispecies==4 ) {
720 if( ibgbin!=-1 ) {
721 if( charge==1 ) {
722 sigma = m_p_sigma[0][inumber][izbin][ibgbin];
723 }
724 else {
725 sigma = m_p_sigma[1][inumber][izbin][ibgbin];
726 }
727 }
728 else {
729 for( unsigned int i=0; i<9; i++ ) {
730 if( charge==1 ) {
731 sigma += m_par_sigma[2][inumber][i]*func[i];
732 }
733 else {
734 sigma += m_par_sigma[3][inumber][i]*func[i];
735 }
736 }
737 }
738 }
739 }
740 // barrel double layer
741 else if( ipmt==6 ) {
742 if( ispecies==2 || ispecies==3 ) { // pion / kaon
743 for( unsigned int i=0; i<5; i++ ) {
744 sigma += m_par_sigma[ispecies-2][inumber][i]*func[i];
745 }
746 }
747 else if( ispecies==4 ) {
748 if( ibgbin!=-1 ) {
749 if( charge==1 ) {
750 sigma = m_p_sigma[0][inumber][izbin][ibgbin];
751 }
752 else {
753 sigma = m_p_sigma[1][inumber][izbin][ibgbin];
754 }
755 }
756 else {
757 for( unsigned int i=0; i<9; i++ ) {
758 if( charge==1 ) {
759 sigma += m_par_sigma[2][inumber][i]*func[i];
760 }
761 else {
762 sigma += m_par_sigma[3][inumber][i]*func[i];
763 }
764 }
765 }
766 }
767 }
768 }
769 // endcap
770 else {
771 if( ispecies==2 || ispecies==3 ) { // pion / kaon
772 for( unsigned int i=0; i<3; i++ ) {
773 sigma += m_par_sigma[ispecies-2][inumber][i]*func[i];
774 }
775 }
776 else if( ispecies==4 ) {
777 for( unsigned int i=0; i<4; i++ ) {
778 int iparticle=4;
779 if( charge==-1 ) { iparticle=5; }
780 if( i!=3 ) {
781 sigma += m_par_sigma[iparticle-2][inumber][i]*func[i];
782 }
783 else {
784 sigma += m_par_sigma[iparticle-2][inumber][i]*func[9];
785 }
786 }
787 }
788 }
789
790 /*
791 double chi = 1.0;
792 if( barrel ) {
793 if( ( ispecies==3 || ispecies==4 ) && ipmt<4 ) {
794 chi = m_par_sig_mom[ispecies-2][inumber][0];
795 }
796 else {
797 chi = m_par_sig_mom[ispecies-2][inumber][0]*exp(0.0-m_par_sig_mom[ispecies-2][inumber][1]*p)+m_par_sig_mom[ispecies-2][inumber][2];
798 }
799 }
800
801 sigma = sigma*chi;
802 */
803
804 return sigma;
805}
806
807
808double TofCorrPID::qCurveFunc( unsigned int layer, double betaGamma ) {
809 double q0 = -100.0;
810 if( layer>=3 || betaGamma<0.0 ) {
811 cout << "Particle::TofCorrPID::qCurveFunc: the input parameter are NOT correct! Please check them!" << endl;
812 return q0;
813 }
814
815 double beta = betaGamma/sqrt(1.0+betaGamma*betaGamma);
816 double logterm = log( m_q0_bg[layer][2]+pow((1.0/betaGamma), m_q0_bg[layer][4] ) );
817 q0 = m_q0_bg[layer][0]*( m_q0_bg[layer][1]-pow( beta, m_q0_bg[layer][3] ) - logterm )/pow( beta, m_q0_bg[layer][3] );
818
819 return q0;
820}
821
822
823double TofCorrPID::bSigma( unsigned int end, int tofid, double zrhit ) {
824
825 double func[5];
826 func[0] = 1.0;
827 func[1] = zrhit;
828 func[2] = zrhit*zrhit;
829 func[3] = zrhit*zrhit*zrhit;
830 func[4] = zrhit*zrhit*zrhit*zrhit;
831
832 double sigma = 0.0;
833 for( unsigned int i=0; i<5; i++ ) {
834 sigma += m_p_weight[tofid][end][i]*func[i];
835 }
836
837 return sigma;
838}
839
840
841double TofCorrPID::bSigma( int tofid[2], double zrhit[2] ) {
842
843 double sigma1 = bSigma( 2, tofid[0], zrhit[0] );
844 double sigma2 = bSigma( 2, tofid[1], zrhit[1] );
845 double sigmaCorr2 = m_p_common*m_p_common;
846 double sigma = ( sigma1*sigma1*sigma2*sigma2 - sigmaCorr2*sigmaCorr2 )/( sigma1*sigma1 + sigma2*sigma2 - 2.0*sigmaCorr2 );
847 sigma = sqrt(fabs(sigma));
848
849 return sigma;
850}
851
852
853double TofCorrPID::eSigma( int tofid, double zrhit ) {
854
855 double func[5];
856 func[0] = 1.0;
857 func[1] = zrhit;
858 func[2] = zrhit*zrhit;
859
860 double sigma = 0.0;
861 for( unsigned int i=0; i<3; i++ ) {
862 sigma += m_ec_sigma[tofid][i]*func[i];
863 }
864
865 return sigma;
866}
867
868
870 bool chiCut = false;
871 bool good = false;
872 double pdftemp = 0;
873 for( unsigned int i=0; i<5; i++ ) {
874 m_chi[i] = m_offset[i]/m_sigma[i];
875 if( ( m_chi[i]>-4.0 && m_chi[i]<6.0 ) && !good ) { good=true; }
876 double ppp = pdfCalculate(m_chi[i],1);
877 if( fabs(ppp) > pdftemp) { pdftemp = fabs(ppp); }
878 }
879 m_pdfmin = pdftemp;
880 if( pdftemp < pdfCalculate(pdfMinSigmaCut(),1) ) return chiCut;
881 if( !good ) return chiCut;
882 chiCut = true;
883 return chiCut;
884}
TGraphErrors * dt
Definition AbsCor.cxx:72
double sigma2(0)
double abs(const EvtComplex &c)
const double xmass[5]
Definition Gam4pikp.cxx:50
const double zend
Definition TofCalibFit.h:15
const double zbegin
Definition TofCalibFit.h:14
const Hep3Vector tof1Position() const
Definition DstExtTrack.h:58
const Hep3Vector tof2Position() const
Definition DstExtTrack.h:94
static void setPidType(PidType pidType)
const HepLorentzVector p4() const
const int charge() const
Definition DstMdcTrack.h:53
bool isExtTrackValid()
Definition EvtRecTrack.h:57
RecExtTrack * extTrack()
Definition EvtRecTrack.h:68
bool isMdcKalTrackValid()
Definition EvtRecTrack.h:48
SmartRefVector< RecTofTrack > tofTrack()
Definition EvtRecTrack.h:69
bool isTofTrackValid()
Definition EvtRecTrack.h:54
bool isMdcTrackValid()
Definition EvtRecTrack.h:47
RecMdcTrack * mdcTrack()
Definition EvtRecTrack.h:61
RecMdcKalTrack * mdcKalTrack()
Definition EvtRecTrack.h:62
EvtRecTrack * PidTrk() const
double probCalculate(double chi2, int n)
double getRunNo() const
double pdfCalculate(double offset, double sigma)
double pdfMinSigmaCut() const
static std::string path
void inputParameter(int run)
double qCurveFunc(unsigned int layer, double betaGamma)
void init()
bool correlationCheck()
int particleIDCalculation()
double sigma(int n) const
Definition TofCorrPID.h:27
double offset(int n) const
Definition TofCorrPID.h:26
double sigmaTof(unsigned int ispecies, int charge, bool barrel, unsigned int ipmt, int tofid[2], double zrhit[2], double betaGamma)
double bSigma(unsigned int end, int tofid, double zrhit)
void calculate()
double offsetTof(unsigned int ispecies, bool barrel, unsigned int ipmt, double betaGamma, int charge, double zrhit, double dt)
static TofCorrPID * instance()
double eSigma(int tofid, double zrhit)
bool is_barrel() const
unsigned int layer() const
bool is_cluster() const
void setStatus(unsigned int status)
bool is_counter() const
bool is_east() const
bool is_readout() const
bool is_raw() const