]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/AliHFEpidEMCAL.cxx
Updated treatment of D0/D0bar mass assumption (Carlos)
[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.08833e+00,1.17837e+00,7.47923e-02}; 
202      double sigP[3] = {9.93208e-05,7.13074e-04,2.45145e-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] = {9.94183e-01,1.23952e+00,3.55571e-01}; 
210      double sigP[3] = {4.61207e-02,-3.39978e-02,4.26198e-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
216   //printf("eop cuts org; %g; %g ; %g\n",feopMim,feopMax,pt);
217
218      return maxCut;
219 }
220
221 Double_t AliHFEpidEMCAL::CalEopCutMim(const AliVParticle *const track, Int_t flageop) const
222 {
223  // mim nsig cuts for 10d
224   double mimCut = 0.0;
225   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
226   if(esdtrack==NULL)return mimCut;
227   double pt = esdtrack->Pt();
228
229   if(flageop<0.5) // real
230      { 
231       //printf("real"); 
232      double meanP[3] = {1.08833e+00,1.17837e+00,7.47923e-02}; 
233      double sigP[3] = {9.93208e-05,7.13074e-04,2.45145e-04}; 
234      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*pt); 
235      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*pt); 
236      mimCut = mean-3.0*sig;
237     }
238    else // MC
239     { 
240       //printf("MC"); 
241      double meanP[3] = {9.94183e-01,1.23952e+00,3.55571e-01}; 
242      double sigP[3] = {4.61207e-02,-3.39978e-02,4.26198e-01}; 
243      double mean = meanP[0]*tanh(meanP[1]+meanP[2]*pt); 
244      double sig = sigP[0]/tanh(sigP[1]+sigP[2]*pt); 
245      mimCut = mean-3.0*sig;
246     }
247      return mimCut;
248 }
249
250 //___________________________________________________________________________
251 Double_t AliHFEpidEMCAL::MomentumEnergyMatchV2(const AliVParticle *const track) const
252 { // Returns e/p & Rmatch
253
254   Double_t matchclsE = 9999.9;
255   double feop = -9999.9;
256
257   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
258   if(esdtrack==NULL)return feop;
259   const AliESDEvent *evt = esdtrack->GetESDEvent();
260
261    Int_t icl = esdtrack->GetEMCALcluster();
262
263    AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
264    if(!cluster->IsEMCAL()) {return feop;}
265
266        matchclsE = cluster->E();
267
268    if(matchclsE<9999.0) feop = matchclsE/esdtrack->P();
269
270    return feop;
271
272 }
273
274
275 /*
276 //____________________________________________________________________________________
277 Double_t AliHFEpidEMCAL::MomentumEnergyMatchV1(const AliVParticle *track) const
278 { // Returns e/p if an electron is matched
279
280   Float_t  clsPos[3];
281   Double_t trkPos[3];
282   Double_t matchclsE = 9999.9;
283
284   const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
285   AliESDEvent *evt = esdtrack->GetESDEvent();
286   Double_t  magF = evt->GetMagneticField();
287   Double_t magSign = 1.0;
288   if(magF<0)magSign = -1.0;
289   //printf("magF ; %g ; %g \n", magF,magSign);
290  
291   if (!TGeoGlobalMagField::Instance()->GetField()) {
292           printf("Loading field map...\n");
293           //AliMagF* field = new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG);
294           AliMagF* field = new AliMagF("Maps","Maps", magSign, magSign, AliMagF::k5kG); // for 10d
295           TGeoGlobalMagField::Instance()->SetField(field);
296                     }
297
298   AliEMCALTrack *emctrack = new AliEMCALTrack(*esdtrack);
299   Double_t fieldB[3]; 
300   emctrack->GetBxByBz(fieldB);
301   //printf("%g %g %g \n", fieldB[0], fieldB[1], fieldB[2]);
302
303   for(Int_t icl=0; icl<evt->GetNumberOfCaloClusters(); icl++)
304    {
305
306    AliVCluster *cluster = (AliVCluster*) evt->GetCaloCluster(icl);
307    if(!cluster->IsEMCAL()) continue;
308
309    cluster->GetPosition(clsPos);
310    if(!emctrack->PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) )  continue;
311    emctrack->GetXYZ(trkPos);
312
313    TVector3 clsPosVec(clsPos[0],clsPos[1],clsPos[2]);
314    TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
315
316    Double_t delEmcphi = clsPosVec.Phi()-trkPosVec.Phi();  // track cluster matching
317    Double_t delEmceta = clsPosVec.Eta()-trkPosVec.Eta();  // track cluster matching
318
319    double rmatch = sqrt(pow(delEmcphi,2)+pow(delEmceta,2));
320
321    if(rmatch<0.02)
322       {
323        matchclsE = cluster->E();
324       }
325   }
326    delete emctrack;
327
328    double feop = -9999.9;
329    if(matchclsE<9999) feop = matchclsE/esdtrack->P();
330
331    //   if(feop!=-9999.9)printf("%f\n",feop) ; 
332    return feop;
333
334 }
335 */
336