1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Friederike Bock *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // QA Task for V0 Reader V1
19 //---------------------------------------------
20 ////////////////////////////////////////////////
22 #include "AliAnalysisTaskMaterial.h"
24 #include "AliAnalysisManager.h"
25 #include "TParticle.h"
27 #include "AliPIDResponse.h"
28 #include "AliESDtrackCuts.h"
35 ClassImp(AliAnalysisTaskMaterial)
37 AliAnalysisTaskMaterial::AliAnalysisTaskMaterial() : AliAnalysisTaskSE(),
39 fConversionGammas(NULL),
40 fConversionCuts(NULL),
44 fAllMCGammaList(NULL),
45 fAllMCConvGammaList(NULL),
47 fTreeMaterialRec(NULL),
48 fTreeMaterialAllGamma(NULL),
49 fTreeMaterialConvGamma(NULL),
53 fNESDtracksEta0914(0),
58 fGammaMCConvTheta(0.),
60 fMCConvDaughterProp(4),
77 //________________________________________________________________________
78 AliAnalysisTaskMaterial::AliAnalysisTaskMaterial(const char *name) : AliAnalysisTaskSE(name),
80 fConversionGammas(NULL),
81 fConversionCuts(NULL),
85 fAllMCGammaList(NULL),
86 fAllMCConvGammaList(NULL),
88 fTreeMaterialRec(NULL),
89 fTreeMaterialAllGamma(NULL),
90 fTreeMaterialConvGamma(NULL),
94 fNESDtracksEta0914(0),
99 fGammaMCConvTheta(0.),
101 fMCConvDaughterProp(4),
113 // Default constructor
116 DefineInput(0, TChain::Class());
117 DefineOutput(1, TList::Class());
120 //________________________________________________________________________
121 AliAnalysisTaskMaterial::~AliAnalysisTaskMaterial()
123 // default deconstructor
125 //________________________________________________________________________
126 void AliAnalysisTaskMaterial::UserCreateOutputObjects()
128 // Create User Output Objects
130 if(fOutputList != NULL){
134 if(fOutputList == NULL){
135 fOutputList = new TList();
136 fOutputList->SetOwner(kTRUE);
139 fEventList = new TList();
140 fEventList->SetName("EventList");
141 fEventList->SetOwner(kTRUE);
142 fOutputList->Add(fEventList);
144 fTreeEvent = new TTree("Event","Event");
145 fTreeEvent->Branch("primVtxZ",&fPrimVtxZ,"fPrimVtxZ/F");
146 fTreeEvent->Branch("nContrVtx",&fNContrVtx,"fNContrVtx/I");
147 fTreeEvent->Branch("nGoodTracksEta09",&fNESDtracksEta09,"fNESDtracksEta09/I");
148 fTreeEvent->Branch("nGoodTracksEta0914",&fNESDtracksEta0914,"fNESDtracksEta0914/I");
149 fTreeEvent->Branch("nGoodTracksEta14",&fNESDtracksEta14,"fNESDtracksEta14/I");
150 fEventList->Add(fTreeEvent);
152 fRecGammaList= new TList();
153 fRecGammaList->SetName("RecGammaList");
154 fRecGammaList->SetOwner(kTRUE);
155 fOutputList->Add(fRecGammaList);
157 fTreeMaterialRec = new TTree("ConvPointRec","ConvPointRec");
158 fTreeMaterialRec->Branch("recCords",&fRecCords);
159 fTreeMaterialRec->Branch("daughterProp",&fDaughterProp);
160 fTreeMaterialRec->Branch("pt",&fGammaPt,"fGammaPt/F");
161 fTreeMaterialRec->Branch("theta",&fGammaTheta,"fGammaTheta/F");
162 fTreeMaterialRec->Branch("chi2ndf",&fGammaChi2NDF,"fGammaChi2NDF/F");
164 fTreeMaterialRec->Branch("kind",&fKind,"fKind/b");
166 fRecGammaList->Add(fTreeMaterialRec);
169 fAllMCGammaList = new TList();
170 fAllMCGammaList->SetName("AllMCGammaList");
171 fAllMCGammaList->SetOwner(kTRUE);
172 fOutputList->Add(fAllMCGammaList);
174 fTreeMaterialAllGamma = new TTree("AllGamma","AllGamma");
175 fTreeMaterialAllGamma->Branch("pt",&fGammaMCPt,"fGammaMCPt/F");
176 fTreeMaterialAllGamma->Branch("theta",&fGammaMCTheta,"fGammaMCTheta/F");
177 fAllMCGammaList->Add(fTreeMaterialAllGamma);
179 fAllMCConvGammaList = new TList();
180 fAllMCConvGammaList->SetName("AllMCGammaConvList");
181 fAllMCConvGammaList->SetOwner(kTRUE);
182 fOutputList->Add(fAllMCConvGammaList);
184 // fMCConvCords = new Float_t[5];
185 // fMCConvDaughterProp = new Float_t[4];
188 fTreeMaterialConvGamma = new TTree("ConvGammaMC","ConvGammaMC");
189 fTreeMaterialConvGamma->Branch("Cords",&fMCConvCords);
190 fTreeMaterialConvGamma->Branch("daughterProp",&fMCConvDaughterProp);
191 fTreeMaterialConvGamma->Branch("Pt",&fGammaMCConvPt,"fGammaMCConvPt/F");
192 fTreeMaterialConvGamma->Branch("Theta",&fGammaMCConvTheta,"fGammaMCConvTheta/F");
193 fAllMCConvGammaList->Add(fTreeMaterialConvGamma);
196 PostData(1, fOutputList);
200 //________________________________________________________________________
201 void AliAnalysisTaskMaterial::UserExec(Option_t *){
203 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
205 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
206 if(eventQuality != 0){// Event Not Accepted
209 fESDEvent = (AliESDEvent*) InputEvent();
210 if (fESDEvent==NULL) return;
212 fMCEvent = MCEvent();
216 // Process MC Particle
217 if(fConversionCuts->GetSignalRejection() != 0){
218 // if(fESDEvent->IsA()==AliESDEvent::Class()){
219 fConversionCuts->GetNotRejectedParticles( fConversionCuts->GetSignalRejection(),
220 fConversionCuts->GetAcceptedHeader(),
223 // else if(fInputEvent->IsA()==AliAODEvent::Class()){
224 // fConversionCuts->GetNotRejectedParticles( fConversionCuts->GetSignalRejection(),
225 // fConversionCuts->GetAcceptedHeader(),
231 if(fIsHeavyIon > 0 && !fConversionCuts->IsCentralitySelected(fESDEvent)) return;
232 fNESDtracksEta09 = CountTracks09(); // Estimate Event Multiplicity
233 fNESDtracksEta0914 = CountTracks0914(); // Estimate Event Multiplicity
234 fNESDtracksEta14 = fNESDtracksEta09 + fNESDtracksEta0914;
236 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
237 fNContrVtx = fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
241 // else if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
242 // if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
243 // fNContrVtx = fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
244 // } else if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
249 fPrimVtxZ = fESDEvent->GetPrimaryVertex()->GetZ();
251 if (fIsHeavyIon == 2){
252 if (!(fNESDtracksEta09 > 20 && fNESDtracksEta09 < 80)) return;
260 fConversionGammas=fV0Reader->GetReconstructedGammas();
265 PostData(1, fOutputList);
268 ///________________________________________________________________________
269 void AliAnalysisTaskMaterial::FillMCTree(Int_t stackPos){
270 AliStack *MCStack = fMCEvent->Stack();
271 TParticle* candidate = (TParticle *)MCStack->Particle(stackPos);
273 if(fConversionCuts->PhotonIsSelectedMC(candidate,MCStack,kFALSE)){
274 fGammaMCPt = candidate->Pt();
275 fGammaMCTheta = candidate->Theta();
276 if (fTreeMaterialAllGamma){
277 fTreeMaterialAllGamma->Fill();
280 if(fConversionCuts->PhotonIsSelectedMC(candidate,MCStack,kTRUE)){
281 fGammaMCConvPt = candidate->Pt();
282 fGammaMCConvTheta = candidate->Theta();
283 TParticle* daughter1 = (TParticle *)MCStack->Particle(candidate->GetFirstDaughter());
284 TParticle* daughter2 = (TParticle *)MCStack->Particle(candidate->GetLastDaughter());
285 fMCConvCords(0) = (Float_t)daughter1->Vx();
286 fMCConvCords(1) = (Float_t)daughter1->Vy();
287 fMCConvCords(2) = (Float_t)daughter1->Vz();
288 fMCConvCords(3) = (Float_t)daughter1->R();
289 fMCConvCords(4) = (Float_t)daughter1->Phi();
291 fMCConvDaughterProp(0) = (Float_t)daughter1->Pt();
292 fMCConvDaughterProp(1) = (Float_t)daughter1->Theta();
293 fMCConvDaughterProp(2) = (Float_t)daughter2->Pt();
294 fMCConvDaughterProp(3) = (Float_t)daughter2->Theta();
296 if (fTreeMaterialConvGamma){
297 fTreeMaterialConvGamma->Fill();
299 } // Converted MC Gamma
302 ///________________________________________________________________________
303 void AliAnalysisTaskMaterial::ProcessMCPhotons(){
304 // Loop over all primary MC particle
305 AliStack *ffMCStack = fMCEvent->Stack();
306 for(Int_t i = 0; i < ffMCStack->GetNprimary(); i++) {
307 TParticle* particle = (TParticle *)ffMCStack->Particle(i);
308 if (!particle) continue;
309 Int_t isMCFromMBHeader = -1;
310 if(fConversionCuts->GetSignalRejection() != 0){
312 = fConversionCuts->IsParticleFromBGEvent(i, ffMCStack, fESDEvent);
313 if(isMCFromMBHeader == 0) continue;
315 if (particle->GetPdgCode() == 111 && particle->GetFirstDaughter() >= ffMCStack->GetNprimary()){
316 // cout << "Undecayed pi0 found with mother: " << particle->GetMother(0) << endl;
317 for (Int_t j = 0; j < 2 ; j++){
318 FillMCTree(particle->GetDaughter(j));
326 ///________________________________________________________________________
327 void AliAnalysisTaskMaterial::ProcessPhotons(){
329 // Fill Histograms for QA and MC
330 for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
331 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
332 if (gamma ==NULL) continue;
333 if(!fConversionCuts->PhotonIsSelected(gamma,fESDEvent)) continue;
335 fGammaPt = gamma->GetPhotonPt();
336 fGammaTheta = gamma->GetPhotonTheta();
337 fGammaChi2NDF = gamma->GetChi2perNDF();
338 fRecCords(0) = (Float_t)gamma->GetConversionX();
339 fRecCords(1) = (Float_t)gamma->GetConversionY();
340 fRecCords(2) = (Float_t)gamma->GetConversionZ();
341 fRecCords(3) = (Float_t)gamma->GetConversionRadius();
342 fRecCords(4) = (Float_t)gamma->GetPhotonPhi();
344 AliESDtrack * negTrack = fConversionCuts->GetESDTrack(fESDEvent, gamma->GetTrackLabelNegative());
345 AliESDtrack * posTrack = fConversionCuts->GetESDTrack(fESDEvent, gamma->GetTrackLabelPositive());
346 fDaughterProp(0) = (Float_t)posTrack->Pt();
347 fDaughterProp(1) = (Float_t)posTrack->Theta();
348 fDaughterProp(2) = (Float_t)negTrack->Pt();
349 fDaughterProp(3) = (Float_t)negTrack->Theta();
354 // cout << "generating MC stack"<< endl;
355 AliStack *fMCStack = fMCEvent->Stack();
356 if (!fMCStack) continue;
357 TParticle *posDaughter = gamma->GetPositiveMCDaughter(fMCStack);
358 TParticle *negDaughter = gamma->GetNegativeMCDaughter(fMCStack);
359 // cout << "generate Daughters: "<<posDaughter << "\t" << negDaughter << endl;
361 if(fMCStack && fConversionCuts->GetSignalRejection() != 0){
362 Int_t isPosFromMBHeader
363 = fConversionCuts->IsParticleFromBGEvent(gamma->GetMCLabelPositive(), fMCStack, fESDEvent);
364 Int_t isNegFromMBHeader
365 = fConversionCuts->IsParticleFromBGEvent(gamma->GetMCLabelNegative(), fMCStack, fESDEvent);
366 if( (isNegFromMBHeader < 1) || (isPosFromMBHeader < 1)) continue;
369 if(posDaughter == NULL || negDaughter == NULL){
370 fKind = 9; // garbage
371 // cout << "one of the daughters not available" << endl;
372 } else if(posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)){
373 // Not Same Mother == Combinatorial Bck
375 // cout << "not the same mother" << endl;
377 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
379 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
380 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
381 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11)
382 fKind = 10; //Electron Combinatorial
383 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11 && (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1))
384 fKind = 15; //direct Electron Combinatorial
386 if(TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==211)
387 fKind = 11; //Pion Combinatorial
388 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==2212) ||
389 (TMath::Abs(pdgCodePos)==2212 && TMath::Abs(pdgCodeNeg)==211))
390 fKind = 12; //Pion, Proton Combinatorics
391 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==11) ||
392 (TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==211))
393 fKind = 13; //Pion, Electron Combinatorics
394 if (TMath::Abs(pdgCodePos)==321 || TMath::Abs(pdgCodeNeg)==321)
395 fKind = 14; //Kaon combinatorics
398 // cout << "same mother" << endl;
400 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
402 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
403 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
405 if (gamma->GetMCParticle(fMCStack)->GetPdgCode()) pdgCode = gamma->GetMCParticle(fMCStack)->GetPdgCode(); else continue;
406 // cout << "PDG code: " << pdgCode << endl;
407 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11)
408 fKind = 2; // combinatorics from hadronic decays
409 else if ( !(pdgCodeNeg==pdgCodePos)){
410 TParticle *truePhotonCanditate = gamma->GetMCParticle(fMCStack);
411 Int_t motherLabelPhoton = truePhotonCanditate->GetMother(0);
413 fKind = 3; // pi0 Dalitz
414 else if (pdgCode == 221)
415 fKind = 4; // eta Dalitz
416 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
417 if(pdgCode == 22 && motherLabelPhoton < fMCStack->GetNprimary()){
418 fKind = 0; // primary photons
419 } else if (pdgCode == 22){
420 fKind = 5; //secondary photons
422 } else fKind = 9; //garbage
423 } else fKind = 9; //garbage
426 if (fTreeMaterialRec){
427 fTreeMaterialRec->Fill();
432 //________________________________________________________________________
433 Int_t AliAnalysisTaskMaterial::CountTracks09(){
434 Int_t fNumberOfESDTracks = 0;
435 if(fInputEvent->IsA()==AliESDEvent::Class()){
436 // Using standard function for setting Cuts
438 AliStack *fMCStack = NULL;
440 fMCStack= fMCEvent->Stack();
441 if (!fMCStack) return 0;
444 Bool_t selectPrimaries=kTRUE;
445 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
446 EsdTrackCuts->SetMaxDCAToVertexZ(2);
447 EsdTrackCuts->SetEtaRange(-0.9, 0.9);
448 EsdTrackCuts->SetPtRange(0.15);
450 for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
451 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
452 if(!curTrack) continue;
453 if(EsdTrackCuts->AcceptTrack(curTrack) ){
455 if(fMCStack && fConversionCuts->GetSignalRejection() != 0){
457 = fConversionCuts->IsParticleFromBGEvent(abs(curTrack->GetLabel()), fMCStack, fESDEvent);
458 if( (isFromMBHeader < 1) ) continue;
461 fNumberOfESDTracks++;
466 } else if(fInputEvent->IsA()==AliAODEvent::Class()){
467 for(Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
468 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
469 if(!curTrack->IsPrimaryCandidate()) continue;
470 if(abs(curTrack->Eta())>0.9) continue;
471 if(curTrack->Pt()<0.15) continue;
472 if(abs(curTrack->ZAtDCA())>2) continue;
473 fNumberOfESDTracks++;
477 return fNumberOfESDTracks;
480 //________________________________________________________________________
481 Int_t AliAnalysisTaskMaterial::CountTracks0914(){
482 Int_t fNumberOfESDTracks = 0;
483 if(fInputEvent->IsA()==AliESDEvent::Class()){
484 // Using standard function for setting Cuts
486 AliStack *fMCStack = NULL;
488 fMCStack= fMCEvent->Stack();
489 if (!fMCStack) return 0;
492 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
493 EsdTrackCuts->SetMaxDCAToVertexZ(5);
494 EsdTrackCuts->SetEtaRange(0.9, 1.4);
495 EsdTrackCuts->SetPtRange(0.15);
497 for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
498 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
499 if(!curTrack) continue;
500 if(EsdTrackCuts->AcceptTrack(curTrack) ){
502 if(fMCStack && fConversionCuts->GetSignalRejection() != 0){
504 = fConversionCuts->IsParticleFromBGEvent(abs(curTrack->GetLabel()), fMCStack, fESDEvent);
505 if( (isFromMBHeader < 1) ) continue;
508 fNumberOfESDTracks++;
511 EsdTrackCuts->SetEtaRange(-1.4, -0.9);
512 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
513 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
514 if(!curTrack) continue;
515 if(EsdTrackCuts->AcceptTrack(curTrack) ){
517 if(fMCStack && fConversionCuts->GetSignalRejection() != 0){
519 = fConversionCuts->IsParticleFromBGEvent(abs(curTrack->GetLabel()), fMCStack, fESDEvent);
520 if( (isFromMBHeader < 1) ) continue;
523 fNumberOfESDTracks++;
528 } else if(fInputEvent->IsA()==AliAODEvent::Class()){
529 for(Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
530 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
531 if(abs(curTrack->Eta())<0.9 || abs(curTrack->Eta())>1.4 ) continue;
532 if(curTrack->Pt()<0.15) continue;
533 if(abs(curTrack->ZAtDCA())>5) continue;
534 fNumberOfESDTracks++;
538 return fNumberOfESDTracks;
541 //________________________________________________________________________
542 void AliAnalysisTaskMaterial::Terminate(Option_t *)
544 // if (fStreamMaterial){
545 // fStreamMaterial->GetFile()->Write();