Inline declaration eliminiated to avoid problems with GCC on RH7.1+
[u/mrichter/AliRoot.git] / ITS / AliITSPid.cxx
1 #include "AliITSPid.h"
2 #include "TMath.h"
3 #include <iostream.h>
4 ClassImp(AliITSPid)
5
6 //-----------------------------------------------------------
7 Float_t AliITSPid::qcorr(Float_t xc)
8 {
9     assert(0);
10   Float_t fcorr;
11   fcorr=( 0.766 +0.9692*xc -1.267*xc*xc )*( 1.-TMath::Exp(-xc*64.75) );
12   if(fcorr<=0.1)fcorr=0.1;
13 return qtot/fcorr;
14 }
15
16 //-----------------------------------------------------------
17 #include "vector.h"
18 #include <algorithm>
19 Float_t AliITSPid::qtrm(Int_t track)
20 {
21     TVector q(*( this->GetVec(track)  ));
22     Int_t nl=(Int_t)q(0);
23     if(nl<1)return 0.;
24     vector<float> vf(nl);
25     switch(nl){
26       case  1:q(6)=q(1); break;
27       case  2:q(6)=(q(1)+q(2))/2.; break;
28       default:
29         for(Int_t i=0;i<nl;i++){vf[i]=q(i+1);}
30         sort(vf.begin(),vf.end());
31         q(6)= (vf[0]+vf[1])/2.;
32         break;
33     }
34     for(Int_t i=0;i<nl;i++){q(i+1)=vf[i];} this->SetVec(track,q);
35     return (q(6));
36 }
37 //-----------------------------------------------------------
38 Int_t   AliITSPid::wpik(Int_t nc,Float_t q)
39 {
40        return pion();   
41
42     Float_t qmpi,qmk,sigpi,sigk,dpi,dk,ppi,pk;
43     qmpi =cut[nc][1];
44     sigpi=cut[nc][2];
45     qmk  =cut[nc][3];
46     sigk =cut[nc][4];
47     Float_t dqpi=(q-qmpi)/sigpi;
48     Float_t dqk =(q-qmk )/sigk;
49     if( dqk<-1. )return pion();
50     dpi =fabs(dqpi);
51     dk  =fabs(dqk);
52     ppi =1.- TMath::Erf(dpi);  // +0.5;
53     pk  =1.- TMath::Erf(dk);   // +0.5;
54     Float_t rpik=ppi/(pk+0.0000001); 
55         cout<<"q,dqpi,dqk, wpik: ppi,pk,rpik="
56         <<q<<" "<<dqpi<<" "<<dqk<<" "<<ppi<<" "<<pk<<" "<<rpik<<endl;
57     if( rpik>=1000. ){return pion();}
58     if( rpik>0.001 ){fWk=1./(rpik+1.); fWpi=1.-fWk;return 0;}
59     return pion();    
60 }
61 //-----------------------------------------------------------
62 Int_t   AliITSPid::wpikp(Int_t nc,Float_t q)
63 {
64        return pion();   
65
66    Float_t qmpi,qmk,qmp,sigpi,sigk,sigp,ppi,pka,ppr,rppi,rpka;
67
68     qmpi =cut[nc][1];
69     sigpi=cut[nc][2];
70     qmk  =cut[nc][3];
71     sigk =cut[nc][4];
72     qmp  =cut[nc][5];
73     sigp =cut[nc][6];
74
75     ppi =TMath::Erf( TMath::Abs((q-qmpi)/sigpi) )+0.5;
76     pka =TMath::Erf( TMath::Abs((q-qmk )/sigk)  )+0.5;
77     ppr =TMath::Erf( TMath::Abs((q-qmp )/sigp)  )+0.5;
78
79     rppi=ppr/ppi;
80     rpka=ppr/pka;
81     Float_t rp;
82     if( rppi>rpka )  { rp=rpka; }
83                  else{ rp=rppi; }
84     if( rp>=1000. ){ return proton(); }
85     if( rp>0.001  ){ fWp=rp/(rp+1.);return proton(); }
86     
87     return 0;    
88 }
89 //-----------------------------------------------------------
90 Int_t   AliITSPid::GetPcode(TClonesArray* rps,Float_t pm)
91 {
92     return 0;    
93 }
94 //-----------------------------------------------------------
95 Int_t   AliITSPid::GetPcode(Float_t q,Float_t pm)
96 {
97     fWpi=fWk=fWp=-1.;     fPcode=0;
98 //1)
99     if ( pm<=cut[1][0] )
100         { return pion(); }
101 //2)
102     if ( pm<=cut[2][0] )
103         { if( q<cut[2][2] ){ return pion(); } else { return  kaon();} }
104 //3)
105     if ( pm<=cut[3][0] )
106         if( q<cut[3][2])
107                 { return pion(); }
108              else
109                 { if ( q<=cut[3][5] ) {return kaon();} else {return proton();}}
110 //4)
111     if ( pm<=cut[4][0] )
112         if( q<cut[4][2] )
113                 { return pion(); }
114             else
115                 { if( q<=cut[4][4] ) {return kaon();} else {return proton(); }}
116 //5)
117     if ( pm<=cut[5][0] )
118         if ( q>cut[5][5] ) {return proton();} else {return wpik(5,q);};
119 //6)
120     if ( pm<=cut[6][0] )
121         if ( q>cut[6][5] ) {return proton();} else {return wpik(6,q);};
122 //7)
123     if ( pm<=cut[7][0] )
124         if ( q<=cut[7][5] ) {return fPcode;} else {return proton();};
125 //8)
126     if ( pm<=cut[8][0] )
127         if ( q<=cut[8][5] ) {return fPcode;} else {return proton();}; 
128 //9)
129     if ( pm<=cut[9][0] )
130         if ( q<=cut[9][5] ) {return fPcode;} else {return proton();};
131 //10)
132     if( pm<=cut[10][0] ){ return wpikp(10,q); }
133 //11)
134     if( pm<=cut[11][0] ){ return wpikp(11,q); }
135 //12)
136     if( pm<=cut[12][0] ){ return wpikp(12,q); }
137
138     return fPcode;    
139 }
140 //-----------------------------------------------------------
141 void    AliITSPid::SetCut(Int_t n,Float_t pm,Float_t pilo,Float_t pihi,
142                         Float_t klo,Float_t khi,Float_t plo,Float_t phi)
143 {
144     cut[n][0]=pm;
145     cut[n][1]=pilo;
146     cut[n][2]=pihi;
147     cut[n][3]=klo;
148     cut[n][4]=khi;
149     cut[n][5]=plo;
150     cut[n][6]=phi;
151     return ;    
152 }
153 //-----------------------------------------------------------
154 void AliITSPid::SetVec(Int_t ntrack,TVector info)
155 {
156 TClonesArray& arr=*trs;
157     new( arr[ntrack] ) TVector(info);
158 }
159 //-----------------------------------------------------------
160 TVector* AliITSPid::GetVec(Int_t ntrack)
161 {
162 TClonesArray& arr=*trs;
163     return (TVector*)arr[ntrack];
164 }
165 //-----------------------------------------------------------
166 void AliITSPid::SetEdep(Int_t track,Float_t Edep)
167 {
168     TVector xx(0,11);
169     if( ((TVector*)trs->At(track))->IsValid() )
170         {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
171     Int_t j=(Int_t)xx(0); if(j>4)return;
172     xx(++j)=Edep;xx(0)=j;
173     TClonesArray &arr=*trs;
174     new(arr[track])TVector(xx);
175 }
176 //-----------------------------------------------------------
177 void AliITSPid::SetPmom(Int_t track,Float_t Pmom)
178 {
179     TVector xx(0,11);
180     if( ((TVector*)trs->At(track))->IsValid() )
181         {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
182     xx(10)=Pmom;
183     TClonesArray &arr=*trs;
184     new(arr[track])TVector(xx);
185 }
186 //-----------------------------------------------------------
187 void AliITSPid::SetPcod(Int_t track,Int_t partcode)
188 {
189     TVector xx(0,11);
190     if( ((TVector*)trs->At(track))->IsValid() )
191         {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
192     if(xx(11)==0)
193         {xx(11)=partcode; mxtrs++;
194         TClonesArray &arr=*trs;
195         new(arr[track])TVector(xx);
196         }
197 }
198 //-----------------------------------------------------------
199 void AliITSPid::Print(Int_t track)
200 {cout<<mxtrs<<" tracks in AliITSPid obj."<<endl;
201     if( ((TVector*)trs->At(track))->IsValid() )
202         {TVector xx( *((TVector*)trs->At(track)) );
203          xx.Print();
204          }
205     else 
206         {cout<<"No data for track "<<track<<endl;return;}
207 }
208 //-----------------------------------------------------------
209 void AliITSPid::Tab(void)
210 {
211 if(trs->GetEntries()==0){cout<<"No entries in TAB"<<endl;return;}
212 cout<<"------------------------------------------------------------------------"<<endl;
213 cout<<"Nq"<<"   q1  "<<"   q2  "<<"   q3  "<<"   q4  "<<"   q5   "<<
214       " Qtrm    "    <<"  Wpi  "<<"  Wk   "<<"  Wp  "<<"Pmom  "<<endl;
215 cout<<"------------------------------------------------------------------------"<<endl;
216 for(Int_t i=0;i<trs->GetEntries();i++)
217 {
218   TVector xx( *((TVector*)trs->At(i)) );     
219     if( xx.IsValid() && xx(0)>0 )
220         {
221             TVector xx( *((TVector*)trs->At(i)) );
222             if(xx(0)>=2)
223                 {
224 //       1)Calculate Qtrm       
225                     xx(6)=(this->qtrm(i));
226
227                  }else{
228                      xx(6)=xx(1);
229                  }
230 //       2)Calculate Wpi,Wk,Wp
231             this->GetPcode(xx(6),xx(10)/1000.);
232             xx(7)=GetWpi();
233             xx(8)=GetWk();
234             xx(9)=GetWp();
235 //       3)Print table
236             if(xx(0)>0){
237                     cout<<xx(0)<<" ";
238                     for(Int_t j=1;j<11;j++){
239                         cout.width(7);cout.precision(5);cout<<xx(j);
240                     }
241                     cout<<endl;
242                 }
243 //        4)Update data in TVector
244             TClonesArray &arr=*trs;
245             new(arr[i])TVector(xx);      
246         }
247     else 
248       {/*cout<<"No data for track "<<i<<endl;*/}
249 }// End loop for tracks
250 }
251 void AliITSPid::Reset(void)
252 {
253   for(Int_t i=0;i<trs->GetEntries();i++){
254     TVector xx(0,11);
255     TClonesArray &arr=*trs;
256     new(arr[i])TVector(xx);
257   }
258 }
259 //-----------------------------------------------------------
260 AliITSPid::AliITSPid(Int_t ntrack)
261 {
262     trs = new TClonesArray("TVector",ntrack);
263     TClonesArray &arr=*trs;
264     for(Int_t i=0;i<ntrack;i++)new(arr[i])TVector(0,11);
265     mxtrs=0;
266 const int inf=10;
267 //         Ncut Pmom   pilo  pihi    klo    khi     plo    phi
268 //       cut[j] [0]    [1]    [2]    [3]    [4]     [5]    [6]
269 //----------------------------------------------------------------
270     SetCut(  1, 0.12 ,  0.  ,  0.  , inf  , inf   , inf  , inf  );
271     SetCut(  2, 0.20 ,  0.  ,  6.0 , 6.0  , inf   , inf  , inf  );
272     SetCut(  3, 0.30 ,  0.  ,  3.5 , 3.5  , 9.0   , 9.0  , inf  );
273     SetCut(  4, 0.41 ,  0.  ,  1.9 , 1.9  , 4.0   , 4.0  , inf  );
274 //----------------------------------------------------------------
275     SetCut(  5, 0.47 ,  1.  ,  0.12, 1.98 , 0.17  , 3.5  , inf  );
276     SetCut(  6, 0.53 ,  1.  ,  0.12, 1.75 , 0.16  , 3.0  , inf  );
277 //----------------------------------------------------------------    
278     SetCut(  7, 0.59 ,  0.  ,  0.  , 1.18 , 0.125 , 2.7  , inf  );
279     SetCut(  8, 0.65 ,  0.  ,  0.  , 1.18 , 0.125 , 2.5  , inf  );
280     SetCut(  9, 0.73 ,  0.  ,  0.  , 0.   , 0.125 , 2.0  , inf  );
281 //----------------------------------------------------------------    
282     SetCut( 10, 0.83 ,  0.  ,  0.  , 1.25 , 0.13  , 2.14 , 0.20 );
283     SetCut( 11, 0.93 ,  0.  ,  0.  , 1.18 , 0.125 , 1.88 , 0.18 );
284     SetCut( 12, 1.03 ,  0.  ,  0.  , 1.13 , 0.12  , 1.68 , 0.155);
285 }
286 //-----------------------------------------------------------
287