]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/AliHFEpidEMCAL.cxx
Transition PWG3 --> PWGHF
[u/mrichter/AliRoot.git] / PWGHF / 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  // max nSig cuts for 10d
193
194   double maxCut = 0.0;
195   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
196   if(esdtrack==NULL)return maxCut;
197   double pt = esdtrack->Pt();
198
199   if(flageop<0.5)
200     { //<--- new para for updated non-liniarity
201      double meanP[3] = {1.056,1.169,0.1339}; 
202      double sigP[3] = {3.37e-05,1.298e-04,1.403e-04}; 
203      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*pt); 
204      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*pt); 
205      maxCut = mean+3.0*sig; 
206     }
207   else
208     {
209      double meanP[3] = {0.99,1.299,0.35}; 
210      double sigP[3] = {4.11e-02,1.588e-01,2.664e-01}; 
211      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*pt); 
212      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*pt); 
213      maxCut = mean+3.0*sig; 
214     }
215      return maxCut;
216 }
217
218 Double_t AliHFEpidEMCAL::CalEopCutMim(const AliVParticle *const track, Int_t flageop) const
219 {
220  // mim nsig cuts for 10d
221   double mimCut = 0.0;
222   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
223   if(esdtrack==NULL)return mimCut;
224   double pt = esdtrack->Pt();
225
226   if(flageop<0.5) // real
227      { 
228       //printf("real"); 
229      double meanP[3] = {1.056,1.169,0.1339}; 
230      double sigP[3] = {3.37e-05,1.298e-04,1.403e-04}; 
231      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*pt); 
232      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*pt); 
233      mimCut = mean-2.0*sig;
234     }
235    else // MC
236     { 
237       //printf("MC"); 
238      double meanP[3] = {0.99,1.299,0.35}; 
239      double sigP[3] = {4.11e-02,1.588e-01,2.664e-01}; 
240      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*pt); 
241      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*pt); 
242      mimCut = mean-2.0*sig;
243     }
244      return mimCut;
245 }
246
247 //___________________________________________________________________________
248 Double_t AliHFEpidEMCAL::MomentumEnergyMatchV2(const AliVParticle *const track) const
249 { // Returns e/p & Rmatch
250
251   Double_t matchclsE = 9999.9;
252   double feop = -9999.9;
253
254   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
255   if(esdtrack==NULL)return feop;
256   const AliESDEvent *evt = esdtrack->GetESDEvent();
257
258    Int_t icl = esdtrack->GetEMCALcluster();
259
260    AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
261    if(!cluster->IsEMCAL()) {return feop;}
262
263        matchclsE = cluster->E();
264
265    if(matchclsE<9999.0) feop = matchclsE/esdtrack->P();
266
267    return feop;
268
269 }
270
271
272 /*
273 //____________________________________________________________________________________
274 Double_t AliHFEpidEMCAL::MomentumEnergyMatchV1(const AliVParticle *track) const
275 { // Returns e/p if an electron is matched
276
277   Float_t  clsPos[3];
278   Double_t trkPos[3];
279   Double_t matchclsE = 9999.9;
280
281   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
282   AliESDEvent *evt = esdtrack->GetESDEvent();
283   Double_t  magF = evt->GetMagneticField();
284   Double_t magSign = 1.0;
285   if(magF<0)magSign = -1.0;
286   //printf("magF ; %g ; %g \n", magF,magSign);
287  
288   if (!TGeoGlobalMagField::Instance()->GetField()) {
289           printf("Loading field map...\n");
290           //AliMagF* field = new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG);
291           AliMagF* field = new AliMagF("Maps","Maps", magSign, magSign, AliMagF::k5kG); // for 10d
292           TGeoGlobalMagField::Instance()->SetField(field);
293                     }
294
295   AliEMCALTrack *emctrack = new AliEMCALTrack(*esdtrack);
296   Double_t fieldB[3]; 
297   emctrack->GetBxByBz(fieldB);
298   //printf("%g %g %g \n", fieldB[0], fieldB[1], fieldB[2]);
299
300   for(Int_t icl=0; icl<evt->GetNumberOfCaloClusters(); icl++)
301    {
302
303    AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
304    if(!cluster->IsEMCAL()) continue;
305
306    cluster->GetPosition(clsPos);
307    if(!emctrack->PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) )  continue;
308    emctrack->GetXYZ(trkPos);
309
310    TVector3 clsPosVec(clsPos[0],clsPos[1],clsPos[2]);
311    TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
312
313    Double_t delEmcphi = clsPosVec.Phi()-trkPosVec.Phi();  // track cluster matching
314    Double_t delEmceta = clsPosVec.Eta()-trkPosVec.Eta();  // track cluster matching
315
316    double rmatch = sqrt(pow(delEmcphi,2)+pow(delEmceta,2));
317
318    if(rmatch<0.02)
319       {
320        matchclsE = cluster->E();
321       }
322   }
323    delete emctrack;
324
325    double feop = -9999.9;
326    if(matchclsE<9999) feop = matchclsE/esdtrack->P();
327
328    //   if(feop!=-9999.9)printf("%f\n",feop) ; 
329    return feop;
330
331 }
332 */
333