CGEM BOSS 6.6.5.f
BESIII Offline Software System
Loading...
Searching...
No Matches
MrpcPID.cxx
Go to the documentation of this file.
1#include <cmath>
2
3#include "ParticleID/MrpcPID.h"
4
5#ifndef BEAN
6#include "MdcRecEvent/RecMdcTrack.h"
7#include "TofRecEvent/RecTofTrack.h"
8#include "EvtRecEvent/EvtRecTrack.h"
9#include "DstEvent/TofHitStatus.h"
10#else
11#include "TofHitStatus.h"
12#endif
13
14MrpcPID * MrpcPID::m_pointer = 0;
15
17 if(!m_pointer) m_pointer = new MrpcPID();
18 return m_pointer;
19}
20
21MrpcPID::MrpcPID():ParticleIDBase() {
22 //readSigPar();
23}
24
26 for(int i = 0; i < 5; i++) {
27 m_chi[i] = 99.0;
28 m_prob[i] = -1.0;
29 m_offset[i] = 99.0;
30 m_sigma[i] = 1.0;
31 }
32 m_chimin = 99.;
33 m_pdfmin =99.;
34 m_ndof = 0;
35 m_mass2 = -999;
36 m_rhit = -99;
37}
38
40 if(particleIDCalculation()==0) m_ndof=1;
41}
42
44 int irc = -1;
45 EvtRecTrack* recTrk = PidTrk();
46 if(!(recTrk->isMdcTrackValid())) return irc;
47 RecMdcTrack* mdcTrk = recTrk->mdcTrack();
48
49 double ptrk = mdcTrk->p();
50 // double cost = cos(mdcTrk->theta());
51 // double charge = mdcTrk->charge();
52
53 if(!(recTrk->isTofTrackValid())) return irc;
54
55#ifndef BEAN
56 SmartRefVector<RecTofTrack> tofTrk = recTrk->tofTrack();
57 SmartRefVector<RecTofTrack>::iterator it;//=tofTrk.begin();
58#else
59 const std::vector<TTofTrack* >& tofTrk = recTrk->tofTrack();
60 std::vector<TTofTrack* >::const_iterator it;//=tofTrk.begin();
61#endif
62
63 TofHitStatus *hitst = new TofHitStatus;
64 std::vector<int> tofecount;
65 int goodtofetrk=0;
66 for(it = tofTrk.begin(); it!=tofTrk.end(); it++,goodtofetrk++) {
67 unsigned int st = (*it)->status();
68 hitst->setStatus(st);
69 if( (hitst->is_barrel()) ) continue;
70 if( !(hitst->is_counter()) ) continue;
71 if( hitst->layer()==1 ) tofecount.push_back(goodtofetrk);
72 }
73 delete hitst;
74 if(tofecount.size()!=1) return irc;//not tof2 track or more than 1 tracks
75 it = tofTrk.begin()+tofecount[0];
76
77
78 double tof = (*it)->tof();
79 if(tof <=0 ) return irc;
80 double path = (*it)->path();
81 m_rhit = (*it)->zrhit();
82
83
84 double beta2 = path*path/velc()/velc()/tof/tof;
85 m_mass2 = ptrk * ptrk * (1/beta2 -1);
86
87
88
89 double chitemp = 99.;
90 double pdftemp = 0;
91
92
93
94
95 double xmass[5] = {0.000511, 0.105658, 0.139570,0.493677, 0.938272};
96
97 for(int i = 0; i < 5; i++) {
98
99
100 double texp = (*it)->texp(i);
101 m_offset[i] = tof - texp;
102
103
104
105
106
107 double sigma_tmp= (*it)->sigma(i);
108
109
110 if (sigma_tmp!=0) m_sigma[i]=sigma_tmp;
111 else m_sigma[i]=0.08;
112
113
114 m_chi[i] = m_offset[i]/m_sigma[i];
115
116
117 if(fabs(m_chi[i]) < chitemp) chitemp = fabs(m_chi[i]);
118 double ppp = pdfCalculate(m_chi[i],1);
119 if(fabs(ppp) > pdftemp) pdftemp = fabs(ppp);
120 }
121 m_chimin = chitemp;
122
123 // calculate prob
124
125 for(int i = 0; i < 5; i++)
126 m_prob[i] = probCalculate(m_chi[i]*m_chi[i], 1);
127
128
129
130 m_ndof = 1;
131 irc = 0;
132 return irc;
133}
134
135
const double xmass[5]
Definition: Gam4pikp.cxx:50
void calculate()
Definition: MrpcPID.cxx:39
int particleIDCalculation()
Definition: MrpcPID.cxx:43
static MrpcPID * instance()
Definition: MrpcPID.cxx:16
void init()
Definition: MrpcPID.cxx:25
double probCalculate(double chi2, int n)
double pdfCalculate(double offset, double sigma)
void setStatus(unsigned int status)