3 #include "AliITSIOTrack.h"
7 Float_t AliITSPid::qcorr(Float_t xc)
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;
16 Float_t AliITSPid::qtrm(Int_t track)
18 TVector q(*( this->GetVec(track) ));
23 Int_t nl=0; for(Int_t i=0;i<ml;i++){if(q(i)>fSigmin){vf[nl]=q(i+1);nl++;}}
26 case 1:q(6)=q(1); break;
27 case 2:q(6)=(q(1)+q(2))/2.; break;
29 for(int fi=0;fi<2;fi++){
31 do{ swap=0; float qmin=vf[fi];
32 for(int j=fi+1;j<nl;j++)
33 if(qmin>vf[j]){qmin=vf[j];vf[j]=vf[fi];vf[fi]=qmin;swap=1;};
36 q(6)= (vf[0]+vf[1])/2.;
39 for(Int_t i=0;i<nl;i++){q(i+1)=vf[i];} this->SetVec(track,q);
43 Float_t AliITSPid::qtrm(Float_t qarr[6],Int_t narr)
47 if(narr>0&&narr<7){ml=narr;}else{return 0;};
48 nl=0; for(Int_t i=0;i<ml;i++){if(qarr[i]>fSigmin){q[nl]=qarr[i];nl++;}}
51 case 1:qm=q[0]; break;
52 case 2:qm=(q[0]+q[1])/2.; break;
55 for(int fi=0;fi<2;fi++){
56 do{ swap=0; qmin=q[fi];
57 for(int j=fi+1;j<nl;j++)
58 if(qmin>q[j]){qmin=q[j];q[j]=q[fi];q[fi]=qmin;swap=1;};
66 //-----------------------------------------------------------
68 Int_t AliITSPid::wpik(Int_t nc,Float_t q)
72 Float_t qmpi,qmk,sigpi,sigk,dpi,dk,ppi,pk;
78 appi = aprob[0][nc-5];
80 // cout<<"qmpi,sigpi,qmk,sigk="<<qmpi<<" "<<sigpi<<" "<<qmk<<" "<<sigk<<endl;
81 // cout<<"appi,apk="<<appi<<","<<apk<<endl;
82 Float_t dqpi=(q-qmpi)/sigpi;
83 Float_t dqk =(q-qmk )/sigk;
84 if( dqk<-1. )return pion();
85 dpi =TMath::Abs(dqpi);
87 //ppi =1.- TMath::Erf(dpi); // +0.5;
88 //pk =1.- TMath::Erf(dk); // +0.5;
89 ppi=appi*TMath::Gaus(q,qmpi,sigpi)
90 /(appi*TMath::Gaus(q,qmpi,sigpi)+apk*TMath::Gaus(q,qmk,sigk));
91 pk = apk*TMath::Gaus(q,qmk, sigk )
92 /(appi*TMath::Gaus(q,qmpi,sigpi)+apk*TMath::Gaus(q,qmk,sigk));
94 // Float_t rpik=ppi/(pk+0.0000001);
95 // cout<<"q,dqpi,dqk, wpik: ppi,pk,rpik="
96 // <<q<<" "<<dqpi<<" "<<dqk<<" "<<ppi<<" "<<pk<<" "<<rpik<<endl;
98 fWp=0.; fWpi=ppi; fWk=pk;
99 if( pk>ppi){return kaon();}else{return pion();}
101 //-----------------------------------------------------------
103 Int_t AliITSPid::wpikp(Int_t nc,Float_t q)
105 Float_t qmpi,qmk,qmp,sigpi,sigk,sigp,ppi,pk,pp;
106 Float_t appi,apk,app;
115 //appi = apk = app = 1.;
116 appi = aprob[0][nc-5];
117 apk = aprob[1][nc-5];
118 app = aprob[2][nc-5];
120 //ppi =TMath::Erf( TMath::Abs((q-qmpi)/sigpi) )+0.5;
121 //pka =TMath::Erf( TMath::Abs((q-qmk )/sigk) )+0.5;
122 //ppr =TMath::Erf( TMath::Abs((q-qmp )/sigp) )+0.5;
124 ppi=appi*TMath::Gaus(q,qmpi,sigpi)
125 /( appi*TMath::Gaus(q,qmpi,sigpi)+apk*TMath::Gaus(q,qmk,sigk)+app*TMath::Gaus(q,qmp,sigp) );
126 pk = apk*TMath::Gaus(q,qmk, sigk )
127 /( appi*TMath::Gaus(q,qmpi,sigpi)+apk*TMath::Gaus(q,qmk,sigk)+app*TMath::Gaus(q,qmp,sigp) );
128 pp = app*TMath::Gaus(q,qmp, sigp )
129 /( appi*TMath::Gaus(q,qmpi,sigpi)+apk*TMath::Gaus(q,qmk,sigk)+app*TMath::Gaus(q,qmp,sigp) );
131 fWp=pp; fWpi=ppi; fWk=pk;
133 //cout<<" wpikp: mid,sig pi,k,p="<<qmpi<<" "<<sigpi<<"; "<<qmk<<" "<<sigk<<"; "
134 // <<qmp<<" "<<sigp<<"; "<<endl;
135 // cout<<" aprob: "<<appi<<" "<<apk<<" "<<app<<endl;
136 //cout<<" ppi,pk,pp="<<ppi<<" "<<pk<<" "<<pp<<endl;
138 if( ppi>pk&&ppi>pp ) { return pion(); }
139 if(pk>pp){return kaon();}else{return proton();}
141 //-----------------------------------------------------------
142 Int_t AliITSPid::GetPcode(TClonesArray* rps,Float_t pm)
146 //-----------------------------------------------------------
147 Int_t AliITSPid::GetPcode(AliTPCtrack *track)
149 Double_t xk,par[5]; track->GetExternalParameters(xk,par);
150 Float_t phi=TMath::ASin(par[2]) + track->GetAlpha();
151 if (phi<-TMath::Pi()) phi+=2*TMath::Pi();
152 if (phi>=TMath::Pi()) phi-=2*TMath::Pi();
153 Float_t lam=TMath::ATan(par[3]);
154 Float_t pt_1=TMath::Abs(par[4]);
155 Float_t mom=1./(pt_1*TMath::Cos(lam));
156 Float_t dedx=track->GetdEdx();
157 Int_t pcode=GetPcode(dedx/40.,mom);
158 // cout<<"TPCtrack dedx,mom,pcode="<<dedx<<","<<mom<<","<<pcode<<endl;
159 return pcode?pcode:211;
161 //------------------------------------------------------------
162 Int_t AliITSPid::GetPcode(AliITSIOTrack *track)
168 Float_t mom=TMath::Sqrt(px*px+py*py+pz*pz);
169 //???????????????????
171 Float_t dedx=track->GetdEdx();
172 //???????????????????
173 Int_t pcode=GetPcode(dedx,mom);
174 // cout<<"ITSV1 dedx,mom,pcode="<<dedx<<","<<mom<<","<<pcode<<endl;
175 return pcode?pcode:211;
177 //-----------------------------------------------------------
178 Int_t AliITSPid::GetPcode(AliITStrackV2 *track)
180 if(track==0)return 0;
181 // track->Propagate(track->GetAlpha(),3.,0.1/65.19*1.848,0.1*1.848);
182 track->PropagateTo(3.,0.0028,65.19);
183 track->PropagateToVertex();
184 Double_t xk,par[5]; track->GetExternalParameters(xk,par);
185 Float_t lam=TMath::ATan(par[3]);
186 Float_t pt_1=TMath::Abs(par[4]);
188 if( (pt_1*TMath::Cos(lam))!=0. ){ mom=1./(pt_1*TMath::Cos(lam)); }else{mom=0.;};
189 Float_t dedx=track->GetdEdx();
190 // cout<<"lam,pt_1,mom,dedx="<<lam<<","<<pt_1<<","<<mom<<","<<dedx<<endl;
191 Int_t pcode=GetPcode(dedx,mom);
192 // cout<<"ITS V2 dedx,mom,pcode="<<dedx<<","<<mom<<","<<pcode<<endl;
193 return pcode?pcode:211;
195 //-----------------------------------------------------------
196 Int_t AliITSPid::GetPcode(Float_t q,Float_t pm)
198 fWpi=fWk=fWp=0.; fPcode=0;
199 //1)---------------------- 0-120 MeV/c --------------
202 //2)----------------------120-200 Mev/c -------------
204 { if( q<cut[2][2] ){ return pion(); } else { return kaon();} }
205 //3)----------------------200-300 Mev/c -------------
210 { if ( q<=cut[3][5] ) {return kaon();} else {return proton();}}
211 //4)----------------------300-410 Mev/c -------------
216 { if( q<=cut[4][4] ) {return kaon();} else {return proton(); }}
217 //5)----------------------410-470 Mev/c -------------
219 if ( q>cut[5][5] ) {return proton();} else {return wpik(5,q);};
220 //6)----------------------470-530 Mev/c -------------
222 if ( q>cut[6][5] ) {return proton();} else {return wpik(6,q);};
223 //7)----------------------530-590 Mev/c -------------
225 if ( q<=cut[7][5] ) {return wpik(7,q);} else {return proton();};
226 //8)----------------------590-650 Mev/c -------------
228 if ( q<=cut[8][5] ) {return wpik(8,q);} else {return proton();};
229 //9)----------------------650-730 Mev/c -------------
231 if ( q<=cut[9][5] ) {return wpik(9,q);} else {return proton();};
232 //10)----------------------730-830 Mev/c -------------
233 if( pm<=cut[10][0] ){ return wpikp(10,q); }
234 //11)----------------------830-930 Mev/c -------------
235 if( pm<=cut[11][0] ){ return wpikp(11,q); }
236 //12)----------------------930-1030 Mev/c -------------
237 if( pm<=cut[12][0] ){ return wpikp(12,q); }
241 //-----------------------------------------------------------
242 void AliITSPid::SetCut(Int_t n,Float_t pm,Float_t pilo,Float_t pihi,
243 Float_t klo,Float_t khi,Float_t plo,Float_t phi)
254 //------------------------------------------------------------
255 void AliITSPid::SetVec(Int_t ntrack,TVector info)
257 TClonesArray& arr=*trs;
258 new( arr[ntrack] ) TVector(info);
260 //-----------------------------------------------------------
261 TVector* AliITSPid::GetVec(Int_t ntrack)
263 TClonesArray& arr=*trs;
264 return (TVector*)arr[ntrack];
266 //-----------------------------------------------------------
267 void AliITSPid::SetEdep(Int_t track,Float_t Edep)
270 if( ((TVector*)trs->At(track))->IsValid() )
271 {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
272 Int_t j=(Int_t)xx(0); if(j>4)return;
273 xx(++j)=Edep;xx(0)=j;
274 TClonesArray &arr=*trs;
275 new(arr[track])TVector(xx);
277 //-----------------------------------------------------------
278 void AliITSPid::SetPmom(Int_t track,Float_t Pmom)
281 if( ((TVector*)trs->At(track))->IsValid() )
282 {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
284 TClonesArray &arr=*trs;
285 new(arr[track])TVector(xx);
287 //-----------------------------------------------------------
288 void AliITSPid::SetPcod(Int_t track,Int_t partcode)
291 if( ((TVector*)trs->At(track))->IsValid() )
292 {TVector yy( *((TVector*)trs->At(track)) );xx=yy; }
294 {xx(11)=partcode; mxtrs++;
295 TClonesArray &arr=*trs;
296 new(arr[track])TVector(xx);
299 //-----------------------------------------------------------
300 void AliITSPid::Print(Int_t track)
301 {cout<<mxtrs<<" tracks in AliITSPid obj."<<endl;
302 if( ((TVector*)trs->At(track))->IsValid() )
303 {TVector xx( *((TVector*)trs->At(track)) );
307 {cout<<"No data for track "<<track<<endl;return;}
309 //-----------------------------------------------------------
310 void AliITSPid::Tab(void)
312 if(trs->GetEntries()==0){cout<<"No entries in TAB"<<endl;return;}
313 cout<<"------------------------------------------------------------------------"<<endl;
314 cout<<"Nq"<<" q1 "<<" q2 "<<" q3 "<<" q4 "<<" q5 "<<
315 " Qtrm " <<" Wpi "<<" Wk "<<" Wp "<<"Pmom "<<endl;
316 cout<<"------------------------------------------------------------------------"<<endl;
317 for(Int_t i=0;i<trs->GetEntries();i++)
319 TVector xx( *((TVector*)trs->At(i)) );
320 if( xx.IsValid() && xx(0)>0 )
322 TVector xx( *((TVector*)trs->At(i)) );
326 xx(6)=(this->qtrm(i));
331 // 2)Calculate Wpi,Wk,Wp
332 this->GetPcode(xx(6),xx(10)/1000.);
339 for(Int_t j=1;j<11;j++){
340 if(i<7){ cout.width(7);cout.precision(4);cout<<xx(j);}
341 if(i>7){ cout.width(7);cout.precision(5);cout<<xx(j);}
345 // 4)Update data in TVector
346 TClonesArray &arr=*trs;
347 new(arr[i])TVector(xx);
350 {/*cout<<"No data for track "<<i<<endl;*/}
351 }// End loop for tracks
353 void AliITSPid::Reset(void)
355 for(Int_t i=0;i<trs->GetEntries();i++){
357 TClonesArray &arr=*trs;
358 new(arr[i])TVector(xx);
361 //-----------------------------------------------------------
362 AliITSPid::AliITSPid(Int_t ntrack)
365 trs = new TClonesArray("TVector",ntrack);
366 TClonesArray &arr=*trs;
367 for(Int_t i=0;i<ntrack;i++)new(arr[i])TVector(0,11);
370 // Ncut Pmom pilo pihi klo khi plo phi
371 // cut[j] [0] [1] [2] [3] [4] [5] [6]
372 //----------------------------------------------------------------
373 SetCut( 1, 0.12 , 0. , 0. , inf , inf , inf , inf );
374 SetCut( 2, 0.20 , 0. , 6.0 , 6.0 , inf , inf , inf );
375 SetCut( 3, 0.30 , 0. , 3.5 , 3.5 , 9.0 , 9.0 , inf );
376 SetCut( 4, 0.41 , 0. , 1.9 , 1.9 , 4.0 , 4.0 , inf );
377 //----------------------------------------------------------------
378 SetCut( 5, 0.47 , 0.935, 0.139, 1.738 , 0.498 , 3.5 , inf ); //410-470
379 SetCut( 6, 0.53 , 0.914, 0.136, 1.493 , 0.436 , 3.0 , inf ); //470-530
380 //----------------------------------------------------------------
381 SetCut( 7, 0.59 , 0.895, 0.131, 1.384 , 0.290 , 2.7 , inf ); //530-590
382 SetCut( 8, 0.65 , 0.887, 0.121, 1.167 , 0.287 , 2.5 , inf ); //590-650
383 SetCut( 9, 0.73 , 0.879, 0.120, 1.153 , 0.257 , 2.0 , inf ); //650-730
384 //----------------------------------------------------------------
385 SetCut( 10, 0.83 , 0.880, 0.126, 1.164 , 0.204 , 2.308 , 0.297 ); //730-830
386 SetCut( 11, 0.93 , 0.918, 0.145, 1.164 , 0.204 , 2.00 , 0.168 ); //830-930
387 SetCut( 12, 1.03 , 0.899, 0.128, 1.164 , 0.204 ,1.80 , 0.168);
388 //------------------------ pi,K ---------------------
389 aprob[0][0]=1212; aprob[1][0]=33.; // aprob[0][i] - const for pions,cut[i+5]
390 aprob[0][1]=1022; aprob[1][1]=46.2 ; // aprob[1][i] - kaons
391 //---------------------------------------------------
392 aprob[0][2]= 889.7; aprob[1][2]=66.58; aprob[2][2]=14.53;
393 aprob[0][3]= 686.; aprob[1][3]=88.8; aprob[2][3]=19.27;
394 aprob[0][4]= 697.; aprob[1][4]=125.6; aprob[2][4]=28.67;
395 //------------------------ pi,K,p -------------------
396 aprob[0][5]= 633.7; aprob[1][5]=100.1; aprob[2][5]=37.99; // aprob[2][i] - protons
397 aprob[0][6]= 469.5; aprob[1][6]=20.74; aprob[2][6]=25.43;
398 aprob[0][7]= 355.; aprob[1][7]=
399 355.*(20.74/469.5); aprob[2][7]=34.08;
401 //-----------------------------------------------------------