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),
79 fNeedEmcalGeom(kTRUE),
100 fMainTriggerPatch(0x0),
103 fHistTrialsAfterSel(0),
104 fHistEventsAfterSel(0),
105 fHistXsectionAfterSel(0),
113 fHistEventRejection(0)
115 // Default constructor.
121 fParticleCollArray.SetOwner(kTRUE);
122 fClusterCollArray.SetOwner(kTRUE);
125 //________________________________________________________________________
126 AliAnalysisTaskEmcal::AliAnalysisTaskEmcal(const char *name, Bool_t histo) :
127 AliAnalysisTaskSE(name),
129 fGeneralHistograms(kFALSE),
130 fInitialized(kFALSE),
134 fCaloTriggerPatchInfoName(),
141 fUseAliAnaUtils(kFALSE),
142 fAliAnalysisUtils(0x0),
143 fOffTrigger(AliVEvent::kAny),
145 fTriggerTypeSel(kND),
149 fMinPtTrackInEmcal(0),
150 fEventPlaneVsEmcal(-1),
151 fMinEventPlane(-1e6),
156 fSelectPtHardBin(-999),
160 fNeedEmcalGeom(kTRUE),
166 fTriggerPatchInfo(0),
179 fParticleCollArray(),
181 fMainTriggerPatch(0x0),
184 fHistTrialsAfterSel(0),
185 fHistEventsAfterSel(0),
186 fHistXsectionAfterSel(0),
194 fHistEventRejection(0)
196 // Standard constructor.
202 fParticleCollArray.SetOwner(kTRUE);
203 fClusterCollArray.SetOwner(kTRUE);
206 DefineOutput(1, TList::Class());
210 //________________________________________________________________________
211 AliAnalysisTaskEmcal::~AliAnalysisTaskEmcal()
216 //________________________________________________________________________
217 void AliAnalysisTaskEmcal::SetClusPtCut(Double_t cut, Int_t c)
219 AliClusterContainer *cont = GetClusterContainer(c);
220 if (cont) cont->SetClusPtCut(cut);
221 else AliError(Form("%s in SetClusPtCut(...): container %d not found",GetName(),c));
224 //________________________________________________________________________
225 void AliAnalysisTaskEmcal::SetClusTimeCut(Double_t min, Double_t max, Int_t c)
227 AliClusterContainer *cont = GetClusterContainer(c);
228 if (cont) cont->SetClusTimeCut(min,max);
229 else AliError(Form("%s in SetClusTimeCut(...): container %d not found",GetName(),c));
232 //________________________________________________________________________
233 void AliAnalysisTaskEmcal::SetTrackPtCut(Double_t cut, Int_t c)
235 AliParticleContainer *cont = GetParticleContainer(c);
236 if (cont) cont->SetParticlePtCut(cut);
237 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
242 //________________________________________________________________________
243 void AliAnalysisTaskEmcal::SetTrackEtaLimits(Double_t min, Double_t max, Int_t c)
245 AliParticleContainer *cont = GetParticleContainer(c);
246 if (cont) cont->SetParticleEtaLimits(min,max);
247 else AliError(Form("%s in SetTrackPtCut(...): container %d not found",GetName(),c));
250 //________________________________________________________________________
251 void AliAnalysisTaskEmcal::SetTrackPhiLimits(Double_t min, Double_t max, Int_t c)
253 AliParticleContainer *cont = GetParticleContainer(c);
254 if (cont) cont->SetParticlePhiLimits(min,max);
255 else AliError(Form("%s in SetTrackPhiLimits(...): container %d not found",GetName(),c));
258 //________________________________________________________________________
259 void AliAnalysisTaskEmcal::UserCreateOutputObjects()
261 // Create user output.
266 fOutput = new TList();
269 if (fForceBeamType == kpp)
272 if (!fGeneralHistograms)
276 fHistTrialsAfterSel = new TH1F("fHistTrialsAfterSel", "fHistTrialsAfterSel", 11, 0, 11);
277 fHistTrialsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
278 fHistTrialsAfterSel->GetYaxis()->SetTitle("trials");
279 fOutput->Add(fHistTrialsAfterSel);
281 fHistEventsAfterSel = new TH1F("fHistEventsAfterSel", "fHistEventsAfterSel", 11, 0, 11);
282 fHistEventsAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
283 fHistEventsAfterSel->GetYaxis()->SetTitle("total events");
284 fOutput->Add(fHistEventsAfterSel);
286 fHistXsectionAfterSel = new TProfile("fHistXsectionAfterSel", "fHistXsectionAfterSel", 11, 0, 11);
287 fHistXsectionAfterSel->GetXaxis()->SetTitle("p_{T} hard bin");
288 fHistXsectionAfterSel->GetYaxis()->SetTitle("xsection");
289 fOutput->Add(fHistXsectionAfterSel);
291 fHistTrials = new TH1F("fHistTrials", "fHistTrials", 11, 0, 11);
292 fHistTrials->GetXaxis()->SetTitle("p_{T} hard bin");
293 fHistTrials->GetYaxis()->SetTitle("trials");
294 fOutput->Add(fHistTrials);
296 fHistEvents = new TH1F("fHistEvents", "fHistEvents", 11, 0, 11);
297 fHistEvents->GetXaxis()->SetTitle("p_{T} hard bin");
298 fHistEvents->GetYaxis()->SetTitle("total events");
299 fOutput->Add(fHistEvents);
301 fHistXsection = new TProfile("fHistXsection", "fHistXsection", 11, 0, 11);
302 fHistXsection->GetXaxis()->SetTitle("p_{T} hard bin");
303 fHistXsection->GetYaxis()->SetTitle("xsection");
304 fOutput->Add(fHistXsection);
306 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
307 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
309 for (Int_t i = 1; i < 12; i++) {
310 fHistTrialsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
311 fHistEventsAfterSel->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
313 fHistTrials->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
314 fHistXsection->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
315 fHistEvents->GetXaxis()->SetBinLabel(i, Form("%d-%d",ptHardLo[i-1],ptHardHi[i-1]));
318 fHistPtHard = new TH1F("fHistPtHard", "fHistPtHard", fNbins*2, fMinBinPt, fMaxBinPt*4);
319 fHistPtHard->GetXaxis()->SetTitle("p_{T,hard} (GeV/c)");
320 fHistPtHard->GetYaxis()->SetTitle("counts");
321 fOutput->Add(fHistPtHard);
324 fHistCentrality = new TH1F("fHistCentrality","Event centrality distribution", 200, 0, 100);
325 fHistCentrality->GetXaxis()->SetTitle("Centrality (%)");
326 fHistCentrality->GetYaxis()->SetTitle("counts");
327 fOutput->Add(fHistCentrality);
329 fHistZVertex = new TH1F("fHistZVertex","Z vertex position", 60, -30, 30);
330 fHistZVertex->GetXaxis()->SetTitle("z");
331 fHistZVertex->GetYaxis()->SetTitle("counts");
332 fOutput->Add(fHistZVertex);
334 fHistEventPlane = new TH1F("fHistEventPlane","Event plane", 120, -TMath::Pi(), TMath::Pi());
335 fHistEventPlane->GetXaxis()->SetTitle("event plane");
336 fHistEventPlane->GetYaxis()->SetTitle("counts");
337 fOutput->Add(fHistEventPlane);
339 fHistEventRejection = new TH1I("fHistEventRejection","Reasons to reject event",20,0,20);
340 fHistEventRejection->Fill("PhysSel",0);
341 fHistEventRejection->Fill("trigger",0);
342 fHistEventRejection->Fill("trigTypeSel",0);
343 fHistEventRejection->Fill("Cent",0);
344 fHistEventRejection->Fill("vertex contr.",0);
345 fHistEventRejection->Fill("Vz",0);
346 fHistEventRejection->Fill("trackInEmcal",0);
347 fHistEventRejection->Fill("minNTrack",0);
348 fHistEventRejection->Fill("VtxSel2013pA",0);
349 fHistEventRejection->Fill("PileUp",0);
350 fHistEventRejection->Fill("EvtPlane",0);
351 fHistEventRejection->Fill("SelPtHardBin",0);
352 fHistEventRejection->GetYaxis()->SetTitle("counts");
353 fOutput->Add(fHistEventRejection);
355 PostData(1, fOutput);
358 //________________________________________________________________________
359 Bool_t AliAnalysisTaskEmcal::FillGeneralHistograms()
362 fHistEventsAfterSel->Fill(fPtHardBin, 1);
363 fHistTrialsAfterSel->Fill(fPtHardBin, fNTrials);
364 fHistXsectionAfterSel->Fill(fPtHardBin, fXsection);
365 fHistPtHard->Fill(fPtHard);
368 fHistCentrality->Fill(fCent);
369 fHistZVertex->Fill(fVertex[2]);
370 fHistEventPlane->Fill(fEPV0);
375 //________________________________________________________________________
376 void AliAnalysisTaskEmcal::UserExec(Option_t *)
378 // Main loop, called for each event.
380 fMainTriggerPatch = NULL;
388 if (!RetrieveEventObjects())
391 if (!IsEventSelected())
394 if (fGeneralHistograms && fCreateHisto) {
395 if (!FillGeneralHistograms())
403 if (!FillHistograms())
407 if (fCreateHisto && fOutput) {
408 // information for this iteration of the UserExec in the container
409 PostData(1, fOutput);
413 //________________________________________________________________________
414 Bool_t AliAnalysisTaskEmcal::AcceptCluster(AliVCluster *clus, Int_t c) const
416 // Return true if cluster is accepted.
421 AliClusterContainer *cont = GetClusterContainer(c);
423 AliError(Form("%s:Container %d not found",GetName(),c));
427 return cont->AcceptCluster(clus);
430 //________________________________________________________________________
431 Bool_t AliAnalysisTaskEmcal::AcceptTrack(AliVParticle *track, Int_t c) const
433 // Return true if track is accepted.
438 AliParticleContainer *cont = GetParticleContainer(c);
440 AliError(Form("%s:Container %d not found",GetName(),c));
444 return cont->AcceptParticle(track);
447 //________________________________________________________________________
448 Bool_t AliAnalysisTaskEmcal::PythiaInfoFromFile(const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard)
451 // Get the cross section and the trails either from pyxsec.root or from pysec_hists.root
452 // Get the pt hard bin from the file path
453 // This is to called in Notify and should provide the path to the AOD/ESD file
454 // (Partially copied from AliAnalysisHelperJetTasks)
456 TString file(currFile);
460 if (file.Contains(".zip#")) {
461 Ssiz_t pos1 = file.Index("root_archive",12,0,TString::kExact);
462 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
463 Ssiz_t pos2 = file.Index(".root",5,TString::kExact);
464 file.Replace(pos+1,pos2-pos1,"");
466 // not an archive take the basename....
467 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
469 AliDebug(1,Form("File name: %s",file.Data()));
471 // Get the pt hard bin
472 TString strPthard(file);
474 strPthard.Remove(strPthard.Last('/'));
475 strPthard.Remove(strPthard.Last('/'));
476 if (strPthard.Contains("AOD")) strPthard.Remove(strPthard.Last('/'));
477 strPthard.Remove(0,strPthard.Last('/')+1);
478 if (strPthard.IsDec())
479 pthard = strPthard.Atoi();
481 AliWarning(Form("Could not extract file number from path %s", strPthard.Data()));
483 // 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
484 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root"));
487 // next trial fetch the histgram file
488 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
490 // not a severe condition but inciate that we have no information
493 // find the tlist we want to be independtent of the name so use the Tkey
494 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
499 TList *list = dynamic_cast<TList*>(key->ReadObj());
504 fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
505 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
508 } else { // no tree pyxsec.root
509 TTree *xtree = (TTree*)fxsec->Get("Xsection");
515 Double_t xsection = 0;
516 xtree->SetBranchAddress("xsection",&xsection);
517 xtree->SetBranchAddress("ntrials",&ntrials);
526 //________________________________________________________________________
527 Bool_t AliAnalysisTaskEmcal::UserNotify()
529 // Called when file changes.
531 if (!fIsPythia || !fGeneralHistograms || !fCreateHisto)
534 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
536 AliError(Form("%s - UserNotify: No current tree!",GetName()));
540 Float_t xsection = 0;
544 TFile *curfile = tree->GetCurrentFile();
546 AliError(Form("%s - UserNotify: No current file!",GetName()));
550 TChain *chain = dynamic_cast<TChain*>(tree);
551 if (chain) tree = chain->GetTree();
553 Int_t nevents = tree->GetEntriesFast();
555 PythiaInfoFromFile(curfile->GetName(), xsection, trials, pthardbin);
558 if ((pthardbin < 0) || (pthardbin > 10)) pthardbin = 0;
560 fHistTrials->Fill(pthardbin, trials);
561 fHistXsection->Fill(pthardbin, xsection);
562 fHistEvents->Fill(pthardbin, nevents);
567 //________________________________________________________________________
568 void AliAnalysisTaskEmcal::ExecOnce()
570 // Init the analysis.
573 AliError(Form("%s: Could not retrieve event! Returning!", GetName()));
577 if (fNeedEmcalGeom) {
578 fGeom = AliEMCALGeometry::GetInstance();
580 AliError(Form("%s: Can not create geometry", GetName()));
586 if (fEventPlaneVsEmcal >= 0) {
588 Double_t ep = (fGeom->GetArm1PhiMax() + fGeom->GetArm1PhiMin()) / 2 * TMath::DegToRad() + fEventPlaneVsEmcal - TMath::Pi();
589 fMinEventPlane = ep - TMath::Pi() / 4;
590 fMaxEventPlane = ep + TMath::Pi() / 4;
593 AliWarning("Could not set event plane limits because EMCal geometry was not loaded!");
597 //Load all requested track branches - each container knows name already
598 for (Int_t i =0; i<fParticleCollArray.GetEntriesFast(); i++) {
599 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
600 cont->SetArray(InputEvent());
603 if (fParticleCollArray.GetEntriesFast()>0) {
604 fTracks = GetParticleArray(0);
606 AliError(Form("%s: Could not retrieve first track branch!", GetName()));
611 //Load all requested cluster branches - each container knows name already
612 for (Int_t i =0; i<fClusterCollArray.GetEntriesFast(); i++) {
613 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
614 cont->SetArray(InputEvent());
617 if (fClusterCollArray.GetEntriesFast()>0) {
618 fCaloClusters = GetClusterArray(0);
619 if (!fCaloClusters) {
620 AliError(Form("%s: Could not retrieve first cluster branch!", GetName()));
625 if (!fCaloCellsName.IsNull() && !fCaloCells) {
626 fCaloCells = dynamic_cast<AliVCaloCells*>(InputEvent()->FindListObject(fCaloCellsName));
628 AliError(Form("%s: Could not retrieve cells %s!", GetName(), fCaloCellsName.Data()));
633 if (!fCaloTriggersName.IsNull() && !fCaloTriggers) {
634 fCaloTriggers = dynamic_cast<AliVCaloTrigger*>(InputEvent()->FindListObject(fCaloTriggersName));
635 if (!fCaloTriggers) {
636 AliError(Form("%s: Could not retrieve calo triggers %s!", GetName(), fCaloTriggersName.Data()));
641 if (!fCaloTriggerPatchInfoName.IsNull() && !fTriggerPatchInfo) {
642 fTriggerPatchInfo = GetArrayFromEvent(fCaloTriggerPatchInfoName.Data(),"AliEmcalTriggerPatchInfo");
643 if (!fTriggerPatchInfo) {
644 AliError(Form("%s: Could not retrieve calo trigger patch info %s!", GetName(), fCaloTriggerPatchInfoName.Data()));
650 fInitialized = kTRUE;
653 //_____________________________________________________
654 AliAnalysisTaskEmcal::BeamType AliAnalysisTaskEmcal::GetBeamType()
656 // Get beam type : pp-AA-pA
657 // ESDs have it directly, AODs get it from hardcoded run number ranges
659 if (fForceBeamType != kNA)
660 return fForceBeamType;
662 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(InputEvent());
664 const AliESDRun *run = esd->GetESDRun();
665 TString beamType = run->GetBeamType();
666 if (beamType == "p-p")
668 else if (beamType == "A-A")
670 else if (beamType == "p-A")
675 Int_t runNumber = InputEvent()->GetRunNumber();
676 if ((runNumber >= 136851 && runNumber <= 139517) || // LHC10h
677 (runNumber >= 166529 && runNumber <= 170593)) { // LHC11h
679 } else if ((runNumber>=188365 && runNumber <= 188366) || // LHC12g
680 (runNumber >= 195344 && runNumber <= 196608)) { // LHC13b-f
688 //_____________________________________________________
689 AliAnalysisTaskEmcal::TriggerType AliAnalysisTaskEmcal::GetTriggerType()
691 // Get trigger type: kND, kJ1, kJ2
693 if (!fTriggerPatchInfo)
696 //number of patches in event
697 Int_t nPatch = fTriggerPatchInfo->GetEntries();
699 //loop over patches to define trigger type of event
702 AliEmcalTriggerPatchInfo *patch;
703 for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
704 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
705 if (patch->IsJetHigh()) nJ1++;
706 if (patch->IsJetLow()) nJ2++;
717 //________________________________________________________________________
718 Bool_t AliAnalysisTaskEmcal::IsEventSelected()
720 // Check if event is selected
722 if (fOffTrigger != AliVEvent::kAny) {
724 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
726 res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
728 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
730 res = aev->GetHeader()->GetOfflineTrigger();
733 if ((res & fOffTrigger) == 0) {
734 if (fGeneralHistograms)
735 fHistEventRejection->Fill("PhysSel",1);
740 if (!fTrigClass.IsNull()) {
742 const AliESDEvent *eev = dynamic_cast<const AliESDEvent*>(InputEvent());
744 fired = eev->GetFiredTriggerClasses();
746 const AliAODEvent *aev = dynamic_cast<const AliAODEvent*>(InputEvent());
748 fired = aev->GetFiredTriggerClasses();
751 if (!fired.Contains("-B-")) {
752 if (fGeneralHistograms)
753 fHistEventRejection->Fill("trigger",1);
756 TObjArray *arr = fTrigClass.Tokenize("|");
758 if (fGeneralHistograms)
759 fHistEventRejection->Fill("trigger",1);
763 for (Int_t i=0;i<arr->GetEntriesFast();++i) {
764 TObject *obj = arr->At(i);
767 if (fired.Contains(obj->GetName())) {
774 if (fGeneralHistograms)
775 fHistEventRejection->Fill("trigger",1);
780 if (fTriggerTypeSel != kND) {
781 if (fTriggerType != fTriggerTypeSel) {
782 if (fGeneralHistograms)
783 fHistEventRejection->Fill("trigTypeSel",1);
788 if ((fMinCent != -999) && (fMaxCent != -999)) {
789 if (fCent<fMinCent || fCent>fMaxCent) {
790 if (fGeneralHistograms)
791 fHistEventRejection->Fill("Cent",1);
796 if (fUseAliAnaUtils) {
797 if (!fAliAnalysisUtils)
798 fAliAnalysisUtils = new AliAnalysisUtils();
799 fAliAnalysisUtils->SetMinVtxContr(2);
800 fAliAnalysisUtils->SetMaxVtxZ(999);
801 if(fMinVz<-10.) fMinVz = -10.;
802 if(fMinVz>10.) fMaxVz = 10.;
804 if (!fAliAnalysisUtils->IsVertexSelected2013pA(InputEvent())) {
805 if (fGeneralHistograms)
806 fHistEventRejection->Fill("VtxSel2013pA",1);
810 if (fAliAnalysisUtils->IsPileUpEvent(InputEvent())) {
811 fHistEventRejection->Fill("PileUp",1);
816 if ((fMinVz != -999) && (fMaxVz != -999)) {
817 if (fNVertCont == 0 ) {
818 if (fGeneralHistograms)
819 fHistEventRejection->Fill("vertex contr.",1);
822 Double_t vz = fVertex[2];
823 if (vz<fMinVz || vz>fMaxVz) {
824 if (fGeneralHistograms)
825 fHistEventRejection->Fill("Vz",1);
830 if (fMinPtTrackInEmcal > 0 && fGeom) {
831 Bool_t trackInEmcalOk = kFALSE;
832 Int_t ntracks = GetNParticles(0);
833 for (Int_t i = 0; i < ntracks; i++) {
834 AliVParticle *track = GetAcceptParticleFromArray(i,0);
838 Double_t phiMin = fGeom->GetArm1PhiMin() * TMath::DegToRad();
839 Double_t phiMax = fGeom->GetArm1PhiMax() * TMath::DegToRad();
840 Int_t runNumber = InputEvent()->GetRunNumber();
841 if (runNumber>=177295 && runNumber<=197470) { //small SM masked in 2012 and 2013
843 phiMax = TMath::Pi();
846 if (track->Eta() < fGeom->GetArm1EtaMin() || track->Eta() > fGeom->GetArm1EtaMax() || track->Phi() < phiMin || track->Phi() > phiMax)
848 if (track->Pt() > fMinPtTrackInEmcal) {
849 trackInEmcalOk = kTRUE;
853 if (!trackInEmcalOk) {
854 if (fGeneralHistograms)
855 fHistEventRejection->Fill("trackInEmcal",1);
860 if (fMinNTrack > 0) {
861 Int_t nTracksAcc = 0;
862 Int_t ntracks = GetNParticles(0);
863 for (Int_t i = 0; i < ntracks; i++) {
864 AliVParticle *track = GetAcceptParticleFromArray(i,0);
867 if (track->Pt() > fTrackPtCut) {
869 if (nTracksAcc>=fMinNTrack)
873 if (nTracksAcc<fMinNTrack) {
874 if (fGeneralHistograms)
875 fHistEventRejection->Fill("minNTrack",1);
880 if (!(fEPV0 > fMinEventPlane && fEPV0 <= fMaxEventPlane) &&
881 !(fEPV0 + TMath::Pi() > fMinEventPlane && fEPV0 + TMath::Pi() <= fMaxEventPlane) &&
882 !(fEPV0 - TMath::Pi() > fMinEventPlane && fEPV0 - TMath::Pi() <= fMaxEventPlane))
884 if (fGeneralHistograms)
885 fHistEventRejection->Fill("EvtPlane",1);
889 if (fSelectPtHardBin != -999 && fSelectPtHardBin != fPtHardBin) {
890 if (fGeneralHistograms)
891 fHistEventRejection->Fill("SelPtHardBin",1);
898 //________________________________________________________________________
899 TClonesArray *AliAnalysisTaskEmcal::GetArrayFromEvent(const char *name, const char *clname)
901 // Get array from event.
903 TClonesArray *arr = 0;
905 if (!sname.IsNull()) {
906 arr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sname));
908 AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
918 TString objname(arr->GetClass()->GetName());
920 if (!cls.InheritsFrom(clname)) {
921 AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
922 GetName(), cls.GetName(), name, clname));
928 //________________________________________________________________________
929 Bool_t AliAnalysisTaskEmcal::RetrieveEventObjects()
931 // Retrieve objects from event.
938 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
940 vert->GetXYZ(fVertex);
941 fNVertCont = vert->GetNContributors();
944 fBeamType = GetBeamType();
946 if (fBeamType == kAA || fBeamType == kpA ) {
947 AliCentrality *aliCent = InputEvent()->GetCentrality();
949 fCent = aliCent->GetCentralityPercentile(fCentEst.Data());
951 if (fCent >= 0 && fCent < 10) fCentBin = 0;
952 else if (fCent >= 10 && fCent < 30) fCentBin = 1;
953 else if (fCent >= 30 && fCent < 50) fCentBin = 2;
954 else if (fCent >= 50 && fCent <= 100) fCentBin = 3;
956 AliWarning(Form("%s: Negative centrality: %f. Assuming 99", GetName(), fCent));
957 fCentBin = fNcentBins-1;
960 Double_t centWidth = (fMaxCent-fMinCent)/(Double_t)fNcentBins;
961 fCentBin = TMath::FloorNint(fCent/centWidth);
962 if (fCentBin>=fNcentBins) {
963 AliWarning(Form("%s: fCentBin too large: cent = %f fCentBin = %d. Assuming 99", GetName(),fCent,fCentBin));
964 fCentBin = fNcentBins-1;
968 AliWarning(Form("%s: Could not retrieve centrality information! Assuming 99", GetName()));
971 AliEventplane *aliEP = InputEvent()->GetEventplane();
973 fEPV0 = aliEP->GetEventplane("V0" ,InputEvent());
974 fEPV0A = aliEP->GetEventplane("V0A",InputEvent());
975 fEPV0C = aliEP->GetEventplane("V0C",InputEvent());
977 AliWarning(Form("%s: Could not retrieve event plane information!", GetName()));
987 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
988 if (!fPythiaHeader) {
990 AliAODMCHeader* aodMCH = dynamic_cast<AliAODMCHeader*>(InputEvent()->FindListObject(AliAODMCHeader::StdBranchName()));
993 for (UInt_t i = 0;i<aodMCH->GetNCocktailHeaders();i++) {
994 fPythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(aodMCH->GetCocktailHeader(i));
995 if (fPythiaHeader) break;
1001 if (fPythiaHeader) {
1002 fPtHard = fPythiaHeader->GetPtHard();
1004 const Int_t ptHardLo[11] = { 0, 5,11,21,36,57, 84,117,152,191,234};
1005 const Int_t ptHardHi[11] = { 5,11,21,36,57,84,117,152,191,234,1000000};
1006 for (fPtHardBin = 0; fPtHardBin < 11; fPtHardBin++) {
1007 if (fPtHard >= ptHardLo[fPtHardBin] && fPtHard < ptHardHi[fPtHardBin])
1011 fXsection = fPythiaHeader->GetXsection();
1012 fNTrials = fPythiaHeader->Trials();
1016 fTriggerType = GetTriggerType();
1021 //________________________________________________________________________
1022 AliParticleContainer* AliAnalysisTaskEmcal::AddParticleContainer(const char *n)
1024 // Add particle container
1025 // will be called in AddTask macro
1027 TString tmp = TString(n);
1028 if (tmp.IsNull()) return 0;
1030 AliParticleContainer *cont = 0x0;
1031 cont = new AliParticleContainer();
1032 cont->SetArrayName(n);
1033 TString contName = cont->GetArrayName();
1035 fParticleCollArray.Add(cont);
1040 //________________________________________________________________________
1041 AliClusterContainer* AliAnalysisTaskEmcal::AddClusterContainer(const char *n)
1043 // Add cluster container
1044 // will be called in AddTask macro
1046 TString tmp = TString(n);
1047 if (tmp.IsNull()) return 0;
1049 AliClusterContainer *cont = 0x0;
1050 cont = new AliClusterContainer();
1051 cont->SetArrayName(n);
1053 fClusterCollArray.Add(cont);
1058 //________________________________________________________________________
1059 AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(Int_t i) const
1061 // Get i^th particle container
1063 if (i<0 || i>fParticleCollArray.GetEntriesFast()) return 0;
1064 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.At(i));
1068 //________________________________________________________________________
1069 AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(Int_t i) const
1071 // Get i^th cluster container
1073 if (i<0 || i>fClusterCollArray.GetEntriesFast()) return 0;
1074 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.At(i));
1078 //________________________________________________________________________
1079 AliParticleContainer* AliAnalysisTaskEmcal::GetParticleContainer(const char *name) const
1081 // Get particle container with name
1083 AliParticleContainer *cont = static_cast<AliParticleContainer*>(fParticleCollArray.FindObject(name));
1087 //________________________________________________________________________
1088 AliClusterContainer* AliAnalysisTaskEmcal::GetClusterContainer(const char *name) const
1090 // Get cluster container with name
1092 AliClusterContainer *cont = static_cast<AliClusterContainer*>(fClusterCollArray.FindObject(name));
1096 //________________________________________________________________________
1097 TClonesArray* AliAnalysisTaskEmcal::GetParticleArray(Int_t i) const
1099 // Get i^th TClonesArray with AliVParticle
1101 AliParticleContainer *cont = GetParticleContainer(i);
1103 AliError(Form("%s: Particle container %d not found",GetName(),i));
1106 TString contName = cont->GetArrayName();
1107 return cont->GetArray();
1110 //________________________________________________________________________
1111 TClonesArray* AliAnalysisTaskEmcal::GetClusterArray(Int_t i) const
1113 // Get i^th TClonesArray with AliVCluster
1115 AliClusterContainer *cont = GetClusterContainer(i);
1117 AliError(Form("%s:Cluster container %d not found",GetName(),i));
1120 return cont->GetArray();
1123 //________________________________________________________________________
1124 AliVParticle* AliAnalysisTaskEmcal::GetAcceptParticleFromArray(Int_t p, Int_t c) const
1126 // Get particle p if accepted from container c
1127 // If particle not accepted return 0
1129 AliParticleContainer *cont = GetParticleContainer(c);
1131 AliError(Form("%s: Particle container %d not found",GetName(),c));
1134 AliVParticle *vp = cont->GetAcceptParticle(p);
1139 //________________________________________________________________________
1140 AliVCluster* AliAnalysisTaskEmcal::GetAcceptClusterFromArray(Int_t cl, Int_t c) const
1142 // Get particle p if accepted from container c
1143 // If particle not accepted return 0
1145 AliClusterContainer *cont = GetClusterContainer(c);
1147 AliError(Form("%s: Cluster container %d not found",GetName(),c));
1150 AliVCluster *vc = cont->GetAcceptCluster(cl);
1155 //________________________________________________________________________
1156 Int_t AliAnalysisTaskEmcal::GetNParticles(Int_t i) const
1158 // Get number of entries in particle array i
1160 AliParticleContainer *cont = GetParticleContainer(i);
1162 AliError(Form("%s: Particle container %d not found",GetName(),i));
1165 return cont->GetNEntries();
1168 //________________________________________________________________________
1169 Int_t AliAnalysisTaskEmcal::GetNClusters(Int_t i) const
1171 // Get number of entries in cluster array i
1173 AliClusterContainer *cont = GetClusterContainer(i);
1175 AliError(Form("%s: Cluster container %d not found",GetName(),i));
1178 return cont->GetNEntries();
1181 //________________________________________________________________________
1182 AliEmcalTriggerPatchInfo* AliAnalysisTaskEmcal::GetMainTriggerPatch()
1184 //get main trigger match; if not known yet, look for it and cache
1186 if (fMainTriggerPatch)
1187 return fMainTriggerPatch;
1189 if (!fTriggerPatchInfo) {
1190 AliError(Form("%s: fTriggerPatchInfo not available",GetName()));
1194 //number of patches in event
1195 Int_t nPatch = fTriggerPatchInfo->GetEntries();
1197 //extract main trigger patch
1198 AliEmcalTriggerPatchInfo *patch;
1199 for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
1201 patch = (AliEmcalTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
1202 if (patch->IsMainTrigger()) {
1203 fMainTriggerPatch = patch;
1208 return fMainTriggerPatch;
1211 //________________________________________________________________________
1212 void AliAnalysisTaskEmcal::AddObjectToEvent(TObject *obj)
1214 // Add object to event
1216 if (!(InputEvent()->FindListObject(obj->GetName()))) {
1217 InputEvent()->AddObject(obj);
1219 AliFatal(Form("%s: Container with name %s already present. Aborting", GetName(), obj->GetName()));