3 #include "AliAnalysisTaskEMCALIsoPhoton.h"
10 #include <THnSparse.h>
11 #include <TLorentzVector.h>
14 #include "AliAnalysisManager.h"
15 #include "AliAnalysisTask.h"
16 #include "AliEMCALGeometry.h"
17 #include "AliEMCALRecoUtils.h"
18 #include "AliESDCaloCells.h"
19 #include "AliESDCaloCluster.h"
20 #include "AliESDEvent.h"
21 #include "AliESDHeader.h"
22 #include "AliESDInputHandler.h"
23 #include "AliESDUtils.h"
24 #include "AliESDpid.h"
25 #include "AliESDtrack.h"
26 #include "AliESDtrackCuts.h"
28 #include "AliKFParticle.h"
29 #include "AliMCEvent.h"
30 #include "AliMCEventHandler.h"
32 #include "AliV0vertexer.h"
33 #include "AliVCluster.h"
35 ClassImp(AliAnalysisTaskEMCALIsoPhoton)
37 //________________________________________________________________________
38 AliAnalysisTaskEMCALIsoPhoton::AliAnalysisTaskEMCALIsoPhoton() :
46 fGeoName("EMCAL_COMPLETEV1"),
62 // Default constructor.
65 //________________________________________________________________________
66 AliAnalysisTaskEMCALIsoPhoton::AliAnalysisTaskEMCALIsoPhoton(const char *name) :
67 AliAnalysisTaskSE(name),
74 fGeoName("EMCAL_COMPLETEV1"),
92 // Define input and output slots here
93 // Input slot #0 works with a TChain
94 DefineInput(0, TChain::Class());
95 // Output slot #0 id reserved by the base class for AOD
96 // Output slot #1 writes into a TH1 container
97 DefineOutput(1, TList::Class());
100 //________________________________________________________________________
101 void AliAnalysisTaskEMCALIsoPhoton::UserCreateOutputObjects()
103 // Create histograms, called once.
105 fCaloClusters = new TRefArray();
106 fSelPrimTracks = new TObjArray();
109 fOutputList = new TList();
110 fOutputList->SetOwner();// Container cleans up all histos (avoids leaks in merging)
112 fGeom = AliEMCALGeometry::GetInstance(fGeoName);
114 fEvtSel = new TH1F("hEvtSel","Event selection counter (0=all trg, 1=pvz cut) ;evt cut ;dN/dcut}",2,0,2);
115 fOutputList->Add(fEvtSel);
118 fPVtxZ = new TH1F("hPVtxZ","primary vertex Z before cut;prim-vz(cm) ;",200,-100,100);
119 fOutputList->Add(fPVtxZ);
121 fCellAbsIdVsAmpl = new TH2F("hCellAbsIdVsAmpl","cell abs id vs cell amplitude (energy);E (GeV);ID",200,0,100,24*48*10,-0.5,24*48*10-0.5);
122 fOutputList->Add(fCellAbsIdVsAmpl);
124 fNClusHighClusE = new TH2F("hNClusHighClusE","total number of clusters vs. highest clus energy in the event;E (GeV);NClus",200,0,100,301,-0.5,300.5);
125 fOutputList->Add(fNClusHighClusE);
127 const Int_t ndims = fNDimensions;
128 Int_t nEt=1000, nM02=400, nCeIso=1000, nTrIso=1000, nAllIso=1000, nTrClDphi=200, nTrClDeta=100;
129 Int_t bins[] = {nEt, nM02, nCeIso, nTrIso, nAllIso, nTrClDphi, nTrClDeta};
130 Double_t xmin[] = { 0., 0., -10., -10., -10., -0.1,-0.05};
131 Double_t xmax[] = { 100., 4., 190., 190., 190., 0.1, 0.05};
132 fHnOutput = new THnSparseF("fHnOutput","Output matrix: E_{T},M02,CeIso,TrIso,AllIso, d#phi_{trk},d#eta_{trk}", ndims, bins, xmin, xmax);
133 fOutputList->Add(fHnOutput);
137 PostData(1, fOutputList);
140 //________________________________________________________________________
141 void AliAnalysisTaskEMCALIsoPhoton::UserExec(Option_t *)
143 // Main loop, called for each event.
145 // event trigger selection
146 Bool_t isSelected = 0;
147 if(fPeriod.Contains("11a")){
148 if(fTrigBit.Contains("kEMC"))
149 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC1);
151 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
154 if(fTrigBit.Contains("kEMC"))
155 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC7);
157 isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
162 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
164 printf("ERROR: fESD not available\n");
170 AliESDVertex *pv = (AliESDVertex*)fESD->GetPrimaryVertex();
173 fPVtxZ->Fill(pv->GetZ());
174 if(TMath::Abs(pv->GetZ())>15)
180 fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("Tracks"));
181 // Track loop to fill a pT spectrum
182 const Int_t Ntracks = fTracks->GetEntriesFast();
183 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
184 // for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
185 //AliESDtrack* track = (AliESDtrack*)fESD->GetTrack(iTracks);
186 AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(iTracks));
189 if (fPrTrCuts && fPrTrCuts->IsSelected(track)){
190 fSelPrimTracks->Add(track);
191 //printf("pt,eta,phi:%1.1f,%1.1f,%1.1f \n",track->Pt(),track->Eta(), track->Phi());
196 for(Int_t mod=0; mod < (fGeom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
197 if(fGeoName=="EMCAL_FIRSTYEARV1" && mod>3)
199 fGeom->SetMisalMatrix(fESD->GetEMCALMatrix(mod), mod);
202 fESD->GetEMCALClusters(fCaloClusters);
203 fEMCalCells = fESD->GetEMCALCells();
208 fCaloClusters->Clear();
209 fSelPrimTracks->Clear();
210 PostData(1, fOutputList);
213 //________________________________________________________________________
214 void AliAnalysisTaskEMCALIsoPhoton::FillClusHists()
216 // Fill cluster histograms.
220 const Int_t nclus = fCaloClusters->GetEntries();
224 for(Int_t ic=0;ic<nclus;ic++){
226 AliESDCaloCluster *c = static_cast<AliESDCaloCluster*>(fCaloClusters->At(ic));
234 Double_t Emax = GetMaxCellEnergy( c, id);
235 Double_t Ecross = GetCrossEnergy( c, id);
236 if((1-Ecross/Emax)>fExoticCut)
238 Float_t clsPos[3] = {0,0,0};
239 c->GetPosition(clsPos);
240 TVector3 clsVec(clsPos);
241 Double_t Et = c->E()*TMath::Sin(clsVec.Theta());
242 Float_t ceiso, cephiband, cecore;
243 Float_t triso, trphiband, trcore;
244 Float_t alliso, allphiband, allcore;
245 Float_t phibandArea = (1.4 - 2*fIsoConeR)*2*fIsoConeR;
246 Float_t netConeArea = TMath::Pi()*(fIsoConeR*fIsoConeR - 0.04*0.04);
247 GetCeIso(clsVec, ceiso, cephiband, cecore);
248 GetTrIso(clsVec, triso, trphiband, trcore);
249 alliso = ceiso + triso;
250 allphiband = cephiband + trphiband;
251 allcore = cecore + trcore;
252 Float_t ceisoue = cephiband/phibandArea*netConeArea;
253 Float_t trisoue = trphiband/phibandArea*netConeArea;
254 Float_t allisoue = allphiband/phibandArea*netConeArea;
255 const Int_t ndims = fNDimensions;
256 Double_t outputValues[ndims];
257 outputValues[0] = Et;
258 outputValues[1] = c->GetM02();
259 outputValues[2] = ceiso-cecore-ceisoue;
260 outputValues[3] = triso-trisoue;
261 outputValues[4] = alliso-cecore-allisoue;
262 outputValues[5] = c->GetTrackDx();
263 outputValues[6] = c->GetTrackDz();
264 fHnOutput->Fill(outputValues);
268 fNClusHighClusE->Fill(maxE,nclus);
271 //________________________________________________________________________
272 void AliAnalysisTaskEMCALIsoPhoton::GetCeIso(TVector3 vec, Float_t &iso, Float_t &phiband, Float_t &core)
274 // Get cell isolation.
278 const Int_t ncells = fEMCalCells->GetNumberOfCells();
282 Float_t etacl = vec.Eta();
283 Float_t phicl = vec.Phi();
284 Float_t thetacl = vec.Theta();
286 phicl+=TMath::TwoPi();
288 Float_t eta=-1, phi=-1;
289 for(int icell=0;icell<ncells;icell++){
290 absid = TMath::Abs(fEMCalCells->GetCellNumber(icell));
293 fGeom->EtaPhiFromIndex(absid,eta,phi);
294 Float_t dphi = TMath::Abs(phi-phicl);
295 Float_t deta = TMath::Abs(eta-etacl);
296 Float_t R = TMath::Sqrt(deta*deta + dphi*dphi);
297 Float_t etcell = fEMCalCells->GetCellAmplitude(absid)*TMath::Sin(thetacl);
308 totband += fEMCalCells->GetCellAmplitude(absid)*TMath::Sin(thetacl);
316 //________________________________________________________________________
317 void AliAnalysisTaskEMCALIsoPhoton::GetTrIso(TVector3 vec, Float_t &iso, Float_t &phiband, Float_t &core)
319 // Get track isolation.
323 const Int_t ntracks = fSelPrimTracks->GetEntries();
327 Double_t etacl = vec.Eta();
328 Double_t phicl = vec.Phi();
330 phicl+=TMath::TwoPi();
331 for(int itrack=0;itrack<ntracks;itrack++){
332 AliVTrack *track = static_cast<AliVTrack*> (fSelPrimTracks->At(itrack));
335 Double_t dphi = TMath::Abs(track->Phi()-phicl);
336 Double_t deta = TMath::Abs(track->Eta()-etacl);
337 Double_t R = TMath::Sqrt(deta*deta + dphi*dphi);
338 Double_t pt = track->Pt();
340 totiso += track->Pt();
349 totband += track->Pt();
357 //________________________________________________________________________
358 Double_t AliAnalysisTaskEMCALIsoPhoton::GetCrossEnergy(const AliVCluster *cluster, Short_t &idmax)
360 // Calculate the energy of cross cells around the leading cell.
362 AliVCaloCells *cells = 0;
363 cells = fESD->GetEMCALCells();
379 Double_t crossEnergy = 0;
381 fGeom->GetCellIndex(idmax,iSupMod,iTower,iIphi,iIeta);
382 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphis,ietas);
384 Int_t ncells = cluster->GetNCells();
385 for (Int_t i=0; i<ncells; i++) {
386 Int_t cellAbsId = cluster->GetCellAbsId(i);
387 fGeom->GetCellIndex(cellAbsId,iSupMod,iTower,iIphi,iIeta);
388 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi, iIeta,iphi,ieta);
389 Int_t aphidiff = TMath::Abs(iphi-iphis);
392 Int_t aetadiff = TMath::Abs(ieta-ietas);
395 if ( (aphidiff==1 && aetadiff==0) ||
396 (aphidiff==0 && aetadiff==1) ) {
397 crossEnergy += cells->GetCellAmplitude(cellAbsId);
404 //________________________________________________________________________
405 Double_t AliAnalysisTaskEMCALIsoPhoton ::GetMaxCellEnergy(const AliVCluster *cluster, Short_t &id) const
407 // Get maximum energy of attached cell.
411 AliVCaloCells *cells = 0;
412 cells = fESD->GetEMCALCells();
417 Int_t ncells = cluster->GetNCells();
418 for (Int_t i=0; i<ncells; i++) {
419 Double_t e = cells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
422 id = cluster->GetCellAbsId(i);
428 //________________________________________________________________________
429 void AliAnalysisTaskEMCALIsoPhoton::Terminate(Option_t *)
431 // Called once at the end of the query.