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, *
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)
21 #include "TParticle.h"
23 #include "TMCProcess.h"
24 #include "TDatabasePDG.h"
27 #include "TDirectory.h"
30 #include "AliAnalysisManager.h"
31 #include "AliESDInputHandler.h"
32 #include "AliESDtrack.h"
33 #include "AliMCEvent.h"
35 #include "AliMCEventHandler.h"
38 #include "AliESDtrackCuts.h"
39 #include "AliESDpidCuts.h"
40 #include "AliMCEvent.h"
42 #include "AliESDEvent.h"
43 #include "AliESDpid.h"
44 #include "AliKFParticle.h"
45 #include "AliMCEventHandler.h"
46 #include "AliKFVertex.h"
47 #include "AliTriggerAnalysis.h"
48 #include "AliCentrality.h"
49 #include "AliMultiplicity.h"
50 #include "AliAnalysisTaskGammaConvDalitzV1.h"
53 #include "THnSparse.h"
55 ClassImp( AliAnalysisTaskGammaConvDalitzV1 )
57 //-----------------------------------------------------------------------------------------------
58 AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1():
72 fSelectorElectronIndex(0),
73 fSelectorPositronIndex(0),
75 fGoodVirtualGammas(NULL),
79 fCutElectronArray(NULL),
82 fConversionCuts(NULL),
83 hESDConvGammaPt(NULL),
84 hESDDalitzElectronPt(NULL),
85 hESDDalitzPositronPt(NULL),
86 hESDEposEnegPsiPairDPhi(NULL),
87 hESDEposEnegInvMassPt(NULL),
88 hESDMotherInvMassPt(NULL),
89 hESDPi0MotherInvMassPt(NULL),
90 hESDPi0MotherDiffInvMassPt(NULL),
91 sESDMotherInvMassPtZM(NULL),
92 hESDMotherBackInvMassPt(NULL),
93 sESDMotherBackInvMassPtZM(NULL),
100 hESDTrueMotherInvMassPt(NULL),
101 hESDTrueMotherPi0GGInvMassPt(NULL),
102 hESDTruePrimaryMotherInvMassMCPt(NULL),
103 hESDTruePrimaryPi0DalitzESDPtMCPt(NULL),
104 hESDTrueSecondaryMotherInvMassPt(NULL),
105 hESDTrueSecondaryMotherFromK0sInvMassPt(NULL),
106 hESDTrueBckGGInvMassPt(NULL),
107 hESDTrueBckContInvMassPt(NULL),
108 hESDTrueMotherGGInvMassPt(NULL),
109 hESDTrueConvGammaPt(NULL),
111 hNGoodESDTracks(NULL),
119 fNumberOfESDTracks(0),
120 fMoveParticleAccordingToVertex(kFALSE),
122 fDoMesonAnalysis(kTRUE)
127 //-----------------------------------------------------------------------------------------------
128 AliAnalysisTaskGammaConvDalitzV1::AliAnalysisTaskGammaConvDalitzV1( const char* name ):
129 AliAnalysisTaskSE(name),
143 fSelectorElectronIndex(0),
144 fSelectorPositronIndex(0),
146 fGoodVirtualGammas(NULL),
147 fGoodElectrons(NULL),
148 fGoodPositrons(NULL),
149 fCutGammaArray(NULL),
150 fCutElectronArray(NULL),
151 fCutMesonArray(NULL),
153 fConversionCuts(NULL),
154 hESDConvGammaPt(NULL),
155 hESDDalitzElectronPt(NULL),
156 hESDDalitzPositronPt(NULL),
157 hESDEposEnegPsiPairDPhi(NULL),
158 hESDEposEnegInvMassPt(NULL),
159 hESDMotherInvMassPt(NULL),
160 hESDPi0MotherInvMassPt(NULL),
161 hESDPi0MotherDiffInvMassPt(NULL),
162 sESDMotherInvMassPtZM(NULL),
163 hESDMotherBackInvMassPt(NULL),
164 sESDMotherBackInvMassPtZM(NULL),
171 hESDTrueMotherInvMassPt(NULL),
172 hESDTrueMotherPi0GGInvMassPt(NULL),
173 hESDTruePrimaryMotherInvMassMCPt(NULL),
174 hESDTruePrimaryPi0DalitzESDPtMCPt(NULL),
175 hESDTrueSecondaryMotherInvMassPt(NULL),
176 hESDTrueSecondaryMotherFromK0sInvMassPt(NULL),
177 hESDTrueBckGGInvMassPt(NULL),
178 hESDTrueBckContInvMassPt(NULL),
179 hESDTrueMotherGGInvMassPt(NULL),
180 hESDTrueConvGammaPt(NULL),
182 hNGoodESDTracks(NULL),
190 fNumberOfESDTracks(0),
191 fMoveParticleAccordingToVertex(kFALSE),
193 fDoMesonAnalysis(kTRUE)
195 DefineOutput(1, TList::Class());
198 //-----------------------------------------------------------------------------------------------
199 AliAnalysisTaskGammaConvDalitzV1::~AliAnalysisTaskGammaConvDalitzV1()
202 // virtual destructor
204 cout<<"Destructor"<<endl;
210 if(fGoodVirtualGammas){
211 delete fGoodVirtualGammas;
227 delete[] fGammasPool;
232 //___________________________________________________________
233 void AliAnalysisTaskGammaConvDalitzV1::InitBack(){
235 Double_t *zBinLimitsArray = new Double_t[9];
236 zBinLimitsArray[0] = -50.00;
237 zBinLimitsArray[1] = -3.375;
238 zBinLimitsArray[2] = -1.605;
239 zBinLimitsArray[3] = -0.225;
240 zBinLimitsArray[4] = 1.065;
241 zBinLimitsArray[5] = 2.445;
242 zBinLimitsArray[6] = 4.245;
243 zBinLimitsArray[7] = 50.00;
244 zBinLimitsArray[8] = 1000.00;
246 Double_t *multiplicityBinLimitsArrayTracks = new Double_t[6];
247 multiplicityBinLimitsArrayTracks[0] = 0;
248 multiplicityBinLimitsArrayTracks[1] = 8.5;
249 multiplicityBinLimitsArrayTracks[2] = 16.5;
250 multiplicityBinLimitsArrayTracks[3] = 27.5;
251 multiplicityBinLimitsArrayTracks[4] = 41.5;
252 multiplicityBinLimitsArrayTracks[5] = 200.;
255 multiplicityBinLimitsArrayTracks[0] = 0;
256 multiplicityBinLimitsArrayTracks[1] = 200.;
257 multiplicityBinLimitsArrayTracks[2] = 500.;
258 multiplicityBinLimitsArrayTracks[3] = 1000.;
259 multiplicityBinLimitsArrayTracks[4] = 1500.;
260 multiplicityBinLimitsArrayTracks[5] = 5000.;
263 Double_t *multiplicityBinLimitsArrayV0s = new Double_t[5];
265 multiplicityBinLimitsArrayV0s[0] = 2;
266 multiplicityBinLimitsArrayV0s[1] = 3;
267 multiplicityBinLimitsArrayV0s[2] = 4;
268 multiplicityBinLimitsArrayV0s[3] = 5;
269 multiplicityBinLimitsArrayV0s[4] = 9999;
272 multiplicityBinLimitsArrayV0s[0] = 2;
273 multiplicityBinLimitsArrayV0s[1] = 10;
274 multiplicityBinLimitsArrayV0s[2] = 30;
275 multiplicityBinLimitsArrayV0s[3] = 50;
276 multiplicityBinLimitsArrayV0s[4] = 9999;
279 const Int_t nDim = 4;
280 Int_t nBins[nDim] = {1000,250,8,5};
281 Double_t xMin[nDim] = {0,0, 0,0};
282 Double_t xMax[nDim] = {1,25,8,5};
284 sESDMotherInvMassPtZM = new THnSparseF*[fnCuts];
285 sESDMotherBackInvMassPtZM = new THnSparseF*[fnCuts];
288 fBGHandler = new AliGammaConversionAODBGHandler*[fnCuts];
290 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
293 TString cutstringElectron = ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
294 TString cutstringMeson = ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
295 TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
298 fBackList[iCut] = new TList();
299 fBackList[iCut]->SetName(Form("%s_%s_%s Back histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
300 fBackList[iCut]->SetOwner(kTRUE);
301 fCutFolder[iCut]->Add(fBackList[iCut]);
303 sESDMotherInvMassPtZM[iCut] = new THnSparseF("Back_Mother_InvMass_Pt_z_m","Back_Mother_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
304 sESDMotherInvMassPtZM[iCut]->Sumw2();
305 fBackList[iCut]->Add(sESDMotherInvMassPtZM[iCut]);
306 sESDMotherBackInvMassPtZM[iCut] = new THnSparseF("Back_Back_InvMass_Pt_z_m","Back_Back_InvMass_Pt_z_m",nDim,nBins,xMin,xMax);
307 sESDMotherBackInvMassPtZM[iCut]->Sumw2();
308 fBackList[iCut]->Add(sESDMotherBackInvMassPtZM[iCut]);
310 if(((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->UseTrackMultiplicity()) {
311 fBGHandler[iCut] = new AliGammaConversionAODBGHandler(9,6,((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->NumberOfRotationEvents());
312 fBGHandler[iCut]->Initialize(zBinLimitsArray, multiplicityBinLimitsArrayTracks);
315 fBGHandler[iCut] = new AliGammaConversionAODBGHandler(9,5,((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->NumberOfRotationEvents());
316 fBGHandler[iCut]->Initialize(zBinLimitsArray, multiplicityBinLimitsArrayV0s);
318 if( ( (AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetBKGMethod() == 3 ){
319 fGammasPool[iCut] = new TList();
325 //______________________________________________________________________
326 void AliAnalysisTaskGammaConvDalitzV1::UserCreateOutputObjects()
329 // Create ouput objects
332 // Create the output container
333 if(fOutputContainer != NULL){
334 delete fOutputContainer;
335 fOutputContainer = NULL;
337 if(fOutputContainer == NULL){
338 fOutputContainer = new TList();
339 fOutputContainer->SetOwner(kTRUE);
342 fGoodGammas = new TList();
343 //fGoodGammas->SetOwner(kTRUE);
346 fGoodVirtualGammas = new TList();
347 //fGoodVirtualGammas->SetOwner(kTRUE);
353 fGammasPool = new TList*[fnCuts];
354 fCutFolder = new TList*[fnCuts];
355 fESDList = new TList*[fnCuts];
356 fBackList = new TList*[fnCuts];
357 hNEvents = new TH1I*[fnCuts];
358 hNGoodESDTracks = new TH1I*[fnCuts];
359 hESDConvGammaPt = new TH1F*[fnCuts];
360 hESDDalitzElectronPt = new TH1F*[fnCuts];
361 hESDDalitzPositronPt = new TH1F*[fnCuts];
362 hESDEposEnegPsiPairDPhi = new TH2F*[fnCuts];
363 hESDEposEnegInvMassPt = new TH2F*[fnCuts];
364 hESDMotherInvMassPt = new TH2F*[fnCuts];
365 hESDPi0MotherInvMassPt = new TH2F*[fnCuts];
366 hESDPi0MotherDiffInvMassPt = new TH2F*[fnCuts];
367 hESDMotherBackInvMassPt = new TH2F*[fnCuts];
370 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
373 TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
374 TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
375 TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
377 fCutFolder[iCut] = new TList();
378 fCutFolder[iCut]->SetName(Form("Cut Number %s_%s_%s",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
379 fCutFolder[iCut]->SetOwner(kTRUE);
380 fOutputContainer->Add(fCutFolder[iCut]);
382 fESDList[iCut] = new TList();
383 fESDList[iCut]->SetName(Form("%s_%s_%s ESD histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
384 fESDList[iCut]->SetOwner(kTRUE);
388 hNEvents[iCut] = new TH1I("NEvents","NEvents",9,-0.5,8.5);
389 hNEvents[iCut]->GetXaxis()->SetBinLabel(1,"Accepted");
390 hNEvents[iCut]->GetXaxis()->SetBinLabel(2,"Centrality");
391 hNEvents[iCut]->GetXaxis()->SetBinLabel(3,"Missing MC");
392 hNEvents[iCut]->GetXaxis()->SetBinLabel(4,"Trigger");
393 hNEvents[iCut]->GetXaxis()->SetBinLabel(5,"Vertex Z");
394 hNEvents[iCut]->GetXaxis()->SetBinLabel(6,"Cont. Vertex");
395 hNEvents[iCut]->GetXaxis()->SetBinLabel(7,"Pile-Up");
396 hNEvents[iCut]->GetXaxis()->SetBinLabel(8,"no SDD");
397 hNEvents[iCut]->GetXaxis()->SetBinLabel(9,"no V0AND");
398 fESDList[iCut]->Add(hNEvents[iCut]);
403 if(fIsHeavyIon) hNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",3000,0,3000);
404 else hNGoodESDTracks[iCut] = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
405 fESDList[iCut]->Add(hNGoodESDTracks[iCut]);
407 hESDConvGammaPt[iCut] = new TH1F("ESD_ConvGamma_Pt","ESD_ConvGamma_Pt",250,0,25);
408 fESDList[iCut]->Add(hESDConvGammaPt[iCut]);
410 hESDDalitzElectronPt[iCut] = new TH1F("ESD_DalitzElectron_Pt","ESD_DalitzElectron_Pt",250,0,25);
411 fESDList[iCut]->Add(hESDDalitzElectronPt[iCut]);
413 hESDDalitzPositronPt[iCut] = new TH1F("ESD_DalitzPositron_Pt","ESD_DalitzPositron_Pt",250,0,25);
414 fESDList[iCut]->Add(hESDDalitzPositronPt[iCut]);
417 hESDEposEnegPsiPairDPhi[iCut] = new TH2F("ESD_EposEneg_PsiPair_DPhi","ESD_EposEneg_PsiPair_DPhi", 100, -1.0,1.0,100,-1.0,1.0 );
418 fESDList[iCut]->Add(hESDEposEnegPsiPairDPhi[iCut]);
420 hESDEposEnegInvMassPt[iCut] = new TH2F("ESD_EposEneg_InvMassPt","ESD_EposEneg_InvMassPt",5000,0.,5.,100,0.,10.);
421 fESDList[iCut]->Add(hESDEposEnegInvMassPt[iCut]);
424 hESDMotherInvMassPt[iCut] = new TH2F("ESD_DalitzMother_InvMass_Pt","ESD_DalitzMother_InvMass_Pt",1000,0,1,250,0,25);
425 fESDList[iCut]->Add(hESDMotherInvMassPt[iCut]);
427 hESDPi0MotherInvMassPt[iCut] = new TH2F("ESD_Pi0Mother_InvMass_Pt","ESD_Pi0Mother_InvMass_Pt",4000,0,4,250,0,25);
428 fESDList[iCut]->Add(hESDPi0MotherInvMassPt[iCut]);
430 hESDPi0MotherDiffInvMassPt[iCut] = new TH2F("ESD_Pi0Mother_DiffInvMass_Pt","ESD_Pi0Mother_DiffInvMass_Pt",2000,0,2,250,0,25);
431 fESDList[iCut]->Add(hESDPi0MotherDiffInvMassPt[iCut]);
435 hESDMotherBackInvMassPt[iCut] = new TH2F("ESD_DalitzBackground_InvMass_Pt","ESD_DalitzBackground_InvMass_Pt",1000,0,1,250,0,25);
436 fESDList[iCut]->Add(hESDMotherBackInvMassPt[iCut]);
438 fCutFolder[iCut]->Add(fESDList[iCut]);
445 InitBack(); // Init Background Handler
450 fMCList = new TList*[fnCuts];
452 fTrueList = new TList*[fnCuts];
453 hESDTrueConvGammaPt = new TH1F*[fnCuts];
454 //if(fDoMesonAnalysis){
455 hMCPi0Pt = new TH1F*[fnCuts];
456 hMCPi0GGPt = new TH1F*[fnCuts];
457 hMCEtaPt = new TH1F*[fnCuts];
458 hMCEtaGGPt = new TH1F*[fnCuts];
459 hMCPi0InAccPt = new TH1F*[fnCuts];
460 hMCEtaInAccPt = new TH1F*[fnCuts];
462 hESDTrueMotherInvMassPt = new TH2F*[fnCuts];
463 hESDTrueMotherPi0GGInvMassPt = new TH2F*[fnCuts];
464 hESDTruePrimaryPi0DalitzESDPtMCPt = new TH2F*[fnCuts];
465 hESDTruePrimaryMotherInvMassMCPt = new TH2F*[fnCuts];
466 hESDTrueSecondaryMotherInvMassPt = new TH2F*[fnCuts];
467 hESDTrueSecondaryMotherFromK0sInvMassPt = new TH2F*[fnCuts];
468 hESDTrueBckGGInvMassPt = new TH2F*[fnCuts];
469 hESDTrueBckContInvMassPt = new TH2F*[fnCuts];
470 hESDTrueMotherGGInvMassPt = new TH2F*[fnCuts];
473 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
474 TString cutstringElectron =((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutNumber();
475 TString cutstringMeson= ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutNumber();
476 TString cutstringGamma = ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutNumber();
478 fMCList[iCut] = new TList();
479 fMCList[iCut]->SetName(Form("%s_%s_%s MC histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
480 fMCList[iCut]->SetOwner(kTRUE);
481 fCutFolder[iCut]->Add(fMCList[iCut]);
483 hMCPi0Pt[iCut] = new TH1F("MC_Pi0_Pt","MC_Pi0_Pt",250,0,25);
484 fMCList[iCut]->Add(hMCPi0Pt[iCut]);
486 hMCPi0GGPt[iCut] = new TH1F("MC_Pi0_GG_Pt","MC_Pi0_GG_Pt",250,0,25);
487 fMCList[iCut]->Add(hMCPi0GGPt[iCut]);
490 hMCEtaPt[iCut] = new TH1F("MC_Eta_Pt","MC_Eta_Pt",250,0,25);
491 fMCList[iCut]->Add(hMCEtaPt[iCut]);
493 hMCEtaGGPt[iCut] = new TH1F("MC_Eta_GG_Pt","MC_Eta_GG_Pt",250,0,25);
494 fMCList[iCut]->Add(hMCEtaGGPt[iCut]);
497 hMCPi0InAccPt[iCut] = new TH1F("MC_Pi0DalitzInAcc_Pt","MC_Pi0DalitzInAcc_Pt",250,0,25);
498 fMCList[iCut]->Add(hMCPi0InAccPt[iCut]);
499 hMCEtaInAccPt[iCut] = new TH1F("MC_EtaDalitzInAcc_Pt","MC_EtaDalitzInAcc_Pt",250,0,25);
500 fMCList[iCut]->Add(hMCEtaInAccPt[iCut]);
502 fTrueList[iCut] = new TList();
503 fTrueList[iCut]->SetName(Form("%s_%s_%s True histograms",cutstringGamma.Data(),cutstringElectron.Data(),cutstringMeson.Data()));
504 fTrueList[iCut]->SetOwner(kTRUE);
505 fCutFolder[iCut]->Add(fTrueList[iCut]);
507 hESDTrueConvGammaPt[iCut] = new TH1F("ESD_TrueConvGamma_Pt","ESD_TrueConvGamma_Pt",250,0,25);
508 fTrueList[iCut]->Add(hESDTrueConvGammaPt[iCut]);
510 hESDTrueMotherInvMassPt[iCut] = new TH2F("ESD_TrueMother_InvMass_Pt","ESD_TrueMother_InvMass_Pt",1000,0,1,250,0,25);
511 fTrueList[iCut]->Add(hESDTrueMotherInvMassPt[iCut]);
513 hESDTrueMotherPi0GGInvMassPt[iCut] = new TH2F("ESD_TrueMotherPi0GG_InvMass_Pt","ESD_TrueMotherPi0GG_InvMass_Pt",1000,0,1,250,0,25);
514 fTrueList[iCut]->Add(hESDTrueMotherPi0GGInvMassPt[iCut]);
515 hESDTruePrimaryPi0DalitzESDPtMCPt[iCut] = new TH2F("ESD_TruePrimaryPi0Dalitz_ESDPt_MCPt","ESD_TruePrimaryPi0Dalitz_ESDPt_MCPt",250,0,25,250,0,25);
516 fTrueList[iCut]->Add(hESDTruePrimaryPi0DalitzESDPtMCPt[iCut]);
517 hESDTruePrimaryMotherInvMassMCPt[iCut] = new TH2F("ESD_TruePrimaryMother_InvMass_MCPt","ESD_TrueDalitzPrimaryMother_InvMass_MCPt",1000,0,1,250,0,25);
518 fTrueList[iCut]->Add(hESDTruePrimaryMotherInvMassMCPt[iCut]);
519 hESDTrueSecondaryMotherInvMassPt[iCut] = new TH2F("ESD_TrueDalitzSecondaryMother_InvMass_Pt","ESD_TrueDalitzSecondaryMother_InvMass_Pt",1000,0,1,250,0,25);
520 fTrueList[iCut]->Add(hESDTrueSecondaryMotherInvMassPt[iCut]);
521 // hESDTrueSecondaryMotherFromK0sInvMassPt[iCut] = new TH2F("ESD_TrueDalitzSecondaryMotherFromK0s_InvMass_Pt","ESD_TrueDalitzSecondaryMotherFromK0s_InvMass_Pt",1000,0,1,250,0,25);
522 // fTrueList[iCut]->Add(hESDTrueSecondaryMotherFromK0sInvMassPt[iCut]);
523 hESDTrueBckGGInvMassPt[iCut] = new TH2F("ESD_TrueDalitzBckGG_InvMass_Pt","ESD_TrueDalitzBckGG_InvMass_Pt",1000,0,1,250,0,25);
524 fTrueList[iCut]->Add(hESDTrueBckGGInvMassPt[iCut]);
525 hESDTrueBckContInvMassPt[iCut] = new TH2F("ESD_TrueDalitzBckCont_InvMass_Pt","ESD_TrueDalitzBckCont_InvMass_Pt",1000,0,1,250,0,25);
526 fTrueList[iCut]->Add(hESDTrueBckContInvMassPt[iCut]);
527 // hESDTrueMotherGGInvMassPt[iCut] = new TH2F("ESD_TrueGammaGamma_InvMass_Pt","ESD_TrueGammaGamma_InvMass_Pt",1000,0,1,250,0,25);
528 // fTrueList[iCut]->Add(hESDTrueMotherGGInvMassPt[iCut]);
533 PostData(1, fOutputContainer);
537 //______________________________________________________________________
538 void AliAnalysisTaskGammaConvDalitzV1::UserExec(Option_t *)
542 // Execute analysis for current event
546 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
547 if(!fV0Reader){printf("Error: No V0 Reader");return;} // GetV0Reader
550 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
552 if(eventQuality == 2 || eventQuality == 3){// Event Not Accepted due to MC event missing or wrong trigger for V0ReaderV1
553 for(Int_t iCut = 0; iCut<fnCuts; iCut++){
554 hNEvents[iCut]->Fill(eventQuality);
562 fElecSelector=(AliDalitzElectronSelector*)AliAnalysisManager::GetAnalysisManager()->GetTask("ElectronSelector");
563 if(!fElecSelector){printf("Error: No ElectronSelector");return;} // GetV0Reader
566 fMCEvent = MCEvent();
567 fESDEvent = (AliESDEvent*)InputEvent();
568 fReaderGammas = fV0Reader->GetReconstructedGammas(); // Gammas from default Cut
569 fSelectorElectronIndex = fElecSelector->GetReconstructedElectronsIndex(); // Electrons from default Cut
570 fSelectorPositronIndex = fElecSelector->GetReconstructedPositronsIndex(); // Positrons from default Cut
572 CountESDTracks(); // Estimate Event Multiplicity
573 //AddTaskContainers(); //Add conatiner
575 for(Int_t iCut = 0; iCut<fnCuts; iCut++){
578 Int_t eventNotAccepted =
579 ((AliConversionCuts*)fCutGammaArray->At(iCut))
580 ->IsEventAcceptedByConversionCut(fV0Reader->GetConversionCuts(),fInputEvent,fMCEvent,fIsHeavyIon);
581 if(eventNotAccepted){
582 // cout << "event rejected due to wrong trigger: " <<eventNotAccepted << endl;
583 hNEvents[iCut]->Fill(eventNotAccepted); // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
587 if(eventQuality != 0){// Event Not Accepted
588 // cout << "event rejected due to: " <<eventQuality << endl;
589 hNEvents[iCut]->Fill(eventQuality);
593 hNEvents[iCut]->Fill(eventQuality);
595 hNGoodESDTracks[iCut]->Fill(fNumberOfESDTracks);
597 if(fMCEvent){ // Process MC Particle
598 fMCStack = fMCEvent->Stack();
599 ProcessMCParticles();
604 ProcessPhotonCandidates(); // Process this cuts gammas
605 ProcessElectronCandidates(); // Process this cuts gammas
606 CalculatePi0DalitzCandidates();
607 CalculateBackground();
608 UpdateEventByEventData();
612 fGoodGammas->Clear(); // delete this cuts good gammas
613 fGoodVirtualGammas->Clear(); // delete this cuts good gammas
616 fSelectorElectronIndex.clear();
617 fSelectorPositronIndex.clear();
619 PostData( 1, fOutputContainer );
622 void AliAnalysisTaskGammaConvDalitzV1::Terminate(const Option_t *)
627 if ( ((AliDalitzElectronCuts*)fElecSelector->GetDalitzElectronCuts())->GetCutHistograms() ){
628 fOutputContainer->Add( ((AliDalitzElectronCuts*)fElecSelector->GetDalitzElectronCuts())->GetCutHistograms() );
635 if ( ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms() ){
636 fOutputContainer->Add( ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetCutHistograms() );
643 for(Int_t iCut = 0; iCut<fnCuts;iCut++){
645 if( fCutElectronArray ){
646 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutHistograms() ) {
647 fCutFolder[iCut]->Add( ((AliDalitzElectronCuts*)fCutElectronArray->At(iCut))->GetCutHistograms() );
651 if( fCutMesonArray ) {
652 if( ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutHistograms() ) {
653 fCutFolder[iCut]->Add( ((AliConversionMesonCuts*)fCutMesonArray->At(iCut))->GetCutHistograms());
657 if( fCutGammaArray ) {
658 if( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutHistograms() ) {
659 fCutFolder[iCut]->Add( ((AliConversionCuts*)fCutGammaArray->At(iCut))->GetCutHistograms() );
665 //________________________________________________________________________
666 void AliAnalysisTaskGammaConvDalitzV1::ProcessPhotonCandidates()
669 TList *GoodGammasStepOne = new TList();
670 TList *GoodGammasStepTwo = new TList();
671 // Loop over Photon Candidates allocated by ReaderV1
672 for(Int_t i = 0; i < fReaderGammas->GetEntriesFast(); i++){
673 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) fReaderGammas->At(i);
674 if(!PhotonCandidate) continue;
675 if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelected(PhotonCandidate,fESDEvent)) continue;
677 if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut() &&
678 !((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // if no post reader loop is required add to events good gammas
679 fGoodGammas->Add(PhotonCandidate);
680 hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
682 ProcessTruePhotonCandidates(PhotonCandidate);
685 else if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut()){ // if Shared Electron cut is enabled, Fill array, add to step one
686 ((AliConversionCuts*)fCutGammaArray->At(fiCut))->FillElectonLabelArray(PhotonCandidate,nV0);
688 GoodGammasStepOne->Add(PhotonCandidate);
690 else if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut() &&
691 ((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // shared electron is disabled, step one not needed -> step two
692 GoodGammasStepTwo->Add(PhotonCandidate);
695 if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseElecSharingCut()){
696 for(Int_t i = 0;i<GoodGammasStepOne->GetEntries();i++){
697 AliAODConversionPhoton *PhotonCandidate= (AliAODConversionPhoton*) GoodGammasStepOne->At(i);
698 if(!PhotonCandidate) continue;
699 if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->RejectSharedElectronV0s(PhotonCandidate,i,GoodGammasStepOne->GetEntries())) continue;
700 if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){ // To Colse v0s cut diabled, step two not needed
701 fGoodGammas->Add(PhotonCandidate);
702 hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt());
704 ProcessTruePhotonCandidates(PhotonCandidate);
707 else GoodGammasStepTwo->Add(PhotonCandidate); // Close v0s cut enabled -> add to list two
710 if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->UseToCloseV0sCut()){
711 for(Int_t i = 0;i<GoodGammasStepTwo->GetEntries();i++){
712 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) GoodGammasStepTwo->At(i);
713 if(!PhotonCandidate) continue;
714 if(!((AliConversionCuts*)fCutGammaArray->At(fiCut))->RejectToCloseV0s(PhotonCandidate,GoodGammasStepTwo,i)) continue;
715 fGoodGammas->Add(PhotonCandidate); // Add gamma to current cut TList
716 hESDConvGammaPt[fiCut]->Fill(PhotonCandidate->Pt()); // Differences to old V0Reader in p_t due to conversion KF->TLorentzVector
718 ProcessTruePhotonCandidates(PhotonCandidate);
723 delete GoodGammasStepOne;
724 GoodGammasStepOne = 0x0;
725 delete GoodGammasStepTwo;
726 GoodGammasStepTwo = 0x0;
729 //________________________________________________________________________
730 void AliAnalysisTaskGammaConvDalitzV1::ProcessTruePhotonCandidates(AliAODConversionPhoton *TruePhotonCandidate)
732 // Process True Photons
733 AliStack *MCStack = fMCEvent->Stack();
734 TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(MCStack);
735 TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(MCStack);
737 if(posDaughter == NULL || negDaughter == NULL) return; // One particle does not exist
738 if(posDaughter->GetMother(0) != negDaughter->GetMother(0)){ // Not Same Mother == Combinatorial Bck
741 if(TMath::Abs(posDaughter->GetPdgCode())!=11 || TMath::Abs(negDaughter->GetPdgCode())!=11) return; //One Particle is not electron
742 if(posDaughter->GetPdgCode()==negDaughter->GetPdgCode()) return; // Same Charge
743 if(posDaughter->GetUniqueID() != 5 || negDaughter->GetUniqueID() !=5) return;// check if the daughters come from a conversion
745 TParticle *Photon = TruePhotonCandidate->GetMCParticle(MCStack);
746 if(Photon->GetPdgCode() != 22) return; // Mother is no Photon
749 hESDTrueConvGammaPt[fiCut]->Fill(TruePhotonCandidate->Pt());
753 //________________________________________________________________________
754 void AliAnalysisTaskGammaConvDalitzV1::ProcessElectronCandidates(){
756 Double_t magField = fInputEvent->GetMagneticField();
759 if( magField < 0.0 ){
770 vector<Int_t> lGoodElectronIndex(0);
771 vector<Int_t> lGoodPositronIndex(0);
775 for(UInt_t i = 0; i < fSelectorElectronIndex.size(); i++){
777 AliESDtrack* electronCandidate = fESDEvent->GetTrack(fSelectorElectronIndex[i]);
778 if(! ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelected(electronCandidate) ) continue;
779 lGoodElectronIndex.push_back( fSelectorElectronIndex[i] );
780 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->DoPsiPairCut() == kFALSE ){
781 hESDDalitzElectronPt[fiCut]->Fill(electronCandidate->Pt());
786 for(UInt_t i = 0; i < fSelectorPositronIndex.size(); i++){
788 AliESDtrack* positronCandidate = fESDEvent->GetTrack(fSelectorPositronIndex[i]);
789 if(! ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->ElectronIsSelected(positronCandidate) ) continue;
790 lGoodPositronIndex.push_back( fSelectorPositronIndex[i] );
791 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->DoPsiPairCut() == kFALSE ){
792 hESDDalitzPositronPt[fiCut]->Fill(positronCandidate->Pt());
798 vector<Bool_t> lElectronPsiIndex(lGoodElectronIndex.size(), kTRUE);
799 vector<Bool_t> lPositronPsiIndex(lGoodPositronIndex.size(), kTRUE);
802 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->DoPsiPairCut() == kTRUE ){
804 for( UInt_t i = 0; i < lGoodElectronIndex.size(); i++ ) {
806 AliESDtrack *electronCandidate = fESDEvent->GetTrack(lGoodElectronIndex[i]);
808 for(UInt_t j = 0; j < lGoodPositronIndex.size(); j++){
809 AliESDtrack *positronCandidate = fESDEvent->GetTrack(lGoodPositronIndex[j]);
810 Double_t psiPair = GetPsiPair(positronCandidate,electronCandidate);
811 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->GetConstrainedParam()->Phi()-positronCandidate->GetConstrainedParam()->Phi());
813 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->IsFromGammaConversion(psiPair,deltaPhi ) ){
814 lElectronPsiIndex[i] = kFALSE;
815 lPositronPsiIndex[j] = kFALSE;
822 for(UInt_t i = 0; i < lGoodElectronIndex.size(); i++){
824 if( lElectronPsiIndex[i] == kTRUE ){
825 AliESDtrack* electronCandidate = fESDEvent->GetTrack(lGoodElectronIndex[i]);
826 hESDDalitzElectronPt[fiCut]->Fill(electronCandidate->Pt());
830 for(UInt_t i = 0; i < lGoodPositronIndex.size(); i++){
831 if( lPositronPsiIndex[i] == kTRUE ) {
832 AliESDtrack* positronCandidate = fESDEvent->GetTrack(lGoodPositronIndex[i]);
833 hESDDalitzPositronPt[fiCut]->Fill(positronCandidate->Pt());
843 for(UInt_t i = 0; i < lGoodElectronIndex.size(); i++){
845 if( lElectronPsiIndex[i] == kFALSE ) continue;
848 AliESDtrack *electronCandidate = fESDEvent->GetTrack(lGoodElectronIndex[i]);
850 AliKFParticle electronCandidateKF( *electronCandidate->GetConstrainedParam(), ::kElectron );
852 for(UInt_t j = 0; j < lGoodPositronIndex.size(); j++){
854 if( lPositronPsiIndex[j] == kFALSE ) continue;
856 AliESDtrack *positronCandidate = fESDEvent->GetTrack(lGoodPositronIndex[j]);
857 AliKFParticle positronCandidateKF( *positronCandidate->GetConstrainedParam(), ::kPositron );
859 Double_t psiPair = GetPsiPair(positronCandidate,electronCandidate);
860 Double_t deltaPhi = magField * TVector2::Phi_mpi_pi( electronCandidate->GetConstrainedParam()->Phi()-positronCandidate->GetConstrainedParam()->Phi());
861 hESDEposEnegPsiPairDPhi[fiCut]->Fill(deltaPhi,psiPair);
866 AliKFConversionPhoton* virtualPhoton = new AliKFConversionPhoton(electronCandidateKF,positronCandidateKF);
869 AliKFVertex primaryVertexImproved(*fInputEvent->GetPrimaryVertex());
870 primaryVertexImproved+=*virtualPhoton;
871 virtualPhoton->SetProductionVertex(primaryVertexImproved);
873 virtualPhoton->SetTrackLabels( lGoodPositronIndex[j], lGoodElectronIndex[i]);
877 // AliStack *fMCStack= fMCEvent->Stack();
878 Int_t labeln=TMath::Abs(electronCandidate->GetLabel());
879 Int_t labelp=TMath::Abs(positronCandidate->GetLabel());
880 TParticle *fNegativeMCParticle = fMCStack->Particle(labeln);
881 TParticle *fPositiveMCParticle = fMCStack->Particle(labelp);
882 if( fPositiveMCParticle && fNegativeMCParticle) {
883 virtualPhoton->SetMCLabelPositive(labelp);
884 virtualPhoton->SetMCLabelNegative(labeln);
887 AliAODConversionPhoton *vphoton = new AliAODConversionPhoton(virtualPhoton); //To Apply PsiPairCut
888 // cout<<"Virtual Photon Mass: "<<vphoton->GetMass()<<" Pt: "<<vphoton->Pt()<<endl;
890 hESDEposEnegInvMassPt[fiCut]->Fill(vphoton->GetMass(),vphoton->Pt());
892 fGoodVirtualGammas->Add( vphoton );
898 //________________________________________________________________________
899 void AliAnalysisTaskGammaConvDalitzV1::CalculatePi0DalitzCandidates(){
906 if( fGoodGammas->GetEntries() > 0 && fGoodVirtualGammas->GetEntries() > 0 ){
909 for(Int_t GammaIndex=0; GammaIndex<fGoodGammas->GetEntries(); GammaIndex++){
911 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fGoodGammas->At(GammaIndex));
913 for(Int_t virtualGammaIndex=0;virtualGammaIndex<fGoodVirtualGammas->GetEntries();virtualGammaIndex++){
915 AliAODConversionPhoton *Vgamma=dynamic_cast<AliAODConversionPhoton*>(fGoodVirtualGammas->At(virtualGammaIndex));
916 //Check for same Electron ID
917 if(gamma->GetTrackLabelPositive() == Vgamma->GetTrackLabelPositive() ||
918 gamma->GetTrackLabelNegative() == Vgamma->GetTrackLabelNegative() ||
919 gamma->GetTrackLabelNegative() == Vgamma->GetTrackLabelPositive() ||
920 gamma->GetTrackLabelPositive() == Vgamma->GetTrackLabelNegative() ) continue;
922 AliAODConversionMother *pi0cand = new AliAODConversionMother(gamma,Vgamma);
923 pi0cand->SetLabels(GammaIndex,virtualGammaIndex);
925 if( ( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(pi0cand,kTRUE)) ){
926 hESDMotherInvMassPt[fiCut]->Fill(pi0cand->M(),pi0cand->Pt());
927 hESDPi0MotherInvMassPt[fiCut]->Fill(pi0cand->M(),pi0cand->Pt());
929 Double_t diffMass = pi0cand->M() - Vgamma->GetMass();
931 hESDPi0MotherDiffInvMassPt[fiCut]->Fill( diffMass , pi0cand->Pt() );
932 // if(pi0cand->GetAlpha()<0.1){
933 // hESDMotherInvMassEalpha[fiCut]->Fill(pi0cand->M(),pi0cand->E());
935 Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
937 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity() ){
938 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
940 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
942 Double_t sparesFill[4] = {pi0cand->M(),pi0cand->Pt(),(Double_t)zbin,(Double_t)mbin};
943 sESDMotherInvMassPtZM[fiCut]->Fill(sparesFill,1);
945 ProcessTrueMesonCandidates(pi0cand,gamma,Vgamma);
955 //________________________________________________________________________
956 void AliAnalysisTaskGammaConvDalitzV1::CalculateBackground(){
958 Int_t zbin= fBGHandler[fiCut]->GetZBinIndex(fESDEvent->GetPrimaryVertex()->GetZ());
963 method = ((AliDalitzElectronCuts*) fCutElectronArray->At(fiCut))->GetBKGMethod();
966 if(((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity()){
967 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fNumberOfESDTracks);
969 mbin = fBGHandler[fiCut]->GetMultiplicityBinIndex(fGoodGammas->GetEntries());
972 if( method == 1 || method == 2 ) {
974 AliGammaConversionAODBGHandler::GammaConversionVertex *bgEventVertex = NULL;
976 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity() ) {
978 for(Int_t nEventsInBG=0;nEventsInBG<fBGHandler[fiCut]->GetNBGEvents();nEventsInBG++){
980 AliGammaConversionAODVector *previousEventV0s = fBGHandler[fiCut]->GetBGGoodV0s(zbin,mbin,nEventsInBG);
982 if(fMoveParticleAccordingToVertex == kTRUE && method == 1){
983 bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
986 for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
987 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
989 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
990 AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
992 if(fMoveParticleAccordingToVertex == kTRUE && method == 1 ){
993 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
996 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
997 if( ( ((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE) ) ){
998 hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
999 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1000 sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1002 delete backgroundCandidate;
1003 backgroundCandidate = 0x0;
1009 for(Int_t nEventsInBG=0;nEventsInBG <fBGHandler[fiCut]->GetNBGEvents();nEventsInBG++){
1010 AliGammaConversionAODVector *previousEventV0s = fBGHandler[fiCut]->GetBGGoodV0s(zbin,mbin,nEventsInBG);
1011 if(previousEventV0s){
1012 if(fMoveParticleAccordingToVertex == kTRUE && method == 1){
1013 bgEventVertex = fBGHandler[fiCut]->GetBGEventVertex(zbin,mbin,nEventsInBG);
1015 for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
1017 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
1019 for(UInt_t iPrevious=0;iPrevious<previousEventV0s->size();iPrevious++){
1021 AliAODConversionPhoton previousGoodV0 = (AliAODConversionPhoton)(*(previousEventV0s->at(iPrevious)));
1023 if(fMoveParticleAccordingToVertex == kTRUE && method ==1){
1024 MoveParticleAccordingToVertex(&previousGoodV0,bgEventVertex);
1027 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
1028 if((((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE))){
1029 hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
1030 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1031 sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1033 delete backgroundCandidate;
1034 backgroundCandidate = 0x0;
1042 else if( method == 3 ){
1044 for(Int_t iCurrent=0;iCurrent<fGoodVirtualGammas->GetEntries();iCurrent++){
1046 AliAODConversionPhoton currentEventGoodV0 = *(AliAODConversionPhoton*)(fGoodVirtualGammas->At(iCurrent));
1048 for(Int_t iPrevious=0;iPrevious<fGammasPool[fiCut]->GetEntries();iPrevious++){
1050 AliAODConversionPhoton previousGoodV0 = *(AliAODConversionPhoton*)((fGammasPool[fiCut]->At(iPrevious) ));
1053 AliAODConversionMother *backgroundCandidate = new AliAODConversionMother(¤tEventGoodV0,&previousGoodV0);
1055 if((((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelected(backgroundCandidate,kFALSE))){
1057 hESDMotherBackInvMassPt[fiCut]->Fill(backgroundCandidate->M(),backgroundCandidate->Pt());
1058 Double_t sparesFill[4] = {backgroundCandidate->M(),backgroundCandidate->Pt(),(Double_t)zbin,(Double_t)mbin};
1059 sESDMotherBackInvMassPtZM[fiCut]->Fill(sparesFill,1);
1061 delete backgroundCandidate;
1062 backgroundCandidate = 0x0;
1068 //________________________________________________________________________
1069 void AliAnalysisTaskGammaConvDalitzV1::UpdateEventByEventData(){
1070 //see header file for documentation
1074 method = ( (AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetBKGMethod();
1078 if(fGoodGammas->GetEntries() > 0 ){
1080 if( ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity() ){
1081 fBGHandler[fiCut]->AddEvent(fGoodGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fNumberOfESDTracks);
1084 else{ // means we use #V0s for multiplicity
1085 fBGHandler[fiCut]->AddEvent(fGoodGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fGoodGammas->GetEntries());
1090 else if ( method == 2 ){
1092 if(fGoodVirtualGammas->GetEntries() > 0 ){
1093 if(((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->UseTrackMultiplicity()){
1094 fBGHandler[fiCut]->AddEvent(fGoodVirtualGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fNumberOfESDTracks);
1096 else{ // means we use #V0s for multiplicity
1097 fBGHandler[fiCut]->AddEvent(fGoodVirtualGammas,fESDEvent->GetPrimaryVertex()->GetX(),fESDEvent->GetPrimaryVertex()->GetY(),fESDEvent->GetPrimaryVertex()->GetZ(),fGoodVirtualGammas->GetEntries());
1101 else if ( method == 3 ) {
1105 for(Int_t index = 0; index < fGoodGammas->GetEntries(); index++){
1108 if ( fGammasPool[fiCut]->GetEntries() > ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->NumberOfRotationEvents() ){
1109 fGammasPool[fiCut]->RemoveLast();
1111 fGammasPool[fiCut]->AddFirst( new AliAODConversionPhoton(*(AliAODConversionPhoton*)(fGoodGammas->At(index)) ) );
1116 //______________________________________________________________________
1117 void AliAnalysisTaskGammaConvDalitzV1::ProcessTrueMesonCandidates(AliAODConversionMother *Pi0Candidate, AliAODConversionPhoton *TrueGammaCandidate, AliAODConversionPhoton *TrueVirtualGammaCandidate)
1120 // Process True Mesons
1122 AliStack *MCStack = fMCEvent->Stack();
1125 if(TrueGammaCandidate->GetV0Index()<fESDEvent->GetNumberOfV0s()){
1128 Bool_t isTruePi0 = kFALSE;
1129 Bool_t isTrueEta = kFALSE;
1130 Int_t gammaMCLabel = TrueGammaCandidate->GetMCParticleLabel(MCStack);
1131 Int_t gammaMotherLabel = -1;
1136 if(gammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
1139 // Daughters Gamma 0
1140 TParticle * negativeMC = (TParticle*)TrueGammaCandidate->GetNegativeMCDaughter(MCStack);
1141 TParticle * positiveMC = (TParticle*)TrueGammaCandidate->GetPositiveMCDaughter(MCStack);
1142 TParticle * gammaMC = (TParticle*)MCStack->Particle(gammaMCLabel);
1145 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){ // Electrons ...
1147 if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
1149 if(gammaMC->GetPdgCode() == 22){ // ... with Gamma Mother
1150 gammaMotherLabel=gammaMC->GetFirstMother();
1157 Int_t virtualGammaMCLabel = TrueVirtualGammaCandidate->GetMCParticleLabel(MCStack);
1158 Int_t virtualGammaMotherLabel = -1;
1159 Int_t virtualGamma = 1;
1161 if(virtualGammaMCLabel != -1){ // Gamma is Combinatorial; MC Particles don't belong to the same Mother
1162 // Daughters Gamma 1
1163 TParticle * negativeMC = (TParticle*)TrueVirtualGammaCandidate->GetNegativeMCDaughter(MCStack);
1164 TParticle * positiveMC = (TParticle*)TrueVirtualGammaCandidate->GetPositiveMCDaughter(MCStack);
1165 TParticle * virtualGammaMotherMC = (TParticle*)MCStack->Particle(virtualGammaMCLabel);
1167 if(TMath::Abs(negativeMC->GetPdgCode())==11 && TMath::Abs(positiveMC->GetPdgCode())==11){ // Electrons ...
1169 if( virtualGammaMotherMC->GetPdgCode() != 22 ){
1170 virtualGammaMotherLabel=virtualGammaMCLabel;
1173 else if(negativeMC->GetUniqueID() == 5 && positiveMC->GetUniqueID() ==5){ // ... From Conversion ...
1175 virtualGammaMotherLabel=virtualGammaMotherMC->GetFirstMother();
1176 virtualGamma = 0; //no virtual gamma
1183 if(gammaMotherLabel>=0 && ( gammaMotherLabel == virtualGammaMotherLabel) ){
1185 if(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetPdgCode() == 111){
1189 if(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetPdgCode() == 221){
1195 if(isTruePi0 || isTrueEta ){ // True Pion or Eta
1196 if ( virtualGamma == 1 ) { //True Dalitz
1197 hESDTrueMotherInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
1198 if(gammaMotherLabel <= MCStack->GetNprimary()){ // Only primary pi0 for efficiency calculation
1199 hESDTruePrimaryMotherInvMassMCPt[fiCut]->Fill(Pi0Candidate->M(),((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->Pt());
1200 if(isTruePi0){ // Only primaries for unfolding
1201 hESDTruePrimaryPi0DalitzESDPtMCPt[fiCut]->Fill(Pi0Candidate->Pt(),((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->Pt());
1204 if(gammaMotherLabel > MCStack->GetNprimary()){ // Secondary Meson
1205 hESDTrueSecondaryMotherInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
1206 //if (((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetMother(0) >-1){
1207 // if(MCStack->Particle(((TParticle*)MCStack->Particle(virtualGammaMotherLabel))->GetMother(0))->GetPdgCode()==kK0Short){
1208 // hESDTrueSecondaryMotherFromK0sInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
1212 else if ( virtualGamma == 0 ){
1213 hESDTrueMotherPi0GGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt()); // Pi0 from GG
1217 if(!isTruePi0 && !isTrueEta){ // Background
1218 if(gammaMotherLabel>-1 && virtualGammaMotherLabel>-1 && virtualGamma == 0){ // Both Tracks are Photons and have a mother but not Pi0 or Eta
1219 hESDTrueBckGGInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
1220 } else { // No photon or without mother
1221 hESDTrueBckContInvMassPt[fiCut]->Fill(Pi0Candidate->M(),Pi0Candidate->Pt());
1226 //________________________________________________________________________
1227 void AliAnalysisTaskGammaConvDalitzV1::MoveParticleAccordingToVertex(AliAODConversionPhoton* particle,const AliGammaConversionAODBGHandler::GammaConversionVertex *vertex){
1228 //see header file for documentation
1230 Double_t dx = vertex->fX - fESDEvent->GetPrimaryVertex()->GetX();
1231 Double_t dy = vertex->fY - fESDEvent->GetPrimaryVertex()->GetY();
1232 Double_t dz = vertex->fZ - fESDEvent->GetPrimaryVertex()->GetZ();
1234 Double_t movedPlace[3] = {particle->GetConversionX() - dx,particle->GetConversionY() - dy,particle->GetConversionZ() - dz};
1235 particle->SetConversionPoint(movedPlace);
1239 //________________________________________________________________________
1240 void AliAnalysisTaskGammaConvDalitzV1::CountESDTracks(){
1242 AliESDtrackCuts *EsdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
1243 // Using standard function for setting Cuts
1244 Bool_t selectPrimaries=kTRUE;
1245 EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
1246 EsdTrackCuts->SetMaxDCAToVertexZ(2);
1247 EsdTrackCuts->SetEtaRange(-0.8, 0.8);
1248 EsdTrackCuts->SetPtRange(0.15);
1250 fNumberOfESDTracks = 0;
1251 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
1252 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
1253 if(!curTrack) continue;
1254 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
1256 delete EsdTrackCuts;
1262 //_____________________________________________________________________________
1263 void AliAnalysisTaskGammaConvDalitzV1::ProcessMCParticles()
1267 // Loop over all primary MC particle
1268 for(Int_t i = 0; i < fMCStack->GetNprimary(); i++) {
1269 TParticle* particle = (TParticle *)fMCStack->Particle(i);
1270 if (!particle) continue;
1274 if(((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelectedMC(particle,fMCStack)){
1276 if(particle->GetPdgCode() == 111)hMCPi0GGPt[fiCut]->Fill( particle->Pt() ); // All MC Pi0 GG decay
1277 if(particle->GetPdgCode() == 221)hMCEtaGGPt[fiCut]->Fill( particle->Pt() ); // All MC Eta GG decay
1280 if(((AliConversionMesonCuts*)fCutMesonArray->At(fiCut))->MesonIsSelectedMCDalitz(particle,fMCStack)){
1281 if(particle->GetPdgCode() == 111)hMCPi0Pt[fiCut]->Fill(particle->Pt()); // All MC Pi0
1282 if(particle->GetPdgCode() == 221)hMCEtaPt[fiCut]->Fill(particle->Pt()); // All MC Eta
1283 // Check the acceptance for both gammas
1284 if(particle->GetNDaughters() == 3){
1285 TParticle* gamma = 0;
1286 TParticle* electron = 0;
1287 TParticle* positron = 0;
1290 for(Int_t index=particle->GetFirstDaughter(); index<= particle->GetLastDaughter();index++){
1293 TParticle* temp = (TParticle*)fMCStack->Particle( index );
1295 switch( temp->GetPdgCode() ) {
1307 if( gamma && electron && positron ) {
1309 if(((AliConversionCuts*)fCutGammaArray->At(fiCut))->PhotonIsSelectedMC(gamma,fMCStack,kFALSE) &&
1310 TMath::Abs( electron->Eta() ) < ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetEtaCut() &&
1311 TMath::Abs( positron->Eta() ) < ((AliDalitzElectronCuts*)fCutElectronArray->At(fiCut))->GetEtaCut() ){
1312 if(particle->GetPdgCode() == 111)hMCPi0InAccPt[fiCut]->Fill(particle->Pt()); // MC Pi0Dalitz with gamma and e+e- in acc
1313 if(particle->GetPdgCode() == 221)hMCEtaInAccPt[fiCut]->Fill(particle->Pt()); // MC EtaDalitz with gamma and e+e- in acc
1320 //_____________________________________________________________________________
1321 Double_t AliAnalysisTaskGammaConvDalitzV1::GetPsiPair( const AliESDtrack *trackPos, const AliESDtrack *trackNeg ) const
1324 // This angle is a measure for the contribution of the opening in polar
1325 // direction Δ0 to the opening angle ξ Pair
1327 // Ref. Measurement of photons via conversion pairs with the PHENIX experiment at RHIC
1328 // Master Thesis. Thorsten Dahms. 2005
1329 // https://twiki.cern.ch/twiki/pub/ALICE/GammaPhysicsPublications/tdahms_thesis.pdf
1333 if( trackPos->GetConstrainedPxPyPz(momPos) == 0 ) trackPos->GetPxPyPz( momPos );
1334 if( trackNeg->GetConstrainedPxPyPz(momNeg) == 0 ) trackNeg->GetPxPyPz( momNeg );
1336 TVector3 posDaughter;
1337 TVector3 negDaughter;
1339 posDaughter.SetXYZ( momPos[0], momPos[1], momPos[2] );
1340 negDaughter.SetXYZ( momNeg[0], momNeg[1], momNeg[2] );
1342 Double_t deltaTheta = negDaughter.Theta() - posDaughter.Theta();
1343 Double_t openingAngle = posDaughter.Angle( negDaughter ); //TMath::ACos( posDaughter.Dot(negDaughter)/(negDaughter.Mag()*posDaughter.Mag()) );
1345 if( openingAngle < 1e-20 ) return 0.;
1347 Double_t psiAngle = TMath::ASin( deltaTheta/openingAngle );