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),
39 fConversionGammas(NULL),
40 fConversionCuts(NULL),
41 fStreamMaterial(NULL),
42 fStreamResolution(NULL),
48 // Default constructor
50 DefineInput(0, TChain::Class());
51 DefineOutput(1, TList::Class());
54 //________________________________________________________________________
55 AliAnalysisTaskMaterial::~AliAnalysisTaskMaterial()
57 // default deconstructor
59 delete fStreamMaterial;
60 fStreamMaterial = 0x0;
62 if(fStreamResolution){
63 delete fStreamResolution;
64 fStreamResolution = 0x0;
67 //________________________________________________________________________
68 void AliAnalysisTaskMaterial::UserCreateOutputObjects()
70 // Create User Output Objects
72 if(fOutputList != NULL){
76 if(fOutputList == NULL){
77 fOutputList = new TList();
78 fOutputList->SetOwner(kTRUE);
82 TString cutnumber = fConversionCuts->GetCutNumber();
84 fStreamMaterial = new TTreeSRedirector(Form("GammaConvV1_Material_%s.root",cutnumber.Data()));
85 fStreamResolution = new TTreeSRedirector(Form("GammaConvV1_Resolution_%s.root",cutnumber.Data()));
86 PostData(1, fOutputList);
89 //________________________________________________________________________
90 void AliAnalysisTaskMaterial::UserExec(Option_t *){
92 fV0Reader=(AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask("V0ReaderV1");
94 Int_t eventQuality = ((AliConversionCuts*)fV0Reader->GetConversionCuts())->GetEventQuality();
95 if(eventQuality != 0){// Event Not Accepted
98 fESDEvent = (AliESDEvent*) InputEvent();
99 if(fIsHeavyIon && !fConversionCuts->IsCentralitySelected(fESDEvent)) return;
100 Int_t nESDtracks = CountESDTracks(); // Estimate Event Multiplicity
103 if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()>0) {
104 nContrVtx = fESDEvent->GetPrimaryVertexTracks()->GetNContributors();
105 } else if(fESDEvent->GetPrimaryVertexTracks()->GetNContributors()<1) {
106 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
107 nContrVtx = fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
109 } else if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()<1) {
114 Int_t primVtxZ = fESDEvent->GetPrimaryVertex()->GetZ();
116 if (fStreamMaterial){
117 (*fStreamMaterial)<<"Event"
118 << "primVtxZ=" << primVtxZ
119 << "nContrVtx=" << nContrVtx
120 << "nGoodTracks=" << nESDtracks
124 fConversionGammas=fV0Reader->GetReconstructedGammas();
126 fMCEvent = MCEvent();
132 PostData(1, fOutputList);
136 ///________________________________________________________________________
137 void AliAnalysisTaskMaterial::ProcessMCPhotons(){
138 // Loop over all primary MC particle
139 AliStack *ffMCStack = fMCEvent->Stack();
140 for(Int_t i = 0; i < ffMCStack->GetNprimary(); i++) {
141 TParticle* particle = (TParticle *)ffMCStack->Particle(i);
142 if (!particle) continue;
143 if(fConversionCuts->PhotonIsSelectedMC(particle,ffMCStack,kFALSE)){
144 Float_t gammaPt = particle->Pt();
145 Float_t gammaP = particle->P();
146 Float_t gammaEta = particle->Eta();
147 if (fStreamMaterial){
148 (*fStreamMaterial)<<"AllGamma"
151 << "eta=" << gammaEta
155 if(fConversionCuts->PhotonIsSelectedMC(particle,ffMCStack,kTRUE)){
156 Float_t gammaPt = particle->Pt();
157 Float_t gammaP = particle->P();
158 Float_t gammaEta = particle->Eta();
159 TParticle* daughter = (TParticle *)ffMCStack->Particle(particle->GetFirstDaughter());
160 Float_t gammaX = daughter->Vx();
161 Float_t gammaY = daughter->Vy();
162 Float_t gammaZ = daughter->Vz();
163 Float_t gammaR = daughter->R();
164 Float_t gammaPhi = particle->Phi();
166 if (fStreamMaterial){
167 (*fStreamMaterial)<<"ConvGammaMC"
170 << "eta=" << gammaEta
175 << "Phi=" << gammaPhi
178 } // Converted MC Gamma
182 ///________________________________________________________________________
183 void AliAnalysisTaskMaterial::ProcessPhotons(){
185 // Fill Histograms for QA and MC
186 for(Int_t firstGammaIndex=0;firstGammaIndex<fConversionGammas->GetEntriesFast();firstGammaIndex++){
187 AliAODConversionPhoton *gamma=dynamic_cast<AliAODConversionPhoton*>(fConversionGammas->At(firstGammaIndex));
188 if(!fConversionCuts->PhotonIsSelected(gamma,fESDEvent)) continue;
189 // cout << "i= " <<firstGammaIndex << " of "<< fConversionGammas->GetEntriesFast() << endl;
190 Float_t gammaPt = gamma->GetPhotonPt();
191 Float_t gammaP = gamma->GetPhotonP();
192 Float_t gammaEta = gamma->GetPhotonEta();
193 Float_t gammaChi2NDF = gamma->GetChi2perNDF();
194 Float_t gammaX = gamma->GetConversionX();
195 Float_t gammaY = gamma->GetConversionY();
196 Float_t gammaZ = gamma->GetConversionZ();
197 Float_t gammaR = gamma->GetConversionRadius();
198 Float_t gammaPhi = gamma->GetPhotonPhi();
201 // cout << "generating MC stack"<< endl;
202 AliStack *fMCStack = fMCEvent->Stack();
203 if (!fMCStack) continue;
204 TParticle *posDaughter = gamma->GetPositiveMCDaughter(fMCStack);
205 TParticle *negDaughter = gamma->GetNegativeMCDaughter(fMCStack);
206 // cout << "generate Daughters: "<<posDaughter << "\t" << negDaughter << endl;
208 if(posDaughter == NULL || negDaughter == NULL){
210 // cout << "one of the daughters not available" << endl;
211 } else if(posDaughter->GetMother(0) != negDaughter->GetMother(0) || (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1)){
212 // Not Same Mother == Combinatorial Bck
214 // cout << "not the same mother" << endl;
216 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
218 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
219 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
220 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11)
221 kind = 10; //Electron Combinatorial
222 if(TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==11 && (posDaughter->GetMother(0) == negDaughter->GetMother(0) && posDaughter->GetMother(0) ==-1))
223 kind = 15; //direct Electron Combinatorial
225 if(TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==211)
226 kind = 11; //Pion Combinatorial
227 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==2212) ||
228 (TMath::Abs(pdgCodePos)==2212 && TMath::Abs(pdgCodeNeg)==211))
229 kind = 12; //Pion, Proton Combinatorics
230 if((TMath::Abs(pdgCodePos)==211 && TMath::Abs(pdgCodeNeg)==11) ||
231 (TMath::Abs(pdgCodePos)==11 && TMath::Abs(pdgCodeNeg)==211))
232 kind = 13; //Pion, Electron Combinatorics
233 if (TMath::Abs(pdgCodePos)==321 || TMath::Abs(pdgCodeNeg)==321)
234 kind = 14; //Kaon combinatorics
237 // cout << "same mother" << endl;
239 if (posDaughter->GetPdgCode()) pdgCodePos = posDaughter->GetPdgCode(); else continue;
241 if (negDaughter->GetPdgCode()) pdgCodeNeg = negDaughter->GetPdgCode(); else continue;
242 // cout << "PDG codes daughters: " << pdgCodePos << "\t" << pdgCodeNeg << endl;
244 if (gamma->GetMCParticle(fMCStack)->GetPdgCode()) pdgCode = gamma->GetMCParticle(fMCStack)->GetPdgCode(); else continue;
245 // cout << "PDG code: " << pdgCode << endl;
246 if(TMath::Abs(pdgCodePos)!=11 || TMath::Abs(pdgCodeNeg)!=11)
247 kind = 2; // combinatorics from hadronic decays
248 else if ( !(pdgCodeNeg==pdgCodePos)){
249 TParticle *truePhotonCanditate = gamma->GetMCParticle(fMCStack);
251 kind = 3; // pi0 Dalitz
252 else if (pdgCode == 221)
253 kind = 4; // eta Dalitz
254 else if (!(negDaughter->GetUniqueID() != 5 || posDaughter->GetUniqueID() !=5)){
255 if(pdgCode == 22 && negDaughter->GetMother(0) <= fMCStack->GetNprimary()){
256 kind = 0; // primary photons
257 } else if (pdgCode == 22){
258 kind = 5; //secondary photons
261 Float_t mcPt = truePhotonCanditate->Pt();
262 Float_t mcR = gamma->GetNegativeMCDaughter(fMCStack)->R();
263 Float_t mcZ = gamma->GetNegativeMCDaughter(fMCStack)->Vz();
264 Float_t mcPhi = gamma->GetNegativeMCDaughter(fMCStack)->Phi();
265 Float_t mcEta = gamma->GetNegativeMCDaughter(fMCStack)->Eta();
266 if (fStreamResolution){
267 (*fStreamResolution)<<"Resolution"
268 << "ESDpt=" << gammaPt
269 << "ESDphi=" << gammaPhi
270 << "ESDeta=" << gammaEta
278 << "chi2ndf=" << gammaChi2NDF
282 } else kind = 9; //garbage
283 } else kind = 9; //garbage
285 // cout << gammaPt << "\t" << gammaP<< "\t" << gammaEta<< "\t" <<gammaChi2NDF << "\t" << gammaX<< "\t" <<gammaY << "\t" << gammaZ<< "\t" << gammaR<< "\t" << gammaPhi<< "\t" <<kind << endl;
287 if (fStreamMaterial){
288 (*fStreamMaterial)<<"ConvPointRec"
291 << "eta=" << gammaEta
292 << "chi2ndf=" << gammaChi2NDF
298 << "Phi=" << gammaPhi
302 if (fStreamMaterial){
303 (*fStreamMaterial)<<"ConvPointRec"
306 << "eta=" << gammaEta
307 << "chi2ndf=" << gammaChi2NDF
312 << "Phi=" << gammaPhi
319 //________________________________________________________________________
320 Int_t AliAnalysisTaskMaterial::CountESDTracks(){
322 AliESDtrackCuts *EsdTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
323 // Using standard function for setting Cuts
324 Bool_t selectPrimaries=kTRUE;
325 EsdTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(selectPrimaries);
326 EsdTrackCuts->SetMaxDCAToVertexZ(2);
327 EsdTrackCuts->SetEtaRange(-0.8, 0.8);
328 EsdTrackCuts->SetPtRange(0.15);
330 Int_t fNumberOfESDTracks = 0;
331 for(Int_t iTracks = 0; iTracks < fESDEvent->GetNumberOfTracks(); iTracks++){
332 AliESDtrack* curTrack = fESDEvent->GetTrack(iTracks);
333 if(!curTrack) continue;
334 if(EsdTrackCuts->AcceptTrack(curTrack) ) fNumberOfESDTracks++;
339 return fNumberOfESDTracks;
343 //________________________________________________________________________
344 void AliAnalysisTaskMaterial::Terminate(Option_t *)
346 if (fStreamMaterial){
347 fStreamMaterial->GetFile()->Write();
349 if (fStreamResolution){
350 fStreamResolution->GetFile()->Write();