1)AliAODParticleCorrelation.h: Data member fIsolation changed from float to bool
[u/mrichter/AliRoot.git] / PWG4 / PartCorrDep / AliAnaPi0EbE.cxx
CommitLineData
1c5acb87 1/**************************************************************************\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3 * *\r
4 * Author: The ALICE Off-line Project. *\r
5 * Contributors are mentioned in the code where appropriate. *\r
6 * *\r
7 * Permission to use, copy, modify and distribute this software and its *\r
8 * documentation strictly for non-commercial purposes iGetEntriesFast(s hereby granted *\r
9 * without fee, provided that the above copyright notice appears in all *\r
10 * copies and that both the copyright notice and this permission notice *\r
11 * appear in the supporting documentation. The authors make no claims *\r
12 * about the suitability of this software for any purpose. It is *\r
13 * provided "as is" without express or implied warranty. *\r
14 **************************************************************************/\r
15/* $Id: AliAnaPi0EbE.cxx 28688 2008-09-11 15:04:07Z gconesab $ */\r
16\r
17//_________________________________________________________________________\r
18// Class for the analysis of high pT pi0 event by event\r
19// Pi0 identified by one of the following:\r
20// -Invariant mass of 2 cluster in calorimeter\r
21// -Shower shape analysis in calorimeter\r
22// -Invariant mass of one cluster in calorimeter and one photon reconstructed in TPC (in near future)\r
23//\r
24// -- Author: Gustavo Conesa (LNF-INFN) & Raphaelle Ichou (SUBATECH)\r
25//////////////////////////////////////////////////////////////////////////////\r
26 \r
27 \r
28// --- ROOT system --- \r
29#include <TList.h>\r
30//#include "Riostream.h"\r
31\r
32// --- Analysis system --- \r
33#include "AliAnaPi0EbE.h" \r
34#include "AliLog.h"\r
35#include "AliCaloTrackReader.h"\r
36#include "AliIsolationCut.h"\r
37#include "AliNeutralMesonSelection.h"\r
38#include "AliCaloPID.h"\r
6639984f 39#include "AliMCAnalysisUtils.h"\r
1c5acb87 40#include "AliAODPWG4ParticleCorrelation.h"\r
6639984f 41 #include "AliStack.h"\r
1c5acb87 42ClassImp(AliAnaPi0EbE)\r
43 \r
44//____________________________________________________________________________\r
45AliAnaPi0EbE::AliAnaPi0EbE() : \r
46AliAnaPartCorrBaseClass(), fAnaType(kIMCalo),fCalorimeter(""),\r
47fMinDist(0.),fMinDist2(0.),fMinDist3(0.), \r
48fInputAODGammaConv(0x0),fInputAODGammaConvName(""),\r
49fhPtPi0(0),fhPhiPi0(0),fhEtaPi0(0), \r
50fhPtMCNoPi0(0),fhPhiMCNoPi0(0),fhEtaMCNoPi0(0), \r
51fhPtMCPi0(0),fhPhiMCPi0(0),fhEtaMCPi0(0)\r
52{\r
53 //default ctor\r
54 \r
55 //Initialize parameters\r
56 InitParameters();\r
57 \r
58}\r
59\r
60//____________________________________________________________________________\r
61AliAnaPi0EbE::AliAnaPi0EbE(const AliAnaPi0EbE & p) : \r
62AliAnaPartCorrBaseClass(p), fAnaType(p.fAnaType), fCalorimeter(p.fCalorimeter),\r
63fMinDist(p.fMinDist),fMinDist2(p.fMinDist2), fMinDist3(p.fMinDist3),\r
64fInputAODGammaConv(new TClonesArray(*p.fInputAODGammaConv)),\r
65fInputAODGammaConvName(p.fInputAODGammaConvName),\r
66fhPtPi0(p.fhPtPi0),fhPhiPi0(p.fhPhiPi0),fhEtaPi0(p.fhEtaPi0), \r
67fhPtMCNoPi0(p.fhPtMCNoPi0),fhPhiMCNoPi0(p.fhPhiMCNoPi0),fhEtaMCNoPi0(p.fhEtaMCNoPi0), \r
68fhPtMCPi0(p.fhPtMCPi0),fhPhiMCPi0(p.fhPhiMCPi0),fhEtaMCPi0(p.fhEtaMCPi0) \r
69{\r
70 // cpy ctor\r
71}\r
72\r
73//_________________________________________________________________________\r
74AliAnaPi0EbE & AliAnaPi0EbE::operator = (const AliAnaPi0EbE & p)\r
75{\r
76 // assignment operator\r
77 \r
78 if(&p == this) return *this;\r
79 \r
80 fAnaType = p.fAnaType ;\r
81 fCalorimeter = p.fCalorimeter ;\r
82 fMinDist = p.fMinDist;\r
83 fMinDist2 = p.fMinDist2;\r
84 fMinDist3 = p.fMinDist3;\r
85 \r
86 fInputAODGammaConv = new TClonesArray(*p.fInputAODGammaConv) ;\r
87 fInputAODGammaConvName = p.fInputAODGammaConvName ;\r
88 \r
89 fhPtPi0 = p.fhPtPi0; fhPhiPi0 = p.fhPhiPi0; fhEtaPi0 = p.fhEtaPi0; \r
90 fhPtMCNoPi0 = p.fhPtMCNoPi0; fhPhiMCNoPi0 = p.fhPhiMCNoPi0; fhEtaMCNoPi0 = p.fhEtaMCPi0; \r
91 fhPtMCPi0 = p.fhPtMCPi0; fhPhiMCPi0 = p.fhPhiMCPi0; fhEtaMCPi0 = p.fhEtaMCPi0; \r
92 \r
93 return *this;\r
94 \r
95}\r
96\r
97//____________________________________________________________________________\r
98AliAnaPi0EbE::~AliAnaPi0EbE() \r
99{\r
100 //dtor\r
101 if(fInputAODGammaConv){\r
102 fInputAODGammaConv->Clear() ; \r
103 delete fInputAODGammaConv ;\r
104 }\r
105}\r
106\r
107//________________________________________________________________________\r
108TList * AliAnaPi0EbE::GetCreateOutputObjects()\r
109{ \r
110 // Create histograms to be saved in output file and \r
111 // store them in outputContainer\r
112 TList * outputContainer = new TList() ; \r
113 outputContainer->SetName("Pi0EbEHistos") ; \r
114 \r
115 Int_t nptbins = GetHistoNPtBins();\r
116 Int_t nphibins = GetHistoNPhiBins();\r
117 Int_t netabins = GetHistoNEtaBins();\r
118 Float_t ptmax = GetHistoPtMax();\r
119 Float_t phimax = GetHistoPhiMax();\r
120 Float_t etamax = GetHistoEtaMax();\r
121 Float_t ptmin = GetHistoPtMin();\r
122 Float_t phimin = GetHistoPhiMin();\r
123 Float_t etamin = GetHistoEtaMin(); \r
124 \r
125 fhPtPi0 = new TH1F("hPtPi0","Number of identified #pi^{0} decay",nptbins,ptmin,ptmax); \r
126 fhPtPi0->SetYTitle("N");\r
127 fhPtPi0->SetXTitle("p_{T #pi^{0}}(GeV/c)");\r
128 outputContainer->Add(fhPtPi0) ; \r
129 \r
130 fhPhiPi0 = new TH2F\r
131 ("hPhiPi0","#phi_{#pi^{0}}",nptbins,ptmin,ptmax,nphibins,phimin,phimax); \r
132 fhPhiPi0->SetYTitle("#phi");\r
133 fhPhiPi0->SetXTitle("p_{T #pi^{0}} (GeV/c)");\r
134 outputContainer->Add(fhPhiPi0) ; \r
135 \r
136 fhEtaPi0 = new TH2F\r
137 ("hEtaPi0","#phi_{#pi^{0}}",nptbins,ptmin,ptmax,netabins,etamin,etamax); \r
138 fhEtaPi0->SetYTitle("#eta");\r
139 fhEtaPi0->SetXTitle("p_{T #pi^{0}} (GeV/c)");\r
140 outputContainer->Add(fhEtaPi0) ;\r
141 \r
691bdd02 142 if(IsDataMC()) {
143 if((GetReader()->GetDataType() == AliCaloTrackReader::kMC && fAnaType!=kSSCalo) ||
144 GetReader()->GetDataType() != AliCaloTrackReader::kMC){\r
1c5acb87 145 \r
146 fhPtMCPi0 = new TH1F("hPtMCPi0","Identified pi0 from pi0",nptbins,ptmin,ptmax); \r
147 fhPtMCPi0->SetYTitle("N");\r
148 fhPtMCPi0->SetXTitle("p_{T #pi^{0}}(GeV/c)");\r
149 outputContainer->Add(fhPtMCPi0) ; \r
150 \r
151 fhPhiMCPi0 = new TH2F\r
152 ("hPhiMCPi0","Identified pi0 from pi0",nptbins,ptmin,ptmax,nphibins,phimin,phimax); \r
153 fhPhiMCPi0->SetYTitle("#phi");\r
154 fhPhiMCPi0->SetXTitle("p_{T #pi^{0}} (GeV/c)");\r
155 outputContainer->Add(fhPhiMCPi0) ; \r
156 \r
157 fhEtaMCPi0 = new TH2F\r
158 ("hEtaMCPi0","Identified pi0 from pi0",nptbins,ptmin,ptmax,netabins,etamin,etamax); \r
159 fhEtaMCPi0->SetYTitle("#eta");\r
160 fhEtaMCPi0->SetXTitle("p_{T #pi^{0}} (GeV/c)");\r
161 outputContainer->Add(fhEtaMCPi0) ;\r
162 \r
163 fhPtMCNoPi0 = new TH1F("hPtMCNoPi0","Identified pi0 not from pi0",nptbins,ptmin,ptmax); \r
164 fhPtMCNoPi0->SetYTitle("N");\r
165 fhPtMCNoPi0->SetXTitle("p_{T #pi^{0}}(GeV/c)");\r
166 outputContainer->Add(fhPtMCNoPi0) ; \r
167 \r
168 fhPhiMCNoPi0 = new TH2F\r
169 ("hPhiMCNoPi0","Identified pi0 not from pi0",nptbins,ptmin,ptmax,nphibins,phimin,phimax); \r
170 fhPhiMCNoPi0->SetYTitle("#phi");\r
171 fhPhiMCNoPi0->SetXTitle("p_{T #pi^{0}} (GeV/c)");\r
172 outputContainer->Add(fhPhiMCNoPi0) ; \r
173 \r
174 fhEtaMCNoPi0 = new TH2F\r
175 ("hEtaMCNoPi0","Identified pi0 not from pi0",nptbins,ptmin,ptmax,netabins,etamin,etamax); \r
176 fhEtaMCNoPi0->SetYTitle("#eta");\r
177 fhEtaMCNoPi0->SetXTitle("p_{T #pi^{0}} (GeV/c)");\r
178 outputContainer->Add(fhEtaMCNoPi0) ;\r
179 \r
691bdd02 180 }
1c5acb87 181 }//Histos with MC\r
182 \r
183 \r
184 //Keep neutral meson selection histograms if requiered\r
185 //Setting done in AliNeutralMesonSelection\r
186 \r
187 if(fAnaType!=kSSCalo && GetNeutralMesonSelection()){\r
188 \r
189 TList * nmsHistos = GetNeutralMesonSelection()->GetCreateOutputObjects() ;\r
190 if(GetNeutralMesonSelection()->AreNeutralMesonSelectionHistosKept())\r
191 for(Int_t i = 0; i < nmsHistos->GetEntries(); i++) outputContainer->Add(nmsHistos->At(i)) ;\r
192 }\r
193 \r
194 //Save parameters used for analysis\r
195 TString parList ; //this will be list of parameters used for this analysis.\r
196 char onePar[255] ;\r
197 \r
198 sprintf(onePar,"--- AliAnaPi0EbE ---\n") ;\r
199 parList+=onePar ; \r
200 sprintf(onePar,"fAnaType=%d (Pi0 selection type) \n",fAnaType) ;\r
201 parList+=onePar ;\r
202 \r
203 if(fAnaType == kSSCalo){\r
204 sprintf(onePar,"Calorimeter: %s\n",fCalorimeter.Data()) ;\r
205 parList+=onePar ;\r
206 sprintf(onePar,"fMinDist =%2.2f (Minimal distance to bad channel to accept cluster) \n",fMinDist) ;\r
207 parList+=onePar ;\r
208 sprintf(onePar,"fMinDist2=%2.2f (Cuts on Minimal distance to study acceptance evaluation) \n",fMinDist2) ;\r
209 parList+=onePar ;\r
210 sprintf(onePar,"fMinDist3=%2.2f (One more cut on distance used for acceptance-efficiency study) \n",fMinDist3) ;\r
211 parList+=onePar ;\r
212 }\r
213 \r
214 //Get parameters set in base class.\r
215 parList += GetBaseParametersList() ;\r
216 \r
217 //Get parameters set in PID class.\r
218 if(fAnaType == kSSCalo) parList += GetCaloPID()->GetPIDParametersList() ;\r
219 \r
220 TObjString *oString= new TObjString(parList) ;\r
221 outputContainer->Add(oString);\r
222 \r
223 return outputContainer ;\r
224 \r
225}\r
226\r
227//__________________________________________________________________\r
228void AliAnaPi0EbE::MakeAnalysisFillAOD() \r
229{\r
230 //Do analysis and fill aods\r
231 \r
232 switch(fAnaType) \r
233 {\r
234 case kIMCalo:\r
235 MakeInvMassInCalorimeter();\r
236 break;\r
237 \r
238 case kSSCalo:\r
239 MakeShowerShapeIdentification();\r
240 break;\r
241 \r
242 case kIMCaloTracks:\r
243 MakeInvMassInCalorimeterAndCTS();\r
244 break;\r
245 \r
246 }\r
247}\r
248\r
249//__________________________________________________________________\r
250void AliAnaPi0EbE::MakeInvMassInCalorimeter() \r
251{\r
252 //Do analysis and fill aods\r
253 //Search for the photon decay in calorimeters\r
254 //Read photon list from AOD, produced in class AliAnaPhoton\r
255 //Check if 2 photons have the mass of the pi0.\r
256 \r
257 TLorentzVector mom1;\r
258 TLorentzVector mom2;\r
259 TLorentzVector mom ;\r
260 Int_t tag1 =-1;\r
261 Int_t tag2 =-1;\r
262 Int_t tag = -1;\r
263 \r
264 if(!GetInputAODBranch())\r
265 AliFatal(Form("MakeInvMassInCalo: No input calo photons in AOD with name branch < %s > \n",GetInputAODName().Data()));\r
266 \r
267 for(Int_t iphoton = 0; iphoton < GetInputAODBranch()->GetEntriesFast(); iphoton++){\r
268 AliAODPWG4Particle * photon1 = (AliAODPWG4Particle*) (GetInputAODBranch()->At(iphoton));\r
269 mom1 = *(photon1->Momentum());\r
270 \r
6639984f 271 \r
1c5acb87 272 for(Int_t jphoton = iphoton+1; jphoton < GetInputAODBranch()->GetEntriesFast()-1; jphoton++){\r
273 \r
274 AliAODPWG4ParticleCorrelation * photon2 = (AliAODPWG4ParticleCorrelation*) (GetInputAODBranch()->At(jphoton));\r
275 mom2 = *(photon2->Momentum());\r
6639984f 276 \r
1c5acb87 277 //Select good pair (good phi, pt cuts, aperture and invariant mass)\r
278 if(GetNeutralMesonSelection()->SelectPair(mom1, mom2))\r
279 {\r
6639984f 280 if(GetDebug()>1) \r
691bdd02 281 printf("AliAnaPi0EbE::kIMCalo::Selected gamma pair: pt %f, phi %f, eta%f \n",(mom1+mom2).Pt(), (mom1+mom2).Phi()*180./3.1416, (mom1+mom2).Eta());\r
1c5acb87 282 \r
6639984f 283 //Play with the MC stack if available\r
1c5acb87 284 if(IsDataMC()){\r
285 //Check origin of the candidates\r
6639984f 286 tag1 = GetMCAnalysisUtils()->CheckOrigin(photon1->GetLabel(), GetMCStack());\r
287 tag2 = GetMCAnalysisUtils()->CheckOrigin(photon2->GetLabel(), GetMCStack());\r
288 \r
691bdd02 289 if(GetDebug() > 0) printf("AliAnaPi0EbE::kIMCalo::Origin of: photon1 %d; photon2 %d \n",tag1, tag2);\r
6639984f 290 if(tag1 == AliMCAnalysisUtils::kMCPi0Decay && tag2 == AliMCAnalysisUtils::kMCPi0Decay){\r
291 \r
292 //Check if pi0 mother is the same\r
293 Int_t label1 = photon1->GetLabel();\r
294 TParticle * mother1 = GetMCStack()->Particle(label1);//photon in kine tree\r
295 label1 = mother1->GetFirstMother();\r
296 //mother1 = GetMCStack()->Particle(label1);//pi0\r
297 \r
298 Int_t label2 = photon2->GetLabel();\r
299 TParticle * mother2 = GetMCStack()->Particle(label2);//photon in kine tree\r
300 label2 = mother2->GetFirstMother();\r
301 //mother2 = GetMCStack()->Particle(label2);//pi0\r
302 \r
303 //printf("mother1 %d, mother2 %d\n",label1,label2);\r
304 if(label1 == label2)\r
305 tag = AliMCAnalysisUtils::kMCPi0;\r
306 }\r
1c5acb87 307 }//Work with stack also \r
308 \r
309 //Create AOD for analysis\r
310 mom = mom1+mom2;\r
311 AliAODPWG4Particle pi0 = AliAODPWG4Particle(mom);\r
312 //pi0.SetLabel(calo->GetLabel(0));\r
313 pi0.SetPdg(AliCaloPID::kPi0);\r
314 pi0.SetDetector(photon1->GetDetector());\r
315 pi0.SetTag(tag); \r
316 //Set the indeces of the original caloclusters \r
317 pi0.SetCaloLabel(photon1->GetCaloLabel(0), photon2->GetCaloLabel(0));\r
318 AddAODParticle(pi0);\r
319 }//pi0\r
320 }//2n photon loop\r
321 \r
322 }//1st photon loop\r
323 \r
691bdd02 324 if(GetDebug() > 1) printf("AliAnaPi0EbE::kIMCalo::End fill AODs \n"); \r
1c5acb87 325 \r
326}\r
327\r
328//__________________________________________________________________\r
329void AliAnaPi0EbE::MakeInvMassInCalorimeterAndCTS() \r
330{\r
331 //Do analysis and fill aods\r
332 //Search for the photon decay in calorimeters\r
333 //Read photon list from AOD, produced in class AliAnaPhoton and AliGammaConversion\r
334 //Check if 2 photons have the mass of the pi0.\r
335 \r
336 TLorentzVector mom1;\r
337 TLorentzVector mom2;\r
338 TLorentzVector mom ;\r
339 Int_t tag1 =-1;\r
340 Int_t tag2 =-1;\r
341 Int_t tag = -1;\r
342 \r
343 if(!GetInputAODBranch())\r
344 AliFatal(Form("MakeInvMassInCalo: No input calo photons in AOD branch with name < %s > \n",GetInputAODName().Data()));\r
345 \r
346 for(Int_t iphoton = 0; iphoton < GetInputAODBranch()->GetEntriesFast(); iphoton++){\r
347 AliAODPWG4Particle * photon1 = (AliAODPWG4Particle*) (GetInputAODBranch()->At(iphoton));\r
348 mom1 = *(photon1->Momentum());\r
349 \r
350 //Play with the MC stack if available\r
351 fInputAODGammaConv = (TClonesArray *) GetReader()->GetAOD()->FindListObject(fInputAODGammaConvName);\r
352 if(!fInputAODGammaConv) \r
353 AliFatal(Form("MakeInvMassInCaloAndCTS: No input gamma conversions in AOD branch with name < %s >",fInputAODGammaConvName.Data())); \r
354 \r
355 for(Int_t jphoton = iphoton+1; jphoton < fInputAODGammaConv->GetEntriesFast()-1; jphoton++){\r
356 AliAODPWG4ParticleCorrelation * photon2 = (AliAODPWG4ParticleCorrelation*) (fInputAODGammaConv->At(jphoton));\r
357 mom2 = *(photon2->Momentum());\r
358 //Select good pair (good phi, pt cuts, aperture and invariant mass)\r
359 if(GetNeutralMesonSelection()->SelectPair(mom1, mom2)){\r
691bdd02 360 if(GetDebug() > 1) printf("AliAnaPi0EbE::kIMCaloCTS::Selected gamma pair: pt %f, phi %f, eta%f\n",(mom1+mom2).Pt(), (mom1+mom2).Phi()*180./3.1416, (mom1+mom2).Eta());\r
1c5acb87 361 \r
362 if(IsDataMC()){\r
363 //Check origin of the candidates\r
6639984f 364 tag1 = GetMCAnalysisUtils()->CheckOrigin(photon1->GetLabel(), GetMCStack());\r
365 tag2 = GetMCAnalysisUtils()->CheckOrigin(photon2->GetLabel(), GetMCStack());\r
691bdd02 366 if(GetDebug() > 0) printf("AliAnaPi0EbE::kIMCaloCTS::Origin of: photon1 %d; photon2 %d \n",tag1, tag2);\r
6639984f 367 if(tag1 == AliMCAnalysisUtils::kMCPi0Decay && tag2 == AliMCAnalysisUtils::kMCPi0Decay){\r
368 //Check if pi0 mother is the same\r
369 Int_t label1 = photon1->GetLabel();\r
370 TParticle * mother1 = GetMCStack()->Particle(label1);//photon in kine tree\r
371 label1 = mother1->GetFirstMother();\r
372 //mother1 = GetMCStack()->Particle(label1);//pi0\r
373 \r
374 Int_t label2 = photon2->GetLabel();\r
375 TParticle * mother2 = GetMCStack()->Particle(label2);//photon in kine tree\r
376 label2 = mother2->GetFirstMother();\r
377 //mother2 = GetMCStack()->Particle(label2);//pi0\r
378 \r
379 //printf("mother1 %d, mother2 %d\n",label1,label2);\r
380 if(label1 == label2)\r
381 tag = AliMCAnalysisUtils::kMCPi0;\r
382 }\r
1c5acb87 383 }//Work with stack also \r
384 \r
385 //Create AOD for analysis\r
386 mom = mom1+mom2;\r
387 AliAODPWG4ParticleCorrelation pi0 = AliAODPWG4ParticleCorrelation(mom);\r
388 //pi0.SetLabel(calo->GetLabel(0));\r
389 pi0.SetPdg(AliCaloPID::kPi0);\r
390 pi0.SetDetector(photon1->GetDetector());\r
391 pi0.SetTag(tag);\r
392 //Set the indeces of the original tracks or caloclusters \r
393 pi0.SetCaloLabel(photon1->GetCaloLabel(0), -1);\r
394 pi0.SetTrackLabel(photon2->GetTrackLabel(0), photon2->GetTrackLabel(1));\r
395 AddAODParticle(pi0);\r
396 }//pi0\r
397 }//2n photon loop\r
398 \r
399 }//1st photon loop\r
400 \r
691bdd02 401 if(GetDebug() > 1) printf("AliAnaPi0EbE::kIMCaloCTS::End fill AODs \n"); \r
1c5acb87 402 \r
403}\r
404\r
405\r
406//__________________________________________________________________\r
407void AliAnaPi0EbE::MakeShowerShapeIdentification() \r
408{\r
409 //Search for pi0 in fCalorimeter with shower shape analysis \r
410 \r
411 TClonesArray * pl = new TClonesArray; \r
412 \r
413 //Get vertex for photon momentum calculation\r
414 Double_t vertex[]={0,0,0} ; //vertex ;\r
415 if(!GetReader()->GetDataType()== AliCaloTrackReader::kMC) GetReader()->GetVertex(vertex);\r
416 \r
417 //Select the Calorimeter of the photon\r
418 if(fCalorimeter == "PHOS")\r
419 pl = GetAODPHOS();\r
420 else if (fCalorimeter == "EMCAL")\r
421 pl = GetAODEMCAL();\r
422 //Fill AODCaloClusters and AODParticle with PHOS aods\r
423 TLorentzVector mom ;\r
424 for(Int_t icalo = 0; icalo < pl->GetEntriesFast(); icalo++){\r
425 AliAODCaloCluster * calo = (AliAODCaloCluster*) (pl->At(icalo)); \r
426 \r
691bdd02 427 //Cluster selection, not charged, with pi0 id and in fidutial cut\r
1c5acb87 428 //Get Momentum vector, \r
429 calo->GetMomentum(mom,vertex);//Assume that come from vertex in straight line\r
430 //If too small or big pt, skip it\r
431 if(mom.Pt() < GetMinPt() || mom.Pt() > GetMaxPt() ) continue ; \r
432 //Check acceptance selection\r
433 if(IsFidutialCutOn()){\r
434 Bool_t in = GetFidutialCut()->IsInFidutialCut(mom,fCalorimeter) ;\r
435 if(! in ) continue ;\r
436 }\r
437 \r
438 //Create AOD for analysis\r
691bdd02 439 AliAODPWG4Particle aodpi0 = AliAODPWG4Particle(mom);\r
440 aodpi0.SetLabel(calo->GetLabel(0));\r
441 //Set the indeces of the original caloclusters
442 aodpi0.SetCaloLabel(calo->GetID(),-1);
443 aodpi0.SetDetector(fCalorimeter);\r
444 if(GetDebug() > 1)
445 printf("AliAnaPi0EbE::kSSCalo::::FillAOD: Min pt cut and fidutial cut passed: pt %3.2f, phi %2.2f, eta %1.2f\n",aodpi0.Pt(),aodpi0.Phi(),aodpi0.Eta()); \r
1c5acb87 446 \r
447 //Check Distance to Bad channel, set bit.\r
448 Double_t distBad=calo->GetDistToBadChannel() ; //Distance to bad channel\r
449 if(distBad < 0.) distBad=9999. ; //workout strange convension dist = -1. ;\r
450 if(distBad < fMinDist) //In bad channel (PHOS cristal size 2.2x2.2 cm)\r
451 continue ;\r
452 \r
691bdd02 453 if(GetDebug() > 1) printf("AliAnaPi0EbE::kSSCalo::::FillAOD: Bad channel cut passed %4.2f\n",distBad);\r
1c5acb87 454 \r
691bdd02 455 if(distBad > fMinDist3) aodpi0.SetDistToBad(2) ;\r
456 else if(distBad > fMinDist2) aodpi0.SetDistToBad(1) ; \r
457 else aodpi0.SetDistToBad(0) ;\r
1c5acb87 458 \r
459 //Check PID\r
460 //PID selection or bit setting\r
461 if(GetReader()->GetDataType() == AliCaloTrackReader::kMC){\r
462 //Get most probable PID, check PID weights (in MC this option is mandatory)\r
691bdd02 463 aodpi0.SetPdg(GetCaloPID()->GetPdg(fCalorimeter,calo->PID(),mom.E()));//PID with weights\r
464 if(GetDebug() > 1)
465 printf("AliAnaPi0EbE::kSSCalo::::FillAOD: PDG of identified particle %d\n",aodpi0.GetPdg());\r
466 //If primary is not pi0, skip it.\r
467 if(aodpi0.GetPdg() != AliCaloPID::kPi0) continue ;\r
1c5acb87 468 } \r
469 else if(IsCaloPIDOn()){\r
470 //Skip matched clusters with tracks\r
471 if(calo->GetNTracksMatched() > 0) continue ;\r
472 \r
473 //Get most probable PID, 2 options check PID weights \r
474 //or redo PID, recommended option for EMCal. \r
475 if(!IsCaloPIDRecalculationOn())\r
691bdd02 476 aodpi0.SetPdg(GetCaloPID()->GetPdg(fCalorimeter,calo->PID(),mom.E()));//PID with weights\r
1c5acb87 477 else\r
691bdd02 478 aodpi0.SetPdg(GetCaloPID()->GetPdg(fCalorimeter,mom,calo));//PID recalculated\r
1c5acb87 479 \r
691bdd02 480 if(GetDebug() > 1) printf("AliAnaPi0EbE::kSSCalo::::FillAOD: PDG of identified particle %d\n",aodpi0.GetPdg());\r
1c5acb87 481 \r
691bdd02 482 //If cluster does not pass pid, not pi0, skip it.\r
483 if(aodpi0.GetPdg() != AliCaloPID::kPi0) continue ; \r
1c5acb87 484 \r
485 }\r
486 else{\r
487 //Set PID bits for later selection (AliAnaPi0 for example)\r
488 //GetPDG already called in SetPIDBits.\r
691bdd02 489 GetCaloPID()->SetPIDBits(fCalorimeter,calo,&aodpi0);\r
490 if(GetDebug() > 1) printf("AliAnaPi0EbE::kSSCalo::::FillAOD: PID Bits set \n"); \r
1c5acb87 491 }\r
492 \r
691bdd02 493 if(GetDebug() > 1) printf("AliAnaPi0EbE::kSSCalo::::FillAOD: Pi0 selection cuts passed: pT %3.2f, pdg %d\n",aodpi0.Pt(), aodpi0.GetPdg());\r
1c5acb87 494 \r
495 //Play with the MC stack if available\r
496 //Check origin of the candidates\r
497 if(IsDataMC()){\r
691bdd02 498 if((GetReader()->GetDataType() == AliCaloTrackReader::kMC && fAnaType!=kSSCalo) ||
499 GetReader()->GetDataType() != AliCaloTrackReader::kMC){\r
500 aodpi0.SetTag(GetMCAnalysisUtils()->CheckOrigin(calo->GetLabel(0),GetMCStack()));\r
501 if(GetDebug() > 0) printf("AliAnaPi0EbE::kSSCalo::EbE::FillAOD: Origin of candidate %d\n",aodpi0.GetTag());\r
502 }
1c5acb87 503 }//Work with stack also \r
504 \r
691bdd02 505 //Add AOD with pi0 object to aod branch\r
506 AddAODParticle(aodpi0);\r
1c5acb87 507 \r
508 }//loop\r
509 \r
691bdd02 510 if(GetDebug() > 1) printf("AliAnaPi0EbE::kSSCalo::::FillAOD: End fill AODs \n"); \r
1c5acb87 511 \r
512}\r
513//__________________________________________________________________\r
514void AliAnaPi0EbE::MakeAnalysisFillHistograms() \r
515{\r
516 //Do analysis and fill histograms\r
517 \r
518 if(!GetOutputAODBranch())\r
519 AliFatal(Form("MakeInvMassInCalo: No output pi0 in AOD branch with name < %s > \n",GetOutputAODName().Data()));\r
520 \r
521 //Loop on stored AOD pi0\r
522 Int_t naod = GetOutputAODBranch()->GetEntriesFast();\r
691bdd02 523 if(GetDebug() > 0) printf("AliAnaPi0EbE::Histo::pi0 aod branch entries %d\n", naod);\r
1c5acb87 524 \r
525 for(Int_t iaod = 0; iaod < naod ; iaod++){\r
526 \r
527 AliAODPWG4Particle* pi0 = (AliAODPWG4Particle*) (GetOutputAODBranch()->At(iaod));\r
528 Int_t pdg = pi0->GetPdg();\r
529 \r
530 if(pdg != AliCaloPID::kPi0) continue; \r
531 \r
532 //Fill pi0 histograms \r
533 Float_t pt = pi0->Pt();\r
534 Float_t phi = pi0->Phi();\r
535 Float_t eta = pi0->Eta();\r
536 \r
537 \r
538 fhPtPi0 ->Fill(pt);\r
539 fhPhiPi0 ->Fill(pt,phi);\r
540 fhEtaPi0 ->Fill(pt,eta);\r
541 \r
542 if(IsDataMC()){\r
691bdd02 543 if((GetReader()->GetDataType() == AliCaloTrackReader::kMC && fAnaType!=kSSCalo) ||
544 GetReader()->GetDataType() != AliCaloTrackReader::kMC){\r
6639984f 545 if(pi0->GetTag()== AliMCAnalysisUtils::kMCPi0){\r
1c5acb87 546 fhPtMCPi0 ->Fill(pt);\r
547 fhPhiMCPi0 ->Fill(pt,phi);\r
548 fhEtaMCPi0 ->Fill(pt,eta);\r
549 }\r
550 else{\r
551 fhPtMCNoPi0 ->Fill(pt);\r
552 fhPhiMCNoPi0 ->Fill(pt,phi);\r
553 fhEtaMCNoPi0 ->Fill(pt,eta);\r
554 }\r
691bdd02 555 }
1c5acb87 556 }//Histograms with MC\r
557 \r
558 }// aod loop\r
559 \r
560}\r
561\r
562\r
691bdd02 563//____________________________________________________________________________
564void AliAnaPi0EbE::Init()
565{
566
567 //Init
568 //Do some checks
569 if(fCalorimeter == "PHOS" && !GetReader()->IsPHOSSwitchedOn()){
570 printf("!!ABORT: You want to use PHOS in analysis but it is not read!! \n!!Check the configuration file!!\n");
571 abort();
572 }
573 else if(fCalorimeter == "EMCAL" && !GetReader()->IsEMCALSwitchedOn()){
574 printf("!!ABORT: You want to use EMCAL in analysis but it is not read!! \n!!Check the configuration file!!\n");
575 abort();
576 }
577
578}
579
1c5acb87 580//____________________________________________________________________________\r
581void AliAnaPi0EbE::InitParameters()\r
582{\r
583 \r
584 //Initialize the parameters of the analysis.\r
585 SetOutputAODClassName("AliAODPWG4Particle");\r
586 SetOutputAODName("pi0s");\r
587 fInputAODGammaConvName = "gammaconv" ;\r
588 fAnaType = kIMCalo ;\r
691bdd02 589 fCalorimeter = "EMCAL" ;\r
1c5acb87 590 fMinDist = 2.;\r
591 fMinDist2 = 4.;\r
592 fMinDist3 = 5.;\r
593 \r
594}\r
595\r
596//__________________________________________________________________\r
597void AliAnaPi0EbE::Print(const Option_t * opt) const\r
598{\r
599 \r
600 //Print some relevant parameters set for the analysis\r
601 if(! opt)\r
602 return;\r
603 \r
604 printf("**** Print %s %s ****\n", GetName(), GetTitle() ) ;\r
605 AliAnaPartCorrBaseClass::Print("");\r
606 printf("Analysis Type = %d \n", fAnaType) ;\r
607 if(fAnaType == kSSCalo){ \r
608 printf("Calorimeter = %s\n", fCalorimeter.Data()) ;\r
609 printf("Min Distance to Bad Channel = %2.1f\n",fMinDist);\r
610 printf("Min Distance to Bad Channel 2 = %2.1f\n",fMinDist2);\r
611 printf("Min Distance to Bad Channel 3 = %2.1f\n",fMinDist3); \r
612 } \r
613 printf(" \n") ;\r
614 \r
615} \r