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