]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/CaloCalib/AliAnalysisTaskEMCALPi0PbPb.cxx
- fixing warnings and compilation errors
[u/mrichter/AliRoot.git] / PWG4 / CaloCalib / AliAnalysisTaskEMCALPi0PbPb.cxx
CommitLineData
ea3fd2d5 1// $Id$
2
ea3fd2d5 3#include "AliAnalysisTaskEMCALPi0PbPb.h"
fa443410 4#include <TAxis.h>
717fe7de 5#include <TChain.h>
6#include <TClonesArray.h>
f5d4ab70 7#include <TFile.h>
296ea9b4 8#include <TGeoGlobalMagField.h>
717fe7de 9#include <TH1F.h>
10#include <TH2F.h>
11#include <TList.h>
12#include <TLorentzVector.h>
f5d4ab70 13#include <TNtuple.h>
296ea9b4 14#include <TProfile.h>
15#include <TVector2.h>
717fe7de 16#include "AliAODEvent.h"
17#include "AliAODVertex.h"
18#include "AliAnalysisManager.h"
19#include "AliAnalysisTaskEMCALClusterizeFast.h"
296ea9b4 20#include "AliCDBManager.h"
ea3fd2d5 21#include "AliCentrality.h"
ea3fd2d5 22#include "AliEMCALGeoUtils.h"
0ec74551 23#include "AliEMCALGeometry.h"
296ea9b4 24#include "AliEMCALRecoUtils.h"
717fe7de 25#include "AliESDEvent.h"
26#include "AliESDVertex.h"
296ea9b4 27#include "AliESDtrack.h"
0ec74551 28#include "AliESDtrackCuts.h"
296ea9b4 29#include "AliGeomManager.h"
43cfaa06 30#include "AliLog.h"
296ea9b4 31#include "AliMagF.h"
0ec74551 32#include "AliTrackerBase.h"
ea3fd2d5 33
34ClassImp(AliAnalysisTaskEMCALPi0PbPb)
717fe7de 35
ea3fd2d5 36//________________________________________________________________________
37AliAnalysisTaskEMCALPi0PbPb::AliAnalysisTaskEMCALPi0PbPb(const char *name)
38 : AliAnalysisTaskSE(name),
717fe7de 39 fCentVar("V0M"),
40 fCentFrom(0),
41 fCentTo(100),
76332037 42 fVtxZMin(-10),
43 fVtxZMax(+10),
43cfaa06 44 fUseQualFlag(1),
717fe7de 45 fClusName(),
f5d4ab70 46 fDoNtuple(0),
a49742b5 47 fDoAfterburner(0),
f224d35b 48 fAsymMax(1),
a49742b5 49 fNminCells(1),
3c661da5 50 fMinE(0.100),
f224d35b 51 fMinErat(0),
52 fMinEcc(0),
6bf90832 53 fGeoName("EMCAL_FIRSTYEARV1"),
296ea9b4 54 fMinNClustPerTrack(50),
0ec74551 55 fMinPtPerTrack(1.0),
296ea9b4 56 fIsoDist(0.2),
0ec74551 57 fTrCuts(0),
d9f26424 58 fNEvs(0),
d595acbb 59 fGeom(0),
296ea9b4 60 fReco(0),
717fe7de 61 fOutput(0),
62 fEsdEv(0),
63 fAodEv(0),
43cfaa06 64 fRecPoints(0),
717fe7de 65 fEsdClusters(0),
66 fEsdCells(0),
67 fAodClusters(0),
286b47a5 68 fAodCells(0),
fa443410 69 fPtRanges(0),
f5d4ab70 70 fNtuple(0),
296ea9b4 71 fSelTracks(0),
fa443410 72 fHCuts(0x0),
73 fHVertexZ(0x0),
76332037 74 fHVertexZ2(0x0),
fa443410 75 fHCent(0x0),
76 fHCentQual(0x0),
d595acbb 77 fHColuRow(0x0),
78 fHColuRowE(0x0),
79 fHCellMult(0x0),
80 fHCellE(0x0),
81 fHCellH(0x0),
6eb6260e 82 fHCellM(0x0),
a49742b5 83 fHCellM2(0x0),
296ea9b4 84 fHCellFreqNoCut(0x0),
85 fHCellFrequCut100M(0x0),
86 fHCellFrequCut300M(0x0),
87 fHCellCheckE(0x0),
6eb6260e 88 fHClustEccentricity(0),
fa443410 89 fHClustEtaPhi(0x0),
90 fHClustEnergyPt(0x0),
91 fHClustEnergySigma(0x0),
d595acbb 92 fHClustSigmaSigma(0x0),
6eb6260e 93 fHClustNCellEnergyRatio(0x0),
fa443410 94 fHPionEtaPhi(0x0),
95 fHPionMggPt(0x0),
6eb6260e 96 fHPionMggAsym(0x0),
97 fHPionMggDgg(0x0)
ea3fd2d5 98{
717fe7de 99 // Constructor.
ea3fd2d5 100
d595acbb 101 if (!name)
102 return;
103 SetName(name);
ea3fd2d5 104 DefineInput(0, TChain::Class());
ea3fd2d5 105 DefineOutput(1, TList::Class());
296ea9b4 106 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.,SPDVertex.,TPCVertex.,EMCALCells.,Tracks "
107 "AOD:header,vertices,emcalCells,tracks";
ea3fd2d5 108}
ea3fd2d5 109
717fe7de 110//________________________________________________________________________
111AliAnalysisTaskEMCALPi0PbPb::~AliAnalysisTaskEMCALPi0PbPb()
112{
113 // Destructor.
ea3fd2d5 114
717fe7de 115 delete fOutput; fOutput = 0;
fa443410 116 delete fPtRanges; fPtRanges = 0;
d595acbb 117 delete fGeom; fGeom = 0;
296ea9b4 118 delete fReco; fReco = 0;
119 delete fSelTracks;
d595acbb 120 delete [] fHColuRow;
121 delete [] fHColuRowE;
122 delete [] fHCellMult;
296ea9b4 123 delete [] fHCellFreqNoCut;
124 delete [] fHCellFrequCut100M;
125 delete [] fHCellFrequCut300M;
ea3fd2d5 126}
717fe7de 127
ea3fd2d5 128//________________________________________________________________________
129void AliAnalysisTaskEMCALPi0PbPb::UserCreateOutputObjects()
130{
717fe7de 131 // Create user objects here.
ea3fd2d5 132
296ea9b4 133 fGeom = new AliEMCALGeoUtils(fGeoName,"EMCAL");
134 fReco = new AliEMCALRecoUtils();
717fe7de 135 fOutput = new TList();
136 fOutput->SetOwner();
296ea9b4 137 fSelTracks = new TObjArray;
ea3fd2d5 138
f5d4ab70 139 if (fDoNtuple) {
140 TFile *f = OpenFile(1);
6bf90832 141 if (f) {
142 f->SetCompressionLevel(2);
6eb6260e 143 fNtuple = new TNtuple(Form("nt%.0fto%.0f",fCentFrom,fCentTo),"nt",
002dcebe 144 "run:evt:l0:tcls:cent:pt:eta:phi:e:emax:n:n1:nsm:db:disp:mn:ms:ecc:sig:tkdz:tkdr:tkep:tkiso:ceiso");
6bf90832 145 fNtuple->SetDirectory(f);
146 fNtuple->SetAutoFlush(-1024*1024*1024);
147 fNtuple->SetAutoSave(-1024*1024*1024);
148 }
f5d4ab70 149 }
150
002dcebe 151 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
152 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad()-0.25;
153 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad()+0.25;
154
d595acbb 155 // histograms
a49742b5 156 TH1::SetDefaultSumw2(kTRUE);
157 TH2::SetDefaultSumw2(kTRUE);
fa443410 158 fHCuts = new TH1F("hEventCuts","",4,0.5,4.5);
159 fHCuts->GetXaxis()->SetBinLabel(1,"All (PS)");
160 fHCuts->GetXaxis()->SetBinLabel(2,Form("%s: %.0f-%.0f",fCentVar.Data(),fCentFrom,fCentTo));
161 fHCuts->GetXaxis()->SetBinLabel(3,"QFlag");
162 fHCuts->GetXaxis()->SetBinLabel(4,Form("zvtx: %.0f-%.0f",fVtxZMin,fVtxZMax));
163 fOutput->Add(fHCuts);
164 fHVertexZ = new TH1F("hVertexZBeforeCut","",100,-25,25);
165 fHVertexZ->SetXTitle("z [cm]");
166 fOutput->Add(fHVertexZ);
76332037 167 fHVertexZ2 = new TH1F("hVertexZAfterCut","",100,-25,25);
168 fHVertexZ2->SetXTitle("z [cm]");
169 fOutput->Add(fHVertexZ2);
fa443410 170 fHCent = new TH1F("hCentBeforeCut","",101,-1,100);
171 fHCent->SetXTitle(fCentVar.Data());
76332037 172 fOutput->Add(fHCent);
fa443410 173 fHCentQual = new TH1F("hCentAfterCut","",101,-1,100);
174 fHCentQual->SetXTitle(fCentVar.Data());
175 fOutput->Add(fHCentQual);
90d5b88b 176
d595acbb 177 // histograms for cells
296ea9b4 178 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
179 fHColuRow = new TH2*[nsm];
180 fHColuRowE = new TH2*[nsm];
181 fHCellMult = new TH1*[nsm];
182 for (Int_t i = 0; i<nsm; ++i) {
d595acbb 183 fHColuRow[i] = new TH2F(Form("hColRow_Mod%d",i),"",49,0,49,25,0,25);
184 fHColuRow[i]->SetTitle(Form("Module %d: Occupancy", i));
185 fHColuRow[i]->SetXTitle("col (i#eta)");
186 fHColuRow[i]->SetYTitle("row (i#phi)");
187 fHColuRowE[i] = new TH2F(Form("hColRowE_Mod%d", i),"",49,0,49,25,0,25);
90d5b88b 188 fHColuRowE[i]->SetTitle(Form("Module %d: Cell energy",i));
d595acbb 189 fHColuRowE[i]->SetXTitle("col (i#eta)");
190 fHColuRowE[i]->SetYTitle("row (i#phi)");
191 fHCellMult[i] = new TH1F(Form("hCellMult_Mod%d",i),"",1000,0,1000);
192 fHCellMult[i]->SetTitle(Form("Module %d: Cell multiplicity",i));
90d5b88b 193 fHCellMult[i]->SetXTitle("# of cells");
d595acbb 194 fOutput->Add(fHColuRow[i]);
195 fOutput->Add(fHColuRowE[i]);
196 fOutput->Add(fHCellMult[i]);
197 }
a49742b5 198 fHCellE = new TH1F("hCellE","",150,0.,15.);
d595acbb 199 fHCellE->SetXTitle("E_{cell} [GeV]");
200 fOutput->Add(fHCellE);
a49742b5 201 fHCellH = new TH1F ("fHCellHighestE","",150,0.,15.);
6eb6260e 202 fHCellH->SetXTitle("E^{max}_{cell} [GeV]");
d595acbb 203 fOutput->Add(fHCellH);
a49742b5 204 fHCellM = new TH1F ("fHCellMeanEperHitCell","",250,0.,2.5);
6eb6260e 205 fHCellM->SetXTitle("#LT E_{cell}#GT [GeV]");
206 fOutput->Add(fHCellM);
a49742b5 207 fHCellM2 = new TH1F ("fHCellMeanEperAllCells","",250,0.,1);
f4ec884e 208 fHCellM2->SetXTitle("1/N_{cells} #Sigma E_{cell} [GeV]");
a49742b5 209 fOutput->Add(fHCellM2);
90d5b88b 210
296ea9b4 211 fHCellFreqNoCut = new TH1*[nsm];
212 fHCellFrequCut100M = new TH1*[nsm];
213 fHCellFrequCut300M = new TH1*[nsm];
214 for (Int_t i = 0; i<nsm; ++i){
215 Double_t lbin = i*24*48-0.5;
216 Double_t hbin = lbin+24*48;
217 fHCellFreqNoCut[i] = new TH1F(Form("fHCellFreqNoCut_SM%d",i),
218 Form("Frequency SM%d (no cut);id;#",i), 1152, lbin, hbin);
219 fHCellFrequCut100M[i] = new TH1F(Form("fHCellFreqCut100M_SM%d",i),
220 Form("Frequency SM%d (>0.1GeV);id;#",i), 1152, lbin, hbin);
221 fHCellFrequCut300M[i] = new TH1F(Form("fHCellFreqCut300M_SM%d",i),
222 Form("Frequency SM%d (>0.3GeV);id;#",i), 1152, lbin, hbin);
223 fOutput->Add(fHCellFreqNoCut[i]);
224 fOutput->Add(fHCellFrequCut100M[i]);
225 fOutput->Add(fHCellFrequCut300M[i]);
226 }
227 if (1) {
228 fHCellCheckE = new TH1*[24*48*nsm];
229 memset(fHCellCheckE,0,sizeof(fHCellCheckE));
230 Int_t tcs[1] = {4102};
231 for (UInt_t i = 0; i<sizeof(tcs)/sizeof(Int_t); ++i){
232 Int_t c=tcs[i];
233 if (c<24*48*nsm) {
234 fHCellCheckE[i] = new TH1F(Form("fHCellE_id%d",c), Form("Cell %d;E [GeV/c];#",c), 500, 0, 8);
235 fOutput->Add(fHCellCheckE[i]);
236 }
237 }
238 }
239
d595acbb 240 // histograms for clusters
6eb6260e 241 fHClustEccentricity = new TH1F("hClustEccentricity","",100,-0.1,1.1);
242 fHClustEccentricity->SetXTitle("#epsilon_{C}");
243 fOutput->Add(fHClustEccentricity);
002dcebe 244 fHClustEtaPhi = new TH2F("hClustEtaPhi","",500,-0.8,0.8,100*nsm,phimin,phimax);
fa443410 245 fHClustEtaPhi->SetXTitle("#eta");
246 fHClustEtaPhi->SetYTitle("#varphi");
247 fOutput->Add(fHClustEtaPhi);
248 fHClustEnergyPt = new TH2F("hClustEnergyPt","",250,0,50,250,0,50);
249 fHClustEnergyPt->SetXTitle("E [GeV]");
6eb6260e 250 fHClustEnergyPt->SetYTitle("p_{T} [GeV/c]");
fa443410 251 fOutput->Add(fHClustEnergyPt);
a49742b5 252 fHClustEnergySigma = new TH2F("hClustEnergySigma","",100,0,100,500,0,50);
253 fHClustEnergySigma->SetXTitle("E_{C} * #sigma_{max} [GeV*cm]");
6eb6260e 254 fHClustEnergySigma->SetYTitle("E_{C} [GeV]");
d595acbb 255 fOutput->Add(fHClustEnergySigma);
a49742b5 256 fHClustSigmaSigma = new TH2F("hClustSigmaSigma","",500,0,50,500,0,50);
6eb6260e 257 fHClustSigmaSigma->SetXTitle("#lambda_{0} [cm]");
258 fHClustSigmaSigma->SetYTitle("#sigma_{max} [cm]");
d595acbb 259 fOutput->Add(fHClustSigmaSigma);
6eb6260e 260 fHClustNCellEnergyRatio = new TH2F("hClustNCellEnergyRatio","",27,-0.5,26.5,101,-0.05,1.05);
261 fHClustNCellEnergyRatio->SetXTitle("N_{cells}");
262 fHClustNCellEnergyRatio->SetYTitle("E^{max}_{cell}/E_{clus}");
263 fOutput->Add(fHClustNCellEnergyRatio);
90d5b88b 264
d595acbb 265 // histograms for pion candidates
002dcebe 266 fHPionEtaPhi = new TH2F("hPionEtaPhi","",100,-0.8,0.8,100*nsm,phimin,phimax);
a49742b5 267 fHPionEtaPhi->SetXTitle("#eta_{#gamma#gamma}");
268 fHPionEtaPhi->SetYTitle("#varphi_{#gamma#gamma}");
fa443410 269 fOutput->Add(fHPionEtaPhi);
a49742b5 270 fHPionMggPt = new TH2F("hPionMggPt","",1000,0,2,100,0,20.0);
fa443410 271 fHPionMggPt->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
272 fHPionMggPt->SetYTitle("p_{T}^{#gamma#gamma} [GeV/c]");
273 fOutput->Add(fHPionMggPt);
a49742b5 274 fHPionMggAsym = new TH2F("hPionMggAsym","",1000,0,2,100,0,1);
fa443410 275 fHPionMggAsym->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
276 fHPionMggAsym->SetYTitle("Z_{#gamma#gamma} [GeV]");
277 fOutput->Add(fHPionMggAsym);
a49742b5 278 fHPionMggDgg = new TH2F("hPionMggDgg","",1000,0,2,100,0,10);
6eb6260e 279 fHPionMggDgg->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
280 fHPionMggDgg->SetYTitle("opening angle [grad]");
281 fOutput->Add(fHPionMggDgg);
78204d3d 282 const Int_t nbins = 20;
283 Double_t xbins[nbins] = {0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,6,7,8,9,10,12.5,15,20,25,50};
fa443410 284 fPtRanges = new TAxis(nbins-1,xbins);
285 for (Int_t i = 0; i<=nbins; ++i) {
a49742b5 286 fHPionInvMasses[i] = new TH1F(Form("hPionInvMass%d",i),"",1000,0,2);
fa443410 287 fHPionInvMasses[i]->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
288 if (i==0)
289 fHPionInvMasses[i]->SetTitle(Form("0 < p_{T}^{#gamma#gamma} <%.1f",xbins[0]));
290 else if (i==nbins)
291 fHPionInvMasses[i]->SetTitle(Form("p_{T}^{#gamma#gamma} > 50"));
292 else
293 fHPionInvMasses[i]->SetTitle(Form("%.1f < p_{T}^{#gamma#gamma} <%.1f",xbins[i-1],xbins[i]));
fa443410 294 fOutput->Add(fHPionInvMasses[i]);
295 }
296ea9b4 296
717fe7de 297 PostData(1, fOutput);
ea3fd2d5 298}
299
300//________________________________________________________________________
301void AliAnalysisTaskEMCALPi0PbPb::UserExec(Option_t *)
302{
717fe7de 303 // Called for each event.
304
305 if (!InputEvent())
306 return;
307
43cfaa06 308 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
309 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
310 if (fEsdEv) {
311 am->LoadBranch("AliESDRun.");
312 am->LoadBranch("AliESDHeader.");
313 } else {
314 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
315 am->LoadBranch("header");
316 }
317
296ea9b4 318 if (fHCuts->GetEntries()==0) {
319 if (!AliGeomManager::GetGeometry()) { // get geometry
320 AliWarning("Accessing geometry from OCDB, this is not very efficient!");
321 AliCDBManager *cdb = AliCDBManager::Instance();
322 if (!cdb->IsDefaultStorageSet())
323 cdb->SetDefaultStorage("raw://");
324 Int_t runno = InputEvent()->GetRunNumber();
325 if (runno != cdb->GetRun())
326 cdb->SetRun(runno);
327 AliGeomManager::LoadGeometry();
328 }
329
002dcebe 330 if (!fGeom->GetMatrixForSuperModule(0)) { // set misalignment matrices (stored in first event)
331 if (fEsdEv) {
332 for (Int_t i=0; i<fGeom->GetEMCGeometry()->GetNumberOfSuperModules(); ++i)
333 fGeom->SetMisalMatrix(fEsdEv->GetESDRun()->GetEMCALMatrix(i),i);
334 } else {
335 for (Int_t i=0; i<fGeom->GetEMCGeometry()->GetNumberOfSuperModules(); ++i)
336 fGeom->SetMisalMatrix(fAodEv->GetHeader()->GetEMCALMatrix(i),i);
337 }
d595acbb 338 }
296ea9b4 339
340 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
341 if (fEsdEv) {
342 const AliESDRun *erun = fEsdEv->GetESDRun();
343 AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
344 erun->GetCurrentDip(),
345 AliMagF::kConvLHC,
346 kFALSE,
347 erun->GetBeamEnergy(),
348 erun->GetBeamType());
349 TGeoGlobalMagField::Instance()->SetField(field);
350 } else {
351 Double_t pol = -1; //polarity
352 Double_t be = -1; //beam energy
353 AliMagF::BeamType_t btype = AliMagF::kBeamTypepp;
354 Int_t runno = fAodEv->GetRunNumber();
355 if (runno>=136851 && runno<138275) {
356 pol = -1;
357 be = 2760;
358 btype = AliMagF::kBeamTypeAA;
359 } else if (runno>=138275 && runno<=139517) {
360 pol = +1;
361 be = 2760;
362 btype = AliMagF::kBeamTypeAA;
363 } else {
364 AliError(Form("Do not know the bfield parameters for run %d! Using defaults!!!", runno));
365 }
366 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", pol, pol, AliMagF::k5kG, btype, be));
367 }
368 }
d595acbb 369 }
370
286b47a5 371 Int_t cut = 1;
fa443410 372 fHCuts->Fill(cut++);
286b47a5 373
717fe7de 374 const AliCentrality *centP = InputEvent()->GetCentrality();
375 Double_t cent = centP->GetCentralityPercentileUnchecked(fCentVar);
fa443410 376 fHCent->Fill(cent);
717fe7de 377 if (cent<fCentFrom||cent>fCentTo)
286b47a5 378 return;
43cfaa06 379
fa443410 380 fHCuts->Fill(cut++);
286b47a5 381
43cfaa06 382 if (fUseQualFlag) {
383 if (centP->GetQuality()>0)
384 return;
385 }
286b47a5 386
fa443410 387 fHCentQual->Fill(cent);
388 fHCuts->Fill(cut++);
717fe7de 389
d9f26424 390 // count number of accepted events
391 ++fNEvs;
392
43cfaa06 393 if (fEsdEv) {
fa443410 394 am->LoadBranch("PrimaryVertex.");
395 am->LoadBranch("SPDVertex.");
396 am->LoadBranch("TPCVertex.");
43cfaa06 397 } else {
398 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
399 am->LoadBranch("vertices");
3c661da5 400 if (!fAodEv) return;
43cfaa06 401 }
402
403 const AliVVertex *vertex = InputEvent()->GetPrimaryVertex();
717fe7de 404 if (!vertex)
405 return;
406
fa443410 407 fHVertexZ->Fill(vertex->GetZ());
286b47a5 408
717fe7de 409 if(vertex->GetZ()<fVtxZMin||vertex->GetZ()>fVtxZMax)
410 return;
286b47a5 411
fa443410 412 fHCuts->Fill(cut++);
76332037 413 fHVertexZ2->Fill(vertex->GetZ());
717fe7de 414
43cfaa06 415 fRecPoints = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
416 fEsdClusters = 0; // will be set if ESD input used and if fRecPoints are not set of if clusters are attached
417 fEsdCells = 0; // will be set if ESD input used
418 fAodClusters = 0; // will be set if AOD input used and if fRecPoints are not set of if clusters are attached
419 // or if fClusName is given and AliAnalysisTaskEMCALClusterizeFast in AOD output mode
420 fAodCells = 0; // will be set if AOD input used
717fe7de 421
43cfaa06 422 // deal with special output from AliAnalysisTaskEMCALClusterizeFast first
423 Bool_t clusattached = 0;
424 Bool_t recalibrated = 0;
425 if (1 && !fClusName.IsNull()) {
426 AliAnalysisTaskEMCALClusterizeFast *cltask = 0;
427 TObjArray *ts = am->GetTasks();
428 cltask = dynamic_cast<AliAnalysisTaskEMCALClusterizeFast*>(ts->FindObject(fClusName));
429 if (cltask && cltask->GetClusters()) {
d595acbb 430 fRecPoints = const_cast<TObjArray*>(cltask->GetClusters());
43cfaa06 431 clusattached = cltask->GetAttachClusters();
432 if (cltask->GetCalibData()!=0)
433 recalibrated = kTRUE;
434 }
435 }
436 if (1 && AODEvent() && !fClusName.IsNull()) {
717fe7de 437 TList *l = AODEvent()->GetList();
438 TClonesArray *clus = 0;
439 if (l) {
440 clus = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
441 fAodClusters = clus;
442 }
ea3fd2d5 443 }
717fe7de 444
445 if (fEsdEv) { // ESD input mode
43cfaa06 446 if (1 && (!fRecPoints||clusattached)) {
447 if (!clusattached)
448 am->LoadBranch("CaloClusters");
717fe7de 449 TList *l = fEsdEv->GetList();
450 TClonesArray *clus = 0;
451 if (l) {
452 clus = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
453 fEsdClusters = clus;
ea3fd2d5 454 }
455 }
43cfaa06 456 if (1) {
457 if (!recalibrated)
458 am->LoadBranch("EMCALCells.");
717fe7de 459 fEsdCells = fEsdEv->GetEMCALCells();
460 }
461 } else if (fAodEv) { // AOD input mode
43cfaa06 462 if (1 && (!fAodClusters || clusattached)) {
463 if (!clusattached)
464 am->LoadBranch("caloClusters");
717fe7de 465 TList *l = fAodEv->GetList();
466 TClonesArray *clus = 0;
467 if (l) {
468 clus = dynamic_cast<TClonesArray*>(l->FindObject("caloClusters"));
469 fAodClusters = clus;
ea3fd2d5 470 }
471 }
43cfaa06 472 if (1) {
473 if (!recalibrated)
474 am->LoadBranch("emcalCells");
717fe7de 475 fAodCells = fAodEv->GetEMCALCells();
476 }
477 } else {
478 AliFatal("Impossible to not have either pointer to ESD or AOD event");
479 }
ea3fd2d5 480
43cfaa06 481 if (1) {
482 AliDebug(2,Form("fRecPoints set: %p", fRecPoints));
483 AliDebug(2,Form("fEsdClusters set: %p", fEsdClusters));
484 AliDebug(2,Form("fEsdCells set: %p", fEsdCells));
485 AliDebug(2,Form("fAodClusters set: %p", fAodClusters));
486 AliDebug(2,Form("fAodCells set: %p", fAodCells));
487 }
488
a49742b5 489 if (fDoAfterburner)
490 ClusterAfterburner();
6eb6260e 491
296ea9b4 492 CalcTracks();
493 CalcClusterProps();
494
286b47a5 495 FillCellHists();
496 FillClusHists();
497 FillPionHists();
323834f0 498 FillOtherHists();
ea3fd2d5 499
717fe7de 500 PostData(1, fOutput);
ea3fd2d5 501}
502
503//________________________________________________________________________
504void AliAnalysisTaskEMCALPi0PbPb::Terminate(Option_t *)
505{
717fe7de 506 // Terminate called at the end of analysis.
f5d4ab70 507
508 if (fNtuple) {
509 TFile *f = OpenFile(1);
510 if (f)
511 fNtuple->Write();
512 }
d9f26424 513
f224d35b 514 AliInfo(Form("\n%s: Accepted %lld events", GetName(), fNEvs));
ea3fd2d5 515}
ea3fd2d5 516
296ea9b4 517//________________________________________________________________________
518void AliAnalysisTaskEMCALPi0PbPb::CalcTracks()
519{
520 // Calculate track properties.
521
522 fSelTracks->Clear();
523
524 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
525 TClonesArray *tracks = 0;
526 if (fEsdEv) {
527 am->LoadBranch("Tracks");
528 TList *l = fEsdEv->GetList();
529 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
530 } else {
531 am->LoadBranch("tracks");
532 TList *l = fAodEv->GetList();
533 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
534 }
535
536 if (!tracks)
537 return;
538
0ec74551 539 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
540 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad()-0.25;
541 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad()+0.25;
542
296ea9b4 543 if (fEsdEv) {
0ec74551 544 fSelTracks->SetOwner(kTRUE);
545 am->LoadBranch("PrimaryVertex.");
546 const AliESDVertex *vtx = fEsdEv->GetPrimaryVertexSPD();
547 am->LoadBranch("SPDVertex.");
548 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
549 am->LoadBranch("Tracks");
550 const Int_t Ntracks = tracks->GetEntries();
551 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
552 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
553 if (!track) {
554 AliWarning(Form("Could not receive track %d\n", iTracks));
555 continue;
556 }
557 if (fTrCuts && !fTrCuts->IsSelected(track))
296ea9b4 558 continue;
559 Double_t eta = track->Eta();
560 if (eta<-1||eta>1)
561 continue;
0ec74551 562 if (track->Phi()<phimin||track->Phi()>phimax)
563 continue;
296ea9b4 564 if(track->GetTPCNcls()<fMinNClustPerTrack)
565 continue;
0ec74551 566 AliESDtrack copyt(*track);
567 Double_t bfield[3];
568 copyt.GetBxByBz(bfield);
569 AliExternalTrackParam tParam;
570 Bool_t relate = copyt.RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&tParam);
571 if (!relate)
572 continue;
573 copyt.Set(tParam.GetX(),tParam.GetAlpha(),tParam.GetParameter(),tParam.GetCovariance());
574 Double_t p[3] = { 0. };
575 copyt.GetPxPyPz(p);
576 Double_t pos[3] = { 0. };
577 copyt.GetXYZ(pos);
578 Double_t covTr[21] = { 0. };
579 copyt.GetCovarianceXYZPxPyPz(covTr);
580 Double_t pid[10] = { 0. };
581 copyt.GetESDpid(pid);
582 AliAODTrack *aTrack = new AliAODTrack(copyt.GetID(),
583 copyt.GetLabel(),
584 p,
585 kTRUE,
586 pos,
587 kFALSE,
588 covTr,
589 (Short_t)copyt.GetSign(),
590 copyt.GetITSClusterMap(),
591 pid,
592 0,/*fPrimaryVertex,*/
593 kTRUE, // check if this is right
594 vtx->UsesTrack(copyt.GetID()));
595 aTrack->SetTPCClusterMap(copyt.GetTPCClusterMap());
596 aTrack->SetTPCSharedMap (copyt.GetTPCSharedMap());
597 Float_t ndf = copyt.GetTPCNcls() + 1 - 5 ;
598 if(ndf>0)
599 aTrack->SetChi2perNDF(copyt.GetTPCchi2()/ndf);
600 else
601 aTrack->SetChi2perNDF(-1);
602 aTrack->SetFlags(copyt.GetStatus());
603 aTrack->SetTPCPointsF(copyt.GetTPCNclsF());
604 fSelTracks->Add(aTrack);
296ea9b4 605 }
606 } else {
607 Int_t ntracks = tracks->GetEntries();
608 for (Int_t i=0; i<ntracks; ++i) {
609 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
610 if (!track)
611 continue;
612 Double_t eta = track->Eta();
613 if (eta<-1||eta>1)
614 continue;
0ec74551 615 if (track->Phi()<phimin||track->Phi()>phimax)
616 continue;
296ea9b4 617 if(track->GetTPCNcls()<fMinNClustPerTrack)
618 continue;
c4236a58 619
71fed3bd 620 if (0 && (track->Pt()>=0.6) && (track->PxAtDCA()==-999)) { // compute position on EMCAL
c4236a58 621 AliExternalTrackParam tParam(track);
622 if (AliTrackerBase::PropagateTrackToBxByBz(&tParam, 438, 0.139, 1, kTRUE)) {
623 Double_t trkPos[3];
624 tParam.GetXYZ(trkPos);
625 track->SetPxPyPzAtDCA(trkPos[0],trkPos[1],trkPos[2]);
626 }
627 }
296ea9b4 628 fSelTracks->Add(track);
629 }
630 }
631}
632
633//________________________________________________________________________
634void AliAnalysisTaskEMCALPi0PbPb::CalcClusterProps()
635{
636 // Calculate cluster properties
637
638 TObjArray *clusters = fEsdClusters;
639 if (!clusters)
640 clusters = fAodClusters;
641 if (!clusters)
642 return;
643
644 Int_t nclus = clusters->GetEntries();
c4236a58 645 Int_t ntrks = fSelTracks->GetEntries();
646
296ea9b4 647 for(Int_t i = 0; i<nclus; ++i) {
648 fClusProps[i].Reset();
649
650 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
651 if (!clus)
652 continue;
653 if (!clus->IsEMCAL())
654 continue;
655 if (clus->E()<fMinE)
656 continue;
657
658 Float_t clsPos[3] = {0};
659 clus->GetPosition(clsPos);
04785f50 660 TVector3 clsVec(clsPos);
c4236a58 661 Double_t vertex[3] = {0};
662 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
663 TLorentzVector clusterVec;
664 clus->GetMomentum(clusterVec,vertex);
665 Double_t clsEta = clusterVec.Eta();
296ea9b4 666
296ea9b4 667 Double_t mind2 = 1e10;
668 for(Int_t j = 0; j<ntrks; ++j) {
669 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
670 if (!track)
671 continue;
71fed3bd 672 Double_t pt = track->Pt();
673 if (pt<fMinPtPerTrack)
296ea9b4 674 continue;
c4236a58 675 if (TMath::Abs(clsEta-track->Eta())>fIsoDist)
676 continue;
677
296ea9b4 678 AliExternalTrackParam tParam(track);
679 Float_t tmpR=-1, tmpZ=-1;
04785f50 680#if 1
681 if (1) {
682 TVector3 vec(clsPos);
683 Double_t alpha = ((int)(vec.Phi()*TMath::RadToDeg()/20)+0.5)*20*TMath::DegToRad();
684 vec.RotateZ(-alpha); //Rotate the cluster to the local extrapolation coordinate system
685 tParam.Rotate(alpha); //Rotate the track to the same local extrapolation system
686 if (!AliTrackerBase::PropagateTrackToBxByBz(&tParam, vec.X(), 0.139, 1, kFALSE))
687 continue;
688 Double_t trkPos[3];
689 tParam.GetXYZ(trkPos); //Get the extrapolated global position
690 tmpR = TMath::Sqrt( TMath::Power(clsPos[0]-trkPos[0],2)+TMath::Power(clsPos[1]-trkPos[1],2)+TMath::Power(clsPos[2]-trkPos[2],2) );
691 tmpZ = clsPos[2]-trkPos[2];
692 }
693#else
296ea9b4 694 if (!fReco->ExtrapolateTrackToCluster(&tParam, clus, tmpR, tmpZ))
695 continue;
04785f50 696#endif
c4236a58 697 Double_t d2 = tmpR;
296ea9b4 698 if (mind2>d2) {
699 mind2=d2;
700 fClusProps[i].fTrIndex = j;
701 fClusProps[i].fTrDz = tmpZ;
c4236a58 702 fClusProps[i].fTrDr = TMath::Sqrt(tmpR*tmpR-tmpZ*tmpZ);
296ea9b4 703 fClusProps[i].fTrDist = d2;
704 fClusProps[i].fTrEp = clus->E()/track->P();
705 }
706 }
707
c4236a58 708 if (0 && (fClusProps[i].fTrIndex>=0)) {
709 cout << i << " " << fClusProps[i].fTrIndex << ": Dr " << fClusProps[i].fTrDr << " " << " Dz " << fClusProps[i].fTrDz << endl;
710 }
04785f50 711 fClusProps[i].fTrIso = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist);
712 fClusProps[i].fTrLowPtIso = 0;
713 fClusProps[i].fCellIso = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),fIsoDist);
296ea9b4 714 }
715}
716
323834f0 717//________________________________________________________________________
718void AliAnalysisTaskEMCALPi0PbPb::ClusterAfterburner()
719{
296ea9b4 720 // Run custer reconstruction afterburner.
323834f0 721
722 AliVCaloCells *cells = fEsdCells;
723 if (!cells)
724 cells = fAodCells;
725
726 if (!cells)
727 return;
728
729 Int_t ncells = cells->GetNumberOfCells();
730 if (ncells<=0)
731 return;
732
733 Double_t cellMeanE = 0, cellSigE = 0;
734 for (Int_t i = 0; i<ncells; ++i) {
735 Double_t cellE = cells->GetAmplitude(i);
736 cellMeanE += cellE;
737 cellSigE += cellE*cellE;
738 }
739 cellMeanE /= ncells;
740 cellSigE /= ncells;
741 cellSigE -= cellMeanE*cellMeanE;
742 if (cellSigE<0)
743 cellSigE = 0;
744 cellSigE = TMath::Sqrt(cellSigE / ncells);
745
746 Double_t subE = cellMeanE - 7*cellSigE;
747 if (subE<0)
748 return;
749
750 for (Int_t i = 0; i<ncells; ++i) {
751 Short_t id=-1;
752 Double_t amp=0,time=0;
753 if (!cells->GetCell(i, id, amp, time))
754 continue;
755 amp -= cellMeanE;
756 if (amp<0.001)
757 amp = 0;
758 cells->SetCell(i, id, amp, time);
759 }
760
761 TObjArray *clusters = fEsdClusters;
762 if (!clusters)
763 clusters = fAodClusters;
323834f0 764 if (!clusters)
765 return;
766
767 Int_t nclus = clusters->GetEntries();
768 for (Int_t i = 0; i<nclus; ++i) {
769 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
770 if (!clus->IsEMCAL())
771 continue;
772 Int_t nc = clus->GetNCells();
773 Double_t clusE = 0;
774 UShort_t ids[100] = {0};
775 Double_t fra[100] = {0};
776 for (Int_t j = 0; j<nc; ++j) {
777 Short_t id = TMath::Abs(clus->GetCellAbsId(j));
778 Double_t cen = cells->GetCellAmplitude(id);
779 clusE += cen;
780 if (cen>0) {
781 ids[nc] = id;
782 ++nc;
783 }
784 }
785 if (clusE<=0) {
786 clusters->RemoveAt(i);
787 continue;
788 }
789
790 for (Int_t j = 0; j<nc; ++j) {
791 Short_t id = ids[j];
792 Double_t cen = cells->GetCellAmplitude(id);
793 fra[j] = cen/clusE;
794 }
795 clus->SetE(clusE);
796 AliAODCaloCluster *aodclus = dynamic_cast<AliAODCaloCluster*>(clus);
797 if (aodclus) {
798 aodclus->Clear("");
799 aodclus->SetNCells(nc);
800 aodclus->SetCellsAmplitudeFraction(fra);
801 aodclus->SetCellsAbsId(ids);
802 }
803 }
804 clusters->Compress();
805}
806
286b47a5 807//________________________________________________________________________
808void AliAnalysisTaskEMCALPi0PbPb::FillCellHists()
809{
810 // Fill histograms related to cell properties.
d595acbb 811
90d5b88b 812 AliVCaloCells *cells = fEsdCells;
813 if (!cells)
814 cells = fAodCells;
815
296ea9b4 816 if (!cells)
817 return;
90d5b88b 818
296ea9b4 819 Int_t cellModCount[12] = {0};
820 Double_t cellMaxE = 0;
821 Double_t cellMeanE = 0;
822 Int_t ncells = cells->GetNumberOfCells();
823 if (ncells==0)
824 return;
825
826 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
827
828 for (Int_t i = 0; i<ncells; ++i) {
829 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
830 Double_t cellE = cells->GetAmplitude(i);
831 fHCellE->Fill(cellE);
832 if (cellE>cellMaxE)
833 cellMaxE = cellE;
834 cellMeanE += cellE;
835
836 Int_t iSM=-1, iTower=-1, nIphi=-1, nIeta=-1;
837 Bool_t ret = fGeom->GetCellIndex(absID, iSM, iTower, nIphi, nIeta);
838 if (!ret) {
839 AliError(Form("Could not get cell index for %d", absID));
840 continue;
841 }
842 ++cellModCount[iSM];
843 Int_t iPhi=-1, iEta=-1;
844 fGeom->GetCellPhiEtaIndexInSModule(iSM, iTower, nIphi, nIeta, iPhi, iEta);
845 fHColuRow[iSM]->Fill(iEta,iPhi,1);
846 fHColuRowE[iSM]->Fill(iEta,iPhi,cellE);
847 fHCellFreqNoCut[iSM]->Fill(absID);
848 if (cellE > 0.1) fHCellFrequCut100M[iSM]->Fill(absID);
849 if (cellE > 0.3) fHCellFrequCut300M[iSM]->Fill(absID);
850 if (fHCellCheckE && fHCellCheckE[absID])
851 fHCellCheckE[absID]->Fill(cellE);
852 }
853 fHCellH->Fill(cellMaxE);
854 cellMeanE /= ncells;
855 fHCellM->Fill(cellMeanE);
856 fHCellM2->Fill(cellMeanE*ncells/24/48/nsm);
857 for (Int_t i=0; i<nsm; ++i)
858 fHCellMult[i]->Fill(cellModCount[i]);
286b47a5 859}
860
861//________________________________________________________________________
862void AliAnalysisTaskEMCALPi0PbPb::FillClusHists()
863{
90d5b88b 864 // Fill histograms related to cluster properties.
fa443410 865
90d5b88b 866 TObjArray *clusters = fEsdClusters;
867 if (!clusters)
868 clusters = fAodClusters;
296ea9b4 869 if (!clusters)
870 return;
90d5b88b 871
296ea9b4 872 Double_t vertex[3] = {0};
873 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
874
875 Int_t nclus = clusters->GetEntries();
876 for(Int_t i = 0; i<nclus; ++i) {
877 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
878 if (!clus)
879 continue;
880 if (!clus->IsEMCAL())
881 continue;
90d5b88b 882 TLorentzVector clusterVec;
296ea9b4 883 clus->GetMomentum(clusterVec,vertex);
884 Double_t maxAxis = 0, minAxis = 0;
885 GetSigma(clus,maxAxis,minAxis);
886 Double_t clusterEcc = 0;
887 if (maxAxis > 0)
888 clusterEcc = TMath::Sqrt(1.0 - minAxis*minAxis/(maxAxis*maxAxis));
889 clus->SetChi2(clusterEcc); // store ecc in chi2
890 fHClustEccentricity->Fill(clusterEcc);
891 fHClustEtaPhi->Fill(clusterVec.Eta(),clusterVec.Phi());
892 fHClustEnergyPt->Fill(clusterVec.E(),clusterVec.Pt());
893 fHClustEnergySigma->Fill(clus->E()*maxAxis,clus->E());
894 fHClustSigmaSigma->Fill(max(clus->GetM02(),clus->GetM20()),clus->E()*maxAxis);
895 fHClustNCellEnergyRatio->Fill(clus->GetNCells(),GetMaxCellEnergy(clus)/clus->E());
896 if (fNtuple) {
897 if (clus->E()<fMinE)
fa443410 898 continue;
002dcebe 899 Float_t vals[24];
900 TString trgclasses;
296ea9b4 901 vals[0] = InputEvent()->GetRunNumber();
902 vals[1] = (((UInt_t)InputEvent()->GetOrbitNumber() << 12) | (UInt_t)InputEvent()->GetBunchCrossNumber());
903 if (vals[1]<=0)
904 vals[1] = fNEvs;
905 AliESDHeader *h = dynamic_cast<AliESDHeader*>(InputEvent()->GetHeader());
002dcebe 906 if (h) {
296ea9b4 907 vals[2] = h->GetL0TriggerInputs();
002dcebe 908 trgclasses = fEsdEv->GetFiredTriggerClasses();
909 }
296ea9b4 910 else {
911 AliAODHeader *h2 = dynamic_cast<AliAODHeader*>(InputEvent()->GetHeader());
002dcebe 912 if (h2) {
296ea9b4 913 vals[2] = h2->GetL0TriggerInputs();
002dcebe 914 trgclasses = h2->GetFiredTriggerClasses();
915 } else
296ea9b4 916 vals[2] = 0;
a49742b5 917 }
002dcebe 918 vals[3] = 0;
919 if (trgclasses.Contains("CINT1-B"))
920 vals[3] += 1;
921 if (trgclasses.Contains("CINT1B"))
922 vals[3] += 2;
923 if (trgclasses.Contains("CSH1-B"))
924 vals[3] += 4;
925 if (trgclasses.Contains("CEMC1-B"))
926 vals[3] += 8;
927 vals[4] = InputEvent()->GetCentrality()->GetCentralityPercentileUnchecked(fCentVar);
928 vals[5] = clusterVec.Pt();
929 vals[6] = clusterVec.Eta();
930 vals[7] = clusterVec.Phi();
931 vals[8] = clusterVec.E();
932 vals[9] = GetMaxCellEnergy(clus);
933 vals[10] = clus->GetNCells();
934 vals[11] = GetNCells(clus,0.100);
935 vals[12] = fGeom->GetSuperModuleNumber(clus->GetCellAbsId(0));
936 vals[13] = clus->GetDistanceToBadChannel();
937 vals[14] = clus->GetDispersion();
938 vals[15] = clus->GetM20();
939 vals[16] = clus->GetM02();
940 vals[17] = clusterEcc;
941 vals[18] = maxAxis;
942 vals[19] = fClusProps[i].fTrDz;
943 vals[20] = fClusProps[i].fTrDr;
944 vals[21] = fClusProps[i].fTrEp;
945 vals[22] = fClusProps[i].fTrIso;
946 vals[23] = fClusProps[i].fCellIso;
296ea9b4 947 fNtuple->Fill(vals);
fa443410 948 }
949 }
286b47a5 950}
951
952//________________________________________________________________________
953void AliAnalysisTaskEMCALPi0PbPb::FillPionHists()
954{
955 // Fill histograms related to pions.
286b47a5 956
296ea9b4 957 Double_t vertex[3] = {0};
fa443410 958 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
959
90d5b88b 960 TObjArray *clusters = fEsdClusters;
961 if (!clusters)
962 clusters = fAodClusters;
fa443410 963
90d5b88b 964 if (clusters) {
965 TLorentzVector clusterVec1;
966 TLorentzVector clusterVec2;
967 TLorentzVector pionVec;
968
969 Int_t nclus = clusters->GetEntries();
fa443410 970 for (Int_t i = 0; i<nclus; ++i) {
90d5b88b 971 AliVCluster *clus1 = static_cast<AliVCluster*>(clusters->At(i));
fa443410 972 if (!clus1)
973 continue;
974 if (!clus1->IsEMCAL())
975 continue;
3c661da5 976 if (clus1->E()<fMinE)
6eb6260e 977 continue;
a49742b5 978 if (clus1->GetNCells()<fNminCells)
979 continue;
f224d35b 980 if (GetMaxCellEnergy(clus1)/clus1->E()<fMinErat)
981 continue;
3c661da5 982 if (clus1->Chi2()<fMinEcc) // eccentricity cut
f224d35b 983 continue;
fa443410 984 clus1->GetMomentum(clusterVec1,vertex);
985 for (Int_t j = i+1; j<nclus; ++j) {
90d5b88b 986 AliVCluster *clus2 = static_cast<AliVCluster*>(clusters->At(j));
fa443410 987 if (!clus2)
988 continue;
989 if (!clus2->IsEMCAL())
990 continue;
3c661da5 991 if (clus2->E()<fMinE)
6eb6260e 992 continue;
a49742b5 993 if (clus2->GetNCells()<fNminCells)
994 continue;
f224d35b 995 if (GetMaxCellEnergy(clus2)/clus2->E()<fMinErat)
996 continue;
3c661da5 997 if (clus2->Chi2()<fMinEcc) // eccentricity cut
f224d35b 998 continue;
fa443410 999 clus2->GetMomentum(clusterVec2,vertex);
1000 pionVec = clusterVec1 + clusterVec2;
1001 Double_t pionZgg = TMath::Abs(clusterVec1.E()-clusterVec2.E())/pionVec.E();
6eb6260e 1002 Double_t pionOpeningAngle = clusterVec1.Angle(clusterVec2.Vect());
d595acbb 1003 if (pionZgg < fAsymMax) {
1004 fHPionEtaPhi->Fill(pionVec.Eta(),pionVec.Phi());
1005 fHPionMggPt->Fill(pionVec.M(),pionVec.Pt());
1006 fHPionMggAsym->Fill(pionVec.M(),pionZgg);
6eb6260e 1007 fHPionMggDgg->Fill(pionVec.M(),pionOpeningAngle);
d595acbb 1008 Int_t bin = fPtRanges->FindBin(pionVec.Pt());
1009 fHPionInvMasses[bin]->Fill(pionVec.M());
1010 }
fa443410 1011 }
1012 }
90d5b88b 1013 }
fa443410 1014}
d595acbb 1015
6eb6260e 1016//________________________________________________________________________
323834f0 1017void AliAnalysisTaskEMCALPi0PbPb::FillOtherHists()
6eb6260e 1018{
323834f0 1019 // Fill histograms related to cell properties.
6eb6260e 1020}
1021
d595acbb 1022//________________________________________________________________________
296ea9b4 1023Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsolation(Double_t cEta, Double_t cPhi, Double_t radius) const
1024{
1025 // Compute isolation based on cell content.
1026
1027 AliVCaloCells *cells = fEsdCells;
1028 if (!cells)
1029 cells = fAodCells;
1030 if (!cells)
1031 return 0;
1032
1033 Double_t cellIsolation = 0;
1034 Double_t rad2 = radius*radius;
1035 Int_t ncells = cells->GetNumberOfCells();
1036 for (Int_t i = 0; i<ncells; ++i) {
1037 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1038 Double_t cellE = cells->GetAmplitude(i);
1039 Float_t eta, phi;
1040 fGeom->EtaPhiFromIndex(absID,eta,phi);
1041 Double_t phidiff = TVector2::Phi_0_2pi(phi-cPhi);
1042 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1043 if(dist>rad2)
1044 continue;
1045 cellIsolation += cellE;
1046 }
1047 return cellIsolation;
1048}
1049
1050//________________________________________________________________________
1051Double_t AliAnalysisTaskEMCALPi0PbPb::GetMaxCellEnergy(AliVCluster *cluster) const
d595acbb 1052{
90d5b88b 1053 // Get maximum energy of attached cell.
1054
1055 Double_t maxe = 0;
90d5b88b 1056 Int_t ncells = cluster->GetNCells();
1057 if (fEsdCells) {
1058 for (Int_t i=0; i<ncells; i++) {
27422847 1059 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
f0897c18 1060 if (e>maxe) {
90d5b88b 1061 maxe = e;
f0897c18 1062 }
90d5b88b 1063 }
1064 } else {
1065 for (Int_t i=0; i<ncells; i++) {
27422847 1066 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
90d5b88b 1067 if (e>maxe)
1068 maxe = e;
1069 }
1070 }
6eb6260e 1071 return maxe;
d595acbb 1072}
1073
1074//________________________________________________________________________
296ea9b4 1075void AliAnalysisTaskEMCALPi0PbPb::GetSigma(AliVCluster *c, Double_t& sigmaMax, Double_t &sigmaMin) const
d595acbb 1076{
90d5b88b 1077 // Calculate the (E) weighted variance along the longer (eigen) axis.
1078
6bf90832 1079 sigmaMax = 0; // cluster variance along its longer axis
1080 sigmaMin = 0; // cluster variance along its shorter axis
1081 Double_t Ec = c->E(); // cluster energy
296ea9b4 1082 if(Ec<=0)
1083 return;
6bf90832 1084 Double_t Xc = 0 ; // cluster first moment along X
1085 Double_t Yc = 0 ; // cluster first moment along Y
1086 Double_t Sxx = 0 ; // cluster second central moment along X (variance_X^2)
1087 Double_t Sxy = 0 ; // cluster second central moment along Y (variance_Y^2)
1088 Double_t Syy = 0 ; // cluster covariance^2
90d5b88b 1089
1090 AliVCaloCells *cells = fEsdCells;
1091 if (!cells)
1092 cells = fAodCells;
1093
6eb6260e 1094 if (!cells)
1095 return;
1096
6bf90832 1097 Int_t ncells = c->GetNCells();
6eb6260e 1098 if (ncells==1)
1099 return;
1100
1101 TVector3 pos;
1102 for(Int_t j=0; j<ncells; ++j) {
6bf90832 1103 Int_t id = TMath::Abs(c->GetCellAbsId(j));
27422847 1104 fGeom->GetGlobal(id,pos);
6eb6260e 1105 Double_t cellen = cells->GetCellAmplitude(id);
1106 Xc += cellen*pos.X();
1107 Yc += cellen*pos.Y();
1108 Sxx += cellen*pos.X()*pos.X();
1109 Syy += cellen*pos.Y()*pos.Y();
1110 Sxy += cellen*pos.X()*pos.Y();
1111 }
1112 Xc /= Ec;
1113 Yc /= Ec;
1114 Sxx /= Ec;
1115 Syy /= Ec;
1116 Sxy /= Ec;
1117 Sxx -= Xc*Xc;
1118 Syy -= Yc*Yc;
1119 Sxy -= Xc*Yc;
f0897c18 1120 Sxx = TMath::Abs(Sxx);
1121 Syy = TMath::Abs(Syy);
296ea9b4 1122 sigmaMax = (Sxx + Syy + TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
1123 sigmaMax = TMath::Sqrt(TMath::Abs(sigmaMax));
1124 sigmaMin = TMath::Abs(Sxx + Syy - TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
1125 sigmaMin = TMath::Sqrt(TMath::Abs(sigmaMin));
d595acbb 1126}
90d5b88b 1127
6bf90832 1128//________________________________________________________________________
296ea9b4 1129Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(AliVCluster *c, Double_t emin) const
6bf90832 1130{
1131 // Calculate number of attached cells above emin.
1132
6bf90832 1133 AliVCaloCells *cells = fEsdCells;
1134 if (!cells)
1135 cells = fAodCells;
6bf90832 1136 if (!cells)
296ea9b4 1137 return 0;
6bf90832 1138
296ea9b4 1139 Int_t n = 0;
6bf90832 1140 Int_t ncells = c->GetNCells();
1141 for(Int_t j=0; j<ncells; ++j) {
1142 Int_t id = TMath::Abs(c->GetCellAbsId(j));
1143 Double_t cellen = cells->GetCellAmplitude(id);
1144 if (cellen>=emin)
1145 ++n;
1146 }
1147 return n;
1148}
1149
296ea9b4 1150//________________________________________________________________________
1151Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius) const
1152{
1153 // Compute isolation based on tracks.
1154
1155 Double_t trkIsolation = 0;
1156 Double_t rad2 = radius*radius;
1157 Int_t ntrks = fSelTracks->GetEntries();
1158 for(Int_t j = 0; j<ntrks; ++j) {
1159 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
1160 if (!track)
1161 continue;
1162 Float_t eta = track->Eta();
1163 Float_t phi = track->Phi();
1164 Double_t phidiff = TVector2::Phi_0_2pi(phi-cPhi);
1165 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1166 if(dist>rad2)
1167 continue;
1168 trkIsolation += track->Pt();
1169 }
1170 return trkIsolation;
1171}