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),
47 fNumberOfESDTracks(0),
53 ffillHistograms(kFALSE),
58 hNGoodESDTracks(NULL),
60 hNContributorsVertex(NULL),
67 hGammaChi2perNDF(NULL),
69 hGammaArmenteros(NULL),
70 hGammaCosinePointingAngle(NULL),
75 hElecNfindableClsTPC(NULL),
76 hPosiNfindableClsTPC(NULL),
80 hElectronITSdEdxP(NULL),
82 hElectronNSigmadEdxP(NULL),
83 hElectronNSigmadEdxEta(NULL),
84 hElectronNSigmaPiondEdxP(NULL),
85 hElectronNSigmaITSP(NULL),
86 hElectronNSigmaTOFP(NULL),
88 hPositronITSdEdxP(NULL),
90 hPositronNSigmadEdxP(NULL),
91 hPositronNSigmadEdxEta(NULL),
92 hPositronNSigmaPiondEdxP(NULL),
93 hPositronNSigmaITSP(NULL),
94 hPositronNSigmaTOFP(NULL),
97 // hTrueResolutionR(NULL),
98 // hTrueResolutionZ(NULL),
99 // hTrueResolutionPhi(NULL),
100 // hTrueGammaPt(NULL),
101 // hTrueGammaPhi(NULL),
102 // hTrueGammaEta(NULL),
103 // hTrueGammaMass(NULL),
104 // hTrueGammaChi2perNDF(NULL),
105 // hTrueGammaPsiPair(NULL),
106 // hTrueGammaQt(NULL),
107 // hTrueGammaCosinePointingAngle(NULL),
108 // hTrueGammaXY(NULL),
109 // hTrueGammaZR(NULL),
110 // hTrueElecPt(NULL),
111 // hTrueElecEta(NULL),
112 // hTrueElecPhi(NULL),
113 // hTrueElecNfindableClsTPC(NULL),
114 // hTruePosiNfindableClsTPC(NULL),
115 // hTrueElecAsymP(NULL),
124 fnGammaCandidates(1),
131 AliAnalysisTaskConversionQA::AliAnalysisTaskConversionQA(const char *name) : AliAnalysisTaskSE(name),
133 fConversionGammas(NULL),
134 fConversionCuts(NULL),
137 fNumberOfESDTracks(0),
143 ffillHistograms(kFALSE),
148 hNGoodESDTracks(NULL),
150 hNContributorsVertex(NULL),
151 hITSClusterPhi(NULL),
157 hGammaChi2perNDF(NULL),
159 hGammaArmenteros(NULL),
160 hGammaCosinePointingAngle(NULL),
165 hElecNfindableClsTPC(NULL),
166 hPosiNfindableClsTPC(NULL),
169 hElectrondEdxP(NULL),
170 hElectronITSdEdxP(NULL),
172 hElectronNSigmadEdxP(NULL),
173 hElectronNSigmadEdxEta(NULL),
174 hElectronNSigmaPiondEdxP(NULL),
175 hElectronNSigmaITSP(NULL),
176 hElectronNSigmaTOFP(NULL),
177 hPositrondEdxP(NULL),
178 hPositronITSdEdxP(NULL),
180 hPositronNSigmadEdxP(NULL),
181 hPositronNSigmadEdxEta(NULL),
182 hPositronNSigmaPiondEdxP(NULL),
183 hPositronNSigmaITSP(NULL),
184 hPositronNSigmaTOFP(NULL),
189 // hTrueResolutionR(NULL),
190 // hTrueResolutionZ(NULL),
191 // hTrueResolutionPhi(NULL),
192 // hTrueGammaPt(NULL),
193 // hTrueGammaPhi(NULL),
194 // hTrueGammaEta(NULL),
195 // hTrueGammaMass(NULL),
196 // hTrueGammaChi2perNDF(NULL),
197 // hTrueGammaPsiPair(NULL),
198 // hTrueGammaQt(NULL),
199 // hTrueGammaCosinePointingAngle(NULL),
200 // hTrueGammaXY(NULL),
201 // hTrueGammaZR(NULL),
202 // hTrueElecPt(NULL),
203 // hTrueElecEta(NULL),
204 // hTrueElecPhi(NULL),
205 // hTrueElecNfindableClsTPC(NULL),
206 // hTruePosiNfindableClsTPC(NULL),
207 // hTrueElecAsymP(NULL),
216 fnGammaCandidates(1),
220 // Default constructor
222 DefineInput(0, TChain::Class());
223 DefineOutput(1, TList::Class());
226 //________________________________________________________________________
227 AliAnalysisTaskConversionQA::~AliAnalysisTaskConversionQA()
229 // default deconstructor
232 //________________________________________________________________________
233 void AliAnalysisTaskConversionQA::UserCreateOutputObjects()
235 // Create User Output Objects
237 if(fOutputList != NULL){
241 if(fOutputList == NULL){
242 fOutputList = new TList();
243 fOutputList->SetOwner(kTRUE);
247 fESDList = new TList();
248 fESDList->SetOwner(kTRUE);
249 fESDList->SetName("ESD QA");
250 fOutputList->Add(fESDList);
252 hVertexZ = new TH1F("Vertex_Z","Vertex_Z",300,-15,15);
253 fESDList->Add(hVertexZ);
254 hNContributorsVertex = new TH1I("ContrVertex_Z","ContrVertex_Z",3000,0,3000);
255 fESDList->Add(hNContributorsVertex);
256 if(fIsHeavyIon) hNGoodESDTracks = new TH1I("GoodESDTracks","GoodESDTracks",4000,0,4000);
257 else hNGoodESDTracks = new TH1I("GoodESDTracks","GoodESDTracks",200,0,200);
258 fESDList->Add(hNGoodESDTracks);
259 if(fIsHeavyIon) hNV0Tracks = new TH1I("V0 Multiplicity","V0 Multiplicity",30000,0,30000);
260 else hNV0Tracks = new TH1I("V0 Multiplicity","V0 Multiplicity",2000,0,2000);
261 fESDList->Add(hNV0Tracks);
263 hITSClusterPhi = new TH2F("ITSClusterPhi","hITSClusterPhi",72,0,2*TMath::Pi(),7,0,7);
264 fESDList->Add(hITSClusterPhi);
265 hGammaPt = new TH1F("Gamma_Pt","Gamma_Pt",250,0,25);
266 fESDList->Add(hGammaPt);
267 hGammaPhi = new TH1F("Gamma_Phi","Gamma_Phi",360,0,2*TMath::Pi());
268 fESDList->Add(hGammaPhi);
269 hGammaPhi_Pos = new TH1F("GammaPhi_EtaPos","GammaPhi_EtaPos",360,0,2*TMath::Pi());
270 fESDList->Add(hGammaPhi_Pos);
271 hGammaPhi_Neg = new TH1F("GammaPhi_EtaNeg","GammaPhi_EtaNeg",360,0,2*TMath::Pi());
272 fESDList->Add(hGammaPhi_Neg);
274 hGammaEta = new TH1F("Gamma_Eta","Gamma_Eta",600,-1.5,1.5);
275 fESDList->Add(hGammaEta);
276 hGammaChi2perNDF = new TH1F("Gamma_Chi2perNDF","Gamma_Chi2perNDF",500,0,100);
277 fESDList->Add(hGammaChi2perNDF);
278 hGammaPsiPair = new TH1F("Gamma_PsiPair","Gamma_PsiPair",500,0,2);
279 fESDList->Add(hGammaPsiPair);
280 hGammaArmenteros = new TH2F("Gamma_Armenteros","Gamma_Armenteros",200,-1,1,400,0,0.1);
281 fESDList->Add(hGammaArmenteros);
282 hGammaCosinePointingAngle = new TH1F("Gamma_CosinePointingAngle","Gamma_CosinePointingAngle",1000,-1.,1.);
283 fESDList->Add(hGammaCosinePointingAngle);
284 hGammaInvMass = new TH1F( "Gamma_InvMass","",200, 0, 0.2);
285 fESDList->Add(hGammaInvMass);
286 hElecPt = new TH2F("Electron_Positron_Pt","Electron_Positron_Pt",250,0,25,250,0,25);
287 fESDList->Add(hElecPt);
288 hElecEta = new TH2F("Electron_Positron_Eta","Electron_Positron_Eta",600,-1.5,1.5,600,-1.5,1.5);
289 fESDList->Add(hElecEta);
290 hElecPhi = new TH2F("Electron_Positron_Phi","Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
291 fESDList->Add(hElecPhi);
292 hElecClsTPC = new TH1F("Electron_ClusterTPC","Electron_ClusterTPC",200,0,200);
293 fESDList->Add(hElecClsTPC);
294 hPosiClsTPC = new TH1F("Positron_ClusterTPC","Positron_ClusterTPC",200,0,200);
295 fESDList->Add(hPosiClsTPC);
297 hElecNfindableClsTPC = new TH1F("Electron_findableClusterTPC","Electron_findableClusterTPC",100,0,1);
298 fESDList->Add(hElecNfindableClsTPC);
299 hPosiNfindableClsTPC = new TH1F("Positron_findableClusterTPC","Positron_findableClusterTPC",100,0,1);
300 fESDList->Add(hPosiNfindableClsTPC);
302 hElectrondEdxP = new TH2F("Electron_dEdx_P","Electron_dEdx_P",100, 0.05, 20, 200, 0, 200);
303 SetLogBinningXTH2(hElectrondEdxP);
304 fESDList->Add(hElectrondEdxP);
305 hPositrondEdxP = new TH2F("Positron_dEdx_P","Positron_dEdx_P",100, 0.05, 20, 200, 0, 200);
306 SetLogBinningXTH2(hPositrondEdxP);
307 fESDList->Add(hPositrondEdxP);
308 hElectronNSigmadEdxP = new TH2F("Electron_NSigmadEdx_P","Electron_NSigmadEdx_P",100, 0.05, 20, 200, -10, 10);
309 SetLogBinningXTH2(hElectronNSigmadEdxP);
310 fESDList->Add(hElectronNSigmadEdxP);
311 hElectronNSigmadEdxEta = new TH2F("Electron_NSigmadEdx_Eta","Electron_NSigmadEdx_Eta",140, -1.4, 1.4, 200, -10, 10);
312 fESDList->Add(hElectronNSigmadEdxEta);
313 hPositronNSigmadEdxP = new TH2F("Positron_NSigmadEdx_P","Positron_NSigmadEdx_P",100, 0.05, 20, 200, -10, 10);
314 SetLogBinningXTH2(hPositronNSigmadEdxP);
315 fESDList->Add(hPositronNSigmadEdxP);
316 hPositronNSigmadEdxEta = new TH2F("Positron_NSigmadEdx_Eta","Positron_NSigmadEdx_Eta",140, -1.4, 1.4, 200, -10, 10);
317 fESDList->Add(hPositronNSigmadEdxEta);
318 hElectronNSigmaPiondEdxP = new TH2F("Electron_NSigmaPiondEdx_P","Electron_NSigmaPiondEdx_P",100, 0.05, 20, 200, -10, 10);
319 SetLogBinningXTH2(hElectronNSigmaPiondEdxP);
320 fESDList->Add(hElectronNSigmaPiondEdxP);
321 hPositronNSigmaPiondEdxP = new TH2F("Positron_NSigmaPiondEdx_P","Positron_NSigmaPiondEdx_P",100, 0.05, 20, 200, -10, 10);
322 SetLogBinningXTH2(hPositronNSigmaPiondEdxP);
323 fESDList->Add(hPositronNSigmaPiondEdxP);
325 hElectronTOFP = new TH2F("Electron_TOF_P","Electron_TOF_P",100, 0.05, 20, 600, -1000, 29000);
326 SetLogBinningXTH2(hElectronTOFP);
327 fESDList->Add(hElectronTOFP);
328 hPositronTOFP = new TH2F("Positron_TOF_P","Positron_TOF_P",100, 0.05, 20, 600, -1000, 29000);
329 SetLogBinningXTH2(hPositronTOFP);
330 fESDList->Add(hPositronTOFP);
331 hElectronNSigmaTOFP = new TH2F("Electron_NSigmaTOF_P","Electron_NSigmaTOF_P",100, 0.05, 20, 200, -10, 10);
332 SetLogBinningXTH2(hElectronNSigmaTOFP);
333 fESDList->Add(hElectronNSigmaTOFP);
334 hPositronNSigmaTOFP = new TH2F("Positron_NSigmaTOF_P","Positron_NSigmaTOF_P",100, 0.05, 20, 200, -10, 10);
335 SetLogBinningXTH2(hPositronNSigmaTOFP);
336 fESDList->Add(hPositronNSigmaTOFP);
338 hElectronITSdEdxP = new TH2F("Electron_ITSdEdx_P","Electron_ITSdEdx_P",100, 0.05, 20, 200, 0, 200);
339 SetLogBinningXTH2(hElectronITSdEdxP);
340 fESDList->Add(hElectronITSdEdxP);
341 hPositronITSdEdxP = new TH2F("Positron_ITSdEdx_P","Positron_ITSdEdx_P",100, 0.05, 20, 200, 0, 200);
342 SetLogBinningXTH2(hPositronITSdEdxP);
343 fESDList->Add(hPositronITSdEdxP);
344 hElectronNSigmaITSP = new TH2F("Electron_NSigmaITS_P","Electron_NSigmaITS_P",100, 0.05, 20, 200, -10, 10);
345 SetLogBinningXTH2(hElectronNSigmaITSP);
346 fESDList->Add(hElectronNSigmaITSP);
347 hPositronNSigmaITSP = new TH2F("Positron_NSigmaITS_P","Positron_NSigmaITS_P",100, 0.05, 20, 200, -10, 10);
348 SetLogBinningXTH2(hPositronNSigmaITSP);
349 fESDList->Add(hPositronNSigmaITSP);
351 // hGammaXY = new TH2F("Gamma_ConversionPoint_XY","Gamma_ConversionPoint_XY",960,-120,120,960,-120,120);
352 // fESDList->Add(hGammaXY);
353 // hGammaZR= new TH2F("Gamma_ConversionPoint_ZR","Gamma_ConversionPoint_ZR",1200,-150,150,480,0,120);
354 // fESDList->Add(hGammaZR);
357 // hElecAsymP = new TH2F("Electron_Asym_vs_P", "Electron_Asym_vs_P",200,0.,20.,200,0.,1.);
358 // fESDList->Add(hElecAsymP);
361 // fTrueList = new TList();
362 // fTrueList->SetOwner(kTRUE);
363 // fTrueList->SetName("True QA");
364 // fOutputList->Add(fTrueList);
366 // hTrueResolutionR = new TH2F("True_ConversionPointResolution_R","True_ConversionPointResolution_R",240,0,120,200,-20,20);
367 // fTrueList->Add(hTrueResolutionR);
368 // hTrueResolutionZ = new TH2F("True_ConversionPointResolution_Z","True_ConversionPointResolution_Z",480,-120,120,200,-20,20);
369 // fTrueList->Add(hTrueResolutionZ);
370 // hTrueResolutionPhi = new TH2F("True_ConversionPointResolution_Phi","True_ConversionPointResolution_Phi",360,0,2*TMath::Pi(),200,-TMath::Pi()/30., TMath::Pi()/30.);
371 // fTrueList->Add(hTrueResolutionPhi);
373 // hTrueGammaPt = new TH1F("True_Gamma_Pt","True_Gamma_Pt",250,0,25);
374 // fTrueList->Add(hTrueGammaPt);
375 // hTrueGammaPhi = new TH1F("True_Gamma_Phi","True_Gamma_Phi",360,0,2*TMath::Pi());
376 // fTrueList->Add(hTrueGammaPhi);
377 // hTrueGammaEta = new TH1F("True_Gamma_Eta","True_Gamma_Eta",600,-1.5,1.5);
378 // fTrueList->Add(hTrueGammaEta);
379 // hTrueGammaMass = new TH1F("True_Gamma_Mass","True_Gamma_Mass",1000,0,0.3);
380 // fTrueList->Add(hTrueGammaMass);
381 // hTrueGammaChi2perNDF = new TH1F("True_Gamma_Chi2perNDF","True_Gamma_Chi2perNDF",500,0,100);
382 // fTrueList->Add(hTrueGammaChi2perNDF);
383 // hTrueGammaPsiPair = new TH1F("True_Gamma_PsiPair","True_Gamma_PsiPair",500,0,2);
384 // fTrueList->Add(hTrueGammaPsiPair);
385 // hTrueGammaQt = new TH1F("True_Gamma_Qt","True_Gamma_Qt",400,0,0.1);
386 // fTrueList->Add(hTrueGammaQt);
387 // hTrueGammaCosinePointingAngle = new TH1F("True_Gamma_CosinePointingAngle","True_Gamma_CosinePointingAngle",900,0.7,1.);
388 // fTrueList->Add(hTrueGammaCosinePointingAngle);
389 // hTrueGammaXY = new TH2F("True_Gamma_ConversionPoint_XY","True_Gamma_ConversionPoint_XY",960,-120,120,960,-120,120);
390 // fTrueList->Add(hTrueGammaXY);
391 // hTrueGammaZR= new TH2F("TrueGamma_ConversionPoint_ZR","TrueGamma_ConversionPoint_ZR",1200,-150,150,480,0,120);
392 // fTrueList->Add(hTrueGammaZR);
394 // hTrueElecPt = new TH2F("True_Electron_Positron_Pt","True_Electron_Positron_Pt",250,0,25,250,0,25);
395 // fTrueList->Add(hTrueElecPt);
396 // hTrueElecEta = new TH2F("True_Electron_Positron_Eta","True_Electron_Positron_Eta",600,-1.5,1.5,600,-1.5,1.5);
397 // fTrueList->Add(hTrueElecEta);
398 // hTrueElecPhi = new TH2F("True_Electron_Positron_Phi","True_Electron_Positron_Phi",360,0,2*TMath::Pi(),360,0,2*TMath::Pi());
399 // fTrueList->Add(hTrueElecPhi);
400 // hTrueElecNfindableClsTPC = new TH1F("True_Electron_findableClusterTPC","True_Electron_findableClusterTPC",100,0,1);
401 // fTrueList->Add(hTrueElecNfindableClsTPC);
402 // hTruePosiNfindableClsTPC = new TH1F("True_Positron_findableClusterTPC","True_Positron_findableClusterTPC",100,0,1);
403 // fTrueList->Add(hTruePosiNfindableClsTPC);
404 // hTrueElecAsymP = new TH2F("True_Electron_Asym_vs_P", "True_Electron_Asym_vs_P",200,0.,20.,200,0.,1.);
405 // fTrueList->Add(hTrueElecAsymP);
407 if(fConversionCuts->GetCutHistograms()){
408 fOutputList->Add(fConversionCuts->GetCutHistograms());
413 fTreeList = new TList();
414 fTreeList->SetOwner(kTRUE);
415 fTreeList->SetName("TreeList");
416 fOutputList->Add(fTreeList);
418 fTreeQA = new TTree("PhotonQA","PhotonQA");
420 fTreeQA->Branch("daughterProp",&fDaughterProp);
421 fTreeQA->Branch("recCords",&fGammaConvCoord);
422 fTreeQA->Branch("photonProp",&fGammaPhotonProp);
423 fTreeQA->Branch("pt",&fGammaPt,"fGammaPt/F");
424 fTreeQA->Branch("theta",&fGammaTheta,"fGammaTheta/F");
425 fTreeQA->Branch("chi2ndf",&fGammaChi2NDF,"fGammaChi2NDF/F");
427 fTreeQA->Branch("kind",&fKind,"fKind/b");
429 fTreeList->Add(fTreeQA);
432 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
434 PostData(1, fOutputList);
436 //_____________________________________________________________________________
437 Bool_t AliAnalysisTaskConversionQA::Notify()
439 if(!fEventCuts->GetDoEtaShift()) return kTRUE;; // No Eta Shift requested, continue
441 if(fEventCuts->GetEtaShift() == 0.0){ // Eta Shift requested but not set, get shift automatically
442 fEventCuts->GetCorrectEtaShiftFromPeriod(fV0Reader->GetPeriodName());
443 fEventCuts->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
447 printf(" Gamma Conversion QA Task %s :: Eta Shift Manually Set to %f \n\n",
448 (fEventCuts->GetCutNumber()).Data(),fEventCuts->GetEtaShift());
449 fEventCuts->DoEtaShift(kFALSE); // Eta Shift Set, make sure that it is called only once
454 //________________________________________________________________________
455 void AliAnalysisTaskConversionQA::UserExec(Option_t *){
457 Int_t eventQuality = ((AliConvEventCuts*)fV0Reader->GetEventCuts())->GetEventQuality();
458 if(eventQuality != 0){// Event Not Accepted
461 fInputEvent = InputEvent();
462 if(fIsMC) fMCEvent = MCEvent();
463 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){ fMCStack = fMCEvent->Stack(); }
465 Int_t eventNotAccepted =
466 fEventCuts->IsEventAcceptedByCut(fV0Reader->GetEventCuts(),fInputEvent,fMCEvent,fIsHeavyIon,kFALSE);
467 if(eventNotAccepted) return; // Check Centrality, PileUp, SDD and V0AND --> Not Accepted => eventQuality = 1
469 fConversionGammas=fV0Reader->GetReconstructedGammas();
472 if(fEventCuts->GetSignalRejection() != 0){
473 if(fInputEvent->IsA()==AliESDEvent::Class()){
474 fEventCuts->GetNotRejectedParticles(fEventCuts->GetSignalRejection(),
475 fEventCuts->GetAcceptedHeader(),
478 else if(fInputEvent->IsA()==AliAODEvent::Class()){
479 fEventCuts->GetNotRejectedParticles(fEventCuts->GetSignalRejection(),
480 fEventCuts->GetAcceptedHeader(),
488 hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
489 hNContributorsVertex->Fill(fEventCuts->GetNumberOfContributorsVtx(fInputEvent));
490 hNGoodESDTracks->Fill(fNumberOfESDTracks);
491 hNV0Tracks->Fill(fInputEvent->GetVZEROData()->GetMTotV0A()+fInputEvent->GetVZEROData()->GetMTotV0C());
494 if(fMCEvent && fInputEvent->IsA()==AliAODEvent::Class() && !(fV0Reader->AreAODsRelabeled())){
495 RelabelAODPhotonCandidates(kTRUE); // In case of AODMC relabeling MC
496 fV0Reader->RelabelAODs(kTRUE);
500 for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
501 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
502 if (gamma==NULL) continue;
503 if(fMCEvent && fEventCuts->GetSignalRejection() != 0){
504 if(!fEventCuts->IsParticleFromBGEvent(gamma->GetMCLabelPositive(), fMCStack, fInputEvent))
506 if(!fEventCuts->IsParticleFromBGEvent(gamma->GetMCLabelNegative(), fMCStack, fInputEvent))
509 if(!fConversionCuts->PhotonIsSelected(gamma,fInputEvent)){
513 if(ffillTree) ProcessQATree(gamma);
514 if(ffillHistograms) ProcessQA(gamma);
517 if(fMCEvent && fInputEvent->IsA()==AliAODEvent::Class() && !(fV0Reader->AreAODsRelabeled())){
518 RelabelAODPhotonCandidates(kFALSE); // Back to ESDMC Label
519 fV0Reader->RelabelAODs(kFALSE);
522 PostData(1, fOutputList);
526 ///________________________________________________________________________
527 void AliAnalysisTaskConversionQA::ProcessQATree(AliAODConversionPhoton *gamma){
529 // Fill Histograms for QA and MC
530 AliVEvent* event = (AliVEvent*) InputEvent();
532 AliPIDResponse* pidResonse = ((AliConversionPhotonCuts*)fV0Reader->GetConversionCuts())->GetPIDResponse();
534 fGammaPt = gamma->GetPhotonPt();
536 fGammaTheta = gamma->Theta();
537 fGammaChi2NDF = gamma->GetChi2perNDF();
539 fGammaPhotonProp(0) = gamma->GetArmenterosQt();
540 fGammaPhotonProp(1) = gamma->GetArmenterosAlpha();
541 fGammaPhotonProp(2) = gamma->GetPsiPair();
542 fGammaPhotonProp(3) = fConversionCuts->GetCosineOfPointingAngle(gamma,event);
543 fGammaPhotonProp(4) = gamma->GetMass();
545 fGammaConvCoord(0) = gamma->GetConversionX();
546 fGammaConvCoord(1) = gamma->GetConversionY();
547 fGammaConvCoord(2) = gamma->GetConversionZ();
548 fGammaConvCoord(3) = gamma->GetConversionRadius();
549 fGammaConvCoord(4) = gamma->GetPhotonPhi();
551 AliVTrack * negTrack = fConversionCuts->GetTrack(event, gamma->GetTrackLabelNegative());
552 AliVTrack * posTrack = fConversionCuts->GetTrack(event, gamma->GetTrackLabelPositive());
555 if(!negTrack||!posTrack)return;
558 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
559 fKind = IsTruePhotonESD(gamma);
560 } else if (fMCEvent && fInputEvent->IsA()==AliAODEvent::Class()){
561 // cout << "entering IsTruePhotonAOD" << endl;
562 fKind = IsTruePhotonAOD(gamma);
565 fDaughterProp(0) = posTrack->Pt();
566 fDaughterProp(7) = negTrack->Pt();
567 fDaughterProp(1) = posTrack->Theta();
568 fDaughterProp(8) = negTrack->Theta();
570 fDaughterProp(2) = posTrack->GetTPCsignal();
571 fDaughterProp(3) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kElectron);
572 fDaughterProp(22) = pidResonse->NumberOfSigmasTPC(posTrack,AliPID::kPion);
573 fDaughterProp(9) = negTrack->GetTPCsignal();
574 fDaughterProp(10) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kElectron);
575 fDaughterProp(23) = pidResonse->NumberOfSigmasTPC(negTrack,AliPID::kPion);
576 Int_t nPosClusterITS = 0;
577 Int_t nNegClusterITS = 0;
578 for(Int_t itsLayer = 0; itsLayer<6;itsLayer++){
579 if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
582 if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
588 fDaughterProp(14) = (Float_t)nPosClusterITS;
589 fDaughterProp(15) = (Float_t)nNegClusterITS;
590 if (nPosClusterITS > 0 ){
591 fDaughterProp(16) = posTrack->GetITSsignal();
592 fDaughterProp(20) = pidResonse->NumberOfSigmasITS(posTrack,AliPID::kElectron);
594 fDaughterProp(16) = 1000;
595 fDaughterProp(20) = 20;
597 if (nNegClusterITS > 0 ){
598 fDaughterProp(17) = negTrack->GetITSsignal();
599 fDaughterProp(21) = pidResonse->NumberOfSigmasITS(negTrack,AliPID::kElectron);
601 fDaughterProp(17) = 1000;
602 fDaughterProp(21) = 20;
606 if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
607 Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
608 Double_t timesPos[9];
609 posTrack->GetIntegratedTimes(timesPos);
610 Double_t TOFsignalPos = posTrack->GetTOFsignal();
611 Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
612 fDaughterProp(4) = dTpos;
613 fDaughterProp(5) = pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron);
615 fDaughterProp(4) = 20000;
616 fDaughterProp(5) = -20;
618 if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
619 Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
620 Double_t timesNeg[9];
621 negTrack->GetIntegratedTimes(timesNeg);
622 Double_t TOFsignalNeg = negTrack->GetTOFsignal();
623 Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
624 fDaughterProp(11) = dTneg;
625 fDaughterProp(12) = pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron);
627 fDaughterProp(11) = 20000;
628 fDaughterProp(12) = -20;
631 fDaughterProp(6) = (Float_t)posTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius()));
632 fDaughterProp(18) = posTrack->GetNcls(1);
633 fDaughterProp(13) = (Float_t)negTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius()));
634 fDaughterProp(19) = negTrack->GetNcls(1);
641 //_____________________________________________________________________________________________________
642 void AliAnalysisTaskConversionQA::ProcessQA(AliAODConversionPhoton *gamma){
644 AliPIDResponse* pidResonse = ((AliConversionPhotonCuts*)fV0Reader->GetConversionCuts())->GetPIDResponse();
646 // Fill Histograms for QA and MC
648 hGammaPt->Fill(gamma->GetPhotonPt());
649 hGammaPhi->Fill(gamma->GetPhotonPhi());
650 if(gamma->Eta() >= 0.00001){hGammaPhi_Pos->Fill(gamma->Phi());}
651 if(gamma->Eta() <= 0.00001){hGammaPhi_Neg->Fill(gamma->Phi());}
652 hGammaEta->Fill(gamma->Eta());
653 hGammaChi2perNDF->Fill(gamma->GetChi2perNDF());
654 hGammaPsiPair->Fill(gamma->GetPsiPair());
655 hGammaArmenteros->Fill(gamma->GetArmenterosAlpha(),gamma->GetArmenterosQt());
656 hGammaCosinePointingAngle->Fill(fConversionCuts->GetCosineOfPointingAngle(gamma,fInputEvent));
657 hGammaInvMass->Fill(gamma->GetMass());
658 // hGammaXY->Fill(gamma->GetConversionX(),gamma->GetConversionY());
659 // hGammaZR->Fill(gamma->GetConversionZ(),gamma->GetConversionRadius());
661 AliVTrack * negTrack = fConversionCuts->GetTrack(fInputEvent, gamma->GetTrackLabelNegative());
662 AliVTrack * posTrack = fConversionCuts->GetTrack(fInputEvent, gamma->GetTrackLabelPositive());
663 if(!negTrack||!posTrack)return;
666 hElecPt->Fill(negTrack->Pt(),posTrack->Pt());
667 hElecEta->Fill(negTrack->Eta(),posTrack->Eta());
668 hElecPhi->Fill(negTrack->Phi(),posTrack->Phi());
670 hElecNfindableClsTPC->Fill((Float_t)posTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius())));
671 hPosiNfindableClsTPC->Fill((Float_t)negTrack->GetTPCClusterInfo(2,0,fConversionCuts->GetFirstTPCRow(gamma->GetConversionRadius())));
672 hElecClsTPC->Fill(negTrack->GetNcls(1));
673 hPosiClsTPC->Fill(posTrack->GetNcls(1));
675 hElectrondEdxP->Fill(negTrack->P() ,negTrack->GetTPCsignal());
676 hElectronNSigmadEdxP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kElectron));
677 hElectronNSigmadEdxEta->Fill(negTrack->Eta() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kElectron));
678 hElectronNSigmaPiondEdxP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTPC(negTrack, AliPID::kPion));
679 hPositrondEdxP->Fill(posTrack->P() ,posTrack->GetTPCsignal());
680 hPositronNSigmadEdxP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kElectron));
681 hPositronNSigmadEdxEta->Fill(posTrack->Eta() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kElectron));
682 hPositronNSigmaPiondEdxP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTPC(posTrack, AliPID::kPion));
685 if((negTrack->GetStatus() & AliESDtrack::kTOFpid) && !(negTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
686 Double_t t0neg = pidResonse->GetTOFResponse().GetStartTime(negTrack->P());
687 Double_t timesNeg[9];
688 negTrack->GetIntegratedTimes(timesNeg);
689 Double_t TOFsignalNeg = negTrack->GetTOFsignal();
690 Double_t dTneg = TOFsignalNeg - t0neg - timesNeg[0];
691 hElectronTOFP->Fill(negTrack->P() ,dTneg);
692 hElectronNSigmaTOFP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasTOF(negTrack, AliPID::kElectron));
694 if((posTrack->GetStatus() & AliESDtrack::kTOFpid) && !(posTrack->GetStatus() & AliESDtrack::kTOFmismatch)){
695 Double_t t0pos = pidResonse->GetTOFResponse().GetStartTime(posTrack->P());
696 Double_t timesPos[9];
697 posTrack->GetIntegratedTimes(timesPos);
698 Double_t TOFsignalPos = posTrack->GetTOFsignal();
699 Double_t dTpos = TOFsignalPos - t0pos - timesPos[0];
700 hPositronTOFP->Fill(posTrack->P() ,dTpos);
701 hPositronNSigmaTOFP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasTOF(posTrack, AliPID::kElectron));
704 Int_t nPosClusterITS = 0;
705 Int_t nNegClusterITS = 0;
706 for(Int_t itsLayer = 0; itsLayer<6;itsLayer++){
707 if(TESTBIT(negTrack->GetITSClusterMap(),itsLayer)){
710 if(TESTBIT(posTrack->GetITSClusterMap(),itsLayer)){
714 Double_t negtrackPhi = negTrack->Phi();
715 Double_t postrackPhi = posTrack->Phi();
716 hITSClusterPhi->Fill(negtrackPhi,nNegClusterITS);
717 hITSClusterPhi->Fill(postrackPhi,nPosClusterITS);
720 if (nPosClusterITS > 0 ){
721 hPositronITSdEdxP->Fill(posTrack->P() ,posTrack->GetITSsignal());
722 hPositronNSigmaITSP->Fill(posTrack->P() ,pidResonse->NumberOfSigmasITS(posTrack,AliPID::kElectron));
724 if (nNegClusterITS > 0 ){
725 hElectronITSdEdxP->Fill(negTrack->P() ,negTrack->GetITSsignal());
726 hElectronNSigmaITSP->Fill(negTrack->P() ,pidResonse->NumberOfSigmasITS(negTrack,AliPID::kElectron));
733 //________________________________________________________________________
734 void AliAnalysisTaskConversionQA::CountTracks(){
736 if(fInputEvent->IsA()==AliESDEvent::Class()){
737 // Using standard function for setting Cuts
738 Bool_t selectPrimaries=kTRUE;
739 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
740 EsdTrackCuts->SetMaxDCAToVertexZ(2);
741 EsdTrackCuts->SetEtaRange(-0.8, 0.8);
742 EsdTrackCuts->SetPtRange(0.15);
743 fNumberOfESDTracks = 0;
744 for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
745 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
746 if(!curTrack) continue;
747 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
752 else if(fInputEvent->IsA()==AliAODEvent::Class()){
753 fNumberOfESDTracks = 0;
754 for(Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
755 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
756 if(curTrack->GetID()<0) continue; // Avoid double counting of tracks
757 if(!curTrack->IsHybridGlobalConstrainedGlobal()) continue;
758 if(abs(curTrack->Eta())>0.8) continue;
759 if(curTrack->Pt()<0.15) continue;
760 fNumberOfESDTracks++;
766 UInt_t AliAnalysisTaskConversionQA::IsTruePhotonESD(AliAODConversionPhoton *TruePhotonCandidate)
769 TParticle *posDaughter = TruePhotonCandidate->GetPositiveMCDaughter(fMCStack);
770 TParticle *negDaughter = TruePhotonCandidate->GetNegativeMCDaughter(fMCStack);
771 Int_t motherLabelPhoton;
772 Int_t pdgCodePos = 0;
773 Int_t pdgCodeNeg = 0;
776 if(posDaughter == NULL || negDaughter == NULL) {
778 // return kFALSE; // One particle does not exist
780 } else if( posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)) {
783 pdgCodePos=TMath::Abs(posDaughter->GetPdgCode());
784 pdgCodeNeg=TMath::Abs(negDaughter->GetPdgCode());
785 if(pdgCodePos==11 && pdgCodeNeg==11) return 10; //Electron Combinatorial
786 if(pdgCodePos==11 && pdgCodeNeg==11 &&
787 (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)) return 15; //direct Electron Combinatorial
789 if(pdgCodePos==211 && pdgCodeNeg==211) return 11; //Pion Combinatorial
790 if((pdgCodePos==211 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==211)) return 12; //Pion, Proton Combinatorics
791 if((pdgCodePos==211 && pdgCodeNeg==11) ||(pdgCodePos==11 && pdgCodeNeg==211)) return 13; //Pion, Electron Combinatorics
792 if(pdgCodePos==321 || pdgCodeNeg==321) return 14; //Kaon combinatorics
794 TParticle *Photon = TruePhotonCandidate->GetMCParticle(fMCStack);
795 pdgCodePos=posDaughter->GetPdgCode();
796 pdgCodeNeg=negDaughter->GetPdgCode();
797 motherLabelPhoton= Photon->GetMother(0);
798 if ( TruePhotonCandidate->GetMCParticle(fMCStack)->GetPdgCode()) pdgCode = TruePhotonCandidate->GetMCParticle(fMCStack)->GetPdgCode();
800 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11) return 2; // true from hadronic decays
801 else if ( !(pdgCodeNeg==pdgCodePos)){
802 if(pdgCode == 111) return 3; // pi0 Dalitz
803 else if (pdgCode == 221) return 4; // eta Dalitz
804 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
805 if(pdgCode == 22 && motherLabelPhoton < fMCStack->GetNprimary()){
806 return 0; // primary photons
807 } else if (pdgCode == 22){
808 return 5; //secondary photons
817 //________________________________________________________________________
818 UInt_t AliAnalysisTaskConversionQA::IsTruePhotonAOD(AliAODConversionPhoton *TruePhotonCandidate)
822 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
823 if (AODMCTrackArray!=NULL && TruePhotonCandidate!=NULL){
824 AliAODMCParticle *posDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->GetMCLabelPositive());
825 AliAODMCParticle *negDaughter = (AliAODMCParticle*) AODMCTrackArray->At(TruePhotonCandidate->GetMCLabelNegative());
826 Int_t pdgCodePos = 0;
827 Int_t pdgCodeNeg = 0;
829 if(posDaughter == NULL || negDaughter == NULL) {
831 } else if( posDaughter->GetMother() != negDaughter->GetMother() || (posDaughter->GetMother() == negDaughter->GetMother() && posDaughter->GetMother() ==-1)) {
833 pdgCodePos=TMath::Abs(posDaughter->GetPdgCode());
834 pdgCodeNeg=TMath::Abs(negDaughter->GetPdgCode());
835 if(pdgCodePos==11 && pdgCodeNeg==11) kind = 10; //Electron Combinatorial
836 if(pdgCodePos==11 && pdgCodeNeg==11 &&
837 (posDaughter->GetMother() == negDaughter->GetMother() && posDaughter->GetMother() ==-1))kind = 15; //direct Electron Combinatorial
839 if(pdgCodePos==211 && pdgCodeNeg==211) kind = 11; //Pion Combinatorial
840 if((pdgCodePos==211 && pdgCodeNeg==2212) ||(pdgCodePos==2212 && pdgCodeNeg==211)) kind = 12; //Pion, Proton Combinatorics
841 if((pdgCodePos==211 && pdgCodeNeg==11) ||(pdgCodePos==11 && pdgCodeNeg==211)) kind = 13; //Pion, Electron Combinatorics
842 if(pdgCodePos==321 || pdgCodeNeg==321) kind = 14; //Kaon combinatorics
844 AliAODMCParticle *Photon = (AliAODMCParticle*) AODMCTrackArray->At(posDaughter->GetMother());
845 pdgCodePos=posDaughter->GetPdgCode();
846 pdgCodeNeg=negDaughter->GetPdgCode();
848 if ( Photon->GetPdgCode())
849 pdgCode = Photon->GetPdgCode();
850 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11) kind = 2; // true from hadronic decays
851 else if ( !(pdgCodeNeg==pdgCodePos)){
852 if(pdgCode == 111) kind = 3; // pi0 Dalitz
853 else if (pdgCode == 221) kind = 4; // eta Dalitz
854 else if (!(negDaughter->GetMCProcessCode() != 5 || posDaughter->GetMCProcessCode() !=5)){
855 if(pdgCode == 22 && Photon->IsPrimary()){
856 kind = 0; // primary photons
857 } else if (pdgCode == 22){
858 kind = 5; //secondary photons
869 //________________________________________________________________________
870 void AliAnalysisTaskConversionQA::RelabelAODPhotonCandidates(Bool_t mode){
872 // Relabeling For AOD Event
874 // MCLabel -> AODMCLabel
877 fMCStackPos = new Int_t[fConversionGammas->GetEntries()];
878 fMCStackNeg = new Int_t[fConversionGammas->GetEntries()];
881 for(Int_t iGamma = 0;iGamma<fConversionGammas->GetEntries();iGamma++){
882 AliAODConversionPhoton* PhotonCandidate = (AliAODConversionPhoton*) fConversionGammas->At(iGamma);
883 if(!PhotonCandidate) continue;
884 if(!mode){// Back to ESD Labels
885 PhotonCandidate->SetMCLabelPositive(fMCStackPos[iGamma]);
886 PhotonCandidate->SetMCLabelNegative(fMCStackNeg[iGamma]);
887 //PhotonCandidate->IsAODMCLabel(kFALSE);
890 fMCStackPos[iGamma] = PhotonCandidate->GetMCLabelPositive();
891 fMCStackNeg[iGamma] = PhotonCandidate->GetMCLabelNegative();
893 Bool_t AODLabelPos = kFALSE;
894 Bool_t AODLabelNeg = kFALSE;
896 for(Int_t i = 0; i<fInputEvent->GetNumberOfTracks();i++){
897 AliAODTrack *tempDaughter = static_cast<AliAODTrack*>(fInputEvent->GetTrack(i));
899 if( tempDaughter->GetID() == PhotonCandidate->GetTrackLabelPositive() ){
900 PhotonCandidate->SetMCLabelPositive(abs(tempDaughter->GetLabel()));
905 if( tempDaughter->GetID() == PhotonCandidate->GetTrackLabelNegative()){
906 PhotonCandidate->SetMCLabelNegative(abs(tempDaughter->GetLabel()));
910 if(AODLabelNeg && AODLabelPos){
913 } // Both ESD Tracks have AOD Tracks with Positive IDs
914 if(!AODLabelPos || !AODLabelNeg){
915 for(Int_t i = 0; i<fInputEvent->GetNumberOfTracks();i++){
916 AliAODTrack *tempDaughter = static_cast<AliAODTrack*>(fInputEvent->GetTrack(i));
917 if(tempDaughter->GetID()<0){
919 if( (abs(tempDaughter->GetID())-1) == PhotonCandidate->GetTrackLabelPositive()){
920 PhotonCandidate->SetMCLabelPositive(abs(tempDaughter->GetLabel()));
925 if( (abs(tempDaughter->GetID())-1) == PhotonCandidate->GetTrackLabelNegative()){
926 PhotonCandidate->SetMCLabelNegative(abs(tempDaughter->GetLabel()));
931 if(AODLabelNeg && AODLabelPos){
935 if(!AODLabelPos || !AODLabelNeg){
936 cout<<"WARNING!!! AOD TRACKS NOT FOUND FOR"<<endl;
942 delete[] fMCStackPos;
943 delete[] fMCStackNeg;
947 void AliAnalysisTaskConversionQA::SetLogBinningXTH2(TH2* histoRebin){
948 TAxis *axisafter = histoRebin->GetXaxis();
949 Int_t bins = axisafter->GetNbins();
950 Double_t from = axisafter->GetXmin();
951 Double_t to = axisafter->GetXmax();
952 Double_t *newbins = new Double_t[bins+1];
954 Double_t factor = TMath::Power(to/from, 1./bins);
955 for(Int_t i=1; i<=bins; ++i) newbins[i] = factor * newbins[i-1];
956 axisafter->Set(bins, newbins);
961 //________________________________________________________________________
962 void AliAnalysisTaskConversionQA::Terminate(Option_t *)