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);
158 fTreeMaterialRec = new TTree("ConvPointRec","ConvPointRec");
159 fTreeMaterialRec->Branch("recCords",&fRecCords);
160 fTreeMaterialRec->Branch("daughterProp",&fDaughterProp);
161 fTreeMaterialRec->Branch("pt",&fGammaPt,"fGammaPt/F");
162 fTreeMaterialRec->Branch("theta",&fGammaTheta,"fGammaTheta/F");
163 fTreeMaterialRec->Branch("chi2ndf",&fGammaChi2NDF,"fGammaChi2NDF/F");
165 fTreeMaterialRec->Branch("kind",&fKind,"fKind/b");
167 fRecGammaList->Add(fTreeMaterialRec);
170 fAllMCGammaList = new TList();
171 fAllMCGammaList->SetName("AllMCGammaList");
172 fAllMCGammaList->SetOwner(kTRUE);
173 fOutputList->Add(fAllMCGammaList);
175 fTreeMaterialAllGamma = new TTree("AllGamma","AllGamma");
176 fTreeMaterialAllGamma->Branch("pt",&fGammaMCPt,"fGammaMCPt/F");
177 fTreeMaterialAllGamma->Branch("theta",&fGammaMCTheta,"fGammaMCTheta/F");
178 fAllMCGammaList->Add(fTreeMaterialAllGamma);
180 fAllMCConvGammaList = new TList();
181 fAllMCConvGammaList->SetName("AllMCGammaConvList");
182 fAllMCConvGammaList->SetOwner(kTRUE);
183 fOutputList->Add(fAllMCConvGammaList);
185 // fMCConvCords = new Float_t[5];
186 // fMCConvDaughterProp = new Float_t[4];
189 fTreeMaterialConvGamma = new TTree("ConvGammaMC","ConvGammaMC");
190 fTreeMaterialConvGamma->Branch("Cords",&fMCConvCords);
191 fTreeMaterialConvGamma->Branch("daughterProp",&fMCConvDaughterProp);
192 fTreeMaterialConvGamma->Branch("Pt",&fGammaMCConvPt,"fGammaMCConvPt/F");
193 fTreeMaterialConvGamma->Branch("Theta",&fGammaMCConvTheta,"fGammaMCConvTheta/F");
194 fAllMCConvGammaList->Add(fTreeMaterialConvGamma);
198 TString cutnumber = fConversionCuts->GetCutNumber();
199 PostData(1, fOutputList);
203 //________________________________________________________________________
204 void AliAnalysisTaskMaterial::UserExec(Option_t *){
206 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
208 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
209 if(eventQuality != 0){// Event Not Accepted
212 fESDEvent = (AliESDEvent*) InputEvent();
213 if (fESDEvent==NULL) return;
214 if(fIsHeavyIon && !fConversionCuts->IsCentralitySelected(fESDEvent)) return;
215 fNESDtracksEta09 = CountTracks09(); // Estimate Event Multiplicity
216 fNESDtracksEta0914 = CountTracks0914(); // Estimate Event Multiplicity
217 fNESDtracksEta14 = fNESDtracksEta09 + fNESDtracksEta0914;
219 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
220 fNContrVtx = fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
221 } else if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
222 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
223 fNContrVtx = fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
224 } else if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
229 fPrimVtxZ = fESDEvent->GetPrimaryVertex()->GetZ();
235 fConversionGammas=fV0Reader->GetReconstructedGammas();
237 fMCEvent = MCEvent();
243 PostData(1, fOutputList);
246 ///________________________________________________________________________
247 void AliAnalysisTaskMaterial::FillMCTree(Int_t stackPos){
248 AliStack *MCStack = fMCEvent->Stack();
249 TParticle* candidate = (TParticle *)MCStack->Particle(stackPos);
250 if(fConversionCuts->PhotonIsSelectedMC(candidate,MCStack,kFALSE)){
251 fGammaMCPt = candidate->Pt();
252 fGammaMCTheta = candidate->Theta();
253 if (fTreeMaterialAllGamma){
254 fTreeMaterialAllGamma->Fill();
257 if(fConversionCuts->PhotonIsSelectedMC(candidate,MCStack,kTRUE)){
258 fGammaMCConvPt = candidate->Pt();
259 fGammaMCConvTheta = candidate->Theta();
260 TParticle* daughter1 = (TParticle *)MCStack->Particle(candidate->GetFirstDaughter());
261 TParticle* daughter2 = (TParticle *)MCStack->Particle(candidate->GetLastDaughter());
262 fMCConvCords(0) = (Float_t)daughter1->Vx();
263 fMCConvCords(1) = (Float_t)daughter1->Vy();
264 fMCConvCords(2) = (Float_t)daughter1->Vz();
265 fMCConvCords(3) = (Float_t)daughter1->R();
266 fMCConvCords(4) = (Float_t)daughter1->Phi();
268 fMCConvDaughterProp(0) = (Float_t)daughter1->Pt();
269 fMCConvDaughterProp(1) = (Float_t)daughter1->Theta();
270 fMCConvDaughterProp(2) = (Float_t)daughter2->Pt();
271 fMCConvDaughterProp(3) = (Float_t)daughter2->Theta();
273 if (fTreeMaterialConvGamma){
274 fTreeMaterialConvGamma->Fill();
276 } // Converted MC Gamma
279 ///________________________________________________________________________
280 void AliAnalysisTaskMaterial::ProcessMCPhotons(){
281 // Loop over all primary MC particle
282 AliStack *ffMCStack = fMCEvent->Stack();
283 for(Int_t i = 0; i < ffMCStack->GetNprimary(); i++) {
284 TParticle* particle = (TParticle *)ffMCStack->Particle(i);
285 if (!particle) continue;
286 if (particle->GetPdgCode() == 111 && particle->GetFirstDaughter() >= ffMCStack->GetNprimary()){
287 // cout << "Undecayed pi0 found with mother: " << particle->GetMother(0) << endl;
288 for (Int_t j = 0; j < 2 ; j++){
289 FillMCTree(particle->GetDaughter(j));
297 ///________________________________________________________________________
298 void AliAnalysisTaskMaterial::ProcessPhotons(){
300 // Fill Histograms for QA and MC
301 for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
302 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
303 if (gamma ==NULL) continue;
304 if(!fConversionCuts->PhotonIsSelected(gamma,fESDEvent)) continue;
306 fGammaPt = gamma->GetPhotonPt();
307 fGammaTheta = gamma->GetPhotonTheta();
308 fGammaChi2NDF = gamma->GetChi2perNDF();
309 fRecCords(0) = (Float_t)gamma->GetConversionX();
310 fRecCords(1) = (Float_t)gamma->GetConversionY();
311 fRecCords(2) = (Float_t)gamma->GetConversionZ();
312 fRecCords(3) = (Float_t)gamma->GetConversionRadius();
313 fRecCords(4) = (Float_t)gamma->GetPhotonPhi();
315 AliESDtrack * negTrack = fConversionCuts->GetESDTrack(fESDEvent, gamma->GetTrackLabelNegative());
316 AliESDtrack * posTrack = fConversionCuts->GetESDTrack(fESDEvent, gamma->GetTrackLabelPositive());
317 fDaughterProp(0) = (Float_t)posTrack->Pt();
318 fDaughterProp(1) = (Float_t)posTrack->Theta();
319 fDaughterProp(2) = (Float_t)negTrack->Pt();
320 fDaughterProp(3) = (Float_t)negTrack->Theta();
325 // cout << "generating MC stack"<< endl;
326 AliStack *fMCStack = fMCEvent->Stack();
327 if (!fMCStack) continue;
328 TParticle *posDaughter = gamma->GetPositiveMCDaughter(fMCStack);
329 TParticle *negDaughter = gamma->GetNegativeMCDaughter(fMCStack);
330 // cout << "generate Daughters: "<<posDaughter << "\t" << negDaughter << endl;
332 if(posDaughter == NULL || negDaughter == NULL){
333 fKind = 9; // garbage
334 // cout << "one of the daughters not available" << endl;
335 } else if(posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)){
336 // Not Same Mother == Combinatorial Bck
338 // cout << "not the same mother" << endl;
340 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
342 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
343 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
344 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11)
345 fKind = 10; //Electron Combinatorial
346 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11 && (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1))
347 fKind = 15; //direct Electron Combinatorial
349 if(TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==211)
350 fKind = 11; //Pion Combinatorial
351 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==2212) ||
352 (TMath::Abs(pdgCodePos)==2212 && TMath::Abs(pdgCodeNeg)==211))
353 fKind = 12; //Pion, Proton Combinatorics
354 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==11) ||
355 (TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==211))
356 fKind = 13; //Pion, Electron Combinatorics
357 if (TMath::Abs(pdgCodePos)==321 || TMath::Abs(pdgCodeNeg)==321)
358 fKind = 14; //Kaon combinatorics
361 // cout << "same mother" << endl;
363 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
365 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
366 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
368 if (gamma->GetMCParticle(fMCStack)->GetPdgCode()) pdgCode = gamma->GetMCParticle(fMCStack)->GetPdgCode(); else continue;
369 // cout << "PDG code: " << pdgCode << endl;
370 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11)
371 fKind = 2; // combinatorics from hadronic decays
372 else if ( !(pdgCodeNeg==pdgCodePos)){
373 TParticle *truePhotonCanditate = gamma->GetMCParticle(fMCStack);
374 Int_t motherLabelPhoton = truePhotonCanditate->GetMother(0);
376 fKind = 3; // pi0 Dalitz
377 else if (pdgCode == 221)
378 fKind = 4; // eta Dalitz
379 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
380 if(pdgCode == 22 && motherLabelPhoton < fMCStack->GetNprimary()){
381 fKind = 0; // primary photons
382 } else if (pdgCode == 22){
383 fKind = 5; //secondary photons
385 } else fKind = 9; //garbage
386 } else fKind = 9; //garbage
389 if (fTreeMaterialRec){
390 fTreeMaterialRec->Fill();
395 //________________________________________________________________________
396 Int_t AliAnalysisTaskMaterial::CountTracks09(){
397 Int_t fNumberOfESDTracks = 0;
398 if(fInputEvent->IsA()==AliESDEvent::Class()){
399 // Using standard function for setting Cuts
400 Bool_t selectPrimaries=kTRUE;
401 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
402 EsdTrackCuts->SetMaxDCAToVertexZ(2);
403 EsdTrackCuts->SetEtaRange(-0.9, 0.9);
404 EsdTrackCuts->SetPtRange(0.15);
406 for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
407 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
408 if(!curTrack) continue;
409 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
414 else if(fInputEvent->IsA()==AliAODEvent::Class()){
415 for(Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
416 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
417 if(!curTrack->IsPrimaryCandidate()) continue;
418 if(abs(curTrack->Eta())>0.9) continue;
419 if(curTrack->Pt()<0.15) continue;
420 if(abs(curTrack->ZAtDCA())>2) continue;
421 fNumberOfESDTracks++;
425 return fNumberOfESDTracks;
428 Int_t AliAnalysisTaskMaterial::CountTracks0914(){
430 Int_t fNumberOfESDTracks = 0;
431 if(fInputEvent->IsA()==AliESDEvent::Class()){
432 // Using standard function for setting Cuts
433 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
434 EsdTrackCuts->SetMaxDCAToVertexZ(5);
435 EsdTrackCuts->SetEtaRange(0.9, 1.4);
436 EsdTrackCuts->SetPtRange(0.15);
438 for(Int_t iTracks = 0; iTracks < fInputEvent->GetNumberOfTracks(); iTracks++){
439 AliESDtrack* curTrack = (AliESDtrack*) fInputEvent->GetTrack(iTracks);
440 if(!curTrack) continue;
441 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
443 EsdTrackCuts->SetEtaRange(-1.4, -0.9);
444 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
445 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
446 if(!curTrack) continue;
447 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
452 else if(fInputEvent->IsA()==AliAODEvent::Class()){
453 for(Int_t iTracks = 0; iTracks<fInputEvent->GetNumberOfTracks(); iTracks++){
454 AliAODTrack* curTrack = (AliAODTrack*) fInputEvent->GetTrack(iTracks);
455 if(abs(curTrack->Eta())<0.9 || abs(curTrack->Eta())>1.4 ) continue;
456 if(curTrack->Pt()<0.15) continue;
457 if(abs(curTrack->ZAtDCA())>5) continue;
458 fNumberOfESDTracks++;
462 return fNumberOfESDTracks;
465 //________________________________________________________________________
466 void AliAnalysisTaskMaterial::Terminate(Option_t *)
468 // if (fStreamMaterial){
469 // fStreamMaterial->GetFile()->Write();