Use TMath::Abs instead of fabs (Alpha)
[u/mrichter/AliRoot.git] / ITS / AliITSPid.cxx
1 #include "AliITSPid.h"
2 #include "TMath.h"
3 #include "AliITSIOTrack.h"
4 #include <iostream.h>
5 ClassImp(AliITSPid)
6
7 //-----------------------------------------------------------
8 Float_t AliITSPid::qcorr(Float_t xc)
9 {
10     assert(0);
11   Float_t fcorr;
12   fcorr=( 0.766 +0.9692*xc -1.267*xc*xc )*( 1.-TMath::Exp(-xc*64.75) );
13   if(fcorr<=0.1)fcorr=0.1;
14 return qtot/fcorr;
15 }
16 //-----------------------------------------------------------
17 //PH #include "vector.h"
18 #include <vector>
19 #include <algorithm>
20 Float_t AliITSPid::qtrm(Int_t track)
21 {
22     TVector q(*( this->GetVec(track)  ));
23     Int_t nl=(Int_t)q(0);
24     if(nl<1)return 0.;
25     vector<float> vf(nl);
26     switch(nl){
27       case  1:q(6)=q(1); break;
28       case  2:q(6)=(q(1)+q(2))/2.; break;
29       default:
30         for(Int_t i=0;i<nl;i++){vf[i]=q(i+1);}
31         sort(vf.begin(),vf.end());
32         q(6)= (vf[0]+vf[1])/2.;
33         break;
34     }
35     for(Int_t i=0;i<nl;i++){q(i+1)=vf[i];} this->SetVec(track,q);
36     return (q(6));
37 }
38 //........................................................
39 Float_t AliITSPid::qtrm(Float_t qarr[6],Int_t narr)
40 {
41   Float_t q[6],qm;
42   Int_t nl,ml;
43   narr>6?ml=6:ml=narr;
44   nl=0; for(Int_t i=0;i<ml;i++){if(qarr[i]>0.){q[i]=qarr[i];nl++;}}
45   if(nl==0)return 0.;
46     vector<float> vf(nl);
47     switch(nl){
48       case  1:qm=q[0]; break;
49       case  2:qm=(q[0]+q[1])/2.; break;
50       default:
51         for(Int_t i=0;i<nl;i++){vf[i]=q[i];}
52         sort(vf.begin(),vf.end());
53         qm= (vf[0]+vf[1])/2.;
54         break;
55     }
56     return qm;
57 }
58 //-----------------------------------------------------------
59 //inline
60 Int_t   AliITSPid::wpik(Int_t nc,Float_t q)
61 {
62        return pion();   
63
64     Float_t qmpi,qmk,sigpi,sigk,dpi,dk,ppi,pk;
65     qmpi =cut[nc][1];
66     sigpi=cut[nc][2];
67     qmk  =cut[nc][3];
68     sigk =cut[nc][4];
69     Float_t dqpi=(q-qmpi)/sigpi;
70     Float_t dqk =(q-qmk )/sigk;
71     if( dqk<-1. )return pion();
72     dpi =TMath::Abs(dqpi);
73     dk  =TMath::Abs(dqk);
74     ppi =1.- TMath::Erf(dpi);  // +0.5;
75     pk  =1.- TMath::Erf(dk);   // +0.5;
76     Float_t rpik=ppi/(pk+0.0000001); 
77         cout<<"q,dqpi,dqk, wpik: ppi,pk,rpik="
78         <<q<<" "<<dqpi<<" "<<dqk<<" "<<ppi<<" "<<pk<<" "<<rpik<<endl;
79     if( rpik>=1000. ){return pion();}
80     if( rpik>0.001 ){fWk=1./(rpik+1.); fWpi=1.-fWk;return 0;}
81     return pion();    
82 }
83 //-----------------------------------------------------------
84 //inline
85 Int_t   AliITSPid::wpikp(Int_t nc,Float_t q)
86 {
87        return pion();   
88
89    Float_t qmpi,qmk,qmp,sigpi,sigk,sigp,ppi,pka,ppr,rppi,rpka;
90
91     qmpi =cut[nc][1];
92     sigpi=cut[nc][2];
93     qmk  =cut[nc][3];
94     sigk =cut[nc][4];
95     qmp  =cut[nc][5];
96     sigp =cut[nc][6];
97
98     ppi =TMath::Erf( TMath::Abs((q-qmpi)/sigpi) )+0.5;
99     pka =TMath::Erf( TMath::Abs((q-qmk )/sigk)  )+0.5;
100     ppr =TMath::Erf( TMath::Abs((q-qmp )/sigp)  )+0.5;
101
102     rppi=ppr/ppi;
103     rpka=ppr/pka;
104     Float_t rp;
105     if( rppi>rpka )  { rp=rpka; }
106                  else{ rp=rppi; }
107     if( rp>=1000. ){ return proton(); }
108     if( rp>0.001  ){ fWp=rp/(rp+1.);return proton(); }
109     
110     return 0;    
111 }
112 //-----------------------------------------------------------
113 Int_t   AliITSPid::GetPcode(TClonesArray* rps,Float_t pm)
114 {
115     return 0;    
116 }
117 //-----------------------------------------------------------
118 Int_t   AliITSPid::GetPcode(AliTPCtrack *track)
119 {
120       Double_t xk,par[5]; track->GetExternalParameters(xk,par);
121       Float_t phi=TMath::ASin(par[2]) + track->GetAlpha();
122       if (phi<-TMath::Pi()) phi+=2*TMath::Pi();
123       if (phi>=TMath::Pi()) phi-=2*TMath::Pi();
124       Float_t lam=TMath::ATan(par[3]); 
125       Float_t pt_1=TMath::Abs(par[4]);
126       Float_t mom=1./(pt_1*TMath::Cos(lam));
127       Float_t dedx=track->GetdEdx();
128     Int_t pcode=GetPcode(dedx/40.,mom);
129     cout<<"TPCtrack dedx,mom,pcode="<<dedx<<","<<mom<<","<<pcode<<endl;
130     return pcode?pcode:211;
131     }
132 //------------------------------------------------------------
133 /*
134 Int_t   AliITSPid::GetPcode(AliITSIOTrack *track)
135 {
136     Double_t px,py,pz;
137     px=track->GetPx();
138     py=track->GetPy();
139     pz=track->GetPz();
140     Float_t mom=TMath::Sqrt(px*px+py*py+pz*pz);
141 //???????????????????
142    // Float_t dedx=1.0;
143      Float_t dedx=track->GetdEdx();
144 //???????????????????    
145     Int_t pcode=GetPcode(dedx,mom);
146     cout<<"ITSV1 dedx,mom,pcode="<<dedx<<","<<mom<<","<<pcode<<endl;
147 return pcode?pcode:211;
148 }
149 */
150 //-----------------------------------------------------------
151 Int_t   AliITSPid::GetPcode(AliITStrackV2 *track)
152 {
153   if(track==0)return 0;
154   //track->Propagate(track->GetAlpha(),3.,0.1/65.19*1.848,0.1*1.848);
155       track->PropagateTo(3.,0.0028,65.19);
156
157       track->PropagateToVertex();
158     Double_t xk,par[5]; track->GetExternalParameters(xk,par);
159     Float_t lam=TMath::ATan(par[3]);
160     Float_t pt_1=TMath::Abs(par[4]);
161     Float_t mom=0.;
162     if( (pt_1*TMath::Cos(lam))!=0. ){ mom=1./(pt_1*TMath::Cos(lam)); }else{mom=0.;};
163     Float_t dedx=track->GetdEdx();
164     //cout<<"lam,pt_1,mom,dedx="<<lam<<","<<pt_1<<","<<mom<<","<<dedx<<endl;
165     Int_t pcode=GetPcode(dedx,mom);
166     //cout<<"ITS V2 dedx,mom,pcode="<<dedx<<","<<mom<<","<<pcode<<endl;
167 return pcode?pcode:211;
168 }
169 //-----------------------------------------------------------
170 Int_t   AliITSPid::GetPcode(Float_t q,Float_t pm)
171 {
172     fWpi=fWk=fWp=-1.;     fPcode=0;
173 //1)
174     if ( pm<=cut[1][0] )
175         { return pion(); }
176 //2)
177     if ( pm<=cut[2][0] )
178         { if( q<cut[2][2] ){ return pion(); } else { return  kaon();} }
179 //3)
180     if ( pm<=cut[3][0] )
181         if( q<cut[3][2])
182                 { return pion(); }
183              else
184                 { if ( q<=cut[3][5] ) {return kaon();} else {return proton();}}
185 //4)
186     if ( pm<=cut[4][0] )
187         if( q<cut[4][2] )
188                 { return pion(); }
189             else
190                 { if( q<=cut[4][4] ) {return kaon();} else {return proton(); }}
191 //5)
192     if ( pm<=cut[5][0] )
193         if ( q>cut[5][5] ) {return proton();} else {return wpik(5,q);};
194 //6)
195     if ( pm<=cut[6][0] )
196         if ( q>cut[6][5] ) {return proton();} else {return wpik(6,q);};
197 //7)
198     if ( pm<=cut[7][0] )
199         if ( q<=cut[7][5] ) {return fPcode;} else {return proton();};
200 //8)
201     if ( pm<=cut[8][0] )
202         if ( q<=cut[8][5] ) {return fPcode;} else {return proton();}; 
203 //9)
204     if ( pm<=cut[9][0] )
205         if ( q<=cut[9][5] ) {return fPcode;} else {return proton();};
206 //10)
207     if( pm<=cut[10][0] ){ return wpikp(10,q); }
208 //11)
209     if( pm<=cut[11][0] ){ return wpikp(11,q); }
210 //12)
211     if( pm<=cut[12][0] ){ return wpikp(12,q); }
212
213     return fPcode;    
214 }
215 //-----------------------------------------------------------
216 void    AliITSPid::SetCut(Int_t n,Float_t pm,Float_t pilo,Float_t pihi,
217                         Float_t klo,Float_t khi,Float_t plo,Float_t phi)
218 {
219     cut[n][0]=pm;
220     cut[n][1]=pilo;
221     cut[n][2]=pihi;
222     cut[n][3]=klo;
223     cut[n][4]=khi;
224     cut[n][5]=plo;
225     cut[n][6]=phi;
226     return ;    
227 }
228 //-----------------------------------------------------------
229 void AliITSPid::SetVec(Int_t ntrack,TVector info)
230 {
231 TClonesArray& arr=*trs;
232     new( arr[ntrack] ) TVector(info);
233 }
234 //-----------------------------------------------------------
235 TVector* AliITSPid::GetVec(Int_t ntrack)
236 {
237 TClonesArray& arr=*trs;
238     return (TVector*)arr[ntrack];
239 }
240 //-----------------------------------------------------------
241 void AliITSPid::SetEdep(Int_t track,Float_t Edep)
242 {
243     TVector xx(0,11);
244     if( ((TVector*)trs->At(track))->IsValid() )
245         {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
246     Int_t j=(Int_t)xx(0); if(j>4)return;
247     xx(++j)=Edep;xx(0)=j;
248     TClonesArray &arr=*trs;
249     new(arr[track])TVector(xx);
250 }
251 //-----------------------------------------------------------
252 void AliITSPid::SetPmom(Int_t track,Float_t Pmom)
253 {
254     TVector xx(0,11);
255     if( ((TVector*)trs->At(track))->IsValid() )
256         {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
257     xx(10)=Pmom;
258     TClonesArray &arr=*trs;
259     new(arr[track])TVector(xx);
260 }
261 //-----------------------------------------------------------
262 void AliITSPid::SetPcod(Int_t track,Int_t partcode)
263 {
264     TVector xx(0,11);
265     if( ((TVector*)trs->At(track))->IsValid() )
266         {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
267     if(xx(11)==0)
268         {xx(11)=partcode; mxtrs++;
269         TClonesArray &arr=*trs;
270         new(arr[track])TVector(xx);
271         }
272 }
273 //-----------------------------------------------------------
274 void AliITSPid::Print(Int_t track)
275 {cout<<mxtrs<<" tracks in AliITSPid obj."<<endl;
276     if( ((TVector*)trs->At(track))->IsValid() )
277         {TVector xx( *((TVector*)trs->At(track)) );
278          xx.Print();
279          }
280     else 
281         {cout<<"No data for track "<<track<<endl;return;}
282 }
283 //-----------------------------------------------------------
284 void AliITSPid::Tab(void)
285 {
286 if(trs->GetEntries()==0){cout<<"No entries in TAB"<<endl;return;}
287 cout<<"------------------------------------------------------------------------"<<endl;
288 cout<<"Nq"<<"   q1  "<<"   q2  "<<"   q3  "<<"   q4  "<<"   q5   "<<
289       " Qtrm    "    <<"  Wpi  "<<"  Wk   "<<"  Wp  "<<"Pmom  "<<endl;
290 cout<<"------------------------------------------------------------------------"<<endl;
291 for(Int_t i=0;i<trs->GetEntries();i++)
292 {
293   TVector xx( *((TVector*)trs->At(i)) );     
294     if( xx.IsValid() && xx(0)>0 )
295         {
296             TVector xx( *((TVector*)trs->At(i)) );
297             if(xx(0)>=2)
298                 {
299 //       1)Calculate Qtrm       
300                     xx(6)=(this->qtrm(i));
301
302                  }else{
303                      xx(6)=xx(1);
304                  }
305 //       2)Calculate Wpi,Wk,Wp
306             this->GetPcode(xx(6),xx(10)/1000.);
307             xx(7)=GetWpi();
308             xx(8)=GetWk();
309             xx(9)=GetWp();
310 //       3)Print table
311             if(xx(0)>0){
312                     cout<<xx(0)<<" ";
313                     for(Int_t j=1;j<11;j++){
314                         cout.width(7);cout.precision(5);cout<<xx(j);
315                     }
316                     cout<<endl;
317                 }
318 //        4)Update data in TVector
319             TClonesArray &arr=*trs;
320             new(arr[i])TVector(xx);      
321         }
322     else 
323       {/*cout<<"No data for track "<<i<<endl;*/}
324 }// End loop for tracks
325 }
326 void AliITSPid::Reset(void)
327 {
328   for(Int_t i=0;i<trs->GetEntries();i++){
329     TVector xx(0,11);
330     TClonesArray &arr=*trs;
331     new(arr[i])TVector(xx);
332   }
333 }
334 //-----------------------------------------------------------
335 AliITSPid::AliITSPid(Int_t ntrack)
336 {
337     trs = new TClonesArray("TVector",ntrack);
338     TClonesArray &arr=*trs;
339     for(Int_t i=0;i<ntrack;i++)new(arr[i])TVector(0,11);
340     mxtrs=0;
341 const int inf=10;
342 //         Ncut Pmom   pilo  pihi    klo    khi     plo    phi
343 //       cut[j] [0]    [1]    [2]    [3]    [4]     [5]    [6]
344 //----------------------------------------------------------------
345     SetCut(  1, 0.12 ,  0.  ,  0.  , inf  , inf   , inf  , inf  );
346     SetCut(  2, 0.20 ,  0.  ,  6.0 , 6.0  , inf   , inf  , inf  );
347     SetCut(  3, 0.30 ,  0.  ,  3.5 , 3.5  , 9.0   , 9.0  , inf  );
348     SetCut(  4, 0.41 ,  0.  ,  1.9 , 1.9  , 4.0   , 4.0  , inf  );
349 //----------------------------------------------------------------
350     SetCut(  5, 0.47 ,  1.  ,  0.12, 1.98 , 0.17  , 3.5  , inf  );
351     SetCut(  6, 0.53 ,  1.  ,  0.12, 1.75 , 0.16  , 3.0  , inf  );
352 //----------------------------------------------------------------    
353     SetCut(  7, 0.59 ,  0.  ,  0.  , 1.18 , 0.125 , 2.7  , inf  );
354     SetCut(  8, 0.65 ,  0.  ,  0.  , 1.18 , 0.125 , 2.5  , inf  );
355     SetCut(  9, 0.73 ,  0.  ,  0.  , 0.   , 0.125 , 2.0  , inf  );
356 //----------------------------------------------------------------    
357     SetCut( 10, 0.83 ,  0.  ,  0.  , 1.25 , 0.13  , 2.14 , 0.20 );
358     SetCut( 11, 0.93 ,  0.  ,  0.  , 1.18 , 0.125 , 1.88 , 0.18 );
359     SetCut( 12, 1.03 ,  0.  ,  0.  , 1.13 , 0.12  , 1.68 , 0.155);
360 }
361 //-----------------------------------------------------------
362