CGEM BOSS 6.6.5.f
BESIII Offline Software System
Loading...
Searching...
No Matches
TofEPID.cxx
Go to the documentation of this file.
1#include <cmath>
2
3#include "ParticleID/TofEPID.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
14TofEPID * TofEPID::m_pointer = 0;
15
17 if(!m_pointer) m_pointer = new TofEPID();
18 return m_pointer;
19}
20
21TofEPID::TofEPID():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 // int qual = (*it)->quality();
79 // if(qual != 1) return irc;
80 // int cntr = (*it)->tofID();
81 double tof = (*it)->tof();
82 if(tof <=0 ) return irc;
83 double path = (*it)->path();
84 // double m_ph = (*it)->ph();
85 m_rhit = (*it)->zrhit();
86 // m_part = tofTrk->getPart();
87
88 double beta2 = path*path/velc()/velc()/tof/tof;
89 m_mass2 = ptrk * ptrk * (1/beta2 -1);
90 // if ((m_mass2>20)||(m_mass2<-1)) return irc;
91
92
93 double chitemp = 99.;
94 double pdftemp = 0;
95 for(int i = 0; i < 5; i++) {
96 // double gb = ptrk/xmass(i);
97 // double beta = gb/sqrt(1+gb*gb);
98 double texp = (*it)->texp(i);
99 // path /beta/velc();
100 m_offset[i] = tof - texp-(*it)->toffset(i);// - offsetTofE(i, cntr, ptrk, m_rhit, m_ph,charge);
101 double sigma_tmp= (*it)->sigma(0);
102 /* if(fabs(sigma_tmp/1000.)>0.3) {
103 int tofid=(*it)->tofID();
104 // sigma_tmp=getSigbyRun(tofid)*0.1;
105 }*/
106
107 if(sigma_tmp!=0) {
108 m_sigma[i] = 1.2*sigma_tmp;
109 if(i<2) m_sigma[i]=sigma_tmp;
110 }
111 else m_sigma[i]=0.12;
112 // m_chi[i] = m_offset[i]/m_sigma[i];
113
114 // m_sigma[i]=sigma_tmp;
115 // if(i!=0) m_sigma[i] = sigma_tmp*1.1;
116 // m_sigma[i] = sigmaTofE(i, cntr,ptrk,m_rhit, m_ph,charge);
117 m_chi[i] = m_offset[i]/m_sigma[i];
118 if(fabs(m_chi[i]) < chitemp) chitemp = fabs(m_chi[i]);
119 double ppp = pdfCalculate(m_chi[i],1);
120 if(fabs(ppp) > pdftemp) pdftemp = fabs(ppp);
121 }
122 m_chimin = chitemp;
123 // if(m_chimin > chiMinCut() ) return irc;
124 // if(pdftemp < pdfCalculate(pdfMinSigmaCut(),1.0)) return irc;
125
126 // calculate prob
127
128 for(int i = 0; i < 5; i++)
129 m_prob[i] = probCalculate(m_chi[i]*m_chi[i], 1);
130
131 m_ndof = 1;
132 irc = 0;
133 return irc;
134}
135
136
137//
138// TOF endcap: Correction routines
139//
140
141double TofEPID::offsetTofE(int n, int cntr, double ptrk, double rtof, double ph,double charge) {
142 double offset;
143 // double gb = ptrk/xmass(n);
144 switch(n) {
145 case 0: { // Electron
146 double ptemp = ptrk;
147 if(ptrk<0.2) ptemp = 0.2;
148 if(ptrk > 2.1) ptemp = 2.1;
149 double plog = log(ptemp);
150 offset = 0.001*(-28.8481+138.159*plog-249.334*plog*plog);
151 break;
152 }
153
154 case 1: { // Muon
155 double ptemp = ptrk;
156 if(ptrk<0.2) ptemp = 0.2;
157 if(ptrk > 2.1) ptemp = 2.1;
158 double plog = log(ptemp);
159 offset = 0.001*(-33.6966+1.91915*plog-0.592320*plog*plog);
160 break;
161 }
162 case 2: { // Pion
163 double ptemp = ptrk;
164 if(ptrk<0.2) ptemp = 0.2;
165 if(ptrk > 2.1) ptemp = 2.1;
166 double plog = log(ptemp);
167 offset = 0.001*(-27.9965 + 1.213 * plog - 2.02740 * plog * plog);
168 break;
169 }
170 case 3: { // Kaon
171 double ptemp = ptrk;
172 if(ptrk<0.3) ptemp = 0.3;
173 if(ptrk > 2.1) ptemp = 2.1;
174 double plog = log(ptemp);
175 offset = 0.001*(-23.4842 -28.7569 * plog + 78.21* plog *plog);
176 break;
177 }
178
179 case 4: { // Proton
180 double ptemp = ptrk;
181 if(ptrk<0.4) ptemp = 0.4;
182 if(ptrk > 2.1) ptemp = 2.1;
183 double plog = log(ptemp);
184 if(charge>0)
185 offset = 0.001*(-4.854-110.540*plog+99.8732*plog*plog);
186 if(charge<0)
187 offset = 0.001*(27.047-145.120*plog+167.014*plog*plog);
188 break;
189 }
190
191 default:
192 offset = 0.0;
193 break;
194 }
195 // offset = 0.0;
196 return offset;
197}
198
199double TofEPID::sigmaTofE(int n, int cntr, double ptrk, double rtof, double ph,double charge) {
200
201 double sigma;
202 // double gb = ptrk/xmass(n);
203 switch(n) {
204
205 case 0: { // Electron
206 double ptemp = ptrk;
207 if(ptrk < 0.2) ptemp = 0.2;
208 if(ptrk > 2.1) ptemp = 2.1;
209 double plog = log(ptemp);
210 sigma = 0.001 * (109.974 +15.2457 * plog + 36.8139 * plog * plog);
211
212 break;
213 }
214
215 case 1: { // Muon
216 double ptemp = ptrk;
217 if(ptrk < 0.2) ptemp = 0.2;
218 if(ptrk > 2.1) ptemp = 2.1;
219 double plog = log(ptemp);
220 sigma = 0.001 * (96.5077 -2.96232 * plog + 3.12910 * plog * plog);
221 break;
222 }
223
224 case 2: { // pion
225 double ptemp = ptrk;
226 if(ptrk < 0.2) ptemp = 0.2;
227 if(ptrk > 2.1) ptemp = 2.1;
228 double plog = log(ptemp);
229 sigma = 0.001 * (105.447 - 2.08044 * plog + 3.44846 * plog * plog);
230 break;
231 }
232
233 case 3: { // Kaon
234 double ptemp = ptrk;
235 if(ptrk < 0.3) ptemp = 0.3;
236 if(ptrk > 2.1) ptemp = 2.1;
237 double plog = log(ptemp);
238 sigma = 0.001*(88.8806 - 26.8464 * plog + 113.672 * plog * plog);
239 break;
240 }
241 case 4: { // Proton
242 double ptemp = ptrk;
243 if(ptrk < 0.5) ptemp = 0.5;
244 if(ptrk > 2.1) ptemp = 2.1;
245 double plog = log(ptemp);
246 if(charge>0)
247 sigma = 0.001 * (96.3534 -44.1139 * plog + 53.9805 * plog * plog);
248 if(charge<0)
249 sigma = 0.001 * (157.345 -98.7357 * plog + 55.1145 * plog * plog);
250 break;
251 }
252
253 default:
254 sigma = 0.100;
255
256 break;
257 }
258 // sigma =1;
259 return sigma;
260}
261
const Int_t n
double probCalculate(double chi2, int n)
double pdfCalculate(double offset, double sigma)
void init()
Definition: TofEPID.cxx:25
void calculate()
Definition: TofEPID.cxx:39
double sigmaTofE(int n, int cntr, double ptrk, double rtof, double ph, double charge)
Definition: TofEPID.cxx:199
static TofEPID * instance()
Definition: TofEPID.cxx:16
int particleIDCalculation()
Definition: TofEPID.cxx:43
double offsetTofE(int n, int cntr, double ptrk, double rtof, double ph, double charge)
Definition: TofEPID.cxx:141
void setStatus(unsigned int status)