1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
17 //_________________________________________________________________________
\r
18 // a general class to fill two-photon and pi0+gamma invariant mass hisograms
\r
19 // to be used to extract pi0, eta and omega raw yield.
\r
20 // also for PHOS acceptance
\r
22 //-- by Renzhuo Wan (Iopp-wuhan) May 13,2009
\r
23 //_________________________________________________________________________
\r
25 // --- ROOT system ---
\r
28 //#include "Riostream.h"
\r
29 #include "TCanvas.h"
\r
32 #include "TLorentzVector.h"
\r
33 #include "TString.h"
\r
34 #include "TParticle.h"
\r
35 //---- AliRoot system ----
\r
36 #include "AliAnaNeutralMeson.h"
\r
37 #include "AliCaloTrackReader.h"
\r
38 #include "AliCaloPID.h"
\r
39 #include "AliStack.h"
\r
40 #include "AliFidutialCut.h"
\r
41 #include "AliVEvent.h"
\r
43 #include "AliPHOSGeoUtils.h"
\r
45 #ifdef __EMCALUTIL__
\r
46 #include "AliEMCALGeoUtils.h"
\r
50 ClassImp(AliAnaNeutralMeson)
\r
52 //______________________________________________________________________________
\r
53 AliAnaNeutralMeson::AliAnaNeutralMeson() : AliAnaPartCorrBaseClass(),
\r
54 fAnaPi0Eta(0), fAnaOmega(0), fNPID(0),fNmaxMixEv(0), fNAsy(0),fNMod(0),
\r
55 fNHistos(0), fPerPtBin(0),
\r
56 fAsyCut(0), fModCut(0),
\r
57 fDist(0), fAsy(0), fPt(0), fMass(0),
\r
59 fNbinsAsy(0), fMinAsy(0), fMaxAsy(0),
\r
60 fNbinsPt(0), fMinPt(0), fMaxPt(0),
\r
61 fNbinsM(0), fMinM(0), fMaxM(0),
\r
62 fEventsListPi0Eta(0), fEventsListOmega(0),
\r
63 fPi0Mass(0), fPi0MassPeakWidthCut(0), fhNClusters(0),
\r
64 fhRecPhoton(0), fhRecPhotonEtaPhi(0),
\r
65 fReal2Gamma(0), fMix2Gamma(0),fRealOmega(0),
\r
66 fMixOmegaA(0),fMixOmegaB(0), fMixOmegaC(0),
\r
67 fRealTwoGammaAsyPtM(0), fMixTwoGammaAsyPtM(0),
\r
68 fRealPi0GammaAsyPtM(0), fMixAPi0GammaAsyPtM(0), fMixBPi0GammaAsyPtM(0), fMixCPi0GammaAsyPtM(0),
\r
69 fhPrimPhotonPt(0), fhPrimPhotonAccPt(0), fhPrimPhotonY(0), fhPrimPhotonAccY(0),
\r
70 fhPrimPhotonPhi(0), fhPrimPhotonAccPhi(0),
\r
71 fhPrimPi0Pt(0), fhPrimPi0AccPt(0), fhPrimPi0Y(0), fhPrimPi0AccY(0), fhPrimPi0Phi(0), fhPrimPi0AccPhi(0),
\r
72 fhPrimEtaPt(0), fhPrimEtaAccPt(0), fhPrimEtaY(0), fhPrimEtaAccY(0), fhPrimEtaPhi(0), fhPrimEtaAccPhi(0),
\r
73 fhPrimOmegaPt(0), fhPrimOmegaAccPt(0), fhPrimOmegaY(0), fhPrimOmegaAccY(0),
\r
74 fhPrimOmegaPhi(0), fhPrimOmegaAccPhi(0),
\r
79 #ifdef __EMCALUTIL__
\r
87 //______________________________________________________________________________
\r
88 AliAnaNeutralMeson::AliAnaNeutralMeson(const AliAnaNeutralMeson & ex) : AliAnaPartCorrBaseClass(ex),
\r
89 fAnaPi0Eta(ex.fAnaPi0Eta), fAnaOmega(ex.fAnaOmega), fNPID(ex.fNPID),fNmaxMixEv(ex.fNmaxMixEv), fNAsy(ex.fNAsy),fNMod(ex.fNMod),
\r
90 fNHistos(ex.fNHistos), fPerPtBin(ex.fPerPtBin),
\r
91 fAsyCut(ex.fAsyCut), fModCut(ex.fModCut),
\r
92 fDist(ex.fDist), fAsy(ex.fAsy), fPt(ex.fPt), fMass(ex.fMass),
\r
93 fInvMassCut(ex.fInvMassCut),
\r
94 fNbinsAsy(ex.fNbinsAsy), fMinAsy(ex.fMinAsy), fMaxAsy(ex.fMaxAsy),
\r
95 fNbinsPt(ex.fNbinsPt), fMinPt(ex.fMinPt), fMaxPt(ex.fMaxPt),
\r
96 fNbinsM(ex.fNbinsM), fMinM(ex.fMinM), fMaxM(ex.fMaxM),
\r
97 fEventsListPi0Eta(ex.fEventsListPi0Eta), fEventsListOmega(ex.fEventsListOmega),
\r
98 fPi0Mass(ex.fPi0Mass), fPi0MassPeakWidthCut(ex.fPi0MassPeakWidthCut), fhNClusters(ex.fhNClusters),
\r
99 fhRecPhoton(ex.fhRecPhoton), fhRecPhotonEtaPhi(ex.fhRecPhotonEtaPhi),
\r
100 fReal2Gamma(ex.fReal2Gamma), fMix2Gamma(ex.fMix2Gamma),fRealOmega(ex.fRealOmega),
\r
101 fMixOmegaA(ex.fMixOmegaA),fMixOmegaB(ex.fMixOmegaB), fMixOmegaC(ex.fMixOmegaC),
\r
102 fRealTwoGammaAsyPtM(ex.fRealTwoGammaAsyPtM), fMixTwoGammaAsyPtM(ex.fMixTwoGammaAsyPtM),
\r
103 fRealPi0GammaAsyPtM(ex.fRealPi0GammaAsyPtM), fMixAPi0GammaAsyPtM(ex.fMixAPi0GammaAsyPtM),
\r
104 fMixBPi0GammaAsyPtM(ex.fMixBPi0GammaAsyPtM), fMixCPi0GammaAsyPtM(ex.fMixCPi0GammaAsyPtM),
\r
105 fhPrimPhotonPt(ex.fhPrimPhotonPt), fhPrimPhotonAccPt(ex.fhPrimPhotonAccPt), fhPrimPhotonY(ex.fhPrimPhotonY),
\r
106 fhPrimPhotonAccY(ex.fhPrimPhotonAccY), fhPrimPhotonPhi(ex.fhPrimPhotonPhi),
\r
107 fhPrimPhotonAccPhi(ex.fhPrimPhotonAccPhi),
\r
108 fhPrimPi0Pt(ex.fhPrimPi0Pt), fhPrimPi0AccPt(ex.fhPrimPi0AccPt), fhPrimPi0Y(ex.fhPrimPi0Y),
\r
109 fhPrimPi0AccY(ex.fhPrimPi0AccY), fhPrimPi0Phi(ex.fhPrimPi0Phi), fhPrimPi0AccPhi(ex.fhPrimPi0AccPhi),
\r
110 fhPrimEtaPt(ex.fhPrimEtaPt), fhPrimEtaAccPt(ex.fhPrimEtaAccPt), fhPrimEtaY(ex.fhPrimEtaY),
\r
111 fhPrimEtaAccY(ex.fhPrimEtaAccY), fhPrimEtaPhi(ex.fhPrimEtaPhi), fhPrimEtaAccPhi(ex.fhPrimEtaAccPhi),
\r
112 fhPrimOmegaPt(ex.fhPrimOmegaPt), fhPrimOmegaAccPt(ex.fhPrimOmegaAccPt), fhPrimOmegaY(ex.fhPrimOmegaY),
\r
113 fhPrimOmegaAccY(ex.fhPrimOmegaAccY), fhPrimOmegaPhi(ex.fhPrimOmegaPhi), fhPrimOmegaAccPhi(ex.fhPrimOmegaAccPhi),
\r
115 #ifdef __PHOSUTIL__
\r
116 ,fPHOSGeo(ex.fPHOSGeo)
\r
118 #ifdef __EMCALUTIL__
\r
119 ,fEMCALGeo(ex.fEMCALGeo)
\r
126 //______________________________________________________________________________
\r
127 AliAnaNeutralMeson & AliAnaNeutralMeson::operator = (const AliAnaNeutralMeson & ex)
\r
129 // assignment operator
\r
131 if(this == &ex)return *this;
\r
132 ((AliAnaPartCorrBaseClass *)this)->operator=(ex);
\r
134 fAnaPi0Eta = ex.fAnaPi0Eta; fAnaOmega = ex.fAnaOmega;
\r
135 fNPID=ex.fNPID; fNmaxMixEv=ex.fNmaxMixEv; fNAsy=ex.fNAsy;fNMod=ex.fNMod;
\r
136 fNHistos=ex.fNHistos; fPerPtBin=ex.fPerPtBin;
\r
137 fAsyCut=ex.fAsyCut; fModCut=ex.fModCut;
\r
138 fDist=ex.fDist; fAsy=ex.fAsy; fPt=ex.fPt; fMass=ex.fMass;
\r
139 fInvMassCut=ex.fInvMassCut;
\r
140 fNbinsAsy=ex.fNbinsAsy; fMinAsy=ex.fMinAsy; fMaxAsy=ex.fMaxAsy;
\r
141 fNbinsPt=ex.fNbinsPt; fMinPt=ex.fMinPt; fMaxPt=ex.fMaxPt;
\r
142 fNbinsM=ex.fNbinsM; fMinM=ex.fMinM; fMaxM=ex.fMaxM;
\r
143 fEventsListPi0Eta=ex.fEventsListPi0Eta; fEventsListOmega=ex.fEventsListOmega;
\r
144 fPi0Mass=ex.fPi0Mass; fPi0MassPeakWidthCut=ex.fPi0MassPeakWidthCut; fhNClusters =ex.fhNClusters;
\r
145 fhRecPhoton=ex.fhRecPhoton; fhRecPhotonEtaPhi =ex.fhRecPhotonEtaPhi;
\r
146 fReal2Gamma=ex.fReal2Gamma; fMix2Gamma=ex.fMix2Gamma;fRealOmega=ex.fRealOmega;
\r
147 fMixOmegaA=ex.fMixOmegaA; fMixOmegaB=ex.fMixOmegaB; fMixOmegaC=ex.fMixOmegaC;
\r
148 fRealTwoGammaAsyPtM=ex.fRealTwoGammaAsyPtM; fMixTwoGammaAsyPtM =ex.fMixTwoGammaAsyPtM;
\r
149 fRealPi0GammaAsyPtM=ex.fRealPi0GammaAsyPtM; fMixAPi0GammaAsyPtM=ex.fMixAPi0GammaAsyPtM;
\r
150 fMixBPi0GammaAsyPtM=ex.fMixBPi0GammaAsyPtM; fMixCPi0GammaAsyPtM=ex.fMixCPi0GammaAsyPtM;
\r
151 fhPrimPhotonPt=ex.fhPrimPhotonPt; fhPrimPhotonAccPt=ex.fhPrimPhotonAccPt; fhPrimPhotonY=ex.fhPrimPhotonY;
\r
152 fhPrimPhotonAccY=ex.fhPrimPhotonAccY; fhPrimPhotonPhi=ex.fhPrimPhotonPhi;
\r
153 fhPrimPhotonAccPhi=ex.fhPrimPhotonAccPhi;
\r
154 fhPrimPi0Pt=ex.fhPrimPi0Pt; fhPrimPi0AccPt=ex.fhPrimPi0AccPt; fhPrimPi0Y=ex.fhPrimPi0Y;
\r
155 fhPrimPi0AccY=ex.fhPrimPi0AccY; fhPrimPi0Phi=ex.fhPrimPi0Phi; fhPrimPi0AccPhi=ex.fhPrimPi0AccPhi;
\r
156 fhPrimEtaPt=ex.fhPrimEtaPt; fhPrimEtaAccPt=ex.fhPrimEtaAccPt; fhPrimEtaY=ex.fhPrimEtaY;
\r
157 fhPrimEtaAccY=ex.fhPrimEtaAccY; fhPrimEtaPhi=ex.fhPrimEtaPhi; fhPrimEtaAccPhi=ex.fhPrimEtaAccPhi;
\r
158 fhPrimOmegaPt=ex.fhPrimOmegaPt; fhPrimOmegaAccPt=ex.fhPrimOmegaAccPt; fhPrimOmegaY=ex.fhPrimOmegaY;
\r
159 fhPrimOmegaAccY=ex.fhPrimOmegaAccY; fhPrimOmegaPhi=ex.fhPrimOmegaPhi; fhPrimOmegaAccPhi=ex.fhPrimOmegaAccPhi;
\r
165 //______________________________________________________________________________
\r
166 AliAnaNeutralMeson::~AliAnaNeutralMeson() {
\r
170 if(fEventsListPi0Eta){
\r
171 delete[] fEventsListPi0Eta;
\r
172 fEventsListPi0Eta=0 ;
\r
174 if(fEventsListOmega){
\r
175 delete[] fEventsListOmega;
\r
176 fEventsListOmega=0 ;
\r
179 #ifdef __PHOSUTIL__
\r
180 if(fPHOSGeo) delete fPHOSGeo ;
\r
182 #ifdef __EMCALUTIL__
\r
183 if(fEMCALGeo) delete fEMCALGeo ;
\r
187 //______________________________________________________________________________
\r
188 void AliAnaNeutralMeson::SetCalorimeter(TString det)
\r
191 //for PHOS, we consider three cases with different PHOS number
\r
192 //for EMCAL, we use the default one, I don't know, needs to be confirmed
\r
195 if(det == "PHOS"){
\r
197 nmod= new Int_t [n];
\r
198 nmod[0]=1; nmod[1]=3; nmod[2]=5;
\r
202 if(det == "EMCAL") { //the default number of EMCAL modules
\r
204 nmod= new Int_t [n];
\r
207 fCalorimeter = det;
\r
212 //______________________________________________________________________________
\r
213 void AliAnaNeutralMeson::InitParameters()
\r
215 //Init parameters when first called the analysis
\r
216 //Set default parameters
\r
217 SetInputAODName("photons");
\r
218 AddToHistogramsName("AnaNeutralMesons_");
\r
227 fAsyCut = new Double_t[fNAsy] ;
\r
228 fAsyCut[0]=0.7; fAsyCut[1]=0.8; fAsyCut[2]=0.9; fAsyCut[3]=1;
\r
230 fNHistos=20; // set the max pt range from 0 to 20 GeV
\r
231 fPerPtBin=1.;//set the invariant mass spectrum in pt bin
\r
233 fNmaxMixEv = 6; //event buffer size
\r
234 fPi0Mass=0.135; //nominal pi0 mass in GeV/c^2
\r
235 fPi0MassPeakWidthCut=0.015; //the Pi0MassCut should dependent on pt, here we assume it 0.015
\r
248 //______________________________________________________________________________
\r
249 void AliAnaNeutralMeson::Init()
\r
251 //Init some data members needed in analysis
\r
253 fEventsListPi0Eta = new TList ;
\r
254 fEventsListOmega = new TList ;
\r
256 #ifdef __PHOSUTIL__
\r
257 printf("PHOS geometry initialized!\n");
\r
258 fPHOSGeo = new AliPHOSGeoUtils("PHOSgeo") ;
\r
261 #ifdef __EMCALUTIL__
\r
262 printf("EMCAL geometry initialized!\n");
\r
263 fEMCALGeo = new AliEMCALGeoUtils("EMCALgeo") ;
\r
268 //______________________________________________________________________________
\r
269 TList * AliAnaNeutralMeson::GetCreateOutputObjects()
\r
271 // Create histograms to be saved in output file and
\r
272 // store them in fOutputContainer
\r
274 TList * outputContainer = new TList() ;
\r
275 outputContainer->SetName(GetName());
\r
279 const char * detector= fCalorimeter;
\r
281 fhNClusters = new TH1I("fhNClusters","N clusters per event",100,0,100); //
\r
282 outputContainer->Add(fhNClusters);
\r
284 fhRecPhoton = new TH1D*[fNPID*fNMod];
\r
285 fhRecPhotonEtaPhi= new TH2F*[fNPID*fNMod];
\r
286 // plot the photon cluster pt, eta and phi distribution by using the PID and module cut
\r
287 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
288 for(Int_t jmod=0;jmod<fNMod;jmod++){
\r
289 sprintf(key,"fhRecPhoton_%s_pid_%d_nmod_%d",detector,ipid,fModCut[jmod]);
\r
290 sprintf(title,"Rec. photon with pid#%d in %d modules with %s",ipid, fModCut[jmod],detector );
\r
291 fhRecPhoton[ipid*fNMod+jmod] = new TH1D(key,title,fNbinsPt,fMinPt, fMaxPt);
\r
292 fhRecPhoton[ipid*fNMod+jmod]->GetXaxis()->SetTitle("pt (GeV/c)");
\r
293 fhRecPhoton[ipid*fNMod+jmod]->GetYaxis()->SetTitle("Entries");
\r
294 outputContainer->Add(fhRecPhoton[ipid*fNMod+jmod]);
\r
296 sprintf(key,"fhRecPhotonEtaPhi_%s_pid_%d_nmod_%d",detector, ipid,fModCut[jmod]);
\r
297 sprintf(title,"Rec. photon eta vs phi with pid#%d in %d modules with %s",ipid, fModCut[jmod], detector);
\r
298 fhRecPhotonEtaPhi[ipid*fNMod+jmod] = new TH2F(key,title,200,-1,1,200,0,7);
\r
299 fhRecPhotonEtaPhi[ipid*fNMod+jmod]->GetXaxis()->SetTitle("#eta");
\r
300 fhRecPhotonEtaPhi[ipid*fNMod+jmod]->GetYaxis()->SetTitle("#phi (rad.)");
\r
301 outputContainer->Add(fhRecPhotonEtaPhi[ipid*fNMod+jmod]);
\r
307 fReal2Gamma = new TH1F*[fNPID*fNAsy*fNMod*fNHistos];
\r
308 fMix2Gamma = new TH1F*[fNPID*fNAsy*fNMod*fNHistos];
\r
310 fRealTwoGammaAsyPtM = new TH3F*[fNPID];
\r
311 fMixTwoGammaAsyPtM = new TH3F*[fNPID];
\r
312 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
313 sprintf(key,"RealTwoGammaAsyPtM_%s_pid_%d",detector,ipid);
\r
314 sprintf(title, "%s Real 2#gamma asy:pt:ivm with pid#%d",detector,ipid);
\r
315 fRealTwoGammaAsyPtM[ipid] = new TH3F(key, title,
\r
316 fNbinsAsy,fMinAsy, fMaxAsy, fNbinsPt,fMinPt, fMaxPt,fNbinsM,fMinM, fMaxM);
\r
317 fRealTwoGammaAsyPtM[ipid]->GetYaxis()->SetTitle("2#gamma pt");
\r
318 fRealTwoGammaAsyPtM[ipid]->GetXaxis()->SetTitle("A=|E_{#gamma1}-E_{#gamma2}|/(E_{#gamma1}+E_{#gamma2})");
\r
319 fRealTwoGammaAsyPtM[ipid]->GetZaxis()->SetTitle("M_{2#gamma}");
\r
320 outputContainer->Add(fRealTwoGammaAsyPtM[ipid]);
\r
322 sprintf(key,"MixTwoGammaAsyPtM_%s_pid_%d",detector,ipid);
\r
323 sprintf(title, "%s Mix 2#gamma asy:pt:ivm with pid#%d",detector,ipid);
\r
324 fMixTwoGammaAsyPtM[ipid] = new TH3F(key, title,
\r
325 fNbinsAsy,fMinAsy, fMaxAsy, fNbinsPt,fMinPt, fMaxPt,fNbinsM,fMinM, fMaxM);
\r
326 fMixTwoGammaAsyPtM[ipid]->GetYaxis()->SetTitle("2#gamma pt");
\r
327 fMixTwoGammaAsyPtM[ipid]->GetXaxis()->SetTitle("A=|E_{#gamma1}-E_{#gamma2}|/(E_{#gamma1}+E_{#gamma2})");
\r
328 fMixTwoGammaAsyPtM[ipid]->GetZaxis()->SetTitle("M_{2#gamma}");
\r
329 outputContainer->Add(fMixTwoGammaAsyPtM[ipid]);
\r
331 for(Int_t jmod=0; jmod<fNMod; jmod++){
\r
332 for(Int_t kasy=0;kasy<fNAsy;kasy++){
\r
333 for(Int_t mhist=0;mhist<fNHistos;mhist++){
\r
334 Double_t pt1=mhist*fPerPtBin;
\r
335 Double_t pt2=(mhist+1)*fPerPtBin;
\r
336 Int_t index = ipid*fNMod*fNAsy*fNHistos+jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
338 sprintf(key,"fReal2Gamma_%s_pid_%d_mod_%d_asy_%d_pt_%d",detector, ipid,fModCut[jmod],kasy,mhist);
\r
339 sprintf(title,"real 2#gamma IVM with pid#%d asy<%2.1f in %d modules with %s at %2.2f<pt<%2.2f",
\r
340 ipid,fAsyCut[kasy], fModCut[jmod],detector, pt1, pt2);
\r
341 fReal2Gamma[index] = new TH1F(key, title,fNbinsM,fMinM,fMaxM);
\r
342 fReal2Gamma[index]->GetYaxis()->SetTitle("dN/dM_{#gamma#gamma}");
\r
343 fReal2Gamma[index]->GetXaxis()->SetTitle("M_{#gamma#gamma} (GeV/c^{2})");
\r
344 outputContainer->Add(fReal2Gamma[index]);
\r
346 sprintf(key,"fMix2Gamma_%s_pid_%d_mod_%d_asy_%d_pt_%d",detector,ipid,fModCut[jmod],kasy,mhist);
\r
347 sprintf(title,"Mix 2#gamma IVM with pid#%d asy<%2.1f in %d modules with %s at %2.2f<pt<%2.2f",
\r
348 ipid,fAsyCut[kasy],fModCut[jmod],detector,pt1, pt2);
\r
349 fMix2Gamma[index] = new TH1F(key, title,fNbinsM,fMinM,fMaxM);
\r
350 fMix2Gamma[index]->GetYaxis()->SetTitle("dN/dM_{#gamma#gamma}");
\r
351 fMix2Gamma[index]->GetXaxis()->SetTitle("M_{#gamma#gamma} (GeV/c^{2})");
\r
352 outputContainer->Add(fMix2Gamma[index]);
\r
360 fRealOmega = new TH1F*[fNPID*fNAsy*fNMod*fNHistos];
\r
361 fMixOmegaA = new TH1F*[fNPID*fNAsy*fNMod*fNHistos];
\r
362 fMixOmegaB = new TH1F*[fNPID*fNAsy*fNMod*fNHistos];
\r
363 fMixOmegaC = new TH1F*[fNPID*fNAsy*fNMod*fNHistos];
\r
364 fRealPi0GammaAsyPtM=new TH3F*[fNPID];
\r
365 fMixAPi0GammaAsyPtM=new TH3F*[fNPID];
\r
366 fMixBPi0GammaAsyPtM=new TH3F*[fNPID];
\r
367 fMixCPi0GammaAsyPtM=new TH3F*[fNPID];
\r
369 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
370 sprintf(key,"RealPi0GammaAsyPtM_%s_pid_%d",detector,ipid);
\r
371 sprintf(title,"%s Real #omega->#pi^{0}#gamma asy:pt:ivm with pid#%d",detector,ipid);
\r
372 fRealPi0GammaAsyPtM[ipid] = new TH3F(key, title,
\r
373 fNbinsAsy,fMinAsy, fMaxAsy, fNbinsPt,fMinPt, fMaxPt,fNbinsM,fMinM, fMaxM);
\r
374 fRealPi0GammaAsyPtM[ipid]->GetYaxis()->SetTitle("#pi^{0}#gamma pt");
\r
375 fRealPi0GammaAsyPtM[ipid]->GetXaxis()->SetTitle("A=|E_{#pi^{0}}-E_{#gamma}|/(E_{#pi^{0}}+E_{#gamma})");
\r
376 fRealPi0GammaAsyPtM[ipid]->GetZaxis()->SetTitle("M_{#pi^{0}#gamma}");
\r
377 outputContainer->Add(fRealPi0GammaAsyPtM[ipid]);
\r
379 sprintf(key,"MixAPi0GammaAsyPtM_%s_pid_%d",detector, ipid);
\r
380 sprintf(title,"%s MixA #omega->#pi^{0}#gamma asy:pt:ivm with pid#%d",detector,ipid);
\r
381 fMixAPi0GammaAsyPtM[ipid] = new TH3F(key,title,
\r
382 fNbinsAsy,fMinAsy, fMaxAsy, fNbinsPt,fMinPt, fMaxPt,fNbinsM,fMinM, fMaxM);
\r
383 fMixAPi0GammaAsyPtM[ipid]->GetYaxis()->SetTitle("#pi^{0}#gamma pt");
\r
384 fMixAPi0GammaAsyPtM[ipid]->GetXaxis()->SetTitle("A=|E_{#pi^{0}}-E_{#gamma}|/(E_{#pi^{0}}+E_{#gamma})");
\r
385 fMixAPi0GammaAsyPtM[ipid]->GetZaxis()->SetTitle("M_{#pi^{0}#gamma}");
\r
386 outputContainer->Add(fMixAPi0GammaAsyPtM[ipid]);
\r
388 sprintf(key,"MixBPi0GammaAsyPtM_%s_pid_%d",detector,ipid);
\r
389 sprintf(title,"%s MixB #omega->#pi^{0}#gamma asy:pt:ivm with pid#%d",detector,ipid);
\r
390 fMixBPi0GammaAsyPtM[ipid] = new TH3F(key, title,
\r
391 fNbinsAsy,fMinAsy, fMaxAsy, fNbinsPt,fMinPt, fMaxPt,fNbinsM,fMinM, fMaxM);
\r
392 fMixBPi0GammaAsyPtM[ipid]->GetYaxis()->SetTitle("#pi^{0}#gamma pt");
\r
393 fMixBPi0GammaAsyPtM[ipid]->GetXaxis()->SetTitle("A=|E_{#pi^{0}}-E_{#gamma}|/(E_{#pi^{0}}+E_{#gamma})");
\r
394 fMixBPi0GammaAsyPtM[ipid]->GetZaxis()->SetTitle("M_{#pi^{0}#gamma}");
\r
395 outputContainer->Add(fMixBPi0GammaAsyPtM[ipid]);
\r
397 sprintf(key,"MixCPi0GammaAsyPtM_%s_pid_%d",detector,ipid);
\r
398 sprintf(title,"%s MixC #omega->#pi^{0}#gamma asy:pt:ivm with pid#%d",detector,ipid);
\r
399 fMixCPi0GammaAsyPtM[ipid] = new TH3F(key, title,
\r
400 fNbinsAsy,fMinAsy, fMaxAsy, fNbinsPt,fMinPt, fMaxPt,fNbinsM,fMinM, fMaxM);
\r
401 fMixCPi0GammaAsyPtM[ipid]->GetYaxis()->SetTitle("#pi^{0}#gamma pt");
\r
402 fMixCPi0GammaAsyPtM[ipid]->GetXaxis()->SetTitle("A=|E_{#pi^{0}}-E_{#gamma}|/(E_{#pi^{0}}+E_{#gamma})");
\r
403 fMixCPi0GammaAsyPtM[ipid]->GetZaxis()->SetTitle("M_{#pi^{0}#gamma}");
\r
404 outputContainer->Add(fMixCPi0GammaAsyPtM[ipid]);
\r
406 for(Int_t jmod=0; jmod<fNMod; jmod++){
\r
407 for(Int_t kasy=0;kasy<fNAsy;kasy++){
\r
408 for(Int_t mhist=0;mhist<fNHistos;mhist++){
\r
409 Double_t pt1=mhist*fPerPtBin;
\r
410 Double_t pt2=(mhist+1)*fPerPtBin;
\r
411 Int_t index = ipid*fNMod*fNAsy*fNHistos+jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
412 sprintf(key,"fRealOmega_%s_pid_%d_mod_%d_asy_%d_pt_%d",detector,ipid,fModCut[jmod],kasy,mhist);
\r
413 sprintf(title,"Real #omega with pid#%d asy<%2.1f in %d modules with %s at %2.2f<pt<%2.2f",
\r
414 ipid,fAsyCut[kasy],fModCut[jmod], detector, pt1, pt2);
\r
415 fRealOmega[index] = new TH1F(key, title,fNbinsM,fMinM,fMaxM);
\r
416 fRealOmega[index]->GetYaxis()->SetTitle("dN/dM_{#pi^{0}#gamma} ");
\r
417 fRealOmega[index]->GetXaxis()->SetTitle("M_{#pi^{0}#gamma} (GeV/c^{2})");
\r
418 outputContainer->Add(fRealOmega[index]);
\r
420 sprintf(key,"fMixOmegaA_%s_pid_%d_mod_%d_asy_%d_pt_%d",detector, ipid,fModCut[jmod],kasy,mhist);
\r
421 sprintf(title,"Mix #omega A with pid#%d asy<%2.1f in %d modules with %s at %2.2f<pt<%2.2f",
\r
422 ipid,fAsyCut[kasy],fModCut[jmod],detector,pt1, pt2);
\r
423 fMixOmegaA[index] = new TH1F(key, title,fNbinsM,fMinM,fMaxM);
\r
424 fMixOmegaA[index]->GetYaxis()->SetTitle("dN/dM_{#pi^{0}#gamma}");
\r
425 fMixOmegaA[index]->GetXaxis()->SetTitle("M_{#pi^{0}#gamma} (GeV/c^{2})");
\r
426 outputContainer->Add(fMixOmegaA[index]);
\r
428 sprintf(key,"fMixOmegaB_%s_pid_%d_mod_%d_asy_%d_pt_%d",detector,ipid,fModCut[jmod],kasy,mhist);
\r
429 sprintf(title,"Mix #omega B with pid#%d asy<%2.1f in %d modules with %s at %2.2f<pt<%2.2f",
\r
430 ipid,fAsyCut[kasy],fModCut[jmod],detector,pt1, pt2);
\r
431 fMixOmegaB[index] = new TH1F(key, title,fNbinsM,fMinM,fMaxM);
\r
432 fMixOmegaB[index]->GetYaxis()->SetTitle("dN/dM_{#pi^{0}#gamma}");
\r
433 fMixOmegaB[index]->GetXaxis()->SetTitle("M_{#pi^{0}#gamma} (GeV/c^{2})");
\r
434 outputContainer->Add(fMixOmegaB[index]);
\r
436 sprintf(key,"fMixOmegaC_%s_pid_%d_mod_%d_asy_%d_pt_%d",detector,ipid,fModCut[jmod],kasy,mhist);
\r
437 sprintf(title,"Mix #omega C with pid#%d asy<%2.1f in %d modules with %s at %2.2f<pt<%2.2f",
\r
438 ipid,fAsyCut[kasy],fModCut[jmod],detector, pt1, pt2);
\r
439 fMixOmegaC[index] = new TH1F(key, title,fNbinsM,fMinM,fMaxM);
\r
440 fMixOmegaC[index]->GetYaxis()->SetTitle("dN/dM_{#pi^{0}#gamma}");
\r
441 fMixOmegaC[index]->GetXaxis()->SetTitle("M_{#pi^{0}#gamma} (GeV/c^{2})");
\r
442 outputContainer->Add(fMixOmegaC[index]);
\r
449 //Histograms filled only if MC data is requested
\r
451 //currently only PHOS included
\r
452 if(fCalorimeter=="PHOS" && (IsDataMC() || (GetReader()->GetDataType() == AliCaloTrackReader::kMC)) ){
\r
453 fhPrimPhotonPt = new TH1D("hPrimPhotonPt","Primary phton pt at |y|=1",fNbinsPt,fMinPt, fMaxPt) ;
\r
454 outputContainer->Add(fhPrimPhotonPt);
\r
456 fhPrimPhotonAccPt = new TH1D("hPrimPhotonAccPt","Primary photon pt in acceptance",fNbinsPt,fMinPt, fMaxPt);
\r
457 outputContainer->Add(fhPrimPhotonAccPt);
\r
459 fhPrimPi0Pt = new TH1D("hPrimPi0Pt","Primary pi0 pt at |y|=1",fNbinsPt,fMinPt, fMaxPt) ;
\r
460 outputContainer->Add(fhPrimPi0Pt);
\r
462 fhPrimPi0AccPt = new TH1D("hPrimPi0AccPt","Primary pi0 pt with both photons in acceptance",fNbinsPt,fMinPt, fMaxPt);
\r
463 outputContainer->Add(fhPrimPi0AccPt);
\r
465 fhPrimEtaPt = new TH1D("hPrimEtaPt","Primary eta pt at |y|=1",fNbinsPt,fMinPt, fMaxPt) ;
\r
466 outputContainer->Add(fhPrimEtaPt);
\r
468 fhPrimEtaAccPt = new TH1D("hPrimEtaAccPt","Primary eta pt with both photons in acceptance",fNbinsPt,fMinPt, fMaxPt) ;
\r
469 outputContainer->Add(fhPrimEtaAccPt);
\r
471 fhPrimOmegaPt = new TH1D("hPrimOmegaPt","Primary Omega pt at |y|=1",fNbinsPt,fMinPt, fMaxPt) ;
\r
472 outputContainer->Add(fhPrimOmegaPt);
\r
474 fhPrimOmegaAccPt = new TH1D("hPrimOmegaAccPt","Primary Omega pt with omega->pi0+gamma in acceptance",fNbinsPt,fMinPt, fMaxPt);
\r
475 outputContainer->Add(fhPrimOmegaAccPt);
\r
478 fhPrimPhotonY = new TH1D("hPrimPhotonY","Rapidity of primary pi0",100,-5.,5.) ;
\r
479 outputContainer->Add(fhPrimPhotonY) ;
\r
481 fhPrimPhotonAccY = new TH1D("hPrimPhotonAccY","Rapidity of primary pi0",100,-5.,5.) ;
\r
482 outputContainer->Add(fhPrimPhotonAccY) ;
\r
484 fhPrimPhotonPhi = new TH1D("hPrimPhotonPhi","Azimithal of primary photon",180,0.,360.) ;
\r
485 outputContainer->Add(fhPrimPhotonPhi) ;
\r
487 fhPrimPhotonAccPhi = new TH1D("hPrimPhotonAccPhi","Azimithal of primary photon in Acceptance",180,-0.,360.) ;
\r
488 outputContainer->Add(fhPrimPhotonAccPhi) ;
\r
491 fhPrimPi0Y = new TH1D("hPrimPi0Y","Rapidity of primary pi0",100,-5.,5.) ;
\r
492 outputContainer->Add(fhPrimPi0Y) ;
\r
494 fhPrimPi0AccY = new TH1D("hPrimPi0AccY","Rapidity of primary pi0",100,-5.,5.) ;
\r
495 outputContainer->Add(fhPrimPi0AccY) ;
\r
497 fhPrimPi0Phi = new TH1D("hPrimPi0Phi","Azimithal of primary pi0",180,0.,360.) ;
\r
498 outputContainer->Add(fhPrimPi0Phi) ;
\r
500 fhPrimPi0AccPhi = new TH1D("hPrimPi0AccPhi","Azimithal of primary pi0 with accepted daughters",180,-0.,360.) ;
\r
501 outputContainer->Add(fhPrimPi0AccPhi) ;
\r
504 fhPrimEtaY = new TH1D("hPrimEtaY","Rapidity of primary Eta",100,-5.,5.) ;
\r
505 outputContainer->Add(fhPrimEtaY) ;
\r
507 fhPrimEtaAccY = new TH1D("hPrimEtaAccY","Rapidity of primary eta",100,-5.,5.) ;
\r
508 outputContainer->Add(fhPrimEtaAccY) ;
\r
510 fhPrimEtaPhi = new TH1D("hPrimEtaPhi","Azimithal of primary eta",180,0.,360.) ;
\r
511 outputContainer->Add(fhPrimEtaPhi) ;
\r
513 fhPrimEtaAccPhi = new TH1D("hPrimEtaAccPhi","Azimithal of primary eta with accepted daughters",180,-0.,360.) ;
\r
514 outputContainer->Add(fhPrimEtaAccPhi) ;
\r
517 fhPrimOmegaY = new TH1D("hPrimOmegaY","Rapidity of primary Omega",100,-5.,5.) ;
\r
518 outputContainer->Add(fhPrimOmegaY) ;
\r
520 fhPrimOmegaAccY = new TH1D("hPrimOmegaAccY","Rapidity of primary omega->pi0+gamma",100,-5.,5.) ;
\r
521 outputContainer->Add(fhPrimOmegaAccY) ;
\r
523 fhPrimOmegaPhi = new TH1D("hPrimOmegaPhi","Azimithal of primary omega",180,0.,360.) ;
\r
524 outputContainer->Add(fhPrimOmegaPhi) ;
\r
526 fhPrimOmegaAccPhi = new TH1D("hPrimOmegaAccPhi","Azimithal of primary omega->pi0+gamma with accepted daughters",180,-0.,360.) ;
\r
527 outputContainer->Add(fhPrimOmegaAccPhi);
\r
529 return outputContainer;
\r
532 //______________________________________________________________________________
\r
533 void AliAnaNeutralMeson::Print(const Option_t * /*opt*/) const
\r
535 //Print some relevant parameters set for the analysis
\r
536 printf("**** Print %s %s ****\n", GetName(), GetTitle() ) ;
\r
537 AliAnaPartCorrBaseClass::Print(" ");
\r
538 printf("performing the analysis of 2gamma IVM %d\n", fAnaPi0Eta); //IVM: Invariant Mass
\r
539 printf("performing the analysis of pi0+gamma->3gamma IVM %d\n", fAnaOmega);
\r
540 printf("Number of Events to be mixed: %d \n",fNmaxMixEv) ;
\r
541 printf("Number of different PID used: %d \n",fNPID) ;
\r
542 printf("Number of different Asy cut: %d\n",fNAsy);
\r
543 printf("Asy bins: %d Min: %2.1f Max: %2.1f\n", fNbinsAsy, fMinAsy, fMaxAsy);
\r
544 printf("Pt bins: %d Min: %2.1f Max: %2.1f GeV/c\n", fNbinsPt, fMinPt, fMaxPt);
\r
545 printf("IVM bins: %d Min: %2.1f Max: %2.1f GeV/c^2\n", fNbinsM, fMinM, fMaxM);
\r
546 printf("produce the %d histograms per %2.1fGeV/c pt bin \n", fNHistos,fPerPtBin);
\r
547 printf("Vertec, centrality Cuts, RP are not used at present \n") ;
\r
548 printf("------------------------------------------------------\n") ;
\r
552 //______________________________________________________________________________
\r
553 void AliAnaNeutralMeson::MakeAnalysisFillHistograms()
\r
555 //process event from AOD brach
\r
556 //extract pi0, eta and omega analysis
\r
557 Int_t iRun=(GetReader()->GetInputEvent())->GetRunNumber() ;
\r
558 if(IsBadRun(iRun)) return ;
\r
560 //vertex cut not used yet
\r
561 //centrality not used yet
\r
562 //reaction plane not used yet
\r
564 TClonesArray * array1 = (TClonesArray*)GetInputAODBranch();
\r
565 Int_t nPhot = array1 ->GetEntries();
\r
566 fhNClusters->Fill(nPhot);
\r
568 //fill photon clusters
\r
569 for(Int_t i=0;i<nPhot;i++){
\r
570 AliAODPWG4Particle * p1 = (AliAODPWG4Particle*) (GetInputAODBranch()->At(i)) ;
\r
571 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
572 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
573 for(Int_t jmod=0;jmod<fNMod;jmod++){
\r
574 if(IsPhotonSelected(p1, ipid, fModCut[jmod])){
\r
575 fhRecPhoton[ipid*fNMod+jmod]->Fill(photon1.Pt());
\r
576 Double_t phi = photon1.Phi() ;
\r
577 if(phi<0) phi = photon1.Phi()+2*TMath::Pi();
\r
578 fhRecPhotonEtaPhi[ipid*fNMod+jmod]->Fill(photon1.Eta(),phi);
\r
584 /////////////////////////////////////////////
\r
586 if(nPhot>=2 && fAnaPi0Eta){
\r
587 // printf("real nPhot: %d \n",nPhot);
\r
589 RealPi0Eta(array1); //real events for pi0 and eta
\r
591 TList * evMixListPi0Eta=fEventsListPi0Eta ; //with cluster larger than 1
\r
592 Int_t nMixed = evMixListPi0Eta->GetSize() ;
\r
593 ////////////////////////////////////////////
\r
594 //Mixing events for pi0 and eta to reconstruct the background
\r
595 for(Int_t i1=0; i1<nMixed; i1++){
\r
596 TClonesArray* array2= (TClonesArray*) (evMixListPi0Eta->At(i1));
\r
597 MixPi0Eta(array1, array2);
\r
599 ////////////////////////////////////////////
\r
601 //event buffer for pi0 and eta
\r
602 TClonesArray *currentEvent = new TClonesArray(*array1);
\r
604 if(currentEvent->GetEntriesFast()>=2){
\r
605 evMixListPi0Eta->AddFirst(currentEvent) ;
\r
606 currentEvent=0 ; //Now list of particles belongs to buffer and it will be deleted with buffer
\r
607 if(evMixListPi0Eta->GetSize()>=fNmaxMixEv) {
\r
608 TClonesArray * tmp = (TClonesArray*) (evMixListPi0Eta->Last()) ;
\r
609 evMixListPi0Eta->RemoveLast() ;
\r
613 else{ //empty event
\r
614 delete currentEvent ;
\r
620 if(nPhot>=3 && fAnaOmega) {
\r
621 RealOmega(array1); //real events for omega
\r
622 TList * evMixListOmega = fEventsListOmega ; //with cluster larger than 2
\r
623 Int_t nMixedOmega = evMixListOmega->GetSize() ;
\r
625 ////////////////////////////////////////////
\r
627 for(Int_t i1=0; i1<nMixedOmega; i1++){
\r
628 TClonesArray* array2= (TClonesArray*) (evMixListOmega->At(i1));
\r
629 MixOmegaAB(array1, array2);
\r
631 for(Int_t i2=i1+1;i2<nMixedOmega;i2++){
\r
632 TClonesArray * array3 = (TClonesArray*)(evMixListOmega->At(i2));
\r
633 // printf("omega nPhot: %d nPhot2: %d nPhot3: %d \n", nPhot,nPhot2,nPhot3);
\r
634 MixOmegaC(array1,array2,array3);
\r
638 //fill event buffer with 2 more clusters events for omega extraction
\r
639 TClonesArray *currentEventOmega = new TClonesArray(*array1);
\r
640 if(currentEventOmega->GetEntriesFast()>=3){
\r
641 evMixListOmega->AddFirst(currentEventOmega) ;
\r
642 currentEventOmega=0 ; //Now list of particles belongs to buffer and it will be deleted with buffer
\r
643 if(evMixListOmega->GetSize()>=fNmaxMixEv) {
\r
644 TClonesArray * tmp = (TClonesArray*) (evMixListOmega->Last()) ;
\r
645 evMixListOmega->RemoveLast() ;
\r
649 else{ //empty event
\r
650 delete currentEventOmega ;
\r
651 currentEventOmega=0 ;
\r
656 if(fCalorimeter=="PHOS" && (IsDataMC() || (GetReader()->GetDataType() == AliCaloTrackReader::kMC)) ){
\r
657 if(GetReader()->ReadStack()){
\r
658 AliStack * stack = GetMCStack();
\r
659 //photon acceptance
\r
660 PhotonAcceptance(stack);
\r
661 //pi0 and eta acceptance
\r
662 Pi0EtaAcceptance(stack);
\r
663 //omega acceptance
\r
664 OmegaAcceptance(stack);
\r
666 else if(GetReader()->ReadAODMCParticles()){
\r
667 printf("AliAnaNeutralMeson::MakeAnalysisFillHistograms() - Acceptance calculation with MCParticles not implemented yet\n");
\r
673 //______________________________________________________________________________
\r
674 Bool_t AliAnaNeutralMeson::IsPhotonSelected(AliAODPWG4Particle *p1, Int_t ipid, Int_t nmod)
\r
676 //select the photon to be analyzed based on pid and which module
\r
678 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
681 if(fCalorimeter == "PHOS"){
\r
682 #ifdef __PHOSUTIL__
\r
683 Double_t vtx[3]={0,0,0};
\r
684 // if(GetReader()->GetDataType() != AliCaloTrackReader::kMC) GetReader()->GetVertex(vtx);
\r
685 Double_t x = 0 ,z = 0 ;
\r
686 fPHOSGeo->ImpactOnEmc(vtx,p1->Theta(),p1->Phi(), mod,z,x) ;
\r
691 else if(fCalorimeter == "EMCAL"){
\r
693 #ifdef __EMCALUTIL__
\r
695 //TVector3 vtx(p1->Vx(),p1->Vy(),p1->Vz());//CHECK
\r
696 TVector3 vtx(0,0,0);
\r
697 TVector3 vimpact(0,0,0);
\r
698 fEMCALGeo->ImpactOnEmcal(vtx,p1->Theta(),p1->Phi(),AbsID,vimpact);
\r
700 //Get from the absid the supermodule, tower and eta/phi numbers
\r
704 fEMCALGeo->GetCellIndex(AbsID,mod,tower,phiT,etaT);
\r
709 if(mod<=nmod && p1->IsPIDOK(ipid,AliCaloPID::kPhoton)) return kTRUE;
\r
710 else return kFALSE;
\r
714 //______________________________________________________________________________
\r
715 void AliAnaNeutralMeson::Get2GammaAsyDistPtM(AliAODPWG4Particle *p1, AliAODPWG4Particle *p2,
\r
716 Double_t &asy, Double_t &dist, Double_t &pt, Double_t &mass)
\r
718 //get the asy, dist, pair pt and pair inv mass from the 2gammas
\r
719 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
720 TLorentzVector photon2(p2->Px(),p2->Py(),p2->Pz(),p2->E());
\r
721 if(photon1.Pt()>0 && photon2.Pt()>0){
\r
722 asy=TMath::Abs(photon1.E()-photon2.E())/(photon1.E()+photon2.E());
\r
723 Double_t phi1 = photon1.Phi();
\r
724 Double_t phi2 = photon2.Phi();
\r
725 Double_t eta1 = photon1.Eta();
\r
726 Double_t eta2 = photon2.Eta();
\r
727 dist=TMath::Sqrt((phi1-phi2)*(phi1-phi2)+(eta1-eta2)*(eta1-eta2));
\r
728 pt=(photon1+photon2).Pt();
\r
729 mass=(photon1+photon2).M();
\r
730 // printf("asy: %2.3f dist: %2.3f pt: %2.3f m: %2.3f\n",asy,dist,pt,mass);
\r
732 else { asy=0; dist =0; pt =0; mass=0;}
\r
735 //______________________________________________________________________________
\r
736 void AliAnaNeutralMeson::GetAsyDistPtM(TLorentzVector photon1, TLorentzVector photon2,
\r
737 Double_t &asy, Double_t &dist, Double_t &pt, Double_t &mass)
\r
739 //get the asy, dist, pair pt and pair inv mass from the 2gammas
\r
740 if(photon1.Pt()>0 && photon2.Pt()>0){
\r
741 asy=TMath::Abs(photon1.E()-photon2.E())/(photon1.E()+photon2.E());
\r
742 Double_t phi1 = photon1.Phi();
\r
743 Double_t phi2 = photon2.Phi();
\r
744 Double_t eta1 = photon1.Eta();
\r
745 Double_t eta2 = photon2.Eta();
\r
746 dist=TMath::Sqrt((phi1-phi2)*(phi1-phi2)+(eta1-eta2)*(eta1-eta2));
\r
747 pt=(photon1+photon2).Pt();
\r
748 mass=(photon1+photon2).M();
\r
749 // printf("asy: %2.3f dist: %2.3f pt: %2.3f m: %2.3f\n",asy,dist,pt,mass);
\r
751 else { asy=0; dist =0; pt =0; mass=0;}
\r
754 //______________________________________________________________________________
\r
755 void AliAnaNeutralMeson::RealPi0Eta(TClonesArray * array)
\r
757 //get the 2gamma invariant mass distribution from one event
\r
758 Int_t nclusters = array->GetEntries();
\r
759 for(Int_t ie=0;ie<nclusters;ie++){
\r
760 for(Int_t je=ie+1;je<nclusters;je++){
\r
761 AliAODPWG4Particle * p1 = (AliAODPWG4Particle *)array->At(ie);
\r
762 AliAODPWG4Particle * p2 = (AliAODPWG4Particle *)array->At(je);
\r
764 Get2GammaAsyDistPtM(p1,p2,fAsy,fDist,fPt,fMass);
\r
765 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
767 if((p1->IsPIDOK(ipid,AliCaloPID::kPhoton)) && (p2->IsPIDOK(ipid,AliCaloPID::kPhoton))){
\r
768 fRealTwoGammaAsyPtM[ipid]->Fill(fAsy, fPt, fMass); //default module with pid
\r
771 for(Int_t jmod=0;jmod<fNMod;jmod++){
\r
772 for(Int_t kasy=0;kasy<fNAsy;kasy++){
\r
773 if(IsPhotonSelected(p1,ipid,fModCut[jmod]) && IsPhotonSelected(p2,ipid,fModCut[jmod])){
\r
774 Get2GammaAsyDistPtM(p1,p2,fAsy,fDist,fPt,fMass);
\r
775 //filling the histo
\r
776 for(Int_t mhist=0;mhist<fNHistos;mhist++){
\r
777 Double_t pt1 =mhist *fPerPtBin;
\r
778 Double_t pt2 =(mhist+1)*fPerPtBin;
\r
779 Int_t index = ipid*fNMod*fNAsy*fNHistos+jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
780 if(fMass<fInvMassCut && fAsy<fAsyCut[kasy]
\r
781 && fPt<pt2 && fPt>pt1 &&fAsy && fDist && fPt && fMass)
\r
782 fReal2Gamma[index]->Fill(fMass);
\r
784 } //photon selection
\r
793 //______________________________________________________________________________
\r
794 void AliAnaNeutralMeson::MixPi0Eta(TClonesArray * array1, TClonesArray * array2)
\r
796 //mixing events for pi0 and eta invariant mass analysis
\r
797 // printf("mixed events for pi0 and eta invariant mass analysis!\n");
\r
798 Int_t nclusters1 = array1->GetEntries();
\r
799 Int_t nclusters2 = array2->GetEntries();
\r
800 for(Int_t ie=0;ie<nclusters1;ie++){
\r
801 AliAODPWG4Particle * p1 = (AliAODPWG4Particle *)array1->At(ie);
\r
802 for(Int_t je=0;je<nclusters2;je++){
\r
803 AliAODPWG4Particle * p2 = (AliAODPWG4Particle *)array2->At(je);
\r
804 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
805 TLorentzVector photon2(p2->Px(),p2->Py(),p2->Pz(),p2->E());
\r
806 Get2GammaAsyDistPtM(p1,p2, fAsy,fDist,fPt,fMass);
\r
808 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
809 if((p1->IsPIDOK(ipid,AliCaloPID::kPhoton)) && (p2->IsPIDOK(ipid,AliCaloPID::kPhoton))){
\r
810 fMixTwoGammaAsyPtM[ipid]->Fill(fAsy,fPt,fMass); //default module with pid
\r
812 for(Int_t jmod=0;jmod<fNMod;jmod++){
\r
813 for(Int_t kasy=0;kasy<fNAsy;kasy++){
\r
814 if(IsPhotonSelected(p1,ipid,fModCut[jmod]) && IsPhotonSelected(p2,ipid,fModCut[jmod])){
\r
815 for(Int_t mhist=0;mhist<fNHistos;mhist++){
\r
816 Double_t pt1 =mhist *fPerPtBin;
\r
817 Double_t pt2 =(mhist+1)*fPerPtBin;
\r
818 Int_t index = ipid*fNMod*fNAsy*fNHistos+jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
819 if(fMass<fInvMassCut && fAsy<fAsyCut[kasy]
\r
820 && fPt<pt2 && fPt>pt1 &&fAsy&& fDist && fPt && fMass)
\r
821 fMix2Gamma[index]->Fill(fMass);
\r
823 } //photon selected
\r
831 //______________________________________________________________________________
\r
832 void AliAnaNeutralMeson::RealOmega(TClonesArray * array)
\r
834 //omega invariant mass extraction
\r
836 // 1. select the pi0 candidate from 2gamma
\r
837 // 2. combine the third photon with the pi0 candidate to get the omega invariant mass
\r
839 Int_t nclusters = array->GetEntries();
\r
840 for(Int_t ie=0;ie<nclusters;ie++){//ptc1
\r
841 for(Int_t je=ie+1;je<nclusters;je++){ //ptc2
\r
842 AliAODPWG4Particle * p1 = (AliAODPWG4Particle *)array->At(ie);
\r
843 AliAODPWG4Particle * p2 = (AliAODPWG4Particle *)array->At(je);
\r
844 //pid, mod and asy cut
\r
845 Double_t f2gammaAsy;
\r
846 Get2GammaAsyDistPtM(p1,p2,f2gammaAsy,fDist,fPt,fMass);
\r
848 if(TMath::Abs(fMass-fPi0Mass)<fPi0MassPeakWidthCut){//select the pi0 candidate
\r
849 for(Int_t ke=0;ke<nclusters;ke++){ //ptc3
\r
850 AliAODPWG4Particle * p3 = (AliAODPWG4Particle *)array->At(ke);
\r
851 if(p3 != p2 && p3 != p1 ){ ////p3!=p1 p3!=p2
\r
852 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
853 TLorentzVector photon2(p2->Px(),p2->Py(),p2->Pz(),p2->E());
\r
854 Double_t px12 =(photon1+photon2).Px();
\r
855 Double_t py12 =(photon1+photon2).Py();
\r
856 Double_t pz12 =(photon1+photon2).Pz();
\r
857 Double_t e12 =(photon1+photon2).E();
\r
858 TLorentzVector photon12(px12, py12,pz12,e12);
\r
860 TLorentzVector photon3(p3->Px(),p3->Py(),p3->Pz(),p3->E());
\r
861 GetAsyDistPtM(photon12, photon3,fAsy,fDist,fPt,fMass);
\r
862 for(Int_t ipid=0;ipid<fNPID;ipid++){ //pid
\r
863 if(p1->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
864 p2->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
865 p3->IsPIDOK(ipid,AliCaloPID::kPhoton)){
\r
866 fRealPi0GammaAsyPtM[ipid]->Fill(fAsy, fPt, fMass); //default module, without pid
\r
869 for(Int_t jmod=0;jmod<fNMod;jmod++){ //mod
\r
870 for(Int_t kasy=0;kasy<fNAsy;kasy++){ //asy
\r
871 if(IsPhotonSelected(p1,ipid,fModCut[jmod]) &&
\r
872 IsPhotonSelected(p2,ipid,fModCut[jmod]) &&
\r
873 IsPhotonSelected(p3,ipid,fModCut[jmod])){ //photon selection
\r
875 //filling the histo
\r
876 for(Int_t mhist=0;mhist<fNHistos;mhist++){ //hist
\r
877 Double_t pt1 =mhist *fPerPtBin;
\r
878 Double_t pt2 =(mhist+1)*fPerPtBin;
\r
879 Int_t index = ipid*fNMod*fNAsy*fNHistos+
\r
880 jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
881 if(fMass<fInvMassCut && f2gammaAsy<fAsyCut[kasy] &&
\r
882 fPt<pt2 && fPt>pt1&& fAsy<fAsyCut[kasy] &&fAsy&&fDist&&fPt&&fMass)
\r
883 fRealOmega[index]->Fill(fMass);
\r
885 } //photon selection
\r
897 //______________________________________________________________________________
\r
898 void AliAnaNeutralMeson::MixOmegaAB(TClonesArray * array1, TClonesArray * array2)
\r
901 //three omega background, we classify it A, B and C
\r
903 // (r1_event1+r2_event1)+r3_event2
\r
906 // (r1_event1+r2_event2)+r3_event2
\r
909 // (r1_event1+r2_event2)+r3_event3
\r
911 Int_t nclusters1 = array1->GetEntries();
\r
912 Int_t nclusters2 = array2->GetEntries();
\r
913 for(Int_t ie=0;ie<nclusters1;ie++){
\r
915 for(Int_t je=ie+1;je<nclusters1;je++){ //.............
\r
916 AliAODPWG4Particle * p1 = (AliAODPWG4Particle *)array1->At(ie);
\r
917 AliAODPWG4Particle * p2 = (AliAODPWG4Particle *)array1->At(je);
\r
918 Double_t f2gammaAsy ;
\r
919 Get2GammaAsyDistPtM(p1,p2,f2gammaAsy,fDist,fPt,fMass);
\r
920 if(TMath::Abs(fMass-fPi0Mass)<fPi0MassPeakWidthCut ){ //pi0 candidate
\r
921 for(Int_t ke=0;ke<nclusters2;ke++){ //third photon
\r
922 AliAODPWG4Particle * p3 = (AliAODPWG4Particle *)array2->At(ke);
\r
923 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
924 TLorentzVector photon2(p2->Px(),p2->Py(),p2->Pz(),p2->E());
\r
925 Double_t px12 =(photon1+photon2).Px();
\r
926 Double_t py12 =(photon1+photon2).Py();
\r
927 Double_t pz12 =(photon1+photon2).Pz();
\r
928 Double_t e12 =(photon1+photon2).E();
\r
929 TLorentzVector photon12(px12, py12,pz12,e12);
\r
930 TLorentzVector photon3(p3->Px(),p3->Py(),p3->Pz(),p3->E());
\r
931 GetAsyDistPtM(photon12, photon3,fAsy,fDist,fPt,fMass);
\r
932 //pid, mod and asy cut
\r
933 for(Int_t ipid=0;ipid<fNPID;ipid++){ //pid
\r
934 if(p1->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
935 p2->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
936 p3->IsPIDOK(ipid,AliCaloPID::kPhoton)){
\r
937 fMixAPi0GammaAsyPtM[ipid]->Fill(fAsy, fPt, fMass); //default module, with pid
\r
939 for(Int_t jmod=0;jmod<fNMod;jmod++){ //mod
\r
940 for(Int_t kasy=0;kasy<fNAsy;kasy++){ //asy
\r
941 if(IsPhotonSelected(p1,ipid,fModCut[jmod]) &&
\r
942 IsPhotonSelected(p2,ipid,fModCut[jmod]) &&
\r
943 IsPhotonSelected(p3,ipid,fModCut[jmod])){ //photon selection
\r
945 for(Int_t mhist=0;mhist<fNHistos;mhist++){ //hist
\r
946 Double_t pt1 =mhist *fPerPtBin;
\r
947 Double_t pt2 =(mhist+1)*fPerPtBin;
\r
948 Int_t index = ipid*fNMod*fNAsy*fNHistos+ jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
949 if(fMass<fInvMassCut && f2gammaAsy<fAsyCut[kasy] &&
\r
950 fPt<pt2 && fPt>pt1&& fAsy<fAsyCut[kasy] &&fAsy&&fDist&&fPt&&fMass)
\r
951 fMixOmegaA[index]->Fill(fMass);
\r
953 }//photon selection
\r
962 for(Int_t je=0;je<nclusters2;je++){ //mixb...............
\r
963 AliAODPWG4Particle * p1 = (AliAODPWG4Particle *)array1->At(ie);
\r
964 AliAODPWG4Particle * p2 = (AliAODPWG4Particle *)array2->At(je);
\r
965 Double_t f2gammaAsy;
\r
966 Get2GammaAsyDistPtM(p1,p2,f2gammaAsy,fDist,fPt,fMass);
\r
967 if(TMath::Abs(fMass-fPi0Mass)<fPi0MassPeakWidthCut){
\r
968 for(Int_t ke=0;ke<nclusters2;ke++){ //third photon
\r
969 AliAODPWG4Particle * p3 = (AliAODPWG4Particle *)array2->At(ke);
\r
970 if(p3 != p2){ //p3 != p2
\r
971 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
972 TLorentzVector photon2(p2->Px(),p2->Py(),p2->Pz(),p2->E());
\r
973 Double_t px12 =(photon1+photon2).Px();
\r
974 Double_t py12 =(photon1+photon2).Py();
\r
975 Double_t pz12 =(photon1+photon2).Pz();
\r
976 Double_t e12 =(photon1+photon2).E();
\r
977 TLorentzVector photon12(px12, py12,pz12,e12);
\r
978 TLorentzVector photon3(p3->Px(),p3->Py(),p3->Pz(),p3->E());
\r
979 GetAsyDistPtM(photon12, photon3,fAsy,fDist,fPt,fMass);
\r
981 for(Int_t ipid=0;ipid<fNPID;ipid++){ //pid
\r
982 if(p1->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
983 p2->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
984 p3->IsPIDOK(ipid,AliCaloPID::kPhoton)){
\r
985 fMixBPi0GammaAsyPtM[ipid]->Fill(fAsy, fPt, fMass); //default module, with pid
\r
987 for(Int_t jmod=0;jmod<fNMod;jmod++){ //mod
\r
988 for(Int_t kasy=0;kasy<fNAsy;kasy++){ //asy
\r
989 if(IsPhotonSelected(p1,ipid,fModCut[jmod]) &&
\r
990 IsPhotonSelected(p2,ipid,fModCut[jmod]) &&
\r
991 IsPhotonSelected(p3,ipid,fModCut[jmod])){ //photon selectin
\r
993 for(Int_t mhist=0;mhist<fNHistos;mhist++){ //hist
\r
994 Double_t pt1 =mhist *fPerPtBin;
\r
995 Double_t pt2 =(mhist+1)*fPerPtBin;
\r
996 Int_t index = ipid*fNMod*fNAsy*fNHistos+ jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
997 if(fMass<fInvMassCut && f2gammaAsy<fAsyCut[kasy] &&
\r
998 fPt<pt2 && fPt>pt1&& fAsy<fAsyCut[kasy] &&fAsy&&fDist&&fPt&&fMass)
\r
999 fMixOmegaB[index]->Fill(fMass);
\r
1001 } //photon selection
\r
1014 //______________________________________________________________________________
\r
1015 void AliAnaNeutralMeson::MixOmegaC(TClonesArray * array1, TClonesArray * array2, TClonesArray * array3)
\r
1017 //omega background
\r
1018 //three omega background, we classify it A, B and C
\r
1020 // (r1_event1+r2_event1)+r3_event2
\r
1023 // (r1_event1+r2_event2)+r3_event2
\r
1026 // (r1_event1+r2_event2)+r3_event3
\r
1027 Int_t nclusters1 = array1->GetEntries();
\r
1028 Int_t nclusters2 = array2->GetEntries();
\r
1029 Int_t nclusters3 = array3->GetEntries();
\r
1030 for(Int_t ie=0;ie<nclusters1;ie++){
\r
1031 for(Int_t je=0;je<nclusters2;je++){
\r
1032 AliAODPWG4Particle * p1 = (AliAODPWG4Particle *)array1->At(ie);
\r
1033 AliAODPWG4Particle * p2 = (AliAODPWG4Particle *)array2->At(je);
\r
1034 Double_t f2gammaAsy;
\r
1035 Get2GammaAsyDistPtM(p1,p2,f2gammaAsy,fDist,fPt,fMass);
\r
1036 if(TMath::Abs(fMass-fPi0Mass)<fPi0MassPeakWidthCut){
\r
1037 for(Int_t ke=0;ke<nclusters3;ke++){
\r
1038 AliAODPWG4Particle * p3 = (AliAODPWG4Particle *)array3->At(ke); //third photon
\r
1039 TLorentzVector photon1(p1->Px(),p1->Py(),p1->Pz(),p1->E());
\r
1040 TLorentzVector photon2(p2->Px(),p2->Py(),p2->Pz(),p2->E());
\r
1041 Double_t px12 =(photon1+photon2).Px();
\r
1042 Double_t py12 =(photon1+photon2).Py();
\r
1043 Double_t pz12 =(photon1+photon2).Pz();
\r
1044 Double_t e12 =(photon1+photon2).E();
\r
1045 TLorentzVector photon12(px12, py12,pz12,e12);
\r
1046 TLorentzVector photon3(p3->Px(),p3->Py(),p3->Pz(),p3->E());
\r
1047 GetAsyDistPtM(photon12, photon3,fAsy,fDist,fPt,fMass);
\r
1049 for(Int_t ipid=0;ipid<fNPID;ipid++){
\r
1050 if(p1->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
1051 p2->IsPIDOK(ipid,AliCaloPID::kPhoton) &&
\r
1052 p3->IsPIDOK(ipid,AliCaloPID::kPhoton)){
\r
1053 fMixCPi0GammaAsyPtM[ipid]->Fill(fAsy, fPt, fMass); //default module, with pid
\r
1055 for(Int_t jmod=0;jmod<fNMod;jmod++){
\r
1056 for(Int_t kasy=0;kasy<fNAsy;kasy++){
\r
1057 if(IsPhotonSelected(p1,ipid,fModCut[jmod]) &&
\r
1058 IsPhotonSelected(p2,ipid,fModCut[jmod])&&
\r
1059 IsPhotonSelected(p3,ipid,fModCut[jmod])){
\r
1061 //filling the histo
\r
1062 for(Int_t mhist=0;mhist<fNHistos;mhist++){
\r
1063 Double_t pt1 =mhist *fPerPtBin;
\r
1064 Double_t pt2 =(mhist+1)*fPerPtBin;
\r
1065 Int_t index = ipid*fNMod*fNAsy*fNHistos+ jmod*fNAsy*fNHistos+kasy*fNHistos+mhist;
\r
1066 if(fMass<fInvMassCut && f2gammaAsy<fAsyCut[kasy] &&
\r
1067 fPt<pt2 && fPt>pt1&& fAsy<fAsyCut[kasy] &&fAsy&&fDist&&fPt&&fMass)
\r
1068 fMixOmegaC[index]->Fill(fMass);
\r
1070 }//photon selection
\r
1081 //______________________________________________________________________________
\r
1082 void AliAnaNeutralMeson::PhotonAcceptance(AliStack * stack)
\r
1084 //photon Acceptance
\r
1085 for(Int_t i=0 ; i<stack->GetNtrack(); i++){
\r
1086 TParticle * prim = stack->Particle(i) ;
\r
1087 Int_t pdg = prim->GetPdgCode() ;
\r
1088 // Int_t ndau = prim->GetNDaughters();
\r
1089 // Int_t iphot1=prim->GetFirstDaughter() ;
\r
1090 // Int_t iphot2=prim->GetLastDaughter() ;
\r
1091 if(pdg ==22 && stack->IsPhysicalPrimary(i)) {
\r
1092 Double_t photonPt = prim->Pt() ;
\r
1093 //printf("photon, pt %2.2f\n",photonPt);
\r
1094 Double_t photonY = 0.5*TMath::Log((prim->Energy()-prim->Pz())/(prim->Energy()+prim->Pz())) ;
\r
1095 Double_t phi = TMath::RadToDeg()*prim->Phi() ;
\r
1096 if(TMath::Abs(photonY) < 0.5){ fhPrimPhotonPt->Fill(photonPt); }
\r
1097 fhPrimPhotonY ->Fill(photonY) ;
\r
1098 fhPrimPhotonPhi->Fill(phi) ;
\r
1099 //Check if both photons hit Calorimeter
\r
1100 Bool_t inacceptance = kFALSE;
\r
1102 if(fCalorimeter == "PHOS"){
\r
1104 #ifdef __PHOSUTIL__
\r
1107 if(fPHOSGeo->ImpactOnEmc(prim,mod,z,x))
\r
1108 inacceptance = kTRUE;
\r
1109 //printf("In REAL PHOS acceptance? %d\n",inacceptance);
\r
1111 TLorentzVector lv1;
\r
1112 prim->Momentum(lv1);
\r
1113 if(GetFidutialCut()->IsInFidutialCut(lv1,fCalorimeter))
\r
1114 inacceptance = kTRUE ;
\r
1115 if(GetDebug() > 2) printf("In %s fidutial cut acceptance? %d\n",fCalorimeter.Data(),inacceptance);
\r
1120 else if(fCalorimeter == "EMCAL"){
\r
1122 #ifdef __EMCALUTIL__
\r
1124 if(fEMCALGeo->Impact(prim))
\r
1125 inacceptance = kTRUE;
\r
1126 if(GetDebug() > 2) printf("In REAL EMCAL acceptance? %d\n",inacceptance);
\r
1128 TLorentzVector lv1;
\r
1129 prim->Momentum(lv1);
\r
1130 if(GetFidutialCut()->IsInFidutialCut(lv1,fCalorimeter))
\r
1131 inacceptance = kTRUE ;
\r
1132 //printf("In %s fidutial cut acceptance? %d\n",fCalorimeter.Data(),inacceptance);
\r
1137 fhPrimPhotonAccPt->Fill(photonPt) ;
\r
1138 fhPrimPhotonAccPhi->Fill(phi) ;
\r
1139 fhPrimPhotonAccY->Fill(photonY) ;
\r
1142 }// Primary photon
\r
1143 }//loop on primaries
\r
1146 //______________________________________________________________________________
\r
1147 void AliAnaNeutralMeson::Pi0EtaAcceptance(AliStack * stack)
\r
1149 //pi0 and eta Acceptance
\r
1150 for(Int_t i=0 ; i<stack->GetNprimary(); i++){
\r
1151 TParticle * prim = stack->Particle(i) ;
\r
1152 Int_t pdg = prim->GetPdgCode() ;
\r
1153 if(pdg==111 || pdg==221){
\r
1154 Double_t pi0Pt = prim->Pt() ;
\r
1155 //printf(" pi0, pt %2.2f\n",pi0Pt);
\r
1156 Double_t pi0Y = 0.5*TMath::Log((prim->Energy()-prim->Pz())/(prim->Energy()+prim->Pz())) ;
\r
1157 Double_t phi = TMath::RadToDeg()*prim->Phi();
\r
1159 if(TMath::Abs(pi0Y) < 0.5) fhPrimPi0Pt->Fill(pi0Pt) ;
\r
1160 fhPrimPi0Y ->Fill(pi0Y) ;
\r
1161 fhPrimPi0Phi->Fill(phi) ;
\r
1164 if(TMath::Abs(pi0Y) < 0.5) fhPrimEtaPt->Fill(pi0Pt) ;
\r
1165 fhPrimEtaY ->Fill(pi0Y) ;
\r
1166 fhPrimEtaPhi->Fill(phi) ;
\r
1168 //Check if both photons hit Calorimeter
\r
1169 Int_t ndau = prim->GetNDaughters();
\r
1170 Int_t iphot1=prim->GetFirstDaughter() ;
\r
1171 Int_t iphot2=prim->GetLastDaughter() ;
\r
1172 if(ndau==2 && ndau>1 && iphot1>-1 && iphot1<stack->GetNtrack()
\r
1173 && iphot2>-1 && iphot2<stack->GetNtrack()){
\r
1174 TParticle * phot1 = stack->Particle(iphot1) ;
\r
1175 TParticle * phot2 = stack->Particle(iphot2) ;
\r
1176 if(phot1 && phot2 && phot1->GetPdgCode()==22 && phot2->GetPdgCode()==22){
\r
1177 Bool_t inacceptance = kFALSE;
\r
1179 if(fCalorimeter == "PHOS"){
\r
1181 #ifdef __PHOSUTIL__
\r
1182 Int_t mod, mod1,mod2 ;
\r
1183 Double_t x, z, x1,z1,x2,z2;
\r
1184 if(fPHOSGeo->ImpactOnEmc(prim, mod, z,x) && fPHOSGeo->ImpactOnEmc(phot1,mod1,z1,x1)
\r
1185 && fPHOSGeo->ImpactOnEmc(phot2,mod2,z2,x2)) inacceptance = kTRUE;
\r
1187 //printf("In REAL PHOS acceptance? %d\n",inacceptance);
\r
1189 TLorentzVector lv0, lv1, lv3;
\r
1190 prim->Momentum(lv0);
\r
1191 phot1->Momentum(lv1);
\r
1192 phot2->Momentum(lv3);
\r
1193 if(GetFidutialCut()->IsInFidutialCut(lv0,fCalorimeter)
\r
1194 &&GetFidutialCut()->IsInFidutialCut(lv1,fCalorimeter)
\r
1195 && GetFidutialCut()->IsInFidutialCut(lv3,fCalorimeter)) inacceptance = kTRUE ;
\r
1200 else if(fCalorimeter == "EMCAL"){
\r
1202 #ifdef __EMCALUTIL__
\r
1203 if(fEMCALGeo->Impact(prim) && fEMCALGeo->Impact(phot1)
\r
1204 && fEMCALGeo->Impact(phot2)) inacceptance = kTRUE;
\r
1206 //printf("In REAL EMCAL acceptance? %d\n",inacceptance);
\r
1208 TLorentzVector lv0, lv1, lv3;
\r
1209 prim->Momentum(lv0);
\r
1210 phot1->Momentum(lv1);
\r
1211 phot2->Momentum(lv3);
\r
1212 if(GetFidutialCut()->IsInFidutialCut(lv0,fCalorimeter)
\r
1213 &&GetFidutialCut()->IsInFidutialCut(lv1,fCalorimeter)
\r
1214 && GetFidutialCut()->IsInFidutialCut(lv3,fCalorimeter)) inacceptance = kTRUE ;
\r
1218 // printf("In %s fFidutial cut acceptance? %d\n",fCalorimeter.Data(),inacceptance);
\r
1221 fhPrimPi0AccPt->Fill(pi0Pt) ;
\r
1222 fhPrimPi0AccPhi->Fill(phi) ; fhPrimPi0AccY->Fill(pi0Y) ;
\r
1225 fhPrimEtaAccPt->Fill(pi0Pt) ; fhPrimEtaAccPhi->Fill(phi) ;
\r
1226 fhPrimEtaAccY->Fill(pi0Y) ;
\r
1230 }//Check daughters exist
\r
1232 }//loop on primaries
\r
1235 //______________________________________________________________________________
\r
1236 void AliAnaNeutralMeson::OmegaAcceptance(AliStack * stack)
\r
1238 //acceptance for omega->pi0+gamma
\r
1239 for(Int_t i=0 ; i<stack->GetNprimary(); i++){ //aaa
\r
1240 TParticle * prim = stack->Particle(i) ;
\r
1241 Int_t pdg = prim->GetPdgCode();
\r
1242 if(pdg == 223){ //bbb
\r
1243 Double_t pt = prim->Pt() ;
\r
1244 Double_t y = 0.5*TMath::Log((prim->Energy()-prim->Pz())/(prim->Energy()+prim->Pz())) ;
\r
1245 Double_t phi = TMath::RadToDeg()*prim->Phi() ;
\r
1246 if(TMath::Abs(y) < 0.5){ fhPrimOmegaPt->Fill(pt) ; }
\r
1247 fhPrimOmegaY ->Fill(y) ;
\r
1248 fhPrimOmegaPhi->Fill(phi) ;
\r
1249 //check if omega->pi0+gamma->(gamma+gamma)+gamma hit Calorimeter
\r
1250 Int_t ndau = prim->GetNDaughters();
\r
1251 Int_t iphot1=prim->GetFirstDaughter() ;
\r
1252 Int_t iphot2=prim->GetLastDaughter() ;
\r
1253 if(ndau==2 && iphot1>-1 && iphot1<stack->GetNtrack() && iphot2>-1 && iphot2<stack->GetNtrack()){ //ccc
\r
1254 TParticle * phot1 = stack->Particle(iphot1) ;
\r
1255 TParticle * phot2 = stack->Particle(iphot2) ;
\r
1256 Int_t pdg1 = phot1->GetPdgCode();
\r
1257 Int_t pdg2 = phot2->GetPdgCode();
\r
1258 Int_t ndau2 = phot2->GetNDaughters();
\r
1259 if(ndau2==2 && phot1 && pdg1==22 &&phot2 && pdg2==111){ //ddd
\r
1260 Int_t jphot1 = phot2->GetFirstDaughter() ;
\r
1261 Int_t jphot2 = phot2->GetLastDaughter() ;
\r
1262 if(jphot1>-1 && jphot1<stack->GetNtrack() &&
\r
1263 jphot2>-1 && jphot2<stack->GetNtrack()){ //eee
\r
1264 TParticle * phot3 = stack->Particle(jphot1) ;
\r
1265 TParticle * phot4 = stack->Particle(jphot2) ;
\r
1266 Int_t pdg3 = phot3->GetPdgCode();
\r
1267 Int_t pdg4 = phot4->GetPdgCode();
\r
1268 if(phot3 && pdg3==22 && phot4 && pdg4==22){ //fff
\r
1269 Bool_t inacceptance = kFALSE;
\r
1271 if(fCalorimeter == "PHOS"){
\r
1272 #ifdef __PHOSUTIL__
\r
1273 Int_t mod, mod1,mod2,mod3 ;
\r
1274 Double_t x,z, x1,z1,x2,z2, x3,z3 ;
\r
1275 //3 gammas hit Calorimeter
\r
1276 if(fPHOSGeo->ImpactOnEmc(prim,mod,z,x)
\r
1277 && fPHOSGeo->ImpactOnEmc(phot1,mod1,z1,x1)
\r
1278 && fPHOSGeo->ImpactOnEmc(phot3,mod2,z2,x2)
\r
1279 && fPHOSGeo->ImpactOnEmc(phot4,mod3,z3,x3))
\r
1280 inacceptance = kTRUE;
\r
1283 TLorentzVector lv0,lv1, lv2, lv3;
\r
1284 prim->Momentum(lv0);
\r
1285 phot1->Momentum(lv1);
\r
1286 phot3->Momentum(lv2);
\r
1287 phot4->Momentum(lv3);
\r
1288 if(GetFidutialCut()->IsInFidutialCut(lv0,fCalorimeter) &&
\r
1289 GetFidutialCut()->IsInFidutialCut(lv1,fCalorimeter) &&
\r
1290 GetFidutialCut()->IsInFidutialCut(lv2,fCalorimeter) &&
\r
1291 GetFidutialCut()->IsInFidutialCut(lv3,fCalorimeter))
\r
1292 inacceptance = kTRUE ;
\r
1296 else if(fCalorimeter == "EMCAL"){
\r
1297 #ifdef __EMCALUTIL__
\r
1298 //3 gammas hit Calorimeter
\r
1299 if(fEMCALGeo->Impact(prim)
\r
1300 && fEMCALGeo->Impact(phot1)
\r
1301 && fEMCALGeo->Impact(phot3)
\r
1302 && fEMCALGeo->Impact(phot4))
\r
1303 inacceptance = kTRUE;
\r
1306 TLorentzVector lv0,lv1, lv2, lv3;
\r
1307 prim->Momentum(lv0);
\r
1308 phot1->Momentum(lv1);
\r
1309 phot3->Momentum(lv2);
\r
1310 phot4->Momentum(lv3);
\r
1311 if(GetFidutialCut()->IsInFidutialCut(lv0,fCalorimeter) &&
\r
1312 GetFidutialCut()->IsInFidutialCut(lv1,fCalorimeter) &&
\r
1313 GetFidutialCut()->IsInFidutialCut(lv2,fCalorimeter) &&
\r
1314 GetFidutialCut()->IsInFidutialCut(lv3,fCalorimeter))
\r
1315 inacceptance = kTRUE ;
\r
1319 if(inacceptance){ //ggg
\r
1320 fhPrimOmegaAccPt->Fill(pt) ;
\r
1321 fhPrimOmegaAccPhi->Fill(phi) ;
\r
1322 fhPrimOmegaAccY->Fill(y) ;
\r
1332 void AliAnaNeutralMeson::GetMCDistAsy(TParticle *p1,TParticle *p2,Double_t &dist,Double_t &asy)
\r
1334 //get dist and asy for MC particle
\r
1335 Double_t eta1 = p1->Eta();
\r
1336 Double_t eta2 = p2->Eta();
\r
1337 Double_t phi1 = p1->Phi();
\r
1338 Double_t phi2 = p2->Phi();
\r
1339 Double_t e1 = p1->Energy();
\r
1340 Double_t e2 = p2->Energy();
\r
1341 dist = TMath::Sqrt( (eta1-eta2)*(eta1-eta2) + (phi1-phi2)*(phi1-phi2));
\r
1342 if(e1+e2) asy = TMath::Abs(e1-e2)/(e1+e2);
\r
1345 //______________________________________________________________________________
\r
1346 //void AliAnaNeutralMeson::Terminate(TList * outList)
\r
1348 // //Do some calculations and plots from the final histograms.
\r
1349 // printf("AliAnaNeutralMeson::Terminate() - Not implemented yet\n");
\r