51f7f1113184663d723f565e2517db1de9e86787
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEV0pidMC.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 to benchmark the V0 pid capabilties
17 // runs over reconstructed V0 candidates and uses MC information for 
18 // further analysis [purity, PID perfortmance]
19 //
20 // authors:
21 //    Matus Kalisky <matus.kalisky@cern.ch>
22 //
23
24 #include "TIterator.h"
25
26 #include "AliVParticle.h"
27 #include "AliESDtrack.h"
28 #include "AliMCParticle.h"
29 #include "AliMCEvent.h"
30
31 #include "AliHFEcollection.h"
32
33 #include "AliHFEV0pidMC.h"
34 ClassImp(AliHFEV0pidMC)
35
36 //____________________________________________________________
37   AliHFEV0pidMC::AliHFEV0pidMC():
38     fMC(0x0)
39     , fColl(NULL)
40     , fV0cuts(NULL)
41 {
42   //
43   // default constructor
44   //
45
46 }
47 //____________________________________________________________
48 AliHFEV0pidMC::~AliHFEV0pidMC(){
49   //
50   // destructor
51   //
52   if (fColl) delete fColl;
53   //if (fV0cuts) delete fV0cuts;
54 }
55 //____________________________________________________________
56 void AliHFEV0pidMC::Init(){
57   //
58   // initialize objects
59   //
60
61   fColl = new AliHFEcollection("V0pidMC", "MC based V0 benchmarking");
62   // QA
63   fColl->CreateTH1F("h_QA_nParticles", "QA on track processing", 10, -0.5, 9.5);
64
65   const Int_t nBins = 20;
66   const Float_t pMin = 0.1;
67   const Float_t pMax = 10.;
68
69   // before PID
70   fColl->CreateTH1F("h_Electron", "all electron candidates (no MC); p (GeV/c); counts", nBins, pMin, pMax, 0);
71   fColl->CreateTH1F("h_PionK0", "all K0 pion candidates (no MC); p (GeV/c); counts",  nBins, pMin, pMax, 0);
72   fColl->CreateTH1F("h_PionL", "all Lambda pion candidates (no MC); p (GeV/c); counts", nBins, pMin, pMax, 0);
73   fColl->CreateTH1F("h_Kaon", "all Kaon candidates (no MC); p (GeV/c); counts",  nBins, pMin, pMax, 0);
74   fColl->CreateTH1F("h_Proton", "all Lambda proton candidates (no MC); p (GeV/c); counts",  nBins, pMin, pMax, 0);
75   
76   fColl->CreateTH1F("h_mis_Electron", "all NON electron candidates MC tagged; p (GeV/c); counts",  nBins, pMin, pMax, 0);
77   fColl->CreateTH1F("h_mis_PionK0", "all NON K0 pion candidates MC tagged; p (GeV/c); counts",  nBins, pMin, pMax, 0);
78   fColl->CreateTH1F("h_mis_PionL", "all NON Lambda pion candidates MC tagged ; p (GeV/c); counts", nBins, pMin, pMax, 0);
79   fColl->CreateTH1F("h_mis_Kaon", "all NON Kaon candidates MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
80   fColl->CreateTH1F("h_mis_Proton", "all NON Lambda proton candidates MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);  
81
82   fColl->CreateTH1Fvector1(5, "h_tag_Electron", "electron candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
83   fColl->CreateTH1Fvector1(5, "h_tag_PionK0", "K0 pion candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
84   fColl->CreateTH1Fvector1(5, "h_tag_PionL", "Lambda pion candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
85   fColl->CreateTH1Fvector1(5, "h_tag_Kaon", "kaon candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
86   fColl->CreateTH1Fvector1(5, "h_tag_Proton", "Lambda proton candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
87
88 }
89 //____________________________________________________________
90 Bool_t  AliHFEV0pidMC::Process(TObjArray * const particles, Int_t type){
91   //
92   // process the selected V0 daughter tracks
93   //
94   
95   TString hname;
96   const TString typeName[5] = {"Electron", "PionK0", "PionL", "Kaon", "Proton"};
97   const Int_t  typePID[5] = {0, 2, 2, 3, 4};
98
99   if(!fMC) return kFALSE;
100   if(!particles) return kFALSE;
101   
102   AliVParticle *recTrack = NULL;
103   TIterator *trackIter = particles->MakeIterator(); 
104   while((recTrack = dynamic_cast<AliVParticle *>(trackIter->Next()))){
105     fColl->Fill("h_QA_nParticles", 0);
106     // only ESD for now
107     AliESDtrack *track = dynamic_cast<AliESDtrack *>(recTrack);
108     if(!track) continue;
109     const AliExternalTrackParam *ext = track->GetOuterParam();
110     if(!ext) continue;
111     // MC label
112     Int_t label = track->GetLabel();
113     if(label <0){
114        fColl->Fill("h_QA_nParticles", 1);
115       continue;
116     }
117     AliMCParticle *mcpD = dynamic_cast<AliMCParticle*>(fMC->GetTrack(label));
118     if(!mcpD){
119       fColl->Fill("h_QA_nParticles", 2);
120       continue;
121     }
122
123     Float_t p = ext->P();
124     //Short_t charge = ext->Charge();
125     Int_t pdgD = mcpD->PdgCode();
126     AliMCParticle *mcpM = dynamic_cast<AliMCParticle*>(fMC->GetTrack(mcpD->GetMother()));
127     if(!mcpM){
128       fColl->Fill("h_QA_nParticles", 3);
129       continue;
130     }
131     //Int_t pdgM = mcpM->PdgCode();
132
133     // all candidates
134     hname = "h_" + typeName[type];
135     fColl->Fill(hname, p);
136     Int_t pidD = PDGtoPIDdaughter(pdgD);
137     
138     // all misidentified candidates
139     hname = "h_mis_" + typeName[type];
140     if(typePID[type] != pidD){
141       fColl->Fill(hname, p);
142     }
143
144     // for every particle fill detailed information about the missidentified particles
145     hname = "h_tag_" + typeName[type];
146     Int_t aliPID = PDGtoAliPID(pdgD);
147     fColl->Fill(hname, aliPID, p);
148     
149   }// .. loop over array
150   
151   
152   return kTRUE;
153 }  
154 //____________________________________________________________
155 Int_t AliHFEV0pidMC::PDGtoPIDdaughter(Int_t pdg) const {
156   //
157   // convert PDG to local pid 
158   //
159   switch (TMath::Abs(pdg)){
160   case 11:
161     return 0;  // electron gamma
162   case 211:
163     return 2; // pion K0 or pion Lambda
164   case 321:
165     return 3; //kaon Phi
166   case 2212:
167     return 4; // proton Lambda
168   default:
169     return -1;
170   };
171   
172   return -1;
173 }
174 //____________________________________________________________
175 Int_t AliHFEV0pidMC::PDGtoPIDmother(Int_t pdg) const {
176   //
177   // convert PDG to local pid
178   //
179   switch (TMath::Abs(pdg)){
180   case 22:
181       return 0; // gamma
182     case 310: 
183     return 1; // K0s
184   case 333:
185     return 2; // Phi
186   case 3122:
187     return 3; // Lambda
188   default:
189     return -1;
190   };
191   
192   return -1;
193 }
194 //____________________________________________________________
195 Int_t AliHFEV0pidMC::PDGtoAliPID(Int_t pdg) const {
196   //
197   // convert PDG to AliPID
198   //
199   
200   switch (TMath::Abs(pdg)){
201   case 11:
202     return 0; // electron 
203   case 13:
204     return 1; // muon
205   case 211:
206     return 2; // pion 
207   case 321:
208     return 3; // kaon 
209   case 2212:
210     return 4; // proton 
211   default:
212     return -1;
213   };
214   return -1;
215 }
216 //____________________________________________________________
217 TList *AliHFEV0pidMC::GetListOfQAhistograms(){
218   //
219   // Get QA histograms
220   //
221   if(fColl)
222     return fColl->GetList();
223   return NULL;
224 }
225