BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
ParticleID.cxx
Go to the documentation of this file.
1#include <iostream>
2// #include <cmath>
3#include <cstdlib>
4
5#include "ParticleID/ParticleID.h"
6
7#ifndef BEAN
8# include "EventModel/EventHeader.h"
9# include "EvtRecEvent/EvtRecTrack.h"
10# include "GaudiKernel/Bootstrap.h"
11# include "GaudiKernel/IDataProviderSvc.h"
12# include "GaudiKernel/ISvcLocator.h"
13# include "GaudiKernel/SmartDataPtr.h"
14#endif
15
16//
17// Author: K.L. He & L. L. Wang & Gang.Qin, 01/07/2007 created
18
19ParticleID* ParticleID::m_pointer = 0;
20
21ParticleID* ParticleID::instance() {
22 if ( !m_pointer ) m_pointer = new ParticleID();
23 return m_pointer;
24}
25
27
28 if ( IsDedxInfoUsed() )
29 {
30 if ( !m_dedxpid ) m_dedxpid = DedxPID::instance();
31 m_dedxpid->init();
32 }
33
34 if ( IsTofInfoUsed() | IsTof1InfoUsed() | IsTof2InfoUsed() )
35 {
36 if ( !m_tofpid ) m_tofpid = TofPID::instance();
37 m_tofpid->init();
38 }
39
40 if ( IsTofCorrInfoUsed() )
41 {
42 if ( !m_tofcorrpid ) m_tofcorrpid = TofCorrPID::instance();
43 // m_tofcorrpid->init();
44 }
45
46 if ( IsEmcInfoUsed() )
47 {
48 if ( !m_emcpid ) m_emcpid = EmcPID::instance();
49 m_emcpid->init();
50 }
51
52 if ( IsMucInfoUsed() )
53 {
54 if ( !m_mucpid ) m_mucpid = MucPID::instance();
55 m_mucpid->init();
56 }
57
58 // global info.
59 m_pidsys = 0;
60 m_pidcase = 0;
61 m_method = 0;
62 m_TotalLikelihood = 0;
63 m_discard = 1;
64 // probability
65 m_ndof = 0;
66 m_nhitcut = 5;
67 // chi cut
68 setChiMinCut( 4.0 );
69 setChiMaxCut( 6.0 );
70 for ( int i = 0; i < 5; i++ )
71 {
72 m_chisq[i] = 9999.;
73 m_prob[i] = -1.0;
74 }
75}
76
77ParticleID::ParticleID() : ParticleIDBase() {
78 m_dedxpid = 0;
79 m_tofpid = 0;
80 m_tofepid = 0;
81 m_tofqpid = 0;
82 m_tofcpid = 0;
83 m_tofcorrpid = 0;
84 m_emcpid = 0;
85 m_mucpid = 0;
86}
87
89 // if(m_dedxpid) delete m_dedxpid;
90 // if(m_tof1pid) delete m_tof1pid;
91 // if(m_tof2pid) delete m_tof2pid;
92 // if(m_tofepid) delete m_tofepid;
93 // if(m_tofqpid) delete m_tofqpid;
94 // if(m_emcpid) delete m_emcpid;
95}
96
98#ifdef BEAN
99 cout << " please use ParticleID::calculate(run) ! " << endl;
100 exit( 1 );
101}
102
103void ParticleID::calculate( int run ) {
104#endif
105 int nhitcutpid = getNhitCut();
106
107#ifndef BEAN
108 IDataProviderSvc* m_eventSvc;
109 Gaudi::svcLocator()->service( "EventDataSvc", m_eventSvc, true );
110
111 SmartDataPtr<Event::EventHeader> eventHeaderpid( m_eventSvc, "/Event/EventHeader" );
112 int runpid = eventHeaderpid->runNumber();
113 int eventpid = eventHeaderpid->eventNumber();
114 // cout<<"runpid="<<runpid<<endl;
115 // cout<<"eventpid="<<eventpid<<endl;
116#else
117 int runpid = run;
118#endif
119
120 EvtRecTrack* recTrk = PidTrk();
121 // int runnum=getRunNo();
122 // cout<<"runnum="<<runnum<<endl;
123 // if user did not specify sub sys, sepcify the default value
124 if ( m_pidsys == 0 )
125 {
126 m_pidsys = useDedx() | useTof() | useTofE() | useEmc() | useMuc() | useTofQ() | useTofC() |
127 useTofCorr();
128 }
129 // if user did not set the seperate case, set the default value
130
131 if ( m_pidcase == 0 ) { m_pidcase = all(); }
132 // dedx sys
133 if ( IsDedxInfoUsed() )
134 {
135 if ( !m_dedxpid ) m_dedxpid = DedxPID::instance();
136 m_dedxpid->init();
137 m_dedxpid->setRunNo( runpid );
138 m_dedxpid->setNhitCutDx( nhitcutpid );
139 m_dedxpid->setRecTrack( recTrk );
140 m_dedxpid->setChiMinCut( chiMinCut() );
141 m_dedxpid->setPdfMinSigmaCut( pdfMinSigmaCut() );
142 m_dedxpid->calculate();
143 }
144
145 // tof1 and tof2 sys
146 if ( IsTofInfoUsed() | IsTof1InfoUsed() | IsTof2InfoUsed() | IsTofCInfoUsed() )
147 {
148 if ( IsTofCInfoUsed() )
149 {
150 if ( !m_tofcpid ) m_tofcpid = TofCPID::instance();
151 m_tofcpid->init();
152 m_tofcpid->setRunNo( runpid );
153 m_tofcpid->setRecTrack( recTrk );
154 m_tofcpid->setChiMinCut( chiMinCut() );
155 m_tofcpid->setPdfMinSigmaCut( pdfMinSigmaCut() );
156 m_tofcpid->calculate();
157 }
158 else
159 {
160 if ( !m_tofpid ) m_tofpid = TofPID::instance();
161 m_tofpid->init();
162 m_tofpid->setRecTrack( recTrk );
163 m_tofpid->setChiMinCut( chiMinCut() );
164 m_tofpid->setPdfMinSigmaCut( pdfMinSigmaCut() );
165 m_tofpid->calculate();
166 }
167 }
168
169 // tof secondary correction sys
170 if ( IsTofCorrInfoUsed() )
171 {
172 if ( !m_tofcorrpid ) m_tofcorrpid = TofCorrPID::instance();
173 m_tofcorrpid->setRunNo( runpid );
174 m_tofcorrpid->init();
175 m_tofcorrpid->setRecTrack( recTrk );
176 m_tofcorrpid->setChiMinCut( chiMinCut() );
177 m_tofcorrpid->setChiMaxCut( chiMaxCut() );
178 m_tofcorrpid->setPdfMinSigmaCut( pdfMinSigmaCut() );
179 m_tofcorrpid->calculate();
180 }
181
182 /*
183 // tof1 sys
184 if(IsTof1InfoUsed()){
185 if(!m_tof1pid) m_tof1pid = Tof1PID::instance();
186 m_tof1pid->init();
187 m_tof1pid->setRecTrack(recTrk);
188 m_tof1pid->setChiMinCut(4);
189 m_tof1pid->setPdfMinSigmaCut(4);
190 m_tof1pid->calculate();
191 }
192
193 // tof2 sys
194 if(IsTof2InfoUsed()){
195 if(!m_tof2pid) m_tof2pid = Tof2PID::instance();
196 m_tof2pid->init();
197 m_tof2pid->setRecTrack(recTrk);
198 m_tof2pid->setChiMinCut(4);
199 m_tof2pid->setPdfMinSigmaCut(4);
200 m_tof2pid->calculate();
201 }
202
203 */
204 // tofq sys
205 if ( IsTofQInfoUsed() )
206 {
207 if ( !m_tofqpid ) m_tofqpid = TofQPID::instance();
208 m_tofqpid->init();
209 m_tofqpid->setRecTrack( recTrk );
210 m_tofqpid->setChiMinCut( chiMinCut() );
211 m_tofqpid->calculate();
212 }
213
214 // endcap tof sys
215 if ( IsTofEInfoUsed() && ( !IsTofCorrInfoUsed() ) )
216 {
217 if ( !m_tofepid ) m_tofepid = TofEPID::instance();
218 m_tofepid->init();
219 m_tofepid->setRecTrack( recTrk );
220 m_tofepid->setChiMinCut( chiMinCut() );
221 m_tofepid->setPdfMinSigmaCut( pdfMinSigmaCut() );
222 m_tofepid->calculate();
223 }
224 // emc sys
225 if ( IsEmcInfoUsed() )
226 {
227 if ( !m_emcpid ) m_emcpid = EmcPID::instance();
228 m_emcpid->init();
229 m_emcpid->setRecTrack( recTrk );
230 m_emcpid->setChiMinCut( chiMinCut() );
231 m_emcpid->calculate();
232 }
233
234 // muc sys
235 if ( IsMucInfoUsed() )
236 {
237 if ( !m_mucpid ) m_mucpid = MucPID::instance();
238 m_mucpid->init();
239 m_mucpid->setRecTrack( recTrk );
240 m_mucpid->setChiMinCut( chiMinCut() );
241 m_mucpid->calculate();
242 }
243 // probability method
244 if ( ( m_method & methodProbability() ) == methodProbability() )
245 if ( particleIDCalculation() < 0 ) m_ndof = 0;
246 // std::cout<<"m_ndof="<<m_ndof<<std::endl;
247
248 // likelihood method
249 if ( ( m_method & methodLikelihood() ) == methodLikelihood() )
250 if ( LikelihoodCalculation() < 0 ) m_discard = 0;
251 // neuron network
252 if ( ( m_method & methodNeuronNetwork() ) == methodNeuronNetwork() )
253 // m_neuronPid = neuronPIDCalculation();
254 if ( LikelihoodCalculation() < 0 ) m_discard = 0;
255}
256
257int ParticleID ::particleIDCalculation() {
258 int irc = -1;
259 bool valid = IsDedxInfoValid() || IsTofInfoValid() || IsTofEInfoValid() ||
262
263 if ( !valid ) return irc;
264
265 double chisq[5];
266 bool pidcase[5];
267 for ( int i = 0; i < 5; i++ )
268 {
269 chisq[i] = 0;
270 pidcase[i] = false;
271 }
272
273 if ( ( m_pidcase & onlyElectron() ) == onlyElectron() ) pidcase[0] = true;
274 if ( ( m_pidcase & onlyMuon() ) == onlyMuon() ) pidcase[1] = true;
275 if ( ( m_pidcase & onlyPion() ) == onlyPion() ) pidcase[2] = true;
276 if ( ( m_pidcase & onlyKaon() ) == onlyKaon() ) pidcase[3] = true;
277 if ( ( m_pidcase & onlyProton() ) == onlyProton() ) pidcase[4] = true;
278
279 //
280 // dEdx PID
281 //
282 if ( IsDedxInfoUsed() )
283 {
284 if ( IsDedxInfoValid() )
285 {
286 bool okpid = false;
287 for ( int i = 0; i < 5; i++ )
288 {
289 if ( pidcase[i] && ( fabs( chiDedx( i ) ) < m_dedxpid->chiMinCut() ) )
290 if ( !okpid ) okpid = true;
291 }
292 if ( okpid )
293 {
294 m_ndof++;
295 for ( int i = 0; i < 5; i++ ) chisq[i] += chiDedx( i ) * chiDedx( i );
296 }
297 } // dE/dx
298 }
299 //
300 // Barrel TOF
301 //
302
303 if ( IsTofInfoUsed() | IsTof1InfoUsed() | IsTof2InfoUsed() | IsTofCInfoUsed() )
304 {
305 if ( IsTofCInfoUsed() )
306 {
307 if ( IsTofCInfoValid() )
308 {
309 bool okpid = false;
310 for ( int i = 0; i < 5; i++ )
311 {
312 if ( pidcase[i] && ( fabs( chiTofC( i ) ) < m_tofcpid->chiMinCut() ) )
313 if ( !okpid ) okpid = true;
314 }
315 if ( okpid )
316 {
317 m_ndof++;
318 for ( int i = 0; i < 5; i++ ) chisq[i] += chiTofC( i ) * chiTofC( i );
319 }
320 } // TOF1
321 }
322 else
323 {
324 if ( IsTofInfoValid() )
325 {
326 bool okpid = false;
327 for ( int i = 0; i < 5; i++ )
328 {
329 if ( pidcase[i] && ( fabs( chiTof( i ) ) < m_tofpid->chiMinCut() ) )
330 if ( !okpid ) okpid = true;
331 }
332 if ( okpid )
333 {
334 m_ndof++;
335 for ( int i = 0; i < 5; i++ ) chisq[i] += chiTof( i ) * chiTof( i );
336 }
337 } // TOF1
338
339 //
340 // EndCap Tof
341 //
342
343 if ( IsTofEInfoUsed() )
344 {
345 if ( IsTofEInfoValid() )
346 {
347 bool okpid = false;
348 for ( int i = 0; i < 5; i++ )
349 {
350 if ( pidcase[i] && ( fabs( chiTofE( i ) ) < m_tofepid->chiMinCut() ) )
351 if ( !okpid ) okpid = true;
352 }
353 if ( okpid )
354 {
355 m_ndof++;
356 for ( int i = 0; i < 5; i++ ) chisq[i] += chiTofE( i ) * chiTofE( i );
357 }
358 } // EndCap TOF
359 }
360 }
361 }
362
363 // Secondary TOF correction
364 if ( IsTofCorrInfoUsed() )
365 {
366 if ( IsTofCorrInfoValid() )
367 {
368 bool okpid = false;
369 for ( int i = 0; i < 5; i++ )
370 {
371 if ( pidcase[i] && ( chiTofCorr( i ) < m_tofcorrpid->chiMaxCut() ) &&
372 ( chiTofCorr( i ) > ( 0.0 - m_tofcorrpid->chiMinCut() ) ) )
373 // if(pidcase[i] && ( chiTofCorr(i) < 6.0 && chiTofCorr(i) > -4.0 ) )
374 if ( !okpid ) okpid = true;
375 }
376 if ( okpid )
377 {
378 m_ndof++;
379 for ( int i = 0; i < 5; i++ ) chisq[i] += chiTofCorr( i ) * chiTofCorr( i );
380 }
381 }
382 }
383
384 //
385 // Barrel TOF Q
386 //
387
388 if ( IsTofQInfoUsed() )
389 {
390 if ( IsTofQInfoValid() )
391 {
392 bool okpid = false;
393 for ( int i = 0; i < 5; i++ )
394 {
395 if ( pidcase[i] && ( fabs( chiTofQ( i ) ) < m_tofqpid->chiMinCut() ) )
396 if ( !okpid ) okpid = true;
397 }
398 if ( okpid )
399 {
400 m_ndof++;
401 for ( int i = 0; i < 5; i++ ) chisq[i] += chiTofQ( i ) * chiTofQ( i );
402 }
403 } // TofQ
404 }
405
406 // Muc Pid
407 if ( IsMucInfoUsed() )
408 {
409 if ( IsMucInfoValid() )
410 {
411 bool okpid = false;
412 for ( int i = 0; i < 5; i++ )
413 {
414 if ( pidcase[i] && ( fabs( chiMuc( i ) ) < m_mucpid->chiMinCut() ) )
415 if ( !okpid ) okpid = true;
416 }
417 if ( okpid )
418 {
419 m_ndof++;
420 for ( int i = 0; i < 5; i++ ) chisq[i] += chiMuc( i ) * chiMuc( i );
421 }
422 } // Muc Pid
423 }
424
425 // Emc PID
426 if ( IsEmcInfoUsed() )
427 {
428 if ( IsEmcInfoValid() )
429 {
430 bool okpid = false;
431 for ( int i = 0; i < 5; i++ )
432 {
433 if ( pidcase[i] && ( fabs( chiEmc( i ) ) < m_emcpid->chiMinCut() ) )
434 if ( !okpid ) okpid = true;
435 }
436 if ( okpid )
437 {
438 m_ndof++;
439 for ( int i = 0; i < 5; i++ ) chisq[i] += chiEmc( i ) * chiEmc( i );
440 }
441 } // Emc Pid
442 }
443
444 if ( m_ndof <= 0 ) return irc;
445
446 for ( int i = 0; i < 5; i++ )
447 {
448 m_chisq[i] = chisq[i];
449 m_prob[i] = probCalculate( chisq[i], m_ndof );
450 }
451
452 irc = 0;
453 return irc;
454}
455
457 int irc = -1;
458
459 bool valid = IsDedxInfoValid() || IsTofInfoValid() || IsTofEInfoValid() ||
462 if ( !valid ) return irc;
463 double pdf[5];
464 bool pidcase[5];
465 for ( int i = 0; i < 5; i++ )
466 {
467 pdf[i] = 1;
468 pidcase[i] = false;
469 }
470
471 if ( ( m_pidcase & onlyElectron() ) == onlyElectron() ) pidcase[0] = true;
472 if ( ( m_pidcase & onlyMuon() ) == onlyMuon() ) pidcase[1] = true;
473 if ( ( m_pidcase & onlyPion() ) == onlyPion() ) pidcase[2] = true;
474 if ( ( m_pidcase & onlyKaon() ) == onlyKaon() ) pidcase[3] = true;
475 if ( ( m_pidcase & onlyProton() ) == onlyProton() ) pidcase[4] = true;
476
477 for ( int i = 0; i < 5; i++ )
478 {
479 if ( pidcase[i] == 0 ) pdf[i] = 0;
480 }
481
482 //
483 // dEdx PID
484 //
485 if ( IsDedxInfoUsed() )
486 {
487 if ( IsDedxInfoValid() )
488 {
489 bool okpid = false;
490 for ( int i = 0; i < 5; i++ )
491 {
492 if ( pidcase[i] && pdfCalculate( chiDedx( i ), 1 ) >
493 pdfCalculate( m_dedxpid->pdfMinSigmaCut(), 1.5 ) )
494 if ( !okpid ) okpid = true;
495 }
496 if ( okpid )
497 {
498 m_ndof++;
499 for ( int i = 0; i < 5; i++ ) { pdf[i] *= pdfDedx( i ); }
500 }
501 } // dE/dx
502 }
503
504 //
505 // Barrel TOF
506 //
507 if ( IsTofInfoUsed() | IsTof1InfoUsed() | IsTof2InfoUsed() | IsTofCInfoUsed() )
508 {
509 if ( IsTofCInfoUsed() )
510 {
511
512 if ( IsTofCInfoValid() )
513 {
514 bool okpid = false;
515 for ( int i = 0; i < 5; i++ )
516 {
517 if ( pidcase[i] && pdfCalculate( chiTof( i ), 1 ) >
518 pdfCalculate( m_tofcpid->pdfMinSigmaCut(), 1.5 ) )
519 if ( !okpid ) okpid = true;
520 }
521 if ( okpid )
522 {
523 m_ndof++;
524 for ( int i = 0; i < 5; i++ ) { pdf[i] *= pdfTofC( i ); }
525 }
526 } // TOF
527 }
528
529 else
530 {
531 if ( IsTofInfoValid() )
532 {
533 bool okpid = false;
534 for ( int i = 0; i < 5; i++ )
535 {
536 if ( pidcase[i] && pdfCalculate( chiTof( i ), 1 ) >
537 pdfCalculate( m_tofpid->pdfMinSigmaCut(), 1.5 ) )
538 if ( !okpid ) okpid = true;
539 }
540 if ( okpid )
541 {
542 m_ndof++;
543 for ( int i = 0; i < 5; i++ ) { pdf[i] *= pdfTof( i ); }
544 }
545 } // TOF
546
547 //
548 // EndCap Tof
549 //
550
551 if ( IsTofEInfoUsed() )
552 {
553 if ( IsTofEInfoValid() )
554 {
555 bool okpid = false;
556 for ( int i = 0; i < 5; i++ )
557 {
558 if ( pidcase[i] && pdfCalculate( chiTofE( i ), 1 ) >
559 pdfCalculate( m_tofepid->pdfMinSigmaCut(), 1.5 ) )
560 if ( !okpid ) okpid = true;
561 }
562 if ( okpid )
563 {
564 // m_ndof++;
565 // for(int i = 0; i < 5; i++) pdf[i] *= pdfTofE(i);
566 }
567 } // EndCap TOF
568 }
569 }
570 }
571
572 // Secondary TOF correction
573 if ( IsTofCorrInfoUsed() )
574 {
575 if ( IsTofCorrInfoValid() )
576 {
577 bool okpid = false;
578 for ( int i = 0; i < 5; i++ )
579 {
580 if ( pidcase[i] && pdfCalculate( chiTofCorr( i ), 1 ) >
581 pdfCalculate( m_tofcorrpid->pdfMinSigmaCut(), 1.5 ) )
582 if ( !okpid ) okpid = true;
583 }
584 if ( okpid )
585 {
586 m_ndof++;
587 for ( int i = 0; i < 5; i++ ) { pdf[i] *= pdfTofCorr( i ); }
588 }
589 }
590 }
591
592 //
593 // Barrel TOF Q
594 //
595
596 if ( IsTofQInfoValid() )
597 {
598 bool okpid = false;
599 for ( int i = 0; i < 5; i++ )
600 {
601 if ( pidcase[i] )
602 if ( !okpid ) okpid = true;
603 }
604 if ( okpid )
605 {
606 // m_ndof++;
607 for ( int i = 0; i < 5; i++ ) pdf[i] *= pdfTofQ( i );
608 }
609 } // TofQ
610
611 //
612 // Emc PID
613 //
614 if ( IsEmcInfoUsed() )
615 {
616 if ( IsEmcInfoValid() )
617 {
618 bool okpid = false;
619 for ( int i = 0; i < 5; i++ )
620 {
621 if ( pidcase[i] && pdfEmc( i ) > 0 )
622 if ( !okpid ) okpid = true;
623 }
624 if ( okpid )
625 {
626 m_ndof++;
627 for ( int i = 0; i < 5; i++ ) { pdf[i] *= pdfEmc( i ); }
628 } // Emc Pid
629 }
630 }
631 if ( IsMucInfoUsed() )
632 {
633 if ( IsMucInfoValid() )
634 {
635 bool okpid = false;
636 for ( int i = 0; i < 5; i++ )
637 {
638 if ( pidcase[i] && pdfMuc( i ) > 0 )
639 if ( !okpid ) okpid = true;
640 }
641 if ( okpid )
642 {
643 m_ndof++;
644 for ( int i = 0; i < 5; i++ ) { pdf[i] *= pdfMuc( i ); }
645 }
646 } // Emc Pid
647 }
648
649 if ( m_ndof <= 0 ) return irc;
650 for ( int i = 0; i < 5; i++ )
651 {
652 m_pdf[i] = pdf[i];
653 m_TotalLikelihood += pdf[i];
654 }
655 for ( int i = 0; i < 5; i++ ) { m_likelihoodfraction[i] = pdf[i] / m_TotalLikelihood; }
656
657 irc = 0;
658 return irc;
659}
static DedxPID * instance()
Definition DedxPID.cxx:17
static EmcPID * instance()
Definition EmcPID.cxx:22
static MucPID * instance()
Definition MucPID.cxx:22
double probCalculate(double chi2, int n)
double pdfCalculate(double offset, double sigma)
double chiMuc(int n) const
double pdfEmc(int n)
double pdfTofC(int n)
bool IsTofEInfoValid() const
bool IsEmcInfoValid() const
double pdfDedx(int n)
int LikelihoodCalculation()
double chiTofE(int n) const
bool IsTofCorrInfoValid() const
bool IsTofCInfoValid() const
bool IsTofInfoValid() const
double pdfTof(int n)
double chiTofQ(int n) const
bool IsTofQInfoValid() const
int particleIDCalculation()
static ParticleID * instance()
bool IsDedxInfoValid() const
double chiTofC(int n) const
double pdfMuc(int n)
double pdfTofCorr(int n)
void calculate()
double chiEmc(int n) const
void init()
bool IsMucInfoValid() const
double chiTof(int n) const
double pdfTofQ(int n)
double chiTofCorr(int n) const
double chiDedx(int n) const
static TofCPID * instance()
Definition TofCPID.cxx:18
static TofCorrPID * instance()
static TofEPID * instance()
Definition TofEPID.cxx:16
static TofPID * instance()
Definition TofPID.cxx:14
static TofQPID * instance()
Definition TofQPID.cxx:13