BOSS 8.0.0
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 "DstEvent/TofHitStatus.h"
7# include "EvtRecEvent/EvtRecTrack.h"
8# include "MdcRecEvent/RecMdcTrack.h"
9# include "TofRecEvent/RecTofTrack.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 {
28 m_chi[i] = 99.0;
29 m_prob[i] = -1.0;
30 m_offset[i] = 99.0;
31 m_sigma[i] = 1.0;
32 }
33 m_chimin = 99.;
34 m_pdfmin = 99.;
35 m_ndof = 0;
36 m_mass2 = -999;
37 m_rhit = -99;
38}
39
41 if ( particleIDCalculation() == 0 ) m_ndof = 1;
42}
43
45 int irc = -1;
46 EvtRecTrack* recTrk = PidTrk();
47 if ( !( recTrk->isMdcTrackValid() ) ) return irc;
48 if ( !( recTrk->isTofTrackValid() ) ) return irc;
49
50#ifndef BEAN
51 SmartRefVector<RecTofTrack> tofTrackCol = recTrk->tofTrack();
52 SmartRefVector<RecTofTrack>::iterator it;
53#else
54 const std::vector<TTofTrack*>& tofTrackCol = recTrk->tofTrack();
55 std::vector<TTofTrack*>::const_iterator it;
56#endif
57
58 bool isMRPC = false;
59 if ( tofTrackCol.size() != 1 && tofTrackCol.size() != 3 ) { return irc; }
60 else
61 {
62 TofHitStatus* hitst = new TofHitStatus;
63 if ( tofTrackCol.size() == 1 )
64 {
65 it = tofTrackCol.begin();
66 hitst->setStatus( ( *it )->status() );
67 bool isRaw = hitst->is_raw();
68 if ( isRaw ) { return irc; }
69 isMRPC = hitst->is_mrpc();
70 bool isReadout = hitst->is_readout();
71 bool isCounter = hitst->is_counter();
72 bool isCluster = hitst->is_cluster();
73 if ( !isReadout || !isCounter || !isCluster ) { return irc; }
74 }
75 else if ( tofTrackCol.size() == 3 )
76 {
77 unsigned int icounter = -1;
78 unsigned int inumber = 0;
79 for ( it = tofTrackCol.begin(); it != tofTrackCol.end(); it++, inumber++ )
80 {
81 hitst->setStatus( ( *it )->status() );
82 bool isRaw = hitst->is_raw();
83 if ( isRaw ) continue;
84 isMRPC = hitst->is_mrpc();
85 if ( !isMRPC ) { return irc; } // MRPC is possible to have 3 record.
86 bool isReadout = hitst->is_readout();
87 bool isCounter = hitst->is_counter();
88 bool isCluster = hitst->is_cluster();
89 if ( !isReadout && isCounter && isCluster ) { icounter = inumber; }
90 }
91 if ( icounter == -1 ) { return irc; }
92 it = tofTrackCol.begin() + icounter;
93 }
94 }
95
96 double tof = ( *it )->tof();
97 if ( tof <= 0 ) { return irc; }
98 double path = ( *it )->path();
99 m_rhit = ( *it )->zrhit();
100 double beta = path / velc() / tof;
101 double beta2 = beta * beta;
102 RecMdcTrack* mdcTrk = recTrk->mdcTrack();
103 double ptrk = mdcTrk->p();
104 m_mass2 = ptrk * ptrk * ( 1.0 / beta2 - 1.0 );
105
106 double chitemp = 99.;
107 double pdftemp = 0;
108 for ( unsigned int i = 0; i < 5; i++ )
109 {
110 double texp = ( *it )->texp( i );
111 m_offset[i] = tof - texp - ( *it )->toffset( i );
112 double sigma_tmp = ( *it )->sigma( 0 );
113 if ( !isMRPC )
114 {
115 if ( sigma_tmp > 0 )
116 {
117 if ( i < 2 ) { m_sigma[i] = sigma_tmp; }
118 else { m_sigma[i] = 1.2 * sigma_tmp; }
119 }
120 else { m_sigma[i] = 0.12; }
121 }
122 else
123 {
124 // m_sigma[i] = 0.065;
125 int strip = ( *it )->strip();
126 if ( strip < 0 || strip > 11 ) { m_sigma[i] = 0.065; }
127 else
128 {
129 double p0, p1;
130 if ( strip == 0 )
131 {
132 p0 = 0.16;
133 p1 = 0.0;
134 }
135 else if ( strip == 1 )
136 {
137 p0 = 0.051094;
138 p1 = 0.019467;
139 }
140 else if ( strip == 2 )
141 {
142 p0 = 0.056019;
143 p1 = 0.012964;
144 }
145 else if ( strip == 3 )
146 {
147 p0 = 0.043901;
148 p1 = 0.015933;
149 }
150 else if ( strip == 4 )
151 {
152 p0 = 0.049750;
153 p1 = 0.010473;
154 }
155 else if ( strip == 5 )
156 {
157 p0 = 0.048345;
158 p1 = 0.008545;
159 }
160 else if ( strip == 6 )
161 {
162 p0 = 0.046518;
163 p1 = 0.009038;
164 }
165 else if ( strip == 7 )
166 {
167 p0 = 0.048803;
168 p1 = 0.007251;
169 }
170 else if ( strip == 8 )
171 {
172 p0 = 0.047523;
173 p1 = 0.008434;
174 }
175 else if ( strip == 9 )
176 {
177 p0 = 0.042187;
178 p1 = 0.010307;
179 }
180 else if ( strip == 10 )
181 {
182 p0 = 0.050337;
183 p1 = 0.005951;
184 }
185 else if ( strip == 11 )
186 {
187 p0 = 0.054740;
188 p1 = 0.005629;
189 }
190 if ( ptrk < 0.05 ) { m_sigma[i] = p0 + p1 / 0.05; }
191 else { m_sigma[i] = p0 + p1 / ptrk; }
192 }
193 }
194 m_chi[i] = m_offset[i] / m_sigma[i];
195
196 if ( fabs( m_chi[i] ) < chitemp ) { chitemp = fabs( m_chi[i] ); }
197 double ppp = pdfCalculate( m_chi[i], 1 );
198 if ( fabs( ppp ) > pdftemp ) { pdftemp = fabs( ppp ); }
199 }
200 m_chimin = chitemp;
201 // if( pdftemp < pdfCalculate(pdfMinSigmaCut(),1) ) { return irc; }
202 // if( fabs(m_chimin) > chiMinCut() ) { return irc; }
203
204 for ( unsigned int i = 0; i < 5; i++ )
205 { m_prob[i] = probCalculate( m_chi[i] * m_chi[i], 1 ); }
206
207 irc = 0;
208 return irc;
209}
210
211//
212// TOF endcap: Correction routines
213//
214
215double TofEPID::offsetTofE( int n, int cntr, double ptrk, double rtof, double ph,
216 double charge ) {
217 double offset=0.0;
218 // double gb = ptrk/xmass(n);
219 switch ( n )
220 {
221 case 0: { // Electron
222 double ptemp = ptrk;
223 if ( ptrk < 0.2 ) ptemp = 0.2;
224 if ( ptrk > 2.1 ) ptemp = 2.1;
225 double plog = log( ptemp );
226 offset = 0.001 * ( -28.8481 + 138.159 * plog - 249.334 * plog * plog );
227 break;
228 }
229
230 case 1: { // Muon
231 double ptemp = ptrk;
232 if ( ptrk < 0.2 ) ptemp = 0.2;
233 if ( ptrk > 2.1 ) ptemp = 2.1;
234 double plog = log( ptemp );
235 offset = 0.001 * ( -33.6966 + 1.91915 * plog - 0.592320 * plog * plog );
236 break;
237 }
238 case 2: { // Pion
239 double ptemp = ptrk;
240 if ( ptrk < 0.2 ) ptemp = 0.2;
241 if ( ptrk > 2.1 ) ptemp = 2.1;
242 double plog = log( ptemp );
243 offset = 0.001 * ( -27.9965 + 1.213 * plog - 2.02740 * plog * plog );
244 break;
245 }
246 case 3: { // Kaon
247 double ptemp = ptrk;
248 if ( ptrk < 0.3 ) ptemp = 0.3;
249 if ( ptrk > 2.1 ) ptemp = 2.1;
250 double plog = log( ptemp );
251 offset = 0.001 * ( -23.4842 - 28.7569 * plog + 78.21 * plog * plog );
252 break;
253 }
254
255 case 4: { // Proton
256 double ptemp = ptrk;
257 if ( ptrk < 0.4 ) ptemp = 0.4;
258 if ( ptrk > 2.1 ) ptemp = 2.1;
259 double plog = log( ptemp );
260 if ( charge > 0 ) offset = 0.001 * ( -4.854 - 110.540 * plog + 99.8732 * plog * plog );
261 if ( charge < 0 ) offset = 0.001 * ( 27.047 - 145.120 * plog + 167.014 * plog * plog );
262 break;
263 }
264
265 default: offset = 0.0; break;
266 }
267 // offset = 0.0;
268 return offset;
269}
270
271double TofEPID::sigmaTofE( int n, int cntr, double ptrk, double rtof, double ph,
272 double charge ) {
273
274 double sigma=0.100;
275 // double gb = ptrk/xmass(n);
276 switch ( n )
277 {
278
279 case 0: { // Electron
280 double ptemp = ptrk;
281 if ( ptrk < 0.2 ) ptemp = 0.2;
282 if ( ptrk > 2.1 ) ptemp = 2.1;
283 double plog = log( ptemp );
284 sigma = 0.001 * ( 109.974 + 15.2457 * plog + 36.8139 * plog * plog );
285
286 break;
287 }
288
289 case 1: { // Muon
290 double ptemp = ptrk;
291 if ( ptrk < 0.2 ) ptemp = 0.2;
292 if ( ptrk > 2.1 ) ptemp = 2.1;
293 double plog = log( ptemp );
294 sigma = 0.001 * ( 96.5077 - 2.96232 * plog + 3.12910 * plog * plog );
295 break;
296 }
297
298 case 2: { // pion
299 double ptemp = ptrk;
300 if ( ptrk < 0.2 ) ptemp = 0.2;
301 if ( ptrk > 2.1 ) ptemp = 2.1;
302 double plog = log( ptemp );
303 sigma = 0.001 * ( 105.447 - 2.08044 * plog + 3.44846 * plog * plog );
304 break;
305 }
306
307 case 3: { // Kaon
308 double ptemp = ptrk;
309 if ( ptrk < 0.3 ) ptemp = 0.3;
310 if ( ptrk > 2.1 ) ptemp = 2.1;
311 double plog = log( ptemp );
312 sigma = 0.001 * ( 88.8806 - 26.8464 * plog + 113.672 * plog * plog );
313 break;
314 }
315 case 4: { // Proton
316 double ptemp = ptrk;
317 if ( ptrk < 0.5 ) ptemp = 0.5;
318 if ( ptrk > 2.1 ) ptemp = 2.1;
319 double plog = log( ptemp );
320 if ( charge > 0 ) sigma = 0.001 * ( 96.3534 - 44.1139 * plog + 53.9805 * plog * plog );
321 if ( charge < 0 ) sigma = 0.001 * ( 157.345 - 98.7357 * plog + 55.1145 * plog * plog );
322 break;
323 }
324
325 default: sigma = 0.100; break;
326 }
327 // sigma =1;
328 return sigma;
329}
double p1[4]
const Int_t n
SmartRefVector< RecTofTrack > tofTrack()
double probCalculate(double chi2, int n)
double pdfCalculate(double offset, double sigma)
void init()
Definition TofEPID.cxx:25
void calculate()
Definition TofEPID.cxx:40
double sigmaTofE(int n, int cntr, double ptrk, double rtof, double ph, double charge)
Definition TofEPID.cxx:271
static TofEPID * instance()
Definition TofEPID.cxx:16
int particleIDCalculation()
Definition TofEPID.cxx:44
double offsetTofE(int n, int cntr, double ptrk, double rtof, double ph, double charge)
Definition TofEPID.cxx:215
void setStatus(unsigned int status)