3 #include "AliAnalysisTaskEMCALPi0PbPb.h"
6 #include <TClonesArray.h>
8 #include <TGeoGlobalMagField.h>
12 #include <TLorentzVector.h>
17 #include "AliAODEvent.h"
18 #include "AliAODVertex.h"
19 #include "AliAnalysisManager.h"
20 #include "AliAnalysisTaskEMCALClusterizeFast.h"
21 #include "AliCDBManager.h"
22 #include "AliCentrality.h"
23 #include "AliEMCALGeoUtils.h"
24 #include "AliEMCALGeometry.h"
25 #include "AliEMCALRecoUtils.h"
26 #include "AliESDCaloTrigger.h"
27 #include "AliESDEvent.h"
28 #include "AliESDVertex.h"
29 #include "AliESDtrack.h"
30 #include "AliESDtrackCuts.h"
31 #include "AliEventplane.h"
32 #include "AliGeomManager.h"
33 #include "AliInputEventHandler.h"
36 #include "AliTrackerBase.h"
38 ClassImp(AliAnalysisTaskEMCALPi0PbPb)
40 //________________________________________________________________________
41 AliAnalysisTaskEMCALPi0PbPb::AliAnalysisTaskEMCALPi0PbPb(const char *name)
42 : AliAnalysisTaskSE(name),
57 fGeoName("EMCAL_FIRSTYEARV1"),
98 fHTclsBeforeCuts(0x0),
107 fHCellFreqNoCut(0x0),
108 fHCellFreqCut100M(0x0),
109 fHCellFreqCut300M(0x0),
112 fHClustEccentricity(0),
114 fHClustEnergyPt(0x0),
115 fHClustEnergySigma(0x0),
116 fHClustSigmaSigma(0x0),
117 fHClustNCellEnergyRatio(0x0),
131 DefineInput(0, TChain::Class());
132 DefineOutput(1, TList::Class());
133 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.,SPDVertex.,TPCVertex.,EMCALCells.,Tracks EMCALTrigger."
134 "AOD:header,vertices,emcalCells,tracks";
137 //________________________________________________________________________
138 AliAnalysisTaskEMCALPi0PbPb::~AliAnalysisTaskEMCALPi0PbPb()
142 if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
143 delete fOutput; fOutput = 0;
145 delete fPtRanges; fPtRanges = 0;
146 delete fGeom; fGeom = 0;
147 delete fReco; fReco = 0;
148 delete fTrClassNamesArr;
150 delete fSelPrimTracks;
151 delete [] fAmpInTrigger;
153 delete [] fHColuRowE;
154 delete [] fHCellMult;
155 delete [] fHCellFreqNoCut;
156 delete [] fHCellFreqCut100M;
157 delete [] fHCellFreqCut300M;
160 //________________________________________________________________________
161 void AliAnalysisTaskEMCALPi0PbPb::UserCreateOutputObjects()
163 // Create user objects here.
165 cout << "AliAnalysisTaskEMCALPi0PbPb: Input settings" << endl;
166 cout << " fCentVar: " << fCentVar << endl;
167 cout << " fCentFrom: " << fCentFrom << endl;
168 cout << " fCentTo: " << fCentTo << endl;
169 cout << " fVtxZMin: " << fVtxZMin << endl;
170 cout << " fVtxZMax: " << fVtxZMax << endl;
171 cout << " fUseQualFlag: " << fUseQualFlag << endl;
172 cout << " fClusName: \"" << fClusName << "\"" << endl;
173 cout << " fDoNtuple: " << fDoNtuple << endl;
174 cout << " fDoAfterburner: " << fDoAfterburner << endl;
175 cout << " fAsymMax: " << fAsymMax << endl;
176 cout << " fNminCells: " << fNminCells << endl;
177 cout << " fMinE: " << fMinE << endl;
178 cout << " fMinErat: " << fMinErat << endl;
179 cout << " fMinEcc: " << fMinEcc << endl;
180 cout << " fGeoName: \"" << fGeoName << "\"" << endl;
181 cout << " fMinNClusPerTr: " << fMinNClusPerTr << endl;
182 cout << " fTrClassNames: \"" << fTrClassNames << "\"" << endl;
183 cout << " fDoNtuple: " << fDoNtuple << endl;
184 cout << " fTrCuts: " << fTrCuts << endl;
185 cout << " fPrimTrCuts: " << fPrimTrCuts << endl;
186 cout << " fDoTrMatGeom: " << fDoTrMatGeom << endl;
187 cout << " fTrainMode: " << fTrainMode << endl;
188 cout << " fMarkCells: " << fMarkCells << endl;
189 cout << " fMinL0Time: " << fMinL0Time << endl;
190 cout << " fMaxL0Time: " << fMaxL0Time << endl;
192 fGeom = new AliEMCALGeoUtils(fGeoName,"EMCAL");
193 fReco = new AliEMCALRecoUtils();
194 fTrClassNamesArr = fTrClassNames.Tokenize(" ");
195 fOutput = new TList();
197 fSelTracks = new TObjArray;
198 fSelPrimTracks = new TObjArray;
201 TFile *f = OpenFile(1);
203 f->SetCompressionLevel(2);
204 fNtuple = new TTree(Form("tree%.0fto%.0f",fCentFrom,fCentTo), "StandaloneTree");
205 fNtuple->SetDirectory(f);
207 fNtuple->SetAutoFlush(-2*1024*1024);
208 fNtuple->SetAutoSave(0);
210 fNtuple->SetAutoFlush(-32*1024*1024);
211 fNtuple->SetAutoSave(0);
214 fHeader = new AliStaHeader;
215 fNtuple->Branch("header", &fHeader, 16*1024, 99);
216 fPrimVert = new AliStaVertex;
217 fNtuple->Branch("primv", &fPrimVert, 16*1024, 99);
218 fSpdVert = new AliStaVertex;
219 fNtuple->Branch("spdv", &fSpdVert, 16*1024, 99);
220 fTpcVert = new AliStaVertex;
221 fNtuple->Branch("tpcv", &fTpcVert, 16*1024, 99);
222 if (TClass::GetClass("AliStaCluster"))
223 TClass::GetClass("AliStaCluster")->IgnoreTObjectStreamer();
224 fClusters = new TClonesArray("AliStaCluster");
225 fNtuple->Branch("clusters", &fClusters, 8*16*1024, 99);
226 if (TClass::GetClass("AliStaTrigger"))
227 TClass::GetClass("AliStaTrigger")->IgnoreTObjectStreamer();
228 fTriggers = new TClonesArray("AliStaTrigger");
229 fNtuple->Branch("l0prim", &fTriggers, 16*1024, 99);
233 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
234 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad();
235 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad();
238 TH1::SetDefaultSumw2(kTRUE);
239 TH2::SetDefaultSumw2(kTRUE);
240 fHCuts = new TH1F("hEventCuts","",5,0.5,5.5);
241 fHCuts->GetXaxis()->SetBinLabel(1,"All");
242 fHCuts->GetXaxis()->SetBinLabel(2,"PS");
243 fHCuts->GetXaxis()->SetBinLabel(3,Form("%s: %.0f-%.0f",fCentVar.Data(),fCentFrom,fCentTo));
244 fHCuts->GetXaxis()->SetBinLabel(4,"QFlag");
245 fHCuts->GetXaxis()->SetBinLabel(5,Form("zvtx: %.0f-%.0f",fVtxZMin,fVtxZMax));
246 fOutput->Add(fHCuts);
247 fHVertexZ = new TH1F("hVertexZBeforeCut","",100,-25,25);
248 fHVertexZ->SetXTitle("z [cm]");
249 fOutput->Add(fHVertexZ);
250 fHVertexZ2 = new TH1F("hVertexZAfterCut","",100,-25,25);
251 fHVertexZ2->SetXTitle("z [cm]");
252 fOutput->Add(fHVertexZ2);
253 fHCent = new TH1F("hCentBeforeCut","",101,-1,100);
254 fHCent->SetXTitle(fCentVar.Data());
255 fOutput->Add(fHCent);
256 fHCentQual = new TH1F("hCentAfterCut","",101,-1,100);
257 fHCentQual->SetXTitle(fCentVar.Data());
258 fOutput->Add(fHCentQual);
259 fHTclsBeforeCuts = new TH1F("hTclsBeforeCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
260 fHTclsAfterCuts = new TH1F("hTclsAfterCuts","",fTrClassNamesArr->GetEntries(),0.5,0.5+fTrClassNamesArr->GetEntries());
261 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
262 const char *name = fTrClassNamesArr->At(i)->GetName();
263 fHTclsBeforeCuts->GetXaxis()->SetBinLabel(1+i,name);
264 fHTclsAfterCuts->GetXaxis()->SetBinLabel(1+i,name);
266 fOutput->Add(fHTclsBeforeCuts);
267 fOutput->Add(fHTclsAfterCuts);
269 // histograms for cells
270 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
271 fHColuRow = new TH2*[nsm];
272 fHColuRowE = new TH2*[nsm];
273 fHCellMult = new TH1*[nsm];
274 for (Int_t i = 0; i<nsm; ++i) {
275 fHColuRow[i] = new TH2F(Form("hColRow_Mod%d",i),"",48,0,48,24,0.,24);
276 fHColuRow[i]->SetTitle(Form("Module %d: Occupancy", i));
277 fHColuRow[i]->SetXTitle("col (i#eta)");
278 fHColuRow[i]->SetYTitle("row (i#phi)");
279 fHColuRowE[i] = new TH2F(Form("hColRowE_Mod%d", i),"",48,0,48,24,0,24);
280 fHColuRowE[i]->SetTitle(Form("Module %d: Cell energy",i));
281 fHColuRowE[i]->SetXTitle("col (i#eta)");
282 fHColuRowE[i]->SetYTitle("row (i#phi)");
283 fHCellMult[i] = new TH1F(Form("hCellMult_Mod%d",i),"",1000,0,1000);
284 fHCellMult[i]->SetTitle(Form("Module %d: Cell multiplicity",i));
285 fHCellMult[i]->SetXTitle("# of cells");
286 fOutput->Add(fHColuRow[i]);
287 fOutput->Add(fHColuRowE[i]);
288 fOutput->Add(fHCellMult[i]);
290 fHCellE = new TH1F("hCellE","",250,0.,25.);
291 fHCellE->SetXTitle("E_{cell} [GeV]");
292 fOutput->Add(fHCellE);
293 fHCellH = new TH1F ("hCellHighestE","",250,0.,25.);
294 fHCellH->SetXTitle("E^{max}_{cell} [GeV]");
295 fOutput->Add(fHCellH);
296 fHCellM = new TH1F ("hCellMeanEperHitCell","",250,0.,2.5);
297 fHCellM->SetXTitle("#LT E_{cell}#GT [GeV]");
298 fOutput->Add(fHCellM);
299 fHCellM2 = new TH1F ("hCellMeanEperAllCells","",250,0.,1);
300 fHCellM2->SetXTitle("1/N_{cells} #Sigma E_{cell} [GeV]");
301 fOutput->Add(fHCellM2);
303 fHCellFreqNoCut = new TH1*[nsm];
304 fHCellFreqCut100M = new TH1*[nsm];
305 fHCellFreqCut300M = new TH1*[nsm];
306 fHCellFreqE = new TH1*[nsm];
307 for (Int_t i = 0; i<nsm; ++i){
308 Double_t lbin = i*24*48-0.5;
309 Double_t hbin = lbin+24*48;
310 fHCellFreqNoCut[i] = new TH1F(Form("hCellFreqNoCut_SM%d",i),
311 Form("Frequency SM%d (no cut);id;#",i), 1152, lbin, hbin);
312 fHCellFreqCut100M[i] = new TH1F(Form("hCellFreqCut100M_SM%d",i),
313 Form("Frequency SM%d (>0.1GeV);id;#",i), 1152, lbin, hbin);
314 fHCellFreqCut300M[i] = new TH1F(Form("hCellFreqCut300M_SM%d",i),
315 Form("Frequency SM%d (>0.3GeV);id;#",i), 1152, lbin, hbin);
316 fHCellFreqE[i] = new TH1F(Form("hCellFreqE_SM%d",i),
317 Form("Frequency SM%d (E weighted);id;#",i), 1152, lbin, hbin);
318 fOutput->Add(fHCellFreqNoCut[i]);
319 fOutput->Add(fHCellFreqCut100M[i]);
320 fOutput->Add(fHCellFreqCut300M[i]);
321 fOutput->Add(fHCellFreqE[i]);
323 if (!fMarkCells.IsNull()) {
324 fHCellCheckE = new TH1*[24*48*nsm];
325 memset(fHCellCheckE,0,24*48*nsm*sizeof(TH1*));
326 TObjArray *cells = fMarkCells.Tokenize(" ");
327 Int_t n = cells->GetEntries();
328 Int_t *tcs = new Int_t[n];
329 for (Int_t i=0;i<n;++i) {
330 TString name(cells->At(i)->GetName());
333 for (Int_t i = 0; i<n; ++i) {
336 fHCellCheckE[i] = new TH1F(Form("hCellE_id%d",c), Form("Cell %d;E [GeV/c];#",c), 1000, 0, 10);
337 fOutput->Add(fHCellCheckE[i]);
344 // histograms for clusters
346 fHClustEccentricity = new TH1F("hClustEccentricity","",100,-0.1,1.1);
347 fHClustEccentricity->SetXTitle("#epsilon_{C}");
348 fOutput->Add(fHClustEccentricity);
349 fHClustEtaPhi = new TH2F("hClustEtaPhi","",500,-0.8,0.8,100*nsm,phimin,phimax);
350 fHClustEtaPhi->SetXTitle("#eta");
351 fHClustEtaPhi->SetYTitle("#varphi");
352 fOutput->Add(fHClustEtaPhi);
353 fHClustEnergyPt = new TH2F("hClustEnergyPt","",250,0,50,250,0,50);
354 fHClustEnergyPt->SetXTitle("E [GeV]");
355 fHClustEnergyPt->SetYTitle("p_{T} [GeV/c]");
356 fOutput->Add(fHClustEnergyPt);
357 fHClustEnergySigma = new TH2F("hClustEnergySigma","",100,0,100,500,0,50);
358 fHClustEnergySigma->SetXTitle("E_{C} * #sigma_{max} [GeV*cm]");
359 fHClustEnergySigma->SetYTitle("E_{C} [GeV]");
360 fOutput->Add(fHClustEnergySigma);
361 fHClustSigmaSigma = new TH2F("hClustSigmaSigma","",500,0,50,500,0,50);
362 fHClustSigmaSigma->SetXTitle("#lambda_{0} [cm]");
363 fHClustSigmaSigma->SetYTitle("#sigma_{max} [cm]");
364 fOutput->Add(fHClustSigmaSigma);
365 fHClustNCellEnergyRatio = new TH2F("hClustNCellEnergyRatio","",27,-0.5,26.5,101,-0.05,1.05);
366 fHClustNCellEnergyRatio->SetXTitle("N_{cells}");
367 fHClustNCellEnergyRatio->SetYTitle("E^{max}_{cell}/E_{clus}");
368 fOutput->Add(fHClustNCellEnergyRatio);
371 // histograms for track matching
372 fHMatchDr = new TH1F("hMatchDrDist",";dR [cm]",500,0,200);
373 fOutput->Add(fHMatchDr);
374 fHMatchDz = new TH1F("hMatchDzDist",";dZ [cm]",500,-100,100);
375 fOutput->Add(fHMatchDz);
376 fHMatchEp = new TH1F("hMatchEpDist",";E/p",100,0,10);
377 fOutput->Add(fHMatchEp);
379 // histograms for pion candidates
381 fHPionEtaPhi = new TH2F("hPionEtaPhi","",100,-0.8,0.8,100*nsm,phimin,phimax);
382 fHPionEtaPhi->SetXTitle("#eta_{#gamma#gamma}");
383 fHPionEtaPhi->SetYTitle("#varphi_{#gamma#gamma}");
384 fOutput->Add(fHPionEtaPhi);
385 fHPionMggPt = new TH2F("hPionMggPt","",1000,0,2,100,0,20.0);
386 fHPionMggPt->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
387 fHPionMggPt->SetYTitle("p_{T}^{#gamma#gamma} [GeV/c]");
388 fOutput->Add(fHPionMggPt);
389 fHPionMggAsym = new TH2F("hPionMggAsym","",1000,0,2,100,0,1);
390 fHPionMggAsym->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
391 fHPionMggAsym->SetYTitle("Z_{#gamma#gamma} [GeV]");
392 fOutput->Add(fHPionMggAsym);
393 fHPionMggDgg = new TH2F("hPionMggDgg","",1000,0,2,100,0,10);
394 fHPionMggDgg->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
395 fHPionMggDgg->SetYTitle("opening angle [grad]");
396 fOutput->Add(fHPionMggDgg);
397 const Int_t nbins = 20;
398 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};
399 fPtRanges = new TAxis(nbins-1,xbins);
400 for (Int_t i = 0; i<=nbins; ++i) {
401 fHPionInvMasses[i] = new TH1F(Form("hPionInvMass%d",i),"",1000,0,2);
402 fHPionInvMasses[i]->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]");
404 fHPionInvMasses[i]->SetTitle(Form("0 < p_{T}^{#gamma#gamma} <%.1f",xbins[0]));
406 fHPionInvMasses[i]->SetTitle(Form("p_{T}^{#gamma#gamma} > 50"));
408 fHPionInvMasses[i]->SetTitle(Form("%.1f < p_{T}^{#gamma#gamma} <%.1f",xbins[i-1],xbins[i]));
409 fOutput->Add(fHPionInvMasses[i]);
413 PostData(1, fOutput);
416 //________________________________________________________________________
417 void AliAnalysisTaskEMCALPi0PbPb::UserExec(Option_t *)
419 // Called for each event.
424 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
425 fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
427 am->LoadBranch("AliESDRun.");
428 am->LoadBranch("AliESDHeader.");
430 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
432 AliFatal("Neither ESD nor AOD event found");
435 am->LoadBranch("header");
438 if (fDoTrMatGeom && !AliGeomManager::GetGeometry()) { // get geometry
439 AliWarning("Accessing geometry from OCDB, this is not very efficient!");
440 AliCDBManager *cdb = AliCDBManager::Instance();
441 if (!cdb->IsDefaultStorageSet())
442 cdb->SetDefaultStorage("raw://");
443 Int_t runno = InputEvent()->GetRunNumber();
444 if (runno != cdb->GetRun())
446 AliGeomManager::LoadGeometry();
449 if (!AliGeomManager::GetGeometry()&&!fIsGeoMatsSet) { // set misalignment matrices (stored in first event)
450 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
452 for (Int_t i=0; i<nsm; ++i)
453 fGeom->SetMisalMatrix(fEsdEv->GetESDRun()->GetEMCALMatrix(i),i);
455 for (Int_t i=0; i<nsm; ++i)
456 fGeom->SetMisalMatrix(fAodEv->GetHeader()->GetEMCALMatrix(i),i);
458 fIsGeoMatsSet = kTRUE;
461 if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
463 const AliESDRun *erun = fEsdEv->GetESDRun();
464 AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
465 erun->GetCurrentDip(),
468 erun->GetBeamEnergy(),
469 erun->GetBeamType());
470 TGeoGlobalMagField::Instance()->SetField(field);
472 Double_t pol = -1; //polarity
473 Double_t be = -1; //beam energy
474 AliMagF::BeamType_t btype = AliMagF::kBeamTypepp;
475 Int_t runno = fAodEv->GetRunNumber();
476 if (runno>=136851 && runno<138275) {
479 btype = AliMagF::kBeamTypeAA;
480 } else if (runno>=138275 && runno<=139517) {
483 btype = AliMagF::kBeamTypeAA;
485 AliError(Form("Do not know the bfield parameters for run %d! Using defaults!!!", runno));
487 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", pol, pol, AliMagF::k5kG, btype, be));
495 AliESDHeader *h = dynamic_cast<AliESDHeader*>(InputEvent()->GetHeader());
497 trgclasses = fEsdEv->GetFiredTriggerClasses();
499 AliAODHeader *h2 = dynamic_cast<AliAODHeader*>(InputEvent()->GetHeader());
501 trgclasses = h2->GetFiredTriggerClasses();
503 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
504 const char *name = fTrClassNamesArr->At(i)->GetName();
505 if (trgclasses.Contains(name))
506 fHTclsBeforeCuts->Fill(1+i);
509 UInt_t res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
515 const AliCentrality *centP = InputEvent()->GetCentrality();
516 Double_t cent = centP->GetCentralityPercentileUnchecked(fCentVar);
518 if (cent<fCentFrom||cent>fCentTo)
524 if (centP->GetQuality()>0)
528 fHCentQual->Fill(cent);
532 am->LoadBranch("PrimaryVertex.");
533 am->LoadBranch("SPDVertex.");
534 am->LoadBranch("TPCVertex.");
536 fAodEv = dynamic_cast<AliAODEvent*>(InputEvent());
537 am->LoadBranch("vertices");
541 const AliVVertex *vertex = InputEvent()->GetPrimaryVertex();
545 fHVertexZ->Fill(vertex->GetZ());
547 if(vertex->GetZ()<fVtxZMin||vertex->GetZ()>fVtxZMax)
551 fHVertexZ2->Fill(vertex->GetZ());
553 // count number of accepted events
556 for (Int_t i = 0; i<fTrClassNamesArr->GetEntries(); ++i) {
557 const char *name = fTrClassNamesArr->At(i)->GetName();
558 if (trgclasses.Contains(name))
559 fHTclsAfterCuts->Fill(1+i);
562 fRecPoints = 0; // will be set if fClusName is given and AliAnalysisTaskEMCALClusterizeFast is used
563 fEsdClusters = 0; // will be set if ESD input used and if fRecPoints are not set or if clusters are attached
564 fEsdCells = 0; // will be set if ESD input used
565 fAodClusters = 0; // will be set if AOD input used and if fRecPoints are not set or if clusters are attached
566 // or if fClusName is given and AliAnalysisTaskEMCALClusterizeFast in AOD output mode
567 fAodCells = 0; // will be set if AOD input used
569 // deal with special output from AliAnalysisTaskEMCALClusterizeFast first
570 Bool_t clusattached = 0;
571 Bool_t recalibrated = 0;
572 if (1 && !fClusName.IsNull()) {
573 AliAnalysisTaskEMCALClusterizeFast *cltask = 0;
574 TObjArray *ts = am->GetTasks();
575 cltask = dynamic_cast<AliAnalysisTaskEMCALClusterizeFast*>(ts->FindObject(fClusName));
576 if (cltask && cltask->GetClusters()) {
577 fRecPoints = const_cast<TObjArray*>(cltask->GetClusters());
578 clusattached = cltask->GetAttachClusters();
579 if (cltask->GetCalibData()!=0)
580 recalibrated = kTRUE;
583 if (1 && AODEvent() && !fClusName.IsNull()) {
584 TList *l = AODEvent()->GetList();
585 TClonesArray *clus = 0;
587 clus = dynamic_cast<TClonesArray*>(l->FindObject(fClusName));
592 if (fEsdEv) { // ESD input mode
593 if (1 && (!fRecPoints||clusattached)) {
595 am->LoadBranch("CaloClusters");
596 TList *l = fEsdEv->GetList();
597 TClonesArray *clus = 0;
599 clus = dynamic_cast<TClonesArray*>(l->FindObject("CaloClusters"));
605 am->LoadBranch("EMCALCells.");
606 fEsdCells = fEsdEv->GetEMCALCells();
608 } else if (fAodEv) { // AOD input mode
609 if (1 && (!fAodClusters || clusattached)) {
611 am->LoadBranch("caloClusters");
612 TList *l = fAodEv->GetList();
613 TClonesArray *clus = 0;
615 clus = dynamic_cast<TClonesArray*>(l->FindObject("caloClusters"));
621 am->LoadBranch("emcalCells");
622 fAodCells = fAodEv->GetEMCALCells();
625 AliFatal("Impossible to not have either pointer to ESD or AOD event");
629 AliDebug(2,Form("fRecPoints set: %p", fRecPoints));
630 AliDebug(2,Form("fEsdClusters set: %p", fEsdClusters));
631 AliDebug(2,Form("fEsdCells set: %p", fEsdCells));
632 AliDebug(2,Form("fAodClusters set: %p", fAodClusters));
633 AliDebug(2,Form("fAodCells set: %p", fAodCells));
637 ClusterAfterburner();
654 fSelPrimTracks->Clear();
658 PostData(1, fOutput);
661 //________________________________________________________________________
662 void AliAnalysisTaskEMCALPi0PbPb::Terminate(Option_t *)
664 // Terminate called at the end of analysis.
667 TFile *f = OpenFile(1);
672 AliInfo(Form("%s: Accepted %lld events", GetName(), fNEvs));
675 //________________________________________________________________________
676 void AliAnalysisTaskEMCALPi0PbPb::CalcCaloTriggers()
678 // Calculate triggers
682 AliVCaloCells *cells = fEsdCells;
688 Int_t ncells = cells->GetNumberOfCells();
692 if (ncells>fNAmpInTrigger) {
693 delete [] fAmpInTrigger;
694 fAmpInTrigger = new Float_t[ncells];
695 fNAmpInTrigger = ncells;
697 for (Int_t i=0;i<ncells;++i)
698 fAmpInTrigger[i] = 0;
700 std::map<Short_t,Short_t> map;
701 for (Short_t pos=0;pos<ncells;++pos) {
702 Short_t id = cells->GetCellNumber(pos);
706 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
707 am->LoadBranch("EMCALTrigger.");
709 AliESDCaloTrigger *triggers = fEsdEv->GetCaloTrigger("EMCAL");
712 if (triggers->GetEntries()<=0)
717 while (triggers->Next()) {
718 Int_t gCol=0, gRow=0, ntimes=0;
719 triggers->GetPosition(gCol,gRow);
720 triggers->GetNL0Times(ntimes);
724 triggers->GetAmplitude(amp);
726 fGeom->GetAbsFastORIndexFromPositionInEMCAL(gCol,gRow,find);
729 Int_t cidx[4] = {-1};
730 Bool_t ret = fGeom->GetCellIndexFromFastORIndex(find, cidx);
734 triggers->GetL0Times(trgtimes);
735 Int_t mintime = trgtimes[0];
736 Int_t maxtime = trgtimes[0];
737 Bool_t trigInTimeWindow = 0;
738 for (Int_t i=0;i<ntimes;++i) {
739 if (trgtimes[i]<mintime)
740 mintime = trgtimes[i];
741 if (maxtime<trgtimes[i])
742 maxtime = trgtimes[i];
743 if ((fMinL0Time<trgtimes[i]) && (fMaxL0Time>trgtimes[i]))
744 trigInTimeWindow = 1;
747 Double_t tenergy = 0;
750 for (Int_t i=0;i<3;++i) {
752 std::map<Short_t,Short_t>::iterator it = map.find(cidx[i]);
757 if (trigInTimeWindow)
758 fAmpInTrigger[pos] = amp; // save for usage in CalcClusProperties
759 Float_t eta=-1, phi=-1;
760 fGeom->EtaPhiFromIndex(cidx[i],eta,phi);
761 Double_t en= cells->GetAmplitude(pos);
768 AliStaTrigger *trignew = static_cast<AliStaTrigger*>(fTriggers->New(ntrigs++));
769 trignew->fE = tenergy;
770 trignew->fEta = teta;
771 trignew->fPhi = tphi;
773 trignew->fMinTime = mintime;
774 trignew->fMaxTime = maxtime;
778 //________________________________________________________________________
779 void AliAnalysisTaskEMCALPi0PbPb::CalcClusterProps()
781 // Calculate cluster properties
785 AliVCaloCells *cells = fEsdCells;
791 TObjArray *clusters = fEsdClusters;
793 clusters = fAodClusters;
797 Int_t ncells = cells->GetNumberOfCells();
798 Int_t nclus = clusters->GetEntries();
799 Int_t ntrks = fSelTracks->GetEntries();
800 Bool_t btracks[6][ntrks];
801 memset(btracks,0,sizeof(btracks));
803 std::map<Short_t,Short_t> map;
804 for (Short_t pos=0;pos<ncells;++pos) {
805 Short_t id = cells->GetCellNumber(pos);
809 for(Int_t i=0, ncl=0; i<nclus; ++i) {
810 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
813 if (!clus->IsEMCAL())
818 Float_t clsPos[3] = {0};
819 clus->GetPosition(clsPos);
820 TVector3 clsVec(clsPos);
821 Double_t vertex[3] = {0};
822 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
823 TLorentzVector clusterVec;
824 clus->GetMomentum(clusterVec,vertex);
825 Double_t clsEta = clusterVec.Eta();
827 AliStaCluster *cl = static_cast<AliStaCluster*>(fClusters->New(ncl++));
829 cl->fR = clsVec.Perp();
830 cl->fEta = clsVec.Eta();
831 cl->fPhi = clsVec.Phi();
832 cl->fN = clus->GetNCells();
833 cl->fN1 = GetNCells(clus,0.100);
834 cl->fN3 = GetNCells(clus,0.300);
836 Double_t emax = GetMaxCellEnergy(clus, id);
839 if (clus->GetDistanceToBadChannel()<10000)
840 cl->fDbc = clus->GetDistanceToBadChannel();
841 if (!TMath::IsNaN(clus->GetDispersion()))
842 cl->fDisp = clus->GetDispersion();
843 if (!TMath::IsNaN(clus->GetM20()))
844 cl->fM20 = clus->GetM20();
845 if (!TMath::IsNaN(clus->GetM02()))
846 cl->fM02 = clus->GetM02();
847 Double_t maxAxis = 0, minAxis = 0;
848 GetSigma(clus,maxAxis,minAxis);
849 clus->SetTOF(maxAxis); // store sigma in TOF
851 Double_t clusterEcc = 0;
853 clusterEcc = TMath::Sqrt(1.0 - minAxis*minAxis/(maxAxis*maxAxis));
854 clus->SetChi2(clusterEcc); // store ecc in chi2
855 cl->fEcc = clusterEcc;
856 cl->fTrIso = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist);
857 cl->fTrIso1 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 1);
858 cl->fTrIso2 = GetTrackIsolation(clusterVec.Eta(),clusterVec.Phi(),fIsoDist, 2);
859 cl->fCeCore = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),0.05);
860 cl->fCeIso = GetCellIsolation(clsVec.Eta(),clsVec.Phi(),fIsoDist);
861 Double_t trigpen = 0;
862 Double_t trignen = 0;
863 for(Int_t j=0; j<cl->fN; ++j) {
864 Short_t cid = TMath::Abs(clus->GetCellAbsId(j));
866 std::map<Short_t,Short_t>::iterator it = map.find(cid);
871 if (fAmpInTrigger[pos]>0)
872 trigpen += cells->GetAmplitude(pos);
873 else if (fAmpInTrigger[pos]<0)
874 trignen += cells->GetAmplitude(pos);
878 cl->fTrigE = trigpen;
882 cl->fTrigMaskE = trignen;
886 Double_t mind2 = 1e10;
887 for(Int_t j = 0; j<ntrks; ++j) {
888 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
892 if (TMath::Abs(clsEta-track->Eta())>0.5)
895 TVector3 vec(clsPos);
896 Int_t index = (Int_t)(vec.Phi()*TMath::RadToDeg()/20);
897 if (btracks[index-4][j]) {
901 Float_t tmpR=-1, tmpZ=-1;
903 AliExternalTrackParam *tParam = 0;
905 AliESDtrack *esdTrack = static_cast<AliESDtrack*>(track);
906 tParam = new AliExternalTrackParam(*esdTrack->GetTPCInnerParam());
908 tParam = new AliExternalTrackParam(track);
910 Double_t bfield[3] = {0};
911 track->GetBxByBz(bfield);
912 Double_t alpha = (index+0.5)*20*TMath::DegToRad();
913 vec.RotateZ(-alpha); //Rotate the cluster to the local extrapolation coordinate system
914 tParam->Rotate(alpha); //Rotate the track to the same local extrapolation system
915 Bool_t ret = tParam->PropagateToBxByBz(vec.X(), bfield);
917 btracks[index-4][j]=1;
921 Double_t trkPos[3] = {0};
922 tParam->GetXYZ(trkPos); //Get the extrapolated global position
923 tmpR = TMath::Sqrt( TMath::Power(clsPos[0]-trkPos[0],2)+TMath::Power(clsPos[1]-trkPos[1],2)+TMath::Power(clsPos[2]-trkPos[2],2) );
924 tmpZ = clsPos[2]-trkPos[2];
927 if (TMath::Abs(clsEta-track->Eta())>fIsoDist)
929 AliExternalTrackParam tParam(track);
930 if (!fReco->ExtrapolateTrackToCluster(&tParam, clus, tmpR, tmpZ))
938 cl->fTrDr = TMath::Sqrt(tmpR*tmpR-tmpZ*tmpZ);
939 cl->fTrEp = clus->E()/track->P();
945 fHMatchDr->Fill(cl->fTrDr);
946 fHMatchDz->Fill(cl->fTrDz);
947 fHMatchEp->Fill(cl->fTrEp);
952 //________________________________________________________________________
953 void AliAnalysisTaskEMCALPi0PbPb::CalcPrimTracks()
955 // Calculate track properties.
957 fSelPrimTracks->Clear();
959 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
960 TClonesArray *tracks = 0;
962 am->LoadBranch("Tracks");
963 TList *l = fEsdEv->GetList();
964 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
966 am->LoadBranch("tracks");
967 TList *l = fAodEv->GetList();
968 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
974 AliEMCALEMCGeometry *emc = fGeom->GetEMCGeometry();
975 Double_t phimin = emc->GetArm1PhiMin()*TMath::DegToRad()-fIsoDist*1.25;
976 Double_t phimax = emc->GetArm1PhiMax()*TMath::DegToRad()+fIsoDist*1.25;
979 fSelPrimTracks->SetOwner(kTRUE);
980 am->LoadBranch("PrimaryVertex.");
981 const AliESDVertex *vtx = fEsdEv->GetPrimaryVertexSPD();
982 am->LoadBranch("SPDVertex.");
983 const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
984 am->LoadBranch("Tracks");
985 const Int_t Ntracks = tracks->GetEntries();
986 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
987 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
989 AliWarning(Form("Could not receive track %d\n", iTracks));
992 if (fTrCuts && !fTrCuts->IsSelected(track))
994 Double_t eta = track->Eta();
997 if (track->Phi()<phimin||track->Phi()>phimax)
1000 AliESDtrack copyt(*track);
1002 copyt.GetBxByBz(bfield);
1003 AliExternalTrackParam tParam;
1004 Bool_t relate = copyt.RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&tParam);
1007 copyt.Set(tParam.GetX(),tParam.GetAlpha(),tParam.GetParameter(),tParam.GetCovariance());
1009 Double_t p[3] = { 0. };
1011 Double_t pos[3] = { 0. };
1013 Double_t covTr[21] = { 0. };
1014 copyt.GetCovarianceXYZPxPyPz(covTr);
1015 Double_t pid[10] = { 0. };
1016 copyt.GetESDpid(pid);
1017 AliAODTrack *aTrack = new AliAODTrack(copyt.GetID(),
1024 (Short_t)copyt.GetSign(),
1025 copyt.GetITSClusterMap(),
1027 0,/*fPrimaryVertex,*/
1028 kTRUE, // check if this is right
1029 vtx->UsesTrack(copyt.GetID()));
1030 aTrack->SetTPCClusterMap(copyt.GetTPCClusterMap());
1031 aTrack->SetTPCSharedMap (copyt.GetTPCSharedMap());
1032 Float_t ndf = copyt.GetTPCNcls() + 1 - 5 ;
1034 aTrack->SetChi2perNDF(copyt.GetTPCchi2()/ndf);
1036 aTrack->SetChi2perNDF(-1);
1037 aTrack->SetFlags(copyt.GetStatus());
1038 aTrack->SetTPCPointsF(copyt.GetTPCNclsF());
1039 fSelPrimTracks->Add(aTrack);
1042 Int_t ntracks = tracks->GetEntries();
1043 for (Int_t i=0; i<ntracks; ++i) {
1044 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1047 Double_t eta = track->Eta();
1050 if (track->Phi()<phimin||track->Phi()>phimax)
1052 if(track->GetTPCNcls()<fMinNClusPerTr)
1054 //todo: Learn how to set/filter AODs for prim/sec tracks
1055 fSelPrimTracks->Add(track);
1060 //________________________________________________________________________
1061 void AliAnalysisTaskEMCALPi0PbPb::CalcTracks()
1063 // Calculate track properties (including secondaries).
1065 fSelTracks->Clear();
1067 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1068 TClonesArray *tracks = 0;
1070 am->LoadBranch("Tracks");
1071 TList *l = fEsdEv->GetList();
1072 tracks = dynamic_cast<TClonesArray*>(l->FindObject("Tracks"));
1074 am->LoadBranch("tracks");
1075 TList *l = fAodEv->GetList();
1076 tracks = dynamic_cast<TClonesArray*>(l->FindObject("tracks"));
1083 const Int_t Ntracks = tracks->GetEntries();
1084 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1085 AliESDtrack *track = static_cast<AliESDtrack*>(tracks->At(iTracks));
1087 AliWarning(Form("Could not receive track %d\n", iTracks));
1090 if (fTrCuts && !fTrCuts->IsSelected(track))
1092 Double_t eta = track->Eta();
1095 fSelTracks->Add(track);
1098 Int_t ntracks = tracks->GetEntries();
1099 for (Int_t i=0; i<ntracks; ++i) {
1100 AliAODTrack *track = static_cast<AliAODTrack*>(tracks->At(i));
1103 Double_t eta = track->Eta();
1106 if(track->GetTPCNcls()<fMinNClusPerTr)
1109 if (0 && (track->Pt()>=0.6) && (track->PxAtDCA()==-999)) { // compute position on EMCAL
1110 AliExternalTrackParam tParam(track);
1111 if (AliTrackerBase::PropagateTrackToBxByBz(&tParam, 438, 0.139, 1, kTRUE)) {
1113 tParam.GetXYZ(trkPos);
1114 track->SetPxPyPzAtDCA(trkPos[0],trkPos[1],trkPos[2]);
1117 fSelTracks->Add(track);
1122 //________________________________________________________________________
1123 void AliAnalysisTaskEMCALPi0PbPb::ClusterAfterburner()
1125 // Run custer reconstruction afterburner.
1127 AliVCaloCells *cells = fEsdCells;
1134 Int_t ncells = cells->GetNumberOfCells();
1138 Double_t cellMeanE = 0, cellSigE = 0;
1139 for (Int_t i = 0; i<ncells; ++i) {
1140 Double_t cellE = cells->GetAmplitude(i);
1142 cellSigE += cellE*cellE;
1144 cellMeanE /= ncells;
1146 cellSigE -= cellMeanE*cellMeanE;
1149 cellSigE = TMath::Sqrt(cellSigE / ncells);
1151 Double_t subE = cellMeanE - 7*cellSigE;
1155 for (Int_t i = 0; i<ncells; ++i) {
1157 Double_t amp=0,time=0;
1158 if (!cells->GetCell(i, id, amp, time))
1163 cells->SetCell(i, id, amp, time);
1166 TObjArray *clusters = fEsdClusters;
1168 clusters = fAodClusters;
1172 Int_t nclus = clusters->GetEntries();
1173 for (Int_t i = 0; i<nclus; ++i) {
1174 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
1175 if (!clus->IsEMCAL())
1177 Int_t nc = clus->GetNCells();
1179 UShort_t ids[100] = {0};
1180 Double_t fra[100] = {0};
1181 for (Int_t j = 0; j<nc; ++j) {
1182 Short_t id = TMath::Abs(clus->GetCellAbsId(j));
1183 Double_t cen = cells->GetCellAmplitude(id);
1191 clusters->RemoveAt(i);
1195 for (Int_t j = 0; j<nc; ++j) {
1196 Short_t id = ids[j];
1197 Double_t cen = cells->GetCellAmplitude(id);
1201 AliAODCaloCluster *aodclus = dynamic_cast<AliAODCaloCluster*>(clus);
1204 aodclus->SetNCells(nc);
1205 aodclus->SetCellsAmplitudeFraction(fra);
1206 aodclus->SetCellsAbsId(ids);
1209 clusters->Compress();
1212 //________________________________________________________________________
1213 void AliAnalysisTaskEMCALPi0PbPb::FillCellHists()
1215 // Fill histograms related to cell properties.
1217 AliVCaloCells *cells = fEsdCells;
1224 Int_t cellModCount[12] = {0};
1225 Double_t cellMaxE = 0;
1226 Double_t cellMeanE = 0;
1227 Int_t ncells = cells->GetNumberOfCells();
1231 Int_t nsm = fGeom->GetEMCGeometry()->GetNumberOfSuperModules();
1233 for (Int_t i = 0; i<ncells; ++i) {
1234 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1235 Double_t cellE = cells->GetAmplitude(i);
1236 fHCellE->Fill(cellE);
1241 Int_t iSM=-1, iTower=-1, nIphi=-1, nIeta=-1;
1242 Bool_t ret = fGeom->GetCellIndex(absID, iSM, iTower, nIphi, nIeta);
1244 AliError(Form("Could not get cell index for %d", absID));
1247 ++cellModCount[iSM];
1248 Int_t iPhi=-1, iEta=-1;
1249 fGeom->GetCellPhiEtaIndexInSModule(iSM, iTower, nIphi, nIeta, iPhi, iEta);
1250 fHColuRow[iSM]->Fill(iEta,iPhi,1);
1251 fHColuRowE[iSM]->Fill(iEta,iPhi,cellE);
1252 fHCellFreqNoCut[iSM]->Fill(absID);
1253 if (cellE > 0.1) fHCellFreqCut100M[iSM]->Fill(absID);
1254 if (cellE > 0.3) fHCellFreqCut300M[iSM]->Fill(absID);
1255 if (fHCellCheckE && fHCellCheckE[absID])
1256 fHCellCheckE[absID]->Fill(cellE);
1257 fHCellFreqE[iSM]->Fill(absID, cellE);
1259 fHCellH->Fill(cellMaxE);
1260 cellMeanE /= ncells;
1261 fHCellM->Fill(cellMeanE);
1262 fHCellM2->Fill(cellMeanE*ncells/24/48/nsm);
1263 for (Int_t i=0; i<nsm; ++i)
1264 fHCellMult[i]->Fill(cellModCount[i]);
1267 //________________________________________________________________________
1268 void AliAnalysisTaskEMCALPi0PbPb::FillClusHists()
1270 // Fill histograms related to cluster properties.
1272 TObjArray *clusters = fEsdClusters;
1274 clusters = fAodClusters;
1278 Double_t vertex[3] = {0};
1279 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1281 Int_t nclus = clusters->GetEntries();
1282 for(Int_t i = 0; i<nclus; ++i) {
1283 AliVCluster *clus = static_cast<AliVCluster*>(clusters->At(i));
1286 if (!clus->IsEMCAL())
1288 TLorentzVector clusterVec;
1289 clus->GetMomentum(clusterVec,vertex);
1290 Double_t maxAxis = clus->GetTOF(); //sigma
1291 Double_t clusterEcc = clus->Chi2(); //eccentricity
1292 fHClustEccentricity->Fill(clusterEcc);
1293 fHClustEtaPhi->Fill(clusterVec.Eta(),clusterVec.Phi());
1294 fHClustEnergyPt->Fill(clusterVec.E(),clusterVec.Pt());
1295 fHClustEnergySigma->Fill(clus->E()*maxAxis,clus->E());
1296 fHClustSigmaSigma->Fill(max(clus->GetM02(),clus->GetM20()),clus->E()*maxAxis);
1297 fHClustNCellEnergyRatio->Fill(clus->GetNCells(),GetMaxCellEnergy(clus)/clus->E());
1301 //________________________________________________________________________
1302 void AliAnalysisTaskEMCALPi0PbPb::FillNtuple()
1309 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
1311 fHeader->fRun = fAodEv->GetRunNumber();
1312 fHeader->fOrbit = fAodEv->GetHeader()->GetOrbitNumber();
1313 fHeader->fPeriod = fAodEv->GetHeader()->GetPeriodNumber();
1314 fHeader->fBx = fAodEv->GetHeader()->GetBunchCrossNumber();
1315 fHeader->fL0 = fAodEv->GetHeader()->GetL0TriggerInputs();
1316 fHeader->fL1 = fAodEv->GetHeader()->GetL1TriggerInputs();
1317 fHeader->fL2 = fAodEv->GetHeader()->GetL2TriggerInputs();
1318 fHeader->fTrClassMask = fAodEv->GetHeader()->GetTriggerMask();
1319 fHeader->fTrCluster = fAodEv->GetHeader()->GetTriggerCluster();
1320 fHeader->fOffTriggers = fAodEv->GetHeader()->GetOfflineTrigger();
1321 fHeader->fFiredTriggers = fAodEv->GetHeader()->GetFiredTriggerClasses();
1323 fHeader->fRun = fEsdEv->GetRunNumber();
1324 fHeader->fOrbit = fEsdEv->GetHeader()->GetOrbitNumber();
1325 fHeader->fPeriod = fEsdEv->GetESDRun()->GetPeriodNumber();
1326 fHeader->fBx = fEsdEv->GetHeader()->GetBunchCrossNumber();
1327 fHeader->fL0 = fEsdEv->GetHeader()->GetL0TriggerInputs();
1328 fHeader->fL1 = fEsdEv->GetHeader()->GetL1TriggerInputs();
1329 fHeader->fL2 = fEsdEv->GetHeader()->GetL2TriggerInputs();
1330 fHeader->fTrClassMask = fEsdEv->GetHeader()->GetTriggerMask();
1331 fHeader->fTrCluster = fEsdEv->GetHeader()->GetTriggerCluster();
1332 fHeader->fOffTriggers = ((AliInputEventHandler*)(am->GetInputEventHandler()))->IsEventSelected();
1333 fHeader->fFiredTriggers = fEsdEv->GetFiredTriggerClasses();
1335 AliCentrality *cent = InputEvent()->GetCentrality();
1336 fHeader->fV0Cent = cent->GetCentralityPercentileUnchecked("V0M");
1337 fHeader->fCl1Cent = cent->GetCentralityPercentileUnchecked("CL1");
1338 fHeader->fTrCent = cent->GetCentralityPercentileUnchecked("TRK");
1339 fHeader->fCqual = cent->GetQuality();
1341 AliEventplane *ep = InputEvent()->GetEventplane();
1343 if (ep->GetQVector())
1344 fHeader->fPsi = ep->GetQVector()->Phi()/2. ;
1346 if (ep->GetQsub1()&&ep->GetQsub2())
1347 fHeader->fPsiRes = ep->GetQsub1()->Phi()/2.-ep->GetQsub2()->Phi()/2.;
1349 fHeader->fPsiRes = 0;
1353 TString trgclasses(fHeader->fFiredTriggers);
1354 for (Int_t j = 0; j<fTrClassNamesArr->GetEntries(); ++j) {
1355 const char *name = fTrClassNamesArr->At(j)->GetName();
1356 if (trgclasses.Contains(name))
1357 val += TMath::Power(2,j);
1359 fHeader->fTcls = (UInt_t)val;
1362 am->LoadBranch("vertices");
1363 AliAODVertex *pv = fAodEv->GetPrimaryVertex();
1364 FillVertex(fPrimVert, pv);
1365 AliAODVertex *sv = fAodEv->GetPrimaryVertexSPD();
1366 FillVertex(fSpdVert, sv);
1368 am->LoadBranch("PrimaryVertex.");
1369 const AliESDVertex *pv = fEsdEv->GetPrimaryVertexTracks();
1370 FillVertex(fPrimVert, pv);
1371 am->LoadBranch("SPDVertex.");
1372 const AliESDVertex *sv = fEsdEv->GetPrimaryVertexSPD();
1373 FillVertex(fSpdVert, sv);
1374 am->LoadBranch("TPCVertex.");
1375 const AliESDVertex *tv = fEsdEv->GetPrimaryVertexTPC();
1376 FillVertex(fTpcVert, tv);
1382 //________________________________________________________________________
1383 void AliAnalysisTaskEMCALPi0PbPb::FillPionHists()
1385 // Fill histograms related to pions.
1387 Double_t vertex[3] = {0};
1388 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
1390 TObjArray *clusters = fEsdClusters;
1392 clusters = fAodClusters;
1395 TLorentzVector clusterVec1;
1396 TLorentzVector clusterVec2;
1397 TLorentzVector pionVec;
1399 Int_t nclus = clusters->GetEntries();
1400 for (Int_t i = 0; i<nclus; ++i) {
1401 AliVCluster *clus1 = static_cast<AliVCluster*>(clusters->At(i));
1404 if (!clus1->IsEMCAL())
1406 if (clus1->E()<fMinE)
1408 if (clus1->GetNCells()<fNminCells)
1410 if (GetMaxCellEnergy(clus1)/clus1->E()<fMinErat)
1412 if (clus1->Chi2()<fMinEcc) // eccentricity cut
1414 clus1->GetMomentum(clusterVec1,vertex);
1415 for (Int_t j = i+1; j<nclus; ++j) {
1416 AliVCluster *clus2 = static_cast<AliVCluster*>(clusters->At(j));
1419 if (!clus2->IsEMCAL())
1421 if (clus2->E()<fMinE)
1423 if (clus2->GetNCells()<fNminCells)
1425 if (GetMaxCellEnergy(clus2)/clus2->E()<fMinErat)
1427 if (clus2->Chi2()<fMinEcc) // eccentricity cut
1429 clus2->GetMomentum(clusterVec2,vertex);
1430 pionVec = clusterVec1 + clusterVec2;
1431 Double_t pionZgg = TMath::Abs(clusterVec1.E()-clusterVec2.E())/pionVec.E();
1432 Double_t pionOpeningAngle = clusterVec1.Angle(clusterVec2.Vect());
1433 if (pionZgg < fAsymMax) {
1434 fHPionEtaPhi->Fill(pionVec.Eta(),pionVec.Phi());
1435 fHPionMggPt->Fill(pionVec.M(),pionVec.Pt());
1436 fHPionMggAsym->Fill(pionVec.M(),pionZgg);
1437 fHPionMggDgg->Fill(pionVec.M(),pionOpeningAngle);
1438 Int_t bin = fPtRanges->FindBin(pionVec.Pt());
1439 fHPionInvMasses[bin]->Fill(pionVec.M());
1446 //________________________________________________________________________
1447 void AliAnalysisTaskEMCALPi0PbPb::FillOtherHists()
1449 // Fill other histograms.
1452 //__________________________________________________________________________________________________
1453 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliESDVertex *esdv)
1455 // Fill vertex from ESD vertex info.
1457 v->fVx = esdv->GetX();
1458 v->fVy = esdv->GetY();
1459 v->fVz = esdv->GetZ();
1460 v->fVc = esdv->GetNContributors();
1461 v->fDisp = esdv->GetDispersion();
1462 v->fZres = esdv->GetZRes();
1463 v->fChi2 = esdv->GetChi2();
1464 v->fSt = esdv->GetStatus();
1465 v->fIs3D = esdv->IsFromVertexer3D();
1466 v->fIsZ = esdv->IsFromVertexerZ();
1469 //__________________________________________________________________________________________________
1470 void AliAnalysisTaskEMCALPi0PbPb::FillVertex(AliStaVertex *v, const AliAODVertex *aodv)
1472 // Fill vertex from AOD vertex info.
1474 v->fVx = aodv->GetX();
1475 v->fVy = aodv->GetY();
1476 v->fVz = aodv->GetZ();
1477 v->fVc = aodv->GetNContributors();
1478 v->fChi2 = aodv->GetChi2();
1481 //________________________________________________________________________
1482 Double_t AliAnalysisTaskEMCALPi0PbPb::GetCellIsolation(Double_t cEta, Double_t cPhi, Double_t radius) const
1484 // Compute isolation based on cell content.
1486 AliVCaloCells *cells = fEsdCells;
1492 Double_t cellIsolation = 0;
1493 Double_t rad2 = radius*radius;
1494 Int_t ncells = cells->GetNumberOfCells();
1495 for (Int_t i = 0; i<ncells; ++i) {
1496 Int_t absID = TMath::Abs(cells->GetCellNumber(i));
1497 Double_t cellE = cells->GetAmplitude(i);
1499 fGeom->EtaPhiFromIndex(absID,eta,phi);
1500 Double_t phidiff = TVector2::Phi_0_2pi(phi-cPhi);
1501 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1504 cellIsolation += cellE;
1506 return cellIsolation;
1509 //________________________________________________________________________
1510 Double_t AliAnalysisTaskEMCALPi0PbPb::GetMaxCellEnergy(AliVCluster *cluster, Short_t &id) const
1512 // Get maximum energy of attached cell.
1516 Int_t ncells = cluster->GetNCells();
1518 for (Int_t i=0; i<ncells; i++) {
1519 Double_t e = fEsdCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
1522 id = cluster->GetCellAbsId(i);
1526 for (Int_t i=0; i<ncells; i++) {
1527 Double_t e = fAodCells->GetCellAmplitude(TMath::Abs(cluster->GetCellAbsId(i)));
1530 id = cluster->GetCellAbsId(i);
1536 //________________________________________________________________________
1537 void AliAnalysisTaskEMCALPi0PbPb::GetSigma(AliVCluster *c, Double_t& sigmaMax, Double_t &sigmaMin) const
1539 // Calculate the (E) weighted variance along the longer (eigen) axis.
1541 sigmaMax = 0; // cluster variance along its longer axis
1542 sigmaMin = 0; // cluster variance along its shorter axis
1543 Double_t Ec = c->E(); // cluster energy
1546 Double_t Xc = 0 ; // cluster first moment along X
1547 Double_t Yc = 0 ; // cluster first moment along Y
1548 Double_t Sxx = 0 ; // cluster second central moment along X (variance_X^2)
1549 Double_t Sxy = 0 ; // cluster second central moment along Y (variance_Y^2)
1550 Double_t Syy = 0 ; // cluster covariance^2
1552 AliVCaloCells *cells = fEsdCells;
1559 Int_t ncells = c->GetNCells();
1563 for(Int_t j=0; j<ncells; ++j) {
1564 Int_t id = TMath::Abs(c->GetCellAbsId(j));
1565 Double_t cellen = cells->GetCellAmplitude(id);
1567 fGeom->GetGlobal(id,pos);
1568 Xc += cellen*pos.X();
1569 Yc += cellen*pos.Y();
1570 Sxx += cellen*pos.X()*pos.X();
1571 Syy += cellen*pos.Y()*pos.Y();
1572 Sxy += cellen*pos.X()*pos.Y();
1582 Sxx = TMath::Abs(Sxx);
1583 Syy = TMath::Abs(Syy);
1584 sigmaMax = (Sxx + Syy + TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
1585 sigmaMax = TMath::Sqrt(TMath::Abs(sigmaMax));
1586 sigmaMin = TMath::Abs(Sxx + Syy - TMath::Sqrt(TMath::Abs((Sxx-Syy)*(Sxx-Syy)+4.0*Sxy*Sxy)))/2.0;
1587 sigmaMin = TMath::Sqrt(TMath::Abs(sigmaMin));
1590 //________________________________________________________________________
1591 Int_t AliAnalysisTaskEMCALPi0PbPb::GetNCells(AliVCluster *c, Double_t emin) const
1593 // Calculate number of attached cells above emin.
1595 AliVCaloCells *cells = fEsdCells;
1602 Int_t ncells = c->GetNCells();
1603 for(Int_t j=0; j<ncells; ++j) {
1604 Int_t id = TMath::Abs(c->GetCellAbsId(j));
1605 Double_t cellen = cells->GetCellAmplitude(id);
1612 //________________________________________________________________________
1613 Double_t AliAnalysisTaskEMCALPi0PbPb::GetTrackIsolation(Double_t cEta, Double_t cPhi, Double_t radius, Double_t pt) const
1615 // Compute isolation based on tracks.
1617 Double_t trkIsolation = 0;
1618 Double_t rad2 = radius*radius;
1619 Int_t ntrks = fSelPrimTracks->GetEntries();
1620 for(Int_t j = 0; j<ntrks; ++j) {
1621 AliVTrack *track = static_cast<AliVTrack*>(fSelTracks->At(j));
1626 Float_t eta = track->Eta();
1627 Float_t phi = track->Phi();
1628 Double_t phidiff = TVector2::Phi_0_2pi(phi-cPhi);
1629 Double_t dist = (eta-cEta)*(eta-cEta)+phidiff*phidiff;
1632 trkIsolation += track->Pt();
1634 return trkIsolation;