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