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 //________________________________________________________________________
38 AliAnalysisTaskMaterial::AliAnalysisTaskMaterial(const char *name) : AliAnalysisTaskSE(name),
40 fConversionGammas(NULL),
41 fConversionCuts(NULL),
42 fStreamMaterial(NULL),
43 fStreamResolution(NULL),
49 // Default constructor
51 DefineInput(0, TChain::Class());
52 DefineOutput(1, TList::Class());
55 //________________________________________________________________________
56 AliAnalysisTaskMaterial::~AliAnalysisTaskMaterial()
58 // default deconstructor
60 delete fStreamMaterial;
61 fStreamMaterial = 0x0;
63 if(fStreamResolution){
64 delete fStreamResolution;
65 fStreamResolution = 0x0;
68 //________________________________________________________________________
69 void AliAnalysisTaskMaterial::UserCreateOutputObjects()
71 // Create User Output Objects
73 if(fOutputList != NULL){
77 if(fOutputList == NULL){
78 fOutputList = new TList();
79 fOutputList->SetOwner(kTRUE);
83 TString cutnumber = fConversionCuts->GetCutNumber();
85 fStreamMaterial = new TTreeSRedirector(Form("GammaConvV1_Material_%s.root",cutnumber.Data()),"recreate");
86 fStreamResolution = new TTreeSRedirector(Form("GammaConvV1_Resolution_%s.root",cutnumber.Data()),"recreate");
87 PostData(1, fOutputList);
90 //________________________________________________________________________
91 void AliAnalysisTaskMaterial::UserExec(Option_t *){
93 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
95 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
96 if(eventQuality != 0){// Event Not Accepted
99 fESDEvent = (AliESDEvent*) InputEvent();
100 if (fESDEvent==NULL) return;
101 if(fIsHeavyIon && !fConversionCuts->IsCentralitySelected(fESDEvent)) return;
102 Int_t nESDtracksEta09 = CountESDTracks09(); // Estimate Event Multiplicity
103 Int_t nESDtracksEta0914 = CountESDTracks0914(); // Estimate Event Multiplicity
104 // Int_t nESDtracksEta14 = CountESDTracks14(); // Estimate Event Multiplicity
105 Int_t nESDtracksEta14; // Estimate Event Multiplicity
106 nESDtracksEta14= nESDtracksEta09 + nESDtracksEta0914;
109 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
110 nContrVtx = fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
111 } else if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
112 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
113 nContrVtx = fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
115 } else if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
120 Float_t primVtxZ = fESDEvent->GetPrimaryVertex()->GetZ();
122 if (fStreamMaterial){
123 (*fStreamMaterial)<<"Event"
124 << "primVtxZ=" << primVtxZ
125 << "nContrVtx=" << nContrVtx
126 << "nGoodTracksEta09=" << nESDtracksEta09
127 << "nGoodTracksEta0914=" << nESDtracksEta0914
128 << "nGoodTracksEta14=" << nESDtracksEta14
132 fConversionGammas=fV0Reader->GetReconstructedGammas();
134 fMCEvent = MCEvent();
140 PostData(1, fOutputList);
143 ///________________________________________________________________________
144 void AliAnalysisTaskMaterial::FillMCTree(Int_t stackPos){
145 AliStack *MCStack = fMCEvent->Stack();
146 TParticle* candidate = (TParticle *)MCStack->Particle(stackPos);
147 if(fConversionCuts->PhotonIsSelectedMC(candidate,MCStack,kFALSE)){
148 Float_t gammaPt = candidate->Pt();
149 Float_t gammaTheta = candidate->Theta();
150 if (fStreamMaterial){
151 (*fStreamMaterial)<<"AllGamma"
154 << "theta=" << gammaTheta
158 if(fConversionCuts->PhotonIsSelectedMC(candidate,MCStack,kTRUE)){
159 Float_t gammaPt = candidate->Pt();
160 Float_t gammaTheta = candidate->Theta();
161 TParticle* daughter1 = (TParticle *)MCStack->Particle(candidate->GetFirstDaughter());
162 TParticle* daughter2 = (TParticle *)MCStack->Particle(candidate->GetLastDaughter());
164 coord(0) = daughter1->Vx();
165 coord(1) = daughter1->Vy();
166 coord(2) = daughter1->Vz();
167 coord(3) = daughter1->R();
168 coord(4) = candidate->Phi();
169 TVectorF daughterProp(4);
170 if (daughter1-> GetPdgCode() < 0){
171 daughterProp(0) = daughter2->Pt();
172 daughterProp(1) = daughter2->Theta();
173 daughterProp(2) = daughter1->Pt();
174 daughterProp(3) = daughter1->Theta();
176 daughterProp(0) = daughter1->Pt();
177 daughterProp(1) = daughter1->Theta();
178 daughterProp(2) = daughter2->Pt();
179 daughterProp(3) = daughter2->Theta();
181 if (fStreamMaterial){
182 (*fStreamMaterial)<<"ConvGammaMC"
185 << "theta=" << gammaTheta
186 << "coord.=" << &coord
187 << "daughterProp.=" << &daughterProp
190 } // Converted MC Gamma
193 ///________________________________________________________________________
194 void AliAnalysisTaskMaterial::ProcessMCPhotons(){
195 // Loop over all primary MC particle
196 AliStack *ffMCStack = fMCEvent->Stack();
197 for(Int_t i = 0; i < ffMCStack->GetNprimary(); i++) {
198 TParticle* particle = (TParticle *)ffMCStack->Particle(i);
199 if (!particle) continue;
200 if (particle->GetPdgCode() == 111 && particle->GetFirstDaughter() >= ffMCStack->GetNprimary()){
201 // cout << "Undecayed pi0 found with mother: " << particle->GetMother(0) << endl;
202 for (Int_t j = 0; j < 2 ; j++){
203 FillMCTree(particle->GetDaughter(j));
211 ///________________________________________________________________________
212 void AliAnalysisTaskMaterial::ProcessPhotons(){
214 // Fill Histograms for QA and MC
215 for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
216 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
217 if (gamma ==NULL) continue;
218 if(!fConversionCuts->PhotonIsSelected(gamma,fESDEvent)) continue;
219 // cout << "i= " <<firstGammaIndex << " of "<< fConversionGammas->GetEntriesFast() << endl;
220 Float_t gammaPt = gamma->GetPhotonPt();
221 // Float_t gammaP = gamma->GetPhotonP();
222 Float_t gammaTheta = gamma->GetPhotonTheta();
223 Float_t gammaEta = gamma->GetPhotonEta();
224 Float_t gammaChi2NDF = gamma->GetChi2perNDF();
225 // Float_t gammaX = gamma->GetConversionX();
226 // Float_t gammaY = gamma->GetConversionY();
227 Float_t gammaZ = gamma->GetConversionZ();
228 Float_t gammaR = gamma->GetConversionRadius();
229 Float_t gammaPhi = gamma->GetPhotonPhi();
232 coord(0) = gamma->GetConversionX();
233 coord(1) = gamma->GetConversionY();
234 coord(2) = gamma->GetConversionZ();
235 coord(3) = gamma->GetConversionRadius();
236 coord(4) = gamma->GetPhotonPhi();
237 TVectorF daughterProp(4);
238 AliESDtrack * negTrack = fConversionCuts->GetESDTrack(fESDEvent, gamma->GetTrackLabelNegative());
239 AliESDtrack * posTrack = fConversionCuts->GetESDTrack(fESDEvent, gamma->GetTrackLabelPositive());
240 daughterProp(0) = posTrack->Pt();
241 daughterProp(1) = posTrack->Theta();
242 daughterProp(2) = negTrack->Pt();
243 daughterProp(3) = negTrack->Theta();
247 // cout << "generating MC stack"<< endl;
248 AliStack *fMCStack = fMCEvent->Stack();
249 if (!fMCStack) continue;
250 TParticle *posDaughter = gamma->GetPositiveMCDaughter(fMCStack);
251 TParticle *negDaughter = gamma->GetNegativeMCDaughter(fMCStack);
252 // cout << "generate Daughters: "<<posDaughter << "\t" << negDaughter << endl;
254 if(posDaughter == NULL || negDaughter == NULL){
256 // cout << "one of the daughters not available" << endl;
257 } else if(posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)){
258 // Not Same Mother == Combinatorial Bck
260 // cout << "not the same mother" << endl;
262 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
264 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
265 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
266 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11)
267 kind = 10; //Electron Combinatorial
268 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11 && (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1))
269 kind = 15; //direct Electron Combinatorial
271 if(TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==211)
272 kind = 11; //Pion Combinatorial
273 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==2212) ||
274 (TMath::Abs(pdgCodePos)==2212 && TMath::Abs(pdgCodeNeg)==211))
275 kind = 12; //Pion, Proton Combinatorics
276 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==11) ||
277 (TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==211))
278 kind = 13; //Pion, Electron Combinatorics
279 if (TMath::Abs(pdgCodePos)==321 || TMath::Abs(pdgCodeNeg)==321)
280 kind = 14; //Kaon combinatorics
283 // cout << "same mother" << endl;
285 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
287 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
288 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
290 if (gamma->GetMCParticle(fMCStack)->GetPdgCode()) pdgCode = gamma->GetMCParticle(fMCStack)->GetPdgCode(); else continue;
291 // cout << "PDG code: " << pdgCode << endl;
292 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11)
293 kind = 2; // combinatorics from hadronic decays
294 else if ( !(pdgCodeNeg==pdgCodePos)){
295 TParticle *truePhotonCanditate = gamma->GetMCParticle(fMCStack);
296 Int_t motherLabelPhoton = truePhotonCanditate->GetMother(0);
298 kind = 3; // pi0 Dalitz
299 else if (pdgCode == 221)
300 kind = 4; // eta Dalitz
301 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
302 if(pdgCode == 22 && motherLabelPhoton < fMCStack->GetNprimary()){
303 kind = 0; // primary photons
304 } else if (pdgCode == 22){
305 kind = 5; //secondary photons
308 Float_t mcPt = truePhotonCanditate->Pt();
309 Float_t mcR = gamma->GetNegativeMCDaughter(fMCStack)->R();
310 Float_t mcZ = gamma->GetNegativeMCDaughter(fMCStack)->Vz();
311 Float_t mcPhi = gamma->GetNegativeMCDaughter(fMCStack)->Phi();
312 Float_t mcEta = gamma->GetNegativeMCDaughter(fMCStack)->Eta();
313 if (fStreamResolution){
314 (*fStreamResolution)<<"Resolution"
315 << "ESDpt=" << gammaPt
316 << "ESDphi=" << gammaPhi
317 << "ESDeta=" << gammaEta
325 << "chi2ndf=" << gammaChi2NDF
329 } else kind = 9; //garbage
330 } else kind = 9; //garbage
332 // cout << gammaPt << "\t" << gammaP<< "\t" << gammaEta<< "\t" <<gammaChi2NDF << "\t" << gammaX<< "\t" <<gammaY << "\t" << gammaZ<< "\t" << gammaR<< "\t" << gammaPhi<< "\t" <<kind << endl;
334 if (fStreamMaterial){
335 (*fStreamMaterial)<<"ConvPointRec"
337 << "theta=" << gammaTheta
338 << "chi2ndf=" << gammaChi2NDF
340 << "coord.=" << &coord
341 << "daughterProp.=" << &daughterProp
345 if (fStreamMaterial){
346 (*fStreamMaterial)<<"ConvPointRec"
348 << "theta=" << gammaTheta
349 << "chi2ndf=" << gammaChi2NDF
350 << "coord.=" << &coord
351 << "daughterProp.=" << &daughterProp
358 //________________________________________________________________________
359 Int_t AliAnalysisTaskMaterial::CountESDTracks09(){
361 // Using standard function for setting Cuts
362 Bool_t selectPrimaries=kTRUE;
363 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
364 EsdTrackCuts->SetMaxDCAToVertexZ(2);
365 EsdTrackCuts->SetEtaRange(-0.9, 0.9);
366 EsdTrackCuts->SetPtRange(0.15);
368 Int_t fNumberOfESDTracks = 0;
369 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
370 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
371 if(!curTrack) continue;
372 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
377 return fNumberOfESDTracks;
380 Int_t AliAnalysisTaskMaterial::CountESDTracks0914(){
382 // Using standard function for setting Cuts ; We use TPCOnlyTracks for outer eta region
383 //Bool_t selectPrimaries=kTRUE;
384 // EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
385 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
386 EsdTrackCuts->SetMaxDCAToVertexXY(5);
387 // EsdTrackCuts->SetMaxDCAToVertexXYPtDep("sqrt(0.15^2+(0.4/pt)^2");
388 EsdTrackCuts->SetEtaRange(0.9, 1.4);
389 EsdTrackCuts->SetPtRange(0.15);
391 Int_t fNumberOfESDTracks = 0;
392 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
393 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
394 if(!curTrack) continue;
395 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
397 EsdTrackCuts->SetEtaRange(-1.4, -0.9);
398 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
399 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
400 if(!curTrack) continue;
401 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
406 return fNumberOfESDTracks;
409 Int_t AliAnalysisTaskMaterial::CountESDTracks14(){
411 // Using standard function for setting Cuts
412 Bool_t selectPrimaries=kTRUE;
413 AliESDtrackCuts *EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
414 EsdTrackCuts->SetMaxDCAToVertexZ(2);
415 EsdTrackCuts->SetEtaRange(-1.4, 1.4);
416 EsdTrackCuts->SetPtRange(0.15);
418 Int_t fNumberOfESDTracks = 0;
419 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
420 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
421 if(!curTrack) continue;
422 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
427 return fNumberOfESDTracks;
431 //________________________________________________________________________
432 void AliAnalysisTaskMaterial::Terminate(Option_t *)
434 // if (fStreamMaterial){
435 // fStreamMaterial->GetFile()->Write();
437 // if (fStreamResolution){
438 // fStreamResolution->GetFile()->Write();