1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Svein Lindal, Daniel Lohner *
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 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // QA Task for V0 Reader V1
19 //---------------------------------------------
20 ////////////////////////////////////////////////
22 #include "AliAnalysisTaskConversionQA.h"
24 #include "AliAnalysisManager.h"
25 #include "TParticle.h"
27 #include "AliPIDResponse.h"
29 #include "AliESDtrackCuts.h"
30 #include "AliAODMCParticle.h"
31 #include "AliAODMCHeader.h"
38 ClassImp(AliAnalysisTaskConversionQA)
40 //________________________________________________________________________
41 AliAnalysisTaskConversionQA::AliAnalysisTaskConversionQA() : AliAnalysisTaskSE(),
43 fConversionGammas(NULL),
44 fConversionCuts(NULL),
46 fNumberOfESDTracks(0),
52 ffillHistograms(kFALSE),
57 hNGoodESDTracks(NULL),
59 hNContributorsVertex(NULL),
64 hGammaChi2perNDF(NULL),
66 hGammaArmenteros(NULL),
67 hGammaCosinePointingAngle(NULL),
72 hElecNfindableClsTPC(NULL),
73 hPosiNfindableClsTPC(NULL),
77 hElectronITSdEdxP(NULL),
79 hElectronNSigmadEdxP(NULL),
80 hElectronNSigmadEdxEta(NULL),
81 hElectronNSigmaPiondEdxP(NULL),
82 hElectronNSigmaITSP(NULL),
83 hElectronNSigmaTOFP(NULL),
85 hPositronITSdEdxP(NULL),
87 hPositronNSigmadEdxP(NULL),
88 hPositronNSigmadEdxEta(NULL),
89 hPositronNSigmaPiondEdxP(NULL),
90 hPositronNSigmaITSP(NULL),
91 hPositronNSigmaTOFP(NULL),
94 // hTrueResolutionR(NULL),
95 // hTrueResolutionZ(NULL),
96 // hTrueResolutionPhi(NULL),
97 // hTrueGammaPt(NULL),
98 // hTrueGammaPhi(NULL),
99 // hTrueGammaEta(NULL),
100 // hTrueGammaMass(NULL),
101 // hTrueGammaChi2perNDF(NULL),
102 // hTrueGammaPsiPair(NULL),
103 // hTrueGammaQt(NULL),
104 // hTrueGammaCosinePointingAngle(NULL),
105 // hTrueGammaXY(NULL),
106 // hTrueGammaZR(NULL),
107 // hTrueElecPt(NULL),
108 // hTrueElecEta(NULL),
109 // hTrueElecPhi(NULL),
110 // hTrueElecNfindableClsTPC(NULL),
111 // hTruePosiNfindableClsTPC(NULL),
112 // hTrueElecAsymP(NULL),
121 fnGammaCandidates(1),
128 AliAnalysisTaskConversionQA::AliAnalysisTaskConversionQA(const char *name) : AliAnalysisTaskSE(name),
130 fConversionGammas(NULL),
131 fConversionCuts(NULL),
133 fNumberOfESDTracks(0),
139 ffillHistograms(kFALSE),
144 hNGoodESDTracks(NULL),
146 hNContributorsVertex(NULL),
147 hITSClusterPhi(NULL),
151 hGammaChi2perNDF(NULL),
153 hGammaArmenteros(NULL),
154 hGammaCosinePointingAngle(NULL),
159 hElecNfindableClsTPC(NULL),
160 hPosiNfindableClsTPC(NULL),
163 hElectrondEdxP(NULL),
164 hElectronITSdEdxP(NULL),
166 hElectronNSigmadEdxP(NULL),
167 hElectronNSigmadEdxEta(NULL),
168 hElectronNSigmaPiondEdxP(NULL),
169 hElectronNSigmaITSP(NULL),
170 hElectronNSigmaTOFP(NULL),
171 hPositrondEdxP(NULL),
172 hPositronITSdEdxP(NULL),
174 hPositronNSigmadEdxP(NULL),
175 hPositronNSigmadEdxEta(NULL),
176 hPositronNSigmaPiondEdxP(NULL),
177 hPositronNSigmaITSP(NULL),
178 hPositronNSigmaTOFP(NULL),
183 // hTrueResolutionR(NULL),
184 // hTrueResolutionZ(NULL),
185 // hTrueResolutionPhi(NULL),
186 // hTrueGammaPt(NULL),
187 // hTrueGammaPhi(NULL),
188 // hTrueGammaEta(NULL),
189 // hTrueGammaMass(NULL),
190 // hTrueGammaChi2perNDF(NULL),
191 // hTrueGammaPsiPair(NULL),
192 // hTrueGammaQt(NULL),
193 // hTrueGammaCosinePointingAngle(NULL),
194 // hTrueGammaXY(NULL),
195 // hTrueGammaZR(NULL),
196 // hTrueElecPt(NULL),
197 // hTrueElecEta(NULL),
198 // hTrueElecPhi(NULL),
199 // hTrueElecNfindableClsTPC(NULL),
200 // hTruePosiNfindableClsTPC(NULL),
201 // hTrueElecAsymP(NULL),
210 fnGammaCandidates(1),
214 // Default constructor
216 DefineInput(0, TChain::Class());
217 DefineOutput(1, TList::Class());
220 //________________________________________________________________________
221 AliAnalysisTaskConversionQA::~AliAnalysisTaskConversionQA()
223 // default deconstructor
226 //________________________________________________________________________
227 void AliAnalysisTaskConversionQA::UserCreateOutputObjects()
229 // Create User Output Objects
231 if(fOutputList != NULL){
235 if(fOutputList == NULL){
236 fOutputList = new TList();
237 fOutputList->SetOwner(kTRUE);
242 fESDList = new TList();
243 fESDList->SetOwner(kTRUE);
244 fESDList->SetName("ESD QA");
245 fOutputList->Add(fESDList);
247 hVertexZ = new TH1F("Vertex_Z","Vertex_Z",300,-15,15);
248 fESDList->Add(hVertexZ);
249 hNContributorsVertex = new TH1I("ContrVertex_Z","ContrVertex_Z",3000,0,3000);
250 fESDList->Add(hNContributorsVertex);
251 if(fIsHeavyIon) hNGoodESDTracks = new TH1I("GoodESDTracks","GoodESDTracks",4000,0,4000);
252 else hNGoodESDTracks = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
253 fESDList->Add(hNGoodESDTracks);
254 if(fIsHeavyIon) hNV0Tracks = new TH1I("V0 Multiplicity","V0 Multiplicity",30000,0,30000);
255 else hNV0Tracks = new TH1I("V0 Multiplicity","V0 Multiplicity",2000,0,2000);
256 fESDList->Add(hNV0Tracks);
258 hITSClusterPhi = new TH2F("ITSClusterPhi","hITSClusterPhi",72,0,2*TMath::Pi(),7,0,7);
259 fESDList->Add(hITSClusterPhi);
260 hGammaPt = new TH1F("Gamma_Pt","Gamma_Pt",250,0,25);
261 fESDList->Add(hGammaPt);
262 hGammaPhi = new TH1F("Gamma_Phi","Gamma_Phi",360,0,2*TMath::Pi());
263 fESDList->Add(hGammaPhi);
264 hGammaEta = new TH1F("Gamma_Eta","Gamma_Eta",600,-1.5,1.5);
265 fESDList->Add(hGammaEta);
266 hGammaChi2perNDF = new TH1F("Gamma_Chi2perNDF","Gamma_Chi2perNDF",500,0,100);
267 fESDList->Add(hGammaChi2perNDF);
268 hGammaPsiPair = new TH1F("Gamma_PsiPair","Gamma_PsiPair",500,0,2);
269 fESDList->Add(hGammaPsiPair);
270 hGammaArmenteros = new TH2F("Gamma_Armenteros","Gamma_Armenteros",200,-1,1,400,0,0.1);
271 fESDList->Add(hGammaArmenteros);
272 hGammaCosinePointingAngle = new TH1F("Gamma_CosinePointingAngle","Gamma_CosinePointingAngle",1000,-1.,1.);
273 fESDList->Add(hGammaCosinePointingAngle);
274 hGammaInvMass = new TH1F( "Gamma_InvMass","",200, 0, 0.2);
275 fESDList->Add(hGammaInvMass);
276 hElecPt = new TH2F("Electron_Positron_Pt","Electron_Positron_Pt",250,0,25,250,0,25);
277 fESDList->Add(hElecPt);
278 hElecEta = new TH2F("Electron_Positron_Eta","Electron_Positron_Eta",600,-1.5,1.5,600,-1.5,1.5);
279 fESDList->Add(hElecEta);
280 hElecPhi = new TH2F("Electron_Positron_Phi","Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
281 fESDList->Add(hElecPhi);
282 hElecClsTPC = new TH1F("Electron_ClusterTPC","Electron_ClusterTPC",200,0,200);
283 fESDList->Add(hElecClsTPC);
284 hPosiClsTPC = new TH1F("Positron_ClusterTPC","Positron_ClusterTPC",200,0,200);
285 fESDList->Add(hPosiClsTPC);
287 hElecNfindableClsTPC = new TH1F("Electron_findableClusterTPC","Electron_findableClusterTPC",100,0,1);
288 fESDList->Add(hElecNfindableClsTPC);
289 hPosiNfindableClsTPC = new TH1F("Positron_findableClusterTPC","Positron_findableClusterTPC",100,0,1);
290 fESDList->Add(hPosiNfindableClsTPC);
292 hElectrondEdxP = new TH2F("Electron_dEdx_P","Electron_dEdx_P",100, 0.05, 20, 200, 0, 200);
293 SetLogBinningXTH2(hElectrondEdxP);
294 fESDList->Add(hElectrondEdxP);
295 hPositrondEdxP = new TH2F("Positron_dEdx_P","Positron_dEdx_P",100, 0.05, 20, 200, 0, 200);
296 SetLogBinningXTH2(hPositrondEdxP);
297 fESDList->Add(hPositrondEdxP);
298 hElectronNSigmadEdxP = new TH2F("Electron_NSigmadEdx_P","Electron_NSigmadEdx_P",100, 0.05, 20, 200, -10, 10);
299 SetLogBinningXTH2(hElectronNSigmadEdxP);
300 fESDList->Add(hElectronNSigmadEdxP);
301 hElectronNSigmadEdxEta = new TH2F("Electron_NSigmadEdx_Eta","Electron_NSigmadEdx_Eta",140, -1.4, 1.4, 200, -10, 10);
302 fESDList->Add(hElectronNSigmadEdxEta);
303 hPositronNSigmadEdxP = new TH2F("Positron_NSigmadEdx_P","Positron_NSigmadEdx_P",100, 0.05, 20, 200, -10, 10);
304 SetLogBinningXTH2(hPositronNSigmadEdxP);
305 fESDList->Add(hPositronNSigmadEdxP);
306 hPositronNSigmadEdxEta = new TH2F("Positron_NSigmadEdx_Eta","Positron_NSigmadEdx_Eta",140, -1.4, 1.4, 200, -10, 10);
307 fESDList->Add(hPositronNSigmadEdxEta);
308 hElectronNSigmaPiondEdxP = new TH2F("Electron_NSigmaPiondEdx_P","Electron_NSigmaPiondEdx_P",100, 0.05, 20, 200, -10, 10);
309 SetLogBinningXTH2(hElectronNSigmaPiondEdxP);
310 fESDList->Add(hElectronNSigmaPiondEdxP);
311 hPositronNSigmaPiondEdxP = new TH2F("Positron_NSigmaPiondEdx_P","Positron_NSigmaPiondEdx_P",100, 0.05, 20, 200, -10, 10);
312 SetLogBinningXTH2(hPositronNSigmaPiondEdxP);
313 fESDList->Add(hPositronNSigmaPiondEdxP);
315 hElectronTOFP = new TH2F("Electron_TOF_P","Electron_TOF_P",100, 0.05, 20, 600, -1000, 29000);
316 SetLogBinningXTH2(hElectronTOFP);
317 fESDList->Add(hElectronTOFP);
318 hPositronTOFP = new TH2F("Positron_TOF_P","Positron_TOF_P",100, 0.05, 20, 600, -1000, 29000);
319 SetLogBinningXTH2(hPositronTOFP);
320 fESDList->Add(hPositronTOFP);
321 hElectronNSigmaTOFP = new TH2F("Electron_NSigmaTOF_P","Electron_NSigmaTOF_P",100, 0.05, 20, 200, -10, 10);
322 SetLogBinningXTH2(hElectronNSigmaTOFP);
323 fESDList->Add(hElectronNSigmaTOFP);
324 hPositronNSigmaTOFP = new TH2F("Positron_NSigmaTOF_P","Positron_NSigmaTOF_P",100, 0.05, 20, 200, -10, 10);
325 SetLogBinningXTH2(hPositronNSigmaTOFP);
326 fESDList->Add(hPositronNSigmaTOFP);
328 hElectronITSdEdxP = new TH2F("Electron_ITSdEdx_P","Electron_ITSdEdx_P",100, 0.05, 20, 200, 0, 200);
329 SetLogBinningXTH2(hElectronITSdEdxP);
330 fESDList->Add(hElectronITSdEdxP);
331 hPositronITSdEdxP = new TH2F("Positron_ITSdEdx_P","Positron_ITSdEdx_P",100, 0.05, 20, 200, 0, 200);
332 SetLogBinningXTH2(hPositronITSdEdxP);
333 fESDList->Add(hPositronITSdEdxP);
334 hElectronNSigmaITSP = new TH2F("Electron_NSigmaITS_P","Electron_NSigmaITS_P",100, 0.05, 20, 200, -10, 10);
335 SetLogBinningXTH2(hElectronNSigmaITSP);
336 fESDList->Add(hElectronNSigmaITSP);
337 hPositronNSigmaITSP = new TH2F("Positron_NSigmaITS_P","Positron_NSigmaITS_P",100, 0.05, 20, 200, -10, 10);
338 SetLogBinningXTH2(hPositronNSigmaITSP);
339 fESDList->Add(hPositronNSigmaITSP);
343 // hGammaXY = new TH2F("Gamma_ConversionPoint_XY","Gamma_ConversionPoint_XY",960,-120,120,960,-120,120);
344 // fESDList->Add(hGammaXY);
345 // hGammaZR= new TH2F("Gamma_ConversionPoint_ZR","Gamma_ConversionPoint_ZR",1200,-150,150,480,0,120);
346 // fESDList->Add(hGammaZR);
349 // hElecAsymP = new TH2F("Electron_Asym_vs_P", "Electron_Asym_vs_P",200,0.,20.,200,0.,1.);
350 // fESDList->Add(hElecAsymP);
353 // fTrueList = new TList();
354 // fTrueList->SetOwner(kTRUE);
355 // fTrueList->SetName("True QA");
356 // fOutputList->Add(fTrueList);
358 // hTrueResolutionR = new TH2F("True_ConversionPointResolution_R","True_ConversionPointResolution_R",240,0,120,200,-20,20);
359 // fTrueList->Add(hTrueResolutionR);
360 // hTrueResolutionZ = new TH2F("True_ConversionPointResolution_Z","True_ConversionPointResolution_Z",480,-120,120,200,-20,20);
361 // fTrueList->Add(hTrueResolutionZ);
362 // hTrueResolutionPhi = new TH2F("True_ConversionPointResolution_Phi","True_ConversionPointResolution_Phi",360,0,2*TMath::Pi(),200,-TMath::Pi()/30., TMath::Pi()/30.);
363 // fTrueList->Add(hTrueResolutionPhi);
365 // hTrueGammaPt = new TH1F("True_Gamma_Pt","True_Gamma_Pt",250,0,25);
366 // fTrueList->Add(hTrueGammaPt);
367 // hTrueGammaPhi = new TH1F("True_Gamma_Phi","True_Gamma_Phi",360,0,2*TMath::Pi());
368 // fTrueList->Add(hTrueGammaPhi);
369 // hTrueGammaEta = new TH1F("True_Gamma_Eta","True_Gamma_Eta",600,-1.5,1.5);
370 // fTrueList->Add(hTrueGammaEta);
371 // hTrueGammaMass = new TH1F("True_Gamma_Mass","True_Gamma_Mass",1000,0,0.3);
372 // fTrueList->Add(hTrueGammaMass);
373 // hTrueGammaChi2perNDF = new TH1F("True_Gamma_Chi2perNDF","True_Gamma_Chi2perNDF",500,0,100);
374 // fTrueList->Add(hTrueGammaChi2perNDF);
375 // hTrueGammaPsiPair = new TH1F("True_Gamma_PsiPair","True_Gamma_PsiPair",500,0,2);
376 // fTrueList->Add(hTrueGammaPsiPair);
377 // hTrueGammaQt = new TH1F("True_Gamma_Qt","True_Gamma_Qt",400,0,0.1);
378 // fTrueList->Add(hTrueGammaQt);
379 // hTrueGammaCosinePointingAngle = new TH1F("True_Gamma_CosinePointingAngle","True_Gamma_CosinePointingAngle",900,0.7,1.);
380 // fTrueList->Add(hTrueGammaCosinePointingAngle);
381 // hTrueGammaXY = new TH2F("True_Gamma_ConversionPoint_XY","True_Gamma_ConversionPoint_XY",960,-120,120,960,-120,120);
382 // fTrueList->Add(hTrueGammaXY);
383 // hTrueGammaZR= new TH2F("TrueGamma_ConversionPoint_ZR","TrueGamma_ConversionPoint_ZR",1200,-150,150,480,0,120);
384 // fTrueList->Add(hTrueGammaZR);
386 // hTrueElecPt = new TH2F("True_Electron_Positron_Pt","True_Electron_Positron_Pt",250,0,25,250,0,25);
387 // fTrueList->Add(hTrueElecPt);
388 // hTrueElecEta = new TH2F("True_Electron_Positron_Eta","True_Electron_Positron_Eta",600,-1.5,1.5,600,-1.5,1.5);
389 // fTrueList->Add(hTrueElecEta);
390 // hTrueElecPhi = new TH2F("True_Electron_Positron_Phi","True_Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
391 // fTrueList->Add(hTrueElecPhi);
392 // hTrueElecNfindableClsTPC = new TH1F("True_Electron_findableClusterTPC","True_Electron_findableClusterTPC",100,0,1);
393 // fTrueList->Add(hTrueElecNfindableClsTPC);
394 // hTruePosiNfindableClsTPC = new TH1F("True_Positron_findableClusterTPC","True_Positron_findableClusterTPC",100,0,1);
395 // fTrueList->Add(hTruePosiNfindableClsTPC);
396 // hTrueElecAsymP = new TH2F("True_Electron_Asym_vs_P", "True_Electron_Asym_vs_P",200,0.,20.,200,0.,1.);
397 // fTrueList->Add(hTrueElecAsymP);
399 if(fConversionCuts->GetCutHistograms()){
400 fOutputList->Add(fConversionCuts->GetCutHistograms());
405 fTreeList = new TList();
406 fTreeList->SetOwner(kTRUE);
407 fTreeList->SetName("TreeList");
408 fOutputList->Add(fTreeList);
410 fTreeQA = new TTree("PhotonQA","PhotonQA");
412 fTreeQA->Branch("daughterProp",&fDaughterProp);
413 fTreeQA->Branch("recCords",&fGammaConvCoord);
414 fTreeQA->Branch("photonProp",&fGammaPhotonProp);
415 fTreeQA->Branch("pt",&fGammaPt,"fGammaPt/F");
416 fTreeQA->Branch("theta",&fGammaTheta,"fGammaTheta/F");
417 fTreeQA->Branch("chi2ndf",&fGammaChi2NDF,"fGammaChi2NDF/F");
419 fTreeQA->Branch("kind",&fKind,"fKind/b");
421 fTreeList->Add(fTreeQA);
425 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
427 PostData(1, fOutputList);
429 //_____________________________________________________________________________
430 Bool_t AliAnalysisTaskConversionQA::Notify()
432 if(!fConversionCuts->GetDoEtaShift()) return kTRUE;; // No Eta Shift requested, continue
434 if(fConversionCuts->GetEtaShift() == 0.0){ // Eta Shift requested but not set, get shift automatically
435 fConversionCuts->GetCorrectEtaShiftFromPeriod(fV0Reader->GetPeriodName());
436 fConversionCuts->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
440 printf(" Gamma Conversion QA Task %s :: Eta Shift Manually Set to %f \n\n",
441 (fConversionCuts->GetCutNumber()).Data(),fConversionCuts->GetEtaShift());
442 fConversionCuts->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
447 //________________________________________________________________________
448 void AliAnalysisTaskConversionQA::UserExec(Option_t *){
452 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
453 if(eventQuality != 0){// Event Not Accepted
456 fInputEvent = InputEvent();
457 if(fIsMC) fMCEvent = MCEvent();
458 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){ fMCStack = fMCEvent->Stack(); }
460 Int_t eventNotAccepted =
461 fConversionCuts->IsEventAcceptedByConversionCut(fV0Reader->GetConversionCuts(),fInputEvent,fMCEvent,fIsHeavyIon);
462 if(eventNotAccepted) return; // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
464 fConversionGammas=fV0Reader->GetReconstructedGammas();
467 if(fConversionCuts->GetSignalRejection() != 0){
468 if(fInputEvent->IsA()==AliESDEvent::Class()){
469 fConversionCuts->GetNotRejectedParticles(fConversionCuts->GetSignalRejection(),
470 fConversionCuts->GetAcceptedHeader(),
473 else if(fInputEvent->IsA()==AliAODEvent::Class()){
474 fConversionCuts->GetNotRejectedParticles(fConversionCuts->GetSignalRejection(),
475 fConversionCuts->GetAcceptedHeader(),
483 hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
484 hNContributorsVertex->Fill(fConversionCuts->GetNumberOfContributorsVtx(fInputEvent));
485 hNGoodESDTracks->Fill(fNumberOfESDTracks);
486 hNV0Tracks->Fill(fInputEvent->GetVZEROData()->GetMTotV0A()+fInputEvent->GetVZEROData()->GetMTotV0C());
489 if(fMCEvent && fInputEvent->IsA()==AliAODEvent::Class())
490 RelabelAODPhotonCandidates(kTRUE); // In case of AODMC relabeling MC
492 for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
493 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
494 if (gamma==NULL) continue;
495 if(fMCEvent && fConversionCuts->GetSignalRejection() != 0){
496 if(!fConversionCuts->IsParticleFromBGEvent(gamma->GetMCLabelPositive(), fMCStack, fInputEvent))
498 if(!fConversionCuts->IsParticleFromBGEvent(gamma->GetMCLabelNegative(), fMCStack, fInputEvent))
501 if(!fConversionCuts->PhotonIsSelected(gamma,fInputEvent)){
505 if(ffillTree) ProcessQATree(gamma);
506 if(ffillHistograms) ProcessQA(gamma);
508 if(fMCEvent && fInputEvent->IsA()==AliAODEvent::Class())
509 RelabelAODPhotonCandidates(kFALSE); // In case of AODMC relabeling MC
511 PostData(1, fOutputList);
515 ///________________________________________________________________________
516 void AliAnalysisTaskConversionQA::ProcessQATree(AliAODConversionPhoton *gamma){
518 // Fill Histograms for QA and MC
519 AliVEvent* event = (AliVEvent*) InputEvent();
523 AliPIDResponse* pidResonse = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetPIDResponse();
525 fGammaPt = gamma->GetPhotonPt();
527 fGammaTheta = gamma->Theta();
528 fGammaChi2NDF = gamma->GetChi2perNDF();
530 fGammaPhotonProp(0) = gamma->GetArmenterosQt();
531 fGammaPhotonProp(1) = gamma->GetArmenterosAlpha();
532 fGammaPhotonProp(2) = gamma->GetPsiPair();
533 fGammaPhotonProp(3) = fConversionCuts->GetCosineOfPointingAngle(gamma,event);
534 fGammaPhotonProp(4) = gamma->GetMass();
536 fGammaConvCoord(0) = gamma->GetConversionX();
537 fGammaConvCoord(1) = gamma->GetConversionY();
538 fGammaConvCoord(2) = gamma->GetConversionZ();
539 fGammaConvCoord(3) = gamma->GetConversionRadius();
540 fGammaConvCoord(4) = gamma->GetPhotonPhi();
542 AliVTrack * negTrack = fConversionCuts->GetTrack(event, gamma->GetTrackLabelNegative());
543 AliVTrack * posTrack = fConversionCuts->GetTrack(event, gamma->GetTrackLabelPositive());
546 if(!negTrack||!posTrack)return;
549 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
550 fKind = IsTruePhotonESD(gamma);
551 } else if (fMCEvent && fInputEvent->IsA()==AliAODEvent::Class()){
552 fKind = IsTruePhotonAOD(gamma);
555 fDaughterProp(0) = posTrack->Pt();
556 fDaughterProp(7) = negTrack->Pt();
557 fDaughterProp(1) = posTrack->Theta();
558 fDaughterProp(8) = negTrack->Theta();
559 // Double32_t signalPos[4] = {0,0,0,0};
561 // Char_t nrowsPos[3];
562 // if (posTrack->GetTPCdEdxInfo()) {
563 // posTrack->GetTPCdEdxInfo()->GetTPCSignalRegionInfo(signalPos,nclPos,nrowsPos);
564 // fDaughterProp(2) = signalPos[0];
565 // fDaughterProp(14) = signalPos[1];
566 // fDaughterProp(16) = signalPos[2];
568 // fDaughterProp(2) = posTrack->GetTPCsignal();
569 // fDaughterProp(14) = 0;
570 // fDaughterProp(16) = 0;
572 // Double32_t signalNeg[4] = {0,0,0,0};
574 // Char_t nrowsNeg[3];
575 // if (negTrack->GetTPCdEdxInfo()) {
576 // negTrack->GetTPCdEdxInfo()->GetTPCSignalRegionInfo(signalNeg,nclNeg,nrowsNeg);
577 // fDaughterProp(9) = signalNeg[0];
578 // fDaughterProp(15) = signalNeg[1];
579 // fDaughterProp(17) = signalNeg[2];
581 // fDaughterProp(9) = negTrack->GetTPCsignal();
582 // fDaughterProp(15) = 0;
583 // fDaughterProp(17) = 0;
586 fDaughterProp(2) = posTrack->GetTPCsignal();
587 fDaughterProp(3) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
588 fDaughterProp(22) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kPion);
589 fDaughterProp(9) = negTrack->GetTPCsignal();
590 fDaughterProp(10) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
591 fDaughterProp(23) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kPion);
592 Int_t nPosClusterITS = 0;
593 Int_t nNegClusterITS = 0;
594 for(Int_t itsLayer = 0; itsLayer<6;itsLayer++){
595 if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
598 if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
604 fDaughterProp(14) = (Float_t)nPosClusterITS;
605 fDaughterProp(15) = (Float_t)nNegClusterITS;
606 if (nPosClusterITS > 0 ){
607 fDaughterProp(16) = posTrack->GetITSsignal();
608 fDaughterProp(20) = pidResonse->NumberOfSigmasITS(posTrack,AliPID::kElectron);
610 fDaughterProp(16) = 1000;
611 fDaughterProp(20) = 20;
613 if (nNegClusterITS > 0 ){
614 fDaughterProp(17) = negTrack->GetITSsignal();
615 fDaughterProp(21) = pidResonse->NumberOfSigmasITS(negTrack,AliPID::kElectron);
617 fDaughterProp(17) = 1000;
618 fDaughterProp(21) = 20;
622 if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
623 Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
624 Double_t timesPos[9];
625 posTrack->GetIntegratedTimes(timesPos);
626 Double_t TOFsignalPos = posTrack->GetTOFsignal();
627 Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
628 fDaughterProp(4) = dTpos;
629 fDaughterProp(5) = pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron);
631 fDaughterProp(4) = 20000;
632 fDaughterProp(5) = -20;
634 if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
635 Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
636 Double_t timesNeg[9];
637 negTrack->GetIntegratedTimes(timesNeg);
638 Double_t TOFsignalNeg = negTrack->GetTOFsignal();
639 Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
640 fDaughterProp(11) = dTneg;
641 fDaughterProp(12) = pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron);
643 fDaughterProp(11) = 20000;
644 fDaughterProp(12) = -20;
647 fDaughterProp(6) = (Float_t)posTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius()));
648 fDaughterProp(18) = posTrack->GetNcls(1);
649 fDaughterProp(13) = (Float_t)negTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius()));
650 fDaughterProp(19) = negTrack->GetNcls(1);
657 //_____________________________________________________________________________________________________
658 void AliAnalysisTaskConversionQA::ProcessQA(AliAODConversionPhoton *gamma){
660 AliPIDResponse* pidResonse = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetPIDResponse();
662 // Fill Histograms for QA and MC
664 hGammaPt->Fill(gamma->GetPhotonPt());
665 hGammaPhi->Fill(gamma->GetPhotonPhi());
666 hGammaEta->Fill(gamma->Eta());
667 hGammaChi2perNDF->Fill(gamma->GetChi2perNDF());
668 hGammaPsiPair->Fill(gamma->GetPsiPair());
669 hGammaArmenteros->Fill(gamma->GetArmenterosAlpha(),gamma->GetArmenterosQt());
670 hGammaCosinePointingAngle->Fill(fConversionCuts->GetCosineOfPointingAngle(gamma,fInputEvent));
671 hGammaInvMass->Fill(gamma->GetMass());
672 // hGammaXY->Fill(gamma->GetConversionX(),gamma->GetConversionY());
673 // hGammaZR->Fill(gamma->GetConversionZ(),gamma->GetConversionRadius());
675 AliVTrack * negTrack = fConversionCuts->GetTrack(fInputEvent, gamma->GetTrackLabelNegative());
676 AliVTrack * posTrack = fConversionCuts->GetTrack(fInputEvent, gamma->GetTrackLabelPositive());
677 if(!negTrack||!posTrack)return;
680 hElecPt->Fill(negTrack->Pt(),posTrack->Pt());
681 hElecEta->Fill(negTrack->Eta(),posTrack->Eta());
682 hElecPhi->Fill(negTrack->Phi(),posTrack->Phi());
684 hElecNfindableClsTPC->Fill((Float_t)posTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius())));
685 hPosiNfindableClsTPC->Fill((Float_t)negTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius())));
686 hElecClsTPC->Fill(negTrack->GetNcls(1));
687 hPosiClsTPC->Fill(posTrack->GetNcls(1));
689 hElectrondEdxP->Fill(negTrack->P() ,negTrack->GetTPCsignal());
690 hElectronNSigmadEdxP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kElectron));
691 hElectronNSigmadEdxEta->Fill(negTrack->Eta() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kElectron));
692 hElectronNSigmaPiondEdxP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kPion));
693 hPositrondEdxP->Fill(posTrack->P() ,posTrack->GetTPCsignal());
694 hPositronNSigmadEdxP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kElectron));
695 hPositronNSigmadEdxEta->Fill(posTrack->Eta() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kElectron));
696 hPositronNSigmaPiondEdxP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kPion));
699 if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
700 Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
701 Double_t timesNeg[9];
702 negTrack->GetIntegratedTimes(timesNeg);
703 Double_t TOFsignalNeg = negTrack->GetTOFsignal();
704 Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
705 hElectronTOFP->Fill(negTrack->P() ,dTneg);
706 hElectronNSigmaTOFP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron));
708 if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
709 Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
710 Double_t timesPos[9];
711 posTrack->GetIntegratedTimes(timesPos);
712 Double_t TOFsignalPos = posTrack->GetTOFsignal();
713 Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
714 hPositronTOFP->Fill(posTrack->P() ,dTpos);
715 hPositronNSigmaTOFP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron));
718 Int_t nPosClusterITS = 0;
719 Int_t nNegClusterITS = 0;
720 for(Int_t itsLayer = 0; itsLayer<6;itsLayer++){
721 if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
724 if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
728 Double_t negtrackPhi = negTrack->Phi();
729 Double_t postrackPhi = posTrack->Phi();
730 hITSClusterPhi->Fill(negtrackPhi,nNegClusterITS);
731 hITSClusterPhi->Fill(postrackPhi,nPosClusterITS);
734 if (nPosClusterITS > 0 ){
735 hPositronITSdEdxP->Fill(posTrack->P() ,posTrack->GetITSsignal());
736 hPositronNSigmaITSP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasITS(posTrack,AliPID::kElectron));
738 if (nNegClusterITS > 0 ){
739 hElectronITSdEdxP->Fill(negTrack->P() ,negTrack->GetITSsignal());
740 hElectronNSigmaITSP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasITS(negTrack,AliPID::kElectron));
744 // if(gamma->P()!=0){
745 // hElecAsymP->Fill(gamma->P(),negTrack->P()/gamma->P());
747 // hElecNfindableClsTPC->Fill((Float_t)negTrack->GetNcls(1)/(Float_t)negTrack->GetTPCNclsF());
748 // hPosiNfindableClsTPC->Fill((Float_t)posTrack->GetNcls(1)/(Float_t)posTrack->GetTPCNclsF());
749 // if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
750 // ProcessTrueQAESD(gamma,(AliESDtrack*)negTrack,(AliESDtrack*)posTrack);
751 // } else if(fMCEvent && fInputEvent->IsA()==AliAODEvent::Class()){
752 // ProcessTrueQAAOD(gamma,(AliAODTrack*)negTrack,(AliAODTrack*)posTrack);
756 // //________________________________________________________________________
757 // void AliAnalysisTaskConversionQA::ProcessTrueQAESD(AliAODConversionPhoton *TruePhotonCandidate, AliESDtrack *elec, AliESDtrack *posi)
760 // if(IsTruePhotonESD(TruePhotonCandidate)!=0 && IsTruePhotonESD(TruePhotonCandidate)!=5 ) return;
762 // TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(fMCStack);
763 // TParticle *mcPhoton = TruePhotonCandidate->GetMCParticle(fMCStack);
765 // hTrueResolutionR->Fill(TruePhotonCandidate->GetConversionRadius(),
766 // TruePhotonCandidate->GetConversionRadius()-negDaughter->R());
767 // hTrueResolutionZ->Fill(TruePhotonCandidate->GetConversionZ(),
768 // TruePhotonCandidate->GetConversionZ()-negDaughter->Vz());
769 // hTrueResolutionPhi->Fill(TruePhotonCandidate->Phi(),
770 // TruePhotonCandidate->Phi()-mcPhoton->Phi());
771 // hTrueGammaPt->Fill(TruePhotonCandidate->Pt());
772 // hTrueGammaPhi->Fill(TruePhotonCandidate->Phi());
773 // hTrueGammaEta->Fill(TruePhotonCandidate->Eta());
774 // hTrueGammaMass->Fill(TruePhotonCandidate->GetMass());
775 // hTrueGammaChi2perNDF->Fill(TruePhotonCandidate->GetChi2perNDF());
776 // hTrueGammaPsiPair->Fill(TruePhotonCandidate->GetPsiPair());
777 // hTrueGammaQt->Fill(TruePhotonCandidate->GetArmenterosQt());
778 // hTrueGammaCosinePointingAngle->Fill(fConversionCuts->GetCosineOfPointingAngle(TruePhotonCandidate,fInputEvent));
779 // hTrueGammaXY->Fill(TruePhotonCandidate->GetConversionX(),TruePhotonCandidate->GetConversionY());
780 // hTrueGammaZR->Fill(TruePhotonCandidate->GetConversionZ(),TruePhotonCandidate->GetConversionRadius());
781 // hTrueElecPt->Fill(elec->Pt(),posi->Pt());
782 // hTrueElecEta->Fill(elec->Eta(),posi->Eta());
783 // hTrueElecPhi->Fill(elec->Phi(),posi->Phi());
784 // hTrueElecNfindableClsTPC
785 // ->Fill((Float_t)elec->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(TruePhotonCandidate->GetConversionRadius())));
786 // hTruePosiNfindableClsTPC
787 // ->Fill((Float_t)posi->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(TruePhotonCandidate->GetConversionRadius())));
788 // if(TruePhotonCandidate->P()!=0){
789 // hTrueElecAsymP->Fill(TruePhotonCandidate->P(),elec->P()/TruePhotonCandidate->P());
792 // hTrueElecNfindableClsTPC->Fill((Float_t)elec->GetNcls(1)/(Float_t)elec->GetTPCNclsF());
793 // hTruePosiNfindableClsTPC->Fill((Float_t)posi->GetNcls(1)/(Float_t)posi->GetTPCNclsF());
796 // //________________________________________________________________________
797 // void AliAnalysisTaskConversionQA::ProcessTrueQAAOD(AliAODConversionPhoton *TruePhotonCandidate, AliAODTrack *elec, AliAODTrack *posi)
800 // if(IsTruePhotonAOD(TruePhotonCandidate)!=0 && IsTruePhotonESD(TruePhotonCandidate)!=5 ) return;
802 // TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
803 // AliAODMCParticle *negDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->GetMCLabelNegative());
804 // AliAODMCParticle *mcPhoton = (AliAODMCParticle*) AODMCTrackArray->At(negDaughter->GetMother());
806 // hTrueResolutionR->Fill(TruePhotonCandidate->GetConversionRadius(),
807 // TruePhotonCandidate->GetConversionRadius()-(TMath::Sqrt(negDaughter->Xv()*negDaughter->Xv()+negDaughter->Yv()*negDaughter->Yv())));
808 // hTrueResolutionZ->Fill(TruePhotonCandidate->GetConversionZ(),
809 // TruePhotonCandidate->GetConversionZ()-negDaughter->Zv());
810 // hTrueResolutionPhi->Fill(TruePhotonCandidate->Phi(),
811 // TruePhotonCandidate->Phi()-mcPhoton->Phi());
812 // hTrueGammaPt->Fill(TruePhotonCandidate->Pt());
813 // hTrueGammaPhi->Fill(TruePhotonCandidate->Phi());
814 // hTrueGammaEta->Fill(TruePhotonCandidate->Eta());
815 // hTrueGammaMass->Fill(TruePhotonCandidate->GetMass());
816 // hTrueGammaChi2perNDF->Fill(TruePhotonCandidate->GetChi2perNDF());
817 // hTrueGammaPsiPair->Fill(TruePhotonCandidate->GetPsiPair());
818 // hTrueGammaQt->Fill(TruePhotonCandidate->GetArmenterosQt());
819 // hTrueGammaCosinePointingAngle->Fill(fConversionCuts->GetCosineOfPointingAngle(TruePhotonCandidate,fInputEvent));
820 // hTrueGammaXY->Fill(TruePhotonCandidate->GetConversionX(),TruePhotonCandidate->GetConversionY());
821 // hTrueGammaZR->Fill(TruePhotonCandidate->GetConversionZ(),TruePhotonCandidate->GetConversionRadius());
822 // hTrueElecPt->Fill(elec->Pt(),posi->Pt());
823 // hTrueElecEta->Fill(elec->Eta(),posi->Eta());
824 // hTrueElecPhi->Fill(elec->Phi(),posi->Phi());
825 // hTrueElecNfindableClsTPC
826 // ->Fill((Float_t)elec->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(TruePhotonCandidate->GetConversionRadius())));
827 // hTruePosiNfindableClsTPC
828 // ->Fill((Float_t)posi->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(TruePhotonCandidate->GetConversionRadius())));
829 // hTrueElecNfindableClsTPC->Fill((Float_t)elec->GetNcls(1)/(Float_t)elec->GetTPCNclsF());
830 // hTruePosiNfindableClsTPC->Fill((Float_t)posi->GetNcls(1)/(Float_t)posi->GetTPCNclsF());
833 //________________________________________________________________________
834 void AliAnalysisTaskConversionQA::CountTracks(){
836 if(fInputEvent->IsA()==AliESDEvent::Class()){
837 // Using standard function for setting Cuts
838 Bool_t selectPrimaries=kTRUE;
839 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
840 EsdTrackCuts->SetMaxDCAToVertexZ(2);
841 EsdTrackCuts->SetEtaRange(-0.8, 0.8);
842 EsdTrackCuts->SetPtRange(0.15);
843 fNumberOfESDTracks = 0;
844 for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
845 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
846 if(!curTrack) continue;
847 // if(fMCEvent && ((AliConversionCuts*)fCutArray->At(fiCut))->GetSignalRejection() != 0){
848 // if(!((AliConversionCuts*)fCutArray->At(fiCut))->IsParticleFromBGEvent(abs(curTrack->GetLabel()), fMCStack)) continue;
850 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
855 else if(fInputEvent->IsA()==AliAODEvent::Class()){
856 fNumberOfESDTracks = 0;
857 for(Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
858 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
859 if(!curTrack->IsPrimaryCandidate()) continue;
860 if(abs(curTrack->Eta())>0.8) continue;
861 if(curTrack->Pt()<0.15) continue;
862 if(abs(curTrack->ZAtDCA())>2) continue;
863 fNumberOfESDTracks++;
869 //________________________________________________________________________
871 Bool_t AliAnalysisTaskConversionQA::IsTruePhotonESD(AliAODConversionPhoton *TruePhotonCandidate)
873 TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(fMCStack);
874 TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(fMCStack);
876 if(posDaughter == NULL || negDaughter == NULL) return kFALSE; // One particle does not exist
877 Int_t pdgCode[2] = {abs(posDaughter->GetPdgCode()),abs(negDaughter->GetPdgCode())};
878 if(posDaughter->GetMother(0) != negDaughter->GetMother(0)) return kFALSE;
879 else if(posDaughter->GetMother(0) == -1) return kFALSE;
881 if(pdgCode[0]!=11 || pdgCode[1]!=11) return kFALSE; //One Particle is not electron
882 if(posDaughter->GetPdgCode()==negDaughter->GetPdgCode()) return kFALSE; // Same Charge
883 if(posDaughter->GetUniqueID() != 5 || negDaughter->GetUniqueID() !=5) return kFALSE;// check if the daughters come from a conversion
885 TParticle *Photon = TruePhotonCandidate->GetMCParticle(fMCStack);
886 if(Photon->GetPdgCode() != 22) return kFALSE; // Mother is no Photon
891 UInt_t AliAnalysisTaskConversionQA::IsTruePhotonESD(AliAODConversionPhoton *TruePhotonCandidate)
896 TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(fMCStack);
897 TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(fMCStack);
898 TParticle *Photon = TruePhotonCandidate->GetMCParticle(fMCStack);
899 Int_t motherLabelPhoton;
900 Int_t pdgCodePos = 0;
901 Int_t pdgCodeNeg = 0;
905 if(posDaughter == NULL || negDaughter == NULL) {
907 // return kFALSE; // One particle does not exist
909 } else if( posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)) {
912 pdgCodePos=TMath::Abs(posDaughter->GetPdgCode());
913 pdgCodeNeg=TMath::Abs(negDaughter->GetPdgCode());
914 if(pdgCodePos==11 && pdgCodeNeg==11) return 10; //Electron Combinatorial
915 if(pdgCodePos==11 && pdgCodeNeg==11 &&
916 (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)) return 15; //direct Electron Combinatorial
918 if(pdgCodePos==211 && pdgCodeNeg==211) return 11; //Pion Combinatorial
919 if((pdgCodePos==211 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==211)) return 12; //Pion, Proton Combinatorics
920 if((pdgCodePos==211 && pdgCodeNeg==11) ||(pdgCodePos==11 && pdgCodeNeg==211)) return 13; //Pion, Electron Combinatorics
921 if(pdgCodePos==321 || pdgCodeNeg==321) return 14; //Kaon combinatorics
924 pdgCodePos=posDaughter->GetPdgCode();
925 pdgCodeNeg=negDaughter->GetPdgCode();
926 motherLabelPhoton= Photon->GetMother(0);
927 if ( TruePhotonCandidate->GetMCParticle(fMCStack)->GetPdgCode()) pdgCode = TruePhotonCandidate->GetMCParticle(fMCStack)->GetPdgCode();
929 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11) return 2; // true from hadronic decays
930 else if ( !(pdgCodeNeg==pdgCodePos)){
931 if(pdgCode == 111) return 3; // pi0 Dalitz
932 else if (pdgCode == 221) return 4; // eta Dalitz
933 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
934 if(pdgCode == 22 && motherLabelPhoton < fMCStack->GetNprimary()){
935 return 0; // primary photons
936 } else if (pdgCode == 22){
937 return 5; //secondary photons
946 //________________________________________________________________________
947 UInt_t AliAnalysisTaskConversionQA::IsTruePhotonAOD(AliAODConversionPhoton *TruePhotonCandidate)
952 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
953 AliAODMCParticle *posDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->GetMCLabelPositive());
954 AliAODMCParticle *negDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->GetMCLabelNegative());
955 AliAODMCParticle *Photon = (AliAODMCParticle*) AODMCTrackArray->At(posDaughter->GetMother());
956 Int_t motherLabelPhoton = Photon->GetMother();
957 Int_t pdgCodePos = 0;
958 Int_t pdgCodeNeg = 0;
961 if(posDaughter == NULL || negDaughter == NULL) {
963 // return kFALSE; // One particle does not exist
965 } else if( posDaughter->GetMother() != negDaughter->GetMother() || (posDaughter->GetMother() == negDaughter->GetMother() && posDaughter->GetMother() ==-1)) {
968 pdgCodePos=TMath::Abs(posDaughter->GetPdgCode());
969 pdgCodeNeg=TMath::Abs(negDaughter->GetPdgCode());
970 if(pdgCodePos==11 && pdgCodeNeg==11) kind = 10; //Electron Combinatorial
971 if(pdgCodePos==11 && pdgCodeNeg==11 &&
972 (posDaughter->GetMother() == negDaughter->GetMother() && posDaughter->GetMother() ==-1))kind = 15; //direct Electron Combinatorial
974 if(pdgCodePos==211 && pdgCodeNeg==211) kind = 11; //Pion Combinatorial
975 if((pdgCodePos==211 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==211)) kind = 12; //Pion, Proton Combinatorics
976 if((pdgCodePos==211 && pdgCodeNeg==11) ||(pdgCodePos==11 && pdgCodeNeg==211)) kind = 13; //Pion, Electron Combinatorics
977 if(pdgCodePos==321 || pdgCodeNeg==321) kind = 14; //Kaon combinatorics
980 pdgCodePos=posDaughter->GetPdgCode();
981 pdgCodeNeg=negDaughter->GetPdgCode();
983 if ( Photon->GetPdgCode())
984 pdgCode = Photon->GetPdgCode();
985 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11) kind = 2; // true from hadronic decays
986 else if ( !(pdgCodeNeg==pdgCodePos)){
987 if(pdgCode == 111) kind = 3; // pi0 Dalitz
988 else if (pdgCode == 221) kind = 4; // eta Dalitz
989 else if (!(negDaughter->GetMCProcessCode() != 5 || posDaughter->GetMCProcessCode() !=5)){
990 if(pdgCode == 22 && motherLabelPhoton < fMCStack->GetNprimary()){
991 kind = 0; // primary photons
992 } else if (pdgCode == 22){
993 kind = 5; //secondary photons
1005 //________________________________________________________________________
1006 void AliAnalysisTaskConversionQA::RelabelAODPhotonCandidates(Bool_t mode){
1008 // Relabeling For AOD Event
1010 // MCLabel -> AODMCLabel
1013 fMCStackPos = new Int_t[fConversionGammas->GetEntries()];
1014 fMCStackNeg = new Int_t[fConversionGammas->GetEntries()];
1017 for(Int_t iGamma = 0;iGamma<fConversionGammas->GetEntries();iGamma++){
1018 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) fConversionGammas->At(iGamma);
1019 if(!PhotonCandidate) continue;
1020 if(!mode){// Back to ESD Labels
1021 PhotonCandidate->SetMCLabelPositive(fMCStackPos[iGamma]);
1022 PhotonCandidate->SetMCLabelNegative(fMCStackNeg[iGamma]);
1023 //PhotonCandidate->IsAODMCLabel(kFALSE);
1026 fMCStackPos[iGamma] = PhotonCandidate->GetMCLabelPositive();
1027 fMCStackNeg[iGamma] = PhotonCandidate->GetMCLabelNegative();
1029 Bool_t AODLabelPos = kFALSE;
1030 Bool_t AODLabelNeg = kFALSE;
1032 for(Int_t i = 0; i<fInputEvent->GetNumberOfTracks();i++){
1033 AliAODTrack *tempDaughter = static_cast<AliAODTrack*>(fInputEvent->GetTrack(i));
1035 if( tempDaughter->GetID() == PhotonCandidate->GetTrackLabelPositive() ){
1036 PhotonCandidate->SetMCLabelPositive(abs(tempDaughter->GetLabel()));
1037 AODLabelPos = kTRUE;
1041 if( tempDaughter->GetID() == PhotonCandidate->GetTrackLabelNegative()){
1042 PhotonCandidate->SetMCLabelNegative(abs(tempDaughter->GetLabel()));
1043 AODLabelNeg = kTRUE;
1046 if(AODLabelNeg && AODLabelPos){
1049 } // Both ESD Tracks have AOD Tracks with Positive IDs
1050 if(!AODLabelPos || !AODLabelNeg){
1051 for(Int_t i = 0; i<fInputEvent->GetNumberOfTracks();i++){
1052 AliAODTrack *tempDaughter = static_cast<AliAODTrack*>(fInputEvent->GetTrack(i));
1053 if(tempDaughter->GetID()<0){
1055 if( (abs(tempDaughter->GetID())-1) == PhotonCandidate->GetTrackLabelPositive()){
1056 PhotonCandidate->SetMCLabelPositive(abs(tempDaughter->GetLabel()));
1057 AODLabelPos = kTRUE;
1061 if( (abs(tempDaughter->GetID())-1) == PhotonCandidate->GetTrackLabelNegative()){
1062 PhotonCandidate->SetMCLabelNegative(abs(tempDaughter->GetLabel()));
1063 AODLabelNeg = kTRUE;
1067 if(AODLabelNeg && AODLabelPos){
1071 if(!AODLabelPos || !AODLabelNeg){
1072 cout<<"WARNING!!! AOD TRACKS NOT FOUND FOR"<<endl;
1078 delete[] fMCStackPos;
1079 delete[] fMCStackNeg;
1083 void AliAnalysisTaskConversionQA::SetLogBinningXTH2(TH2* histoRebin){
1084 TAxis *axisafter = histoRebin->GetXaxis();
1085 Int_t bins = axisafter->GetNbins();
1086 Double_t from = axisafter->GetXmin();
1087 Double_t to = axisafter->GetXmax();
1088 Double_t *newbins = new Double_t[bins+1];
1090 Double_t factor = TMath::Power(to/from, 1./bins);
1091 for(Int_t i=1; i<=bins; ++i) newbins[i] = factor * newbins[i-1];
1092 axisafter->Set(bins, newbins);
1097 //________________________________________________________________________
1098 void AliAnalysisTaskConversionQA::Terminate(Option_t *)