1 - Rename AliAnaMaker and AliAnaBaseClass to AliAnaPartCorrMaker and AliAnaPartCorrB...
[u/mrichter/AliRoot.git] / PWG4 / AliCaloPID.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15 /* $Id: AliCaloPID.cxx 21839 2007-10-29 13:49:42Z gustavo $ */
16
17 //_________________________________________________________________________
18 // Class for track/cluster acceptance selection
19 // Selection in Central barrel, EMCAL and PHOS
20 //                
21 //*-- Author: Gustavo Conesa (LNF-INFN) 
22 //////////////////////////////////////////////////////////////////////////////
23
24
25 // --- ROOT system ---
26 #include <TMath.h>
27 #include <TLorentzVector.h>
28 #include <TString.h>
29 #include <TFormula.h>
30   
31 //---- ANALYSIS system ----
32 #include "AliLog.h"
33 #include "AliCaloPID.h"
34 #include "AliAODCluster.h"
35
36 ClassImp(AliCaloPID)
37
38
39 //________________________________________________
40 AliCaloPID::AliCaloPID() : 
41   TObject(), fEMCALPhotonWeight(0.), fEMCALPi0Weight(0.),  
42   fEMCALElectronWeight(0.),  fEMCALChargeWeight(0.),
43   fEMCALNeutralWeight(0.),
44   fPHOSPhotonWeight(0.), fPHOSPi0Weight(0.),  
45   fPHOSElectronWeight(0.), fPHOSChargeWeight(0.) , 
46   fPHOSNeutralWeight(0.), fPHOSWeightFormula(0), 
47   fPHOSPhotonWeightFormula(0x0), fPHOSPi0WeightFormula(0x0) 
48 {
49   //Ctor
50
51   //Initialize parameters
52   InitParameters();
53 }
54
55 //____________________________________________________________________________
56 AliCaloPID::AliCaloPID(const AliCaloPID & pid) :   
57   TObject(pid), fEMCALPhotonWeight(pid.fEMCALPhotonWeight), 
58   fEMCALPi0Weight(pid.fEMCALPi0Weight), 
59   fEMCALElectronWeight(pid.fEMCALElectronWeight), 
60   fEMCALChargeWeight(pid.fEMCALChargeWeight), 
61   fEMCALNeutralWeight(pid.fEMCALNeutralWeight), 
62   fPHOSPhotonWeight(pid.fPHOSPhotonWeight),
63   fPHOSPi0Weight(pid.fPHOSPi0Weight),
64   fPHOSElectronWeight(pid.fPHOSElectronWeight), 
65   fPHOSChargeWeight(pid.fPHOSChargeWeight),
66   fPHOSNeutralWeight(pid.fPHOSNeutralWeight),
67   fPHOSWeightFormula(pid.fPHOSWeightFormula), 
68   fPHOSPhotonWeightFormula(pid.fPHOSPhotonWeightFormula), 
69   fPHOSPi0WeightFormula(pid.fPHOSPi0WeightFormula) 
70
71
72 {
73   // cpy ctor
74
75 }
76
77 //_________________________________________________________________________
78 AliCaloPID & AliCaloPID::operator = (const AliCaloPID & pid)
79 {
80   // assignment operator
81   
82   if(&pid == this) return *this;
83   
84   fEMCALPhotonWeight = pid. fEMCALPhotonWeight ;
85   fEMCALPi0Weight = pid.fEMCALPi0Weight ;
86   fEMCALElectronWeight = pid.fEMCALElectronWeight; 
87   fEMCALChargeWeight = pid.fEMCALChargeWeight;
88   fEMCALNeutralWeight = pid.fEMCALNeutralWeight;
89
90   fPHOSPhotonWeight = pid.fPHOSPhotonWeight ;
91   fPHOSPi0Weight = pid.fPHOSPi0Weight ;
92   fPHOSElectronWeight = pid.fPHOSElectronWeight; 
93   fPHOSChargeWeight = pid.fPHOSChargeWeight;
94   fPHOSNeutralWeight = pid.fPHOSNeutralWeight;
95
96   fPHOSWeightFormula       = pid.fPHOSWeightFormula; 
97   fPHOSPhotonWeightFormula = pid.fPHOSPhotonWeightFormula; 
98   fPHOSPi0WeightFormula    = pid.fPHOSPi0WeightFormula;
99
100   return *this;
101
102 }
103
104 //_________________________________
105 AliCaloPID::~AliCaloPID() {
106   //Dtor
107
108   if(fPHOSPhotonWeightFormula) delete  fPHOSPhotonWeightFormula ;
109   if(fPHOSPi0WeightFormula) delete  fPHOSPi0WeightFormula ;
110
111 }
112
113
114 //_______________________________________________________________
115 void AliCaloPID::InitParameters()
116 {
117   //Initialize the parameters of the PID.
118
119   fEMCALPhotonWeight = 0.8 ;
120   fEMCALPi0Weight = 0.5 ;
121   fEMCALElectronWeight = 0.8 ;
122   fEMCALChargeWeight = 0.5 ;
123   fEMCALNeutralWeight = 0.5 ;
124
125   fPHOSPhotonWeight = 0.75 ;
126   fPHOSPi0Weight = 0.8 ;
127   fPHOSElectronWeight = 0.5 ;
128   fPHOSChargeWeight = 0.5 ;
129   fPHOSNeutralWeight = 0.5 ;
130
131   //Formula to set the PID weight threshold for photon or pi0
132   fPHOSWeightFormula = kTRUE;
133   fPHOSPhotonWeightFormula = 
134     new TFormula("photonWeight","0.98*(x<40)+ 0.68*(x>=100)+(x>=40 && x<100)*(0.98+x*(6e-3)-x*x*(2e-04)+x*x*x*(1.1e-06))");
135   fPHOSPi0WeightFormula = 
136     new TFormula("pi0Weight","0.98*(x<65)+ 0.915*(x>=100)+(x>=65 && x-x*(1.95e-3)-x*x*(4.31e-05)+x*x*x*(3.61e-07))");
137 }
138
139
140 //________________________________________________________________
141 void AliCaloPID::Print(const Option_t * opt) const
142 {
143
144   //Print some relevant parameters set for the analysis
145   if(! opt)
146     return;
147
148   printf("***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
149   
150   printf("PHOS PID weight , photon %0.2f, pi0 %0.2f, e %0.2f, charge %0.2f, neutral %0.2f \n",  
151          fPHOSPhotonWeight,  fPHOSPi0Weight, 
152          fPHOSElectronWeight,  fPHOSChargeWeight,   fPHOSNeutralWeight) ; 
153   printf("EMCAL PID weight, photon %0.2f, pi0 %0.2f, e %0.2f, charge %0.2f, neutral %0.2f\n",   
154          fEMCALPhotonWeight,  fEMCALPi0Weight, 
155          fEMCALElectronWeight,  fEMCALChargeWeight,  fEMCALNeutralWeight) ; 
156   
157   printf("PHOS Parametrized weight on?  =     %d\n",  fPHOSWeightFormula) ; 
158 //   if(fPHOSWeightFormula){
159 //     printf(">>>>>>>>>>> Photon weight formula<<<<<<<<<<<<\n");
160 //     fPHOSPhotonWeightFormula->Print();
161 //     printf(">>>>>>>>>>> Pi0    weight formula<<<<<<<<<<<<\n");
162 //     fPHOSPhotonWeightFormula->Print();
163 //   }
164   printf(" \n");
165
166
167
168 //_______________________________________________________________
169 Int_t AliCaloPID::GetPdg(const TString calo, const Double_t * pid, const Float_t energy) const {
170   //Return most probable identity of the particle.
171   
172   if(!pid) AliFatal("pid pointer not initialized!!!");
173
174   Float_t wPh =  fPHOSPhotonWeight ;
175   Float_t wPi0 =  fPHOSPi0Weight ;
176   Float_t wE =  fPHOSElectronWeight ;
177   Float_t wCh =  fPHOSChargeWeight ;
178   Float_t wNe =  fPHOSNeutralWeight ;
179   
180   
181   if(calo == "PHOS" && fPHOSWeightFormula){
182     wPh  = fPHOSPhotonWeightFormula->Eval(energy) ;
183     wPi0 = fPHOSPi0WeightFormula->Eval(energy);
184   }
185   
186   if(calo == "EMCAL"){
187     
188     wPh  =  fEMCALPhotonWeight ;
189     wPi0 =  fEMCALPi0Weight ;
190     wE   =  fEMCALElectronWeight ;
191     wCh  =  fEMCALChargeWeight ;
192     wNe  =  fEMCALNeutralWeight ;
193     
194   }
195   
196 //   printf("PID: calo %s, ph %0.2f, pi0 %0.2f, el %0.2f, conv el %0.2f, hadrons: pion %0.2f, kaon %0.2f, proton %0.2f , neutron %0.2f, kaon %0.2f \n",
197 //       calo.Data(),pid[AliAODCluster::kPhoton], pid[AliAODCluster::kPi0],
198 //       pid[AliAODCluster::kElectron], pid[AliAODCluster::kEleCon],
199 //       pid[AliAODCluster::kPion], pid[AliAODCluster::kKaon], pid[AliAODCluster::kProton],
200 //       pid[AliAODCluster::kNeutron], pid[AliAODCluster::kKaon0]);
201
202   Int_t pdg = kNeutralUnknown ;
203   Float_t chargedHadronWeight = pid[AliAODCluster::kProton]+pid[AliAODCluster::kKaon]+
204     pid[AliAODCluster::kPion]+pid[AliAODCluster::kMuon];
205   Float_t neutralHadronWeight = pid[AliAODCluster::kNeutron]+pid[AliAODCluster::kKaon0];
206   Float_t allChargedWeight    = pid[AliAODCluster::kElectron]+pid[AliAODCluster::kEleCon]+ chargedHadronWeight;
207   Float_t allNeutralWeight    = pid[AliAODCluster::kPhoton]+pid[AliAODCluster::kPi0]+ neutralHadronWeight;
208   
209   //Select most probable ID
210   if(calo=="PHOS"){
211     if(pid[AliAODCluster::kPhoton] > wPh) pdg = kPhoton ;
212     else if(pid[AliAODCluster::kPi0] > wPi0) pdg = kPi0 ; 
213     else if(pid[AliAODCluster::kElectron] > wE)  pdg = kElectron ;
214     else if(pid[AliAODCluster::kEleCon] >  wE) pdg = kEleCon ;
215     else if(chargedHadronWeight > wCh) pdg = kChargedHadron ;  
216     else if(neutralHadronWeight > wNe) pdg = kNeutralHadron ; 
217     else if(allChargedWeight >  allNeutralWeight)
218       pdg = kChargedUnknown ; 
219     else 
220       pdg = kNeutralUnknown ;
221   }
222   else{//EMCAL
223     //Temporal solution, electrons and photons not differenciated
224     if(pid[AliAODCluster::kPhoton] + pid[AliAODCluster::kElectron]  > wPh) pdg = kPhoton ;
225     else if(pid[AliAODCluster::kPi0] > wPi0) pdg = kPi0 ; 
226     else if(chargedHadronWeight + neutralHadronWeight > wCh) pdg = kChargedHadron ;  
227     else if(neutralHadronWeight + chargedHadronWeight > wNe) pdg = kNeutralHadron ; 
228     else pdg =  kNeutralUnknown ;
229
230   }
231
232
233   //printf("Final Pdg: %d \n", pdg);
234   
235
236
237   return pdg ;
238   
239 }
240
241 //_______________________________________________________________
242 Int_t AliCaloPID::GetPdg(const TString calo, const TLorentzVector mom, const Double_t l0, 
243                          const Double_t l1, const Double_t disp, const Double_t tof, 
244                          const Double_t distCPV) const {
245   //Recalculated PID with all parameters
246   AliDebug(2,Form("Calorimeter %s, E %3.2f, l0 %3.2f, l1 %3.2f, disp %3.2f, tof %3.2f, distCPV %3.2f",
247                   calo.Data(),mom.E(),l0,l1,disp,tof,distCPV));
248
249   if(calo == "EMCAL") {
250     if(l0 < 0.25) return kPhoton ;
251     else return  kNeutralHadron ; 
252   }
253   
254   return  kNeutralHadron ; 
255   
256 }
257