]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/EMCAL/AliAnalysisTaskEmcal.cxx
Asymmetric nSigma cuts for TOF
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliAnalysisTaskEmcal.cxx
CommitLineData
cdd4e0e2 1// $Id$
2da09763 2//
3// Emcal base analysis task.
4//
9239b066 5// Author: S.Aiola, M. Verweij
2da09763 6
7#include "AliAnalysisTaskEmcal.h"
8
2da09763 9#include <TClonesArray.h>
10#include <TList.h>
09ca054b 11#include <TObject.h>
159802e2 12#include <TH1F.h>
ed0243d8 13#include <TProfile.h>
14#include <TSystem.h>
15#include <TFile.h>
16#include <TChain.h>
17#include <TKey.h>
2da09763 18
d29ed625 19#include "AliAODEvent.h"
2da09763 20#include "AliAnalysisManager.h"
21#include "AliCentrality.h"
09ca054b 22#include "AliEMCALGeometry.h"
23#include "AliESDEvent.h"
09ca054b 24#include "AliEmcalParticle.h"
d29ed625 25#include "AliEventplane.h"
26#include "AliInputEventHandler.h"
2da09763 27#include "AliLog.h"
09ca054b 28#include "AliMCParticle.h"
29#include "AliVCluster.h"
30#include "AliVEventHandler.h"
31#include "AliVParticle.h"
00c77045 32#include "AliVCaloTrigger.h"
ed0243d8 33#include "AliGenPythiaEventHeader.h"
34#include "AliAODMCHeader.h"
35#include "AliMCEvent.h"
9239b066 36#include "AliAnalysisUtils.h"
37a63fdf 37#include "AliEmcalTriggerPatchInfo.h"
9239b066 38
39#include "AliParticleContainer.h"
40#include "AliClusterContainer.h"
2da09763 41
42ClassImp(AliAnalysisTaskEmcal)
43
44//________________________________________________________________________
45AliAnalysisTaskEmcal::AliAnalysisTaskEmcal() :
46 AliAnalysisTaskSE("AliAnalysisTaskEmcal"),
159802e2 47 fForceBeamType(kNA),
48 fGeneralHistograms(kFALSE),
2da09763 49 fInitialized(kFALSE),
50 fCreateHisto(kTRUE),
f660c2d6 51 fCaloCellsName(),
00c77045 52 fCaloTriggersName(),
37a63fdf 53 fCaloTriggerPatchInfoName(),
2ac8ca4f 54 fMinCent(-999),
55 fMaxCent(-999),
56 fMinVz(-999),
57 fMaxVz(-999),
9239b066 58 fTrackPtCut(0),
59 fMinNTrack(0),
60 fUseAliAnaUtils(kFALSE),
61 fAliAnalysisUtils(0x0),
2ac8ca4f 62 fOffTrigger(AliVEvent::kAny),
b4339010 63 fTrigClass(),
8e49a788 64 fTriggerTypeSel(kND),
2da09763 65 fNbins(500),
66 fMinBinPt(0),
67 fMaxBinPt(250),
6c41fc8c 68 fMinPtTrackInEmcal(0),
6f6dc2ba 69 fEventPlaneVsEmcal(-1),
254370e1 70 fMinEventPlane(-1e6),
71 fMaxEventPlane(1e6),
a52de945 72 fCentEst("V0M"),
8c0d179d 73 fIsEmbedded(kFALSE),
ed0243d8 74 fIsPythia(kFALSE),
75 fSelectPtHardBin(-999),
76 fMinMCLabel(0),
77 fMCLabelShift(0),
2130abba 78 fNcentBins(4),
159802e2 79 fGeom(0),
2da09763 80 fTracks(0),
81 fCaloClusters(0),
f660c2d6 82 fCaloCells(0),
00c77045 83 fCaloTriggers(0),
37a63fdf 84 fTriggerPatchInfo(0),
2da09763 85 fCent(0),
86 fCentBin(-1),
3c124212 87 fEPV0(-1.0),
88 fEPV0A(-1.0),
89 fEPV0C(-1.0),
b4339010 90 fNVertCont(0),
1f6fff78 91 fBeamType(kNA),
ed0243d8 92 fPythiaHeader(0),
93 fPtHard(0),
94 fPtHardBin(0),
95 fNTrials(0),
9239b066 96 fParticleCollArray(),
97 fClusterCollArray(),
37a63fdf 98 fMainTriggerPatch(0x0),
8e49a788 99 fTriggerType(kND),
a4e91fed 100 fOutput(0),
ed0243d8 101 fHistTrialsAfterSel(0),
102 fHistEventsAfterSel(0),
103 fHistTrials(0),
104 fHistXsection(0),
105 fHistEvents(0),
106 fHistPtHard(0),
a4e91fed 107 fHistCentrality(0),
6f6dc2ba 108 fHistZVertex(0),
8e49a788 109 fHistEventPlane(0),
110 fHistEventRejection(0)
2da09763 111{
112 // Default constructor.
113
114 fVertex[0] = 0;
115 fVertex[1] = 0;
116 fVertex[2] = 0;
9239b066 117
118 fParticleCollArray.SetOwner(kTRUE);
119 fClusterCollArray.SetOwner(kTRUE);
2da09763 120}
121
122//________________________________________________________________________
123AliAnalysisTaskEmcal::AliAnalysisTaskEmcal(const char *name, Bool_t histo) :
124 AliAnalysisTaskSE(name),
159802e2 125 fForceBeamType(kNA),
126 fGeneralHistograms(kFALSE),
2da09763 127 fInitialized(kFALSE),
128 fCreateHisto(histo),
f660c2d6 129 fCaloCellsName(),
00c77045 130 fCaloTriggersName(),
37a63fdf 131 fCaloTriggerPatchInfoName(),
2ac8ca4f 132 fMinCent(-999),
133 fMaxCent(-999),
134 fMinVz(-999),
135 fMaxVz(-999),
9239b066 136 fTrackPtCut(0),
137 fMinNTrack(0),
138 fUseAliAnaUtils(kFALSE),
139 fAliAnalysisUtils(0x0),
2ac8ca4f 140 fOffTrigger(AliVEvent::kAny),
b4339010 141 fTrigClass(),
8e49a788 142 fTriggerTypeSel(kND),
2da09763 143 fNbins(500),
144 fMinBinPt(0),
145 fMaxBinPt(250),
6c41fc8c 146 fMinPtTrackInEmcal(0),
6f6dc2ba 147 fEventPlaneVsEmcal(-1),
254370e1 148 fMinEventPlane(-1e6),
149 fMaxEventPlane(1e6),
a52de945 150 fCentEst("V0M"),
8c0d179d 151 fIsEmbedded(kFALSE),
ed0243d8 152 fIsPythia(kFALSE),
153 fSelectPtHardBin(-999),
154 fMinMCLabel(0),
155 fMCLabelShift(0),
2130abba 156 fNcentBins(4),
159802e2 157 fGeom(0),
2da09763 158 fTracks(0),
159 fCaloClusters(0),
f660c2d6 160 fCaloCells(0),
00c77045 161 fCaloTriggers(0),
37a63fdf 162 fTriggerPatchInfo(0),
2da09763 163 fCent(0),
164 fCentBin(-1),
3c124212 165 fEPV0(-1.0),
166 fEPV0A(-1.0),
167 fEPV0C(-1.0),
b4339010 168 fNVertCont(0),
1f6fff78 169 fBeamType(kNA),
ed0243d8 170 fPythiaHeader(0),
171 fPtHard(0),
172 fPtHardBin(0),
173 fNTrials(0),
9239b066 174 fParticleCollArray(),
175 fClusterCollArray(),
37a63fdf 176 fMainTriggerPatch(0x0),
8e49a788 177 fTriggerType(kND),
a4e91fed 178 fOutput(0),
ed0243d8 179 fHistTrialsAfterSel(0),
180 fHistEventsAfterSel(0),
181 fHistTrials(0),
182 fHistXsection(0),
183 fHistEvents(0),
184 fHistPtHard(0),
a4e91fed 185 fHistCentrality(0),
6f6dc2ba 186 fHistZVertex(0),
8e49a788 187 fHistEventPlane(0),
188 fHistEventRejection(0)
2da09763 189{
190 // Standard constructor.
191
192 fVertex[0] = 0;
193 fVertex[1] = 0;
194 fVertex[2] = 0;
195
9239b066 196 fParticleCollArray.SetOwner(kTRUE);
197 fClusterCollArray.SetOwner(kTRUE);
198
2da09763 199 if (fCreateHisto) {
2da09763 200 DefineOutput(1, TList::Class());
201 }
202}
203
204//________________________________________________________________________
205AliAnalysisTaskEmcal::~AliAnalysisTaskEmcal()
206{
207 // Destructor
208}
209
9239b066 210//________________________________________________________________________
211void AliAnalysisTaskEmcal::SetClusPtCut(Double_t cut, Int_t c)
212{
213 AliClusterContainer *cont = GetClusterContainer(c);
214 if (cont) cont->SetClusPtCut(cut);
215 else AliError(Form("%s in SetClusPtCut(...): container %d not found",GetName(),c));
216}
217
218//________________________________________________________________________
219void AliAnalysisTaskEmcal::SetClusTimeCut(Double_t min, Double_t max, Int_t c)
220{
221 AliClusterContainer *cont = GetClusterContainer(c);
222 if (cont) cont->SetClusTimeCut(min,max);
223 else AliError(Form("%s in SetClusTimeCut(...): container %d not found",GetName(),c));
224}
225
226//________________________________________________________________________
227void AliAnalysisTaskEmcal::SetTrackPtCut(Double_t cut, Int_t c)
228{
229 AliParticleContainer *cont = GetParticleContainer(c);
230 if (cont) cont->SetParticlePtCut(cut);
231 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
232
233 fTrackPtCut = cut;
234}
235
236//________________________________________________________________________
237void AliAnalysisTaskEmcal::SetTrackEtaLimits(Double_t min, Double_t max, Int_t c)
238{
239 AliParticleContainer *cont = GetParticleContainer(c);
240 if (cont) cont->SetParticleEtaLimits(min,max);
241 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
242}
243
244//________________________________________________________________________
245void AliAnalysisTaskEmcal::SetTrackPhiLimits(Double_t min, Double_t max, Int_t c)
246{
247 AliParticleContainer *cont = GetParticleContainer(c);
248 if (cont) cont->SetParticlePhiLimits(min,max);
249 else AliError(Form("%s in SetTrackPhiLimits(...): container %d not found",GetName(),c));
250}
251
159802e2 252//________________________________________________________________________
253void AliAnalysisTaskEmcal::UserCreateOutputObjects()
254{
255 // Create user output.
256 if (!fCreateHisto)
257 return;
258
259 OpenFile(1);
260 fOutput = new TList();
261 fOutput->SetOwner();
262
2130abba 263 if (fForceBeamType == kpp)
264 fNcentBins = 1;
265
159802e2 266 if (!fGeneralHistograms)
267 return;
268
ed0243d8 269 if (fIsPythia) {
270 fHistTrialsAfterSel = new TH1F("fHistTrialsAfterSel", "fHistTrialsAfterSel", 11, 0, 11);
271 fHistTrialsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
272 fHistTrialsAfterSel->GetYaxis()->SetTitle("trials");
273 fOutput->Add(fHistTrialsAfterSel);
274
275 fHistEventsAfterSel = new TH1F("fHistEventsAfterSel", "fHistEventsAfterSel", 11, 0, 11);
276 fHistEventsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
277 fHistEventsAfterSel->GetYaxis()->SetTitle("total events");
278 fOutput->Add(fHistEventsAfterSel);
279
280 fHistTrials = new TH1F("fHistTrials", "fHistTrials", 11, 0, 11);
281 fHistTrials->GetXaxis()->SetTitle("p_{T} hard bin");
282 fHistTrials->GetYaxis()->SetTitle("trials");
283 fOutput->Add(fHistTrials);
284
285 fHistXsection = new TProfile("fHistXsection", "fHistXsection", 11, 0, 11);
286 fHistXsection->GetXaxis()->SetTitle("p_{T} hard bin");
287 fHistXsection->GetYaxis()->SetTitle("xsection");
288 fOutput->Add(fHistXsection);
289
290 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
291 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
292 fHistEvents->GetYaxis()->SetTitle("total events");
293 fOutput->Add(fHistEvents);
294
295 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
296 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
297
298 for (Int_t i = 1; i < 12; i++) {
299 fHistTrialsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
300 fHistEventsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
301
302 fHistTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
303 fHistXsection->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
304 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
305 }
306
307 fHistPtHard = new TH1F("fHistPtHard", "fHistPtHard", fNbins*2, fMinBinPt, fMaxBinPt*4);
308 fHistPtHard->GetXaxis()->SetTitle("p_{T,hard} (GeV/c)");
309 fHistPtHard->GetYaxis()->SetTitle("counts");
310 fOutput->Add(fHistPtHard);
311 }
312
159802e2 313 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", 200, 0, 100);
314 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
315 fHistCentrality->GetYaxis()->SetTitle("counts");
316 fOutput->Add(fHistCentrality);
317
318 fHistZVertex = new TH1F("fHistZVertex","Z vertex position", 60, -30, 30);
319 fHistZVertex->GetXaxis()->SetTitle("z");
320 fHistZVertex->GetYaxis()->SetTitle("counts");
321 fOutput->Add(fHistZVertex);
322
6f6dc2ba 323 fHistEventPlane = new TH1F("fHistEventPlane","Event plane", 120, -TMath::Pi(), TMath::Pi());
324 fHistEventPlane->GetXaxis()->SetTitle("event plane");
325 fHistEventPlane->GetYaxis()->SetTitle("counts");
326 fOutput->Add(fHistEventPlane);
327
8e49a788 328 fHistEventRejection = new TH1I("fHistEventRejection","Reasons to reject event",20,0,20);
329 fHistEventRejection->Fill("PhysSel",0);
330 fHistEventRejection->Fill("trigger",0);
331 fHistEventRejection->Fill("trigTypeSel",0);
332 fHistEventRejection->Fill("Cent",0);
333 fHistEventRejection->Fill("vertex contr.",0);
334 fHistEventRejection->Fill("Vz",0);
335 fHistEventRejection->Fill("trackInEmcal",0);
336 fHistEventRejection->Fill("minNTrack",0);
337 fHistEventRejection->Fill("VtxSel2013pA",0);
338 fHistEventRejection->Fill("PileUp",0);
339 fHistEventRejection->Fill("EvtPlane",0);
340 fHistEventRejection->Fill("SelPtHardBin",0);
341 fHistEventRejection->GetYaxis()->SetTitle("counts");
342 fOutput->Add(fHistEventRejection);
343
159802e2 344 PostData(1, fOutput);
345}
346
347//________________________________________________________________________
348Bool_t AliAnalysisTaskEmcal::FillGeneralHistograms()
349{
ed0243d8 350 if (fIsPythia) {
351 fHistEventsAfterSel->SetBinContent(fPtHardBin + 1, fHistEventsAfterSel->GetBinContent(fPtHardBin + 1) + 1);
352 fHistTrialsAfterSel->SetBinContent(fPtHardBin + 1, fHistTrialsAfterSel->GetBinContent(fPtHardBin + 1) + fNTrials);
353 fHistPtHard->Fill(fPtHard);
354 }
355
159802e2 356 fHistCentrality->Fill(fCent);
357 fHistZVertex->Fill(fVertex[2]);
6f6dc2ba 358 fHistEventPlane->Fill(fEPV0);
159802e2 359
360 return kTRUE;
361}
362
2da09763 363//________________________________________________________________________
629c7ac0 364void AliAnalysisTaskEmcal::UserExec(Option_t *)
365{
366 // Main loop, called for each event.
367
6c3aa659 368 fMainTriggerPatch = NULL;
369
e44e8726 370 if (!fInitialized)
b3376347 371 ExecOnce();
629c7ac0 372
e44e8726 373 if (!fInitialized)
374 return;
375
629c7ac0 376 if (!RetrieveEventObjects())
377 return;
378
2ac8ca4f 379 if (!IsEventSelected())
380 return;
381
159802e2 382 if (fGeneralHistograms && fCreateHisto) {
383 if (!FillGeneralHistograms())
384 return;
385 }
386
629c7ac0 387 if (!Run())
388 return;
389
159802e2 390 if (fCreateHisto) {
391 if (!FillHistograms())
392 return;
393 }
629c7ac0 394
2ac8ca4f 395 if (fCreateHisto && fOutput) {
629c7ac0 396 // information for this iteration of the UserExec in the container
397 PostData(1, fOutput);
398 }
399}
400
401//________________________________________________________________________
a56383df 402Bool_t AliAnalysisTaskEmcal::AcceptCluster(AliVCluster *clus, Int_t c) const
2da09763 403{
629c7ac0 404 // Return true if cluster is accepted.
405
406 if (!clus)
407 return kFALSE;
408
9239b066 409 AliClusterContainer *cont = GetClusterContainer(c);
157b926a 410 if (!cont) {
9239b066 411 AliError(Form("%s:Container %d not found",GetName(),c));
412 return 0;
507f74bc 413 }
629c7ac0 414
9239b066 415 return cont->AcceptCluster(clus);
629c7ac0 416}
417
418//________________________________________________________________________
9239b066 419Bool_t AliAnalysisTaskEmcal::AcceptTrack(AliVParticle *track, Int_t c) const
629c7ac0 420{
159802e2 421 // Return true if track is accepted.
629c7ac0 422
159802e2 423 if (!track)
629c7ac0 424 return kFALSE;
425
9239b066 426 AliParticleContainer *cont = GetParticleContainer(c);
157b926a 427 if (!cont) {
9239b066 428 AliError(Form("%s:Container %d not found",GetName(),c));
429 return 0;
159802e2 430 }
431
9239b066 432 return cont->AcceptParticle(track);
2da09763 433}
434
ed0243d8 435//________________________________________________________________________
436Bool_t AliAnalysisTaskEmcal::PythiaInfoFromFile(const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard)
437{
438 //
439 // Get the cross section and the trails either from pyxsec.root or from pysec_hists.root
440 // Get the pt hard bin from the file path
441 // This is to called in Notify and should provide the path to the AOD/ESD file
442 // (Partially copied from AliAnalysisHelperJetTasks)
443
444 TString file(currFile);
445 fXsec = 0;
446 fTrials = 1;
447
157b926a 448 if (file.Contains(".zip#")) {
ed0243d8 449 Ssiz_t pos1 = file.Index("root_archive",12,0,TString::kExact);
450 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
451 Ssiz_t pos2 = file.Index(".root",5,TString::kExact);
452 file.Replace(pos+1,pos2-pos1,"");
dbd1583b 453 } else {
ed0243d8 454 // not an archive take the basename....
455 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
456 }
9239b066 457 AliDebug(1,Form("File name: %s",file.Data()));
ed0243d8 458
459 // Get the pt hard bin
460 TString strPthard(file);
461
462 strPthard.Remove(strPthard.Last('/'));
463 strPthard.Remove(strPthard.Last('/'));
464 if (strPthard.Contains("AOD")) strPthard.Remove(strPthard.Last('/'));
465 strPthard.Remove(0,strPthard.Last('/')+1);
466 if (strPthard.IsDec())
467 pthard = strPthard.Atoi();
468 else
469 AliWarning(Form("Could not extract file number from path %s", strPthard.Data()));
470
9239b066 471 // problem that we cannot really test the existance of a file in a archive so we have to live with open error message from root
472 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root"));
473
157b926a 474 if (!fxsec) {
ed0243d8 475 // next trial fetch the histgram file
476 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
157b926a 477 if (!fxsec) {
ed0243d8 478 // not a severe condition but inciate that we have no information
479 return kFALSE;
dbd1583b 480 } else {
ed0243d8 481 // find the tlist we want to be independtent of the name so use the Tkey
482 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
157b926a 483 if (!key) {
ed0243d8 484 fxsec->Close();
485 return kFALSE;
486 }
487 TList *list = dynamic_cast<TList*>(key->ReadObj());
157b926a 488 if (!list) {
ed0243d8 489 fxsec->Close();
490 return kFALSE;
491 }
492 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
493 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
494 fxsec->Close();
495 }
dbd1583b 496 } else { // no tree pyxsec.root
ed0243d8 497 TTree *xtree = (TTree*)fxsec->Get("Xsection");
157b926a 498 if (!xtree) {
ed0243d8 499 fxsec->Close();
500 return kFALSE;
501 }
502 UInt_t ntrials = 0;
503 Double_t xsection = 0;
504 xtree->SetBranchAddress("xsection",&xsection);
505 xtree->SetBranchAddress("ntrials",&ntrials);
506 xtree->GetEntry(0);
507 fTrials = ntrials;
508 fXsec = xsection;
509 fxsec->Close();
510 }
511 return kTRUE;
512}
513
514//________________________________________________________________________
515Bool_t AliAnalysisTaskEmcal::UserNotify()
516{
b8aeed95 517 // Called when file changes.
518
ed0243d8 519 if (!fIsPythia || !fGeneralHistograms || !fCreateHisto)
520 return kTRUE;
521
522 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
523 if (!tree) {
524 AliError(Form("%s - UserNotify: No current tree!",GetName()));
525 return kFALSE;
526 }
527
528 Float_t xsection = 0;
529 Float_t trials = 0;
530 Int_t pthard = 0;
531
532 TFile *curfile = tree->GetCurrentFile();
533 if (!curfile) {
534 AliError(Form("%s - UserNotify: No current file!",GetName()));
535 return kFALSE;
536 }
537
538 TChain *chain = dynamic_cast<TChain*>(tree);
539 if (chain)
540 tree = chain->GetTree();
541
542 Int_t nevents = tree->GetEntriesFast();
543
544 PythiaInfoFromFile(curfile->GetName(), xsection, trials, pthard);
545
413c4f06 546 // TODO: Workaround
157b926a 547 if ((pthard < 0) || (pthard > 10))
413c4f06 548 pthard = 0;
ed0243d8 549 fHistTrials->Fill(pthard, trials);
550 fHistXsection->Fill(pthard, xsection);
551 fHistEvents->Fill(pthard, nevents);
552
553 return kTRUE;
554}
555
629c7ac0 556//________________________________________________________________________
b3376347 557void AliAnalysisTaskEmcal::ExecOnce()
8a28ded1 558{
559 // Init the analysis.
2ac8ca4f 560
b3376347 561 if (!InputEvent()) {
562 AliError(Form("%s: Could not retrieve event! Returning!", GetName()));
563 return;
564 }
565
159802e2 566 fGeom = AliEMCALGeometry::GetInstance();
bb98e333 567 if (!fGeom) {
568 AliError(Form("%s: Can not create geometry", GetName()));
569 return;
570 }
159802e2 571
6f6dc2ba 572 if (fEventPlaneVsEmcal >= 0) {
573 Double_t ep = (fGeom->GetArm1PhiMax() + fGeom->GetArm1PhiMin()) / 2 * TMath::DegToRad() + fEventPlaneVsEmcal - TMath::Pi();
574 fMinEventPlane = ep - TMath::Pi() / 4;
575 fMaxEventPlane = ep + TMath::Pi() / 4;
576 }
577
9239b066 578 //Load all requested track branches - each container knows name already
157b926a 579 for (Int_t i =0; i<fParticleCollArray.GetEntriesFast(); i++) {
9239b066 580 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
581 cont->SetArray(InputEvent());
582 }
583
584 if (fParticleCollArray.GetEntriesFast()>0) {
585 fTracks = GetParticleArray(0);
157b926a 586 if (!fTracks) {
9239b066 587 AliError(Form("%s: Could not retrieve first track branch!", GetName()));
b3376347 588 return;
b3376347 589 }
590 }
591
9239b066 592 //Load all requested cluster branches - each container knows name already
157b926a 593 for (Int_t i =0; i<fClusterCollArray.GetEntriesFast(); i++) {
9239b066 594 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
595 cont->SetArray(InputEvent());
596 }
597
157b926a 598 if (fClusterCollArray.GetEntriesFast()>0) {
9239b066 599 fCaloClusters = GetClusterArray(0);
157b926a 600 if (!fCaloClusters) {
9239b066 601 AliError(Form("%s: Could not retrieve first cluster branch!", GetName()));
b3376347 602 return;
b3376347 603 }
604 }
159802e2 605
f660c2d6 606 if (!fCaloCellsName.IsNull() && !fCaloCells) {
607 fCaloCells = dynamic_cast<AliVCaloCells*>(InputEvent()->FindListObject(fCaloCellsName));
608 if (!fCaloCells) {
507f74bc 609 AliError(Form("%s: Could not retrieve cells %s!", GetName(), fCaloCellsName.Data()));
f660c2d6 610 return;
611 }
612 }
613
00c77045 614 if (!fCaloTriggersName.IsNull() && !fCaloTriggers) {
615 fCaloTriggers = dynamic_cast<AliVCaloTrigger*>(InputEvent()->FindListObject(fCaloTriggersName));
616 if (!fCaloTriggers) {
617 AliError(Form("%s: Could not retrieve calo triggers %s!", GetName(), fCaloTriggersName.Data()));
618 return;
619 }
620 }
621
37a63fdf 622 if (!fCaloTriggerPatchInfoName.IsNull() && !fTriggerPatchInfo) {
37a63fdf 623 fTriggerPatchInfo = GetArrayFromEvent(fCaloTriggerPatchInfoName.Data(),"AliEmcalTriggerPatchInfo");
8e49a788 624 if (!fTriggerPatchInfo) {
625 AliError(Form("%s: Could not retrieve calo trigger patch info %s!", GetName(), fCaloTriggerPatchInfoName.Data()));
626 return;
627 }
37a63fdf 628
629 }
630
159802e2 631 fInitialized = kTRUE;
8a28ded1 632}
633
2ac8ca4f 634//_____________________________________________________
635AliAnalysisTaskEmcal::BeamType AliAnalysisTaskEmcal::GetBeamType()
636{
637 // Get beam type : pp-AA-pA
638 // ESDs have it directly, AODs get it from hardcoded run number ranges
639
159802e2 640 if (fForceBeamType != kNA)
641 return fForceBeamType;
642
2ac8ca4f 643 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(InputEvent());
644 if (esd) {
645 const AliESDRun *run = esd->GetESDRun();
646 TString beamType = run->GetBeamType();
647 if (beamType == "p-p")
648 return kpp;
649 else if (beamType == "A-A")
650 return kAA;
651 else if (beamType == "p-A")
652 return kpA;
653 else
654 return kNA;
655 } else {
656 Int_t runNumber = InputEvent()->GetRunNumber();
657 if ((runNumber >= 136851 && runNumber <= 139517) || // LHC10h
dbd1583b 658 (runNumber >= 166529 && runNumber <= 170593)) { // LHC11h
2ac8ca4f 659 return kAA;
dbd1583b 660 } else if ((runNumber>=188365 && runNumber <= 188366) || // LHC12g
661 (runNumber >= 195344 && runNumber <= 196608)) { // LHC13b-f
493d6e49 662 return kpA;
2ac8ca4f 663 } else {
664 return kpp;
665 }
666 }
667}
668
8e49a788 669//_____________________________________________________
670AliAnalysisTaskEmcal::TriggerType AliAnalysisTaskEmcal::GetTriggerType()
671{
672 // Get trigger type: kND, kJ1, kJ2
673
157b926a 674 if (!fTriggerPatchInfo)
8e49a788 675 return kND;
676
677 //number of patches in event
678 Int_t nPatch = fTriggerPatchInfo->GetEntries();
679
680 //loop over patches to define trigger type of event
681 Int_t nJ1 = 0;
682 Int_t nJ2 = 0;
683 AliEmcalTriggerPatchInfo *patch;
157b926a 684 for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
8e49a788 685 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
157b926a 686 if (patch->IsJetHigh()) nJ1++;
687 if (patch->IsJetLow()) nJ2++;
8e49a788 688 }
689
157b926a 690 if (nJ1>0)
8e49a788 691 return kJ1;
157b926a 692 else if (nJ2>0)
8e49a788 693 return kJ2;
694 else
695 return kND;
8e49a788 696}
697
2ac8ca4f 698//________________________________________________________________________
d29ed625 699Bool_t AliAnalysisTaskEmcal::IsEventSelected()
2ac8ca4f 700{
701 // Check if event is selected
702
703 if (fOffTrigger != AliVEvent::kAny) {
d29ed625 704 UInt_t res = 0;
705 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
706 if (eev) {
707 res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
708 } else {
709 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
710 if (aev) {
711 res = aev->GetHeader()->GetOfflineTrigger();
712 }
713 }
8e49a788 714 if ((res & fOffTrigger) == 0) {
254370e1 715 if (fGeneralHistograms)
716 fHistEventRejection->Fill("PhysSel",1);
b4339010 717 return kFALSE;
8e49a788 718 }
b4339010 719 }
720
721 if (!fTrigClass.IsNull()) {
722 TString fired;
723 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
724 if (eev) {
725 fired = eev->GetFiredTriggerClasses();
726 } else {
727 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
728 if (aev) {
729 fired = aev->GetFiredTriggerClasses();
730 }
731 }
8e49a788 732 if (!fired.Contains("-B-")) {
254370e1 733 if (fGeneralHistograms)
734 fHistEventRejection->Fill("trigger",1);
b4339010 735 return kFALSE;
8e49a788 736 }
b4339010 737 TObjArray *arr = fTrigClass.Tokenize("|");
8e49a788 738 if (!arr) {
254370e1 739 if (fGeneralHistograms)
740 fHistEventRejection->Fill("trigger",1);
b4339010 741 return kFALSE;
8e49a788 742 }
b4339010 743 Bool_t match = 0;
744 for (Int_t i=0;i<arr->GetEntriesFast();++i) {
745 TObject *obj = arr->At(i);
746 if (!obj)
747 continue;
748 if (fired.Contains(obj->GetName())) {
749 match = 1;
750 break;
751 }
752 }
753 delete arr;
8e49a788 754 if (!match) {
254370e1 755 if (fGeneralHistograms)
756 fHistEventRejection->Fill("trigger",1);
2ac8ca4f 757 return kFALSE;
8e49a788 758 }
2ac8ca4f 759 }
760
8e49a788 761 if (fTriggerTypeSel != kND) {
157b926a 762 if (fTriggerType != fTriggerTypeSel) {
254370e1 763 if (fGeneralHistograms)
764 fHistEventRejection->Fill("trigTypeSel",1);
2ac8ca4f 765 return kFALSE;
8e49a788 766 }
767 }
8e49a788 768
769 if ((fMinCent != -999) && (fMaxCent != -999)) {
770 if (fCent<fMinCent || fCent>fMaxCent) {
254370e1 771 if (fGeneralHistograms)
772 fHistEventRejection->Fill("Cent",1);
2ac8ca4f 773 return kFALSE;
8e49a788 774 }
2ac8ca4f 775 }
776
777 if ((fMinVz != -999) && (fMaxVz != -999)) {
8e49a788 778 if (fNVertCont == 0 ) {
254370e1 779 if (fGeneralHistograms)
780 fHistEventRejection->Fill("vertex contr.",1);
b4339010 781 return kFALSE;
8e49a788 782 }
2ac8ca4f 783 Double_t vz = fVertex[2];
8e49a788 784 if (vz<fMinVz || vz>fMaxVz) {
254370e1 785 if (fGeneralHistograms)
8e49a788 786 fHistEventRejection->Fill("Vz",1);
254370e1 787 return kFALSE;
788 }
2ac8ca4f 789 }
790
8e49a788 791 if (fMinPtTrackInEmcal > 0 && fGeom) {
6c41fc8c 792 Bool_t trackInEmcalOk = kFALSE;
9239b066 793 Int_t ntracks = GetNParticles(0);
6c41fc8c 794 for (Int_t i = 0; i < ntracks; i++) {
9239b066 795 AliVParticle *track = GetAcceptParticleFromArray(i,0);
157b926a 796 if (!track)
6c41fc8c 797 continue;
9239b066 798
799 Double_t phiMin = fGeom->GetArm1PhiMin() * TMath::DegToRad();
800 Double_t phiMax = fGeom->GetArm1PhiMax() * TMath::DegToRad();
801 Int_t runNumber = InputEvent()->GetRunNumber();
157b926a 802 if (runNumber>=177295 && runNumber<=197470) { //small SM masked in 2012 and 2013
9239b066 803 phiMin = 1.4;
804 phiMax = TMath::Pi();
805 }
806
807 if (track->Eta() < fGeom->GetArm1EtaMin() || track->Eta() > fGeom->GetArm1EtaMax() || track->Phi() < phiMin || track->Phi() > phiMax)
6c41fc8c 808 continue;
809 if (track->Pt() > fMinPtTrackInEmcal) {
810 trackInEmcalOk = kTRUE;
811 break;
812 }
813 }
8e49a788 814 if (!trackInEmcalOk) {
254370e1 815 if (fGeneralHistograms)
816 fHistEventRejection->Fill("trackInEmcal",1);
6c41fc8c 817 return kFALSE;
8e49a788 818 }
6c41fc8c 819 }
820
8e49a788 821 if (fMinNTrack > 0) {
9239b066 822 Int_t nTracksAcc = 0;
823 Int_t ntracks = GetNParticles(0);
824 for (Int_t i = 0; i < ntracks; i++) {
825 AliVParticle *track = GetAcceptParticleFromArray(i,0);
157b926a 826 if (!track)
9239b066 827 continue;
828 if (track->Pt() > fTrackPtCut) {
829 nTracksAcc++;
157b926a 830 if (nTracksAcc>=fMinNTrack)
9239b066 831 break;
832 }
833 }
8e49a788 834 if (nTracksAcc<fMinNTrack) {
254370e1 835 if (fGeneralHistograms)
836 fHistEventRejection->Fill("minNTrack",1);
9239b066 837 return kFALSE;
8e49a788 838 }
9239b066 839 }
840
157b926a 841 if (fUseAliAnaUtils) {
842 if (!fAliAnalysisUtils)
9239b066 843 fAliAnalysisUtils = new AliAnalysisUtils();
844 fAliAnalysisUtils->SetMinVtxContr(2);
845 fAliAnalysisUtils->SetMaxVtxZ(10.);
846
157b926a 847 if (!fAliAnalysisUtils->IsVertexSelected2013pA(InputEvent())) {
254370e1 848 if (fGeneralHistograms)
849 fHistEventRejection->Fill("VtxSel2013pA",1);
9239b066 850 return kFALSE;
8e49a788 851 }
9239b066 852
157b926a 853 if (fAliAnalysisUtils->IsPileUpEvent(InputEvent())) {
8e49a788 854 fHistEventRejection->Fill("PileUp",1);
9239b066 855 return kFALSE;
8e49a788 856 }
9239b066 857 }
6f6dc2ba 858
859 if (!(fEPV0 > fMinEventPlane && fEPV0 <= fMaxEventPlane) &&
860 !(fEPV0 + TMath::Pi() > fMinEventPlane && fEPV0 + TMath::Pi() <= fMaxEventPlane) &&
861 !(fEPV0 - TMath::Pi() > fMinEventPlane && fEPV0 - TMath::Pi() <= fMaxEventPlane))
8e49a788 862 {
254370e1 863 if (fGeneralHistograms)
864 fHistEventRejection->Fill("EvtPlane",1);
8e49a788 865 return kFALSE;
866 }
6f6dc2ba 867
8e49a788 868 if (fSelectPtHardBin != -999 && fSelectPtHardBin != fPtHardBin) {
254370e1 869 if (fGeneralHistograms)
870 fHistEventRejection->Fill("SelPtHardBin",1);
8e49a788 871 return kFALSE;
872 }
6f6dc2ba 873
2ac8ca4f 874 return kTRUE;
875}
876
c596bd28 877//________________________________________________________________________
878TClonesArray *AliAnalysisTaskEmcal::GetArrayFromEvent(const char *name, const char *clname)
879{
880 // Get array from event.
881
882 TClonesArray *arr = 0;
883 TString sname(name);
884 if (!sname.IsNull()) {
885 arr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sname));
886 if (!arr) {
887 AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
888 return 0;
889 }
af0280a9 890 } else {
891 return 0;
c596bd28 892 }
af0280a9 893
c596bd28 894 if (!clname)
895 return arr;
896
897 TString objname(arr->GetClass()->GetName());
898 TClass cls(objname);
899 if (!cls.InheritsFrom(clname)) {
900 AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
901 GetName(), cls.GetName(), name, clname));
902 return 0;
903 }
904 return arr;
905}
906
2da09763 907//________________________________________________________________________
908Bool_t AliAnalysisTaskEmcal::RetrieveEventObjects()
909{
910 // Retrieve objects from event.
911
2da09763 912 fVertex[0] = 0;
913 fVertex[1] = 0;
914 fVertex[2] = 0;
b4339010 915 fNVertCont = 0;
916
917 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
918 if (vert) {
919 vert->GetXYZ(fVertex);
920 fNVertCont = vert->GetNContributors();
921 }
2da09763 922
1f6fff78 923 fBeamType = GetBeamType();
924
a52de945 925 if (fBeamType == kAA || fBeamType == kpA ) {
2da09763 926 AliCentrality *aliCent = InputEvent()->GetCentrality();
927 if (aliCent) {
9239b066 928 fCent = aliCent->GetCentralityPercentile(fCentEst.Data());
157b926a 929 if (fNcentBins==4) {
e304c410 930 if (fCent >= 0 && fCent < 10) fCentBin = 0;
931 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
932 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
933 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
934 else {
935 AliWarning(Form("%s: Negative centrality: %f. Assuming 99", GetName(), fCent));
53e07ba4 936 fCentBin = fNcentBins-1;
e304c410 937 }
dbd1583b 938 } else {
e304c410 939 Double_t centWidth = (fMaxCent-fMinCent)/(Double_t)fNcentBins;
9239b066 940 fCentBin = TMath::FloorNint(fCent/centWidth);
157b926a 941 if (fCentBin>=fNcentBins) {
53e07ba4 942 AliWarning(Form("%s: fCentBin too large: cent = %f fCentBin = %d. Assuming 99", GetName(),fCent,fCentBin));
943 fCentBin = fNcentBins-1;
944 }
2da09763 945 }
901cc837 946 } else {
947 AliWarning(Form("%s: Could not retrieve centrality information! Assuming 99", GetName()));
2da09763 948 fCentBin = 3;
949 }
3c124212 950 AliEventplane *aliEP = InputEvent()->GetEventplane();
951 if (aliEP) {
952 fEPV0 = aliEP->GetEventplane("V0" ,InputEvent());
953 fEPV0A = aliEP->GetEventplane("V0A",InputEvent());
954 fEPV0C = aliEP->GetEventplane("V0C",InputEvent());
955 } else {
956 AliWarning(Form("%s: Could not retrieve event plane information!", GetName()));
957 }
901cc837 958 } else {
2da09763 959 fCent = 99;
960 fCentBin = 0;
961 }
962
ed0243d8 963 if (fIsPythia) {
964
965 if (MCEvent()) {
966 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
967 if (!fPythiaHeader) {
968 // Check if AOD
969 AliAODMCHeader* aodMCH = dynamic_cast<AliAODMCHeader*>(InputEvent()->FindListObject(AliAODMCHeader::StdBranchName()));
970
971 if (aodMCH) {
157b926a 972 for (UInt_t i = 0;i<aodMCH->GetNCocktailHeaders();i++) {
ed0243d8 973 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(aodMCH->GetCocktailHeader(i));
974 if (fPythiaHeader) break;
975 }
976 }
977 }
978 }
979
980 if (fPythiaHeader) {
981 fPtHard = fPythiaHeader->GetPtHard();
982
983 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
984 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
985 for (fPtHardBin = 0; fPtHardBin < 11; fPtHardBin++) {
986 if (fPtHard >= ptHardLo[fPtHardBin] && fPtHard < ptHardHi[fPtHardBin])
987 break;
988 }
989
990 fNTrials = fPythiaHeader->Trials();
991 }
992 }
993
8e49a788 994 fTriggerType = GetTriggerType();
995
2da09763 996 return kTRUE;
997}
9239b066 998
999//________________________________________________________________________
b8aeed95 1000AliParticleContainer* AliAnalysisTaskEmcal::AddParticleContainer(const char *n)
1001{
9239b066 1002 // Add particle container
1003 // will be called in AddTask macro
1004
1005 TString tmp = TString(n);
157b926a 1006 if (tmp.IsNull()) return 0;
9239b066 1007
1008 AliParticleContainer *cont = 0x0;
1009 cont = new AliParticleContainer();
1010 cont->SetArrayName(n);
1011 TString contName = cont->GetArrayName();
1012
1013 fParticleCollArray.Add(cont);
1014
1015 return cont;
1016}
1017
1018//________________________________________________________________________
b8aeed95 1019AliClusterContainer* AliAnalysisTaskEmcal::AddClusterContainer(const char *n)
1020{
9239b066 1021 // Add cluster container
1022 // will be called in AddTask macro
1023
1024 TString tmp = TString(n);
157b926a 1025 if (tmp.IsNull()) return 0;
9239b066 1026
1027 AliClusterContainer *cont = 0x0;
1028 cont = new AliClusterContainer();
1029 cont->SetArrayName(n);
1030
1031 fClusterCollArray.Add(cont);
1032
1033 return cont;
1034}
1035
1036//________________________________________________________________________
b8aeed95 1037AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(Int_t i) const
1038{
9239b066 1039 // Get i^th particle container
1040
157b926a 1041 if (i<0 || i>fParticleCollArray.GetEntriesFast()) return 0;
9239b066 1042 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
1043 return cont;
1044}
1045
1046//________________________________________________________________________
b8aeed95 1047AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(Int_t i) const
1048{
9239b066 1049 // Get i^th cluster container
1050
157b926a 1051 if (i<0 || i>fClusterCollArray.GetEntriesFast()) return 0;
9239b066 1052 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
1053 return cont;
1054}
1055
1056//________________________________________________________________________
b8aeed95 1057AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(const char *name) const
1058{
9239b066 1059 // Get particle container with name
1060
1061 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.FindObject(name));
1062 return cont;
1063}
1064
1065//________________________________________________________________________
b8aeed95 1066AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(const char *name) const
1067{
9239b066 1068 // Get cluster container with name
1069
1070 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.FindObject(name));
1071 return cont;
1072}
1073
1074//________________________________________________________________________
b8aeed95 1075TClonesArray* AliAnalysisTaskEmcal::GetParticleArray(Int_t i) const
1076{
9239b066 1077 // Get i^th TClonesArray with AliVParticle
1078
1079 AliParticleContainer *cont = GetParticleContainer(i);
157b926a 1080 if (!cont) {
9239b066 1081 AliError(Form("%s: Particle container %d not found",GetName(),i));
1082 return 0;
1083 }
1084 TString contName = cont->GetArrayName();
1085 return cont->GetArray();
1086}
1087
1088//________________________________________________________________________
b8aeed95 1089TClonesArray* AliAnalysisTaskEmcal::GetClusterArray(Int_t i) const
1090{
9239b066 1091 // Get i^th TClonesArray with AliVCluster
1092
1093 AliClusterContainer *cont = GetClusterContainer(i);
157b926a 1094 if (!cont) {
9239b066 1095 AliError(Form("%s:Cluster container %d not found",GetName(),i));
1096 return 0;
1097 }
1098 return cont->GetArray();
1099}
1100
1101//________________________________________________________________________
b8aeed95 1102AliVParticle* AliAnalysisTaskEmcal::GetAcceptParticleFromArray(Int_t p, Int_t c) const
1103{
9239b066 1104 // Get particle p if accepted from container c
1105 // If particle not accepted return 0
1106
1107 AliParticleContainer *cont = GetParticleContainer(c);
157b926a 1108 if (!cont) {
9239b066 1109 AliError(Form("%s: Particle container %d not found",GetName(),c));
1110 return 0;
1111 }
1112 AliVParticle *vp = cont->GetAcceptParticle(p);
1113
1114 return vp;
1115}
1116
1117//________________________________________________________________________
b8aeed95 1118AliVCluster* AliAnalysisTaskEmcal::GetAcceptClusterFromArray(Int_t cl, Int_t c) const
1119{
9239b066 1120 // Get particle p if accepted from container c
1121 // If particle not accepted return 0
1122
1123 AliClusterContainer *cont = GetClusterContainer(c);
157b926a 1124 if (!cont) {
9239b066 1125 AliError(Form("%s: Cluster container %d not found",GetName(),c));
1126 return 0;
1127 }
1128 AliVCluster *vc = cont->GetAcceptCluster(cl);
1129
1130 return vc;
1131}
1132
1133//________________________________________________________________________
b8aeed95 1134Int_t AliAnalysisTaskEmcal::GetNParticles(Int_t i) const
1135{
9239b066 1136 // Get number of entries in particle array i
1137
1138 AliParticleContainer *cont = GetParticleContainer(i);
157b926a 1139 if (!cont) {
9239b066 1140 AliError(Form("%s: Particle container %d not found",GetName(),i));
1141 return 0;
1142 }
1143 return cont->GetNEntries();
1144}
1145
1146//________________________________________________________________________
b8aeed95 1147Int_t AliAnalysisTaskEmcal::GetNClusters(Int_t i) const
1148{
9239b066 1149 // Get number of entries in cluster array i
1150
1151 AliClusterContainer *cont = GetClusterContainer(i);
157b926a 1152 if (!cont) {
9239b066 1153 AliError(Form("%s: Cluster container %d not found",GetName(),i));
1154 return 0;
1155 }
1156 return cont->GetNEntries();
1157}
1158
37a63fdf 1159//________________________________________________________________________
b8aeed95 1160AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch()
1161{
37a63fdf 1162 //get main trigger match; if not known yet, look for it and cache
1163
157b926a 1164 if (fMainTriggerPatch)
37a63fdf 1165 return fMainTriggerPatch;
1166
157b926a 1167 if (!fTriggerPatchInfo) {
37a63fdf 1168 AliError(Form("%s: fTriggerPatchInfo not available",GetName()));
1169 return 0;
1170 }
1171
1172 //number of patches in event
1173 Int_t nPatch = fTriggerPatchInfo->GetEntries();
1174
1175 //extract main trigger patch
1176 AliEmcalTriggerPatchInfo *patch;
157b926a 1177 for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
37a63fdf 1178
1179 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
157b926a 1180 if (patch->IsMainTrigger()) {
37a63fdf 1181 fMainTriggerPatch = patch;
1182 break;
1183 }
1184 }
1185
1186 return fMainTriggerPatch;
37a63fdf 1187}
b8aeed95 1188
1189//________________________________________________________________________
1190void AliAnalysisTaskEmcal::AddObjectToEvent(TObject *obj)
1191{
1192 // Add object to event
1193
1194 if (!(InputEvent()->FindListObject(obj->GetName()))) {
1195 InputEvent()->AddObject(obj);
1196 } else {
1197 AliFatal(Form("%s: Container with name %s already present. Aborting", GetName(), obj->GetName()));
1198 }
1199}