]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/hfe/AliHFEpidEMCAL.cxx
Update of the hfe package
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEpidEMCAL.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 //
16 // Class for EMCAL PID
17 // Implements the abstract base class AliHFEpidBase
18 // IsInitialized() does the PID decision with energy and 
19 // momentum matching (e/p) 
20 // 
21 // Authors:
22 //  Shingo Sakai 
23 //   
24 //
25 //
26 #include <TMath.h>
27 #include "AliESDInputHandler.h"
28 #include "AliESDpid.h"
29
30 #include "AliHFEdetPIDqa.h"
31 #include "AliHFEpidEMCAL.h"
32 #include "AliHFEpidQAmanager.h"
33
34 #include "AliHFEemcalPIDqa.h"
35 //#include "AliVCluster.h"
36 //#include "AliVCaloCells.h"
37 //#include "AliVEvent.h"
38 #include "AliLog.h"
39 #include "AliPID.h"
40 //#include "AliESDEvent.h"
41 //#include "AliESDtrack.h"
42 #include "AliHFEpidEMCAL.h"
43
44 ClassImp(AliHFEpidEMCAL)
45
46 //___________________________________________________________________
47 AliHFEpidEMCAL::AliHFEpidEMCAL():
48   AliHFEpidBase()
49   , fPID(NULL)
50   , feopMim(0.8)
51   , feopMax(1.4)
52 {
53   //
54   // Constructor
55   //
56
57
58 //___________________________________________________________________
59 AliHFEpidEMCAL::AliHFEpidEMCAL(const Char_t *name):
60   AliHFEpidBase(name)
61   , fPID(NULL)
62   , feopMim(0.8)
63   , feopMax(1.4)
64 {
65   //
66   // Constructor
67   //
68 }
69
70 //___________________________________________________________________
71 AliHFEpidEMCAL::AliHFEpidEMCAL(const AliHFEpidEMCAL &c):
72   AliHFEpidBase("")
73   , fPID(NULL)
74   , feopMim(0.8)
75   , feopMax(1.4)
76 {  
77   // 
78   // Copy operator
79   //
80
81   c.Copy(*this);
82 }
83 //___________________________________________________________________
84 AliHFEpidEMCAL &AliHFEpidEMCAL::operator=(const AliHFEpidEMCAL &ref){
85   //
86   // Assignment operator
87   //
88
89   if(this != &ref){
90     ref.Copy(*this);
91   }
92
93   return *this;
94 }
95 //___________________________________________________________________
96 AliHFEpidEMCAL::~AliHFEpidEMCAL(){
97   //
98   // Destructor
99   //
100   if(fPID) delete fPID;
101 }
102 //___________________________________________________________________
103 void AliHFEpidEMCAL::Copy(TObject &ref) const {
104   //
105   // Performs the copying of the object
106   //
107   AliHFEpidEMCAL &target = dynamic_cast<AliHFEpidEMCAL &>(ref);
108
109   target.fPID = fPID;          
110   target.feopMax = feopMax;
111   target.feopMim = feopMim;
112
113   AliHFEpidBase::Copy(ref);
114 }
115 //___________________________________________________________________
116 Bool_t AliHFEpidEMCAL::InitializePID(Int_t /*run*/){
117   //
118   // InitializePID: EMCAL experts have to implement code here
119   //
120   return kTRUE;
121 }
122
123 //___________________________________________________________________
124 Int_t AliHFEpidEMCAL::IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const
125 { //Function to a return a code indicating whether or not an electron candidate is selected
126   //
127   //
128   if(track==NULL)return 0;
129
130   if(!fkPIDResponse) return 0;
131   AliDebug(2, "PID object available");
132   // EMCal not fESDpid  (s.s Feb. 11)
133         
134   const AliVTrack *trk = dynamic_cast<const AliVTrack *>(track->GetRecTrack());
135   if (trk == NULL) return 0;
136   //AliHFEpidObject::AnalysisType_t anaType = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis : AliHFEpidObject::kAODanalysis;
137   if(!(trk->GetStatus() & AliESDtrack::kEMCALmatch)) return 0;
138   AliDebug(2, "Track Has EMCAL PID");
139   
140   //if(pidqa) 
141   pidqa->ProcessTrack(track, AliHFEpid::kEMCALpid, AliHFEdetPIDqa::kBeforePID);
142   // not QA for EMCal, will be added (s.s Feb. 11)
143
144
145      double feopMimCut = 0.0; 
146      double feopMaxCut = 0.0; 
147
148      feopMimCut = feopMim;
149      feopMaxCut = feopMax;
150
151      if(feopMax >900)  // not use fix cut
152        {
153         feopMimCut = CalEopCutMim(track->GetRecTrack(),0);
154         feopMaxCut = CalEopCutMax(track->GetRecTrack(),0); 
155        }
156      if(feopMax < -900)  // not use fix cut for MC
157        {
158         feopMimCut = CalEopCutMim(track->GetRecTrack(),1);
159         feopMaxCut = CalEopCutMax(track->GetRecTrack(),1); 
160        }
161
162   //printf("eop cuts org; %g; %g \n",feopMim,feopMax);
163   //printf("eop cuts ; %g; %g \n",feopMimCut,feopMaxCut);
164
165   Double_t eop = MomentumEnergyMatchV2(track->GetRecTrack()); // get eop (What is GetRecTrack ?)
166   AliDebug(2, Form("Energy - Momentum Matching e/p : %f", eop));
167   AliDebug(2, Form("E/p cut ; %g ; %g \n", feopMim,feopMax));
168   Int_t pdg = 0;
169   //if(eop>feopMim && eop<feopMax){
170   //if(eop>feopMim && eop<feopMax){
171   if(eop>feopMimCut && eop<feopMaxCut){
172     pdg = 11;
173     //printf("eop cuts ; %g; %g ; %g\n",feopMimCut,feopMaxCut,eop);
174     //if(pidqa) 
175     pidqa->ProcessTrack(track, AliHFEpid::kEMCALpid, AliHFEdetPIDqa::kAfterPID);
176   }
177   else
178   {
179    pdg = 211; // EMCal doesn't separate pi,k.p by e/p. return pion code as same as TRD
180   } 
181
182     AliDebug(1, Form("eID %g ; %d \n",eop,pdg));  
183     //printf("eID %g ; %d \n",eop,pdg);  
184
185   return pdg;
186 }
187
188
189 //__________________________________________________________________________
190 Double_t AliHFEpidEMCAL::CalEopCutMax(const AliVParticle *const track, Int_t flageop) const
191 {
192   double maxCut = 0.0;
193   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
194   if(esdtrack==NULL)return maxCut;
195   double Pt = esdtrack->Pt();
196
197   if(flageop<0.5)
198     {
199      double meanP[3] = {0.991,1.0819,0.235}; 
200      double sigP[3] = {6.52e-02,2.04e-01,3.34e-01}; 
201      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*Pt); 
202      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*Pt); 
203      maxCut = mean+3.0*sig; 
204     }
205   else
206     {
207      double meanP[3] = {0.99,1.299,0.35}; 
208      double sigP[3] = {4.11e-02,1.588e-01,2.664e-01}; 
209      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*Pt); 
210      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*Pt); 
211      maxCut = mean+3.0*sig; 
212     }
213      return maxCut;
214 }
215
216 Double_t AliHFEpidEMCAL::CalEopCutMim(const AliVParticle *const track, Int_t flageop) const
217 {
218   double mimCut = 0.0;
219   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
220   if(esdtrack==NULL)return mimCut;
221   double Pt = esdtrack->Pt();
222
223   if(flageop<0.5) // real
224      { 
225       //printf("real"); 
226      double meanP[3] = {0.991,1.0819,0.235}; 
227      double sigP[3] = {6.52e-02,2.04e-01,3.34e-01}; 
228      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*Pt); 
229      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*Pt); 
230      mimCut = mean-2.0*sig;
231     }
232    else // MC
233     { 
234       //printf("MC"); 
235      double meanP[3] = {0.99,1.299,0.35}; 
236      double sigP[3] = {4.11e-02,1.588e-01,2.664e-01}; 
237      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*Pt); 
238      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*Pt); 
239      mimCut = mean-2.0*sig;
240     }
241      return mimCut;
242 }
243
244 //___________________________________________________________________________
245 Double_t AliHFEpidEMCAL::MomentumEnergyMatchV2(const AliVParticle *const track) const
246 { // Returns e/p & Rmatch
247
248   Double_t matchclsE = 9999.9;
249   double feop = -9999.9;
250
251   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
252   if(esdtrack==NULL)return feop;
253   const AliESDEvent *evt = esdtrack->GetESDEvent();
254
255    Int_t icl = esdtrack->GetEMCALcluster();
256
257    AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
258    if(!cluster->IsEMCAL()) {return feop;}
259
260        matchclsE = cluster->E();
261   
262
263    if(matchclsE<9999.0) feop = matchclsE/esdtrack->P();
264
265    return feop;
266
267 }
268
269
270 /*
271 //____________________________________________________________________________________
272 Double_t AliHFEpidEMCAL::MomentumEnergyMatchV1(const AliVParticle *track) const
273 { // Returns e/p if an electron is matched
274
275   Float_t  clsPos[3];
276   Double_t trkPos[3];
277   Double_t matchclsE = 9999.9;
278
279   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
280   AliESDEvent *evt = esdtrack->GetESDEvent();
281   Double_t  magF = evt->GetMagneticField();
282   Double_t magSign = 1.0;
283   if(magF<0)magSign = -1.0;
284   //printf("magF ; %g ; %g \n", magF,magSign);
285  
286   if (!TGeoGlobalMagField::Instance()->GetField()) {
287           printf("Loading field map...\n");
288           //AliMagF* field = new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG);
289           AliMagF* field = new AliMagF("Maps","Maps", magSign, magSign, AliMagF::k5kG); // for 10d
290           TGeoGlobalMagField::Instance()->SetField(field);
291                     }
292
293   AliEMCALTrack *emctrack = new AliEMCALTrack(*esdtrack);
294   Double_t fieldB[3]; 
295   emctrack->GetBxByBz(fieldB);
296   //printf("%g %g %g \n", fieldB[0], fieldB[1], fieldB[2]);
297
298   for(Int_t icl=0; icl<evt->GetNumberOfCaloClusters(); icl++)
299    {
300
301    AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
302    if(!cluster->IsEMCAL()) continue;
303
304    cluster->GetPosition(clsPos);
305    if(!emctrack->PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) )  continue;
306    emctrack->GetXYZ(trkPos);
307
308    TVector3 clsPosVec(clsPos[0],clsPos[1],clsPos[2]);
309    TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
310
311    Double_t delEmcphi = clsPosVec.Phi()-trkPosVec.Phi();  // track cluster matching
312    Double_t delEmceta = clsPosVec.Eta()-trkPosVec.Eta();  // track cluster matching
313
314    double rmatch = sqrt(pow(delEmcphi,2)+pow(delEmceta,2));
315
316    if(rmatch<0.02)
317       {
318        matchclsE = cluster->E();
319       }
320   }
321    delete emctrack;
322
323    double feop = -9999.9;
324    if(matchclsE<9999) feop = matchclsE/esdtrack->P();
325
326    //   if(feop!=-9999.9)printf("%f\n",feop) ; 
327    return feop;
328
329 }
330 */
331