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