1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: Friederike Bock *
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 **************************************************************************/
16 // Analysis task for eta->pi+ +pi- gamma (pion Dalitz decay)
20 #include "TParticle.h"
22 #include "TMCProcess.h"
23 #include "TDatabasePDG.h"
26 #include "TDirectory.h"
30 #include "THnSparse.h"
33 #include "AliAnalysisManager.h"
34 #include "AliESDInputHandler.h"
35 #include "AliESDtrack.h"
36 #include "AliMCEvent.h"
38 #include "AliMCEventHandler.h"
41 #include "AliESDtrackCuts.h"
42 #include "AliESDpidCuts.h"
43 #include "AliMCEvent.h"
45 #include "AliESDEvent.h"
46 #include "AliESDpid.h"
47 #include "AliKFParticle.h"
48 #include "AliMCEventHandler.h"
49 #include "AliKFVertex.h"
50 #include "AliTriggerAnalysis.h"
51 #include "AliCentrality.h"
52 #include "AliMultiplicity.h"
53 #include "AliAnalysisTaskEtaToPiPlPiMiGamma.h"
56 ClassImp( AliAnalysisTaskEtaToPiPlPiMiGamma )
58 //-----------------------------------------------------------------------------------------------
59 AliAnalysisTaskEtaToPiPlPiMiGamma::AliAnalysisTaskEtaToPiPlPiMiGamma():
74 fSelectorNegPionIndex(0),
75 fSelectorPosPionIndex(0),
77 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 fEventCutArray(NULL),
165 fGammaCutArray(NULL),
167 fMesonCutArray(NULL),
169 fConversionCuts(NULL),
170 fHistoConvGammaPt(NULL),
171 fHistoConvGammaEta(NULL),
172 fHistoNegPionPt(NULL),
173 fHistoPosPionPt(NULL),
174 fHistoNegPionPhi(NULL),
175 fHistoPosPionPhi(NULL),
176 fHistoNegPionEta(NULL),
177 fHistoPosPionEta(NULL),
178 fHistoNegPionClsTPC(NULL),
179 fHistoPosPionClsTPC(NULL),
180 fHistoPionDCAxy(NULL),
181 fHistoPionDCAz(NULL),
182 fHistoPionTPCdEdxNSigma(NULL),
183 fHistoPionTPCdEdx(NULL),
184 fHistoPionPionInvMassPt(NULL),
185 fHistoMotherInvMassPt(NULL),
186 fTHnSparseMotherInvMassPtZM(NULL),
187 fHistoMotherBackInvMassPt(NULL),
188 fTHnSparseMotherBackInvMassPtZM(NULL),
189 fHistoMCAllGammaPt(NULL),
190 fHistoMCConvGammaPt(NULL),
191 fHistoMCAllPosPionsPt(NULL),
192 fHistoMCAllNegPionsPt(NULL),
193 fHistoMCGammaFromEtaPt(NULL),
194 fHistoMCPosPionsFromEtaPt(NULL),
195 fHistoMCNegPionsFromEtaPt(NULL),
196 fHistoMCEtaPiPlPiMiGammaPt(NULL),
197 fHistoMCEtaGGPt(NULL),
198 fHistoMCEtaDalitzPt(NULL),
199 fHistoMCEtaPiPlPiMiGammaInAccPt(NULL),
200 fHistoTrueMotherPiPlPiMiGammaInvMassPt(NULL),
201 fHistoTrueMotherGammaGammaInvMassPt(NULL),
202 fHistoTrueMotherDalitzInvMassPt(NULL),
203 fHistoTrueConvGammaPt(NULL),
204 fHistoTrueConvGammaFromEtaPt(NULL),
205 fHistoTruePosPionPt(NULL),
206 fHistoTruePosPionFromEtaPt(NULL),
207 fHistoTrueNegPionPt(NULL),
208 fHistoTrueNegPionFromEtaPt(NULL),
209 fHistoTruePionPionInvMassPt(NULL),
210 fHistoTruePionPionFromEtaInvMassPt(NULL),
212 fHistoNGoodESDTracks(NULL),
213 fProfileEtaShift(NULL),
217 fNumberOfESDTracks(0),
218 fMoveParticleAccordingToVertex(kFALSE),
220 fDoMesonAnalysis(kTRUE),
222 fIsFromMBHeader(kTRUE),
224 fIsGammaEtaCand(kFALSE)
226 DefineOutput(1, TList::Class());
229 //-----------------------------------------------------------------------------------------------
230 AliAnalysisTaskEtaToPiPlPiMiGamma::~AliAnalysisTaskEtaToPiPlPiMiGamma()
233 // virtual destructor
235 cout<<"Destructor"<<endl;
240 if(fGoodVirtualParticles){
241 delete fGoodVirtualParticles;
249 //___________________________________________________________
250 void AliAnalysisTaskEtaToPiPlPiMiGamma::InitBack(){
252 const Int_t nDim = 4;
253 Int_t nBins[nDim] = {450,250,7,4};
254 Double_t xMin[nDim] = {0.3,0, 0,0};
255 Double_t xMax[nDim] = {0.75,25,7,4};
257 fTHnSparseMotherInvMassPtZM = new THnSparseF*[fnCuts];
258 fTHnSparseMotherBackInvMassPtZM = new THnSparseF*[fnCuts];
260 fBGHandler = new AliGammaConversionAODBGHandler*[fnCuts];
261 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
263 TString cutstringEvent = ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber();
264 TString cutstringPion = ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutNumber();
265 TString cutstringMeson = ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutNumber();
266 TString cutstringGamma = ((AliConversionPhotonCuts*)fGammaCutArray->At(iCut))->GetCutNumber();
268 Int_t collisionSystem = atoi((TString)(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber())(0,1));
269 Int_t centMin = atoi((TString)(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber())(1,1));
270 Int_t centMax = atoi((TString)(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber())(2,1));
272 if(collisionSystem == 1 || collisionSystem == 2 ||
273 collisionSystem == 5 || collisionSystem == 8 ||
274 collisionSystem == 9){
275 centMin = centMin*10;
276 centMax = centMax*10;
278 else if(collisionSystem == 3 || collisionSystem == 6){
282 else if(collisionSystem == 4 || collisionSystem == 7){
283 centMin = ((centMin*5)+45);
284 centMax = ((centMax*5)+45);
288 fBackList[iCut] = new TList();
289 fBackList[iCut]->SetName(Form("%s_%s_%s_%s Back histograms",cutstringEvent.Data(),cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
290 fBackList[iCut]->SetOwner(kTRUE);
291 fCutFolder[iCut]->Add(fBackList[iCut]);
293 fTHnSparseMotherBackInvMassPtZM[iCut] = new THnSparseF("Back_Back_InvMass_Pt_z_m","Back_Back_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
294 fBackList[iCut]->Add(fTHnSparseMotherBackInvMassPtZM[iCut]);
296 fMotherList[iCut] = new TList();
297 fMotherList[iCut]->SetName(Form("%s_%s_%s_%s Mother histograms",cutstringEvent.Data(),cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
298 fMotherList[iCut]->SetOwner(kTRUE);
299 fCutFolder[iCut]->Add(fMotherList[iCut]);
301 fTHnSparseMotherInvMassPtZM[iCut] = new THnSparseF("Back_Mother_InvMass_Pt_z_m","Back_Mother_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
302 fMotherList[iCut]->Add(fTHnSparseMotherInvMassPtZM[iCut]);
305 fBGHandler[iCut] = new AliGammaConversionAODBGHandler( collisionSystem,centMin,centMax,
306 ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->GetNumberOfBGEvents(),
307 ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity());
312 //______________________________________________________________________
313 void AliAnalysisTaskEtaToPiPlPiMiGamma::UserCreateOutputObjects()
316 // Create ouput objects
319 // Create the output container
320 if(fOutputContainer != NULL){
321 delete fOutputContainer;
322 fOutputContainer = NULL;
324 if(fOutputContainer == NULL){
325 fOutputContainer = new TList();
326 fOutputContainer->SetOwner(kTRUE);
329 fGoodGammas = new TList();
330 //fGoodGammas->SetOwner(kTRUE);
332 fGoodVirtualParticles = new TList();
333 //fGoodVirtualParticles->SetOwner(kTRUE);
335 fCutFolder = new TList*[fnCuts];
336 fESDList = new TList*[fnCuts];
337 fBackList = new TList*[fnCuts];
338 fMotherList = new TList*[fnCuts];
339 fHistoNEvents = new TH1I*[fnCuts];
340 fHistoNGoodESDTracks = new TH1I*[fnCuts];
341 fProfileEtaShift = new TProfile*[fnCuts];
342 fHistoConvGammaPt = new TH1F*[fnCuts];
343 fHistoConvGammaEta = new TH1F*[fnCuts];
344 fHistoNegPionPt = new TH1F*[fnCuts];
345 fHistoPosPionPt = new TH1F*[fnCuts];
346 fHistoNegPionPhi = new TH1F*[fnCuts];
347 fHistoPosPionPhi = new TH1F*[fnCuts];
350 fHistoNegPionEta = new TH1F*[fnCuts];
351 fHistoPosPionEta = new TH1F*[fnCuts];
352 fHistoNegPionClsTPC = new TH2F*[fnCuts];
353 fHistoPosPionClsTPC = new TH2F*[fnCuts];
354 fHistoPionDCAxy = new TH2F*[fnCuts];
355 fHistoPionDCAz = new TH2F*[fnCuts];
356 fHistoPionTPCdEdxNSigma = new TH2F*[fnCuts];
357 fHistoPionTPCdEdx = new TH2F*[fnCuts];
358 fHistoPionPionInvMassPt = new TH2F*[fnCuts];
362 fHistoMotherInvMassPt = new TH2F*[fnCuts];
363 fHistoMotherBackInvMassPt = new TH2F*[fnCuts];
365 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
366 TString cutstringEvent = ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber();
367 TString cutstringPion = ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutNumber();
368 TString cutstringMeson = ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutNumber();
369 TString cutstringGamma = ((AliConversionPhotonCuts*)fGammaCutArray->At(iCut))->GetCutNumber();
371 fCutFolder[iCut] = new TList();
372 fCutFolder[iCut]->SetName(Form("Cut Number %s_%s_%s_%s",cutstringEvent.Data(),cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
373 fCutFolder[iCut]->SetOwner(kTRUE);
374 fOutputContainer->Add(fCutFolder[iCut]);
376 fESDList[iCut] = new TList();
377 fESDList[iCut]->SetName(Form("%s_%s_%s_%s ESD histograms",cutstringEvent.Data(),cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
378 fESDList[iCut]->SetOwner(kTRUE);
380 fHistoNEvents[iCut] = new TH1I("NEvents","NEvents",9,-0.5,8.5);
381 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(1,"Accepted");
382 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(2,"Centrality");
383 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(3,"Missing MC");
384 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(4,"Trigger");
385 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(5,"Vertex Z");
386 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(6,"Cont. Vertex");
387 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(7,"Pile-Up");
388 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(8,"no SDD");
389 fHistoNEvents[iCut]->GetXaxis()->SetBinLabel(9,"no V0AND");
390 fESDList[iCut]->Add(fHistoNEvents[iCut]);
392 if(fIsHeavyIon) fHistoNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",3000,0,3000);
393 else fHistoNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
394 fESDList[iCut]->Add(fHistoNGoodESDTracks[iCut]);
396 fProfileEtaShift[iCut] = new TProfile("Eta Shift","Eta Shift",1, -0.5,0.5);
397 fESDList[iCut]->Add(fProfileEtaShift[iCut]);
398 fHistoConvGammaPt[iCut] = new TH1F("ESD_ConvGamma_Pt","ESD_ConvGamma_Pt",250,0,25);
399 fESDList[iCut]->Add(fHistoConvGammaPt[iCut]);
400 fHistoConvGammaEta[iCut] = new TH1F("ESD_ConvGamma_Eta","ESD_ConvGamma_Eta",600,-1.5,1.5);
401 fESDList[iCut]->Add(fHistoConvGammaEta[iCut]);
402 fHistoNegPionPt[iCut] = new TH1F("ESD_PrimaryNegPions_Pt","ESD_PrimaryNegPions_Pt",1000,0,25);
403 fESDList[iCut]->Add(fHistoNegPionPt[iCut]);
404 fHistoPosPionPt[iCut] = new TH1F("ESD_PrimaryPosPions_Pt","ESD_PrimaryPosPions_Pt",1000,0,25);
405 fESDList[iCut]->Add(fHistoPosPionPt[iCut]);
406 fHistoNegPionPhi[iCut] = new TH1F("ESD_PrimaryNegPions_Phi","ESD_PrimaryNegPions_Phi",360,0,2*TMath::Pi());
407 fESDList[iCut]->Add(fHistoNegPionPhi[iCut]);
408 fHistoPosPionPhi[iCut] = new TH1F("ESD_PrimaryPosPions_Phi","ESD_PrimaryPosPions_Phi",360,0,2*TMath::Pi());
409 fESDList[iCut]->Add(fHistoPosPionPhi[iCut]);
412 fHistoNegPionEta[iCut] = new TH1F("ESD_PrimaryNegPions_Eta","ESD_PrimaryNegPions_Eta",600,-1.5,1.5);
413 fESDList[iCut]->Add(fHistoNegPionEta[iCut]);
414 fHistoPosPionEta[iCut] = new TH1F("ESD_PrimaryPosPions_Eta","ESD_PrimaryPosPions_Eta",600,-1.5,1.5);
415 fESDList[iCut]->Add(fHistoPosPionEta[iCut]);
416 fHistoNegPionClsTPC[iCut] = new TH2F("ESD_PrimaryNegPions_ClsTPC","ESD_PrimaryNegPions_ClsTPC",100,0,1,400,0.,10.);
417 fESDList[iCut]->Add(fHistoNegPionClsTPC[iCut]);
418 fHistoPosPionClsTPC[iCut] = new TH2F("ESD_PrimaryPosPions_ClsTPC","ESD_PrimaryPosPions_ClsTPC",100,0,1,400,0.,10.);
419 fESDList[iCut]->Add(fHistoPosPionClsTPC[iCut]);
420 fHistoPionDCAxy[iCut] = new TH2F("ESD_PrimaryPions_DCAxy","ESD_PrimaryPions_DCAxy",800,-4.0,4.0,400,0.,10.);
421 fESDList[iCut]->Add(fHistoPionDCAxy[iCut]);
422 fHistoPionDCAz[iCut] = new TH2F("ESD_PrimaryPions_DCAz","ESD_PrimaryPions_DCAz",800,-4.0,4.0,400,0.,10.);
423 fESDList[iCut]->Add(fHistoPionDCAz[iCut]);
424 fHistoPionTPCdEdxNSigma[iCut] = new TH2F("ESD_PrimaryPions_TPCdEdx","ESD_PrimaryPions_TPCdEdx",150,0.05,20,400,-10,10);
425 fESDList[iCut]->Add(fHistoPionTPCdEdxNSigma[iCut]);
426 fHistoPionTPCdEdx[iCut] =new TH2F("ESD_PrimaryPions_TPCdEdxSignal","ESD_PrimaryPions_TPCdEdxSignal" ,150,0.05,20.0,800,0.0,200);
427 fESDList[iCut]->Add(fHistoPionTPCdEdx[iCut]);
428 fHistoPionPionInvMassPt[iCut] = new TH2F("ESD_PiPlusPiNeg_InvMassPt","ESD_PiPlusPiNeg_InvMassPt",2000,0.,2.,200,0.,20.);
429 fESDList[iCut]->Add(fHistoPionPionInvMassPt[iCut]);
432 fHistoMotherInvMassPt[iCut] = new TH2F("ESD_Mother_InvMass_Pt","ESD_Mother_InvMass_Pt",450,0.3,0.75,250,0,25);
433 fESDList[iCut]->Add(fHistoMotherInvMassPt[iCut]);
434 fHistoMotherBackInvMassPt[iCut] = new TH2F("ESD_Background_InvMass_Pt","ESD_Background_InvMass_Pt",450,0.3,0.75,250,0,25);
435 fESDList[iCut]->Add(fHistoMotherBackInvMassPt[iCut]);
438 TAxis *AxisAfter = fHistoPionTPCdEdxNSigma[iCut]->GetXaxis();
439 Int_t bins = AxisAfter->GetNbins();
440 Double_t from = AxisAfter->GetXmin();
441 Double_t to = AxisAfter->GetXmax();
442 Double_t *newBins = new Double_t[bins+1];
444 Double_t factor = TMath::Power(to/from, 1./bins);
445 for(Int_t i=1; i<=bins; ++i) newBins[i] = factor * newBins[i-1];
447 AxisAfter->Set(bins, newBins);
448 AxisAfter = fHistoPionTPCdEdx[iCut]->GetXaxis();
449 AxisAfter->Set(bins, newBins);
454 fCutFolder[iCut]->Add(fESDList[iCut]);
460 fMCList = new TList*[fnCuts];
462 fTrueList = new TList*[fnCuts];
463 fHistoTrueConvGammaPt = new TH1F*[fnCuts];
464 fHistoTrueConvGammaFromEtaPt = new TH1F*[fnCuts];
465 fHistoTruePosPionPt = new TH1F*[fnCuts];
466 fHistoTrueNegPionPt = new TH1F*[fnCuts];
467 fHistoTruePosPionFromEtaPt = new TH1F*[fnCuts];
468 fHistoTrueNegPionFromEtaPt = new TH1F*[fnCuts];
471 fHistoMCAllGammaPt = new TH1F*[fnCuts];
472 fHistoMCConvGammaPt = new TH1F*[fnCuts];
473 fHistoMCAllPosPionsPt = new TH1F*[fnCuts];
474 fHistoMCAllNegPionsPt = new TH1F*[fnCuts];
475 fHistoMCGammaFromEtaPt = new TH1F*[fnCuts];
476 fHistoMCPosPionsFromEtaPt = new TH1F*[fnCuts];
477 fHistoMCNegPionsFromEtaPt = new TH1F*[fnCuts];
479 // hMCPi0DalitzGammaPt = new TH1F*[fnCuts];
480 // hMCPi0DalitzElectronPt = new TH1F*[fnCuts];
481 // hMCPi0DalitzPositronPt = new TH1F*[fnCuts];
483 fHistoMCEtaPiPlPiMiGammaPt = new TH1F*[fnCuts];
484 fHistoMCEtaDalitzPt = new TH1F*[fnCuts];
485 fHistoMCEtaGGPt = new TH1F*[fnCuts];
486 fHistoMCEtaPiPlPiMiGammaInAccPt = new TH1F*[fnCuts];
488 fHistoTrueMotherPiPlPiMiGammaInvMassPt = new TH2F*[fnCuts];
489 fHistoTrueMotherDalitzInvMassPt = new TH2F*[fnCuts];
490 fHistoTrueMotherGammaGammaInvMassPt = new TH2F*[fnCuts];
493 fHistoTruePionPionInvMassPt = new TH2F*[fnCuts];
494 fHistoTruePionPionFromEtaInvMassPt = new TH2F*[fnCuts];
497 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
498 TString cutstringEvent = ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber();
499 TString cutstringPion = ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutNumber();
500 TString cutstringMeson = ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutNumber();
501 TString cutstringGamma = ((AliConversionPhotonCuts*)fGammaCutArray->At(iCut))->GetCutNumber();
503 fMCList[iCut] = new TList();
504 fMCList[iCut]->SetName(Form("%s_%s_%s_%s MC histograms",cutstringEvent.Data(),cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
505 fMCList[iCut]->SetOwner(kTRUE);
506 fCutFolder[iCut]->Add(fMCList[iCut]);
508 fHistoMCAllGammaPt[iCut] = new TH1F("MC_AllGamma_Pt","MC_AllGamma_Pt",250,0,25);
509 fMCList[iCut]->Add(fHistoMCAllGammaPt[iCut]);
510 fHistoMCConvGammaPt[iCut] = new TH1F("MC_ConvGamma_Pt","MC_ConvGamma_Pt",250,0,25);
511 fMCList[iCut]->Add(fHistoMCConvGammaPt[iCut]);
512 fHistoMCAllPosPionsPt[iCut] = new TH1F("MC_AllPosPions_Pt","MC_AllPosPions_Pt",1000,0,25);
513 fMCList[iCut]->Add(fHistoMCAllPosPionsPt[iCut]);
514 fHistoMCAllNegPionsPt[iCut] = new TH1F("MC_AllNegPions_Pt","MC_AllNegPions_Pt",1000,0,25);
515 fMCList[iCut]->Add(fHistoMCAllNegPionsPt[iCut]);
516 fHistoMCGammaFromEtaPt[iCut] = new TH1F("MC_GammaFromEta_Pt","MC_GammaFromEta_Pt",250,0,25);
517 fMCList[iCut]->Add(fHistoMCGammaFromEtaPt[iCut]);
518 fHistoMCPosPionsFromEtaPt[iCut] = new TH1F("MC_PosPionsFromEta_Pt","MC_PosPionsFromEta_Pt",1000,0,25);
519 fMCList[iCut]->Add(fHistoMCPosPionsFromEtaPt[iCut]);
520 fHistoMCNegPionsFromEtaPt[iCut] = new TH1F("MC_NegPionsFromEta_Pt","MC_NegPionsFromEta_Pt",1000,0,25);
521 fMCList[iCut]->Add(fHistoMCNegPionsFromEtaPt[iCut]);
523 fHistoMCEtaPiPlPiMiGammaPt[iCut] = new TH1F("MC_Eta_Pt","MC_Eta_Pt",250,0,25);
524 fHistoMCEtaPiPlPiMiGammaPt[iCut]->Sumw2();
525 fMCList[iCut]->Add(fHistoMCEtaPiPlPiMiGammaPt[iCut]);
527 fHistoMCEtaDalitzPt[iCut] = new TH1F("MC_Eta_Dalitz_Pt","MC_Eta_Pt",250,0,25);
528 fHistoMCEtaDalitzPt[iCut]->Sumw2();
529 fMCList[iCut]->Add(fHistoMCEtaDalitzPt[iCut]);
531 fHistoMCEtaGGPt[iCut] = new TH1F("MC_Eta_GG_Pt","MC_Eta_GG_Pt",250,0,25);
532 fHistoMCEtaGGPt[iCut]->Sumw2();
533 fMCList[iCut]->Add(fHistoMCEtaGGPt[iCut]);
535 fHistoMCEtaPiPlPiMiGammaInAccPt[iCut] = new TH1F("MC_EtaInAcc_Pt","MC_EtaInAcc_Pt",250,0,25);
536 fHistoMCEtaPiPlPiMiGammaInAccPt[iCut]->Sumw2();
537 fMCList[iCut]->Add(fHistoMCEtaPiPlPiMiGammaInAccPt[iCut]);
539 fTrueList[iCut] = new TList();
540 fTrueList[iCut]->SetName(Form("%s_%s_%s_%s True histograms",cutstringEvent.Data(),cutstringGamma.Data(),cutstringPion.Data(),cutstringMeson.Data()));
541 fTrueList[iCut]->SetOwner(kTRUE);
542 fCutFolder[iCut]->Add(fTrueList[iCut]);
544 fHistoTrueConvGammaPt[iCut] = new TH1F("ESD_TrueConvGamma_Pt","ESD_TrueConvGamma_Pt",250,0,25);
545 fTrueList[iCut]->Add(fHistoTrueConvGammaPt[iCut]);
546 fHistoTrueConvGammaFromEtaPt[iCut] = new TH1F("ESD_TrueConvGammaFromEta_Pt","ESD_TrueConvGammaFromEta_Pt",250,0,25);
547 fTrueList[iCut]->Add(fHistoTrueConvGammaFromEtaPt[iCut]);
549 fHistoTruePosPionPt[iCut] = new TH1F("ESD_TruePosPion_Pt","ESD_TruePosPion_Pt",1000,0,25);
550 fTrueList[iCut]->Add(fHistoTruePosPionPt[iCut]);
551 fHistoTrueNegPionPt[iCut] = new TH1F("ESD_TrueNegPion_Pt","ESD_TrueNegPion_Pt",1000,0,25);
552 fTrueList[iCut]->Add(fHistoTrueNegPionPt[iCut]);
554 fHistoTrueNegPionFromEtaPt[iCut] = new TH1F("ESD_TrueNegPionFromEta_Pt","ESD_TrueNegPionFromEta_Pt",1000,0,25);
555 fTrueList[iCut]->Add(fHistoTrueNegPionFromEtaPt[iCut]);
556 fHistoTruePosPionFromEtaPt[iCut] = new TH1F("ESD_TruePosPionFromEta_Pt","ESD_TruePosPionFromEta_Pt",1000,0,25);
557 fTrueList[iCut]->Add(fHistoTruePosPionFromEtaPt[iCut]);
559 fHistoTrueMotherPiPlPiMiGammaInvMassPt[iCut] = new TH2F("ESD_TrueMotherPiPlPiMiGamma_InvMass_Pt","ESD_TrueMotherPiPlPiMiGamma_InvMass_Pt",450,0.3,0.75,250,0,25);
560 fHistoTrueMotherPiPlPiMiGammaInvMassPt[iCut]->Sumw2();
561 fTrueList[iCut]->Add(fHistoTrueMotherPiPlPiMiGammaInvMassPt[iCut]);
563 fHistoTrueMotherGammaGammaInvMassPt[iCut] = new TH2F("ESD_TrueMotherGG_InvMass_Pt","ESD_TrueMotherGG_InvMass_Pt",450,0.3,0.75,250,0,25);
564 fHistoTrueMotherGammaGammaInvMassPt[iCut]->Sumw2();
565 fTrueList[iCut]->Add(fHistoTrueMotherGammaGammaInvMassPt[iCut]);
567 fHistoTrueMotherDalitzInvMassPt[iCut] = new TH2F("ESD_TrueMotherDalitz_InvMass_Pt","ESD_TrueMotherDalitz_InvMass_Pt",450,0.3,0.75,250,0,25);
568 fHistoTrueMotherDalitzInvMassPt[iCut]->Sumw2();
569 fTrueList[iCut]->Add(fHistoTrueMotherDalitzInvMassPt[iCut]);
572 fHistoTruePionPionInvMassPt[iCut] = new TH2F("ESD_TruePiPlusPiNeg_InvMassPt","ESD_TruePiPlusPiNeg_InvMassPt",2000,0.,2.,200,0.,20.);
573 fTrueList[iCut]->Add(fHistoTruePionPionInvMassPt[iCut]);
574 fHistoTruePionPionFromEtaInvMassPt[iCut] = new TH2F("ESD_TruePiPlusPiNegFromEta_InvMassPt","ESD_TruePiPlusPiNegFromEta_InvMassPt",2000,0.,2.,200,0.,20.);
575 fTrueList[iCut]->Add(fHistoTruePionPionFromEtaInvMassPt[iCut]);
582 InitBack(); // Init Background Handler
584 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
585 if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
588 if((AliConversionPhotonCuts*)fV0Reader->GetConversionCuts())
589 if(((AliConversionPhotonCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms())
590 fOutputContainer->Add(((AliConversionPhotonCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms());
594 fPionSelector=(AliPrimaryPionSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("PionSelector");
595 if(!fPionSelector){printf("Error: No PionSelector");return;} // GetV0Reader
598 if ( ((AliPrimaryPionCuts*)fPionSelector->GetPrimaryPionCuts())->GetCutHistograms() ){
599 fOutputContainer->Add( ((AliPrimaryPionCuts*)fPionSelector->GetPrimaryPionCuts())->GetCutHistograms() );
603 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
605 if( ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutHistograms() ) {
606 fCutFolder[iCut]->Add( ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->GetCutHistograms() );
609 if( fMesonCutArray ) {
610 if( ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutHistograms() ) {
611 fCutFolder[iCut]->Add( ((AliConversionMesonCuts*)fMesonCutArray->At(iCut))->GetCutHistograms());
614 if( fGammaCutArray ) {
615 if( ((AliConversionPhotonCuts*)fGammaCutArray->At(iCut))->GetCutHistograms() ) {
616 fCutFolder[iCut]->Add( ((AliConversionPhotonCuts*)fGammaCutArray->At(iCut))->GetCutHistograms() );
621 PostData(1, fOutputContainer);
625 //______________________________________________________________________
626 void AliAnalysisTaskEtaToPiPlPiMiGamma::UserExec(Option_t *){
629 // Execute analysis for current event
632 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
633 if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
635 Int_t eventQuality = ((AliConvEventCuts*)fV0Reader->GetEventCuts())->GetEventQuality();
637 if(eventQuality == 2 || eventQuality == 3){// Event Not Accepted due to MC event missing or wrong trigger for V0ReaderV1
638 for(Int_t iCut = 0; iCut<fnCuts; iCut++){
639 fHistoNEvents[iCut]->Fill(eventQuality);
644 fPionSelector=(AliPrimaryPionSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("PionSelector");
645 if(!fPionSelector){printf("Error: No PionSelector");return;} // GetV0Reader
647 if(fIsMC) fMCEvent = MCEvent();
648 fESDEvent = (AliESDEvent*)InputEvent();
649 fReaderGammas = fV0Reader->GetReconstructedGammas(); // Gammas from default Cut
650 fSelectorNegPionIndex = fPionSelector->GetReconstructedNegPionIndex(); // Electrons from default Cut
651 fSelectorPosPionIndex = fPionSelector->GetReconstructedPosPionIndex(); // Positrons from default Cut
653 fNumberOfESDTracks = fV0Reader->GetNumberOfPrimaryTracks();
654 //AddTaskContainers(); //Add conatiner
656 for(Int_t iCut = 0; iCut<fnCuts; iCut++){
658 Int_t eventNotAccepted = ((AliConvEventCuts*)fEventCutArray->At(iCut))->IsEventAcceptedByCut(fV0Reader->GetEventCuts(),fInputEvent,fMCEvent,fIsHeavyIon);
660 if(eventNotAccepted){
661 // cout << "event rejected due to wrong trigger: " <<eventNotAccepted << endl;
662 fHistoNEvents[iCut]->Fill(eventNotAccepted); // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
666 if(eventQuality != 0){// Event Not Accepted
667 // cout << "event rejected due to: " <<eventQuality << endl;
668 fHistoNEvents[iCut]->Fill(eventQuality);
672 fHistoNEvents[iCut]->Fill(eventQuality);
673 fHistoNGoodESDTracks[iCut]->Fill(fNumberOfESDTracks);
675 if(fMCEvent){ // Process MC Particle
676 fMCStack = fMCEvent->Stack();
677 if(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetSignalRejection() != 0){
678 ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetNotRejectedParticles(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetSignalRejection(),
679 ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetAcceptedHeader(),
682 ProcessMCParticles();
685 fIsGammaEtaCand =kFALSE;
686 // cout << "new event" << endl;
687 ProcessPhotonCandidates(); // Process this cuts gammas
688 ProcessPionCandidates(); // Process this cuts gammas
691 CalculateMesonCandidates();
692 CalculateBackground();
693 UpdateEventByEventData();
695 fGoodGammas->Clear(); // delete this cuts good gammas
696 fGoodVirtualParticles->Clear(); // delete this cuts good gammas
699 fSelectorNegPionIndex.clear();
700 fSelectorPosPionIndex.clear();
702 PostData( 1, fOutputContainer );
705 Bool_t AliAnalysisTaskEtaToPiPlPiMiGamma::Notify(){
706 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
707 if( !((AliConvEventCuts*)fEventCutArray->At(iCut))->GetDoEtaShift() ){
708 fProfileEtaShift[iCut]->Fill(0.,0.);
709 continue; // No Eta Shift requested, continue
711 if( ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetEtaShift() == 0.0){ // Eta Shift requested but not set, get shift automatically
712 ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCorrectEtaShiftFromPeriod(fV0Reader->GetPeriodName());
713 ((AliConvEventCuts*)fEventCutArray->At(iCut))->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
714 ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->SetEtaShift( ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetEtaShift() );
715 fProfileEtaShift[iCut]->Fill(0.,(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetEtaShift()));
718 printf(" Eta t PiPlusPiMinus Gamma Task %s :: Eta Shift Manually Set to %f \n\n",
719 (((AliConvEventCuts*)fEventCutArray->At(iCut))->GetCutNumber()).Data(),((AliConvEventCuts*)fEventCutArray->At(iCut))->GetEtaShift());
720 ((AliConvEventCuts*)fEventCutArray->At(iCut))->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
721 ((AliPrimaryPionCuts*)fPionCutArray->At(iCut))->SetEtaShift( ((AliConvEventCuts*)fEventCutArray->At(iCut))->GetEtaShift() );
722 fProfileEtaShift[iCut]->Fill(0.,(((AliConvEventCuts*)fEventCutArray->At(iCut))->GetEtaShift()));
729 void AliAnalysisTaskEtaToPiPlPiMiGamma::Terminate(const Option_t *){
733 //________________________________________________________________________
734 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessPhotonCandidates(){
736 TList *GoodGammasStepOne = new TList();
737 TList *GoodGammasStepTwo = new TList();
738 // Loop over Photon Candidates allocated by ReaderV1
740 for(Int_t i = 0; i < fReaderGammas->GetEntriesFast(); i++){
741 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) fReaderGammas->At(i);
742 if(!PhotonCandidate) continue;
744 fIsFromMBHeader = kTRUE;
746 if( fMCEvent && ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 0 ){
747 Int_t isPosFromMBHeader
748 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack, fInputEvent);
749 if(isPosFromMBHeader == 0 && ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 3) continue;
750 Int_t isNegFromMBHeader
751 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
752 if(isNegFromMBHeader == 0 && ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 3) continue;
753 if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
756 if(!((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelected(PhotonCandidate,fESDEvent)) continue;
758 if(!((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut() &&
759 !((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){ // if no post reader loop is required add to events good gammas
761 fGoodGammas->Add(PhotonCandidate);
764 fHistoConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
765 fHistoConvGammaEta[fiCut]->Fill(PhotonCandidate->Eta());
769 ProcessTruePhotonCandidates(PhotonCandidate);
771 } else if(((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut()){ // if Shared Electron cut is enabled, Fill array, add to step one
772 ((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->FillElectonLabelArray(PhotonCandidate,nV0);
774 GoodGammasStepOne->Add(PhotonCandidate);
775 } else if(!((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut() &&
776 ((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){ // shared electron is disabled, step one not needed -> step two
777 GoodGammasStepTwo->Add(PhotonCandidate);
782 if(((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseElecSharingCut()){
783 for(Int_t i = 0;i<GoodGammasStepOne->GetEntries();i++){
784 AliAODConversionPhoton *PhotonCandidate= (AliAODConversionPhoton*) GoodGammasStepOne->At(i);
785 if(!PhotonCandidate) continue;
786 fIsFromMBHeader = kTRUE;
787 if(fMCEvent && ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 0){
788 Int_t isPosFromMBHeader
789 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack,fInputEvent);
790 Int_t isNegFromMBHeader
791 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
792 if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
794 if(!((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->RejectSharedElectronV0s(PhotonCandidate,i,GoodGammasStepOne->GetEntries())) continue;
795 if(!((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){ // To Colse v0s cut diabled, step two not needed
796 fGoodGammas->Add(PhotonCandidate);
798 fHistoConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
799 fHistoConvGammaEta[fiCut]->Fill(PhotonCandidate->Eta());
802 ProcessTruePhotonCandidates(PhotonCandidate);
805 else GoodGammasStepTwo->Add(PhotonCandidate); // Close v0s cut enabled -> add to list two
808 if(((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->UseToCloseV0sCut()){
809 for(Int_t i = 0;i<GoodGammasStepTwo->GetEntries();i++){
810 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) GoodGammasStepTwo->At(i);
811 if(!PhotonCandidate) continue;
813 if(fMCEvent && ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 0){
814 Int_t isPosFromMBHeader
815 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelPositive(), fMCStack,fInputEvent);
816 Int_t isNegFromMBHeader
817 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(PhotonCandidate->GetMCLabelNegative(), fMCStack,fInputEvent);
818 if( (isNegFromMBHeader+isPosFromMBHeader) != 4) fIsFromMBHeader = kFALSE;
821 if(!((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->RejectToCloseV0s(PhotonCandidate,GoodGammasStepTwo,i)) continue;
822 fGoodGammas->Add(PhotonCandidate); // Add gamma to current cut TList
825 fHistoConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt()); // Differences to old V0Reader in p_t due to conversion KF->TLorentzVector
826 fHistoConvGammaEta[fiCut]->Fill(PhotonCandidate->Eta());
830 ProcessTruePhotonCandidates(PhotonCandidate);
835 delete GoodGammasStepOne;
836 GoodGammasStepOne = 0x0;
837 delete GoodGammasStepTwo;
838 GoodGammasStepTwo = 0x0;
841 //________________________________________________________________________
842 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessTruePhotonCandidates(AliAODConversionPhoton *TruePhotonCandidate)
844 // Process True Photons
845 AliStack *MCStack = fMCEvent->Stack();
846 TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(MCStack);
847 TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(MCStack);
849 if(posDaughter == NULL || negDaughter == NULL) return; // One particle does not exist
850 if(posDaughter->GetMother(0) != negDaughter->GetMother(0)){ // Not Same Mother == Combinatorial Bck
854 else if (posDaughter->GetMother(0) == -1){
858 if(TMath::Abs(posDaughter->GetPdgCode())!=11 || TMath::Abs(negDaughter->GetPdgCode())!=11) return; //One Particle is not electron
859 if(posDaughter->GetPdgCode()==negDaughter->GetPdgCode()) return; // Same Charge
860 if(posDaughter->GetUniqueID() != 5 || negDaughter->GetUniqueID() !=5) return;// check if the daughters come from a conversion
862 TParticle *Photon = TruePhotonCandidate->GetMCParticle(MCStack);
863 if(Photon->GetPdgCode() != 22) return; // Mother is no Photon
867 Int_t labelGamma = TruePhotonCandidate->GetMCParticleLabel(MCStack);
869 if( labelGamma < MCStack->GetNprimary() ){
870 if( fIsFromMBHeader ){
871 fHistoTrueConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
875 if( IsEtaPiPlPiMiGammaDaughter(labelGamma) == kTRUE ) {
876 if( labelGamma < MCStack->GetNprimary() ) {
877 if( fIsFromMBHeader ){
878 fHistoTrueConvGammaFromEtaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
880 // TParticle * gammaMC = (TParticle*)MCStack->Particle(labelGamma);
881 // Int_t gammaMotherLabel=gammaMC->GetFirstMother();
882 // for(Int_t index= ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetFirstDaughter();index<= ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetLastDaughter();index++){
883 // TParticle* temp = (TParticle*)fMCStack->Particle( index );
884 // switch( temp->GetPdgCode() ) {
886 // cout << "pi- " << index << "\t" << temp->Pt() << "\t" << temp->Eta() << endl;
889 // cout << "pi+ " << index << "\t" << temp->Pt() << "\t" << temp->Eta() << endl;
892 // cout << "gamma " << index << "\t" << temp->Pt()<< "\t" << temp->Eta() << endl;
896 fIsGammaEtaCand = kTRUE;
902 //________________________________________________________________________
903 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessPionCandidates(){
905 Double_t magField = fInputEvent->GetMagneticField();
906 if( magField < 0.0 ){
912 vector<Int_t> lGoodNegPionIndexPrev(0);
913 vector<Int_t> lGoodPosPionIndexPrev(0);
915 for(UInt_t i = 0; i < fSelectorNegPionIndex.size(); i++){
916 AliESDtrack* negPionCandidate = fESDEvent->GetTrack(fSelectorNegPionIndex[i]);
917 if(! ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelected(negPionCandidate) ) continue;
918 lGoodNegPionIndexPrev.push_back( fSelectorNegPionIndex[i] );
919 fHistoNegPionPt[fiCut]->Fill(negPionCandidate->Pt());
920 fHistoNegPionPhi[fiCut]->Fill(negPionCandidate->Phi());
922 Int_t labelNegPion = TMath::Abs( negPionCandidate->GetLabel() );
923 if( labelNegPion < fMCStack->GetNtrack() ){
924 TParticle* negPion = fMCStack->Particle(labelNegPion);
925 if( negPion->GetPdgCode() == -211 ){
926 if( labelNegPion < fMCStack->GetNprimary() ){
927 fHistoTrueNegPionPt[fiCut]->Fill(negPionCandidate->Pt()); //primary negPion
929 if( IsEtaPiPlPiMiGammaDaughter(labelNegPion) == kTRUE ) {
930 if( labelNegPion < fMCStack->GetNprimary() ) {
931 fHistoTrueNegPionFromEtaPt[fiCut]->Fill(negPionCandidate->Pt());
932 // if (fIsGammaEtaCand) cout << "pi- rec" << labelNegPion << "\t" << negPionCandidate->Pt()<< endl;
940 for(UInt_t i = 0; i < fSelectorPosPionIndex.size(); i++){
941 AliESDtrack* posPionCandidate = fESDEvent->GetTrack( fSelectorPosPionIndex[i] );
942 if(! ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelected(posPionCandidate) ) continue;
943 lGoodPosPionIndexPrev.push_back( fSelectorPosPionIndex[i] );
944 fHistoPosPionPt[fiCut]->Fill( posPionCandidate->Pt() );
945 fHistoPosPionPhi[fiCut]->Fill( posPionCandidate->Phi() );
948 Int_t labelPosPion = TMath::Abs( posPionCandidate->GetLabel() );
949 if( labelPosPion < fMCStack->GetNtrack() ) {
950 TParticle* posPion = fMCStack->Particle(labelPosPion);
951 if( posPion->GetPdgCode() == 211 ){
952 if( labelPosPion < fMCStack->GetNprimary() ){
953 fHistoTruePosPionPt[fiCut]->Fill(posPionCandidate->Pt());
955 if( IsEtaPiPlPiMiGammaDaughter(labelPosPion) == kTRUE ) {
956 if( labelPosPion < fMCStack->GetNprimary() ){
957 fHistoTruePosPionFromEtaPt[fiCut]->Fill(posPionCandidate->Pt());
958 // if (fIsGammaEtaCand) cout << "pi+ rec" << labelPosPion << "\t" << posPionCandidate->Pt()<< endl;
967 for(UInt_t i = 0; i < lGoodNegPionIndexPrev.size(); i++){
969 AliESDtrack *negPionCandidate = fESDEvent->GetTrack(lGoodNegPionIndexPrev[i]);
970 AliKFParticle negPionCandidateKF( *negPionCandidate->GetConstrainedParam(), 211 );
972 for(UInt_t j = 0; j < lGoodPosPionIndexPrev.size(); j++){
974 AliESDtrack *posPionCandidate = fESDEvent->GetTrack(lGoodPosPionIndexPrev[j]);
975 AliKFParticle posPionCandidateKF( *posPionCandidate->GetConstrainedParam(), 211 );
977 AliKFConversionPhoton* virtualPhoton = NULL;
978 virtualPhoton = new AliKFConversionPhoton(negPionCandidateKF,posPionCandidateKF);
979 AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
980 // primaryVertexImproved+=*virtualPhoton;
981 virtualPhoton->SetProductionVertex(primaryVertexImproved);
982 virtualPhoton->SetTrackLabels( lGoodPosPionIndexPrev[j], lGoodNegPionIndexPrev[i]);
986 Int_t labeln=TMath::Abs(negPionCandidate->GetLabel());
987 Int_t labelp=TMath::Abs(posPionCandidate->GetLabel());
988 TParticle *fNegativeMCParticle = fMCStack->Particle(labeln);
989 TParticle *fPositiveMCParticle = fMCStack->Particle(labelp);
991 if( fPositiveMCParticle && fNegativeMCParticle) {
992 virtualPhoton->SetMCLabelPositive(labelp);
993 virtualPhoton->SetMCLabelNegative(labeln);
997 AliAODConversionPhoton *vParticle = new AliAODConversionPhoton(virtualPhoton); //To Apply PsiPairCut
998 if (((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->DoMassCut()){
999 if (vParticle->GetMass() < ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetMassCut()){
1000 fGoodVirtualParticles->Add( vParticle );
1003 fGoodVirtualParticles->Add( vParticle );
1005 delete virtualPhoton;
1012 //_____________________________________________________________________________
1013 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessMCParticles(){
1015 // Loop over all primary MC particle
1017 for(Int_t i = 0; i < fMCStack->GetNprimary(); i++) {
1019 TParticle* particle = (TParticle *)fMCStack->Particle(i);
1020 if (!particle) continue;
1022 Int_t isMCFromMBHeader = -1;
1023 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 0){
1025 = ((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack, fInputEvent);
1026 if(isMCFromMBHeader == 0 && ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetSignalRejection() != 3) continue;
1029 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
1031 if(((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelectedMC(particle,fMCStack,kFALSE)){
1032 fHistoMCAllGammaPt[fiCut]->Fill(particle->Pt()); // All MC Gamma
1033 if(particle->GetMother(0) >-1){
1034 if (fMCStack->Particle(particle->GetMother(0))->GetPdgCode() ==221 && fMCStack->Particle(particle->GetMother(0))->GetNDaughters()==3 ) fHistoMCGammaFromEtaPt[fiCut]->Fill(particle->Pt()); // All pos from eta
1038 if(((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelectedMC(particle,fMCStack,kTRUE)){
1039 fHistoMCConvGammaPt[fiCut]->Fill(particle->Pt());
1040 } // Converted MC Gamma
1042 if(((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelectedMC(i,fMCStack)){
1043 if( particle->GetPdgCode() == 211){
1044 fHistoMCAllPosPionsPt[fiCut]->Fill(particle->Pt()); // All pos pions
1045 if(particle->GetMother(0) >-1){
1046 if (fMCStack->Particle(particle->GetMother(0))->GetPdgCode() ==221) fHistoMCPosPionsFromEtaPt[fiCut]->Fill(particle->Pt()); // All pos from eta
1049 if( particle->GetPdgCode() == -211){
1050 fHistoMCAllNegPionsPt[fiCut]->Fill(particle->Pt()); // All neg pions
1051 if(particle->GetMother(0) >-1){
1052 if (fMCStack->Particle(particle->GetMother(0))->GetPdgCode() ==221) fHistoMCNegPionsFromEtaPt[fiCut]->Fill(particle->Pt()); // All pos from eta
1057 // \eta -> \gamma \gamma
1059 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelectedMC( particle,fMCStack,((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetEtaShift() ) ){
1060 Float_t weighted= 1;
1061 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1062 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack, fInputEvent)){
1063 if (particle->Pt()>0.005){
1064 weighted= ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
1068 if(particle->GetPdgCode() == 221)fHistoMCEtaGGPt[fiCut]->Fill( particle->Pt() , weighted); // All MC Eta GG decay
1071 // \eta -> e+ e- \gamma
1072 Int_t labelgamma = -1;
1073 Int_t labelelectron = -1;
1074 Int_t labelpositron = -1;
1076 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelectedMCDalitz(particle,fMCStack,labelelectron,labelpositron,labelgamma,((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetEtaShift())){
1077 Float_t weighted= 1;
1078 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1079 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
1080 if (particle->Pt()>0.005){
1081 weighted= ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
1085 if(particle->GetPdgCode() == 221)fHistoMCEtaDalitzPt[fiCut]->Fill(particle->Pt(), weighted); // All MC Eta
1089 // \eta -> pi+ pi- \gamma
1090 Int_t labelGamma3Body = -1;
1091 Int_t labelNegPion = -1;
1092 Int_t labelPosPion = -1;
1094 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelectedMCEtaPiPlPiMiGamma(particle,fMCStack,labelNegPion,labelPosPion,labelGamma3Body,((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetEtaShift())){
1095 Float_t weighted= 1;
1096 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1097 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(i, fMCStack,fInputEvent)){
1098 if (particle->Pt()>0.005){
1099 weighted= ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),i, fMCStack,fInputEvent);
1103 if(particle->GetPdgCode() == 221)fHistoMCEtaPiPlPiMiGammaPt[fiCut]->Fill(particle->Pt(), weighted); // All MC Eta
1105 TParticle *gamma = fMCStack->Particle(labelGamma3Body);
1106 if(((AliConversionPhotonCuts*)fGammaCutArray->At(fiCut))->PhotonIsSelectedMC(gamma,fMCStack,kFALSE) &&
1107 ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelectedMC(labelNegPion,fMCStack) &&
1108 ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->PionIsSelectedMC(labelPosPion,fMCStack) ) {
1109 if(particle->GetPdgCode() == 221)fHistoMCEtaPiPlPiMiGammaInAccPt[fiCut]->Fill(particle->Pt(), weighted ); // MC EtaDalitz with gamma and e+e- in acc
1117 //________________________________________________________________________
1118 void AliAnalysisTaskEtaToPiPlPiMiGamma::CalculateMesonCandidates(){
1120 // Conversion Gammas
1121 if( fGoodGammas->GetEntries() > 0 && fGoodVirtualParticles->GetEntries() > 0 ){
1123 vector<Bool_t> lGoodVirtualParticle(fGoodVirtualParticles->GetEntries(), kFALSE);
1125 for(Int_t GammaIndex=0; GammaIndex<fGoodGammas->GetEntries(); GammaIndex++){
1127 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(GammaIndex));
1128 if (gamma==NULL) continue;
1129 for(Int_t virtualParticleIndex=0;virtualParticleIndex<fGoodVirtualParticles->GetEntries();virtualParticleIndex++){
1131 AliAODConversionPhoton *vParticle=dynamic_cast<AliAODConversionPhoton*>(fGoodVirtualParticles->At(virtualParticleIndex));
1132 if (vParticle==NULL) continue;
1133 //Check for same Electron ID
1134 if(gamma->GetTrackLabelPositive() == vParticle->GetTrackLabelPositive() ||
1135 gamma->GetTrackLabelNegative() == vParticle->GetTrackLabelNegative() ||
1136 gamma->GetTrackLabelNegative() == vParticle->GetTrackLabelPositive() ||
1137 gamma->GetTrackLabelPositive() == vParticle->GetTrackLabelNegative() ) continue;
1139 AliAODConversionMother *etacand = new AliAODConversionMother(gamma,vParticle);
1140 etacand->SetLabels(GammaIndex,virtualParticleIndex);
1143 // AliESDtrack *posPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelNegative() );
1144 // AliESDtrack *negPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelPositive() );
1146 // Int_t labeln=TMath::Abs(negPionVParticle->GetLabel());
1147 // Int_t labelp=TMath::Abs(posPionVParticle->GetLabel());
1149 // cout << labeln << "\t" << labelp << endl;
1152 if( ( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelected(etacand,kTRUE,((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetEtaShift())) ){
1154 // cout<< "Meson Accepted "<<endl;
1156 Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
1158 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1159 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
1161 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
1164 AliESDtrack *posPionVParticle = 0;
1165 AliESDtrack *negPionVParticle = 0;
1167 Double_t clsToFPos = -1.0;
1168 Double_t clsToFNeg = -1.0;
1170 Float_t dcaToVertexXYPos = -1.0;
1171 Float_t dcaToVertexZPos = -1.0;
1172 Float_t dcaToVertexXYNeg = -1.0;
1173 Float_t dcaToVertexZNeg = -1.0;
1178 fHistoPionPionInvMassPt[fiCut]->Fill( vParticle->GetMass(),vParticle->Pt());
1180 posPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelPositive() );
1181 negPionVParticle = fESDEvent->GetTrack( vParticle->GetTrackLabelNegative() );
1182 clsToFPos = ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetNFindableClustersTPC(posPionVParticle);
1183 clsToFNeg = ((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetNFindableClustersTPC(negPionVParticle);
1187 posPionVParticle->GetImpactParameters(bPos,bCovPos);
1188 if (bCovPos[0]<=0 || bCovPos[2]<=0) {
1189 AliDebug(1, "Estimated b resolution lower or equal zero!");
1190 bCovPos[0]=0; bCovPos[2]=0;
1195 posPionVParticle->GetImpactParameters(bNeg,bCovNeg);
1196 if (bCovNeg[0]<=0 || bCovNeg[2]<=0) {
1197 AliDebug(1, "Estimated b resolution lower or equal zero!");
1198 bCovNeg[0]=0; bCovNeg[2]=0;
1201 dcaToVertexXYPos = bPos[0];
1202 dcaToVertexZPos = bPos[1];
1203 dcaToVertexXYNeg = bNeg[0];
1204 dcaToVertexZNeg = bNeg[1];
1207 fHistoMotherInvMassPt[fiCut]->Fill(etacand->M(),etacand->Pt());
1208 Double_t sparesFill[4] = {etacand->M(),etacand->Pt(),(Double_t)zbin,(Double_t)mbin};
1209 fTHnSparseMotherInvMassPtZM[fiCut]->Fill(sparesFill,1);
1212 if( lGoodVirtualParticle[virtualParticleIndex] == kFALSE ) {
1214 fHistoNegPionEta[fiCut]->Fill( negPionVParticle->Eta() );
1215 fHistoPosPionEta[fiCut]->Fill( posPionVParticle->Eta() );
1217 fHistoNegPionClsTPC[fiCut]->Fill(clsToFNeg,negPionVParticle->Pt());
1218 fHistoPosPionClsTPC[fiCut]->Fill(clsToFPos,posPionVParticle->Pt());
1220 fHistoPionDCAxy[fiCut]->Fill( dcaToVertexXYNeg, negPionVParticle->Pt() );
1221 fHistoPionDCAz[fiCut]->Fill( dcaToVertexZNeg, negPionVParticle->Pt() );
1222 fHistoPionDCAxy[fiCut]->Fill( dcaToVertexXYPos, posPionVParticle->Pt() );
1223 fHistoPionDCAz[fiCut]->Fill( dcaToVertexZPos, posPionVParticle->Pt() );
1225 fHistoPionTPCdEdxNSigma[fiCut]->Fill( posPionVParticle->P(),((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(posPionVParticle, AliPID::kPion) );
1226 fHistoPionTPCdEdxNSigma[fiCut]->Fill( negPionVParticle->P(),((AliPrimaryPionCuts*)fPionCutArray->At(fiCut))->GetPIDResponse()->NumberOfSigmasTPC(negPionVParticle, AliPID::kPion) );
1228 fHistoPionTPCdEdx[fiCut]->Fill( posPionVParticle->P(), TMath::Abs(posPionVParticle->GetTPCsignal()));
1229 fHistoPionTPCdEdx[fiCut]->Fill( negPionVParticle->P(), TMath::Abs(negPionVParticle->GetTPCsignal()));
1231 lGoodVirtualParticle[virtualParticleIndex] = kTRUE;
1238 ProcessTrueMesonCandidates(etacand,gamma,vParticle);
1248 //________________________________________________________________________
1249 void AliAnalysisTaskEtaToPiPlPiMiGamma::CalculateBackground(){
1251 Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
1255 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1256 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
1258 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
1262 AliGammaConversionAODBGHandler::GammaConversionVertex *bgEventVertex = NULL;
1263 if( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity() ) {
1264 for(Int_t nEventsInBG=0;nEventsInBG<fBGHandler[fiCut]->GetNBGEvents();nEventsInBG++){
1265 AliGammaConversionAODVector *previousEventV0s = fBGHandler[fiCut]->GetBGGoodV0s(zbin,mbin,nEventsInBG);
1266 if(fMoveParticleAccordingToVertex == kTRUE && method == 1){
1267 bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
1270 for(Int_t iCurrent=0;iCurrent<fGoodVirtualParticles->GetEntries();iCurrent++){
1271 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualParticles->At(iCurrent));
1273 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1274 AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
1276 if(fMoveParticleAccordingToVertex == kTRUE && method == 1 ){
1277 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
1280 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
1283 if( ( ((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE, ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetEtaShift()))){
1284 fHistoMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
1285 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1286 fTHnSparseMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1288 delete backgroundCandidate;
1289 backgroundCandidate = 0x0;
1294 for(Int_t nEventsInBG=0;nEventsInBG <fBGHandler[fiCut]->GetNBGEvents();nEventsInBG++){
1295 AliGammaConversionAODVector *previousEventV0s = fBGHandler[fiCut]->GetBGGoodV0s(zbin,mbin,nEventsInBG);
1296 if(previousEventV0s){
1297 if(fMoveParticleAccordingToVertex == kTRUE && method == 1){
1298 bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
1300 for(Int_t iCurrent=0;iCurrent<fGoodVirtualParticles->GetEntries();iCurrent++){
1302 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualParticles->At(iCurrent));
1304 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1306 AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
1308 if(fMoveParticleAccordingToVertex == kTRUE && method ==1){
1309 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
1312 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
1314 if((((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE,((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetEtaShift()))){
1315 fHistoMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
1316 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1317 fTHnSparseMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1319 delete backgroundCandidate;
1320 backgroundCandidate = 0x0;
1328 //______________________________________________________________________
1329 void AliAnalysisTaskEtaToPiPlPiMiGamma::ProcessTrueMesonCandidates(AliAODConversionMother *EtaCandidate, AliAODConversionPhoton *TrueGammaCandidate, AliAODConversionPhoton *TrueVirtualParticleCandidate){
1331 // Process True Mesons
1333 AliStack *MCStack = fMCEvent->Stack();
1335 if( TrueGammaCandidate->GetV0Index()<fESDEvent->GetNumberOfV0s() ){
1337 Bool_t isTrueEta = kFALSE;
1338 Int_t gammaMCLabel = TrueGammaCandidate->GetMCParticleLabel(MCStack);
1339 Int_t gammaMotherLabel = -1;
1340 // Bool_t gammaEtaCand = kFALSE;
1342 if(gammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
1343 // Daughters Gamma 0
1344 TParticle * negativeMC = (TParticle*)TrueGammaCandidate->GetNegativeMCDaughter(MCStack);
1345 TParticle * positiveMC = (TParticle*)TrueGammaCandidate->GetPositiveMCDaughter(MCStack);
1346 TParticle * gammaMC = (TParticle*)MCStack->Particle(gammaMCLabel);
1348 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){ // Electrons ...
1349 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
1350 if(gammaMC->GetPdgCode() == 22){ // ... with Gamma Mother
1351 gammaMotherLabel=gammaMC->GetFirstMother();
1352 // if( ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetNDaughters() == 3 && ((TParticle*)MCStack->Particle(gammaMotherLabel))->GetPdgCode() == 221 ) gammaEtaCand = kTRUE;
1360 Int_t virtualParticleMCLabel = TrueVirtualParticleCandidate->GetMCParticleLabel(MCStack);
1361 Int_t virtualParticleMotherLabel = -1;
1363 Bool_t isPiPiDecay = kFALSE;
1364 Bool_t isDalitz = kFALSE;
1365 Bool_t isRealGamma = kFALSE;
1368 TParticle * negativeMC = (TParticle*)TrueVirtualParticleCandidate->GetNegativeMCDaughter(MCStack);
1369 TParticle * positiveMC = (TParticle*)TrueVirtualParticleCandidate->GetPositiveMCDaughter(MCStack);
1370 // if (gammaEtaCand){
1371 // cout << "neg Part: label - " << TrueVirtualParticleCandidate->GetMCLabelNegative() <<" pdg-code - " << negativeMC->GetPdgCode() << endl;
1372 // cout << "pos Part: label - " << TrueVirtualParticleCandidate->GetMCLabelPositive() <<" pdg-code - " << positiveMC->GetPdgCode() << endl;
1374 if(TMath::Abs(negativeMC->GetPdgCode())==211 && TMath::Abs(positiveMC->GetPdgCode())==211){ // Pions ...
1375 fHistoTruePionPionInvMassPt[fiCut]->Fill(TrueVirtualParticleCandidate->GetMass(),TrueVirtualParticleCandidate->Pt());
1379 if(virtualParticleMCLabel != -1){ // if virtualParticleMCLabel==-1 particles don't have same mother
1380 TParticle * negativeMC = (TParticle*)TrueVirtualParticleCandidate->GetNegativeMCDaughter(MCStack);
1381 TParticle * positiveMC = (TParticle*)TrueVirtualParticleCandidate->GetPositiveMCDaughter(MCStack);
1382 TParticle * virtualParticleMotherMC = (TParticle*)MCStack->Particle(virtualParticleMCLabel);
1383 // cout << "pdg code same mother - " << virtualParticleMotherMC->GetPdgCode() << endl;
1385 if(TMath::Abs(negativeMC->GetPdgCode())==211 && TMath::Abs(positiveMC->GetPdgCode())==211){ // Pions ...
1386 virtualParticleMotherLabel=virtualParticleMCLabel;
1388 } else if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){ // Electrons ...
1389 if( virtualParticleMotherMC->GetPdgCode() != 22 ){
1390 virtualParticleMotherLabel=virtualParticleMCLabel;
1392 } else if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
1393 virtualParticleMotherLabel=virtualParticleMotherMC->GetFirstMother();
1394 isRealGamma = kTRUE; //no virtual gamma
1399 if(gammaMotherLabel >= 0 && ( gammaMotherLabel == virtualParticleMotherLabel) ){
1400 if(((TParticle*)MCStack->Particle(virtualParticleMotherLabel))->GetPdgCode() == 221){
1405 if( isTrueEta ){ // True Eta
1406 if ( isPiPiDecay) { //real eta -> Pi+ Pi- Gamma
1407 Float_t weighted= 1;
1408 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1409 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
1410 if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
1411 weighted= ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
1415 fHistoTruePionPionFromEtaInvMassPt[fiCut]->Fill(TrueVirtualParticleCandidate->GetMass(),TrueVirtualParticleCandidate->Pt());
1416 fHistoTrueMotherPiPlPiMiGammaInvMassPt[fiCut]->Fill(EtaCandidate->M(),EtaCandidate->Pt(),weighted);
1417 } else if ( isRealGamma ){
1418 Float_t weighted= 1;
1419 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1420 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
1421 if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
1422 weighted= ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
1427 fHistoTrueMotherGammaGammaInvMassPt[fiCut]->Fill(EtaCandidate->M(),EtaCandidate->Pt(),weighted);
1428 } else if (isDalitz) {
1429 Float_t weighted= 1;
1430 if( ((AliPrimaryPionCuts*) fPionCutArray->At(fiCut))->DoWeights() ) {
1431 if(((AliConvEventCuts*)fEventCutArray->At(fiCut))->IsParticleFromBGEvent(gammaMotherLabel, fMCStack,fInputEvent)){
1432 if (((TParticle*)MCStack->Particle(gammaMotherLabel))->Pt()>0.005){
1433 weighted= ((AliConvEventCuts*)fEventCutArray->At(fiCut))->GetWeightForMeson(fV0Reader->GetPeriodName(),gammaMotherLabel,fMCStack,fInputEvent);
1437 fHistoTrueMotherDalitzInvMassPt[fiCut]->Fill(EtaCandidate->M(),EtaCandidate->Pt(),weighted);
1444 //________________________________________________________________________
1445 void AliAnalysisTaskEtaToPiPlPiMiGamma::UpdateEventByEventData(){
1446 //see header file for documentation
1450 if(fGoodGammas->GetEntries() >0 ){
1451 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1452 fBGHandler[fiCut]->AddEvent(fGoodGammas,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fV0Reader->GetNumberOfPrimaryTracks(),0);
1453 } else{ // means we use #V0s for multiplicity
1454 fBGHandler[fiCut]->AddEvent(fGoodGammas,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fGoodGammas->GetEntries(),0);
1457 } else if ( method == 2 ){
1458 if(fGoodVirtualParticles->GetEntries() > 0 ){
1459 if(((AliConversionMesonCuts*)fMesonCutArray->At(fiCut))->UseTrackMultiplicity()){
1460 fBGHandler[fiCut]->AddEvent(fGoodVirtualParticles,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fV0Reader->GetNumberOfPrimaryTracks(),0);
1461 } else{ // means we use #V0s for multiplicity
1462 fBGHandler[fiCut]->AddEvent(fGoodVirtualParticles,fInputEvent->GetPrimaryVertex()->GetX(),fInputEvent->GetPrimaryVertex()->GetY(),fInputEvent->GetPrimaryVertex()->GetZ(),fGoodVirtualParticles->GetEntries(),0);
1468 //________________________________________________________________________
1469 void AliAnalysisTaskEtaToPiPlPiMiGamma::MoveParticleAccordingToVertex(AliAODConversionPhoton* particle,const AliGammaConversionAODBGHandler::GammaConversionVertex *vertex){
1470 //see header file for documentation
1472 Double_t dx = vertex->fX - fInputEvent->GetPrimaryVertex()->GetX();
1473 Double_t dy = vertex->fY - fInputEvent->GetPrimaryVertex()->GetY();
1474 Double_t dz = vertex->fZ - fInputEvent->GetPrimaryVertex()->GetZ();
1476 Double_t movedPlace[3] = {particle->GetConversionX() - dx,particle->GetConversionY() - dy,particle->GetConversionZ() - dz};
1477 particle->SetConversionPoint(movedPlace);
1480 //_____________________________________________________________________________________
1481 Bool_t AliAnalysisTaskEtaToPiPlPiMiGamma::IsEtaPiPlPiMiGammaDaughter( Int_t label ) const {
1483 // Returns true if the particle comes from eta -> pi+ pi- gamma
1485 Int_t motherLabel = fMCStack->Particle( label )->GetMother(0);
1486 if( motherLabel < 0 || motherLabel >= fMCStack->GetNtrack() ) return kFALSE;
1488 TParticle* mother = fMCStack->Particle( motherLabel );
1489 if( mother->GetPdgCode() != 221 ) return kFALSE;
1490 if( IsPiPlPiMiGammaDecay( mother ) ) return kTRUE;
1494 //_____________________________________________________________________________
1495 Bool_t AliAnalysisTaskEtaToPiPlPiMiGamma::IsPiPlPiMiGammaDecay(TParticle *fMCMother) const
1498 if( fMCMother->GetNDaughters() != 3 ) return kFALSE;
1499 if( fMCMother->GetPdgCode() != 221 ) return kFALSE;
1502 TParticle *posPion = 0x0;
1503 TParticle *negPion = 0x0;
1504 TParticle *gamma = 0x0;
1506 for(Int_t index= fMCMother->GetFirstDaughter();index<= fMCMother->GetLastDaughter();index++){
1507 TParticle* temp = (TParticle*)fMCStack->Particle( index );
1509 switch( temp->GetPdgCode() ) {
1522 if( posPion && negPion && gamma) return kTRUE;