1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: Pedro Gonz??lez, Pedro Ladr??n de Guevara, Ernesto L??pez Torres, *
5 * Eulogio Serradilla, Ana Marin, Friederike Bock *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 // Analysis task for pi0->e+e-gamma (Dalitz decay)
18 // Analysis task for chic->JPsi+gamma
22 #include "TParticle.h"
24 #include "TMCProcess.h"
25 #include "TDatabasePDG.h"
28 #include "TDirectory.h"
32 #include "THnSparse.h"
35 #include "AliAnalysisManager.h"
36 #include "AliESDInputHandler.h"
37 #include "AliESDtrack.h"
38 #include "AliMCEvent.h"
40 #include "AliMCEventHandler.h"
43 #include "AliESDtrackCuts.h"
44 #include "AliESDpidCuts.h"
45 #include "AliMCEvent.h"
47 #include "AliESDEvent.h"
48 #include "AliESDpid.h"
49 #include "AliKFParticle.h"
50 #include "AliMCEventHandler.h"
51 #include "AliKFVertex.h"
52 #include "AliTriggerAnalysis.h"
53 #include "AliCentrality.h"
54 #include "AliMultiplicity.h"
55 #include "AliAnalysisTaskEtaToPiPlPiMiGamma.h"
58 ClassImp( AliAnalysisTaskEtaToPiPlPiMiGamma )
60 //-----------------------------------------------------------------------------------------------
61 AliAnalysisTaskEtaToPiPlPiMiGamma::AliAnalysisTaskEtaToPiPlPiMiGamma():
76 fSelectorNegPionIndex(0),
77 fSelectorPosPionIndex(0),
79 fGoodVirtualParticles(NULL),
83 fConversionCuts(NULL),
84 fHistoConvGammaPt(NULL),
85 fHistoConvGammaEta(NULL),
86 fHistoNegPionPt(NULL),
87 fHistoPosPionPt(NULL),
88 fHistoNegPionPhi(NULL),
89 fHistoPosPionPhi(NULL),
90 fHistoNegPionEta(NULL),
91 fHistoPosPionEta(NULL),
92 fHistoNegPionClsTPC(NULL),
93 fHistoPosPionClsTPC(NULL),
94 fHistoPionDCAxy(NULL),
96 fHistoPionTPCdEdxNSigma(NULL),
97 fHistoPionTPCdEdx(NULL),
98 fHistoPionPionInvMassPt(NULL),
99 fHistoMotherInvMassPt(NULL),
100 fTHnSparseMotherInvMassPtZM(NULL),
101 fHistoMotherBackInvMassPt(NULL),
102 fTHnSparseMotherBackInvMassPtZM(NULL),
103 fHistoMCAllGammaPt(NULL),
104 fHistoMCConvGammaPt(NULL),
105 fHistoMCAllPosPionsPt(NULL),
106 fHistoMCAllNegPionsPt(NULL),
107 fHistoMCGammaFromEtaPt(NULL),
108 fHistoMCPosPionsFromEtaPt(NULL),
109 fHistoMCNegPionsFromEtaPt(NULL),
110 fHistoMCEtaPiPlPiMiGammaPt(NULL),
111 fHistoMCEtaGGPt(NULL),
112 fHistoMCEtaDalitzPt(NULL),
113 fHistoMCEtaPiPlPiMiGammaInAccPt(NULL),
114 fHistoTrueMotherPiPlPiMiGammaInvMassPt(NULL),
115 fHistoTrueMotherGammaGammaInvMassPt(NULL),
116 fHistoTrueMotherDalitzInvMassPt(NULL),
117 fHistoTrueConvGammaPt(NULL),
118 fHistoTrueConvGammaFromEtaPt(NULL),
119 fHistoTruePosPionPt(NULL),
120 fHistoTruePosPionFromEtaPt(NULL),
121 fHistoTrueNegPionPt(NULL),
122 fHistoTrueNegPionFromEtaPt(NULL),
123 fHistoTruePionPionInvMassPt(NULL),
124 fHistoTruePionPionFromEtaInvMassPt(NULL),
126 fHistoNGoodESDTracks(NULL),
127 fProfileEtaShift(NULL),
131 fNumberOfESDTracks(0),
132 fMoveParticleAccordingToVertex(kFALSE),
134 fDoMesonAnalysis(kTRUE),
136 fIsFromMBHeader(kTRUE),
138 fIsGammaEtaCand(kFALSE)
143 //-----------------------------------------------------------------------------------------------
144 AliAnalysisTaskEtaToPiPlPiMiGamma::AliAnalysisTaskEtaToPiPlPiMiGamma( const char* name ):
145 AliAnalysisTaskSE(name),
160 fSelectorNegPionIndex(0),
161 fSelectorPosPionIndex(0),
163 fGoodVirtualParticles(NULL),
164 fGammaCutArray(NULL),
166 fMesonCutArray(NULL),
167 fConversionCuts(NULL),
168 fHistoConvGammaPt(NULL),
169 fHistoConvGammaEta(NULL),
170 fHistoNegPionPt(NULL),
171 fHistoPosPionPt(NULL),
172 fHistoNegPionPhi(NULL),
173 fHistoPosPionPhi(NULL),
174 fHistoNegPionEta(NULL),
175 fHistoPosPionEta(NULL),
176 fHistoNegPionClsTPC(NULL),
177 fHistoPosPionClsTPC(NULL),
178 fHistoPionDCAxy(NULL),
179 fHistoPionDCAz(NULL),
180 fHistoPionTPCdEdxNSigma(NULL),
181 fHistoPionTPCdEdx(NULL),
182 fHistoPionPionInvMassPt(NULL),
183 fHistoMotherInvMassPt(NULL),
184 fTHnSparseMotherInvMassPtZM(NULL),
185 fHistoMotherBackInvMassPt(NULL),
186 fTHnSparseMotherBackInvMassPtZM(NULL),
187 fHistoMCAllGammaPt(NULL),
188 fHistoMCConvGammaPt(NULL),
189 fHistoMCAllPosPionsPt(NULL),
190 fHistoMCAllNegPionsPt(NULL),
191 fHistoMCGammaFromEtaPt(NULL),
192 fHistoMCPosPionsFromEtaPt(NULL),
193 fHistoMCNegPionsFromEtaPt(NULL),
194 fHistoMCEtaPiPlPiMiGammaPt(NULL),
195 fHistoMCEtaGGPt(NULL),
196 fHistoMCEtaDalitzPt(NULL),
197 fHistoMCEtaPiPlPiMiGammaInAccPt(NULL),
198 fHistoTrueMotherPiPlPiMiGammaInvMassPt(NULL),
199 fHistoTrueMotherGammaGammaInvMassPt(NULL),
200 fHistoTrueMotherDalitzInvMassPt(NULL),
201 fHistoTrueConvGammaPt(NULL),
202 fHistoTrueConvGammaFromEtaPt(NULL),
203 fHistoTruePosPionPt(NULL),
204 fHistoTruePosPionFromEtaPt(NULL),
205 fHistoTrueNegPionPt(NULL),
206 fHistoTrueNegPionFromEtaPt(NULL),
207 fHistoTruePionPionInvMassPt(NULL),
208 fHistoTruePionPionFromEtaInvMassPt(NULL),
210 fHistoNGoodESDTracks(NULL),
211 fProfileEtaShift(NULL),
215 fNumberOfESDTracks(0),
216 fMoveParticleAccordingToVertex(kFALSE),
218 fDoMesonAnalysis(kTRUE),
220 fIsFromMBHeader(kTRUE),
222 fIsGammaEtaCand(kFALSE)
224 DefineOutput(1, TList::Class());
227 //-----------------------------------------------------------------------------------------------
228 AliAnalysisTaskEtaToPiPlPiMiGamma::~AliAnalysisTaskEtaToPiPlPiMiGamma()
231 // virtual destructor
233 cout<<"Destructor"<<endl;
238 if(fGoodVirtualParticles){
239 delete fGoodVirtualParticles;
247 //___________________________________________________________
248 void AliAnalysisTaskEtaToPiPlPiMiGamma::InitBack(){
250 const Int_t nDim = 4;
251 Int_t nBins[nDim] = {450,250,7,4};
252 Double_t xMin[nDim] = {0.3,0, 0,0};
253 Double_t xMax[nDim] = {0.75,25,7,4};
255 fTHnSparseMotherInvMassPtZM = new THnSparseF*[fnCuts];
256 fTHnSparseMotherBackInvMassPtZM = new THnSparseF*[fnCuts];
258 fBGHandler = new AliGammaConversionAODBGHandler*[fnCuts];
259 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
261 TString cutstringPion = ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutNumber();
262 TString cutstringMeson = ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutNumber();
263 TString cutstringGamma = ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber();
265 Int_t collisionSystem = atoi((TString)(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber())(0,1));
266 Int_t centMin = atoi((TString)(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber())(1,1));
267 Int_t centMax = atoi((TString)(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber())(2,1));
269 if(collisionSystem == 1 || collisionSystem == 2 ||
270 collisionSystem == 5 || collisionSystem == 8 ||
271 collisionSystem == 9){
272 centMin = centMin*10;
273 centMax = centMax*10;
275 else if(collisionSystem == 3 || collisionSystem == 6){
279 else if(collisionSystem == 4 || collisionSystem == 7){
280 centMin = ((centMin*5)+45);
281 centMax = ((centMax*5)+45);
285 fBackList[iCut] = new TList();
286 fBackList[iCut]->SetName(Form("%s_%s_%s Back histograms",cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
287 fBackList[iCut]->SetOwner(kTRUE);
288 fCutFolder[iCut]->Add(fBackList[iCut]);
290 fTHnSparseMotherBackInvMassPtZM[iCut] = new THnSparseF("Back_Back_InvMass_Pt_z_m","Back_Back_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
291 fBackList[iCut]->Add(fTHnSparseMotherBackInvMassPtZM[iCut]);
293 fMotherList[iCut] = new TList();
294 fMotherList[iCut]->SetName(Form("%s_%s_%s Mother histograms",cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
295 fMotherList[iCut]->SetOwner(kTRUE);
296 fCutFolder[iCut]->Add(fMotherList[iCut]);
298 fTHnSparseMotherInvMassPtZM[iCut] = new THnSparseF("Back_Mother_InvMass_Pt_z_m","Back_Mother_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
299 fMotherList[iCut]->Add(fTHnSparseMotherInvMassPtZM[iCut]);
302 fBGHandler[iCut] = new AliGammaConversionAODBGHandler( collisionSystem,centMin,centMax,
303 ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->GetNumberOfBGEvents(),
304 ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity());
309 //______________________________________________________________________
310 void AliAnalysisTaskEtaToPiPlPiMiGamma::UserCreateOutputObjects()
313 // Create ouput objects
316 // Create the output container
317 if(fOutputContainer != NULL){
318 delete fOutputContainer;
319 fOutputContainer = NULL;
321 if(fOutputContainer == NULL){
322 fOutputContainer = new TList();
323 fOutputContainer->SetOwner(kTRUE);
326 fGoodGammas = new TList();
327 //fGoodGammas->SetOwner(kTRUE);
329 fGoodVirtualParticles = new TList();
330 //fGoodVirtualParticles->SetOwner(kTRUE);
332 fCutFolder = new TList*[fnCuts];
333 fESDList = new TList*[fnCuts];
334 fBackList = new TList*[fnCuts];
335 fMotherList = new TList*[fnCuts];
336 fHistoNEvents = new TH1I*[fnCuts];
337 fHistoNGoodESDTracks = new TH1I*[fnCuts];
338 fProfileEtaShift = new TProfile*[fnCuts];
339 fHistoConvGammaPt = new TH1F*[fnCuts];
340 fHistoConvGammaEta = new TH1F*[fnCuts];
341 fHistoNegPionPt = new TH1F*[fnCuts];
342 fHistoPosPionPt = new TH1F*[fnCuts];
343 fHistoNegPionPhi = new TH1F*[fnCuts];
344 fHistoPosPionPhi = new TH1F*[fnCuts];
347 fHistoNegPionEta = new TH1F*[fnCuts];
348 fHistoPosPionEta = new TH1F*[fnCuts];
349 fHistoNegPionClsTPC = new TH2F*[fnCuts];
350 fHistoPosPionClsTPC = new TH2F*[fnCuts];
351 fHistoPionDCAxy = new TH2F*[fnCuts];
352 fHistoPionDCAz = new TH2F*[fnCuts];
353 fHistoPionTPCdEdxNSigma = new TH2F*[fnCuts];
354 fHistoPionTPCdEdx = new TH2F*[fnCuts];
355 fHistoPionPionInvMassPt = new TH2F*[fnCuts];
359 fHistoMotherInvMassPt = new TH2F*[fnCuts];
360 fHistoMotherBackInvMassPt = new TH2F*[fnCuts];
362 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
363 TString cutstringPion =((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutNumber();
364 TString cutstringMeson= ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutNumber();
365 TString cutstringGamma = ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber();
367 fCutFolder[iCut] = new TList();
368 fCutFolder[iCut]->SetName(Form("Cut Number %s_%s_%s",cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
369 fCutFolder[iCut]->SetOwner(kTRUE);
370 fOutputContainer->Add(fCutFolder[iCut]);
372 fESDList[iCut] = new TList();
373 fESDList[iCut]->SetName(Form("%s_%s_%s ESD histograms",cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
374 fESDList[iCut]->SetOwner(kTRUE);
376 fHistoNEvents[iCut] = new TH1I("NEvents","NEvents",9,-0.5,8.5);
377 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(1,"Accepted");
378 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(2,"Centrality");
379 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(3,"Missing MC");
380 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(4,"Trigger");
381 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(5,"Vertex Z");
382 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(6,"Cont. Vertex");
383 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(7,"Pile-Up");
384 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(8,"no SDD");
385 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(9,"no V0AND");
386 fESDList[iCut]->Add(fHistoNEvents[iCut]);
388 if(fIsHeavyIon) fHistoNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",3000,0,3000);
389 else fHistoNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
390 fESDList[iCut]->Add(fHistoNGoodESDTracks[iCut]);
392 fProfileEtaShift[iCut] = new TProfile("Eta Shift","Eta Shift",1, -0.5,0.5);
393 fESDList[iCut]->Add(fProfileEtaShift[iCut]);
394 fHistoConvGammaPt[iCut] = new TH1F("ESD_ConvGamma_Pt","ESD_ConvGamma_Pt",250,0,25);
395 fESDList[iCut]->Add(fHistoConvGammaPt[iCut]);
396 fHistoConvGammaEta[iCut] = new TH1F("ESD_ConvGamma_Eta","ESD_ConvGamma_Eta",600,-1.5,1.5);
397 fESDList[iCut]->Add(fHistoConvGammaEta[iCut]);
398 fHistoNegPionPt[iCut] = new TH1F("ESD_PrimaryNegPions_Pt","ESD_PrimaryNegPions_Pt",1000,0,25);
399 fESDList[iCut]->Add(fHistoNegPionPt[iCut]);
400 fHistoPosPionPt[iCut] = new TH1F("ESD_PrimaryPosPions_Pt","ESD_PrimaryPosPions_Pt",1000,0,25);
401 fESDList[iCut]->Add(fHistoPosPionPt[iCut]);
402 fHistoNegPionPhi[iCut] = new TH1F("ESD_PrimaryNegPions_Phi","ESD_PrimaryNegPions_Phi",360,0,2*TMath::Pi());
403 fESDList[iCut]->Add(fHistoNegPionPhi[iCut]);
404 fHistoPosPionPhi[iCut] = new TH1F("ESD_PrimaryPosPions_Phi","ESD_PrimaryPosPions_Phi",360,0,2*TMath::Pi());
405 fESDList[iCut]->Add(fHistoPosPionPhi[iCut]);
408 fHistoNegPionEta[iCut] = new TH1F("ESD_PrimaryNegPions_Eta","ESD_PrimaryNegPions_Eta",600,-1.5,1.5);
409 fESDList[iCut]->Add(fHistoNegPionEta[iCut]);
410 fHistoPosPionEta[iCut] = new TH1F("ESD_PrimaryPosPions_Eta","ESD_PrimaryPosPions_Eta",600,-1.5,1.5);
411 fESDList[iCut]->Add(fHistoPosPionEta[iCut]);
412 fHistoNegPionClsTPC[iCut] = new TH2F("ESD_PrimaryNegPions_ClsTPC","ESD_PrimaryNegPions_ClsTPC",100,0,1,400,0.,10.);
413 fESDList[iCut]->Add(fHistoNegPionClsTPC[iCut]);
414 fHistoPosPionClsTPC[iCut] = new TH2F("ESD_PrimaryPosPions_ClsTPC","ESD_PrimaryPosPions_ClsTPC",100,0,1,400,0.,10.);
415 fESDList[iCut]->Add(fHistoPosPionClsTPC[iCut]);
416 fHistoPionDCAxy[iCut] = new TH2F("ESD_PrimaryPions_DCAxy","ESD_PrimaryPions_DCAxy",800,-4.0,4.0,400,0.,10.);
417 fESDList[iCut]->Add(fHistoPionDCAxy[iCut]);
418 fHistoPionDCAz[iCut] = new TH2F("ESD_PrimaryPions_DCAz","ESD_PrimaryPions_DCAz",800,-4.0,4.0,400,0.,10.);
419 fESDList[iCut]->Add(fHistoPionDCAz[iCut]);
420 fHistoPionTPCdEdxNSigma[iCut] = new TH2F("ESD_PrimaryPions_TPCdEdx","ESD_PrimaryPions_TPCdEdx",150,0.05,20,400,-10,10);
421 fESDList[iCut]->Add(fHistoPionTPCdEdxNSigma[iCut]);
422 fHistoPionTPCdEdx[iCut] =new TH2F("ESD_PrimaryPions_TPCdEdxSignal","ESD_PrimaryPions_TPCdEdxSignal" ,150,0.05,20.0,800,0.0,200);
423 fESDList[iCut]->Add(fHistoPionTPCdEdx[iCut]);
424 fHistoPionPionInvMassPt[iCut] = new TH2F("ESD_PiPlusPiNeg_InvMassPt","ESD_PiPlusPiNeg_InvMassPt",2000,0.,2.,200,0.,20.);
425 fESDList[iCut]->Add(fHistoPionPionInvMassPt[iCut]);
428 fHistoMotherInvMassPt[iCut] = new TH2F("ESD_Mother_InvMass_Pt","ESD_Mother_InvMass_Pt",450,0.3,0.75,250,0,25);
429 fESDList[iCut]->Add(fHistoMotherInvMassPt[iCut]);
430 fHistoMotherBackInvMassPt[iCut] = new TH2F("ESD_Background_InvMass_Pt","ESD_Background_InvMass_Pt",450,0.3,0.75,250,0,25);
431 fESDList[iCut]->Add(fHistoMotherBackInvMassPt[iCut]);
434 TAxis *AxisAfter = fHistoPionTPCdEdxNSigma[iCut]->GetXaxis();
435 Int_t bins = AxisAfter->GetNbins();
436 Double_t from = AxisAfter->GetXmin();
437 Double_t to = AxisAfter->GetXmax();
438 Double_t *newBins = new Double_t[bins+1];
440 Double_t factor = TMath::Power(to/from, 1./bins);
441 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
443 AxisAfter->Set(bins, newBins);
444 AxisAfter = fHistoPionTPCdEdx[iCut]->GetXaxis();
445 AxisAfter->Set(bins, newBins);
450 fCutFolder[iCut]->Add(fESDList[iCut]);
456 fMCList = new TList*[fnCuts];
458 fTrueList = new TList*[fnCuts];
459 fHistoTrueConvGammaPt = new TH1F*[fnCuts];
460 fHistoTrueConvGammaFromEtaPt = new TH1F*[fnCuts];
461 fHistoTruePosPionPt = new TH1F*[fnCuts];
462 fHistoTrueNegPionPt = new TH1F*[fnCuts];
463 fHistoTruePosPionFromEtaPt = new TH1F*[fnCuts];
464 fHistoTrueNegPionFromEtaPt = new TH1F*[fnCuts];
467 fHistoMCAllGammaPt = new TH1F*[fnCuts];
468 fHistoMCConvGammaPt = new TH1F*[fnCuts];
469 fHistoMCAllPosPionsPt = new TH1F*[fnCuts];
470 fHistoMCAllNegPionsPt = new TH1F*[fnCuts];
471 fHistoMCGammaFromEtaPt = new TH1F*[fnCuts];
472 fHistoMCPosPionsFromEtaPt = new TH1F*[fnCuts];
473 fHistoMCNegPionsFromEtaPt = new TH1F*[fnCuts];
475 // hMCPi0DalitzGammaPt = new TH1F*[fnCuts];
476 // hMCPi0DalitzElectronPt = new TH1F*[fnCuts];
477 // hMCPi0DalitzPositronPt = new TH1F*[fnCuts];
479 fHistoMCEtaPiPlPiMiGammaPt = new TH1F*[fnCuts];
480 fHistoMCEtaDalitzPt = new TH1F*[fnCuts];
481 fHistoMCEtaGGPt = new TH1F*[fnCuts];
482 fHistoMCEtaPiPlPiMiGammaInAccPt = new TH1F*[fnCuts];
484 fHistoTrueMotherPiPlPiMiGammaInvMassPt = new TH2F*[fnCuts];
485 fHistoTrueMotherDalitzInvMassPt = new TH2F*[fnCuts];
486 fHistoTrueMotherGammaGammaInvMassPt = new TH2F*[fnCuts];
489 fHistoTruePionPionInvMassPt = new TH2F*[fnCuts];
490 fHistoTruePionPionFromEtaInvMassPt = new TH2F*[fnCuts];
493 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
494 TString cutstringPion =((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutNumber();
495 TString cutstringMeson= ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutNumber();
496 TString cutstringGamma = ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber();
498 fMCList[iCut] = new TList();
499 fMCList[iCut]->SetName(Form("%s_%s_%s MC histograms",cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
500 fMCList[iCut]->SetOwner(kTRUE);
501 fCutFolder[iCut]->Add(fMCList[iCut]);
503 fHistoMCAllGammaPt[iCut] = new TH1F("MC_AllGamma_Pt","MC_AllGamma_Pt",250,0,25);
504 fMCList[iCut]->Add(fHistoMCAllGammaPt[iCut]);
505 fHistoMCConvGammaPt[iCut] = new TH1F("MC_ConvGamma_Pt","MC_ConvGamma_Pt",250,0,25);
506 fMCList[iCut]->Add(fHistoMCConvGammaPt[iCut]);
507 fHistoMCAllPosPionsPt[iCut] = new TH1F("MC_AllPosPions_Pt","MC_AllPosPions_Pt",1000,0,25);
508 fMCList[iCut]->Add(fHistoMCAllPosPionsPt[iCut]);
509 fHistoMCAllNegPionsPt[iCut] = new TH1F("MC_AllNegPions_Pt","MC_AllNegPions_Pt",1000,0,25);
510 fMCList[iCut]->Add(fHistoMCAllNegPionsPt[iCut]);
511 fHistoMCGammaFromEtaPt[iCut] = new TH1F("MC_GammaFromEta_Pt","MC_GammaFromEta_Pt",250,0,25);
512 fMCList[iCut]->Add(fHistoMCGammaFromEtaPt[iCut]);
513 fHistoMCPosPionsFromEtaPt[iCut] = new TH1F("MC_PosPionsFromEta_Pt","MC_PosPionsFromEta_Pt",1000,0,25);
514 fMCList[iCut]->Add(fHistoMCPosPionsFromEtaPt[iCut]);
515 fHistoMCNegPionsFromEtaPt[iCut] = new TH1F("MC_NegPionsFromEta_Pt","MC_NegPionsFromEta_Pt",1000,0,25);
516 fMCList[iCut]->Add(fHistoMCNegPionsFromEtaPt[iCut]);
518 fHistoMCEtaPiPlPiMiGammaPt[iCut] = new TH1F("MC_Eta_Pt","MC_Eta_Pt",250,0,25);
519 fHistoMCEtaPiPlPiMiGammaPt[iCut]->Sumw2();
520 fMCList[iCut]->Add(fHistoMCEtaPiPlPiMiGammaPt[iCut]);
522 fHistoMCEtaDalitzPt[iCut] = new TH1F("MC_Eta_Dalitz_Pt","MC_Eta_Pt",250,0,25);
523 fHistoMCEtaDalitzPt[iCut]->Sumw2();
524 fMCList[iCut]->Add(fHistoMCEtaDalitzPt[iCut]);
526 fHistoMCEtaGGPt[iCut] = new TH1F("MC_Eta_GG_Pt","MC_Eta_GG_Pt",250,0,25);
527 fHistoMCEtaGGPt[iCut]->Sumw2();
528 fMCList[iCut]->Add(fHistoMCEtaGGPt[iCut]);
530 fHistoMCEtaPiPlPiMiGammaInAccPt[iCut] = new TH1F("MC_EtaInAcc_Pt","MC_EtaInAcc_Pt",250,0,25);
531 fHistoMCEtaPiPlPiMiGammaInAccPt[iCut]->Sumw2();
532 fMCList[iCut]->Add(fHistoMCEtaPiPlPiMiGammaInAccPt[iCut]);
534 fTrueList[iCut] = new TList();
535 fTrueList[iCut]->SetName(Form("%s_%s_%s True histograms",cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
536 fTrueList[iCut]->SetOwner(kTRUE);
537 fCutFolder[iCut]->Add(fTrueList[iCut]);
539 fHistoTrueConvGammaPt[iCut] = new TH1F("ESD_TrueConvGamma_Pt","ESD_TrueConvGamma_Pt",250,0,25);
540 fTrueList[iCut]->Add(fHistoTrueConvGammaPt[iCut]);
541 fHistoTrueConvGammaFromEtaPt[iCut] = new TH1F("ESD_TrueConvGammaFromEta_Pt","ESD_TrueConvGammaFromEta_Pt",250,0,25);
542 fTrueList[iCut]->Add(fHistoTrueConvGammaFromEtaPt[iCut]);
544 fHistoTruePosPionPt[iCut] = new TH1F("ESD_TruePosPion_Pt","ESD_TruePosPion_Pt",1000,0,25);
545 fTrueList[iCut]->Add(fHistoTruePosPionPt[iCut]);
546 fHistoTrueNegPionPt[iCut] = new TH1F("ESD_TrueNegPion_Pt","ESD_TrueNegPion_Pt",1000,0,25);
547 fTrueList[iCut]->Add(fHistoTrueNegPionPt[iCut]);
549 fHistoTrueNegPionFromEtaPt[iCut] = new TH1F("ESD_TrueNegPionFromEta_Pt","ESD_TrueNegPionFromEta_Pt",1000,0,25);
550 fTrueList[iCut]->Add(fHistoTrueNegPionFromEtaPt[iCut]);
551 fHistoTruePosPionFromEtaPt[iCut] = new TH1F("ESD_TruePosPionFromEta_Pt","ESD_TruePosPionFromEta_Pt",1000,0,25);
552 fTrueList[iCut]->Add(fHistoTruePosPionFromEtaPt[iCut]);
554 fHistoTrueMotherPiPlPiMiGammaInvMassPt[iCut] = new TH2F("ESD_TrueMotherPiPlPiMiGamma_InvMass_Pt","ESD_TrueMotherPiPlPiMiGamma_InvMass_Pt",450,0.3,0.75,250,0,25);
555 fHistoTrueMotherPiPlPiMiGammaInvMassPt[iCut]->Sumw2();
556 fTrueList[iCut]->Add(fHistoTrueMotherPiPlPiMiGammaInvMassPt[iCut]);
558 fHistoTrueMotherGammaGammaInvMassPt[iCut] = new TH2F("ESD_TrueMotherGG_InvMass_Pt","ESD_TrueMotherGG_InvMass_Pt",450,0.3,0.75,250,0,25);
559 fHistoTrueMotherGammaGammaInvMassPt[iCut]->Sumw2();
560 fTrueList[iCut]->Add(fHistoTrueMotherGammaGammaInvMassPt[iCut]);
562 fHistoTrueMotherDalitzInvMassPt[iCut] = new TH2F("ESD_TrueMotherDalitz_InvMass_Pt","ESD_TrueMotherDalitz_InvMass_Pt",450,0.3,0.75,250,0,25);
563 fHistoTrueMotherDalitzInvMassPt[iCut]->Sumw2();
564 fTrueList[iCut]->Add(fHistoTrueMotherDalitzInvMassPt[iCut]);
567 fHistoTruePionPionInvMassPt[iCut] = new TH2F("ESD_TruePiPlusPiNeg_InvMassPt","ESD_TruePiPlusPiNeg_InvMassPt",2000,0.,2.,200,0.,20.);
568 fTrueList[iCut]->Add(fHistoTruePionPionInvMassPt[iCut]);
569 fHistoTruePionPionFromEtaInvMassPt[iCut] = new TH2F("ESD_TruePiPlusPiNegFromEta_InvMassPt","ESD_TruePiPlusPiNegFromEta_InvMassPt",2000,0.,2.,200,0.,20.);
570 fTrueList[iCut]->Add(fHistoTruePionPionFromEtaInvMassPt[iCut]);
577 InitBack(); // Init Background Handler
579 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
580 if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
583 if((AliConversionCuts*)fV0Reader->GetConversionCuts())
584 if(((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms())
585 fOutputContainer->Add(((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms());
589 fPionSelector=(AliPrimaryPionSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("PionSelector");
590 if(!fPionSelector){printf("Error: No PionSelector");return;} // GetV0Reader
593 if ( ((AliPrimaryPionCuts*)fPionSelector->GetPrimaryPionCuts())->GetCutHistograms() ){
594 fOutputContainer->Add( ((AliPrimaryPionCuts*)fPionSelector->GetPrimaryPionCuts())->GetCutHistograms() );
598 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
600 if( ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutHistograms() ) {
601 fCutFolder[iCut]->Add( ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutHistograms() );
604 if( fMesonCutArray ) {
605 if( ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutHistograms() ) {
606 fCutFolder[iCut]->Add( ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutHistograms());
609 if( fGammaCutArray ) {
610 if( ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutHistograms() ) {
611 fCutFolder[iCut]->Add( ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutHistograms() );
616 PostData(1, fOutputContainer);
620 //______________________________________________________________________
621 void AliAnalysisTaskEtaToPiPlPiMiGamma::UserExec(Option_t *){
624 // Execute analysis for current event
627 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
628 if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
630 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
632 if(eventQuality == 2 || eventQuality == 3){// Event Not Accepted due to MC event missing or wrong trigger for V0ReaderV1
633 for(Int_t iCut = 0; iCut<fnCuts; iCut++){
634 fHistoNEvents[iCut]->Fill(eventQuality);
639 fPionSelector=(AliPrimaryPionSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("PionSelector");
640 if(!fPionSelector){printf("Error: No PionSelector");return;} // GetV0Reader
642 if(fIsMC) fMCEvent = MCEvent();
643 fESDEvent = (AliESDEvent*)InputEvent();
644 fReaderGammas = fV0Reader->GetReconstructedGammas(); // Gammas from default Cut
645 fSelectorNegPionIndex = fPionSelector->GetReconstructedNegPionIndex(); // Electrons from default Cut
646 fSelectorPosPionIndex = fPionSelector->GetReconstructedPosPionIndex(); // Positrons from default Cut
648 fNumberOfESDTracks = fV0Reader->GetNumberOfPrimaryTracks();
649 //AddTaskContainers(); //Add conatiner
651 for(Int_t iCut = 0; iCut<fnCuts; iCut++){
653 Int_t eventNotAccepted =
654 ((AliConversionCuts*)fGammaCutArray->At(iCut))
655 ->IsEventAcceptedByConversionCut(fV0Reader->GetConversionCuts(),fInputEvent,fMCEvent,fIsHeavyIon);
657 if(eventNotAccepted){
658 // cout << "event rejected due to wrong trigger: " <<eventNotAccepted << endl;
659 fHistoNEvents[iCut]->Fill(eventNotAccepted); // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
663 if(eventQuality != 0){// Event Not Accepted
664 // cout << "event rejected due to: " <<eventQuality << endl;
665 fHistoNEvents[iCut]->Fill(eventQuality);
669 fHistoNEvents[iCut]->Fill(eventQuality);
670 fHistoNGoodESDTracks[iCut]->Fill(fNumberOfESDTracks);
672 if(fMCEvent){ // Process MC Particle
673 fMCStack = fMCEvent->Stack();
674 if(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetSignalRejection() != 0){
675 ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetNotRejectedParticles(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetSignalRejection(), ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetAcceptedHeader(),
678 ProcessMCParticles();
681 fIsGammaEtaCand =kFALSE;
682 // cout << "new event" << endl;
683 ProcessPhotonCandidates(); // Process this cuts gammas
684 ProcessPionCandidates(); // Process this cuts gammas
687 CalculateMesonCandidates();
688 CalculateBackground();
689 UpdateEventByEventData();
691 fGoodGammas->Clear(); // delete this cuts good gammas
692 fGoodVirtualParticles->Clear(); // delete this cuts good gammas
695 fSelectorNegPionIndex.clear();
696 fSelectorPosPionIndex.clear();
698 PostData( 1, fOutputContainer );
701 Bool_t AliAnalysisTaskEtaToPiPlPiMiGamma::Notify(){
702 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
703 if( !((AliConversionCuts*)fGammaCutArray->At(iCut))->GetDoEtaShift() ){
704 fProfileEtaShift[iCut]->Fill(0.,0.);
705 continue; // No Eta Shift requested, continue
707 if( ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetEtaShift() == 0.0){ // Eta Shift requested but not set, get shift automatically
708 ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCorrectEtaShiftFromPeriod(fV0Reader->GetPeriodName());
709 ((AliConversionCuts*)fGammaCutArray->At(iCut))->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
710 ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->SetEtaShift( ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetEtaShift() );
711 fProfileEtaShift[iCut]->Fill(0.,(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetEtaShift()));
714 printf(" Eta t PiPlusPiMinus Gamma Task %s :: Eta Shift Manually Set to %f \n\n",
715 (((AliConversionCuts*)fGammaCutArray->At(iCut))->GetCutNumber()).Data(),((AliConversionCuts*)fGammaCutArray->At(iCut))->GetEtaShift());
716 ((AliConversionCuts*)fGammaCutArray->At(iCut))->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
717 ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->SetEtaShift( ((AliConversionCuts*)fGammaCutArray->At(iCut))->GetEtaShift() );
718 fProfileEtaShift[iCut]->Fill(0.,(((AliConversionCuts*)fGammaCutArray->At(iCut))->GetEtaShift()));
725 void AliAnalysisTaskEtaToPiPlPiMiGamma::Terminate(const Option_t *){
729 //________________________________________________________________________
730 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessPhotonCandidates(){
732 TList *GoodGammasStepOne = new TList();
733 TList *GoodGammasStepTwo = new TList();
734 // Loop over Photon Candidates allocated by ReaderV1
736 for(Int_t i = 0; i < fReaderGammas->GetEntriesFast(); i++){
737 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) fReaderGammas->At(i);
738 if(!PhotonCandidate) continue;
740 fIsFromMBHeader = kTRUE;
742 if( fMCEvent && ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 0 ){
743 Int_t isPosFromMBHeader
744 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack, fInputEvent);
745 if(isPosFromMBHeader == 0 && ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 3) continue;
746 Int_t isNegFromMBHeader
747 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
748 if(isNegFromMBHeader == 0 && ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 3) continue;
749 if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
752 if(!((AliConversionCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelected(PhotonCandidate,fESDEvent)) continue;
754 if(!((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut() &&
755 !((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){ // if no post reader loop is required add to events good gammas
757 fGoodGammas->Add(PhotonCandidate);
760 fHistoConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
761 fHistoConvGammaEta[fiCut]->Fill(PhotonCandidate->Eta());
765 ProcessTruePhotonCandidates(PhotonCandidate);
767 } else if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut()){ // if Shared Electron cut is enabled, Fill array, add to step one
768 ((AliConversionCuts*)fGammaCutArray->At(fiCut))->FillElectonLabelArray(PhotonCandidate,nV0);
770 GoodGammasStepOne->Add(PhotonCandidate);
771 } else if(!((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut() &&
772 ((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){ // shared electron is disabled, step one not needed -> step two
773 GoodGammasStepTwo->Add(PhotonCandidate);
778 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut()){
779 for(Int_t i = 0;i<GoodGammasStepOne->GetEntries();i++){
780 AliAODConversionPhoton *PhotonCandidate= (AliAODConversionPhoton*) GoodGammasStepOne->At(i);
781 if(!PhotonCandidate) continue;
782 fIsFromMBHeader = kTRUE;
783 if(fMCEvent && ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 0){
784 Int_t isPosFromMBHeader
785 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack,fInputEvent);
786 Int_t isNegFromMBHeader
787 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
788 if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
790 if(!((AliConversionCuts*)fGammaCutArray->At(fiCut))->RejectSharedElectronV0s(PhotonCandidate,i,GoodGammasStepOne->GetEntries())) continue;
791 if(!((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){ // To Colse v0s cut diabled, step two not needed
792 fGoodGammas->Add(PhotonCandidate);
794 fHistoConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
795 fHistoConvGammaEta[fiCut]->Fill(PhotonCandidate->Eta());
798 ProcessTruePhotonCandidates(PhotonCandidate);
801 else GoodGammasStepTwo->Add(PhotonCandidate); // Close v0s cut enabled -> add to list two
804 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){
805 for(Int_t i = 0;i<GoodGammasStepTwo->GetEntries();i++){
806 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) GoodGammasStepTwo->At(i);
807 if(!PhotonCandidate) continue;
809 if(fMCEvent && ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 0){
810 Int_t isPosFromMBHeader
811 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack,fInputEvent);
812 Int_t isNegFromMBHeader
813 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
814 if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
817 if(!((AliConversionCuts*)fGammaCutArray->At(fiCut))->RejectToCloseV0s(PhotonCandidate,GoodGammasStepTwo,i)) continue;
818 fGoodGammas->Add(PhotonCandidate); // Add gamma to current cut TList
821 fHistoConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt()); // Differences to old V0Reader in p_t due to conversion KF->TLorentzVector
822 fHistoConvGammaEta[fiCut]->Fill(PhotonCandidate->Eta());
826 ProcessTruePhotonCandidates(PhotonCandidate);
831 delete GoodGammasStepOne;
832 GoodGammasStepOne = 0x0;
833 delete GoodGammasStepTwo;
834 GoodGammasStepTwo = 0x0;
837 //________________________________________________________________________
838 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessTruePhotonCandidates(AliAODConversionPhoton *TruePhotonCandidate)
840 // Process True Photons
841 AliStack *MCStack = fMCEvent->Stack();
842 TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(MCStack);
843 TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(MCStack);
845 if(posDaughter == NULL || negDaughter == NULL) return; // One particle does not exist
846 if(posDaughter->GetMother(0) != negDaughter->GetMother(0)){ // Not Same Mother == Combinatorial Bck
850 else if (posDaughter->GetMother(0) == -1){
854 if(TMath::Abs(posDaughter->GetPdgCode())!=11 || TMath::Abs(negDaughter->GetPdgCode())!=11) return; //One Particle is not electron
855 if(posDaughter->GetPdgCode()==negDaughter->GetPdgCode()) return; // Same Charge
856 if(posDaughter->GetUniqueID() != 5 || negDaughter->GetUniqueID() !=5) return;// check if the daughters come from a conversion
858 TParticle *Photon = TruePhotonCandidate->GetMCParticle(MCStack);
859 if(Photon->GetPdgCode() != 22) return; // Mother is no Photon
863 Int_t labelGamma = TruePhotonCandidate->GetMCParticleLabel(MCStack);
865 if( labelGamma < MCStack->GetNprimary() ){
866 if( fIsFromMBHeader ){
867 fHistoTrueConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
871 if( IsEtaPiPlPiMiGammaDaughter(labelGamma) == kTRUE ) {
872 if( labelGamma < MCStack->GetNprimary() ) {
873 if( fIsFromMBHeader ){
874 fHistoTrueConvGammaFromEtaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
876 // TParticle * gammaMC = (TParticle*)MCStack->Particle(labelGamma);
877 // Int_t gammaMotherLabel=gammaMC->GetFirstMother();
878 // for(Int_t index= ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetFirstDaughter();index<= ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetLastDaughter();index++){
879 // TParticle* temp = (TParticle*)fMCStack->Particle( index );
880 // switch( temp->GetPdgCode() ) {
882 // cout << "pi- " << index << "\t" << temp->Pt() << "\t" << temp->Eta() << endl;
885 // cout << "pi+ " << index << "\t" << temp->Pt() << "\t" << temp->Eta() << endl;
888 // cout << "gamma " << index << "\t" << temp->Pt()<< "\t" << temp->Eta() << endl;
892 fIsGammaEtaCand = kTRUE;
898 //________________________________________________________________________
899 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessPionCandidates(){
901 Double_t magField = fInputEvent->GetMagneticField();
902 if( magField < 0.0 ){
908 vector<Int_t> lGoodNegPionIndexPrev(0);
909 vector<Int_t> lGoodPosPionIndexPrev(0);
911 for(UInt_t i = 0; i < fSelectorNegPionIndex.size(); i++){
912 AliESDtrack* negPionCandidate = fESDEvent->GetTrack(fSelectorNegPionIndex[i]);
913 if(! ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelected(negPionCandidate) ) continue;
914 lGoodNegPionIndexPrev.push_back( fSelectorNegPionIndex[i] );
915 fHistoNegPionPt[fiCut]->Fill(negPionCandidate->Pt());
916 fHistoNegPionPhi[fiCut]->Fill(negPionCandidate->Phi());
918 Int_t labelNegPion = TMath::Abs( negPionCandidate->GetLabel() );
919 if( labelNegPion < fMCStack->GetNtrack() ){
920 TParticle* negPion = fMCStack->Particle(labelNegPion);
921 if( negPion->GetPdgCode() == -211 ){
922 if( labelNegPion < fMCStack->GetNprimary() ){
923 fHistoTrueNegPionPt[fiCut]->Fill(negPionCandidate->Pt()); //primary negPion
925 if( IsEtaPiPlPiMiGammaDaughter(labelNegPion) == kTRUE ) {
926 if( labelNegPion < fMCStack->GetNprimary() ) {
927 fHistoTrueNegPionFromEtaPt[fiCut]->Fill(negPionCandidate->Pt());
928 // if (fIsGammaEtaCand) cout << "pi- rec" << labelNegPion << "\t" << negPionCandidate->Pt()<< endl;
936 for(UInt_t i = 0; i < fSelectorPosPionIndex.size(); i++){
937 AliESDtrack* posPionCandidate = fESDEvent->GetTrack( fSelectorPosPionIndex[i] );
938 if(! ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelected(posPionCandidate) ) continue;
939 lGoodPosPionIndexPrev.push_back( fSelectorPosPionIndex[i] );
940 fHistoPosPionPt[fiCut]->Fill( posPionCandidate->Pt() );
941 fHistoPosPionPhi[fiCut]->Fill( posPionCandidate->Phi() );
944 Int_t labelPosPion = TMath::Abs( posPionCandidate->GetLabel() );
945 if( labelPosPion < fMCStack->GetNtrack() ) {
946 TParticle* posPion = fMCStack->Particle(labelPosPion);
947 if( posPion->GetPdgCode() == 211 ){
948 if( labelPosPion < fMCStack->GetNprimary() ){
949 fHistoTruePosPionPt[fiCut]->Fill(posPionCandidate->Pt());
951 if( IsEtaPiPlPiMiGammaDaughter(labelPosPion) == kTRUE ) {
952 if( labelPosPion < fMCStack->GetNprimary() ){
953 fHistoTruePosPionFromEtaPt[fiCut]->Fill(posPionCandidate->Pt());
954 // if (fIsGammaEtaCand) cout << "pi+ rec" << labelPosPion << "\t" << posPionCandidate->Pt()<< endl;
963 for(UInt_t i = 0; i < lGoodNegPionIndexPrev.size(); i++){
965 AliESDtrack *negPionCandidate = fESDEvent->GetTrack(lGoodNegPionIndexPrev[i]);
966 AliKFParticle negPionCandidateKF( *negPionCandidate->GetConstrainedParam(), 211 );
968 for(UInt_t j = 0; j < lGoodPosPionIndexPrev.size(); j++){
970 AliESDtrack *posPionCandidate = fESDEvent->GetTrack(lGoodPosPionIndexPrev[j]);
971 AliKFParticle posPionCandidateKF( *posPionCandidate->GetConstrainedParam(), 211 );
973 AliKFConversionPhoton* virtualPhoton = NULL;
974 virtualPhoton = new AliKFConversionPhoton(negPionCandidateKF,posPionCandidateKF);
975 AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
976 // primaryVertexImproved+=*virtualPhoton;
977 virtualPhoton->SetProductionVertex(primaryVertexImproved);
978 virtualPhoton->SetTrackLabels( lGoodPosPionIndexPrev[j], lGoodNegPionIndexPrev[i]);
982 Int_t labeln=TMath::Abs(negPionCandidate->GetLabel());
983 Int_t labelp=TMath::Abs(posPionCandidate->GetLabel());
984 TParticle *fNegativeMCParticle = fMCStack->Particle(labeln);
985 TParticle *fPositiveMCParticle = fMCStack->Particle(labelp);
987 if( fPositiveMCParticle && fNegativeMCParticle) {
988 virtualPhoton->SetMCLabelPositive(labelp);
989 virtualPhoton->SetMCLabelNegative(labeln);
993 AliAODConversionPhoton *vParticle = new AliAODConversionPhoton(virtualPhoton); //To Apply PsiPairCut
994 if (((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->DoMassCut()){
995 if (vParticle->GetMass() < ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetMassCut()){
996 fGoodVirtualParticles->Add( vParticle );
999 fGoodVirtualParticles->Add( vParticle );
1001 delete virtualPhoton;
1008 //_____________________________________________________________________________
1009 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessMCParticles(){
1011 // Loop over all primary MC particle
1013 for(Int_t i = 0; i < fMCStack->GetNprimary(); i++) {
1015 TParticle* particle = (TParticle *)fMCStack->Particle(i);
1016 if (!particle) continue;
1018 Int_t isMCFromMBHeader = -1;
1019 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 0){
1021 = ((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack, fInputEvent);
1022 if(isMCFromMBHeader == 0 && ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetSignalRejection() != 3) continue;
1025 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
1027 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelectedMC(particle,fMCStack,kFALSE)){
1028 fHistoMCAllGammaPt[fiCut]->Fill(particle->Pt()); // All MC Gamma
1029 if(particle->GetMother(0) >-1){
1030 if (fMCStack->Particle(particle->GetMother(0))->GetPdgCode() ==221 && fMCStack->Particle(particle->GetMother(0))->GetNDaughters()==3 ) fHistoMCGammaFromEtaPt[fiCut]->Fill(particle->Pt()); // All pos from eta
1034 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelectedMC(particle,fMCStack,kTRUE)){
1035 fHistoMCConvGammaPt[fiCut]->Fill(particle->Pt());
1036 } // Converted MC Gamma
1038 if(((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelectedMC(i,fMCStack)){
1039 if( particle->GetPdgCode() == 211){
1040 fHistoMCAllPosPionsPt[fiCut]->Fill(particle->Pt()); // All pos pions
1041 if(particle->GetMother(0) >-1){
1042 if (fMCStack->Particle(particle->GetMother(0))->GetPdgCode() ==221) fHistoMCPosPionsFromEtaPt[fiCut]->Fill(particle->Pt()); // All pos from eta
1045 if( particle->GetPdgCode() == -211){
1046 fHistoMCAllNegPionsPt[fiCut]->Fill(particle->Pt()); // All neg pions
1047 if(particle->GetMother(0) >-1){
1048 if (fMCStack->Particle(particle->GetMother(0))->GetPdgCode() ==221) fHistoMCNegPionsFromEtaPt[fiCut]->Fill(particle->Pt()); // All pos from eta
1053 // \eta -> \gamma \gamma
1055 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelectedMC( particle,fMCStack,((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetEtaShift() ) ){
1056 Float_t weighted= 1;
1057 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1058 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack, fInputEvent)){
1059 if (particle->Pt()>0.005){
1060 weighted= ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
1064 if(particle->GetPdgCode() == 221)fHistoMCEtaGGPt[fiCut]->Fill( particle->Pt() , weighted); // All MC Eta GG decay
1067 // \eta -> e+ e- \gamma
1068 Int_t labelgamma = -1;
1069 Int_t labelelectron = -1;
1070 Int_t labelpositron = -1;
1072 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelectedMCDalitz(particle,fMCStack,labelelectron,labelpositron,labelgamma,((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetEtaShift())){
1073 Float_t weighted= 1;
1074 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1075 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
1076 if (particle->Pt()>0.005){
1077 weighted= ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
1081 if(particle->GetPdgCode() == 221)fHistoMCEtaDalitzPt[fiCut]->Fill(particle->Pt(), weighted); // All MC Eta
1085 // \eta -> pi+ pi- \gamma
1086 Int_t labelGamma3Body = -1;
1087 Int_t labelNegPion = -1;
1088 Int_t labelPosPion = -1;
1090 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelectedMCEtaPiPlPiMiGamma(particle,fMCStack,labelNegPion,labelPosPion,labelGamma3Body,((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetEtaShift())){
1091 Float_t weighted= 1;
1092 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1093 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
1094 if (particle->Pt()>0.005){
1095 weighted= ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
1099 if(particle->GetPdgCode() == 221)fHistoMCEtaPiPlPiMiGammaPt[fiCut]->Fill(particle->Pt(), weighted); // All MC Eta
1101 TParticle *gamma = fMCStack->Particle(labelGamma3Body);
1102 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelectedMC(gamma,fMCStack,kFALSE) &&
1103 ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelectedMC(labelNegPion,fMCStack) &&
1104 ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelectedMC(labelPosPion,fMCStack) ) {
1105 if(particle->GetPdgCode() == 221)fHistoMCEtaPiPlPiMiGammaInAccPt[fiCut]->Fill(particle->Pt(), weighted ); // MC EtaDalitz with gamma and e+e- in acc
1113 //________________________________________________________________________
1114 void AliAnalysisTaskEtaToPiPlPiMiGamma::CalculateMesonCandidates(){
1116 // Conversion Gammas
1117 if( fGoodGammas->GetEntries() > 0 && fGoodVirtualParticles->GetEntries() > 0 ){
1119 vector<Bool_t> lGoodVirtualParticle(fGoodVirtualParticles->GetEntries(), kFALSE);
1121 for(Int_t GammaIndex=0; GammaIndex<fGoodGammas->GetEntries(); GammaIndex++){
1123 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(GammaIndex));
1124 if (gamma==NULL) continue;
1125 for(Int_t virtualParticleIndex=0;virtualParticleIndex<fGoodVirtualParticles->GetEntries();virtualParticleIndex++){
1127 AliAODConversionPhoton *vParticle=dynamic_cast<AliAODConversionPhoton*>(fGoodVirtualParticles->At(virtualParticleIndex));
1128 if (vParticle==NULL) continue;
1129 //Check for same Electron ID
1130 if(gamma->GetTrackLabelPositive() == vParticle->GetTrackLabelPositive() ||
1131 gamma->GetTrackLabelNegative() == vParticle->GetTrackLabelNegative() ||
1132 gamma->GetTrackLabelNegative() == vParticle->GetTrackLabelPositive() ||
1133 gamma->GetTrackLabelPositive() == vParticle->GetTrackLabelNegative() ) continue;
1135 AliAODConversionMother *etacand = new AliAODConversionMother(gamma,vParticle);
1136 etacand->SetLabels(GammaIndex,virtualParticleIndex);
1139 // AliESDtrack *posPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelNegative() );
1140 // AliESDtrack *negPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelPositive() );
1142 // Int_t labeln=TMath::Abs(negPionVParticle->GetLabel());
1143 // Int_t labelp=TMath::Abs(posPionVParticle->GetLabel());
1145 // cout << labeln << "\t" << labelp << endl;
1148 if( ( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelected(etacand,kTRUE,((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetEtaShift())) ){
1150 // cout<< "Meson Accepted "<<endl;
1152 Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
1154 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1155 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
1157 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
1160 AliESDtrack *posPionVParticle = 0;
1161 AliESDtrack *negPionVParticle = 0;
1163 Double_t clsToFPos = -1.0;
1164 Double_t clsToFNeg = -1.0;
1166 Float_t dcaToVertexXYPos = -1.0;
1167 Float_t dcaToVertexZPos = -1.0;
1168 Float_t dcaToVertexXYNeg = -1.0;
1169 Float_t dcaToVertexZNeg = -1.0;
1174 fHistoPionPionInvMassPt[fiCut]->Fill( vParticle->GetMass(),vParticle->Pt());
1176 posPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelPositive() );
1177 negPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelNegative() );
1178 clsToFPos = ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetNFindableClustersTPC(posPionVParticle);
1179 clsToFNeg = ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetNFindableClustersTPC(negPionVParticle);
1183 posPionVParticle->GetImpactParameters(bPos,bCovPos);
1184 if (bCovPos[0]<=0 || bCovPos[2]<=0) {
1185 AliDebug(1, "Estimated b resolution lower or equal zero!");
1186 bCovPos[0]=0; bCovPos[2]=0;
1191 posPionVParticle->GetImpactParameters(bNeg,bCovNeg);
1192 if (bCovNeg[0]<=0 || bCovNeg[2]<=0) {
1193 AliDebug(1, "Estimated b resolution lower or equal zero!");
1194 bCovNeg[0]=0; bCovNeg[2]=0;
1197 dcaToVertexXYPos = bPos[0];
1198 dcaToVertexZPos = bPos[1];
1199 dcaToVertexXYNeg = bNeg[0];
1200 dcaToVertexZNeg = bNeg[1];
1203 fHistoMotherInvMassPt[fiCut]->Fill(etacand->M(),etacand->Pt());
1204 Double_t sparesFill[4] = {etacand->M(),etacand->Pt(),(Double_t)zbin,(Double_t)mbin};
1205 fTHnSparseMotherInvMassPtZM[fiCut]->Fill(sparesFill,1);
1208 if( lGoodVirtualParticle[virtualParticleIndex] == kFALSE ) {
1210 fHistoNegPionEta[fiCut]->Fill( negPionVParticle->Eta() );
1211 fHistoPosPionEta[fiCut]->Fill( posPionVParticle->Eta() );
1213 fHistoNegPionClsTPC[fiCut]->Fill(clsToFNeg,negPionVParticle->Pt());
1214 fHistoPosPionClsTPC[fiCut]->Fill(clsToFPos,posPionVParticle->Pt());
1216 fHistoPionDCAxy[fiCut]->Fill( dcaToVertexXYNeg, negPionVParticle->Pt() );
1217 fHistoPionDCAz[fiCut]->Fill( dcaToVertexZNeg, negPionVParticle->Pt() );
1218 fHistoPionDCAxy[fiCut]->Fill( dcaToVertexXYPos, posPionVParticle->Pt() );
1219 fHistoPionDCAz[fiCut]->Fill( dcaToVertexZPos, posPionVParticle->Pt() );
1221 fHistoPionTPCdEdxNSigma[fiCut]->Fill( posPionVParticle->P(),((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(posPionVParticle, AliPID::kPion) );
1222 fHistoPionTPCdEdxNSigma[fiCut]->Fill( negPionVParticle->P(),((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(negPionVParticle, AliPID::kPion) );
1224 fHistoPionTPCdEdx[fiCut]->Fill( posPionVParticle->P(), TMath::Abs(posPionVParticle->GetTPCsignal()));
1225 fHistoPionTPCdEdx[fiCut]->Fill( negPionVParticle->P(), TMath::Abs(negPionVParticle->GetTPCsignal()));
1227 lGoodVirtualParticle[virtualParticleIndex] = kTRUE;
1234 ProcessTrueMesonCandidates(etacand,gamma,vParticle);
1244 //________________________________________________________________________
1245 void AliAnalysisTaskEtaToPiPlPiMiGamma::CalculateBackground(){
1247 Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
1251 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1252 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
1254 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
1258 AliGammaConversionAODBGHandler::GammaConversionVertex *bgEventVertex = NULL;
1259 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity() ) {
1260 for(Int_t nEventsInBG=0;nEventsInBG<fBGHandler[fiCut]->GetNBGEvents();nEventsInBG++){
1261 AliGammaConversionAODVector *previousEventV0s = fBGHandler[fiCut]->GetBGGoodV0s(zbin,mbin,nEventsInBG);
1262 if(fMoveParticleAccordingToVertex == kTRUE && method == 1){
1263 bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
1266 for(Int_t iCurrent=0;iCurrent<fGoodVirtualParticles->GetEntries();iCurrent++){
1267 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualParticles->At(iCurrent));
1269 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1270 AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
1272 if(fMoveParticleAccordingToVertex == kTRUE && method == 1 ){
1273 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
1276 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
1279 if( ( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE, ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetEtaShift()))){
1280 fHistoMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
1281 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1282 fTHnSparseMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1284 delete backgroundCandidate;
1285 backgroundCandidate = 0x0;
1290 for(Int_t nEventsInBG=0;nEventsInBG <fBGHandler[fiCut]->GetNBGEvents();nEventsInBG++){
1291 AliGammaConversionAODVector *previousEventV0s = fBGHandler[fiCut]->GetBGGoodV0s(zbin,mbin,nEventsInBG);
1292 if(previousEventV0s){
1293 if(fMoveParticleAccordingToVertex == kTRUE && method == 1){
1294 bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
1296 for(Int_t iCurrent=0;iCurrent<fGoodVirtualParticles->GetEntries();iCurrent++){
1298 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualParticles->At(iCurrent));
1300 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1302 AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
1304 if(fMoveParticleAccordingToVertex == kTRUE && method ==1){
1305 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
1308 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
1310 if((((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE,((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetEtaShift()))){
1311 fHistoMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
1312 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1313 fTHnSparseMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1315 delete backgroundCandidate;
1316 backgroundCandidate = 0x0;
1324 //______________________________________________________________________
1325 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessTrueMesonCandidates(AliAODConversionMother *EtaCandidate, AliAODConversionPhoton *TrueGammaCandidate, AliAODConversionPhoton *TrueVirtualParticleCandidate){
1327 // Process True Mesons
1329 AliStack *MCStack = fMCEvent->Stack();
1331 if( TrueGammaCandidate->GetV0Index()<fESDEvent->GetNumberOfV0s() ){
1333 Bool_t isTrueEta = kFALSE;
1334 Int_t gammaMCLabel = TrueGammaCandidate->GetMCParticleLabel(MCStack);
1335 Int_t gammaMotherLabel = -1;
1336 Bool_t gammaEtaCand = kFALSE;
1338 if(gammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
1339 // Daughters Gamma 0
1340 TParticle * negativeMC = (TParticle*)TrueGammaCandidate->GetNegativeMCDaughter(MCStack);
1341 TParticle * positiveMC = (TParticle*)TrueGammaCandidate->GetPositiveMCDaughter(MCStack);
1342 TParticle * gammaMC = (TParticle*)MCStack->Particle(gammaMCLabel);
1344 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){ // Electrons ...
1345 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
1346 if(gammaMC->GetPdgCode() == 22){ // ... with Gamma Mother
1347 gammaMotherLabel=gammaMC->GetFirstMother();
1348 if( ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetNDaughters() == 3 && ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetPdgCode() == 221 ) gammaEtaCand = kTRUE;
1356 Int_t virtualParticleMCLabel = TrueVirtualParticleCandidate->GetMCParticleLabel(MCStack);
1357 Int_t virtualParticleMotherLabel = -1;
1359 Bool_t isPiPiDecay = kFALSE;
1360 Bool_t isDalitz = kFALSE;
1361 Bool_t isRealGamma = kFALSE;
1364 TParticle * negativeMC = (TParticle*)TrueVirtualParticleCandidate->GetNegativeMCDaughter(MCStack);
1365 TParticle * positiveMC = (TParticle*)TrueVirtualParticleCandidate->GetPositiveMCDaughter(MCStack);
1366 // if (gammaEtaCand){
1367 // cout << "neg Part: label - " << TrueVirtualParticleCandidate->GetMCLabelNegative() <<" pdg-code - " << negativeMC->GetPdgCode() << endl;
1368 // cout << "pos Part: label - " << TrueVirtualParticleCandidate->GetMCLabelPositive() <<" pdg-code - " << positiveMC->GetPdgCode() << endl;
1370 if(TMath::Abs(negativeMC->GetPdgCode())==211 && TMath::Abs(positiveMC->GetPdgCode())==211){ // Pions ...
1371 fHistoTruePionPionInvMassPt[fiCut]->Fill(TrueVirtualParticleCandidate->GetMass(),TrueVirtualParticleCandidate->Pt());
1375 if(virtualParticleMCLabel != -1){ // if virtualParticleMCLabel==-1 particles don't have same mother
1376 TParticle * negativeMC = (TParticle*)TrueVirtualParticleCandidate->GetNegativeMCDaughter(MCStack);
1377 TParticle * positiveMC = (TParticle*)TrueVirtualParticleCandidate->GetPositiveMCDaughter(MCStack);
1378 TParticle * virtualParticleMotherMC = (TParticle*)MCStack->Particle(virtualParticleMCLabel);
1379 // cout << "pdg code same mother - " << virtualParticleMotherMC->GetPdgCode() << endl;
1381 if(TMath::Abs(negativeMC->GetPdgCode())==211 && TMath::Abs(positiveMC->GetPdgCode())==211){ // Pions ...
1382 virtualParticleMotherLabel=virtualParticleMCLabel;
1384 } else if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){ // Electrons ...
1385 if( virtualParticleMotherMC->GetPdgCode() != 22 ){
1386 virtualParticleMotherLabel=virtualParticleMCLabel;
1388 } else if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
1389 virtualParticleMotherLabel=virtualParticleMotherMC->GetFirstMother();
1390 isRealGamma = kTRUE; //no virtual gamma
1395 if(gammaMotherLabel >= 0 && ( gammaMotherLabel == virtualParticleMotherLabel) ){
1396 if(((TParticle*)MCStack->Particle(virtualParticleMotherLabel))->GetPdgCode() == 221){
1401 if( isTrueEta ){ // True Eta
1402 if ( isPiPiDecay) { //real eta -> Pi+ Pi- Gamma
1403 Float_t weighted= 1;
1404 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1405 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
1406 if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
1407 weighted= ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
1411 fHistoTruePionPionFromEtaInvMassPt[fiCut]->Fill(TrueVirtualParticleCandidate->GetMass(),TrueVirtualParticleCandidate->Pt());
1412 fHistoTrueMotherPiPlPiMiGammaInvMassPt[fiCut]->Fill(EtaCandidate->M(),EtaCandidate->Pt(),weighted);
1413 } else if ( isRealGamma ){
1414 Float_t weighted= 1;
1415 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1416 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
1417 if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
1418 weighted= ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
1423 fHistoTrueMotherGammaGammaInvMassPt[fiCut]->Fill(EtaCandidate->M(),EtaCandidate->Pt(),weighted);
1424 } else if (isDalitz) {
1425 Float_t weighted= 1;
1426 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1427 if(((AliConversionCuts*)fGammaCutArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
1428 if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
1429 weighted= ((AliConversionCuts*)fGammaCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
1433 fHistoTrueMotherDalitzInvMassPt[fiCut]->Fill(EtaCandidate->M(),EtaCandidate->Pt(),weighted);
1440 //________________________________________________________________________
1441 void AliAnalysisTaskEtaToPiPlPiMiGamma::UpdateEventByEventData(){
1442 //see header file for documentation
1446 if(fGoodGammas->GetEntries() >0 ){
1447 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1448 fBGHandler[fiCut]->AddEvent(fGoodGammas,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fV0Reader->GetNumberOfPrimaryTracks(),0);
1449 } else{ // means we use #V0s for multiplicity
1450 fBGHandler[fiCut]->AddEvent(fGoodGammas,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fGoodGammas->GetEntries(),0);
1453 } else if ( method == 2 ){
1454 if(fGoodVirtualParticles->GetEntries() > 0 ){
1455 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1456 fBGHandler[fiCut]->AddEvent(fGoodVirtualParticles,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fV0Reader->GetNumberOfPrimaryTracks(),0);
1457 } else{ // means we use #V0s for multiplicity
1458 fBGHandler[fiCut]->AddEvent(fGoodVirtualParticles,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fGoodVirtualParticles->GetEntries(),0);
1464 //________________________________________________________________________
1465 void AliAnalysisTaskEtaToPiPlPiMiGamma::MoveParticleAccordingToVertex(AliAODConversionPhoton* particle,const AliGammaConversionAODBGHandler::GammaConversionVertex *vertex){
1466 //see header file for documentation
1468 Double_t dx = vertex->fX - fInputEvent->GetPrimaryVertex()->GetX();
1469 Double_t dy = vertex->fY - fInputEvent->GetPrimaryVertex()->GetY();
1470 Double_t dz = vertex->fZ - fInputEvent->GetPrimaryVertex()->GetZ();
1472 Double_t movedPlace[3] = {particle->GetConversionX() - dx,particle->GetConversionY() - dy,particle->GetConversionZ() - dz};
1473 particle->SetConversionPoint(movedPlace);
1476 //_____________________________________________________________________________________
1477 Bool_t AliAnalysisTaskEtaToPiPlPiMiGamma::IsEtaPiPlPiMiGammaDaughter( Int_t label ) const {
1479 // Returns true if the particle comes from eta -> pi+ pi- gamma
1481 Int_t motherLabel = fMCStack->Particle( label )->GetMother(0);
1482 if( motherLabel < 0 || motherLabel >= fMCStack->GetNtrack() ) return kFALSE;
1484 TParticle* mother = fMCStack->Particle( motherLabel );
1485 if( mother->GetPdgCode() != 221 ) return kFALSE;
1486 if( IsPiPlPiMiGammaDecay( mother ) ) return kTRUE;
1490 //_____________________________________________________________________________
1491 Bool_t AliAnalysisTaskEtaToPiPlPiMiGamma::IsPiPlPiMiGammaDecay(TParticle *fMCMother) const
1494 if( fMCMother->GetNDaughters() != 3 ) return kFALSE;
1495 if( fMCMother->GetPdgCode() != 221 ) return kFALSE;
1498 TParticle *posPion = 0x0;
1499 TParticle *negPion = 0x0;
1500 TParticle *gamma = 0x0;
1502 for(Int_t index= fMCMother->GetFirstDaughter();index<= fMCMother->GetLastDaughter();index++){
1503 TParticle* temp = (TParticle*)fMCStack->Particle( index );
1505 switch( temp->GetPdgCode() ) {
1518 if( posPion && negPion && gamma) return kTRUE;