3 // Emcal base analysis task.
5 // Author: S.Aiola, M. Verweij
7 #include "AliAnalysisTaskEmcal.h"
9 #include <TClonesArray.h>
19 #include "AliAODEvent.h"
20 #include "AliAnalysisManager.h"
21 #include "AliCentrality.h"
22 #include "AliEMCALGeometry.h"
23 #include "AliESDEvent.h"
24 #include "AliEmcalParticle.h"
25 #include "AliEventplane.h"
26 #include "AliInputEventHandler.h"
28 #include "AliMCParticle.h"
29 #include "AliVCluster.h"
30 #include "AliVEventHandler.h"
31 #include "AliVParticle.h"
32 #include "AliVCaloTrigger.h"
33 #include "AliGenPythiaEventHeader.h"
34 #include "AliAODMCHeader.h"
35 #include "AliMCEvent.h"
36 #include "AliAnalysisUtils.h"
37 #include "AliEmcalTriggerPatchInfo.h"
39 #include "AliParticleContainer.h"
40 #include "AliClusterContainer.h"
42 ClassImp(AliAnalysisTaskEmcal)
44 //________________________________________________________________________
45 AliAnalysisTaskEmcal::AliAnalysisTaskEmcal() :
46 AliAnalysisTaskSE("AliAnalysisTaskEmcal"),
48 fGeneralHistograms(kFALSE),
53 fCaloTriggerPatchInfoName(),
60 fUseAliAnaUtils(kFALSE),
61 fAliAnalysisUtils(0x0),
62 fOffTrigger(AliVEvent::kAny),
68 fMinPtTrackInEmcal(0),
69 fEventPlaneVsEmcal(-1),
75 fSelectPtHardBin(-999),
99 fMainTriggerPatch(0x0),
102 fHistTrialsAfterSel(0),
103 fHistEventsAfterSel(0),
111 fHistEventRejection(0)
113 // Default constructor.
119 fParticleCollArray.SetOwner(kTRUE);
120 fClusterCollArray.SetOwner(kTRUE);
123 //________________________________________________________________________
124 AliAnalysisTaskEmcal::AliAnalysisTaskEmcal(const char *name, Bool_t histo) :
125 AliAnalysisTaskSE(name),
127 fGeneralHistograms(kFALSE),
128 fInitialized(kFALSE),
132 fCaloTriggerPatchInfoName(),
139 fUseAliAnaUtils(kFALSE),
140 fAliAnalysisUtils(0x0),
141 fOffTrigger(AliVEvent::kAny),
143 fTriggerTypeSel(kND),
147 fMinPtTrackInEmcal(0),
148 fEventPlaneVsEmcal(-1),
149 fMinEventPlane(-1e6),
154 fSelectPtHardBin(-999),
163 fTriggerPatchInfo(0),
176 fParticleCollArray(),
178 fMainTriggerPatch(0x0),
181 fHistTrialsAfterSel(0),
182 fHistEventsAfterSel(0),
190 fHistEventRejection(0)
192 // Standard constructor.
198 fParticleCollArray.SetOwner(kTRUE);
199 fClusterCollArray.SetOwner(kTRUE);
202 DefineOutput(1, TList::Class());
206 //________________________________________________________________________
207 AliAnalysisTaskEmcal::~AliAnalysisTaskEmcal()
212 //________________________________________________________________________
213 void AliAnalysisTaskEmcal::SetClusPtCut(Double_t cut, Int_t c)
215 AliClusterContainer *cont = GetClusterContainer(c);
216 if (cont) cont->SetClusPtCut(cut);
217 else AliError(Form("%s in SetClusPtCut(...): container %d not found",GetName(),c));
220 //________________________________________________________________________
221 void AliAnalysisTaskEmcal::SetClusTimeCut(Double_t min, Double_t max, Int_t c)
223 AliClusterContainer *cont = GetClusterContainer(c);
224 if (cont) cont->SetClusTimeCut(min,max);
225 else AliError(Form("%s in SetClusTimeCut(...): container %d not found",GetName(),c));
228 //________________________________________________________________________
229 void AliAnalysisTaskEmcal::SetTrackPtCut(Double_t cut, Int_t c)
231 AliParticleContainer *cont = GetParticleContainer(c);
232 if (cont) cont->SetParticlePtCut(cut);
233 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
238 //________________________________________________________________________
239 void AliAnalysisTaskEmcal::SetTrackEtaLimits(Double_t min, Double_t max, Int_t c)
241 AliParticleContainer *cont = GetParticleContainer(c);
242 if (cont) cont->SetParticleEtaLimits(min,max);
243 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
246 //________________________________________________________________________
247 void AliAnalysisTaskEmcal::SetTrackPhiLimits(Double_t min, Double_t max, Int_t c)
249 AliParticleContainer *cont = GetParticleContainer(c);
250 if (cont) cont->SetParticlePhiLimits(min,max);
251 else AliError(Form("%s in SetTrackPhiLimits(...): container %d not found",GetName(),c));
254 //________________________________________________________________________
255 void AliAnalysisTaskEmcal::UserCreateOutputObjects()
257 // Create user output.
262 fOutput = new TList();
265 if (fForceBeamType == kpp)
268 if (!fGeneralHistograms)
272 fHistTrialsAfterSel = new TH1F("fHistTrialsAfterSel", "fHistTrialsAfterSel", 11, 0, 11);
273 fHistTrialsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
274 fHistTrialsAfterSel->GetYaxis()->SetTitle("trials");
275 fOutput->Add(fHistTrialsAfterSel);
277 fHistEventsAfterSel = new TH1F("fHistEventsAfterSel", "fHistEventsAfterSel", 11, 0, 11);
278 fHistEventsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
279 fHistEventsAfterSel->GetYaxis()->SetTitle("total events");
280 fOutput->Add(fHistEventsAfterSel);
282 fHistTrials = new TH1F("fHistTrials", "fHistTrials", 11, 0, 11);
283 fHistTrials->GetXaxis()->SetTitle("p_{T} hard bin");
284 fHistTrials->GetYaxis()->SetTitle("trials");
285 fOutput->Add(fHistTrials);
287 fHistXsection = new TProfile("fHistXsection", "fHistXsection", 11, 0, 11);
288 fHistXsection->GetXaxis()->SetTitle("p_{T} hard bin");
289 fHistXsection->GetYaxis()->SetTitle("xsection");
290 fOutput->Add(fHistXsection);
292 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
293 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
294 fHistEvents->GetYaxis()->SetTitle("total events");
295 fOutput->Add(fHistEvents);
297 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
298 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
300 for (Int_t i = 1; i < 12; i++) {
301 fHistTrialsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
302 fHistEventsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
304 fHistTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
305 fHistXsection->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
306 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
309 fHistPtHard = new TH1F("fHistPtHard", "fHistPtHard", fNbins*2, fMinBinPt, fMaxBinPt*4);
310 fHistPtHard->GetXaxis()->SetTitle("p_{T,hard} (GeV/c)");
311 fHistPtHard->GetYaxis()->SetTitle("counts");
312 fOutput->Add(fHistPtHard);
315 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", 200, 0, 100);
316 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
317 fHistCentrality->GetYaxis()->SetTitle("counts");
318 fOutput->Add(fHistCentrality);
320 fHistZVertex = new TH1F("fHistZVertex","Z vertex position", 60, -30, 30);
321 fHistZVertex->GetXaxis()->SetTitle("z");
322 fHistZVertex->GetYaxis()->SetTitle("counts");
323 fOutput->Add(fHistZVertex);
325 fHistEventPlane = new TH1F("fHistEventPlane","Event plane", 120, -TMath::Pi(), TMath::Pi());
326 fHistEventPlane->GetXaxis()->SetTitle("event plane");
327 fHistEventPlane->GetYaxis()->SetTitle("counts");
328 fOutput->Add(fHistEventPlane);
330 fHistEventRejection = new TH1I("fHistEventRejection","Reasons to reject event",20,0,20);
331 fHistEventRejection->Fill("PhysSel",0);
332 fHistEventRejection->Fill("trigger",0);
333 fHistEventRejection->Fill("trigTypeSel",0);
334 fHistEventRejection->Fill("Cent",0);
335 fHistEventRejection->Fill("vertex contr.",0);
336 fHistEventRejection->Fill("Vz",0);
337 fHistEventRejection->Fill("trackInEmcal",0);
338 fHistEventRejection->Fill("minNTrack",0);
339 fHistEventRejection->Fill("VtxSel2013pA",0);
340 fHistEventRejection->Fill("PileUp",0);
341 fHistEventRejection->Fill("EvtPlane",0);
342 fHistEventRejection->Fill("SelPtHardBin",0);
343 fHistEventRejection->GetYaxis()->SetTitle("counts");
344 fOutput->Add(fHistEventRejection);
346 PostData(1, fOutput);
349 //________________________________________________________________________
350 Bool_t AliAnalysisTaskEmcal::FillGeneralHistograms()
353 fHistEventsAfterSel->SetBinContent(fPtHardBin + 1, fHistEventsAfterSel->GetBinContent(fPtHardBin + 1) + 1);
354 fHistTrialsAfterSel->SetBinContent(fPtHardBin + 1, fHistTrialsAfterSel->GetBinContent(fPtHardBin + 1) + fNTrials);
355 fHistPtHard->Fill(fPtHard);
356 fXsection = fPythiaHeader->GetXsection();
358 fHistXsection->Fill(fPtHardBin+1, fXsection);
359 fHistTrials->Fill(fPtHardBin+1, fPythiaHeader->Trials());
363 fHistCentrality->Fill(fCent);
364 fHistZVertex->Fill(fVertex[2]);
365 fHistEventPlane->Fill(fEPV0);
370 //________________________________________________________________________
371 void AliAnalysisTaskEmcal::UserExec(Option_t *)
373 // Main loop, called for each event.
375 fMainTriggerPatch = NULL;
383 if (!RetrieveEventObjects())
386 if (!IsEventSelected())
389 if (fGeneralHistograms && fCreateHisto) {
390 if (!FillGeneralHistograms())
398 if (!FillHistograms())
402 if (fCreateHisto && fOutput) {
403 // information for this iteration of the UserExec in the container
404 PostData(1, fOutput);
408 //________________________________________________________________________
409 Bool_t AliAnalysisTaskEmcal::AcceptCluster(AliVCluster *clus, Int_t c) const
411 // Return true if cluster is accepted.
416 AliClusterContainer *cont = GetClusterContainer(c);
418 AliError(Form("%s:Container %d not found",GetName(),c));
422 return cont->AcceptCluster(clus);
425 //________________________________________________________________________
426 Bool_t AliAnalysisTaskEmcal::AcceptTrack(AliVParticle *track, Int_t c) const
428 // Return true if track is accepted.
433 AliParticleContainer *cont = GetParticleContainer(c);
435 AliError(Form("%s:Container %d not found",GetName(),c));
439 return cont->AcceptParticle(track);
442 //________________________________________________________________________
443 Bool_t AliAnalysisTaskEmcal::PythiaInfoFromFile(const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard)
446 // Get the cross section and the trails either from pyxsec.root or from pysec_hists.root
447 // Get the pt hard bin from the file path
448 // This is to called in Notify and should provide the path to the AOD/ESD file
449 // (Partially copied from AliAnalysisHelperJetTasks)
451 TString file(currFile);
455 if (file.Contains(".zip#")) {
456 Ssiz_t pos1 = file.Index("root_archive",12,0,TString::kExact);
457 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
458 Ssiz_t pos2 = file.Index(".root",5,TString::kExact);
459 file.Replace(pos+1,pos2-pos1,"");
461 // not an archive take the basename....
462 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
464 AliDebug(1,Form("File name: %s",file.Data()));
466 // Get the pt hard bin
467 TString strPthard(file);
469 strPthard.Remove(strPthard.Last('/'));
470 strPthard.Remove(strPthard.Last('/'));
471 if (strPthard.Contains("AOD")) strPthard.Remove(strPthard.Last('/'));
472 strPthard.Remove(0,strPthard.Last('/')+1);
473 if (strPthard.IsDec())
474 pthard = strPthard.Atoi();
476 AliWarning(Form("Could not extract file number from path %s", strPthard.Data()));
478 // 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
479 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root"));
482 // next trial fetch the histgram file
483 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
485 // not a severe condition but inciate that we have no information
488 // find the tlist we want to be independtent of the name so use the Tkey
489 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
494 TList *list = dynamic_cast<TList*>(key->ReadObj());
499 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
500 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
503 } else { // no tree pyxsec.root
504 TTree *xtree = (TTree*)fxsec->Get("Xsection");
510 Double_t xsection = 0;
511 xtree->SetBranchAddress("xsection",&xsection);
512 xtree->SetBranchAddress("ntrials",&ntrials);
521 //________________________________________________________________________
522 Bool_t AliAnalysisTaskEmcal::UserNotify()
524 // Called when file changes.
526 if (!fIsPythia || !fGeneralHistograms || !fCreateHisto)
529 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
531 AliError(Form("%s - UserNotify: No current tree!",GetName()));
538 TFile *curfile = tree->GetCurrentFile();
540 AliError(Form("%s - UserNotify: No current file!",GetName()));
544 TChain *chain = dynamic_cast<TChain*>(tree);
546 tree = chain->GetTree();
548 Int_t nevents = tree->GetEntriesFast();
550 PythiaInfoFromFile(curfile->GetName(), fXsection, trials, pthard);
553 if ((pthard < 0) || (pthard > 10))
555 fHistTrials->Fill(pthard, trials);
556 fHistXsection->Fill(pthard, fXsection);
557 fHistEvents->Fill(pthard, nevents);
562 //________________________________________________________________________
563 void AliAnalysisTaskEmcal::ExecOnce()
565 // Init the analysis.
568 AliError(Form("%s: Could not retrieve event! Returning!", GetName()));
572 fGeom = AliEMCALGeometry::GetInstance();
574 AliError(Form("%s: Can not create geometry", GetName()));
578 if (fEventPlaneVsEmcal >= 0) {
579 Double_t ep = (fGeom->GetArm1PhiMax() + fGeom->GetArm1PhiMin()) / 2 * TMath::DegToRad() + fEventPlaneVsEmcal - TMath::Pi();
580 fMinEventPlane = ep - TMath::Pi() / 4;
581 fMaxEventPlane = ep + TMath::Pi() / 4;
584 //Load all requested track branches - each container knows name already
585 for (Int_t i =0; i<fParticleCollArray.GetEntriesFast(); i++) {
586 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
587 cont->SetArray(InputEvent());
590 if (fParticleCollArray.GetEntriesFast()>0) {
591 fTracks = GetParticleArray(0);
593 AliError(Form("%s: Could not retrieve first track branch!", GetName()));
598 //Load all requested cluster branches - each container knows name already
599 for (Int_t i =0; i<fClusterCollArray.GetEntriesFast(); i++) {
600 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
601 cont->SetArray(InputEvent());
604 if (fClusterCollArray.GetEntriesFast()>0) {
605 fCaloClusters = GetClusterArray(0);
606 if (!fCaloClusters) {
607 AliError(Form("%s: Could not retrieve first cluster branch!", GetName()));
612 if (!fCaloCellsName.IsNull() && !fCaloCells) {
613 fCaloCells = dynamic_cast<AliVCaloCells*>(InputEvent()->FindListObject(fCaloCellsName));
615 AliError(Form("%s: Could not retrieve cells %s!", GetName(), fCaloCellsName.Data()));
620 if (!fCaloTriggersName.IsNull() && !fCaloTriggers) {
621 fCaloTriggers = dynamic_cast<AliVCaloTrigger*>(InputEvent()->FindListObject(fCaloTriggersName));
622 if (!fCaloTriggers) {
623 AliError(Form("%s: Could not retrieve calo triggers %s!", GetName(), fCaloTriggersName.Data()));
628 if (!fCaloTriggerPatchInfoName.IsNull() && !fTriggerPatchInfo) {
629 fTriggerPatchInfo = GetArrayFromEvent(fCaloTriggerPatchInfoName.Data(),"AliEmcalTriggerPatchInfo");
630 if (!fTriggerPatchInfo) {
631 AliError(Form("%s: Could not retrieve calo trigger patch info %s!", GetName(), fCaloTriggerPatchInfoName.Data()));
637 fInitialized = kTRUE;
640 //_____________________________________________________
641 AliAnalysisTaskEmcal::BeamType AliAnalysisTaskEmcal::GetBeamType()
643 // Get beam type : pp-AA-pA
644 // ESDs have it directly, AODs get it from hardcoded run number ranges
646 if (fForceBeamType != kNA)
647 return fForceBeamType;
649 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(InputEvent());
651 const AliESDRun *run = esd->GetESDRun();
652 TString beamType = run->GetBeamType();
653 if (beamType == "p-p")
655 else if (beamType == "A-A")
657 else if (beamType == "p-A")
662 Int_t runNumber = InputEvent()->GetRunNumber();
663 if ((runNumber >= 136851 && runNumber <= 139517) || // LHC10h
664 (runNumber >= 166529 && runNumber <= 170593)) { // LHC11h
666 } else if ((runNumber>=188365 && runNumber <= 188366) || // LHC12g
667 (runNumber >= 195344 && runNumber <= 196608)) { // LHC13b-f
675 //_____________________________________________________
676 AliAnalysisTaskEmcal::TriggerType AliAnalysisTaskEmcal::GetTriggerType()
678 // Get trigger type: kND, kJ1, kJ2
680 if (!fTriggerPatchInfo)
683 //number of patches in event
684 Int_t nPatch = fTriggerPatchInfo->GetEntries();
686 //loop over patches to define trigger type of event
689 AliEmcalTriggerPatchInfo *patch;
690 for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
691 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
692 if (patch->IsJetHigh()) nJ1++;
693 if (patch->IsJetLow()) nJ2++;
704 //________________________________________________________________________
705 Bool_t AliAnalysisTaskEmcal::IsEventSelected()
707 // Check if event is selected
709 if (fOffTrigger != AliVEvent::kAny) {
711 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
713 res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
715 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
717 res = aev->GetHeader()->GetOfflineTrigger();
720 if ((res & fOffTrigger) == 0) {
721 if (fGeneralHistograms)
722 fHistEventRejection->Fill("PhysSel",1);
727 if (!fTrigClass.IsNull()) {
729 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
731 fired = eev->GetFiredTriggerClasses();
733 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
735 fired = aev->GetFiredTriggerClasses();
738 if (!fired.Contains("-B-")) {
739 if (fGeneralHistograms)
740 fHistEventRejection->Fill("trigger",1);
743 TObjArray *arr = fTrigClass.Tokenize("|");
745 if (fGeneralHistograms)
746 fHistEventRejection->Fill("trigger",1);
750 for (Int_t i=0;i<arr->GetEntriesFast();++i) {
751 TObject *obj = arr->At(i);
754 if (fired.Contains(obj->GetName())) {
761 if (fGeneralHistograms)
762 fHistEventRejection->Fill("trigger",1);
767 if (fTriggerTypeSel != kND) {
768 if (fTriggerType != fTriggerTypeSel) {
769 if (fGeneralHistograms)
770 fHistEventRejection->Fill("trigTypeSel",1);
775 if ((fMinCent != -999) && (fMaxCent != -999)) {
776 if (fCent<fMinCent || fCent>fMaxCent) {
777 if (fGeneralHistograms)
778 fHistEventRejection->Fill("Cent",1);
783 if (fUseAliAnaUtils) {
784 if (!fAliAnalysisUtils)
785 fAliAnalysisUtils = new AliAnalysisUtils();
786 fAliAnalysisUtils->SetMinVtxContr(2);
787 fAliAnalysisUtils->SetMaxVtxZ(999);
788 if(fMinVz<-10.) fMinVz = -10.;
789 if(fMinVz>10.) fMaxVz = 10.;
791 if (!fAliAnalysisUtils->IsVertexSelected2013pA(InputEvent())) {
792 if (fGeneralHistograms)
793 fHistEventRejection->Fill("VtxSel2013pA",1);
797 if (fAliAnalysisUtils->IsPileUpEvent(InputEvent())) {
798 fHistEventRejection->Fill("PileUp",1);
803 if ((fMinVz != -999) && (fMaxVz != -999)) {
804 if (fNVertCont == 0 ) {
805 if (fGeneralHistograms)
806 fHistEventRejection->Fill("vertex contr.",1);
809 Double_t vz = fVertex[2];
810 if (vz<fMinVz || vz>fMaxVz) {
811 if (fGeneralHistograms)
812 fHistEventRejection->Fill("Vz",1);
817 if (fMinPtTrackInEmcal > 0 && fGeom) {
818 Bool_t trackInEmcalOk = kFALSE;
819 Int_t ntracks = GetNParticles(0);
820 for (Int_t i = 0; i < ntracks; i++) {
821 AliVParticle *track = GetAcceptParticleFromArray(i,0);
825 Double_t phiMin = fGeom->GetArm1PhiMin() * TMath::DegToRad();
826 Double_t phiMax = fGeom->GetArm1PhiMax() * TMath::DegToRad();
827 Int_t runNumber = InputEvent()->GetRunNumber();
828 if (runNumber>=177295 && runNumber<=197470) { //small SM masked in 2012 and 2013
830 phiMax = TMath::Pi();
833 if (track->Eta() < fGeom->GetArm1EtaMin() || track->Eta() > fGeom->GetArm1EtaMax() || track->Phi() < phiMin || track->Phi() > phiMax)
835 if (track->Pt() > fMinPtTrackInEmcal) {
836 trackInEmcalOk = kTRUE;
840 if (!trackInEmcalOk) {
841 if (fGeneralHistograms)
842 fHistEventRejection->Fill("trackInEmcal",1);
847 if (fMinNTrack > 0) {
848 Int_t nTracksAcc = 0;
849 Int_t ntracks = GetNParticles(0);
850 for (Int_t i = 0; i < ntracks; i++) {
851 AliVParticle *track = GetAcceptParticleFromArray(i,0);
854 if (track->Pt() > fTrackPtCut) {
856 if (nTracksAcc>=fMinNTrack)
860 if (nTracksAcc<fMinNTrack) {
861 if (fGeneralHistograms)
862 fHistEventRejection->Fill("minNTrack",1);
867 if (!(fEPV0 > fMinEventPlane && fEPV0 <= fMaxEventPlane) &&
868 !(fEPV0 + TMath::Pi() > fMinEventPlane && fEPV0 + TMath::Pi() <= fMaxEventPlane) &&
869 !(fEPV0 - TMath::Pi() > fMinEventPlane && fEPV0 - TMath::Pi() <= fMaxEventPlane))
871 if (fGeneralHistograms)
872 fHistEventRejection->Fill("EvtPlane",1);
876 if (fSelectPtHardBin != -999 && fSelectPtHardBin != fPtHardBin) {
877 if (fGeneralHistograms)
878 fHistEventRejection->Fill("SelPtHardBin",1);
885 //________________________________________________________________________
886 TClonesArray *AliAnalysisTaskEmcal::GetArrayFromEvent(const char *name, const char *clname)
888 // Get array from event.
890 TClonesArray *arr = 0;
892 if (!sname.IsNull()) {
893 arr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sname));
895 AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
905 TString objname(arr->GetClass()->GetName());
907 if (!cls.InheritsFrom(clname)) {
908 AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
909 GetName(), cls.GetName(), name, clname));
915 //________________________________________________________________________
916 Bool_t AliAnalysisTaskEmcal::RetrieveEventObjects()
918 // Retrieve objects from event.
925 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
927 vert->GetXYZ(fVertex);
928 fNVertCont = vert->GetNContributors();
931 fBeamType = GetBeamType();
933 if (fBeamType == kAA || fBeamType == kpA ) {
934 AliCentrality *aliCent = InputEvent()->GetCentrality();
936 fCent = aliCent->GetCentralityPercentile(fCentEst.Data());
938 if (fCent >= 0 && fCent < 10) fCentBin = 0;
939 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
940 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
941 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
943 AliWarning(Form("%s: Negative centrality: %f. Assuming 99", GetName(), fCent));
944 fCentBin = fNcentBins-1;
947 Double_t centWidth = (fMaxCent-fMinCent)/(Double_t)fNcentBins;
948 fCentBin = TMath::FloorNint(fCent/centWidth);
949 if (fCentBin>=fNcentBins) {
950 AliWarning(Form("%s: fCentBin too large: cent = %f fCentBin = %d. Assuming 99", GetName(),fCent,fCentBin));
951 fCentBin = fNcentBins-1;
955 AliWarning(Form("%s: Could not retrieve centrality information! Assuming 99", GetName()));
958 AliEventplane *aliEP = InputEvent()->GetEventplane();
960 fEPV0 = aliEP->GetEventplane("V0" ,InputEvent());
961 fEPV0A = aliEP->GetEventplane("V0A",InputEvent());
962 fEPV0C = aliEP->GetEventplane("V0C",InputEvent());
964 AliWarning(Form("%s: Could not retrieve event plane information!", GetName()));
974 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
975 if (!fPythiaHeader) {
977 AliAODMCHeader* aodMCH = dynamic_cast<AliAODMCHeader*>(InputEvent()->FindListObject(AliAODMCHeader::StdBranchName()));
980 for (UInt_t i = 0;i<aodMCH->GetNCocktailHeaders();i++) {
981 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(aodMCH->GetCocktailHeader(i));
982 if (fPythiaHeader) break;
989 fPtHard = fPythiaHeader->GetPtHard();
991 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
992 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
993 for (fPtHardBin = 0; fPtHardBin < 11; fPtHardBin++) {
994 if (fPtHard >= ptHardLo[fPtHardBin] && fPtHard < ptHardHi[fPtHardBin])
998 fNTrials = fPythiaHeader->Trials();
1002 fTriggerType = GetTriggerType();
1007 //________________________________________________________________________
1008 AliParticleContainer* AliAnalysisTaskEmcal::AddParticleContainer(const char *n)
1010 // Add particle container
1011 // will be called in AddTask macro
1013 TString tmp = TString(n);
1014 if (tmp.IsNull()) return 0;
1016 AliParticleContainer *cont = 0x0;
1017 cont = new AliParticleContainer();
1018 cont->SetArrayName(n);
1019 TString contName = cont->GetArrayName();
1021 fParticleCollArray.Add(cont);
1026 //________________________________________________________________________
1027 AliClusterContainer* AliAnalysisTaskEmcal::AddClusterContainer(const char *n)
1029 // Add cluster container
1030 // will be called in AddTask macro
1032 TString tmp = TString(n);
1033 if (tmp.IsNull()) return 0;
1035 AliClusterContainer *cont = 0x0;
1036 cont = new AliClusterContainer();
1037 cont->SetArrayName(n);
1039 fClusterCollArray.Add(cont);
1044 //________________________________________________________________________
1045 AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(Int_t i) const
1047 // Get i^th particle container
1049 if (i<0 || i>fParticleCollArray.GetEntriesFast()) return 0;
1050 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
1054 //________________________________________________________________________
1055 AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(Int_t i) const
1057 // Get i^th cluster container
1059 if (i<0 || i>fClusterCollArray.GetEntriesFast()) return 0;
1060 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
1064 //________________________________________________________________________
1065 AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(const char *name) const
1067 // Get particle container with name
1069 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.FindObject(name));
1073 //________________________________________________________________________
1074 AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(const char *name) const
1076 // Get cluster container with name
1078 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.FindObject(name));
1082 //________________________________________________________________________
1083 TClonesArray* AliAnalysisTaskEmcal::GetParticleArray(Int_t i) const
1085 // Get i^th TClonesArray with AliVParticle
1087 AliParticleContainer *cont = GetParticleContainer(i);
1089 AliError(Form("%s: Particle container %d not found",GetName(),i));
1092 TString contName = cont->GetArrayName();
1093 return cont->GetArray();
1096 //________________________________________________________________________
1097 TClonesArray* AliAnalysisTaskEmcal::GetClusterArray(Int_t i) const
1099 // Get i^th TClonesArray with AliVCluster
1101 AliClusterContainer *cont = GetClusterContainer(i);
1103 AliError(Form("%s:Cluster container %d not found",GetName(),i));
1106 return cont->GetArray();
1109 //________________________________________________________________________
1110 AliVParticle* AliAnalysisTaskEmcal::GetAcceptParticleFromArray(Int_t p, Int_t c) const
1112 // Get particle p if accepted from container c
1113 // If particle not accepted return 0
1115 AliParticleContainer *cont = GetParticleContainer(c);
1117 AliError(Form("%s: Particle container %d not found",GetName(),c));
1120 AliVParticle *vp = cont->GetAcceptParticle(p);
1125 //________________________________________________________________________
1126 AliVCluster* AliAnalysisTaskEmcal::GetAcceptClusterFromArray(Int_t cl, Int_t c) const
1128 // Get particle p if accepted from container c
1129 // If particle not accepted return 0
1131 AliClusterContainer *cont = GetClusterContainer(c);
1133 AliError(Form("%s: Cluster container %d not found",GetName(),c));
1136 AliVCluster *vc = cont->GetAcceptCluster(cl);
1141 //________________________________________________________________________
1142 Int_t AliAnalysisTaskEmcal::GetNParticles(Int_t i) const
1144 // Get number of entries in particle array i
1146 AliParticleContainer *cont = GetParticleContainer(i);
1148 AliError(Form("%s: Particle container %d not found",GetName(),i));
1151 return cont->GetNEntries();
1154 //________________________________________________________________________
1155 Int_t AliAnalysisTaskEmcal::GetNClusters(Int_t i) const
1157 // Get number of entries in cluster array i
1159 AliClusterContainer *cont = GetClusterContainer(i);
1161 AliError(Form("%s: Cluster container %d not found",GetName(),i));
1164 return cont->GetNEntries();
1167 //________________________________________________________________________
1168 AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch()
1170 //get main trigger match; if not known yet, look for it and cache
1172 if (fMainTriggerPatch)
1173 return fMainTriggerPatch;
1175 if (!fTriggerPatchInfo) {
1176 AliError(Form("%s: fTriggerPatchInfo not available",GetName()));
1180 //number of patches in event
1181 Int_t nPatch = fTriggerPatchInfo->GetEntries();
1183 //extract main trigger patch
1184 AliEmcalTriggerPatchInfo *patch;
1185 for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
1187 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
1188 if (patch->IsMainTrigger()) {
1189 fMainTriggerPatch = patch;
1194 return fMainTriggerPatch;
1197 //________________________________________________________________________
1198 void AliAnalysisTaskEmcal::AddObjectToEvent(TObject *obj)
1200 // Add object to event
1202 if (!(InputEvent()->FindListObject(obj->GetName()))) {
1203 InputEvent()->AddObject(obj);
1205 AliFatal(Form("%s: Container with name %s already present. Aborting", GetName(), obj->GetName()));